void cameraRecalculateMatrices(Camera* camera) { camera->perspectiveMatrix = projMatrix(camera->FOV, camera->aspectRatio, camera->nearPlane, camera->farPlane); Vec3 negCamPos; vec3Scale(&negCamPos, &camera->position, -1.0f); Mat4 translation = translate(negCamPos); Quaternion q = quaternion(-camera->rotation.w,camera->rotation.x,camera->rotation.y,camera->rotation.z); Mat4 rotato; mat4FromQuaternion(&rotato, &q); mat4Mul(&camera->transformMatrix, &rotato, &translation); }
//=========================================================================== // Takes Ray and Intersect data and calculates the colour of that light ray color3f Scene::getRayColor(rayData& ray, polygon* closestPoly, point3* closestPoint, float u, float v) { color3f pixCol(0.f, 0.f, 0.f); PROFILE_BEGIN(PROFILE_LIGHT) if (closestPoly) { #if LIGHTING_ENABLE color3f tmpColor; vec3Cpy(&tmpColor, &renderLight.color); vec3 displacement; vec3Sub(&displacement, &renderLight.position, closestPoint); float scale = 1.f; { #if LIGHTING_DISTANCE_BASED scale = 1/(vec3LenSq(&displacement)+1.f); #endif // LIGHTING_DISTANCE_BASED #if LIGHTING_NORMAL_BASED scale *= vec3Dot(&closestPoly->normal, &displacement); #endif // LIGHTING_NORMAL_BASED #if LIGHTING_SPECULAR_ENABLED vec3 reflection; vec3Reflect(&reflection, &displacement, &closestPoly->normal); vec3Unit(&reflection); vec3Unit(closestPoint); float specular = vec3Dot(&reflection, closestPoint); specular = (-specular * SPECULAR_BRIGHTNESS) - SPECULAR_FALLOFF; specular = fmax(0.f, specular); scale += specular; #endif // LIGHTING_SPECULAR_ENABLED } #if LIGHTING_AMBIENT_ENABLED scale += AMBIENT_BRIGHTNESS; #endif // LIGHTING_AMBIENT_ENABLED vec3Scale(&tmpColor, scale); // color3f* pColor = &closestPoly->color; color3f texColor; texture->Sample(u, v, texColor); tmpColor.x *= texColor.x; tmpColor.y *= texColor.y; tmpColor.z *= texColor.z; colorFloatTrunc(&tmpColor); pixCol = tmpColor; #else pixCol = closestPoly->color; #endif } PROFILE_END(PROFILE_LIGHT) return pixCol; }
vec3 vec3::operator / (const float &rhs) const { vec3 vResult; vec3Scale(vResult, *this, 1.f/rhs); return vResult; }