I'm having too many problems with osgswig, which would be my preferred way of approaching this problem, since I do not have a huge need for speed. So I want to write a C++ extension specialized to my job, which works with wxPython. I think I would proceed by taking my current half-working example and translating it to C++. This code subclasses wx.glcanvas.GLcanvas and I'm not sure how to proceed. Any suggestions? The half-working example is attached.
Randolph
#!/usr/bin/env python
# import wxWidgets stuff
import wx
import wx.glcanvas
# import OpenSceneGraph wrapper
import osg
import osgUtil
import osgDB
class OSGLumView(wx.glcanvas.GLCanvas):
def __init__(self,parent,id):
wx.glcanvas.GLCanvas.__init__(self,parent,id)
sv = self.sceneview = osgUtil.SceneView()
self.rootnode = osg.MatrixTransformRef(osg.MatrixTransform())
sv.setSceneData(self.rootnode.get())
x,y = self.GetClientSize()
self.oldX = 0
self.oldY = 0
sv.setDefaults()
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
sv.init()
def AddGeom(self, geom):
self.rootnode.addChild(geom)
# Calculate bounds & set the view matrix
self.Refresh(eraseBackground = False)
def OnMouse(self, evt):
if ((evt.Dragging() == True) and (evt.LeftIsDown() == True)):
x = evt.GetX() - self.oldY
y = evt.GetY() - self.oldY
self.sceneview.setViewMatrixAsLookAt(
osg.Vec3f(0,y,x), osg.Vec3f(0,0,0), osg.Vec3f(0,1,0))
self.Refresh(eraseBackground = False)
self.oldX = evt.GetX()
self.oldY = evt.GetY()
if ((evt.Dragging() == True) and (evt.RightIsDown() == True)) :
m = self.rootnode.getMatrix()
x,y = self.GetClientSize()
rot = osg.Matrixd()
rot.makeRotate(self.oldX - evt.GetX(), osg.Vec3f(1,0,0))
m.postMult(rot)
self.Refresh(False)
self.oldX = evt.GetX()
self.oldY = evt.GetY()
def Clear(self):
self.rootnode.removeChild(0,self.rootnode.getNumChildren())
self.Refresh(eraseBackground = False)
def OnEnterWindow(self, evt):
self.SetFocus()
def OnEraseBackground(self, evt):
pass
def OnSize(self, evt):
x,y = self.GetClientSize()
self.SetCurrent()
self.sceneview.setViewport(0,0,x,y)
evt.Skip()
def OnPaint(self, evt):
if (0 == self.GetContext()) :
return
dc = wx.PaintDC(self)
self.SetCurrent()
self.sceneview.update()
self.sceneview.cull()
self.sceneview.draw()
self.SwapBuffers()