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->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)); // Creating the Particle System Material // Here, the image is loaded. The entire image sequence is conatined in one image, // which reduces texture memory overhead and runs faster. TextureObjChunkRefPtr QuadTextureChunk = TextureObjChunk::create(); ImageRefPtr LoadedImage = ImageFileHandler::the()->read("Data/SpriteExplode.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.0f,0.0f,1.0f)); PSMaterialChunk->setDiffuse(Color4f(0.7f,0.0f,0.0f,1.0f)); PSMaterialChunk->setSpecular(Color4f(0.9f,0.0f,0.0f,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); //Age Particle Function. Controls which image is shown when, based on the age of a particle. AgeParticleFunctionRecPtr AgeFunc = AgeParticleFunction::create(); AgeFunc->setSequenceTime(0.1f); // image changes every 0.1 seconds. AgeFunc->setSequenceOrder(AgeParticleFunction::CUSTOM); // using the custom sequence below. /* Here, a custom sequence for the image ordering is assembled. The image sequence will be shown in the order specified here. Once the end of the sequence is reached, the sequence repeats. */ AgeFunc->editMFCustomSequence()->push_back(0); AgeFunc->editMFCustomSequence()->push_back(1); AgeFunc->editMFCustomSequence()->push_back(2); AgeFunc->editMFCustomSequence()->push_back(3); AgeFunc->editMFCustomSequence()->push_back(4); AgeFunc->editMFCustomSequence()->push_back(5); AgeFunc->editMFCustomSequence()->push_back(4); AgeFunc->editMFCustomSequence()->push_back(3); AgeFunc->editMFCustomSequence()->push_back(2); AgeFunc->editMFCustomSequence()->push_back(1); //Particle System Drawer - QuadSequenceParticleSystemDrawerRecPtr ExampleParticleSystemDrawer = QuadSequenceParticleSystemDrawer::create(); // image dimensions (in pixels) are required if there is a border on the images. ExampleParticleSystemDrawer->setImageDimensions(Vec2us(780,520)); // The "dimensions" of the sequence contained in the image. For this image, // there are 3 images in the "x" direction, and two in the "y" direction, for a // total of 6. ExampleParticleSystemDrawer->setSequenceDimensions(Vec2b(3,2)); // width of the border on each side of the image, in pixels. ExampleParticleSystemDrawer->setBorderOffsets(Vec2b(0,0)); // this is the age function we just created above. ExampleParticleSystemDrawer->setSequenceFunction(AgeFunc); RateParticleGeneratorRecPtr ExampleParticleGenerator = RateParticleGenerator::create(); //Attach the function objects to the Generator ExampleParticleGenerator->setPositionDistribution(createPositionDistribution()); ExampleParticleGenerator->setLifespanDistribution(createLifespanDistribution()); ExampleParticleGenerator->setVelocityDistribution(createVelocityDistribution()); ExampleParticleGenerator->setAccelerationDistribution(createAccelerationDistribution()); ExampleParticleGenerator->setSizeDistribution(createSizeDistribution()); ExampleParticleGenerator->setGenerationRate(40.0f); //Particle System Node ParticleSystemCoreRefPtr ParticleNodeCore = ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); ParticleNodeCore->setSortingMode(ParticleSystemCore::BACK_TO_FRONT); NodeRefPtr ParticleNode = Node::create(); ParticleNode->setCore(ParticleNodeCore); ExampleParticleSystem->addParticle(Pnt3f(10.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), 0.01, Vec3f(0.0,0.0,0.0), Vec3f(0.0,0.0,0.0)); ExampleParticleSystem->addParticle(Pnt3f(-10.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), 0.01, Vec3f(0.0,0.0,0.0), Vec3f(0.0,0.0,0.0)); ExampleParticleSystem->pushToGenerators(ExampleParticleGenerator); // Make Main Scene Node and add the Torus NodeRefPtr scene = makeCoredNode<Group>(); scene->addChild(ParticleNode); TutorialWindow->connectKeyTyped(boost::bind(keyTyped, _1, &sceneManager, AgeFunc.get())); sceneManager.setRoot(scene); // 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, "05a - QuadSequenceParticleDrawer"); //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 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; }
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)); // Material blend chunk BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); //load up images for PS drawer ImageRefPtr rocket = ImageFileHandler::the()->read("Data/rocket.png"); ImageRefPtr smoke = ImageFileHandler::the()->read("Data/Smokey.png"); //Texture Chunk TextureObjChunkRefPtr PSRocketTexChunk = TextureObjChunk::create(); PSRocketTexChunk->setImage(rocket); TextureEnvChunkRefPtr PSRocketTexEnvChunk = TextureEnvChunk::create(); PSRocketTexEnvChunk->setEnvMode(GL_MODULATE); TextureObjChunkRefPtr SmokeTexChunk = TextureObjChunk::create(); SmokeTexChunk->setImage(smoke); TextureEnvChunkRefPtr SmokeTexEnvChunk = TextureEnvChunk::create(); SmokeTexEnvChunk->setEnvMode(GL_MODULATE); //Particle System Material MaterialChunkRefPtr PSMaterialChunkChunk = MaterialChunk::create(); PSMaterialChunkChunk->setAmbient(Color4f(1.0f,0.5f,0.3f,1.0f)); PSMaterialChunkChunk->setDiffuse(Color4f(1.0f,0.5f,0.3f,0.6f)); PSMaterialChunkChunk->setSpecular(Color4f(1.0f,0.5f,0.3f,0.6f)); PSMaterialChunkChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); // Assembling materials ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(PSMaterialChunkChunk); PSMaterial->addChunk(PSBlendChunk); PSMaterial->addChunk(PSRocketTexChunk); ChunkMaterialRefPtr TrailMaterial = ChunkMaterial::create(); TrailMaterial->addChunk(PSMaterialChunkChunk); TrailMaterial->addChunk(PSBlendChunk); TrailMaterial->addChunk(SmokeTexChunk); AgeFadeParticleAffectorRefPtr AgeFadeAffector = AgeFadeParticleAffector::create(); AgeFadeAffector->setFadeInTime(0.0f); AgeFadeAffector->setStartAlpha(1.0f); AgeFadeAffector->setEndAlpha(0.0f); AgeFadeAffector->setFadeOutTime(0.35f); AgeFadeAffector->setFadeToAlpha(1.0f); // Creating a particle generator RateParticleGeneratorRefPtr ExampleGenerator = RateParticleGenerator::create(); //Attach the function objects to the Generator ExampleGenerator->setPositionDistribution(createPositionDistribution()); ExampleGenerator->setGenerationRate(3.0); ExampleGenerator->setVelocityDistribution(createVelocityDistribution()); ExampleGenerator->setNormalDistribution(createNormalDistribution()); ExampleGenerator->setLifespanDistribution(createLifespanDistribution()); ExampleGenerator->setSizeDistribution(createSizeDistribution()); //Creating Particle System ParticleSystemRecPtr ExampleParticleSystem = ParticleSystem::create(); ExampleParticleSystem->addParticle(Pnt3f(0,0,-100),Vec3f(0,1,0),Color4f(1,1,1,1),Vec3f(1,1,1),0.1,Vec3f(0,0,0),Vec3f(0,0,0)); ExampleParticleSystem->addParticle(Pnt3f(0,0,100),Vec3f(0,1,0),Color4f(1,1,1,1),Vec3f(1,1,1),0.1,Vec3f(0,0,0),Vec3f(0,0,0)); ExampleParticleSystem->setMaxParticles(5); // 5 rockets max to avoid collisions. they are bad. ExampleParticleSystem->pushToAffectors(AgeFadeAffector); ExampleParticleSystem->attachUpdateProducer(TutorialWindow); //Creating Particle System Drawer QuadParticleSystemDrawerRefPtr ExampleParticleSystemDrawer = QuadParticleSystemDrawer::create(); ExampleParticleSystemDrawer->setNormalAndUpSource(QuadParticleSystemDrawer::NORMAL_VIEW_DIRECTION, QuadParticleSystemDrawer::UP_VELOCITY); QuadParticleSystemDrawerRefPtr ExampleTrailDrawer = QuadParticleSystemDrawer::create(); ExampleTrailDrawer->setNormalAndUpSource(QuadParticleSystemDrawer::NORMAL_VIEW_DIRECTION, QuadParticleSystemDrawer::UP_PARTICLE_NORMAL); // Attaching affector and generator to the particle system ExampleParticleSystem->pushToGenerators(ExampleGenerator); //Particle System Core, setting its system, drawer, and material ParticleSystemCoreRefPtr ParticleNodeCore = ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); // create Particle System Particle Trail generator ParticleSystemParticleTrailGeneratorRecPtr ExamplePSTrailGenerator = ParticleSystemParticleTrailGenerator::create(); ExamplePSTrailGenerator->setTrailResolution(0.05f); ExamplePSTrailGenerator->setTrailLength(1.2); ExamplePSTrailGenerator->setTrailLengthMethod(ParticleTrailGenerator::TIME); ExamplePSTrailGenerator->setTrailResolutionMethod(ParticleTrailGenerator::TIME_SPACING); ExamplePSTrailGenerator->setTrailMaterial(TrailMaterial); ExamplePSTrailGenerator->setTrailDrawer(ExampleTrailDrawer); ExamplePSTrailGenerator->setSizeDistribution(createTrailSizeDistribution()); ExamplePSTrailGenerator->setColorDistribution(createColorDistribution()); ExamplePSTrailGenerator->setNormalDistribution(createNormalDistribution()); ExamplePSTrailGenerator->setVelocityDistribution(createNormalDistribution()); // create affectors for particle trails GravityParticleAffectorRefPtr GravAffector = GravityParticleAffector::create(); GravAffector->setBeacon(ExamplePSTrailGenerator); AgeFadeParticleAffectorRefPtr TrailAgeFadeAffector = AgeFadeParticleAffector::create(); TrailAgeFadeAffector->setFadeInTime(0.2f); TrailAgeFadeAffector->setStartAlpha(0.0f); TrailAgeFadeAffector->setEndAlpha(0.0f); TrailAgeFadeAffector->setFadeOutTime(1.0f); TrailAgeFadeAffector->setFadeToAlpha(0.6f); // now we attach the affector to the particle trail generator's particle system ExamplePSTrailGenerator->getParticleSystem()->pushToAffectors(TrailAgeFadeAffector); // attach listener for trail generator to the particle system ExamplePSTrailGenerator->setSystemToTrail(ExampleParticleSystem); //Attach the the update producer to the particle system particle trail generator. ExamplePSTrailGenerator->attachUpdateProducer(TutorialWindow); // Set up node with the particle system at its core NodeRefPtr ParticleNode = Node::create(); ParticleNode->setCore(ParticleNodeCore); ParticleNode->addChild(ExamplePSTrailGenerator); // Make Main Scene Node NodeRefPtr scene = Node::create(); scene->setCore(Group::create()); scene->addChild(ParticleNode); sceneManager.setRoot(scene); // Show the whole Scene sceneManager.showAll(); sceneManager.getCamera()->setFar(10000.0f); sceneManager.getCamera()->setNear(0.1f); sceneManager.setStatistics(false); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "02ParticleSystemParticleTrail"); std::cout << "Controls: " << std::endl << "P: Increase Trail Resolution" << std::endl << "L: Decrease Trail Resolution" << std::endl << "O: Increase Trail Length" << std::endl << "K: Decrease Trail Length" << std::endl << "J: Toggle calculating trail length by num points/time" << std::endl << "Y: Toggle calculating trail point spacing by time/distance" << std::endl << "B: Particle burst" << std::endl; //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 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; }
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->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)); // Creating the Particle System Material // Here, the image is loaded. The entire image sequence is conatined in one image, // which reduces texture memory overhead and runs faster. TextureObjChunkRefPtr QuadTextureChunk = TextureObjChunk::create(); ImageRefPtr LoadedImage = ImageFileHandler::the()->read("Data/Explosion.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->setLit(false); ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(QuadTextureChunk); PSMaterial->addChunk(QuadTextureEnvChunk); PSMaterial->addChunk(PSMaterialChunk); PSMaterial->addChunk(PSBlendChunk); //Particle System ParticleSystemRecPtr ExplosionParticleSystem = ParticleSystem::create(); ExplosionParticleSystem->attachUpdateProducer(TutorialWindow); //Age Particle Function. Controls which image is shown when, based on the age of a particle. AgeParticleFunctionRecPtr AgeFunc = AgeParticleFunction::create(); AgeFunc->setSequenceTime(0.07f); // image changes every 0.1 seconds. AgeFunc->setSequenceOrder(AgeParticleFunction::CUSTOM); // using the custom sequence below. /* Here, a custom sequence for the image ordering is assembled. The image sequence will be shown in the order specified here. Once the end of the sequence is reached, the sequence repeats. */ UInt32 NumImages(25); for(UInt32 i(0) ; i<NumImages ; ++i) { AgeFunc->editMFCustomSequence()->push_back(i); } //Particle System Drawer - QuadSequenceParticleSystemDrawerRecPtr ExplosionParticleSystemDrawer = QuadSequenceParticleSystemDrawer::create(); // image dimensions (in pixels) are required if there is a border on the images. ExplosionParticleSystemDrawer->setImageDimensions(Vec2us(320,320)); // The "dimensions" of the sequence contained in the image. For this image, // there are 3 images in the "x" direction, and two in the "y" direction, for a // total of 6. ExplosionParticleSystemDrawer->setSequenceDimensions(Vec2b(5,5)); // width of the border on each side of the image, in pixels. ExplosionParticleSystemDrawer->setBorderOffsets(Vec2b(0,0)); // this is the age function we just created above. ExplosionParticleSystemDrawer->setSequenceFunction(AgeFunc); RateParticleGeneratorRecPtr ExplosionParticleGenerator = RateParticleGenerator::create(); //Attach the function objects to the Generator ExplosionParticleGenerator->setPositionDistribution(createPositionDistribution()); ExplosionParticleGenerator->setLifespanDistribution(createLifespanDistribution()); ExplosionParticleGenerator->setVelocityDistribution(createVelocityDistribution()); ExplosionParticleGenerator->setAccelerationDistribution(createAccelerationDistribution()); ExplosionParticleGenerator->setSizeDistribution(createSizeDistribution()); ExplosionParticleGenerator->setGenerationRate(100.0f); //Particle System Node ParticleSystemCoreRefPtr ExplosionParticleCore = ParticleSystemCore::create(); ExplosionParticleCore->setSystem(ExplosionParticleSystem); ExplosionParticleCore->setDrawer(ExplosionParticleSystemDrawer); ExplosionParticleCore->setMaterial(PSMaterial); ExplosionParticleCore->setSortingMode(ParticleSystemCore::BACK_TO_FRONT); NodeRefPtr ExplosionParticleNode = Node::create(); ExplosionParticleNode->setCore(ExplosionParticleCore); ExplosionParticleSystem->addParticle(Pnt3f(10.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), 0.01, Vec3f(0.0,0.0,0.0), Vec3f(0.0,0.0,0.0)); ExplosionParticleSystem->addParticle(Pnt3f(-10.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), 0.01, Vec3f(0.0,0.0,0.0), Vec3f(0.0,0.0,0.0)); ExplosionParticleSystem->pushToGenerators(ExplosionParticleGenerator); AgeSizeParticleAffectorRecPtr ExampleAgeSizeParticleAffector = AgeSizeParticleAffector::create(); //Age and size ExampleAgeSizeParticleAffector->editMFAges()->push_back(0.0); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(0.2,0.2,0.2)); ExampleAgeSizeParticleAffector->editMFAges()->push_back(1.0); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(4.0,4.0,4.0)); ExampleAgeSizeParticleAffector->editMFAges()->push_back(1.8); ExampleAgeSizeParticleAffector->editMFSizes()->push_back(Vec3f(2.2,2.2,0.1)); //Age Fade Affector AgeFadeParticleAffectorRecPtr ExampleAgeFadeParticleAffector = AgeFadeParticleAffector::create(); //Age and size ExampleAgeFadeParticleAffector->setStartAlpha(0.0f); ExampleAgeFadeParticleAffector->setFadeInTime(0.5f); ExampleAgeFadeParticleAffector->setFadeToAlpha(1.0f); ExampleAgeFadeParticleAffector->setFadeOutTime(0.5f); ExampleAgeFadeParticleAffector->setEndAlpha(0.0f); ExplosionParticleSystem->pushToAffectors(ExampleAgeFadeParticleAffector); //Smoke Particle System VortexParticleAffectorRecPtr SmokeVortexAffector = VortexParticleAffector::create(); SmokeVortexAffector->setMagnitude(0.2); SmokeVortexAffector->setVortexAxis(Vec3f(0.0,1.0,0.0)); // field rotates around y axis NodeRefPtr VortexBeacon = makeCoredNode<Group>(); SmokeVortexAffector->setBeacon(VortexBeacon); // set to 'emulate' from (0,0,0) SmokeVortexAffector->setMaxDistance(-1.0); // particles affected regardless of distance SmokeVortexAffector->setAttenuation(0.25); // strength of uniform field dimishes by dist^attenuation AgeFadeParticleAffectorRecPtr SmokeAgeFadeParticleAffector = AgeFadeParticleAffector::create(); //Age and size SmokeAgeFadeParticleAffector->setStartAlpha(0.0f); SmokeAgeFadeParticleAffector->setFadeInTime(0.2f); SmokeAgeFadeParticleAffector->setFadeToAlpha(1.0f); SmokeAgeFadeParticleAffector->setFadeOutTime(3.5f); SmokeAgeFadeParticleAffector->setEndAlpha(0.0f); RateParticleGeneratorRecPtr SmokeParticleGenerator = RateParticleGenerator::create(); SmokeParticleGenerator->setSizeDistribution(createSmokeSizeDistribution()); SmokeParticleGenerator->setPositionDistribution(createSmokePositionDistribution()); SmokeParticleGenerator->setLifespanDistribution(createSmokeLifespanDistribution()); SmokeParticleGenerator->setVelocityDistribution(createSmokeVelocityDistribution()); SmokeParticleGenerator->setColorDistribution(createSmokeColorDistribution()); SmokeParticleGenerator->setGenerationRate(80.0f); ParticleSystemRecPtr SmokeParticleSystem = ParticleSystem::create(); SmokeParticleSystem->pushToGenerators(SmokeParticleGenerator); SmokeParticleSystem->attachUpdateProducer(TutorialWindow); SmokeParticleSystem->pushToAffectors(SmokeAgeFadeParticleAffector); SmokeParticleSystem->pushToAffectors(SmokeVortexAffector); TextureObjChunkRefPtr SmokeTextureObjChunk = TextureObjChunk::create(); ImageRefPtr SmokeImage = ImageFileHandler::the()->read("Data/Smoke.png"); SmokeTextureObjChunk->setImage(SmokeImage); ChunkMaterialRefPtr SmokeMaterial = ChunkMaterial::create(); SmokeMaterial->addChunk(SmokeTextureObjChunk); SmokeMaterial->addChunk(QuadTextureEnvChunk); SmokeMaterial->addChunk(PSMaterialChunk); SmokeMaterial->addChunk(PSBlendChunk); SmokeMaterial->setSortKey(-1.0f); QuadParticleSystemDrawerRecPtr SmokeParticleSystemDrawer = QuadParticleSystemDrawer::create(); ParticleSystemCoreRefPtr SmokeParticleCore = ParticleSystemCore::create(); SmokeParticleCore->setSystem(SmokeParticleSystem); SmokeParticleCore->setDrawer(SmokeParticleSystemDrawer); SmokeParticleCore->setMaterial(SmokeMaterial); SmokeParticleCore->setSortingMode(ParticleSystemCore::BACK_TO_FRONT); NodeRefPtr SmokeParticleNode = Node::create(); SmokeParticleNode->setCore(SmokeParticleCore); // Make Main Scene Node and add the Torus NodeRefPtr scene = makeCoredNode<Group>(); scene->addChild(ExplosionParticleNode); scene->addChild(SmokeParticleNode); scene->addChild(VortexBeacon); TutorialWindow->connectKeyTyped(boost::bind(keyTyped, _1, &sceneManager, AgeFunc.get())); sceneManager.setRoot(scene); // 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, "06Explosion"); //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()); } } } }
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); // Material point chunk, so particles are drawn as points PointChunkRefPtr PSPointChunk = PointChunk::create(); PSPointChunk->setSize(5.0f); PSPointChunk->setSmooth(true); // Material blend chunk BlendChunkRefPtr PSBlendChunk = BlendChunk::create(); PSBlendChunk->setSrcFactor(GL_SRC_ALPHA); PSBlendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); LineChunkRefPtr PSLineChunk = LineChunk::create(); //Texture Chunk TextureObjChunkRefPtr PSTexChunk = OSG::TextureObjChunk::create(); //Particle System Material MaterialChunkRefPtr PSMaterialChunkChunk = MaterialChunk::create(); PSMaterialChunkChunk->setAmbient(Color4f(1.0f,0.5f,0.3f,1.0f)); PSMaterialChunkChunk->setDiffuse(Color4f(1.0f,0.5f,0.3f,0.6f)); PSMaterialChunkChunk->setSpecular(Color4f(1.0f,0.5f,0.3f,0.6f)); PSMaterialChunkChunk->setColorMaterial(GL_AMBIENT_AND_DIFFUSE); // Assembling materials ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(PSMaterialChunkChunk); PSMaterial->addChunk(PSPointChunk); PSMaterial->addChunk(PSBlendChunk); PSMaterial->addChunk(PSLineChunk); PSMaterial->addChunk(PSTexChunk); PSMaterial->setTransparencyMode(Material::TransparencyForceTransparent); // Creating a particle generator RateParticleGeneratorRefPtr ExampleGenerator = OSG::RateParticleGenerator::create(); //Attach the function objects to the Generator ExampleGenerator->setPositionDistribution(createPositionDistribution()); ExampleGenerator->setGenerationRate(8.0); ExampleGenerator->setVelocityDistribution(createVelocityDistribution()); ExampleGenerator->setLifespanDistribution(createLifespanDistribution()); ExampleGenerator->setSizeDistribution(createSizeDistribution()); //Creating Particle System ExampleParticleSystem = OSG::ParticleSystem::create(); // add a couple temp particles so the camera is zoomed out ExampleParticleSystem->addParticle(OSG::Pnt3f(0,0,-100),OSG::Vec3f(0,1,0),OSG::Color4f(1,1,1,1),OSG::Vec3f(1,1,1),0.1,OSG::Vec3f(0,0,0),OSG::Vec3f(0,0,0)); ExampleParticleSystem->addParticle(OSG::Pnt3f(0,0,100),OSG::Vec3f(0,1,0),OSG::Color4f(1,1,1,1),OSG::Vec3f(1,1,1),0.1,OSG::Vec3f(0,0,0),OSG::Vec3f(0,0,0)); ExampleParticleSystem->setMaxParticles(200); ExampleParticleSystem->attachUpdateListener(TutorialWindow); //Creating Particle System Drawer PointParticleSystemDrawerRefPtr ExampleParticleSystemDrawer = OSG::PointParticleSystemDrawer::create(); ExampleParticleSystemDrawer->setForcePerParticleSizing(true); // Attaching affector and generator to the particle system ExampleParticleSystem->pushToGenerators(ExampleGenerator); //Particle System Core, setting its system, drawer, and material ParticleSystemCoreRefPtr ParticleNodeCore = OSG::ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); // Create Trail Generator(s) // simple trail generator ExampleTrailGenerator = OSG::SimpleParticleTrailGenerator::create(); ExampleTrailGenerator->setTrailResolution(2.5f); ExampleTrailGenerator->setDrawMethod(SimpleParticleTrailGenerator::POINTS); ExampleTrailGenerator->setTrailLength(3.12); ExampleTrailGenerator->setTrailLengthMethod(ParticleTrailGenerator::TIME); ExampleTrailGenerator->setTrailResolutionMethod(ParticleTrailGenerator::DISTANCE_SPACING); ExampleTrailGenerator->setTrailMaterial(PSMaterial); // attach listener for trail generator to the particle system ExampleParticleSystem->addParticleSystemListener(ExampleTrailGenerator->getParticleSystemListener()); // Set up node with the particle system at its core NodeRefPtr ParticleNode = OSG::Node::create(); ParticleNode->setCore(ParticleNodeCore); // add the trail generator to the scene ParticleNode->addChild(ExampleTrailGenerator); // Make Main Scene Node NodeRefPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); scene->addChild(ParticleNode); mgr->setRoot(scene); // Show the whole Scene mgr->showAll(); mgr->getCamera()->setFar(10000.0f); mgr->getCamera()->setNear(0.1f); mgr->setStatistics(true); //Open Window Vec2f WinSize(TutorialWindow->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindow->getDesktopSize() - WinSize) *0.5); TutorialWindow->openWindow(WinPos, WinSize, "01ParticleTrail"); std::cout << "Controls: " << std::endl << "P: Increase Trail Resolution" << std::endl << "L: Decrease Trail Resolution" << std::endl << "O: Increase Trail Length" << std::endl << "K: Decrease Trail Length" << std::endl << "I: Toggle drawing trails as points/lines" << std::endl << "J: Toggle calculating trail length by num points/time" << std::endl << "Y: Toggle calculating trail point spacing by time/distance" << std::endl << "B: Particle burst" << std::endl; //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 LineChunkRefPtr PSLineChunk = LineChunk::create(); PSLineChunk->setWidth(1.0f); 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); PSMaterialChunk->setLit(false); ChunkMaterialRefPtr PSMaterial = ChunkMaterial::create(); PSMaterial->addChunk(PSLineChunk); PSMaterial->addChunk(PSMaterialChunk); PSMaterial->addChunk(PSBlendChunk); //Particle System ParticleSystemRefPtr ExampleParticleSystem = ParticleSystem::create(); ExampleParticleSystem->attachUpdateListener(TutorialWindow); //Create the particles UInt32 NumParticlesToGenerate(2500); Distribution3DRefPtr PositionDistribution = createPositionDistribution(); Distribution3DRefPtr NormalDistribution = createNormalDistribution(); Distribution3DRefPtr ColorDistribution = createColorDistribution(); Distribution3DRefPtr SizeDistribution = createSizeDistribution(); Distribution1DRefPtr LifespanDistribution = createLifespanDistribution(); Distribution3DRefPtr VelocityDistribution = createVelocityDistribution(); Distribution3DRefPtr AccelerationDistribution = createAccelerationDistribution(); Pnt3f PositionReturnValue; Vec3f NormalReturnValue = Vec3f(0.0,0.0f,1.0f); Color4f ColorReturnValue = Color4f(1.0,1.0f,1.0f, 1.0f); Vec3f SizeReturnValue; Time LifespanReturnValue = -1; Vec3f VelocityReturnValue; Vec3f AccelerationReturnValue; for(UInt32 i(0) ; i< NumParticlesToGenerate ; ++i) { if(PositionDistribution != NULL) { PositionReturnValue.setValue(PositionDistribution->generate().getValues()); } if(ColorDistribution != NULL) { Vec3f ColorRGB = ColorDistribution->generate(); ColorReturnValue.setValuesRGBA(ColorRGB[0],ColorRGB[1],ColorRGB[2],1.0f); } if(SizeDistribution != NULL) { SizeReturnValue = SizeDistribution->generate(); } if(LifespanDistribution != NULL) { LifespanReturnValue = LifespanDistribution->generate(); } if(VelocityDistribution != NULL) { VelocityReturnValue = VelocityDistribution->generate(); } ExampleParticleSystem->addParticle(PositionReturnValue, NormalReturnValue, ColorReturnValue, SizeReturnValue, LifespanReturnValue, VelocityReturnValue, AccelerationReturnValue ); } //Particle System Drawer LineParticleSystemDrawerRefPtr ExampleParticleSystemDrawer = LineParticleSystemDrawer::create(); ExampleParticleSystemDrawer->setLineDirectionSource(LineParticleSystemDrawer::DIRECTION_VELOCITY); ExampleParticleSystemDrawer->setLineLengthSource(LineParticleSystemDrawer::LENGTH_SIZE_X); ExampleParticleSystemDrawer->setEndPointFading(Vec2f(0.0f,1.0f)); //Particle System Node ParticleSystemCoreRefPtr ParticleNodeCore = ParticleSystemCore::create(); ParticleNodeCore->setSystem(ExampleParticleSystem); ParticleNodeCore->setDrawer(ExampleParticleSystemDrawer); ParticleNodeCore->setMaterial(PSMaterial); NodeRefPtr ParticleNode = Node::create(); ParticleNode->setCore(ParticleNodeCore); // Make Main Scene Node and add the Torus NodeRefPtr scene = Node::create(); scene->setCore(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, "02DynamicDistribution"); //Enter main Loop TutorialWindow->mainLoop(); osgExit(); return 0; }