| 370 | } |
| 371 | |
| 372 | void RenderParticleMgr::renderInstance(ParticleRenderInst *ri, SceneRenderState *state) |
| 373 | { |
| 374 | // Draw system path, or draw composite path |
| 375 | if(ri->systemState == PSS_DrawComplete) |
| 376 | return; |
| 377 | |
| 378 | if(ri->systemState != PSS_AwaitingCompositeDraw) |
| 379 | { |
| 380 | // Set proper stateblock, and update state |
| 381 | if(ri->systemState == PSS_AwaitingOffscreenDraw) |
| 382 | { |
| 383 | GFX->setStateBlock( _getOffscreenStateBlock(ri) ); |
| 384 | ri->systemState = PSS_AwaitingCompositeDraw; |
| 385 | mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mModelViewProjSC, |
| 386 | *ri->modelViewProj * mOffscreenSystems[ri->targetIndex].clipMatrix ); |
| 387 | } |
| 388 | else |
| 389 | { |
| 390 | if(ri->systemState == PSS_AwaitingMixedResDraw) |
| 391 | GFX->setStateBlock( _getMixedResStateBlock( ri ) ); |
| 392 | else |
| 393 | GFX->setStateBlock( _getHighResStateBlock( ri ) ); |
| 394 | ri->systemState = PSS_DrawComplete; |
| 395 | mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mModelViewProjSC, *ri->modelViewProj ); |
| 396 | } |
| 397 | |
| 398 | renderParticle(ri, state); |
| 399 | } |
| 400 | else if(ri->systemState == PSS_AwaitingCompositeDraw) |
| 401 | { |
| 402 | OffscreenSystemEntry &systemEntry = mOffscreenSystems[ri->targetIndex]; |
| 403 | |
| 404 | // If this system has already been composited this frame, skip it |
| 405 | if(systemEntry.drawnThisFrame) |
| 406 | return; |
| 407 | |
| 408 | // Non-target render, composite the particle system back into the scene |
| 409 | GFX->setVertexBuffer(mScreenQuadVertBuff); |
| 410 | GFX->setPrimitiveBuffer(mScreenQuadPrimBuff); |
| 411 | |
| 412 | |
| 413 | // Set up shader constants |
| 414 | mParticleCompositeShaderConsts.mShaderConsts->setSafe( mParticleCompositeShaderConsts.mScreenRect, *((Point4F *)&systemEntry.screenRect) ); |
| 415 | |
| 416 | // Set offscreen texture |
| 417 | Point4F rtParams; |
| 418 | GFXTextureObject *particleSource = mNamedTarget.getTexture(); |
| 419 | GFX->setTexture( mParticleCompositeShaderConsts.mSamplerColorSource->getSamplerRegister(), particleSource ); |
| 420 | if(particleSource) |
| 421 | { |
| 422 | ScreenSpace::RenderTargetParameters(particleSource->getSize(), mNamedTarget.getViewport(), rtParams); |
| 423 | mParticleCompositeShaderConsts.mShaderConsts->setSafe( mParticleCompositeShaderConsts.mOffscreenTargetParamsSC, rtParams ); |
| 424 | } |
| 425 | |
| 426 | // And edges |
| 427 | GFXTextureObject *texObject = mEdgeTarget ? mEdgeTarget->getTexture() : NULL; |
| 428 | GFX->setTexture( mParticleCompositeShaderConsts.mSamplerEdgeSource->getSamplerRegister(), texObject ); |
| 429 | if(texObject) |
no test coverage detected