src/extras/gles_simplecube.py
changeset 0 ca70ae20a155
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/extras/gles_simplecube.py	Tue Feb 16 10:07:05 2010 +0530
@@ -0,0 +1,281 @@
+#
+# simplecube.py
+#
+# Copyright (c) 2006-2007 Nokia Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import appuifw, sys, e32
+from glcanvas import *
+from gles import *
+from key_codes import *
+
+class SimpleCube:
+  vertices = array(GL_BYTE, 3, (
+     [-1,  1,  1.0],
+     [ 1,  1,  1],
+     [ 1, -1,  1],
+     [-1, -1,  1],
+
+     [-1,  1, -1],
+     [ 1,  1, -1],
+     [ 1, -1, -1],
+     [-1, -1, -1]
+    )
+  )
+  
+  triangles = array(GL_UNSIGNED_BYTE, 3, (
+    # front
+    [1,0,3],
+    [1,3,2],
+    
+    # right
+    [2,6,5],
+    [2,5,1],
+    
+    # back
+    [7,4,5],
+    [7,5,6],
+    
+    # left
+    [0,4,7],
+    [0,7,3],
+    
+    # top
+    [5,4,0],
+    [5,0,1],
+    
+    # bottom
+    [3,7,6],
+    [3,6,2]
+    )
+  )
+  
+  fanOne = array(GL_UNSIGNED_BYTE, 3, (
+    [1,0,3],
+    [1,3,2],
+    [1,2,6],
+    [1,6,5],
+    [1,5,4],
+    [1,4,0]
+    )
+  )
+  fanTwo = array(GL_UNSIGNED_BYTE, 3, (
+    [7,4,5],
+    [7,5,6],
+    [7,6,2],
+    [7,2,3],
+    [7,3,0],
+    [7,0,4]
+    )
+  )
+  
+  colors = array(GL_UNSIGNED_BYTE, 4, (
+    [0  ,255,  0,255],
+    [0  ,  0,255,255],
+    [0  ,255,  0,255],
+    [255,  0,  0,255],
+
+    [0  ,  0,255,255],
+    [255,  0,  0,255],
+    [0  ,  0,255,255],
+    [0  ,255,  0,255]
+  ))
+  
+  ETriangles=0
+  ETriangleFans=1
+  
+  def __init__(self):
+    """Initializes OpenGL ES, sets the vertex and color arrays and pointers, 
+and selects the shading mode."""
+    
+    # It's best to set these before creating the GL Canvas
+    self.iDrawingMode=self.ETriangles
+    self.iFrame=0
+    self.exitflag = False
+    self.render=0
+    self.canvas = None
+    
+    self.old_body=appuifw.app.body
+    try:
+      self.canvas=GLCanvas(redraw_callback=self.redraw, event_callback=self.event, resize_callback=self.resize)
+      appuifw.app.body=self.canvas
+    except Exception,e:
+      appuifw.note(u"Exception: %s" % (e))
+      self.set_exit()
+      return
+    
+    # binds are exactly same as with normal Canvas objects
+    self.canvas.bind(EKey1,lambda:self.FullScreen(0))
+    self.canvas.bind(EKey2,lambda:self.FullScreen(1))
+    self.canvas.bind(EKey3,lambda:self.FullScreen(2))
+    
+    appuifw.app.menu = [
+      (
+        u"Shading mode",
+        (
+          (u"Flat", self.FlatShading),
+          (u"Smooth", self.SmoothShading)
+        )
+      ),
+      (
+        u"Drawing mode",
+        (
+          (u"Triangles", self.TriangleMode),
+          (u"Triangle fans", self.TriangleFanMode)
+        )
+      ),
+      (
+        u"Screen",
+        (
+          (u"Normal", lambda:self.FullScreen(0)),
+          (u"Large", lambda:self.FullScreen(1)),
+          (u"Full", lambda:self.FullScreen(2)),
+        )
+      ),
+      (u"Exit", self.set_exit)
+    ]
+    
+    try:
+      self.initgl()
+    except Exception,e:
+      appuifw.note(u"Exception: %s" % (e))
+      self.set_exit()
+    
+  def event(self, ev):
+    """Event handler"""
+    pass
+  
+  def resize(self):
+    """Resize handler"""
+    # This may get called before the canvas is created, so check that the canvas exists
+    if self.canvas:
+      glViewport(0, 0, self.canvas.size[0], self.canvas.size[1])
+      aspect = float(self.canvas.size[1]) / float(self.canvas.size[0])
+      glMatrixMode( GL_PROJECTION )
+      glLoadIdentity()
+      glFrustumf( -1.0, 1.0, -1.0*aspect, 1.0*aspect, 3.0, 1000.0 )
+    
+  def initgl(self):
+    """Initializes OpenGL and sets up the rendering environment"""
+    # Set the screen background color. 
+    glClearColor( 0.0, 0.0, 0.0, 1.0 )
+    
+    # Enable back face culling. 
+    glEnable( GL_CULL_FACE  )
+    
+    # Initialize viewport and projection. 
+    self.resize()
+    
+    glMatrixMode( GL_MODELVIEW )
+    
+    # Enable vertex arrays. 
+    glEnableClientState( GL_VERTEX_ARRAY )
+    
+    # Set array pointers. 
+    glVertexPointerb(self.vertices)
+    
+    # Enable color arrays.
+    glEnableClientState( GL_COLOR_ARRAY )
+    
+    # Set color pointers. 
+    glColorPointerub(self.colors )
+    
+    # Set the initial shading mode 
+    glShadeModel( GL_FLAT )
+    
+    # Do not use perspective correction 
+    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST )
+    self.render=1
+    
+  def FlatShading(self):
+    """Sets the GL shading model to flat."""
+    glShadeModel( GL_FLAT )
+    
+  def SmoothShading(self):
+    """Sets the GL shading model to smooth."""
+    glShadeModel( GL_SMOOTH )
+    
+  def TriangleMode(self):
+    """Sets the rendering mode to triangles."""
+    self.iDrawingMode = self.ETriangles
+    
+  def TriangleFanMode(self):
+    """Sets the rendering mode to triangle fans."""
+    self.iDrawingMode = self.ETriangleFans
+    
+  def FullScreen(self,mode):
+    if mode == 0:
+      appuifw.app.screen = 'normal'
+    elif mode == 1:
+      appuifw.app.screen = 'large'
+    elif mode == 2:
+      appuifw.app.screen = 'full'
+    
+  def drawbox(self, aSizeX, aSizeY, aSizeZ):
+    """Draws a box with triangles or triangle fans depending on the current rendering mode.
+Scales the box to the given size using glScalef."""
+    glScalef( aSizeX, aSizeY, aSizeZ )
+    
+    if self.iDrawingMode == self.ETriangles:
+      glDrawElementsub( GL_TRIANGLES, self.triangles )
+    elif self.iDrawingMode == self.ETriangleFans:
+      glDrawElementsub( GL_TRIANGLE_FAN, self.fanOne )
+      glDrawElementsub( GL_TRIANGLE_FAN, self.fanTwo )
+  
+  def redraw(self,frame):
+    """Draws and animates the objects.
+The frame number determines the amount of rotation."""
+    self.iFrame = frame
+    
+    if self.render == 0:
+      return
+    glMatrixMode( GL_MODELVIEW )
+    
+    cameraDistance = 100
+    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
+    
+    # Animate and draw box
+    glLoadIdentity()
+    glTranslatex( 0 , 0 , -cameraDistance << 16 )
+    glRotatex( self.iFrame << 16, 1 << 16,    0   ,    0    )
+    glRotatex( self.iFrame << 15,    0   , 1 << 16,    0    )
+    glRotatex( self.iFrame << 14,    0   ,    0   , 1 << 16 )
+    self.drawbox( 15.0, 15.0, 15.0 )
+    
+  def close_canvas(self): # break reference cycles
+    appuifw.app.body=self.old_body
+    self.canvas=None
+    self.draw=None
+    appuifw.app.exit_key_handler=None
+  
+  def set_exit(self):
+    self.exitflag = True
+    
+  def run(self):
+    appuifw.app.exit_key_handler=self.set_exit
+    while not self.exitflag:
+      self.canvas.drawNow()
+      e32.ao_sleep(0.0001)
+    self.close_canvas()
+    
+appuifw.app.screen='full'
+try:
+  app=SimpleCube()
+except Exception,e:
+  appuifw.note(u'Exception: %s' % (e))
+else:
+  app.run()
+  del app
+#sys.exit(0)
\ No newline at end of file