diff --git a/main.c b/main.c index 1f265e7..4548cda 100644 --- a/main.c +++ b/main.c @@ -17,12 +17,63 @@ */ #include "raylib.h" -#include #include #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) -#define CLAMP(val, min, max) MIN(max, MAX(min, val)) +#define CLAMP2(val, min, max) MIN(max, MAX(min, val)) +#define CLAMP(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val))) +#define LROT(v,n) ((v << n) | (v >> (sizeof(v)*8 - n))) +#define RROT(v,n) ((v >> n) | (v << (sizeof(v)*8 - n))) + +#define MAP_SIZE 64 + +struct ModelDirection { + Model model; + unsigned char pattern; +}; + +void generate_river(Color *map_data, int previous) { + int x = previous % MAP_SIZE, y = previous / MAP_SIZE; + if (x == 0 || x == MAP_SIZE -1 || y == 0 || y == MAP_SIZE -1) return; + + int local_minimum_map_i = previous; + int local_minimum_val = 255; + int gradients[4][2] = {{0,-1},{-1,0},{0,1},{1,0}}; + for (int gradient_i = 0; gradient_i < 4; gradient_i++) { + int dx = CLAMP(x + gradients[gradient_i][0], 0, MAP_SIZE - 1); + int dy = CLAMP(y + gradients[gradient_i][1], 0, MAP_SIZE - 1); + int i = dy * MAP_SIZE + dx; + if (i == previous || map_data[i].r == 1) continue; + if (map_data[i].b < local_minimum_val) { + local_minimum_map_i = i; + local_minimum_val = map_data[i].b; + } + } + if (local_minimum_val == 255) return; + map_data[local_minimum_map_i].r = 1; + generate_river(map_data, local_minimum_map_i); +} + +void select_river_tile(Color *map_data, struct ModelDirection *rivers, int x, int y, size_t *river_i, size_t *direction) { + + int surrounding[8][2] = {{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}}; + unsigned char river_tile = 0; + for (int surrounding_i = 0; surrounding_i < 8; surrounding_i++) { + int dx = CLAMP(x + surrounding[surrounding_i][0], 0, MAP_SIZE - 1); + int dy = CLAMP(y + surrounding[surrounding_i][1], 0, MAP_SIZE - 1); + if (map_data[dy * MAP_SIZE + dx].r) + river_tile |= 1 << (7 - surrounding_i); + } + for (*river_i = 0; *river_i < 11; (*river_i)++) { + for (*direction = 0; *direction < 4; (*direction)++) { + if ((rivers[*river_i].pattern & RROT(river_tile, 2 * *direction)) == rivers[*river_i].pattern) { + return; + } + } + } +} + int main(void) { const int screenWidth = 800; @@ -37,353 +88,92 @@ int main(void) { camera.fovy = 45.0f; camera.projection = CAMERA_PERSPECTIVE; - Model models[] = { - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bed_floor.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_center_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_center_stoneRound.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_center_wood.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_center_woodRound.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_side_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_side_stoneRound.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_side_wood.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_side_woodRound.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_stoneNarrow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_stoneRoundNarrow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_stoneRound.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_woodNarrow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_wood.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_woodRoundNarrow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/bridge_woodRound.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cactus_short.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cactus_tall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/campfire_bricks.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/campfire_logs.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/campfire_planks.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/campfire_stones.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/canoe.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/canoe_paddle.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockCave_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockCave_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockDiagonal_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockDiagonal_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockHalf_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockHalf_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockQuarter_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockQuarter_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_block_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockSlopeHalfWalls_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockSlopeHalfWalls_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockSlope_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockSlope_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockSlopeWalls_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_blockSlopeWalls_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_block_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cave_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cave_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerInnerLarge_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerInnerLarge_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerInner_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerInner_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerInnerTop_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerInnerTop_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerLarge_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerLarge_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_corner_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_corner_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerTop_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_cornerTop_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_diagonal_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_diagonal_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_halfCornerInner_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_halfCornerInner_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_halfCorner_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_halfCorner_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_half_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_half_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_large_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_large_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_stepsCornerInner_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_stepsCornerInner_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_stepsCorner_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_stepsCorner_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_steps_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_steps_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_topDiagonal_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_topDiagonal_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_top_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_top_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_waterfall_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_waterfall_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_waterfallTop_rock.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_waterfallTop_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crop_carrot.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crop_melon.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crop_pumpkin.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_bambooStageA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_bambooStageB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_cornStageA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_cornStageB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_cornStageC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_cornStageD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtDoubleRowCorner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtDoubleRowEnd.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtDoubleRow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtRowCorner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtRowEnd.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtRow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_dirtSingle.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_leafsStageA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_leafsStageB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_wheatStageA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crops_wheatStageB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/crop_turnip.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_bendCenter.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_bend.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_corner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_gate.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_planksDouble.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_planks.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_simpleCenter.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_simpleDiagonalCenter.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_simpleDiagonal.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_simpleHigh.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_simpleLow.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/fence_simple.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_purpleA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_purpleB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_purpleC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_redA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_redB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_redC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_yellowA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_yellowB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/flower_yellowC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/grass_large.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/grass_leafsLarge.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/grass_leafs.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/grass.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_grass.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathBendBank.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathBend.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathCorner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathCornerSmall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathCross.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathEndClosed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathEnd.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathOpen.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathRocks.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathSide.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathSideOpen.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathSplit.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathStraight.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_pathTile.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverBendBank.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverBend.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCorner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCornerSmall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCross.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverEndClosed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverEnd.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverOpen.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverRocks.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSide.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSideOpen.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSplit.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverStraight.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverTile.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/hanging_moss.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/lily_large.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/lily_small.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/log_large.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/log.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/log_stackLarge.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/log_stack.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/mushroom_redGroup.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/mushroom_red.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/mushroom_redTall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/mushroom_tanGroup.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/mushroom_tan.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/mushroom_tanTall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_stoneCircle.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_stoneCorner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_stoneEnd.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_woodCorner.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_woodEnd.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/path_wood.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_bushDetailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_bushLarge.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_bushLargeTriangle.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_bush.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_bushSmall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_bushTriangle.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_flatShort.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/plant_flatTall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/platform_beach.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/platform_grass.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/platform_stone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/pot_large.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/pot_small.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_largeA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_largeB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_largeC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_largeD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_largeE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_largeF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallFlatA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallFlatB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallFlatC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallG.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallH.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallI.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallTopA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_smallTopB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallG.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallH.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallI.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/rock_tallJ.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/sign.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/statue_block.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/statue_columnDamaged.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/statue_column.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/statue_head.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/statue_obelisk.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/statue_ring.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_largeA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_largeB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_largeC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_largeD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_largeE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_largeF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallFlatA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallFlatB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallFlatC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallG.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallH.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallI.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallTopA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_smallTopB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallG.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallH.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallI.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stone_tallJ.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_old.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_oldTall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_roundDetailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_round.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_squareDetailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_squareDetailedWide.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/stump_square.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tent_detailedClosed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tent_detailedOpen.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tent_smallClosed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tent_smallOpen.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_blocks_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_blocks_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_blocks.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_cone_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_cone_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_cone.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_default_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_default_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_default.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_detailed_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_detailed_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_detailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_fat_darkh.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_fat_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_fat.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_oak_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_oak_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_oak.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_palmBend.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_palmDetailedShort.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_palmDetailedTall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_palm.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_palmShort.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_palmTall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineDefaultA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineDefaultB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineGroundA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineGroundB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineRoundA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineRoundB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineRoundC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineRoundD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineRoundE.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineRoundF.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineSmallA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineSmallB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineSmallC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineSmallD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallA_detailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallA.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallB_detailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallB.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallC_detailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallC.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallD_detailed.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_pineTallD.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_plateau_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_plateau_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_plateau.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_simple_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_simple_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_simple.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_small_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_small_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_small.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_tall_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_tall_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_tall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_thin_dark.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_thin_fall.obj"), - LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_thin.obj"), + + struct ModelDirection rivers[] = { + /* 0b12345678 + * 1 | 2 | 3 + * 8 | | 4 + * 7 | 6 | 5 + */ + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverOpen.obj"), + .pattern = 0b11111111 + }, + // edge + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCornerSmall.obj"), + .pattern = 0b11011111 + }, + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSideOpen.obj"), + .pattern = 0b01011111 + }, + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSide.obj"), + .pattern = 0b11110001 + }, + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCross.obj"), + .pattern = 0b01010101 + }, + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSplit.obj"), + .pattern = 0b01010001 + }, + // STRAIGHT + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverStraight.obj"), + .pattern = 0b01000100 + }, + // corner + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCorner.obj"), + .pattern = 0b11000001 + }, + // L SHAPE + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverBend.obj"), + .pattern = 0b01000001 + }, + // closed + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverEndClosed.obj"), + .pattern = 0b01000000 + }, + { + .model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverTile.obj"), + .pattern = 0b00000000 + }, }; -#define MAP_SIZE 64 + Model ground = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_grass.obj"); + Model cliff = LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_top_rock.obj"); + Vector3 position = {0}; Image map = GenImagePerlinNoise(MAP_SIZE, MAP_SIZE, 0, 0, 1.f); Texture2D map_texture = LoadTextureFromImage(map); + Color *map_data = LoadImageColors(map); + size_t global_minimum_map_i; + size_t global_minimum_val = 255; for (size_t i = 0; i < MAP_SIZE * MAP_SIZE; i++) { - Color c = GetImageColor(map, i % MAP_SIZE, i / MAP_SIZE); - ImageDrawPixel(&map, i % MAP_SIZE, i / MAP_SIZE, (Color) { - .r = MAX(0, c.r - 64) / 32, - .g = MAX(0, c.r - 64) / 32, - .b = MAX(0, c.r - 64) / 32, + int x = i % MAP_SIZE, y = i / MAP_SIZE; + Color c = map_data[i]; + if (c.r < global_minimum_val) { + global_minimum_map_i = i; + global_minimum_val = map_data[i].b; + } + map_data[i] = (Color) { + .r = 0, + .g = MAX(0, c.g - 64) / 32, + .b = c.b, .a = 255 - }); + }; } - Color *map_data = LoadImageColors(map); + + map_data[global_minimum_map_i].r = 1; + generate_river(map_data, global_minimum_map_i); + generate_river(map_data, global_minimum_map_i); // SetTargetFPS(60); while (!WindowShouldClose()) { @@ -394,18 +184,12 @@ int main(void) { BeginMode3D(camera); for (int i = 0; i < MAP_SIZE * MAP_SIZE; i++) { int x = i % MAP_SIZE, y = i / MAP_SIZE; - DrawModel(models[128], - (Vector3){ - .x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f), - .y = map_data[i].r - 8, //- (map_gradient_magnitude_data[i].g < 2), - .z = MAP_SIZE * (y / (float) MAP_SIZE - 0.5f) - } , 1.f, WHITE); int gradients[4][2] = {{0,-1},{-1,0},{0,1},{1,0}}; for (int gradient_i = 0; gradient_i < 4; gradient_i++) { int dx = CLAMP(x + gradients[gradient_i][0], 0, MAP_SIZE - 1); int dy = CLAMP(y + gradients[gradient_i][1], 0, MAP_SIZE - 1); - for (int height = map_data[i].r; height < map_data[dy * MAP_SIZE + dx].r; height++) { - DrawModelEx(models[76], + for (int height = map_data[i].g; height < map_data[dy * MAP_SIZE + dx].g; height++) { + DrawModelEx(cliff, (Vector3){ .x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f), .y = height - 8, @@ -414,6 +198,18 @@ int main(void) { (Vector3) {0, 1, 0}, gradient_i * 90.f, (Vector3) {1,1,1}, WHITE); } } + size_t river_i, direction; + if (map_data[i].r) { + select_river_tile(map_data, rivers, x, y, &river_i, &direction); + } + DrawModelEx(map_data[i].r ? rivers[river_i].model : ground, + (Vector3){ + .x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f), + .y = map_data[i].g - 8, //- (map_gradient_magnitude_data[i].g < 2), + .z = MAP_SIZE * (y / (float) MAP_SIZE - 0.5f) + } , (Vector3) {0,1,0}, map_data[i].r ? direction * 90.f: 0, + (Vector3) {1,1,1}, + WHITE); } DrawGrid(20, 10.0f); EndMode3D();