diff --git a/assets.h b/assets.h new file mode 100644 index 0000000..419795b --- /dev/null +++ b/assets.h @@ -0,0 +1,56 @@ +/* + * Tux-Town is a chill life-simulation game. + * Copyright (C) 2025 orangerot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#ifndef ASSETS_H +#define ASSETS_H + +#define ASSET_PATH "assets/kenney_nature-kit/Models/OBJ format/" +#define ASSETS(ASSET) \ + ASSET(ground_riverOpen) \ + ASSET(ground_riverCornerSmall) \ + ASSET(ground_riverSideOpen) \ + ASSET(ground_riverSide) \ + ASSET(ground_riverCross) \ + ASSET(ground_riverSplit) \ + ASSET(ground_riverStraight) \ + ASSET(ground_riverCorner) \ + ASSET(ground_riverBend) \ + ASSET(ground_riverEndClosed) \ + ASSET(ground_riverTile) \ + ASSET(ground_grass) \ + ASSET(cliff_top_rock) \ + ASSET(tree_oak) \ + ASSET(tent_detailedOpen) + +#define AS_ENUM(name) name, +enum Asset { + ASSETS(AS_ENUM) + ASSET_LEN +}; + +Model assets[ASSET_LEN]; + +#define AS_ARRAY(name) assets[name] = LoadModel(ASSET_PATH #name ".obj"); +void LoadModels() { + ASSETS(AS_ARRAY) +} + +#endif /* ASSETS_H */ + diff --git a/main.c b/main.c index 6199043..d543571 100644 --- a/main.c +++ b/main.c @@ -16,15 +16,17 @@ * along with this program. If not, see . */ -#include "raylib.h" +#include #include #include #define RCAMERA_IMPLEMENTATION #define RL_CULL_DISTANCE_NEAR 0.01 #define RL_CULL_DISTANCE_FAR 1000.0 -#include "rcamera.h" +#include #include +#include "assets.h" + #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) #define CLAMP2(val, min, max) MIN(max, MAX(min, val)) @@ -35,7 +37,7 @@ #define MAP_SIZE 64 struct ModelDirection { - Model model; + enum Asset asset; unsigned char pattern; }; @@ -98,65 +100,33 @@ int main(void) { Vector3 player_pos = (Vector3) {0.f, 0.f, 0.f}; 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 - }, + /* 0b12345678 + * 1 | 2 | 3 + * 8 | | 4 + * 7 | 6 | 5 + */ + { .pattern = 0b11111111, .asset = ground_riverOpen }, + // edge + { .pattern = 0b11011111, .asset = ground_riverCornerSmall }, + { .pattern = 0b01011111, .asset = ground_riverSideOpen }, + { .pattern = 0b11110001, .asset = ground_riverSide }, + { .pattern = 0b01010101, .asset = ground_riverCross }, + { .pattern = 0b01010001, .asset = ground_riverSplit }, + // STRAIGHT + { .pattern = 0b01000100, .asset = ground_riverStraight }, + // corner + { .pattern = 0b11000001, .asset = ground_riverCorner }, + // L SHAPE + { .pattern = 0b01000001, .asset = ground_riverBend }, + // closed + { .pattern = 0b01000000, .asset = ground_riverEndClosed }, + { .pattern = 0b00000000, .asset = ground_riverTile }, }; - - 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"); - Model tree = LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_oak.obj"); + + enum Asset ground = ground_grass; + enum Asset cliff = cliff_top_rock; + enum Asset tree = tree_oak; + enum Asset house = tent_detailedOpen; Vector3 position = {0}; Image map = GenImagePerlinNoise(MAP_SIZE, MAP_SIZE, 0, 0, 1.f); @@ -183,6 +153,8 @@ int main(void) { map_data[global_minimum_map_i].r = 1; generate_river(map_data, global_minimum_map_i); generate_river(map_data, global_minimum_map_i); + + LoadModels(); #define NUM_TREES MAP_SIZE * MAP_SIZE / 100 int *trees_x = LoadRandomSequence(NUM_TREES, -MAP_SIZE / 2, MAP_SIZE / 2); @@ -218,7 +190,7 @@ int main(void) { 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].g; height < map_data[dy * MAP_SIZE + dx].g; height++) { - DrawModelEx(cliff, + DrawModelEx(assets[cliff], (Vector3){ .x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f), .y = height, @@ -231,7 +203,7 @@ int main(void) { 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, + DrawModelEx(assets[map_data[i].r ? rivers[river_i].asset : ground], (Vector3){ .x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f), .y = map_data[i].g, //- (map_gradient_magnitude_data[i].g < 2), @@ -241,8 +213,9 @@ int main(void) { WHITE); } for (int tree_i = 0; tree_i < NUM_TREES; tree_i++) { - DrawModel(tree, (Vector3) {trees_x[tree_i], 0, trees_y[tree_i]}, 1.f, WHITE); + DrawModel(assets[tree], (Vector3) {trees_x[tree_i], 0, trees_y[tree_i]}, 1.f, WHITE); } + DrawModel(assets[house], (Vector3) {-1, 0, 0}, 1.f, WHITE); DrawGrid(20, 10.0f); Vector3 capsule_top = player_pos; capsule_top.y += 0.2f;