void EngineExhaustNode::addNozzle( irr::core::vector3df offset ) { auto fire = SceneManager->addParticleSystemSceneNode(false, this, 0); fire->setParticleBehavior( EPB_EMITTER_VECTOR_IGNORE_ROTATION | EPB_EMITTER_FRAME_INTERPOLATION); fire->setParticlesAreGlobal(true); //Emitter auto emitter = fire->createSphereEmitter( offset, mRadius, vector3df(0,0,-1), 20, 20, SColor(255,255,255,255), SColor(255,255,255,255), mParticleLifetime - 100, mParticleLifetime, 5, dimension2df(mParticleSize, mParticleSize), dimension2df( mParticleSize * 1.5, mParticleSize * 1.5)); fire->setEmitter(emitter); fire->addAffector(mFadeOutAffector); fire->addAffector(mScaleAffector); fire->setMaterialFlag(EMF_LIGHTING, false); fire->setMaterialTexture(0, mFireTexture); fire->setMaterialType(EMT_TRANSPARENT_ADD_COLOR); //fire->setMaterialType( EMT_TRANSPARENT_ALPHA_CHANNEL ); mFireEmitters.push_back( fire ); }
void CMazeGameEngine::addFinishPoint() { auto prizeLocation = _worldModel.getFinishPoint(); auto prizeSceneNode = _sceneManager->addBillboardSceneNode(_mazeRootSceneNode, irr::core::dimension2df(0.5f, 0.5f), irr::core::vector3df(static_cast<float>(prizeLocation.first) - 0.5f, 0.75f, static_cast<float>(prizeLocation.second) - 0.5f)); prizeSceneNode->setMaterialFlag(irr::video::EMF_LIGHTING, false); prizeSceneNode->setMaterialType(irr::video::EMT_TRANSPARENT_ADD_COLOR); prizeSceneNode->setMaterialTexture(0, _videoDriver->getTexture("../media/particle.bmp")); _sceneManager->addLightSceneNode(prizeSceneNode, irr::core::vector3df(), irr::video::SColorf(1.0f, 0.0f, 0.5f), 1.0f); auto animator = _sceneManager->createFlyCircleAnimator( irr::core::vector3df(static_cast<float>(prizeLocation.first) - 0.5f, 0.75f, static_cast<float>(prizeLocation.second) - 0.5f), 0.2f); prizeSceneNode->addAnimator(animator); animator->drop(); auto miniPrizeSceneNode = _sceneManager->addBillboardSceneNode(prizeSceneNode, irr::core::dimension2df(0.3f, 0.3f)); miniPrizeSceneNode->setMaterialFlag(irr::video::EMF_LIGHTING, false); miniPrizeSceneNode->setMaterialType(irr::video::EMT_TRANSPARENT_ADD_COLOR); miniPrizeSceneNode->setMaterialTexture(0, _videoDriver->getTexture("../media/portal2.bmp")); animator = _sceneManager->createFlyCircleAnimator(irr::core::vector3df(), 0.15f,0.015f); miniPrizeSceneNode->addAnimator(animator); animator->drop(); }
void ParticleSystemProxy::setEmitter(scene::IParticleEmitter* emitter) { CParticleSystemSceneNode::setEmitter(emitter); if (!emitter || !isGPUParticleType(emitter->getType())) return; has_height_map = false; flip = false; // Pass a fake material type to force irrlicht to update its internal states on rendering setMaterialType(irr_driver->getShader(ES_RAIN)); setAutomaticCulling(0); count = emitter->getMaxParticlesPerSecond() * emitter->getMaxLifeTime() / 1000; switch (emitter->getType()) { case scene::EPET_POINT: generateParticlesFromPointEmitter(emitter); break; case scene::EPET_BOX: generateParticlesFromBoxEmitter(static_cast<scene::IParticleBoxEmitter *>(emitter)); break; case scene::EPET_SPHERE: generateParticlesFromSphereEmitter(static_cast<scene::IParticleSphereEmitter *>(emitter)); break; default: assert(0 && "Wrong particle type"); } glBindBuffer(GL_ARRAY_BUFFER, 0); texture = getTextureGLuint(getMaterial(0).getTexture(0)); normal_and_depth = getTextureGLuint(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH)); if (SimpleSimulationShader::Program && SimpleParticleRender::Program && FlipParticleRender::Program && HeightmapSimulationShader::Program) return; SimpleSimulationShader::init(); HeightmapSimulationShader::init(); SimpleParticleRender::init(); FlipParticleRender::init(); }