void ProcessedShaderMaterial::setTransforms(const MatrixSet &matrixSet, SceneRenderState *state, const U32 pass) { PROFILE_SCOPE( ProcessedShaderMaterial_setTransforms ); GFXShaderConstBuffer* shaderConsts = _getShaderConstBuffer(pass); ShaderConstHandles* handles = _getShaderConstHandles(pass); // The MatrixSet will lazily generate a matrix under the // various 'get' methods, so inline the test for a valid // shader constant handle to avoid that work when we can. if ( handles->mModelViewProjSC->isValid() ) shaderConsts->set( handles->mModelViewProjSC, matrixSet.getWorldViewProjection() ); if ( handles->mObjTransSC->isValid() ) shaderConsts->set( handles->mObjTransSC, matrixSet.getObjectToWorld() ); if ( handles->mWorldToObjSC->isValid() ) shaderConsts->set( handles->mWorldToObjSC, matrixSet.getWorldToObject() ); if ( handles->mWorldToCameraSC->isValid() ) shaderConsts->set( handles->mWorldToCameraSC, matrixSet.getWorldToCamera() ); if ( handles->mWorldViewOnlySC->isValid() ) shaderConsts->set( handles->mWorldViewOnlySC, matrixSet.getObjectToCamera() ); if ( handles->mViewToObjSC->isValid() ) shaderConsts->set( handles->mViewToObjSC, matrixSet.getCameraToObject() ); if ( handles->mViewProjSC->isValid() ) shaderConsts->set( handles->mViewProjSC, matrixSet.getWorldToScreen() ); if ( handles->mCubeTransSC->isValid() && ( _hasCubemap(pass) || mMaterial->mDynamicCubemap ) ) { // TODO: Could we not remove this constant? Use mObjTransSC and cast to float3x3 instead? shaderConsts->set(handles->mCubeTransSC, matrixSet.getObjectToWorld(), GFXSCT_Float3x3); } if ( handles->m_vEyeSC->isValid() ) shaderConsts->set( handles->m_vEyeSC, state->getVectorEye() ); }
void GuiMaterialCtrl::onRender( Point2I offset, const RectI &updateRect ) { Parent::onRender( offset, updateRect ); if ( !mMaterialInst ) return; // Draw a quad with the material assigned GFXVertexBufferHandle<GFXVertexPCT> verts( GFX, 4, GFXBufferTypeVolatile ); verts.lock(); F32 screenLeft = updateRect.point.x; F32 screenRight = (updateRect.point.x + updateRect.extent.x); F32 screenTop = updateRect.point.y; F32 screenBottom = (updateRect.point.y + updateRect.extent.y); const F32 fillConv = GFX->getFillConventionOffset(); verts[0].point.set( screenLeft - fillConv, screenTop - fillConv, 0.f ); verts[1].point.set( screenRight - fillConv, screenTop - fillConv, 0.f ); verts[2].point.set( screenLeft - fillConv, screenBottom - fillConv, 0.f ); verts[3].point.set( screenRight - fillConv, screenBottom - fillConv, 0.f ); verts[0].color = verts[1].color = verts[2].color = verts[3].color = ColorI( 255, 255, 255, 255 ); verts[0].texCoord.set( 0.0f, 0.0f ); verts[1].texCoord.set( 1.0f, 0.0f ); verts[2].texCoord.set( 0.0f, 1.0f ); verts[3].texCoord.set( 1.0f, 1.0f ); verts.unlock(); GFX->setVertexBuffer( verts ); MatrixSet matSet; matSet.setWorld(GFX->getWorldMatrix()); matSet.setView(GFX->getViewMatrix()); matSet.setProjection(GFX->getProjectionMatrix()); MatrixF cameraMatrix( true ); F32 left, right, top, bottom, nearPlane, farPlane; bool isOrtho; GFX->getFrustum( &left, &right, &bottom, &top, &nearPlane, &farPlane, &isOrtho ); Frustum frust( isOrtho, left, right, top, bottom, nearPlane, farPlane, cameraMatrix ); SceneRenderState state ( gClientSceneGraph, SPT_Diffuse, SceneCameraState( GFX->getViewport(), frust, GFX->getWorldMatrix(), GFX->getProjectionMatrix() ), gClientSceneGraph->getDefaultRenderPass(), false ); SceneData sgData; sgData.init( &state ); sgData.wireframe = false; // Don't wireframe this. while( mMaterialInst->setupPass( &state, sgData ) ) { mMaterialInst->setSceneInfo( &state, sgData ); mMaterialInst->setTransforms( matSet, &state ); GFX->setupGenericShaders(); GFX->drawPrimitive( GFXTriangleStrip, 0, 2 ); } // Clean up GFX->setShader( NULL ); GFX->setTexture( 0, NULL ); }
void ProcessedFFMaterial::setTransforms(const MatrixSet &matrixSet, SceneState *state, const U32 pass) { GFX->setWorldMatrix(matrixSet.getObjectToWorld()); GFX->setViewMatrix(matrixSet.getWorldToCamera()); GFX->setProjectionMatrix(matrixSet.getCameraToScreen()); }