void TerrainLattice::Paint(ParaEngine::TextureEntity* detailTexture, float brushRadius, float brushIntensity, float maxIntensity, bool erase, float x, float y) { Terrain * AffectedTerrainTiles[4]; Terrain * pCenterTerrain = GetTerrainAtPoint(x, y); if(pCenterTerrain==NULL || pCenterTerrain->IsEmpty()) return; float fLogicalBrushRadius = brushRadius; AffectedTerrainTiles[0] = GetTerrainAtPoint(x+fLogicalBrushRadius, y+fLogicalBrushRadius); AffectedTerrainTiles[1] = GetTerrainAtPoint(x+fLogicalBrushRadius, y-fLogicalBrushRadius); AffectedTerrainTiles[2] = GetTerrainAtPoint(x-fLogicalBrushRadius, y+fLogicalBrushRadius); AffectedTerrainTiles[3] = GetTerrainAtPoint(x-fLogicalBrushRadius, y-fLogicalBrushRadius); for(int i=0;i<4; i++) { Terrain * pTerrain = AffectedTerrainTiles[i]; bool bDraw = true; for(int k=i-1;k>=0; --k) { if(AffectedTerrainTiles[k] == pTerrain) { bDraw = false; break; } } if(bDraw && pTerrain != NULL && (! pTerrain->IsEmpty())) { pTerrain->SetModified(true, MODIFIED_TEXTURE); pTerrain->Paint(detailTexture, brushRadius, brushIntensity, maxIntensity, erase, x,y); } } }
void TerrainLattice::SetAllLoadedModified(bool bIsModified, DWORD dwModifiedBits) { bool bSaveConfigFile = false; TerrainTileCacheMap_type::iterator itCurCP, itEndCP = m_pCachedTerrains.end(); for( itCurCP = m_pCachedTerrains.begin(); itCurCP != itEndCP; ++ itCurCP) { Terrain* pTerrain = (*itCurCP).second.pTerrain; pTerrain->SetModified(bIsModified, dwModifiedBits); } }
void TerrainLattice::SaveTerrain(bool bHeightMap, bool bTextures) { bool bSaveConfigFile = false; TerrainTileCacheMap_type::iterator itCurCP, itEndCP = m_pCachedTerrains.end(); for( itCurCP = m_pCachedTerrains.begin(); itCurCP != itEndCP; ++ itCurCP) { Terrain* pTerrain = (*itCurCP).second.pTerrain; if(pTerrain->IsModified()) { if(pTerrain->IsEmpty()){ pTerrain->SetModified(false, MODIFIED_ALL); } else { int x,y; pTerrain->GetLatticePosition(x,y); string sConfig = CGlobals::GetWorldInfo()->GetTerrainConfigFile(x,y); if(pTerrain->m_sConfigFile != sConfig) { pTerrain->m_sConfigFile = sConfig; pTerrain->SetModified(true, MODIFIED_CONFIGURATION | MODIFIED_TEXTURE); if (m_pLoader) { m_pLoader->UpdateTileConfigFile(x,y, sConfig); } bSaveConfigFile = true; } pTerrain->SaveToFile(); pTerrain->SetModified(false, MODIFIED_ALL); } } } // save global world config file if any terrain tile is newly created. if(m_bIsGlobalConfigModified || bSaveConfigFile) { if(m_pLoader){ m_pLoader->SaveWorldConfigFile(); } } m_bIsGlobalConfigModified = false; }
void CGlobalTerrain::SetContentModified(float x, float y, bool bIsModified, DWORD dwModifiedBits) { if (m_nTerrainType == LATTICED_TERRAIN) { if (m_pTerrainLattice) { Terrain * pTerrain = m_pTerrainLattice->GetTerrainAtPoint(x, y); if (pTerrain) { return pTerrain->SetModified(bIsModified, dwModifiedBits); } } } else if (m_nTerrainType == SINGLE_TERRAIN) { if (m_pTerrainSingle) return m_pTerrainSingle->SetModified(bIsModified, dwModifiedBits); } }
bool CGlobalTerrain::ReplaceTexture(float x, float y, int nIndex, TextureEntity* TextureAsset) { Terrain * pTerrain = GetTerrainAtPoint(x, y); if (pTerrain && (nIndex >= 0 || TextureAsset != 0)) { if (nIndex >= 0) { if (pTerrain->GetTextureSet()) { if (TextureAsset) { if (pTerrain->GetTextureSet()->ReplaceTexture(nIndex, TextureAsset)) { pTerrain->SetModified(true, MODIFIED_TEXTURE); return true; } } else { // True to normalize mask of the undeleted layers. bool bNormalizeMask = true; pTerrain->GetTextureSet()->RemoveTexture(nIndex, pTerrain, bNormalizeMask); } } } else if (nIndex == -1) { // -1: common texture, which is repeated several times over each terrain tile surface. pTerrain->SetTerrainCommonTextureFile(TextureAsset->GetKey()); return true; } else if (nIndex == -2) { // -2: main texture, which is chopped and mapped to the entire terrain surface. pTerrain->SetTerrainBaseTextureFile(TextureAsset->GetKey()); return true; } } return false; }