metaclass issue

38 views
Skip to first unread message

Aleh Arol

unread,
May 21, 2012, 6:20:06 AM5/21/12
to python-ogre...@googlegroups.com
Hi,

I faced an issue I have no idea how to solve.I hope someone in the group
already saw that.
I have an Application class which is ogre.WindowEventListener
descendant, this means it's metaclass is 'Boost.Python.class' - the
metaclass derived from it's base. And the following program just works.

I want to provide my own metaclass which does conditional mixing of
mixins into derived application (e.g. if __debug__ bases =
(debug_mixin,) + bases ).

However if only I use my metaclass it stops working with:
Boost.Python.ArgumentError: Python argument types in
WindowEventUtilities.addWindowEventListener(RenderWindow, Application)
did not match C++ signature:
addWindowEventListener(Ogre::RenderWindow* window,
Ogre::WindowEventListener* listener)
File "/home/workfiles/devel/bc/src/bc/application/application.py", line
120, in <module>
app.run()
File "/home/workfiles/devel/bc/src/bc/application/application.py", line
73, in run
self)


See the program below(simplified minimal version):
import ogre.renderer.OGRE as ogre


class MyMetaclass(ogre.WindowEventListener.__class__):
pass

class Application(ogre.WindowEventListener):
'''BlackCloud base application class. Works as window events listener as
well.
'''

__metaclass__ = MyMetaclass

#overridables
app_title = 'BlackCloud Demo'
rendersystem_plugins = ('RenderSystem_GL', )
scenemanager_plugins = ('Plugin_OctreeSceneManager', )
rendersystem = 'OpenGL Rendering Subsystem'

window_width = 1120
window_height = 630
camera_aspect_ratio = 16.0 / 10.0
fullscreen = False

main_log_filename = 'ogre3d.log'
log_level = ogre.LL_NORMAL

def __init__(self):
ogre.WindowEventListener.__init__(self)

def initialize(self):
self.exit = False
self.active = True

#setup logging
self.log_manager = ogre.LogManager()
self.log = self.log_manager.createLog(self.main_log_filename,
True,
True,
False)
self.log_manager.setLogDetail(self.log_level)

self.root = ogre.Root('', '')

#loading plugins
for plugin in self.rendersystem_plugins + self.scenemanager_plugins:
self.root.loadPlugin(plugin)

self.root.setRenderSystem(self.root.getRenderSystemByName(

self.rendersystem))

self.render_system = self.root.getRenderSystem()

self.initializeResources()
self.root.initialise(False)

self.render_window = self.root.createRenderWindow(self.app_title,
self.window_width,

self.window_height,
self.fullscreen)

#have to be after render window creation because of material manager
#initialization
self.preloadResources()

self.setupScene()

def run(self):
ogre.WindowEventUtilities.addWindowEventListener(self.render_window,
self)

self.root.clearEventTimes()
while not self.exit:
if self.active:
self.preUpdateWorld()
self.updateWorld()
self.postUpdateWorld()
self.exit = self.exit or not self.root.renderOneFrame()
ogre.WindowEventUtilities.messagePump()

def preUpdateWorld(self):
pass

def updateWorld(self):
pass

def postUpdateWorld(self):
pass

def initializeResources(self):
pass

def preloadResources(self):
pass

def setupScene(self):
pass

def windowClosed(self, render_window):
self.exit = True

def windowFocusChange(self, render_window):
self.active = render_window.isVisible() and render_window.isActive()

def cleanup(self):

ogre.WindowEventUtilities.removeWindowEventListener(self.render_window,
self)

del self.render_window
del self.root


if __name__ == '__main__':
try:
app = Application()
app.initialize()
app.run()
app.cleanup()
except ogre.OgreException, e:
print e


Attaching file just in case. So just commenting out __metaclass__ line
makes it work again - with __metaclass__ it says about wrong C++
signature. Why?
Thanks in advance.

--
Best regards,
Aleh Arol
app.py
Reply all
Reply to author
Forward
0 new messages