From 494a29f47014cef4454c8c37dfd5494e53d05ad7 Mon Sep 17 00:00:00 2001 From: James Lambert Date: Sun, 17 Apr 2022 20:35:32 -0600 Subject: [PATCH] Work on level generation --- Makefile | 31 ++++++++++++++++++++++++++----- src/levels/levels.c | 11 +++++++++++ src/levels/levels.h | 9 +++++++++ src/scene/cube.c | 13 +++++++++++-- tools/generate_level_list.js | 20 ++++++++++++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/levels/levels.c create mode 100644 src/levels/levels.h create mode 100644 tools/generate_level_list.js diff --git a/Makefile b/Makefile index 8437a83..b803aeb 100644 --- a/Makefile +++ b/Makefile @@ -31,8 +31,6 @@ ASMOBJECTS = $(patsubst %.s, build/%.o, $(ASMFILES)) CODEFILES = $(shell find src/ -type f -name '*.c') -CODEOBJECTS = $(patsubst %.c, build/%.o, $(CODEFILES)) - CODESEGMENT = build/codesegment BOOT = /usr/lib/n64/PR/bootcode/boot.6102 @@ -92,12 +90,31 @@ src/models/sphere.h src/models/sphere_geo.inc.h: assets/fbx/Sphere.fbx TEST_CHAMBERS = $(shell find assets/test_chambers -type f -name '*.blend') +TEST_CHAMBER_HEADERS = $(TEST_CHAMBERS:%.blend=build/%.h) +TEST_CHAMBER_OBJECTS = $(TEST_CHAMBERS:%.blend=build/%_geo.o) + build/%.fbx: %.blend @mkdir -p $(@D) $(BLENDER_2_9) $< --background --python tools/export_fbx.py -- $@ -build/assets/test_chambers/%.h: build/assets/test_chambers/%.fbx - $(SKELATOOL64) -s 256 -n $(<:build/assets/test_chambers/%.fbx=%) -o $@ $< +build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c: build/assets/test_chambers/%.fbx $(SKELATOOL64) + $(SKELATOOL64) -l -s 2.56 -c 0.01 -n $(<:build/assets/test_chambers/%.fbx=%) -o $(<:%.fbx=%.h) $< + +build/assets/test_chambers/%.o: build/assets/test_chambers/%.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) -MM $^ -MF "$(@:.o=.d)" -MT"$@" + $(CC) $(CFLAGS) -c -o $@ $< + +levels: $(TEST_CHAMBER_HEADERS) + echo $(TEST_CHAMBER_HEADERS) + +build/assets/test_chambers/level_list.h: $(TEST_CHAMBER_HEADERS) + @mkdir -p $(@D) + node tools/generate_level_list.js $@ $(TEST_CHAMBER_HEADERS) + +build/src/levels/levels.o: build/assets/test_chambers/level_list.h + +.PHONY: levels #################### ## Linking @@ -108,6 +125,8 @@ $(BOOT_OBJ): $(BOOT) # without debugger +CODEOBJECTS = $(patsubst %.c, build/%.o, $(CODEFILES)) $(TEST_CHAMBER_OBJECTS) + CODEOBJECTS_NO_DEBUG = $(CODEOBJECTS) ifeq ($(WITH_DEBUGGER),1) @@ -145,4 +164,6 @@ $(BASE_TARGET_NAME)_debug.z64: $(CODESEGMENT)_debug.o $(OBJECTS) $(CP_LD_SCRIPT) makemask $(BASE_TARGET_NAME)_debug.z64 clean: - rm -rf build \ No newline at end of file + rm -rf build + +.SECONDARY: \ No newline at end of file diff --git a/src/levels/levels.c b/src/levels/levels.c new file mode 100644 index 0000000..0f0dfd1 --- /dev/null +++ b/src/levels/levels.c @@ -0,0 +1,11 @@ +#include "levels.h" + +#include "../build/assets/test_chambers/level_list.h" + +struct CollisionObject* levelsGetCollisionObjects() { + return test_chamber_00_test_chamber_00_0_collision_objects; +} + +int levelsGetCollisionObjectCount() { + return TEST_CHAMBER_00_TEST_CHAMBER_00_0_QUAD_COLLIDERS_COUNT; +} \ No newline at end of file diff --git a/src/levels/levels.h b/src/levels/levels.h new file mode 100644 index 0000000..bb4b28e --- /dev/null +++ b/src/levels/levels.h @@ -0,0 +1,9 @@ +#ifndef __LEVEL_LIST_H__ +#define __LEVEL_LIST_H__ + +#include "physics/collision_object.h" + +struct CollisionObject* levelsGetCollisionObjects(); +int levelsGetCollisionObjectCount(); + +#endif \ No newline at end of file diff --git a/src/scene/cube.c b/src/scene/cube.c index d1dc3bc..b6a6cba 100644 --- a/src/scene/cube.c +++ b/src/scene/cube.c @@ -3,6 +3,7 @@ #include "../models/models.h" #include "defs.h" #include "../graphics/debug_render.h" +#include "levels/levels.h" struct CollisionBox gCubeCollisionBox = { {0.3165f, 0.3165f, 0.3165f} @@ -60,8 +61,16 @@ void cubeInit(struct Cube* cube) { } void cubeUpdate(struct Cube* cube) { - collisionObjectCollideWithPlane(&cube->collisionObject, &gFloorObject, &gContactSolver); - collisionObjectCollideWithQuad(&cube->collisionObject, &gFloatingQuadObject, &gContactSolver); + // collisionObjectCollideWithPlane(&cube->collisionObject, &gFloorObject, &gContactSolver); + // collisionObjectCollideWithQuad(&cube->collisionObject, &gFloatingQuadObject, &gContactSolver); + + int colliderCount = levelsGetCollisionObjectCount(); + struct CollisionObject* objects = levelsGetCollisionObjects(); + + for (int i = 0; i < colliderCount; ++i) { + collisionObjectCollideWithQuad(&cube->collisionObject, &objects[i], &gContactSolver); + } + contactSolverSolve(&gContactSolver); rigidBodyUpdate(&cube->rigidBody); } diff --git a/tools/generate_level_list.js b/tools/generate_level_list.js new file mode 100644 index 0000000..7e1470c --- /dev/null +++ b/tools/generate_level_list.js @@ -0,0 +1,20 @@ +const fs = require('fs'); +const path = require('path'); + +function generateInclude(outputLocation, headerLocation) { + return `#include "${path.relative(path.dirname(outputLocation), headerLocation)}"` +} + +function generateData(outputLocation, headerLocations) { + return `#ifndef __BUILD_LEVEL_LIST_H__ +#define __BUILD_LEVEL_LIST_H__ + +${headerLocations.map(headerLocation => generateInclude(outputLocation, headerLocation)).join('\n')} + +#endif +`; +} + +const output = process.argv[2]; + +fs.writeFileSync(output, generateData(output, process.argv.slice(3))); \ No newline at end of file