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