#!/usr/bin/env python # C++ source file - (C) 2003 Robert Osfield, released under the OSGPL. # # Simple example of use of Producer.RenderSurface to create an OpenGL # graphics window, and OSG for rendering. import sys from PyOSG import Producer from PyOSG import osg from PyOSG import osgDB from PyOSG import osgGA from PyOSG import osgUtil def main(argv): if len(argv)<2: print argv[0], ": requires filename argument." return 1 # load the scene. loadedModel = osgDB.readNodeFile(argv[1]) if not loadedModel: print argv[0], ": No data loaded." return 1 # create the window to draw to. renderSurface = Producer.RenderSurface() renderSurface.setWindowName("osgsimple") renderSurface.setWindowRectangle(100,100,800,600) renderSurface.useBorder(True) renderSurface.realize() # create the view of the scene. sceneView = osgUtil.SceneView() sceneView.setDefaults() sceneView.setSceneData(loadedModel) # initialize the view to look at the center of the scene graph bs = loadedModel.getBound() viewMatrix = osg.Matrix() viewMatrix.makeLookAt(bs.center()-osg.Vec3(0.0,2.0*bs.radius(),0.0),bs.center(),osg.Vec3(0.0,0.0,1.0)) # record the timer tick at the start of rendering. start_tick = osg.Timer.instance().tick() frameNum = 0 # main loop (note, window toolkits which take control over the main loop will require a window redraw callback containing the code below.) while( renderSurface.isRealized() ): # set up the frame stamp for current frame to record the current time and frame number so that animtion code can advance correctly frameStamp = osg.FrameStamp() frameStamp.setReferenceTime(osg.Timer.instance().delta_s(start_tick,osg.Timer.instance().tick())) frameStamp.setFrameNumber(frameNum) frameNum += 1 # pass frame stamp to the SceneView so that the update, cull and draw traversals all use the same FrameStamp sceneView.setFrameStamp(frameStamp) # update the viewport dimensions, incase the window has been resized. sceneView.setViewport(0,0,renderSurface.getWindowWidth(),renderSurface.getWindowHeight()) # set the view sceneView.setViewMatrix(viewMatrix) # do the update traversal the scene graph - such as updating animations sceneView.update() # do the cull traversal, collect all objects in the view frustum into a sorted set of rendering bins sceneView.cull() # draw the rendering bins. sceneView.draw() # Swap Buffers renderSurface.swapBuffers() return 0 if __name__ == "__main__": sys.exit(main(sys.argv))