module maths.Perspective; private { import maths.Vec; import maths.Matrix; } vec4 perspDivAndViewport(vec4 ppos, vec2i screen) { ppos.x /= ppos.w; ppos.y /= ppos.w; ppos.z /= ppos.w; ppos.x += 1f; ppos.x *= .5f; ppos.y += 1f; ppos.y *= .5f; ppos.z += 1f; ppos.z *= .5f; ppos.x *= screen.x; ppos.y *= screen.y; ppos.w = 1.f / ppos.w; return ppos; } vec3 unproject(vec3 spos, mat4 perspM, vec2i screen) { perspM = perspM.inverse; spos.x /= screen.x; spos.y /= screen.y; spos *= 2.f; spos -= vec3(1.f, 1.f, 1.f); spos.y *= -1; vec4 tmp = perspM.xform(vec4(spos.x, spos.y, spos.z, 1)); return vec3(tmp.x * tmp.w, tmp.y * tmp.w, tmp.z * tmp.w); }