CodeSnippits Dynamic Textures

From PyWiki

Jump to: navigation, search

Dynamic Textures

Heres a ( rather inefficient ) demo of how to manually create a texture and modify it during runtime. Some code borrowed from the forum. Would be faster by setting up arrays in advance instead of creating them every frame, and by using Numeric Python to handle them.

import sys
sys.path.insert(0,'..')
 
import ogre.renderer.OGRE as ogre
import ctypes
import SampleFramework as sf
 
class textureListener(ogre.FrameListener):
    def __init__(self, app):
        ogre.FrameListener.__init__(self)
        self.app = app
        self.grnVal = 0
        self.fading = True
 
    def frameStarted(self, frameEvent):
        self.grnVal = self.fading and self.grnVal + 1 or self.grnVal -1
        if self.grnVal == 255:
            self.fading = False
        elif self.grnVal == 0:
            self.fading = True
        colArray = [0,self.grnVal,0,128] * 16 * 16
        self.app.setTextureManual(self.app.mTex, 16,16, colArray)
        return True
 
class textureTest(sf.Application):
    def __init__(self):
        sf.Application.__init__(self)
 
    def _createScene(self):
        self.mTex = ogre.TextureManager.getSingleton().createManual(
                                 "DynamicTexture",
                                 ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME,
                                 ogre.TEX_TYPE_2D,
                                 16, 16,
                                 0,
                                 ogre.PF_BYTE_BGRA,
                                 ogre.TU_DEFAULT)
        colArray = [0,255,0,128] * 16 * 16
        self.setTextureManual(self.mTex, 16, 16, colArray)
        self.material = ogre.MaterialManager.getSingleton().create(
                             "DynamicTextureMaterial",
                             ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME)
 
        self.material.getTechnique(0).getPass(0).createTextureUnitState("DynamicTexture")
        self.material.getTechnique(0).getPass(0).setSceneBlending(ogre.SBT_TRANSPARENT_ALPHA)
        self.ent = self.sceneManager.createEntity("mrben", "knot.mesh")
        self.ent.setMaterialName("DynamicTextureMaterial")
        self.node = self.sceneManager.getRootSceneNode().createChildSceneNode('Knot3Node', (-100, -10, -200))
        self.node.attachObject(self.ent)
 
        self.lstnr = textureListener(self)
        ogre.Root.getSingleton().addFrameListener(self.lstnr)
 
    #Texture is a manually created Texture 
    #dataArray is an array of pixel colour data 
    def setTextureManual(self, texture, width, height, dataArray): 
            import ctypes 
            # Get the pixel buffer 
            pixelBuffer = texture.getBuffer() 
            # Lock the pixel buffer and get a pixel box 
            pointer = pixelBuffer.lock(0,width*height*4,ogre.HardwareBuffer.HBL_NORMAL) 
            #number 4 here is use to accommodate the bytes for r, g, b, a may vary with different pixel formats 
            storageclass = ctypes.c_uint8 * (width*height*4) 
            cbuffer=storageclass.from_address(ogre.CastInt(pointer)) 
            pos=0 
            for j in range(height): 
                for i in range( width ) : 
                    cbuffer[pos]= dataArray[pos] # B 
                    pos+=1 
                    cbuffer[pos]= dataArray[pos]  # G 
                    pos+=1 
                    cbuffer[pos]= dataArray[pos]  # R 
                    pos+=1 
                    cbuffer[pos]= dataArray[pos]   # A 
                    pos+=1 
            # Unlock the pixel buffer 
            pixelBuffer.unlock()
 
if __name__=='__main__':
    ta = textureTest()
    ta.go()

link title

Personal tools