renders the current scene to the offscreen buffers. empties the render queue when done.
| 292 | |
| 293 | // renders the current scene to the offscreen buffers. empties the render queue when done. |
| 294 | void Renderer::render(const physx::PxMat44 &eye, const RendererProjection &proj, RendererTarget *target, bool depthOnly) |
| 295 | { |
| 296 | PX_PROFILE_ZONE("Renderer_render",0); |
| 297 | const PxU32 numLights = (PxU32)m_visibleLights.size(); |
| 298 | if(target) |
| 299 | { |
| 300 | target->bind(); |
| 301 | } |
| 302 | // TODO: Sort meshes by material.. |
| 303 | ScopedRender renderSection(*this); |
| 304 | if(renderSection) |
| 305 | { |
| 306 | if(!depthOnly) |
| 307 | { |
| 308 | // YOU CAN PASS THE PROJECTION MATIX RIGHT INTO THIS FUNCTION! |
| 309 | // TODO: Get rid of this. |
| 310 | if (m_screenSpaceMeshes.size()) |
| 311 | { |
| 312 | physx::PxMat44 id = physx::PxMat44(PxIdentity); |
| 313 | bindViewProj(id, RendererProjection(-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f)); //TODO: pass screen space matrices |
| 314 | renderMeshes(m_screenSpaceMeshes, RendererMaterial::PASS_UNLIT); //render screen space stuff first so stuff we occlude doesn't waste time on shading. |
| 315 | } |
| 316 | } |
| 317 | |
| 318 | sortMeshes(eye); |
| 319 | |
| 320 | if(depthOnly) |
| 321 | { |
| 322 | PX_PROFILE_ZONE("Renderer_render_depthOnly",0); |
| 323 | bindAmbientState(RendererColor(0,0,0,255)); |
| 324 | bindViewProj(eye, proj); |
| 325 | renderMeshes(m_visibleLitMeshes, RendererMaterial::PASS_DEPTH); |
| 326 | renderMeshes(m_visibleUnlitMeshes, RendererMaterial::PASS_DEPTH); |
| 327 | } |
| 328 | else if(numLights > RENDERER_DEFERRED_THRESHOLD) |
| 329 | { |
| 330 | PX_PROFILE_ZONE("Renderer_render_deferred",0); |
| 331 | bindDeferredState(); |
| 332 | bindViewProj(eye, proj); |
| 333 | renderMeshes(m_visibleLitMeshes, RendererMaterial::PASS_UNLIT); |
| 334 | renderMeshes(m_visibleUnlitMeshes, RendererMaterial::PASS_UNLIT); |
| 335 | renderMeshes(m_visibleLitTransparentMeshes, RendererMaterial::PASS_UNLIT); |
| 336 | renderDeferredLights(); |
| 337 | } |
| 338 | else if(numLights > 0) |
| 339 | { |
| 340 | PX_PROFILE_ZONE("Renderer_render_lit",0); |
| 341 | bindAmbientState(m_ambientColor); |
| 342 | bindFogState(m_fogColor, m_fogDistance); |
| 343 | bindViewProj(eye, proj); |
| 344 | |
| 345 | #if RENDERER_ENABLE_SINGLE_PASS_LIGHTING |
| 346 | for(PxU32 i=0; i<numLights; i++) |
| 347 | { |
| 348 | m_visibleLights[i]->bind(i); |
| 349 | } |
| 350 | renderMeshes(m_visibleLitMeshes, m_visibleLights[0]->getPass()); |
| 351 | for(PxU32 i=0; i<numLights; i++) |
no test coverage detected