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

Reply via email to