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