| 470 | } |
| 471 | |
| 472 | void RenderParticleMgr::renderParticle(ParticleRenderInst* ri, SceneRenderState* state) |
| 473 | { |
| 474 | // We want to turn everything into variation on a pre-multiplied alpha blend |
| 475 | F32 alphaFactor = 0.0f, alphaScale = 1.0f; |
| 476 | switch(ri->blendStyle) |
| 477 | { |
| 478 | // SrcAlpha, InvSrcAlpha |
| 479 | case ParticleRenderInst::BlendNormal: |
| 480 | alphaFactor = 1.0f; |
| 481 | break; |
| 482 | |
| 483 | // SrcAlpha, One |
| 484 | case ParticleRenderInst::BlendAdditive: |
| 485 | alphaFactor = 1.0f; |
| 486 | alphaScale = 0.0f; |
| 487 | break; |
| 488 | |
| 489 | // SrcColor, One |
| 490 | case ParticleRenderInst::BlendGreyscale: |
| 491 | alphaFactor = -1.0f; |
| 492 | alphaScale = 0.0f; |
| 493 | break; |
| 494 | } |
| 495 | |
| 496 | mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mAlphaFactorSC, alphaFactor ); |
| 497 | mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mAlphaScaleSC, alphaScale ); |
| 498 | |
| 499 | mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mFSModelViewProjSC, *ri->modelViewProj ); |
| 500 | mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mOneOverFarSC, 1.0f / state->getFarPlane() ); |
| 501 | |
| 502 | if ( mParticleShaderConsts.mOneOverSoftnessSC->isValid() ) |
| 503 | { |
| 504 | F32 oneOverSoftness = 1.0f; |
| 505 | if ( ri->softnessDistance > 0.0f ) |
| 506 | oneOverSoftness = 1.0f / ( ri->softnessDistance / state->getFarPlane() ); |
| 507 | mParticleShaderConsts.mShaderConsts->set( mParticleShaderConsts.mOneOverSoftnessSC, oneOverSoftness ); |
| 508 | } |
| 509 | |
| 510 | GFX->setShader( mParticleShader ); |
| 511 | GFX->setShaderConstBuffer( mParticleShaderConsts.mShaderConsts ); |
| 512 | |
| 513 | GFX->setTexture( mParticleShaderConsts.mSamplerDiffuse->getSamplerRegister(), ri->diffuseTex ); |
| 514 | |
| 515 | // Set up the prepass texture. |
| 516 | if ( mParticleShaderConsts.mPrePassTargetParamsSC->isValid() ) |
| 517 | { |
| 518 | GFXTextureObject *texObject = mPrepassTarget ? mPrepassTarget->getTexture(0) : NULL; |
| 519 | GFX->setTexture( mParticleShaderConsts.mSamplerPrePassTex->getSamplerRegister(), texObject ); |
| 520 | |
| 521 | Point4F rtParams( 0.0f, 0.0f, 1.0f, 1.0f ); |
| 522 | if ( texObject ) |
| 523 | ScreenSpace::RenderTargetParameters(texObject->getSize(), mPrepassTarget->getViewport(), rtParams); |
| 524 | |
| 525 | mParticleShaderConsts.mShaderConsts->set( mParticleShaderConsts.mPrePassTargetParamsSC, rtParams ); |
| 526 | } |
| 527 | |
| 528 | GFX->setPrimitiveBuffer( *ri->primBuff ); |
| 529 | GFX->setVertexBuffer( *ri->vertBuff ); |
no test coverage detected