Author: JaroslawTworek
Date: 2008-01-18 23:13:38 +0000 (Fri, 18 Jan 2008)
New Revision: 784

Added:
   trunk/pysoy/examples/sun_example.py
   trunk/pysoy/include/stdlib.pxd
   trunk/pysoy/src/meshes/Sun.pxi
Modified:
   trunk/pysoy/examples/steel_billboard.py
   trunk/pysoy/include/gl.pxd
   trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd
   trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx
   trunk/pysoy/src/meshes/soy.meshes.pxd
   trunk/pysoy/src/meshes/soy.meshes.pyx
Log:
Implemented soy.meshes.Sun mesh type


Modified: trunk/pysoy/examples/steel_billboard.py
===================================================================
--- trunk/pysoy/examples/steel_billboard.py     2008-01-17 07:20:07 UTC (rev 
783)
+++ trunk/pysoy/examples/steel_billboard.py     2008-01-18 23:13:38 UTC (rev 
784)
@@ -73,3 +73,4 @@
 
 if __name__=='__main__':
     main()
+

Added: trunk/pysoy/examples/sun_example.py
===================================================================
--- trunk/pysoy/examples/sun_example.py                         (rev 0)
+++ trunk/pysoy/examples/sun_example.py 2008-01-18 23:13:38 UTC (rev 784)
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+import soy
+from time import sleep
+
+def main():
+    sce = soy.Scene()
+
+    cam = soy.bodies.Camera(sce)
+    cam.position = (0.0, 0.0, 10.0)
+
+    def camera_impl_move( vec):
+        def move_camera():
+            cam.position = (cam.position[0] + vec[0], cam.position[1] + 
vec[1], cam.position[2] + vec[2])
+        return move_camera
+
+    def camera_set_rot( vec):
+        def rot_camera():
+            cam.rotation = vec
+        return rot_camera
+
+
+
+    lig = soy.bodies.lights.Light(sce)
+    lig.position = (-10.0,10.0,2.0)
+
+    lava = soy.transports.File('media/lava.soy')['gimp']
+    lavam = soy.materials.Material(lava)
+    sun = soy.meshes.Sun(spike_mat=soy.materials.StainlessSteel(),
+            aura_mat=soy.materials.Copper(), circle_verts=32,
+            center_mat = soy.materials.VelvetyRed())
+    sun_b = soy.bodies.Body(sce, mesh= sun )
+
+    sun.aura_size = (sun.aura_size[0]/2, sun.aura_size[1]/2)
+    sun.center_size = (sun.center_size[0]/2, sun.center_size[0]/2)
+
+    sun.num_spikes = 15
+
+
+    #axis_b.rotation = (1.0,0.5,0.2)
+
+    def multiply_size( mul):
+        def m():
+            st = bil.size
+            bil.size = ( st[0]*mul[0], st[1]*mul[1])
+        return m
+
+    scr = soy.Screen()
+    win = soy.Window(scr, 'Sun example', background=soy.colors.Black(),
+            size=(1024,768))
+
+    pro = soy.widgets.Projector(win, camera=cam)
+
+    key = soy.controllers.Keyboard(win)
+    key['q'] = soy.actions.Quit()
+    key[ 1 ] = soy.actions.Quit() # 9 = esc key
+
+
+    key['w'] =  camera_impl_move( (0,0,-0.1) )
+    key['s'] =  camera_impl_move( (0,0,0.1) )
+
+    key['a'] =  camera_impl_move( (-0.1,0,0) )
+    key['d'] =  camera_impl_move( (0.1,0,0) )
+
+    key['z'] = camera_set_rot( (0, 0.3, 0))
+    key['x'] = camera_set_rot( (0, 0, 0))
+    key['c'] = camera_set_rot( (0, -0.3, 0))
+
+    key['r'] = multiply_size( (1.1,1.0))
+    key['f'] = multiply_size( (1.0/1.1,1.0))
+
+    key['t'] = multiply_size( (1.0,1.1))
+    key['g'] = multiply_size( (1.0,1.0/1.1))
+
+
+
+    wcn = soy.controllers.Window(win)
+    wcn['close'] = soy.actions.Quit()
+
+    while True:
+        sleep(.1)
+
+if __name__=='__main__':
+    main()
+

Modified: trunk/pysoy/include/gl.pxd
===================================================================
--- trunk/pysoy/include/gl.pxd  2008-01-17 07:20:07 UTC (rev 783)
+++ trunk/pysoy/include/gl.pxd  2008-01-18 23:13:38 UTC (rev 784)
@@ -1011,8 +1011,10 @@
   cdef void glLoadIdentity()
   cdef void glLoadMatrixf( GLfloat* )
   cdef void glMultMatrixf( GLfloat* )
+  cdef void glMultTransposeMatrixf( GLfloat* )
   cdef void glScalef( GLfloat, GLfloat, GLfloat )
   cdef void glTranslatef( GLfloat, GLfloat, GLfloat )
+  cdef void glRotatef(GLfloat, GLfloat, GLfloat, GLfloat)
     
   # Legacy Functions
   cdef void glBegin( GLenum )

Added: trunk/pysoy/include/stdlib.pxd
===================================================================
--- trunk/pysoy/include/stdlib.pxd                              (rev 0)
+++ trunk/pysoy/include/stdlib.pxd      2008-01-18 23:13:38 UTC (rev 784)
@@ -0,0 +1,4 @@
+
+cdef extern from "math.h" :
+    float sinf(float)
+    float cosf(float)

Modified: trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd
===================================================================
--- trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd       2008-01-17 
07:20:07 UTC (rev 783)
+++ trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pxd       2008-01-18 
23:13:38 UTC (rev 784)
@@ -52,3 +52,6 @@
   cdef int _wire
   cdef float            _fovy
   cdef void             _project(self)
+
+
+

Modified: trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx
===================================================================
--- trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx       2008-01-17 
07:20:07 UTC (rev 783)
+++ trunk/pysoy/src/bodies._bodies/soy.bodies._bodies.pyx       2008-01-18 
23:13:38 UTC (rev 784)
@@ -36,3 +36,4 @@
 
 include "Body.pxi"
 include "Camera.pxi"
+

Added: trunk/pysoy/src/meshes/Sun.pxi
===================================================================
--- trunk/pysoy/src/meshes/Sun.pxi                              (rev 0)
+++ trunk/pysoy/src/meshes/Sun.pxi      2008-01-18 23:13:38 UTC (rev 784)
@@ -0,0 +1,181 @@
+import soy.materials
+
+cdef class Sun(Mesh):
+    def __cinit__(self, **kwargs ):
+        if kwargs.has_key('center_mat'):
+            self._center_mat = kwargs['center_mat']
+        else:
+            self._center_mat = soy.materials.StainlessSteel()
+
+        if kwargs.has_key('aura_mat'):
+            self._aura_mat = kwargs['aura_mat']
+        else:
+            self._aura_mat = soy.materials.StainlessSteel()
+
+        if kwargs.has_key('spike_mat'):
+            self._spike_mat = kwargs['spike_mat']
+        else:
+            self._spike_mat = soy.materials.StainlessSteel()
+
+        if kwargs.has_key('num_spikes'):
+            self._num_spikes = kwargs['num_spikes']
+        else:
+            self._num_spikes = 4
+
+        if kwargs.has_key('circle_verts'):
+            self._circle_verts = kwargs['circle_verts']
+        else:
+            self._circle_verts = 32
+
+        if kwargs.has_key('center_size'):
+            self._center_size[0] = kwargs['center_size'][0]
+            self._center_size[1] = kwargs['center_size'][1]
+        else:
+            self._center_size[0] = 1
+            self._center_size[1] = 1
+
+        if kwargs.has_key('aura_size'):
+            self._aura_size[0] = kwargs['aura_size'][0]
+            self._aura_size[1] = kwargs['aura_size'][1]
+        else:
+            self._aura_size[0] = 2
+            self._aura_size[1] = 2
+
+        if kwargs.has_key('spike_size'):
+            self._spike_size[0] = kwargs['spike_size'][0]
+            self._spike_size[1] = kwargs['spike_size'][1]
+        else:
+            self._spike_size[0] = 4
+            self._spike_size[1] = 4
+
+
+    cdef void _render(self, void* body):
+        cdef float mmat[16]
+        cdef float x_ssize
+        cdef float y_ssize
+        cdef float angle
+        cdef int i
+        cdef float PI_S
+
+        PI_S = 3.1415926535897931 / 180.0
+
+
+        gl.glGetFloatv(gl.GL_MODELVIEW_MATRIX, mmat)
+        mmat[12] = mmat[13] = mmat[14] = 0
+        gl.glMultTransposeMatrixf(mmat)
+
+        #UP = (mmat[0], mmat[4], mmat[8])
+        #RIGHT = (mmat[1], mmat[5], mmat[9])
+        gl.glDisable(gl.GL_DEPTH_TEST)
+
+        if self._spike_mat:
+            self._spike_mat._bind()
+
+            angle = 360.0 / self._num_spikes
+
+            for i from 0 <= i < self._num_spikes:
+                gl.glPushMatrix()
+                gl.glRotatef( i * angle, 0.0,0.0,1.0)
+
+                x_ssize = self._center_size[0]/5.0
+                y_ssize = self._center_size[1]/5.0
+
+                gl.glBegin(gl.GL_TRIANGLES)
+                gl.glNormal3f(0,0,-1)
+                gl.glVertex3f(x_ssize, y_ssize, 0)
+                gl.glVertex3f(0, self._spike_size[0], 0)
+                gl.glVertex3f(-x_ssize, y_ssize, 0)
+                gl.glEnd()
+
+                gl.glPopMatrix()
+
+            self._spike_mat._unbind()
+
+        if self._aura_mat:
+            self._aura_mat._bind()
+            angle = 360.0 / self._circle_verts
+
+            gl.glBegin(gl.GL_TRIANGLE_FAN)
+            gl.glNormal3f(0,0,-1)
+            gl.glVertex3f(0,0,0)
+
+            for i from 0 <= i <= self._circle_verts:
+                x_ssize = self._aura_size[0] * stdlib.sinf( - PI_S * (<float>i 
* angle))
+                y_ssize = self._aura_size[1] * stdlib.cosf( PI_S * (<float>i * 
angle))
+                gl.glVertex3f(x_ssize, y_ssize, 0.0)
+
+            gl.glEnd()
+            
+            self._aura_mat._unbind()
+
+        if self._center_mat:
+            self._center_mat._bind()
+            angle = 360.0 / self._circle_verts
+
+            gl.glBegin(gl.GL_TRIANGLE_FAN)
+            gl.glNormal3f(0,0,-1)
+            gl.glVertex3f(0,0,0)
+
+            for i from 0 <= i <= self._circle_verts:
+                x_ssize = self._center_size[0] * stdlib.sinf( - PI_S * 
(<float>i * angle))
+                y_ssize = self._center_size[1] * stdlib.cosf( PI_S * (<float>i 
* angle))
+                gl.glVertex3f(x_ssize, y_ssize, 0.0)
+
+            gl.glEnd()
+            
+            self._center_mat._unbind()
+
+
+        gl.glEnable(gl.GL_DEPTH_TEST)
+
+    property center_mat:
+        def __get__(self):
+            return self._center_mat
+        def __set__(self, newmat):
+            self._center_mat = newmat
+
+    property aura_mat:
+        def __get__(self):
+            return self._aura_mat
+        def __set__(self, newmat):
+            self._aura_mat = newmat
+
+    property spike_mat:
+        def __get__(self):
+            return self._spike_mat
+        def __set__(self, newmat):
+            self._spike_mat = newmat
+
+    property num_spikes:
+        def __get__(self):
+            return self._num_spikes
+        def __set__(self, newmat):
+            self._num_spikes = newmat
+
+    property circle_verts:
+        def __get__(self):
+            return self._circle_verts
+        def __set__(self, newmat):
+            self._circle_verts = newmat
+
+    property center_size:
+        def __get__(self):
+            return (self._center_size[0], self._center_size[1])
+        def __set__(self, newsize):
+            self._center_size[0] = newsize[0]
+            self._center_size[1] = newsize[1]
+
+    property aura_size:
+        def __get__(self):
+            return (self._aura_size[0], self._aura_size[1])
+        def __set__(self, newsize):
+            self._aura_size[0] = newsize[0]
+            self._aura_size[1] = newsize[1]
+
+    property spike_size:
+        def __get__(self):
+            return (self._spike_size[0], self._spike_size[1])
+        def __set__(self, newsize):
+            self._spike_size[0] = newsize[0]
+            self._spike_size[1] = newsize[1]
+

Modified: trunk/pysoy/src/meshes/soy.meshes.pxd
===================================================================
--- trunk/pysoy/src/meshes/soy.meshes.pxd       2008-01-17 07:20:07 UTC (rev 
783)
+++ trunk/pysoy/src/meshes/soy.meshes.pxd       2008-01-18 23:13:38 UTC (rev 
784)
@@ -20,6 +20,7 @@
 cimport gl
 cimport py
 cimport stdio
+cimport stdlib
 cimport soy._datatypes
 cimport soy._internals
 cimport soy.materials
@@ -50,3 +51,17 @@
     cdef float                      _size[2]
     cdef void       _render         (self, void* )
 
+cdef class Sun (Mesh) :
+    cdef soy.materials.Material     _center_mat
+    cdef soy.materials.Material     _aura_mat
+    cdef soy.materials.Material     _spike_mat
+
+    cdef int                        _num_spikes
+    cdef int                        _circle_verts
+
+    cdef float                      _center_size[2]
+    cdef float                      _aura_size[2]
+    cdef float                      _spike_size[2]
+
+    cdef void                       _render(self, void*)
+

Modified: trunk/pysoy/src/meshes/soy.meshes.pyx
===================================================================
--- trunk/pysoy/src/meshes/soy.meshes.pyx       2008-01-17 07:20:07 UTC (rev 
783)
+++ trunk/pysoy/src/meshes/soy.meshes.pyx       2008-01-18 23:13:38 UTC (rev 
784)
@@ -28,4 +28,5 @@
 include "Axis.pxi"
 include "Camera.pxi"
 include "Billboard.pxi"
+include "Sun.pxi"
 

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

Reply via email to