Files
Voyager/Content/Materials/Rift/Blackhole.usf

58 lines
1.5 KiBLFS
Plaintext

#define STEPS 250
struct BlackHoleProperties
{
float Mass; // Mass of the Black Hole.
float EventHorizon; // Black Hole Radius, Mass * 2
};
// Position of Blackhole assumed to be at the Origin
bool CrossedEventHorizon(float3 RayPos, BlackHoleProperties BHP)
{
if (length(RayPos) <= BHP.EventHorizon)
{
return true;
}
return false;
}
float Cross2(float3 A, float3 B)
{
return pow((A.y * B.z) - (A.z * B.y), 2) +
pow((A.z * B.x) - (A.x * B.z), 2) +
pow((A.x * B.y) - (A.y * B.x), 2);
}
float3 GravityForce(float3 RayPos, float3 RayDir, BlackHoleProperties BHP)
{
RayDir = normalize(RayDir);
float DistToSingularity = length(RayPos);
float SquareDistance = DistToSingularity * DistToSingularity + 0.0001; // Prevent Divide by Zero
float3 SingularityToPos = normalize(RayPos);
return (-3.0 * BHP.Mass) / SquareDistance * Cross2(SingularityToPos, RayDir) * SingularityToPos;
}
void BlackHole(inout float4 Color, inout float Mask, inout float3 Dir, float3 CameraPosition, BlackHoleProperties BHP)
{
float3 RayPos = CameraPosition;
float3 RayDir = Dir;
float3 PrevPos;
//Begin Ray Marching
for (int i = 0; i < STEPS; i++)
{
if (CrossedEventHorizon(RayPos, BHP))
{
Mask = 0;
break;
}
PrevPos = RayPos;
RayPos += RayDir + GravityForce(RayPos, RayDir, BHP);
RayDir = normalize(RayPos - PrevPos);
}
Dir = RayDir;
}