Unified Volumetric Flow

Fixed towing system
Tweaked Nebula Flow (a lot)
Extracted environment appearance settings into ZoneEnvironment data structure
Stardust particles now follow global flow field
This commit is contained in:
Reinier Vens 2021-06-18 12:32:03 +01:00
commit 00f752edf7
39 changed files with 812 additions and 341 deletions

View file

@ -228,4 +228,14 @@ public enum MusicType
Overworld,
Combat,
Boss
}
[Flags]
public enum BrushLayer
{
Gravity = 1 << 0,
Displacement = 1 << 1,
FogHeight = 1 << 2,
CloudHeight = 1 << 3,
CloudDepth = 1 << 4
}

View file

@ -0,0 +1,135 @@
using System;
using MessagePack;
using Newtonsoft.Json;
using Unity.Mathematics;
using static Unity.Mathematics.math;
using static Unity.Mathematics.noise;
using float2 = Unity.Mathematics.float2;
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class ZoneEnvironment
{
[JsonProperty("nebula"), Key(0)] public NebulaSettings Nebula;
[JsonProperty("flow"), Key(1)] public FlowSettings Flow;
[JsonProperty("noise"), Key(2)] public NoiseSettings Noise;
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class NebulaSettings
{
[JsonProperty("fillDensity"), Key(0)] public float FillDensity;
[JsonProperty("fillDistance"), Key(1)] public float FillDistance;
[JsonProperty("fogDensity"), Key(2)] public float FloorDensity;
[JsonProperty("cloudDensity"), Key(3)] public float PatchDensity;
[JsonProperty("fogOffset"), Key(4)] public float FloorOffset;
[JsonProperty("fogBlend"), Key(5)] public float FloorBlend;
[JsonProperty("cloudBlend"), Key(6)] public float PatchBlend;
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class FlowSettings
{
[JsonProperty("scale"), Key(0)] public float Scale;
[JsonProperty("amplitude"), Key(1)] public float Amplitude;
[JsonProperty("scrollSpeed"), Key(2)] public float ScrollSpeed;
[JsonProperty("velocity"), Key(3)] public float Speed;
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class NoiseSettings
{
[JsonProperty("scale"), Key(0)] public float Scale;
[JsonProperty("amplitude"), Key(1)] public float Amplitude;
[JsonProperty("exponent"), Key(2)] public float Exponent;
[JsonProperty("speed"), Key(3)] public float Speed;
}
[Union(0, typeof(PowerBrush)),
Union(1, typeof(SimplexBrush)),
Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public abstract class Brush
{
[JsonProperty("layerMask"), Key(0)] public BrushLayer LayerMask;
[JsonProperty("cutoff"), Key(1)] public float Cutoff;
[JsonProperty("depth"), Key(2)] public float Depth;
[JsonProperty("envelopeExponent"), Key(3)] public float EnvelopeExponent;
float powerPulse( float x, float power )
{
x = saturate(abs(x))-.001f;
return pow((x + 1.0f) * (1.0f - x), power);
}
protected abstract float Evaluate(float2 world, float2 uv);
public float Evaluate(float2 world, float2 pos, float2 radius)
{
var uv = (world - pos) / radius;
float dist = length(uv)*2;
float envelope = min(Cutoff, powerPulse(dist,EnvelopeExponent)) * smoothstep(1, .95f, dist);
return Depth * Evaluate(world, uv) * envelope;
}
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class PowerBrush : Brush
{
protected override float Evaluate(float2 world, float2 uv)
{
return 1;
}
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public abstract class TextureBrush : Brush
{
[JsonProperty("frequency"), Key(4)] public float2 Frequency;
[JsonProperty("phase"), Key(5)] public float2 Phase;
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public abstract class AnimatedBrush : TextureBrush
{
[JsonProperty("animationSpeed"), Key(6)] public float AnimationSpeed;
[IgnoreMember]
public float Time { get; set; }
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class SimplexBrush : TextureBrush
{
[JsonProperty("absolute"), Key(6)] public bool AbsoluteValue;
protected override float Evaluate(float2 world, float2 uv)
{
var noise = snoise(world * Frequency + Phase);
return AbsoluteValue ? abs(noise) : noise;
}
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class AnimatedSimplexBrush : AnimatedBrush
{
[JsonProperty("absolute"), Key(7)] public bool AbsoluteValue;
protected override float Evaluate(float2 world, float2 uv)
{
var noise = snoise(float3(float2(world * Frequency + Phase), AnimationSpeed * Time));
return AbsoluteValue ? abs(noise) : noise;
}
}
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class RadialWaveBrush : TextureBrush
{
[JsonProperty("waveExponent"), Key(7)] public float WaveExponent;
protected override float Evaluate(float2 world, float2 uv)
{
float dist = length(uv);
float ang = atan2(uv.y,uv.x);
return cos((ang + Phase.x) * Frequency.x * PI + (pow(dist, WaveExponent) + Phase.y) * Frequency.y);
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b4fc7c09c95c487baeffbd139abe89b9
timeCreated: 1622614593

View file

@ -520,6 +520,9 @@ public class HullData : EquippableItemData
[Inspectable, JsonProperty("drag"), Key(28)]
public float Drag;
[Inspectable, JsonProperty("canTow"), Key(29)]
public bool CanTow;
[IgnoreMember]
public Shape InteriorCells

View file

@ -95,6 +95,8 @@ public class LoadoutGenerator
var instance = ItemManager.CreateInstance(item);
cargo.TryStore(instance);
}
entity.CanTow = hullData.CanTow;
return EntitySerializer.Pack(entity) as OrbitalEntityPack;
}

View file

@ -15,6 +15,7 @@ public class OrbitalEntity : Entity
public SecurityLevel SecurityLevel;
public float SecurityRadius;
public LocationStory Story;
public bool CanTow;
public OrbitalEntity(ItemManager itemManager, Zone zone, EquippableItem hull, Guid orbit, EntitySettings settings) : base(itemManager, zone, hull, settings)
{

View file

@ -26,7 +26,6 @@ public class Ship : Entity
public Entity HomeEntity;
public float2 MovementDirection;
public bool IsPlayerShip;
public bool CanTow;
private HashSet<EquippedItem> _thrusterItems;
private Thruster[] _allThrusters;