Author: ArcRiley
Date: 2008-02-19 15:09:22 -0500 (Tue, 19 Feb 2008)
New Revision: 955

Modified:
   trunk/pysoy/src/scenes/Scene.pxi
   trunk/pysoy/src/scenes/soy.scenes.pxd
   trunk/pysoy/src/scenes/soy.scenes.pyx
Log:
#930 - additional work


Modified: trunk/pysoy/src/scenes/Scene.pxi
===================================================================
--- trunk/pysoy/src/scenes/Scene.pxi    2008-02-19 19:28:52 UTC (rev 954)
+++ trunk/pysoy/src/scenes/Scene.pxi    2008-02-19 20:09:22 UTC (rev 955)
@@ -29,6 +29,7 @@
     from soy.colors import gray
     self._worldID    = ode.dWorldCreate()
     self._spaceID    = ode.dSimpleSpaceCreate(NULL)
+    self._contactGrp = ode.dJointGroupCreate(0)
     self._bodies     = soy._internals.Children()
     self._joints     = soy._internals.Children()
     self._lights     = soy._internals.Children()
@@ -38,16 +39,11 @@
     self._stepMutex  = py.PyThread_allocate_lock()
     self._giveFields = soy._internals.PointerSet()
     self._callFields = soy._internals.PointerSet()
-    _scenes.lock()
-    _scenes.append(<void *>self)
-    _scenes.unlock()
+    _scenes._append(<void *>self)
 
 
   def __dealloc__(self) :
-    global _scenes
-    _scenes.lock()
-    _scenes.remove(<void *>self)
-    _scenes.unlock()
+    _scenes._remove(<void *>self)
     if self._worldID != NULL :
       ode.dWorldDestroy(self._worldID)
     if self._spaceID != NULL :
@@ -106,7 +102,7 @@
       self._callFields._empty()
       ode.dSpaceCollide(self._spaceID, <void*> self, Scene._callback)
       ode.dWorldQuickStep(self._worldID, self._stepSize)
-      ode.dJointGroupEmpty(_contactgroup)
+      ode.dJointGroupEmpty(self._contactGrp)
       if _i != 0 :
         self._callFields._foreach(_runField, NULL)
     self._stepUnLock()
@@ -163,6 +159,50 @@
     py.PyThread_release_lock(self._stepMutex)
 
 
+  cdef void _callback(self, ode.dGeomID _o1, ode.dGeomID _o2) :
+    cdef int _c, _f
+    cdef ode.dBodyID _b1, _b2
+    cdef soy.bodies._bodies.Body _bo1, _bo2
+    cdef ode.dContactGeom _cg
+    cdef ode.dContact _ct
+    cdef ode.dJointID _j
+    #
+    # Get associated bodies
+    _b1 = ode.dGeomGetBody(_o1)
+    _b2 = ode.dGeomGetBody(_o2)
+    #
+    # Do not continue if we can't do anything with our collisions
+    if _b1 == NULL or _b2 == NULL :
+      return
+    #
+    # Wham!
+    _c = ode.dCollide(_o1, _o2, 1, &_cg, sizeof(_cg))
+    if _c > 0 :
+      # Get the Body objects
+      _bo1 = <soy.bodies._bodies.Body> ode.dBodyGetData(_b1)
+      _bo2 = <soy.bodies._bodies.Body> ode.dBodyGetData(_b2)
+      _f = 0
+      # activate any fields present...
+      if isinstance(_bo1, soy.bodies.fields.Field) :
+        _f = 1
+        if not (<soy.bodies.fields.Field> _bo1)._exert(_bo2) :
+          self._callfields._insert(<void*> _bo1)
+      if isinstance(bo2, soy.bodies.fields.Field) :
+        _f = 1
+        if not (<soy.bodies.fields.Field> _bo2)._exert(_bo1) :
+          self._callfields._insert(<void*> _bo2)
+      # if neither shape is a field
+      if _f == 0 :
+        _ct.geom = _cg
+        # surface parameters should have an exposed interface on 
soy.shapes.Shape
+        # this code should pull parameters from there.
+        _ct.surface.mode = ode.dContactBounce
+        _ct.surface.bounce = 0.8
+        _ct.surface.bounce_vel = 0
+        _j = ode.dJointCreateContact(self._worldID, self._contactGrp, &_ct)
+        ode.dJointAttach(_j, _b1, _b2)
+
+
   property gravity :
     '''Scene gravity
 

Modified: trunk/pysoy/src/scenes/soy.scenes.pxd
===================================================================
--- trunk/pysoy/src/scenes/soy.scenes.pxd       2008-02-19 19:28:52 UTC (rev 
954)
+++ trunk/pysoy/src/scenes/soy.scenes.pxd       2008-02-19 20:09:22 UTC (rev 
955)
@@ -26,6 +26,7 @@
 cdef class Scene (soy._internals.Loopable) :
   cdef ode.dWorldID               _worldID
   cdef ode.dSpaceID               _spaceID
+  cdef ode.dJointGroupID          _contactGrp
   cdef soy._internals.Children    _bodies
   cdef soy._internals.Children    _joints
   cdef soy._internals.Children    _lights
@@ -43,3 +44,4 @@
   cdef void                       _coreRender     ( self )
   cdef int                        _steps          ( self )
   cdef void                       _updateTime     ( self )
+  cdef void                       _callback       ( self, ode.dGeomID, 
ode.dGeomID )

Modified: trunk/pysoy/src/scenes/soy.scenes.pyx
===================================================================
--- trunk/pysoy/src/scenes/soy.scenes.pyx       2008-02-19 19:28:52 UTC (rev 
954)
+++ trunk/pysoy/src/scenes/soy.scenes.pyx       2008-02-19 20:09:22 UTC (rev 
955)
@@ -38,5 +38,4 @@
 cimport soy.bodies.fields
 cimport soy.bodies.lights
 
-include "_getScenes.pxi"
 include "Scene.pxi"

_______________________________________________
PySoy-SVN mailing list
PySoy-SVN@pysoy.org
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to