#!/usr/bin/env python import sys from PyOSG import Producer from PyOSG import osg from PyOSG import osgDB from PyOSG import osgGA from PyOSG import osgUtil from PyOSG import osgProducer import OpenGL # for GL_LIGHTING # # A simple demo demonstrating different texturing modes, # including using of texture extensions. # # create quad at specified position. def createSquare(corner,width,height, image=None): # set up the Geometry. geom = osg.Geometry() coords = osg.Vec3Array(4) coords[0] = corner coords[1] = corner+width coords[2] = corner+width+height coords[3] = corner+height geom.setVertexArray(coords) norms = osg.Vec3Array(1) norms[0] = width^height norms[0].normalize() geom.setNormalArray(norms) geom.setNormalBinding(osg.Geometry.BIND_OVERALL) tcoords = osg.Vec2Array(4) tcoords[0].set(0.0,0.0); tcoords[1].set(1.0,0.0); tcoords[2].set(1.0,1.0); tcoords[3].set(0.0,1.0); geom.setTexCoordArray(0,tcoords) geom.addPrimitiveSet(osg.DrawArrays(osg.PrimitiveSet.QUADS,0,4)) if image: stateset = osg.StateSet() texture = osg.Texture2D() texture.setImage(image) stateset.setTextureAttributeAndModes(0,texture,osg.StateAttribute.ON) geom.setStateSet(stateset) return geom def createAxis(corner, xdir, ydir, zdir): # set up the Geometry. geom = osg.Geometry(); coords = osg.Vec3Array(6); coords[0] = corner; coords[1] = corner+xdir; coords[2] = corner; coords[3] = corner+ydir; coords[4] = corner; coords[5] = corner+zdir; geom.setVertexArray(coords); x_color = osg.Vec4(0.0,1.0,1.0,1.0) y_color = osg.Vec4(0.0,1.0,1.0,1.0) z_color = osg.Vec4(1.0,0.0,0.0,1.0) color = osg.Vec4Array(6); color[0] = x_color; color[1] = x_color; color[2] = y_color; color[3] = y_color; color[4] = z_color; color[5] = z_color; geom.setColorArray(color); geom.setColorBinding(osg.Geometry.BIND_PER_VERTEX); geom.addPrimitiveSet(osg.DrawArrays(osg.PrimitiveSet.LINES,0,6)); stateset = osg.StateSet(); linewidth = osg.LineWidth(); linewidth.setWidth(4.0); stateset.setAttributeAndModes(linewidth,osg.StateAttribute.ON); stateset.setMode(OpenGL.GL.GL_LIGHTING,osg.StateAttribute.OFF); geom.setStateSet(stateset); return geom def createModel(): # create the root node which will hold the model. root = osg.Group(); # add the drawable into a single goede to be shared... center = osg.Billboard(); center.setMode(osg.Billboard.POINT_ROT_EYE); center.addDrawable( createSquare(osg.Vec3(-0.5,0.0,-0.5),osg.Vec3(1.0,0.0,0.0),osg.Vec3(0.0,0.0,1.0),osgDB.readImageFile("Images/reflect.rgb")), osg.Vec3(0.0,0.0,0.0)); x_arrow = osg.Billboard(); x_arrow.setMode(osg.Billboard.AXIAL_ROT); x_arrow.setAxis(osg.Vec3(1.0,0.0,0.0)); x_arrow.setNormal(osg.Vec3(0.0,-1.0,0.0)); x_arrow.addDrawable( createSquare(osg.Vec3(-0.5,0.0,-0.5),osg.Vec3(1.0,0.0,0.0),osg.Vec3(0.0,0.0,1.0),osgDB.readImageFile("Cubemap_axis/posx.png")), osg.Vec3(5.0,0.0,0.0)); y_arrow = osg.Billboard(); y_arrow.setMode(osg.Billboard.AXIAL_ROT); y_arrow.setAxis(osg.Vec3(0.0,1.0,0.0)); y_arrow.setNormal(osg.Vec3(1.0,0.0,0.0)); y_arrow.addDrawable( createSquare(osg.Vec3(0.0,-0.5,-0.5),osg.Vec3(0.0,1.0,0.0),osg.Vec3(0.0,0.0,1.0),osgDB.readImageFile("Cubemap_axis/posy.png")), osg.Vec3(0.0,5.0,0.0)); z_arrow = osg.Billboard(); z_arrow.setMode(osg.Billboard.AXIAL_ROT); z_arrow.setAxis(osg.Vec3(0.0,0.0,1.0)); z_arrow.setNormal(osg.Vec3(0.0,-1.0,0.0)); z_arrow.addDrawable( createSquare(osg.Vec3(-0.5,0.0,-0.5),osg.Vec3(1.0,0.0,0.0),osg.Vec3(0.0,0.0,1.0),osgDB.readImageFile("Cubemap_axis/posz.png")), osg.Vec3(0.0,0.0,5.0)) axis = osg.Geode() axis.addDrawable(createAxis(osg.Vec3(0.0,0.0,0.0),osg.Vec3(5.0,0.0,0.0),osg.Vec3(0.0,5.0,0.0),osg.Vec3(0.0,0.0,5.0))); root.addChild(center) root.addChild(x_arrow) root.addChild(y_arrow) root.addChild(z_arrow) root.addChild(axis) return root def main(argv): # use an ArgumentParser object to manage the program arguments. arguments = osg.ArgumentParser(argv) # set up the usage document, in case we need to print out how to use this program. arguments.getApplicationUsage().setDescription(arguments.getApplicationName()+" is the example which demonstrates use billboard nodes."); arguments.getApplicationUsage().setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...") arguments.getApplicationUsage().addCommandLineOption("-h or --help","Display this information") # construct the viewer. viewer = osgProducer.Viewer(arguments) # set up the value with sensible default event handlers. viewer.setUpViewer(osgProducer.Viewer.STANDARD_SETTINGS) # get details on keyboard and mouse bindings used by the viewer. viewer.getUsage(arguments.getApplicationUsage()) # if user request help write it out to cout. if arguments.read("-h") or arguments.read("--help"): arguments.getApplicationUsage().write() return 1 # any option left unread are converted into errors to write out later. arguments.reportRemainingOptionsAsUnrecognized() # report any errors if they have occured when parsing the program aguments. if arguments.errors(): arguments.writeErrorMessages() return 1 # create a model from the images. rootNode = createModel() # add a viewport to the viewer and attach the scene graph. viewer.setSceneData(rootNode) # create the windows and run the threads. viewer.realize() while not viewer.done(): # wait for all cull and draw threads to complete. viewer.sync() # update the scene by traversing it with the the update visitor which will # call all node update callbacks and animations. viewer.update() # fire off the cull and draw traversals of the scene. viewer.frame() # wait for all cull and draw threads to complete before exit. viewer.sync() return 0 if __name__ == "__main__": main(sys.argv)