Skip to content

Commit

Permalink
fixed albedo camera view being shifted at high warp speeds for scaled…
Browse files Browse the repository at this point in the history
… space
  • Loading branch information
valerian committed Dec 19, 2015
1 parent 0f3a51d commit 05d8ac1
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 23 deletions.
33 changes: 18 additions & 15 deletions PlanetShine/Albedo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,17 @@ public class Albedo
public Texture2D combinedTexture;

public CelestialBody targetBody;
public int dimension;
public int pixelSize;
public bool active;
public float fov = 120f;
public Vector3 position;
public float elevation = 0f;

public Albedo(int dimension)
public Albedo(int pixelSize)
{
active = false;
this.dimension = dimension;
combinedTexture = new Texture2D(dimension, dimension, TextureFormat.RGB24, false);
localCamera = new AlbedoCamera(false, LayerMask.LocalScenery, dimension);
scaledCamera = new AlbedoCamera(true, LayerMask.ScaledScenery, dimension);
this.pixelSize = pixelSize;
combinedTexture = new Texture2D(pixelSize, pixelSize, TextureFormat.RGB24, false);
localCamera = new AlbedoCamera(false, LayerMask.LocalScenery, pixelSize);
scaledCamera = new AlbedoCamera(true, LayerMask.ScaledScenery, pixelSize);
}

public void Activate(CelestialBody target)
Expand All @@ -50,17 +48,22 @@ public bool Update()
if (!active)
return false;

/*
position = FlightGlobals.ActiveVessel.transform.position;
position += (position - targetBody.transform.position).normalized * elevation;
float distance = (float) (position - targetBody.position).magnitude;
fov = 2 * Mathf.Rad2Deg * Mathf.Acos(Mathf.Sqrt(Mathf.Max((distance * distance) - (float)(targetBody.Radius * targetBody.Radius), 1)) / distance);
float nearClipPlane = Mathf.Max(0.001f, distance - ((float)targetBody.Radius - (float)targetBody.atmosphereDepth) * 1.2f);
float nearClipPlane = Mathf.Max(0.001f, distance - (((float)targetBody.Radius - (float)targetBody.atmosphereDepth) * 1.5f));
float farClipPlane = distance + ((float)targetBody.Radius);
*/

localCamera.Update(position, nearClipPlane, farClipPlane);
scaledCamera.Update(position, nearClipPlane, farClipPlane);
localCamera.camera.fieldOfView = fov;
scaledCamera.camera.fieldOfView = fov;
//localCamera.Update(position, nearClipPlane, farClipPlane);
//scaledCamera.Update(position, nearClipPlane, farClipPlane);

localCamera.Update(targetBody, elevation);
scaledCamera.Update(targetBody, elevation);
//localCamera.camera.fieldOfView = fov;
//scaledCamera.camera.fieldOfView = fov;
return true;
}

Expand Down Expand Up @@ -95,8 +98,8 @@ public void Combine()

public Color ExtractColor(float ratio = 1f)
{
int size = (int)(dimension * ratio);
int position = (int)((dimension / 2f) * (1f - ratio));
int size = (int)(pixelSize * ratio);
int position = (int)((pixelSize / 2f) * (1f - ratio));
return combinedTexture.GetAverageColorSlow(position, position, size, size);
}
}
Expand Down
27 changes: 19 additions & 8 deletions PlanetShine/AlbedoCamera.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,23 +59,34 @@ public void Deactivate()
active = false;
}

public bool Update(Vector3 position, float nearClipPlane = 0.0001f, float farClipPlane = 200000000f)
public bool Update(CelestialBody targetBody, float elevation)
{
if (!active)
return false;
if (inScaledSpace)
{
cameraObject.transform.position = ScaledSpace.LocalToScaledSpace(position);
cameraObject.transform.LookAt(ScaledSpace.LocalToScaledSpace(targetBody.transform.position));
camera.nearClipPlane = ScaledSpace.InverseScaleFactor * nearClipPlane;
camera.farClipPlane = ScaledSpace.InverseScaleFactor * farClipPlane;
cameraObject.transform.position = ScaledSpace.LocalToScaledSpace(FlightGlobals.ActiveVessel.transform.position);
cameraObject.transform.position += (cameraObject.transform.position - targetBody.scaledBody.transform.position).normalized * (ScaledSpace.InverseScaleFactor * elevation);
cameraObject.transform.LookAt(targetBody.scaledBody.transform.position);

float distance = (float)(cameraObject.transform.position - targetBody.scaledBody.transform.position).magnitude;
camera.fieldOfView = 2 * Mathf.Rad2Deg * Mathf.Acos(Mathf.Sqrt(Mathf.Max((distance * distance)
- (float)(ScaledSpace.InverseScaleFactor * ScaledSpace.InverseScaleFactor * targetBody.Radius * targetBody.Radius), 1)) / distance);

camera.nearClipPlane = Mathf.Max(0.001f, distance - (((float)targetBody.Radius - (float)targetBody.atmosphereDepth) * 1.5f * ScaledSpace.InverseScaleFactor));
camera.farClipPlane = distance + ((float)targetBody.Radius * ScaledSpace.InverseScaleFactor);
}
else
{
cameraObject.transform.position = position;
cameraObject.transform.position = FlightGlobals.ActiveVessel.transform.position;
cameraObject.transform.position += (cameraObject.transform.position - targetBody.transform.position).normalized * elevation;
cameraObject.transform.LookAt(targetBody.transform.position);
camera.nearClipPlane = nearClipPlane;
camera.farClipPlane = farClipPlane;

float distance = (float)(cameraObject.transform.position - targetBody.transform.position).magnitude;
camera.fieldOfView = 2 * Mathf.Rad2Deg * Mathf.Acos(Mathf.Sqrt(Mathf.Max((distance * distance) - (float)(targetBody.Radius * targetBody.Radius), 1)) / distance);

camera.nearClipPlane = Mathf.Max(0.001f, distance - (((float)targetBody.Radius - (float)targetBody.atmosphereDepth) * 1.5f));
camera.farClipPlane = distance + ((float)targetBody.Radius);
}
return true;
}
Expand Down

0 comments on commit 05d8ac1

Please sign in to comment.