Author: JonNeal Date: 2008-03-10 17:40:39 -0400 (Mon, 10 Mar 2008) New Revision: 1124
Modified: trunk/pysoy/src/_datatypes/BodyPosition.pxi trunk/pysoy/src/_datatypes/soy._datatypes.pxd Log: Ticket #946: Getting help with a segfault. Modified: trunk/pysoy/src/_datatypes/BodyPosition.pxi =================================================================== --- trunk/pysoy/src/_datatypes/BodyPosition.pxi 2008-03-10 20:47:33 UTC (rev 1123) +++ trunk/pysoy/src/_datatypes/BodyPosition.pxi 2008-03-10 21:40:39 UTC (rev 1124) @@ -22,22 +22,44 @@ '''soy._datatypes.BodyPosition This is a container for the position of bodies. - Accepts a body for the only parameter. + Accepts a body or list (x,y,z) for the only parameter. ''' - def __cinit__(self, parent) : + def __cinit__(self, parent=None) : if isinstance(parent, soy.bodies.Body) : self._body = <void*> parent + elif type(parent) == list or type(parent) == tuple : + self._body = NULL + self._position[0] = parent[0] + self._position[1] = parent[1] + self._position[2] = parent[2] else : - raise TypeError("parent must be of type soy.bodies.Body") + raise TypeError("parent must be a soy.bodies.Body, list, or tuple") + def __add__(self, value) : + if type(value) == int or type(value) == float : + return soy._datatypes.BodyPosition((self._position[0] + value, + self._position[1] + value, + self._position[1] + value)) + if isinstance(value, soy._datatypes.BodyPosition) : + return soy._datatypes.BodyPosition((self._position[0] + value.x, + self._position[1] + value.y, + self._position[1] + value.z)) + if type(value) == tuple or type(value) == list and len(value) == 3 : + return soy._datatypes.BodyPosition((self._position[0] + value[0], + self._position[1] + value[1], + self._position[1] + value[2])) + return NotImplemented + def __getitem__(self, index) : if type(index) != int : raise TypeError('Position index must be an int') if index > 2 or index < 0 : raise IndexError('Position index out of range') - return (<soy.bodies.Body> self._body)._position[index] + if self._body : + return (<soy.bodies.Body> self._body)._position[index] + return self._position[index] def __len__(self) : @@ -45,9 +67,12 @@ def __repr__(self) : - return '(%f, %f, %f)' % ((<soy.bodies.Body> self._body)._position[0], - (<soy.bodies.Body> self._body)._position[1], - (<soy.bodies.Body> self._body)._position[2]) + if (<soy.bodies.Body> self._body) : + return '(%f, %f, %f)' % ((<soy.bodies.Body> self._body)._position[0], + (<soy.bodies.Body> self._body)._position[1], + (<soy.bodies.Body> self._body)._position[2]) + return '(%f, %f, %f)' % (self._position[0],self._position[1], + self._position[2]) def __setitem__(self, index, value) : @@ -57,30 +82,33 @@ raise TypeError('Position index must be an int') if index > 2 or index < 0 : raise IndexError('Position index out of range') - if (<soy.bodies.Body> self._body)._bodyID == NULL : - # - # If not in a scene set value directly - (<soy.bodies.Body> self._body)._position[index] = value + if self._body : + if (<soy.bodies.Body> self._body)._bodyID == NULL : + # + # If not in a scene set value directly + (<soy.bodies.Body> self._body)._position[index] = value + else : + # + # If in a scene, steplock and use ODE + (<soy.scenes.Scene> (<soy.bodies.Body> self._body)._scene)._stepLock() + if index == 0 : + ode.dBodySetPosition((<soy.bodies.Body> self._body)._bodyID, + value, + (<soy.bodies.Body> self._body)._position[1], + (<soy.bodies.Body> self._body)._position[2]) + elif index == 1 : + ode.dBodySetPosition((<soy.bodies.Body> self._body)._bodyID, + (<soy.bodies.Body> self._body)._position[0], + value, + (<soy.bodies.Body> self._body)._position[2]) + else: + ode.dBodySetPosition((<soy.bodies.Body> self._body)._bodyID, + (<soy.bodies.Body> self._body)._position[0], + (<soy.bodies.Body> self._body)._position[1], + value) + (<soy.scenes.Scene> (<soy.bodies.Body> self._body)._scene)._stepUnLock() else : - # - # If in a scene, steplock and use ODE - (<soy.scenes.Scene> (<soy.bodies.Body> self._body)._scene)._stepLock() - if index == 0 : - ode.dBodySetPosition((<soy.bodies.Body> self._body)._bodyID, - value, - (<soy.bodies.Body> self._body)._position[1], - (<soy.bodies.Body> self._body)._position[2]) - elif index == 1 : - ode.dBodySetPosition((<soy.bodies.Body> self._body)._bodyID, - (<soy.bodies.Body> self._body)._position[0], - value, - (<soy.bodies.Body> self._body)._position[2]) - else: - ode.dBodySetPosition((<soy.bodies.Body> self._body)._bodyID, - (<soy.bodies.Body> self._body)._position[0], - (<soy.bodies.Body> self._body)._position[1], - value) - (<soy.scenes.Scene> (<soy.bodies.Body> self._body)._scene)._stepUnLock() + self._position[index] = value ############################################################################ Modified: trunk/pysoy/src/_datatypes/soy._datatypes.pxd =================================================================== --- trunk/pysoy/src/_datatypes/soy._datatypes.pxd 2008-03-10 20:47:33 UTC (rev 1123) +++ trunk/pysoy/src/_datatypes/soy._datatypes.pxd 2008-03-10 21:40:39 UTC (rev 1124) @@ -130,3 +130,4 @@ cdef class BodyPosition : cdef void* _body + cdef float _position[3] _______________________________________________ PySoy-SVN mailing list PySoy-SVN@pysoy.org http://www.pysoy.org/mailman/listinfo/pysoy-svn