Vec2 cameraWorldToScreenPoint(Camera *cam, Vec3 worldPos) { Vec4 worldCoord = vec4FromVec3AndW(worldPos, 1.0); Mat4 viewProjection; mat4Mul(&viewProjection, &cam->perspectiveMatrix, &cam->transformMatrix); Vec4 ret4; mat4Vec4Mul(&ret4, &viewProjection, &worldCoord); vec4Scale(&ret4, &ret4, 1.0/ret4.w); Vec2 ret; ret.x = ret4.x; ret.y = ret4.y; return ret; }
Vec3 cameraScreenDepthToWorldPoint(Camera *cam, Vec2 screenPos, r32 depth) { Vec4 screenCoord = vec4(screenPos.x, screenPos.y, depth, 1.0); Mat4 mat = cameraCalculateInverseViewMatrix(cam); Mat4 mat2 = invPerspective(&cam->perspectiveMatrix); Mat4 camInvPerspective; mat4Mul(&camInvPerspective, &mat, &mat2); Vec4 ret4; mat4Vec4Mul(&ret4, &camInvPerspective, &screenCoord); vec4Scale(&ret4, &ret4, 1.0/ret4.w); return vec3FromVec4(ret4); }
vec4 vec4Subtract(const vec4 aVec, const vec4 bVec) { return vec4Add(aVec, vec4Scale(-1., bVec)); }
vec4 vec4Mix(const vec4 aVec, const vec4 bVec, const GLfloat blend) { return vec4Add(vec4Scale(blend, aVec), vec4Scale(1. - blend, bVec)); }
vec4 vec4Normalize(const vec4 inVec) { return vec4Scale(1.0f/vec4Magnitude(inVec), inVec); }