ref: df239037125072efca28411d29f94ed46b31c470
parent: da1284f240a1366c6a40535523906be12e7732ef
author: rodri <rgl@antares-labs.eu>
date: Sun Apr 6 20:06:50 EDT 2025
xform: simplify clip2ndc and ndc2viewport
--- a/xform.c
+++ b/xform.c
@@ -63,11 +63,10 @@
Point3
clip2ndc(Point3 p)
{
- p.w = p.w == 0? 0: 1.0/p.w;
- p.x *= p.w;
- p.y *= p.w;
- p.z *= p.w;
- return p;
+ double w;
+
+ w = p.w == 0? 0: 1.0/p.w;
+ return (Point3){p.x*w, p.y*w, p.z*w, w};
}
/*
@@ -79,18 +78,13 @@
ndc2viewport(Framebuf *fb, Point3 p)
{
Matrix3 view = {
- Dx(fb->r)/2.0, 0, 0, Dx(fb->r)/2.0,
- 0, -Dy(fb->r)/2.0, 0, Dy(fb->r)/2.0,
- 0, 0, 1.0/2.0, 1.0/2.0,
+ Dx(fb->r)/2.0, 0, 0, Dx(fb->r)/(2*p.w),
+ 0, -Dy(fb->r)/2.0, 0, Dy(fb->r)/(2*p.w),
+ 0, 0, 1.0/2.0, 1.0/(2*p.w),
0, 0, 0, 1,
};
- double w;
- w = p.w;
- p.w = 1;
- p = xform3(p, view);
- p.w = w;
- return p;
+ return xform3(p, view);
}
Point3