summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-08 11:36:04 +0100
committerskal <pascal.massimino@gmail.com>2026-03-08 11:36:04 +0100
commitba7ea27ddee4398afa98a0e45b9e227bbcfae906 (patch)
tree09f8bb60c324aad53c829d79f50f56497cd1d7be /src/util
parent1ad5057ce8e68e57340aae3442b2c6b787409ad3 (diff)
fix: negate Y in perspective() to correct rasterized 3D orientation
The fullscreen post-process VS uses Y-up UVs (uv.y=0 = bottom), so textureSample() Y-flips any rasterized offscreen texture. SDF effects author their content Y-down and look correct after the flip. Rasterized effects (RotatingCube, Hybrid3D) must pre-flip their geometry: - mat4::perspective(): m[5] = -t (negated Y scale) - Pipelines with cullMode=Back: frontFace = WGPUFrontFace_CW (Y-flip reverses winding, so CW becomes the visible face) - Remove incorrect transposes from GlobalUniforms::make(), ObjectData::make(), and Uniforms::make() — mini_math is column-major, no transpose needed for GPU upload - Document the convention in doc/3D.md under "Rasterized 3D and the Y-flip rule" handoff(Gemini): Y-flip rule now documented; all rasterized 3D pipelines must follow it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/util')
-rw-r--r--src/util/mini_math.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/util/mini_math.h b/src/util/mini_math.h
index 29dc38f..0aa66a3 100644
--- a/src/util/mini_math.h
+++ b/src/util/mini_math.h
@@ -229,7 +229,7 @@ struct mat4 {
mat4 r = {};
float t = 1.0f / std::tan(fov * 0.5f);
r.m[0] = t / asp;
- r.m[5] = t;
+ r.m[5] = -t; // Negate Y: post-process chain samples textures Y-flipped
r.m[10] = f / (n - f);
r.m[11] = -1;
r.m[14] = (n * f) / (n - f);