void cNoise3DGenerator::DoGenerate(int a_ChunkX, int a_ChunkZ, cChunkDesc & a_ChunkDesc) { NOISE_DATATYPE Noise[17 * 257 * 17]; GenerateNoiseArray(a_ChunkX, a_ChunkZ, Noise); // Output noise into chunk: for (int z = 0; z < cChunkDef::Width; z++) { for (int y = 0; y < cChunkDef::Height; y++) { int idx = z * 17 * 257 + y * 17; for (int x = 0; x < cChunkDef::Width; x++) { NOISE_DATATYPE n = Noise[idx++]; BLOCKTYPE BlockType; if (n > m_AirThreshold) { BlockType = (y > m_SeaLevel) ? E_BLOCK_AIR : E_BLOCK_STATIONARY_WATER; } else { BlockType = E_BLOCK_STONE; } a_ChunkDesc.SetBlockType(x, y, z, BlockType); } } } UpdateHeightmap(a_ChunkDesc); ComposeTerrain (a_ChunkDesc); }
void LandscapeEditorHeightmap::UpdateCopypasteTool(float32 timeElapsed) { if( (Vector2(-1.0f, -1.0f) != copyFromCenter) && (Vector2(-1.0f, -1.0f) != copyToCenter)) { if(currentTool->copyTilemask) { if(tilemaskImage && toolImageTile) { tilemaskWasChanged = true; float32 multiplier = (float32)tilemaskImage->GetWidth() / (float32)(landscapeSize); int32 scaleSize = toolImageTile->GetWidth(); Vector2 posTo = landscapePoint * multiplier - Vector2((float32)scaleSize, (float32)scaleSize)/2.f; Vector2 deltaPos = landscapePoint - copyToCenter; Vector2 posFrom = (copyFromCenter + deltaPos) * multiplier - Vector2((float32)scaleSize, (float32)scaleSize)/2.f; EditorHeightmap::DrawCopypasteRGBA(tilemaskImage, tilemaskImage, toolImageTile, posFrom, posTo, scaleSize, scaleSize); Texture *tex = tilemaskTexture; if(tex) { tex->TexImage(0, tilemaskImage->GetWidth(), tilemaskImage->GetHeight(), tilemaskImage->GetData(), 0); //TODO: is code useful? tex->GenerateMipmaps(); tex->SetWrapMode(Texture::WRAP_REPEAT, Texture::WRAP_REPEAT); //ENDOFTODO workingLandscape->UpdateFullTiledTexture(); } } } if(currentTool->copyHeightmap) { int32 scaleSize = toolImage->GetWidth(); Vector2 posTo = landscapePoint - Vector2((float32)scaleSize, (float32)scaleSize)/2.f; Vector2 deltaPos = landscapePoint - copyToCenter; Vector2 posFrom = copyFromCenter + deltaPos - Vector2((float32)scaleSize, (float32)scaleSize)/2.f; float32 koef = (currentTool->averageStrength * timeElapsed) * 2.0f; EditorHeightmap *heightmap = dynamic_cast<EditorHeightmap *>(landscapesController->GetCurrentHeightmap()); DVASSERT(heightmap); heightmap->DrawCopypasteRGBA(toolImage, posFrom, posTo, scaleSize, scaleSize, koef); UpdateHeightmap(Rect(posTo.x, posTo.y, (float32)scaleSize, (float32)scaleSize)); } } }
void LandscapeEditorHeightmap::UpdateBrushTool(float32 timeElapsed) { int32 scaleSize = toolImage->GetWidth(); Vector2 pos = landscapePoint - Vector2((float32)scaleSize, (float32)scaleSize)/2.0f; { EditorHeightmap *heightmap = dynamic_cast<EditorHeightmap *>(landscapesController->GetCurrentHeightmap()); DVASSERT(heightmap); if(currentTool->averageDrawing) { float32 koef = (currentTool->averageStrength * timeElapsed) * 2.0f; heightmap->DrawAverageRGBA(toolImage, (int32)pos.x, (int32)pos.y, scaleSize, scaleSize, koef); } else if(currentTool->relativeDrawing) { float32 koef = (currentTool->strength * timeElapsed); if(inverseDrawingEnabled) { koef = -koef; } heightmap->DrawRelativeRGBA(toolImage, (int32)pos.x, (int32)pos.y, scaleSize, scaleSize, koef); } else { Vector3 landSize; AABBox3 transformedBox; workingLandscape->GetBoundingBox().GetTransformedBox(*workingLandscape->GetWorldTransformPtr(), transformedBox); landSize = transformedBox.max - transformedBox.min; float32 maxHeight = landSize.z; float32 height = currentTool->height / maxHeight * Heightmap::MAX_VALUE; float32 koef = (currentTool->averageStrength * timeElapsed) * 2.0f; heightmap->DrawAbsoluteRGBA(toolImage, (int32)pos.x, (int32)pos.y, scaleSize, scaleSize, koef, height); } UpdateHeightmap(Rect(pos.x, pos.y, (float32)scaleSize, (float32)scaleSize)); } }
void LandscapeEditorHeightmap::UpdateHeightmap(Heightmap* heightmap) { UpdateHeightmap(Rect(0, 0, (float32)heightmap->Size()-1.f, (float32)heightmap->Size()-1.f)); }