Advertisement
Guest User

scene_loading.py

a guest
Jan 16th, 2013
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.96 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import sys
  4.  
  5. from direct.showbase.ShowBase import ShowBase
  6. from direct.gui.OnscreenText import OnscreenText
  7. from panda3d.core import PointLight, VBase4, DirectionalLight, LVector3f, LPoint3f, Vec3, GeomEnums, GeomNode, TransformState, NodePath
  8. from panda3d.bullet import BulletWorld, BulletTriangleMesh, BulletRigidBodyNode, BulletTriangleMeshShape, BulletConvexHullShape, BulletPlaneShape, BulletBoxShape, BulletDebugNode
  9.  
  10.  
  11. class MyApp(ShowBase):
  12.  
  13.     def __init__(self):
  14.         ShowBase.__init__(self)
  15.         self.text = None
  16.         self.rebuild()
  17.         self.accept('escape', sys.exit)
  18.         self.accept('f', self.toggleWireframe)
  19.         self.accept('r', self.rebuild)
  20.         self.taskMgr.add(self.update, 'update')
  21.  
  22.     def rebuild(self):
  23.         self.clean()
  24.         if self.load_dynamic_body == self.load_dynamic_body1:
  25.             self.load_dynamic_body = self.load_dynamic_body2
  26.             self.text = OnscreenText(text = 'With triangle mesh (press r to change)', pos = (-0.5, 0.5))
  27.         else:
  28.             self.load_dynamic_body = self.load_dynamic_body1
  29.             self.text = OnscreenText(text = 'With convex hull (press r to change)', pos = (-0.5, 0.5))
  30.         self.world = BulletWorld()
  31.         self.world.setGravity(Vec3(0, 0, -9.81))
  32.         debugNP = self.render.attachNewNode(BulletDebugNode('Debug'))
  33.         debugNP.show()
  34.         self.world.setDebugNode(debugNP.node())
  35.         self.load_scene('myscene')
  36.         self.cam.setPos(10, 10, 10)
  37.         self.cam.lookAt(0, 0, 0)
  38.  
  39.     def clean(self):
  40.         for child in self.render.getChildren():
  41.             if child.getName() != 'camera':
  42.                 child.removeNode()
  43.         if self.text:
  44.             self.text.removeNode()
  45.  
  46.     def update(self, task):
  47.         dt = globalClock.getDt()
  48.         self.world.doPhysics(dt/3)
  49.         return task.cont
  50.  
  51.     def load_scene(self, filename):
  52.         scene_root_np = self.loader.loadModel(filename)
  53.         scene_root_np.flattenLight()
  54.  
  55.         for object_root_np in scene_root_np.findAllMatches('**/coll_dyn*'):
  56.             self.load_dynamic_body(scene_root_np, object_root_np, mass=1)
  57.  
  58.         for object_root_np in scene_root_np.findAllMatches('**/coll_stat*'):
  59.             self.load_static_body(scene_root_np, object_root_np)
  60.  
  61.         for object_root_np in scene_root_np.findAllMatches('**/coll_ghost*'):
  62.             self.load_ghost(scene_root_np, object_root_np)
  63.  
  64.         self.render.ls()
  65.  
  66.     def load_dynamic_body1(self, scene_root_np, object_root_np, mass):
  67.         body = BulletRigidBodyNode('BodyNode')
  68.         for geom_np in object_root_np.findAllMatches('**/+GeomNode'):
  69.             shape = BulletConvexHullShape()
  70.             for geom in geom_np.node().getGeoms():
  71.                 geom = geom.decompose()
  72.                 shape.addGeom(geom)
  73.             body.addShape(shape)
  74.         body.setMass(mass)
  75.         body_np = self.render.attachNewNode(body)
  76.         object_root_np.reparentTo(body_np)
  77.         self.world.attachRigidBody(body)
  78.  
  79.     def load_dynamic_body2(self, scene_root_np, object_root_np, mass):
  80.         body = BulletRigidBodyNode('BodyNode')
  81.         for geom_np in object_root_np.findAllMatches('**/+GeomNode'):
  82.             triangle_geom = BulletTriangleMesh()
  83.             for geom in geom_np.node().getGeoms():
  84.                 geom = geom.decompose()
  85.                 triangle_geom.addGeom(geom)
  86.         shape = BulletTriangleMeshShape(triangle_geom, dynamic=(mass==0))
  87.         body.addShape(shape)
  88.         body.setMass(mass)
  89.         body_np = self.render.attachNewNode(body)
  90.         object_root_np.reparentTo(body_np)
  91.         self.world.attachRigidBody(body)
  92.  
  93.     def load_static_body(self, scene_root_np, object_root_np):
  94.         return self.load_dynamic_body(scene_root_np, object_root_np, mass=0)
  95.  
  96.     def load_ghost(self, scene_root_np, object_root_np):
  97.         object_root_np.reparentTo(self.render)
  98.  
  99.     load_dynamic_body = load_dynamic_body1
  100.  
  101. app = MyApp()
  102. app.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement