Author: JaroslawTworek
Date: 2008-01-23 16:47:25 +0000 (Wed, 23 Jan 2008)
New Revision: 795

Modified:
   trunk/pysoy/examples/liquid_example.py
   trunk/pysoy/include/gl.pxd
   trunk/pysoy/include/stdlib.pxd
   trunk/pysoy/src/_core-x11/Screen.pxi
   trunk/pysoy/src/_datatypes/VertexList.pxi
   trunk/pysoy/src/_datatypes/soy._datatypes.pxd
   trunk/pysoy/src/bodies._bodies/Body.pxi
   trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd
   trunk/pysoy/src/meshes/Liquid.pxi
   trunk/pysoy/src/meshes/Sun.pxi
   trunk/pysoy/src/meshes/soy.meshes.pxd
Log:
Global update on meshes.Liquid code. Working now


Modified: trunk/pysoy/examples/liquid_example.py
===================================================================
--- trunk/pysoy/examples/liquid_example.py      2008-01-21 23:24:31 UTC (rev 
794)
+++ trunk/pysoy/examples/liquid_example.py      2008-01-23 16:47:25 UTC (rev 
795)
@@ -1,21 +1,33 @@
 #!/usr/bin/env python
 
 import soy
-from time import sleep
+import cmath
+from time import sleep, time
 
+def calculate_trig_normal(v1,v2,v3):
+    v_1 = (v2[0]-v1[0], v2[1]-v1[1], v2[2]-v1[2])
+    v_2 = (v3[0]-v1[0], v3[1]-v1[1], v3[2]-v1[2])
+    cross_a = (v_1[1] * v_2[2] - v_1[2] * v_2[1],
+               v_1[2] * v_2[0] - v_1[0] * v_2[2],
+               v_1[0] * v_2[1] - v_1[1] * v_2[0])
+    lgt = abs( cmath.sqrt( cross_a[0]**2 + cross_a[1]**2 + cross_a[2]**2))
+    return (cross_a[0] / lgt, cross_a[1]  / lgt, cross_a[2] / lgt)
+    
+
+
 def create_bottom_mesh():
     V = soy.atoms.Vertex
     F = soy.atoms.Face
     #SIMPLE BOX:
     bottom_vertices = [
-            (-1.5,-0.25, 1.5),
-            ( 1.5,-0.25, 1.5),
-            (-1.5, 0.25, 1.5),
-            ( 1.5, 0.25, 1.5),
-            (-1.5,-0.25,-1.5),
-            ( 1.5,-0.25,-1.5),
-            (-1.5, 0.25,-1.5),
-            ( 1.5, 0.25,-1.5),
+            (-5,-1.5, 5),
+            ( 5,-1.5, 5),
+            (-5, 1.5, 5),
+            ( 5, 1.5, 5),
+            (-5,-1.5,-5),
+            ( 5,-1.5,-5),
+            (-5, 1.5,-5),
+            ( 5, 1.5,-5),
             ]
     bottom_normals = [
             ( 0, 0, 1), #FRONT
@@ -73,6 +85,44 @@
 
     return bottom
 
+def create_simple_test_mesh(mat=soy.materials.StainlessSteel()):
+    V = soy.atoms.Vertex
+    F = soy.atoms.Face
+
+    mesh_vertices = [
+            (0,0,0),
+            (0,10,0),
+            (1,0,0),
+            (0,0,-1)
+            ]
+
+    mesh_indices = [
+            (0,1,2),
+            (0,2,3),
+            (3,1,0),
+            (1,3,2)
+            ]
+
+    mesh = soy.meshes.Mesh(material=mat)
+
+    V1 = lambda x,y : V(mesh, position=x, normal=y)
+    F1 = lambda x : F(mesh, verts=x, material=mat)
+
+    #verts = 
+    for f in mesh_indices:
+        v1 = mesh_vertices[ f[0] ]
+        v2 = mesh_vertices[ f[1] ]
+        v3 = mesh_vertices[ f[2] ]
+        n = calculate_trig_normal(v1,v2,v3)
+
+        vv1 = V1(v1,n)
+        vv2 = V1(v2,n)
+        vv3 = V1(v3,n)
+
+        face = F1([vv1,vv3,vv2])
+
+    return mesh
+
 class T: #empty class to hold camera data by-reference
     def __init__(self):
         self.move_forward = False
@@ -94,7 +144,7 @@
     sce = soy.Scene()
 
     cam = soy.bodies.Camera(sce)
-    cam.position = (0.0, 0.0, 10.0)
+    cam.position = (0.0, 3.0, 10.0)
 
     camera_data = T()
 
@@ -108,10 +158,6 @@
 
     water = soy.transports.File('media/water.soy')['gimp']
 
-    bottom = create_bottom_mesh()
-    bottom_b = soy.bodies.Body(sce, mesh=bottom)
-    bottom_b.position = (0,-1,0)
-
     water_mat = soy.materials.Material(water)
     water_mat.ambient = soy.colors.Blue()
     water_mat.diffuse = soy.colors.Blue()
@@ -121,8 +167,17 @@
     liquid_b = soy.bodies.Body(sce, mesh=liquid)
     liquid_b.position = (0, -1, 0)
 
-    liquid.size = (3, 0.5, 3)
+    liquid.size = (10, 3, 10)
 
+    bottom = create_bottom_mesh()
+    bottom_b = soy.bodies.Body(sce, mesh=bottom)
+    bottom_b.position = (0,-1,0)
+
+    test_mesh = create_simple_test_mesh()
+    test_mesh_b = soy.bodies.Body(sce, mesh=test_mesh)
+    test_mesh_b.position = (0, -6, 0)
+
+
     scr = soy.Screen()
     win = soy.Window(scr, 'Liquid example', background=soy.colors.Black(),
             size=(1024,768))
@@ -163,6 +218,7 @@
 
     while True:
         sleep(.03)
+        test_mesh_b.position = (0, 10*abs(cmath.sin( time()))- 6, 0)
         if camera_data.move_forward:
             cam.position = (
                     cam.position[0] - camera_data.forward_vel * 
cam.direction[0],

Modified: trunk/pysoy/include/gl.pxd
===================================================================
--- trunk/pysoy/include/gl.pxd  2008-01-21 23:24:31 UTC (rev 794)
+++ trunk/pysoy/include/gl.pxd  2008-01-23 16:47:25 UTC (rev 795)
@@ -291,8 +291,15 @@
     GL_EXP
     GL_EXP2
 
+    #GL_EXT_fog_coord
     GL_FOG_COORDINATE_SOURCE_EXT
     GL_FOG_COORDINATE_EXT
+    GL_FOG_COORDINATE_ARRAY_EXT
+    GL_FOG_COORDINATE_ARRAY_TYPE_EXT
+    GL_FOG_COORDINATE_ARRAY_STRIDE_EXT
+    GL_FOG_COORDINATE_ARRAY_POINTER_EXT
+    GL_FRAGMENT_DEPTH_EXT
+    GL_CURRENT_FOG_COORDINATE_EXT
 
     # Logic Ops
     GL_LOGIC_OP
@@ -961,6 +968,7 @@
   cdef void       glIndexMask          ( GLuint )
   cdef void       glColorMask          ( GLboolean, GLboolean, GLboolean, 
                                          GLboolean )
+  cdef void       glDepthMask          ( GLboolean )
   cdef void       glAlphaFunc          ( GLenum, GLclampf )
   cdef void       glBlendFunc          ( GLenum, GLenum )
   cdef void       glLogicOp            ( GLenum )
@@ -1001,9 +1009,14 @@
   cdef void       glHint               ( GLenum, GLenum )
 
   # Depth Buffer
+  cdef void glDepthFunc          ( GLenum )
   cdef void glClearDepth         ( GLclampd )
-  cdef void glDepthFunc          ( GLenum )
 
+  #Stencil buffer
+  cdef void glClearStencil         ( GLint )
+  cdef void glStencilOp            ( GLenum, GLenum, GLenum )
+  cdef void glStencilFunc          ( GLenum, GLint, GLuint )
+
   # Transformations
   cdef void glMatrixMode( GLenum )
   cdef void glOrtho( GLdouble left, GLdouble right, \
@@ -1038,6 +1051,7 @@
   cdef void       glNormalPointer           (        GLenum, GLsizei, GLvoid* )
   cdef void       glColorPointer            ( GLint, GLenum, GLsizei, GLvoid* 
) 
   cdef void       glTexCoordPointer         ( GLint, GLenum, GLsizei, GLvoid* )
+  cdef void       glFogCoordPointerEXT      ( GLenum, GLsizei, GLvoid* )
   cdef void       glDrawArrays              ( GLenum, GLint, GLsizei )
   cdef void       glDrawElements            ( GLenum, GLsizei, GLenum, GLvoid* 
)
 

Modified: trunk/pysoy/include/stdlib.pxd
===================================================================
--- trunk/pysoy/include/stdlib.pxd      2008-01-21 23:24:31 UTC (rev 794)
+++ trunk/pysoy/include/stdlib.pxd      2008-01-23 16:47:25 UTC (rev 795)
@@ -1,4 +1,9 @@
 
 cdef extern from "math.h" :
-    float sinf(float)
-    float cosf(float)
+    cdef float sinf(float)
+    cdef float cosf(float)
+
+cdef extern from "stdlib.h" :
+    ctypedef unsigned int size_t
+    cdef void* malloc (size_t)
+    cdef void  free   (void* )

Modified: trunk/pysoy/src/_core-x11/Screen.pxi
===================================================================
--- trunk/pysoy/src/_core-x11/Screen.pxi        2008-01-21 23:24:31 UTC (rev 
794)
+++ trunk/pysoy/src/_core-x11/Screen.pxi        2008-01-23 16:47:25 UTC (rev 
795)
@@ -69,8 +69,10 @@
     _glxAttrs[6]  = glx.GLX_BLUE_SIZE
     _glxAttrs[7]  = 4
     _glxAttrs[8]  = glx.GLX_DEPTH_SIZE
-    _glxAttrs[9]  = 16
-    _glxAttrs[10] = 0
+    _glxAttrs[9]  = 24
+    _glxAttrs[10] = glx.GLX_STENCIL_SIZE
+    _glxAttrs[11] = 8
+    _glxAttrs[12] = 0
     self._xVisualInfo = glx.glXChooseVisual(_display, sId, _glxAttrs)
     if self._xVisualInfo == NULL :
       _screens.unlock()

Modified: trunk/pysoy/src/_datatypes/VertexList.pxi
===================================================================
--- trunk/pysoy/src/_datatypes/VertexList.pxi   2008-01-21 23:24:31 UTC (rev 
794)
+++ trunk/pysoy/src/_datatypes/VertexList.pxi   2008-01-23 16:47:25 UTC (rev 
795)
@@ -21,6 +21,8 @@
 # rather as part of it's parent Mesh.  Parent must be in __cinit__ as
 # it's parent holds the data this class works on.
 
+cimport stdlib
+
 cdef class VertexList (Datatype) :
   '''PySoy VertexList
 
@@ -31,6 +33,7 @@
       raise TypeError('argument must be of type soy.bodies.Mesh')
     self._mesh = <void *> mesh
     self._children = soy._internals.Children()
+    self._bufferAlloc = 0
 
 
   def __len__(self) :
@@ -93,6 +96,7 @@
     gl.glVertexPointer  (3,  gl.GL_FLOAT, 36, &self._array[0].px)
     gl.glNormalPointer  (    gl.GL_FLOAT, 36, &self._array[0].nx)
     gl.glTexCoordPointer(3,  gl.GL_FLOAT, 36, &self._array[0].tx)
+    gl.glFogCoordPointerEXT( gl.GL_FLOAT,  0, self._fogArray)
 
 
   cdef void _renderBuffer(self) :
@@ -101,6 +105,7 @@
     gl.glTexCoordPointer(3,  gl.GL_FLOAT, 36, <float*> 24)
     gl.glNormalPointer  (    gl.GL_FLOAT, 36, <float*> 12)
     gl.glVertexPointer  (3,  gl.GL_FLOAT, 36, <float*>  0)
+    gl.glFogCoordPointerEXT( gl.GL_FLOAT,  0, <float*> (36 * 
self._bufferAlloc))
 
 
   cdef void _createBuffer(self) :
@@ -108,7 +113,7 @@
     self._updateRange.offset = -1
     gl.glGenBuffersARB(1, &self._buffer)
     gl.glBindBufferARB(gl.GL_ARRAY_BUFFER_ARB, self._buffer)
-    gl.glBufferDataARB(gl.GL_ARRAY_BUFFER_ARB, 36*self._bufferAlloc,
+    gl.glBufferDataARB(gl.GL_ARRAY_BUFFER_ARB, (36+4)*self._bufferAlloc, 
#+FOGCOORDS
                        self._array, gl.GL_STATIC_DRAW_ARB)
 
 
@@ -128,7 +133,7 @@
     # If the range to be updated is larger than the existing buffer
     if self._updateRange.offset+self._updateRange.length > self._bufferAlloc :
       self._bufferAlloc = self._arrayAlloc
-      gl.glBufferDataARB(gl.GL_ARRAY_BUFFER_ARB, 36*self._bufferAlloc,
+      gl.glBufferDataARB(gl.GL_ARRAY_BUFFER_ARB, (36+4)*self._bufferAlloc, 
#+FOGCOORDS
                          self._array, gl.GL_STATIC_DRAW_ARB)
     else :
       gl.glBufferSubDataARB(gl.GL_ARRAY_BUFFER_ARB,
@@ -145,3 +150,23 @@
     _mesh = <soy.meshes.Mesh> self._mesh
     self._array = <Vert *> self._alloc(num, &self._arrayAlloc, 
                                        self._array, sizeof(Vert))
+    self._fogArray = <float*> self._alloc(num, &self._fogSize,
+            self._fogArray, sizeof(float))
+
+  cdef void _uploadFogCoord(self, float y_coord):
+      cdef int i
+      #cdef float* fog_coord_array
+      #fog_coord_array = ( <float*> stdlib.malloc(4 * self._bufferAlloc) )
+
+      for i from 0 <= i < self._fogSize:
+          self._fogArray[i] = y_coord + self._array[i].py
+      
+      if self._bufferAlloc:
+          gl.glBindBufferARB  (gl.GL_ARRAY_BUFFER_ARB, self._buffer)
+          gl.glBufferSubDataARB(gl.GL_ARRAY_BUFFER_ARB, 36 * self._bufferAlloc,
+                  4*self._bufferAlloc, self._fogArray )
+
+      #stdlib.free( fog_coord_array)
+
+
+

Modified: trunk/pysoy/src/_datatypes/soy._datatypes.pxd
===================================================================
--- trunk/pysoy/src/_datatypes/soy._datatypes.pxd       2008-01-21 23:24:31 UTC 
(rev 794)
+++ trunk/pysoy/src/_datatypes/soy._datatypes.pxd       2008-01-23 16:47:25 UTC 
(rev 795)
@@ -102,6 +102,8 @@
   cdef void                      *_mesh
   cdef soy._internals.Children    _children
   cdef Vert                      *_array
+  cdef float                     *_fogArray
+  cdef int                        _fogSize
   cdef unsigned short             _arraySize
   cdef int                        _arrayAlloc
   cdef gl.GLuint                  _buffer
@@ -113,3 +115,4 @@
   cdef void                       _createBuffer (self)
   cdef void                       _sendUpdated  (self)
   cdef void                       _flagUpdated  (self, int)
+  cdef void                       _uploadFogCoord(self, float)

Modified: trunk/pysoy/src/bodies._bodies/Body.pxi
===================================================================
--- trunk/pysoy/src/bodies._bodies/Body.pxi     2008-01-21 23:24:31 UTC (rev 
794)
+++ trunk/pysoy/src/bodies._bodies/Body.pxi     2008-01-23 16:47:25 UTC (rev 
795)
@@ -17,6 +17,9 @@
 #
 # $Id$
 
+cimport soy._datatypes
+cimport soy.meshes
+
 cdef class Body :
   '''PySoy Body
 
@@ -283,7 +286,6 @@
     ode.dBodyDestroy(self._bodyID)
     self._bodyID = NULL
 
-
   cdef int _isActive(self) :
     if self._bodyID == NULL :
       return 0
@@ -319,3 +321,15 @@
     gl.glMultMatrixf(mtx)
     (<soy.meshes.Mesh> self._mesh)._render(<void *> self)
     gl.glPopMatrix()
+
+  cdef void _createVerticalFogCoords(self):
+    cdef ode.dReal  *pos
+    cdef soy._datatypes.VertexList _verts
+
+    pos = <ode.dReal *> ode.dBodyGetPosition(self._bodyID)
+
+    if self._mesh:
+        _verts = (<soy.meshes.Mesh> self._mesh)._verts
+        _verts._uploadFogCoord( <float>pos[1] )
+      
+

Modified: trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd
===================================================================
--- trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd       2008-01-21 
23:24:31 UTC (rev 794)
+++ trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd       2008-01-23 
16:47:25 UTC (rev 795)
@@ -43,6 +43,7 @@
   cdef void                     _destroy(self)
   cdef int                      _isActive(self)
   cdef void                     _render(self)
+  cdef void                     _createVerticalFogCoords(self)
   cdef void                    poke(self, vector)
 
 

Modified: trunk/pysoy/src/meshes/Liquid.pxi
===================================================================
--- trunk/pysoy/src/meshes/Liquid.pxi   2008-01-21 23:24:31 UTC (rev 794)
+++ trunk/pysoy/src/meshes/Liquid.pxi   2008-01-23 16:47:25 UTC (rev 795)
@@ -1,23 +1,25 @@
 import soy.colors
 
+cimport soy.bodies._bodies
+cimport soy._core
+cimport soy._internals
+
 cdef class Liquid(Mesh):
-    def __cinit__(self, liquid_size=(1,1,1), 
liquid_mat=soy.materials.StainlessSteel()   ):
+    def __cinit__(self, liquid_size=(1,1,1), fog_color=soy.colors.Blue(), 
liquid_mat=soy.materials.StainlessSteel()   ):
         self._liquid_mat = liquid_mat
 
         self._liquid_size[0] = liquid_size[0]
         self._liquid_size[1] = liquid_size[1]
         self._liquid_size[2] = liquid_size[2]
 
-    cdef void _render(self, void* body):
+        self._fog_color = fog_color
+
+    cdef void _render_surf(self):
         cdef float half_size[3]
-
-
         half_size[0] = self._liquid_size[0]/2.0
         half_size[1] = self._liquid_size[1]/2.0
         half_size[2] = self._liquid_size[2]/2.0
 
-        self._liquid_mat._bind()
-
         gl.glBegin(gl.GL_TRIANGLES)
 
         gl.glNormal3f(0, 1, 0) #LIQUID FACE
@@ -38,8 +40,97 @@
 
         gl.glEnd()
 
+    cdef void _render_bottom(self):
+        cdef float half_size[3]
+        cdef gl.GLfloat _diffuse[4]
+
+        half_size[0] = self._liquid_size[0]/2.0
+        half_size[1] = self._liquid_size[1]/2.0
+        half_size[2] = self._liquid_size[2]/2.0
+        
+        (<soy.colors.Color> self._fog_color)._getRGBA(_diffuse)
+
+        gl.glDisable(gl.GL_LIGHTING)
+        gl.glColor3f(_diffuse[0], _diffuse[1], _diffuse[2])
+
+        gl.glBegin(gl.GL_TRIANGLES)
+
+        gl.glNormal3f(0, 1, 0) #LIQUID FACE
+
+        gl.glVertex3f(-1000, -half_size[1], 1000 )
+        gl.glVertex3f( 1000, -half_size[1], 1000 )
+        gl.glVertex3f( 1000, -half_size[1],-1000 )
+
+        gl.glVertex3f( 1000, -half_size[1],-1000 )
+        gl.glVertex3f(-1000, -half_size[1],-1000 )
+        gl.glVertex3f(-1000, -half_size[1], 1000 )
+
+        gl.glEnd()
+        gl.glEnable(gl.GL_LIGHTING)
+
+
+    cdef void _render(self, void* body):
+        cdef soy._core.Scene    _scene
+        cdef int                i
+        cdef ode.dReal          *pos
+        cdef gl.GLfloat _diffuse[4]
+        cdef float half_size[3]
+
+        pos = <ode.dReal *> ode.dBodyGetPosition((<soy.bodies._bodies.Body> 
body)._bodyID)
+        (<soy.colors.Color> self._fog_color)._getRGBA(_diffuse)
+        half_size[0] = self._liquid_size[0]/2.0
+        half_size[1] = self._liquid_size[1]/2.0
+        half_size[2] = self._liquid_size[2]/2.0
+
+        gl.glClearStencil(0)
+        gl.glEnable(gl.GL_STENCIL_TEST)
+        gl.glClear(gl.GL_STENCIL_BUFFER_BIT)
+
+        gl.glStencilFunc(gl.GL_NEVER, 0, 0)
+        gl.glStencilOp(gl.GL_INCR, gl.GL_INCR, gl.GL_INCR)
+
+        self._render_surf()
+
+        gl.glStencilFunc(gl.GL_EQUAL, 1, 1)
+        gl.glStencilOp(gl.GL_KEEP, gl.GL_KEEP, gl.GL_KEEP)
+
+
+        gl.glDisable(gl.GL_DEPTH_TEST)
+        self._render_bottom()
+        gl.glEnable(gl.GL_DEPTH_TEST)
+
+        #RENDER BODIES
+
+        _scene = ( <soy.bodies._bodies.Body> body)._scene
+
+        gl.glEnable(gl.GL_FOG)
+        gl.glEnableClientState(gl.GL_FOG_COORDINATE_ARRAY_EXT)
+        gl.glFogi(gl.GL_FOG_MODE, gl.GL_LINEAR)
+        gl.glFogfv(gl.GL_FOG_COLOR, _diffuse)
+        gl.glFogf(gl.GL_FOG_START, pos[1] + half_size[1])
+        gl.glFogf(gl.GL_FOG_END, pos[1] - half_size[1])
+        gl.glHint(gl.GL_FOG_HINT, gl.GL_NICEST)
+        gl.glFogi(gl.GL_FOG_COORDINATE_SOURCE_EXT, gl.GL_FOG_COORDINATE_EXT)
+
+        gl.glPushMatrix()
+        gl.glTranslatef(-pos[0],-pos[1], -pos[2])
+        for i from 0 <= i < _scene._bodies.current:
+            if body != (<void*> _scene._bodies.list[i]):
+                (<soy.bodies._bodies.Body> 
_scene._bodies.list[i])._createVerticalFogCoords()
+                (<soy.bodies._bodies.Body> _scene._bodies.list[i])._render()
+        gl.glPopMatrix()
+
+        gl.glDisableClientState(gl.GL_FOG_COORDINATE_ARRAY_EXT)
+        gl.glDisable(gl.GL_FOG)
+
+        #RENDER SURFACE
+
+        self._liquid_mat._bind()
+        self._render_surf()
         self._liquid_mat._unbind()
 
+        gl.glDisable(gl.GL_STENCIL_TEST)
+
     property size:
         def __get__(self):
             return (self._liquid_size[0], self._liquid_size[1], 
self._liquid_size[2])

Modified: trunk/pysoy/src/meshes/Sun.pxi
===================================================================
--- trunk/pysoy/src/meshes/Sun.pxi      2008-01-21 23:24:31 UTC (rev 794)
+++ trunk/pysoy/src/meshes/Sun.pxi      2008-01-23 16:47:25 UTC (rev 795)
@@ -117,7 +117,7 @@
             self._aura_mat._unbind()
 
         if self._center_mat:
-            gl.glPolygonOffset( 0.0, -2)
+            gl.glPolygonOffset( 0.0, -4)
             self._center_mat._bind()
             angle = 360.0 / self._circle_verts
 

Modified: trunk/pysoy/src/meshes/soy.meshes.pxd
===================================================================
--- trunk/pysoy/src/meshes/soy.meshes.pxd       2008-01-21 23:24:31 UTC (rev 
794)
+++ trunk/pysoy/src/meshes/soy.meshes.pxd       2008-01-23 16:47:25 UTC (rev 
795)
@@ -68,6 +68,9 @@
 cdef class Liquid(Mesh):
     cdef soy.materials.Material     _liquid_mat
     cdef float                      _liquid_size[3]
+    cdef soy.colors.Color           _fog_color
 
     cdef void                       _render(self, void*)
+    cdef void                       _render_surf(self)
+    cdef void                       _render_bottom(self)
 

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

Reply via email to