// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { printf("Press key '1', '2', or '3' to toggle the light sources.\n"); // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowUnrecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->setSize( 800, 800 ); gwin->init(); // Create the shader material OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1f, 0.1f, 0.1f, 1.0f)); matc->setDiffuse(OSG::Color4f(0.3f, 0.3f, 0.3f, 1.0f)); matc->setSpecular(OSG::Color4f(0.8f, 0.8f, 0.8f, 1.0f)); matc->setShininess(100); matc->setLit(true); OSG::ShaderProgramChunkUnrecPtr shl = OSG::ShaderProgramChunk::create(); OSG::ShaderProgramUnrecPtr shl_vp = OSG::ShaderProgram::createVertexShader(); shl_vp->setProgram(_vp_program); shl->addShader(shl_vp); OSG::ShaderProgramUnrecPtr shl_fp = OSG::ShaderProgram::createFragmentShader(); shl_fp->setProgram(_fp_program); shl->addShader(shl_fp); shl_vp->addProceduralVariable ("Light0Active", &light0Active); shl_vp->addProceduralVariable ("Light1Active", &light1Active); shl_vp->addNodeProceduralVariable("Light2Active", &light2Active); cmat->addChunk(matc); cmat->addChunk(shl); // create root node _scene = OSG::Node::create(); // create two light sources. OSG::TransformUnrecPtr point1_trans; OSG::NodeUnrecPtr point1 = OSG::makeCoredNode<OSG::PointLight>(&_point1_core); point1_beacon = OSG::makeCoredNode<OSG::Transform >(&point1_trans); point1_trans->editMatrix().setTranslate(-10.0, 5.0, 5.0); _point1_core->setAmbient(0.0f, 0.0f, 0.0f , 1.0f); _point1_core->setDiffuse(1.0f, 0.0f, 0.0f, 1.0f); _point1_core->setSpecular(1.0f, 1.0f, 1.0f, 1.0f); _point1_core->setBeacon(point1_beacon); _point1_core->setOn(true); OSG::TransformUnrecPtr point2_trans; OSG::NodeUnrecPtr point2 = OSG::makeCoredNode<OSG::PointLight>(&_point2_core); point2_beacon = OSG::makeCoredNode<OSG::Transform >(&point2_trans); point2_trans->editMatrix().setTranslate(10.0, 5.0, 5.0); _point2_core->setAmbient(0.0f, 0.0f, 0.0f, 1.0f); _point2_core->setDiffuse(0.0f, 1.0f, 0.0f, 1.0f); _point2_core->setSpecular(1.0f, 1.0f, 1.0f, 1.0f); _point2_core->setBeacon(point2_beacon); _point2_core->setOn(true); point1->addChild(point2); OSG::TransformUnrecPtr point3_trans; OSG::NodeUnrecPtr point3 = OSG::makeCoredNode<OSG::PointLight>(&_point3_core); point3_beacon = OSG::makeCoredNode<OSG::Transform >(&point3_trans); point3_trans->editMatrix().setTranslate(0.0, -12.0, 5.0); _point3_core->setAmbient(0.0f, 0.0f, 0.0f, 1.0f); _point3_core->setDiffuse(0.5f, 0.0f, 1.0f, 1.0f); _point3_core->setSpecular(1.0f, 1.0f, 1.0f, 1.0f); _point3_core->setBeacon(point3_beacon); _point3_core->setOn(true); point2->addChild(point3); // create a sphere. OSG::GeometryUnrecPtr geo = OSG::makeLatLongSphereGeo (100, 100, 1.0); geo->setMaterial(cmat); OSG::NodeUnrecPtr sphere = OSG::makeNodeFor(geo); point3->addChild(sphere); _scene->setCore(OSG::Group::create()); _scene->addChild(point1); // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); _mgr->turnHeadlightOff(); // show the whole scene _mgr->showAll(); // enable local lights. // OSG::RenderAction *ract = // dynamic_cast<OSG::RenderAction *>(_mgr->getRenderAction()); // ract->setLocalLights(true); return 0; }
// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { // OSG init OSG::osgInit(argc, argv); // GLUT init glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); int winid = glutCreateWindow("OpenSG CGFX Shader"); // the connection between GLUT and OpenSG _gwin = OSG::GLUTWindow::create(); _gwin->setGlutId(winid); _gwin->setSize( 800, 800 ); _gwin->init(); // init callbacks glutSetWindow(winid); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); const char *effectFile = "blinn_bump_reflect.vinstruct.cgfx"; if(argc > 1) { effectFile = argv[1]; } _cgfxmat = OSG::CgFXMaterial::create(); _cgfxmat->setEffectFile(effectFile); // this multipass technique leads to a render bug, // I have no idea what's wrong :-( //_cgfxmat->setTechnique(1); OSG::ChunkMaterialUnrecPtr mat2 = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setDiffuse(OSG::Color4f(1, 0, 0, 1)); mat2->addChunk(matc); //mat2->addChunk(texc); // create root node _scene = OSG::Node::create(); OSG::GeometryUnrecPtr geo1 = OSG::makeLatLongSphereGeo(50, 50, 2.0f); OSG::calcVertexTangents(geo1, 0, OSG::Geometry::TexCoords6Index, OSG::Geometry::TexCoords7Index); geo1->setMaterial(_cgfxmat); OSG::NodeUnrecPtr sphere1 = OSG::Node::create(); sphere1->setCore(geo1); OSG::TransformUnrecPtr trans1 = OSG::Transform::create(); trans1->editMatrix().setTranslate(-2 , 0, 0); OSG::NodeUnrecPtr transn1 = OSG::Node::create(); transn1->setCore(trans1); transn1->addChild(sphere1); // OSG::GeometryUnrecPtr geo2 = OSG::makeLatLongSphereGeo(50, 50, 1.0f); geo2->setMaterial(mat2); OSG::NodeUnrecPtr sphere2 = OSG::Node::create(); sphere2->setCore(geo2); OSG::TransformUnrecPtr trans2 = OSG::Transform::create(); trans2->editMatrix().setTranslate(2 , 0, 0); OSG::NodeUnrecPtr transn2 = OSG::Node::create(); transn2->setCore(trans2); transn2->addChild(sphere2); _scene->setCore (OSG::Group::create()); _scene->addChild(transn1 ); _scene->addChild(transn2 ); // create the SimpleSceneManager _mgr = new OSG::SimpleSceneManager; // tell the manager what to manage _mgr->setWindow(_gwin); _mgr->setRoot(_scene); // show the whole scene _mgr->showAll(); // create a gradient background. OSG::GradientBackgroundUnrecPtr gback = OSG::GradientBackground::create(); gback->clearLines(); gback->addLine(OSG::Color3f(0.7, 0.7, 0.8), 0); gback->addLine(OSG::Color3f(0.0, 0.1, 0.3), 1); OSG::Window *win = _mgr->getWindow(); for(OSG::UInt32 i = 0; i < win->getMFPort()->size(); ++i) { OSG::Viewport *vp = win->getPort(i); vp->setBackground(gback); } return 0; }
// Initialize GLUT & OpenSG and set up the scene int main(int argc, char **argv) { printf("Usage: testCGShader [normal map filename]\n"); const char *normal_map_img_name = "opensg_logoDOT3.png"; OSG::Color4f tmp; if( argc > 1 ) normal_map_img_name = argv[1]; // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowUnrecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->setSize( 800, 800 ); gwin->init(); // Create the shader material // Read the image for the normal texture OSG::ImageUnrecPtr normal_map_img = OSG::Image::create(); if(!normal_map_img->read(normal_map_img_name)) { fprintf(stderr, "Couldn't read normalmap texture '%s'!\n", normal_map_img_name); return 1; } OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1, 0.1, 0.1, 1.0)); matc->setDiffuse(OSG::Color4f(0.3, 0.3, 0.3, 1.0)); matc->setSpecular(OSG::Color4f(0.8, 0.8, 0.8, 1.0)); matc->setShininess(100); matc->setLit(true); OSG::SHLChunkUnrecPtr shl = OSG::SHLChunk::create(); shl->setVertexProgram(_vp_program); shl->setFragmentProgram(_fp_program); OSG::TextureObjChunkUnrecPtr tex_normal_map = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr tex_normal_map_env = OSG::TextureEnvChunk::create(); tex_normal_map->setImage(normal_map_img); tex_normal_map->setMinFilter(GL_LINEAR_MIPMAP_LINEAR); tex_normal_map->setMagFilter(GL_LINEAR); tex_normal_map->setWrapS(GL_REPEAT); tex_normal_map->setWrapT(GL_REPEAT); tex_normal_map_env->setEnvMode(GL_MODULATE); //cmat->addChunk(matc); cmat->addChunk(shl); cmat->addChunk(tex_normal_map); cmat->addChunk(tex_normal_map_env); // create root node _scene = OSG::Node::create(); // create geometry //GeometryPtr geo = makeLatLongSphereGeo (100, 100, 1.0); OSG::GeometryUnrecPtr geo = OSG::makePlaneGeo(1.0, 1.0, 100, 100); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // create the SimpleSceneManager helper _mgr = new OSG::SimpleSceneManager; // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); /* // create point headlight _mgr->turnHeadlightOff(); NodePtr headlight = _mgr->getHighlight(); PointLightPtr light = PointLight::create(); beginEditCP(light); light->setAmbient (.3, .3, .3, 1); light->setDiffuse ( 1, 1, 1, 1); light->setSpecular ( 1, 1, 1, 1); light->setBeacon (_mgr->getCamera()->getBeacon()); endEditCP(light); beginEditCP(_scene); _scene->setCore(light); endEditCP(_scene); */ // show the whole scene _mgr->showAll(); // GLUT main loop glutMainLoop(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int main(int argc, char **argv) { printf("Usage: testCGShader <filename.vp> <filename.fp>\n"); if( argc < 3 ) return 0; // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowUnrecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->setSize( 800, 800 ); gwin->init(); // Create the shader material OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1, 0.1, 0.1, 1.0)); matc->setDiffuse(OSG::Color4f(0.3, 0.3, 0.3, 1.0)); matc->setSpecular(OSG::Color4f(0.8, 0.8, 0.8, 1.0)); matc->setShininess(100); matc->setLit(true); OSG::SHLChunkUnrecPtr shl = OSG::SHLChunk::create(); shl->readVertexProgram(argv[1]); shl->readFragmentProgram(argv[2]); cmat->addChunk(shl); // create root node _scene = OSG::Node::create(); // create torus OSG::GeometryUnrecPtr geo = OSG::makeTorusGeo(.8, 1.8, 128, 128); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); /* // create point headlight _mgr->turnHeadlightOff(); NodePtr headlight = _mgr->getHighlight(); PointLightPtr light = PointLight::create(); beginEditCP(light); light->setAmbient (.3, .3, .3, 1); light->setDiffuse ( 1, 1, 1, 1); light->setSpecular ( 1, 1, 1, 1); light->setBeacon (_mgr->getCamera()->getBeacon()); endEditCP(light); beginEditCP(_scene); _scene->setCore(light); endEditCP(_scene); */ // show the whole scene _mgr->showAll(); // GLUT main loop glutMainLoop(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { printf("Usage: testCGShader [normal map filename]\n"); const char *normal_map_img_name = "opensg_logoDOT3.png"; OSG::Color4f tmp; if( argc > 1 ) normal_map_img_name = argv[1]; // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowUnrecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->setSize( 800, 800 ); gwin->init(); // Create the shader material // Read the image for the normal texture OSG::ImageUnrecPtr normal_map_img = OSG::Image::create(); if(!normal_map_img->read(normal_map_img_name)) { fprintf(stderr, "Couldn't read normalmap texture '%s'!\n", normal_map_img_name); return 1; } OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1, 0.1, 0.1, 1.0)); matc->setDiffuse(OSG::Color4f(0.3, 0.3, 0.3, 1.0)); matc->setSpecular(OSG::Color4f(0.8, 0.8, 0.8, 1.0)); matc->setShininess(100); matc->setLit(true); OSG::ShaderProgramChunkUnrecPtr shl = OSG::ShaderProgramChunk::create(); OSG::ShaderProgramUnrecPtr shl_vp = OSG::ShaderProgram::createVertexShader(); shl_vp->setProgram(_vp_program); shl_vp->setProgramAttribute(OSG::ShaderConstants::TexCoordsIndex, "TexCoord0"); shl_vp->setProgramAttribute(OSG::ShaderConstants::NormalsIndex, "Normal" ); shl_vp->setProgramAttribute(OSG::ShaderConstants::PositionsIndex, "Position"); shl->addShader(shl_vp); OSG::ShaderProgramUnrecPtr shl_fp = OSG::ShaderProgram::createFragmentShader(); shl_fp->setProgram(_fp_program); shl->addShader(shl_fp); OSG::TextureObjChunkUnrecPtr tex_normal_map = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr tex_normal_map_env = OSG::TextureEnvChunk::create(); tex_normal_map->setImage(normal_map_img); tex_normal_map->setMinFilter(GL_LINEAR_MIPMAP_LINEAR); tex_normal_map->setMagFilter(GL_LINEAR); tex_normal_map->setWrapS(GL_REPEAT); tex_normal_map->setWrapT(GL_REPEAT); tex_normal_map_env->setEnvMode(GL_MODULATE); //cmat->addChunk(matc); cmat->addChunk(shl); cmat->addChunk(tex_normal_map); cmat->addChunk(tex_normal_map_env); // create root node _scene = OSG::Node::create(); // create geometry //GeometryPtr geo = makeLatLongSphereGeo (100, 100, 1.0); OSG::GeometryUnrecPtr geo = OSG::makePlaneGeo(1.0, 1.0, 100, 100); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // create the SimpleSceneManager helper _mgr = new OSG::SimpleSceneManager; // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); // show the whole scene _mgr->showAll(); return 0; }