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