mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Merge branch 'dev' into qsb-compat
This commit is contained in:
commit
5391a3c1ac
@ -2,12 +2,16 @@ using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using NewHorizons.Utility;
|
||||
using NewHorizons.External.Modules.VariableSize;
|
||||
using System.Linq;
|
||||
using UnityEngine.Assertions.Must;
|
||||
|
||||
namespace NewHorizons.Builder.Body
|
||||
{
|
||||
public static class LavaBuilder
|
||||
{
|
||||
private static readonly int HeightScale = Shader.PropertyToID("_HeightScale");
|
||||
private static readonly int EdgeFade = Shader.PropertyToID("_EdgeFade");
|
||||
private static readonly int TexHeight = Shader.PropertyToID("_TexHeight");
|
||||
private static readonly int EmissionColor = Shader.PropertyToID("_EmissionColor");
|
||||
|
||||
private static GameObject _lavaSphere;
|
||||
@ -31,15 +35,11 @@ namespace NewHorizons.Builder.Body
|
||||
{
|
||||
InitPrefabs();
|
||||
|
||||
var heightScale = module.size;
|
||||
var multiplier = module.size / 100f;
|
||||
if (module.curve != null)
|
||||
{
|
||||
var modifier = 1f;
|
||||
foreach (var pair in module.curve)
|
||||
{
|
||||
if (pair.value < modifier) modifier = pair.value;
|
||||
}
|
||||
heightScale = Mathf.Max(0.1f, heightScale * modifier);
|
||||
var modifier = module.curve.Max(pair => pair.value);
|
||||
multiplier *= modifier;
|
||||
}
|
||||
|
||||
var moltenCore = new GameObject("MoltenCore");
|
||||
@ -51,7 +51,9 @@ namespace NewHorizons.Builder.Body
|
||||
var lavaSphere = GameObject.Instantiate(_lavaSphere, moltenCore.transform);
|
||||
lavaSphere.transform.localScale = Vector3.one;
|
||||
lavaSphere.transform.name = "LavaSphere";
|
||||
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, heightScale);
|
||||
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, 150f * multiplier);
|
||||
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(EdgeFade, 15f * multiplier);
|
||||
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(TexHeight, 15f * multiplier);
|
||||
if (module.tint != null) lavaSphere.GetComponent<MeshRenderer>().material.SetColor(EmissionColor, module.tint.ToColor());
|
||||
lavaSphere.SetActive(true);
|
||||
|
||||
@ -65,7 +67,9 @@ namespace NewHorizons.Builder.Body
|
||||
var proxyLavaSphere = moltenCoreProxy.transform.Find("LavaSphere (1)");
|
||||
proxyLavaSphere.transform.localScale = Vector3.one;
|
||||
proxyLavaSphere.name = "LavaSphere_Proxy";
|
||||
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, heightScale);
|
||||
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, 150f * multiplier);
|
||||
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(EdgeFade, 15f * multiplier);
|
||||
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(TexHeight, 15f * multiplier);
|
||||
if (module.tint != null) proxyLavaSphere.GetComponent<MeshRenderer>().material.SetColor(EmissionColor, module.tint.ToColor());
|
||||
|
||||
var sectorProxy = moltenCoreProxy.GetComponent<SectorProxy>();
|
||||
|
||||
@ -187,16 +187,9 @@ namespace NewHorizons.Builder.Body
|
||||
{
|
||||
foreach (var singularity in body.Config.Props.singularities)
|
||||
{
|
||||
if (singularity.type == SingularityModule.SingularityType.BlackHole)
|
||||
{
|
||||
SingularityBuilder.MakeBlackHoleProxy(proxy, singularity.position, singularity.size, singularity.curve);
|
||||
}
|
||||
else
|
||||
{
|
||||
SingularityBuilder.MakeWhiteHoleProxy(proxy, singularity.position, singularity.size, singularity.curve);
|
||||
}
|
||||
|
||||
if (realSize < singularity.size) realSize = singularity.size;
|
||||
var polarity = singularity.type == SingularityModule.SingularityType.BlackHole;
|
||||
SingularityBuilder.MakeSingularityProxy(proxy, singularity.position, polarity, singularity.horizonRadius, singularity.distortRadius, singularity.curve, singularity.renderQueueOverride);
|
||||
if (realSize < singularity.distortRadius) realSize = singularity.distortRadius;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -37,6 +37,7 @@ namespace NewHorizons.Builder.Body
|
||||
|
||||
private static Mesh _whiteHoleMesh;
|
||||
private static GameObject _whiteHoleAmbientLight;
|
||||
private static GameObject _whiteHoleAmbience;
|
||||
private static GameObject _whiteHoleZeroGVolume;
|
||||
private static GameObject _whiteHoleRulesetVolume;
|
||||
private static GameObject _whiteHoleVolume;
|
||||
@ -62,6 +63,7 @@ namespace NewHorizons.Builder.Body
|
||||
|
||||
if (_whiteHoleMesh == null) _whiteHoleMesh = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/Singularity").GetComponent<MeshFilter>().mesh.DontDestroyOnLoad();
|
||||
if (_whiteHoleAmbientLight == null) _whiteHoleAmbientLight = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/AmbientLight_WH").InstantiateInactive().Rename("WhiteHoleAmbientLight").DontDestroyOnLoad();
|
||||
if (_whiteHoleAmbience == null) _whiteHoleAmbience = SearchUtilities.Find("WhiteHole_Body/Ambience_WhiteHole").InstantiateInactive().Rename("WhiteHoleAmbience").DontDestroyOnLoad();
|
||||
if (_whiteHoleZeroGVolume == null) _whiteHoleZeroGVolume = SearchUtilities.Find("WhiteHole_Body/ZeroGVolume").InstantiateInactive().Rename("WhiteHoleZeroGVolume").DontDestroyOnLoad();
|
||||
if (_whiteHoleRulesetVolume == null) _whiteHoleRulesetVolume = SearchUtilities.Find("WhiteHole_Body/Sector_WhiteHole/RulesetVolumes_WhiteHole").InstantiateInactive().Rename("WhiteHoleRulesetVolume").DontDestroyOnLoad();
|
||||
if (_whiteHoleVolume == null) _whiteHoleVolume = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVolume").InstantiateInactive().Rename("WhiteHoleVolume").DontDestroyOnLoad();
|
||||
@ -74,28 +76,21 @@ namespace NewHorizons.Builder.Body
|
||||
// If we've reloaded the first one will now be null so we have to refresh the list
|
||||
if (_singularitiesByID?.Values?.FirstOrDefault() == null) _singularitiesByID = new Dictionary<string, GameObject>();
|
||||
|
||||
var size = singularity.size;
|
||||
var horizonRadius = singularity.horizonRadius;
|
||||
var distortRadius = singularity.distortRadius != 0f ? singularity.distortRadius : horizonRadius * 2.5f;
|
||||
var pairedSingularity = singularity.pairedSingularity;
|
||||
|
||||
var polarity = singularity.type;
|
||||
bool polarity = singularity.type == SingularityModule.SingularityType.BlackHole;
|
||||
|
||||
bool isWormHole = singularity?.targetStarSystem != null;
|
||||
bool hasHazardVolume = !isWormHole && (pairedSingularity == null);
|
||||
|
||||
bool makeZeroGVolume = singularity == null ? true : singularity.makeZeroGVolume;
|
||||
|
||||
Vector3 localPosition = singularity?.position == null ? Vector3.zero : singularity.position;
|
||||
Vector3 localRotation = singularity?.rotation == null ? Vector3.zero : singularity.rotation;
|
||||
|
||||
GameObject newSingularity = null;
|
||||
switch (polarity)
|
||||
{
|
||||
case SingularityModule.SingularityType.BlackHole:
|
||||
newSingularity = MakeBlackHole(go, sector, localPosition, size, hasHazardVolume, singularity.targetStarSystem, singularity.curve);
|
||||
break;
|
||||
case SingularityModule.SingularityType.WhiteHole:
|
||||
newSingularity = MakeWhiteHole(go, sector, OWRB, localPosition, size, singularity.curve, makeZeroGVolume);
|
||||
break;
|
||||
}
|
||||
newSingularity = MakeSingularity(go, sector, localPosition, localRotation, polarity, horizonRadius, distortRadius,
|
||||
hasHazardVolume, singularity.targetStarSystem, singularity.curve, singularity.hasWarpEffects, singularity.renderQueueOverride);
|
||||
|
||||
var uniqueID = string.IsNullOrEmpty(singularity.uniqueID) ? config.name : singularity.uniqueID;
|
||||
_singularitiesByID.Add(uniqueID, newSingularity);
|
||||
@ -107,10 +102,10 @@ namespace NewHorizons.Builder.Body
|
||||
{
|
||||
switch (polarity)
|
||||
{
|
||||
case SingularityModule.SingularityType.BlackHole:
|
||||
case true:
|
||||
PairSingularities(uniqueID, pairedSingularity, newSingularity, pairedSingularityGO);
|
||||
break;
|
||||
case SingularityModule.SingularityType.WhiteHole:
|
||||
case false:
|
||||
PairSingularities(pairedSingularity, uniqueID, pairedSingularityGO, newSingularity);
|
||||
break;
|
||||
}
|
||||
@ -138,275 +133,179 @@ namespace NewHorizons.Builder.Body
|
||||
blackHoleVolume._whiteHole = whiteHoleVolume;
|
||||
}
|
||||
|
||||
public static GameObject MakeBlackHole(GameObject planetGO, Sector sector, Vector3 localPosition, float size,
|
||||
bool hasDestructionVolume, string targetSolarSystem = null, TimeValuePair[] curve = null, bool makeAudio = true)
|
||||
public static GameObject MakeSingularity(GameObject planetGO, Sector sector, Vector3 position, Vector3 rotation, bool polarity, float horizon, float distort,
|
||||
bool hasDestructionVolume, string targetStarSystem = null, TimeValuePair[] curve = null, bool warpEffects = true, int renderQueue = 2985)
|
||||
{
|
||||
InitPrefabs();
|
||||
|
||||
var blackHole = new GameObject("BlackHole");
|
||||
blackHole.SetActive(false);
|
||||
blackHole.transform.parent = sector?.transform ?? planetGO.transform;
|
||||
blackHole.transform.position = planetGO.transform.TransformPoint(localPosition);
|
||||
// polarity true = black, false = white
|
||||
|
||||
var blackHoleRender = MakeBlackHoleGraphics(blackHole, size);
|
||||
var singularity = new GameObject(polarity ? "BlackHole" : "WhiteHole");
|
||||
singularity.transform.parent = sector?.transform ?? planetGO.transform;
|
||||
singularity.transform.position = planetGO.transform.TransformPoint(position);
|
||||
|
||||
BlackHoleSizeController sizeController = null;
|
||||
var singularityRenderer = MakeSingularityGraphics(singularity, polarity, horizon, distort, renderQueue);
|
||||
|
||||
SingularitySizeController sizeController = null;
|
||||
if (curve != null)
|
||||
{
|
||||
sizeController = blackHoleRender.gameObject.AddComponent<BlackHoleSizeController>();
|
||||
sizeController = singularityRenderer.gameObject.AddComponent<SingularitySizeController>();
|
||||
sizeController.SetScaleCurve(curve);
|
||||
sizeController.size = size;
|
||||
sizeController.material = blackHoleRender.material;
|
||||
sizeController.size = distort;
|
||||
sizeController.innerScale = horizon;
|
||||
sizeController.material = singularityRenderer.material;
|
||||
}
|
||||
|
||||
OWAudioSource oneShotOWAudioSource = null;
|
||||
if (makeAudio)
|
||||
|
||||
var singularityAmbience = GameObject.Instantiate(_blackHoleAmbience, singularity.transform);
|
||||
singularityAmbience.name = polarity ? "BlackHoleAmbience" : "WhiteHoleAmbience";
|
||||
singularityAmbience.SetActive(true);
|
||||
singularityAmbience.GetComponent<SectorAudioGroup>().SetSector(sector);
|
||||
|
||||
var singularityAudioSource = singularityAmbience.GetComponent<AudioSource>();
|
||||
singularityAudioSource.maxDistance = distort * 2.5f;
|
||||
singularityAudioSource.minDistance = horizon;
|
||||
singularityAmbience.transform.localPosition = Vector3.zero;
|
||||
if (sizeController != null) sizeController.audioSource = singularityAudioSource;
|
||||
|
||||
if (polarity)
|
||||
{
|
||||
var blackHoleAmbience = GameObject.Instantiate(_blackHoleAmbience, blackHole.transform);
|
||||
blackHoleAmbience.name = "BlackHoleAmbience";
|
||||
blackHoleAmbience.SetActive(true);
|
||||
blackHoleAmbience.GetComponent<SectorAudioGroup>().SetSector(sector);
|
||||
|
||||
var blackHoleAudioSource = blackHoleAmbience.GetComponent<AudioSource>();
|
||||
blackHoleAudioSource.maxDistance = size * 2.5f;
|
||||
blackHoleAudioSource.minDistance = size * 0.4f;
|
||||
blackHoleAmbience.transform.localPosition = Vector3.zero;
|
||||
if (sizeController != null) sizeController.audioSource = blackHoleAudioSource;
|
||||
|
||||
var blackHoleOneShot = GameObject.Instantiate(_blackHoleEmissionOneShot, blackHole.transform);
|
||||
blackHoleOneShot.name = "BlackHoleEmissionOneShot";
|
||||
blackHoleOneShot.SetActive(true);
|
||||
oneShotOWAudioSource = blackHoleOneShot.GetComponent<OWAudioSource>();
|
||||
var oneShotAudioSource = blackHoleOneShot.GetComponent<AudioSource>();
|
||||
oneShotAudioSource.maxDistance = size * 3f;
|
||||
oneShotAudioSource.minDistance = size * 0.4f;
|
||||
if (sizeController != null) sizeController.oneShotAudioSource = oneShotAudioSource;
|
||||
}
|
||||
|
||||
if (hasDestructionVolume || targetSolarSystem != null)
|
||||
{
|
||||
var destructionVolumeGO = new GameObject("DestructionVolume");
|
||||
destructionVolumeGO.layer = LayerMask.NameToLayer("BasicEffectVolume");
|
||||
destructionVolumeGO.transform.parent = blackHole.transform;
|
||||
destructionVolumeGO.transform.localScale = Vector3.one;
|
||||
destructionVolumeGO.transform.localPosition = Vector3.zero;
|
||||
|
||||
var sphereCollider = destructionVolumeGO.AddComponent<SphereCollider>();
|
||||
sphereCollider.radius = size * 0.4f;
|
||||
sphereCollider.isTrigger = true;
|
||||
if (sizeController != null) sizeController.sphereCollider = sphereCollider;
|
||||
|
||||
if (hasDestructionVolume) destructionVolumeGO.AddComponent<BlackHoleDestructionVolume>();
|
||||
else if (targetSolarSystem != null)
|
||||
if (hasDestructionVolume || targetStarSystem != null)
|
||||
{
|
||||
var wormholeVolume = destructionVolumeGO.AddComponent<ChangeStarSystemVolume>();
|
||||
wormholeVolume.TargetSolarSystem = targetSolarSystem;
|
||||
var destructionVolumeGO = new GameObject("DestructionVolume");
|
||||
destructionVolumeGO.layer = LayerMask.NameToLayer("BasicEffectVolume");
|
||||
destructionVolumeGO.transform.parent = singularity.transform;
|
||||
destructionVolumeGO.transform.localScale = Vector3.one;
|
||||
destructionVolumeGO.transform.localPosition = Vector3.zero;
|
||||
|
||||
var sphereCollider = destructionVolumeGO.AddComponent<SphereCollider>();
|
||||
sphereCollider.radius = horizon;
|
||||
sphereCollider.isTrigger = true;
|
||||
if (sizeController != null) sizeController.sphereCollider = sphereCollider;
|
||||
|
||||
if (hasDestructionVolume) destructionVolumeGO.AddComponent<BlackHoleDestructionVolume>();
|
||||
else if (targetStarSystem != null)
|
||||
{
|
||||
var wormholeVolume = destructionVolumeGO.AddComponent<ChangeStarSystemVolume>();
|
||||
wormholeVolume.TargetSolarSystem = targetStarSystem;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var blackHoleOneShot = GameObject.Instantiate(_blackHoleEmissionOneShot, singularity.transform);
|
||||
blackHoleOneShot.name = "BlackHoleEmissionOneShot";
|
||||
blackHoleOneShot.SetActive(true);
|
||||
oneShotOWAudioSource = blackHoleOneShot.GetComponent<OWAudioSource>();
|
||||
var oneShotAudioSource = blackHoleOneShot.GetComponent<AudioSource>();
|
||||
oneShotAudioSource.maxDistance = distort * 3f;
|
||||
oneShotAudioSource.minDistance = horizon;
|
||||
if (sizeController != null) sizeController.oneShotAudioSource = oneShotAudioSource;
|
||||
|
||||
var blackHoleVolume = GameObject.Instantiate(_blackHoleVolume, singularity.transform);
|
||||
blackHoleVolume.name = "BlackHoleVolume";
|
||||
blackHoleVolume.SetActive(true);
|
||||
var bhVolume = blackHoleVolume.GetComponent<BlackHoleVolume>();
|
||||
bhVolume._audioSector = sector;
|
||||
bhVolume._emissionSource = oneShotOWAudioSource;
|
||||
var blackHoleSphereCollider = blackHoleVolume.GetComponent<SphereCollider>();
|
||||
blackHoleSphereCollider.radius = horizon;
|
||||
if (sizeController != null) sizeController.sphereCollider = blackHoleSphereCollider;
|
||||
if (!warpEffects)
|
||||
{
|
||||
Delay.FireOnNextUpdate(() =>
|
||||
{
|
||||
foreach (var renderer in blackHoleVolume.GetComponentsInChildren<ParticleSystemRenderer>(true))
|
||||
{
|
||||
UnityEngine.Object.Destroy(renderer);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var blackHoleVolume = GameObject.Instantiate(_blackHoleVolume, blackHole.transform);
|
||||
blackHoleVolume.name = "BlackHoleVolume";
|
||||
blackHoleVolume.SetActive(true);
|
||||
var bhVolume = blackHoleVolume.GetComponent<BlackHoleVolume>();
|
||||
bhVolume._audioSector = sector;
|
||||
bhVolume._emissionSource = oneShotOWAudioSource;
|
||||
var blackHoleSphereCollider = blackHoleVolume.GetComponent<SphereCollider>();
|
||||
blackHoleSphereCollider.radius = size * 0.4f;
|
||||
if (sizeController != null) sizeController.sphereCollider = blackHoleSphereCollider;
|
||||
GameObject whiteHoleVolumeGO = GameObject.Instantiate(_whiteHoleVolume);
|
||||
whiteHoleVolumeGO.transform.parent = singularity.transform;
|
||||
whiteHoleVolumeGO.transform.localPosition = Vector3.zero;
|
||||
whiteHoleVolumeGO.transform.localScale = Vector3.one;
|
||||
whiteHoleVolumeGO.GetComponent<SphereCollider>().radius = horizon;
|
||||
whiteHoleVolumeGO.name = "WhiteHoleVolume";
|
||||
whiteHoleVolumeGO.SetActive(true);
|
||||
if (sizeController != null) sizeController.sphereCollider = whiteHoleVolumeGO.GetComponent<SphereCollider>();
|
||||
|
||||
var OWRB = planetGO.GetComponent<OWRigidbody>();
|
||||
|
||||
var whiteHoleFluidVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleFluidVolume>();
|
||||
whiteHoleFluidVolume._innerRadius = horizon;
|
||||
whiteHoleFluidVolume._outerRadius = distort;
|
||||
whiteHoleFluidVolume._attachedBody = OWRB;
|
||||
if (sizeController != null) sizeController.fluidVolume = whiteHoleFluidVolume;
|
||||
|
||||
var whiteHoleVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleVolume>();
|
||||
whiteHoleVolume._debrisDistMax = distort * 6.5f;
|
||||
whiteHoleVolume._debrisDistMin = distort * 2f;
|
||||
whiteHoleVolume._whiteHoleSector = sector;
|
||||
whiteHoleVolume._fluidVolume = whiteHoleFluidVolume;
|
||||
whiteHoleVolume._whiteHoleBody = OWRB;
|
||||
whiteHoleVolume._whiteHoleProxyShadowSuperGroup = planetGO.GetComponent<ProxyShadowCasterSuperGroup>();
|
||||
whiteHoleVolume._radius = horizon;
|
||||
whiteHoleVolume._airlocksToOpen = new NomaiAirlock[0];
|
||||
if (sizeController != null) sizeController.volume = whiteHoleVolume;
|
||||
|
||||
whiteHoleVolume.enabled = true;
|
||||
whiteHoleFluidVolume.enabled = true;
|
||||
}
|
||||
|
||||
blackHole.SetActive(true);
|
||||
return blackHole;
|
||||
}
|
||||
singularity.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(rotation));
|
||||
|
||||
public static MeshRenderer MakeBlackHoleGraphics(GameObject blackHole, float size)
|
||||
singularity.SetActive(true);
|
||||
return singularity;
|
||||
}
|
||||
|
||||
public static MeshRenderer MakeSingularityGraphics(GameObject singularity, bool polarity, float horizon, float distort, int queue = 2985)
|
||||
{
|
||||
InitPrefabs();
|
||||
|
||||
var blackHoleRender = new GameObject("BlackHoleRender");
|
||||
blackHoleRender.transform.parent = blackHole.transform;
|
||||
blackHoleRender.transform.localPosition = Vector3.zero;
|
||||
blackHoleRender.transform.localScale = Vector3.one * size;
|
||||
var singularityRenderer = new GameObject(polarity ? "BlackHoleRenderer" : "WhiteHoleRenderer");
|
||||
singularityRenderer.transform.parent = singularity.transform;
|
||||
singularityRenderer.transform.localPosition = Vector3.zero;
|
||||
singularityRenderer.transform.localScale = Vector3.one * distort;
|
||||
|
||||
var meshFilter = blackHoleRender.AddComponent<MeshFilter>();
|
||||
meshFilter.mesh = _blackHoleMesh;
|
||||
var meshFilter = singularityRenderer.AddComponent<MeshFilter>();
|
||||
meshFilter.mesh = polarity ? _blackHoleMesh : _whiteHoleMesh;
|
||||
|
||||
var meshRenderer = blackHoleRender.AddComponent<MeshRenderer>();
|
||||
meshRenderer.material = new Material(blackHoleShader);
|
||||
meshRenderer.material.SetFloat(Radius, size * 0.4f);
|
||||
meshRenderer.material.SetFloat(MaxDistortRadius, size * 0.95f);
|
||||
meshRenderer.material.SetFloat(MassScale, 1);
|
||||
meshRenderer.material.SetFloat(DistortFadeDist, size * 0.55f);
|
||||
var meshRenderer = singularityRenderer.AddComponent<MeshRenderer>();
|
||||
meshRenderer.material = new Material(polarity ? blackHoleShader : whiteHoleShader);
|
||||
meshRenderer.material.SetFloat(Radius, horizon);
|
||||
meshRenderer.material.SetFloat(MaxDistortRadius, distort);
|
||||
meshRenderer.material.SetFloat(MassScale, polarity ? 1f : -1f);
|
||||
meshRenderer.material.SetFloat(DistortFadeDist, distort - horizon);
|
||||
if (!polarity) meshRenderer.material.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f));
|
||||
meshRenderer.material.renderQueue = queue;
|
||||
|
||||
return meshRenderer;
|
||||
}
|
||||
|
||||
public static GameObject MakeWhiteHole(GameObject planetGO, Sector sector, OWRigidbody OWRB, Vector3 localPosition, float size,
|
||||
TimeValuePair[] curve, bool makeZeroGVolume = true)
|
||||
public static GameObject MakeSingularityProxy(GameObject rootObject, MVector3 position, bool polarity, float horizon, float distort, TimeValuePair[] curve = null, int queue = 2985)
|
||||
{
|
||||
InitPrefabs();
|
||||
|
||||
var whiteHole = new GameObject("WhiteHole");
|
||||
whiteHole.SetActive(false);
|
||||
whiteHole.transform.parent = sector?.transform ?? planetGO.transform;
|
||||
whiteHole.transform.position = planetGO.transform.TransformPoint(localPosition);
|
||||
var singularityRenderer = MakeSingularityGraphics(rootObject, polarity, horizon, distort, queue);
|
||||
if (position != null) singularityRenderer.transform.localPosition = position;
|
||||
|
||||
var whiteHoleRenderer = new GameObject("WhiteHoleRenderer");
|
||||
whiteHoleRenderer.transform.parent = whiteHole.transform;
|
||||
whiteHoleRenderer.transform.localPosition = Vector3.zero;
|
||||
whiteHoleRenderer.transform.localScale = Vector3.one * size * 2.8f;
|
||||
|
||||
WhiteHoleSizeController sizeController = null;
|
||||
SingularitySizeController sizeController = null;
|
||||
if (curve != null)
|
||||
{
|
||||
sizeController = whiteHoleRenderer.AddComponent<WhiteHoleSizeController>();
|
||||
sizeController = singularityRenderer.gameObject.AddComponent<SingularitySizeController>();
|
||||
sizeController.SetScaleCurve(curve);
|
||||
sizeController.size = size * 2.8f; // Gets goofy because of this
|
||||
sizeController.size = distort;
|
||||
sizeController.innerScale = horizon;
|
||||
sizeController.material = singularityRenderer.material;
|
||||
}
|
||||
|
||||
var meshFilter = whiteHoleRenderer.AddComponent<MeshFilter>();
|
||||
meshFilter.mesh = _whiteHoleMesh;
|
||||
|
||||
var meshRenderer = whiteHoleRenderer.AddComponent<MeshRenderer>();
|
||||
meshRenderer.material = new Material(whiteHoleShader);
|
||||
meshRenderer.sharedMaterial.SetFloat(Radius, size * 0.4f);
|
||||
meshRenderer.sharedMaterial.SetFloat(DistortFadeDist, size);
|
||||
meshRenderer.sharedMaterial.SetFloat(MaxDistortRadius, size * 2.8f);
|
||||
meshRenderer.sharedMaterial.SetFloat(MassScale, -1);
|
||||
meshRenderer.sharedMaterial.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f));
|
||||
if (sizeController != null) sizeController.material = meshRenderer.sharedMaterial;
|
||||
|
||||
var ambientLight = GameObject.Instantiate(_whiteHoleAmbientLight);
|
||||
ambientLight.transform.parent = whiteHole.transform;
|
||||
ambientLight.transform.localScale = Vector3.one;
|
||||
ambientLight.transform.localPosition = Vector3.zero;
|
||||
ambientLight.name = "AmbientLight";
|
||||
ambientLight.SetActive(true);
|
||||
var light = ambientLight.GetComponent<Light>();
|
||||
light.range = size * 7f;
|
||||
if (sizeController != null) sizeController.light = light;
|
||||
|
||||
GameObject whiteHoleVolumeGO = GameObject.Instantiate(_whiteHoleVolume);
|
||||
whiteHoleVolumeGO.transform.parent = whiteHole.transform;
|
||||
whiteHoleVolumeGO.transform.localPosition = Vector3.zero;
|
||||
whiteHoleVolumeGO.transform.localScale = Vector3.one;
|
||||
whiteHoleVolumeGO.GetComponent<SphereCollider>().radius = size;
|
||||
whiteHoleVolumeGO.name = "WhiteHoleVolume";
|
||||
whiteHoleVolumeGO.SetActive(true);
|
||||
if (sizeController != null) sizeController.sphereCollider = whiteHoleVolumeGO.GetComponent<SphereCollider>();
|
||||
|
||||
var whiteHoleFluidVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleFluidVolume>();
|
||||
whiteHoleFluidVolume._innerRadius = size * 0.5f;
|
||||
whiteHoleFluidVolume._outerRadius = size;
|
||||
whiteHoleFluidVolume._attachedBody = OWRB;
|
||||
if (sizeController != null) sizeController.fluidVolume = whiteHoleFluidVolume;
|
||||
|
||||
var whiteHoleVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleVolume>();
|
||||
whiteHoleVolume._debrisDistMax = size * 6.5f;
|
||||
whiteHoleVolume._debrisDistMin = size * 2f;
|
||||
whiteHoleVolume._whiteHoleSector = sector;
|
||||
whiteHoleVolume._fluidVolume = whiteHoleFluidVolume;
|
||||
whiteHoleVolume._whiteHoleBody = OWRB;
|
||||
whiteHoleVolume._whiteHoleProxyShadowSuperGroup = planetGO.GetComponent<ProxyShadowCasterSuperGroup>();
|
||||
whiteHoleVolume._radius = size * 0.5f;
|
||||
whiteHoleVolume._airlocksToOpen = new NomaiAirlock[0];
|
||||
if (sizeController != null) sizeController.volume = whiteHoleVolume;
|
||||
|
||||
whiteHoleVolume.enabled = true;
|
||||
whiteHoleFluidVolume.enabled = true;
|
||||
|
||||
if (makeZeroGVolume)
|
||||
{
|
||||
var zeroGVolume = GameObject.Instantiate(_whiteHoleZeroGVolume, whiteHole.transform);
|
||||
zeroGVolume.name = "ZeroGVolume";
|
||||
zeroGVolume.transform.localPosition = Vector3.zero;
|
||||
zeroGVolume.SetActive(true);
|
||||
zeroGVolume.GetComponent<SphereCollider>().radius = size * 10f;
|
||||
zeroGVolume.GetComponent<ZeroGVolume>()._attachedBody = OWRB;
|
||||
|
||||
var rulesetVolume = GameObject.Instantiate(_whiteHoleRulesetVolume, planetGO.transform);
|
||||
rulesetVolume.name = "RulesetVolume";
|
||||
rulesetVolume.transform.localPosition = Vector3.zero;
|
||||
rulesetVolume.transform.localScale = Vector3.one * size / 100f;
|
||||
rulesetVolume.SetActive(true);
|
||||
rulesetVolume.GetComponent<SphereShape>().enabled = true;
|
||||
|
||||
if (sizeController != null)
|
||||
{
|
||||
sizeController.zeroGSphereCollider = zeroGVolume.GetComponent<SphereCollider>();
|
||||
sizeController.rulesetVolume = rulesetVolume;
|
||||
}
|
||||
}
|
||||
|
||||
whiteHole.SetActive(true);
|
||||
return whiteHole;
|
||||
}
|
||||
|
||||
public static GameObject MakeBlackHoleProxy(GameObject rootObject, MVector3 position, float size, TimeValuePair[] curve = null)
|
||||
{
|
||||
InitPrefabs();
|
||||
|
||||
var blackHoleShader = _blackHoleProxyPrefab.GetComponent<MeshRenderer>().material.shader;
|
||||
if (blackHoleShader == null) blackHoleShader = _blackHoleProxyPrefab.GetComponent<MeshRenderer>().sharedMaterial.shader;
|
||||
|
||||
var blackHoleRender = new GameObject("BlackHoleRender");
|
||||
blackHoleRender.transform.parent = rootObject.transform;
|
||||
if (position != null) blackHoleRender.transform.localPosition = position;
|
||||
else blackHoleRender.transform.localPosition = Vector3.zero;
|
||||
blackHoleRender.transform.localScale = Vector3.one * size;
|
||||
|
||||
var meshFilter = blackHoleRender.AddComponent<MeshFilter>();
|
||||
meshFilter.mesh = _blackHoleProxyPrefab.GetComponent<MeshFilter>().mesh;
|
||||
|
||||
var meshRenderer = blackHoleRender.AddComponent<MeshRenderer>();
|
||||
meshRenderer.material = new Material(blackHoleShader);
|
||||
meshRenderer.material.SetFloat(Radius, size * 0.4f);
|
||||
meshRenderer.material.SetFloat(MaxDistortRadius, size * 0.95f);
|
||||
meshRenderer.material.SetFloat(MassScale, 1);
|
||||
meshRenderer.material.SetFloat(DistortFadeDist, size * 0.55f);
|
||||
|
||||
if (curve != null) AddSizeController(blackHoleRender, curve, size);
|
||||
|
||||
blackHoleRender.SetActive(true);
|
||||
return blackHoleRender;
|
||||
}
|
||||
|
||||
public static GameObject MakeWhiteHoleProxy(GameObject rootObject, MVector3 position, float size, TimeValuePair[] curve = null)
|
||||
{
|
||||
InitPrefabs();
|
||||
|
||||
var whiteHoleShader = _whiteHoleProxyPrefab.GetComponent<MeshRenderer>().material.shader;
|
||||
if (whiteHoleShader == null) whiteHoleShader = _whiteHoleProxyPrefab.GetComponent<MeshRenderer>().sharedMaterial.shader;
|
||||
|
||||
var whiteHoleRenderer = new GameObject("WhiteHoleRenderer");
|
||||
whiteHoleRenderer.transform.parent = rootObject.transform;
|
||||
if (position != null) whiteHoleRenderer.transform.localPosition = position;
|
||||
else whiteHoleRenderer.transform.localPosition = Vector3.zero;
|
||||
whiteHoleRenderer.transform.localScale = Vector3.one * size * 2.8f;
|
||||
|
||||
var meshFilter = whiteHoleRenderer.AddComponent<MeshFilter>();
|
||||
meshFilter.mesh = _whiteHoleProxyPrefab.GetComponent<MeshFilter>().mesh;
|
||||
|
||||
var meshRenderer = whiteHoleRenderer.AddComponent<MeshRenderer>();
|
||||
meshRenderer.material = new Material(whiteHoleShader);
|
||||
meshRenderer.sharedMaterial.SetFloat(Radius, size * 0.4f);
|
||||
meshRenderer.sharedMaterial.SetFloat(DistortFadeDist, size);
|
||||
meshRenderer.sharedMaterial.SetFloat(MaxDistortRadius, size * 2.8f);
|
||||
meshRenderer.sharedMaterial.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f));
|
||||
|
||||
if (curve != null) AddSizeController(whiteHoleRenderer, curve, size);
|
||||
|
||||
whiteHoleRenderer.SetActive(true);
|
||||
return whiteHoleRenderer;
|
||||
}
|
||||
|
||||
private static SizeController AddSizeController(GameObject go, TimeValuePair[] curve, float size)
|
||||
{
|
||||
var sizeController = go.AddComponent<SizeController>();
|
||||
sizeController.SetScaleCurve(curve);
|
||||
sizeController.size = size;
|
||||
return sizeController;
|
||||
singularityRenderer.gameObject.SetActive(true);
|
||||
return singularityRenderer.gameObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,7 +118,7 @@ namespace NewHorizons.Builder.Body
|
||||
flares.gameObject.transform.localScale = new Vector3(0.85f, 0.85f, 0.85f);
|
||||
|
||||
// Add singularity
|
||||
var singularityRenderer = SingularityBuilder.MakeBlackHoleGraphics(planetGO, neutronStarSize * 2.5f);
|
||||
var singularityRenderer = SingularityBuilder.MakeSingularityGraphics(planetGO, true, neutronStarSize, neutronStarSize * 2.5f);
|
||||
singularityRenderer.GetComponent<MeshRenderer>().material.color = new Color(0.5f, 2f, 2f, 1f);
|
||||
|
||||
return neutronStar;
|
||||
@ -128,8 +128,8 @@ namespace NewHorizons.Builder.Body
|
||||
{
|
||||
var blackHoleSize = progenitor.size / 100;
|
||||
|
||||
if (proxy != null) return SingularityBuilder.MakeBlackHoleProxy(proxy, Vector3.zero, blackHoleSize);
|
||||
else return SingularityBuilder.MakeBlackHole(planetGO, sector, Vector3.zero, blackHoleSize, true, string.Empty);
|
||||
if (proxy != null) return SingularityBuilder.MakeSingularityProxy(proxy, Vector3.zero, true, blackHoleSize, blackHoleSize * 2.5f);
|
||||
else return SingularityBuilder.MakeSingularity(planetGO, sector, Vector3.zero, Vector3.zero, true, blackHoleSize, blackHoleSize * 2.5f, true, string.Empty);
|
||||
}
|
||||
|
||||
public static GameObject MakeProxyRemnant(GameObject planet, GameObject proxy, IModBehaviour mod, StarModule progenitor)
|
||||
|
||||
@ -134,7 +134,7 @@ namespace NewHorizons.Builder.Body
|
||||
noMeshChange = true;
|
||||
foreach (var singularity in config.Props.singularities)
|
||||
{
|
||||
if (singularity.size > biggestSize) biggestSize = singularity.size;
|
||||
if (singularity.distortRadius > biggestSize) biggestSize = singularity.distortRadius;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -8,36 +8,52 @@ using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Components.SizeControllers
|
||||
{
|
||||
public class BlackHoleSizeController : SizeController
|
||||
public class SingularitySizeController : SizeController
|
||||
{
|
||||
public Material material;
|
||||
public float innerScale;
|
||||
public AudioSource audioSource;
|
||||
public AudioSource oneShotAudioSource;
|
||||
public SphereCollider sphereCollider;
|
||||
public WhiteHoleFluidVolume fluidVolume;
|
||||
public WhiteHoleVolume volume;
|
||||
|
||||
protected new void FixedUpdate()
|
||||
{
|
||||
base.FixedUpdate();
|
||||
|
||||
material.SetFloat(SingularityBuilder.Radius, CurrentScale * 0.4f);
|
||||
material.SetFloat(SingularityBuilder.MaxDistortRadius, CurrentScale * 0.95f);
|
||||
material.SetFloat(SingularityBuilder.DistortFadeDist, CurrentScale * 0.55f);
|
||||
material.SetFloat(SingularityBuilder.Radius, CurrentScale * innerScale);
|
||||
material.SetFloat(SingularityBuilder.MaxDistortRadius, CurrentScale);
|
||||
material.SetFloat(SingularityBuilder.DistortFadeDist, CurrentScale - CurrentScale * innerScale);
|
||||
|
||||
if (audioSource != null)
|
||||
{
|
||||
audioSource.maxDistance = CurrentScale * 2.5f;
|
||||
audioSource.minDistance = CurrentScale * 0.4f;
|
||||
audioSource.minDistance = CurrentScale * innerScale;
|
||||
}
|
||||
|
||||
if(oneShotAudioSource != null)
|
||||
{
|
||||
oneShotAudioSource.maxDistance = CurrentScale * 3f;
|
||||
oneShotAudioSource.minDistance = CurrentScale * 0.4f;
|
||||
oneShotAudioSource.minDistance = CurrentScale * innerScale;
|
||||
}
|
||||
|
||||
if (sphereCollider != null)
|
||||
{
|
||||
sphereCollider.radius = CurrentScale * 0.4f;
|
||||
sphereCollider.radius = CurrentScale * innerScale;
|
||||
}
|
||||
|
||||
if (fluidVolume != null)
|
||||
{
|
||||
fluidVolume._innerRadius = CurrentScale * innerScale;
|
||||
fluidVolume._outerRadius = CurrentScale;
|
||||
}
|
||||
|
||||
if (volume != null)
|
||||
{
|
||||
volume._debrisDistMax = CurrentScale * 6.5f;
|
||||
volume._debrisDistMin = CurrentScale * 2f;
|
||||
volume._radius = CurrentScale * innerScale;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,55 +0,0 @@
|
||||
using NewHorizons.Builder.Body;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Components.SizeControllers
|
||||
{
|
||||
public class WhiteHoleSizeController : SizeController
|
||||
{
|
||||
public Material material;
|
||||
public Light light;
|
||||
public SphereCollider sphereCollider, zeroGSphereCollider;
|
||||
public WhiteHoleFluidVolume fluidVolume;
|
||||
public WhiteHoleVolume volume;
|
||||
public GameObject rulesetVolume;
|
||||
|
||||
public new void FixedUpdate()
|
||||
{
|
||||
base.FixedUpdate();
|
||||
|
||||
// The "size" parameter set in the config got multiplied by 2.8 so we gotta divide by that
|
||||
var trueSize = CurrentScale / 2.8f;
|
||||
|
||||
material.SetFloat(SingularityBuilder.Radius, trueSize * 0.4f);
|
||||
material.SetFloat(SingularityBuilder.DistortFadeDist, trueSize);
|
||||
material.SetFloat(SingularityBuilder.MaxDistortRadius, trueSize * 2.8f);
|
||||
|
||||
if (light != null)
|
||||
{
|
||||
light.range = trueSize * 7f;
|
||||
}
|
||||
|
||||
if (sphereCollider != null) sphereCollider.radius = trueSize;
|
||||
|
||||
if (fluidVolume != null)
|
||||
{
|
||||
fluidVolume._innerRadius = trueSize * 0.5f;
|
||||
fluidVolume._outerRadius = trueSize;
|
||||
}
|
||||
|
||||
if (volume != null)
|
||||
{
|
||||
volume._debrisDistMax = trueSize * 6.5f;
|
||||
volume._debrisDistMin = trueSize * 2f;
|
||||
volume._radius = trueSize * 0.5f;
|
||||
}
|
||||
|
||||
if (zeroGSphereCollider != null) zeroGSphereCollider.radius = trueSize * 10f;
|
||||
if (rulesetVolume != null) rulesetVolume.transform.localScale = Vector3.one * trueSize / 100f;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
NewHorizons/External/Configs/PlanetConfig.cs
vendored
21
NewHorizons/External/Configs/PlanetConfig.cs
vendored
@ -369,6 +369,27 @@ namespace NewHorizons.External.Configs
|
||||
Props.singularities = Props.singularities.Append(Singularity).ToArray();
|
||||
}
|
||||
|
||||
// Old singularity size
|
||||
if (Props?.singularities != null)
|
||||
{
|
||||
foreach (var singularity in Props.singularities)
|
||||
{
|
||||
if (singularity.size != 0f)
|
||||
{
|
||||
singularity.horizonRadius = singularity.size * 0.4f;
|
||||
switch (singularity.type)
|
||||
{
|
||||
case SingularityModule.SingularityType.BlackHole:
|
||||
singularity.distortRadius = singularity.size * 0.95f;
|
||||
break;
|
||||
case SingularityModule.SingularityType.WhiteHole:
|
||||
singularity.distortRadius = singularity.size * 2.8f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Signals are now in props
|
||||
if (Signal?.signals != null)
|
||||
{
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Runtime.Serialization;
|
||||
@ -18,11 +19,6 @@ namespace NewHorizons.External.Modules.VariableSize
|
||||
[EnumMember(Value = @"whiteHole")] WhiteHole = 1
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Only for White Holes. Should this white hole repel the player from it.
|
||||
/// </summary>
|
||||
[DefaultValue(true)] public bool makeZeroGVolume = true;
|
||||
|
||||
/// <summary>
|
||||
/// The uniqueID of the white hole or black hole that is paired to this one. If you don't set a value, entering will kill
|
||||
/// the player
|
||||
@ -39,11 +35,26 @@ namespace NewHorizons.External.Modules.VariableSize
|
||||
/// </summary>
|
||||
public MVector3 position;
|
||||
|
||||
/// <summary>
|
||||
/// Rotation of the singularity. Determines the direction you come out of a white hole
|
||||
/// </summary>
|
||||
public MVector3 rotation;
|
||||
|
||||
/// <summary>
|
||||
/// Radius of the singularity. Note that this isn't the same as the event horizon, but includes the entire volume that
|
||||
/// has warped effects in it.
|
||||
/// </summary>
|
||||
[Range(0f, double.MaxValue)] public float size;
|
||||
[Obsolete("size is deprecated, please use horizonRadius and distortRadius instead")] [Range(0f, double.MaxValue)] public float size;
|
||||
|
||||
/// <summary>
|
||||
/// Radius of the event horizon (solid part)
|
||||
/// </summary>
|
||||
[Range(0f, double.MaxValue)] public float horizonRadius;
|
||||
|
||||
/// <summary>
|
||||
/// Radius of the distortion effects. Defaults to 2.5 * horizonRadius
|
||||
/// </summary>
|
||||
[Range(0f, double.MaxValue)] public float distortRadius;
|
||||
|
||||
/// <summary>
|
||||
/// If you want a black hole to load a new star system scene, put its name here.
|
||||
@ -54,5 +65,15 @@ namespace NewHorizons.External.Modules.VariableSize
|
||||
/// Type of singularity (white hole or black hole)
|
||||
/// </summary>
|
||||
public SingularityType type;
|
||||
|
||||
/// <summary>
|
||||
/// Whether a black hole emits blue particles upon warping. It doesn't scale, so disabling this for small black holes is recommended
|
||||
/// </summary>
|
||||
public bool hasWarpEffects = true;
|
||||
|
||||
/// <summary>
|
||||
/// Optional override for the render queue. If the singularity is rendering oddly, increasing this to 3000 can help
|
||||
/// </summary>
|
||||
[Range(2501f, 3500f)] public int renderQueueOverride = 2985;
|
||||
}
|
||||
}
|
||||
@ -1741,11 +1741,6 @@
|
||||
"$ref": "#/definitions/TimeValuePair"
|
||||
}
|
||||
},
|
||||
"makeZeroGVolume": {
|
||||
"type": "boolean",
|
||||
"description": "Only for White Holes. Should this white hole repel the player from it.",
|
||||
"default": true
|
||||
},
|
||||
"pairedSingularity": {
|
||||
"type": "string",
|
||||
"description": "The uniqueID of the white hole or black hole that is paired to this one. If you don't set a value, entering will kill\nthe player"
|
||||
@ -1758,9 +1753,19 @@
|
||||
"description": "Position of the singularity",
|
||||
"$ref": "#/definitions/MVector3"
|
||||
},
|
||||
"size": {
|
||||
"rotation": {
|
||||
"description": "Rotation of the singularity. Determines the direction you come out of a white hole",
|
||||
"$ref": "#/definitions/MVector3"
|
||||
},
|
||||
"horizonRadius": {
|
||||
"type": "number",
|
||||
"description": "Radius of the singularity. Note that this isn't the same as the event horizon, but includes the entire volume that\nhas warped effects in it.",
|
||||
"description": "Radius of the event horizon (solid part)",
|
||||
"format": "float",
|
||||
"minimum": 0.0
|
||||
},
|
||||
"distortRadius": {
|
||||
"type": "number",
|
||||
"description": "Radius of the distortion effects. Defaults to 2.5 * horizonRadius",
|
||||
"format": "float",
|
||||
"minimum": 0.0
|
||||
},
|
||||
@ -1771,6 +1776,17 @@
|
||||
"type": {
|
||||
"description": "Type of singularity (white hole or black hole)",
|
||||
"$ref": "#/definitions/SingularityType"
|
||||
},
|
||||
"hasWarpEffects": {
|
||||
"type": "boolean",
|
||||
"description": "Whether a black hole emits blue particles upon warping. It doesn't scale, so disabling this for small black holes is recommended"
|
||||
},
|
||||
"renderQueueOverride": {
|
||||
"type": "integer",
|
||||
"description": "Optional override for the render queue. If the singularity is rendering oddly, increasing this to 3000 can help",
|
||||
"format": "int32",
|
||||
"maximum": 3500.0,
|
||||
"minimum": 2501.0
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user