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; }
void keyPressed(KeyEventDetails* const details, SimpleSceneManager *mgr, ParticleSystem* const ExampleParticleSystem, SimpleParticleTrailGenerator* const ExampleTrailGenerator) { if(details->getKey() == KeyEventDetails::KEY_Q && details->getModifiers() & KeyEventDetails::KEY_MODIFIER_CONTROL) { dynamic_cast<WindowEventProducer*>(details->getSource())->closeWindow(); } else { switch(details->getKey()) { case KeyEventDetails::KEY_R: { } break; case KeyEventDetails::KEY_B: { // check if the burst generator is null if(ExampleBurstGen == NULL) { ExampleBurstGen = BurstParticleGenerator::create(); ExampleBurstGen->setPositionDistribution(createPositionDistribution()); ExampleBurstGen->setBurstAmount(100); ExampleBurstGen->setVelocityDistribution(createVelocityDistribution()); ExampleBurstGen->setNormalDistribution(createNormalDistribution()); ExampleBurstGen->setLifespanDistribution(createLifespanDistribution()); ExampleBurstGen->setSizeDistribution(createSizeDistribution()); } // attach the burst generator ExampleParticleSystem->pushToGenerators(ExampleBurstGen); } break; case KeyEventDetails::KEY_P: { // increase trail resolution ExamplePSTrailGenerator->setTrailResolution(ExamplePSTrailGenerator->getTrailResolution() * 0.70 + 0.0001); std::cout << "Trail Resolution: " << ExamplePSTrailGenerator->getTrailResolution() << std::endl; break; } case KeyEventDetails::KEY_L: { // decrease trail resolution ExamplePSTrailGenerator->setTrailResolution(ExamplePSTrailGenerator->getTrailResolution() * 1.25); std::cout << "Trail Resolution: " << ExamplePSTrailGenerator->getTrailResolution() << std::endl; break; } case KeyEventDetails::KEY_O: { // increase trail length ExamplePSTrailGenerator->setTrailLength(ExamplePSTrailGenerator->getTrailLength() * 1.25 + 0.1); std::cout << "Trail Length: " << ExamplePSTrailGenerator->getTrailLength() << std::endl; break; } case KeyEventDetails::KEY_K: { // decrease trail length ExamplePSTrailGenerator->setTrailLength(ExamplePSTrailGenerator->getTrailLength() * 0.7); std::cout << "Trail Length: " << ExamplePSTrailGenerator->getTrailLength() << std::endl; break; } case KeyEventDetails::KEY_J: { // toggle trail length method ExamplePSTrailGenerator->setTrailLengthMethod((ExamplePSTrailGenerator->getTrailLengthMethod() == ParticleTrailGenerator::NUM_POINTS)? (ParticleTrailGenerator::TIME):(ParticleTrailGenerator::NUM_POINTS)); std::cout << "Trail Length: " << (ExamplePSTrailGenerator->getTrailLengthMethod() == ParticleTrailGenerator::NUM_POINTS ? "Num Pts":"Time") << std::endl; break; } case KeyEventDetails::KEY_Y: { // toggle trail spacing method ExamplePSTrailGenerator->setTrailResolutionMethod((ExamplePSTrailGenerator->getTrailResolutionMethod() == ParticleTrailGenerator::TIME_SPACING)? (ParticleTrailGenerator::DISTANCE_SPACING):(ParticleTrailGenerator::TIME_SPACING)); std::cout << "Trail resolution: " <<(ExamplePSTrailGenerator->getTrailResolutionMethod() == ParticleTrailGenerator::TIME_SPACING ? "Time Spacing" : "Distance Spacing") << std::endl; break; } case KeyEventDetails::KEY_V: { mgr->getRenderAction()->setVolumeDrawing(!mgr->getRenderAction()->getVolumeDrawing()); } } } }
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; }
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 PointChunkRefPtr PSPointChunk = PointChunk::create(); PSPointChunk->setSize(12.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 PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(PSPointChunk); PSMaterial->addChunk(PSMaterialChunkChunk); PSMaterial->addChunk(PSBlendChunk); //Particle System ExampleParticleSystem = OSG::ParticleSystem::create(); ExampleParticleSystem->attachUpdateListener(TutorialWindow); //Particle System Drawer PointParticleSystemDrawerRefPtr ExampleParticleSystemDrawer = OSG::PointParticleSystemDrawer::create(); ExampleBurstGenerator = OSG::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()); //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); // Make Main Scene Node and add the Torus NodeRefPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); scene->addChild(ParticleNode); 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, "04BurstParticleGenerator"); //Enter main Loop TutorialWindow->mainLoop(); osgExit(); return 0; }
virtual void keyPressed(const KeyEventUnrecPtr e) { if(e->getKey() == KeyEvent::KEY_Q && e->getModifiers() & KeyEvent::KEY_MODIFIER_CONTROL) { TutorialWindow->closeWindow(); } else { switch(e->getKey()) { case KeyEvent::KEY_B: { // check if the burst generator is null if(ExampleBurstGen == NULL) { ExampleBurstGen = OSG::BurstParticleGenerator::create(); ExampleBurstGen->setPositionDistribution(createPositionDistribution()); ExampleBurstGen->setBurstAmount(20); ExampleBurstGen->setVelocityDistribution(createVelocityDistribution()); ExampleBurstGen->setNormalDistribution(createNormalDistribution()); ExampleBurstGen->setLifespanDistribution(createLifespanDistribution()); ExampleBurstGen->setSizeDistribution(createSizeDistribution()); } // attach the burst generator ExampleParticleSystem->pushToGenerators(ExampleBurstGen); } break; case KeyEvent::KEY_P: { // increase trail resolution ExampleTrailGenerator->setTrailResolution(ExampleTrailGenerator->getTrailResolution() * 0.70 + 0.0001); std::cout << "Trail Resolution: " << ExampleTrailGenerator->getTrailResolution() << std::endl; break; } case KeyEvent::KEY_L: { // decrease trail resolution ExampleTrailGenerator->setTrailResolution(ExampleTrailGenerator->getTrailResolution() * 1.25); std::cout << "Trail Resolution: " << ExampleTrailGenerator->getTrailResolution() << std::endl; break; } case KeyEvent::KEY_O: { // increase trail length ExampleTrailGenerator->setTrailLength(ExampleTrailGenerator->getTrailLength() * 1.25 + 0.1); std::cout << "Trail Length: " << ExampleTrailGenerator->getTrailLength() << std::endl; break; } case KeyEvent::KEY_K: { // decrease trail length ExampleTrailGenerator->setTrailLength(ExampleTrailGenerator->getTrailLength() * 0.7); std::cout << "Trail Length: " << ExampleTrailGenerator->getTrailLength() << std::endl; break; } case KeyEvent::KEY_I: { // toggle lines/points as trail draw method ExampleTrailGenerator->setDrawMethod((ExampleTrailGenerator->getDrawMethod() == SimpleParticleTrailGenerator::LINES)? (SimpleParticleTrailGenerator::POINTS):(SimpleParticleTrailGenerator::LINES)); break; } case KeyEvent::KEY_J: { // toggle trail length method ExampleTrailGenerator->setTrailLengthMethod((ExampleTrailGenerator->getTrailLengthMethod() == ParticleTrailGenerator::NUM_POINTS)? (ParticleTrailGenerator::TIME):(ParticleTrailGenerator::NUM_POINTS)); std::cout << "Trail Length: " << (ExampleTrailGenerator->getTrailLengthMethod() == ParticleTrailGenerator::NUM_POINTS ? "Num Pts":"Time") << std::endl; break; } case KeyEvent::KEY_Y: { // toggle trail spacing method ExampleTrailGenerator->setTrailResolutionMethod((ExampleTrailGenerator->getTrailResolutionMethod() == ParticleTrailGenerator::TIME_SPACING)? (ParticleTrailGenerator::DISTANCE_SPACING):(ParticleTrailGenerator::TIME_SPACING)); std::cout << "Trail resolution: " <<(ExampleTrailGenerator->getTrailResolutionMethod() == ParticleTrailGenerator::TIME_SPACING ? "Time Spacing" : "Distance Spacing") << std::endl; break; } case KeyEvent::KEY_V: { mgr->getRenderAction()->setVolumeDrawing(!mgr->getRenderAction()->getVolumeDrawing()); } } } }