From a39e5435f19cdf5acafa9da6d126c9538aef3905 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Tue, 17 Sep 2024 14:36:07 +0200 Subject: [PATCH] Uncompilable WIP But scared straight by being locked out of my laptop! --- .../CesiumFeaturesMetadataComponent.cpp | 60 +++++++++++++++---- .../Private/CesiumGltfComponent.cpp | 14 ++++- Source/CesiumRuntime/Private/LoadGltfResult.h | 9 +-- extern/cesium-native | 2 +- 4 files changed, 68 insertions(+), 17 deletions(-) diff --git a/Source/CesiumRuntime/Private/CesiumFeaturesMetadataComponent.cpp b/Source/CesiumRuntime/Private/CesiumFeaturesMetadataComponent.cpp index 34c7663f3..aaa048b4d 100644 --- a/Source/CesiumRuntime/Private/CesiumFeaturesMetadataComponent.cpp +++ b/Source/CesiumRuntime/Private/CesiumFeaturesMetadataComponent.cpp @@ -26,6 +26,8 @@ #include "Materials/MaterialExpressionFunctionOutput.h" #include "Materials/MaterialExpressionIf.h" #include "Materials/MaterialExpressionMaterialFunctionCall.h" +#include "Materials/MaterialExpressionPerInstanceCustomData.h" +#include "Materials/MaterialExpressionRound.h" #include "Materials/MaterialExpressionScalarParameter.h" #include "Materials/MaterialExpressionSetMaterialAttributes.h" #include "Materials/MaterialExpressionTextureCoordinate.h" @@ -457,6 +459,7 @@ struct MaterialFunctionLibrary { UMaterialFunction* TransformTexCoords = nullptr; UMaterialFunction* GetFeatureIdsFromAttribute = nullptr; UMaterialFunction* GetFeatureIdsFromTexture = nullptr; + UMaterialFunction* GetFeatureIdsFromInstance = nullptr; MaterialFunctionLibrary() : SelectTexCoords(LoadMaterialFunction( @@ -466,13 +469,17 @@ struct MaterialFunctionLibrary { GetFeatureIdsFromAttribute(LoadMaterialFunction( "/CesiumForUnreal/Materials/MaterialFunctions/CesiumGetFeatureIdsFromAttribute.CesiumGetFeatureIdsFromAttribute")), GetFeatureIdsFromTexture(LoadMaterialFunction( - "/CesiumForUnreal/Materials/MaterialFunctions/CesiumGetFeatureIdsFromTexture.CesiumGetFeatureIdsFromTexture")) { + "/CesiumForUnreal/Materials/MaterialFunctions/CesiumGetFeatureIdsFromTexture.CesiumGetFeatureIdsFromTexture")), + GetFeatureIdsFromInstance(LoadMaterialFunction( + "/CesiumForUnreal/Materials/MaterialFunctions/CesiumGetFeatureIdsFromInstance.CesiumGetFeatureIdsFromInstance")) + { } bool isValid() { return SelectTexCoords != nullptr && GetFeatureIdsFromAttribute != nullptr && - GetFeatureIdsFromTexture != nullptr; + GetFeatureIdsFromTexture != nullptr && + GetFeatureIdsFromInstance != nullptr; } }; } // namespace @@ -487,7 +494,8 @@ static void ClassifyNodes( FunctionLibrary.GetFeatureIdsFromAttribute; const UMaterialFunction* GetFeatureIdsFromTextureFunction = FunctionLibrary.GetFeatureIdsFromTexture; - + const UMaterialFunction* GetFeatureIdsFromInstanceFunction = + FunctionLibrary.GetFeatureIdsFromInstance; for (const TObjectPtr& Node : Layer->GetExpressionCollection().Expressions) { // Check if this node is marked as autogenerated. @@ -526,7 +534,8 @@ static void ClassifyNodes( const FName& name = FunctionCallNode->MaterialFunction->GetFName(); if (name == GetFeatureIdsFromAttributeFunction->GetFName() || - name == GetFeatureIdsFromTextureFunction->GetFName()) { + name == GetFeatureIdsFromTextureFunction->GetFName() || + name == GetFeatureIdsFromInstanceFunction->GetFName()) { Classification.GetFeatureIdNodes.Add(FunctionCallNode); } } else { @@ -1840,7 +1849,7 @@ void GenerateNodesForPropertyTable( UMaterialFunctionMaterialLayer* TargetMaterialLayer, int32& NodeX, int32& NodeY, - UMaterialExpressionMaterialFunctionCall* GetFeatureIdCall) { + UMaterialExpression* GetFeatureExpression) { int32 BeginSectionX = NodeX; // This value is used by parameters on the left side of the // "GetPropertyValues" function... @@ -1880,7 +1889,7 @@ void GenerateNodesForPropertyTable( FCustomInput& FeatureIDInput = GetPropertyValuesFunction->Inputs[0]; FeatureIDInput.InputName = FName("FeatureID"); - FeatureIDInput.Input.Expression = GetFeatureIdCall; + FeatureIDInput.Input.Expression = GetFeatureExpression; GetPropertyValuesFunction->AdditionalOutputs.Reserve( PropertyTable.Properties.Num()); @@ -2364,6 +2373,28 @@ void GenerateNodesForPropertyTexture( NodeY = FMath::Max(PropertyDataSectionY, PropertyTransformsSectionY) + Incr; } +UMaterialExpression* GenerateInstanceNodes(TArray& AutoGeneratedNodes, + UMaterialFunctionMaterialLayer* TargetMaterialLayer, + int32& NodeX, + int32& NodeY) { + UMaterialExpressionPerInstanceCustomData *data = + NewObject(TargetMaterialLayer); + UMaterialExpressionScalarParameter* TexCoordsIndex = + NewObject(TargetMaterialLayer); + TexCoordsIndex->ParameterName = FName(SafeName + MaterialTexCoordIndexSuffix); + TexCoordsIndex->DefaultValue = 0.0f; + TexCoordsIndex->MaterialExpressionEditorX = NodeX; + TexCoordsIndex->MaterialExpressionEditorY = NodeY; + data->DefaultValue.Expression = TexCoordsIndex; + AutoGeneratedNodes.Add(TexCoordsIndex); + data->ConstDefaultValue = 0.0f; + data->DataIndex = 0; + UMaterialExpressionRound* round = + NewObject(TargetMaterialLayer); + + return data; +} + void GenerateMaterialNodes( UCesiumFeaturesMetadataComponent* pComponent, TArray& AutoGeneratedNodes, @@ -2385,17 +2416,27 @@ void GenerateMaterialNodes( } UMaterialExpressionMaterialFunctionCall* GetFeatureIdCall = nullptr; + UMaterialExpression* LastNode = nullptr; if (featureIdSet.Type == ECesiumFeatureIdSetType::Texture) { - GetFeatureIdCall = GenerateNodesForFeatureIdTexture( + LastNode = GenerateNodesForFeatureIdTexture( featureIdSet, AutoGeneratedNodes, pComponent->TargetMaterialLayer, FunctionLibrary, NodeX, NodeY); - } else { - // Handle implicit feature IDs the same as feature ID attributes + } else if (featureIdSet.Type == ECesiumFeatureIdSetType::Instance) { GetFeatureIdCall = GenerateNodesForFeatureIdAttribute( + featureIdSet, + AutoGeneratedNodes, + pComponent->TargetMaterialLayer, + FunctionLibrary.GetFeatureIdsFromInstance, + NodeX, + NodeY); + } + else { + // Handle implicit feature IDs the same as feature ID attributes + LastNode = GenerateNodesForFeatureIdAttribute( featureIdSet, AutoGeneratedNodes, pComponent->TargetMaterialLayer, @@ -2404,7 +2445,6 @@ void GenerateMaterialNodes( NodeY); } - UMaterialExpression* LastNode = GetFeatureIdCall; int32 BeginSectionY = NodeY; if (!featureIdSet.PropertyTableName.IsEmpty()) { diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp index 1eb55100b..a9f6bd5ff 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp @@ -3178,12 +3178,22 @@ void addInstanceFeatureIds(UCesiumGltfInstancedComponent* pInstancedComponent) { const TArray& featureIdSets = UCesiumInstanceFeaturesBlueprintLibrary::GetFeatureIDSets(instanceFeatures); int32 featureSetCount = featureIdSets.Num(); + pInstancedComponent->NumCustomDataFloats = featureSetCount; if (featureSetCount == 0) { return; } - for (const auto& idSet : featureIdSets) { + int32 numInstances = pInstancedComponent->GetInstanceCount(); + pInstancedComponent->PerInstanceSMCustomData.SetNum(featureSetCount * numInstances); + for (int32 j = 0; j < featureSetCount; ++j) { + for (int32 i = 0; i < numInstances; ++i) { + int64 featureId = UCesiumInstanceFeaturesBlueprintLibrary::GetFeatureIDFromInstance( + instanceFeatures, + i, + j); + pInstancedComponent->PerInstanceSMCustomData[i * featureSetCount + j] = + static_cast(featureId); + } } - } } // namespace diff --git a/Source/CesiumRuntime/Private/LoadGltfResult.h b/Source/CesiumRuntime/Private/LoadGltfResult.h index f35dfa2cd..08fe39236 100644 --- a/Source/CesiumRuntime/Private/LoadGltfResult.h +++ b/Source/CesiumRuntime/Private/LoadGltfResult.h @@ -206,8 +206,9 @@ struct LoadMeshResult { LoadMeshResult(const LoadMeshResult&) = delete; - LoadMeshResult(LoadMeshResult&& other) - : primitiveResults(std::move(other.primitiveResults)) {} + LoadMeshResult(LoadMeshResult&& other) { + primitiveResults.swap(other.primitiveResults); + } LoadMeshResult& operator=(LoadMeshResult&& other) { primitiveResults.swap(other.primitiveResults); @@ -226,8 +227,8 @@ struct LoadNodeResult { LoadNodeResult(const LoadNodeResult&) = delete; LoadNodeResult(LoadNodeResult&& other) - : InstanceTransforms(std::move(other.InstanceTransforms)), - pInstanceFeatures(std::move(other.pInstanceFeatures)) { + : pInstanceFeatures(std::move(other.pInstanceFeatures)) { + InstanceTransforms.swap(other.InstanceTransforms); meshResult.swap(other.meshResult); } diff --git a/extern/cesium-native b/extern/cesium-native index 3b3643517..cf5096faa 160000 --- a/extern/cesium-native +++ b/extern/cesium-native @@ -1 +1 @@ -Subproject commit 3b364351795b4c60d58f3ddba16526c56c317c9a +Subproject commit cf5096faa3e1a9da71645ef28a255df228eb97ef