| 1063 | } |
| 1064 | |
| 1065 | void VolumetricFog::render(ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat) |
| 1066 | { |
| 1067 | if (overrideMat || !mShapeLoaded || !isClientObject() || mResizing) |
| 1068 | return; |
| 1069 | |
| 1070 | PROFILE_SCOPE(VolumetricFog_Render); |
| 1071 | |
| 1072 | GFXTransformSaver saver; |
| 1073 | GFX->setVertexBuffer(mVB); |
| 1074 | GFX->setPrimitiveBuffer(mPB); |
| 1075 | |
| 1076 | MatrixF mat = getRenderTransform(); |
| 1077 | mat.scale(mObjScale); |
| 1078 | GFX->multWorld(mat); |
| 1079 | |
| 1080 | GFX->setShader(mDeferredShader); |
| 1081 | GFX->setShaderConstBuffer(mPPShaderConsts); |
| 1082 | GFX->setStateBlock(mStateblock_preD); |
| 1083 | |
| 1084 | // Set all the shader consts... |
| 1085 | |
| 1086 | MatrixF xform(GFX->getProjectionMatrix()); |
| 1087 | xform *= GFX->getViewMatrix(); |
| 1088 | xform *= GFX->getWorldMatrix(); |
| 1089 | |
| 1090 | mPPShaderConsts->setSafe(mPPModelViewProjSC, xform); |
| 1091 | |
| 1092 | const LinearColorF &sunlight = state->getAmbientLightColor(); |
| 1093 | |
| 1094 | Point3F ambientColor(sunlight.red, sunlight.green, sunlight.blue); |
| 1095 | mShaderConsts->setSafe(mAmbientColorSC, ambientColor); |
| 1096 | |
| 1097 | GFXTextureObject *mDepthBuffer = mDepthBufferTarget ? mDepthBufferTarget->getTexture(0) : NULL; |
| 1098 | GFXTextureObject *mFrontBuffer = mFrontBufferTarget ? mFrontBufferTarget->getTexture(0) : NULL; |
| 1099 | |
| 1100 | GFX->pushActiveRenderTarget(); |
| 1101 | |
| 1102 | //render backside to target mDepthBuffer |
| 1103 | z_buf->attachTexture(GFXTextureTarget::DepthStencil, GFXTextureTarget::sDefaultDepthStencil); |
| 1104 | z_buf->attachTexture(GFXTextureTarget::Color0, mDepthBuffer); |
| 1105 | |
| 1106 | GFX->setActiveRenderTarget(z_buf); |
| 1107 | GFX->clear(GFXClearStencil | GFXClearTarget , ColorI(0,0,0,0), 1.0f, 0); |
| 1108 | |
| 1109 | GFX->drawPrimitive(0); |
| 1110 | z_buf->resolve(); |
| 1111 | |
| 1112 | //render frontside to target mFrontBuffer |
| 1113 | z_buf->attachTexture(GFXTextureTarget::DepthStencil, GFXTextureTarget::sDefaultDepthStencil); |
| 1114 | z_buf->attachTexture(GFXTextureTarget::Color0, mFrontBuffer); |
| 1115 | GFX->clear(GFXClearStencil | GFXClearTarget, ColorI(0, 0, 0, 0), 1.0f, 0); |
| 1116 | |
| 1117 | GFX->setStateBlock(mStateblock_preF); |
| 1118 | |
| 1119 | GFX->drawPrimitive(0); |
| 1120 | z_buf->resolve(); |
| 1121 | |
| 1122 | GFX->popActiveRenderTarget(); |
no test coverage detected