Vector4 LightInfo::GetPointLightOnPoint(const Vector4& _cameraSpacePoint, const Vector4& _point, const Vector4& _normal, int _lightIndex, const Vector4& _diffuse, const Vector4& _specular) { // Get the difference in position from the light and the point. Vector4 diff = GetPointLights()[_lightIndex].GetPosition() - _point; Vector4 lightDirection = diff; // The distance float distance = diff.Length(); // The direction diff.Normalize(); // The attenuation float attenuation = GetPointLights()[_lightIndex].GetAttenuation(distance); // Diffuse lighting. Vector4 pointColor = GetPointLights()[_lightIndex].GetIntensity() * diff.Dot(_normal) * attenuation * _diffuse; pointColor.Clamp(); // Specular // We get the half angle between the camera and the direction to the camera. Vector4 halfAngle = lightDirection + _cameraSpacePoint; halfAngle.Normalize(); Vector4 specular = _specular * powf(halfAngle.Dot(_normal), 10) * attenuation; specular.Clamp(); pointColor += specular; return pointColor; }
Vector3 ComputePoint(float32_t param, const Vector3& a, const Vector3& b, const Vector3& c, const Vector3& d, const CurveGenerator::Type type ) { Vector4 v = ComputeParam( param, type ); const Matrix4& curveBasis = ComputeBasis( type ); Vector4 x (a.x, b.x, c.x, d.x); x = curveBasis * x; Vector4 y (a.y, b.y, c.y, d.y); y = curveBasis * y; Vector4 z (a.z, b.z, c.z, d.z); z = curveBasis * z; return Vector3 (v.Dot(x), v.Dot(y), v.Dot(z)); }
/* Get the light value for a point in space */ Vector4 LightInfo::GetDirectionalLightOnPoint(const Vector4& _cameraSpacePoint, const Vector4& _normal, int _lightIndex, const Vector4& _diffuse, const Vector4& _specular) { Vector4 directionalColor = GetDirectionalLights()[_lightIndex].GetIntensity() * GetDirectionalLights()[_lightIndex].GetDirection().Dot(_normal) * _diffuse; directionalColor.Clamp(); // Specular Vector4 halfAngle = GetDirectionalLights()[_lightIndex].GetDirection() + _cameraSpacePoint; halfAngle.Normalize(); Vector4 specular = _specular * powf(halfAngle.Dot(_normal), 100) * GetDirectionalLights()[_lightIndex].GetIntensity(); specular.Clamp(); directionalColor += specular; return directionalColor; }
// Get the spot light info on a point. Vector4 LightInfo::GetSpotLightOnPoint(const Vector4& _cameraSpacePoint, const Vector4& _point, const Vector4& _normal, int _lightIndex, const Vector4& _diffuse, const Vector4& _specular) { // Get the difference in position from the light and the point. Vector4 diff = GetSpotLights()[_lightIndex].GetPosition() - _point; Vector4 lightDirection = diff; // The distance float distance = diff.Length(); // The direction diff.Normalize(); // Calculate the spot light values float spotLightValue = diff.Dot(GetSpotLights()[_lightIndex].GetDirection() * -1); if (spotLightValue > 0.2f) return Vector4(0, 0, 0, 0); float smoothing = GetSpotLights()[_lightIndex].SmoothStep(diff.Dot(_normal)); // The attenuation float attenuation = GetSpotLights()[_lightIndex].GetAttenuation(distance); // Diffuse lighting. Vector4 pointColor = GetSpotLights()[_lightIndex].GetIntensity() * diff.Dot(_normal) * attenuation * _diffuse * spotLightValue; // Specular // We get the half angle between the camera and the direction to the camera. Vector4 halfAngle = lightDirection + _cameraSpacePoint; halfAngle.Normalize(); pointColor += _specular * powf(halfAngle.Dot(_normal), 10) * attenuation; return pointColor; }