mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Ring opacity (#286)
Adds a curve that changes opacity of rings. You're welcome trifid.
This commit is contained in:
commit
69ecd7f4c6
Binary file not shown.
@ -188,7 +188,7 @@ namespace NewHorizons.Builder.Body
|
||||
newProxy.SetActive(true);
|
||||
}
|
||||
|
||||
private static GameObject AddColouredSphere(GameObject rootObj, float size, VariableSizeModule.TimeValuePair[] curve, Color color)
|
||||
private static GameObject AddColouredSphere(GameObject rootObj, float size, TimeValuePair[] curve, Color color)
|
||||
{
|
||||
GameObject sphereGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
|
||||
sphereGO.transform.name = "ProxySphere";
|
||||
@ -206,7 +206,7 @@ namespace NewHorizons.Builder.Body
|
||||
return sphereGO;
|
||||
}
|
||||
|
||||
private static void AddSizeController(GameObject go, VariableSizeModule.TimeValuePair[] curve, float size)
|
||||
private static void AddSizeController(GameObject go, TimeValuePair[] curve, float size)
|
||||
{
|
||||
var sizeController = go.AddComponent<SizeController>();
|
||||
sizeController.SetScaleCurve(curve);
|
||||
|
||||
@ -7,7 +7,6 @@ using System.Collections.Generic;
|
||||
using NewHorizons.External.Modules;
|
||||
using UnityEngine;
|
||||
using Logger = NewHorizons.Utility.Logger;
|
||||
using NewHorizons.External.Modules.VariableSize;
|
||||
|
||||
namespace NewHorizons.Builder.Body
|
||||
{
|
||||
@ -49,6 +48,8 @@ namespace NewHorizons.Builder.Body
|
||||
sfv._fluidType = ring.fluidType.ConvertToOW();
|
||||
sfv._density = 5f;
|
||||
|
||||
if (ringGO.TryGetComponent<RingOpacityController>(out var ringOC)) ringOC.SetRingFluidVolume(sfv);
|
||||
|
||||
ringVolume.SetActive(true);
|
||||
|
||||
|
||||
@ -116,10 +117,17 @@ namespace NewHorizons.Builder.Body
|
||||
rot._localAxis = Vector3.down;
|
||||
}
|
||||
|
||||
if (ring.curve != null)
|
||||
if (ring.scaleCurve != null)
|
||||
{
|
||||
var levelController = ringGO.AddComponent<SizeController>();
|
||||
levelController.SetScaleCurve(ring.curve);
|
||||
levelController.SetScaleCurve(ring.scaleCurve);
|
||||
}
|
||||
|
||||
if (ring.opacityCurve != null)
|
||||
{
|
||||
var ringOC = ringGO.AddComponent<RingOpacityController>();
|
||||
ringOC.SetOpacityCurve(ring.opacityCurve);
|
||||
ringOC.SetMeshRenderer(ringMR);
|
||||
}
|
||||
|
||||
return ringGO;
|
||||
|
||||
@ -95,7 +95,7 @@ namespace NewHorizons.Builder.Body
|
||||
}
|
||||
|
||||
public static GameObject MakeBlackHole(GameObject planetGO, Sector sector, Vector3 localPosition, float size,
|
||||
bool hasDestructionVolume, string targetSolarSystem, VariableSizeModule.TimeValuePair[] curve, bool makeAudio = true)
|
||||
bool hasDestructionVolume, string targetSolarSystem, TimeValuePair[] curve, bool makeAudio = true)
|
||||
{
|
||||
var blackHole = new GameObject("BlackHole");
|
||||
blackHole.SetActive(false);
|
||||
@ -181,7 +181,7 @@ namespace NewHorizons.Builder.Body
|
||||
}
|
||||
|
||||
public static GameObject MakeWhiteHole(GameObject planetGO, Sector sector, OWRigidbody OWRB, Vector3 localPosition, float size,
|
||||
VariableSizeModule.TimeValuePair[] curve, bool makeZeroGVolume = true)
|
||||
TimeValuePair[] curve, bool makeZeroGVolume = true)
|
||||
{
|
||||
var whiteHole = new GameObject("WhiteHole");
|
||||
whiteHole.SetActive(false);
|
||||
|
||||
@ -17,5 +17,7 @@ namespace NewHorizons.Components
|
||||
|
||||
fluidDetector.AddVolume(this);
|
||||
}
|
||||
|
||||
public override bool IsSpherical() => false;
|
||||
}
|
||||
}
|
||||
|
||||
51
NewHorizons/Components/RingOpacityController.cs
Normal file
51
NewHorizons/Components/RingOpacityController.cs
Normal file
@ -0,0 +1,51 @@
|
||||
using NewHorizons.External.Modules.VariableSize;
|
||||
using NewHorizons.Utility;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Components
|
||||
{
|
||||
public class RingOpacityController : MonoBehaviour
|
||||
{
|
||||
private static readonly int Alpha = Shader.PropertyToID("_Alpha");
|
||||
|
||||
public AnimationCurve opacityCurve { get; protected set; }
|
||||
public float CurrentOpacity { get; protected set; }
|
||||
|
||||
private MeshRenderer _meshRenderer;
|
||||
private RingFluidVolume _ringFluidVolume;
|
||||
|
||||
protected void FixedUpdate()
|
||||
{
|
||||
if (opacityCurve != null)
|
||||
{
|
||||
CurrentOpacity = opacityCurve.Evaluate(TimeLoop.GetMinutesElapsed());
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentOpacity = 1;
|
||||
}
|
||||
|
||||
if (_ringFluidVolume != null)
|
||||
{
|
||||
if (Mathf.Approximately(CurrentOpacity, 0) && _ringFluidVolume.IsVolumeActive()) _ringFluidVolume.SetVolumeActivation(false);
|
||||
else if (!_ringFluidVolume.IsVolumeActive()) _ringFluidVolume.SetVolumeActivation(true);
|
||||
}
|
||||
|
||||
if (_meshRenderer == null) return;
|
||||
|
||||
_meshRenderer.material.SetFloat(Alpha, CurrentOpacity);
|
||||
}
|
||||
|
||||
public void SetOpacityCurve(TimeValuePair[] curve)
|
||||
{
|
||||
opacityCurve = new AnimationCurve();
|
||||
foreach (var pair in curve)
|
||||
{
|
||||
opacityCurve.AddKey(new Keyframe(pair.time, pair.value));
|
||||
}
|
||||
}
|
||||
|
||||
public void SetMeshRenderer(MeshRenderer meshRenderer) => _meshRenderer = meshRenderer;
|
||||
public void SetRingFluidVolume(RingFluidVolume ringFluidVolume) => _ringFluidVolume = ringFluidVolume;
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
using NewHorizons.External.Modules.VariableSize;
|
||||
using NewHorizons.Utility;
|
||||
using UnityEngine;
|
||||
namespace NewHorizons.Components.SizeControllers
|
||||
{
|
||||
@ -22,7 +23,7 @@ namespace NewHorizons.Components.SizeControllers
|
||||
base.transform.localScale = Vector3.one * CurrentScale;
|
||||
}
|
||||
|
||||
public void SetScaleCurve(VariableSizeModule.TimeValuePair[] curve)
|
||||
public void SetScaleCurve(TimeValuePair[] curve)
|
||||
{
|
||||
scaleCurve = new AnimationCurve();
|
||||
foreach (var pair in curve)
|
||||
|
||||
6
NewHorizons/External/Configs/PlanetConfig.cs
vendored
6
NewHorizons/External/Configs/PlanetConfig.cs
vendored
@ -362,6 +362,12 @@ namespace NewHorizons.External.Configs
|
||||
if (!string.IsNullOrEmpty(Cloak.audioClip)) Cloak.audio = Cloak.audioClip;
|
||||
if (!string.IsNullOrEmpty(Cloak.audioFilePath)) Cloak.audio = Cloak.audioFilePath;
|
||||
}
|
||||
|
||||
// Rings are no longer variable size module
|
||||
if (Ring != null)
|
||||
{
|
||||
if (Ring.curve != null) Ring.scaleCurve = Ring.curve;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,10 +1,12 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using NewHorizons.Utility;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NewHorizons.External.Modules.VariableSize
|
||||
namespace NewHorizons.External.Modules
|
||||
{
|
||||
[JsonObject]
|
||||
public class RingModule : VariableSizeModule
|
||||
public class RingModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Fluid type for sounds/effects when colliding with this ring.
|
||||
@ -45,5 +47,20 @@ namespace NewHorizons.External.Modules.VariableSize
|
||||
/// Should this ring be unlit?
|
||||
/// </summary>
|
||||
public bool unlit;
|
||||
|
||||
#region Obsolete
|
||||
[Obsolete("curve is deprecated, please use scaleCurve instead")]
|
||||
public TimeValuePair[] curve;
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Scale rings over time. Optional. Value between 0-1, time is in minutes.
|
||||
/// </summary>
|
||||
public TimeValuePair[] scaleCurve;
|
||||
|
||||
/// <summary>
|
||||
/// Fade rings in/out over time. Optional. Value between 0-1, time is in minutes.
|
||||
/// </summary>
|
||||
public TimeValuePair[] opacityCurve;
|
||||
}
|
||||
}
|
||||
@ -1,3 +1,4 @@
|
||||
using NewHorizons.Utility;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
|
||||
@ -7,22 +8,8 @@ namespace NewHorizons.External.Modules.VariableSize
|
||||
public class VariableSizeModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Scale this module over time
|
||||
/// Scale this object over time
|
||||
/// </summary>
|
||||
public TimeValuePair[] curve;
|
||||
|
||||
[JsonObject]
|
||||
public class TimeValuePair
|
||||
{
|
||||
/// <summary>
|
||||
/// A specific point in time
|
||||
/// </summary>
|
||||
public float time;
|
||||
|
||||
/// <summary>
|
||||
/// The value for this point in time
|
||||
/// </summary>
|
||||
public float value;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,6 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using Logger = NewHorizons.Utility.Logger;
|
||||
using NewHorizons.External.Modules.VariableSize;
|
||||
|
||||
namespace NewHorizons.Handlers
|
||||
{
|
||||
|
||||
@ -662,7 +662,7 @@
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"description": "Scale this object over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
@ -766,7 +766,7 @@
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"description": "Scale this object over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
@ -1750,7 +1750,7 @@
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"description": "Scale this object over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
@ -2120,13 +2120,6 @@
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
},
|
||||
"fluidType": {
|
||||
"description": "Fluid type for sounds/effects when colliding with this ring.",
|
||||
"$ref": "#/definitions/FluidType"
|
||||
@ -2165,6 +2158,20 @@
|
||||
"unlit": {
|
||||
"type": "boolean",
|
||||
"description": "Should this ring be unlit?"
|
||||
},
|
||||
"scaleCurve": {
|
||||
"type": "array",
|
||||
"description": "Scale rings over time. Optional. Value between 0-1, time is in minutes.",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
},
|
||||
"opacityCurve": {
|
||||
"type": "array",
|
||||
"description": "Fade rings in/out over time. Optional. Value between 0-1, time is in minutes.",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -2174,7 +2181,7 @@
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"description": "Scale this object over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
@ -2319,7 +2326,7 @@
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"description": "Scale this object over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
@ -2405,7 +2412,7 @@
|
||||
"properties": {
|
||||
"curve": {
|
||||
"type": "array",
|
||||
"description": "Scale this module over time",
|
||||
"description": "Scale this object over time",
|
||||
"items": {
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
|
||||
18
NewHorizons/Utility/TimeValuePair.cs
Normal file
18
NewHorizons/Utility/TimeValuePair.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NewHorizons.Utility
|
||||
{
|
||||
[JsonObject]
|
||||
public class TimeValuePair
|
||||
{
|
||||
/// <summary>
|
||||
/// A specific point in time
|
||||
/// </summary>
|
||||
public float time;
|
||||
|
||||
/// <summary>
|
||||
/// The value for this point in time
|
||||
/// </summary>
|
||||
public float value;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user