From bfb9be225639904062cca8474afc1cd3e6909d23 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Fri, 23 Jan 2026 22:41:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=A1=B6=E7=82=B9?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=B1=82=E5=9F=BA=E7=A1=80=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=92=8C=E5=90=84=E5=90=91=E5=BC=82=E6=80=A7=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Task 1: 添加顶点属性层基础结构 - 在头文件中添加顶点属性数组声明 - 添加 InitializeVertexAttributes() 和 ReleaseVertexAttributes() 函数 - 在 InitializeBoxMesh() 中调用初始化 - 在 EndPlay() 中调用释放 - Task 2: 实现顶点属性初始化 - 实现 InitializeVertexAttributes() 函数 - 实现 ReleaseVertexAttributes() 函数 - 使用简单数组存储顶点属性(初始位置、累积应变、硬度系数、打磨度) - Task 3: 添加各向异性流动参数 - 添加 AnisotropyRatio 参数(各向异性比) - 添加 bEnableEdgeConstraint 参数(边缘约束开关) - 添加 EdgeThreshold 参数(边缘阈值) Co-Authored-By: Claude Sonnet 4.5 --- Source/BladeSmith/DynamicIronBlock.cpp | 72 ++++++++++++++++++++++++++ Source/BladeSmith/DynamicIronBlock.h | 34 ++++++++++++ 2 files changed, 106 insertions(+) diff --git a/Source/BladeSmith/DynamicIronBlock.cpp b/Source/BladeSmith/DynamicIronBlock.cpp index 682d9b5..53aa915 100644 --- a/Source/BladeSmith/DynamicIronBlock.cpp +++ b/Source/BladeSmith/DynamicIronBlock.cpp @@ -116,6 +116,9 @@ void ADynamicIronBlock::Tick(float DeltaTime) void ADynamicIronBlock::EndPlay(const EEndPlayReason::Type EndPlayReason) { + // 释放顶点属性层 + ReleaseVertexAttributes(); + // 释放GPU缓冲区 ReleaseGPUBuffers(); @@ -234,6 +237,9 @@ void ADynamicIronBlock::InitializeBoxMesh() UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Initial vertex colors set based on ambient temperature")); } + // 初始化顶点属性层 + InitializeVertexAttributes(); + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Box mesh initialized with size (%f, %f, %f)"), BoxSize.X, BoxSize.Y, BoxSize.Z); } @@ -1295,3 +1301,69 @@ void ADynamicIronBlock::DispatchTemperatureCompute(float DeltaTime) GroupCount.X, GroupCount.Y, GroupCount.Z); }); } + +// ========== 顶点属性层实现(阶段1) ========== + +void ADynamicIronBlock::InitializeVertexAttributes() +{ + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent for vertex attributes")); + return; + } + + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh for vertex attributes")); + return; + } + + // 读取网格以访问底层数据 + DynMesh->ProcessMesh([&](const FDynamicMesh3& ReadMesh) + { + // 获取顶点数量 + int32 VertexCount = ReadMesh.MaxVertexID(); + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Initializing vertex attributes for %d vertices"), VertexCount); + + // 预分配数组空间 + InitialPositionsArray.SetNumZeroed(VertexCount); + AccumulatedStrainArray.SetNumZeroed(VertexCount); + HardnessCoefficientArray.SetNumZeroed(VertexCount); + PolishAmountArray.SetNumZeroed(VertexCount); + + // 初始化所有顶点的属性值 + for (int32 VertexID : ReadMesh.VertexIndicesItr()) + { + FVector3d VertexPos = ReadMesh.GetVertex(VertexID); + + // 初始位置 = 当前位置 + InitialPositionsArray[VertexID] = FVector3f(VertexPos.X, VertexPos.Y, VertexPos.Z); + + // 累积应变 = 0 + AccumulatedStrainArray[VertexID] = 0.0f; + + // 硬度系数 = 1.0 (未硬化) + HardnessCoefficientArray[VertexID] = 1.0f; + + // 打磨度 = 0.2 (轻微生锈) + PolishAmountArray[VertexID] = 0.2f; + } + + bVertexAttributesInitialized = true; + }); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Vertex attributes initialized successfully")); +} + +void ADynamicIronBlock::ReleaseVertexAttributes() +{ + InitialPositionsArray.Empty(); + AccumulatedStrainArray.Empty(); + HardnessCoefficientArray.Empty(); + PolishAmountArray.Empty(); + bVertexAttributesInitialized = false; + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Vertex attributes released")); +} diff --git a/Source/BladeSmith/DynamicIronBlock.h b/Source/BladeSmith/DynamicIronBlock.h index 5c5b391..6ea8fdb 100644 --- a/Source/BladeSmith/DynamicIronBlock.h +++ b/Source/BladeSmith/DynamicIronBlock.h @@ -74,6 +74,18 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties") float BulgeStrength = 0.5f; + // 各向异性比(主方向/次方向流动强度比,1.0=均匀,>1.0=方向性) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties", meta = (ClampMin = "1.0", ClampMax = "10.0")) + float AnisotropyRatio = 3.0f; + + // 是否启用边缘约束 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties") + bool bEnableEdgeConstraint = false; + + // 边缘阈值(cm)- 用于检测边缘顶点 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties", meta = (ClampMin = "0.1", ClampMax = "5.0")) + float EdgeThreshold = 0.5f; + // ========== 温度系统参数 ========== // 温度体素大小(毫米) @@ -278,6 +290,28 @@ private: */ void UpdateVertexColors(); + // ========== 顶点属性层(阶段1) ========== + + // 顶点属性存储 - 使用简单数组存储,避免复杂的模板前向声明 + // 这些数组在网格初始化时创建,索引与顶点ID对应 + TArray InitialPositionsArray; // 初始位置(不变,用于无漂移纹理采样) + TArray AccumulatedStrainArray; // 累积塑性应变 + TArray HardnessCoefficientArray; // 硬度系数(影响形变阻力) + TArray PolishAmountArray; // 打磨度(0=生锈,1=光亮) + + // 标志位:顶点属性是否已初始化 + bool bVertexAttributesInitialized = false; + + /** + * 初始化顶点属性层 + */ + void InitializeVertexAttributes(); + + /** + * 释放顶点属性层 + */ + void ReleaseVertexAttributes(); + // ========== GPU计算系统(Phase 2) ========== // GPU缓冲区(Ping-Pong双缓冲)