void WaterPlane::innerRender( SceneRenderState *state ) { GFXDEBUGEVENT_SCOPE( WaterPlane_innerRender, ColorI( 255, 0, 0 ) ); const Point3F &camPosition = state->getCameraPosition(); Point3F rvec, fvec, uvec, pos; const MatrixF &objMat = getTransform(); //getRenderTransform(); const MatrixF &camMat = state->getCameraTransform(); MatrixF renderMat( true ); camMat.getColumn( 1, &fvec ); uvec.set( 0, 0, 1 ); rvec = mCross( fvec, uvec ); rvec.normalize(); fvec = mCross( uvec, rvec ); pos = camPosition; pos.z = objMat.getPosition().z; renderMat.setColumn( 0, rvec ); renderMat.setColumn( 1, fvec ); renderMat.setColumn( 2, uvec ); renderMat.setColumn( 3, pos ); setRenderTransform( renderMat ); // Setup SceneData SceneData sgData = setupSceneGraphInfo( state ); // set the material S32 matIdx = getMaterialIndex( camPosition ); if ( !initMaterial( matIdx ) ) return; BaseMatInstance *mat = mMatInstances[matIdx]; WaterMatParams matParams = mMatParamHandles[matIdx]; // render the geometry if ( mat ) { // setup proj/world transform mMatrixSet->restoreSceneViewProjection(); mMatrixSet->setWorld(getRenderTransform()); setShaderParams( state, mat, matParams ); while( mat->setupPass( state, sgData ) ) { mat->setSceneInfo(state, sgData); mat->setTransforms(*mMatrixSet, state); setCustomTextures( matIdx, mat->getCurPass(), matParams ); // set vert/prim buffer GFX->setVertexBuffer( mVertBuff ); GFX->setPrimitiveBuffer( mPrimBuff ); GFX->drawIndexedPrimitive( GFXTriangleList, 0, 0, mVertCount, 0, mPrimCount ); } } }
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->drawPrimitive( GFXTriangleStrip, 0, 2 ); } // Clean up GFX->setShader( NULL ); GFX->setTexture( 0, NULL ); }
void ConvexShape::_renderDebug( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *mat ) { GFXDrawUtil *drawer = GFX->getDrawUtil(); GFX->setTexture( 0, NULL ); // Render world box. if ( false ) { Box3F wbox( mWorldBox ); //if ( getServerObject() ) // Box3F wbox = static_cast<ConvexShape*>( getServerObject() )->mWorldBox; GFXStateBlockDesc desc; desc.setCullMode( GFXCullNone ); desc.setFillModeWireframe(); drawer->drawCube( desc, wbox, ColorI::RED ); } const Vector< Point3F > &pointList = mGeometry.points; const Vector< ConvexShape::Face > &faceList = mGeometry.faces; // Render Edges. if ( false ) { GFXTransformSaver saver; //GFXFrustumSaver fsaver; MatrixF xfm( getRenderTransform() ); xfm.scale( getScale() ); GFX->multWorld( xfm ); GFXStateBlockDesc desc; desc.setZReadWrite( true, false ); desc.setBlend( true ); GFX->setStateBlockByDesc( desc ); //MathUtils::getZBiasProjectionMatrix( 0.01f, state->getFrustum(), ) const Point3F &camFvec = state->getCameraTransform().getForwardVector(); for ( S32 i = 0; i < faceList.size(); i++ ) { const ConvexShape::Face &face = faceList[i]; const Vector< ConvexShape::Edge > &edgeList = face.edges; const Vector< U32 > &facePntList = face.points; PrimBuild::begin( GFXLineList, edgeList.size() * 2 ); PrimBuild::color( LinearColorF(ColorI::WHITE) * 0.8f ); for ( S32 j = 0; j < edgeList.size(); j++ ) { PrimBuild::vertex3fv( pointList[ facePntList[ edgeList[j].p0 ] ] - camFvec * 0.001f ); PrimBuild::vertex3fv( pointList[ facePntList[ edgeList[j].p1 ] ] - camFvec * 0.001f ); } PrimBuild::end(); } } ColorI faceColorsx[4] = { ColorI( 255, 0, 0 ), ColorI( 0, 255, 0 ), ColorI( 0, 0, 255 ), ColorI( 255, 0, 255 ) }; MatrixF objToWorld( mObjToWorld ); objToWorld.scale( mObjScale ); // Render faces centers/colors. if ( false ) { GFXStateBlockDesc desc; desc.setCullMode( GFXCullNone ); Point3F size( 0.1f ); for ( S32 i = 0; i < faceList.size(); i++ ) { ColorI color = faceColorsx[ i % 4 ]; LinearColorF tCol = LinearColorF(color); S32 div = ( i / 4 ) * 4; if ( div > 0 ) tCol /= div; tCol.alpha = 1; color = tCol.toColorI(); Point3F pnt; objToWorld.mulP( faceList[i].centroid, &pnt ); drawer->drawCube( desc, size, pnt, color, NULL ); } } // Render winding order. if ( false ) { GFXStateBlockDesc desc; desc.setCullMode( GFXCullNone ); desc.setZReadWrite( true, false ); GFX->setStateBlockByDesc( desc ); U32 pointCount = 0; for ( S32 i = 0; i < faceList.size(); i++ ) pointCount += faceList[i].winding.size(); PrimBuild::begin( GFXLineList, pointCount * 2 ); for ( S32 i = 0; i < faceList.size(); i++ ) { for ( S32 j = 0; j < faceList[i].winding.size(); j++ ) { Point3F p0 = pointList[ faceList[i].points[ faceList[i].winding[j] ] ]; Point3F p1 = p0 + mSurfaces[ faceList[i].id ].getUpVector() * 0.75f * ( Point3F::One / mObjScale ); objToWorld.mulP( p0 ); objToWorld.mulP( p1 ); ColorI color = faceColorsx[j % 4]; LinearColorF tCol = LinearColorF(color); S32 div = (j / 4) * 4; if (div > 0) tCol /= div; tCol.alpha = 1; color = tCol.toColorI(); PrimBuild::color( color ); PrimBuild::vertex3fv( p0 ); PrimBuild::color( color ); PrimBuild::vertex3fv( p1 ); } } PrimBuild::end(); } // Render Points. if ( false ) { /* GFXTransformSaver saver; MatrixF xfm( getRenderTransform() ); xfm.scale( getScale() ); GFX->multWorld( xfm ); GFXStateBlockDesc desc; Point3F size( 0.05f ); */ } // Render surface transforms. if ( false ) { GFXStateBlockDesc desc; desc.setBlend( false ); desc.setZReadWrite( true, true ); Point3F scale(mNormalLength); for ( S32 i = 0; i < mSurfaces.size(); i++ ) { MatrixF objToWorld( mObjToWorld ); objToWorld.scale( mObjScale ); MatrixF renderMat; renderMat.mul( objToWorld, mSurfaces[i] ); renderMat.setPosition( renderMat.getPosition() + renderMat.getUpVector() * 0.001f ); drawer->drawTransform( desc, renderMat, &scale, NULL ); } } }
} GFXImplementVertexFormat( ConvexVert ) { addElement( "POSITION", GFXDeclType_Float3 ); addElement( "COLOR", GFXDeclType_Color ); addElement( "NORMAL", GFXDeclType_Float3 ); addElement( "TANGENT", GFXDeclType_Float3 ); addElement( "TEXCOORD", GFXDeclType_Float2, 0 ); }; static const U32 sgConvexFaceColorCount = 16; static const ColorI sgConvexFaceColors[ sgConvexFaceColorCount ] = { ColorI( 239, 131, 201 ), ColorI( 124, 255, 69 ), ColorI( 255, 65, 77 ), ColorI( 33, 118, 235 ), ColorI( 114, 227, 110 ), ColorI( 197, 50, 237 ), ColorI( 236, 255, 255 ), ColorI( 139, 225, 192 ), ColorI( 215, 9, 65 ), ColorI( 249, 114, 93 ), ColorI( 255, 255, 90 ), ColorI( 93, 104, 97 ), ColorI( 255, 214, 192 ), ColorI( 122, 44, 198 ), ColorI( 137, 141, 194 ), ColorI( 164, 114, 43 )
void AdvancedLightBinManager::render( SceneRenderState *state ) { PROFILE_SCOPE( AdvancedLightManager_Render ); // Take a look at the SceneRenderState and see if we should skip drawing the pre-pass if( state->disableAdvancedLightingBins() ) return; // Automagically save & restore our viewport and transforms. GFXTransformSaver saver; if( !mLightManager ) return; // Get the sunlight. If there's no sun, and no lights in the bins, no draw LightInfo *sunLight = mLightManager->getSpecialLight( LightManager::slSunLightType ); if( !sunLight && mLightBin.empty() ) return; GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render, ColorI::RED ); // Tell the superclass we're about to render if ( !_onPreRender( state ) ) return; // Clear as long as there isn't MRT population of light buffer with lightmap data if ( !MRTLightmapsDuringPrePass() ) GFX->clear(GFXClearTarget, ColorI(0, 0, 0, 0), 1.0f, 0); // Restore transforms MatrixSet &matrixSet = getRenderPass()->getMatrixSet(); matrixSet.restoreSceneViewProjection(); const MatrixF &worldToCameraXfm = matrixSet.getWorldToCamera(); // Set up the SG Data SceneData sgData; sgData.init( state ); // There are cases where shadow rendering is disabled. const bool disableShadows = state->isReflectPass() || ShadowMapPass::smDisableShadows; // Pick the right material for rendering the sunlight... we only // cast shadows when its enabled and we're not in a reflection. LightMaterialInfo *vectorMatInfo; if ( sunLight && sunLight->getCastShadows() && !disableShadows && sunLight->getExtended<ShadowMapParams>() ) vectorMatInfo = _getLightMaterial( LightInfo::Vector, ShadowType_PSSM, false ); else vectorMatInfo = _getLightMaterial( LightInfo::Vector, ShadowType_None, false ); // Initialize and set the per-frame parameters after getting // the vector light material as we use lazy creation. _setupPerFrameParameters( state ); // Draw sunlight/ambient if ( sunLight && vectorMatInfo ) { GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render_Sunlight, ColorI::RED ); // Set up SG data setupSGData( sgData, state, sunLight ); vectorMatInfo->setLightParameters( sunLight, state, worldToCameraXfm ); // Set light holds the active shadow map. mShadowManager->setLightShadowMapForLight( sunLight ); // Set geometry GFX->setVertexBuffer( mFarFrustumQuadVerts ); GFX->setPrimitiveBuffer( NULL ); // Render the material passes while( vectorMatInfo->matInstance->setupPass( state, sgData ) ) { vectorMatInfo->matInstance->setSceneInfo( state, sgData ); vectorMatInfo->matInstance->setTransforms( matrixSet, state, sgData ); GFX->drawPrimitive( GFXTriangleFan, 0, 2 ); } } // Blend the lights in the bin to the light buffer for( LightBinIterator itr = mLightBin.begin(); itr != mLightBin.end(); itr++ ) { LightBinEntry& curEntry = *itr; LightInfo *curLightInfo = curEntry.lightInfo; LightMaterialInfo *curLightMat = curEntry.lightMaterial; const U32 numPrims = curEntry.numPrims; const U32 numVerts = curEntry.vertBuffer->mNumVerts; // Skip lights which won't affect the scene. if ( !curLightMat || curLightInfo->getBrightness() <= 0.001f ) continue; GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render_Light, ColorI::RED ); setupSGData( sgData, state, curLightInfo ); curLightMat->setLightParameters( curLightInfo, state, worldToCameraXfm ); mShadowManager->setLightShadowMap( curEntry.shadowMap ); // Let the shadow know we're about to render from it. if ( curEntry.shadowMap ) curEntry.shadowMap->preLightRender(); // Set geometry GFX->setVertexBuffer( curEntry.vertBuffer ); GFX->setPrimitiveBuffer( curEntry.primBuffer ); // Render the material passes while( curLightMat->matInstance->setupPass( state, sgData ) ) { // Set transforms matrixSet.setWorld(*sgData.objTrans); curLightMat->matInstance->setTransforms(matrixSet, state, sgData); curLightMat->matInstance->setSceneInfo(state, sgData); if(curEntry.primBuffer) GFX->drawIndexedPrimitive(GFXTriangleList, 0, 0, numVerts, 0, numPrims); else GFX->drawPrimitive(GFXTriangleList, 0, numPrims); } // Tell it we're done rendering. if ( curEntry.shadowMap ) curEntry.shadowMap->postLightRender(); } // Set NULL for active shadow map (so nothing gets confused) mShadowManager->setLightShadowMap(NULL); GFX->setVertexBuffer( NULL ); GFX->setPrimitiveBuffer( NULL ); // Fire off a signal to let others know that light-bin rendering is ending now getRenderSignal().trigger(state, this); // Finish up the rendering _onPostRender(); }
//----------------------------------------------------------------------------- // Object Rendering //----------------------------------------------------------------------------- void RenderObjectExample::createGeometry() { static const Point3F cubePoints[8] = { Point3F( 1.0f, -1.0f, -1.0f), Point3F( 1.0f, -1.0f, 1.0f), Point3F( 1.0f, 1.0f, -1.0f), Point3F( 1.0f, 1.0f, 1.0f), Point3F(-1.0f, -1.0f, -1.0f), Point3F(-1.0f, 1.0f, -1.0f), Point3F(-1.0f, -1.0f, 1.0f), Point3F(-1.0f, 1.0f, 1.0f) }; static const Point3F cubeNormals[6] = { Point3F( 1.0f, 0.0f, 0.0f), Point3F(-1.0f, 0.0f, 0.0f), Point3F( 0.0f, 1.0f, 0.0f), Point3F( 0.0f, -1.0f, 0.0f), Point3F( 0.0f, 0.0f, 1.0f), Point3F( 0.0f, 0.0f, -1.0f) }; static const ColorI cubeColors[3] = { ColorI( 255, 0, 0, 255 ), ColorI( 0, 255, 0, 255 ), ColorI( 0, 0, 255, 255 ) }; static const U32 cubeFaces[36][3] = { { 3, 0, 0 }, { 0, 0, 0 }, { 1, 0, 0 }, { 2, 0, 0 }, { 0, 0, 0 }, { 3, 0, 0 }, { 7, 1, 0 }, { 4, 1, 0 }, { 5, 1, 0 }, { 6, 1, 0 }, { 4, 1, 0 }, { 7, 1, 0 }, { 3, 2, 1 }, { 5, 2, 1 }, { 2, 2, 1 }, { 7, 2, 1 }, { 5, 2, 1 }, { 3, 2, 1 }, { 1, 3, 1 }, { 4, 3, 1 }, { 6, 3, 1 }, { 0, 3, 1 }, { 4, 3, 1 }, { 1, 3, 1 }, { 3, 4, 2 }, { 6, 4, 2 }, { 7, 4, 2 }, { 1, 4, 2 }, { 6, 4, 2 }, { 3, 4, 2 }, { 2, 5, 2 }, { 4, 5, 2 }, { 0, 5, 2 }, { 5, 5, 2 }, { 4, 5, 2 }, { 2, 5, 2 } }; // Fill the vertex buffer VertexType *pVert = NULL; mVertexBuffer.set( GFX, 36, GFXBufferTypeStatic ); pVert = mVertexBuffer.lock(); Point3F halfSize = getObjBox().getExtents() * 0.5f; for (U32 i = 0; i < 36; i++) { const U32& vdx = cubeFaces[i][0]; const U32& ndx = cubeFaces[i][1]; const U32& cdx = cubeFaces[i][2]; pVert[i].point = cubePoints[vdx] * halfSize; pVert[i].normal = cubeNormals[ndx]; pVert[i].color = cubeColors[cdx]; } mVertexBuffer.unlock(); // Set up our normal and reflection StateBlocks GFXStateBlockDesc desc; // The normal StateBlock only needs a default StateBlock mNormalSB = GFX->createStateBlock( desc ); // The reflection needs its culling reversed desc.cullDefined = true; desc.cullMode = GFXCullCW; mReflectSB = GFX->createStateBlock( desc ); }