Writing an OpenSceneGraph extension to work with wxPython

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()