diff --git a/Content/Maps/Demo.umap b/Content/Maps/Demo.umap index db5e6f7..0c0967f 100644 Binary files a/Content/Maps/Demo.umap and b/Content/Maps/Demo.umap differ diff --git a/Content/Res/Materials/M_VertexColor.uasset b/Content/Res/Materials/M_VertexColor.uasset index 12f1834..410bd7c 100644 Binary files a/Content/Res/Materials/M_VertexColor.uasset and b/Content/Res/Materials/M_VertexColor.uasset differ diff --git a/Source/BladeSmith/DynamicIronBlock.cpp b/Source/BladeSmith/DynamicIronBlock.cpp index 889e0b8..682d9b5 100644 --- a/Source/BladeSmith/DynamicIronBlock.cpp +++ b/Source/BladeSmith/DynamicIronBlock.cpp @@ -25,6 +25,7 @@ #include "RHIStaticStates.h" #include "ShaderCompilerCore.h" #include "ShaderCore.h" +#include "GeometryScript/MeshVertexColorFunctions.h" ADynamicIronBlock::ADynamicIronBlock() { @@ -831,62 +832,74 @@ void ADynamicIronBlock::UpdateVertexColors() return; } - // 修改网格以设置顶点颜色 - DynMesh->EditMesh([&](FDynamicMesh3& EditMesh) + // 准备颜色列表和调试信息 + TArray VertexColors; + int32 VertexCount = 0; + float MinTemp = FLT_MAX; + float MaxTemp = -FLT_MAX; + FLinearColor FirstVertexColor = FLinearColor::Black; + float FirstVertexTemp = 0.0f; + FVector FirstVertexPos = FVector::ZeroVector; + + // 读取网格以获取顶点信息并计算颜色 + DynMesh->ProcessMesh([&](const FDynamicMesh3& ReadMesh) { - // 确保网格启用了顶点颜色属性 - if (!EditMesh.HasVertexColors()) - { - EditMesh.EnableVertexColors(FVector3f::Zero()); // 初始化为黑色 - } + VertexCount = ReadMesh.MaxVertexID(); - // 遍历所有顶点 - int32 ColoredVertices = 0; - float MinTemp = FLT_MAX; - float MaxTemp = -FLT_MAX; - FVector3f FirstVertexColor = FVector3f::Zero(); - float FirstVertexTemp = 0.0f; - FVector FirstVertexPos = FVector::ZeroVector; + // 预分配颜色数组大小 + VertexColors.Reserve(VertexCount); - for (int32 VertexID : EditMesh.VertexIndicesItr()) + for (int32 VertexID = 0; VertexID < VertexCount; ++VertexID) { + if (!ReadMesh.IsVertex(VertexID)) + { + // 对于无效顶点,使用默认颜色 + VertexColors.Add(FLinearColor::Black); + continue; + } + // 获取顶点位置(局部坐标) - FVector3d VertexPos = EditMesh.GetVertex(VertexID); + FVector3d VertexPos = ReadMesh.GetVertex(VertexID); FVector VertexPosFloat(VertexPos.X, VertexPos.Y, VertexPos.Z); // 采样该位置的温度 - float Temperature = SampleTemperatureAtPosition(VertexPosFloat); - + //float Temperature = SampleTemperatureAtPosition(VertexPosFloat); + float Temperature = 900; // 统计温度范围 MinTemp = FMath::Min(MinTemp, Temperature); MaxTemp = FMath::Max(MaxTemp, Temperature); // 将温度转换为黑体辐射颜色 FLinearColor TempColor = TemperatureToColor(Temperature); + VertexColors.Add(TempColor); - // 设置顶点颜色(FDynamicMesh3使用FVector3f表示颜色,范围0-1) - FVector3f VertexColor = FVector3f(TempColor.R, TempColor.G, TempColor.B); - EditMesh.SetVertexColor(VertexID, VertexColor); - - // 记录第一个顶点的信息用于调试 - if (ColoredVertices == 0) + // 记录第一个有效顶点的信息用于调试 + if (VertexID == 0) { - FirstVertexColor = VertexColor; + FirstVertexColor = TempColor; FirstVertexTemp = Temperature; FirstVertexPos = VertexPosFloat; } - - ++ColoredVertices; } + }); - UE_LOG(LogTemp, Warning, TEXT("=== UpdateVertexColors Debug Info ===")); - UE_LOG(LogTemp, Warning, TEXT(" Total vertices: %d"), ColoredVertices); - UE_LOG(LogTemp, Warning, TEXT(" Temperature range: %.1f°C - %.1f°C"), MinTemp, MaxTemp); - UE_LOG(LogTemp, Warning, TEXT(" First vertex: Pos=(%.1f, %.1f, %.1f), Temp=%.1f°C, Color=(%.3f, %.3f, %.3f)"), - FirstVertexPos.X, FirstVertexPos.Y, FirstVertexPos.Z, - FirstVertexTemp, - FirstVertexColor.X, FirstVertexColor.Y, FirstVertexColor.Z); - }, EDynamicMeshChangeType::GeneralEdit, EDynamicMeshAttributeChangeFlags::Unknown, false); + // 创建 FGeometryScriptColorList 并关联颜色数组 + FGeometryScriptColorList ColorList; + ColorList.List = MakeShared>(MoveTemp(VertexColors)); + + // 使用 GeometryScript 设置顶点颜色 + UGeometryScriptLibrary_MeshVertexColorFunctions::SetMeshPerVertexColors( + DynMesh, + ColorList + ); + + UE_LOG(LogTemp, Warning, TEXT("=== UpdateVertexColors Debug Info ===")); + UE_LOG(LogTemp, Warning, TEXT(" Total vertices: %d"), VertexCount); + UE_LOG(LogTemp, Warning, TEXT(" Temperature range: %.1f°C - %.1f°C"), MinTemp, MaxTemp); + UE_LOG(LogTemp, Warning, TEXT(" First vertex: Pos=(%.1f, %.1f, %.1f), Temp=%.1f°C, Color=(%.3f, %.3f, %.3f)"), + FirstVertexPos.X, FirstVertexPos.Y, FirstVertexPos.Z, + FirstVertexTemp, + FirstVertexColor.R, FirstVertexColor.G, FirstVertexColor.B); // 通知组件网格已更新 DynMeshComp->NotifyMeshUpdated();