Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
215 commits
Select commit Hold shift + click to select a range
e4bc05d
Update submodules
moisesjpelaez Nov 14, 2025
96bf2c5
Add n64 submodules
moisesjpelaez Nov 14, 2025
537b858
Cleanup
moisesjpelaez Nov 14, 2025
8c39b86
Cleanup
moisesjpelaez Nov 14, 2025
746409f
Relocate n64 libs
moisesjpelaez Nov 14, 2025
69b3848
Initial layout implementation
moisesjpelaez Nov 14, 2025
eac3353
Initial placeholder and testing code added
moisesjpelaez Nov 15, 2025
fde72b8
Minor fixes
moisesjpelaez Nov 15, 2025
00fd99f
Minor changes
moisesjpelaez Nov 15, 2025
ee991ca
Add initial build process
moisesjpelaez Nov 16, 2025
3ee96aa
Build libdragon from Armory's Blender addon
moisesjpelaez Nov 17, 2025
e6f54b3
Add button to build tiny3d from the addon
moisesjpelaez Nov 17, 2025
6775c8e
Separate export process in a new script
moisesjpelaez Nov 18, 2025
b43450b
Update libdragon's dependencies install
moisesjpelaez Nov 19, 2025
63dbaeb
Export meshes as separate objects. Export multiple directional lights
moisesjpelaez Nov 20, 2025
46d41ee
Reuse meshes on exported objects
moisesjpelaez Nov 21, 2025
fc95358
Export scene objects with their proper rotations
moisesjpelaez Nov 21, 2025
414fbf8
[WIP] Multi scene implementation
moisesjpelaez Nov 21, 2025
2fd0d23
Initial multi scene implementation
moisesjpelaez Nov 21, 2025
d45568f
Rename type `Scene` to `ArmScene`
moisesjpelaez Nov 21, 2025
cd7f05a
Cleanup and minor changes
moisesjpelaez Nov 21, 2025
87c3964
Minor changes
moisesjpelaez Nov 21, 2025
ee3b871
Cleanup
moisesjpelaez Nov 21, 2025
03f7219
Sync with libdragon
moisesjpelaez Nov 21, 2025
0d7af6f
Small refactor
moisesjpelaez Nov 21, 2025
0ec09ed
Fix mesh name refs
moisesjpelaez Nov 23, 2025
d32c311
Auto convert materials to fast64 and reset to bsdf on build
moisesjpelaez Nov 23, 2025
4e82eb3
Small update to reuse cached bsdf material instead of creating a new one
moisesjpelaez Nov 23, 2025
042bba9
[WIP:Untested] Start integrating Scene and Object Traits logic
moisesjpelaez Nov 24, 2025
fba1780
[WIP:Untested] Some 'performance' updates
moisesjpelaez Nov 24, 2025
833c991
Add empty functions to write objects
moisesjpelaez Nov 24, 2025
8c3db68
[WIP:Untested] Refactor scene and object blocks
moisesjpelaez Nov 24, 2025
151d2e8
[WIP:Untested] Add camera and lights in C 'mini-engine'
moisesjpelaez Nov 24, 2025
ea6dc1b
[WIP:Untested] Naming convention changed and minor updates
moisesjpelaez Nov 24, 2025
c19ddbe
[WIP:Untested] Add multiple cameras per scene
moisesjpelaez Nov 24, 2025
16a2a46
[WIP:Untested] Some fixes for *_on_ready/update/remove functions
moisesjpelaez Nov 24, 2025
e8da2f4
[Broken] Make the project compile with multiple objects, lights and c…
moisesjpelaez Nov 24, 2025
87caed2
Properly finish base implementation for extra cameras, lights and obj…
moisesjpelaez Nov 24, 2025
ba2e6d8
Optimization updates
moisesjpelaez Nov 24, 2025
2f373b4
Minor fixes
moisesjpelaez Nov 24, 2025
b263017
Minor optimizations
moisesjpelaez Nov 25, 2025
745bbd6
Add initial iron Haxe to C bridge
moisesjpelaez Nov 25, 2025
81dc68c
Add static input mapping
moisesjpelaez Nov 25, 2025
c676f12
Static input implementation
moisesjpelaez Nov 25, 2025
5259083
Trait implementation restructure
moisesjpelaez Nov 25, 2025
a0e4448
Micro optimizations
moisesjpelaez Nov 25, 2025
609b974
Parameterize scene traits
moisesjpelaez Nov 25, 2025
b4c6730
Add scene transitions to N64Bridge
moisesjpelaez Nov 25, 2025
0d0e532
Implement scene transitioning
moisesjpelaez Nov 25, 2025
0a165ea
Add optimization TODOs
moisesjpelaez Nov 25, 2025
76c7673
Add object visibility
moisesjpelaez Nov 25, 2025
a043313
Add input maps and clean up N64Bridge refs
moisesjpelaez Nov 25, 2025
cdfcfee
Add analog stick to input in N64Bridge
moisesjpelaez Nov 25, 2025
639e114
Relocate n64 addon's scripts
moisesjpelaez Nov 25, 2025
95b2bd3
Minor refactor
moisesjpelaez Nov 25, 2025
44003e4
Cleanup
moisesjpelaez Nov 25, 2025
d798162
Remove trait parser
moisesjpelaez Nov 25, 2025
077b0a5
Some changes
moisesjpelaez Nov 25, 2025
193bb5a
Integrate n64 with Build and Play buttons
moisesjpelaez Nov 25, 2025
89ee8c0
Integrate Ares emulator as a runtime
moisesjpelaez Nov 26, 2025
bb05278
Add cache build check on n64 builds
moisesjpelaez Nov 26, 2025
d8dd198
Fix Play, Build and Publish processes for n64
moisesjpelaez Nov 26, 2025
21160f5
Add initial bridge mapping, and bridge compilation errors fixes
moisesjpelaez Nov 26, 2025
59a66be
Initial Trait generation code
moisesjpelaez Nov 26, 2025
023036e
Minor cleanup
moisesjpelaez Nov 26, 2025
71cc3fe
Cleanup input mapping
moisesjpelaez Nov 26, 2025
cdc40bd
Generate traits with C hl builds instead of Krom builds. Cleanup iron…
moisesjpelaez Nov 26, 2025
666c4f9
Update mini engine structure
moisesjpelaez Nov 26, 2025
26c85f5
Mini engine fixes and cleanup
moisesjpelaez Nov 26, 2025
d803bd2
Mini engine cleanup
moisesjpelaez Nov 26, 2025
63e4f68
Add renderer optimizaiton
moisesjpelaez Nov 26, 2025
aaa4eb4
Use pointers instead of fixed array for traits
moisesjpelaez Nov 26, 2025
35e0010
Add hashlink C scanner
moisesjpelaez Nov 26, 2025
74a2351
[Prototype] Translate Haxe traits to N64 C friendly
moisesjpelaez Nov 26, 2025
d88ba7d
[Prototype] Trait extraction refactor
moisesjpelaez Nov 26, 2025
cbb1824
[Prototype] Refactor get_scene
moisesjpelaez Nov 26, 2025
47a1039
[Untested] Add hlc AST parser
moisesjpelaez Nov 26, 2025
3da4663
Refactor
moisesjpelaez Nov 26, 2025
b1c76ea
Codegen refactor
moisesjpelaez Nov 26, 2025
dac7185
Attempt to fix rotations
moisesjpelaez Nov 26, 2025
925d8c2
Reorganize mini engine
moisesjpelaez Nov 26, 2025
e688028
Add a macro to export trait data as a json
moisesjpelaez Nov 27, 2025
b3df322
Remove AST and replace it with JSON generated by macro
moisesjpelaez Nov 27, 2025
157225e
[Untested] Update macro with more complex patterns
moisesjpelaez Nov 27, 2025
7c8db51
Attempt to fix rotations
moisesjpelaez Nov 27, 2025
4d42149
Some fixes and refactor
moisesjpelaez Nov 27, 2025
f9bcc7d
Some optimizations
moisesjpelaez Nov 27, 2025
4c245ae
Cleanup extra logs
moisesjpelaez Nov 27, 2025
92c8e55
[WIP] Move data generation to macros
moisesjpelaez Nov 27, 2025
cd04b77
Several fixes
moisesjpelaez Nov 28, 2025
0f0091c
Cleanup
moisesjpelaez Nov 29, 2025
36cb6ad
Cleanup
moisesjpelaez Nov 29, 2025
90aa942
Add frustum culling and toggle debug HUD
moisesjpelaez Nov 29, 2025
e73ecc4
Refactor
moisesjpelaez Nov 29, 2025
4f73cc8
Add traits to cameras and lights
moisesjpelaez Nov 29, 2025
5c95144
Refactor and cleanup
moisesjpelaez Nov 29, 2025
e1851ab
Initial custom scale
moisesjpelaez Nov 29, 2025
aec5d4e
Fix scaling
moisesjpelaez Nov 29, 2025
f5ad5cd
Initial rotations fix
moisesjpelaez Nov 30, 2025
d71385b
Use quaternions for rotations instead of euler
moisesjpelaez Nov 30, 2025
2e42b9b
Fix rotations
moisesjpelaez Nov 30, 2025
1f81cfd
Fix rotations
moisesjpelaez Nov 30, 2025
188d815
Remove unused buttons
moisesjpelaez Nov 30, 2025
a55622d
Add Vec2 pattern
moisesjpelaez Nov 30, 2025
0ba9302
Some fixes
moisesjpelaez Nov 30, 2025
012a144
More fixes
moisesjpelaez Nov 30, 2025
2ab6d18
Use Trait valid methods
moisesjpelaez Nov 30, 2025
0d255b6
General fixes and improvements
moisesjpelaez Nov 30, 2025
3cc8922
Cleanup
moisesjpelaez Nov 30, 2025
8a6991c
Cleanup
moisesjpelaez Nov 30, 2025
a75c520
Use 'custom' target instead of 'windows-hl' when calling khamake for …
moisesjpelaez Nov 30, 2025
9dbae3e
Cleanup
moisesjpelaez Nov 30, 2025
a48caca
Sync with libdragon and tiny3d. Small cleanup
moisesjpelaez Nov 30, 2025
b848c4c
More fixes and cleaup on expression
moisesjpelaez Nov 30, 2025
6d7e3c0
Update mini engine files to support physics
moisesjpelaez Nov 30, 2025
2b9b995
[Prototype] Initial Oimo Physics implementation
moisesjpelaez Nov 30, 2025
ece042a
[Prototype] Restructure oimo_64
moisesjpelaez Nov 30, 2025
197d9b5
[WIP] Oimo reimplementation
moisesjpelaez Dec 1, 2025
178b5be
[Untested] Add more oimo features
moisesjpelaez Dec 1, 2025
cfbdffe
Properly include capsule shapes
moisesjpelaez Dec 1, 2025
e7c8f65
Wrap up inital Oimo porting/implementation
moisesjpelaez Dec 1, 2025
c80fabf
[WIP] Move to event-driven approach
moisesjpelaez Dec 2, 2025
3eb4828
Refactor and minor improvements
moisesjpelaez Dec 2, 2025
dc76d28
Oimo 64 improvements
moisesjpelaez Dec 2, 2025
293c4f6
Minor improvement
moisesjpelaez Dec 2, 2025
eff9812
Minor enhancement
moisesjpelaez Dec 2, 2025
79f45e6
Cleanup
moisesjpelaez Dec 2, 2025
439b316
More cleanup
moisesjpelaez Dec 2, 2025
69616b5
More fixes and cleanup
moisesjpelaez Dec 2, 2025
62d7a7a
Refactor
moisesjpelaez Dec 2, 2025
97cf947
Fix object collisions and general performance optimizations
moisesjpelaez Dec 3, 2025
06cd0da
Cleanup and sync with libdragon
moisesjpelaez Dec 3, 2025
c04b0de
[WIP] Add initial static mesh collisions
moisesjpelaez Dec 3, 2025
1d0e75a
Wrap up static mesh collider
moisesjpelaez Dec 3, 2025
4c968a8
Physics optimizations
moisesjpelaez Dec 3, 2025
5e35775
Refactor collisions
moisesjpelaez Dec 3, 2025
9e20619
Set physics properties from Blender's UI
moisesjpelaez Dec 3, 2025
88c889f
Comments cleanup
moisesjpelaez Dec 3, 2025
c08cbe8
Add physics debug draw
moisesjpelaez Dec 3, 2025
8fec2c3
Small optimizations
moisesjpelaez Dec 3, 2025
7144552
Refactor and cleanup
moisesjpelaez Dec 3, 2025
3c51630
Refactor and minor changes
moisesjpelaez Dec 3, 2025
b03622e
[WIP] Start implementing scene parent/child hierarchy - relative posi…
moisesjpelaez Dec 3, 2025
137e81b
Revert "[WIP] Start implementing scene parent/child hierarchy - relat…
moisesjpelaez Dec 3, 2025
da8cc43
Update macro
moisesjpelaez Dec 3, 2025
cf4e233
Update codegen
moisesjpelaez Dec 4, 2025
d6fef44
Update macro with more patterns
moisesjpelaez Dec 4, 2025
222ba3b
Cleanup and refactor
moisesjpelaez Dec 4, 2025
0c1e626
Finish adding common Transform methods
moisesjpelaez Dec 4, 2025
19f4229
Initial Koui implementation (labels). Macro and codegen improvements.
moisesjpelaez Dec 4, 2025
5a26399
Codegen and macro improvements
moisesjpelaez Dec 4, 2025
d547339
Codegen and macro improvements and cleanup
moisesjpelaez Dec 4, 2025
823f3ff
Update codegen docstring
moisesjpelaez Dec 4, 2025
dba0cb3
Simplify headers
moisesjpelaez Dec 4, 2025
3c84cb5
Add physics notifyOnContact and trigger collisions
moisesjpelaez Dec 4, 2025
9ba1502
Reorganize mini C engine structure
moisesjpelaez Dec 4, 2025
753442d
Update performance and comments
moisesjpelaez Dec 4, 2025
23d73be
Optimize some math using fmath
moisesjpelaez Dec 4, 2025
385fd68
Fix paths
moisesjpelaez Dec 4, 2025
fe087fc
Add signals. [BUG] Individual duplicated objects not being removed.
moisesjpelaez Dec 4, 2025
7722746
Fix scene set active parsing
moisesjpelaez Dec 4, 2025
b1519bd
Fix crashes on real hardware
moisesjpelaez Dec 5, 2025
76aeb66
Change default fixed step. Prevent static objects from recalculating
moisesjpelaez Dec 5, 2025
6536d41
Revert 'optimization'
moisesjpelaez Dec 5, 2025
1c13957
Refactor and improve signals
moisesjpelaez Dec 5, 2025
3538c1f
Fix signals disconnections
moisesjpelaez Dec 5, 2025
7d6fcd6
Fix physics debugging
moisesjpelaez Dec 5, 2025
8896bb5
Performance optimizations
moisesjpelaez Dec 5, 2025
6c09e15
Update physics debug and attempt to fix random crashes with it activated
moisesjpelaez Dec 5, 2025
d4652a8
Rotate sphere normals on physics debug
moisesjpelaez Dec 5, 2025
7d921b8
Use hardware for physics debugging
moisesjpelaez Dec 5, 2025
62dd72d
Optimize physics debugger
moisesjpelaez Dec 5, 2025
66db27a
Physics debug performance optimization
moisesjpelaez Dec 5, 2025
192ce27
Small fixes
moisesjpelaez Dec 6, 2025
23194cc
Initial logic nodes wrapper implementation
moisesjpelaez Dec 7, 2025
10902c1
Cleanup debug traces
moisesjpelaez Dec 7, 2025
c4e233c
Delete .vscode/settings.json
moisesjpelaez Dec 8, 2025
d102255
Reset .vscode/settings.json
moisesjpelaez Dec 8, 2025
eb8cc1d
Merge branch 'armory3d:main' into n64
moisesjpelaez Dec 9, 2025
9332600
Merge branch 'armory3d:main' into n64
moisesjpelaez Dec 18, 2025
b71974a
Update tilesheets
moisesjpelaez Dec 22, 2025
02d13b1
Don't replay tilesheet action if it's playing
moisesjpelaez Dec 22, 2025
9bc9557
Add flipX and flipY properties
moisesjpelaez Dec 22, 2025
16371d1
Sync with main
moisesjpelaez Dec 22, 2025
09f1205
Add timer
moisesjpelaez Dec 22, 2025
c2cd756
Merge branch 'armory3d:main' into n64
moisesjpelaez Dec 22, 2025
2244557
[WIP] New Tilesheet implementation
moisesjpelaez Dec 25, 2025
67e14ab
Add Tilesheet null checks to prevent crashes
moisesjpelaez Dec 25, 2025
cbbebc5
Tilesheet return fix
moisesjpelaez Dec 25, 2025
2470b49
Properly detect the tilesheet flag
moisesjpelaez Dec 25, 2025
6bf2fef
Cleanup
moisesjpelaez Dec 25, 2025
e72ac3d
Properly export tilesheet meshes
moisesjpelaez Dec 25, 2025
958547b
Swap Tilesheet meshes instead of strings
moisesjpelaez Dec 25, 2025
1e9478c
Place Armory Tilesheet panel below Armory Traits panel
moisesjpelaez Dec 25, 2025
6089700
Proper initialization for Krom and HTML5 builds
moisesjpelaez Dec 25, 2025
f89f538
Fix mesh referencing on runtime (may need cleanup)
moisesjpelaez Dec 26, 2025
19c0283
Cleanup Tilesheet implementation
moisesjpelaez Dec 26, 2025
8574c7e
Apply physics break fixes and sync with libdragon
moisesjpelaez Dec 26, 2025
3cd3362
Update Scene initialization
moisesjpelaez Dec 28, 2025
041b4e5
Minor change
moisesjpelaez Dec 28, 2025
7c6427f
Add Object.getTraitInChildren
moisesjpelaez Dec 28, 2025
0c319da
Change to Object.getTraitFromChildren
moisesjpelaez Dec 28, 2025
3e2ee92
Prevent cross scene merging shaders
moisesjpelaez Dec 28, 2025
857d235
Export curve meshes
moisesjpelaez Dec 29, 2025
179cc8b
Add compound shapes support (Oimo exclusive)
moisesjpelaez Dec 29, 2025
83e1f25
Add rb compound shapes to Bullet module
moisesjpelaez Dec 29, 2025
c333f28
[WIP] Add events to Tilesheet
moisesjpelaez Dec 29, 2025
fff3d8a
Some fixes for nested linked objects
moisesjpelaez Dec 30, 2025
15c2c74
Fix tilesheet material export
moisesjpelaez Dec 30, 2025
a07c6b8
Fix spawning linked objects and trait initialization
moisesjpelaez Dec 30, 2025
9e6c5d4
[Tilesheet] Use owner's mesh when tilesheet has no children
moisesjpelaez Dec 31, 2025
cb4af6f
Pause tilesheets when App is paused
moisesjpelaez Jan 1, 2026
45f54b4
Merge branch 'main' into n64
moisesjpelaez Jan 2, 2026
4ef783a
Fix curves and (revert) objects initial positions
moisesjpelaez Jan 15, 2026
dd9f0df
Update ParticleSystemGPU with new Tilesheet API
moisesjpelaez Jan 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
[submodule "Kha"]
path = Kha
url = https://github.com/armory3d/Kha

[submodule "lib/libdragon"]
path = lib/libdragon
url = https://github.com/DragonMinded/libdragon.git
branch = preview

[submodule "lib/tiny3d"]
path = lib/tiny3d
url = https://github.com/HailToDodongo/tiny3d.git
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
"[python]": {
"editor.insertSpaces": true
}
}
}
75 changes: 75 additions & 0 deletions armorcore/Deployment/n64/Makefile.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
BUILD_DIR=build

T3D_INST={tiny3d_path}

include $(N64_INST)/include/n64.mk
include $(T3D_INST)/t3d.mk

GAME_TITLE := {game_title}
ROM_NAME := {game_title}

N64_CFLAGS += -std=gnu2x

src = \
src/main.c \
src/engine.c \
src/renderer.c \
src/system/signal.c \
src/data/models.c \
src/data/scenes.c \
src/data/traits.c \
src/events/trait_events.c \
src/iron/object/transform.c \
src/iron/object/object.c \
src/iron/system/input.c \
{scene_files}

# Physics sources (conditionally included)
{physics_sources}

# UI sources (conditionally included)
{koui_sources}

assets_png = $(wildcard assets/*.png)
assets_gltf = $(wildcard assets/*.gltf)
assets_ttf = $(wildcard assets/*.ttf)
assets_conv = $(addprefix filesystem/,$(notdir $(assets_png:%.png=%.sprite))) \
$(addprefix filesystem/,$(notdir $(assets_ttf:%.ttf=%.font64))) \
$(addprefix filesystem/,$(notdir $(assets_gltf:%.gltf=%.t3dm)))

all: $(ROM_NAME).z64

filesystem/%.sprite: assets/%.png
@mkdir -p $(dir $@)
@echo " [SPRITE] $@"
$(N64_MKSPRITE) $(MKSPRITE_FLAGS) -o filesystem "$<"

filesystem/%.font64: assets/%.ttf
@mkdir -p $(dir $@)
@echo " [FONT] $@"
$(N64_MKFONT) $(MKFONT_FLAGS) -o filesystem "$<"

filesystem/%.t3dm: assets/%.gltf
@mkdir -p $(dir $@)
@echo " [T3D-MODEL] $@"
$(T3D_GLTF_TO_3D) "$<" $@
$(N64_BINDIR)/mkasset -c 2 -o filesystem $@

$(BUILD_DIR)/$(ROM_NAME).dfs: $(assets_conv)
$(BUILD_DIR)/$(ROM_NAME).elf: $(src:%.c=$(BUILD_DIR)/%.o)

$(ROM_NAME).z64: N64_ROM_TITLE=$(GAME_TITLE)
$(ROM_NAME).z64: $(BUILD_DIR)/$(ROM_NAME).dfs

clean:
rm -rf $(BUILD_DIR) *.z64
rm -rf filesystem

build_lib:
rm -rf $(BUILD_DIR) *.z64
make -C $(T3D_INST)
make all

-include $(wildcard $(BUILD_DIR)/*.d)

.PHONY: all clean
File renamed without changes.
61 changes: 61 additions & 0 deletions armorcore/Deployment/n64/src/data/fonts.c.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#include <libdragon.h>
#include "fonts.h"

// Font paths (converted from .ttf to .font64 by Makefile)
static const char *FONT_PATHS[FONT_COUNT] = {{
{font_paths}
}};

// rdpq font IDs start at 2 (1 is reserved for libdragon debug font)
#define FONT_ID_BASE 2

typedef struct {{
rdpq_font_t *font;
uint8_t loaded;
}} FontEntry;

static FontEntry g_fonts[FONT_COUNT];

void fonts_init(void)
{{
for (uint8_t i = 0; i < FONT_COUNT; i++) {{
g_fonts[i].font = NULL;
g_fonts[i].loaded = 0;
}}
}}

void fonts_shutdown(void)
{{
for (uint8_t i = 0; i < FONT_COUNT; i++) {{
if (g_fonts[i].loaded) {{
if (g_fonts[i].font) {{
rdpq_font_free(g_fonts[i].font);
g_fonts[i].font = NULL;
}}
g_fonts[i].loaded = 0;
}}
}}
}}

rdpq_font_t *fonts_get(FontId id)
{{
if (id >= FONT_COUNT) {{
return NULL;
}}

FontEntry *e = &g_fonts[id];
if (!e->loaded) {{
const char *path = FONT_PATHS[id];
e->font = rdpq_font_load(path);
if (e->font) {{
rdpq_text_register_font(FONT_ID_BASE + id, e->font);
e->loaded = 1;
}}
}}
return e->font;
}}

uint8_t fonts_get_rdpq_id(FontId id)
{{
return FONT_ID_BASE + id;
}}
22 changes: 22 additions & 0 deletions armorcore/Deployment/n64/src/data/fonts.h.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include <libdragon.h>

#ifdef __cplusplus
extern "C" {{
#endif

typedef enum {{
{font_enum_entries}
FONT_COUNT = {font_count}
}} FontId;

void fonts_init(void);
void fonts_shutdown(void);

rdpq_font_t *fonts_get(FontId id);
uint8_t fonts_get_rdpq_id(FontId id);

#ifdef __cplusplus
}}
#endif
129 changes: 129 additions & 0 deletions armorcore/Deployment/n64/src/data/models.c.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#include <libdragon.h>
#include <t3d/t3d.h>
#include <t3d/t3dmodel.h>

#include "models.h"

static const char *MODEL_PATHS[MODEL_COUNT] = {{
{mesh_paths}
}};

typedef struct {{
T3DModel *model;
rspq_block_t *dpl;
uint16_t ref_count; // Reference count for shared models
uint8_t loaded;
}} ModelEntry;

static ModelEntry g_models[MODEL_COUNT];

void models_init(void)
{{
for (uint8_t i = 0; i < MODEL_COUNT; i++) {{
g_models[i].model = NULL;
g_models[i].dpl = NULL;
g_models[i].ref_count = 0;
g_models[i].loaded = 0;
}}
}}

void models_shutdown(void)
{{
for (uint8_t i = 0; i < MODEL_COUNT; i++) {{
if (g_models[i].loaded) {{
if (g_models[i].model) {{
t3d_model_free(g_models[i].model);
g_models[i].model = NULL;
}}
if (g_models[i].dpl) {{
rspq_block_free(g_models[i].dpl);
g_models[i].dpl = NULL;
}}
g_models[i].ref_count = 0;
g_models[i].loaded = 0;
}}
}}
}}

T3DModel *models_get(ModelId id)
{{
if (id < 0 || id >= MODEL_COUNT) {{
return NULL;
}}

ModelEntry *e = &g_models[id];
if (!e->loaded) {{
const char *path = MODEL_PATHS[id];
e->model = t3d_model_load(path);
if (!e->model) {{
debugf("Failed to load model: %s\n", path);
return NULL;
}}
rspq_block_begin();
t3d_model_draw(e->model);
e->dpl = rspq_block_end();
e->loaded = 1;
}}
e->ref_count++; // Increment reference count
return e->model;
}}

rspq_block_t *models_get_dpl(ModelId id)
{{
return g_models[id].dpl;
}}

// Release a reference to a model
void models_release(ModelId id)
{{
if (id < 0 || id >= MODEL_COUNT) {{
return;
}}
ModelEntry *e = &g_models[id];
if (e->ref_count > 0) {{
e->ref_count--;
}}
}}

// Unload a model and free its resources.
// Note: Models are cached by default for performance. Call this explicitly
// when transitioning between scenes that use different model sets, or when
// memory pressure requires freeing unused models.
void models_unload(ModelId id)
{{
if (id < 0 || id >= MODEL_COUNT) {{
return;
}}

ModelEntry *e = &g_models[id];
if (e->loaded) {{
if (e->model) {{
t3d_model_free(e->model);
e->model = NULL;
}}
if (e->dpl) {{
rspq_block_free(e->dpl);
e->dpl = NULL;
}}
e->ref_count = 0;
e->loaded = 0;
}}
}}

// Unload only models with zero references (safe after scene transition)
void models_unload_unused(void)
{{
for (uint8_t i = 0; i < MODEL_COUNT; i++) {{
if (g_models[i].loaded && g_models[i].ref_count == 0) {{
models_unload(i);
}}
}}
}}

// Unload all models to free memory (useful before scene transitions)
void models_unload_all(void)
{{
for (uint8_t i = 0; i < MODEL_COUNT; i++) {{
models_unload(i);
}}
}}
28 changes: 28 additions & 0 deletions armorcore/Deployment/n64/src/data/models.h.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#pragma once

#include <t3d/t3dmodel.h>
#include <rspq.h>

#ifdef __cplusplus
extern "C" {{
#endif

typedef enum {{
{model_enum_entries}
MODEL_COUNT = {model_count}
}} ModelId;

void models_init(void);
void models_shutdown(void);

T3DModel *models_get(ModelId id);
rspq_block_t *models_get_dpl(ModelId id);

void models_release(ModelId id); // Release a reference to a model
void models_unload(ModelId id); // Force unload a model
void models_unload_unused(void); // Unload models with zero references
void models_unload_all(void); // Unload all models to free memory

#ifdef __cplusplus
}}
#endif
Loading