// Creates a particle system from the base system SPK::System* createParticleSystem(const SPK::Vector3D& pos,const SPK::Vector3D& color) { // Creates a copy of the base system SPK::System* system = SPK_Copy(SPK::System,BaseSystemID); // Updates the model with the given color SPK::Model* model = system->getGroup(0)->getModel(); model->setParam(SPK::PARAM_RED,max(0.0f,color.x - 0.25f),min(1.0f,color.x + 0.25f)); model->setParam(SPK::PARAM_GREEN,max(0.0f,color.y - 0.25f),min(1.0f,color.y + 0.25f)); model->setParam(SPK::PARAM_BLUE,max(0.0f,color.z - 0.25f),min(1.0f,color.z + 0.25f)); // Locates the zone of the emitter at the given position SPK::Zone* zone = system->getGroup(0)->getEmitter(0)->getZone(); zone->setPosition(pos); return system; }
//-------------------------------------------------------------------------------------- // Handle updates to the scene. This is called regardless of which D3D API is used //-------------------------------------------------------------------------------------- void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ) { // g_fElapsedTime = fElapsedTime; // Update the camera's position based on user input g_Camera.FrameMove( fElapsedTime ); //g_pCamera->Move(); // Updates particle system particleSystem.update( fElapsedTime ); // Changes the color of the model over time step += fElapsedTime * 0.5f; particleModel->setParam(PARAM_RED,0.6f + 0.4f * sin(step)); particleModel->setParam(PARAM_GREEN,0.6f + 0.4f * sin(step + D3DX_PI * 2.0f / 3.0f)); particleModel->setParam(PARAM_BLUE,0.6f + 0.4f * sin(step + D3DX_PI * 4.0f / 3.0f)); }
// Creates the base system and returns its ID SPK::SPK_ID createParticleSystemBase(GLuint textureIndex) { // Creates the model SPK::Model* model = SPK::Model::create(SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA, SPK::FLAG_ALPHA, SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE); model->setParam(SPK::PARAM_ALPHA,1.0f,0.0f); // This makes the particles fade out over time model->setLifeTime(1.0f,2.0f); // Create the renderer SPK::GL::GLRenderer* renderer = NULL; // If the point sprite extension and the point parameter extensions are supported by the hardware, we use point sprites if ((SPK::GL::GLPointRenderer::loadGLExtPointSprite())&&(SPK::GL::GLPointRenderer::loadGLExtPointParameter())) { SPK::GL::GLPointRenderer* pointRenderer = SPK::GL::GLPointRenderer::create(); pointRenderer->setType(SPK::POINT_SPRITE); pointRenderer->enableWorldSize(true); SPK::GL::GLPointRenderer::setPixelPerUnit(45.0f * 3.14159f / 180.f,screenHeight); pointRenderer->setSize(0.1f); pointRenderer->setTexture(textureIndex); renderer = pointRenderer; } else // else we use quads { SPK::GL::GLQuadRenderer* quadRenderer = SPK::GL::GLQuadRenderer::create(); quadRenderer->setTexturingMode(SPK::TEXTURE_2D); quadRenderer->setScale(0.1f,0.1f); quadRenderer->setTexture(textureIndex); renderer = quadRenderer; } renderer->enableBlending(true); renderer->setBlendingFunctions(GL_SRC_ALPHA,GL_ONE); // additive blending renderer->setTextureBlending(GL_MODULATE); // the texture is modulated with the particle's color renderer->enableRenderingHint(SPK::DEPTH_TEST,false); // the depth test is disabled // Creates the zone SPK::Point* source = SPK::Point::create(); // Creates the emitter SPK::RandomEmitter* emitter = SPK::RandomEmitter::create(); emitter->setForce(2.8f,3.2f); emitter->setZone(source); emitter->setTank(500); emitter->setFlow(-1); // Creates all the particles in the tank at the first frame // Creates the Group SPK::Group* group = SPK::Group::create(model,500); // 500 particles is the maximum capacity of the group group->addEmitter(emitter); group->setGravity(SPK::Vector3D(0.0f,-1.0f,0.0f)); group->setFriction(2.0f); group->setRenderer(renderer); // Creates the System SPK::System* system = SPK::System::create(); system->addGroup(group); // Defines which objects will be shared by all systems model->setShared(true); renderer->setShared(true); // Creates the base and gets a pointer to the base return system->getSPKID(); }
SPK::SPK_ID createExplosion( const SparkDrawable::TextureIDMap& textureIDMap, int screenWidth, int screenHeight ) { SparkDrawable::TextureIDMap::const_iterator itr; GET_TEXTURE_ID( "explosion", textureExplosion ); GET_TEXTURE_ID( "flash", textureFlash ); GET_TEXTURE_ID( "spark1", textureSpark1 ); GET_TEXTURE_ID( "spark2", textureSpark2 ); GET_TEXTURE_ID( "wave", textureWave ); // // Renderers // // smoke renderer SPK::GL::GLQuadRenderer* smokeRenderer = SPK::GL::GLQuadRenderer::create(); smokeRenderer->setTexturingMode(SPK::TEXTURE_2D); smokeRenderer->setTexture(textureExplosion); smokeRenderer->setTextureBlending(GL_MODULATE); smokeRenderer->setAtlasDimensions(2,2); // uses 4 different patterns in the texture smokeRenderer->setBlending(SPK::BLENDING_ALPHA); smokeRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); smokeRenderer->setShared(true); // flame renderer SPK::GL::GLQuadRenderer* flameRenderer = SPK::GL::GLQuadRenderer::create(); flameRenderer->setTexturingMode(SPK::TEXTURE_2D); flameRenderer->setTexture(textureExplosion); flameRenderer->setTextureBlending(GL_MODULATE); flameRenderer->setAtlasDimensions(2,2); flameRenderer->setBlending(SPK::BLENDING_ADD); flameRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); flameRenderer->setShared(true); // flash renderer SPK::GL::GLQuadRenderer* flashRenderer = SPK::GL::GLQuadRenderer::create(); flashRenderer->setTexturingMode(SPK::TEXTURE_2D); flashRenderer->setTexture(textureFlash); flashRenderer->setTextureBlending(GL_REPLACE); flashRenderer->setBlending(SPK::BLENDING_ADD); flashRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); flashRenderer->setShared(true); // spark 1 renderer SPK::GL::GLQuadRenderer* spark1Renderer = SPK::GL::GLQuadRenderer::create(); spark1Renderer->setTexturingMode(SPK::TEXTURE_2D); spark1Renderer->setTexture(textureSpark1); spark1Renderer->setTextureBlending(GL_REPLACE); spark1Renderer->setBlending(SPK::BLENDING_ADD); spark1Renderer->enableRenderingHint(SPK::DEPTH_WRITE,false); spark1Renderer->setOrientation(SPK::DIRECTION_ALIGNED); // sparks are oriented function o their velocity spark1Renderer->setScale(0.05f,1.0f); // thin rectangles spark1Renderer->setShared(true); // spark 2 renderer SPK::GL::GLRenderer* spark2Renderer = NULL; if ( SPK::GL::GLPointRenderer::loadGLExtPointSprite() && SPK::GL::GLPointRenderer::loadGLExtPointParameter()) // uses point sprite if possible { SPK::GL::GLPointRenderer::setPixelPerUnit(45.0f * osg::PI / 180.0f, screenHeight); SPK::GL::GLPointRenderer* pointRenderer = SPK::GL::GLPointRenderer::create(); pointRenderer->setType(SPK::POINT_SPRITE); pointRenderer->setTexture(textureSpark2); pointRenderer->setTextureBlending(GL_MODULATE); pointRenderer->enableWorldSize(true); pointRenderer->setSize(0.02f); spark2Renderer = pointRenderer; } else { SPK::GL::GLQuadRenderer* quadRenderer = SPK::GL::GLQuadRenderer::create(); quadRenderer->setTexturingMode(SPK::TEXTURE_2D); quadRenderer->setTexture(textureSpark2); quadRenderer->setTextureBlending(GL_MODULATE); quadRenderer->setScale(0.02f,0.02f); spark2Renderer = quadRenderer; } spark2Renderer->setBlending(SPK::BLENDING_ADD); spark2Renderer->enableRenderingHint(SPK::DEPTH_WRITE,false); spark2Renderer->setShared(true); // wave renderer SPK::GL::GLQuadRenderer* waveRenderer = SPK::GL::GLQuadRenderer::create(); waveRenderer->setTexturingMode(SPK::TEXTURE_2D); waveRenderer->setTexture(textureWave); waveRenderer->setTextureBlending(GL_MODULATE); waveRenderer->setBlending(SPK::BLENDING_ALPHA); waveRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); waveRenderer->enableRenderingHint(SPK::ALPHA_TEST,true); // uses the alpha test waveRenderer->setAlphaTestThreshold(0.0f); waveRenderer->setOrientation(SPK::FIXED_ORIENTATION); // the orientatin is fixed waveRenderer->lookVector.set(0.0f,1.0f,0.0f); waveRenderer->upVector.set(1.0f,0.0f,0.0f); // we dont really care about the up axis waveRenderer->setShared(true); // // Models // SPK::Interpolator* interpolator = NULL; // pointer to an interpolator that is used to retrieve interpolators // smoke model SPK::Model* smokeModel = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_SIZE | SPK::FLAG_ANGLE | SPK::FLAG_TEXTURE_INDEX, SPK::FLAG_SIZE | SPK::FLAG_ANGLE, SPK::FLAG_SIZE | SPK::FLAG_ANGLE | SPK::FLAG_TEXTURE_INDEX, SPK::FLAG_ALPHA); smokeModel->setParam(SPK::PARAM_RED,0.2f); smokeModel->setParam(SPK::PARAM_GREEN,0.2f); smokeModel->setParam(SPK::PARAM_BLUE,0.2f); smokeModel->setParam(SPK::PARAM_SIZE,0.6f,0.8f,1.0f,1.4f); smokeModel->setParam(SPK::PARAM_TEXTURE_INDEX,0.0f,4.0f); smokeModel->setParam(SPK::PARAM_ANGLE,0.0f,osg::PI * 0.5f,0.0f,osg::PI * 0.5f); smokeModel->setLifeTime(2.5f,3.0f); smokeModel->setShared(true); interpolator = smokeModel->getInterpolator(SPK::PARAM_ALPHA); interpolator->addEntry(0.0f,0.0f); interpolator->addEntry(0.4f,0.4f,0.6f); interpolator->addEntry(0.6f,0.4f,0.6f); interpolator->addEntry(1.0f,0.0f); // flame model SPK::Model* flameModel = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_SIZE | SPK::FLAG_ANGLE | SPK::FLAG_TEXTURE_INDEX, SPK::FLAG_ANGLE | SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE, SPK::FLAG_ANGLE | SPK::FLAG_TEXTURE_INDEX, SPK::FLAG_SIZE | SPK::FLAG_ALPHA); flameModel->setParam(SPK::PARAM_RED,1.0f,0.2f); flameModel->setParam(SPK::PARAM_GREEN,0.5f,0.2f); flameModel->setParam(SPK::PARAM_BLUE,0.2f,0.2f); flameModel->setParam(SPK::PARAM_TEXTURE_INDEX,0.0f,4.0f); flameModel->setParam(SPK::PARAM_ANGLE,0.0f,osg::PI * 0.5f,0.0f,osg::PI * 0.5f); flameModel->setLifeTime(1.5f,2.0f); flameModel->setShared(true); interpolator = flameModel->getInterpolator(SPK::PARAM_SIZE); interpolator->addEntry(0.0f,0.25f); interpolator->addEntry(0.02f,0.6f,0.8f); interpolator->addEntry(1.0f,1.0f,1.4f); interpolator = flameModel->getInterpolator(SPK::PARAM_ALPHA); interpolator->addEntry(0.5f,1.0f); interpolator->addEntry(1.0f,0.0f); // flash model SPK::Model* flashModel = SPK::Model::create( SPK::FLAG_ALPHA | SPK::FLAG_SIZE | SPK::FLAG_ANGLE, SPK::FLAG_NONE, SPK::FLAG_ANGLE, SPK::FLAG_ALPHA | SPK::FLAG_SIZE); flashModel->setParam(SPK::PARAM_ANGLE,0.0f,2.0f * osg::PI); flashModel->setLifeTime(0.5f,0.5f); flashModel->setShared(true); interpolator = flashModel->getInterpolator(SPK::PARAM_SIZE); interpolator->addEntry(0.0f,0.25f); interpolator->addEntry(0.1f,1.0f,2.0f); interpolator = flashModel->getInterpolator(SPK::PARAM_ALPHA); interpolator->addEntry(0.0f,1.0f); interpolator->addEntry(0.4f,0.0f); // spark 1 model SPK::Model* spark1Model = SPK::Model::create( SPK::FLAG_SIZE | SPK::FLAG_ALPHA, SPK::FLAG_ALPHA, SPK::FLAG_SIZE); spark1Model->setParam(SPK::PARAM_ALPHA,1.0f,0.0f); spark1Model->setParam(SPK::PARAM_SIZE,0.2f,0.4f); spark1Model->setLifeTime(0.2f,1.0f); spark1Model->setShared(true); // spark 2 model SPK::Model* spark2Model = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA, SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA, SPK::FLAG_GREEN); spark2Model->setParam(SPK::PARAM_ALPHA,1.0f,0.0f); spark2Model->setParam(SPK::PARAM_RED,1.0f); spark2Model->setParam(SPK::PARAM_GREEN,1.0f,1.0f,0.3f,1.0f); spark2Model->setParam(SPK::PARAM_BLUE,0.7f,0.3f); spark2Model->setLifeTime(1.0f,3.0f); spark2Model->setShared(true); // wave model SPK::Model* waveModel = SPK::Model::create( SPK::FLAG_ALPHA | SPK::FLAG_SIZE, SPK::FLAG_SIZE | SPK::FLAG_ALPHA); waveModel->setParam(SPK::PARAM_SIZE,0.0f,4.0f); waveModel->setParam(SPK::PARAM_ALPHA,0.2f,0.0f); waveModel->setLifeTime(0.8f,0.8f); waveModel->setShared(true); // // Emitters // SPK::Sphere* explosionSphere = SPK::Sphere::create(SPK::Vector3D(0.0f,0.0f,0.0f),0.4f); // smoke emitter SPK::RandomEmitter* smokeEmitter = SPK::RandomEmitter::create(); smokeEmitter->setZone(SPK::Sphere::create(SPK::Vector3D(0.0f,0.0f,0.0f),0.6f),false); smokeEmitter->setFlow(-1); smokeEmitter->setTank(15); smokeEmitter->setForce(0.02f,0.04f); // flame emitter SPK::NormalEmitter* flameEmitter = SPK::NormalEmitter::create(); flameEmitter->setZone(explosionSphere); flameEmitter->setFlow(-1); flameEmitter->setTank(15); flameEmitter->setForce(0.06f,0.1f); // flash emitter SPK::StaticEmitter* flashEmitter = SPK::StaticEmitter::create(); flashEmitter->setZone(SPK::Sphere::create(SPK::Vector3D(0.0f,0.0f,0.0f),0.1f)); flashEmitter->setFlow(-1); flashEmitter->setTank(3); // spark 1 emitter SPK::NormalEmitter* spark1Emitter = SPK::NormalEmitter::create(); spark1Emitter->setZone(explosionSphere); spark1Emitter->setFlow(-1); spark1Emitter->setTank(20); spark1Emitter->setForce(2.0f,3.0f); // spark 2 emitter SPK::NormalEmitter* spark2Emitter = SPK::NormalEmitter::create(); spark2Emitter->setZone(explosionSphere); spark2Emitter->setFlow(-1); spark2Emitter->setTank(400); spark2Emitter->setForce(0.4f,0.8f); // wave emitter SPK::StaticEmitter* waveEmitter = SPK::StaticEmitter::create(); waveEmitter->setZone(SPK::Point::create()); waveEmitter->setFlow(-1); waveEmitter->setTank(1); // // Groups // // smoke group SPK::Group* smokeGroup = SPK::Group::create(smokeModel,15); smokeGroup->addEmitter(smokeEmitter); smokeGroup->setRenderer(smokeRenderer); smokeGroup->setGravity(SPK::Vector3D(0.0f,0.0f,0.05f)); // flame group SPK::Group* flameGroup = SPK::Group::create(flameModel,15); flameGroup->addEmitter(flameEmitter); flameGroup->setRenderer(flameRenderer); // flash group SPK::Group* flashGroup = SPK::Group::create(flashModel,3); flashGroup->addEmitter(flashEmitter); flashGroup->setRenderer(flashRenderer); // spark 1 group SPK::Group* spark1Group = SPK::Group::create(spark1Model,20); spark1Group->addEmitter(spark1Emitter); spark1Group->setRenderer(spark1Renderer); spark1Group->setGravity(SPK::Vector3D(0.0f,0.0f,-1.5f)); // spark 2 group SPK::Group* spark2Group = SPK::Group::create(spark2Model,400); spark2Group->addEmitter(spark2Emitter); spark2Group->setRenderer(spark2Renderer); spark2Group->setGravity(SPK::Vector3D(0.0f,0.0f,-0.3f)); spark2Group->setFriction(0.4f); // wave group SPK::Group* waveGroup = SPK::Group::create(waveModel,1); waveGroup->addEmitter(waveEmitter); waveGroup->setRenderer(waveRenderer); // // System // SPK::System* system = SPK::System::create(); system->addGroup(waveGroup); system->addGroup(smokeGroup); system->addGroup(flameGroup); system->addGroup(flashGroup); system->addGroup(spark1Group); system->addGroup(spark2Group); return system->getSPKID(); }
SPK::SPK_ID createTest( const SparkDrawable::TextureIDMap& textureIDMap, int screenWidth, int screenHeight) { SPK::Model* model; SPK::Emitter* emitter; SPK::Group* group; SPK::System* particleSystem = SPK::System::create(); /* Yellow and red fireball */ model = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA, SPK::FLAG_ALPHA, SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE ); model->setParam(SPK::PARAM_ALPHA, 0.8f, 1.0f); model->setParam(SPK::PARAM_RED, 0.8f, 1.0f); model->setParam(SPK::PARAM_GREEN, 0.0f, 0.5f); model->setParam(SPK::PARAM_BLUE, 0.0f, 0.1f); model->setLifeTime(0.2f, 0.3f); // Emitter emitter = SPK::RandomEmitter::create(); emitter->setZone(SPK::Point::create(SPK::Vector3D(0, 0, 0))); emitter->setFlow(-1); emitter->setTank(4000); emitter->setForce(20.0f, 40.0f); // Create group group = SPK::Group::create(model, 4000); group->addEmitter(emitter); group->setGravity(gravity); particleSystem->addGroup(group); /* Dustsplosion */ model = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA, SPK::FLAG_ALPHA, SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE ); model->setParam(SPK::PARAM_ALPHA, 0.2f, 0.0f); model->setParam(SPK::PARAM_RED, 0.6f, 0.8f); model->setParam(SPK::PARAM_GREEN, 0.6f, 0.8f); model->setParam(SPK::PARAM_BLUE, 0.6f, 0.8f); model->setLifeTime(1.2f, 8.0f); // Emitter emitter = SPK::NormalEmitter::create(); emitter->setZone(SPK::Sphere::create(SPK::Vector3D(0, 0, 0), 2.0f)); emitter->setFlow(-1); emitter->setTank(2000); emitter->setForce(3.0f, 5.0f); // Create group group = SPK::Group::create(model, 2000); group->addEmitter(emitter); group->setGravity(gravity); group->setFriction(1.0f); // System particleSystem->addGroup(group); return particleSystem->getSPKID(); }
//-------------------------------------------------------------------------------------- // Render the scene using the D3D9 device //-------------------------------------------------------------------------------------- void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ) { HRESULT hr; D3DXMATRIXA16 mWorld; D3DXMATRIXA16 mView; D3DXMATRIXA16 mProj; D3DXMATRIXA16 mWorldViewProjection; // If the settings dialog is being shown, then render it instead of rendering the app's scene if( g_SettingsDlg.IsActive() ) { g_SettingsDlg.OnRender( fElapsedTime ); return; } // Clear the render target and the zbuffer V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 0, 0, 0 ), 1.0f, 0 ) ); //V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE( 0.0f, 0.0f, 0.0f, 1.0f ), 1.0f, 0 ) ); // Render the scene if( SUCCEEDED( pd3dDevice->BeginScene() ) ) { // Get the projection & view matrix from the camera class //mWorld = *g_Camera.GetWorldMatrix(); mProj = *g_Camera.GetProjMatrix(); mView = *g_Camera.GetViewMatrix(); D3DXMatrixIdentity(&mWorld); //mWorldViewProjection = mWorld * mView * mProj; //* pd3dDevice->SetTransform(D3DTS_WORLD, &mWorld); pd3dDevice->SetTransform(D3DTS_VIEW, &mView); pd3dDevice->SetTransform(D3DTS_PROJECTION, &mProj); //*/ /* pd3dDevice->SetTransform(D3DTS_PROJECTION, &g_pCamera->m_mProj); pd3dDevice->SetTransform(D3DTS_VIEW, &g_pCamera->m_mView); pd3dDevice->SetTransform(D3DTS_WORLD, &mWorld); //*/ // Update the effect's variables. Instead of using strings, it would // be more efficient to cache a handle to the parameter by calling // ID3DXEffect::GetParameterByName /* V( g_pEffect9->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) ); V( g_pEffect9->SetMatrix( "g_mWorld", &mWorld ) ); V( g_pEffect9->SetFloat( "g_fTime", ( float )fTime ) ); */ pd3dDevice->SetRenderState( D3DRS_AMBIENT, D3DCOLOR_COLORVALUE( 0.8f, 0.8f, 0.8f, 1.0f )); pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, false ); pd3dDevice->SetRenderState( D3DRS_COLORVERTEX, true ); DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"Draw scene" ); particleSystem.render(); DXUT_EndPerfEvent(); DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); // These events are to help PIX identify what the code is doing RenderText(); V( g_HUD.OnRender( fElapsedTime ) ); V( g_SampleUI.OnRender( fElapsedTime ) ); DXUT_EndPerfEvent(); V( pd3dDevice->EndScene() ); } }
void InitSpark() { #ifdef CONSOLE std::cout << "InitSpark" << std::endl; #endif Vector3D gravity(0.0f,-0.8f,0.0f); // Renderers basicRenderer = DX9PointRenderer::create(); // particleRenderer = NULL; pointRenderer = DX9PointRenderer::create(); { pointRenderer->setType(POINT_SPRITE); pointRenderer->enableBlending(true); pointRenderer->setBlendingFunctions(D3DBLEND_SRCALPHA, D3DBLEND_ONE); pointRenderer->setTexture(g_pTextureParticle); pointRenderer->setTextureBlending(D3DTOP_MODULATE); pointRenderer->enableWorldSize(true); DX9PointRenderer::setPixelPerUnit(45.0f * D3DX_PI / 180.f, 600); pointRenderer->setSize(0.05f); particleRenderer = pointRenderer; } //* quadRenderer = DX9QuadRenderer::create(); { quadRenderer->enableBlending(true); quadRenderer->setBlendingFunctions(D3DBLEND_SRCALPHA, D3DBLEND_ONE); quadRenderer->setTexturingMode(TEXTURE_2D); quadRenderer->setTexture(g_pTextureParticle); quadRenderer->setTextureBlending(D3DTOP_MODULATE); quadRenderer->setScale(0.05f,0.05f); //particleRenderer = quadRenderer; } //*/ // Model particleModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA); particleModel->setParam(PARAM_ALPHA,0.8f); // constant alpha particleModel->setLifeTime(8.0f,8.0f); // Emitter point = Point::create(Vector3D(0.0f,0.016f,0.0f)); particleEmitter = SphericEmitter::create(Vector3D(0.0f,1.0f,0.0f), 0.1f * D3DX_PI, 0.1f * D3DX_PI); particleEmitter->setZone(point); particleEmitter->setFlow(250); particleEmitter->setForce(1.5f,1.5f); int n = sizeof(Group); // Group particleGroup = Group::create(particleModel, 2100); particleGroup->addEmitter(particleEmitter); //particleGroup->setRenderer(particleRenderer); particleGroup->setCustomUpdate(&bounceOnFloor); particleGroup->setGravity(gravity); particleSystem.addGroup(particleGroup); //particleGroupPtr = particleGroup; // /!\ obligatoirement après la création du device, car créé les buffers dans certaines conditions particleGroup->setRenderer(particleRenderer); SPKFactory::getInstance().traceAll(); }
SPK::SPK_ID createFire( const SparkDrawable::TextureIDMap& textureIDMap, int screenWidth, int screenHeight ) { SparkDrawable::TextureIDMap::const_iterator itr; GET_TEXTURE_ID( "fire", textureFire ); GET_TEXTURE_ID( "explosion", textureSmoke ); // Renderers SPK::GL::GLQuadRenderer* fireRenderer = SPK::GL::GLQuadRenderer::create(); fireRenderer->setScale(0.3f,0.3f); fireRenderer->setTexturingMode(SPK::TEXTURE_2D); fireRenderer->setTexture(textureFire); fireRenderer->setTextureBlending(GL_MODULATE); fireRenderer->setBlending(SPK::BLENDING_ADD); fireRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); fireRenderer->setAtlasDimensions(2,2); SPK::GL::GLQuadRenderer* smokeRenderer = SPK::GL::GLQuadRenderer::create(); smokeRenderer->setScale(0.3f,0.3f); smokeRenderer->setTexturingMode(SPK::TEXTURE_2D); smokeRenderer->setTexture(textureSmoke); smokeRenderer->setTextureBlending(GL_MODULATE); smokeRenderer->setBlending(SPK::BLENDING_ALPHA); smokeRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); smokeRenderer->setAtlasDimensions(2,2); // Models SPK::Model* fireModel = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_SIZE | SPK::FLAG_ANGLE | SPK::FLAG_TEXTURE_INDEX, SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_ALPHA | SPK::FLAG_ANGLE, SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_TEXTURE_INDEX | SPK::FLAG_ANGLE, SPK::FLAG_SIZE); fireModel->setParam(SPK::PARAM_RED,0.8f,0.9f,0.8f,0.9f); fireModel->setParam(SPK::PARAM_GREEN,0.5f,0.6f,0.5f,0.6f); fireModel->setParam(SPK::PARAM_BLUE,0.3f); fireModel->setParam(SPK::PARAM_ALPHA,0.4f,0.0f); fireModel->setParam(SPK::PARAM_ANGLE,0.0f,2.0f * osg::PI,0.0f,2.0f * osg::PI); fireModel->setParam(SPK::PARAM_TEXTURE_INDEX,0.0f,4.0f); fireModel->setLifeTime(1.0f,1.5f); SPK::Interpolator* interpolator = fireModel->getInterpolator(SPK::PARAM_SIZE); interpolator->addEntry(0.5f,2.0f,5.0f); interpolator->addEntry(1.0f,0.0f); SPK::Model* smokeModel = SPK::Model::create( SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_SIZE | SPK::FLAG_ANGLE | SPK::FLAG_TEXTURE_INDEX, SPK::FLAG_RED | SPK::FLAG_GREEN | SPK::FLAG_SIZE | SPK::FLAG_ANGLE, SPK::FLAG_TEXTURE_INDEX | SPK::FLAG_ANGLE, SPK::FLAG_ALPHA); smokeModel->setParam(SPK::PARAM_RED,0.3f,0.2f); smokeModel->setParam(SPK::PARAM_GREEN,0.25f,0.2f); smokeModel->setParam(SPK::PARAM_BLUE,0.2f); smokeModel->setParam(SPK::PARAM_ALPHA,0.2f,0.0f); smokeModel->setParam(SPK::PARAM_SIZE,5.0,10.0f); smokeModel->setParam(SPK::PARAM_TEXTURE_INDEX,0.0f,4.0f); smokeModel->setParam(SPK::PARAM_ANGLE,0.0f,2.0f * osg::PI,0.0f,2.0f * osg::PI); smokeModel->setLifeTime(5.0f,5.0f); interpolator = smokeModel->getInterpolator(SPK::PARAM_ALPHA); interpolator->addEntry(0.0f,0.0f); interpolator->addEntry(0.2f,0.2f); interpolator->addEntry(1.0f,0.0f); // Emitters // The emitters are arranged so that the fire looks realistic SPK::StraightEmitter* fireEmitter1 = SPK::StraightEmitter::create(SPK::Vector3D(0.0f,0.0f,1.0f)); fireEmitter1->setZone(SPK::Sphere::create(SPK::Vector3D(0.0f,0.0f,-1.0f),0.5f)); fireEmitter1->setFlow(40); fireEmitter1->setForce(1.0f,2.5f); SPK::StraightEmitter* fireEmitter2 = SPK::StraightEmitter::create(SPK::Vector3D(1.0f,0.0f,0.6f)); fireEmitter2->setZone(SPK::Sphere::create(SPK::Vector3D(0.15f,0.075f,-1.2f),0.1f)); fireEmitter2->setFlow(15); fireEmitter2->setForce(0.5f,1.5f); SPK::StraightEmitter* fireEmitter3 = SPK::StraightEmitter::create(SPK::Vector3D(-0.6f,-0.8f,0.8f)); fireEmitter3->setZone(SPK::Sphere::create(SPK::Vector3D(-0.375f,-0.375f,-1.15f),0.3f)); fireEmitter3->setFlow(15); fireEmitter3->setForce(0.5f,1.5f); SPK::StraightEmitter* fireEmitter4 = SPK::StraightEmitter::create(SPK::Vector3D(-0.8f,0.2f,0.5f)); fireEmitter4->setZone(SPK::Sphere::create(SPK::Vector3D(-0.255f,0.225f,-1.2f),0.2f)); fireEmitter4->setFlow(10); fireEmitter4->setForce(0.5f,1.5f); SPK::StraightEmitter* fireEmitter5 = SPK::StraightEmitter::create(SPK::Vector3D(0.1f,-1.0f,0.8f)); fireEmitter5->setZone(SPK::Sphere::create(SPK::Vector3D(-0.075f,-0.3f,-1.2f),0.2f)); fireEmitter5->setFlow(10); fireEmitter5->setForce(0.5f,1.5f); SPK::SphericEmitter* smokeEmitter = SPK::SphericEmitter::create(SPK::Vector3D(0.0f,0.0f,1.0f),0.0f,0.5f * osg::PI); smokeEmitter->setZone(SPK::Sphere::create(SPK::Vector3D(),1.2f)); smokeEmitter->setFlow(25); smokeEmitter->setForce(0.5f,1.0f); // Groups SPK::Group* fireGroup = SPK::Group::create(fireModel,135); fireGroup->addEmitter(fireEmitter1); fireGroup->addEmitter(fireEmitter2); fireGroup->addEmitter(fireEmitter3); fireGroup->addEmitter(fireEmitter4); fireGroup->addEmitter(fireEmitter5); fireGroup->setRenderer(fireRenderer); fireGroup->setGravity(SPK::Vector3D(0.0f,0.0f,3.0f)); SPK::Group* smokeGroup = SPK::Group::create(smokeModel,135); smokeGroup->addEmitter(smokeEmitter); smokeGroup->setRenderer(smokeRenderer); smokeGroup->setGravity(SPK::Vector3D(0.0f,0.0f,0.4f)); // System SPK::System* particleSystem = SPK::System::create(); particleSystem->addGroup(smokeGroup); particleSystem->addGroup(fireGroup); return particleSystem->getSPKID(); }
SPK::SPK_ID createRain( const SparkDrawable::TextureIDMap& textureIDMap, int screenWidth, int screenHeight ) { SparkDrawable::TextureIDMap::const_iterator itr; GET_TEXTURE_ID( "waterdrops", textureSplash ); // Inits Particle Engine SPK::Vector3D gravity = SPK::Vector3D(0.0f,0.0f,-2.0f); // Renderers // the size ratio is used with renderers whose size are defined in pixels. This is to adapt to any resolution float sizeRatio = static_cast<float>(screenWidth) / 1440; // point renderer SPK::GL::GLPointRenderer* dropRenderer = SPK::GL::GLPointRenderer::create(); dropRenderer->setType(SPK::POINT_CIRCLE); dropRenderer->setSize(2.0f * sizeRatio); dropRenderer->enableBlending(true); // line renderer SPK::GL::GLLineRenderer* rainRenderer = SPK::GL::GLLineRenderer::create(); rainRenderer->setLength(-0.1f); rainRenderer->enableBlending(true); // quad renderer SPK::GL::GLQuadRenderer* splashRenderer = SPK::GL::GLQuadRenderer::create(); splashRenderer->setScale(0.05f,0.05f); splashRenderer->setTexturingMode(SPK::TEXTURE_2D); splashRenderer->setTexture(textureSplash); splashRenderer->enableBlending(true); splashRenderer->enableRenderingHint(SPK::DEPTH_WRITE,false); // Models // rain model SPK::Model* rainModel = SPK::Model::create( SPK::FLAG_GREEN | SPK::FLAG_RED | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_MASS, 0, SPK::FLAG_MASS); rainModel->setParam(SPK::PARAM_ALPHA,0.2f); rainModel->setImmortal(true); // drop model SPK::Model* dropModel = SPK::Model::create( SPK::FLAG_GREEN | SPK::FLAG_RED | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_MASS, 0, SPK::FLAG_MASS); dropModel->setParam(SPK::PARAM_ALPHA,0.6f); // splash model SPK::Model* splashModel = SPK::Model::create( SPK::FLAG_GREEN | SPK::FLAG_RED | SPK::FLAG_BLUE | SPK::FLAG_ALPHA | SPK::FLAG_SIZE | SPK::FLAG_ANGLE, SPK::FLAG_SIZE | SPK::FLAG_ALPHA, SPK::FLAG_SIZE | SPK::FLAG_ANGLE); splashModel->setParam(SPK::PARAM_ANGLE,0.0f,2.0f * osg::PI); splashModel->setParam(SPK::PARAM_ALPHA,1.0f,0.0f); // rain emitter SPK::Ring* rainZone = SPK::Ring::create(SPK::Vector3D(0.0f,0.0f,5.0f), SPK::Vector3D(0.0f,0.0f,1.0f)); SPK::SphericEmitter* rainEmitter = SPK::SphericEmitter::create(SPK::Vector3D(0.0f,0.0f,-1.0f),0.0f,0.03f * osg::PI); rainEmitter->setZone(rainZone); // drop emitter SPK::SphericEmitter* dropEmitter = SPK::SphericEmitter::create(SPK::Vector3D(0.0f,0.0f,1.0f),0.0f,0.2f * osg::PI); // Groups // rain group SPK::Group* rainGroup = SPK::Group::create(rainModel,8000); rainGroup->setCustomUpdate(&killRain); rainGroup->setRenderer(rainRenderer); rainGroup->addEmitter(rainEmitter); rainGroup->setFriction(0.7f); rainGroup->setGravity(gravity); // drop group SPK::Group* dropGroup = SPK::Group::create(dropModel,16000); dropGroup->setRenderer(dropRenderer); //dropGroup->addEmitter(dropEmitter); dropGroup->setFriction(0.7f); dropGroup->setGravity(gravity); // splash group SPK::Group* splashGroup = SPK::Group::create(splashModel,2400); splashGroup->setRenderer(splashRenderer); // System SPK::System* particleSystem = SPK::System::create(); particleSystem->addGroup(splashGroup); particleSystem->addGroup(dropGroup); particleSystem->addGroup(rainGroup); // Compute rain RAIN_PARAMeters rainModel->setParam(SPK::PARAM_RED,RAIN_PARAM(1.0f,0.40f)); rainModel->setParam(SPK::PARAM_GREEN,RAIN_PARAM(1.0f,0.40f)); rainModel->setParam(SPK::PARAM_BLUE,RAIN_PARAM(1.0f,0.42f)); rainModel->setParam(SPK::PARAM_MASS,RAIN_PARAM(0.4f,0.8f),RAIN_PARAM(0.8f,1.6f)); dropModel->setParam(SPK::PARAM_RED,RAIN_PARAM(1.0f,0.40f)); dropModel->setParam(SPK::PARAM_GREEN,RAIN_PARAM(1.0f,0.40f)); dropModel->setParam(SPK::PARAM_BLUE,RAIN_PARAM(1.0f,0.42f)); dropModel->setParam(SPK::PARAM_MASS,RAIN_PARAM(0.4f,0.8f),RAIN_PARAM(3.0f,4.0f)); dropModel->setLifeTime(RAIN_PARAM(0.05f,0.3f),RAIN_PARAM(0.1f,0.5f)); splashModel->setParam(SPK::PARAM_RED,RAIN_PARAM(1.0f,0.40f)); splashModel->setParam(SPK::PARAM_GREEN,RAIN_PARAM(1.0f,0.40f)); splashModel->setParam(SPK::PARAM_BLUE,RAIN_PARAM(1.0f,0.42f)); splashModel->setParam(SPK::PARAM_SIZE,0.0f,0.0f,RAIN_PARAM(0.375f,2.25f),RAIN_PARAM(0.75f,3.78f)); splashModel->setLifeTime(RAIN_PARAM(0.2f,0.3f),RAIN_PARAM(0.4f,0.5f)); rainEmitter->setFlow(RAIN_PARAM(0.0f,4800.0f)); rainEmitter->setForce(RAIN_PARAM(3.0f,5.0f),RAIN_PARAM(6.0f,10.0f)); rainZone->setRadius(0.0f,RAIN_PARAM(20.0f,5.0f)); dropEmitter->setForce(RAIN_PARAM(0.1f,1.0f),RAIN_PARAM(0.2f,2.0f)); dropRenderer->setSize(RAIN_PARAM(1.0f,3.0f) * sizeRatio); rainRenderer->setWidth(RAIN_PARAM(1.0f,4.0f) * sizeRatio); g_splashGroup = splashGroup; g_dropGroup = dropGroup; g_dropEmitter = dropEmitter; return particleSystem->getSPKID(); }