Day 35 complete.
This commit is contained in:
+63
-35
@@ -1,16 +1,21 @@
|
||||
#include "handmade_tile.h"
|
||||
|
||||
static tile_chunk *GetTileChunk(tile_map *TileMap,
|
||||
U32 TileChunkX, U32 TileChunkY)
|
||||
U32 TileChunkX,
|
||||
U32 TileChunkY,
|
||||
U32 TileChunkZ)
|
||||
{
|
||||
tile_chunk *TileChunk = NULL;
|
||||
|
||||
if((TileChunkX >= 0) && (TileChunkX < TileMap->TileChunkCountX) &&
|
||||
(TileChunkY >= 0) && (TileChunkY < TileMap->TileChunkCountY))
|
||||
(TileChunkY >= 0) && (TileChunkY < TileMap->TileChunkCountY) &&
|
||||
(TileChunkZ >= 0) && (TileChunkZ < TileMap->TileChunkCountZ))
|
||||
{
|
||||
TileChunk = &TileMap->TileChunks[TileChunkY *
|
||||
TileMap->TileChunkCountX +
|
||||
TileChunkX];
|
||||
TileChunk =
|
||||
&TileMap->TileChunks[
|
||||
(TileChunkZ*TileMap->TileChunkCountY*TileMap->TileChunkCountX) +
|
||||
(TileChunkY*TileMap->TileChunkCountX) +
|
||||
TileChunkX];
|
||||
}
|
||||
|
||||
return TileChunk;
|
||||
@@ -40,12 +45,15 @@ static tile_map_position RecannonicalizePosition(tile_map *TileMap,
|
||||
}
|
||||
|
||||
static tile_chunk_position GetChunkPositionFor(tile_map *TileMap,
|
||||
U32 AbsTileX, U32 AbsTileY)
|
||||
U32 AbsTileX,
|
||||
U32 AbsTileY,
|
||||
U32 AbsTileZ)
|
||||
{
|
||||
tile_chunk_position Result;
|
||||
|
||||
Result.TileChunkX = AbsTileX >> TileMap->ChunkShift;
|
||||
Result.TileChunkY = AbsTileY >> TileMap->ChunkShift;
|
||||
Result.TileChunkZ = AbsTileZ;
|
||||
Result.RelTileX = AbsTileX & TileMap->ChunkMask;
|
||||
Result.RelTileY = AbsTileY & TileMap->ChunkMask;
|
||||
|
||||
@@ -65,20 +73,6 @@ static U32 GetTileValueUnchecked(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
return TileChunkValue;
|
||||
}
|
||||
|
||||
static U32 GetTileChunkValue(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
U32 TestTileX, U32 TestTileY)
|
||||
{
|
||||
U32 TileChunkValue = 0;
|
||||
|
||||
if(TileChunk) {
|
||||
TileChunkValue = GetTileValueUnchecked(TileMap,
|
||||
TileChunk,
|
||||
TestTileX, TestTileY);
|
||||
}
|
||||
|
||||
return TileChunkValue;
|
||||
}
|
||||
|
||||
static void SetTileValueUnchecked(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
U32 TileX, U32 TileY, U32 TileValue)
|
||||
{
|
||||
@@ -89,23 +83,44 @@ static void SetTileValueUnchecked(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
TileChunk->Tiles[TileY * TileMap->ChunkDim + TileX] = TileValue;
|
||||
}
|
||||
|
||||
static void SetTileChunkValue(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
U32 TestTileX, U32 TestTileY, U32 TileValue)
|
||||
static U32 GetTileChunkValue(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
U32 TestTileX, U32 TestTileY)
|
||||
{
|
||||
SetTileValueUnchecked(TileMap,
|
||||
TileChunk,
|
||||
TestTileX, TestTileY,
|
||||
TileValue);
|
||||
U32 TileChunkValue = 0;
|
||||
|
||||
if(TileChunk && TileChunk->Tiles) {
|
||||
TileChunkValue = GetTileValueUnchecked(TileMap,
|
||||
TileChunk,
|
||||
TestTileX,
|
||||
TestTileY);
|
||||
}
|
||||
|
||||
return TileChunkValue;
|
||||
}
|
||||
|
||||
static U32 GetTileValue(tile_map *TileMap, U32 AbsTileX, U32 AbsTileY)
|
||||
static void SetTileChunkValue(tile_map *TileMap, tile_chunk *TileChunk,
|
||||
U32 TestTileX, U32 TestTileY,
|
||||
U32 TileValue)
|
||||
{
|
||||
if(TileChunk && TileChunk->Tiles) {
|
||||
SetTileValueUnchecked(TileMap,
|
||||
TileChunk,
|
||||
TestTileX, TestTileY,
|
||||
TileValue);
|
||||
}
|
||||
}
|
||||
|
||||
static U32 GetTileValue(tile_map *TileMap,
|
||||
U32 AbsTileX, U32 AbsTileY, U32 AbsTileZ)
|
||||
{
|
||||
tile_chunk_position ChunkPos = GetChunkPositionFor(TileMap,
|
||||
AbsTileX,
|
||||
AbsTileY);
|
||||
AbsTileY,
|
||||
AbsTileZ);
|
||||
tile_chunk *TileChunk = GetTileChunk(TileMap,
|
||||
ChunkPos.TileChunkX,
|
||||
ChunkPos.TileChunkY);
|
||||
ChunkPos.TileChunkY,
|
||||
ChunkPos.TileChunkZ);
|
||||
U32 TileChunkValue = GetTileChunkValue(TileMap, TileChunk,
|
||||
ChunkPos.RelTileX,
|
||||
ChunkPos.RelTileY);
|
||||
@@ -118,24 +133,37 @@ static B32 IsTileMapPointEmpty(tile_map *TileMap, tile_map_position CanPos)
|
||||
|
||||
U32 TileChunkValue = GetTileValue(TileMap,
|
||||
CanPos.AbsTileX,
|
||||
CanPos.AbsTileY);
|
||||
Empty = (TileChunkValue == 0);
|
||||
CanPos.AbsTileY,
|
||||
CanPos.AbsTileZ);
|
||||
Empty = (TileChunkValue == 1);
|
||||
return Empty;
|
||||
}
|
||||
|
||||
static void SetTileValue(memory_arena *Arena,
|
||||
tile_map *TileMap,
|
||||
U32 AbsTileX, U32 AbsTileY,
|
||||
U32 AbsTileX, U32 AbsTileY, U32 AbsTileZ,
|
||||
U32 TileValue)
|
||||
{
|
||||
tile_chunk_position ChunkPos;
|
||||
tile_chunk *TileChunk;
|
||||
|
||||
ChunkPos = GetChunkPositionFor(TileMap, AbsTileX, AbsTileY);
|
||||
ChunkPos = GetChunkPositionFor(TileMap, AbsTileX, AbsTileY, AbsTileZ);
|
||||
TileChunk = GetTileChunk(TileMap,
|
||||
ChunkPos.TileChunkX,
|
||||
ChunkPos.TileChunkY);
|
||||
ASSERT(TileChunk); /* TODO: On-deman tile chunk creation. */
|
||||
ChunkPos.TileChunkY,
|
||||
ChunkPos.TileChunkZ);
|
||||
|
||||
ASSERT(TileChunk);
|
||||
if(!TileChunk->Tiles) {
|
||||
U32 TileCount = TileMap->ChunkDim*TileMap->ChunkDim;
|
||||
U32 TileIndex;
|
||||
|
||||
TileChunk->Tiles = PUSH_ARRAY(Arena, TileCount, U32);
|
||||
for(TileIndex = 0; TileIndex < TileCount; TileIndex++) {
|
||||
TileChunk->Tiles[TileIndex] = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SetTileChunkValue(TileMap, TileChunk,
|
||||
ChunkPos.RelTileX,
|
||||
|
||||
Reference in New Issue
Block a user