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