Skip to content

Commit 983afea

Browse files
committed
Keep terrain overlay material mesh codes
1 parent 803ae6c commit 983afea

14 files changed

Lines changed: 43 additions & 32 deletions

src/PlateauResoniteLink/Application/Importing/CityGmlSurfaceMaterialResolver.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ internal static MaterialBinding CreateMaterialBinding(
140140
{
141141
TerrainOverlayMaterialBinding? terrainOverlayMaterial = representativeSurface.Material.TerrainOverlay is null
142142
? null
143-
: new TerrainOverlayMaterialBinding(representativeSurface.Material.TerrainOverlay);
143+
: new TerrainOverlayMaterialBinding(
144+
ThirdRegionalMeshCode.Parse(actualMeshCode),
145+
representativeSurface.Material.TerrainOverlay);
144146
ColorRgba baseColor = representativeSurface.Material.TerrainOverlay is null
145147
? ToContractColor(representativeSurface.Surface.BaseColor)
146148
: new ColorRgba(1.0, 1.0, 1.0, 1.0);

src/PlateauResoniteLink/Application/Importing/SceneImportContractTypes.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,14 +200,22 @@ public enum MaterialReuseScope
200200

201201
public sealed record TerrainOverlayMaterialBinding
202202
{
203-
public TerrainOverlayMaterialBinding(TerrainTextureOverlay overlay)
203+
public TerrainOverlayMaterialBinding(
204+
ThirdRegionalMeshCode meshCode,
205+
TerrainTextureOverlay overlay)
204206
{
207+
if (!ThirdRegionalMeshCode.TryParse(meshCode.Value, out _))
208+
{
209+
throw new ArgumentException("Terrain overlay material mesh code must be a valid third regional mesh code.", nameof(meshCode));
210+
}
211+
212+
MeshCode = meshCode;
205213
Overlay = overlay ?? throw new ArgumentNullException(nameof(overlay));
206214
}
207215

208-
public TerrainTextureOverlay Overlay { get; init; }
216+
public ThirdRegionalMeshCode MeshCode { get; }
209217

210-
public ThirdRegionalMeshCode MeshCode => Overlay.MeshCode;
218+
public TerrainTextureOverlay Overlay { get; }
211219
}
212220

213221
public sealed record MaterialBinding(

src/PlateauResoniteLink/Targets/Resonite/ResoniteQueuedTexturePreparer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public async Task<PreparedTextureReference[]> PrepareAsync(
4444
.Select((material, materialIndex) => (Material: material, MaterialIndex: materialIndex))
4545
.Where(static entry => entry.Material.TerrainOverlayMaterial is not null)
4646
.Select(entry => (
47-
TerrainMeshCode: entry.Material.TerrainOverlayMaterial!.Overlay.MeshCode,
47+
TerrainMeshCode: entry.Material.TerrainOverlayMaterial!.MeshCode,
4848
TerrainOverlay: entry.Material.TerrainOverlayMaterial!.Overlay))
4949
.Distinct()
5050
.OrderBy(static entry => entry.TerrainMeshCode.Value, StringComparer.Ordinal)

tests/PlateauResoniteLink.Tests/Profiles/CityGmlSurfaceMaterialResolverTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void EnumerateSurfacesPreservesLazyScanAfterFirstGeneratedDemSurface()
4040
}
4141

4242
[Fact]
43-
public void CreateMaterialBindingUsesTerrainOverlayMeshCodeWithoutMatchingActualMeshCode()
43+
public void CreateMaterialBindingKeepsMaterialMeshCodeSeparateFromTerrainOverlayMeshCode()
4444
{
4545
ResolvedSurfaceMaterial representativeSurface = new(
4646
CreateSurface(),
@@ -60,7 +60,7 @@ public void CreateMaterialBindingUsesTerrainOverlayMeshCodeWithoutMatchingActual
6060
representativeSurface,
6161
materialIndex: 0);
6262

63-
Assert.Equal("53394525", binding.TerrainMeshCode);
63+
Assert.Equal("53394600", binding.TerrainMeshCode);
6464
Assert.Same(representativeSurface.Material.TerrainOverlay, binding.TerrainOverlay);
6565
}
6666

tests/PlateauResoniteLink.Tests/Profiles/ImportedDynamicMaterialUvNormalizerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,6 @@ private static MaterialBinding CreateDynamicUvMaterial(
279279
TextureOffset: textureOffset,
280280
TerrainOverlayMaterial: terrainOverlay is null
281281
? null
282-
: new TerrainOverlayMaterialBinding(terrainOverlay));
282+
: new TerrainOverlayMaterialBinding(terrainOverlay.MeshCode, terrainOverlay));
283283
}
284284
}

tests/PlateauResoniteLink.Tests/Profiles/LocalCityGmlObjectProjectionTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,7 +1501,7 @@ public void ProjectCityObjectUsesPerObjectAlbedoOnlyMaterialForTexturelessDemTer
15011501
}
15021502

15031503
[Fact]
1504-
public void ProjectCityObjectUsesProvidedTerrainOverlayMeshCodeForTexturelessRoof()
1504+
public void ProjectCityObjectKeepsMaterialMeshCodeForMismatchedTerrainOverlayRoof()
15051505
{
15061506
CoordinateReferenceSystem referenceSystem = CoordinateReferenceSystem.Parse("http://www.opengis.net/def/crs/EPSG/0/6697");
15071507
TerrainTextureOverlay mismatchedOverlay = CreateThirdMeshOverlay("53394526");
@@ -1523,7 +1523,7 @@ public void ProjectCityObjectUsesProvidedTerrainOverlayMeshCodeForTexturelessRoo
15231523

15241524
MaterialBinding material = Assert.Single(projected.Materials);
15251525
Assert.Same(mismatchedOverlay, material.TerrainOverlay);
1526-
Assert.Equal("53394526", material.TerrainMeshCode);
1526+
Assert.Equal("53394525", material.TerrainMeshCode);
15271527
Assert.Equal(TextureSourceKind.Dataset, material.TextureSourceKind);
15281528
}
15291529

tests/PlateauResoniteLink.Tests/Targets/NonDemCityObjectBakerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,7 @@ public async Task TryBufferAsyncPreservesTerrainOverlayAlbedoOnlyProviderWithGen
844844
DepthOffset: null,
845845
SubmeshIndices: [0],
846846
AssetScope: ResoniteMaterialAssetScope.Common,
847-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay),
847+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay.MeshCode, overlay),
848848
CommonMaterial: CommonMaterialCatalog.Create().Generic.Uv),
849849
],
850850
};

tests/PlateauResoniteLink.Tests/Targets/ResoniteDynamicMaterialUvNormalizerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,6 @@ private static ResoniteMaterialBinding CreateDynamicUvMaterial(
298298
AssetScope: ResoniteMaterialAssetScope.PresentationSlotScoped,
299299
TerrainOverlayMaterial: terrainOverlay is null
300300
? null
301-
: new TerrainOverlayMaterialBinding(terrainOverlay));
301+
: new TerrainOverlayMaterialBinding(terrainOverlay.MeshCode, terrainOverlay));
302302
}
303303
}

tests/PlateauResoniteLink.Tests/Targets/ResoniteLiveSceneImportTargetLifecycleTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1121,7 +1121,7 @@ private static ResoniteConstructionCityObject CreateDemCityObject(
11211121
ResoniteMaterialProjection.Uv,
11221122
null,
11231123
[0],
1124-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay)),
1124+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay.MeshCode, overlay)),
11251125
],
11261126
CollisionEnabled: true,
11271127
SourceFileRelativePath: sourceFileRelativePath);

tests/PlateauResoniteLink.Tests/Targets/ResoniteLiveSceneImportTargetTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public async Task ExecuteAsyncImportsGeneratedDemTerrainTextureWithCanvasTransfo
6868
TextureOffset: null,
6969
DepthOffset: null,
7070
SubmeshIndices: [0],
71-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay)),
71+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay.MeshCode, overlay)),
7272
],
7373
SourceFileRelativePath: $"udx/dem/533945/plateau_{DatasetName}_dem_533945.gml");
7474

@@ -363,7 +363,7 @@ await ResoniteLiveSceneImportTargetTestSupport.ExecuteSceneAsync(
363363
}
364364

365365
[Fact]
366-
public async Task ExecuteAsyncUsesTerrainOverlayMeshCodeWithoutRecheckingOverlayBoundsAgainstActualMeshCode()
366+
public async Task ExecuteAsyncKeepsMaterialMeshCodeWhenOverlayBoundsUseDifferentMeshCode()
367367
{
368368
using TemporaryDirectory datasetDirectory = new();
369369
using SceneSinkRecordingClient client = new();
@@ -401,7 +401,7 @@ await ResoniteLiveSceneImportTargetTestSupport.ExecuteSceneAsync(
401401
AddComponent terrainTexture = Assert.Single(
402402
client.AddedComponents,
403403
request => string.Equals(request.Data.ComponentType, "[FrooxEngine]FrooxEngine.StaticTexture2D", StringComparison.Ordinal)
404-
&& client.SlotPaths[request.ContainerSlotId].Contains("/Assets/Terrain Textures/53394526", StringComparison.Ordinal));
404+
&& client.SlotPaths[request.ContainerSlotId].Contains("/Assets/Terrain Textures/53394525", StringComparison.Ordinal));
405405
Assert.StartsWith(
406406
"resdb:///texture/",
407407
Assert.IsType<Field_Uri>(terrainTexture.Data.Members["URL"]).Value.ToString(),
@@ -457,7 +457,7 @@ public async Task ExecuteAsyncDoesNotReuseExistingGenericCommonMaterialForTerrai
457457
Projection: ResoniteMaterialProjection.Uv,
458458
DepthOffset: null,
459459
SubmeshIndices: [0],
460-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay)),
460+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay.MeshCode, overlay)),
461461
],
462462
SourceFileRelativePath: $"udx/dem/533945/plateau_{DatasetName}_dem_533945.gml");
463463

@@ -840,7 +840,7 @@ public async Task ExecuteAsyncAppliesTerrainOverlayUvTransformToGridMeshInsteadO
840840
Projection: ResoniteMaterialProjection.Uv,
841841
DepthOffset: null,
842842
SubmeshIndices: [0],
843-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay)),
843+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay.MeshCode, overlay)),
844844
],
845845
SourceFileRelativePath: $"udx/dem/533945/plateau_{DatasetName}_dem_533945.gml");
846846

@@ -951,7 +951,7 @@ public void EstimateCityObjectWorkingSetBytesCountsTerrainOverlayCanvasBudget()
951951
Projection: ResoniteMaterialProjection.Uv,
952952
DepthOffset: null,
953953
SubmeshIndices: [0],
954-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay)),
954+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay.MeshCode, overlay)),
955955
]
956956
);
957957
ResoniteConstructionCityObject withoutOverlay = withOverlay with
@@ -1702,7 +1702,7 @@ private static ResoniteConstructionCityObject CreateTerrainOverlayCityObject(
17021702
TextureOffset: null,
17031703
DepthOffset: null,
17041704
SubmeshIndices: [0],
1705-
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(overlay)),
1705+
TerrainOverlayMaterial: new TerrainOverlayMaterialBinding(ThirdRegionalMeshCode.Parse(meshCode), overlay)),
17061706
],
17071707
SourceFileRelativePath: $"udx/{packageName}/{meshCode}/plateau_{DatasetName}_{packageName}_{meshCode}.gml");
17081708
}

0 commit comments

Comments
 (0)