From 59924e324cd10f293c214c8e6bb2c794a32d39a0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 15 Jul 2026 22:35:12 +0100 Subject: [PATCH 1/3] Add portable power pulse field falloff --- plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj | 2 +- .../unity/org.gamecult.eve.plugin-fields/README.md | 6 ++++++ .../Runtime/EveFieldsContracts.cs | 3 +++ .../Runtime/EveFieldsDocuments.cs | 2 ++ .../unity/org.gamecult.eve.plugin-fields/package.json | 2 +- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj index 74057f1..4e29428 100644 --- a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj +++ b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj @@ -6,7 +6,7 @@ Runtime-neutral C# contracts for gamecult.fields documents. $(MSBuildThisFileDirectory)..\..\..\CultLib GameCult.Eve.PluginFields - 0.2.0 + 0.2.1 diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md index 8584a0c..dd120eb 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md @@ -3,3 +3,9 @@ This package owns the portable C# view of `gamecult.fields.*` documents. It has no Unity rendering, provider state, transport, or command authority. Providers implement these read-only interfaces; Unity runtime adapters consume them. + +`PowerPulse` is the portable compact-support radial falloff +`pow(saturate(1 - pow(distance01 * scale, 2)), exponent)`. Producers publish +`FalloffScale` and `FalloffExponent` alongside each SoA splat. Missing parameter +entries retain the neutral defaults `1` and `1`, so older v1 documents remain +readable. diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs index 075a8e4..d3133f7 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs @@ -51,6 +51,7 @@ namespace GameCult.Eve.PluginFields public const int Linear = 1; public const int Smooth = 2; public const int InverseSmooth = 3; + public const int PowerPulse = 4; } public interface IEveFieldsViewport @@ -99,6 +100,8 @@ namespace GameCult.Eve.PluginFields IReadOnlyList PhaseY { get; } IReadOnlyList AnimationSpeed { get; } IReadOnlyList SourceFlags { get; } + IReadOnlyList FalloffScale { get; } + IReadOnlyList FalloffExponent { get; } } public interface IEveFieldsSplatsDocument diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs index b1f6189..c33679d 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs @@ -74,5 +74,7 @@ namespace GameCult.Eve.PluginFields [Key(19)] public IReadOnlyList PhaseY { get; set; } = Array.Empty(); [Key(20)] public IReadOnlyList AnimationSpeed { get; set; } = Array.Empty(); [Key(21)] public IReadOnlyList SourceFlags { get; set; } = Array.Empty(); + [Key(22)] public IReadOnlyList FalloffScale { get; set; } = Array.Empty(); + [Key(23)] public IReadOnlyList FalloffExponent { get; set; } = Array.Empty(); } } diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json index 4459e23..905acb0 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json @@ -1,6 +1,6 @@ { "name": "org.gamecult.eve.plugin-fields", - "version": "0.2.0", + "version": "0.2.1", "displayName": "Eve Fields Plugin Contracts", "description": "Runtime-neutral C# contracts for gamecult.fields documents.", "unity": "2021.3", From c4a61e818e0b15b4504d76952910738eeeaf6041 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 15 Jul 2026 23:14:47 +0100 Subject: [PATCH 2/3] Define world-anchored procedural field sources --- .../eve-plugin-fields/GameCult.Eve.PluginFields.csproj | 2 +- plugins/eve-plugin-fields/test/plugin.test.mjs | 2 ++ .../unity/org.gamecult.eve.plugin-fields/README.md | 10 ++++++++++ .../Runtime/EveFieldsContracts.cs | 6 ++++++ .../unity/org.gamecult.eve.plugin-fields/package.json | 2 +- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj index 4e29428..9a4fd45 100644 --- a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj +++ b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj @@ -6,7 +6,7 @@ Runtime-neutral C# contracts for gamecult.fields documents. $(MSBuildThisFileDirectory)..\..\..\CultLib GameCult.Eve.PluginFields - 0.2.1 + 0.2.2 diff --git a/plugins/eve-plugin-fields/test/plugin.test.mjs b/plugins/eve-plugin-fields/test/plugin.test.mjs index 528ca11..eb56dd1 100644 --- a/plugins/eve-plugin-fields/test/plugin.test.mjs +++ b/plugins/eve-plugin-fields/test/plugin.test.mjs @@ -49,6 +49,8 @@ test("publishes a runtime-neutral Unity contract package", () => { assert.equal(manifest.name, "org.gamecult.eve.plugin-fields"); assert.match(contracts, /interface IEveFieldsSplatsDocument/); assert.match(contracts, /gamecult\.fields\.splats\.v1/); + assert.match(contracts, /AnimatedCellNoiseB = 3/); + assert.match(contracts, /AbsoluteValue = 1/); assert.doesNotMatch(contracts, /UnityEngine|Aetheria|MessagePack|GameCult\.Caching/); assert.match(readFileSync(new URL("../GameCult.Eve.PluginFields.csproj", import.meta.url), "utf8"), /netstandard2\.1/); }); diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md index dd120eb..eee9130 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md @@ -9,3 +9,13 @@ implement these read-only interfaces; Unity runtime adapters consume them. `FalloffScale` and `FalloffExponent` alongside each SoA splat. Missing parameter entries retain the neutral defaults `1` and `1`, so older v1 documents remain readable. + +Procedural sources are evaluated in field-world coordinates, not splat-local +UVs. `SimplexNoise` samples signed Ashima 3D simplex at +`(worldXY * frequency + phase, 0)`. `AnimatedSimplexNoise` uses +`simulationTimeSeconds * animationSpeed` for the third coordinate. +`AnimatedCellNoiseB` is the portable moving, wrappable cellular source whose +distance metric is `(length(frac(p) - .5) * 1.5 + .25) * +max(abs(x) * .866 + y * .5, -y)`. `AbsoluteValue` folds a signed source after +sampling. Constant offsets remain ordinary constant splats, so source sampling +and additive composition retain separate ownership. diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs index d3133f7..3bf837e 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs @@ -43,6 +43,12 @@ namespace GameCult.Eve.PluginFields public const int Constant = 0; public const int SimplexNoise = 1; public const int AnimatedSimplexNoise = 2; + public const int AnimatedCellNoiseB = 3; + } + + public static class EveFieldsSplatSourceFlags + { + public const int AbsoluteValue = 1; } public static class EveFieldsSplatFalloffs diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json index 905acb0..42d2ed2 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json @@ -1,6 +1,6 @@ { "name": "org.gamecult.eve.plugin-fields", - "version": "0.2.1", + "version": "0.2.2", "displayName": "Eve Fields Plugin Contracts", "description": "Runtime-neutral C# contracts for gamecult.fields documents.", "unity": "2021.3", From c5a4a75c1b727499b16c2dae1895f29e2a9f72f0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 15 Jul 2026 23:37:10 +0100 Subject: [PATCH 3/3] Add portable radial cosine field source --- plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj | 2 +- plugins/eve-plugin-fields/test/plugin.test.mjs | 1 + .../unity/org.gamecult.eve.plugin-fields/README.md | 7 +++++++ .../Runtime/EveFieldsContracts.cs | 1 + .../unity/org.gamecult.eve.plugin-fields/package.json | 2 +- 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj index 9a4fd45..cbfbfb3 100644 --- a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj +++ b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj @@ -6,7 +6,7 @@ Runtime-neutral C# contracts for gamecult.fields documents. $(MSBuildThisFileDirectory)..\..\..\CultLib GameCult.Eve.PluginFields - 0.2.2 + 0.2.3 diff --git a/plugins/eve-plugin-fields/test/plugin.test.mjs b/plugins/eve-plugin-fields/test/plugin.test.mjs index eb56dd1..85df1b7 100644 --- a/plugins/eve-plugin-fields/test/plugin.test.mjs +++ b/plugins/eve-plugin-fields/test/plugin.test.mjs @@ -50,6 +50,7 @@ test("publishes a runtime-neutral Unity contract package", () => { assert.match(contracts, /interface IEveFieldsSplatsDocument/); assert.match(contracts, /gamecult\.fields\.splats\.v1/); assert.match(contracts, /AnimatedCellNoiseB = 3/); + assert.match(contracts, /AnimatedRadialCosine = 4/); assert.match(contracts, /AbsoluteValue = 1/); assert.doesNotMatch(contracts, /UnityEngine|Aetheria|MessagePack|GameCult\.Caching/); assert.match(readFileSync(new URL("../GameCult.Eve.PluginFields.csproj", import.meta.url), "utf8"), /netstandard2\.1/); diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md index eee9130..fabc7f1 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/README.md @@ -19,3 +19,10 @@ distance metric is `(length(frac(p) - .5) * 1.5 + .25) * max(abs(x) * .866 + y * .5, -y)`. `AbsoluteValue` folds a signed source after sampling. Constant offsets remain ordinary constant splats, so source sampling and additive composition retain separate ownership. + +`AnimatedRadialCosine` is splat-local rather than field-world anchored. It +evaluates +`cos(pow(distance01, FrequencyY) * FrequencyX + PhaseX + simulationTimeSeconds * AnimationSpeed)`. +`FrequencyX` is radial frequency and `FrequencyY` is the positive radial +exponent. The ordinary splat falloff owns the envelope, which keeps oscillation +and compact support independently composable. diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs index 3bf837e..8c712e2 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsContracts.cs @@ -44,6 +44,7 @@ namespace GameCult.Eve.PluginFields public const int SimplexNoise = 1; public const int AnimatedSimplexNoise = 2; public const int AnimatedCellNoiseB = 3; + public const int AnimatedRadialCosine = 4; } public static class EveFieldsSplatSourceFlags diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json index 42d2ed2..a985686 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json @@ -1,6 +1,6 @@ { "name": "org.gamecult.eve.plugin-fields", - "version": "0.2.2", + "version": "0.2.3", "displayName": "Eve Fields Plugin Contracts", "description": "Runtime-neutral C# contracts for gamecult.fields documents.", "unity": "2021.3",