Author: JaroslawTworek
Date: 2008-01-20 00:19:09 +0000 (Sun, 20 Jan 2008)
New Revision: 789

Modified:
   trunk/pysoy/examples/liquid_example.py
   trunk/pysoy/src/materials/Material.pxi
   trunk/pysoy/src/materials/soy.materials.pxd
   trunk/pysoy/src/meshes/Liquid.pxi
   trunk/pysoy/src/meshes/soy.meshes.pxd
   trunk/pysoy/src/textures/Texture.pxi
Log:
Made materials handle transparency (broken liquid for now)


Modified: trunk/pysoy/examples/liquid_example.py
===================================================================
--- trunk/pysoy/examples/liquid_example.py      2008-01-19 23:03:43 UTC (rev 
788)
+++ trunk/pysoy/examples/liquid_example.py      2008-01-20 00:19:09 UTC (rev 
789)
@@ -3,6 +3,76 @@
 import soy
 from time import sleep
 
+def create_bottom_mesh():
+    V = soy.atoms.Vertex
+    F = soy.atoms.Face
+    #SIMPLE BOX:
+    bottom_vertices = [
+            (-0.5,-0.25, 0.5),
+            ( 0.5,-0.25, 0.5),
+            (-0.5, 0.25, 0.5),
+            ( 0.5, 0.25, 0.5),
+            (-0.5,-0.25,-0.5),
+            ( 0.5,-0.25,-0.5),
+            (-0.5, 0.25,-0.5),
+            ( 0.5, 0.25,-0.5),
+            ]
+    bottom_normals = [
+            ( 0, 0, 1), #FRONT
+            ( 0, 1, 0), #BOTTOM
+            ( 1, 0, 0), #RIGHT
+            (-1, 0, 0), #LEFT
+            ( 0, 0,-1), #BACK
+            ]
+
+    bottom_indices = [
+            ( 2, 1, 0), #FRONT
+            ( 3, 1, 2),
+            ( 0, 1, 4), #BOTTOM
+            ( 4, 1, 5),
+            ( 1, 3, 7), #RIGHT
+            ( 1, 7, 5),
+            ( 0, 6, 2), #LEFT
+            ( 0, 4, 6),
+            ( 4, 7, 6), #BACK
+            ( 4, 5, 7)
+            ]
+
+    bottom_faces = [
+            #TRIG1, TRIG2, NORMAL
+            ( 0, 1, 0), #FRONT
+            ( 2, 3, 1), #BOTTOM
+            ( 4, 5, 2), #RIGHT
+            ( 6, 7, 3), #LEFT
+            ( 8, 9, 4), #BACK
+            ]
+
+    #lava = soy.transports.File('media/lava.soy')['gimp']
+    #lavam = soy.materials.Material(lava)
+    bottom = soy.meshes.Mesh(material=soy.materials.StainlessSteel())
+
+    V1 = lambda x : V(bottom, position=x[0])
+    F1 = lambda x : F(bottom, verts=x, material=soy.materials.StainlessSteel())
+
+    #verts = map(V1, bottom_vertices)
+    #face_vert = [ map( lambda x: verts[x], x) for x in bottom_indices]
+    #faces = map(F1, face_vert)
+
+    for f in bottom_faces:
+        normal = bottom_normals[ f[2] ]
+
+        V2 = lambda x : V(bottom, position=x, normal=normal)
+        tri1   = [ bottom_vertices[x] for x in bottom_indices[f[0]] ]
+        tri2   = [ bottom_vertices[x] for x in bottom_indices[f[1]] ]
+
+        tri1_v = map(V2, tri1)
+        tri2_v = map(V2, tri2)
+
+        F1(tri1_v)
+        F1(tri2_v)
+
+    return bottom
+
 class T: #empty class to hold camera data by-reference
     def __init__(self):
         self.move_forward = False
@@ -38,7 +108,12 @@
 
     water = soy.transports.File('media/water.soy')['gimp']
 
-    liquid = soy.meshes.Liquid(liquid_col=soy.colors.Blue(), 
liquid_opacity=1.0, two_sided=True, liquid_tex = water)
+    bottom = create_bottom_mesh()
+    bottom_b = soy.bodies.Body(sce, mesh=bottom)
+    bottom_b.position = (0,-1,0)
+
+    water_mat = soy.materials.Material(water)
+    liquid = soy.meshes.Liquid(liquid_mat=water_mat)
     liquid_b = soy.bodies.Body(sce, mesh=liquid)
     liquid_b.position = (0, -1, 0)
 

Modified: trunk/pysoy/src/materials/Material.pxi
===================================================================
--- trunk/pysoy/src/materials/Material.pxi      2008-01-19 23:03:43 UTC (rev 
788)
+++ trunk/pysoy/src/materials/Material.pxi      2008-01-20 00:19:09 UTC (rev 
789)
@@ -17,55 +17,92 @@
 #
 # $Id$
 
+#include gl
+
 cdef class Material :
   '''PySoy Material
 
      shared material for many visible objects
   '''
   def __cinit__(self, color=None, ambient=None, diffuse=None, specular=None) :
+
     if color :
       self.color = color
     else :
       self._color = None
+
     if ambient :
       self._ambient = ambient
     else :
       self._ambient = soy.colors.Gray()
+
     if diffuse :
       self._diffuse = diffuse
     else :
       self._diffuse = soy.colors.White()
+
     if specular :
       self._specular = specular
     else :
       self._specular = soy.colors.White()
+
     self._shininess = .5
 
+    self._blend_func_src = gl.GL_SRC_ALPHA
+    self._blend_func_dst = gl.GL_ONE_MINUS_SRC_ALPHA
 
+
   def __repr__(self) :
     return '<Material>'
 
+  cdef int _is_transparent(self):
+      cdef gl.GLfloat _ambient[4]
+      cdef gl.GLfloat _diffuse[4]
+      cdef gl.GLfloat _specular[4]
 
+      (<soy.colors.Color> self._ambient)._getRGBA(_ambient)
+      (<soy.colors.Color> self._diffuse)._getRGBA(_diffuse)
+      (<soy.colors.Color> self._specular)._getRGBA(_specular)
+
+      if self._color:
+          if ( <soy.textures.Texture> self._color)._chans %2 == 0:
+              return 1
+          else:
+              return 0
+      else:
+          if _ambient[3] != 1.0:
+              return 1
+          if _diffuse[3] != 1.0:
+              return 1
+          if _specular[3] != 1.0:
+              return 1
+          return 0
+
   cdef void _bind(self) :
     cdef gl.GLfloat _white[4]
     cdef gl.GLfloat _ambient[4]
     cdef gl.GLfloat _diffuse[4]
     cdef gl.GLfloat _specular[4]
+
     _white[0] = 1.0
     _white[1] = 1.0
     _white[2] = 1.0
     _white[3] = 1.0
+
     if self._shades == 0 :
       gl.glShadeModel(gl.GL_SMOOTH)
     else :
       gl.glShadeModel(gl.GL_FLAT)
+
     (<soy.colors.Color> self._ambient)._getRGBA(_ambient)
     (<soy.colors.Color> self._diffuse)._getRGBA(_diffuse)
     (<soy.colors.Color> self._specular)._getRGBA(_specular)
+
     gl.glMaterialfv(gl.GL_FRONT, gl.GL_AMBIENT, _ambient)
     gl.glMaterialfv(gl.GL_FRONT, gl.GL_DIFFUSE, _diffuse)
     gl.glMaterialf (gl.GL_FRONT, gl.GL_SHININESS, self._shininess)    
     gl.glMaterialfv(gl.GL_FRONT, gl.GL_SPECULAR, _specular)
+
     if self._color :
       # for some reason _white works here while _getRGBA does not,
       # even though it works for non-textured
@@ -76,9 +113,16 @@
       gl.glDisable(gl.GL_TEXTURE_2D)
       gl.glDisable(gl.GL_TEXTURE_3D)
 
+
+    if self._is_transparent():
+        gl.glEnable(gl.GL_BLEND)
+        gl.glBlendFunc(self._blend_func_src, self._blend_func_dst)
+
   cdef void _unbind(self) :
     if self._color :
       (<soy.textures.Texture> self._color)._unbind()
+    if self._is_transparent():
+        gl.glDisable(gl.GL_BLEND)
 
 
   property color :
@@ -152,4 +196,20 @@
     def __del__(self) :
       self._specular=soy.colors.White()
 
+  property blend_func_src:
+      def __get__(self):
+          return self._blend_func_src
+      def __set__(self,val):
+          self._blend_func_src = val
 
+  property blend_func_dst:
+      def __get__(self):
+          return self._blend_func_dst
+      def __set__(self,val):
+          self._blend_func_dst = val
+  
+  property transparent:
+      def __get__(self):
+          return self._is_transparent()
+
+

Modified: trunk/pysoy/src/materials/soy.materials.pxd
===================================================================
--- trunk/pysoy/src/materials/soy.materials.pxd 2008-01-19 23:03:43 UTC (rev 
788)
+++ trunk/pysoy/src/materials/soy.materials.pxd 2008-01-20 00:19:09 UTC (rev 
789)
@@ -24,11 +24,18 @@
 
 cdef class Material :
   cdef object           _color
+
   cdef soy.colors.Color _ambient
   cdef soy.colors.Color _diffuse
+  cdef soy.colors.Color _specular
+
   cdef int              _shades
   cdef float            _shininess
-  cdef soy.colors.Color _specular
+
+  cdef int              _blend_func_src
+  cdef int              _blend_func_dst
+
   # C Functions
   cdef void   _bind(self)
   cdef void   _unbind(self)
+  cdef int    _is_transparent(self)

Modified: trunk/pysoy/src/meshes/Liquid.pxi
===================================================================
--- trunk/pysoy/src/meshes/Liquid.pxi   2008-01-19 23:03:43 UTC (rev 788)
+++ trunk/pysoy/src/meshes/Liquid.pxi   2008-01-20 00:19:09 UTC (rev 789)
@@ -1,202 +1,26 @@
 import soy.colors
 
 cdef class Liquid(Mesh):
-    def __cinit__(self, liquid_size=(1,1,1), liquid_opacity=0.5, liquid_col = 
soy.colors.Red(), two_sided=False, **kwargs ):
-        if kwargs.has_key('background_mat'):
-            self._background_mat = kwargs['background_mat']
+    def __cinit__(self, liquid_size=(1,1,1), **kwargs ):
+        if kwargs.has_key('liquid_mat'):
+            self._liquid_mat = kwargs['liquid_mat']
         else:
-            self._background_mat = soy.materials.StainlessSteel()
+            self._liquid_mat = soy.materials.StainlessSteel()
 
-        if kwargs.has_key('liquid_tex'):
-            self._liquid_tex = kwargs['liquid_tex']
-        else:
-            self._liquid_tex = None
-
         self._liquid_size[0] = liquid_size[0]
         self._liquid_size[1] = liquid_size[1]
         self._liquid_size[2] = liquid_size[2]
 
-        self._liquid_opacity = liquid_opacity
-
-        self._liquid_color = liquid_col
-        
-        self._two_sided = two_sided
-
     cdef void _render(self, void* body):
         cdef float half_size[3]
-        cdef float ccol[4]
-        cdef float fcol[4]
 
-        #if self._two_sided:
-        #    gl.glDisable(gl.GL_CULL_FACE)
 
         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._liquid_color)._getRGBA(ccol)
-        (<soy.colors.Color> self._liquid_color)._getRGBA(fcol)
+        self._liquid_mat._bind()
 
-        gl.glFogi(gl.GL_FOG_MODE, gl.GL_LINEAR)
-        gl.glFogf(gl.GL_FOG_START, 0.0)
-        gl.glFogf(gl.GL_FOG_END, 1.0)
-        gl.glFogfv(gl.GL_FOG_COLOR, fcol)
-        gl.glFogi(gl.GL_FOG_COORDINATE_SOURCE_EXT, gl.GL_FOG_COORDINATE_EXT);
-
-        if self._background_mat:
-            self._background_mat._bind()
-            gl.glEnable(gl.GL_FOG)
-
-            gl.glBegin(gl.GL_TRIANGLES)
-
-            gl.glNormal3f(0, 1, 0) #BOTTOM FACE
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-            gl.glVertex3f( half_size[0],-half_size[1], half_size[2] )
-            gl.glVertex3f( half_size[0],-half_size[1],-half_size[2] )
-
-            gl.glVertex3f( half_size[0],-half_size[1],-half_size[2] )
-            gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-            gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-
-            gl.glNormal3f(0, 0, 1) # BACK FACE
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f( half_size[0],-half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f( half_size[0], half_size[1],-half_size[2] )
-
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f( half_size[0], half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(-half_size[0], half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-
-            gl.glNormal3f(0, 0, -1) # FRONT FACE
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f( half_size[0], half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f( half_size[0],-half_size[1], half_size[2] )
-
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f( half_size[0], half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(-half_size[0], half_size[1], half_size[2] )
-
-            gl.glNormal3f(1, 0, 0) # LEFT FACE
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(-half_size[0], half_size[1],-half_size[2] )
-
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(-half_size[0], half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(-half_size[0], half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-
-            gl.glNormal3f(-1, 0, 0) # RIGHT FACE
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(half_size[0],-half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(half_size[0], half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(half_size[0],-half_size[1],-half_size[2] )
-
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(half_size[0], half_size[1],-half_size[2] )
-            gl.glFogCoordfEXT(1.0)
-            gl.glVertex3f(half_size[0],-half_size[1], half_size[2] )
-            gl.glFogCoordfEXT(0.0)
-            gl.glVertex3f(half_size[0], half_size[1], half_size[2] )
-
-            gl.glEnd()
-
-            gl.glDisable(gl.GL_FOG)
-
-            if self.two_sided:
-                gl.glBegin(gl.GL_TRIANGLES)
-
-                gl.glNormal3f(0,-1, 0) #BOTTOM FACE
-                gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f( half_size[0],-half_size[1],-half_size[2] )
-                gl.glVertex3f( half_size[0],-half_size[1], half_size[2] )
-
-                gl.glVertex3f( half_size[0],-half_size[1],-half_size[2] )
-                gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-
-                gl.glNormal3f(0, 0,-1) # BACK FACE
-                gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-                gl.glVertex3f( half_size[0], half_size[1],-half_size[2] )
-                gl.glVertex3f( half_size[0],-half_size[1],-half_size[2] )
-
-                gl.glVertex3f( half_size[0], half_size[1],-half_size[2] )
-                gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-                gl.glVertex3f(-half_size[0], half_size[1],-half_size[2] )
-
-                gl.glNormal3f(0, 0, 1) # FRONT FACE
-                gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f( half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f( half_size[0], half_size[1], half_size[2] )
-
-                gl.glVertex3f( half_size[0], half_size[1], half_size[2] )
-                gl.glVertex3f(-half_size[0], half_size[1], half_size[2] )
-                gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-
-                gl.glNormal3f(-1, 0, 0) # LEFT FACE
-                gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f(-half_size[0], half_size[1],-half_size[2] )
-                gl.glVertex3f(-half_size[0],-half_size[1],-half_size[2] )
-
-                gl.glVertex3f(-half_size[0], half_size[1],-half_size[2] )
-                gl.glVertex3f(-half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f(-half_size[0], half_size[1], half_size[2] )
-
-                gl.glNormal3f(1, 0, 0) # RIGHT FACE
-                gl.glVertex3f(half_size[0],-half_size[1], half_size[2] )
-                gl.glVertex3f(half_size[0],-half_size[1],-half_size[2] )
-                gl.glVertex3f(half_size[0], half_size[1],-half_size[2] )
-
-                gl.glVertex3f(half_size[0], half_size[1],-half_size[2] )
-                gl.glVertex3f(half_size[0], half_size[1], half_size[2] )
-                gl.glVertex3f(half_size[0],-half_size[1], half_size[2] )
-
-                gl.glEnd()
-
-
-            self._background_mat._unbind()
-
-        #self._liquid_mat.ambient.alpha = self._liquid_opacity
-        #self._liquid_mat.diffuse.alpha = self._liquid_opacity
-        #self._liquid_mat.specular.alpha = self._liquid_opacity
-
-        #self._liquid_mat._bind()
-
-        #gl.glDisable(gl.GL_LIGHTING)
-
-
-        gl.glEnable(gl.GL_COLOR_MATERIAL)
-        gl.glColorMaterial(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE)
-
-        if self._liquid_tex:
-            (<soy.textures.Texture>self._liquid_tex)._bind()
-            gl.glColor4f(1.0, 1.0, 1.0, self._liquid_opacity)
-        else:
-            gl.glColor4f(ccol[0], ccol[1], ccol[2], self._liquid_opacity)
-
-        gl.glEnable(gl.GL_BLEND)
-        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
-
         gl.glBegin(gl.GL_TRIANGLES)
 
         gl.glNormal3f(0, 1, 0) #LIQUID FACE
@@ -217,18 +41,8 @@
 
         gl.glEnd()
 
-        #gl.glEnable(gl.GL_LIGHTING)
-        gl.glDisable(gl.GL_BLEND)
-        gl.glDisable(gl.GL_COLOR_MATERIAL)
+        self._liquid_mat._unbind()
 
-        if self._liquid_tex:
-            (<soy.textures.Texture>self._liquid_tex)._unbind()
-
-        #self._liquid_mat._unbind()
-
-        #if self._two_sided:
-        #    gl.glEnable(gl.GL_CULL_FACE)
-
     property size:
         def __get__(self):
             return (self._liquid_size[0], self._liquid_size[1], 
self._liquid_size[2])

Modified: trunk/pysoy/src/meshes/soy.meshes.pxd
===================================================================
--- trunk/pysoy/src/meshes/soy.meshes.pxd       2008-01-19 23:03:43 UTC (rev 
788)
+++ trunk/pysoy/src/meshes/soy.meshes.pxd       2008-01-20 00:19:09 UTC (rev 
789)
@@ -66,13 +66,8 @@
     cdef void                       _render(self, void*)
 
 cdef class Liquid(Mesh):
-    cdef soy.materials.Material     _background_mat
-    cdef object                     _liquid_tex
-    cdef soy.colors.Color           _liquid_color
-
+    cdef soy.materials.Material     _liquid_mat
     cdef float                      _liquid_size[3]
-    cdef float                      _liquid_opacity
-    cdef int                        _two_sided
 
     cdef void                       _render(self, void*)
 

Modified: trunk/pysoy/src/textures/Texture.pxi
===================================================================
--- trunk/pysoy/src/textures/Texture.pxi        2008-01-19 23:03:43 UTC (rev 
788)
+++ trunk/pysoy/src/textures/Texture.pxi        2008-01-20 00:19:09 UTC (rev 
789)
@@ -77,6 +77,9 @@
     def __del__(self) :
       self._aspect = 0.0
 
+  property channels:
+      def __get__(self):
+          return self._chans
 
   property size :
     '''Texture's size
@@ -106,11 +109,11 @@
       gl.glEnable(gl.GL_TEXTURE_3D)
     else :
       return
-    if self._chans & 1 :
-      gl.glDisable(gl.GL_BLEND)
-    else :
-      gl.glEnable(gl.GL_BLEND)
-      gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
+    #if self._chans & 1 :
+    #  gl.glDisable(gl.GL_BLEND)
+    #else :
+    #  gl.glEnable(gl.GL_BLEND)
+    #  gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
     if self._textureID == 0 :
       gl.glGenTextures(1, &self._textureID)
       gl.glBindTexture(self._textureTarget, self._textureID)

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

Reply via email to