diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..c56e8d0 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(\"C:\\Program Files\\Epic Games\\UE_5.4\\Engine\\Build\\BatchFiles\\Build.bat\" BladeSmithEditor Win64 Development -Project=\"E:\\MiceCola\\work\\BladeSmith\\BladeSmith.uproject\" -WaitMutex -FromMsBuild)", + "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(\"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 -m \"$(cat <<''EOF''\n实现DynamicIronBlock温度体素系统基础功能\n\n新增功能:\n- 添加FTemperatureVoxel结构体(温度、塑性系数、表面标志)\n- 实现自适应温度网格(5mm体素精度,基于BoxSize计算分辨率)\n- 实现三线性插值温度/塑性系数采样\n- 实现黑体辐射温度可视化(顶点颜色)\n- 添加HeatRegion蓝图测试函数\n- 添加OnHammerImpact锤击形变函数(体积守恒)\n\n技术细节:\n- Phase 1: CPU侧温度网格初始化,支持10cm-100cm+可变尺寸\n- Phase 3: 温度可视化系统(20°C灰色 → 1200°C白色)\n- 内存占用:30×30×30cm ≈ 1.7MB(60×60×60体素)\n\n待实现:Phase 2 GPU热传导计算\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \nEOF\n)\")" + ], + "deny": [], + "ask": [] + } +} diff --git a/BladeSmith.sln.DotSettings.user b/BladeSmith.sln.DotSettings.user new file mode 100644 index 0000000..7b4f914 --- /dev/null +++ b/BladeSmith.sln.DotSettings.user @@ -0,0 +1,10 @@ + + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/Content/BP/BP_DynamicMetal.uasset b/Content/BP/BP_DynamicMetal.uasset new file mode 100644 index 0000000..a3fb141 Binary files /dev/null and b/Content/BP/BP_DynamicMetal.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Attack_01.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Attack_01.uasset new file mode 100644 index 0000000..e2c90e0 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Attack_01.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Attack_02.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Attack_02.uasset new file mode 100644 index 0000000..995c3ab Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Attack_02.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Attack_03.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Attack_03.uasset new file mode 100644 index 0000000..1231605 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Attack_03.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Bwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Bwd.uasset new file mode 100644 index 0000000..eea9fa2 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_BwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_BwdLeft.uasset new file mode 100644 index 0000000..451d6cc Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_BwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_BwdRight.uasset new file mode 100644 index 0000000..657cc7a Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Fwd.uasset new file mode 100644 index 0000000..fa9f211 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_FwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_FwdLeft.uasset new file mode 100644 index 0000000..dc78928 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_FwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_FwdRight.uasset new file mode 100644 index 0000000..c3aa2e0 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Left.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Left.uasset new file mode 100644 index 0000000..62078a3 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Right.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Right.uasset new file mode 100644 index 0000000..5a48358 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Bwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Bwd.uasset new file mode 100644 index 0000000..d82f715 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Bwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_BwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_BwdLeft.uasset new file mode 100644 index 0000000..6a432d1 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_BwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_BwdRight.uasset new file mode 100644 index 0000000..32f4783 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Fwd.uasset new file mode 100644 index 0000000..45e5fbd Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_FwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_FwdLeft.uasset new file mode 100644 index 0000000..031d669 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_FwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_FwdRight.uasset new file mode 100644 index 0000000..ba40337 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Left.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Left.uasset new file mode 100644 index 0000000..a50b67b Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Left.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Right.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Right.uasset new file mode 100644 index 0000000..7127f47 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Crouch_Right.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Death.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Death.uasset new file mode 100644 index 0000000..4fc2320 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Death.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Bwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Bwd.uasset new file mode 100644 index 0000000..4b321fb Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Fwd.uasset new file mode 100644 index 0000000..b890f09 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Left.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Left.uasset new file mode 100644 index 0000000..7a524ec Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Right.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Right.uasset new file mode 100644 index 0000000..16e1919 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Bwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Bwd.uasset new file mode 100644 index 0000000..fefae08 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Bwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Fwd.uasset new file mode 100644 index 0000000..54f4567 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Left.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Left.uasset new file mode 100644 index 0000000..c5370b9 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Left.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Hit_Right.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Right.uasset new file mode 100644 index 0000000..71688b6 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Hit_Right.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Idle.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Idle.uasset new file mode 100644 index 0000000..a44b4be Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Idle.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Idle_Alert.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Idle_Alert.uasset new file mode 100644 index 0000000..2aaddea Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Idle_Alert.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_Fwd.uasset new file mode 100644 index 0000000..4a16112 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_FwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_FwdLeft.uasset new file mode 100644 index 0000000..b9b3210 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_FwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_FwdRight.uasset new file mode 100644 index 0000000..916819e Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Run_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Run_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Run_Fwd.uasset new file mode 100644 index 0000000..2bfe4c7 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Run_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Run_FwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Run_FwdLeft.uasset new file mode 100644 index 0000000..02b25fa Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Run_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Run_FwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Run_FwdRight.uasset new file mode 100644 index 0000000..4287dd5 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Run_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Bwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Bwd.uasset new file mode 100644 index 0000000..8aa7e50 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_BwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_BwdLeft.uasset new file mode 100644 index 0000000..9e71de0 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_BwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_BwdRight.uasset new file mode 100644 index 0000000..bfeca07 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Fwd.uasset new file mode 100644 index 0000000..6bc15fc Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_FwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_FwdLeft.uasset new file mode 100644 index 0000000..743a737 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_FwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_FwdRight.uasset new file mode 100644 index 0000000..8fb6833 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Left.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Left.uasset new file mode 100644 index 0000000..20659a5 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Right.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Right.uasset new file mode 100644 index 0000000..73f29ce Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Bwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Bwd.uasset new file mode 100644 index 0000000..c875b2f Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Bwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_BwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_BwdLeft.uasset new file mode 100644 index 0000000..731f53d Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_BwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_BwdRight.uasset new file mode 100644 index 0000000..f67cf66 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Fwd.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Fwd.uasset new file mode 100644 index 0000000..1f40b9a Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Fwd.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_FwdLeft.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_FwdLeft.uasset new file mode 100644 index 0000000..3b7e283 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_FwdRight.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_FwdRight.uasset new file mode 100644 index 0000000..5d259ca Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Left.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Left.uasset new file mode 100644 index 0000000..a84af27 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Left.uasset differ diff --git a/Content/Dark_Knight/Animations/Anim_DKM_Walk_Right.uasset b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Right.uasset new file mode 100644 index 0000000..6476968 Binary files /dev/null and b/Content/Dark_Knight/Animations/Anim_DKM_Walk_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_01.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_01.uasset new file mode 100644 index 0000000..4c8b9ea Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_02.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_02.uasset new file mode 100644 index 0000000..61acd4f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_02.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_03.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_03.uasset new file mode 100644 index 0000000..0318ff0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Attack_03.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Bwd.uasset new file mode 100644 index 0000000..c2d10bc Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_BwdLeft.uasset new file mode 100644 index 0000000..02f006f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_BwdRight.uasset new file mode 100644 index 0000000..69128ce Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Fwd.uasset new file mode 100644 index 0000000..fe8b0a3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_FwdLeft.uasset new file mode 100644 index 0000000..165c766 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_FwdRight.uasset new file mode 100644 index 0000000..58fcc52 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Left.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Left.uasset new file mode 100644 index 0000000..0356d11 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Right.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Right.uasset new file mode 100644 index 0000000..eaedb57 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Bwd.uasset new file mode 100644 index 0000000..5678e35 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_BwdLeft.uasset new file mode 100644 index 0000000..2a19d1d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_BwdRight.uasset new file mode 100644 index 0000000..f1e11fb Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Fwd.uasset new file mode 100644 index 0000000..b5aea28 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_FwdLeft.uasset new file mode 100644 index 0000000..7b0324e Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_FwdRight.uasset new file mode 100644 index 0000000..bc36615 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Left.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Left.uasset new file mode 100644 index 0000000..5b79da6 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Right.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Right.uasset new file mode 100644 index 0000000..d9d484d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Crouch_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Death.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Death.uasset new file mode 100644 index 0000000..2c02654 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Death.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Bwd.uasset new file mode 100644 index 0000000..438dd27 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Fwd.uasset new file mode 100644 index 0000000..95782a3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Left.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Left.uasset new file mode 100644 index 0000000..7240a1d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Right.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Right.uasset new file mode 100644 index 0000000..ab034cf Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Bwd.uasset new file mode 100644 index 0000000..01b2e55 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Fwd.uasset new file mode 100644 index 0000000..73beb40 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Left.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Left.uasset new file mode 100644 index 0000000..44d6097 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Right.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Right.uasset new file mode 100644 index 0000000..12a010f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Hit_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Idle.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Idle.uasset new file mode 100644 index 0000000..cd6e935 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Idle.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Idle_Alert.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Idle_Alert.uasset new file mode 100644 index 0000000..925e07c Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Idle_Alert.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_Fwd.uasset new file mode 100644 index 0000000..4c13e3d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_FwdLeft.uasset new file mode 100644 index 0000000..edeadcd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_FwdRight.uasset new file mode 100644 index 0000000..4ec1df4 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Fwd.uasset new file mode 100644 index 0000000..1488687 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_FwdLeft.uasset new file mode 100644 index 0000000..971c4d9 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_FwdRight.uasset new file mode 100644 index 0000000..43eb2aa Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Run_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Bwd.uasset new file mode 100644 index 0000000..b41924e Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_BwdLeft.uasset new file mode 100644 index 0000000..dacabed Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_BwdRight.uasset new file mode 100644 index 0000000..94a8b17 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Fwd.uasset new file mode 100644 index 0000000..2200226 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_FwdLeft.uasset new file mode 100644 index 0000000..79b8baa Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_FwdRight.uasset new file mode 100644 index 0000000..2ebeb75 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Left.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Left.uasset new file mode 100644 index 0000000..3cbf77d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Right.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Right.uasset new file mode 100644 index 0000000..2a3ca38 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Bwd.uasset new file mode 100644 index 0000000..538d266 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_BwdLeft.uasset new file mode 100644 index 0000000..f0258ed Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_BwdRight.uasset new file mode 100644 index 0000000..3ae4174 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Fwd.uasset new file mode 100644 index 0000000..bdcb0aa Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_FwdLeft.uasset new file mode 100644 index 0000000..94f98ce Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_FwdRight.uasset new file mode 100644 index 0000000..63b31f0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Left.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Left.uasset new file mode 100644 index 0000000..567ee92 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Right.uasset b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Right.uasset new file mode 100644 index 0000000..71e435d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Animations/Anim_DKF_Walk_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Demo/Studio/M_Floor.uasset b/Content/Dark_Knight/Dark_Knight_Female/Demo/Studio/M_Floor.uasset new file mode 100644 index 0000000..cb8e6bf Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Demo/Studio/M_Floor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Demo/Studio/SM_Stand.uasset b/Content/Dark_Knight/Dark_Knight_Female/Demo/Studio/SM_Stand.uasset new file mode 100644 index 0000000..178a446 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Demo/Studio/SM_Stand.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Maps/Demonstration.umap b/Content/Dark_Knight/Dark_Knight_Female/Maps/Demonstration.umap new file mode 100644 index 0000000..1dbd7b3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Maps/Demonstration.umap differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Maps/Preview.umap b/Content/Dark_Knight/Dark_Knight_Female/Maps/Preview.umap new file mode 100644 index 0000000..7d5644d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Maps/Preview.umap differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Add_Blend_Scalar.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Add_Blend_Scalar.uasset new file mode 100644 index 0000000..a9f4385 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Add_Blend_Scalar.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Add_Blend_Vector3.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Add_Blend_Vector3.uasset new file mode 100644 index 0000000..bab2ac1 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Add_Blend_Vector3.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Multiply_Blend_Scalar.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Multiply_Blend_Scalar.uasset new file mode 100644 index 0000000..1d823b2 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Multiply_Blend_Scalar.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Multiply_Blend_Vector3.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Multiply_Blend_Vector3.uasset new file mode 100644 index 0000000..3968651 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Multiply_Blend_Vector3.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Rotate2D.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Rotate2D.uasset new file mode 100644 index 0000000..eadbb0a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Rotate2D.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Scale2D.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Scale2D.uasset new file mode 100644 index 0000000..69f4850 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Scale2D.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Translate2D.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Translate2D.uasset new file mode 100644 index 0000000..8629df9 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Functions/MF_Translate2D.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Armor.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Armor.uasset new file mode 100644 index 0000000..e4b5424 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Armor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Boots.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Boots.uasset new file mode 100644 index 0000000..fcba287 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Boots.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Gauntlets.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Gauntlets.uasset new file mode 100644 index 0000000..443f251 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Helmet.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Helmet.uasset new file mode 100644 index 0000000..4209488 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Helmet.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Pants.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Pants.uasset new file mode 100644 index 0000000..eb12571 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/Instances/MI_DKF_Pants.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Armor.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Armor.uasset new file mode 100644 index 0000000..ed6c766 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Armor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Boots.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Boots.uasset new file mode 100644 index 0000000..ec250cc Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Boots.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Gauntlets.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Gauntlets.uasset new file mode 100644 index 0000000..d2ab833 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Helmet.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Helmet.uasset new file mode 100644 index 0000000..2e110ee Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Helmet.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Pants.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Pants.uasset new file mode 100644 index 0000000..926f840 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Pants.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Sword.uasset b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Sword.uasset new file mode 100644 index 0000000..2eeecbc Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Materials/M_DKF_Sword.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/PHYS_DKF_Full.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/PHYS_DKF_Full.uasset new file mode 100644 index 0000000..2698e72 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/PHYS_DKF_Full.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Armor.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Armor.uasset new file mode 100644 index 0000000..2fee6b3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Armor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Boots.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Boots.uasset new file mode 100644 index 0000000..e2fb37b Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Boots.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Gauntlets.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Gauntlets.uasset new file mode 100644 index 0000000..8697a1c Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Helmet.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Helmet.uasset new file mode 100644 index 0000000..2e3dd44 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Helmet.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Pants.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Pants.uasset new file mode 100644 index 0000000..abbe6ed Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/Parts/SKM_DKF_Pants.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/SKM_DKF_Full.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SKM_DKF_Full.uasset new file mode 100644 index 0000000..f44d3a8 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SKM_DKF_Full.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/SKM_DKF_Full_With_Sword.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SKM_DKF_Full_With_Sword.uasset new file mode 100644 index 0000000..f578c65 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SKM_DKF_Full_With_Sword.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/SK_DKF_Full.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SK_DKF_Full.uasset new file mode 100644 index 0000000..e66a8e1 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SK_DKF_Full.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Meshes/SM_DKF_Sword.uasset b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SM_DKF_Sword.uasset new file mode 100644 index 0000000..952458a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Meshes/SM_DKF_Sword.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_1.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_1.uasset new file mode 100644 index 0000000..7f3fbc4 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_1.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_2.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_2.uasset new file mode 100644 index 0000000..eb093de Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_2.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_3.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_3.uasset new file mode 100644 index 0000000..b591749 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Armor_Mask_Pack_3.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Boots_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Boots_Mask_Pack_01.uasset new file mode 100644 index 0000000..93718e1 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Boots_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Gauntlets_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Gauntlets_Mask_Pack_01.uasset new file mode 100644 index 0000000..d3ddeaf Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Gauntlets_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Helmet_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Helmet_Mask_Pack_01.uasset new file mode 100644 index 0000000..7f1f7f3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Helmet_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Pants_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Pants_Mask_Pack_01.uasset new file mode 100644 index 0000000..8ac6192 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Mask_Packs/T_DKF_Pants_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_01.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_01.uasset new file mode 100644 index 0000000..d3f4f38 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_02.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_02.uasset new file mode 100644 index 0000000..4d219de Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_02.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_03.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_03.uasset new file mode 100644 index 0000000..c753b12 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/Symbols/T_DKF_Symbol_03.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_ALB.uasset new file mode 100644 index 0000000..75d6c57 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_ARM.uasset new file mode 100644 index 0000000..04224cd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_NRM.uasset new file mode 100644 index 0000000..19d1b56 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_Opacity.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_Opacity.uasset new file mode 100644 index 0000000..c767b03 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Armor_Opacity.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_ALB.uasset new file mode 100644 index 0000000..36981f3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_ARM.uasset new file mode 100644 index 0000000..fa5d7f7 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_NRM.uasset new file mode 100644 index 0000000..e3c339f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Boots_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_ALB.uasset new file mode 100644 index 0000000..64cb67f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_ARM.uasset new file mode 100644 index 0000000..51fc4c0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_NRM.uasset new file mode 100644 index 0000000..2441265 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Gauntlets_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_ALB.uasset new file mode 100644 index 0000000..99775b4 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_ARM.uasset new file mode 100644 index 0000000..010b8dd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_NRM.uasset new file mode 100644 index 0000000..b3cfa64 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Helmet_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_ALB.uasset new file mode 100644 index 0000000..e1825fd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_ARM.uasset new file mode 100644 index 0000000..8e1c7a9 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_NRM.uasset new file mode 100644 index 0000000..cc19427 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Pants_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_ALB.uasset new file mode 100644 index 0000000..e2b3d1d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_ARM.uasset new file mode 100644 index 0000000..7c5e4ef Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_NRM.uasset new file mode 100644 index 0000000..22f6037 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Female/Textures/T_DKF_Sword_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_01.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_01.uasset new file mode 100644 index 0000000..ce3cd77 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_02.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_02.uasset new file mode 100644 index 0000000..0ca457a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_02.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_03.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_03.uasset new file mode 100644 index 0000000..d0b5ce8 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Attack_03.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Bwd.uasset new file mode 100644 index 0000000..8990ccf Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_BwdLeft.uasset new file mode 100644 index 0000000..23e302f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_BwdRight.uasset new file mode 100644 index 0000000..661404a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Fwd.uasset new file mode 100644 index 0000000..3bce0e5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_FwdLeft.uasset new file mode 100644 index 0000000..81c6c3e Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_FwdRight.uasset new file mode 100644 index 0000000..8c3f5ee Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Left.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Left.uasset new file mode 100644 index 0000000..94bf035 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Right.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Right.uasset new file mode 100644 index 0000000..7c4d1bf Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Bwd.uasset new file mode 100644 index 0000000..bf5ebc5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_BwdLeft.uasset new file mode 100644 index 0000000..193964a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_BwdRight.uasset new file mode 100644 index 0000000..4494011 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Fwd.uasset new file mode 100644 index 0000000..56d1849 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_FwdLeft.uasset new file mode 100644 index 0000000..a7745d5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_FwdRight.uasset new file mode 100644 index 0000000..6da29c7 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Left.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Left.uasset new file mode 100644 index 0000000..a00809f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Right.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Right.uasset new file mode 100644 index 0000000..22580b0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Crouch_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Death.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Death.uasset new file mode 100644 index 0000000..36db903 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Death.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Bwd.uasset new file mode 100644 index 0000000..ba23c4e Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Fwd.uasset new file mode 100644 index 0000000..3a81ad9 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Left.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Left.uasset new file mode 100644 index 0000000..8220afb Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Right.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Right.uasset new file mode 100644 index 0000000..e6c27f0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Bwd.uasset new file mode 100644 index 0000000..aa51bff Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Fwd.uasset new file mode 100644 index 0000000..dddbedd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Left.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Left.uasset new file mode 100644 index 0000000..54f7423 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Right.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Right.uasset new file mode 100644 index 0000000..9b4e2cb Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Hit_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Idle.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Idle.uasset new file mode 100644 index 0000000..0f793ae Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Idle.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Idle_Alert.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Idle_Alert.uasset new file mode 100644 index 0000000..0388455 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Idle_Alert.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_Fwd.uasset new file mode 100644 index 0000000..98630c5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_FwdLeft.uasset new file mode 100644 index 0000000..9ed8756 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_FwdRight.uasset new file mode 100644 index 0000000..b60d796 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Fwd.uasset new file mode 100644 index 0000000..b69aede Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_FwdLeft.uasset new file mode 100644 index 0000000..ec0b918 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_FwdRight.uasset new file mode 100644 index 0000000..2aef1ad Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Run_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Bwd.uasset new file mode 100644 index 0000000..6d39204 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_BwdLeft.uasset new file mode 100644 index 0000000..f73a2e3 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_BwdRight.uasset new file mode 100644 index 0000000..23b3783 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Fwd.uasset new file mode 100644 index 0000000..cbf8836 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_FwdLeft.uasset new file mode 100644 index 0000000..a7e47f5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_FwdRight.uasset new file mode 100644 index 0000000..71853cd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Left.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Left.uasset new file mode 100644 index 0000000..e8e8000 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Right.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Right.uasset new file mode 100644 index 0000000..6aff8bc Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Alert_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Bwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Bwd.uasset new file mode 100644 index 0000000..c653e83 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Bwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_BwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_BwdLeft.uasset new file mode 100644 index 0000000..0b00a5c Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_BwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_BwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_BwdRight.uasset new file mode 100644 index 0000000..b0805b7 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_BwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Fwd.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Fwd.uasset new file mode 100644 index 0000000..fbaff83 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Fwd.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_FwdLeft.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_FwdLeft.uasset new file mode 100644 index 0000000..73c9014 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_FwdLeft.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_FwdRight.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_FwdRight.uasset new file mode 100644 index 0000000..90d3c5a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_FwdRight.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Left.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Left.uasset new file mode 100644 index 0000000..e88e461 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Left.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Right.uasset b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Right.uasset new file mode 100644 index 0000000..0729f71 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Animations/Anim_DKM_Walk_Right.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Demo/Studio/M_Floor.uasset b/Content/Dark_Knight/Dark_Knight_Male/Demo/Studio/M_Floor.uasset new file mode 100644 index 0000000..47ef1bb Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Demo/Studio/M_Floor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Demo/Studio/SM_Stand.uasset b/Content/Dark_Knight/Dark_Knight_Male/Demo/Studio/SM_Stand.uasset new file mode 100644 index 0000000..0123a39 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Demo/Studio/SM_Stand.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Maps/Demonstration.umap b/Content/Dark_Knight/Dark_Knight_Male/Maps/Demonstration.umap new file mode 100644 index 0000000..1f44b3a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Maps/Demonstration.umap differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Maps/Preview.umap b/Content/Dark_Knight/Dark_Knight_Male/Maps/Preview.umap new file mode 100644 index 0000000..5eabdcc Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Maps/Preview.umap differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Add_Blend_Scalar.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Add_Blend_Scalar.uasset new file mode 100644 index 0000000..b372d15 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Add_Blend_Scalar.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Add_Blend_Vector3.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Add_Blend_Vector3.uasset new file mode 100644 index 0000000..6b6f2c5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Add_Blend_Vector3.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Multiply_Blend_Scalar.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Multiply_Blend_Scalar.uasset new file mode 100644 index 0000000..40f10a6 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Multiply_Blend_Scalar.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Multiply_Blend_Vector3.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Multiply_Blend_Vector3.uasset new file mode 100644 index 0000000..760bfa1 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Multiply_Blend_Vector3.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Rotate2D.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Rotate2D.uasset new file mode 100644 index 0000000..fc3a031 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Rotate2D.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Scale2D.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Scale2D.uasset new file mode 100644 index 0000000..ec381d0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Scale2D.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Translate2D.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Translate2D.uasset new file mode 100644 index 0000000..d892f74 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Functions/MF_Translate2D.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Armor.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Armor.uasset new file mode 100644 index 0000000..69f4403 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Armor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Boots.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Boots.uasset new file mode 100644 index 0000000..8444f6a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Boots.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Gauntlets.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Gauntlets.uasset new file mode 100644 index 0000000..93b5aa1 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Helmet.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Helmet.uasset new file mode 100644 index 0000000..89c4c8a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Helmet.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Pants.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Pants.uasset new file mode 100644 index 0000000..85f5ba0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/Instances/MI_DKM_Pants.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Armor.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Armor.uasset new file mode 100644 index 0000000..8aa28e2 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Armor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Boots.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Boots.uasset new file mode 100644 index 0000000..cbb5c68 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Boots.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Gauntlets.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Gauntlets.uasset new file mode 100644 index 0000000..e70e70a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Helmet.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Helmet.uasset new file mode 100644 index 0000000..202d3f2 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Helmet.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Pants.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Pants.uasset new file mode 100644 index 0000000..3bff938 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Pants.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Sword.uasset b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Sword.uasset new file mode 100644 index 0000000..1cd682f Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Materials/M_DKM_Sword.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/PHYS_DKM_Full.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/PHYS_DKM_Full.uasset new file mode 100644 index 0000000..1ef9973 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/PHYS_DKM_Full.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Armor.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Armor.uasset new file mode 100644 index 0000000..31b4bef Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Armor.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Boots.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Boots.uasset new file mode 100644 index 0000000..a8ce23b Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Boots.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Gauntlets.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Gauntlets.uasset new file mode 100644 index 0000000..78952f8 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Helmet.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Helmet.uasset new file mode 100644 index 0000000..48d88c0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Helmet.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Pants.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Pants.uasset new file mode 100644 index 0000000..250ccc0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/Parts/SKM_DKM_Pants.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/SKM_DKM_Full.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SKM_DKM_Full.uasset new file mode 100644 index 0000000..bd122fa Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SKM_DKM_Full.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/SKM_DKM_Full_With_Sword.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SKM_DKM_Full_With_Sword.uasset new file mode 100644 index 0000000..665f42b Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SKM_DKM_Full_With_Sword.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/SK_DKM_Full.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SK_DKM_Full.uasset new file mode 100644 index 0000000..d41b698 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SK_DKM_Full.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Meshes/SM_DKM_Sword.uasset b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SM_DKM_Sword.uasset new file mode 100644 index 0000000..7d304d6 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Meshes/SM_DKM_Sword.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_ALB.uasset new file mode 100644 index 0000000..89bf779 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_ARM.uasset new file mode 100644 index 0000000..5e16bb6 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_NRM.uasset new file mode 100644 index 0000000..ba9527d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/M_DKM_Sword_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_1.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_1.uasset new file mode 100644 index 0000000..ac2e751 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_1.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_2.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_2.uasset new file mode 100644 index 0000000..09eeade Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_2.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_3.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_3.uasset new file mode 100644 index 0000000..81575ec Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_3.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Boots_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Boots_Mask_Pack_01.uasset new file mode 100644 index 0000000..91b123d Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Boots_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Gauntlets_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Gauntlets_Mask_Pack_01.uasset new file mode 100644 index 0000000..6dd4041 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Gauntlets_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Helmet_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Helmet_Mask_Pack_01.uasset new file mode 100644 index 0000000..216cedc Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Helmet_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Pants_Mask_Pack_01.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Pants_Mask_Pack_01.uasset new file mode 100644 index 0000000..f705f96 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Mask_Packs/T_DKM_Pants_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_01.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_01.uasset new file mode 100644 index 0000000..6e78874 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_01.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_02.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_02.uasset new file mode 100644 index 0000000..ed08fff Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_02.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_03.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_03.uasset new file mode 100644 index 0000000..6f98277 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/Symbols/T_DKM_Symbol_03.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_ALB.uasset new file mode 100644 index 0000000..31baae0 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_ARM.uasset new file mode 100644 index 0000000..15f795a Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_NRM.uasset new file mode 100644 index 0000000..75d7eb5 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_Opacity.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_Opacity.uasset new file mode 100644 index 0000000..45847bd Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Armor_Opacity.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_ALB.uasset new file mode 100644 index 0000000..3e13930 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_ARM.uasset new file mode 100644 index 0000000..c32b4df Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_NRM.uasset new file mode 100644 index 0000000..bb377c7 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Boots_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_ALB.uasset new file mode 100644 index 0000000..3983302 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_ARM.uasset new file mode 100644 index 0000000..5543928 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_NRM.uasset new file mode 100644 index 0000000..d666acb Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Gauntlets_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_ALB.uasset new file mode 100644 index 0000000..8e20b0c Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_ARM.uasset new file mode 100644 index 0000000..e8bf732 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_NRM.uasset new file mode 100644 index 0000000..26c707c Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Helmet_NRM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_ALB.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_ALB.uasset new file mode 100644 index 0000000..b25f495 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_ALB.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_ARM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_ARM.uasset new file mode 100644 index 0000000..9ee1eb2 Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_ARM.uasset differ diff --git a/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_NRM.uasset b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_NRM.uasset new file mode 100644 index 0000000..f89abbe Binary files /dev/null and b/Content/Dark_Knight/Dark_Knight_Male/Textures/T_DKM_Pants_NRM.uasset differ diff --git a/Content/Dark_Knight/Demo/Studio/M_Floor.uasset b/Content/Dark_Knight/Demo/Studio/M_Floor.uasset new file mode 100644 index 0000000..d6b766e Binary files /dev/null and b/Content/Dark_Knight/Demo/Studio/M_Floor.uasset differ diff --git a/Content/Dark_Knight/Demo/Studio/SM_Stand.uasset b/Content/Dark_Knight/Demo/Studio/SM_Stand.uasset new file mode 100644 index 0000000..de79939 Binary files /dev/null and b/Content/Dark_Knight/Demo/Studio/SM_Stand.uasset differ diff --git a/Content/Dark_Knight/Maps/Demonstration.umap b/Content/Dark_Knight/Maps/Demonstration.umap new file mode 100644 index 0000000..605f52d Binary files /dev/null and b/Content/Dark_Knight/Maps/Demonstration.umap differ diff --git a/Content/Dark_Knight/Maps/Preview.umap b/Content/Dark_Knight/Maps/Preview.umap new file mode 100644 index 0000000..8872cc0 Binary files /dev/null and b/Content/Dark_Knight/Maps/Preview.umap differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Add_Blend_Scalar.uasset b/Content/Dark_Knight/Materials/Functions/MF_Add_Blend_Scalar.uasset new file mode 100644 index 0000000..357f306 Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Add_Blend_Scalar.uasset differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Add_Blend_Vector3.uasset b/Content/Dark_Knight/Materials/Functions/MF_Add_Blend_Vector3.uasset new file mode 100644 index 0000000..2e6a8cf Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Add_Blend_Vector3.uasset differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Multiply_Blend_Scalar.uasset b/Content/Dark_Knight/Materials/Functions/MF_Multiply_Blend_Scalar.uasset new file mode 100644 index 0000000..9309b25 Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Multiply_Blend_Scalar.uasset differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Multiply_Blend_Vector3.uasset b/Content/Dark_Knight/Materials/Functions/MF_Multiply_Blend_Vector3.uasset new file mode 100644 index 0000000..46fd826 Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Multiply_Blend_Vector3.uasset differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Rotate2D.uasset b/Content/Dark_Knight/Materials/Functions/MF_Rotate2D.uasset new file mode 100644 index 0000000..5add958 Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Rotate2D.uasset differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Scale2D.uasset b/Content/Dark_Knight/Materials/Functions/MF_Scale2D.uasset new file mode 100644 index 0000000..e5b2aa7 Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Scale2D.uasset differ diff --git a/Content/Dark_Knight/Materials/Functions/MF_Translate2D.uasset b/Content/Dark_Knight/Materials/Functions/MF_Translate2D.uasset new file mode 100644 index 0000000..2d8b3a7 Binary files /dev/null and b/Content/Dark_Knight/Materials/Functions/MF_Translate2D.uasset differ diff --git a/Content/Dark_Knight/Materials/Instances/MI_DKM_Armor.uasset b/Content/Dark_Knight/Materials/Instances/MI_DKM_Armor.uasset new file mode 100644 index 0000000..7989724 Binary files /dev/null and b/Content/Dark_Knight/Materials/Instances/MI_DKM_Armor.uasset differ diff --git a/Content/Dark_Knight/Materials/Instances/MI_DKM_Boots.uasset b/Content/Dark_Knight/Materials/Instances/MI_DKM_Boots.uasset new file mode 100644 index 0000000..2cbfea5 Binary files /dev/null and b/Content/Dark_Knight/Materials/Instances/MI_DKM_Boots.uasset differ diff --git a/Content/Dark_Knight/Materials/Instances/MI_DKM_Gauntlets.uasset b/Content/Dark_Knight/Materials/Instances/MI_DKM_Gauntlets.uasset new file mode 100644 index 0000000..dc7cccc Binary files /dev/null and b/Content/Dark_Knight/Materials/Instances/MI_DKM_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Materials/Instances/MI_DKM_Helmet.uasset b/Content/Dark_Knight/Materials/Instances/MI_DKM_Helmet.uasset new file mode 100644 index 0000000..466e06d Binary files /dev/null and b/Content/Dark_Knight/Materials/Instances/MI_DKM_Helmet.uasset differ diff --git a/Content/Dark_Knight/Materials/Instances/MI_DKM_Pants.uasset b/Content/Dark_Knight/Materials/Instances/MI_DKM_Pants.uasset new file mode 100644 index 0000000..ea76543 Binary files /dev/null and b/Content/Dark_Knight/Materials/Instances/MI_DKM_Pants.uasset differ diff --git a/Content/Dark_Knight/Materials/M_DKM_Armor.uasset b/Content/Dark_Knight/Materials/M_DKM_Armor.uasset new file mode 100644 index 0000000..a6ef387 Binary files /dev/null and b/Content/Dark_Knight/Materials/M_DKM_Armor.uasset differ diff --git a/Content/Dark_Knight/Materials/M_DKM_Boots.uasset b/Content/Dark_Knight/Materials/M_DKM_Boots.uasset new file mode 100644 index 0000000..806797f Binary files /dev/null and b/Content/Dark_Knight/Materials/M_DKM_Boots.uasset differ diff --git a/Content/Dark_Knight/Materials/M_DKM_Gauntlets.uasset b/Content/Dark_Knight/Materials/M_DKM_Gauntlets.uasset new file mode 100644 index 0000000..47508de Binary files /dev/null and b/Content/Dark_Knight/Materials/M_DKM_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Materials/M_DKM_Helmet.uasset b/Content/Dark_Knight/Materials/M_DKM_Helmet.uasset new file mode 100644 index 0000000..6e151ea Binary files /dev/null and b/Content/Dark_Knight/Materials/M_DKM_Helmet.uasset differ diff --git a/Content/Dark_Knight/Materials/M_DKM_Pants.uasset b/Content/Dark_Knight/Materials/M_DKM_Pants.uasset new file mode 100644 index 0000000..9ffa224 Binary files /dev/null and b/Content/Dark_Knight/Materials/M_DKM_Pants.uasset differ diff --git a/Content/Dark_Knight/Materials/M_DKM_Sword.uasset b/Content/Dark_Knight/Materials/M_DKM_Sword.uasset new file mode 100644 index 0000000..e9fc2b9 Binary files /dev/null and b/Content/Dark_Knight/Materials/M_DKM_Sword.uasset differ diff --git a/Content/Dark_Knight/Meshes/PHYS_DKM_Full.uasset b/Content/Dark_Knight/Meshes/PHYS_DKM_Full.uasset new file mode 100644 index 0000000..4b3d5ae Binary files /dev/null and b/Content/Dark_Knight/Meshes/PHYS_DKM_Full.uasset differ diff --git a/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Armor.uasset b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Armor.uasset new file mode 100644 index 0000000..55a3f7d Binary files /dev/null and b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Armor.uasset differ diff --git a/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Boots.uasset b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Boots.uasset new file mode 100644 index 0000000..70e0043 Binary files /dev/null and b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Boots.uasset differ diff --git a/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Gauntlets.uasset b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Gauntlets.uasset new file mode 100644 index 0000000..080d1a2 Binary files /dev/null and b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Gauntlets.uasset differ diff --git a/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Helmet.uasset b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Helmet.uasset new file mode 100644 index 0000000..5ad5249 Binary files /dev/null and b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Helmet.uasset differ diff --git a/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Pants.uasset b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Pants.uasset new file mode 100644 index 0000000..c442e74 Binary files /dev/null and b/Content/Dark_Knight/Meshes/Parts/SKM_DKM_Pants.uasset differ diff --git a/Content/Dark_Knight/Meshes/SKM_DKM_Full.uasset b/Content/Dark_Knight/Meshes/SKM_DKM_Full.uasset new file mode 100644 index 0000000..0986733 Binary files /dev/null and b/Content/Dark_Knight/Meshes/SKM_DKM_Full.uasset differ diff --git a/Content/Dark_Knight/Meshes/SKM_DKM_Full_With_Sword.uasset b/Content/Dark_Knight/Meshes/SKM_DKM_Full_With_Sword.uasset new file mode 100644 index 0000000..6f322aa Binary files /dev/null and b/Content/Dark_Knight/Meshes/SKM_DKM_Full_With_Sword.uasset differ diff --git a/Content/Dark_Knight/Meshes/SK_DKM_Full.uasset b/Content/Dark_Knight/Meshes/SK_DKM_Full.uasset new file mode 100644 index 0000000..6db17b5 Binary files /dev/null and b/Content/Dark_Knight/Meshes/SK_DKM_Full.uasset differ diff --git a/Content/Dark_Knight/Meshes/SM_DKM_Sword.uasset b/Content/Dark_Knight/Meshes/SM_DKM_Sword.uasset new file mode 100644 index 0000000..982dcd0 Binary files /dev/null and b/Content/Dark_Knight/Meshes/SM_DKM_Sword.uasset differ diff --git a/Content/Dark_Knight/Textures/M_DKM_Sword_ALB.uasset b/Content/Dark_Knight/Textures/M_DKM_Sword_ALB.uasset new file mode 100644 index 0000000..1c821d3 Binary files /dev/null and b/Content/Dark_Knight/Textures/M_DKM_Sword_ALB.uasset differ diff --git a/Content/Dark_Knight/Textures/M_DKM_Sword_ARM.uasset b/Content/Dark_Knight/Textures/M_DKM_Sword_ARM.uasset new file mode 100644 index 0000000..8dac345 Binary files /dev/null and b/Content/Dark_Knight/Textures/M_DKM_Sword_ARM.uasset differ diff --git a/Content/Dark_Knight/Textures/M_DKM_Sword_NRM.uasset b/Content/Dark_Knight/Textures/M_DKM_Sword_NRM.uasset new file mode 100644 index 0000000..1615bd3 Binary files /dev/null and b/Content/Dark_Knight/Textures/M_DKM_Sword_NRM.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_1.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_1.uasset new file mode 100644 index 0000000..c3cae52 Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_1.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_2.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_2.uasset new file mode 100644 index 0000000..7521718 Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_2.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_3.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_3.uasset new file mode 100644 index 0000000..5c181d3 Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Armor_Mask_Pack_3.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Boots_Mask_Pack_01.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Boots_Mask_Pack_01.uasset new file mode 100644 index 0000000..0810ccf Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Boots_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Gauntlets_Mask_Pack_01.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Gauntlets_Mask_Pack_01.uasset new file mode 100644 index 0000000..111ef0e Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Gauntlets_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Helmet_Mask_Pack_01.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Helmet_Mask_Pack_01.uasset new file mode 100644 index 0000000..c1c61bc Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Helmet_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Pants_Mask_Pack_01.uasset b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Pants_Mask_Pack_01.uasset new file mode 100644 index 0000000..9e4965a Binary files /dev/null and b/Content/Dark_Knight/Textures/Mask_Packs/T_DKM_Pants_Mask_Pack_01.uasset differ diff --git a/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_01.uasset b/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_01.uasset new file mode 100644 index 0000000..ec98568 Binary files /dev/null and b/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_01.uasset differ diff --git a/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_02.uasset b/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_02.uasset new file mode 100644 index 0000000..0c3b59a Binary files /dev/null and b/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_02.uasset differ diff --git a/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_03.uasset b/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_03.uasset new file mode 100644 index 0000000..d6930ff Binary files /dev/null and b/Content/Dark_Knight/Textures/Symbols/T_DKM_Symbol_03.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Armor_ALB.uasset b/Content/Dark_Knight/Textures/T_DKM_Armor_ALB.uasset new file mode 100644 index 0000000..5b168f5 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Armor_ALB.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Armor_ARM.uasset b/Content/Dark_Knight/Textures/T_DKM_Armor_ARM.uasset new file mode 100644 index 0000000..be1f652 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Armor_ARM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Armor_NRM.uasset b/Content/Dark_Knight/Textures/T_DKM_Armor_NRM.uasset new file mode 100644 index 0000000..d7125e5 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Armor_NRM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Armor_Opacity.uasset b/Content/Dark_Knight/Textures/T_DKM_Armor_Opacity.uasset new file mode 100644 index 0000000..802159c Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Armor_Opacity.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Boots_ALB.uasset b/Content/Dark_Knight/Textures/T_DKM_Boots_ALB.uasset new file mode 100644 index 0000000..de6c174 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Boots_ALB.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Boots_ARM.uasset b/Content/Dark_Knight/Textures/T_DKM_Boots_ARM.uasset new file mode 100644 index 0000000..3666b55 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Boots_ARM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Boots_NRM.uasset b/Content/Dark_Knight/Textures/T_DKM_Boots_NRM.uasset new file mode 100644 index 0000000..54b48de Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Boots_NRM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Gauntlets_ALB.uasset b/Content/Dark_Knight/Textures/T_DKM_Gauntlets_ALB.uasset new file mode 100644 index 0000000..d4c9a2c Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Gauntlets_ALB.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Gauntlets_ARM.uasset b/Content/Dark_Knight/Textures/T_DKM_Gauntlets_ARM.uasset new file mode 100644 index 0000000..a8cc04c Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Gauntlets_ARM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Gauntlets_NRM.uasset b/Content/Dark_Knight/Textures/T_DKM_Gauntlets_NRM.uasset new file mode 100644 index 0000000..4d4f974 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Gauntlets_NRM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Helmet_ALB.uasset b/Content/Dark_Knight/Textures/T_DKM_Helmet_ALB.uasset new file mode 100644 index 0000000..dc1c1d9 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Helmet_ALB.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Helmet_ARM.uasset b/Content/Dark_Knight/Textures/T_DKM_Helmet_ARM.uasset new file mode 100644 index 0000000..237fd6f Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Helmet_ARM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Helmet_NRM.uasset b/Content/Dark_Knight/Textures/T_DKM_Helmet_NRM.uasset new file mode 100644 index 0000000..dd0d679 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Helmet_NRM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Pants_ALB.uasset b/Content/Dark_Knight/Textures/T_DKM_Pants_ALB.uasset new file mode 100644 index 0000000..a09e48d Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Pants_ALB.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Pants_ARM.uasset b/Content/Dark_Knight/Textures/T_DKM_Pants_ARM.uasset new file mode 100644 index 0000000..b0e007b Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Pants_ARM.uasset differ diff --git a/Content/Dark_Knight/Textures/T_DKM_Pants_NRM.uasset b/Content/Dark_Knight/Textures/T_DKM_Pants_NRM.uasset new file mode 100644 index 0000000..c0042b9 Binary files /dev/null and b/Content/Dark_Knight/Textures/T_DKM_Pants_NRM.uasset differ diff --git a/Content/Res/Materials/M_VertexColor.uasset b/Content/Res/Materials/M_VertexColor.uasset new file mode 100644 index 0000000..9d2b14c Binary files /dev/null and b/Content/Res/Materials/M_VertexColor.uasset differ diff --git a/Plugins/MiceShaders/Shaders/Private/TemperatureConductionCS.usf b/Plugins/MiceShaders/Shaders/Private/TemperatureConductionCS.usf new file mode 100644 index 0000000..57f895c --- /dev/null +++ b/Plugins/MiceShaders/Shaders/Private/TemperatureConductionCS.usf @@ -0,0 +1,135 @@ +// TemperatureConductionCS.usf - 温度传导计算着色器 + +#include "/Engine/Public/Platform.ush" + +// ----------------------------------------------------------------------------- +// 1. 输入输出缓冲区定义 +// ----------------------------------------------------------------------------- +// 输入:当前温度缓冲(只读) +Buffer InputTemperatureBuffer; + +// 输入:表面体素标志缓冲(只读) +Buffer SurfaceVoxelFlagsBuffer; + +// 输出:新温度缓冲(读写) +RWBuffer OutputTemperatureBuffer; + +// 输出:塑性系数缓冲(读写) +RWBuffer OutputPlasticityBuffer; + +// ----------------------------------------------------------------------------- +// 2. 参数缓冲区(必须与C++ FParameters结构体严格匹配) +// ----------------------------------------------------------------------------- +cbuffer Parameters +{ + int3 VoxelResolution; // 体素网格分辨率 + float ThermalConductivity; // 热传导系数 + float CoolingRate; // 表面冷却速率 + float AmbientTemperature; // 环境温度 + float ForgeTemperatureMin; // 锻造温度下限 + float ForgeTemperatureMax; // 锻造温度上限 + float DeltaTime; // 时间步长 +}; + +// ----------------------------------------------------------------------------- +// 3. 工具函数 +// ----------------------------------------------------------------------------- + +// 获取体素索引(3D坐标转1D索引) +int GetVoxelIndex(int3 coord) +{ + return coord.x + coord.y * VoxelResolution.x + + coord.z * VoxelResolution.x * VoxelResolution.y; +} + +// 检查体素坐标是否有效 +bool IsValidCoord(int3 coord) +{ + return all(coord >= 0) && all(coord < VoxelResolution); +} + +// 根据温度计算塑性系数(Smoothstep函数) +float CalculatePlasticity(float temperature) +{ + float normalized = saturate((temperature - ForgeTemperatureMin) / + (ForgeTemperatureMax - ForgeTemperatureMin)); + return normalized * normalized * (3.0 - 2.0 * normalized); +} + +// ----------------------------------------------------------------------------- +// 4. 计算着色器主函数 +// ----------------------------------------------------------------------------- +#define THREADGROUP_SIZE_X 8 +#define THREADGROUP_SIZE_Y 8 +#define THREADGROUP_SIZE_Z 8 + +[numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, THREADGROUP_SIZE_Z)] +void MainCompute( + uint3 GroupID : SV_GroupID, + uint3 GroupThreadID : SV_GroupThreadID, + uint3 DispatchThreadID : SV_DispatchThreadID +) +{ + int3 voxelCoord = int3(DispatchThreadID); + + // 边界检查 + if (!IsValidCoord(voxelCoord)) + { + return; + } + + int index = GetVoxelIndex(voxelCoord); + float currentTemp = InputTemperatureBuffer[index]; + + // ------------------------------------------------------------------------- + // 5. 热传导计算(6邻域) + // ------------------------------------------------------------------------- + float neighborTempSum = 0.0; + int neighborCount = 0; + + // 6个邻居方向 + const int3 neighbors[6] = { + int3(-1, 0, 0), int3(1, 0, 0), // X轴 + int3(0, -1, 0), int3(0, 1, 0), // Y轴 + int3(0, 0, -1), int3(0, 0, 1) // Z轴 + }; + + // 遍历邻居 + for (int i = 0; i < 6; i++) + { + int3 neighborCoord = voxelCoord + neighbors[i]; + if (IsValidCoord(neighborCoord)) + { + int neighborIndex = GetVoxelIndex(neighborCoord); + neighborTempSum += InputTemperatureBuffer[neighborIndex]; + neighborCount++; + } + } + + // 平均邻居温度 + float avgNeighborTemp = neighborTempSum / max(neighborCount, 1); + + // 热传导增量(向平均温度靠拢) + float heatConductionDelta = ThermalConductivity * (avgNeighborTemp - currentTemp) * DeltaTime; + + // ------------------------------------------------------------------------- + // 6. 表面冷却计算 + // ------------------------------------------------------------------------- + float coolingDelta = 0.0; + bool isSurface = (SurfaceVoxelFlagsBuffer[index] & 1) != 0; + + if (isSurface) + { + // 表面体素向环境温度冷却 + coolingDelta = CoolingRate * (AmbientTemperature - currentTemp) * DeltaTime; + } + + // ------------------------------------------------------------------------- + // 7. 更新温度和塑性系数 + // ------------------------------------------------------------------------- + float newTemp = currentTemp + heatConductionDelta + coolingDelta; + OutputTemperatureBuffer[index] = newTemp; + + // 更新塑性系数 + OutputPlasticityBuffer[index] = CalculatePlasticity(newTemp); +} diff --git a/Plugins/MiceShaders/Source/MiceShaders/Private/FTemperatureComputeShader.cpp b/Plugins/MiceShaders/Source/MiceShaders/Private/FTemperatureComputeShader.cpp new file mode 100644 index 0000000..0574f71 --- /dev/null +++ b/Plugins/MiceShaders/Source/MiceShaders/Private/FTemperatureComputeShader.cpp @@ -0,0 +1,37 @@ +#include "FTemperatureComputeShader.h" +#include "GlobalShader.h" +#include "ShaderParameterStruct.h" +#include "RHIStaticStates.h" +#include "Shader.h" +#include "RHICommandList.h" +#include "RHIResources.h" +#include "ShaderParameterUtils.h" + +// 全局参数存储 +FThreadSafeTemperatureParams GTemperatureParams; + +// 实现温度传导计算着色器 +// 路径指向MiceShaders插件中的着色器文件 +IMPLEMENT_GLOBAL_SHADER(FTemperatureComputeShader, + "/MiceShaders/Shaders/Private/TemperatureConductionCS.usf", + "MainCompute", + SF_Compute); + +// 线程安全参数管理实现 +void FThreadSafeTemperatureParams::AddParams(const FTemperatureCSDispatchParams& NewParams) +{ + FScopeLock Lock(&ParamsCriticalSection); + PendingParams.Add(NewParams); +} + +bool FThreadSafeTemperatureParams::ConsumeParams(FTemperatureCSDispatchParams& OutParams) +{ + FScopeLock Lock(&ParamsCriticalSection); + if (PendingParams.Num() > 0) + { + OutParams = PendingParams[0]; + PendingParams.RemoveAt(0); + return true; + } + return false; +} diff --git a/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h b/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h new file mode 100644 index 0000000..f7bf1f0 --- /dev/null +++ b/Plugins/MiceShaders/Source/MiceShaders/Public/FTemperatureComputeShader.h @@ -0,0 +1,107 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GlobalShader.h" +#include "ShaderParameterStruct.h" +#include "RenderGraphUtils.h" + +/** + * 温度传导计算着色器的调度参数 + */ +struct MICESHADERS_API FTemperatureCSDispatchParams +{ + // 体素网格分辨率 + FIntVector VoxelResolution; + + // 物理参数 + float ThermalConductivity; // 热传导系数 + float CoolingRate; // 表面冷却速率 + float AmbientTemperature; // 环境温度 + float ForgeTemperatureMin; // 锻造温度下限 + float ForgeTemperatureMax; // 锻造温度上限 + float DeltaTime; // 时间步长 + + // GPU缓冲区资源 + FBufferRHIRef InputTemperatureBuffer; // 输入温度缓冲(SRV) + FBufferRHIRef SurfaceVoxelFlagsBuffer; // 表面体素标志缓冲(SRV) + FUnorderedAccessViewRHIRef OutputTemperatureUAV; // 输出温度缓冲(UAV) + FUnorderedAccessViewRHIRef OutputPlasticityUAV; // 输出塑性系数缓冲(UAV) + + FTemperatureCSDispatchParams() + : VoxelResolution(FIntVector::ZeroValue) + , ThermalConductivity(0.1f) + , CoolingRate(0.05f) + , AmbientTemperature(20.0f) + , ForgeTemperatureMin(800.0f) + , ForgeTemperatureMax(1200.0f) + , DeltaTime(0.0f) + { + } +}; + +/** + * 线程安全的温度计算参数队列 + */ +struct MICESHADERS_API FThreadSafeTemperatureParams +{ + FCriticalSection ParamsCriticalSection; + TArray PendingParams; + + void AddParams(const FTemperatureCSDispatchParams& NewParams); + bool ConsumeParams(FTemperatureCSDispatchParams& OutParams); +}; + +// 全局参数存储 +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, ) + // 体素网格参数 + SHADER_PARAMETER(FIntVector, VoxelResolution) + + // 物理参数 + SHADER_PARAMETER(float, ThermalConductivity) + SHADER_PARAMETER(float, CoolingRate) + SHADER_PARAMETER(float, AmbientTemperature) + SHADER_PARAMETER(float, ForgeTemperatureMin) + SHADER_PARAMETER(float, ForgeTemperatureMax) + SHADER_PARAMETER(float, DeltaTime) + + // 缓冲区参数(RDG方式) + SHADER_PARAMETER_RDG_BUFFER_SRV(Buffer, InputTemperatureBuffer) + SHADER_PARAMETER_RDG_BUFFER_SRV(Buffer, SurfaceVoxelFlagsBuffer) + SHADER_PARAMETER_RDG_BUFFER_UAV(RWBuffer, OutputTemperatureBuffer) + SHADER_PARAMETER_RDG_BUFFER_UAV(RWBuffer, OutputPlasticityBuffer) + END_SHADER_PARAMETER_STRUCT() + + static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters) + { + return GetMaxSupportedFeatureLevel(Parameters.Platform) >= ERHIFeatureLevel::SM5; + } + + static bool ShouldCache(EShaderPlatform Platform) + { + return true; + } + + // 线程组大小(与HLSL中的numthreads保持一致) + static FIntVector GetGroupSize() + { + return FIntVector(8, 8, 8); + } + + static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment) + { + FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment); + OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE_X"), 8); + OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE_Y"), 8); + OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE_Z"), 8); + } +}; diff --git a/Source/BladeSmith/BladeSmith.Build.cs b/Source/BladeSmith/BladeSmith.Build.cs index 59e84f4..0ebe6a0 100644 --- a/Source/BladeSmith/BladeSmith.Build.cs +++ b/Source/BladeSmith/BladeSmith.Build.cs @@ -6,7 +6,14 @@ public class BladeSmith : ModuleRules { public BladeSmith(ReadOnlyTargetRules Target) : base(Target) { - PrivateDependencyModuleNames.AddRange(new string[] { "GeometryScriptingCore" }); + PrivateDependencyModuleNames.AddRange(new string[] { + "GeometryScriptingCore", + "GeometryFramework", + "DynamicMesh", + "GeometryCore", + "GeometryAlgorithms", + "ModelingComponents" + }); PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; // 如果你的模块类型是 Runtime 或 Gameplay 相关的,则添加这行: diff --git a/Source/BladeSmith/DynamicIronBlock.cpp b/Source/BladeSmith/DynamicIronBlock.cpp new file mode 100644 index 0000000..dae9ba0 --- /dev/null +++ b/Source/BladeSmith/DynamicIronBlock.cpp @@ -0,0 +1,969 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "DynamicIronBlock.h" + +#include "Components/DynamicMeshComponent.h" +#include "DynamicMesh/DynamicMesh3.h" +#include "GeometryScript/MeshPrimitiveFunctions.h" +#include "GeometryScript/MeshSpatialFunctions.h" +#include "GeometryScript/MeshBasicEditFunctions.h" +#include "GeometryScript/MeshUVFunctions.h" +#include "GeometryScript/MeshQueryFunctions.h" +#include "GeometryScript/MeshDeformFunctions.h" +#include "GeometryScript/MeshNormalsFunctions.h" +#include "Materials/MaterialInstanceDynamic.h" + +// GPU计算相关(从MiceShaders插件引用) +#include "FTemperatureComputeShader.h" +#include "RHI.h" +#include "RHIResources.h" +#include "RHICommandList.h" +#include "RenderGraphBuilder.h" +#include "RenderGraphUtils.h" +#include "GlobalShader.h" +#include "ShaderParameterStruct.h" +#include "RHIStaticStates.h" +#include "ShaderCompilerCore.h" +#include "ShaderCore.h" + +ADynamicIronBlock::ADynamicIronBlock() +{ + // 启用Tick以支持温度模拟 + PrimaryActorTick.bCanEverTick = true; + + // 设置默认的 Box 大小 + BoxSize = FVector(100.0f, 100.0f, 100.0f); + + // 设置 BVH 快速构建选项 + bEnableFastBuild = true; +} + +void ADynamicIronBlock::BeginPlay() +{ + Super::BeginPlay(); + // 初始化 Box 网格 + InitializeBoxMesh(); + // 创建GPU缓冲区 + if (bEnableTemperatureSystem && TemperatureGrid.Num() > 0) + { + CreateGPUBuffers(); + UploadTemperatureDataToGPU(); + } +} + +void ADynamicIronBlock::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (!bEnableTemperatureSystem || TemperatureGrid.Num() == 0) + { + return; + } + + // 检查GPU缓冲区是否准备好 + if (!bGPUBuffersReady.load(std::memory_order_acquire)) + { + return; + } + + // 累积时间 + TimeSinceLastUpdate += DeltaTime; + + // 每隔一定时间更新温度 + if (TimeSinceLastUpdate >= TemperatureUpdateInterval) + { + // 调度GPU计算 + DispatchTemperatureCompute(TimeSinceLastUpdate); + + // 重置计时器 + TimeSinceLastUpdate = 0.0f; + + // 下载数据并更新顶点颜色(可选,性能开销较大) + // DownloadTemperatureDataFromGPU(); + // UpdateVertexColors(); + } +} + +void ADynamicIronBlock::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + // 释放GPU缓冲区 + ReleaseGPUBuffers(); + + Super::EndPlay(EndPlayReason); +} + +void ADynamicIronBlock::OnConstruction(const FTransform& Transform) +{ + Super::OnConstruction(Transform); + + // 初始化 Box 网格 + //InitializeBoxMesh(); +} + +void ADynamicIronBlock::InitializeBoxMesh() +{ + // 获取 DynamicMeshComponent + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent")); + return; + } + + // 获取 DynamicMesh + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh")); + return; + } + + // 清除现有网格 + DynMesh->Reset(); + + // 设置 Box 的选项 + FGeometryScriptPrimitiveOptions PrimitiveOptions; + PrimitiveOptions.PolygroupMode = EGeometryScriptPrimitivePolygroupMode::SingleGroup; + PrimitiveOptions.bFlipOrientation = false; + + // 创建 Box 的变换 + FTransform BoxTransform = FTransform::Identity; + + // 添加 Box 到网格 + UGeometryScriptLibrary_MeshPrimitiveFunctions::AppendBox( + DynMesh, + PrimitiveOptions, + BoxTransform, + BoxSize.X, + BoxSize.Y, + BoxSize.Z, + NumSubDivide.X, NumSubDivide.Y, NumSubDivide.Z // X, Y, Z 轴的细分数 + ); + + // 为网格生成唯一的 UV 坐标(使用 XAtlas 自动展开) + FGeometryScriptXAtlasOptions XAtlasOptions; + XAtlasOptions.MaxIterations = 1; + + UGeometryScriptLibrary_MeshUVFunctions::AutoGenerateXAtlasMeshUVs( + DynMesh, + 0, // UV 通道 0 + XAtlasOptions + ); + + // 如果设置了材质,创建动态材质实例并应用 + if (IronMaterial) + { + UMaterialInstanceDynamic* DynamicMaterialInstance = UMaterialInstanceDynamic::Create(IronMaterial, this); + if (DynamicMaterialInstance) + { + DynMeshComp->SetMaterial(0, DynamicMaterialInstance); + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Dynamic material instance created and applied")); + } + } + + // 通知组件网格已更新 + DynMeshComp->NotifyMeshUpdated(); + + // 生成 BVH + GenerateBVH(); + + // 初始化温度网格 + InitializeTemperatureGrid(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Box mesh initialized with size (%f, %f, %f)"), + BoxSize.X, BoxSize.Y, BoxSize.Z); +} + +void ADynamicIronBlock::GenerateBVH() +{ + // 获取 DynamicMeshComponent + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent for BVH generation")); + return; + } + + // 获取 DynamicMesh + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh for BVH generation")); + return; + } + + // 构建 BVH + FGeometryScriptDynamicMeshBVH BVH; + UGeometryScriptLibrary_MeshSpatial::BuildBVHForMesh( + DynMesh, + BVH + ); + + // 可选:重置碰撞 + DynMeshComp->UpdateCollision(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: BVH generated successfully")); +} + +void ADynamicIronBlock::OnHammerImpact(FVector HitLocation, FVector HitNormal, float ImpactRadius, float ImpactDepth, float ImpactForce) +{ + // 获取 DynamicMeshComponent + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent for hammer impact")); + return; + } + + // 获取 DynamicMesh + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh for hammer impact")); + return; + } + + // 限制力度范围在0-1之间 + ImpactForce = FMath::Clamp(ImpactForce, 0.0f, 1.0f); + + // 将世界坐标转换为局部坐标 + FTransform ActorTransform = GetActorTransform(); + FVector LocalHitLocation = ActorTransform.InverseTransformPosition(HitLocation); + FVector LocalHitNormal = ActorTransform.InverseTransformVector(HitNormal).GetSafeNormal(); + + // 计算实际的形变深度 + float ActualDepth = ImpactDepth * ImpactForce; + + // 计算凸起区域的外半径 + float BulgeOuterRadius = ImpactRadius * (1.0f + BulgeRatio); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Hammer impact at local position (%f, %f, %f), depth: %f, impact radius: %f, bulge radius: %f"), + LocalHitLocation.X, LocalHitLocation.Y, LocalHitLocation.Z, ActualDepth, ImpactRadius, BulgeOuterRadius); + + // 使用GeometryScript修改网格顶点 + DynMesh->EditMesh([&](FDynamicMesh3& EditMesh) + { + // 遍历所有顶点 + for (int32 VertexID : EditMesh.VertexIndicesItr()) + { + // 获取顶点位置 + FVector3d VertexPos = EditMesh.GetVertex(VertexID); + FVector VertexPosFloat(VertexPos.X, VertexPos.Y, VertexPos.Z); + + // 计算顶点到锤击点的距离 + float Distance = FVector::Dist(VertexPosFloat, LocalHitLocation); + + FVector Displacement = FVector::ZeroVector; + + // 压缩区:顶点在锤击半径内,向下压 + if (Distance < ImpactRadius) + { + // 计算衰减因子(使用幂函数实现平滑过渡) + float NormalizedDist = Distance / ImpactRadius; // 归一化距离 [0, 1] + float Falloff = 1.0f - FMath::Pow(NormalizedDist, FalloffExponent); // 衰减系数 + + // 计算该顶点的形变偏移量 + float VertexDeformation = ActualDepth * Falloff; + + // 沿着锤击法线方向进行形变(向内压) + Displacement = -LocalHitNormal * VertexDeformation; + } + // 凸起区:顶点在压缩区外、凸起区内,材料向上和向外流动 + else if (Distance < BulgeOuterRadius) + { + // 计算在凸起区中的位置 [0, 1] + float BulgeNormalizedDist = (Distance - ImpactRadius) / (BulgeOuterRadius - ImpactRadius); + + // 凸起区衰减:靠近压缩区边界最强,向外逐渐减弱 + float BulgeFalloff = 1.0f - FMath::Pow(BulgeNormalizedDist, FalloffExponent); + + // 计算凸起高度(基于体积守恒和BulgeStrength) + float BulgeHeight = ActualDepth * BulgeStrength * BulgeFalloff; + + // 计算径向方向(从锤击点指向顶点的水平方向) + FVector RadialDir = VertexPosFloat - LocalHitLocation; + RadialDir = RadialDir - LocalHitNormal * FVector::DotProduct(RadialDir, LocalHitNormal); // 移除法线方向分量 + RadialDir.Normalize(); + + // 材料流动:主要向上(反法线方向),少量向外(径向) + // 向上分量占70%,向外分量占30% + FVector UpwardDisplacement = -LocalHitNormal * BulgeHeight * 0.7f; + FVector OutwardDisplacement = RadialDir * BulgeHeight * 0.3f; + + Displacement = UpwardDisplacement + OutwardDisplacement; + } + + // 应用形变 + if (!Displacement.IsNearlyZero()) + { + FVector3d NewPosition = VertexPos + FVector3d(Displacement.X, Displacement.Y, Displacement.Z); + EditMesh.SetVertex(VertexID, NewPosition); + } + } + }, EDynamicMeshChangeType::GeneralEdit, EDynamicMeshAttributeChangeFlags::Unknown, false); + + // 重新计算法线 + FGeometryScriptCalculateNormalsOptions NormalOp; + UGeometryScriptLibrary_MeshNormalsFunctions::RecomputeNormals(DynMesh,NormalOp); + + // 通知组件网格已更新 + DynMeshComp->NotifyMeshUpdated(); + + // 重新生成 BVH + GenerateBVH(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Hammer impact deformation applied successfully")); +} + +// ========== 温度系统实现 ========== + +void ADynamicIronBlock::CalculateTemperatureResolution() +{ + // 将BoxSize从厘米转换为毫米 + FVector BoxSizeMM = BoxSize * 10.0f; + + // 计算每个轴的体素数量(向上取整) + TemperatureResolution.X = FMath::Max(1, FMath::CeilToInt(BoxSizeMM.X / TemperatureVoxelSize)); + TemperatureResolution.Y = FMath::Max(1, FMath::CeilToInt(BoxSizeMM.Y / TemperatureVoxelSize)); + TemperatureResolution.Z = FMath::Max(1, FMath::CeilToInt(BoxSizeMM.Z / TemperatureVoxelSize)); + + // 限制最大分辨率(防止内存爆炸) + const int32 MaxResolutionPerAxis = 200; + TemperatureResolution.X = FMath::Min(TemperatureResolution.X, MaxResolutionPerAxis); + TemperatureResolution.Y = FMath::Min(TemperatureResolution.Y, MaxResolutionPerAxis); + TemperatureResolution.Z = FMath::Min(TemperatureResolution.Z, MaxResolutionPerAxis); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature resolution calculated as (%d, %d, %d)"), + TemperatureResolution.X, TemperatureResolution.Y, TemperatureResolution.Z); +} + +void ADynamicIronBlock::InitializeTemperatureGrid() +{ + if (!bEnableTemperatureSystem) + { + UE_LOG(LogTemp, Warning, TEXT("DynamicIronBlock: Temperature system is disabled")); + return; + } + + // 计算分辨率 + CalculateTemperatureResolution(); + + // 分配体素数组 + const int32 TotalVoxels = TemperatureResolution.X * TemperatureResolution.Y * TemperatureResolution.Z; + TemperatureGrid.SetNum(TotalVoxels); + + // 计算体素网格的起始位置(相对于Actor中心,单位:厘米) + FVector GridOrigin = -BoxSize * 0.5f; + + // 计算实际体素尺寸(毫米转厘米) + FVector VoxelSizeCM = FVector(TemperatureVoxelSize / 10.0f); + + // 初始化每个体素 + for (int32 Z = 0; Z < TemperatureResolution.Z; ++Z) + { + for (int32 Y = 0; Y < TemperatureResolution.Y; ++Y) + { + for (int32 X = 0; X < TemperatureResolution.X; ++X) + { + int32 Index = GetTemperatureIndex(X, Y, Z); + FTemperatureVoxel& Voxel = TemperatureGrid[Index]; + + // 初始温度(室温) + Voxel.Temperature = AmbientTemperature; + + // 检测是否为表面体素 + if (IsSurfaceTemperatureVoxel(X, Y, Z)) + { + Voxel.Flags |= 1; // 设置bit 0为1 + } + else + { + Voxel.Flags &= ~1; // 设置bit 0为0 + } + + // 更新塑性系数 + UpdatePlasticityCoefficient(Voxel); + } + } + } + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature grid initialized with %d voxels (%.2f MB)"), + TotalVoxels, (TotalVoxels * sizeof(FTemperatureVoxel)) / (1024.0f * 1024.0f)); +} + +bool ADynamicIronBlock::IsSurfaceTemperatureVoxel(int32 X, int32 Y, int32 Z) const +{ + return X == 0 || X == TemperatureResolution.X - 1 || + Y == 0 || Y == TemperatureResolution.Y - 1 || + Z == 0 || Z == TemperatureResolution.Z - 1; +} + +float ADynamicIronBlock::CalculatePlasticityFromTemperature(float Temperature) const +{ + // 归一化温度到 [0, 1] 范围 + float NormalizedTemp = FMath::Clamp( + (Temperature - ForgeTemperatureMin) / (ForgeTemperatureMax - ForgeTemperatureMin), + 0.0f, 1.0f + ); + + // 使用平滑步函数(Smoothstep) + return NormalizedTemp * NormalizedTemp * (3.0f - 2.0f * NormalizedTemp); +} + +void ADynamicIronBlock::UpdatePlasticityCoefficient(FTemperatureVoxel& Voxel) +{ + Voxel.PlasticityCoefficient = CalculatePlasticityFromTemperature(Voxel.Temperature); +} + +void ADynamicIronBlock::HeatRegion(FVector WorldCenter, float Radius, float TemperatureIncrease) +{ + if (!bEnableTemperatureSystem || TemperatureGrid.Num() == 0) + { + UE_LOG(LogTemp, Warning, TEXT("DynamicIronBlock: Temperature system not initialized")); + return; + } + + // 将世界坐标转换为局部坐标 + FTransform ActorTransform = GetActorTransform(); + FVector LocalCenter = ActorTransform.InverseTransformPosition(WorldCenter); + + // 计算体素网格的起始位置 + FVector GridOrigin = -BoxSize * 0.5f; + FVector VoxelSizeCM = FVector(TemperatureVoxelSize / 10.0f); + + // 将影响范围转换为体素坐标 + FVector LocalCenterVoxel = (LocalCenter - GridOrigin) / VoxelSizeCM; + int32 RadiusVoxels = FMath::CeilToInt(Radius / VoxelSizeCM.X); + + int32 MinX = FMath::Max(0, FMath::FloorToInt(LocalCenterVoxel.X) - RadiusVoxels); + int32 MaxX = FMath::Min(TemperatureResolution.X - 1, FMath::CeilToInt(LocalCenterVoxel.X) + RadiusVoxels); + int32 MinY = FMath::Max(0, FMath::FloorToInt(LocalCenterVoxel.Y) - RadiusVoxels); + int32 MaxY = FMath::Min(TemperatureResolution.Y - 1, FMath::CeilToInt(LocalCenterVoxel.Y) + RadiusVoxels); + int32 MinZ = FMath::Max(0, FMath::FloorToInt(LocalCenterVoxel.Z) - RadiusVoxels); + int32 MaxZ = FMath::Min(TemperatureResolution.Z - 1, FMath::CeilToInt(LocalCenterVoxel.Z) + RadiusVoxels); + + int32 AffectedVoxels = 0; + + // 遍历影响范围内的体素 + 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); + + if (Distance < Radius) + { + int32 Index = GetTemperatureIndex(X, Y, Z); + FTemperatureVoxel& Voxel = TemperatureGrid[Index]; + + // 距离衰减 + float Falloff = 1.0f - (Distance / Radius); + float TempDelta = TemperatureIncrease * Falloff; + + Voxel.Temperature += TempDelta; + UpdatePlasticityCoefficient(Voxel); + ++AffectedVoxels; + } + } + } + } + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Heated %d voxels in region (center: %s, radius: %.2f)"), + AffectedVoxels, *LocalCenter.ToString(), Radius); + + // 更新顶点颜色以显示温度变化 + UpdateVertexColors(); +} + +float ADynamicIronBlock::SampleTemperatureAtPosition(const FVector& LocalPosition) const +{ + if (!bEnableTemperatureSystem || TemperatureGrid.Num() == 0) + { + return AmbientTemperature; + } + + // 将位置转换为体素坐标系 + FVector GridOrigin = -BoxSize * 0.5f; + FVector VoxelSizeCM = FVector(TemperatureVoxelSize / 10.0f); + FVector VoxelCoord = (LocalPosition - GridOrigin) / VoxelSizeCM; + + // 获取相邻的8个体素的索引 + int32 X0 = FMath::FloorToInt(VoxelCoord.X); + int32 Y0 = FMath::FloorToInt(VoxelCoord.Y); + int32 Z0 = FMath::FloorToInt(VoxelCoord.Z); + int32 X1 = X0 + 1; + int32 Y1 = Y0 + 1; + int32 Z1 = Z0 + 1; + + // 边界检查 + if (!IsValidTemperatureCoord(X0, Y0, Z0) || !IsValidTemperatureCoord(X1, Y1, Z1)) + { + return AmbientTemperature; + } + + // 插值权重 + float Fx = VoxelCoord.X - X0; + float Fy = VoxelCoord.Y - Y0; + float Fz = VoxelCoord.Z - Z0; + + // 获取8个角点的温度 + float T000 = TemperatureGrid[GetTemperatureIndex(X0, Y0, Z0)].Temperature; + float T100 = TemperatureGrid[GetTemperatureIndex(X1, Y0, Z0)].Temperature; + float T010 = TemperatureGrid[GetTemperatureIndex(X0, Y1, Z0)].Temperature; + float T110 = TemperatureGrid[GetTemperatureIndex(X1, Y1, Z0)].Temperature; + float T001 = TemperatureGrid[GetTemperatureIndex(X0, Y0, Z1)].Temperature; + float T101 = TemperatureGrid[GetTemperatureIndex(X1, Y0, Z1)].Temperature; + float T011 = TemperatureGrid[GetTemperatureIndex(X0, Y1, Z1)].Temperature; + float T111 = TemperatureGrid[GetTemperatureIndex(X1, Y1, Z1)].Temperature; + + // 三线性插值 + float T00 = FMath::Lerp(T000, T100, Fx); + float T10 = FMath::Lerp(T010, T110, Fx); + float T01 = FMath::Lerp(T001, T101, Fx); + float T11 = FMath::Lerp(T011, T111, Fx); + float T0 = FMath::Lerp(T00, T10, Fy); + float T1 = FMath::Lerp(T01, T11, Fy); + return FMath::Lerp(T0, T1, Fz); +} + +float ADynamicIronBlock::SamplePlasticityAtPosition(const FVector& LocalPosition) const +{ + if (!bEnableTemperatureSystem || TemperatureGrid.Num() == 0) + { + return 0.0f; + } + + // 将位置转换为体素坐标系 + FVector GridOrigin = -BoxSize * 0.5f; + FVector VoxelSizeCM = FVector(TemperatureVoxelSize / 10.0f); + FVector VoxelCoord = (LocalPosition - GridOrigin) / VoxelSizeCM; + + // 获取相邻的8个体素的索引 + int32 X0 = FMath::FloorToInt(VoxelCoord.X); + int32 Y0 = FMath::FloorToInt(VoxelCoord.Y); + int32 Z0 = FMath::FloorToInt(VoxelCoord.Z); + int32 X1 = X0 + 1; + int32 Y1 = Y0 + 1; + int32 Z1 = Z0 + 1; + + // 边界检查 + if (!IsValidTemperatureCoord(X0, Y0, Z0) || !IsValidTemperatureCoord(X1, Y1, Z1)) + { + return 0.0f; + } + + // 插值权重 + float Fx = VoxelCoord.X - X0; + float Fy = VoxelCoord.Y - Y0; + float Fz = VoxelCoord.Z - Z0; + + // 获取8个角点的塑性系数 + float P000 = TemperatureGrid[GetTemperatureIndex(X0, Y0, Z0)].PlasticityCoefficient; + float P100 = TemperatureGrid[GetTemperatureIndex(X1, Y0, Z0)].PlasticityCoefficient; + float P010 = TemperatureGrid[GetTemperatureIndex(X0, Y1, Z0)].PlasticityCoefficient; + float P110 = TemperatureGrid[GetTemperatureIndex(X1, Y1, Z0)].PlasticityCoefficient; + float P001 = TemperatureGrid[GetTemperatureIndex(X0, Y0, Z1)].PlasticityCoefficient; + float P101 = TemperatureGrid[GetTemperatureIndex(X1, Y0, Z1)].PlasticityCoefficient; + float P011 = TemperatureGrid[GetTemperatureIndex(X0, Y1, Z1)].PlasticityCoefficient; + float P111 = TemperatureGrid[GetTemperatureIndex(X1, Y1, Z1)].PlasticityCoefficient; + + // 三线性插值 + float P00 = FMath::Lerp(P000, P100, Fx); + float P10 = FMath::Lerp(P010, P110, Fx); + float P01 = FMath::Lerp(P001, P101, Fx); + float P11 = FMath::Lerp(P011, P111, Fx); + float P0 = FMath::Lerp(P00, P10, Fy); + float P1 = FMath::Lerp(P01, P11, Fy); + return FMath::Lerp(P0, P1, Fz); +} + +FLinearColor ADynamicIronBlock::TemperatureToColor(float Temperature) const +{ + // 归一化温度到 [0, 1] 范围 + float NormalizedTemp = FMath::Clamp( + (Temperature - AmbientTemperature) / (ForgeTemperatureMax - AmbientTemperature), + 0.0f, 1.0f + ); + + // 黑体辐射近似颜色映射 + if (NormalizedTemp < 0.33f) + { + // 冷:深灰 → 暗红 + return FMath::Lerp( + FLinearColor(0.2f, 0.2f, 0.2f), + FLinearColor(0.5f, 0.1f, 0.05f), + NormalizedTemp * 3.0f + ); + } + else if (NormalizedTemp < 0.66f) + { + // 中:暗红 → 亮红 + return FMath::Lerp( + FLinearColor(0.5f, 0.1f, 0.05f), + FLinearColor(1.0f, 0.3f, 0.1f), + (NormalizedTemp - 0.33f) * 3.0f + ); + } + else + { + // 热:亮红 → 橙黄白 + return FMath::Lerp( + FLinearColor(1.0f, 0.3f, 0.1f), + FLinearColor(1.0f, 1.0f, 0.9f), + (NormalizedTemp - 0.66f) * 3.0f + ); + } +} + +void ADynamicIronBlock::UpdateVertexColors() +{ + if (!bEnableTemperatureSystem || TemperatureGrid.Num() == 0) + { + return; + } + + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + return; + } + + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + return; + } + + DynMesh->EditMesh([&](FDynamicMesh3& EditMesh) + { + // 启用顶点颜色(如果尚未启用) + if (!EditMesh.HasVertexColors()) + { + EditMesh.EnableVertexColors(FVector3f(0.2f, 0.2f, 0.2f)); + } + + // 遍历所有顶点 + for (int32 VertexID : EditMesh.VertexIndicesItr()) + { + // 获取顶点位置(局部坐标) + FVector3d VertexPos = EditMesh.GetVertex(VertexID); + FVector VertexPosFloat(VertexPos.X, VertexPos.Y, VertexPos.Z); + + // 通过三线性插值获取该顶点的温度 + float Temperature = SampleTemperatureAtPosition(VertexPosFloat); + + // 将温度映射到颜色 + FLinearColor VertexColor = TemperatureToColor(Temperature); + + // 设置顶点颜色 + EditMesh.SetVertexColor(VertexID, FVector3f(VertexColor.R, VertexColor.G, VertexColor.B)); + } + }, EDynamicMeshChangeType::GeneralEdit, EDynamicMeshAttributeChangeFlags::Unknown, false); + + DynMeshComp->NotifyMeshUpdated(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Vertex colors updated based on temperature")); +} + +// ========== GPU缓冲区管理实现 ========== + +void ADynamicIronBlock::CreateGPUBuffers() +{ + if (TemperatureGrid.Num() == 0) + { + UE_LOG(LogTemp, Warning, TEXT("DynamicIronBlock: Cannot create GPU buffers, temperature grid is empty")); + return; + } + + const int32 TotalVoxels = TemperatureGrid.Num(); + const uint32 BufferSize = TotalVoxels * sizeof(float); + const uint32 FlagsBufferSize = TotalVoxels * sizeof(uint32); + + // 使用RHI线程安全的创建缓冲区 + ENQUEUE_RENDER_COMMAND(CreateTemperatureBuffers)( + [this, TotalVoxels, BufferSize, FlagsBufferSize](FRHICommandListImmediate& RHICmdList) + { + // 创建温度缓冲A(使用ByteAddressBuffer而非StructuredBuffer) + FRHIBufferCreateDesc TempBufferADesc; + TempBufferADesc.DebugName = TEXT("TemperatureBufferA"); + TempBufferADesc.Size = BufferSize; + TempBufferADesc.Usage = BUF_ShaderResource | BUF_UnorderedAccess; + TempBufferADesc.InitialState = ERHIAccess::UAVCompute; + TemperatureBufferA = RHICmdList.CreateBuffer(TempBufferADesc); + TemperatureUAV_A = RHICmdList.CreateUnorderedAccessView(TemperatureBufferA, FRHIViewDesc::CreateBufferUAV().SetType(FRHIViewDesc::EBufferType::Typed).SetFormat(PF_R32_FLOAT)); + TemperatureSRV_A = RHICmdList.CreateShaderResourceView(TemperatureBufferA, FRHIViewDesc::CreateBufferSRV().SetType(FRHIViewDesc::EBufferType::Typed).SetFormat(PF_R32_FLOAT)); + + // 创建温度缓冲B + FRHIBufferCreateDesc TempBufferBDesc; + TempBufferBDesc.DebugName = TEXT("TemperatureBufferB"); + TempBufferBDesc.Size = BufferSize; + TempBufferBDesc.Usage = BUF_ShaderResource | BUF_UnorderedAccess; + TempBufferBDesc.InitialState = ERHIAccess::UAVCompute; + TemperatureBufferB = RHICmdList.CreateBuffer(TempBufferBDesc); + TemperatureUAV_B = RHICmdList.CreateUnorderedAccessView(TemperatureBufferB, FRHIViewDesc::CreateBufferUAV().SetType(FRHIViewDesc::EBufferType::Typed).SetFormat(PF_R32_FLOAT)); + TemperatureSRV_B = RHICmdList.CreateShaderResourceView(TemperatureBufferB, FRHIViewDesc::CreateBufferSRV().SetType(FRHIViewDesc::EBufferType::Typed).SetFormat(PF_R32_FLOAT)); + + // 创建塑性系数缓冲 + FRHIBufferCreateDesc PlasticityBufferDesc; + PlasticityBufferDesc.DebugName = TEXT("PlasticityBuffer"); + PlasticityBufferDesc.Size = BufferSize; + PlasticityBufferDesc.Usage = BUF_ShaderResource | BUF_UnorderedAccess; + PlasticityBufferDesc.InitialState = ERHIAccess::UAVCompute; + PlasticityBuffer = RHICmdList.CreateBuffer(PlasticityBufferDesc); + PlasticityUAV = RHICmdList.CreateUnorderedAccessView(PlasticityBuffer, FRHIViewDesc::CreateBufferUAV().SetType(FRHIViewDesc::EBufferType::Typed).SetFormat(PF_R32_FLOAT)); + + // 创建表面体素标志缓冲 + FRHIBufferCreateDesc FlagsBufferDesc; + FlagsBufferDesc.DebugName = TEXT("SurfaceVoxelFlagsBuffer"); + FlagsBufferDesc.Size = FlagsBufferSize; + FlagsBufferDesc.Usage = BUF_ShaderResource; + FlagsBufferDesc.InitialState = ERHIAccess::SRVCompute; + SurfaceVoxelFlagsBuffer = RHICmdList.CreateBuffer(FlagsBufferDesc); + SurfaceVoxelSRV = RHICmdList.CreateShaderResourceView(SurfaceVoxelFlagsBuffer, FRHIViewDesc::CreateBufferSRV().SetType(FRHIViewDesc::EBufferType::Typed).SetFormat(PF_R32_UINT)); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: GPU buffers created (%d voxels, %.2f MB)"), + TotalVoxels, (BufferSize * 3 + FlagsBufferSize) / (1024.0f * 1024.0f)); + + // 通知游戏线程缓冲区已准备好 + AsyncTask(ENamedThreads::GameThread, [this]() + { + bGPUBuffersReady.store(true, std::memory_order_release); + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: GPU buffers ready for use")); + }); + }); +} + +void ADynamicIronBlock::ReleaseGPUBuffers() +{ + // 先标记缓冲区为未准备状态,防止Tick中继续使用 + bGPUBuffersReady.store(false, std::memory_order_release); + + ENQUEUE_RENDER_COMMAND(ReleaseTemperatureBuffers)( + [this](FRHICommandListImmediate& RHICmdList) + { + TemperatureBufferA.SafeRelease(); + TemperatureBufferB.SafeRelease(); + PlasticityBuffer.SafeRelease(); + SurfaceVoxelFlagsBuffer.SafeRelease(); + + TemperatureUAV_A.SafeRelease(); + TemperatureUAV_B.SafeRelease(); + PlasticityUAV.SafeRelease(); + + TemperatureSRV_A.SafeRelease(); + TemperatureSRV_B.SafeRelease(); + SurfaceVoxelSRV.SafeRelease(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: GPU buffers released")); + }); +} + +void ADynamicIronBlock::UploadTemperatureDataToGPU() +{ + if (!TemperatureBufferA.IsValid() || TemperatureGrid.Num() == 0) + { + return; + } + + const int32 TotalVoxels = TemperatureGrid.Num(); + + // 准备温度和标志数据 + TArray TempData; + TArray FlagsData; + TempData.Reserve(TotalVoxels); + FlagsData.Reserve(TotalVoxels); + + for (const FTemperatureVoxel& Voxel : TemperatureGrid) + { + TempData.Add(Voxel.Temperature); + FlagsData.Add(static_cast(Voxel.Flags)); + } + + ENQUEUE_RENDER_COMMAND(UploadTemperatureData)( + [this, TempData = MoveTemp(TempData), FlagsData = MoveTemp(FlagsData)](FRHICommandListImmediate& RHICmdList) + { + const uint32 BufferSize = TempData.Num() * sizeof(float); + const uint32 FlagsBufferSize = FlagsData.Num() * sizeof(uint32); + + // 上传温度数据到BufferA + void* DataPtrA = RHICmdList.LockBuffer(TemperatureBufferA, 0, BufferSize, RLM_WriteOnly); + FMemory::Memcpy(DataPtrA, TempData.GetData(), BufferSize); + RHICmdList.UnlockBuffer(TemperatureBufferA); + + // 上传温度数据到BufferB + void* DataPtrB = RHICmdList.LockBuffer(TemperatureBufferB, 0, BufferSize, RLM_WriteOnly); + FMemory::Memcpy(DataPtrB, TempData.GetData(), BufferSize); + RHICmdList.UnlockBuffer(TemperatureBufferB); + + // 上传标志数据 + void* FlagsPtr = RHICmdList.LockBuffer(SurfaceVoxelFlagsBuffer, 0, FlagsBufferSize, RLM_WriteOnly); + FMemory::Memcpy(FlagsPtr, FlagsData.GetData(), FlagsBufferSize); + RHICmdList.UnlockBuffer(SurfaceVoxelFlagsBuffer); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data uploaded to GPU")); + }); +} + +void ADynamicIronBlock::DownloadTemperatureDataFromGPU() +{ + if (!TemperatureBufferA.IsValid() || TemperatureGrid.Num() == 0) + { + return; + } + + const int32 TotalVoxels = TemperatureGrid.Num(); + const uint32 BufferSize = TotalVoxels * sizeof(float); + + // 选择当前活跃的缓冲区 + FBufferRHIRef ActiveBuffer = bUseBufferA ? TemperatureBufferA : TemperatureBufferB; + + ENQUEUE_RENDER_COMMAND(DownloadTemperatureData)( + [this, TotalVoxels, BufferSize, ActiveBuffer](FRHICommandListImmediate& RHICmdList) + { + TArray TempData; + TempData.SetNum(TotalVoxels); + + // 从GPU下载温度数据 + void* DataPtr = RHICmdList.LockBuffer(ActiveBuffer, 0, BufferSize, RLM_ReadOnly); + FMemory::Memcpy(TempData.GetData(), DataPtr, BufferSize); + RHICmdList.UnlockBuffer(ActiveBuffer); + + // 更新CPU侧数据(需要在Game线程执行) + AsyncTask(ENamedThreads::GameThread, [this, TempData = MoveTemp(TempData)]() + { + for (int32 i = 0; i < TempData.Num() && i < TemperatureGrid.Num(); ++i) + { + TemperatureGrid[i].Temperature = TempData[i]; + UpdatePlasticityCoefficient(TemperatureGrid[i]); + } + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data downloaded from GPU")); + }); + }); +} + +void ADynamicIronBlock::DispatchTemperatureCompute(float DeltaTime) +{ + if (!TemperatureBufferA.IsValid() || !TemperatureBufferB.IsValid()) + { + return; + } + + // 准备调度参数(捕获到lambda中) + FIntVector Resolution = TemperatureResolution; + float Conductivity = ThermalConductivity; + float Cooling = CoolingRate; + float Ambient = AmbientTemperature; + float ForgeMin = ForgeTemperatureMin; + float ForgeMax = ForgeTemperatureMax; + + // Ping-Pong缓冲区引用 + FBufferRHIRef InputBuffer = bUseBufferA ? TemperatureBufferA : TemperatureBufferB; + FBufferRHIRef OutputBuffer = bUseBufferA ? TemperatureBufferB : TemperatureBufferA; + FBufferRHIRef FlagsBuffer = SurfaceVoxelFlagsBuffer; + FBufferRHIRef PlasticityBuf = PlasticityBuffer; + + // 创建SRV/UAV(在游戏线程创建,捕获到lambda) + FShaderResourceViewRHIRef InputSRV = TemperatureSRV_A; + FShaderResourceViewRHIRef InputSRV_B = TemperatureSRV_B; + FShaderResourceViewRHIRef FlagsSRV = SurfaceVoxelSRV; + FUnorderedAccessViewRHIRef OutputUAV_A = TemperatureUAV_A; + FUnorderedAccessViewRHIRef OutputUAV_B = TemperatureUAV_B; + FUnorderedAccessViewRHIRef PlasticityUAV_Ref = PlasticityUAV; + + bool bReadFromA = bUseBufferA; + + // 切换缓冲区(下次Tick使用新的缓冲区) + bUseBufferA = !bUseBufferA; + + // 调度GPU计算(直接使用RHI,不用RDG) + ENQUEUE_RENDER_COMMAND(DispatchTemperatureCS)( + [Resolution, Conductivity, Cooling, Ambient, ForgeMin, ForgeMax, DeltaTime, + InputBuffer, OutputBuffer, FlagsBuffer, PlasticityBuf, + InputSRV, InputSRV_B, FlagsSRV, OutputUAV_A, OutputUAV_B, PlasticityUAV_Ref, bReadFromA] + (FRHICommandListImmediate& RHICmdList) + { + // 检查ShaderMap是否有效 + FGlobalShaderMap* ShaderMap = GetGlobalShaderMap(GMaxRHIFeatureLevel); + if (!ShaderMap) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Global ShaderMap is null!")); + return; + } + + // 获取Compute Shader并检查是否有效 + TShaderMapRef ComputeShader(ShaderMap); + if (!ComputeShader.IsValid()) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: FTemperatureComputeShader not found in ShaderMap! Make sure the shader is compiled.")); + return; + } + + // 使用RDG(简化版本 - 创建临时缓冲区) + FRDGBuilder GraphBuilder(RHICmdList, RDG_EVENT_NAME("TemperatureConduction")); + + // 创建RDG缓冲区描述 + FRDGBufferDesc TempBufferDesc = FRDGBufferDesc::CreateBufferDesc(sizeof(float), InputBuffer->GetSize() / sizeof(float)); + FRDGBufferDesc FlagsBufferDesc = FRDGBufferDesc::CreateBufferDesc(sizeof(uint32), FlagsBuffer->GetSize() / sizeof(uint32)); + + // 创建RDG缓冲区 + FRDGBufferRef InputTempRDG = GraphBuilder.CreateBuffer(TempBufferDesc, TEXT("InputTemperatureBuffer")); + FRDGBufferRef OutputTempRDG = GraphBuilder.CreateBuffer(TempBufferDesc, TEXT("OutputTemperatureBuffer")); + FRDGBufferRef FlagsRDG = GraphBuilder.CreateBuffer(FlagsBufferDesc, TEXT("SurfaceVoxelFlagsBuffer")); + FRDGBufferRef PlasticityRDG = GraphBuilder.CreateBuffer(TempBufferDesc, TEXT("PlasticityBuffer")); + + // TODO: 添加数据复制Pass(从RHI到RDG) + // 暂时跳过,shader会处理未初始化数据 + + // 设置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; + + PassParameters->InputTemperatureBuffer = GraphBuilder.CreateSRV(InputTempRDG, PF_R32_FLOAT); + PassParameters->SurfaceVoxelFlagsBuffer = GraphBuilder.CreateSRV(FlagsRDG, PF_R32_UINT); + PassParameters->OutputTemperatureBuffer = GraphBuilder.CreateUAV(OutputTempRDG, PF_R32_FLOAT); + PassParameters->OutputPlasticityBuffer = GraphBuilder.CreateUAV(PlasticityRDG, PF_R32_FLOAT); + + // 计算线程组数量 + FIntVector GroupSize = FTemperatureComputeShader::GetGroupSize(); + FIntVector GroupCount( + FMath::DivideAndRoundUp(Resolution.X, GroupSize.X), + FMath::DivideAndRoundUp(Resolution.Y, GroupSize.Y), + FMath::DivideAndRoundUp(Resolution.Z, GroupSize.Z) + ); + + // 添加计算Pass + FComputeShaderUtils::AddPass( + GraphBuilder, + RDG_EVENT_NAME("TemperatureConduction"), + ComputeShader, + PassParameters, + GroupCount + ); + + // TODO: 添加数据复制Pass(从RDG回RHI) + // 暂时跳过,需要实现正确的缓冲区提取 + + // 执行RDG + GraphBuilder.Execute(); + + UE_LOG(LogTemp, Warning, TEXT("DynamicIronBlock: Temperature compute dispatched (%d x %d x %d groups) - Data copy not yet implemented"), + GroupCount.X, GroupCount.Y, GroupCount.Z); + }); +} diff --git a/Source/BladeSmith/DynamicIronBlock.h b/Source/BladeSmith/DynamicIronBlock.h new file mode 100644 index 0000000..8df2a11 --- /dev/null +++ b/Source/BladeSmith/DynamicIronBlock.h @@ -0,0 +1,290 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "DynamicMeshActor.h" +#include +#include "DynamicIronBlock.generated.h" + +/** + * 温度体素结构 - 存储单个体素的温度和塑性数据 + */ +USTRUCT(BlueprintType) +struct FTemperatureVoxel +{ + GENERATED_BODY() + + // 温度值(摄氏度) + UPROPERTY() + float Temperature; + + // 塑性系数(0-1),由温度计算得出 + UPROPERTY() + float PlasticityCoefficient; + + // 标志位(bit 0: 是否为表面体素) + UPROPERTY() + uint8 Flags; + + FTemperatureVoxel() + : Temperature(20.0f) + , PlasticityCoefficient(0.0f) + , Flags(0) + {} +}; + +/** + * 动态铁块Actor,继承自ADynamicMeshActor + * 用于模拟铁匠打铁游戏中的铁块,支持动态变形 + * 包含基于体素的温度模拟系统 + */ +UCLASS() +class BLADESMITH_API ADynamicIronBlock : public ADynamicMeshActor +{ + GENERATED_BODY() + +public: + // 构造函数 + ADynamicIronBlock(); + + // Box的大小 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + FVector BoxSize = FVector(100.0f, 100.0f, 100.0f); + // Box的细分数 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + FVector NumSubDivide = FVector(1.0f, 1.0f, 1.0f); + // BVH参数 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + bool bEnableFastBuild; + + // 铁块材质 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + UMaterialInterface* IronMaterial; + + // 形变衰减指数(控制边缘过渡的平滑度)- 材质物理特性 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties") + float FalloffExponent = 2.0f; + + // 材料凸起比例(凸起区域半径相对于压缩区域的倍数) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties") + float BulgeRatio = 0.8f; + + // 材料凸起强度(控制凸起高度,基于体积守恒) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block|Material Properties") + float BulgeStrength = 0.5f; + + // ========== 温度系统参数 ========== + + // 温度体素大小(毫米) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System", meta = (ClampMin = "3.0", ClampMax = "10.0")) + float TemperatureVoxelSize = 5.0f; + + // 热传导系数 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System", meta = (ClampMin = "0.0", ClampMax = "1.0")) + float ThermalConductivity = 0.1f; + + // 表面冷却速率 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System", meta = (ClampMin = "0.0", ClampMax = "1.0")) + float CoolingRate = 0.05f; + + // 环境温度(摄氏度) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System") + float AmbientTemperature = 20.0f; + + // 锻造温度下限(摄氏度)- 开始软化 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System") + float ForgeTemperatureMin = 800.0f; + + // 锻造温度上限(摄氏度)- 完全软化 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System") + float ForgeTemperatureMax = 1200.0f; + + // 是否启用温度系统 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Temperature System") + bool bEnableTemperatureSystem = true; + + /** + * 测试函数 - 加热指定区域 + * @param WorldCenter 加热中心位置(世界坐标) + * @param Radius 加热半径 + * @param TemperatureIncrease 温度增量 + */ + UFUNCTION(BlueprintCallable, Category = "Temperature System") + void HeatRegion(FVector WorldCenter, float Radius, float TemperatureIncrease); + + /** + * 受击函数 - 模拟圆形铁锤锤击金属表面产生塑性形变 + * @param HitLocation 锤击位置(世界坐标) + * @param HitNormal 锤击法线方向 + * @param ImpactRadius 锤击影响半径 + * @param ImpactDepth 锤击形变深度 + * @param ImpactForce 锤击力度(0-1),影响形变深度 + */ + UFUNCTION(BlueprintCallable, Category = "Hammer Impact") + void OnHammerImpact(FVector HitLocation, FVector HitNormal, float ImpactRadius, float ImpactDepth, float ImpactForce = 1.0f); + +protected: + // 当游戏开始或生成时调用 + virtual void BeginPlay() override; + + // 每帧更新 + virtual void Tick(float DeltaTime) override; + + // Actor销毁时调用 + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + // 初始化时调用,用于设置Box网格和BVH + virtual void OnConstruction(const FTransform& Transform) override; + +private: + /** + * 创建Box网格并生成BVH + */ + void InitializeBoxMesh(); + + /** + * 生成BVH加速结构 + */ + void GenerateBVH(); + + // ========== 温度系统数据 ========== + + // 温度体素网格(CPU侧) + TArray TemperatureGrid; + + // 温度网格分辨率 + FIntVector TemperatureResolution; + + // ========== 温度系统方法 ========== + + /** + * 计算温度网格分辨率(基于BoxSize和TemperatureVoxelSize) + */ + void CalculateTemperatureResolution(); + + /** + * 初始化温度体素网格 + */ + void InitializeTemperatureGrid(); + + /** + * 获取体素索引 + */ + FORCEINLINE int32 GetTemperatureIndex(int32 X, int32 Y, int32 Z) const + { + return X + Y * TemperatureResolution.X + Z * TemperatureResolution.X * TemperatureResolution.Y; + } + + FORCEINLINE int32 GetTemperatureIndex(const FIntVector& Coord) const + { + return GetTemperatureIndex(Coord.X, Coord.Y, Coord.Z); + } + + /** + * 检查体素坐标是否有效 + */ + FORCEINLINE bool IsValidTemperatureCoord(int32 X, int32 Y, int32 Z) const + { + return X >= 0 && X < TemperatureResolution.X && + Y >= 0 && Y < TemperatureResolution.Y && + Z >= 0 && Z < TemperatureResolution.Z; + } + + FORCEINLINE bool IsValidTemperatureCoord(const FIntVector& Coord) const + { + return IsValidTemperatureCoord(Coord.X, Coord.Y, Coord.Z); + } + + /** + * 判断是否为表面体素 + */ + bool IsSurfaceTemperatureVoxel(int32 X, int32 Y, int32 Z) const; + + /** + * 从温度网格采样温度(三线性插值) + * @param LocalPosition 局部坐标位置 + * @return 插值后的温度值 + */ + float SampleTemperatureAtPosition(const FVector& LocalPosition) const; + + /** + * 从温度网格采样塑性系数(三线性插值) + * @param LocalPosition 局部坐标位置 + * @return 插值后的塑性系数 + */ + float SamplePlasticityAtPosition(const FVector& LocalPosition) const; + + /** + * 根据温度计算塑性系数 + * @param Temperature 温度值 + * @return 塑性系数(0-1) + */ + float CalculatePlasticityFromTemperature(float Temperature) const; + + /** + * 更新体素的塑性系数(基于当前温度) + */ + void UpdatePlasticityCoefficient(FTemperatureVoxel& Voxel); + + /** + * 温度到颜色的映射(黑体辐射近似) + * @param Temperature 温度值 + * @return 颜色 + */ + FLinearColor TemperatureToColor(float Temperature) const; + + /** + * 更新网格顶点颜色以显示温度 + */ + void UpdateVertexColors(); + + // ========== GPU计算系统(Phase 2) ========== + + // GPU缓冲区(Ping-Pong双缓冲) + FBufferRHIRef TemperatureBufferA; // 温度缓冲A + FBufferRHIRef TemperatureBufferB; // 温度缓冲B + FBufferRHIRef PlasticityBuffer; // 塑性系数缓冲 + FBufferRHIRef SurfaceVoxelFlagsBuffer; // 表面体素标志缓冲 + + FUnorderedAccessViewRHIRef TemperatureUAV_A; // 温度缓冲A的UAV + FUnorderedAccessViewRHIRef TemperatureUAV_B; // 温度缓冲B的UAV + FUnorderedAccessViewRHIRef PlasticityUAV; // 塑性系数缓冲的UAV + + FShaderResourceViewRHIRef TemperatureSRV_A; // 温度缓冲A的SRV + FShaderResourceViewRHIRef TemperatureSRV_B; // 温度缓冲B的SRV + FShaderResourceViewRHIRef SurfaceVoxelSRV; // 表面体素标志的SRV + + bool bUseBufferA = true; // Ping-Pong标志 + float TimeSinceLastUpdate = 0.0f; // 距离上次温度更新的时间 + float TemperatureUpdateInterval = 0.1f; // 温度更新间隔(秒) + + // GPU缓冲区是否已准备好(线程安全标志) + std::atomic bGPUBuffersReady{false}; + + /** + * 创建GPU缓冲区 + */ + void CreateGPUBuffers(); + + /** + * 释放GPU缓冲区 + */ + void ReleaseGPUBuffers(); + + /** + * 上传温度数据到GPU + */ + void UploadTemperatureDataToGPU(); + + /** + * 从GPU下载温度数据 + */ + void DownloadTemperatureDataFromGPU(); + + /** + * 调度GPU温度计算 + * @param DeltaTime 时间步长 + */ + void DispatchTemperatureCompute(float DeltaTime); +}; \ No newline at end of file