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
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')
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 []
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]