Author: ArcRiley
Date: 2007-07-08 23:26:10 -0400 (Sun, 08 Jul 2007)
New Revision: 440

Modified:
   trunk/pysoy/src/_datatypes/FaceList.pxi
   trunk/pysoy/src/_datatypes/MaterialList.pxi
   trunk/pysoy/src/_datatypes/soy._datatypes.pxd
   trunk/pysoy/src/atoms/Face.pxi
   trunk/pysoy/src/meshes/Mesh.pxi
Log:
Finished ticket #257


Modified: trunk/pysoy/src/_datatypes/FaceList.pxi
===================================================================
--- trunk/pysoy/src/_datatypes/FaceList.pxi     2007-07-09 00:30:20 UTC (rev 
439)
+++ trunk/pysoy/src/_datatypes/FaceList.pxi     2007-07-09 03:26:10 UTC (rev 
440)
@@ -88,16 +88,28 @@
                        self._array, gl.GL_STATIC_DRAW_ARB)
 
 
-  cdef void _flagUpdated(self, int _index) :
-    if _index < self._updateRange.offset or self._updateRange.offset == -1 :
-      self._updateRange.offset = _index
-    if _index - self._updateRange.offset > self._updateRange.length :
-      self._updateRange.length = _index - self._updateRange.offset
+  cdef void _flagUpdated(self, int _offset, int _length) :
+    cdef int _top
+    cdef int _start
+    if self._updateRange.length == 0 :
+      self._updateRange.offset = _offset
+      self._updateRange.length = _length
+    else :
+      if _offset < self._updateRange.offset :
+        _start = _offset
+      else :
+        _start = self._updateRange.offset
+      if _offset+_length > self._updateRange.offset+self._updateRange.length :
+        _top = _offset + _length
+      else :
+        _top = self._updateRange.offset + self._updateRange.length
+      self._updateRange.offset = _start
+      self._updateRange.length = _top - _start
 
 
   cdef void _sendUpdated(self) :
     gl.glBindBufferARB(gl.GL_ELEMENT_ARRAY_BUFFER_ARB, self._buffer)
-    if self._updateRange.offset == -1 :
+    if self._updateRange.length == 0 :
       return
     # If in the process of writing, wait until next cycle to send
     if not self._children.trylock() :
@@ -112,7 +124,6 @@
                             6 * self._updateRange.offset,
                             6 * (self._updateRange.length+1),
                             &self._array[self._updateRange.offset])
-    self._updateRange.offset = -1
     self._updateRange.length = 0
     self._children.unlock()
 

Modified: trunk/pysoy/src/_datatypes/MaterialList.pxi
===================================================================
--- trunk/pysoy/src/_datatypes/MaterialList.pxi 2007-07-09 00:30:20 UTC (rev 
439)
+++ trunk/pysoy/src/_datatypes/MaterialList.pxi 2007-07-09 03:26:10 UTC (rev 
440)
@@ -87,10 +87,10 @@
       return
     _mesh = <soy.meshes.Mesh> self._mesh
     if _mesh._faces._buffer == 0 :
-      mesh._faces._createBuffer()
-      mesh._verts._createBuffer()
-    mesh._faces._sendUpdated()
-    mesh._verts._renderBuffer()
+      _mesh._faces._createBuffer()
+      _mesh._verts._createBuffer()
+    _mesh._faces._sendUpdated()
+    _mesh._verts._renderBuffer()
     self._children.lock()
     for i from 0 <= i < self._children.current :
       (<soy.materials.Material> self._children.list[i])._bind()

Modified: trunk/pysoy/src/_datatypes/soy._datatypes.pxd
===================================================================
--- trunk/pysoy/src/_datatypes/soy._datatypes.pxd       2007-07-09 00:30:20 UTC 
(rev 439)
+++ trunk/pysoy/src/_datatypes/soy._datatypes.pxd       2007-07-09 03:26:10 UTC 
(rev 440)
@@ -52,7 +52,7 @@
   cdef void              _insert(self, char*, float)
   cdef float             _lookup(self, char*)
   cdef int               _has_key(self, char*)
-  cdef int               _remove(self, char*)
+  cdef int               _remove(self, char*) 
 
 
 cdef class Datatype :
@@ -83,7 +83,7 @@
   cdef void                       _renderBuffer (self, int, int)
   cdef void                       _createBuffer (self)
   cdef void                       _sendUpdated  (self)
-  cdef void                       _flagUpdated  (self, int)
+  cdef void                       _flagUpdated  (self, int, int)
 
 
 cdef class VertexList (Datatype) :

Modified: trunk/pysoy/src/atoms/Face.pxi
===================================================================
--- trunk/pysoy/src/atoms/Face.pxi      2007-07-09 00:30:20 UTC (rev 439)
+++ trunk/pysoy/src/atoms/Face.pxi      2007-07-09 03:26:10 UTC (rev 440)
@@ -23,12 +23,13 @@
      An element of FaceList with .verts property
   '''
   def __new__(self, soy.meshes.Mesh mesh,
-              verts=None,
+              verts=None, material=None,
               index=-1, *args, **keywords) :
+    cdef int i, _mindex
     self._index = -1
     self._list = mesh._faces
     if index >= 0 :
-      # For an instance of an existing vertex
+      # For an instance of an existing face
       if index >= self._list._arraySize :
         raise ValueError('index out of range')
       self._list._children.lock()
@@ -37,14 +38,43 @@
       self._list._children.unlock()
     else :
       # For a brand new face
+      if not (verts and material) :
+        raise TypeError('must provide verticies and material for a new Face')
+      if not isinstance(material, soy.materials.Material) :
+        raise TypeError('material must be of type soy.materials.Material')
       self._list._children.lock()
+      mesh._mates._children.lock()
       self._list._children.append(<void *>self)
-      self._index = self._list._arraySize
-      self._list._arraySize = self._list._arraySize + 1
-      self._list._allocArray (self._list._arraySize)
-      self._list._flagUpdated(self._index)
+      self._list._allocArray(self._list._arraySize + 1)
+      _mindex = mesh._mates._children.index(<void *> material)
+      if _mindex == -1 :
+        #
+        # New material, add face to end of array
+        self._index = self._list._arraySize
+        _mindex = mesh._mates._children.current
+        mesh._mates._children.append(<void *> material)
+        mesh._mates._allocRanges(mesh._mates._children.current)
+        mesh._mates._ranges[_mindex].offset = self._index
+        mesh._mates._ranges[_mindex].length = 1
+        self._list._arraySize = self._list._arraySize + 1
+        self._list._flagUpdated(self._index, 1)
+        #
+      else :
+        #
+        # Existing material, insert face into center of array
+        self._index = mesh._mates._ranges[_mindex].offset + \
+                      mesh._mates._ranges[_mindex].length
+        mesh._mates._ranges[_mindex].length = \
+          mesh._mates._ranges[_mindex].length + 1
+        for i from self._list._arraySize > i >= self._index :
+          self._list._array[i+1] = self._list._array[i]
+        for i from _mindex < i < mesh._mates._children.current :
+          mesh._mates._ranges[i].offset = mesh._mates._ranges[i].offset + 1
+        self._list._arraySize = self._list._arraySize + 1
+        self._list._flagUpdated(self._index, self._list._arraySize-self._index)
+        #
+      mesh._mates._children.unlock()
       self._list._children.unlock()
-    if verts :
       self.verts = verts
 
 
@@ -84,5 +114,5 @@
       self._list._array[self._index].a = (<Vertex> value[0])._index
       self._list._array[self._index].b = (<Vertex> value[1])._index
       self._list._array[self._index].c = (<Vertex> value[2])._index
-      self._list._flagUpdated(self._index)
+      self._list._flagUpdated(self._index, 1)
       self._list._children.unlock()

Modified: trunk/pysoy/src/meshes/Mesh.pxi
===================================================================
--- trunk/pysoy/src/meshes/Mesh.pxi     2007-07-09 00:30:20 UTC (rev 439)
+++ trunk/pysoy/src/meshes/Mesh.pxi     2007-07-09 03:26:10 UTC (rev 440)
@@ -96,8 +96,6 @@
   '''This is for testing only'''
   def __new__(self, tex=None, *args, **keywords) :
     cdef object  a, b, c, d, e
-    self._allocMates(3)
-    self._nmate = 3
     import soy.colors
     self.mat0 = soy.materials.Material(ambient=soy.colors.BlueViolet(),
                                        diffuse=soy.colors.Cyan())
@@ -105,9 +103,6 @@
                                        diffuse=soy.colors.GoldenRod())
     self.mat2 = soy.materials.Material(color=tex)
 
-    #self._mates[0].mat = <void *>self.mat0
-    #self._mates[1].mat = <void *>self.mat1
-    #self._mates[2].mat = <void *>self.mat2
     #self._mates[0].offset = 0
     #self._mates[0].length = 2
     #self._mates[1].offset = 2
@@ -121,13 +116,9 @@
     d = soy.atoms.Vertex(self,position=( 1,-1,-1), texcoord=(1,1,0))
     e = soy.atoms.Vertex(self,position=(-1,-1,-1), texcoord=(1,0,0)) 
 
-    soy.atoms.Face(self, verts=(a,b,c))
-    soy.atoms.Face(self, verts=(a,d,e))
-    soy.atoms.Face(self, verts=(a,c,d))
-    soy.atoms.Face(self, verts=(a,e,b))
-    soy.atoms.Face(self, verts=(d,c,b))
-    soy.atoms.Face(self, verts=(e,d,b))
-
-
-  def __dealloc__(self) :
-    self._allocMates(0)
+    soy.atoms.Face(self, verts=(a,b,c), material=self.mat0)
+    soy.atoms.Face(self, verts=(a,d,e), material=self.mat0)
+    soy.atoms.Face(self, verts=(a,c,d), material=self.mat1)
+    soy.atoms.Face(self, verts=(a,e,b), material=self.mat1)
+    soy.atoms.Face(self, verts=(d,c,b), material=self.mat2)
+    soy.atoms.Face(self, verts=(e,d,b), material=self.mat2)

_______________________________________________
PySoy-SVN mailing list
[email protected]
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to