ya2 · news · projects · code · about

drag and drop
[pmachines.git] / pmachines / scene.py
index 925ed2b6b8b8647aa47c8c31d1ca20967ace078a..bd7d9bfaf3d02192ef27163af439899667ff9a62 100644 (file)
@@ -1,4 +1,5 @@
 from panda3d.core import AmbientLight, DirectionalLight, Point3
+from panda3d.bullet import BulletPlaneShape, BulletGhostNode# BulletRigidBodyNode
 from direct.showbase.DirectObject import DirectObject
 from pmachines.items.background import Background
 from pmachines.items.box import Box
@@ -12,6 +13,7 @@ class Scene(DirectObject):
         self._set_camera()
         self._set_lights()
         self._set_input()
+        self._set_mouse_plane()
         Background()
         self.items = [Box(world)]
         taskMgr.add(self.on_frame, 'on_frame')
@@ -39,7 +41,18 @@ class Scene(DirectObject):
         self._set_directional_light('rim light', (75, -30, 0), (.3, .3, .3, 1))
 
     def _set_input(self):
-        self.accept('mouse1-up', self.on_click)
+        self.accept('mouse1', self.on_click)
+        self.accept('mouse1-up', self.on_release)
+        self.accept('p-up', self.on_play)
+
+    def _set_mouse_plane(self):
+        shape = BulletPlaneShape((0, -1, 0), 1)
+        #self._mouse_plane_node = BulletRigidBodyNode('mouse plane')
+        self._mouse_plane_node = BulletGhostNode('mouse plane')
+        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)
 
     def _get_hits(self):
         if not base.mouseWatcherNode.has_mouse(): return []
@@ -51,14 +64,32 @@ class Scene(DirectObject):
         return self._world.ray_test_all(p_from, p_to).get_hits()
 
     def on_click(self):
+        for hit in self._get_hits():
+            if hit.get_node() == self._mouse_plane_node:
+                pos = hit.get_hit_pos()
         for hit in self._get_hits():
             for item in [i for i in self.items if hit.get_node() == i.node]:
-                item.on_click(hit)
+                item.on_click(pos)
+
+    def on_release(self):
+        for hit in self._get_hits():
+            for item in [i for i in self.items if hit.get_node() == i.node]:
+                item.on_release()
 
     def on_frame(self, task):
-        hit_nodes = [hit.get_node() for hit in self._get_hits()]
+        hits = self._get_hits()
+        pos = None
+        for hit in self._get_hits():
+            if hit.get_node() == self._mouse_plane_node:
+                pos = hit.get_hit_pos()
+        hit_nodes = [hit.get_node() for hit in hits]
         items_hit = [itm for itm in self.items if itm.node in hit_nodes]
         items_no_hit = [itm for itm in self.items if itm not in items_hit]
         [itm.on_mouse_on() for itm in items_hit]
         [itm.on_mouse_off() for itm in items_no_hit]
+        if pos:
+            [itm.on_mouse_move(pos) for itm in self.items]
         return task.cont
+
+    def on_play(self):
+        [itm.play() for itm in self.items]