summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOrangerot <purple@orangerot.dev>2025-06-05 01:40:21 +0200
committerOrangerot <purple@orangerot.dev>2025-06-05 01:40:21 +0200
commitaf5ee99682db1ca8c3d82810ff90499d5c040f61 (patch)
tree9303da8c306e302049d74e91998dbca83de3d5e0
parent603f5da7b7ec8f7a7b6255e887575c9d0f0140d9 (diff)
feat: asset loader
-rw-r--r--assets.h56
-rw-r--r--main.c101
2 files changed, 93 insertions, 64 deletions
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 <me@orangerot.dev>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#include <raylib.h>
+
+#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 <https://www.gnu.org/licenses/>.
*/
-#include "raylib.h"
+#include <raylib.h>
#include <raymath.h>
#include <stdbool.h>
#define RCAMERA_IMPLEMENTATION
#define RL_CULL_DISTANCE_NEAR 0.01
#define RL_CULL_DISTANCE_FAR 1000.0
-#include "rcamera.h"
+#include <rcamera.h>
#include <stddef.h>
+#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;