diff --git a/.gitignore b/.gitignore index 69f9c63..36a9264 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules/ artifacts/ -**/bin/ -**/obj/ + diff --git a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj b/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj deleted file mode 100644 index cbfbfb3..0000000 --- a/plugins/eve-plugin-fields/GameCult.Eve.PluginFields.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - netstandard2.1 - enable - latest - Runtime-neutral C# contracts for gamecult.fields documents. - $(MSBuildThisFileDirectory)..\..\..\CultLib - GameCult.Eve.PluginFields - 0.2.3 - - - - - - - diff --git a/plugins/eve-plugin-fields/advertisement.json b/plugins/eve-plugin-fields/advertisement.json index 08a999b..7cf626e 100644 --- a/plugins/eve-plugin-fields/advertisement.json +++ b/plugins/eve-plugin-fields/advertisement.json @@ -2,7 +2,7 @@ "schema": "gamecult.eve.plugin_advertisement.v1", "pluginId": "fields.surface", "ownerService": "eveplugins", - "version": "0.1.1", + "version": "0.1.0", "manifestAddress": "file://plugins/eve-plugin-fields/plugin.json", "runtime": { "invocationModel": "executable-sidecar", diff --git a/plugins/eve-plugin-fields/plugin-abi-fixture.json b/plugins/eve-plugin-fields/plugin-abi-fixture.json index c98a2a8..d75aba9 100644 --- a/plugins/eve-plugin-fields/plugin-abi-fixture.json +++ b/plugins/eve-plugin-fields/plugin-abi-fixture.json @@ -8,9 +8,9 @@ "responseSchema": "gamecult.eve.plugin_abi.response.v1", "authority": "EvePlugins owns field semantics; providers own sampled field state and runtimes own native projection.", "operations": [ - { "operation": "describe", "input": {}, "expect": { "pluginId": "fields.surface", "componentKinds": ["field.surface2d", "gravity.surface"], "commands": [], "capabilities": ["field.surface2d", "gravity.surface", "field.scalar", "field.vector", "field.objects"] } }, - { "operation": "validate", "input": { "componentKinds": ["field.surface2d", "gravity.surface", "world.scene3d"], "document": { "schema": "gamecult.fields.surface2d.v1", "bounds": { "minX": -1, "minY": -1, "maxX": 1, "maxY": 1 } } }, "expect": { "acceptedComponentKinds": ["field.surface2d", "gravity.surface"], "rejectedComponentKinds": ["world.scene3d"], "validDocument": true } }, + { "operation": "describe", "input": {}, "expect": { "pluginId": "fields.surface", "componentKinds": ["field.surface2d", "gravity.surface"], "commands": [] } }, + { "operation": "validate", "input": { "componentKinds": ["field.surface2d", "world.scene3d"], "document": { "schema": "gamecult.fields.surface2d.v1", "bounds": { "minX": -1, "minY": -1, "maxX": 1, "maxY": 1 } } }, "expect": { "acceptedComponentKinds": ["field.surface2d"], "rejectedComponentKinds": ["world.scene3d"], "validDocument": true } }, { "operation": "project", "input": { "document": { "schema": "gamecult.fields.surface2d.v1", "fieldId": "fixture.field", "bounds": { "minX": -1, "minY": -1, "maxX": 1, "maxY": 1 }, "channels": [{ "channelId": "height", "kind": "scalar", "documentId": "cultmesh://fixture/height", "schemaId": "gamecult.fields.scalar.v1" }] } }, "expect": { "projectionKind": "semantic-field-surface", "ownedComponentKinds": ["field.surface2d", "gravity.surface"], "providerStateMutated": false } }, - { "operation": "measure", "input": { "document": { "schema": "gamecult.fields.surface2d.v1", "fieldId": "fixture.field", "bounds": { "minX": -1, "minY": -2, "maxX": 3, "maxY": 2 }, "channels": [] } }, "expect": { "measurementKind": "field-domain-metrics", "measurementOutputs": ["width", "height", "channelCount"], "width": 4, "height": 4, "preservesProviderAuthority": true } } + { "operation": "measure", "input": { "document": { "schema": "gamecult.fields.surface2d.v1", "fieldId": "fixture.field", "bounds": { "minX": -1, "minY": -2, "maxX": 3, "maxY": 2 }, "channels": [] } }, "expect": { "measurementKind": "field-domain-metrics", "width": 4, "height": 4, "preservesProviderAuthority": true } } ] } diff --git a/plugins/eve-plugin-fields/plugin.json b/plugins/eve-plugin-fields/plugin.json index d178460..6dfa5f8 100644 --- a/plugins/eve-plugin-fields/plugin.json +++ b/plugins/eve-plugin-fields/plugin.json @@ -4,20 +4,11 @@ "title": "Semantic Fields", "owner": "EvePlugins", "incubation": { - "status": "graduated", "ownerRepo": "EvePlugins", "currentHostRepo": "EvePlugins", "splitTarget": "EvePlugins/eve-plugin-fields", "graduationTrigger": "Split when field schemas, sidecar witness, and two runtime adapters are stable." }, - "graduation": { - "status": "graduated", - "runtimeAdapters": ["web-reference", "unity-scene"], - "evidence": [ - "artifacts/fields-surface/runtime-witness.json", - "EveUnity/artifacts/fields-surface/latest/unity-fields.png" - ] - }, "componentKinds": ["field.surface2d", "gravity.surface"], "commands": [], "runtime": { diff --git a/plugins/eve-plugin-fields/src/plugin.mjs b/plugins/eve-plugin-fields/src/plugin.mjs index 1fb84b7..1659e7e 100644 --- a/plugins/eve-plugin-fields/src/plugin.mjs +++ b/plugins/eve-plugin-fields/src/plugin.mjs @@ -62,7 +62,6 @@ export function measure(input) { const projection = project(input); return { measurementKind: "field-domain-metrics", - measurementOutputs: ["width", "height", "channelCount"], width: projection.bounds.maxX - projection.bounds.minX, height: projection.bounds.maxY - projection.bounds.minY, channelCount: projection.channels.length, diff --git a/plugins/eve-plugin-fields/test/plugin.test.mjs b/plugins/eve-plugin-fields/test/plugin.test.mjs index 85df1b7..9d75db4 100644 --- a/plugins/eve-plugin-fields/test/plugin.test.mjs +++ b/plugins/eve-plugin-fields/test/plugin.test.mjs @@ -38,7 +38,6 @@ test("measures field domains without mutating provider state", () => { assert.equal(result.width, 20); assert.equal(result.height, 10); assert.equal(result.channelCount, 1); - assert.deepEqual(result.measurementOutputs, ["width", "height", "channelCount"]); assert.equal(result.preservesProviderAuthority, true); }); @@ -49,15 +48,5 @@ 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, /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/); -}); - -test("records fields plugin graduation after two native runtime proofs", () => { - const manifest = JSON.parse(readFileSync(new URL("../plugin.json", import.meta.url), "utf8")); - assert.equal(manifest.graduation.status, "graduated"); - assert.deepEqual(manifest.graduation.runtimeAdapters, ["web-reference", "unity-scene"]); }); 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 fabc7f1..8584a0c 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,26 +3,3 @@ 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. - -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. - -`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 8c712e2..075a8e4 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,13 +43,6 @@ 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 const int AnimatedRadialCosine = 4; - } - - public static class EveFieldsSplatSourceFlags - { - public const int AbsoluteValue = 1; } public static class EveFieldsSplatFalloffs @@ -58,7 +51,6 @@ 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 @@ -107,8 +99,6 @@ 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 deleted file mode 100644 index c33679d..0000000 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -using GameCult.Caching; -using MessagePack; - -namespace GameCult.Eve.PluginFields -{ - [CultDocument("gamecult.fields.splats", EveFieldsSchemas.Splats)] - [MessagePackObject] - public sealed class EveFieldsSplatsDocument : IEveFieldsSplatsDocument - { - [Key(0)] public string Schema { get; set; } = EveFieldsSchemas.Splats; - [Key(1)] public long FrameId { get; set; } - [Key(2)] public string PublishedAtUtc { get; set; } = ""; - [Key(3)] public double SimulationTimeSeconds { get; set; } - [Key(4)] public string RunId { get; set; } = ""; - [Key(5)] public int ZoneIndex { get; set; } - [Key(6)] public string ZoneName { get; set; } = ""; - [Key(7)] public EveFieldsViewport Viewport { get; set; } = new EveFieldsViewport(); - [Key(8)] public IReadOnlyList Layers { get; set; } = Array.Empty(); - [Key(9)] public EveFieldsSplatSoa Splats { get; set; } = new EveFieldsSplatSoa(); - - IEveFieldsViewport IEveFieldsSplatsDocument.Viewport => Viewport; - IReadOnlyList IEveFieldsSplatsDocument.Layers => Layers; - IEveFieldsSplatSoa IEveFieldsSplatsDocument.Splats => Splats; - } - - [MessagePackObject] - public sealed class EveFieldsViewport : IEveFieldsViewport - { - [Key(0)] public double MinX { get; set; } - [Key(1)] public double MinY { get; set; } - [Key(2)] public double MaxX { get; set; } - [Key(3)] public double MaxY { get; set; } - } - - [MessagePackObject] - public sealed class EveFieldsSplatLayer : IEveFieldsSplatLayer - { - [Key(0)] public string LayerKey { get; set; } = ""; - [Key(1)] public string DisplayName { get; set; } = ""; - [Key(2)] public int Channel { get; set; } - [Key(3)] public string BlendMode { get; set; } = EveFieldsSplatBlendModes.Add; - [Key(4)] public string GraphicsFormat { get; set; } = "R16_SFloat"; - [Key(5)] public bool ClearBeforeDraw { get; set; } = true; - [Key(6)] public double ClearR { get; set; } - [Key(7)] public double ClearG { get; set; } - [Key(8)] public double ClearB { get; set; } - [Key(9)] public double ClearA { get; set; } - } - - [MessagePackObject] - public sealed class EveFieldsSplatSoa : IEveFieldsSplatSoa - { - [Key(0)] public int Count { get; set; } - [Key(1)] public IReadOnlyList CenterX { get; set; } = Array.Empty(); - [Key(2)] public IReadOnlyList CenterY { get; set; } = Array.Empty(); - [Key(3)] public IReadOnlyList HalfExtentX { get; set; } = Array.Empty(); - [Key(4)] public IReadOnlyList HalfExtentY { get; set; } = Array.Empty(); - [Key(5)] public IReadOnlyList RotationCos { get; set; } = Array.Empty(); - [Key(6)] public IReadOnlyList RotationSin { get; set; } = Array.Empty(); - [Key(7)] public IReadOnlyList Channel { get; set; } = Array.Empty(); - [Key(8)] public IReadOnlyList Falloff { get; set; } = Array.Empty(); - [Key(9)] public IReadOnlyList ValueR { get; set; } = Array.Empty(); - [Key(10)] public IReadOnlyList ValueG { get; set; } = Array.Empty(); - [Key(11)] public IReadOnlyList ValueB { get; set; } = Array.Empty(); - [Key(12)] public IReadOnlyList ValueA { get; set; } = Array.Empty(); - [Key(13)] public IReadOnlyList SourceKey { get; set; } = Array.Empty(); - [Key(14)] public IReadOnlyList LayerIndex { get; set; } = Array.Empty(); - [Key(15)] public IReadOnlyList SourceKind { get; set; } = Array.Empty(); - [Key(16)] public IReadOnlyList FrequencyX { get; set; } = Array.Empty(); - [Key(17)] public IReadOnlyList FrequencyY { get; set; } = Array.Empty(); - [Key(18)] public IReadOnlyList PhaseX { get; set; } = Array.Empty(); - [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/Runtime/EveFieldsDocuments.cs.meta b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs.meta deleted file mode 100644 index edc01a3..0000000 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/EveFieldsDocuments.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7e1b64023d224e8cb0bfaec57adad5c2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/GameCult.Eve.PluginFields.asmdef b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/GameCult.Eve.PluginFields.asmdef index 8afd12c..b1ae4e7 100644 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/GameCult.Eve.PluginFields.asmdef +++ b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/Runtime/GameCult.Eve.PluginFields.asmdef @@ -2,12 +2,6 @@ "name": "GameCult.Eve.PluginFields", "rootNamespace": "GameCult.Eve.PluginFields", "references": [], - "overrideReferences": true, - "precompiledReferences": [ - "GameCult.Caching.dll", - "MessagePack.Annotations.dll", - "MessagePack.dll" - ], "autoReferenced": true, "noEngineReferences": true } 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 a985686..430cafc 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,11 +1,8 @@ { "name": "org.gamecult.eve.plugin-fields", - "version": "0.2.3", + "version": "0.1.1", "displayName": "Eve Fields Plugin Contracts", "description": "Runtime-neutral C# contracts for gamecult.fields documents.", - "unity": "2021.3", - "dependencies": { - "org.gamecult.cultlib": "1.0.13" - }, + "unity": "2022.3", "license": "MPL-2.0" } diff --git a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json.meta b/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json.meta deleted file mode 100644 index 0bc6c7d..0000000 --- a/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields/package.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 59ad75f1e14ba2245b8766107f53a8b7 -PackageManifestImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: