// Render given model void shaRender(void) { ASSERT(_ctVertices>0); ASSERT(_ctIndices>0); ASSERT(_paVertices!=NULL); ASSERT(_paIndices!=NULL); // Set vertices gfxSetVertexArray(_paVertices,_ctVertices); gfxLockArrays(); // if there is valid UVMap if(_pCurrentUVMap!=NULL) { gfxSetTexCoordArray(_pCurrentUVMap, FALSE); } // if there is valid vertex color array if(_pcolVtxColors!=NULL) { gfxSetColorArray(_pcolVtxColors); } // draw model with set params gfxDrawElements( _ctIndices, _paIndices); gfxUnlockArrays(); }
// Render one tile in wireframe mode static void RenderWireTile(INDEX itt) { ASSERT(_ptrTerrain!=NULL); CTerrainTile &tt = _ptrTerrain->tr_attTiles[itt]; INDEX ctVertices = tt.GetVertices().Count(); GFXVertex4 *pavVertices; if(ter_bLerpVertices) { PrepareSmothVertices(itt); pavVertices = &_avLerpedVerices[0]; } else { pavVertices = &tt.GetVertices()[0]; } INDEX ctIndices = tt.GetIndices().Count(); if(ctIndices>0) { gfxDisableBlend(); gfxDisableTexture(); gfxSetConstantColor(_colTerrainEdges); gfxSetVertexArray(pavVertices,ctVertices); gfxLockArrays(); gfxDrawElements(ctIndices,&tt.GetIndices()[0]); gfxUnlockArrays(); } }
// Draw all tiles that are in lowest lod static void RenderBatchedTiles(void) { // Set texture wrapping gfxSetTextureWrapping(GFX_CLAMP,GFX_CLAMP); // Use terrains global top map as texture _ptrTerrain->tr_tdTopMap.SetAsCurrent(); GFXVertex4 *pavVertices = &_avDelayedVertices[0]; GFXTexCoord *pauvTexCoords = &_auvDelayedTexCoords[0]; GFXTexCoord *pauvShadowMapTC = &_auvDelayedShadowMapTC[0]; INDEX *paiIndices = &_aiDelayedIndices[0]; INDEX ctVertices = _avDelayedVertices.Count(); INDEX ctIndices = _aiDelayedIndices.Count(); // Prepare white color array FillConstColorArray(ctVertices); GFXColor *pacolColors = &_acolVtxConstColors[0]; gfxEnableAlphaTest(); gfxDisableBlend(); gfxSetVertexArray(pavVertices,ctVertices); gfxSetTexCoordArray(pauvTexCoords, FALSE); gfxSetColorArray(pacolColors); gfxLockArrays(); gfxDrawElements(ctIndices,paiIndices); gfxDisableAlphaTest(); _ctTris +=ctIndices/2; // if shadows are visible if(_wrpWorldRenderPrefs.wrp_shtShadows!=CWorldRenderPrefs::SHT_NONE) { gfxDepthFunc(GFX_EQUAL); gfxBlendFunc(GFX_DST_COLOR,GFX_SRC_COLOR); gfxEnableBlend(); gfxSetTexCoordArray(pauvShadowMapTC, FALSE); _ptrTerrain->tr_tdShadowMap.SetAsCurrent(); gfxDrawElements(ctIndices,paiIndices); gfxDepthFunc(GFX_LESS_EQUAL); } if(_ptrTerrain->GetFlags()&TR_HAS_FOG) { RenderFogLayer(-1); } if(_ptrTerrain->GetFlags()&TR_HAS_HAZE) { RenderHazeLayer(-1); } gfxUnlockArrays(); // Popall delayed arrays _avDelayedVertices.PopAll(); _auvDelayedTexCoords.PopAll(); _auvDelayedShadowMapTC.PopAll(); _aiDelayedIndices.PopAll(); }
static DOUBLE TrisTroughputPass(INDEX ct) { if( !_pdp->Lock()) { ASSERT(FALSE); return 0.0; } StartTimer(); gfxSetFrustum( -0.5f, +0.5f, -0.5f, +0.5f, 0.5f, 2.0f); gfxSetViewMatrix(NULL); gfxCullFace(GFX_NONE); _pdp->Fill(C_GRAY|255); _pdp->FillZBuffer(1.0f); if(_bTexture) { gfxEnableTexture(); } else { gfxDisableTexture(); } if(_bBlend) { gfxEnableBlend(); gfxBlendFunc( GFX_ONE, GFX_ONE); } else { gfxDisableBlend(); } if(_bDepth) { gfxEnableDepthTest(); gfxEnableDepthWrite(); } else { gfxDisableDepthTest(); gfxDisableDepthWrite(); } gfxDisableAlphaTest(); gfxSetVertexArray( &_avtx[0], _avtx.Count()); gfxLockArrays(); gfxSetTexCoordArray( &_atex[0], FALSE); gfxSetColorArray( &_acol[0]); if(_bMultiTexture) { gfxSetTextureUnit(1); gfxEnableTexture(); gfxSetTexture( _ulTexObject, _tpLocal); gfxSetTexCoordArray( &_atex[0], FALSE); gfxSetTextureUnit(0); } for( INDEX i=0; i<ct; i++) gfxDrawElements( _aiElements.Count(), &_aiElements[0]); gfxUnlockArrays(); if(_bMultiTexture) { gfxSetTextureUnit(1); gfxDisableTexture(); gfxSetTextureUnit(0); } _pdp->Unlock(); gfxFinish(); _pvp->SwapBuffers(); return StopTimer(); }
// Render one tile static void RenderTile(INDEX itt) { ASSERT(_ptrTerrain!=NULL); CTerrainTile &tt = _ptrTerrain->tr_attTiles[itt]; INDEX ctVertices = tt.GetVertices().Count(); extern INDEX ter_bOptimizeRendering; // if tile is in posible lowest lod and doesn't have any border vertices if(ter_bOptimizeRendering && tt.GetFlags()&TT_IN_LOWEST_LOD) { // delay tile rendering BatchTile(itt); return; } GFXVertex4 *pavVertices; // if vertex lerping is requested if(ter_bLerpVertices==1) { // Prepare smoth vertices PrepareSmothVertices(itt); pavVertices = &_avLerpedVerices[0]; } else { // use non smoth vertices pavVertices = &tt.GetVertices()[0]; } // if tile is in highest lod if(tt.tt_iLod==0) { gfxBlendFunc(GFX_SRC_ALPHA, GFX_INV_SRC_ALPHA); gfxSetVertexArray(pavVertices,ctVertices); gfxLockArrays(); // for each tile layer INDEX cttl= tt.GetTileLayers().Count(); for(INDEX itl=0;itl<cttl;itl++) { CTerrainLayer &tl = _ptrTerrain->tr_atlLayers[itl]; // if layer isn't visible if(!tl.tl_bVisible) { continue; // skip it } TileLayer &ttl = tt.GetTileLayers()[itl]; // Set tile stretch Matrix12 m12; SetMatrixDiagonal(m12,tl.tl_fStretchX); gfxSetTextureMatrix2(&m12); // Set tile blend mode if(tl.tl_fSmoothness==0) { gfxDisableBlend(); gfxEnableAlphaTest(); } else { gfxEnableBlend(); gfxDisableAlphaTest(); } // if this tile has any polygons in this layer INDEX ctIndices = ttl.tl_auiIndices.Count(); if(ctIndices>0) { gfxSetTextureWrapping(GFX_REPEAT,GFX_REPEAT); tl.tl_ptdTexture->SetAsCurrent(); // if this is tile layer if(tl.tl_ltType==LT_TILE) { gfxUnlockArrays(); GFXVertex4 *pavLayerVertices; if(ter_bLerpVertices==1) { PrepareSmothVerticesOnTileLayer(itt,itl); pavLayerVertices = &_avLerpedTileLayerVertices[0]; } else { pavLayerVertices = &ttl.tl_avVertices[0]; } gfxSetVertexArray(pavLayerVertices,ttl.tl_avVertices.Count()); gfxLockArrays(); // gfxSetColorArray(&ttl.tl_acColors[0]); gfxSetTexCoordArray(&ttl.tl_atcTexCoords[0], FALSE); // set wireframe mode /* gfxEnableDepthBias(); gfxPolygonMode(GFX_LINE); gfxDisableTexture();*/ gfxSetConstantColor(0xFFFFFFFF); // Draw tiled layer gfxDrawElements(ttl.tl_auiIndices.Count(),&ttl.tl_auiIndices[0]); _ctTris +=ttl.tl_auiIndices.Count()/2; /* // set fill mode gfxDisableDepthBias(); gfxPolygonMode(GFX_FILL);*/ // Set old vertex array gfxUnlockArrays(); gfxSetVertexArray(pavVertices,ctVertices); gfxLockArrays(); // if this is normal layer } else { // render layer gfxSetColorArray(&ttl.tl_acColors[0]); gfxSetTexCoordArray(&ttl.tl_atcTexCoords[0], FALSE); gfxDrawElements(ctIndices,&ttl.tl_auiIndices[0]); _ctTris +=ctIndices/2; } } } gfxSetTextureMatrix2(NULL); INDEX ctIndices = tt.GetIndices().Count(); if(ctIndices>0) { INDEX *paiIndices = &tt.GetIndices()[0]; // if detail map exists if(_ptrTerrain->tr_ptdDetailMap!=NULL) { gfxSetTextureWrapping(GFX_REPEAT,GFX_REPEAT); gfxDisableAlphaTest(); shaBlendFunc( GFX_DST_COLOR, GFX_SRC_COLOR); gfxEnableBlend(); gfxSetTexCoordArray(&tt.GetDetailTC()[0], FALSE); _ptrTerrain->tr_ptdDetailMap->SetAsCurrent(); gfxDrawElements(ctIndices,paiIndices); } // if shadows are visible if(_wrpWorldRenderPrefs.wrp_shtShadows!=CWorldRenderPrefs::SHT_NONE) { gfxDisableAlphaTest(); shaBlendFunc( GFX_DST_COLOR, GFX_SRC_COLOR); gfxEnableBlend(); gfxSetTextureWrapping(GFX_CLAMP,GFX_CLAMP); gfxSetTexCoordArray(&tt.GetShadowMapTC()[0], FALSE); _ptrTerrain->tr_tdShadowMap.SetAsCurrent(); gfxDrawElements(ctIndices,paiIndices); } } // if tile is not in highest lod } else { gfxSetTextureWrapping(GFX_CLAMP,GFX_CLAMP); // if tile is in lowest lod if(tt.tt_iLod == _ptrTerrain->tr_iMaxTileLod) { // use terrains global top map _ptrTerrain->tr_tdTopMap.SetAsCurrent(); // else tile is in some midle lod } else { // use its own topmap tt.GetTopMap()->SetAsCurrent(); } // Render tile INDEX ctIndices = tt.GetIndices().Count(); gfxEnableAlphaTest(); gfxDisableBlend(); gfxSetVertexArray(pavVertices,ctVertices); gfxSetTexCoordArray(&tt.GetTexCoords()[0], FALSE); FillConstColorArray(ctVertices); gfxSetColorArray(&_acolVtxConstColors[0]); gfxLockArrays(); gfxDrawElements(ctIndices,&tt.GetIndices()[0]); _ctTris +=ctIndices/2; gfxDisableAlphaTest(); // if shadows are visible if(_wrpWorldRenderPrefs.wrp_shtShadows!=CWorldRenderPrefs::SHT_NONE) { gfxDepthFunc(GFX_EQUAL); INDEX ctIndices = tt.GetIndices().Count(); INDEX *paiIndices = &tt.GetIndices()[0]; gfxSetTextureWrapping(GFX_CLAMP,GFX_CLAMP); gfxBlendFunc(GFX_DST_COLOR,GFX_SRC_COLOR); gfxEnableBlend(); gfxSetTexCoordArray(&tt.GetShadowMapTC()[0], FALSE); _ptrTerrain->tr_tdShadowMap.SetAsCurrent(); gfxDrawElements(ctIndices,paiIndices); gfxDepthFunc(GFX_LESS_EQUAL); } } if(_ptrTerrain->GetFlags()&TR_HAS_FOG) { RenderFogLayer(itt); } if(_ptrTerrain->GetFlags()&TR_HAS_HAZE) { RenderHazeLayer(itt); } gfxUnlockArrays(); }
void ShowSelectionInternal(CTerrain *ptrTerrain, Rect &rcExtract, CTextureData *ptdBrush, GFXColor colSelection, FLOAT fStrenght, SelectionFill sfFill) { ASSERT(ptrTerrain!=NULL); ASSERT(ptdBrush!=NULL); Rect rcSelection; FLOATaabbox3D bboxSelection; // Clamp rect used for extraction rcSelection.rc_iLeft = Clamp(rcExtract.rc_iLeft , 0, ptrTerrain->tr_pixHeightMapWidth); rcSelection.rc_iTop = Clamp(rcExtract.rc_iTop , 0, ptrTerrain->tr_pixHeightMapHeight); rcSelection.rc_iRight = Clamp(rcExtract.rc_iRight , 0, ptrTerrain->tr_pixHeightMapWidth); rcSelection.rc_iBottom = Clamp(rcExtract.rc_iBottom , 0, ptrTerrain->tr_pixHeightMapHeight); // Prepare box for vertex selection bboxSelection = FLOAT3D(rcSelection.rc_iLeft, 0, rcSelection.rc_iTop); bboxSelection |= FLOAT3D(rcSelection.rc_iRight, 0, rcSelection.rc_iBottom); // Stretch selection box bboxSelection.minvect(1) *= ptrTerrain->tr_vStretch(1); bboxSelection.minvect(3) *= ptrTerrain->tr_vStretch(3); bboxSelection.maxvect(1) *= ptrTerrain->tr_vStretch(1); bboxSelection.maxvect(3) *= ptrTerrain->tr_vStretch(3); // Set selection box height FLOATaabbox3D bboxAllTerrain; ptrTerrain->GetAllTerrainBBox(bboxAllTerrain); bboxSelection.minvect(2) = bboxAllTerrain.minvect(2); bboxSelection.maxvect(2) = bboxAllTerrain.maxvect(2); GFXVertex *pavVertices; INDEX *paiIndices; INDEX ctVertices; INDEX ctIndices; // Extract vertices in selection rect ExtractVerticesInRect(ptrTerrain, rcSelection, &pavVertices, &paiIndices, ctVertices, ctIndices); if(ctVertices!=rcSelection.Width()*rcSelection.Height()) { ASSERT(FALSE); return; } // if no vertices if(ctVertices==0) { return; } // Prepare vertex colors for selection preview PIX pixWidth = rcSelection.Width(); PIX pixHeight = rcSelection.Height(); INDEX iStepX = ptdBrush->GetWidth() - pixWidth; INDEX iFirst = 0; if(rcExtract.rc_iTop<0) { iFirst += -rcExtract.rc_iTop*ptdBrush->GetWidth(); } if(rcExtract.rc_iLeft<0) { iFirst += -rcExtract.rc_iLeft; } _aiExtColors.Push(ctVertices); GFXColor *pacolColor = (GFXColor*)&_aiExtColors[0]; GFXColor *pacolBrush = (GFXColor*)&ptdBrush->td_pulFrames[iFirst]; // Fill vertex colors for selection preview SLONG slStrength = (SLONG) (Clamp(Abs(fStrenght),0.0f,1.0f) * 256.0f); // for each row for(INDEX iy=0;iy<pixHeight;iy++) { // for each col for(INDEX ix=0;ix<pixWidth;ix++) { pacolColor->ul.abgr = colSelection.ul.abgr; pacolColor->ub.a = (pacolBrush->ub.r*slStrength)>>8; pacolColor++; pacolBrush++; } pacolBrush+=iStepX; } // Render selected polygons for selection preview if(sfFill == SF_WIREFRAME) { gfxPolygonMode(GFX_LINE); gfxEnableDepthBias(); } if(sfFill != SF_POINTS) { // Draw selection gfxDisableTexture(); gfxDisableAlphaTest(); gfxEnableBlend(); gfxBlendFunc(GFX_SRC_ALPHA, GFX_INV_SRC_ALPHA); gfxSetVertexArray(pavVertices,ctVertices); gfxSetColorArray(&_aiExtColors[0]); gfxLockArrays(); gfxDrawElements(ctIndices,paiIndices); gfxUnlockArrays(); gfxDisableBlend(); } if(sfFill == SF_WIREFRAME) { gfxDisableDepthBias(); gfxPolygonMode(GFX_FILL); } if(sfFill == SF_POINTS) { DrawSelectedVertices(pavVertices,&_aiExtColors[0],ctVertices); } }