feat: asset loader
This commit is contained in:
parent
603f5da7b7
commit
af5ee99682
56
assets.h
Normal file
56
assets.h
Normal file
|
@ -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 */
|
||||||
|
|
99
main.c
99
main.c
|
@ -16,15 +16,17 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "raylib.h"
|
#include <raylib.h>
|
||||||
#include <raymath.h>
|
#include <raymath.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#define RCAMERA_IMPLEMENTATION
|
#define RCAMERA_IMPLEMENTATION
|
||||||
#define RL_CULL_DISTANCE_NEAR 0.01
|
#define RL_CULL_DISTANCE_NEAR 0.01
|
||||||
#define RL_CULL_DISTANCE_FAR 1000.0
|
#define RL_CULL_DISTANCE_FAR 1000.0
|
||||||
#include "rcamera.h"
|
#include <rcamera.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "assets.h"
|
||||||
|
|
||||||
#define MIN(a,b) (((a)<(b))?(a):(b))
|
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||||
#define MAX(a,b) (((a)>(b))?(a):(b))
|
#define MAX(a,b) (((a)>(b))?(a):(b))
|
||||||
#define CLAMP2(val, min, max) MIN(max, MAX(min, val))
|
#define CLAMP2(val, min, max) MIN(max, MAX(min, val))
|
||||||
|
@ -35,7 +37,7 @@
|
||||||
#define MAP_SIZE 64
|
#define MAP_SIZE 64
|
||||||
|
|
||||||
struct ModelDirection {
|
struct ModelDirection {
|
||||||
Model model;
|
enum Asset asset;
|
||||||
unsigned char pattern;
|
unsigned char pattern;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,65 +100,33 @@ int main(void) {
|
||||||
Vector3 player_pos = (Vector3) {0.f, 0.f, 0.f};
|
Vector3 player_pos = (Vector3) {0.f, 0.f, 0.f};
|
||||||
|
|
||||||
struct ModelDirection rivers[] = {
|
struct ModelDirection rivers[] = {
|
||||||
/* 0b12345678
|
/* 0b12345678
|
||||||
* 1 | 2 | 3
|
* 1 | 2 | 3
|
||||||
* 8 | | 4
|
* 8 | | 4
|
||||||
* 7 | 6 | 5
|
* 7 | 6 | 5
|
||||||
*/
|
*/
|
||||||
{
|
{ .pattern = 0b11111111, .asset = ground_riverOpen },
|
||||||
.model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverOpen.obj"),
|
// edge
|
||||||
.pattern = 0b11111111
|
{ .pattern = 0b11011111, .asset = ground_riverCornerSmall },
|
||||||
},
|
{ .pattern = 0b01011111, .asset = ground_riverSideOpen },
|
||||||
// edge
|
{ .pattern = 0b11110001, .asset = ground_riverSide },
|
||||||
{
|
{ .pattern = 0b01010101, .asset = ground_riverCross },
|
||||||
.model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverCornerSmall.obj"),
|
{ .pattern = 0b01010001, .asset = ground_riverSplit },
|
||||||
.pattern = 0b11011111
|
// STRAIGHT
|
||||||
},
|
{ .pattern = 0b01000100, .asset = ground_riverStraight },
|
||||||
{
|
// corner
|
||||||
.model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSideOpen.obj"),
|
{ .pattern = 0b11000001, .asset = ground_riverCorner },
|
||||||
.pattern = 0b01011111
|
// L SHAPE
|
||||||
},
|
{ .pattern = 0b01000001, .asset = ground_riverBend },
|
||||||
{
|
// closed
|
||||||
.model = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_riverSide.obj"),
|
{ .pattern = 0b01000000, .asset = ground_riverEndClosed },
|
||||||
.pattern = 0b11110001
|
{ .pattern = 0b00000000, .asset = ground_riverTile },
|
||||||
},
|
|
||||||
{
|
|
||||||
.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
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Model ground = LoadModel("assets/kenney_nature-kit/Models/OBJ format/ground_grass.obj");
|
enum Asset ground = ground_grass;
|
||||||
Model cliff = LoadModel("assets/kenney_nature-kit/Models/OBJ format/cliff_top_rock.obj");
|
enum Asset cliff = cliff_top_rock;
|
||||||
Model tree = LoadModel("assets/kenney_nature-kit/Models/OBJ format/tree_oak.obj");
|
enum Asset tree = tree_oak;
|
||||||
|
enum Asset house = tent_detailedOpen;
|
||||||
|
|
||||||
Vector3 position = {0};
|
Vector3 position = {0};
|
||||||
Image map = GenImagePerlinNoise(MAP_SIZE, MAP_SIZE, 0, 0, 1.f);
|
Image map = GenImagePerlinNoise(MAP_SIZE, MAP_SIZE, 0, 0, 1.f);
|
||||||
|
@ -184,6 +154,8 @@ int main(void) {
|
||||||
generate_river(map_data, global_minimum_map_i);
|
generate_river(map_data, global_minimum_map_i);
|
||||||
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
|
#define NUM_TREES MAP_SIZE * MAP_SIZE / 100
|
||||||
int *trees_x = LoadRandomSequence(NUM_TREES, -MAP_SIZE / 2, MAP_SIZE / 2);
|
int *trees_x = LoadRandomSequence(NUM_TREES, -MAP_SIZE / 2, MAP_SIZE / 2);
|
||||||
int *trees_y = LoadRandomSequence(NUM_TREES, - MAP_SIZE / 2, MAP_SIZE / 2);
|
int *trees_y = 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 dx = CLAMP(x + gradients[gradient_i][0], 0, MAP_SIZE - 1);
|
||||||
int dy = CLAMP(y + gradients[gradient_i][1], 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++) {
|
for (int height = map_data[i].g; height < map_data[dy * MAP_SIZE + dx].g; height++) {
|
||||||
DrawModelEx(cliff,
|
DrawModelEx(assets[cliff],
|
||||||
(Vector3){
|
(Vector3){
|
||||||
.x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f),
|
.x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f),
|
||||||
.y = height,
|
.y = height,
|
||||||
|
@ -231,7 +203,7 @@ int main(void) {
|
||||||
if (map_data[i].r) {
|
if (map_data[i].r) {
|
||||||
select_river_tile(map_data, rivers, x, y, &river_i, &direction);
|
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){
|
(Vector3){
|
||||||
.x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f),
|
.x = MAP_SIZE * (x / (float) MAP_SIZE - 0.5f),
|
||||||
.y = map_data[i].g, //- (map_gradient_magnitude_data[i].g < 2),
|
.y = map_data[i].g, //- (map_gradient_magnitude_data[i].g < 2),
|
||||||
|
@ -241,8 +213,9 @@ int main(void) {
|
||||||
WHITE);
|
WHITE);
|
||||||
}
|
}
|
||||||
for (int tree_i = 0; tree_i < NUM_TREES; tree_i++) {
|
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);
|
DrawGrid(20, 10.0f);
|
||||||
Vector3 capsule_top = player_pos;
|
Vector3 capsule_top = player_pos;
|
||||||
capsule_top.y += 0.2f;
|
capsule_top.y += 0.2f;
|
||||||
|
|
Loading…
Reference in a new issue