def saveTerrain(self):

        ### There is a bug somewhere in the code, I should be able to use
        ### self.terrainInfo but the data isn't there  
        ## check data array
        ##for j in xrange(self.terrainInfo.getHeight()):
        ##    for i in xrange(self.terrainInfo.getWidth()):
        ##        if self.terrainInfo.at(i, j)>0.5:
        ##             print self.terrainInfo.at(i, j)


        ## HACK
        self.terrainInfo = self.getTerrainInfo()

        ## save terrain map 
        image = ogre.Image()
        ET.saveHeightmapToImage(self.terrainInfo, image)
        image.save( os.path.join(self.mediadir, "ET/ETterrain.png") )

        ## save the splatting maps
        for i in xrange(self.splatMgr.getNumMaps()):
            self.splatMgr.saveMapToImage(i, image)
            filename = os.path.join(self.mediadir, "ET/ETcoverage.%s.%s" % ( str(i) , "png")  )
            print "Saving Splatting Map %s " %filename
            image.save( filename )

        ## save light map
        lightmap = ogre.Image()
        ET.createTerrainLightmap(
                             self.terrainInfo ,
                             lightmap, 512, 512 ,
                             ogre.Vector3(1, -1, 1) ,
                             ogre.ColourValue(1 ,1, 1) ,      
                             ogre.ColourValue(1, 1,  1) )

        lightmap.save(os.path.join(self.mediadir,"ET/ETlightmap.png") )


        ## generate a base texture for this terrain (could be used for older hardware instead of splatting)
        textures = []
        for i in range(6): 
            image = ogre.Image()
            textures.append(image)
            textures[i].load("splatting%s.%s" %( str(i), "png" ) , "ET")
        ## create the base texture
        baseTexture = ogre.Image()
        self.splatMgr.createBaseTexture(baseTexture, 512, 512, textures, 20, 20)
        baseTexture.save(os.path.join(self.mediadir,"ET/ETbase.png"))

        ## finally create a minimap using the lightmap and the generated base texture
        minimap = ET.createMinimap(baseTexture, lightmap)
        print "Saving MinMap to ", os.path.join(self.mediadir,"ET/ETminimap.png")
        minimap.save(os.path.join(self.mediadir,"ET/ETminimap.png"))
    def updateLightmap(self):
        ## HACK
        self.terrainInfo = self.getTerrainInfo()

        lightmap = ogre.Image()
        ET.createTerrainLightmap(
                             self.terrainInfo ,
                             lightmap, 128, 128 ,
                             ogre.Vector3(1, -1, 1) ,
                             ogre.ColourValue(1 ,1, 1) ,      
                             ogre.ColourValue(0.3, 0.3,  0.3) )

        ## get our dynamic texture and update its contents
        tex = ogre.TextureManager.getSingleton().getByName("ETLightmap")
        l = lightmap.getPixelBox(0, 0)
        tex.getBuffer(0, 0).blitFromMemory(lightmap.getPixelBox(0, 0))
    def updateLightMap(self):
        return
        decalCursorWasVisible = False
        
        if self.decalCursor.m_bVisible:
            self.decalCursor.hide()
            decalCursorWasVisible = True
            
        lightmap = og.Image()
        ET.createTerrainLightmap(
                             self.terrainManager.getTerrainInfo() ,
                             lightmap, 128, 128 ,
                             og.Vector3(1, -1, 1) ,
                             og.ColourValue(1 ,1, 1) ,      
                             og.ColourValue(0.3, 0.3,  0.3) )

        ## get our dynamic texture and update its contents
        tex = og.TextureManager.getSingleton().getByName("ETLightmap")
        l = lightmap.getPixelBox(0, 0)
        tex.getBuffer(0, 0).blitFromMemory(lightmap.getPixelBox(0, 0))
        
        if decalCursorWasVisible:
            self.decalCursor.show()
    def _createScene(self):

        self.sceneManager.ambientLight = ogre.ColourValue(0.5, 0.5, 0.5)
        ## Create a skydome
        ## self.sceneManager.setSkyDome(True, "Examples/CloudySky", 5, 8) 

        ## create terrain manager
        self.terrainMgr =  ET.TerrainManager(self.sceneManager)
        self.terrainMgr.setLODErrorMargin(2, self.camera.getViewport().getActualHeight())
        self.terrainMgr.setUseLODMorphing(True, 0.2, "morphFactor")

        ## create a fresh, mid-high terrain for editing
        # Note 
        try:
            heightMapValues = ogre.LodDistanceList() ## ET.stdVectorFloat()
        except:
            heightMapValues = ogre.stdVectorFloat()
         
        for i in xrange(129):
            for j in xrange(129):
                heightMapValues.append(float(0.50))
        self.terrainInfo = ET.TerrainInfo (129, 129, heightMapValues )

        ## save typing self
        terrainInfo  = self.terrainInfo 
        sceneManager = self.sceneManager
        terrainMgr   = self.terrainMgr

        ## set position and size of the terrain
        terrainInfo.setExtents(ogre.AxisAlignedBox(0, 0, 0, 1500, 300, 1500))
        ## now render it
        terrainMgr.createTerrain(terrainInfo)

        ## create the splatting manager
        self.splatMgr = ET.SplattingManager("ETSplatting", "ET", 128, 128, 3)
        ## specify number of splatting textures we need to handle
        self.splatMgr.setNumTextures(6)

        ## create a manual lightmap texture
        lightmapTex = ogre.TextureManager.getSingleton().createManual(
        "ETLightmap", "ET", ogre.TEX_TYPE_2D, 128, 128, 1, ogre.PF_BYTE_RGB)

        lightmap = ogre.Image()
        ET.createTerrainLightmap(terrainInfo, lightmap, 128, 128,\
                                 ogre.Vector3(1, -1, 1),\
                                 ogre.ColourValue().White,\
                                 ogre.ColourValue(0.3, 0.3, 0.3,1.0))
        lightmapTex.getBuffer(0, 0).blitFromMemory(lightmap.getPixelBox(0, 0))

        ##  load the terrain material and assign it
        material = ogre.MaterialManager.getSingleton().getByName("ETTerrainMaterial")
        self.terrainMgr.setMaterial(material)

        ## Set camera look point
        camNode = self.sceneManager.getRootSceneNode().createChildSceneNode("CamNode")
        camNode.setPosition( 40, 300, 580 )
        camNode.attachObject(self.camera)
        self.camera.pitch( ogre.Degree(-30) )
        self.camera.yaw( ogre.Degree(-45) )

        ## CEGUI setup
        self.GUIRenderer = CEGUI.OgreCEGUIRenderer(self.renderWindow, 
            ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.sceneManager) 
        self.GUIsystem = CEGUI.System(self.GUIRenderer) 

        CEGUI.Logger.getSingleton().setLoggingLevel( CEGUI.Informative ) 
        CEGUI.SchemeManager.getSingleton().loadScheme("TaharezLookSkin.scheme") 
        CEGUI.MouseCursor.getSingleton().setImage("TaharezLook", "MouseArrow")
    def create(self, cursorSize, arg):
        if arg is not None:
            self.name = arg["name"]
            self.position = og.Vector3(arg["positionX"], arg["positionY"], arg["positionZ"])
            self.extends = og.Vector3(arg["extendsX"], arg["extendsY"], arg["extendsZ"])
            self.terrainHeight = arg["terrainHeight"]
            self.terrainSize = arg["terrainSize"] + 1
            self.splattingResGroup = "ETSplatting"
            self.splattingTextureSize = self.terrainSize = arg["terrainSize"] + 1
            self.splattingNumTextures = 6
            
#            self.splattingBaseName = arg["splattingBaseName"]
#            self.splattingResGroup = arg["splattingResGroup"]
#            self.splattingTextureSize = arg["splattingTextureSize"]
#            self.splattingNumTextures = arg["splattingNumTextures"]
        
        self.terrainManager =  ET.TerrainManager(self.sceneManager, self.name)
        self.terrainManager.setLODErrorMargin(2, self.camera.getViewport().getActualHeight())
        self.terrainManager.setUseLODMorphing(True, 0.2, "morphFactor")
        
        ## create a fresh, mid-high terrain for editing
        # Note 
        heightMapValues = og.stdVectorFloat() ## ET.stdVectorFloat()
        for i in xrange(self.terrainSize):
            for j in xrange(self.terrainSize):
                heightMapValues.append(self.terrainHeight)
        # width, height, heightmapvalues as a float array
        self.terrainInfo = ET.TerrainInfo (self.terrainSize, self.terrainSize, heightMapValues )
        
        ## save typing self
        terrainInfo  = self.terrainInfo 
        sceneManager = self.sceneManager
        terrainMgr   = self.terrainManager
        
        ## set position and size of the terrain
        half = self.extends / 2
        terrainInfo.setExtents(og.AxisAlignedBox(-half.x, -half.y, -half.z, half.x, half.y, half.z))


        ## now render it
        terrainMgr.createTerrain(terrainInfo)

        ## create the splatting manager
#        * @param baseName   base name for the map textures (will be appended by their number)
#        * @param group      the resource group the textures will be placed in
#        * @param width      width of the textures in pixels
#        * @param height     height of the textures in pixels
#        * @param channels   Number of channels per texture (must be in {1, 2, 3, 4})
        self.splatMgr = ET.SplattingManager(self.splattingBaseName, self.splattingResGroup, self.terrainSize, self.terrainSize, 3)
        ## specify number of splatting textures we need to handle
        self.splatMgr.setNumTextures(self.splattingNumTextures)
        
        ## create a manual lightmap texture
        lightmapTex = og.TextureManager.getSingleton().createManual(
        "ETLightmap", self.splattingResGroup, og.TEX_TYPE_2D, self.splattingTextureSize, self.splattingTextureSize, 1, og.PF_BYTE_RGB)

        lightmap = og.Image()
        ET.createTerrainLightmap(terrainInfo, lightmap, 128, 128,\
                                 og.Vector3(1, -1, 1),\
                                 og.ColourValue().White,\
                                 og.ColourValue(0.3, 0.3, 0.3,1.0))
        lightmapTex.getBuffer(0, 0).blitFromMemory(lightmap.getPixelBox(0, 0))

        ##  load the terrain material and assign it
        material = og.MaterialManager.getSingleton().getByName("ETTerrainMaterial")
#        material = og.MaterialManager.getSingleton().getByName("Lockenwickler_Area")
        self.terrainManager.setMaterial(material)
        
        self.sceneNode = self.sceneManager.getSceneNode(self.name + "/Terrain")
        self.sceneNode.setPosition(self.position)
        self.parentSceneNode = self.sceneNode.getParentSceneNode()
        self.created = True
        
        self.decalCursor = TerrainDecalCursor.TerrainDecalCursor(self.sceneManager, material, og.Vector2(cursorSize, cursorSize), "cursorTex.png")