diff --git a/Source/BladeSmith/DynamicIronBlock.cpp b/Source/BladeSmith/DynamicIronBlock.cpp index 813a18b..67b2498 100644 --- a/Source/BladeSmith/DynamicIronBlock.cpp +++ b/Source/BladeSmith/DynamicIronBlock.cpp @@ -78,9 +78,9 @@ void ADynamicIronBlock::Tick(float DeltaTime) // 重置计时器 TimeSinceLastUpdate = 0.0f; - // 下载数据并更新顶点颜色(可选,性能开销较大) - // DownloadTemperatureDataFromGPU(); - // UpdateVertexColors(); + // 从GPU下载温度数据并更新顶点颜色 + DownloadTemperatureDataFromGPU(); + // 注意:UpdateVertexColors()会在DownloadTemperatureDataFromGPU的回调中异步调用 } } @@ -481,6 +481,61 @@ void ADynamicIronBlock::HeatRegion(FVector WorldCenter, float Radius, float Temp UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Heated %d voxels in region (center: %s, radius: %.2f)"), AffectedVoxels, *LocalCenter.ToString(), Radius); + // 调试:输出距离Hit点最近的4个体素的温度 + struct FVoxelDebugInfo + { + FIntVector Coord; + float Distance; + float Temperature; + }; + TArray NearestVoxels; + + // 查找最近的体素 + for (int32 Z = MinZ; Z <= MaxZ; ++Z) + { + for (int32 Y = MinY; Y <= MaxY; ++Y) + { + for (int32 X = MinX; X <= MaxX; ++X) + { + FVector VoxelCenter = GridOrigin + FVector( + (X + 0.5f) * VoxelSizeCM.X, + (Y + 0.5f) * VoxelSizeCM.Y, + (Z + 0.5f) * VoxelSizeCM.Z + ); + float Distance = FVector::Dist(VoxelCenter, LocalCenter); + + int32 Index = GetTemperatureIndex(X, Y, Z); + FVoxelDebugInfo Info; + Info.Coord = FIntVector(X, Y, Z); + Info.Distance = Distance; + Info.Temperature = TemperatureGrid[Index].Temperature; + + NearestVoxels.Add(Info); + } + } + } + + // 按距离排序 + NearestVoxels.Sort([](const FVoxelDebugInfo& A, const FVoxelDebugInfo& B) { + return A.Distance < B.Distance; + }); + + // 输出最近的4个体素 + UE_LOG(LogTemp, Warning, TEXT("=== Nearest 4 Voxels to Hit Point ===")); + for (int32 i = 0; i < FMath::Min(4, NearestVoxels.Num()); ++i) + { + const FVoxelDebugInfo& Info = NearestVoxels[i]; + UE_LOG(LogTemp, Warning, TEXT(" Voxel[%d,%d,%d] Distance=%.2fcm Temperature=%.1f°C"), + Info.Coord.X, Info.Coord.Y, Info.Coord.Z, Info.Distance, Info.Temperature); + } + + // 将更新后的温度数据上传到GPU + if (bGPUBuffersReady.load(std::memory_order_acquire)) + { + UploadTemperatureDataToGPU(); + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data uploaded to GPU after HeatRegion")); + } + // 更新顶点颜色以显示温度变化 UpdateVertexColors(); } @@ -848,6 +903,9 @@ void ADynamicIronBlock::DownloadTemperatureDataFromGPU() } UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data downloaded from GPU")); + + // 更新顶点颜色以反映新的温度 + UpdateVertexColors(); }); }); } diff --git a/Source/BladeSmith/DynamicIronBlock.h b/Source/BladeSmith/DynamicIronBlock.h index 8df2a11..48a841b 100644 --- a/Source/BladeSmith/DynamicIronBlock.h +++ b/Source/BladeSmith/DynamicIronBlock.h @@ -257,7 +257,7 @@ private: bool bUseBufferA = true; // Ping-Pong标志 float TimeSinceLastUpdate = 0.0f; // 距离上次温度更新的时间 - float TemperatureUpdateInterval = 0.1f; // 温度更新间隔(秒) + float TemperatureUpdateInterval = 1.0f; // 温度更新间隔(秒) // GPU缓冲区是否已准备好(线程安全标志) std::atomic bGPUBuffersReady{false};