void create3DObjects(void) { // Make Object Nodes NodeRefPtr ExampleTorusGeo = makeTorus(90, 270, 16, 16); NodeRefPtr ExampleConeGeo = makeCone(150, 50, 16, true, true); NodeRefPtr ExampleSphereGeo = makeSphere(4, 100); NodeRefPtr ExampleBoxGeo = makeBox(100, 100, 100, 1, 1, 1); // AssignTextures dynamic_cast<Geometry*>(ExampleConeGeo->getCore())->setMaterial(createBlueMaterial()); dynamic_cast<Geometry*>(ExampleSphereGeo->getCore())->setMaterial(createRedMaterial()); dynamic_cast<Geometry*>(ExampleBoxGeo->getCore())->setMaterial(createGreenMaterial()); // Preform transformations on them Matrix mat; // On Torus mat.setTranslate(0.0,100.0,-200.0); TransformRefPtr TorusTranCore = Transform::create(); TorusTranCore->setMatrix(mat); ExampleTorus = Node::create(); ExampleTorus->setCore(TorusTranCore); ExampleTorus->addChild(ExampleTorusGeo); // On Sphere mat.setTranslate(250.0,0.0,0.0); TransformRefPtr SphereTranCore = Transform::create(); SphereTranCore->setMatrix(mat); ExampleSphere = Node::create(); ExampleSphere->setCore(SphereTranCore); ExampleSphere->addChild(ExampleSphereGeo); // On Cone mat.setTranslate(0.0,0.0,-250.0); TransformRefPtr ConeTranCore = Transform::create(); ConeTranCore->setMatrix(mat); ExampleCone = Node::create(); ExampleCone->setCore(ConeTranCore); ExampleCone->addChild(ExampleConeGeo); // On Box mat.setTranslate(250.0,250.0,0.0); TransformRefPtr ExampleBoxTranCore = Transform::create(); ExampleBoxTranCore->setMatrix(mat); ExampleBox = Node::create(); ExampleBox->setCore(ExampleBoxTranCore); ExampleBox->addChild(ExampleBoxGeo); }
////////////////////////////////////////////////////////////////////////// //! build a box ////////////////////////////////////////////////////////////////////////// void buildBox(void) { Vec3f Lengths((Real32)(rand()%2)+1.0, (Real32)(rand()%2)+1.0, (Real32)(rand()%2)+1.0); Matrix m; //create OpenSG mesh GeometryRefPtr box; NodeRefPtr boxNode = makeBox(Lengths.x(), Lengths.y(), Lengths.z(), 1, 1, 1); box = dynamic_cast<Geometry*>(boxNode->getCore()); SimpleMaterialRefPtr box_mat = SimpleMaterial::create(); box_mat->setAmbient(Color3f(0.0,0.0,0.0)); box_mat->setDiffuse(Color3f(0.0,1.0 ,0.0)); box->setMaterial(box_mat); TransformRefPtr boxTrans; NodeRefPtr boxTransNode = makeCoredNode<Transform>(&boxTrans); m.setIdentity(); Real32 randX = (Real32)(rand()%10)-5.0; Real32 randY = (Real32)(rand()%10)-5.0; m.setTranslate(randX, randY, 10.0); boxTrans->setMatrix(m); //create ODE data PhysicsBodyRefPtr boxBody = PhysicsBody::create(physicsWorld); boxBody->setPosition(Vec3f(randX, randY, 10.0)); boxBody->setBoxMass(1.0, Lengths.x(), Lengths.y(), Lengths.z()); //std::cout << "mass: " << boxBody->getMass() << std::endl //<< "massCenterOfGravity: " << boxBody->getMassCenterOfGravity().x() << ", " << boxBody->getMassCenterOfGravity().y() << ", " << boxBody->getMassCenterOfGravity().z() << std::endl //<< "massInertiaTensor: " << std::endl //<< boxBody->getMassInertiaTensor()[0][0] << " "<< boxBody->getMassInertiaTensor()[0][1] << " "<< boxBody->getMassInertiaTensor()[0][2] << " " << boxBody->getMassInertiaTensor()[0][3] << std::endl //<< boxBody->getMassInertiaTensor()[1][0] << " "<< boxBody->getMassInertiaTensor()[1][1] << " "<< boxBody->getMassInertiaTensor()[1][2] << " " << boxBody->getMassInertiaTensor()[1][3] << std::endl //<< boxBody->getMassInertiaTensor()[2][0] << " "<< boxBody->getMassInertiaTensor()[2][1] << " "<< boxBody->getMassInertiaTensor()[2][2] << " " << boxBody->getMassInertiaTensor()[2][3] << std::endl //<< boxBody->getMassInertiaTensor()[3][0] << " "<< boxBody->getMassInertiaTensor()[3][1] << " "<< boxBody->getMassInertiaTensor()[3][2] << " " << boxBody->getMassInertiaTensor()[3][3] << std::endl //<< std::endl; PhysicsBoxGeomRefPtr boxGeom = PhysicsBoxGeom::create(); boxGeom->setBody(boxBody); boxGeom->setSpace(physicsSpace); boxGeom->setLengths(Lengths); //add attachments boxNode->addAttachment(boxGeom); boxTransNode->addAttachment(boxBody); boxTransNode->addChild(boxNode); //add to SceneGraph spaceGroupNode->addChild(boxTransNode); commitChanges(); }
////////////////////////////////////////////////////////////////////////// //! trimesh defined by filenode will be loaded ////////////////////////////////////////////////////////////////////////// void buildTriMesh(void) { NodeRefPtr tri = cloneTree(TriGeometryBase); if(tri!=NULL) { GeometryRefPtr triGeo = dynamic_cast<Geometry*>(tri->getCore()); Matrix m; SimpleMaterialRefPtr tri_mat = SimpleMaterial::create(); tri_mat->setAmbient(Color3f(0.1,0.1,0.2)); tri_mat->setDiffuse(Color3f(1.0,0.1,0.7)); triGeo->setMaterial(tri_mat); TransformRefPtr triTrans; NodeRefPtr triTransNode = makeCoredNode<Transform>(&triTrans); m.setIdentity(); Real32 randX = (Real32)(rand()%10)-5.0; Real32 randY = (Real32)(rand()%10)-5.0; m.setTranslate(randX, randY, 18.0); triTrans->setMatrix(m); //create ODE data Vec3f GeometryBounds(calcMinGeometryBounds(triGeo)); PhysicsBodyRefPtr triBody = PhysicsBody::create(physicsWorld); triBody->setPosition(Vec3f(randX, randY, 18.0)); triBody->setLinearDamping(0.0001); triBody->setAngularDamping(0.0001); triBody->setBoxMass(1.0,GeometryBounds.x(), GeometryBounds.y(), GeometryBounds.z()); PhysicsGeomRefPtr triGeom; if(true) { triGeom = PhysicsTriMeshGeom::create(); triGeom->setBody(triBody); //add geom to space for collision triGeom->setSpace(physicsSpace); //set the geometryNode to fill the ode-triMesh NodeRefPtr TorusGeometryNode(makeTorus(0.55, 1.05, 6, 6)); dynamic_pointer_cast<PhysicsTriMeshGeom>(triGeom)->setGeometryNode(TorusGeometryNode); } //add attachments tri->addAttachment(triGeom); triTransNode->addAttachment(triBody); //add to SceneGraph triTransNode->addChild(tri); spaceGroupNode->addChild(triTransNode); } else { SLOG << "Could not read MeshData!" << endLog; } commitChanges(); }
////////////////////////////////////////////////////////////////////////// //! build a ship ////////////////////////////////////////////////////////////////////////// PhysicsBodyRefPtr buildShip(Vec3f Dimensions, Pnt3f Position) { Real32 Radius(osgMax(Dimensions.x(), Dimensions.y())/2.0f); Real32 Length(Dimensions.z() - 2.0f*Radius); Matrix m; //create OpenSG mesh GeometryRefPtr box; NodeRefPtr boxNode = makeBox(Dimensions.x(), Dimensions.y(), Dimensions.z(), 1, 1, 1); box = dynamic_cast<Geometry*>(boxNode->getCore()); SimpleMaterialRefPtr box_mat = SimpleMaterial::create(); box_mat->setAmbient(Color3f(0.0,0.0,0.0)); box_mat->setDiffuse(Color3f(1.0,1.0 ,0.0)); box->setMaterial(box_mat); TransformRefPtr boxTrans; NodeRefPtr boxTransNode = makeCoredNode<Transform>(&boxTrans); m.setIdentity(); m.setTranslate(Position - Vec3f(0.0f,0.0f,0.5f*Dimensions.z())); boxTrans->setMatrix(m); for(UInt32 i(0) ; i<box->getPositions()->size() ; ++i) { box->getPositions()->setValue<Pnt3f>(box->getPositions()->getValue<Pnt3f>(i) + Vec3f(0.0,0.0,Dimensions.z()/2.0f),i); } //create ODE data PhysicsBodyRefPtr CapsuleBody = PhysicsBody::create(physicsWorld); CapsuleBody->setPosition(Vec3f(Position - Vec3f(0.0f,0.0f,0.5f*Dimensions.z()))); CapsuleBody->setLinearDamping(0.01); CapsuleBody->setMaxAngularSpeed(0.0); CapsuleBody->setCapsuleMass(1.0,3,Radius, Length); PhysicsCapsuleGeomRefPtr CapsuleGeom = PhysicsCapsuleGeom::create(); CapsuleGeom->setBody(CapsuleBody); CapsuleGeom->setOffsetPosition(Vec3f(0.0f,0.0f,0.5f*Dimensions.z())); CapsuleGeom->setSpace(hashSpace); CapsuleGeom->setRadius(Radius); CapsuleGeom->setLength(Length); //add attachments boxNode->addAttachment(CapsuleGeom); boxTransNode->addAttachment(CapsuleBody); boxTransNode->addChild(boxNode); //add to SceneGraph spaceGroupNode->addChild(boxTransNode); commitChanges(); return CapsuleBody; }
////////////////////////////////////////////////////////////////////////// //! build a character ////////////////////////////////////////////////////////////////////////// PhysicsBodyRefPtr buildCharacter(Vec3f Dimensions, Pnt3f Position, Node* const spaceGroupNode, PhysicsWorld* const physicsWorld, PhysicsHashSpace* const physicsSpace ) { Real32 Radius(osgMax(Dimensions.x(), Dimensions.y())/2.0f); Real32 Length(Dimensions.z() - 2.0f*Radius); Matrix m; //create OpenSG mesh GeometryRefPtr box; //NodeRefPtr characterNode = makeBox(Dimensions.x(), Dimensions.y(), Dimensions.z(), 1, 1, 1); NodeRefPtr characterNode = SceneFileHandler::the()->read("Data/Jack.osb"); if(characterNode == NULL) { characterNode = makeBox(Dimensions.x(), Dimensions.y(), Dimensions.z(), 1, 1, 1); } box = dynamic_cast<Geometry*>(characterNode->getCore()); TransformRefPtr boxTrans; NodeRefPtr boxTransNode = makeCoredNode<Transform>(&boxTrans); m.setIdentity(); m.setTranslate(Position); boxTrans->setMatrix(m); //create ODE data PhysicsBodyRefPtr boxBody = PhysicsBody::create(physicsWorld); boxBody->setPosition(Vec3f(Position)); //boxBody->setLinearDamping(0.001); //boxBody->setAngularDamping(0.001); boxBody->setMaxAngularSpeed(0.0); boxBody->setCapsuleMass(1.0,3,Radius, Length); PhysicsCapsuleGeomRefPtr CapsuleGeom = PhysicsCapsuleGeom::create(); CapsuleGeom->setBody(boxBody); CapsuleGeom->setSpace(physicsSpace); CapsuleGeom->setRadius(Radius); CapsuleGeom->setLength(Length); //add attachments characterNode->addAttachment(CapsuleGeom); boxTransNode->addAttachment(boxBody); boxTransNode->addChild(characterNode); //add to SceneGraph spaceGroupNode->addChild(boxTransNode); commitChanges(); return boxBody; }
////////////////////////////////////////////////////////////////////////// //! build a sphere ////////////////////////////////////////////////////////////////////////// void buildSphere(void) { Real32 Radius((Real32)(rand()%2)*0.5+0.5); Matrix m; //create OpenSG mesh GeometryRefPtr sphere; NodeRefPtr sphereNode = makeSphere(2, Radius); sphere = dynamic_cast<Geometry*>(sphereNode->getCore()); SimpleMaterialRefPtr sphere_mat = SimpleMaterial::create(); sphere_mat->setAmbient(Color3f(0.0,0.0,0.0)); sphere_mat->setDiffuse(Color3f(0.0,0.0,1.0)); sphere->setMaterial(sphere_mat); TransformRefPtr sphereTrans; NodeRefPtr sphereTransNode = makeCoredNode<Transform>(&sphereTrans); m.setIdentity(); Real32 randX = (Real32)(rand()%10)-5.0; Real32 randY = (Real32)(rand()%10)-5.0; m.setTranslate(randX, randY, 10.0); sphereTrans->setMatrix(m); //create ODE data PhysicsBodyRefPtr sphereBody = PhysicsBody::create(physicsWorld); sphereBody->setPosition(Vec3f(randX, randY, 10.0)); sphereBody->setAngularDamping(0.0001); sphereBody->setSphereMass(1.0,Radius); PhysicsSphereGeomRefPtr sphereGeom = PhysicsSphereGeom::create(); sphereGeom->setBody(sphereBody); sphereGeom->setSpace(physicsSpace); sphereGeom->setRadius(Radius); //add attachments sphereNode->addAttachment(sphereGeom); sphereTransNode->addAttachment(sphereBody); sphereTransNode->addChild(sphereNode); //add to SceneGraph spaceGroupNode->addChild(sphereTransNode); commitChanges(); }
////////////////////////////////////////////////////////////////////////// //! build a box ////////////////////////////////////////////////////////////////////////// PhysicsBodyRefPtr buildBox(Vec3f Dimensions, Pnt3f Position) { Matrix m; //create OpenSG mesh GeometryRefPtr box; NodeRefPtr boxNode = makeBox(Dimensions.x(), Dimensions.y(), Dimensions.z(), 1, 1, 1); box = dynamic_cast<Geometry*>(boxNode->getCore()); SimpleMaterialRefPtr box_mat = SimpleMaterial::create(); box_mat->setAmbient(Color3f(0.0,0.0,0.0)); box_mat->setDiffuse(Color3f(0.0,1.0 ,1.0)); box->setMaterial(box_mat); TransformRefPtr boxTrans; NodeRefPtr boxTransNode = makeCoredNode<Transform>(&boxTrans); m.setIdentity(); m.setTranslate(Position); boxTrans->setMatrix(m); //create ODE data PhysicsBodyRefPtr boxBody = PhysicsBody::create(physicsWorld); boxBody->setPosition(Vec3f(Position)); boxBody->setLinearDamping(0.001); boxBody->setAngularDamping(0.001); boxBody->setBoxMass(1.0,Dimensions.x(), Dimensions.y(), Dimensions.z()); PhysicsBoxGeomRefPtr boxGeom = PhysicsBoxGeom::create(); boxGeom->setBody(boxBody); boxGeom->setSpace(hashSpace); boxGeom->setLengths(Dimensions); //add attachments boxNode->addAttachment(boxGeom); boxTransNode->addAttachment(boxBody); boxTransNode->addChild(boxNode); //add to SceneGraph spaceGroupNode->addChild(boxTransNode); commitChanges(); return boxBody; }
int main(int argc, char **argv) { // OSG init osgInit(argc,argv); // Set up Window TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); TutorialWindow->setDisplayCallback(display); TutorialWindow->setReshapeCallback(reshape); TutorialKeyListener TheKeyListener; TutorialWindow->addKeyListener(&TheKeyListener); TutorialMouseListener TheTutorialMouseListener; TutorialMouseMotionListener TheTutorialMouseMotionListener; TutorialWindow->addMouseListener(&TheTutorialMouseListener); TutorialWindow->addMouseMotionListener(&TheTutorialMouseMotionListener); // Create the SimpleSceneManager helper mgr = new SimpleSceneManager; // Tell the Manager what to manage mgr->setWindow(TutorialWindow); //Particle System Material TextureObjChunkRefPtr QuadTextureObjChunk = TextureObjChunk::create(); ImageRefPtr LoadedImage = ImageFileHandler::the()->read("Data/Cloud.png"); QuadTextureObjChunk->setImage(LoadedImage); TextureEnvChunkRefPtr QuadTextureEnvChunk = TextureEnvChunk::create(); QuadTextureEnvChunk->setEnvMode(GL_MODULATE); BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); MaterialChunkRefPtr PSMaterialChunk = MaterialChunk::create(); PSMaterialChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(QuadTextureObjChunk); PSMaterial->addChunk(QuadTextureEnvChunk); PSMaterial->addChunk(PSMaterialChunk); PSMaterial->addChunk(PSBlendChunk); //Affector ExampleAgeSizeParticleAffector = OSG::AgeSizeParticleAffector::create(); //ages ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.0); ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.05); ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.2); ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.36); ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.7); ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.8); ExampleAgeSizeParticleAffector->editMFAges()->push_back(1.0); //sizes ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(1.0,0.5,1.0)); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(1.0,0.5,1.0)); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(20.0,0.5,30.0)); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(3.0,3.0,3.0)); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(6.0,60.0,6.0)); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.0,3.0,1.0)); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(10.0,1.0,10.0)); //Particle System ExampleParticleSystem = OSG::ParticleSystem::create(); ExampleParticleSystem->attachUpdateListener(TutorialWindow); ExampleParticleSystem->pushToAffectors(ExampleAgeSizeParticleAffector); //Particle System Drawer ExampleParticleSystemDrawer = OSG::QuadParticleSystemDrawer::create(); ExampleBurstGenerator = OSG::BurstParticleGenerator::create(); //Attach the function objects to the Generator ExampleBurstGenerator->setPositionDistribution(createPositionDistribution()); ExampleBurstGenerator->setLifespanDistribution(createLifespanDistribution()); ExampleBurstGenerator->setBurstAmount(10.0); ExampleBurstGenerator->setVelocityDistribution(createVelocityDistribution()); //ExampleBurstGenerator->setAccelerationDistribution(createAccelerationDistribution()); ExampleBurstGenerator->setSizeDistribution(createSizeDistribution()); //Particle System Node ParticleSystemCoreRefPtr ParticleNodeCore = OSG::ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); NodeRefPtr ParticleNode = OSG::Node::create(); ParticleNode->setCore(ParticleNodeCore); //Ground Node NodeRefPtr GoundNode = makePlane(30.0,30.0,10,10); Matrix GroundTransformation; GroundTransformation.setRotate(Quaternion(Vec3f(1.0f,0.0,0.0), -3.14195f)); TransformRefPtr GroundTransformCore = Transform::create(); GroundTransformCore->setMatrix(GroundTransformation); NodeRefPtr GroundTransformNode = Node::create(); GroundTransformNode->setCore(GroundTransformCore); GroundTransformNode->addChild(GoundNode); // Make Main Scene Node and add the Torus NodeRefPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); scene->addChild(ParticleNode); scene->addChild(GroundTransformNode); mgr->setRoot(scene); // Show the whole Scene mgr->showAll(); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "07AgeSizeParticleAffector"); //Enter main Loop TutorialWindow->mainLoop(); osgExit(); return 0; }
// Initialize GLUT & OpenSG and set up the rootNode int main(int argc, char **argv) { // OSG init osgInit(argc,argv); { // Set up Window WindowEventProducerRecPtr TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); // Create the SimpleSceneManager helper SimpleSceneManager sceneManager; TutorialWindow->setDisplayCallback(boost::bind(display, &sceneManager)); TutorialWindow->setReshapeCallback(boost::bind(reshape, _1, &sceneManager)); // Tell the Manager what to manage sceneManager.setWindow(TutorialWindow); //Attach to events TutorialWindow->connectMousePressed(boost::bind(mousePressed, _1, &sceneManager)); TutorialWindow->connectMouseReleased(boost::bind(mouseReleased, _1, &sceneManager)); TutorialWindow->connectMouseMoved(boost::bind(mouseMoved, _1, &sceneManager)); TutorialWindow->connectMouseDragged(boost::bind(mouseDragged, _1, &sceneManager)); TutorialWindow->connectMouseWheelMoved(boost::bind(mouseWheelMoved, _1, &sceneManager)); TutorialWindow->connectKeyReleased(boost::bind(keyReleased, _1)); //Make Main Scene Node NodeRefPtr scene = makeCoredNode<Group>(); setName(scene, "scene"); NodeRecPtr rootNode = Node::create(); setName(rootNode, "rootNode"); ComponentTransformRefPtr Trans = ComponentTransform::create(); rootNode->setCore(Trans); rootNode->addChild(scene); //Light Beacon Matrix LightTransformMat; LightTransformMat.setTranslate(Vec3f(50.0,0.0,100.0)); TransformRefPtr LightTransform = Transform::create(); LightTransform->setMatrix(LightTransformMat); NodeRefPtr TutorialLightBeacon = Node::create(); TutorialLightBeacon->setCore(LightTransform); //Light Node PointLightRefPtr TutorialLight = PointLight::create(); TutorialLight->setBeacon(TutorialLightBeacon); NodeRefPtr TutorialLightNode = Node::create(); TutorialLightNode->setCore(TutorialLight); scene->addChild(TutorialLightNode); scene->addChild(TutorialLightBeacon); //Setup Physics Scene PhysicsWorldRecPtr physicsWorld = PhysicsWorld::create(); physicsWorld->setWorldContactSurfaceLayer(0.005); physicsWorld->setAutoDisableFlag(1); physicsWorld->setAutoDisableTime(0.75); physicsWorld->setWorldContactMaxCorrectingVel(100.0); physicsWorld->setGravity(Vec3f(0.0, 0.0, -9.81)); PhysicsHashSpaceRecPtr physicsSpace = PhysicsHashSpace::create(); //Setup the default collision parameters CollisionContactParametersRefPtr DefaultCollisionParams = CollisionContactParameters::createEmpty(); DefaultCollisionParams->setMode(dContactApprox1); DefaultCollisionParams->setMu(1.0); DefaultCollisionParams->setMu2(0.0); DefaultCollisionParams->setBounce(0.0); DefaultCollisionParams->setBounceSpeedThreshold(0.0); DefaultCollisionParams->setSoftCFM(0.1); DefaultCollisionParams->setSoftERP(0.2); DefaultCollisionParams->setMotion1(0.0); DefaultCollisionParams->setMotion2(0.0); DefaultCollisionParams->setMotionN(0.0); DefaultCollisionParams->setSlip1(0.0); DefaultCollisionParams->setSlip2(0.0); physicsSpace->setDefaultCollisionParameters(DefaultCollisionParams); PhysicsHandlerRecPtr physHandler = PhysicsHandler::create(); physHandler->setWorld(physicsWorld); physHandler->pushToSpaces(physicsSpace); physHandler->setUpdateNode(rootNode); physHandler->attachUpdateProducer(TutorialWindow); rootNode->addAttachment(physHandler); rootNode->addAttachment(physicsWorld); rootNode->addAttachment(physicsSpace); /************************************************************************/ /* create spaces, geoms and bodys */ /************************************************************************/ //create a group for our space GroupRefPtr spaceGroup; NodeRecPtr spaceGroupNode = makeCoredNode<Group>(&spaceGroup); //create the ground terrain GeometryRefPtr TerrainGeo = buildTerrain(Vec2f(400.0,400.0),25,25); //and its Material SimpleMaterialRefPtr TerrainMat = SimpleMaterial::create(); TerrainMat->setAmbient(Color3f(0.3,0.5,0.3)); TerrainMat->setDiffuse(Color3f(0.5,0.9,0.5)); TerrainGeo->setMaterial(TerrainMat); NodeRefPtr TerrainNode = Node::create(); TerrainNode->setCore(TerrainGeo); //create ODE data PhysicsGeomRefPtr TerrainODEGeom = PhysicsTriMeshGeom::create(); //add geom to space for collision TerrainODEGeom->setSpace(physicsSpace); //set the geometryNode to fill the ode-triMesh dynamic_pointer_cast<PhysicsTriMeshGeom>(TerrainODEGeom)->setGeometryNode(TerrainNode); //add attachments //add Attachments to nodes... spaceGroupNode->addAttachment(physicsSpace); spaceGroupNode->addChild(TerrainNode); TerrainNode->addAttachment(TerrainODEGeom); TutorialLightNode->addChild(spaceGroupNode); //Create Character PhysicsBodyRefPtr CharacterPhysicsBody = buildCharacter(Vec3f(5.0,5.0,10.0), Pnt3f((Real32)(rand()%100)-50.0,(Real32)(rand()%100)-50.0,25.0), spaceGroupNode, physicsWorld, physicsSpace); PhysicsLMotorJointRefPtr CharacterMover = buildMover(CharacterPhysicsBody); TutorialWindow->connectKeyPressed(boost::bind(keyPressed, _1, spaceGroupNode.get(), physicsWorld.get(), physicsSpace.get())); TutorialWindow->connectUpdate(boost::bind(handleUpdate, _1, CharacterPhysicsBody.get(), CharacterMover.get())); // tell the manager what to manage sceneManager.setRoot (rootNode); // show the whole rootNode sceneManager.showAll(); Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "03CharacterTerrain"); //Enter main Loop TutorialWindow->mainLoop(); } osgExit(); return 0; }
int main(int argc, char **argv) { preloadSharedObject("OSGImageFileIO"); // OSG init osgInit(argc,argv); { // Set up Window WindowEventProducerRecPtr TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); // Create the SimpleSceneManager helper SimpleSceneManager sceneManager; TutorialWindow->setDisplayCallback(boost::bind(display, &sceneManager)); TutorialWindow->setReshapeCallback(boost::bind(reshape, _1, &sceneManager)); // Tell the Manager what to manage sceneManager.setWindow(TutorialWindow); //Attach to events TutorialWindow->connectMouseReleased(boost::bind(mouseReleased, _1, &sceneManager)); TutorialWindow->connectMouseDragged(boost::bind(mouseDragged, _1, &sceneManager)); TutorialWindow->connectMouseWheelMoved(boost::bind(mouseWheelMoved, _1, &sceneManager)); TutorialWindow->connectKeyTyped(boost::bind(keyTyped, _1, &sceneManager)); //Particle System Material //point material PointChunkRefPtr PSPointChunk = PointChunk::create(); PSPointChunk->setSize(5.0f); PSPointChunk->setSmooth(true); BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); MaterialChunkRefPtr PSMaterialChunkChunk = MaterialChunk::create(); PSMaterialChunkChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunkChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunkChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunkChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSPointMaterial = ChunkMaterial::create(); PSPointMaterial->addChunk(PSPointChunk); PSPointMaterial->addChunk(PSMaterialChunkChunk); PSPointMaterial->addChunk(PSBlendChunk); //smoke material TextureObjChunkRefPtr QuadTextureObjChunk = TextureObjChunk::create(); ImageRefPtr LoadedImage = ImageFileHandler::the()->read("Data/Smoke.png"); QuadTextureObjChunk->setImage(LoadedImage); TextureEnvChunkRefPtr QuadTextureEnvChunk = TextureEnvChunk::create(); QuadTextureEnvChunk->setEnvMode(GL_MODULATE); MaterialChunkRefPtr PSMaterialChunk = MaterialChunk::create(); PSMaterialChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSSmokeMaterial = ChunkMaterial::create(); PSSmokeMaterial->addChunk(QuadTextureObjChunk); PSSmokeMaterial->addChunk(PSMaterialChunk); PSSmokeMaterial->addChunk(PSBlendChunk); PSSmokeMaterial->addChunk(QuadTextureEnvChunk); //Particle System //Rocket ParticleSystemRecPtr RocketParticleSystem = ParticleSystem::create(); RocketParticleSystem->attachUpdateProducer(TutorialWindow); //smoke ParticleSystemRecPtr SmokeParticleSystem = ParticleSystem::create(); SmokeParticleSystem->attachUpdateProducer(TutorialWindow); //Shrapnel ParticleSystemRecPtr ShrapnelParticleSystem = ParticleSystem::create(); ShrapnelParticleSystem->attachUpdateProducer(TutorialWindow); //Fireball ParticleSystemRecPtr FireballParticleSystem = ParticleSystem::create(); FireballParticleSystem->attachUpdateProducer(TutorialWindow); //Particle System Drawer //Rocket does not have a drawer because it is being attached to a special node core //Smoke QuadParticleSystemDrawerRecPtr SmokeParticleSystemDrawer = QuadParticleSystemDrawer::create(); //SmokeParticleSystemDrawer->setQuadSizeScaling(Vec2f(0.5f,0.5f)); //Shrapnel PointParticleSystemDrawerRecPtr ExampleShrapnelParticleSystemDrawer = PointParticleSystemDrawer::create(); ExampleShrapnelParticleSystemDrawer->setForcePerParticleSizing(true); //Fireball PointParticleSystemDrawerRecPtr ExampleFireballParticleSystemDrawer = PointParticleSystemDrawer::create(); ExampleFireballParticleSystemDrawer->setForcePerParticleSizing(true); //Particle System Node //collision node //NodeRefPtr EnvironmentNode = makeSphere(2,4.0f); Matrix EnvironmentTransformation; EnvironmentTransformation.setTranslate(0.0f,0.0f,10.0f); TransformRefPtr EnvironmentTransformCore = Transform::create(); EnvironmentTransformCore->setMatrix(EnvironmentTransformation); NodeRefPtr EnvironmentNode = Node::create(); EnvironmentNode->setCore(EnvironmentTransformCore); NodeRefPtr EnvironmentGeoNode = SceneFileHandler::the()->read("Data/house.obj"); if(EnvironmentGeoNode == NULL) { EnvironmentGeoNode = makeTorus(.5, 2, 16, 16); } EnvironmentNode->addChild(EnvironmentGeoNode); NodeRefPtr RocketParticlePrototypeNode = SceneFileHandler::the()->read("Data/rocket.obj"); if(RocketParticlePrototypeNode == NULL) { RocketParticlePrototypeNode = makeTorus(.2, 0.8, 16, 16); } NodeParticleSystemCoreRefPtr RocketParticleNodeCore = NodeParticleSystemCore::create(); RocketParticleNodeCore->setSystem(RocketParticleSystem); RocketParticleNodeCore->setPrototypeNode(RocketParticlePrototypeNode); RocketParticleNodeCore->setNormalSource(NodeParticleSystemCore::NORMAL_VELOCITY); RocketParticleNodeCore->setUpSource(NodeParticleSystemCore::UP_PARTICLE_NORMAL); RocketParticleNodeCore->setUp(Vec3f(0.0f,1.0f,0.0f)); //Geometry Collision Affector GeometryCollisionParticleSystemAffectorRefPtr ExampleGeometryCollisionParticleSystemAffector = GeometryCollisionParticleSystemAffector::create(); ExampleGeometryCollisionParticleSystemAffector->setCollisionNode(EnvironmentNode); ExampleGeometryCollisionParticleSystemAffector->connectParticleCollision(boost::bind(particleCollision, _1)); NodeRefPtr RocketParticleNode = Node::create(); RocketParticleNode->setCore(RocketParticleNodeCore); //Attach the Affector to the Rocket Particle System //RocketParticleSystem->pushToAffectors(); RocketParticleSystem->pushToSystemAffectors(ExampleGeometryCollisionParticleSystemAffector); //Smoke RateParticleGeneratorRecPtr SmokeGenerator = RateParticleGenerator::create(); //Attach the function objects to the Generator Distribution3DRefPtr SmokePositionDistribution = createSmokePositionDistribution(); SmokeGenerator->setPositionDistribution(SmokePositionDistribution); SmokeGenerator->setLifespanDistribution(createSmokeLifespanDistribution()); SmokeGenerator->setGenerationRate(50.0); SmokeGenerator->setVelocityDistribution(createSmokeVelocityDistribution()); //Attach the function objects the Affectors AgeFadeParticleAffectorRecPtr SmokeAgeFadeParticleAffector = AgeFadeParticleAffector::create(); SmokeAgeFadeParticleAffector->setFadeInTime(2.0f); SmokeAgeFadeParticleAffector->setFadeOutTime(5.0f); SmokeAgeFadeParticleAffector->setStartAlpha(0.0f); SmokeAgeFadeParticleAffector->setFadeToAlpha(0.2f); SmokeAgeFadeParticleAffector->setEndAlpha(0.0f); AgeSizeParticleAffectorRecPtr SmokeAgeSizeParticleAffector = AgeSizeParticleAffector::create(); //ages SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.1); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.2); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.3); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.5); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.7); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.8); SmokeAgeSizeParticleAffector->editMFAges()->push_back(1.0); //sizes SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(0.5,0.5,0.5)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(1.0,1.0,1.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.0,2.0,2.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(3.0,3.0,3.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(4.0,4.0,4.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(5.0,5.0,5.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(6.5,6.5,6.5)); ParticleSystemCoreRefPtr SmokeParticleNodeCore = ParticleSystemCore::create(); SmokeParticleNodeCore->setSystem(SmokeParticleSystem); SmokeParticleNodeCore->setDrawer(SmokeParticleSystemDrawer); SmokeParticleNodeCore->setMaterial(PSSmokeMaterial); NodeRefPtr SmokeParticleNode = Node::create(); SmokeParticleNode->setCore(SmokeParticleNodeCore); //end///////////////////// //Shrapnel BurstParticleGeneratorRecPtr ShrapnelBurstGenerator = BurstParticleGenerator::create(); NodeRefPtr ShrapnelParticlePrototypeNode = SceneFileHandler::the()->read("Data/Shrapnel.obj"); NodeParticleSystemCoreRefPtr ShrapnelParticleNodeCore = NodeParticleSystemCore::create(); ShrapnelParticleNodeCore->setSystem(ShrapnelParticleSystem); ShrapnelParticleNodeCore->setPrototypeNode(ShrapnelParticlePrototypeNode); //Attach the function objects to the Generator Distribution3DRefPtr ShrapnelPositionDistribution = createShrapnelPositionDistribution(); ShrapnelBurstGenerator->setPositionDistribution(ShrapnelPositionDistribution); ShrapnelBurstGenerator->setLifespanDistribution(createLifespanDistribution()); ShrapnelBurstGenerator->setBurstAmount(50.0); ShrapnelBurstGenerator->setVelocityDistribution(createShrapnelVelocityDistribution()); ShrapnelBurstGenerator->setAccelerationDistribution(createShrapnelAccelerationDistribution()); NodeRefPtr ShrapnelParticleNode = Node::create(); ShrapnelParticleNode->setCore(ShrapnelParticleNodeCore); //end///////////////////// //fireball BurstParticleGeneratorRecPtr FireballGenerator = BurstParticleGenerator::create(); NodeRefPtr FireballParticlePrototypeNode = SceneFileHandler::the()->read("Data/bubble.obj"); NodeParticleSystemCoreRefPtr FireballParticleNodeCore = NodeParticleSystemCore::create(); FireballParticleNodeCore->setSystem(FireballParticleSystem); FireballParticleNodeCore->setPrototypeNode(FireballParticlePrototypeNode); //Attach the function objects to the Generator Distribution3DRefPtr FireballPositionDistribution = createFireballPositionDistribution(); FireballGenerator->setPositionDistribution(FireballPositionDistribution); FireballGenerator->setLifespanDistribution(createFireballLifespanDistribution()); FireballGenerator->setBurstAmount(100.0); FireballGenerator->setVelocityDistribution(createFireballVelocityDistribution()); FireballGenerator->setAccelerationDistribution(createFireballAccelerationDistribution()); //Attach the function objects the Affectors AgeSizeParticleAffectorRecPtr FireballAgeSizeParticleAffector = AgeSizeParticleAffector::create(); //ages FireballAgeSizeParticleAffector->editMFAges()->push_back(0.1); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.2); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.3); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.5); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.7); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.8); FireballAgeSizeParticleAffector->editMFAges()->push_back(1.0); //sizes FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.0,2.0,2.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.3,2.3,2.3)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.5,2.5,2.5)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(3.0,3.0,3.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(4.0,4.0,4.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(5.0,5.0,5.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(6.5,6.5,6.5)); NodeRefPtr FireballParticleNode = Node::create(); FireballParticleNode->setCore(FireballParticleNodeCore); //end///////////////////// //Attach the Affector to the Smoke Particle System SmokeParticleSystem->pushToAffectors(SmokeAgeFadeParticleAffector); SmokeParticleSystem->pushToAffectors(SmokeAgeSizeParticleAffector); //Attach the Affector to the fireball Particle System FireballParticleSystem->pushToAffectors(FireballAgeSizeParticleAffector); // Make Main Scene Node NodeRefPtr scene = Node::create(); scene->setCore(Group::create()); scene->addChild(RocketParticleNode); scene->addChild(SmokeParticleNode); scene->addChild(ShrapnelParticleNode); scene->addChild(FireballParticleNode); scene->addChild(EnvironmentNode); RocketParticleSystem->connectParticleKilled(boost::bind(particleKilled, _1, ShrapnelParticleSystem.get(), ShrapnelBurstGenerator.get(), SmokeParticleSystem.get(), SmokeGenerator.get(), FireballParticleSystem.get(), FireballGenerator.get())); TutorialWindow->connectMousePressed(boost::bind(mousePressed, _1, &sceneManager, RocketParticleSystem.get())); sceneManager.setRoot(scene); //Create the Documentation SimpleScreenDoc TheSimpleScreenDoc(&sceneManager, TutorialWindow); sceneManager.getNavigator()->set(Pnt3f(0.0,0.0,-10.0), Pnt3f(0.0,0.0,0.0), Vec3f(0.0,1.0,0.0)); sceneManager.getNavigator()->setMotionFactor(1.0f); sceneManager.getCamera()->setNear(0.1f); sceneManager.getCamera()->setFar(1000.0f); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "20RocketLauncher"); //Enter main Loop TutorialWindow->mainLoop(); } osgExit(); return 0; }
int main(int argc, char **argv) { // OSG init osgInit(argc,argv); // Set up Window TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); TutorialWindow->setDisplayCallback(display); TutorialWindow->setReshapeCallback(reshape); TutorialKeyListener TheKeyListener; TutorialWindow->addKeyListener(&TheKeyListener); TutorialMouseListener TheTutorialMouseListener; TutorialMouseMotionListener TheTutorialMouseMotionListener; TutorialWindow->addMouseListener(&TheTutorialMouseListener); TutorialWindow->addMouseMotionListener(&TheTutorialMouseMotionListener); // Create the SimpleSceneManager helper mgr = new SimpleSceneManager; // Tell the Manager what to manage mgr->setWindow(TutorialWindow); BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); //Particle System Material MaterialChunkRefPtr PSMaterialChunkChunk = MaterialChunk::create(); PSMaterialChunkChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunkChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunkChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunkChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(PSMaterialChunkChunk); PSMaterial->addChunk(PSBlendChunk); Distribution3DRefPtr PositionDistribution = createPositionDistribution(); Pnt3f PositionReturnValue; //Particle System ParticleSystemRefPtr ExampleParticleSystem = OSG::ParticleSystem::create(); for(UInt32 i(0) ; i<800 ; ++i)//controls how many particles are created { if(PositionDistribution != NULL) { PositionReturnValue = Pnt3f(PositionDistribution->generate()); } ExampleParticleSystem->addParticle( PositionReturnValue, Vec3f(0.0f,0.0f,1.0f), Color4f(1.0,0.0,0.0,1.0), Vec3f(10.0,10.0,10.0), -1, Vec3f(0.0f,0.0f,0.0f), //Velocity Vec3f(0.0f,0.0f,0.0f) //acceleration ); } ExampleParticleSystem->attachUpdateListener(TutorialWindow); //Particle System Drawer DiscParticleSystemDrawerRefPtr ExampleParticleSystemDrawer = OSG::DiscParticleSystemDrawer::create(); ExampleParticleSystemDrawer->setSegments(16); ExampleParticleSystemDrawer->setCenterAlpha(1.0); ExampleParticleSystemDrawer->setEdgeAlpha(0.0); //Particle System Node ParticleSystemCoreRefPtr ParticleNodeCore = OSG::ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); NodeRefPtr ParticleNode = OSG::Node::create(); ParticleNode->setCore(ParticleNodeCore); //AttractionNode TransformRefPtr AttractionCore = OSG::Transform::create(); Matrix AttractTransform; AttractTransform.setTranslate(0.0f, 0.0,0.0); AttractionCore->setMatrix(AttractTransform); NodeRefPtr AttractionNode = OSG::Node::create(); AttractionNode->setCore(AttractionCore); // Make Main Scene Node and add the Torus NodeRefPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); scene->addChild(ParticleNode); scene->addChild(AttractionNode); mgr->setRoot(scene); // Show the whole Scene //mgr->showAll(); mgr->getNavigator()->set(Pnt3f(0.0,0.0,500.0), Pnt3f(0.0,0.0,0.0), Vec3f(0.0,1.0,0.0)); mgr->getNavigator()->setMotionFactor(1.0f); mgr->getCamera()->setNear(0.1f); mgr->getCamera()->setFar(1000.0f); DistanceAttractRepelParticleAffectorRefPtr ExampleDistanceAttractRepelParticleAffector = OSG::DistanceAttractRepelParticleAffector::create(); ExampleDistanceAttractRepelParticleAffector->setMinDistance(0.0); ExampleDistanceAttractRepelParticleAffector->setMaxDistance(1000.0); ExampleDistanceAttractRepelParticleAffector->setQuadratic(0.0); ExampleDistanceAttractRepelParticleAffector->setLinear(100.0); ExampleDistanceAttractRepelParticleAffector->setConstant(0.0); ExampleDistanceAttractRepelParticleAffector->setParticleSystemNode(ParticleNode); ExampleDistanceAttractRepelParticleAffector->setDistanceFromSource(DistanceAttractRepelParticleAffector::DISTANCE_FROM_NODE); ExampleDistanceAttractRepelParticleAffector->setDistanceFromNode(AttractionNode); ExampleParticleSystem->pushToAffectors(ExampleDistanceAttractRepelParticleAffector); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "11DistanceAttractRepelParticleAffector"); //Enter main Loop TutorialWindow->mainLoop(); osgExit(); return 0; }
int main(int argc, char **argv) { // OSG init osgInit(argc,argv); { // Set up Window WindowEventProducerRecPtr TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); // Create the SimpleSceneManager helper SimpleSceneManager sceneManager; TutorialWindow->setDisplayCallback(boost::bind(display, &sceneManager)); TutorialWindow->setReshapeCallback(boost::bind(reshape, _1, &sceneManager)); // Tell the Manager what to manage sceneManager.setWindow(TutorialWindow); //Attach to events TutorialWindow->connectMousePressed(boost::bind(mousePressed, _1, &sceneManager)); TutorialWindow->connectMouseReleased(boost::bind(mouseReleased, _1, &sceneManager)); TutorialWindow->connectMouseDragged(boost::bind(mouseDragged, _1, &sceneManager)); TutorialWindow->connectMouseWheelMoved(boost::bind(mouseWheelMoved, _1, &sceneManager)); //Particle System Material TextureObjChunkRefPtr QuadTextureChunk = TextureObjChunk::create(); ImageRefPtr LoadedImage = ImageFileHandler::the()->read("Data/Cloud.png"); QuadTextureChunk->setImage(LoadedImage); TextureEnvChunkRefPtr QuadTextureEnvChunk = TextureEnvChunk::create(); QuadTextureEnvChunk->setEnvMode(GL_MODULATE); BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); MaterialChunkRefPtr PSMaterialChunk = MaterialChunk::create(); PSMaterialChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(QuadTextureChunk); PSMaterial->addChunk(QuadTextureEnvChunk); PSMaterial->addChunk(PSMaterialChunk); PSMaterial->addChunk(PSBlendChunk); //Particle System ParticleSystemRecPtr ExampleParticleSystem = ParticleSystem::create(); ExampleParticleSystem->attachUpdateProducer(TutorialWindow); //Particle System Drawer QuadParticleSystemDrawerRefPtr ExampleParticleSystemDrawer = QuadParticleSystemDrawer::create(); BurstParticleGeneratorRecPtr ExampleBurstGenerator = BurstParticleGenerator::create(); //Attach the function objects to the Generator ExampleBurstGenerator->setPositionDistribution(createPositionDistribution()); ExampleBurstGenerator->setLifespanDistribution(createLifespanDistribution()); ExampleBurstGenerator->setBurstAmount(50.0); ExampleBurstGenerator->setVelocityDistribution(createVelocityDistribution()); ExampleBurstGenerator->setAccelerationDistribution(createAccelerationDistribution()); ExampleBurstGenerator->setSizeDistribution(createSizeDistribution()); //Particle System Node ParticleSystemCoreRefPtr ParticleNodeCore = ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); NodeRefPtr ParticleNode = Node::create(); ParticleNode->setCore(ParticleNodeCore); //Ground Node NodeRefPtr GoundNode = makePlane(30.0,30.0,10,10); Matrix GroundTransformation; GroundTransformation.setRotate(Quaternion(Vec3f(1.0f,0.0,0.0), -3.14195f)); TransformRefPtr GroundTransformCore = Transform::create(); GroundTransformCore->setMatrix(GroundTransformation); NodeRefPtr GroundTransformNode = Node::create(); GroundTransformNode->setCore(GroundTransformCore); GroundTransformNode->addChild(GoundNode); // Make Main Scene Node and add the Torus NodeRefPtr scene = Node::create(); scene->setCore(Group::create()); scene->addChild(ParticleNode); scene->addChild(GroundTransformNode); TutorialWindow->connectKeyTyped(boost::bind(keyTyped, _1, &sceneManager, ExampleParticleSystem.get(), ExampleBurstGenerator.get(), ExampleParticleSystemDrawer.get())); sceneManager.setRoot(scene); //Create the Documentation SimpleScreenDoc TheSimpleScreenDoc(&sceneManager, TutorialWindow); // Show the whole Scene sceneManager.showAll(); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "05QuadParticleDrawer"); //Enter main Loop TutorialWindow->mainLoop(); } osgExit(); return 0; }
void ApplicationStartScreen::attachApplication(void) { Inherited::attachApplication(); //Camera Transformation Node Matrix CameraTransformMatrix; CameraTransformMatrix.setTranslate(0.0f,0.0f, 5.0f); TransformRefPtr CameraBeaconTransform = Transform::create(); CameraBeaconTransform->setMatrix(CameraTransformMatrix); NodeRefPtr CameraBeaconNode = Node::create(); CameraBeaconNode->setCore(CameraBeaconTransform); // Make Torus Node (creates Torus in background of scene) NodeRefPtr TorusGeometryNode = NULL; //BoostPath TorusKnotFile(MainApplication::the()->getSettings()->getDataDirectory() / std::string("Models") / std::string("TorusKnot.osb")); //SLOG << "Loading Torus Knot from: " << TorusKnotFile.string() << std::endl; //if(boost::filesystem::exists(TorusKnotFile)) //{ //TorusGeometryNode = SceneFileHandler::the()->read(TorusKnotFile.native_file_string().c_str()); //} //if(TorusGeometryNode == NULL) //{ //SWARNING << "Could not load Torus Knot from: " //<< TorusKnotFile.string() << " because this file doesn't exist." << std::endl; TorusGeometryNode = makeTorus(.5, 2, 64, 64); //} //Scene Transformation TransformRefPtr SceneTransformCore = Transform::create(); NodeRefPtr SceneTransformNode = Node::create(); SceneTransformNode->setCore(SceneTransformCore); SceneTransformNode->addChild(TorusGeometryNode); //Light NodeRefPtr LightBeaconNode = Node::create(); LightBeaconNode->setCore(Transform::create()); DirectionalLightRefPtr SceneLightCore = DirectionalLight::create(); SceneLightCore->setDirection(1.0,0.0,0.0); SceneLightCore->setBeacon(LightBeaconNode); NodeRefPtr SceneLightNode = Node::create(); SceneLightNode->setCore(SceneLightCore); SceneLightNode->addChild(SceneTransformNode); // Make Main Scene Node and add the Torus NodeRefPtr DefaultRootNode = OSG::Node::create(); DefaultRootNode->setCore(OSG::Group::create()); DefaultRootNode->addChild(CameraBeaconNode); DefaultRootNode->addChild(SceneLightNode); DefaultRootNode->addChild(LightBeaconNode); //Camera PerspectiveCameraRefPtr DefaultCamera = PerspectiveCamera::create(); DefaultCamera->setBeacon(CameraBeaconNode); DefaultCamera->setFov (osgDegree2Rad(60.f)); DefaultCamera->setNear (0.1f); DefaultCamera->setFar (10000.f); //Background GradientBackgroundRefPtr DefaultBackground = GradientBackground::create(); DefaultBackground->addLine(Color3f(0.0f,0.0f,0.0f), 0.0f); DefaultBackground->addLine(Color3f(0.0f,0.0f,0.5f), 1.0f); //Animation //KeyFrames KeyframeTransformationSequenceRefPtr TransformationKeyframes = KeyframeTransformationSequenceMatrix4f::create(); OSG::Matrix TempMat; TransformationKeyframes->addKeyframe(TempMat,0.0f); TempMat.setRotate(Quaternion(Vec3f(0.0f,1.0f,0.0f), 3.14159f*0.5)); TransformationKeyframes->addKeyframe(TempMat,4.0f); TempMat.setRotate(Quaternion(Vec3f(0.0f,1.0f,0.0f), 3.14159f*1.0)); TransformationKeyframes->addKeyframe(TempMat,8.0f); TempMat.setRotate(Quaternion(Vec3f(0.0f,1.0f,0.0f), 3.14159f*1.5)); TransformationKeyframes->addKeyframe(TempMat,12.0f); TempMat.setRotate(Quaternion(Vec3f(0.0f,1.0f,0.0f), 0.0f)); TransformationKeyframes->addKeyframe(TempMat,16.0f); //Animator KeyframeAnimatorRefPtr TorusAnimator = OSG::KeyframeAnimator::create(); TorusAnimator->setKeyframeSequence(TransformationKeyframes); //Animation _TorusAnimation = FieldAnimation::create(); _TorusAnimation->setAnimator(TorusAnimator); _TorusAnimation->setInterpolationType(Animator::LINEAR_INTERPOLATION); _TorusAnimation->setCycling(-1); _TorusAnimation->setAnimatedField(SceneTransformCore, std::string("matrix")); _TorusAnimation->attachUpdateProducer(MainApplication::the()->getMainWindow()->editEventProducer()); _TorusAnimation->start(); //Foreground //ImageForegroundRefPtr LogoForeground = ImageForeground::create(); //BoostPath LogoPath(MainApplication::the()->getSettings()->getDataDirectory() / "Images/Logo.png"); //ImageRefPtr LoadedImage = ImageFileHandler::the().read(LogoPath.string().c_str()); // LogoForeground->addImage( LoadedImage, Pnt2f( 0,0 ) ); ForegroundRefPtr UserInterfaceForeground = createInterface(); _TheUIDrawingSurface->setEventProducer(MainApplication::the()->getMainWindow()); if(MainApplication::the()->getMainWindow() != NULL && MainApplication::the()->getMainWindow()->getMFPort()->size() == 0) { ViewportRefPtr DefaultViewport = Viewport::create(); DefaultViewport->setCamera (DefaultCamera); DefaultViewport->setRoot (DefaultRootNode); DefaultViewport->setSize (0.0f,0.0f, 1.0f,1.0f); DefaultViewport->setBackground (DefaultBackground); DefaultViewport->addForeground (UserInterfaceForeground); MainApplication::the()->getMainWindow()->addPort(DefaultViewport); } MainApplication::the()->getMainWindow()->addKeyListener(&_StartScreenKeyListener); MainApplication::the()->getMainWindow()->addUpdateListener(&_ScreenUpdateListener); }
int main(int argc, char **argv) { // OSG init osgInit(argc,argv); { // Set up Window WindowEventProducerRecPtr TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); // Create the SimpleSceneManager helper SimpleSceneManager sceneManager; TutorialWindow->setDisplayCallback(boost::bind(display, &sceneManager)); TutorialWindow->setReshapeCallback(boost::bind(reshape, _1, &sceneManager)); // Tell the Manager what to manage sceneManager.setWindow(TutorialWindow); //Attach to events TutorialWindow->connectMousePressed(boost::bind(mousePressed, _1, &sceneManager)); TutorialWindow->connectMouseReleased(boost::bind(mouseReleased, _1, &sceneManager)); TutorialWindow->connectMouseMoved(boost::bind(mouseMoved, _1, &sceneManager)); TutorialWindow->connectMouseDragged(boost::bind(mouseDragged, _1, &sceneManager)); TutorialWindow->connectMouseWheelMoved(boost::bind(mouseWheelMoved, _1, &sceneManager)); //Particle System Material PointChunkRefPtr PSPointChunk = PointChunk::create(); PSPointChunk->setSize(20.0f); PSPointChunk->setSmooth(true); BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); MaterialChunkRefPtr PSMaterialChunkChunk = MaterialChunk::create(); PSMaterialChunkChunk->setAmbient(Color4f(0.2f,0.6f,0.5f,0.3f)); PSMaterialChunkChunk->setDiffuse(Color4f(0.2f,0.9f,0.1f,0.3f)); PSMaterialChunkChunk->setSpecular(Color4f(0.5f,0.4f,0.2f,0.6f)); PSMaterialChunkChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); //enable depth test DepthChunkRefPtr PSDepthChunk = DepthChunk::create(); ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(PSPointChunk); PSMaterial->addChunk(PSMaterialChunkChunk); PSMaterial->addChunk(PSBlendChunk); PSMaterial->addChunk(PSDepthChunk); LineChunkRefPtr PSLineChunk = LineChunk::create(); ChunkMaterialRefPtr TestMaterial = ChunkMaterial::create(); //TestMaterial->addChunk(PointChunk::create()); //TestMaterial->addChunk(LineChunk::create()); TestMaterial->addChunk(PSMaterialChunkChunk); PolygonChunkRefPtr ThePolygonChunk = PolygonChunk::create(); BlendChunkRefPtr TheBlendChunk = BlendChunk::create(); DepthChunkRefPtr TheDepthChunk = DepthChunk::create(); TestMaterial->addChunk(ThePolygonChunk); TestMaterial->addChunk(TheBlendChunk); TestMaterial->addChunk(TheDepthChunk); //Particle System ParticleSystemRecPtr ExampleParticleSystem = ParticleSystem::create(); ExampleParticleSystem->attachUpdateProducer(TutorialWindow); ExampleParticleSystem->addParticle(Pnt3f(-40.0,0.0,0.0), Vec3f(0.0,1.0,0.0), Color4f(1.0,1.0,1.0,1.0), Vec3f(1.0,1.0,1.0), -1, Vec3f(0.0,0.0,0.0), Vec3f(0.0,0.0,0.0)); ExampleParticleSystem->addParticle(Pnt3f(40.0,0.0,0.0), Vec3f(0.0,1.0,0.0), Color4f(1.0,1.0,1.0,1.0), Vec3f(1.0,1.0,1.0), -1, Vec3f(0.0,0.0,0.0), Vec3f(0.0,0.0,0.0)); PointParticleSystemDrawerRecPtr ExamplePointParticleSystemDrawer = PointParticleSystemDrawer::create(); ExamplePointParticleSystemDrawer->setForcePerParticleSizing(false); Matrix ExampleMatrix; ExampleMatrix.setTransform(Vec3f(10.0,10.0,10.0)); TransformRefPtr ExampleXform = Transform::create(); ExampleXform->setMatrix(ExampleMatrix); NodeRefPtr ExampleNode = Node::create(); ExampleNode->setCore(ExampleXform); RateParticleGeneratorRecPtr ExampleGenerator = RateParticleGenerator::create(); // ExampleGenerator->setEmitInWorldSpace(true); ExampleGenerator->setBeacon(ExampleNode); ExampleGenerator->setGenerationRate(5.0); ExampleGenerator->setPositionDistribution(createPositionDistribution()); ExampleGenerator->setLifespanDistribution(createLifespanDistribution()); NewtonParticleAffectorRefPtr ExampleAffector = NewtonParticleAffector::create(); ExampleAffector->setBeacon(ExampleNode); ExampleAffector->setMaxDistance(-1.0); ConditionalParticleAffectorRecPtr ExampleConditionalAffector = ConditionalParticleAffector::create(); ExampleConditionalAffector->setConditionalAttribute("active"); ExampleConditionalAffector->setConditionalOperator(4); //greater than ExampleConditionalAffector->setConditionalValue(0); // testing if the value associated with "test" = 1 ExampleConditionalAffector->pushToAffectors(ExampleAffector); DistanceAttractRepelParticleAffectorRefPtr ExampleAttractRepelAffector = DistanceAttractRepelParticleAffector::create(); ExampleAttractRepelAffector->setDistanceFromSource(DistanceParticleAffector::DISTANCE_FROM_NODE); //Attach the Generators and affectors to the Particle System ExampleParticleSystem->setBeacon(ExampleNode); //ExampleParticleSystem->pushToGenerators(ExampleGenerator); ExampleParticleSystem->pushToAffectors(ExampleConditionalAffector); // ExampleParticleSystem->pushToAffectors(ExampleAttractRepelAffector); ExampleParticleSystem->setMaxParticles(1000); ExampleParticleSystem->setDynamic(true); //Particle System Core ParticleSystemCoreRecPtr ParticleNodeCore = ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExamplePointParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); ParticleNodeCore->setSortingMode(ParticleSystemCore::BACK_TO_FRONT); NodeRefPtr PSNode = Node::create(); PSNode->setCore(ParticleNodeCore); // Make Main Scene Node and add the Torus NodeRefPtr scene = Node::create(); scene->setCore(Group::create()); scene->addChild(PSNode); TutorialWindow->connectKeyTyped(boost::bind(keyTyped, _1, &sceneManager, ParticleNodeCore.get(), ExamplePointParticleSystemDrawer.get(), ExampleParticleSystem.get(), ExampleConditionalAffector.get())); sceneManager.setRoot(scene); // Show the whole Scene sceneManager.showAll(); sceneManager.getCamera()->setFar(1000.0); sceneManager.getCamera()->setNear(0.10); FCFileType::FCPtrStore Containers; Containers.insert(scene); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "16FullTest"); //Enter main Loop TutorialWindow->mainLoop(); } osgExit(); return 0; }
int main(int argc, char **argv) { // OSG init osgInit(argc,argv); // Set up Window TutorialWindow = createNativeWindow(); TutorialWindow->initWindow(); TutorialWindow->setDisplayCallback(display); TutorialWindow->setReshapeCallback(reshape); TutorialKeyListener TheKeyListener; TutorialWindow->addKeyListener(&TheKeyListener); TutorialMouseListener TheTutorialMouseListener; TutorialMouseMotionListener TheTutorialMouseMotionListener; TutorialWindow->addMouseListener(&TheTutorialMouseListener); TutorialWindow->addMouseMotionListener(&TheTutorialMouseMotionListener); // Create the SimpleSceneManager helper mgr = new SimpleSceneManager; // Tell the Manager what to manage mgr->setWindow(TutorialWindow); //Particle System Material //point material PointChunkRefPtr PSPointChunk = PointChunk::create(); PSPointChunk->setSize(5.0f); PSPointChunk->setSmooth(true); BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); MaterialChunkRefPtr PSMaterialChunkChunk = MaterialChunk::create(); PSMaterialChunkChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunkChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunkChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunkChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSPointMaterial = ChunkMaterial::create(); PSPointMaterial->addChunk(PSPointChunk); PSPointMaterial->addChunk(PSMaterialChunkChunk); PSPointMaterial->addChunk(PSBlendChunk); //smoke material TextureObjChunkRefPtr QuadTextureObjChunk = TextureObjChunk::create(); ImageRefPtr LoadedImage = ImageFileHandler::the()->read("Data/Checker.jpg"); QuadTextureObjChunk->setImage(LoadedImage); TextureEnvChunkRefPtr QuadTextureEnvChunk = TextureEnvChunk::create(); QuadTextureEnvChunk->setEnvMode(GL_MODULATE); MaterialChunkRefPtr PSMaterialChunk = MaterialChunk::create(); PSMaterialChunk->setAmbient(Color4f(0.3f,0.3f,0.3f,1.0f)); PSMaterialChunk->setDiffuse(Color4f(0.7f,0.7f,0.7f,1.0f)); PSMaterialChunk->setSpecular(Color4f(0.9f,0.9f,0.9f,1.0f)); PSMaterialChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); ChunkMaterialRefPtr PSSmokeMaterial = ChunkMaterial::create(); PSSmokeMaterial->addChunk(QuadTextureObjChunk); PSSmokeMaterial->addChunk(PSMaterialChunk); PSSmokeMaterial->addChunk(PSMaterialChunk); PSSmokeMaterial->addChunk(QuadTextureEnvChunk); //Particle System //Rocket RocketParticleSystem = OSG::ParticleSystem::create(); RocketParticleSystem->attachUpdateListener(TutorialWindow); TutorialRocketParticleSystemListener TheRocketListener; RocketParticleSystem->addParticleSystemListener(&TheRocketListener); //smoke SmokeParticleSystem = OSG::ParticleSystem::create(); SmokeParticleSystem->attachUpdateListener(TutorialWindow); //Shrapnel ShrapnelParticleSystem = OSG::ParticleSystem::create(); ShrapnelParticleSystem->attachUpdateListener(TutorialWindow); //Fireball FireballParticleSystem = OSG::ParticleSystem::create(); FireballParticleSystem->attachUpdateListener(TutorialWindow); //Particle System Drawer //Rocket does not have a drawer because it is being attached to a special node core //Smoke SmokeParticleSystemDrawer = OSG::QuadParticleSystemDrawer::create(); //SmokeParticleSystemDrawer->setQuadSizeScaling(Vec2f(0.5f,0.5f)); //Shrapnel ExampleShrapnelParticleSystemDrawer = OSG::PointParticleSystemDrawer::create(); ExampleShrapnelParticleSystemDrawer->setForcePerParticleSizing(true); //Fireball ExampleFireballParticleSystemDrawer = OSG::PointParticleSystemDrawer::create(); ExampleFireballParticleSystemDrawer->setForcePerParticleSizing(true); //Particle System Node //collision node //NodeRefPtr EnvironmentNode = makeSphere(2,4.0f); Matrix EnvironmentTransformation; EnvironmentTransformation.setScale(0.1f); TransformRefPtr EnvironmentTransformCore = Transform::create(); EnvironmentTransformCore->setMatrix(EnvironmentTransformation); NodeRefPtr EnvironmentNode = Node::create(); EnvironmentNode->setCore(EnvironmentTransformCore); //EnvironmentNode->addChild(SceneFileHandler::the()->read("Data/Chloroplast.osb")); EnvironmentNode->addChild(SceneFileHandler::the()->read("Data/house.obj")); //NodeRefPtr ParticlePrototypeNode = makeTorus(1.0,4.0,16,16); NodeRefPtr RocketParticlePrototypeNode = SceneFileHandler::the()->read("Data/rocket.obj"); if(RocketParticlePrototypeNode == NULL) { RocketParticlePrototypeNode = makeTorus(.5, 2, 16, 16); } NodeParticleSystemCoreRefPtr RocketParticleNodeCore = OSG::NodeParticleSystemCore::create(); RocketParticleNodeCore->setSystem(RocketParticleSystem); RocketParticleNodeCore->setPrototypeNode(RocketParticlePrototypeNode); RocketParticleNodeCore->setNormalSource(NodeParticleSystemCore::NORMAL_VELOCITY); RocketParticleNodeCore->setUpSource(NodeParticleSystemCore::UP_PARTICLE_NORMAL); RocketParticleNodeCore->setUp(Vec3f(0.0f,1.0f,0.0f)); //Geometry Collision Affector GeometryCollisionParticleSystemAffectorRefPtr ExampleGeometryCollisionParticleSystemAffector = GeometryCollisionParticleSystemAffector::create(); ExampleGeometryCollisionParticleSystemAffector->setCollisionNode(EnvironmentNode); TutorialParticleCollisionListener TheCollisionListener; ExampleGeometryCollisionParticleSystemAffector->addParticleGeometryCollisionListener(&TheCollisionListener); NodeRefPtr RocketParticleNode = OSG::Node::create(); RocketParticleNode->setCore(RocketParticleNodeCore); //Attach the Affector to the Rocket Particle System //RocketParticleSystem->pushToAffectors(); RocketParticleSystem->pushToSystemAffectors(ExampleGeometryCollisionParticleSystemAffector); //Smoke SmokeGenerator = OSG::RateParticleGenerator::create(); //Attach the function objects to the Generator SmokePositionDistribution = createSmokePositionDistribution(); SmokeGenerator->setPositionDistribution(SmokePositionDistribution); SmokeGenerator->setLifespanDistribution(createSmokeLifespanDistribution()); SmokeGenerator->setGenerationRate(50.0); SmokeGenerator->setVelocityDistribution(createSmokeVelocityDistribution()); //Attach the function objects the Affectors SmokeAgeFadeParticleAffector = OSG::AgeFadeParticleAffector::create(); SmokeAgeFadeParticleAffector->setFadeInTime(2.0f); SmokeAgeFadeParticleAffector->setFadeOutTime(5.0f); SmokeAgeFadeParticleAffector->setStartAlpha(0.0f); SmokeAgeFadeParticleAffector->setFadeToAlpha(0.2f); SmokeAgeFadeParticleAffector->setEndAlpha(0.0f); SmokeAgeSizeParticleAffector = OSG::AgeSizeParticleAffector::create(); //ages SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.1); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.2); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.3); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.5); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.7); SmokeAgeSizeParticleAffector->editMFAges()->push_back(0.8); SmokeAgeSizeParticleAffector->editMFAges()->push_back(1.0); //sizes SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(0.5,0.5,0.5)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(1.0,1.0,1.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.0,2.0,2.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(3.0,3.0,3.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(4.0,4.0,4.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(5.0,5.0,5.0)); SmokeAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(6.5,6.5,6.5)); ParticleSystemCoreRefPtr SmokeParticleNodeCore = OSG::ParticleSystemCore::create(); SmokeParticleNodeCore->setSystem(SmokeParticleSystem); SmokeParticleNodeCore->setDrawer(SmokeParticleSystemDrawer); SmokeParticleNodeCore->setMaterial(PSSmokeMaterial); NodeRefPtr SmokeParticleNode = OSG::Node::create(); SmokeParticleNode->setCore(SmokeParticleNodeCore); //end///////////////////// //Shrapnel ShrapnelBurstGenerator = OSG::BurstParticleGenerator::create(); NodeRefPtr ShrapnelParticlePrototypeNode = SceneFileHandler::the()->read("Data/Shrapnel.obj"); NodeParticleSystemCoreRefPtr ShrapnelParticleNodeCore = OSG::NodeParticleSystemCore::create(); ShrapnelParticleNodeCore->setSystem(ShrapnelParticleSystem); ShrapnelParticleNodeCore->setPrototypeNode(ShrapnelParticlePrototypeNode); //Attach the function objects to the Generator ShrapnelPositionDistribution = createShrapnelPositionDistribution(); ShrapnelBurstGenerator->setPositionDistribution(ShrapnelPositionDistribution); ShrapnelBurstGenerator->setLifespanDistribution(createLifespanDistribution()); ShrapnelBurstGenerator->setBurstAmount(50.0); ShrapnelBurstGenerator->setVelocityDistribution(createShrapnelVelocityDistribution()); ShrapnelBurstGenerator->setAccelerationDistribution(createShrapnelAccelerationDistribution()); NodeRefPtr ShrapnelParticleNode = OSG::Node::create(); ShrapnelParticleNode->setCore(ShrapnelParticleNodeCore); //end///////////////////// //fireball FireballGenerator = OSG::BurstParticleGenerator::create(); NodeRefPtr FireballParticlePrototypeNode = SceneFileHandler::the()->read("Data/bubble.obj"); NodeParticleSystemCoreRefPtr FireballParticleNodeCore = OSG::NodeParticleSystemCore::create(); FireballParticleNodeCore->setSystem(FireballParticleSystem); FireballParticleNodeCore->setPrototypeNode(FireballParticlePrototypeNode); //Attach the function objects to the Generator FireballPositionDistribution = createFireballPositionDistribution(); FireballGenerator->setPositionDistribution(FireballPositionDistribution); FireballGenerator->setLifespanDistribution(createFireballLifespanDistribution()); FireballGenerator->setBurstAmount(100.0); FireballGenerator->setVelocityDistribution(createFireballVelocityDistribution()); FireballGenerator->setAccelerationDistribution(createFireballAccelerationDistribution()); //Attach the function objects the Affectors FireballAgeSizeParticleAffector = OSG::AgeSizeParticleAffector::create(); //ages FireballAgeSizeParticleAffector->editMFAges()->push_back(0.1); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.2); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.3); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.5); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.7); FireballAgeSizeParticleAffector->editMFAges()->push_back(0.8); FireballAgeSizeParticleAffector->editMFAges()->push_back(1.0); //sizes FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.0,2.0,2.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.3,2.3,2.3)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.5,2.5,2.5)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(3.0,3.0,3.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(4.0,4.0,4.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(5.0,5.0,5.0)); FireballAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(6.5,6.5,6.5)); NodeRefPtr FireballParticleNode = OSG::Node::create(); FireballParticleNode->setCore(FireballParticleNodeCore); //end///////////////////// // Make Main Scene Node NodeRefPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); scene->addChild(RocketParticleNode); scene->addChild(SmokeParticleNode); scene->addChild(ShrapnelParticleNode); scene->addChild(FireballParticleNode); scene->addChild(EnvironmentNode); mgr->setRoot(scene); mgr->getNavigator()->set(Pnt3f(0.0,0.0,0.0), Pnt3f(0.0,0.0,-1.0), Vec3f(0.0,1.0,0.0)); mgr->getNavigator()->setMotionFactor(1.0f); mgr->getCamera()->setNear(0.1f); mgr->getCamera()->setFar(1000.0f); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "10RocketLauncher"); //Enter main Loop TutorialWindow->mainLoop(); osgExit(); return 0; }