diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index a88936e..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(\"E:\\MiceCola\\work\\UE_5_6\\Engine\\Build\\BatchFiles\\Build.bat\" BladeSmithEditor Win64 Development \"-Project=E:\\MiceCola\\work\\BladeSmith\\BladeSmith.uproject\" -WaitMutex -FromMsBuild)", - "Bash(dir:*)", - "Bash(git add:*)", - "Bash(git commit:*)", - "Skill(gsd:*)", - "Bash(findstr:*)", - "Bash(powershell:*)", - "Bash(Select-Object -Last 20)", - "WebSearch" - ], - "deny": [], - "ask": [] - }, - "outputStyle": "Explanatory" -} diff --git a/.claude/skills/session-namer.md b/.claude/skills/session-namer.md deleted file mode 100644 index f32ef3c..0000000 --- a/.claude/skills/session-namer.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -name: session-namer -description: 会话命名管理工具 - 在开始新任务前帮助命名或恢复会话 ---- - -# 会话命名管理 - -当您开始新的工作会话时,此技能帮助您管理会话命名。 - -## 当前会话状态 - -请检查是否需要命名当前会话: - -### 可用操作 - -1. **命名当前会话** - 使用命令: `/rename <会话名称>` - 例如: `/rename 实现各向异性形变` - -2. **恢复历史会话** - 使用命令: `/resume <会话名称>` - 或在 REPL 中使用: `/continue` - -3. **继续当前会话** - 如果不需要命名,直接开始工作即可 - -## BladeSmith 项目常用会话命名建议 - -基于项目结构,建议的会话命名模式: - -- **功能开发**: `feat-功能名称` (如 `feat-温度系统`) -- **Bug 修复**: `fix-问题描述` (如 `fix-边缘约束问题`) -- **代码重构**: `refactor-模块名称` (如 `refactor-GPU着色器`) -- **性能优化**: `perf-优化目标` (如 `perf-网格简化`) -- **文档编写**: `docs-文档主题` (如 `docs-API文档`) -- **测试相关**: `test-测试内容` (如 `test-形变系统`) - -## 最近的 Git 分支作为参考 - -当前分支: hammer-deformation-phase1 - -如果需要查看更多分支或上下文,我可以帮您: -- 列出最近的 git 分支 -- 查看最近的提交历史 -- 查看未完成的工作 - ---- - -**是否需要我帮助您命名当前会话?** 请告诉我您计划做什么,或者直接使用 `/rename` 命令。 diff --git a/.gitignore b/.gitignore index 8b6821d..2146b09 100644 --- a/.gitignore +++ b/.gitignore @@ -74,4 +74,33 @@ Plugins/**/Intermediate/* # Cache files for the editor to use DerivedDataCache/* -nul \ No newline at end of file +nul + +# ==================== AI/agent 工具配置与缓存 (机器相关,不入库) ==================== +.claude/ +.codex/ +.cursor/ +.gemini/ +.codegraph/ +.planning/ +.omo/run-continuation/ + +# graphify 技能缓存 +.graphify_python +.graphify_uncached.txt +.ignore +graphify-out/ +Source/BladeSmith/graphify-out/ + +# IDE 生成缓存 +.vsconfig +.vscode/compileCommands_*/ +.vscode/compileCommands_*.json +.vscode/compile_commands.json +BladeSmith.code-workspace + +# MCP 配置 (改用 opencode.json) +.mcp.json + +# 构建日志 +upgrade_build.log \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..3588e55 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,11 @@ +{ + "configurations": [ + { + "name": "Win32", + "cStandard": "c17", + "cppStandard": "c++20", + "intelliSenseMode": "msvc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 0000000..9b2bd52 --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,10 @@ +{ + "servers": + { + "unreal-mcp": + { + "type": "http", + "url": "http://127.0.0.1:8000/mcp" + } + } +} \ No newline at end of file diff --git a/.vsconfig b/.vsconfig deleted file mode 100644 index 3b919ea..0000000 --- a/.vsconfig +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "components": [ - "Component.Unreal.Debugger", - "Component.Unreal.Ide", - "Microsoft.Net.Component.4.6.2.TargetingPack", - "Microsoft.VisualStudio.Component.VC.14.38.17.8.ATL", - "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64", - "Microsoft.VisualStudio.Component.VC.Llvm.Clang", - "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", - "Microsoft.VisualStudio.Component.Windows11SDK.22621", - "Microsoft.VisualStudio.Workload.CoreEditor", - "Microsoft.VisualStudio.Workload.ManagedDesktop", - "Microsoft.VisualStudio.Workload.NativeDesktop", - "Microsoft.VisualStudio.Workload.NativeGame" - ] -} diff --git a/BladeSmith.uproject b/BladeSmith.uproject index 6bd0476..ceef631 100644 --- a/BladeSmith.uproject +++ b/BladeSmith.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "5.6", + "EngineAssociation": "{91698CCB-4566-3FC8-DE61-969023373C2D}", "Category": "", "Description": "", "Modules": [ @@ -28,6 +28,30 @@ { "Name": "HDRIBackdrop", "Enabled": true + }, + { + "Name": "GeometryProcessing", + "Enabled": true + }, + { + "Name": "MeshModelingToolset", + "Enabled": true + }, + { + "Name": "RiderLink", + "Enabled": false + }, + { + "Name": "MCPClientToolset", + "Enabled": true + }, + { + "Name": "ModelContextProtocol", + "Enabled": true + }, + { + "Name": "AllToolsets", + "Enabled": true } ] } \ No newline at end of file diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 7d9b4b1..c12d649 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -39,6 +39,7 @@ r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 r.DefaultFeature.AutoExposure=False r.Lumen.TraceMeshSDFs=1 +r.Substrate=False [/Script/WindowsTargetPlatform.WindowsTargetSettings] DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 diff --git a/Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h b/Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h index 468a0c4..b63ed1a 100644 --- a/Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h +++ b/Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h @@ -50,8 +50,7 @@ extern FThreadSafeDeformationParams GDeformationParams; class MICESHADERS_API FDeformComputeShader : public FGlobalShader { DECLARE_GLOBAL_SHADER(FDeformComputeShader); - SHADER_USE_PARAMETER_STRUCT(FDeformComputeShader, FGlobalShader); - + BEGIN_SHADER_PARAMETER_STRUCT(FParameters, ) // 碰撞参数 SHADER_PARAMETER(FVector3f, ImpactPoint) diff --git a/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h b/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h index f7bf1f0..8f16e7f 100644 --- a/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h +++ b/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h @@ -60,7 +60,6 @@ extern MICESHADERS_API FThreadSafeTemperatureParams GTemperatureParams; class MICESHADERS_API FTemperatureComputeShader : public FGlobalShader { DECLARE_GLOBAL_SHADER(FTemperatureComputeShader); - SHADER_USE_PARAMETER_STRUCT(FTemperatureComputeShader, FGlobalShader); BEGIN_SHADER_PARAMETER_STRUCT(FParameters, ) // 体素网格参数 diff --git a/Source/BladeSmith.Target.cs b/Source/BladeSmith.Target.cs index be02ca5..883f6cc 100644 --- a/Source/BladeSmith.Target.cs +++ b/Source/BladeSmith.Target.cs @@ -8,8 +8,9 @@ public class BladeSmithTarget : TargetRules public BladeSmithTarget(TargetInfo Target) : base(Target) { Type = TargetType.Game; - DefaultBuildSettings = BuildSettingsVersion.V5; - IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5; + DefaultBuildSettings = BuildSettingsVersion.V7; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_8; + CppStandard = CppStandardVersion.Cpp20; ExtraModuleNames.Add("BladeSmith"); } } diff --git a/Source/BladeSmith/DeformAsyncTask.cpp b/Source/BladeSmith/DeformAsyncTask.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/BladeSmith/DynamicIronBlock.cpp b/Source/BladeSmith/DynamicIronBlock.cpp index 17491bc..1cd1805 100644 --- a/Source/BladeSmith/DynamicIronBlock.cpp +++ b/Source/BladeSmith/DynamicIronBlock.cpp @@ -955,8 +955,7 @@ void ADynamicIronBlock::UpdateVertexColors() FVector VertexPosFloat(VertexPos.X, VertexPos.Y, VertexPos.Z); // 采样该位置的温度 - //float Temperature = SampleTemperatureAtPosition(VertexPosFloat); - float Temperature = 900; + float Temperature = SampleTemperatureAtPosition(VertexPosFloat); // 统计温度范围 MinTemp = FMath::Min(MinTemp, Temperature); MaxTemp = FMath::Max(MaxTemp, Temperature); @@ -1294,6 +1293,14 @@ void ADynamicIronBlock::DispatchTemperatureCompute(float DeltaTime) return; } + // 验证其他缓冲区 + if (!PlasticityBuffer.IsValid() || !SurfaceVoxelFlagsBuffer.IsValid()) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Plasticity or Flags buffer not valid! P=%d F=%d"), + PlasticityBuffer.IsValid(), SurfaceVoxelFlagsBuffer.IsValid()); + return; + } + // 准备调度参数(捕获到lambda中) FIntVector Resolution = TemperatureResolution; float Conductivity = ThermalConductivity; @@ -1305,16 +1312,17 @@ void ADynamicIronBlock::DispatchTemperatureCompute(float DeltaTime) UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Dispatching temperature compute - Resolution=(%d,%d,%d), DeltaTime=%.4f"), Resolution.X, Resolution.Y, Resolution.Z, DeltaTime); - // Ping-Pong缓冲区引用(捕获到lambda传递给RDG) - FBufferRHIRef InputBuffer = bUseBufferA ? TemperatureBufferA : TemperatureBufferB; - FBufferRHIRef OutputBuffer = bUseBufferA ? TemperatureBufferB : TemperatureBufferA; + // Ping-Pong缓冲区引用(捕获到lambda传递给渲染线程) + const bool bCurrentBufferA = bUseBufferA; + FBufferRHIRef InputBuffer = bCurrentBufferA ? TemperatureBufferA : TemperatureBufferB; + FBufferRHIRef OutputBuffer = bCurrentBufferA ? TemperatureBufferB : TemperatureBufferA; FBufferRHIRef FlagsBuffer = SurfaceVoxelFlagsBuffer; FBufferRHIRef PlasticityBuf = PlasticityBuffer; // 切换缓冲区(下次Tick使用新的缓冲区) bUseBufferA = !bUseBufferA; - // 调度GPU计算(使用RDG正确的资源管理) + // 调度GPU计算(UE5.8已移除手动RHI Compute dispatch API,改用RDG) ENQUEUE_RENDER_COMMAND(DispatchTemperatureCS)( [Resolution, Conductivity, Cooling, Ambient, ForgeMin, ForgeMax, DeltaTime, InputBuffer, OutputBuffer, FlagsBuffer, PlasticityBuf] @@ -1336,48 +1344,47 @@ void ADynamicIronBlock::DispatchTemperatureCompute(float DeltaTime) return; } - UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: Shader valid, creating RDG...")); + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: Shader valid, setting up RDG compute dispatch...")); - // 使用RDG - FRDGBuilder GraphBuilder(RHICmdList, RDG_EVENT_NAME("TemperatureConduction")); + // 构建RDG图 + FRDGBuilder GraphBuilder(RHICmdList); - // 将外部RHI缓冲区正确注册到RDG系统 - // 创建缓冲区描述符 - const uint32 NumElements = InputBuffer->GetSize() / sizeof(float); - FRDGBufferDesc TempBufferDesc = FRDGBufferDesc::CreateBufferDesc(sizeof(float), NumElements); - FRDGBufferDesc FlagsBufferDesc = FRDGBufferDesc::CreateBufferDesc(sizeof(uint32), NumElements); + // 将外部裸RHI缓冲区包装为FRDGPooledBuffer后注册到RDG + //(UE5.8的RegisterExternalBuffer只接受FRDGPooledBuffer,不再接受裸FBufferRHIRef) + auto WrapExternalBuffer = [&GraphBuilder](FBufferRHIRef RawBuffer, const TCHAR* Name) -> FRDGBufferRef + { + // 所有缓冲区均为4字节typed元素(float温度/塑性 或 uint体素标志) + const uint32 BytesPerElement = sizeof(float); + const uint32 NumElements = RawBuffer->GetSize() / BytesPerElement; + FRDGBufferDesc Desc = FRDGBufferDesc::CreateBufferDesc(BytesPerElement, NumElements); + TRefCountPtr PooledBuffer = new FRDGPooledBuffer(RawBuffer, Desc, NumElements, Name); + return GraphBuilder.RegisterExternalBuffer(PooledBuffer); + }; - // 创建FRDGPooledBuffer并注册 - TRefCountPtr InputPooledBuffer = new FRDGPooledBuffer(RHICmdList, InputBuffer, TempBufferDesc, NumElements, TEXT("InputTemperatureBuffer")); - TRefCountPtr OutputPooledBuffer = new FRDGPooledBuffer(RHICmdList, OutputBuffer, TempBufferDesc, NumElements, TEXT("OutputTemperatureBuffer")); - TRefCountPtr FlagsPooledBuffer = new FRDGPooledBuffer(RHICmdList, FlagsBuffer, FlagsBufferDesc, NumElements, TEXT("SurfaceVoxelFlagsBuffer")); - TRefCountPtr PlasticityPooledBuffer = new FRDGPooledBuffer(RHICmdList, PlasticityBuf, TempBufferDesc, NumElements, TEXT("PlasticityBuffer")); + FRDGBufferRef InputRDG = WrapExternalBuffer(InputBuffer, TEXT("InputTemperature")); + FRDGBufferRef OutputRDG = WrapExternalBuffer(OutputBuffer, TEXT("OutputTemperature")); + FRDGBufferRef FlagsRDG = WrapExternalBuffer(FlagsBuffer, TEXT("SurfaceVoxelFlags")); + FRDGBufferRef PlasticityRDG = WrapExternalBuffer(PlasticityBuf, TEXT("Plasticity")); - FRDGBufferRef InputTempRDG = GraphBuilder.RegisterExternalBuffer(InputPooledBuffer); - FRDGBufferRef OutputTempRDG = GraphBuilder.RegisterExternalBuffer(OutputPooledBuffer); - FRDGBufferRef FlagsRDG = GraphBuilder.RegisterExternalBuffer(FlagsPooledBuffer); - FRDGBufferRef PlasticityRDG = GraphBuilder.RegisterExternalBuffer(PlasticityPooledBuffer); + // 通过RDG创建SRV/UAV(格式必须与缓冲区创建时一致:温度/塑性=PF_R32_FLOAT,体素标志=PF_R32_UINT) + FRDGBufferSRV* InputTempSRV = GraphBuilder.CreateSRV(FRDGBufferSRVDesc(InputRDG, PF_R32_FLOAT)); + FRDGBufferSRV* FlagsSRV = GraphBuilder.CreateSRV(FRDGBufferSRVDesc(FlagsRDG, PF_R32_UINT)); + FRDGBufferUAV* OutputTempUAV = GraphBuilder.CreateUAV(FRDGBufferUAVDesc(OutputRDG, PF_R32_FLOAT)); + FRDGBufferUAV* OutputPlasticityUAV = GraphBuilder.CreateUAV(FRDGBufferUAVDesc(PlasticityRDG, PF_R32_FLOAT)); - - UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: External RHI buffers registered to RDG, setting shader parameters...")); - - // 设置Shader参数 - FTemperatureComputeShader::FParameters* PassParameters = GraphBuilder.AllocParameters(); - PassParameters->VoxelResolution = Resolution; - PassParameters->ThermalConductivity = Conductivity; - PassParameters->CoolingRate = Cooling; - PassParameters->AmbientTemperature = Ambient; - PassParameters->ForgeTemperatureMin = ForgeMin; - PassParameters->ForgeTemperatureMax = ForgeMax; - PassParameters->DeltaTime = DeltaTime; - - // 创建SRV和UAV(使用正确注册的RDG资源) - PassParameters->InputTemperatureBuffer = GraphBuilder.CreateSRV(FRDGBufferSRVDesc(InputTempRDG, PF_R32_FLOAT)); - PassParameters->SurfaceVoxelFlagsBuffer = GraphBuilder.CreateSRV(FRDGBufferSRVDesc(FlagsRDG, PF_R32_UINT)); - PassParameters->OutputTemperatureBuffer = GraphBuilder.CreateUAV(FRDGBufferUAVDesc(OutputTempRDG, PF_R32_FLOAT)); - PassParameters->OutputPlasticityBuffer = GraphBuilder.CreateUAV(FRDGBufferUAVDesc(PlasticityRDG, PF_R32_FLOAT)); - - UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: Shader parameters set, calculating group count...")); + // 分配并填充参数(RDG参数指针由GraphBuilder托管生命周期) + FTemperatureComputeShader::FParameters* Parameters = GraphBuilder.AllocParameters(); + Parameters->VoxelResolution = Resolution; + Parameters->ThermalConductivity = Conductivity; + Parameters->CoolingRate = Cooling; + Parameters->AmbientTemperature = Ambient; + Parameters->ForgeTemperatureMin = ForgeMin; + Parameters->ForgeTemperatureMax = ForgeMax; + Parameters->DeltaTime = DeltaTime; + Parameters->InputTemperatureBuffer = InputTempSRV; + Parameters->SurfaceVoxelFlagsBuffer = FlagsSRV; + Parameters->OutputTemperatureBuffer = OutputTempUAV; + Parameters->OutputPlasticityBuffer = OutputPlasticityUAV; // 计算线程组数量 FIntVector GroupSize = FTemperatureComputeShader::GetGroupSize(); @@ -1387,21 +1394,24 @@ void ADynamicIronBlock::DispatchTemperatureCompute(float DeltaTime) FMath::DivideAndRoundUp(Resolution.Z, GroupSize.Z) ); - UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: GroupCount=(%d,%d,%d), adding compute pass..."), + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: GroupCount=(%d,%d,%d), dispatching..."), GroupCount.X, GroupCount.Y, GroupCount.Z); - // 添加计算Pass - FComputeShaderUtils::AddPass( - GraphBuilder, - RDG_EVENT_NAME("TemperatureConduction"), - ComputeShader, - PassParameters, - GroupCount - ); + // 添加Compute Pass并调度(RDG自动处理资源状态转换与屏障) + GraphBuilder.AddPass( + RDG_EVENT_NAME("TemperatureCompute"), + Parameters, + ERDGPassFlags::Compute, + [ComputeShader, Parameters, GroupCount](FRHIComputeCommandList& CommandList) + { + FComputeShaderUtils::Dispatch( + CommandList, + ComputeShader, + *Parameters, + GroupCount); + }); - UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock [RenderThread]: Compute pass added, executing RDG...")); - - // 执行RDG,自动处理资源转换和同步 + // 执行RDG图(编译并提交到RHI命令列表) GraphBuilder.Execute(); UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature compute dispatched successfully (%d x %d x %d groups)"), diff --git a/Source/BladeSmithEditor.Target.cs b/Source/BladeSmithEditor.Target.cs index cf07111..d131f80 100644 --- a/Source/BladeSmithEditor.Target.cs +++ b/Source/BladeSmithEditor.Target.cs @@ -8,8 +8,9 @@ public class BladeSmithEditorTarget : TargetRules public BladeSmithEditorTarget(TargetInfo Target) : base(Target) { Type = TargetType.Editor; - DefaultBuildSettings = BuildSettingsVersion.V5; - IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5; + DefaultBuildSettings = BuildSettingsVersion.V7; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_8; + CppStandard = CppStandardVersion.Cpp20; ExtraModuleNames.Add("BladeSmith"); } } diff --git a/opencode.json b/opencode.json new file mode 100644 index 0000000..ffe941f --- /dev/null +++ b/opencode.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://opencode.ai/config.json", + "mcp": { + "unreal-mcp": { + "type": "remote", + "url": "http://127.0.0.1:8000/mcp", + "enabled": true + } + } +}