Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
04d62f0
fix: wrong matrix depth scale
HailToDodongo Aug 30, 2026
e7af034
fix: tests
HailToDodongo Aug 30, 2026
0d72ab3
chg: remove extra near plane
HailToDodongo Aug 31, 2026
540e14c
fix: vert perf regression
HailToDodongo Sep 1, 2026
af94215
chg: 32bit screen scale
HailToDodongo Sep 1, 2026
b662e7c
wip: vertex opt
HailToDodongo Sep 5, 2026
0e59db2
chg: add depth-test rom and snapshot test
HailToDodongo Sep 5, 2026
65f18fe
wip: vertex opt
HailToDodongo Sep 5, 2026
14b6b10
fix: unlit issue
HailToDodongo Sep 5, 2026
2bd7490
wip: opt ucode
HailToDodongo Sep 7, 2026
de93de7
chg: ucode opts
HailToDodongo Sep 8, 2026
a08aa35
fix: wrong clipping
HailToDodongo Sep 8, 2026
2989549
fix: uv issues
HailToDodongo Sep 8, 2026
feaa8c0
fix: clipping
HailToDodongo Sep 9, 2026
61fae6f
opt: ucode
HailToDodongo Sep 9, 2026
ab7be1f
opt: guard band scale opt
HailToDodongo Sep 9, 2026
6664d36
opt: ucode
HailToDodongo Sep 9, 2026
f6a20a6
wip: depth issues
HailToDodongo Sep 10, 2026
97d6dec
fix: depth clamp, tri ucode improvements
HailToDodongo Sep 11, 2026
22f4eb2
chg: RSP unit tests
HailToDodongo Sep 11, 2026
21d9b6d
chg: clean up test scripts
HailToDodongo Sep 11, 2026
8af4538
chg: clean up test scripts
HailToDodongo Sep 11, 2026
17aae9f
chg: update snapshot tests
HailToDodongo Sep 12, 2026
eaa7599
chg: ucode opt
HailToDodongo Sep 13, 2026
eb8f5dc
chg: ucode opt
HailToDodongo Sep 13, 2026
e10a362
chg: ucode opt
HailToDodongo Sep 13, 2026
1a796c7
fix: baseline reference
HailToDodongo Sep 15, 2026
87afa48
opt: ucode
HailToDodongo Sep 27, 2026
fdf1ab1
fix: tests
HailToDodongo Sep 27, 2026
2274788
fix: tests
HailToDodongo Sep 27, 2026
5167681
chg: update perf references
HailToDodongo Sep 28, 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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ CMakeLists.txt
gltf_to_t3d
website/html
*.exe
*.pak
*.pak
docs/_*
node_modules/
29 changes: 29 additions & 0 deletions breakingChanges.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Breaking changes

## Precision fix (2026-09-28)

This change increased depth precision, and by extension UV and position too by a bit.
However some existing bugs had to be fixed that caused a mismatch of units:

### Projection Near/Far

`t3d_viewport_set_projection` and `t3d_viewport_set_perspective` where wrong internally.
It resulted in a `far` value that was twice as far as it was supposed to be, at least for clipping.
Please re-adjust to the true value you need, otherwise geometry will clip too early now.

### Fog Range

`t3d_fog_set_range` was internally not correctly mapped to the world-space units.
This resulted in its near/far to refer to around double the amount.
Please re-adjust to the true value you need, otherwise fog will be too strong now.

`t3d_fog_set_range` now also requires a viewport to be attached.
Please do so before a call, and re-set fog for every viewport (e.g. in split-screens).

### Near-Clipping

Before, geometry was clipped against the near-plane,
now it does so against the cameras eye instead.
The region between near and the eye will be drawn with a clamped minimum depth value.
Be aware geometry can now be a lot closer to the camera, and ideally make sure the camera doesn't get too close (which was a good idea before the changes too).
If you relied on some kind of effect that artificially moved the near-plane further, this is no longer supported.
2 changes: 1 addition & 1 deletion examples/03_objects/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ int main()
}
timeUpdate = get_time_ms() - timeUpdate;

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(65.0f), 10.0f, 100.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(65.0f), 10.0f, 200.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

// ======== Draw (3D) ======== //
Expand Down
4 changes: 2 additions & 2 deletions examples/04_dynamic/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ int main()

fm_vec3_t camPos = {{sinf(camAngle) * 45.0f, 35.0f, cosf(camAngle) * 60.0f}};

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 10.0f, 150.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 10.0f, 200.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

// transform mesh
Expand Down Expand Up @@ -184,7 +184,7 @@ int main()
}

// Draw room:
t3d_fog_set_range(0.4f, 80.0f);
t3d_fog_set_range(0.8f, 160.0f);
t3d_fog_set_enabled(true);

t3d_light_set_ambient(colorAmbient);
Expand Down
4 changes: 2 additions & 2 deletions examples/05_splitscreen/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,6 @@ int main()
t3d_screen_clear_color(RGBA32(160, 110, 200, 0xFF));
t3d_screen_clear_depth();

t3d_fog_set_range(120.0f, 850.0f);

for(int v=0; v<PLAYER_COUNT; ++v)
{
T3DViewport *vp = &viewports[v];
Expand All @@ -156,6 +154,8 @@ int main()
t3d_viewport_look_at(vp, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});
t3d_viewport_attach(vp);

t3d_fog_set_range(140.0f, 1500.0f);

// if you need directional light, re-apply it here after a new viewport has been attached
//t3d_light_set_directional(0, colorDir, &lightDirVec);
t3d_matrix_push_pos(1);
Expand Down
2 changes: 1 addition & 1 deletion examples/08_animation/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ int main()
camPos.v[1] = camTarget.v[1] + 45;
camPos.v[2] = camTarget.v[2] + 65;

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 10.0f, 150.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 10.0f, 300.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

// Update the animation and modify the skeleton, this will however NOT recalculate the matrices
Expand Down
4 changes: 2 additions & 2 deletions examples/10_flipbook_tex/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ int main()
colorAmbient[1] = colorAmbient[2];
}

t3d_viewport_set_perspective(&viewport, T3D_DEG_TO_RAD(85.0f), aspectRatio, 10.0f, 150.0f);
t3d_viewport_set_perspective(&viewport, T3D_DEG_TO_RAD(85.0f), aspectRatio, 10.0f, 250.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

t3d_mat4fp_from_srt_euler(&mapMatFP[frameIdx],
Expand All @@ -127,7 +127,7 @@ int main()
rdpq_set_fog_color(fogColor);
rdpq_set_prim_color((color_t){warnBlend, warnBlend, warnBlend, 255});

t3d_fog_set_range(-20.0f, 50.0f);
t3d_fog_set_range(-20.0f, 120.0f);
t3d_fog_set_enabled(true);

t3d_light_set_ambient(colorAmbient);
Expand Down
2 changes: 1 addition & 1 deletion examples/11_segments/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ int main()
// the skeleton update also stays the same, internally it will handle the switch between buffers
t3d_skeleton_update(&skel);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(80.0f), 5.0f, 180.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(80.0f), 10.0f, 200.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

// for our model matrix, determine an index based on the frame...
Expand Down
2 changes: 1 addition & 1 deletion examples/12_uv_gen/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ int main()
}};
fm_vec3_lerp(&currentPos, &currentPos, &trargetPos, 0.2f);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 4.0f, 160.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 4.0f, 260.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

t3d_mat4fp_from_srt_euler(&model->modelMatFP[frameIdx],
Expand Down
3 changes: 2 additions & 1 deletion examples/13_cel_shading/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ int main()
}};
fm_vec3_lerp(&currentPos, &currentPos, &targetPos, 0.2f);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 5.0f, 120.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 5.0f, 240.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

t3d_mat4fp_from_srt_euler(&model->modelMatFP[frameIdx],
Expand Down Expand Up @@ -231,6 +231,7 @@ int main()
// ======== Draw ======== //
rdpq_attach(display_get(), display_get_zbuf());
t3d_frame_start();
rdpq_mode_dithering(DITHER_NONE_NONE);
t3d_viewport_attach(&viewport);

t3d_screen_clear_color(RGBA32(217, 174, 147, 0xFF));
Expand Down
2 changes: 1 addition & 1 deletion examples/14_outline/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ int main()

fm_vec3_lerp(&currentPos, &currentPos, &targetPos, 0.2f);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 5.0f, 120.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 5.0f, 240.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

float scale = 0.13f;
Expand Down
2 changes: 1 addition & 1 deletion examples/15_pointlight/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ int main()
3.0f, 250.0f
);
} else {
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(65.0f), 3.0f, 220.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(65.0f), 10.0f, 400.0f);
}

t3d_viewport_look_at(&viewport, &camPos, &camTargetCurr, &(fm_vec3_t){{0,1,0}});
Expand Down
2 changes: 1 addition & 1 deletion examples/16_light_clip/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ int main()
camPos.v[2] = fm_sinf(angleHor) * fm_cosf(angleVer) * camDist;
fm_vec3_lerp(&camPosCurrent, &camPosCurrent, &camPos, deltaTime * 5.0f);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(64.0f), 2.0f, 200.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(64.0f), 5.0f, 320.0f);
t3d_viewport_look_at(&viewport, &camPosCurrent, &camTarget, &(fm_vec3_t){{0,1,0}});

// ----------- DRAW (3D) ------------ //
Expand Down
6 changes: 3 additions & 3 deletions examples/17_culling/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ int main()
fm_vec3_add(&camTarget, &camPos, &camDir);

if(currentModel == 0) {
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(75.0f), 1.0f, 160.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(75.0f), 2.0f, 420.0f);
} else {
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(60.0f), 4.0f, 110.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(60.0f), 2.0f, 320.0f);
}
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

Expand Down Expand Up @@ -195,7 +195,7 @@ int main()

t3d_screen_clear_depth();

t3d_fog_set_range(37.0f, 180.0f);
t3d_fog_set_range(45.0f, 340.0f);
t3d_fog_set_enabled(true);

t3d_light_set_ambient((uint8_t[]){0xFF, 0xFF, 0xFF, 0xFF});
Expand Down
4 changes: 3 additions & 1 deletion examples/18_particles/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ int main()

t3d_mat4fp_from_srt_euler(&matPartFP[frameIdx], particleMatScale.v, particleRot.v, particlePos.v);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(80.0f), 5.0f, 250.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(80.0f), 7.0f, 420.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

// ======== Draw (3D) ======== //
Expand Down Expand Up @@ -275,6 +275,8 @@ int main()
// so any push/pop here will not affect t3d and vice versa.
// Also make sure that the first stack operation you do after 'tpx_state_from_t3d' is a push and not a set.
tpx_matrix_push(&matPartFP[frameIdx]);
tpx_state_set_base_size(72);

// While each particle has its own size, there is a global scaling factor that can be set.
// This can only scale particles down, so the range is 0.0 - 1.0.
tpx_state_set_scale(partSizeX, partSizeY);
Expand Down
3 changes: 2 additions & 1 deletion examples/19_particles_tex/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ int main()

t3d_mat4fp_from_srt_euler(&matPartFP[frameIdx], particleMatScale.v, particleRot.v, particlePos.v);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(80.0f), 5.0f, 250.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(80.0f), 7.0f, 420.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

// ======== Draw (3D) ======== //
Expand Down Expand Up @@ -317,6 +317,7 @@ int main()

tpx_state_from_t3d();
tpx_matrix_push(&matPartFP[frameIdx]);
tpx_state_set_base_size(72);
tpx_state_set_scale(partSizeX, partSizeY);

float tileIdx = fm_floorf(timeTile) * 32;
Expand Down
2 changes: 1 addition & 1 deletion examples/20_mipmaps/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ int main()
}};
fm_vec3_lerp(&currentPos, &currentPos, &trargetPos, 0.2f);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 14.0f, 240.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 14.0f, 450.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

t3d_mat4fp_from_srt_euler(&model->modelMatFP[frameIdx],
Expand Down
2 changes: 1 addition & 1 deletion examples/21_fresnel/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ int main()
}};
fm_vec3_lerp(&currentPos, &currentPos, &trargetPos, 0.2f);

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 4.0f, 100.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 6.0f, 200.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

t3d_mat4fp_from_srt_euler(&models->modelMatFP[frameIdx],
Expand Down
2 changes: 1 addition & 1 deletion examples/22_bigtex/src/scene/camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void Camera::update(float deltaTime) {
target.v[1] = pos.v[1] + dir.v[1];
target.v[2] = pos.v[2] + dir.v[2];

t3d_viewport_set_projection(viewport, T3D_DEG_TO_RAD(70.0f), 4.0f, 180.0f);
t3d_viewport_set_projection(viewport, T3D_DEG_TO_RAD(70.0f), 5.0f, 360.0f);
t3d_viewport_look_at(viewport, pos, target, {0,1,0});
}

Expand Down
2 changes: 1 addition & 1 deletion examples/23_hdr/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ int main()
displayMetrics = false;
}

t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 2.5f, 150.0f);
t3d_viewport_set_projection(&viewport, T3D_DEG_TO_RAD(85.0f), 4.0f, 300.0f);
t3d_viewport_look_at(&viewport, &camPos, &camTarget, &(fm_vec3_t){{0,1,0}});

t3d_mat4fp_from_srt_euler(&rotMatFP[frameIdx],
Expand Down
4 changes: 2 additions & 2 deletions examples/24_hdr_bloom/src/scene/scenes/sceneEnv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ SceneEnv::SceneEnv()
bgIndex = 1;

camera.fov = T3D_DEG_TO_RAD(85.0f);
camera.near = 1.0f;
camera.far = 100.0f;
camera.near = 1.5f;
camera.far = 200.0f;
camera.pos = {0.0, 0.0, 20.0};
camera.target = {0,0,0};

Expand Down
2 changes: 1 addition & 1 deletion examples/24_hdr_bloom/src/scene/scenes/sceneMagic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ SceneMagic::SceneMagic()
{
camera.fov = T3D_DEG_TO_RAD(75.0f);
camera.near = 3.0f;
camera.far = 200.0f;
camera.far = 400.0f;

camera.target = {0,0,0};
flyCam.camPos = {-50.0, 0.0, 0.0};
Expand Down
2 changes: 1 addition & 1 deletion examples/24_hdr_bloom/src/scene/scenes/sceneMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ SceneMain::SceneMain()

camera.fov = T3D_DEG_TO_RAD(80.0f);
camera.near = 5.0f;
camera.far = 295.0f;
camera.far = 600.0f;

//camera.pos = {0.0, -40.0, -400.0};
camera.pos = {0, 0, 10};
Expand Down
2 changes: 1 addition & 1 deletion examples/24_hdr_bloom/src/scene/scenes/scenePixel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ ScenePixel::ScenePixel()
{
camera.fov = T3D_DEG_TO_RAD(70.0f);
camera.near = 1.0f;
camera.far = 100.0f;
camera.far = 200.0f;
camera.pos = {-50.0, 50.0, 50.0};
camera.target = {0,0,0};

Expand Down
2 changes: 2 additions & 0 deletions examples/97_cliptest/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.actual.png
*.diff.png
27 changes: 27 additions & 0 deletions examples/97_cliptest/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
BUILD_DIR=build
T3D_INST=$(shell realpath ../..)

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

N64_CFLAGS += -std=gnu2x -Os $(CT_FLAGS)

src = main.c

all: t3d_97_cliptest.z64

$(BUILD_DIR)/t3d_97_cliptest.elf: $(src:%.c=$(BUILD_DIR)/%.o)

t3d_97_cliptest.z64: N64_ROM_TITLE="Tiny3D - ClipTest"

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

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

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

.PHONY: all clean
Loading
Loading