From 06af3aa9f6be8c9f1837ffd120a309086c78fcbe Mon Sep 17 00:00:00 2001 From: Flavio Calva Date: Thu, 13 Jan 2022 19:54:48 +0100 Subject: [PATCH] ghosts for instances --- pmachines/items/box.py | 28 ++++++++++++++++++++-------- pmachines/scene.py | 2 +- prj.org | 1 - 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pmachines/items/box.py b/pmachines/items/box.py index 90d7d3f..2e65777 100644 --- a/pmachines/items/box.py +++ b/pmachines/items/box.py @@ -1,5 +1,5 @@ from panda3d.core import CullFaceAttrib, Point3, NodePath, Point2, Texture -from panda3d.bullet import BulletBoxShape, BulletRigidBodyNode +from panda3d.bullet import BulletBoxShape, BulletRigidBodyNode, BulletGhostNode from direct.gui.OnscreenText import OnscreenText from lib.lib.p3d.gfx import P3dGfxMgr @@ -10,14 +10,14 @@ class Box: 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._shape = BulletBoxShape((.5, .5, .5)) + self.node = BulletGhostNode('box') + self.node.add_shape(self._shape) self._np = render.attach_new_node(self.node) - world.attach_rigid_body(self.node) - model = loader.load_model('assets/gltf/box/box.gltf') - model.flatten_light() - model.reparent_to(self._np) + world.attach_ghost(self.node) + self._model = loader.load_model('assets/gltf/box/box.gltf') + self._model.flatten_light() + self._model.reparent_to(self._np) self._set_outline_model() self._start_drag_pos = None self._prev_rot_info = None @@ -83,6 +83,8 @@ class Box: return task.cont def play(self): + if not self._instantiated: + return self._world.remove_rigid_body(self.node) self.node.set_mass(1) self._world.attach_rigid_body(self.node) @@ -91,6 +93,16 @@ class Box: self._start_drag_pos = pos, self._np.get_pos() loader.load_sfx('assets/audio/sfx/grab.ogg').play() if not self._instantiated: + self._world.remove_ghost(self.node) + pos = self._np.get_pos() + self._np.remove_node() + self.node = BulletRigidBodyNode('box') + self.node.add_shape(self._shape) + self._np = render.attach_new_node(self.node) + self._world.attach_rigid_body(self.node) + self._model.reparent_to(self._np) + self._np.set_pos(pos) + self._set_outline_model() self._instantiated = True self._txt.destroy() self._count -= 1 diff --git a/pmachines/scene.py b/pmachines/scene.py index 2d5838a..7ad90be 100644 --- a/pmachines/scene.py +++ b/pmachines/scene.py @@ -110,7 +110,7 @@ class Scene(DirectObject): self._mouse_plane_node.addShape(shape) #np = render.attachNewNode(self._mouse_plane_node) #self._world.attachRigidBody(self._mouse_plane_node) - self._world.attachGhost(self._mouse_plane_node) + self._world.attach_ghost(self._mouse_plane_node) def _get_hits(self): if not base.mouseWatcherNode.has_mouse(): return [] diff --git a/prj.org b/prj.org index f12568d..85e8a46 100644 --- a/prj.org +++ b/prj.org @@ -1,6 +1,5 @@ * issues * todo -** manage the physics of the to-be-instantiated with a ghost ** instructions ** main menu ** implement the operations of the buttons -- 2.30.2