Hikari/NxOgre with Python-Ogre[and a third error!]

Jedimace1

18-11-2008 16:57:57

I am having a few problems trying to make my own Hikari app in Python-Ogre. I got it to the point where it renders, but it won't show my mouse. The flash movie is displaying fine, but my mouse isn't. I followed the demos to try to do what they did, but it doesn't work. Any ideas on how to show the mouse? Code:
Application.py:
import ogre.renderer.OGRE as ogre
import ogre.io.OIS as OIS
#import ogre.physics.NxOgre as nxogre
import ogre.gui.CEGUI as CEGUI
import ogre.gui.hikari as Hikari
import SampleFramework as sf
import os

class AppFrameListener(ogre.FrameListener, OIS.MouseListener, OIS.KeyListener):

def __init__(self, app, keyboard, mouse, joystick, hikariMgr):
OIS.KeyListener.__init__(self)
OIS.MouseListener.__init__(self)
ogre.FrameListener.__init__(self)
self.keyboard = keyboard
self.mouse = mouse
self.joystick = joystick
self.app = app
self.hikariMgr = hikariMgr
self.mouse.setEventCallback(self)
self.MenuMode = True
self.keyboard.setEventCallback(self)

def frameStarted(self, event):
self.keyboard.capture()
self.joystick.capture()
self.mouse.capture()
return1 = self.app.updateInput()
self.hikariMgr.update()
return not self.keyboard.isKeyDown(OIS.KC_ESCAPE) and return1

def mouseMoved(self,arg):
state= arg.get_state()
return self.app.hikariMgr.injectMouseMove(state.X.abs, state.Y.abs) or self.app.hikariMgr.injectMouseWheel(state.Z.rel)

def mousePressed(self, arg, id):
return self.app.hikariMgr.injectMouseDown(id)

def mouseReleased(self, arg, id):
return self.app.hikariMgr.injectMouseUp(id)

def keyPressed( self, arg):
if self.app.hikariMgr.isAnyFocused():
return True
return False

def _inputSystemParameters (self ):
if os.name == 'nt':
print "NT"
return [("w32_mouse","DISCL_FOREGROUND"), ("w32_mouse", "DISCL_NONEXCLUSIVE")]
else:
return [("x11_mouse_grab","false"), ("x11_mouse_hide", "false")] ## untested

class Application(object):

def go(self, title):
self.createRoot()
self.defineResources()
self.setupRenderSystem()
self.createRenderWindow(title)
self.initializeResourceGroups()
self.setupPreScene()
self.setupScene()
self.setupInputSystem()
self.setupGUI()
self.createFrameListener()
self.startRenderLoop()
self.cleanUp()

def createRoot(self):
self.root = ogre.Root()

def defineResources(self):
cf = ogre.ConfigFile()
cf.load("resources.cfg")
seci = cf.getSectionIterator()
while seci.hasMoreElements():
secName = seci.peekNextKey()
settings = seci.getNext()
for item in settings:
typeName = item.key
archName = item.value
ogre.ResourceGroupManager.getSingleton().addResourceLocation(archName, typeName, secName)

def setupRenderSystem(self):
if not self.root.restoreConfig() and not self.root.showConfigDialog():
raise Exception("User canceled the config dialog! -> Application.setupRenderSystem()")

def createRenderWindow(self, title):
self.root.initialise(True, title)

def initializeResourceGroups(self):
ogre.TextureManager.getSingleton().setDefaultNumMipmaps(5)
ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups()

def setupPreScene(self):
#self.world = nxogre.World("time-controller: ogre")
self.hikariMgr = Hikari.HikariManager(".\\")
self.sceneMgr = self.root.createSceneManager(ogre.ST_GENERIC, "Default SceneManager")
self.camera = self.sceneMgr.createCamera("Camera")
self.camera.setPosition(ogre.Vector3(0, 0, 500))
self.camera.lookAt(ogre.Vector3(0, 0, -300))
self.camera.NearClipDistance = 5
self.viewport = self.root.getAutoCreatedWindow().addViewport(self.camera)
self.sceneMgr.setShadowTechnique(ogre.SHADOWTYPE_TEXTURE_ADDITIVE)

def setupScene(self):
return True

def setupInputSystem(self):
windowHandle = 0
renderWindow = self.root.getAutoCreatedWindow()
windowHandle = renderWindow.getCustomAttributeInt("WINDOW")
paramList = [("WINDOW", str(windowHandle))]
self.inputManager = OIS.createPythonInputSystem(paramList)
try:
self.keyboard = self.inputManager.createInputObjectKeyboard(OIS.OISKeyboard, False)
self.mouse = self.inputManager.createInputObjectMouse(OIS.OISMouse, False)
self.joystick = self.inputManager.createInputObjectJoyStick(OIS.OISJoyStick, False)
except Exception, e:
raise e

def setupGUI(self):
self.renderer = CEGUI.OgreCEGUIRenderer(self.root.getAutoCreatedWindow(), ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.root.getSceneManager("Default SceneManager"))
self.system = CEGUI.System(self.renderer)

def createFrameListener(self):
self.appFrameListener = AppFrameListener(self, self.keyboard, self.mouse, self.joystick, self.hikariMgr)
self.root.addFrameListener(self.appFrameListener)

def startRenderLoop(self):
self.root.startRendering()

def updateInput(self):
return True

def cleanUp(self):
self.inputManager.destroyInputObjectKeyboard(self.keyboard)
self.inputManager.destroyInputObjectMouse(self.mouse)
self.inputManager.destroyInputObjectJoyStick(self.joystick)
OIS.InputManager.destroyInputSystem(self.inputManager)
self.inputManager = None
del self.renderer
del self.system
del self.viewport
del self.camera
del self.sceneMgr
del self.hikariMgr
del self.appFrameListener
del self.exitListener
del self.root

Test.py:
import ogre.renderer.OGRE as ogre
import ogre.gui.hikari as Hikari
import Application as app

class App(app.Application):
def setupScene(self):
sceneMgr = self.sceneMgr
sceneMgr.ambientLight = (1.0, 1.0, 1.0)
ent1 = sceneMgr.createEntity ('Robot', 'ninja.mesh')
node1 = sceneMgr.getRootSceneNode().createChildSceneNode ('RobotNode')
node1.attachObject (ent1)
control = self.hikariMgr.createFlashOverlay("myControl", self.viewport, 350, 400, Hikari.Position(Hikari.Center))
control.load("controls.swf")
control.setTransparent(True, True)
control.bind("opacityChange", self, "onOpacityChange")
control.bind("colorChange", self, "onColorChange")

def onOpacityChange(self, caller, args):
opacityPercent = args[0].getNumber()
caller.setOpacity(opacityPercent / 100)
return Hikari.FlashValue()

def onColorChange(self, caller, args):
color = args[0].getNumberAsColor()
self.viewport.setBackgroundColour(color)
return Hikari.FlashValue()

if __name__ == '__main__':
try:
import psyco
psyco.full()
except ImportError:
pass
try:
ta = App()
ta.go("Test Window")
except ogre.OgreException, e:
print e

Also, as you can see there is some commented NxOgre code. When I use that code, I get a error that makes no sense. Here is the error:
Traceback (most recent call last):
File "C:\Projects\EmberStudiosPython\Test.py", line 3, in <module>
import Application as app
File "C:\Projects\EmberStudiosPython\Application.py", line 3, in <module>
import ogre.physics.NxOgre as nxogre
File "C:\Python25\lib\site-packages\ogre\physics\NxOgre\__init__.py", line 4, in <module>
from _nxogre_ import *
TypeError: No to_python (by-value) converter found for C++ type: enum NxForceMode

Thanks for any help.

-Jedimace1

andy

18-11-2008 23:23:33

You need to import the PhysX library before you import NxOgre which is what is giving you the error (I believe) .. Not sure about the mouse issue..

Andy

dermont

19-11-2008 04:49:20

Take a look at SampleFrameWork (sf_OIS.py) FrameListener._setupInput() it automatically calls FrameListener._inputSystemParameters() to extend the OIS system parameters.

Any class that inherits from the SampleFrameWork FrameListener can override the _inputSystemParameters() method as the Hikari demo does.

Since your not using the SampleFramework you need to manually call _inputSystemParameters, eg:


class Application(object):
...


def _inputSystemParameters (self ):
if os.name == 'nt':
print "NT"
return [("w32_mouse","DISCL_FOREGROUND"), ("w32_mouse", "DISCL_NONEXCLUSIVE")]
else:
return [("x11_mouse_grab","false"), ("x11_mouse_hide", "false")] ## untested

def setupInputSystem(self):
windowHandle = 0
renderWindow = self.root.getAutoCreatedWindow()
windowHandle = renderWindow.getCustomAttributeInt("WINDOW")
t= self._inputSystemParameters()
paramList = [("WINDOW", str(windowHandle))]
paramList.extend(t)
self.inputManager = OIS.createPythonInputSystem(paramList)
try:
## Note buffered mouse and key
self.keyboard = self.inputManager.createInputObjectKeyboard(OIS.OISKeyboard, True)
self.mouse = self.inputManager.createInputObjectMouse(OIS.OISMouse,True)
self.joystick = self.inputManager.createInputObjectJoyStick(OIS.OISJoyStick, True)
except Exception, e:
raise e

Jedimace1

19-11-2008 08:28:47

Thank you!!! I can finally continue my work!

Jedimace1

19-11-2008 08:46:38

Wow, I have 2 more problems. First thing is, Hikari is not taking input now. The mouse shows(yay!), but it won't sense clicks. Finally, NxOgre still doesn't want to work. The error is different, so importing PhysX(imported before NxOgre) helped, but this is the error I get:
Traceback (most recent call last):
File "C:\Projects\EmberStudiosPython\Test.py", line 68, in <module>
ta.go("Test Window")
File "C:\Projects\EmberStudiosPython\Application.py", line 63, in go
self.setupPreScene()
File "C:\Projects\EmberStudiosPython\Application.py", line 98, in setupPreScene
self.world = nxogre.World("time-controller: ogre")
ArgumentError: Python argument types in
World.__init__(World, str)
did not match C++ signature:
__init__(struct _object *)
__init__(struct _object *, class NxOgre::PhysXParams arg0=<ogre.physics.NxOgre._nxogre_.PhysXParams object at 0x076DD810>)
__init__(struct _object *, class NxOgre::PhysXParams arg0=<ogre.physics.NxOgre._nxogre_.PhysXParams object at 0x076DD810>, bool loadResources=True)

Thanks for any more help, sorry to be having all these weird problems!

Jedimace1

19-11-2008 08:53:52

I want to use unbuffered and buffered input. I am, at the moment, only using un-buffered input, but I need both. Maybe this has something to do with Hikari input. Hikari doesn't take input. I have already changed to un-buffered input, but I want to do both types of input. How do I go about this?

dermont

19-11-2008 09:45:36

Your problem with mouse clicks is probably due to:

a) You haven't set buffered mouse input.

b) You haven't set the initial mouse state, you can do this using a ogre.WindowEventListener, take a look at sf_OIS.py


class FrameListener(ogre.FrameListener, ogre.WindowEventListener):
"""A default frame listener, which takes care of basic mouse and keyboard
input."""

def __init__(self, renderWindow, camera, bufferedKeys = False, bufferedMouse = False, bufferedJoy = False):
ogre.FrameListener.__init__(self)
ogre.WindowEventListener.__init__(self)
....

def _setupInput(self):
....

#Set initial mouse clipping size
self.windowResized(self.renderWindow)
#Register as a Window listener
ogre.WindowEventUtilities.addWindowEventListener(self.renderWindow, self);

dermont

19-11-2008 10:13:21


I want to use unbuffered and buffered input. I am, at the moment, only using un-buffered input, but I need both. Maybe this has something to do with Hikari input. Hikari doesn't take input. I have already changed to un-buffered input, but I want to do both types of input. How do I go about this?

http://www.ogre3d.org/phpBB2/viewtopic. ... 6f4e2718c6

andy

19-11-2008 10:36:41

I'd suggest that you use OgreOde as your physics engine at least until we get some demos written for NxOgre..

That way you can focus on the end result as NxOgre is still a tad bleeding and may have issues...

Andy

Jedimace1

19-11-2008 11:44:01

Ok, I'll switch to OgreOde and follow that post you sent.

Jedimace1

19-11-2008 12:28:13

Now I get this error:
Traceback (most recent call last):
File "C:\Projects\EmberStudiosPython\Test.py", line 89, in <module>
ta.go("Test Window")
File "C:\Projects\EmberStudiosPython\Application.py", line 63, in go
self.startRenderLoop()
File "C:\Projects\EmberStudiosPython\Application.py", line 129, in startRenderLoop
self.root.startRendering()
File "C:\Projects\EmberStudiosPython\Application.py", line 24, in frameStarted
return1 = self.app.updateInput(event)
File "C:\Projects\EmberStudiosPython\Test.py", line 11, in updateInput
self.keyboard.capture()
TypeError: 'NoneType' object is not callable

All I did was set the keyboard, mouse, and joystick classes to be buffered.

dermont

19-11-2008 14:46:11

http://www.ogre3d.org/phpBB2addons/view ... e+callable

Jedimace1

19-11-2008 14:49:48

Exactly what I needed!

Jedimace1

19-11-2008 14:55:26

Except that Hikari still isn't taking in my input right! My code has changed a lot, though, so I will re-post it.
Application.py:
import ogre.renderer.OGRE as ogre
import ogre.io.OIS as OIS
import ogre.gui.CEGUI as CEGUI
import ogre.gui.hikari as Hikari
import SampleFramework as sf
import os

class AppFrameListener(ogre.FrameListener, OIS.MouseListener, OIS.KeyListener):

def __init__(self, app, keyboard, mouse, joystick, hikariMgr):
OIS.KeyListener.__init__(self)
OIS.MouseListener.__init__(self)
ogre.FrameListener.__init__(self)
self.keyboard = keyboard
self.mouse = mouse
self.joystick = joystick
self.app = app
self.hikariMgr = hikariMgr
self.mouse.setEventCallback(self)
self.MenuMode = True
self.keyboard.setEventCallback(self)

def frameStarted(self, event):
return1 = self.app.updateInput(event)
self.hikariMgr.update()
return not self.keyboard.isKeyDown(OIS.KC_ESCAPE) and return1

def mouseMoved(self,arg):
state= arg.get_state()
return self.app.hikariMgr.injectMouseMove(state.X.abs, state.Y.abs) or self.app.hikariMgr.injectMouseWheel(state.Z.rel)

def mousePressed(self, arg, id):
return self.app.hikariMgr.injectMouseDown(id)

def mouseReleased(self, arg, id):
return self.app.hikariMgr.injectMouseUp(id)

def keyPressed( self, arg):
if self.app.hikariMgr.isAnyFocused():
return True
return False
def keyReleased(self, evt):
pass

class Application(object):

def _inputSystemParameters (self ):
if os.name == 'nt':
print "NT"
return [("w32_mouse","DISCL_FOREGROUND"), ("w32_mouse", "DISCL_NONEXCLUSIVE")]
else:
return [("x11_mouse_grab","false"), ("x11_mouse_hide", "false")] ## untested

def go(self, title):
self.createRoot()
self.defineResources()
self.setupRenderSystem()
self.createRenderWindow(title)
self.initializeResourceGroups()
self.setupPreScene()
self.setupScene()
self.setupInputSystem()
self.setupGUI()
self.createFrameListener()
self.startRenderLoop()
self.cleanUp()

def createRoot(self):
self.root = ogre.Root()

def defineResources(self):
cf = ogre.ConfigFile()
cf.load("resources.cfg")
seci = cf.getSectionIterator()
while seci.hasMoreElements():
secName = seci.peekNextKey()
settings = seci.getNext()
for item in settings:
typeName = item.key
archName = item.value
ogre.ResourceGroupManager.getSingleton().addResourceLocation(archName, typeName, secName)

def setupRenderSystem(self):
if not self.root.restoreConfig() and not self.root.showConfigDialog():
raise Exception("User canceled the config dialog! -> Application.setupRenderSystem()")

def createRenderWindow(self, title):
self.root.initialise(True, title)

def initializeResourceGroups(self):
ogre.TextureManager.getSingleton().setDefaultNumMipmaps(5)
ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups()

def setupPreScene(self):
self.hikariMgr = Hikari.HikariManager(".\\")
self.sceneMgr = self.root.createSceneManager(ogre.ST_GENERIC, "Default SceneManager")
self.camera = self.sceneMgr.createCamera("Camera")
self.camera.setPosition(ogre.Vector3(0, 0, 500))
self.camera.lookAt(ogre.Vector3(0, 0, -300))
self.camera.NearClipDistance = 5
self.viewport = self.root.getAutoCreatedWindow().addViewport(self.camera)
self.sceneMgr.setShadowTechnique(ogre.SHADOWTYPE_TEXTURE_ADDITIVE)

def setupScene(self):
return True

def setupInputSystem(self):
windowHandle = 0
renderWindow = self.root.getAutoCreatedWindow()
windowHandle = renderWindow.getCustomAttributeInt("WINDOW")
t= self._inputSystemParameters()
paramList = [("WINDOW", str(windowHandle))]
paramList.extend(t)
self.inputManager = OIS.createPythonInputSystem(paramList)
try:
self.keyboard = self.inputManager.createInputObjectKeyboard(OIS.OISKeyboard, True)
self.mouse = self.inputManager.createInputObjectMouse(OIS.OISMouse, True)
self.joystick = self.inputManager.createInputObjectJoyStick(OIS.OISJoyStick, True)
except Exception, e:
raise e

def setupGUI(self):
self.renderer = CEGUI.OgreCEGUIRenderer(self.root.getAutoCreatedWindow(), ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.root.getSceneManager("Default SceneManager"))
self.system = CEGUI.System(self.renderer)

def createFrameListener(self):
self.appFrameListener = AppFrameListener(self, self.keyboard, self.mouse, self.joystick, self.hikariMgr)
self.root.addFrameListener(self.appFrameListener)

def startRenderLoop(self):
self.root.startRendering()

def updateInput(self, evt):
return True

def cleanUp(self):
self.inputManager.destroyInputObjectKeyboard(self.keyboard)
self.inputManager.destroyInputObjectMouse(self.mouse)
self.inputManager.destroyInputObjectJoyStick(self.joystick)
OIS.InputManager.destroyInputSystem(self.inputManager)
self.inputManager = None
del self.renderer
del self.system
del self.viewport
del self.camera
del self.sceneMgr
del self.hikariMgr
del self.appFrameListener
del self.root

Test.py:
import ogre.renderer.OGRE as ogre
import ogre.io.OIS as ois
import ogre.gui.hikari as Hikari
import Application as app

class App(app.Application):
def updateInput(self, evt):
self.keyboard.capture()
self.joystick.capture()
self.mouse.capture()
if(self.keyboard.isKeyDown(ois.KC_UP)):
self.playernode.translate((0,0,-.5), self.playernode.TransformSpace.TS_LOCAL)
self.walking = True
if(self.keyboard.isKeyDown(ois.KC_DOWN)):
self.playernode.translate((0,0,.5), self.playernode.TransformSpace.TS_LOCAL)
self.walking = True
if(self.keyboard.isKeyDown(ois.KC_RIGHT)):
self.playernode.yaw(-.005)
self.walking = True
if(self.keyboard.isKeyDown(ois.KC_LEFT)):
self.playernode.yaw(.005)
self.walking = True
if(not self.keyboard.isKeyDown(ois.KC_UP) and not self.keyboard.isKeyDown(ois.KC_DOWN) and not self.keyboard.isKeyDown(ois.KC_RIGHT) and not self.keyboard.isKeyDown(ois.KC_LEFT)):
self.walking = False
if(self.walking):
self.animationState = self.ent1.getAnimationState('Walk')
self.animationState.setLoop(True)
self.animationState.setEnabled(True)
self.lastwalking = True
else:
self.animationState = self.ent1.getAnimationState('Idle')
self.animationState.setLoop(True)
self.animationState.setEnabled(True)
self.laswalking = False
self.animationState.addTime(evt.timeSinceLastFrame)
return True;

def setupScene(self):
sceneMgr = self.sceneMgr
sceneMgr.ambientLight = (1.0, 1.0, 1.0)
self.ent1 = sceneMgr.createEntity ('Robot', 'robot.mesh')
self.ent2 = sceneMgr.createEntity ('Ninja', 'ninja.mesh')
self.playernode = sceneMgr.getRootSceneNode().createChildSceneNode ('PlayerNode')
self.node1 = self.playernode.createChildSceneNode ('RobotNode')
self.node1.attachObject(self.ent1)
self.node1.scale(3,3,3)
self.node1.yaw(ogre.Degree(90))
self.camnode = self.playernode.createChildSceneNode ('CameraNode')
self.camnode.attachObject(self.camera)
self.camnode.translate(0,400,0)
self.camera.lookAt(0,150,0)
self.node2 = sceneMgr.getRootSceneNode().createChildSceneNode ('NinjaNode', (100,0,100))
self.node2.attachObject(self.ent2)
self.animationState = self.ent1.getAnimationState('Idle')
self.animationState.setLoop(True)
self.animationState.setEnabled(True)
self.walking = False
self.lastwalking = False
control = self.hikariMgr.createFlashOverlay("myControl", self.viewport, 350, 400, Hikari.Position(Hikari.Center))
control.load("controls.swf")
control.setTransparent(True, True)
control.bind("opacityChange", self, "onOpacityChange")
control.bind("colorChange", self, "onColorChange")

def onOpacityChange(self, caller, args):
opacityPercent = args[0].getNumber()
caller.setOpacity(opacityPercent / 100)
return Hikari.FlashValue()

def onColorChange(self, caller, args):
color = args[0].getNumberAsColor()
self.viewport.setBackgroundColour(color)
return Hikari.FlashValue()

if __name__ == '__main__':
try:
import psyco
psyco.full()
except ImportError:
pass
try:
ta = App()
ta.go("Test Window")
except ogre.OgreException, e:
print e

dermont

19-11-2008 16:39:55

I don't see where you are setting the mouse state as stated above.

You need to create an ogre.WindowEventListener, set the mouse state(width, height) to that of the render window in the windowResized method and remove the WindowEventListener on clean up.

Do check the python ogre demos and sf_OIS.py. With the way you have structured your code it makes it difficult but it would be something like:


class AppFrameListener(ogre.FrameListener, OIS.MouseListener, OIS.KeyListener, ogre.WindowEventListener):

...
ogre.WindowEventListener.__init__(self)
renderWindow = self.app.root.getAutoCreatedWindow()
self.windowResized(renderWindow)

#Register as a Window listener
ogre.WindowEventUtilities.addWindowEventListener(renderWindow, self)

def windowResized (self, rw):
dummyint = 0
width, height, depth, left, top= rw.getMetrics(dummyint,dummyint,dummyint, dummyint, dummyint) # Note the wrapped function as default needs unsigned int's
ms = self.mouse.getMouseState()
ms.width = width
ms.height = height

class Application(object):

def cleanUp(self):
ogre.WindowEventUtilities.removeWindowEventListener(self.root.getAutoCreatedWindow(), self.appFrameListener)
...

Jedimace1

19-11-2008 16:58:21

Ok, I'll try that.

Jedimace1

20-11-2008 19:42:34

Worked!! Thanks!!!