[CEGUI] RenderTexture fails

McFarlane

10-07-2012 12:59:07

Hi,

I am trying to complete tutorial 7 and the provided code causes an error:

texture = ogre.TextureManager.getSingleton().createManual("RttTex", "General", ogre.TextureType.TEX_TYPE_2D, 512, 512, 0, ogre.PixelFormat.PF_R8G8B8, ogre.TU_RENDERTARGET ).getBuffer().getRenderTarget()

rttCamera = self.sceneManager.createCamera("RttCam")
rttCamera.setPosition(100.0, -100.0, -400.0)
rttCamera.lookAt(0.0, 0.0, -300.0)

viewport = texture.addViewport(rttCamera)
viewport.setOverlaysEnabled(False)
viewport.setClearEveryFrame(True)
viewport.setBackgroundColour(ogre.ColourValue().Black)

ceguiTexture = self.renderer.createTexture("RttTex")


The last line "ceguiTexture = self.renderer.createTexture("RttTex")" causes the following error:

Traceback (most recent call last):
File "C:\Users\Student\Documents\ogre\tutorial_01\basic_07.py", line 156, in <module>
ta.go()
File "C:\Python27\lib\site-packages\ogre\renderer\OGRE\sf_OIS.py", line 105, in go
if not self._setUp():
File "C:\Python27\lib\site-packages\ogre\renderer\OGRE\sf_OIS.py", line 152, in _setUp
self._createScene()
File "C:\Users\Student\Documents\ogre\tutorial_01\basic_07.py", line 115, in _createScene
ceguiTexture = self.renderer.createTexture("RttTex")
Boost.Python.ArgumentError: Python argument types in
OgreRenderer.createTexture(OgreRenderer, str)
did not match C++ signature:
createTexture(class CEGUI::OgreRenderer {lvalue}, class CEGUI::Size size)
createTexture(class CEGUI::OgreRenderer {lvalue}, class CEGUI::String filename, class CEGUI::String resourceGroup)
createTexture(class CEGUI::OgreRenderer {lvalue})
createTexture(class CEGUI::OgreRenderer {lvalue}, class Ogre::TexturePtr {lvalue} tex, bool take_ownership=False)


According to the CEGUI Manual I think calling createTexture with a TexturePtr is what is necessary here.
But "texture" is of type "RenderTexture" so calling "[...].createTexture(texture)" doesn't work either.

What is the correct line for this?
Thanks, McFarlane

dermont

10-07-2012 14:07:01

Sorry I can't say for sure since I don't have any cegui module built/installed here but it looks like you need split your texture creation line. The TexturePtr to Texture conversion will be handled automatically by python-ogre.


texture = ogre.TextureManager.getSingleton().createManual( "RttTex", "General", ogre.TextureType.TEX_TYPE_2D, 512, 512, 0, ogre.PixelFormat.PF_R8G8B8, ogre.TU_RENDERTARGET )
rtex = texture.getBuffer().getRenderTarget()

ceguiTexture = self.renderer.createTexture(texture)
...
viewport = rtex.addViewport(rttCamera)

McFarlane

13-07-2012 08:47:38

Thanks, at least that fixed the error I described.

But now there is another error some lines beneath.
I'll describe it in another thread though.

Its kind of sad, that the tutorial code of the more important parts doesn't work. :(

dermont

13-07-2012 10:02:19

Thanks, at least that fixed the error I described.

But now there is another error some lines beneath.
I'll describe it in another thread though.

Its kind of sad, that the tutorial code of the more important parts doesn't work. :(


No need for another thread. I've switched to Windows and tried the demo you referred to and can understand your sadness. I was going to suggest running the GUI demo but it crashed also. The tutorial is for an older version of CEGUI, hopefully the following works, if not let me know.


import sys
sys.path.insert(0,'..')
import PythonOgreConfig


import SampleFramework as sf
import ogre.renderer.OGRE as ogre
import ogre.io.OIS as OIS
import ogre.gui.CEGUI as CEGUI

def convertButton(oisID):
if oisID == OIS.MB_Left:
return CEGUI.LeftButton
elif oisID == OIS.MB_Right:
return CEGUI.RightButton
elif oisID == OIS.MB_Middle:
return CEGUI.MiddleButton
else:
return CEGUI.LeftButton

class TutorialListener(sf.FrameListener, OIS.MouseListener, OIS.KeyListener):

def __init__(self, renderWindow, camera):
sf.FrameListener.__init__(self, renderWindow, camera, True, True)
OIS.MouseListener.__init__(self)
OIS.KeyListener.__init__(self)
self.cont = True
self.Mouse.setEventCallback(self)
self.Keyboard.setEventCallback(self)
windowManager = CEGUI.WindowManager.getSingleton()
quitButton = windowManager.getWindow("CEGUIDemo/QuitButton")
quitButton.subscribeEvent(CEGUI.PushButton.EventClicked, self, "quit")

def frameStarted(self, evt):
self.Keyboard.capture()
self.Mouse.capture()
return self.cont and not self.Keyboard.isKeyDown(OIS.KC_ESCAPE)

def quit(self, evt):
self.cont = False
return True

# MouseListener
def mouseMoved(self, evt):
CEGUI.System.getSingleton().injectMouseMove(evt.get_state().X.rel, evt.get_state().Y.rel)
return True

def mousePressed(self, evt, id):
CEGUI.System.getSingleton().injectMouseButtonDown(convertButton(id))
return True

def mouseReleased(self, evt, id):
CEGUI.System.getSingleton().injectMouseButtonUp(convertButton(id))
return True

# KeyListener
def keyPressed(self, evt):
ceguiSystem = CEGUI.System.getSingleton()
ceguiSystem.injectKeyDown(evt.key)
ceguiSystem.injectChar(evt.text)
return True

def keyReleased(self, evt):
CEGUI.System.getSingleton().injectKeyUp(evt.key)
return True

class TutorialApplication(sf.Application):

def __del__(self):
if self.system:
del self.system
if self.renderer:
del self.renderer

def _createScene(self):

## setup GUI system
if CEGUI.Version__.startswith ("0.6"):
self.renderer = CEGUI.OgreRenderer(self.renderWindow,
ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.sceneManager)
self.system = CEGUI.System(self.GUIRenderer)
else:
self.renderer = CEGUI.OgreRenderer.bootstrapSystem()
self.system = CEGUI.System.getSingleton()

## load scheme and set up defaults
if CEGUI.Version__.startswith ("0.6"):
CEGUI.SchemeManager.getSingleton().loadScheme("TaharezLookSkin.scheme")
else:
CEGUI.SchemeManager.getSingleton().create("TaharezLookSkin.scheme")


self.system.setDefaultMouseCursor("TaharezLook", "MouseArrow")
self.system.setDefaultFont("BlueHighway-12")
windowManager = CEGUI.WindowManager.getSingleton()

sheet = windowManager.createWindow("DefaultGUISheet", "CEGUIDemo/Sheet")

quitButton = windowManager.createWindow("TaharezLook/Button", "CEGUIDemo/QuitButton")
quitButton.setText("Quit")
quitButton.setSize(CEGUI.UVector2(CEGUI.UDim(0.15, 0), CEGUI.UDim(0.05, 0)))

sheet.addChildWindow(quitButton)
self.system.setGUISheet(sheet)

self.sceneManager.setAmbientLight((1.0, 1.0, 1.0))
self.sceneManager.setSkyDome(True, "Examples/CloudySky", 5, 8)
ogreHead = self.sceneManager.createEntity("Head", "ogrehead.mesh")
headNode = self.sceneManager.getRootSceneNode().createChildSceneNode((0.0, 0.0, -300.0))
headNode.attachObject(ogreHead)
texture = ogre.TextureManager.getSingleton().createManual( "RttTex", "General", ogre.TextureType.TEX_TYPE_2D, 512, 512, 0, ogre.PixelFormat.PF_R8G8B8, ogre.TU_RENDERTARGET )
rttex = texture.getBuffer().getRenderTarget()

rttCamera = self.sceneManager.createCamera("RttCam")
rttCamera.setPosition(100.0, -100.0, -400.0)
rttCamera.lookAt(0.0, 0.0, -300.0)

viewport = rttex.addViewport(rttCamera)
viewport.setOverlaysEnabled(False)
viewport.setClearEveryFrame(True)
viewport.setBackgroundColour(ogre.ColourValue().Black)

ceguiTexture = self.renderer.createTexture(texture)

if CEGUI.Version__.startswith ("0.6"):
print dir(CEGUI.ImagesetManager.getSingleton())
imageSet = CEGUI.ImagesetManager.getSingleton().createImageset("RttImageset", ceguiTexture)
imageSet.defineImage("RttImage", CEGUI.Rect(0.0, 0.0, ceguiTexture.getWidth(), ceguiTexture.getHeight()), CEGUI.Vector2(0.0, 0.0))
else:
imageSet = CEGUI.ImagesetManager.getSingleton().create("RttImageset", ceguiTexture)
imageSet.defineImage("RttImage", CEGUI.Rect(0.0, 0.0, ceguiTexture.getSize().d_width, ceguiTexture.getSize().d_height), CEGUI.Vector2(0.0, 0.0))

staticImg = windowManager.createWindow("TaharezLook/StaticImage", "RTTWindow")
staticImg.setSize(CEGUI.UVector2(CEGUI.UDim(0.5, 0), CEGUI.UDim(0.4, 0)))
staticImg.setPosition(CEGUI.UVector2(CEGUI.UDim(0.5, 0), CEGUI.UDim(0, 0)))

staticImg.setProperty("Image", CEGUI.PropertyHelper.imageToString(imageSet.getImage("RttImage")))
sheet.addChildWindow(staticImg)


def _createFrameListener(self):
self.frameListener = TutorialListener(self.renderWindow, self.camera)
self.frameListener.showDebugOverlay(True)
self.root.addFrameListener(self.frameListener)

if __name__ == '__main__':
try:
ta = TutorialApplication()
ta.go()
except ogre.OgreException, e:
print e