示例#1
0
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();
}