From 7850ccc485a9bf387a6c9f12ce86b1e5c2b2d059 Mon Sep 17 00:00:00 2001 From: Flavio Calva Date: Sat, 8 Jan 2022 18:12:19 +0100 Subject: [PATCH] instantiation --- assets/fonts/Hanken-Book.ttf | Bin 0 -> 35364 bytes pmachines/items/box.py | 50 ++++++++++++++++++++++++++++++++--- pmachines/scene.py | 8 +++--- prj.org | 5 ++-- 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 assets/fonts/Hanken-Book.ttf diff --git a/assets/fonts/Hanken-Book.ttf b/assets/fonts/Hanken-Book.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c69072298f7e1bc25b754e42065377809c044cd8 GIT binary patch literal 35364 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 literal 0 HcmV?d00001 diff --git a/pmachines/items/box.py b/pmachines/items/box.py index c0419bb..493ae2a 100644 --- a/pmachines/items/box.py +++ b/pmachines/items/box.py @@ -1,15 +1,19 @@ -from panda3d.core import CullFaceAttrib +from panda3d.core import CullFaceAttrib, Point3, NodePath, Point2, Texture from panda3d.bullet import BulletBoxShape, BulletRigidBodyNode +from direct.gui.OnscreenText import OnscreenText + class Box: - def __init__(self, world): + def __init__(self, world, plane_node, count, cb_inst): self._world = world + self._plane_node = plane_node + self._count = count + self._cb_inst = cb_inst shape = BulletBoxShape((.5, .5, .5)) self.node = BulletRigidBodyNode('box') self.node.add_shape(shape) self._np = render.attach_new_node(self.node) - self._np.set_pos(0, 0, 1) world.attach_rigid_body(self.node) model = loader.load_model('assets/gltf/box/box.gltf') model.flatten_light() @@ -17,7 +21,40 @@ class Box: self._set_outline_model() self._start_drag_pos = None self._prev_rot_info = None + self._instantiated = False taskMgr.add(self.on_frame, 'on_frame') + #self._set_side() + taskMgr.doMethodLater(.01, lambda task: self._set_side(), 'a') + # i get weird values in the first frame; i could restore this approach + # when the hook with the events of the window is up + + def _set_side(self): + p_from, p_to = Point3(), Point3() # in camera coordinates + base.camLens.extrude((-1, 1), p_from, p_to) + p_from = render.get_relative_point(base.cam, p_from) # global coords + p_to = render.get_relative_point(base.cam, p_to) # global coords + for hit in self._world.ray_test_all(p_from, p_to).get_hits(): + if hit.get_node() == self._plane_node: + pos = hit.get_hit_pos() + bounds = self._np.get_tight_bounds() + dpos = bounds[1][0], 0, -bounds[1][2] + self._np.set_pos(pos + dpos) + new_node = NodePath('temp') + new_node.set_pos(pos + dpos + (bounds[1][0], bounds[1][1], -bounds[1][2])) + coord3d = new_node.get_pos(base.cam) + coord2d = Point2() + base.camLens.project(coord3d, coord2d) + coord_r2d = Point3(coord2d[0], 0, coord2d[1]) + coord_a2d = base.aspect2d.get_relative_point(render2d, coord_r2d) + font = base.loader.load_font('assets/fonts/Hanken-Book.ttf') + font.clear() + font.set_pixels_per_unit(60) + font.set_minfilter(Texture.FTLinearMipmapLinear) + font.set_outline((0, 0, 0, 1), .8, .2) + self._txt = OnscreenText( + str(self._count), pos=(coord_a2d[0], coord_a2d[2]), + font=font, scale=0.06, fg=(.9, .9, .9, 1)) + new_node.remove_node() def _set_outline_model(self): self._outline_model = loader.load_model('assets/gltf/box/box.gltf') @@ -42,6 +79,13 @@ class Box: def on_click_l(self, pos): self._start_drag_pos = pos, self._np.get_pos() loader.load_sfx('assets/audio/sfx/grab.ogg').play() + if not self._instantiated: + self._instantiated = True + self._txt.destroy() + self._count -= 1 + if self._count: + box = Box(self._world, self._plane_node, self._count, self._cb_inst) + self._cb_inst(box) def on_click_r(self, pos): self._prev_rot_info = pos, self._np.get_pos(), self._np.get_r() diff --git a/pmachines/scene.py b/pmachines/scene.py index f67c45b..5d046e9 100644 --- a/pmachines/scene.py +++ b/pmachines/scene.py @@ -23,7 +23,7 @@ class Scene(DirectObject): self._set_input() self._set_mouse_plane() Background() - self.items = [Box(world)] + self.items = [Box(world, self._mouse_plane_node, 3, self.cb_inst)] taskMgr.add(self.on_frame, 'on_frame') def _set_camera(self): @@ -111,8 +111,7 @@ class Scene(DirectObject): def _get_hits(self): if not base.mouseWatcherNode.has_mouse(): return [] - p_from = Point3() # in camera coordinates - p_to = Point3() # in camera coordinates + p_from, p_to = Point3(), Point3() # in camera coordinates base.camLens.extrude(base.mouseWatcherNode.get_mouse(), p_from, p_to) p_from = render.get_relative_point(base.cam, p_from) # global coords p_to = render.get_relative_point(base.cam, p_to) # global coords @@ -153,6 +152,9 @@ class Scene(DirectObject): [itm.on_mouse_move(pos) for itm in self.items] return task.cont + def cb_inst(self, item): + self.items += [item] + def on_play(self): [itm.play() for itm in self.items] diff --git a/prj.org b/prj.org index 311ee94..f4c05e2 100644 --- a/prj.org +++ b/prj.org @@ -1,8 +1,7 @@ * issues * todo -** instantiation of the objects -*** model in the left side with a counter -*** when you click a new object is created iff counter > 0 +** update the to-be-instantiated's pos if the windows is updated +** manage the physics of the to-be-instantiated with a ghost ** instructions ** main menu ** implement the operations of the buttons -- 2.30.2