Skip to content

Commit

Permalink
More preparation for Kittopia
Browse files Browse the repository at this point in the history
* Replaced the ScaledSpaceFader and SunShaderController with modifed versions
  that use sharedMaterial
* Removed more fields from the UI or the export
* Updated config-parser
* Fixed Ring creation at runtime
StollD committed May 25, 2018
1 parent 263b0d3 commit 3d419b9
Showing 14 changed files with 354 additions and 49 deletions.
2 changes: 2 additions & 0 deletions src/Kopernicus.Components/Kopernicus.Components.csproj
Original file line number Diff line number Diff line change
@@ -98,6 +98,8 @@
<Compile Include="ShaderLoader.cs" />
<Compile Include="KopernicusStar.cs" />
<Compile Include="KopernicusSunFlare.cs" />
<Compile Include="SharedScaledSpaceFader.cs" />
<Compile Include="SharedSunShaderController.cs" />
<Compile Include="StorageComponent.cs" />
<Compile Include="Wiresphere.cs" />
<Compile Include="PlanetaryParticle.cs" />
5 changes: 4 additions & 1 deletion src/Kopernicus.Components/Ring.cs
Original file line number Diff line number Diff line change
@@ -219,7 +219,10 @@ public void BuildRing()

ringMR.material.color = color;
ringMR.material.renderQueue = 3010;
parent.GetChild("Atmosphere").GetComponent<Renderer>().material.renderQueue = 3020;
if (parent.GetChild("Atmosphere") != null)
{
parent.GetChild("Atmosphere").GetComponent<Renderer>().material.renderQueue = 3020;
}

// Call the modules
Components.ForEach(m => m.PostApply(this));
73 changes: 73 additions & 0 deletions src/Kopernicus.Components/SharedScaledSpaceFader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using System;
using UnityEngine;

namespace Kopernicus
{
namespace Components
{
/// <summary>
/// A scaled space fader extension that uses the sharedMaterial
/// </summary>
public class SharedScaledSpaceFader : ScaledSpaceFader
{
void Start()
{
celestialBody = PSystemManager.Instance.localBodies.Find(b => b.scaledBody == gameObject);
r = GetComponent<Renderer>();
}

void Update()
{
if (FlightGlobals.currentMainBody == celestialBody && !MapView.MapIsEnabled &&
FlightGlobals.currentMainBody.pqsController != null)
{
Double alt = FlightGlobals.currentMainBody.pqsController.visibleAltitude;
Single t;
if (alt <= fadeStart)
{
r.enabled = false;
}
else
{
if (alt >= fadeEnd)
{
t = 1f;
}
else
{
t = (Single) ((alt - fadeStart) / (fadeEnd - fadeStart));
}

r.enabled = true;
r.sharedMaterial.SetFloat(floatName, t);
}
}
else if (GetAngularSize(transform, r, ScaledCamera.Instance.cam) > 1f)
{
r.sharedMaterial.SetFloat(floatName, 1f);
r.enabled = true;
}
else
{
r.enabled = false;
}

if (celestialBody.ResourceMap != _resourceMap)
{
_resourceMap = celestialBody.ResourceMap;
r.sharedMaterial.SetTexture("_ResourceMap", _resourceMap);
}
}

void OnDestroy()
{
if (r != null && r.sharedMaterial != null)
{
r.sharedMaterial.SetFloat(floatName, 1f);
}
}

private Texture2D _resourceMap;
}
}
}
74 changes: 74 additions & 0 deletions src/Kopernicus.Components/SharedSunShaderController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System;
using UnityEngine;

namespace Kopernicus
{
namespace Components
{
/// <summary>
/// A sun shader controller extension that uses the sharedMaterial
/// </summary>
public class SharedSunShaderController : SunShaderController
{
void Start()
{
_renderer = GetComponent<Renderer>();
UpdateRampMap();
}

void OnDestroy()
{
if (rampMap != null)
{
Destroy(rampMap);
}
}

private void UpdateRampMap()
{
if (rampMap != null)
{
Destroy(rampMap);
}

rampMap = new Texture2D(256, 3, TextureFormat.RGBA32, false) {filterMode = FilterMode.Bilinear};
for (Int32 i = 0; i < 256; i++)
{
Single r = curve0.Evaluate(i * 0.00390625f);
Single g = curve1.Evaluate(i * 0.00390625f);
Single b = curve2.Evaluate(i * 0.00390625f);
Single a = curve3.Evaluate(i * 0.00390625f);
for (Int32 j = 0; j < 5; j++)
{
rampMap.SetPixel(i, j, new Color(r,g,b,a));
}
}

rampMap.Apply(false, true);
_renderer.sharedMaterial.SetTexture("_RampMap", rampMap);
}

private void Update()
{
Single time;
if (usePlanetariumTime && Planetarium.fetch != null)
{
time = (Single) Planetarium.GetUniversalTime() * speedFactor;
}
else
{
time = Time.realtimeSinceStartup * speedFactor;
}

_renderer.sharedMaterial.SetFloat("_Offset0", 1f / frequency0 * time);
_renderer.sharedMaterial.SetFloat("_Offset1", 1f / frequency1 * time);
_renderer.sharedMaterial.SetFloat("_Offset2", 1f / frequency2 * time);
_renderer.sharedMaterial.SetFloat("_Offset3", 1f / frequency3 * time);
}

private Renderer _renderer;

private Texture2D rampMap;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Material wrapper generated by shader translator tool
using System;
using Kopernicus.MaterialWrapper;
using Kopernicus.UI;
using UnityEngine;

namespace Kopernicus
@@ -11,12 +12,12 @@ namespace Configuration
public class EmissiveMultiRampSunspotsLoader : EmissiveMultiRampSunspots
{
// Ramp Map (RGBA), default = "white" { }
[ParserTarget("rampMap")]
public Texture2DParser rampMapSetter
{
get { return rampMap; }
set { rampMap = value; }
}
// [ParserTarget("rampMap")]
// public Texture2DParser rampMapSetter
// {
// get { return rampMap; }
// set { rampMap = value; }
// }

[ParserTarget("rampMapScale")]
private Vector2Parser rampMapScaleSetter
19 changes: 16 additions & 3 deletions src/Kopernicus/Configuration/ModLoader/ModLoader.cs
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ namespace Configuration
namespace ModLoader
{
[RequireConfigType(ConfigType.Node)]
public class ModLoader<T> : BaseLoader, IModLoader, IPatchable, ICreatable<T>, ITypeParser<T> where T : PQSMod
public abstract class ModLoader<T> : BaseLoader, IModLoader, IPatchable, ICreatable<PQSMod>, ICreatable<CelestialBody>, ITypeParser<T> where T : PQSMod
{
// The mod loader must always be able to return a mod
public T mod { get; set; }
@@ -60,6 +60,10 @@ protected PQS pqsVersion
{
get
{
if (_pqsVersionOverride != null)
{
return _pqsVersionOverride;
}
try
{
return Parser.GetState<PQS>("Kopernicus:pqsVersion");
@@ -71,6 +75,8 @@ protected PQS pqsVersion
}
}

private PQS _pqsVersionOverride;

// Mod loader provides basic PQS mod loading functions
[ParserTarget("order")]
public NumericParser<Int32> order
@@ -108,9 +114,16 @@ void ICreatable.Create()
}

// Creates the a PQSMod of type T
void ICreatable<T>.Create(T value)
void ICreatable<PQSMod>.Create(PQSMod value)
{
Create(value, pqsVersion);
Create((T)value, pqsVersion);
}

// Creates the a PQSMod from the specified body
void ICreatable<CelestialBody>.Create(CelestialBody value)
{
_pqsVersionOverride = value.pqsController;
Create(pqsVersion);
}

// Creates the a PQSMod of type T with given PQS
7 changes: 7 additions & 0 deletions src/Kopernicus/Configuration/PQSLoader.cs
Original file line number Diff line number Diff line change
@@ -180,6 +180,13 @@ public Material fallbackMaterial
[KittopiaUntouchable]
public List<IModLoader> mods = new List<IModLoader>();

[KittopiaAction("Rebuild Sphere")]
[KittopiaDescription("Rebuilds the surface of the planet.")]
public void Rebuild()
{
Value.RebuildSphere();
}

/// <summary>
/// Creates a new PQS Loader from the Injector context.
/// </summary>
4 changes: 2 additions & 2 deletions src/Kopernicus/Configuration/RingLoader.cs
Original file line number Diff line number Diff line change
@@ -237,8 +237,8 @@ public NumericParser<Single> innerShadeRotationPeriod
[KittopiaDescription("Updates the mesh of the planetary ring.")]
public void RebuildRing()
{
UnityEngine.Object.Destroy(Value.GetComponent<MeshRenderer>());
UnityEngine.Object.Destroy(Value.GetComponent<MeshFilter>());
UnityEngine.Object.DestroyImmediate(Value.GetComponent<MeshRenderer>());
UnityEngine.Object.DestroyImmediate(Value.GetComponent<MeshFilter>());
Value.BuildRing();
}

75 changes: 48 additions & 27 deletions src/Kopernicus/Configuration/ScaledVersionLoader.cs
Original file line number Diff line number Diff line change
@@ -125,31 +125,19 @@ public NumericParser<Boolean> deferMesh
[KittopiaUntouchable]
public Material material
{
get
{
Renderer r = Value.scaledBody.GetComponent<Renderer>();
if (r.sharedMaterial != null)
{
if (ScaledPlanetSimple.UsesSameShader(r.sharedMaterial) && !(r.sharedMaterial is ScaledPlanetSimple))
{
r.sharedMaterial = new ScaledPlanetSimpleLoader(r.sharedMaterial);
}

if (ScaledPlanetRimAerial.UsesSameShader(r.sharedMaterial) && !(r.sharedMaterial is ScaledPlanetRimAerial))
{
r.sharedMaterial = new ScaledPlanetRimAerialLoader(r.sharedMaterial);
}

if (EmissiveMultiRampSunspots.UsesSameShader(r.sharedMaterial) && !(r.sharedMaterial is EmissiveMultiRampSunspots))
{
r.sharedMaterial = new EmissiveMultiRampSunspotsLoader(r.sharedMaterial);
}
}
return r.sharedMaterial;
}
get { return Value.scaledBody.GetComponent<Renderer>().sharedMaterial; }
set { Value.scaledBody.GetComponent<Renderer>().sharedMaterial = value; }
}

[ParserTarget("TextureOptions", AllowMerge = true)]
[KittopiaHideOption(export = false, show = true)]
[KittopiaUntouchable]
public PlanetTextureExporter.TextureOptions options
{
get { return Value.Get("textureOptions", new PlanetTextureExporter.TextureOptions()); }
set { Value.Set("textureOptions", value); }
}

[KittopiaAction("Rebuild ScaledSpace Mesh")]
public void RebuildScaledSpace()
{
@@ -160,7 +148,7 @@ public void RebuildScaledSpace()
[KittopiaAction("Rebuild ScaledSpace Textures")]
public IEnumerator RebuildTextures()
{
return PlanetTextureExporter.UpdateTextures(Value, new PlanetTextureExporter.TextureOptions());
return PlanetTextureExporter.UpdateTextures(Value, options);
}

// Parser apply event
@@ -179,12 +167,18 @@ void IParserEventSubscriber.Apply(ConfigNode node)
if (type.Value != BodyType.Star)
{
// If we are not a star, we need a scaled space fader and a sphere collider
if (Value.scaledBody.GetComponent<ScaledSpaceFader>() == null)
ScaledSpaceFader fader = Value.scaledBody.GetComponent<ScaledSpaceFader>();
if (fader == null)
{
ScaledSpaceFader fader = Value.scaledBody.AddComponent<ScaledSpaceFader>();
fader = Value.scaledBody.AddComponent<SharedScaledSpaceFader>();
fader.floatName = "_Opacity";
fader.celestialBody = Value;
}
else if (!(fader is SharedScaledSpaceFader))
{
Utility.CopyObjectFields(fader, Value.scaledBody.AddComponent<SharedScaledSpaceFader>());
UnityEngine.Object.DestroyImmediate(fader);
}

// Add a sphere collider if we need one
if (Value.scaledBody.GetComponent<SphereCollider>() == null)
@@ -227,8 +221,16 @@ void IParserEventSubscriber.Apply(ConfigNode node)
else
{
// Add the SunShaderController behavior
if (Value.scaledBody.GetComponent<SunShaderController>() == null)
Value.scaledBody.AddComponent<SunShaderController>();
SunShaderController controller = Value.scaledBody.GetComponent<SunShaderController>();
if (controller == null)
{
Value.scaledBody.AddComponent<SharedSunShaderController>();
}
else if (!(controller is SharedSunShaderController))
{
Utility.CopyObjectFields(controller, Value.scaledBody.AddComponent<SharedSunShaderController>());
UnityEngine.Object.DestroyImmediate(controller);
}

// Add the ScaledSun behavior
// TODO - apparently there can only be one of these (or it destroys itself)
@@ -368,6 +370,25 @@ public ScaledVersionLoader(CelestialBody body)
else
type = BodyType.Vacuum;

if (type != BodyType.Star)
{
ScaledSpaceFader fader = Value.scaledBody.GetComponent<ScaledSpaceFader>();
if (!(fader is SharedScaledSpaceFader))
{
Utility.CopyObjectFields(fader, Value.scaledBody.AddComponent<SharedScaledSpaceFader>());
UnityEngine.Object.Destroy(fader);
}
}
else
{
SunShaderController controller = Value.scaledBody.GetComponent<SunShaderController>();
if (controller != null && !(controller is SharedSunShaderController))
{
Utility.CopyObjectFields(controller, Value.scaledBody.AddComponent<SharedSunShaderController>());
UnityEngine.Object.Destroy(controller);
}
}

// Assign the proper scaled space loaders
if (material == null)
{
1 change: 1 addition & 0 deletions src/Kopernicus/Storage.cs
Original file line number Diff line number Diff line change
@@ -109,6 +109,7 @@ public static T Get<T>(this CelestialBody body, String id, T defaultValue)
{
return body.Get<T>(id);
}
body.Set(id, defaultValue);
return defaultValue;
}

Loading

0 comments on commit 3d419b9

Please sign in to comment.