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