Author: ArcRiley
Date: 2008-03-04 10:23:11 -0500 (Tue, 04 Mar 2008)
New Revision: 1015

Modified:
   trunk/pysoy/src/bodies._bodies/Body.pxi
   trunk/pysoy/src/bodies._bodies/Camera.pxi
   trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd
   trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx
   trunk/pysoy/src/bodies.fields/Buoyancy.pxi
   trunk/pysoy/src/bodies.fields/Shockwave.pxi
   trunk/pysoy/src/bodies.fields/soy.bodies.fields.pxd
   trunk/pysoy/src/bodies.fields/soy.bodies.fields.pyx
   trunk/pysoy/src/bodies.lights/Light.pxi
   trunk/pysoy/src/bodies.lights/soy.bodies.lights.pxd
   trunk/pysoy/src/bodies.lights/soy.bodies.lights.pyx
   trunk/pysoy/src/shapes/Box.pxi
   trunk/pysoy/src/shapes/Capsule.pxi
   trunk/pysoy/src/shapes/Shape.pxi
   trunk/pysoy/src/shapes/Sphere.pxi
   trunk/pysoy/src/shapes/soy.shapes.pxd
   trunk/pysoy/src/shapes/soy.shapes.pyx
Log:
Ticket #934 :
  * CURRENTLY SEGFAULTS - committing for debugging help
  * completely rewrote Body creation and destruction code
  * changed several Body cdefs to object to reduce cimports in .pxd's
  * added Body methods _append _remove _copyTo _copySet and _copyFrom
  * removed Body method _isActive
  * removed Shape method _isActive
  * renamed a number of cdefs to begin with _
  * removed redundant init code in Light
  * other things I cannot recall, this represents four days of work


Modified: trunk/pysoy/src/bodies._bodies/Body.pxi
===================================================================
--- trunk/pysoy/src/bodies._bodies/Body.pxi     2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/bodies._bodies/Body.pxi     2008-03-04 15:23:11 UTC (rev 
1015)
@@ -28,46 +28,75 @@
                 position=None, rotation=None, velocity=None,
                 mesh=None, shape=None,
                 *args, **keywords) :
+    #
+    # Preset to avoid threading bugs
+    self._mesh  = None
+    self._shape = None
+    self._tags  = soy._datatypes.HashTable()
+    #
     if scene == None :
-      pass
-      #self._bodyID = NULL
+      self._copySet(<ode.dReal*> py.PyMem_Malloc(sizeof(float) * 25))
+      self._bodyID = NULL
+      self._scene  = None
+    elif isinstance(scene, soy.scenes.Scene) :
+      (<soy.scenes.Scene> scene)._stepLock()
+      self._scene = scene
+      self._create()
+      self._append()
+      (<soy.scenes.Scene> scene)._stepUnLock()      
     else :
-      self.scene = scene
+      self._scene    = None
+      self._position = NULL
+      raise TypeError('scene must be instance of soy.scenes.Scene or None')
+    #
+    # Now that these internals are available, set them:
     if position :
       self.position = position
     if rotation :
       self.rotation = rotation
     if velocity :
       self.velocity = velocity
-    if mesh :
-      self.mesh = mesh
-    if shape :
-      self.shape = shape
-    self._tags = soy._datatypes.HashTable()
-    
+    self.mesh = mesh
+    self.shape = shape
 
 
   def __dealloc__(self) :
-    del(self.scene)
+    if self._scene :
+      (<soy.scenes.Scene> self._scene)._stepLock()
+      self._remove()
+      self._destroy()
+      (<soy.scenes.Scene> self._scene)._stepUnLock()
+    elif self._position != NULL :
+      # If not in a scene and local storage alloc'ed, free it
+      py.PyMem_Free(self._position)
+
     
   def distance(self, Body myBody) :
     assert self._scene == myBody._scene, 'bodies are in different scenes'
     return ode.dDISTANCE(self._position, myBody._position)
+
     
   def floor(self,Body floor) :
-      cdef ode.dGeomID myray
-      cdef ode.dContactGeom cg[10]
-      myray = ode.dCreateRay(self._scene._spaceID,1000)
-      
ode.dGeomRaySet(myray,self.position[0],self.position[1],self.position[2],0,-1,0)
-      countacts =ode.dCollide(<ode.dGeomID> myray,<ode.dGeomID> 
self._scene._spaceID,10, cg,sizeof(cg[0]))
-      print "done"
-      for contact in range(countacts): # countacts contains amount of 
collisions
-        print "Trying a contact"
-        if ode.dGeomGetBody(cg[contact].g2)==floor._bodyID:
-          print "Floor found"
-          self.position = (self.position[0], cg[contact].pos[1], 
self.position[2])
-          break
-        
+    cdef ode.dGeomID _ray
+    cdef ode.dContactGeom cg[10]
+    cdef ode.dSpaceID _spaceID
+    _spaceID = (<soy.scenes.Scene> self._scene)._spaceID  
+    _ray = ode.dCreateRay(_spaceID,1000)
+    ode.dGeomRaySet(_ray,
+                    self._position[0], self._position[1], self._position[2],
+                    0, -1, 0)
+    countacts = ode.dCollide(<ode.dGeomID> _ray, <ode.dGeomID> _spaceID, 
+                             10, cg, sizeof(cg[0]))
+    print "done"
+    for contact in range(countacts): # countacts contains amount of collisions
+      print "Trying a contact"
+      if ode.dGeomGetBody(cg[contact].g2) == floor._bodyID :
+        print "Floor found"
+        self.position = (self._position[0], cg[contact].pos[1], 
+                         self._position[2])
+        break
+
+
   cdef void poke(self, vector) :
     if self._bodyID :
       ode.dBodyAddForce(self._bodyID, vector[0], vector[1], vector[2])
@@ -82,33 +111,46 @@
     orientation, velocity, and rotation are all reset to (0,0,0).
     '''
     def __get__(self) :
-      if self._isActive() :
-        return self._scene
-      else :
-        return None
+      return self._scene
+    #
     def __set__(self, soy.scenes.Scene _newscene) :
-      if self._isActive() :
-        self._scene._bodies.lock()
-        self._scene._bodies.remove(<void *>self)
+      cdef ode.dReal  _store[25]
+      #
+      if self._scene :
+        (<soy.scenes.Scene> self._scene)._stepLock()
+        self._copyTo(_store)
+        self._remove()
         self._destroy()
-        self._scene._bodies.unlock()
         if self._shape :
-          if self._scene :
-            ode.dSpaceRemove(self._scene._spaceID, self._shape._geomID)
-          ode.dSpaceAdd((<soy.scenes.Scene> newscene)._spaceID, 
-                        self._shape._geomID)
+          ode.dSpaceRemove((<soy.scenes.Scene> self._scene)._spaceID, 
+                           (<soy.shapes.Shape> self._shape)._geomID )
+        (<soy.scenes.Scene> self._scene)._stepUnLock()
+      else :
+        self._copyTo(_store)
+        py.PyMem_Free(self._position)
       self._scene = _newscene
-      self._scene._bodies.lock()
+      (<soy.scenes.Scene> self._scene)._stepLock()
       self._create()
-      self._scene._bodies.append(<void *>self)
-      self._scene._bodies.unlock()
+      if self._shape :
+        ode.dSpaceAdd((<soy.scenes.Scene> self._scene)._spaceID,
+                      (<soy.shapes.Shape> self._shape)._geomID )
+      self._copyFrom(_store)
+      self._append()
+      (<soy.scenes.Scene> self._scene)._stepUnLock()
+    #
     def __del__(self) :
-      if self._isActive() :
-        self._scene._bodies.lock()
-        self._scene._bodies.remove(<void *>self)
-        self._destroy()
-        self._scene._bodies.unlock()
+      cdef ode.dReal* _store
+      if not self._scene :
+        return
+      _store = <ode.dReal*> py.PyMem_Malloc(sizeof(float) * 25)
+      (<soy.scenes.Scene> self._scene)._stepLock()
+      self._copyTo(_store)
+      self._remove()
+      self._destroy()
+      self._copySet(_store)
+      (<soy.scenes.Scene> self._scene)._stepUnLock()
 
+
   property tags :
     '''Body's tags
 
@@ -117,6 +159,7 @@
     def __get__(self) :
       return self._tags
 
+
   property mass :
     '''Body's mass
     
@@ -125,7 +168,7 @@
 
     def __get__(self) :
       return self._mass.mass
-
+    #
     def __set__(self, value) :
       if type(value)!=float and type(value)!=int :
         raise TypeError('Must provide an integer or float')
@@ -140,6 +183,7 @@
           ode.dBodySetGravityMode(self._bodyID, 0)
       else :
         self._mass.mass = value
+
         
   property position :
     '''Body's Position
@@ -154,10 +198,10 @@
         raise TypeError('Must provide a tuple or list')
       if len(value)!=3 :
         raise TypeError('Must provide (x,y,z)')
-      if self._bodyID :
-        self._scene._stepLock()
+      if self._scene != None :
+        (<soy.scenes.Scene> self._scene)._stepLock()
         ode.dBodySetPosition(self._bodyID, value[0], value[1], value[2])
-        self._scene._stepUnLock()
+        (<soy.scenes.Scene> self._scene)._stepUnLock()
       else :
         self._position[0] = value[0]
         self._position[1] = value[1]
@@ -178,9 +222,9 @@
       if len(value)!=3 :
         raise TypeError('Must provide (x,y,z)')
       if self._bodyID :
-        self._scene._stepLock()
+        (<soy.scenes.Scene> self._scene)._stepLock()
         ode.dBodySetAngularVel(self._bodyID, value[0], value[1], value[2])
-        self._scene._stepUnLock()
+        (<soy.scenes.Scene> self._scene)._stepUnLock()
       else :
         self._angularVel[0] = value[0]
         self._angularVel[1] = value[1]
@@ -201,9 +245,9 @@
       if len(value)!=3 :
         raise TypeError('Must provide (x,y,z)')
       if self._bodyID :
-        self._scene._stepLock()
+        (<soy.scenes.Scene> self._scene)._stepLock()
         ode.dBodySetLinearVel(self._bodyID, value[0], value[1], value[2])
-        self._scene._stepUnLock()
+        (<soy.scenes.Scene> self._scene)._stepUnLock()
       else :
         self._linearVel[0] = value[0]
         self._linearVel[1] = value[1]
@@ -221,7 +265,11 @@
     def __set__(self, _mesh) :
       if not (isinstance(_mesh, soy.meshes.Mesh) or self._mesh == None ) :
         raise TypeError('must be an instance of soy.meshes.Mesh')
+      # renderlock
       self._mesh = _mesh
+    def __del__(self) :
+      # renderlock
+      self._mesh = None
 
 
   property shape :
@@ -233,6 +281,9 @@
     def __get__(self) :
       return self._shape
     def __set__(self, value) :
+      if value == None :
+        self._shape = None
+        return
       if not isinstance(value, soy.shapes.Shape) :
         raise TypeError('Requires a Shape')
       # This call will make any needed changes to this object as well
@@ -240,22 +291,8 @@
 
 
   cdef void _create(self) :
-    self._bodyID = ode.dBodyCreate(self._scene._worldID)
+    self._bodyID = ode.dBodyCreate((<soy.scenes.Scene> self._scene)._worldID)
     ode.dBodySetData(self._bodyID, <void *>self)
-    if self._position != NULL :
-      # Need to copy self._mass over
-      ode.dBodySetPosition(self._bodyID, self._position[0],
-                           self._position[1], self._position[2])
-      ode.dBodySetQuaternion(self._bodyID, self._quaternion)
-      ode.dBodySetLinearVel(self._bodyID, self._linearVel[0],
-                            self._linearVel[1], self._linearVel[2])
-      ode.dBodySetAngularVel(self._bodyID, self._angularVel[0],
-                             self._angularVel[1], self._angularVel[2])
-      # Need to free self._mass
-      py.PyMem_Free(self._position)
-      py.PyMem_Free(self._quaternion)
-      py.PyMem_Free(self._linearVel)
-      py.PyMem_Free(self._angularVel)
     ode.dBodyGetMass(self._bodyID, &self._mass)
     self._position   = <ode.dReal*> ode.dBodyGetPosition  (self._bodyID)
     self._rotation   = <ode.dReal*> ode.dBodyGetRotation  (self._bodyID)
@@ -263,82 +300,116 @@
     self._linearVel  = <ode.dReal*> ode.dBodyGetLinearVel (self._bodyID)
     self._angularVel = <ode.dReal*> ode.dBodyGetAngularVel(self._bodyID)
 
+
   cdef void _destroy(self) :
-    cdef ode.dReal *real
-    # we need to copy shit here.  we are not, yet.
-    real = <ode.dReal *>ode.dBodyGetLinearVel(self._bodyID)
-    self._linearVel[0] = real[0]
-    self._linearVel[1] = real[1]
-    self._linearVel[2] = real[2]
-    real = <ode.dReal *>ode.dBodyGetAngularVel(self._bodyID)
-    self._angularVel[0] = real[0]
-    self._angularVel[1] = real[1]
-    self._angularVel[2] = real[2]
-    ode.dBodyGetMass(self._bodyID, &self._mass)
-
     ode.dBodyDestroy(self._bodyID)
     self._bodyID = NULL
 
-  cdef int _isActive(self) :
-    if self._bodyID == NULL :
-      return 0
-    else :
-      return 1
 
+  cdef void _append(self) :
+    (<soy.scenes.Scene> self._scene)._bodies.lock()
+    (<soy.scenes.Scene> self._scene)._bodies.append(<void *> self)
+    (<soy.scenes.Scene> self._scene)._bodies.unlock()
 
+
+  cdef void _remove(self) :
+    (<soy.scenes.Scene> self._scene)._bodies.lock()
+    (<soy.scenes.Scene> self._scene)._bodies.remove(<void *> self)
+    (<soy.scenes.Scene> self._scene)._bodies.unlock()
+
+
+  cdef void _copyTo(self, ode.dReal* _store) :
+    cdef int _i
+    for _i from 0 <= _i < 3 :
+      _store[_i] = self._position[_i]
+    for _i from 0 <= _i < 12 :
+      _store[_i+3] = self._rotation[_i]
+    for _i from 0 <= _i < 4 :
+      _store[_i+15] = self._quaternion[_i]
+    for _i from 0 <= _i < 3 :
+      _store[_i+19] = self._linearVel[_i]
+    for _i from 0 <= _i < 3 :
+      _store[_i+22] = self._angularVel[_i]
+
+
+  cdef void _copySet(self, ode.dReal* _store) :
+    #
+    # This function mallocs local storage for body attributes when it's
+    # not in a scene.  The storage is as follows:
+    #   position*3, rotation*12, quaternion*4, linearvel*3, angularvel*3 = 25
+    #
+    self._position   = _store
+    self._rotation   = self._position   + 3
+    self._quaternion = self._rotation   + 12
+    self._linearVel  = self._quaternion + 4
+    self._angularVel = self._linearVel  + 3
+
+
+  cdef void _copyFrom(self, ode.dReal* _store) :
+    ode.dBodySetPosition  (self._bodyID,  _store[0],  _store[1],  _store[2])
+    ode.dBodySetRotation  (self._bodyID, &_store[3] )
+    ode.dBodySetQuaternion(self._bodyID, &_store[15])
+    ode.dBodySetLinearVel (self._bodyID,  _store[19], _store[20], _store[21])
+    ode.dBodySetAngularVel(self._bodyID,  _store[22], _store[23], _store[24])
+
+
+
   ##########################################################################
   #
   # _coreLoop Functions
   #
 
   cdef void _coreRender(self) :
-    cdef gl.GLfloat  mtx[16]
-    if not self._mesh :
+    cdef gl.GLfloat _mtx[16]
+    if self._mesh == None :
+      stdio.printf('Not rendering\n')
       return
-    self._coreGetModelview(mtx)
+    stdio.printf('Rendering\n')
+    self._coreGetModelview(_mtx)
     gl.glPushMatrix()
-    gl.glMultMatrixf(mtx)
+    gl.glMultMatrixf(_mtx)
     (<soy.meshes.Mesh> self._mesh)._coreRender(<void *> self)
     gl.glPopMatrix()
+    stdio.printf('Done Rendering\n')
 
   cdef void _coreCreateVertFogCoords(self):
     cdef soy._datatypes.VertexList _verts
     if self._mesh:
-        _verts = (<soy.meshes.Mesh> self._mesh)._verts
-        _verts._uploadFogCoord( <float> self._position[1] )
+      _verts = (<soy.meshes.Mesh> self._mesh)._verts
+      _verts._uploadFogCoord( <float> self._position[1] )
       
-  cdef void _coreGetModelview(self, float* mtx):
-    mtx[0]  = self._rotation[0]
-    mtx[1]  = self._rotation[4]
-    mtx[2]  = self._rotation[8]
-    mtx[3]  = 0.0
-    mtx[4]  = self._rotation[1]
-    mtx[5]  = self._rotation[5]
-    mtx[6]  = self._rotation[9]
-    mtx[7]  = 0.0
-    mtx[8]  = self._rotation[2]
-    mtx[9]  = self._rotation[6]
-    mtx[10] = self._rotation[10]
-    mtx[11] = 0.0
-    mtx[12] = self._position[0]
-    mtx[13] = self._position[1]
-    mtx[14] = self._position[2]
-    mtx[15] = 1.0
+  cdef void _coreGetModelview(self, float* _mtx):
+    _mtx[0]  = self._rotation[0]
+    _mtx[1]  = self._rotation[4]
+    _mtx[2]  = self._rotation[8]
+    _mtx[3]  = 0.0
+    _mtx[4]  = self._rotation[1]
+    _mtx[5]  = self._rotation[5]
+    _mtx[6]  = self._rotation[9]
+    _mtx[7]  = 0.0
+    _mtx[8]  = self._rotation[2]
+    _mtx[9]  = self._rotation[6]
+    _mtx[10] = self._rotation[10]
+    _mtx[11] = 0.0
+    _mtx[12] = self._position[0]
+    _mtx[13] = self._position[1]
+    _mtx[14] = self._position[2]
+    _mtx[15] = 1.0
 
-  cdef void _coreGetModelviewInv(self, float* mtx):
-    mtx[0]  = self._rotation[0]
-    mtx[4]  = self._rotation[4]
-    mtx[8]  = self._rotation[8]
-    mtx[3]  = 0.0
-    mtx[1]  = self._rotation[1]
-    mtx[5]  = self._rotation[5]
-    mtx[9]  = self._rotation[9]
-    mtx[7]  = 0.0
-    mtx[2]  = self._rotation[2]
-    mtx[6]  = self._rotation[6]
-    mtx[10] = self._rotation[10]
-    mtx[11] = 0.0
-    mtx[12] = -self._position[0]
-    mtx[13] = -self._position[1]
-    mtx[14] = -self._position[2]
-    mtx[15] = 1.0
+  cdef void _coreGetModelviewInv(self, float* _mtx):
+    _mtx[0]  = self._rotation[0]
+    _mtx[4]  = self._rotation[4]
+    _mtx[8]  = self._rotation[8]
+    _mtx[3]  = 0.0
+    _mtx[1]  = self._rotation[1]
+    _mtx[5]  = self._rotation[5]
+    _mtx[9]  = self._rotation[9]
+    _mtx[7]  = 0.0
+    _mtx[2]  = self._rotation[2]
+    _mtx[6]  = self._rotation[6]
+    _mtx[10] = self._rotation[10]
+    _mtx[11] = 0.0
+    _mtx[12] = -self._position[0]
+    _mtx[13] = -self._position[1]
+    _mtx[14] = -self._position[2]
+    _mtx[15] = 1.0

Modified: trunk/pysoy/src/bodies._bodies/Camera.pxi
===================================================================
--- trunk/pysoy/src/bodies._bodies/Camera.pxi   2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/bodies._bodies/Camera.pxi   2008-03-04 15:23:11 UTC (rev 
1015)
@@ -27,16 +27,14 @@
   def __cinit__(self, soy.scenes.Scene parent, wireframe=0, 
                 *args, **keywords) :
     self._fovy = 45.0
-    self.mass = 0
+    #self.mass = 0
     self._wire = wireframe
     self._rpt = 0
     for i in range(15) :
       self._rtimes[i] = 0.0
 
   cdef void _coreProject(self) :  
-    cdef ode.dReal  *pos
-    cdef ode.dReal  *rot
-    cdef gl.GLfloat  mtx[16]
+    cdef gl.GLfloat  _mtx[16]
     #
     # Check if wireframe mode is turned on
     if self._wire == 1 :
@@ -55,23 +53,23 @@
       gl.glLineWidth (1)
     #
     # Now we apply an inverse matrix to translate to the Scene's origin
-    mtx[0]  = self._rotation[0]
-    mtx[1]  = self._rotation[1]
-    mtx[2]  = self._rotation[2]
-    mtx[3]  = 0.0
-    mtx[4]  = self._rotation[4]
-    mtx[5]  = self._rotation[5]
-    mtx[6]  = self._rotation[6]
-    mtx[7]  = 0.0
-    mtx[8]  = self._rotation[8]
-    mtx[9]  = self._rotation[9]
-    mtx[10] = self._rotation[10]
-    mtx[11] = 0.0
-    mtx[12] = 0.0
-    mtx[13] = 0.0
-    mtx[14] = 0.0
-    mtx[15] = 1.0
-    gl.glLoadMatrixf(mtx)
+    _mtx[0]  = self._rotation[0]
+    _mtx[1]  = self._rotation[1]
+    _mtx[2]  = self._rotation[2]
+    _mtx[3]  = 0.0
+    _mtx[4]  = self._rotation[4]
+    _mtx[5]  = self._rotation[5]
+    _mtx[6]  = self._rotation[6]
+    _mtx[7]  = 0.0
+    _mtx[8]  = self._rotation[8]
+    _mtx[9]  = self._rotation[9]
+    _mtx[10] = self._rotation[10]
+    _mtx[11] = 0.0
+    _mtx[12] = 0.0
+    _mtx[13] = 0.0
+    _mtx[14] = 0.0
+    _mtx[15] = 1.0
+    gl.glLoadMatrixf(_mtx)
     gl.glTranslatef(-self._position[0], -self._position[1], -self._position[2])
     self._scene._coreRender()
     #

Modified: trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd
===================================================================
--- trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd       2008-03-04 
14:31:42 UTC (rev 1014)
+++ trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd       2008-03-04 
15:23:11 UTC (rev 1015)
@@ -19,15 +19,13 @@
 
 cimport ode
 cimport soy._datatypes
-cimport soy.meshes
-cimport soy.scenes
-cimport soy.shapes
 
 cdef class Body :
   cdef ode.dBodyID              _bodyID
-  cdef soy.scenes.Scene         _scene
-  cdef soy.meshes.Mesh          _mesh
-  cdef soy.shapes.Shape         _shape
+  cdef object                   _scene
+  cdef object                   _mesh
+  cdef object                   _shape
+  cdef soy._datatypes.HashTable _tags
   # for loading/saving
   cdef ode.dMass                _mass
   cdef ode.dReal*               _position
@@ -35,16 +33,19 @@
   cdef ode.dReal*               _quaternion
   cdef ode.dReal*               _linearVel
   cdef ode.dReal*               _angularVel
-  cdef soy._datatypes.HashTable _tags
   # C functions
-  cdef void                     _create(self)
-  cdef void                     _destroy(self)
-  cdef int                      _isActive(self)
-  cdef void                    poke(self, vector)
-  cdef void                     _coreRender(self)
-  cdef void                     _coreCreateVertFogCoords (self)
-  cdef void                     _coreGetModelview        (self, float*)
-  cdef void                     _coreGetModelviewInv     (self, float*)
+  cdef void                     _create                  ( self )
+  cdef void                     _destroy                 ( self )
+  cdef void                     _append                  ( self )
+  cdef void                     _remove                  ( self )
+  cdef void                     _copyTo                  ( self, ode.dReal* )
+  cdef void                     _copySet                 ( self, ode.dReal* )
+  cdef void                     _copyFrom                ( self, ode.dReal* )
+  cdef void                    poke                     ( self, vector )
+  cdef void                     _coreRender              ( self )
+  cdef void                     _coreCreateVertFogCoords ( self )
+  cdef void                     _coreGetModelview        ( self, float* )
+  cdef void                     _coreGetModelviewInv     ( self, float* )
 
 
 cdef class Camera (Body) :

Modified: trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx
===================================================================
--- trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx       2008-03-04 
14:31:42 UTC (rev 1014)
+++ trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx       2008-03-04 
15:23:11 UTC (rev 1015)
@@ -37,6 +37,8 @@
 cimport stdio
 cimport soy._internals
 cimport soy.meshes
+cimport soy.scenes
+cimport soy.shapes
 
 include "Body.pxi"
 include "Camera.pxi"

Modified: trunk/pysoy/src/bodies.fields/Buoyancy.pxi
===================================================================
--- trunk/pysoy/src/bodies.fields/Buoyancy.pxi  2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/bodies.fields/Buoyancy.pxi  2008-03-04 15:23:11 UTC (rev 
1015)
@@ -23,38 +23,45 @@
     Adjusts the mass Monopole works based on
   '''
 
-  def __cinit__(self, soy.scenes.Scene parent, *args, **keywords) :
+  def __cinit__(self, *args, **keywords) :
     self._affected = soy._internals.Children()
     self._density = 0
 
   cdef void _give(self, int ccycle) :
     cdef int i
-    cdef soy.bodies._bodies.Body other
-    if (<void*> self._shape != NULL) ^ (ccycle == 0) :
+    cdef soy.bodies._bodies.Body _otherBody
+    if (self._shape) ^ (ccycle == 0) :
       for i from 0 <= i < self._affected.current :
-        other = <soy.bodies._bodies.Body> self._affected.list[i]
-        other._tags._remove("bmass")
+        _otherBody = <soy.bodies._bodies.Body> self._affected.list[i]
+        _otherBody._tags._remove("bmass")
       self._affected.empty()
 
-  cdef int _exert(self, soy.bodies._bodies.Body other) :
-    cdef float radius, submersion
-    ode.dBodyGetMass(other._bodyID, &other._mass)
+  cdef int _exert(self, soy.bodies._bodies.Body _otherBody) :
+    cdef float _radius, _submersion
+    cdef soy.shapes.Shape _otherShape
+    ode.dBodyGetMass(_otherBody._bodyID, &_otherBody._mass)
+    #
     # Volume-less bodies are not affected
-    if other._shape and other._shape._volume() != 0 :
-      if self._shape :
-        # Shaped fields partially submerge shapes
-        radius = other._shape._radius() 
-        submersion = (self._shape.pointDepth(other._shape._position[0],
-                                             other._shape._position[1],
-                                             other._shape._position[2])
-                      + radius) / (radius * 2)
-      else :
-        # Universal fields fully submerge all shapes
-        submersion = 1
-      other._tags._insert("bmass", other._mass.mass - submersion
-                                   * other._shape._volume()
-                                   * self._density)
-      self._affected.append(<void*> other)
+    if _otherBody._shape == None :
+      return 0
+    _otherShape = <soy.shapes.Shape> _otherBody._shape
+    if _otherShape._volume() == 0 :
+      return 0
+    if self._shape :
+      # Shaped fields partially submerge shapes
+      _radius = _otherShape._radius() 
+      _submersion = ((<soy.shapes.Shape> self._shape)._pointDepth(
+                      _otherShape._position[0],
+                      _otherShape._position[1],
+                      _otherShape._position[2])
+                    + radius) / (radius * 2)
+    else :
+      # Universal fields fully submerge all shapes
+      _submersion = 1
+    _otherBody._tags._insert("bmass", _otherBody._mass.mass - submersion
+                                      * _otherShape._volume()
+                                      * self._density)
+    self._affected.append(<void*> other)
     return 1
 
   property density :
@@ -64,5 +71,6 @@
     '''
     def __get__(self) :
       return self._density
+
     def __set__(self, value) :
       self._density = value

Modified: trunk/pysoy/src/bodies.fields/Shockwave.pxi
===================================================================
--- trunk/pysoy/src/bodies.fields/Shockwave.pxi 2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/bodies.fields/Shockwave.pxi 2008-03-04 15:23:11 UTC (rev 
1015)
@@ -23,7 +23,7 @@
     Models an constant-rate expanding shockwave
   '''
 
-  def __cinit__(self, soy.scenes.Scene parent, *args, **keywords) :
+  def __cinit__(self, *args, **keywords) :
     self._space = ode.dHashSpaceCreate(NULL)
 
   def __dealloc__(self) :
@@ -37,8 +37,10 @@
       return 1
 
     # Find position of other & depth in outer shell
-    depth = ode.dGeomSpherePointDepth(self._shape._geomID, other._position[0], 
other._position[1], other._position[2])
-
+    depth = ode.dGeomSpherePointDepth((<soy.shapes.Shape> self._shape)._geomID,
+                                      other._position[0],
+                                      other._position[1], 
+                                      other._position[2])
     # If it's within the interval
     if depth > 0 and depth < self._length :
       # No current _energy use yet, but calculate the force
@@ -67,18 +69,17 @@
       return
     # Timestep
     self._inner = self._outer
-    self._outer = self._scene._time - self._t0
+    self._outer = (<soy.scenes.Scene> self._scene)._time - self._t0
     # If it has gone to the limit, end
     if self._inner * self._velocity > self._radius :
-      ode.dGeomSphereSetRadius(self._shape._geomID, 0)
+      ode.dGeomSphereSetRadius((<soy.shapes.Shape> self._shape)._geomID, 0)
       self._t0 = 0
     stdio.printf("give complete\n")
  
   def activate(self) :
-    import soy.shapes
     if (self._t0 != 0) :
       raise RuntimeError('Multiple use shockwaves are not yet available')
-    self._t0 = self._scene._time
+    self._t0 = (<soy.scenes.Scene> self._scene)._time
     self._inner = 0
     self._outer = 0
     self.shape = soy.shapes.Sphere(0)

Modified: trunk/pysoy/src/bodies.fields/soy.bodies.fields.pxd
===================================================================
--- trunk/pysoy/src/bodies.fields/soy.bodies.fields.pxd 2008-03-04 14:31:42 UTC 
(rev 1014)
+++ trunk/pysoy/src/bodies.fields/soy.bodies.fields.pxd 2008-03-04 15:23:11 UTC 
(rev 1015)
@@ -22,7 +22,6 @@
 cimport stdio
 cimport soy._internals
 cimport soy.bodies._bodies
-cimport soy.shapes
 
 cdef class Field(soy.bodies._bodies.Body) :
   cdef void             _give(self, int ccyle)

Modified: trunk/pysoy/src/bodies.fields/soy.bodies.fields.pyx
===================================================================
--- trunk/pysoy/src/bodies.fields/soy.bodies.fields.pyx 2008-03-04 14:31:42 UTC 
(rev 1014)
+++ trunk/pysoy/src/bodies.fields/soy.bodies.fields.pyx 2008-03-04 15:23:11 UTC 
(rev 1015)
@@ -25,6 +25,8 @@
 __version__ = 'Trunk (r'+'$Rev$'[6:-2]+')'
 
 cimport soy.scenes
+cimport soy.shapes
+import soy.shapes
 
 include "Field.pxi"
 include "Monopole.pxi"

Modified: trunk/pysoy/src/bodies.lights/Light.pxi
===================================================================
--- trunk/pysoy/src/bodies.lights/Light.pxi     2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/bodies.lights/Light.pxi     2008-03-04 15:23:11 UTC (rev 
1015)
@@ -23,20 +23,33 @@
     Lights provide illumination in your scene.  Needs more work.
   '''
 
-  def __cinit__(self, object scene=None, *args, **keywords) : 
-    if isinstance(scene, soy.scenes.Scene) :
-      self._scene._lights.lock()
-      self._scene._lights.append(<void *>self)
-      self._scene._lights.unlock()
-    elif scene != None :
-      raise TypeError('not an instance of soy.scenes.Scene')
-    #
-    # These need to be capable of being set with __cinit__
-    self._ambient = soy.colors.black
-    self._diffuse = soy.colors.white
-    self._specular = soy.colors.white
+  def __cinit__(self, scene=None,
+                ambient=soy.colors.black, diffuse=soy.colors.white,
+                specular=soy.colors.white,
+                *args, **keywords) : 
+    self._ambient  = ambient
+    self._diffuse  = diffuse
+    self._specular = specular
 
 
+  cdef void _append(self) :
+    (<soy.scenes.Scene> self._scene)._bodies.lock()
+    (<soy.scenes.Scene> self._scene)._bodies.append(<void *> self)
+    (<soy.scenes.Scene> self._scene)._bodies.unlock()
+    (<soy.scenes.Scene> self._scene)._lights.lock()
+    (<soy.scenes.Scene> self._scene)._lights.append(<void *> self)
+    (<soy.scenes.Scene> self._scene)._lights.unlock()
+
+
+  cdef void _remove(self) :
+    (<soy.scenes.Scene> self._scene)._bodies.lock()
+    (<soy.scenes.Scene> self._scene)._bodies.remove(<void *> self)
+    (<soy.scenes.Scene> self._scene)._bodies.unlock()
+    (<soy.scenes.Scene> self._scene)._lights.lock()
+    (<soy.scenes.Scene> self._scene)._lights.remove(<void *> self)
+    (<soy.scenes.Scene> self._scene)._lights.unlock()
+
+
   cdef void _on(self, int id) :
     cdef gl.GLfloat _ambient[4]
     cdef gl.GLfloat _diffuse[4]
@@ -64,54 +77,6 @@
     return
 
 
-  property scene :
-    '''Light's Scene
-
-    This is the Scene that the light is in.  When changed the body's position,
-    orientation, velocity, and rotation are all reset to (0,0,0).
-       It has be overridden from Body's method and altered to let the light be 
-       added to the more specific _lights Children object.
-    '''
-    def __get__(self) :
-      if self._isActive() :
-        return self._scene
-      else :
-        return None
-    def __set__(self, newscene) :
-      if not (isinstance(newscene, soy.scenes.Scene) or newscene==None) :
-        raise TypeError('not an instance of soy.scenes.Scene')
-      if self._isActive() :
-        self._scene._bodies.lock()
-        self._scene._lights.lock()
-        self._scene._bodies.remove(<void *>self)
-        self._scene._lights.remove(<void *>self)
-        self._destroy()
-        self._scene._bodies.unlock()
-        self._scene._lights.unlock()
-        if self._shape :
-          if self._scene :
-            ode.dSpaceRemove(self._scene._spaceID, self._shape._geomID)
-          ode.dSpaceAdd((<soy.scenes.Scene> newscene)._spaceID, 
self._shape._geomID)
-      if newscene != None :
-        self._scene = newscene
-        self._scene._bodies.lock()
-        self._scene._lights.lock()
-        self._create()
-        self._scene._bodies.append(<void *>self)
-        self._scene._lights.append(<void *>self)
-        self._scene._bodies.unlock()
-        self._scene._lights.unlock()
-    def __del__(self) :
-      if self._isActive() :
-        self._scene._bodies.lock()
-        self._scene._bodies.remove(<void *>self)
-        self._destroy()
-        self._scene._bodies.unlock()
-        self._scene._lights.lock()
-        self._scene._lights.remove(<void *>self)
-        self._scene._lights.unlock()
-
-
   property ambient :
     def __get__(self) :
       return self._ambient

Modified: trunk/pysoy/src/bodies.lights/soy.bodies.lights.pxd
===================================================================
--- trunk/pysoy/src/bodies.lights/soy.bodies.lights.pxd 2008-03-04 14:31:42 UTC 
(rev 1014)
+++ trunk/pysoy/src/bodies.lights/soy.bodies.lights.pxd 2008-03-04 15:23:11 UTC 
(rev 1015)
@@ -22,8 +22,6 @@
 cimport stdio
 cimport soy._internals
 cimport soy.bodies._bodies
-cimport soy.colors
-cimport soy.materials
 
 cdef class Light (soy.bodies._bodies.Body) :
   cdef object  _ambient

Modified: trunk/pysoy/src/bodies.lights/soy.bodies.lights.pyx
===================================================================
--- trunk/pysoy/src/bodies.lights/soy.bodies.lights.pyx 2008-03-04 14:31:42 UTC 
(rev 1014)
+++ trunk/pysoy/src/bodies.lights/soy.bodies.lights.pyx 2008-03-04 15:23:11 UTC 
(rev 1015)
@@ -23,7 +23,9 @@
               'by '+'$Author$'[9:-2]
 __version__ = 'Trunk (r'+'$Rev$'[6:-2]+')'
 
+cimport soy.scenes
+cimport soy.colors
+cimport soy.materials
 import soy.colors
-cimport soy.scenes
 
 include "Light.pxi"

Modified: trunk/pysoy/src/shapes/Box.pxi
===================================================================
--- trunk/pysoy/src/shapes/Box.pxi      2008-03-04 14:31:42 UTC (rev 1014)
+++ trunk/pysoy/src/shapes/Box.pxi      2008-03-04 15:23:11 UTC (rev 1015)
@@ -28,7 +28,7 @@
     ode.dGeomSetCategoryBits(self._geomID, 2) # GeomBody
     ode.dGeomSetData(self._geomID, <void*> self)
 
-  cdef float pointDepth(self, float x, float y, float z) :
+  cdef float _pointDepth(self, float x, float y, float z) :
     return <float> ode.dGeomBoxPointDepth(self._geomID, x, y, z)
 
   cdef float _volume(self) :

Modified: trunk/pysoy/src/shapes/Capsule.pxi
===================================================================
--- trunk/pysoy/src/shapes/Capsule.pxi  2008-03-04 14:31:42 UTC (rev 1014)
+++ trunk/pysoy/src/shapes/Capsule.pxi  2008-03-04 15:23:11 UTC (rev 1015)
@@ -27,7 +27,7 @@
     self._geomID = ode.dCreateCapsule(NULL, radius, length)
     ode.dGeomSetData(self._geomID, <void*> self)
 
-  cdef float pointDepth(self, float x, float y, float z) :
+  cdef float _pointDepth(self, float x, float y, float z) :
     return <float> ode.dGeomCapsulePointDepth(self._geomID, x, y, z)
 
   cdef float _volume(self) :

Modified: trunk/pysoy/src/shapes/Shape.pxi
===================================================================
--- trunk/pysoy/src/shapes/Shape.pxi    2008-03-04 14:31:42 UTC (rev 1014)
+++ trunk/pysoy/src/shapes/Shape.pxi    2008-03-04 15:23:11 UTC (rev 1015)
@@ -29,10 +29,7 @@
   def __cinit__(self, *args, **kw) :
     self._geomID = NULL
 
-  cdef int _isActive(self) :
-    return self._geomID != NULL
-
-  cdef float pointDepth(self, float x, float y, float z) :
+  cdef float _pointDepth(self, float x, float y, float z) :
     return 0
 
   cdef float _volume(self) :
@@ -61,38 +58,51 @@
         return None
 
     def __set__(self, object value) :
-      cdef ode.dBodyID b
-      cdef soy.bodies._bodies.Body bo
+      cdef ode.dBodyID _bodyID
+      cdef soy.bodies._bodies.Body _body
+      cdef soy.scenes.Scene _scene
       if value != None and not isinstance(value, soy.bodies._bodies.Body) :
         raise TypeError('Requires a Body')
       if not self._geomID :
         raise RuntimeError('Cannot use a base Shape object')
-      b = <ode.dBodyID> ode.dGeomGetBody(self._geomID)
+      _bodyID = <ode.dBodyID> ode.dGeomGetBody(self._geomID)
+      #
       # If there is an old body, disconnect from it.
-      if b != NULL :
-        bo._scene._bodies.lock()
-        bo = <soy.bodies._bodies.Body> ode.dBodyGetData(b)
-        # If we were in a scene's space, get out
-        if bo._scene :
-          ode.dSpaceRemove(bo._scene._spaceID, self._geomID)
-       #and remove reference back to this shape from old body.
-        bo._shape = None
-        bo._scene._bodies.unlock()
+      if _bodyID != NULL :
+        _body = <soy.bodies._bodies.Body> ode.dBodyGetData(_bodyID)
+        # If setting to same Body instance, return now
+        if _body == value :
+          return
+        if _body._scene != None :
+          # If we were in a scene's space, get out
+          _scene = <soy.scenes.Scene> _body._scene
+          _scene._stepLock()
+          ode.dSpaceRemove(_scene._spaceID, self._geomID)
+          _body._shape = None
+          _scene._stepUnLock()
+        else :
+          _body._shape = None
+      #
       # If there's nothing new to connect to, clear that as well
       if value == None :
         ode.dGeomSetBody(self._geomID, NULL)
-      else :
-        (<soy.bodies._bodies.Body> value)._scene._bodies.lock()
-        if (<soy.bodies._bodies.Body> value)._bodyID == NULL :
-          raise RuntimeError('Cannot link a Shape and Body if the Body is not 
active.')
-        # Connect new body to this geom
-        ode.dGeomSetBody(self._geomID, (<soy.bodies._bodies.Body> 
value)._bodyID)
-        if (<soy.bodies._bodies.Body> value)._scene :
-          ode.dSpaceAdd((<soy.bodies._bodies.Body> value)._scene._spaceID, 
self._geomID)
+        return
+      # 
+      # Add new body
+      _body   = <soy.bodies._bodies.Body> value
+      if _body._scene != None :
+        _scene = <soy.scenes.Scene> _body._scene
+        _scene._stepLock()
+        ode.dGeomSetBody(self._geomID, _body._bodyID)
+        ode.dSpaceAdd(_scene._spaceID, self._geomID)
+        #
         # If the new Body is still connected to a Shape, disconnect it.
-        if (<soy.bodies._bodies.Body> value)._shape :
-          (<soy.bodies._bodies.Body> value)._shape.body = None
-        # Link bank Body's reference to here.
-        (<soy.bodies._bodies.Body> value)._shape = self
+        if _body._shape != None :
+          (<soy.shapes.Shape> _body._shape).body = None
+        #
+        # Link back Body's reference to here.
+        _body._shape = self
         self._position = ode.dGeomGetPosition(self._geomID)
-        (<soy.bodies._bodies.Body> value)._scene._bodies.unlock()
+        _scene._stepUnLock()
+      else :
+        stdio.printf('This is incomplete!')

Modified: trunk/pysoy/src/shapes/Sphere.pxi
===================================================================
--- trunk/pysoy/src/shapes/Sphere.pxi   2008-03-04 14:31:42 UTC (rev 1014)
+++ trunk/pysoy/src/shapes/Sphere.pxi   2008-03-04 15:23:11 UTC (rev 1015)
@@ -27,7 +27,7 @@
     self._geomID = ode.dCreateSphere(NULL, radius)
     ode.dGeomSetData(self._geomID, <void*> self)
 
-  cdef float pointDepth(self, float x, float y, float z) :
+  cdef float _pointDepth(self, float x, float y, float z) :
     return <float> ode.dGeomSpherePointDepth(self._geomID, x, y, z)
 
   cdef float _volume(self) :

Modified: trunk/pysoy/src/shapes/soy.shapes.pxd
===================================================================
--- trunk/pysoy/src/shapes/soy.shapes.pxd       2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/shapes/soy.shapes.pxd       2008-03-04 15:23:11 UTC (rev 
1015)
@@ -24,8 +24,7 @@
 cdef class Shape :
   cdef ode.dGeomID               _geomID
   cdef ode.dReal*                _position
-  cdef int                       _isActive(self)
-  cdef float                     pointDepth(self, float x, float y, float z)
+  cdef float                     _pointDepth(self, float x, float y, float z)
   cdef float                     _radius(self)
   cdef int                       _finite(self)
   cdef float                     _volume(self)

Modified: trunk/pysoy/src/shapes/soy.shapes.pyx
===================================================================
--- trunk/pysoy/src/shapes/soy.shapes.pyx       2008-03-04 14:31:42 UTC (rev 
1014)
+++ trunk/pysoy/src/shapes/soy.shapes.pyx       2008-03-04 15:23:11 UTC (rev 
1015)
@@ -27,6 +27,9 @@
               'by '+'$Author$'[9:-2]
 __version__ = 'Trunk (r'+'$Rev$'[6:-2]+')'
 
+cimport soy.scenes
+cimport soy.shapes
+
 include "Shape.pxi"
 include "Sphere.pxi"
 include "Box.pxi"

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

Reply via email to