From fcc16411894e4ca7383dffe8d2cf0873a0027da8 Mon Sep 17 00:00:00 2001 From: zhangqing Date: Thu, 13 Nov 2025 18:48:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E7=BD=AE=E7=A2=B0?= =?UTF-8?q?=E6=92=9E=E7=9A=84=E6=97=B6=E5=80=99=E8=83=BD=E8=8E=B7=E5=8F=96?= =?UTF-8?q?UV=EF=BC=8C=E6=A8=A1=E5=9E=8B=E7=94=A8=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E7=A2=B0=E6=92=9E=E3=80=82=E4=BF=AE=E6=94=B9=E4=B8=8D=E7=94=A8?= =?UTF-8?q?=E8=AE=A1=E7=AE=97Shader=E8=80=8C=E6=98=AF=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E7=94=A8=E6=9D=90=E8=B4=A8=EF=BC=8C=E7=9B=B4=E6=8E=A5=E5=9C=A8?= =?UTF-8?q?UV=E7=A9=BA=E9=97=B4=E6=A8=A1=E6=8B=9F=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=BD=A2=E5=8F=98=E5=B9=B6=E7=B4=AF=E7=A7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Config/DefaultEngine.ini | 3 + .../Blueprints/BP_IronBlock.uasset | Bin 30842 -> 30786 bytes Content/Materials/M_HitCal.uasset | Bin 0 -> 26811 bytes Content/Materials/M_Iron.uasset | Bin 16302 -> 20225 bytes Content/Res/Box2w4.uasset | Bin 786683 -> 786738 bytes .../5/SI/6K90CL2ZSQWKILI9NQQLEA.uasset | Bin 3665 -> 3491 bytes Source/BladeSmith/IronBlock.cpp | 197 ++++++++++-------- Source/BladeSmith/IronBlock.h | 7 + 8 files changed, 119 insertions(+), 88 deletions(-) create mode 100644 Content/Materials/M_HitCal.uasset diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 20b38fd..516f8ad 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -102,3 +102,6 @@ AppliedDefaultGraphicsPerformance=Maximum +ActiveClassRedirects=(OldClassName="TP_FirstPersonGameMode",NewClassName="BladeSmithGameMode") +ActiveClassRedirects=(OldClassName="TP_FirstPersonCharacter",NewClassName="BladeSmithCharacter") +[/Script/Engine.PhysicsSettings] +bSupportUVFromHitResults=True + diff --git a/Content/FirstPerson/Blueprints/BP_IronBlock.uasset b/Content/FirstPerson/Blueprints/BP_IronBlock.uasset index 5e077aa8cb4d637726ee687e0b3c598c9f61e102..e34a01fc3a4bf16cc922c665df167ee21d68e788 100644 GIT binary patch delta 5732 zcmcIo3s_S}7M_~`3i7a;AcBGlNO-6y2#Nwx8xRmeAXx#yfYGv~}X z|IAJ2BkKGkYKM*W*`X%WoX@h;pDNDDC!HvpyJuF(j+5~f<9U=t20|#Fg^)SW-*7zT zA*-}R$O7I@4M%7gP)BQcKwIYUk}j~)y;HzC1N@8dyD=4^d;8XJ)i(V$qiElxKWgt3 zFDG(hi_Bt-Ob~^%NyV%o@aFD5S1{QK;nCE@%H^yQHivjA$dsgJj0#>6m!633J$E>UhngIt z1tH7Ry)s4LH#e8jF?V77)$3Gr16M|eKBa33XPCL07aN)j(g%9Mzc z;+HX8B*Ycwu9UDc)p7?#O~JiZuGD*#u7hh|zBmmjefiQp)Tr+TJ9BqY@8TM+w*|OB zw};?QGJc#n6yI1iu#ejc+(d)iWd^w^f8zcD7SjI2Z2|5ggWOny+&F{Wr3Sel8sx4p z$c-?_T}imyg-m3U`$b4XOCXEsmdema;LY+rOX&=kkOc<09~k5=G|2s%o=c_Ux>ZB* zvrKb(hx*ULB060Cszl8E8d%lhS0pPL$rF&!KH~MmomeO1u`L|VKZ#3aXw6*77rTPMGy6ZbG;;w=%!80o|gDfH;n5xUW25D_OZ;x!OGSh5<# zDZthn-$^>qZe`Hoh>>2_2|5mP1?tB1(=%!DX%MdfmVWfV8Sx&Sc)Y!rbwoe0e)Re* zdh`Jh>vzBv86kb;9nQjX2WxzLl@X>KK4JZAUb)v{C5y*X$*m8{s*_{3^*mOZ)CoA0 zlPseH6pCi|G5;!aV8l*e+*54c~nxHH<+E!{8Ds7k!xm!@rC(x`Clqmo92ulWh@Q($OJ zX>i9GvvuEU55;mMtG!XD+ql-2p!PQ9fHOBIbNxf&H`ec`t+_4S+8p$)RynXtr9f`t zE|sc0`k@(G#fjoZvYonaZJM;-MO{)$MdWB~m-_{r!ATyTvZ_wxnk&6^p>Pg<*yBx& z`a2Q*&i zvG~4E5}#bGd8hljl-Bx3%3X0D1Rwc={B&G!CC;;^W(yhDIo3jFVb&466FO~k*9?c>^2!kTB%JgO(IT{-fF zt;8>|=2;}Wxwq0q4p{Ti^&HQx=tQOI{gO2s)j6JPYuOK6 zx-RU$XO%tk)K??#Q+d(Vm9o~b-wTt`e3CRJ?9XF+@<3PaKnDYQ8?rt&L)#Tu1=6x7 zKORS>9h<^Lo7^w8hJg_z<^1TmwvO~@4T1gp?Mf4}bgwG`s(m)Rb1i%;)ozeaKd0fF zx~N~c<~{L!;yS&um2Xjcu>&lYDP

_MlwF(og*FKOInm+`Ah@;!PXPEw#5iIu&R+ zM+0P$M^_}9*Kbc1u%{yaJ0Xx3%LC}3Ah37FOcD@Sy)KV(=Hx}P0wFg-dr?NC7>S@Z zCc^;ZAlS9W{Gr`<_@)9*q|wgqhBjGggJaj*bKp?1NeI)$9BTCF z_3R^F@!652IEdE5qWEla)nd7wPQ{+5H1$1p#CyX<$6}vD!moMMUc35TppqBK7Ps1@ zx@H|aG7(BQTxkkD$C2L*x>VNuxLb2xJ~TdCR8iv=!(%xcM+igLwY44WX~qY=#>iy0 z(n*0|Cuvc%6L`9$FcXRy(mGmWR-hu8j;_{y_Srqzw8%Bn^8+8;aq#N#Km1wc@kiD3 z>St8pF*}yzhs0^8+<9~~EW8)xWcH%$qxULfQ^I}?w7N3rl8LhU#J#Dp*Bs^~d?ih| zaJgZx_3nmD-`T-|o2MKZoV@vntQXlI?s?V|wCAMFaW`q5sBue&V7?_Rfi*P%JSnBO z5pkY@TXP_KIrVa9vc6*-;eseq;fNy=&_6C2EheSmr{F0E-X#@XNT(HwE@}xc4Q{M8 z%8ROxWG{NSXZs=9*U4_^TD?%#IW4FC)9#g_-=E3YsV$%Pa8DM zzH^Bzvyg8*k;aLT4w)^~JWpv%@@E?$C66E_%N7n0Gr;t+PsLpuBYB#4$|CiaD5DQHwdtEdWA-)lG})R-?fH=%)h6(tc+5}wHN6iS;!zP2mR== zwm#J@-7RzroRn;k0yOTG3D9(lJ7agjM8O^50rKHsai))XPSc?h+C8CXR}|3$wTY=# zp^H4$Hjs*;^>j0jQtb!mq|pq{8AV!ww0xGajei-XjRwFA21KLiL+3zHj}986iy&hG zB#YTg$I4|+eb8t|U~2B@*l$?)NZzNDC3(9#$gX%uRU`&MXa*b?6yzqClrXQpxy$r#p|Fq~s8IBT_iSS>(|BbLCD44-4Ep)seb_E&L`K zf9`?Mp~`ptq^`5+d!vB4J@Oe!2z^_Ht8_2<<|EBZN9ZRlB==r&$s~=BMN2p{=j&c{ zW1&xOr+kJ-2)PE+OfnwUKsV-EtW(CNOFaDGqq?tgNRP}Ez_45x>dnyp!^PM_;%y;j zBxLqT{HtUH`5H%I3|EZJ5oR~2A zl~s7cDu&_PiN^Rs!eDE?KCS*r0I2{>Ee#|eRx5|7Ad5NYl@LO+>c zDEXlblmEJqjC^GQ;RZGF(WL{p{*0)9i23;P(y81DjHG|4UpncX_?nY_bKrwZId3q# zF>&Hs&2q=QvTUA#75L)iDIX~VI4#X$Nq`2}TaOs1cWMd`5^FXK`3h@5hz zKdE0(7PQs}>GQb%Yrle-_3DF1`(-+v;d-NhxVz&!wIPdJj7iqB-kYFO}@>= zmq9iIKTVr%8~EC)NNjX0Iw1d#K!m(DKc;NxM3}S82G?fvcy5Fz5fHv CPe2&} delta 3257 zcmb_eZA_b06uy^_Ns*Qocng%mhUjR=$0#xpsDpuk0_97`l)B+uf$~*8DzMEcTe8JP zVgj5jWI7j#uMWQ{}e4eanO75T3Ov+KP}$OI-_;X=Ub@GO9&~CAS8~- zxj48hNQMGkH~FUu@Vm24rTuVpBGCl+C}(K37W!xpMOG_;sy?z5qF5z@}4>Vyw6sm(tf@o^;7Z}`lw zd*toNgufYXvhh~qy*BqTLcW-{{Oms-dmxfJAYPZHad5&ESd1~paKix|x(o(*OJ}7H z|D0}$(x;$AZ>2l^`}9izV^6{-0iz%(>VW|r(k!in+fvcQYn<~23!{hYb}mt1!Z-x( zcZTa$rbsAUZ)n^ELBhV!KysboJYnE|W4JwG;yTELf?O{XBz!eY!mcoJLjuS5m(Ac( zxCxQ+lT!q`cE}yFYBI;0tq6%u9m}}yj{lO};ca4n&P8`F{I0h7k z9ek-QlEw}nTnSpXmNh{{<>6cMGm z44XFk{bzF@*ZO_AOjme^kzd8|suaO&Wk`JMBQ+9P>2-x{V87wvGQw~SUmi#HV-JTcS`EvBSs+`I-1 zV}%$}0z{WSux1e%2KuO4h565PCeF zVDYY>=d9*go|%;&=s8msy!U#I#2!$2s2fPtqP3x0RQ&vi&VOi2!m&}z;lyZJh%*@) zGl8!^CYFcB{@n-e^DWk}DQLp^F#~-8E{tuHURomuywmAWJsz(q;ND``J)W}ihNmHs h@`m6OFEWr9GzIp&#`fI7-;fLA*cdIQWYFy|`WGAz0=EDF diff --git a/Content/Materials/M_HitCal.uasset b/Content/Materials/M_HitCal.uasset new file mode 100644 index 0000000000000000000000000000000000000000..519fde663e0c60397e8efa680121bf629a326d25 GIT binary patch literal 26811 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 literal 0 HcmV?d00001 diff --git a/Content/Materials/M_Iron.uasset b/Content/Materials/M_Iron.uasset index 31b9dde5170d9f8b10777f100f3efb34b6dbe254..9c2112eba53340f11356a70680c0585250d5ce35 100644 GIT binary patch literal 20225 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

EruRTn0i(PMo*!|$90}^HL?c5_I?*}(; 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 delta 9650 zcmdsdc|6t6_y6m4?JkKf$u8SPghUi>NfIu{D3TT`*^~V@bG>dKpLg~BegFQB$J{e>o@dU?oH=u5UQ>S`SDQMfCUh@cDfP$P z+?*2&f^ZWMWDHOQIj?Gk7Mwq}1Pwf&uomS$U$20!IzOSH$_KC*1q9&-bfvMgkK0Ns zw}UGUeUE4aYQlC%GRPW04NPX3DY}AY24p!vEqDonEP`B6j}d}6f)oM@bFU17)Xt`Q z{9qS0Pv7C&TD~UNFuPtr{q2y+>-mIU*Pu<~;O)Z8t=d82cHGxDBZieU--a+?X!^1ezXp!U^(Y z+{I%Qu%UM%*m4qC^%~Ba`tNoKv@vsR`9!~6=psf7lf`(vx2wXAd@Ko@ITbddD5CqlaXBLP<^b9TnJ#r=Q zeC6o8_+tegEKE>LrI}}*J-whQ?1^bDF0cnJ=S7e_tX9xW@!yir#>_D>B`4ki=EBK1 z3Ta|aWY%R+aCkvijFzCTQc@@sK%kjAm?BErQ;)Lpx&}lLACe_Sz^y9MJCV*!&Y(+WM3a$x>u=G~+0@%)w8_#4F;eK9RxF*+ zAJd?72hf5Ca~dsG=-} zPiiSDE~xr&G;`0S1p$m>OjID3XaXb&4z6i|LpcM!4z_F0@GYk=Gcvm#N^Yx)M;?GN z$P4#3v!pu^kQ&5Frs#Q-VMvuC5rWqly6cIhB%N@ti z5>nG|oE%EakGEi@`@XOLa5hM0s`|7(ec6Yz*6T%eB#ZP@6yBt>Peit#RhzQ*Nar~D z=H7rA0Jl&plpGM>M7`eO+WcHg3jcpZjz+fsMN)e*VA+&EZiFZ>L@IR?=`srLEMu9^ z^qb;BKl>mCpuke`b~gT>5E?CrzVzn^)$%OQw_N-v=@mTFXlcPxQPXb*DsCiHk5s1? zT>p_T2nmJD-B@vNV6)Bj$LZ{r)Zw}t65GG0vz>)Dh!qcKPkJUXiU4Z_4rPMUlIml? z`L^OxtZ?YDs*PCtyp&=p&1oEpq2i=DWW|)#QTKMbs8#M8QWvP4ucMnXwlc;DV> z&?O&tJ|5+DPVN#?hR15=McXpTWO~nmVAboMs#3es1Y0@ zJKO^{z%WLz1LQN<12PzOz*?~Zx)Oy=*Pz0)w0CxB(tP?`} z%aM>9qM<$1ybiF}z|JERw$1kCTDwe@enuD$o@?!j-4K(*CYB4+mSZkKz$J6PY)$7Z z)6P~pohzRO_M-Q(N@aEa6KkM7Y|R1I0XzcUG;^%TvL(4H*o#&6M{U$#>3Y~iqK zuzJbr+X}oOtw@V5bP0GsI}B9mTpk(G$Ud-EHZV|8*hn->@B^}GT7ZqMQfNJ85!jjp zMg8$^^IVhhYHlBd)H|7$tpS{9nv9Odm&PNf$IUk>_JbcXORK)HR)~RLRTAqQ(o;Aq z*xnlDA)!_^I9744-Iyh_tmmWRx*qYUt7rJ4OY-KB&5bSxXCFk+k~QgLoK-`U_M$^H zqoMSUl~*RF&pS(=3Et$I?0byv$?z%&rB&=x(l`=~DXE ze?Gi>!|)Cw^MOmXyf7?Secf%UwK5w~2P5=6!M04?^9~q;Tt-G`XDJXv5~IoK1P}(j z98S#+F?J>@OFNvlg%L#%(|t4ThqS17e!OJ0v1+g&uDaG(o>N z?=v_X=t4jlK^p{rEoLkSr`E--X9vPas0uI@FYUIMQUaJ)9yAr&>HIx=gztt%G(t-b z%{TnEOwZhy5fD#37W=P|pI>Uha<}VA_Hb<_|4e%*<6Ph`IZp-A zfhK}b)j$-CY`0aq>V;hpF5UCvW@GA@Dc7^=3-_UmVIINi&J9m06Qi1;Uu z2gdTXfRm6pMg)Y88^Tr(EeAKmz>7;zzx9VC4?4~0vy1C6&}^A!QvFyg9AOC0KAS1#9z_YmW&L#TxV73 zeWKVIBQ3@S=%Q%D>C=5y^%NfKQsv|=*tusM| zgbL&{qbqQ*|3p``gQ8KxlE2Cea4AD)!K6U%NI*a3ZL`M_Xka`S1Q)eG*X$z zgUa1}IAvtlmoJ;Z`H+{+#l@qh+X!Ml*LVaC91vf9O|`VM&5V%sz*H!3SwTS%-7Hx0 zKXlZGdJeA`>IW$&jYpqsagT0d1$Ltk0%EPbUkKEvg zneZCqg`G~~T=;>^Osuc~Mn#FlIll#?{wL6f31W*CNgjfDO$4V*ve*eP zIWswc!VfFN1!utT5}1BzsWHz-R^SxQe=XyCLb9DrWgX6Cs$tUk*NOkO&@$LcWDjiN zhBsTNRF|pLLI+1z;q;e5LzjSw*&CBWp3SIN`8CgVl+3&C0&j?CJ_8nJA)CvMFggac z5NxNi0_sw7LiugJ$ikMeHJqJ0EFhQ}N=98Ux8@bnhZqb5VZkXBTDbJVaO7*L?0^j+ z=9jK3E)EG}r8z)B4reZG?*Q9Vl%abn;_xraAoV9enh9W%Z-iI<(r!5u#_3POSbb0v z!Kzz?!Rhd?q=46d0p$M#@c#*bk25g+qDp3-4*;eJ&Oml!*U7?c6i^MshT6o?HL%Y3 zVg(OJjI_{x^INaARZw0FM}OHz2tqeljf1XmtDyE!r8NBHX8M3PjxSWb11=5iD_j~6 z9R98DZ8%8BDI|9e?$1J}Om-&q%WPJn^grZ!= zKWi4RNGJ!iBG*Bjw*sRplKClkjrLpaf!}f^ajpn9^gE|n%7k(HlPLWOfcA&!7vBh* z=l^_@fh({9=fO<|GFGR+wVWA2AjEL#jkwSWoWjYfafL6ak(aH{|=Id zDvr`|3JGIH*nzws&RpmuULf=@#a?vqa|PgN2xASF;589!U8}I*=HIkrL=FQ+ObEhZ zSDZpJ-zz9E2kMW53wz(ih?{Az*;FiWl=<`nZAQm=kSuJq6RUqs#zwltXpC242>*Kx z7Q?qzn0^72=lQ<^?0*8_LpDtRR)x4==B*s!%=zt|m-?@f{vVhh7ju4FVbGC-cao#{ zOj&RWeR|>g9AN|=JKWU~8(i!c@0bAb#TEyhaS91zFEC$=P5yrZ$8dp#BX9&ejJ-vW zb{k?OT;Sj9w^;NK07Auq-^Qvxfhe3WO#cyJh9|&;+X0164by)l=Iij6A;7dK)8`87k?xEWydTwVm8AmG?@g9Kq8EoE&dxA_Nl3K7)P{m3JJqaf(;)^2A544FuQia z_(_5&D|Y^!Bro(YrW;vdmG7kBKPt>`a{_qmUXPi!a$~wZJJBszQjY@ot?m&PYYDjZ zfrW)d0CX@PDhl^@GCC!SZ^1@-o}zW()$b##-=iQCKxP4%6=XJ$*+J$2nG<9#kh#mN z-xCwKgrCp_b|46k1cEe(Q)J^g!_S5+W?#%HkmUW1sLb*#&ME1_H=-!IG^y+x(UJSC zQJJN_*2{+0u_TEBqA;3}q&+~CLw%EW4G<;K#H`{qe9PzP_I-anoUF4vp-6x^2xtyf014K%ilTu9 z?hZFR1j}1&X{mp0F09?8e&~CPO4#EX^FAz@)_-${RJF~MJys3fw=SEQHHN%!Z)nu> zoYrB}d+v3t1AD*st^bvEcH*O*Qbo zYj{WV_>EHsv|8mpOPj@etTZ!R?lzLL*>GLN!;?CPE7VPs=~7YY=W1g2M6A0o5_#NM zoX}wtK^L_6WmX_yi)Nj*}9}gOn2F!g!zZglzdC+D+M`TKPK}J^d)Kpk{=1Y z$PqSiR^52Ch8WqJ-e!45kIyegM_EHTBW9E;-=Y&wYZ*`Y*yP4r#d+YOYvN5;uT{w! zD^-qP-Fw4`AhS<&yhiiOO#ks}8QH7$E-nZ2qxPz_n(nUF4&@73u4oa{EHbgUDLi90 zvcIDz`Oco}68mGq6~a?4C?1K`c(!WC(Dkl05ub8e2DF7U+}~Qal(Z6;jf^DmIcb(P zJYTeivoFSTDf$h0O#FJ6oT=$l>?XT|#|}Hv<$yXTnG6#Zg+%A zr?r8(Szd+ONm0W@B^qnBLVs#X_~I4XAt!d!XrFJ*yG^nnZ;02`k~yU9x&u{hrKGnP ztT@i@P$WyH7NGQW1;j|!PxsO%$I)Ve=SuYgsK@=IzV5IWIaqQW2@^ zu(DekyvB>`e(-iVxr}EMthVS{HPuD_mp#+{J*OoKdWO2QR&7|iq(55y)*f5Bqcr_l zYs7eAf`a2pzC`m|dqmG<7WAmu9ajlXzkVp?g_I(Xx|>+e8hz)OWtmeM&st?u&e|S( z{7KTsCZVhL+w>(~U&994*!n`j_xB@<1PA{rRJdfZt9rPT^H!)3%X$7AXUfz{DqFWV z)NjjD{`z>xrb9fd>fk^p-=nle5^H-dZEY6Y?s|BSs=sQ$uJ87YIQ@7Anc754UTbkhpX-K$ zif6avIa>a?0uDz3y>h;7TaP*|>#kiL{p7B0NW{5w8Xi-QMv`Q`+KP3)j(voBPK}c6 zHV*yf&aaLKTQhFEUipLRiu3DrrUA0E1GL2>=Fe``P5Ot*x}i(J>Q;H9CDmPSe(H0xyS;1nIIF4EFXO$s7EPEvwr4 z$e6wBt_d$o-F{LULAXRi=$>tk%7MHOV##rL)B~HMc~V}Ud_B#AtWC<)G)O@5*xX)U zXiTpSGE!?FoJMbN-SYv}AIrFmUOMgc%GvSmhKBX+y1rB5oXWRbYGRhA(q9CLTx~+pp9oc_{Z(NmSdxORHD6JY_w8x_-{-_GtF{vJ5jk(8wR@bR(A$iY?783=d{^{jii!Ew-@_-dtU2==^x z=YGHU!>6`xv8^DTD#$AjbN(byN4t4Cbe~?5|ve)*#_`~>g#64D3LvpocXib?4x^Wt3(x(B0NJ&x?9 zK43jUuXrvK#nvqKG;(SsW%EFAxn11~L**^S=N(Ns1)f9o+SNLCTc2N$UsQdQN7S3#s3=~AyQfr^7ZmI%zjOEV;dkU(=M(*$9sHXf zeA}-OdH&?#1Hzui)$VUz(h=RrSCpB$@{oanL#=c5&d(DKx-HfXG_&VsUbOdKW6qvN zeXTCHWmp_OF4IpS-BOy^D)nUVO(jJ`5|(AdRjPb*aZ5qjz76}L3AT2&?S&5ETmRo&#qzBY%AeGYpdEx%aEFV6{9@8i9@BQ$)pz(Dd6JQtTtjm|gg#1ayIxD<8GVIGsW1GGg?h5i0{}Oy? zw?nOea>Kq`K~<#{-YP!|tcr7k^qViRt7s++utxJejC{XA>1v4k57G=xdg6tWW&|-R zG576B5AHUnLoC}rEb8*t``dKHvEYMorG3zq?Xwrc9%NsMtBg;GFn>2XoM~4bq(ht= zqs^h{+{0l5s!+i{&7a4V-Sc&i+}M{|`PpDai|nG}!sZYAi|zYTcL!Z5*>>ehx=z^1 zrw$0)hVX-aSEYn8jvCwNN)t5cnVP9%UA*?o<0MH2H!V+=9Zf7BJ(Qu_pqG|-Htk06 z7Y9?_hNt5JW2$D~YKlBYZ;nYh=6|6Lo@tX$4i~!DF0x7N(&a4YTCo^*l`^3YB72-# ztZwbaw8Khr4KqjBm!}Ems%=vf6iE6o(alaI6ca+as>7aB8`mxg=aq4NE8n1{vo>H= z_?lJM*JyhCKX heQ8XmSe+9FpJIN9UwOzJu>j>M5}$tvh5t?K{{iI|T&@5B diff --git a/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/SI/6K90CL2ZSQWKILI9NQQLEA.uasset b/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/SI/6K90CL2ZSQWKILI9NQQLEA.uasset index a42e84f85df35159e86988a3d552aaa8d6d09f24..c991b1eb70a8f2b9eb1c018327bcb2ae5a979873 100644 GIT binary patch delta 1231 zcma)6T}V@582--O+}U4gdd%8fLCR#BiaMK+wzFpD1lu&jhEUsBDRa(TC3)$ zxbOXv*L}V8?)3eU_^5@m#}gK1E?DW!tb@4@2O(QPX@|@R7j5Lq$6P8xka(L-hz8^c z=!jYMnnWL2e*`=Zgwou2`AQI?Z}q3yPcx|E%e53P==zc@ft3Z0XQS2%eBMWco^Cx79rq(vPeSR!ViRf-GwdYHCE z2K>R}d!mEE5UF`+dQImQ?>H-M)Rfa5%B370Ts;0@*nc!cV$G)o+O2Y~!<4vw$OfRh zI7<<#i2Sr5U!j`7<{ElWWi%jD_=_1==TUPuZ(9YnNM@NtA?Mr7IJ{~Tn`UU0U&&(cd#-ab5D7c%mdT%x79pyZHl(=Q=vWuW(6vOJnA2^qHpC zbYfT(#U^(sQs2|OKTs7u);iqLvp3x3YqQth-l`Qi`dL>wr58#(VkLNrUKn@LPLxHe67N~9;M9zt&nruUXNGGPH zZ?sB9Ljx_=*N@@RN%9@w7E><`q!twhB}(iZ)>zOTYe*SEb;ytZkCCjYNe&CdlF-uh zfxdd@`n6;Pe+L9JIX#D32BZDXzGyI<>ii5RXlo+?kB88^loW?(>b&E+E77f**V`i-*@JmJ9F>cFL@m* zn!gg8S~X4cL>?h-iI5fWgcy}Esu*46^pP=INQaGya$0RXFW=w;E~^?#$GuTNb)ZL^ zV(qk|XUa(k79W)f@n9C>hYIq9JOz(`v;uR@^Xb;2cB5x@@7Uzyn~q5R-Fws7#_JQx zp-X3!G71{J4|Z_E&q2l`{p>CEdupwikfoRP7}wN-B4?fB(~F4aphq~LC%J>gnOT*P zjSxrk*+FTNeU{!EAG;jO`=ZBY-sA;o!UbGgW+>g19!irBmuDHydN|$NpYF?$!Io?O zg5UAF?oP#n43nJ66i$q`Ip@e%=;-H|FWQPW@tojLS1fd_N-p#Vc!Y1H#LgTL%okuv z1;af$F~b&~TLE2!W5v36h)3weB!4r7_8J<(N@}S_?De9XeRU!yru+GyNw@M&YoH5? zuH2)8v?;=GrWr7cAXkfQzPe!~aMxqNEO&{$Yd`-;OB9cOuI1x|R|+ZfRSfEOiP6 z8p>MR5Lwzd-cYmnlZbMBN=veLF8?+?4w+diJJ$t5ADdTqFi8zY;bWB&1vn@gewfg(uz>0CV(YwNYvTskX>ZLhnv&rY diff --git a/Source/BladeSmith/IronBlock.cpp b/Source/BladeSmith/IronBlock.cpp index 20c681f..842e1aa 100644 --- a/Source/BladeSmith/IronBlock.cpp +++ b/Source/BladeSmith/IronBlock.cpp @@ -16,6 +16,8 @@ #include "RHICommandList.h" #include "Engine/Texture.h" #include "GenericPlatform/GenericPlatformProcess.h" +#include "Kismet/GameplayStatics.h" +#include "Kismet/KismetRenderingLibrary.h" // Sets default values @@ -105,15 +107,15 @@ UTextureRenderTarget2D* AIronBlock::CreateDeformRT(const FString& RTName, int32 if (RenderTarget) { // **关键修复 1:** 设置为32位浮点数格式,以匹配 FLinearColor 和 CS 的 PF_A32B32G32R32F - //RenderTarget->RenderTargetFormat = RTF_RGBA32f; + RenderTarget->RenderTargetFormat = RTF_RGBA32f; // **关键修复 2:** 明确告诉引擎我们需要为这个纹理创建UAV - RenderTarget->bCanCreateUAV = true; + //RenderTarget->bCanCreateUAV = true; RenderTarget->InitCustomFormat(Size, Size, PF_A32B32G32R32F, false); RenderTarget->bNeedsTwoCopies = true; // 告知引擎这个纹理会被用于Ping-Pong,优化内存 - //RenderTarget->SizeX = Size; - //RenderTarget->SizeY = Size; + RenderTarget->SizeX = Size; + RenderTarget->SizeY = Size; RenderTarget->bAutoGenerateMips = false; RenderTarget->AddressX = TA_Clamp; RenderTarget->AddressY = TA_Clamp; @@ -129,33 +131,33 @@ void AIronBlock::InitializePositionTexture() { CalculateLocalBounds(); - // 获取顶点位置 (用于计算初始UV->WorldPos) - TArray VertexPositions; - GetStaticMeshVertexPositions(VertexPositions); + // // 获取顶点位置 (用于计算初始UV->WorldPos) + // TArray VertexPositions; + // GetStaticMeshVertexPositions(VertexPositions); // 创建位置纹理 - const int32 TextureSize = 256; // 纹理尺寸 - TArray InitialData; - InitialData.SetNum(TextureSize * TextureSize); - - // 初始化纹理数据 (将UV映射到本地包围盒的XY平面) - for (int32 Y = 0; Y < TextureSize; ++Y) - { - for (int32 X = 0; X < TextureSize; ++X) - { - int32 Index = Y * TextureSize + X; - FVector2D UV(FVector2D(X, Y) / (TextureSize - 1.0f)); // 使用 255.0 或 (Size-1) - - // 将UV坐标转换为本地空间位置 (XY平面) - FVector LocalPos( - FMath::Lerp(LocalBounds.Min.X, LocalBounds.Max.X, UV.X), - FMath::Lerp(LocalBounds.Min.Y, LocalBounds.Max.Y, UV.Y), - LocalBounds.Min.Z // 假设初始是一个平面 - ); - - InitialData[Index] = FLinearColor(LocalPos.X * 1000, LocalPos.Y * 1000, LocalPos.Z * 1000, 1.0f); - } - } + const int32 TextureSize = 1024; // 纹理尺寸 + // TArray InitialData; + // InitialData.SetNum(TextureSize * TextureSize); + // + // // 初始化纹理数据 (将UV映射到本地包围盒的XY平面) + // for (int32 Y = 0; Y < TextureSize; ++Y) + // { + // for (int32 X = 0; X < TextureSize; ++X) + // { + // int32 Index = Y * TextureSize + X; + // FVector2D UV(FVector2D(X, Y) / (TextureSize - 1.0f)); // 使用 255.0 或 (Size-1) + // + // // 将UV坐标转换为本地空间位置 (XY平面) + // FVector LocalPos( + // FMath::Lerp(LocalBounds.Min.X, LocalBounds.Max.X, UV.X), + // FMath::Lerp(LocalBounds.Min.Y, LocalBounds.Max.Y, UV.Y), + // LocalBounds.Min.Z // 假设初始是一个平面 + // ); + // + // InitialData[Index] = FLinearColor(LocalPos.X * 1000, LocalPos.Y * 1000, LocalPos.Z * 1000, 1.0f); + // } + // } // --- 关键修复: 创建两个 RenderTarget --- PositionRenderTarget0 = CreateDeformRT(TEXT("PositionRT0"), TextureSize); @@ -165,39 +167,39 @@ void AIronBlock::InitializePositionTexture() // 我们需要将CPU端的 InitialData 写入到GPU纹理中 // 最简单的方法是创建一个临时的UTexture2D,用BulkData上传,然后拷贝到RT - UTexture2D* TempTexture = UTexture2D::CreateTransient(TextureSize, TextureSize, PF_A32B32G32R32F); // 必须匹配格式 - if (TempTexture && PositionRenderTarget0 && PositionRenderTarget1) - { - // 锁定 Mip 并拷贝数据 - FTexture2DMipMap& Mip = TempTexture->GetPlatformData()->Mips[0]; - void* MipData = Mip.BulkData.Lock(LOCK_READ_WRITE); - FMemory::Memcpy(MipData, InitialData.GetData(), InitialData.Num() * sizeof(FLinearColor)); - Mip.BulkData.Unlock(); - TempTexture->UpdateResource(); // 提交到GPU - - // 获取RHI资源 - FTextureRHIRef DestRT0_RHI = GetRenderTargetRHI(PositionRenderTarget0); - FTextureRHIRef DestRT1_RHI = GetRenderTargetRHI(PositionRenderTarget1); - FTextureRHIRef SrcTex_RHI = TempTexture->GetResource() ? TempTexture->GetResource()->TextureRHI : nullptr; - - if (DestRT0_RHI && DestRT1_RHI && SrcTex_RHI) - { - // 在渲染线程上执行拷贝 - ENQUEUE_RENDER_COMMAND(InitializeDeformRTs)( - [DestRT0_RHI, DestRT1_RHI, SrcTex_RHI](FRHICommandListImmediate& RHICmdList) - { - // 将初始数据拷贝到两个RT - RHICmdList.CopyTexture(SrcTex_RHI, DestRT0_RHI, {}); - RHICmdList.CopyTexture(SrcTex_RHI, DestRT1_RHI, {}); - }); - - // 确保拷贝完成 - FlushRenderingCommands(); - } - } + // UTexture2D* TempTexture = UTexture2D::CreateTransient(TextureSize, TextureSize, PF_A32B32G32R32F); // 必须匹配格式 + // if (TempTexture && PositionRenderTarget0 && PositionRenderTarget1) + // { + // // 锁定 Mip 并拷贝数据 + // FTexture2DMipMap& Mip = TempTexture->GetPlatformData()->Mips[0]; + // void* MipData = Mip.BulkData.Lock(LOCK_READ_WRITE); + // FMemory::Memcpy(MipData, InitialData.GetData(), InitialData.Num() * sizeof(FLinearColor)); + // Mip.BulkData.Unlock(); + // TempTexture->UpdateResource(); // 提交到GPU + // + // // 获取RHI资源 + // FTextureRHIRef DestRT0_RHI = GetRenderTargetRHI(PositionRenderTarget0); + // FTextureRHIRef DestRT1_RHI = GetRenderTargetRHI(PositionRenderTarget1); + // FTextureRHIRef SrcTex_RHI = TempTexture->GetResource() ? TempTexture->GetResource()->TextureRHI : nullptr; + // + // if (DestRT0_RHI && DestRT1_RHI && SrcTex_RHI) + // { + // // 在渲染线程上执行拷贝 + // ENQUEUE_RENDER_COMMAND(InitializeDeformRTs)( + // [DestRT0_RHI, DestRT1_RHI, SrcTex_RHI](FRHICommandListImmediate& RHICmdList) + // { + // // 将初始数据拷贝到两个RT + // RHICmdList.CopyTexture(SrcTex_RHI, DestRT0_RHI, {}); + // RHICmdList.CopyTexture(SrcTex_RHI, DestRT1_RHI, {}); + // }); + // + // // 确保拷贝完成 + // FlushRenderingCommands(); + // } + // } // 设置变形材质 - SetupDeformationMaterial(TempTexture); + SetupDeformationMaterial(nullptr); UE_LOG(LogTemp, Log, TEXT("Position textures initialized")); } @@ -240,21 +242,22 @@ void AIronBlock::SetupDeformationMaterial(UTexture2D* OrigTex) { BaseMaterial = LoadObject(nullptr, TEXT("/Engine/BasicShapes/BasicShapeMaterial")); } - - if (BaseMaterial) + UMaterial* CalMaterial = LoadObject(nullptr, TEXT("/Game/Materials/M_HitCal")); // 示例路径 + if (!CalMaterial) + { + CalMaterial = LoadObject(nullptr, TEXT("/Engine/BasicShapes/BasicShapeMaterial")); + } + if (BaseMaterial && CalMaterial) { DynMaterial = UMaterialInstanceDynamic::Create(BaseMaterial, this); + DynCalMaterial = UMaterialInstanceDynamic::Create(CalMaterial, this); StaticMeshComp->SetMaterial(0, DynMaterial); - + //StaticMeshComp->SetMaterial(1, DynCalMaterial); // 设置初始参数 if (DynMaterial) { // 初始时读取 RT0 - DynMaterial->SetTextureParameterValue(TEXT("PositionTexture"), OrigTex); - //DynMaterial->SetTextureParameterValue(TEXT("PositionTexture"), PositionRenderTarget0); - DynMaterial->SetVectorParameterValue(TEXT("LocalBoundsMin"), FLinearColor(LocalBounds.Min)); - DynMaterial->SetVectorParameterValue(TEXT("LocalBoundsMax"), FLinearColor(LocalBounds.Max)); - DynMaterial->SetScalarParameterValue(TEXT("DeformationStrength"), 1.0f); + DynMaterial->SetTextureParameterValue(TEXT("PositionTexture"), PositionRenderTarget0); } } else @@ -267,30 +270,50 @@ void AIronBlock::SetupDeformationMaterial(UTexture2D* OrigTex) void AIronBlock::OnHammerHit(const FHitResult& HitResult) { // 获取锤子冲击力 - float ImpactForce = 0.0f; - // 检查 HitResult.GetComponent() 是否有效 - if (HitResult.GetComponent() && !HitResult.GetComponent()->GetPhysicsLinearVelocity().IsNearlyZero()) + FVector2D HitUV; + UGameplayStatics::FindCollisionUV(HitResult,0,HitUV); + FVector ImpactNormal = -HitResult.ImpactNormal; + CurrentDeformationRadius = 10.0f/1024.0f; + UTextureRenderTarget2D* LastTex = nullptr; + UTextureRenderTarget2D* CurTex = nullptr; + if(CurrentTextureIndex == 0) { - ImpactForce = HitResult.GetComponent()->GetPhysicsLinearVelocity().Size(); + LastTex = PositionRenderTarget0; + CurTex = PositionRenderTarget1; } + else + { + LastTex = PositionRenderTarget1; + CurTex = PositionRenderTarget0; + } + if(DynCalMaterial) + { + DynCalMaterial->SetVectorParameterValue(TEXT("ImpactUV"), FLinearColor(HitUV.X,HitUV.Y,0,0)); + DynCalMaterial->SetScalarParameterValue(TEXT("ImpactForce"),ImpactForce); + DynCalMaterial->SetScalarParameterValue(TEXT("ImpactRadius"),CurrentDeformationRadius); + DynCalMaterial->SetVectorParameterValue(TEXT("ImpactNormal"),ImpactNormal); + DynCalMaterial->SetTextureParameterValue(TEXT("LastPosition"),LastTex); + UKismetRenderingLibrary::DrawMaterialToRenderTarget(this->GetWorld(),CurTex,DynCalMaterial); + } + if(DynMaterial) + { + DynMaterial->SetTextureParameterValue(TEXT("PositionTexture"),CurTex); + CurrentTextureIndex = 1 - CurrentTextureIndex; + } + // // 转换到本地空间 + // FVector ImpactPoint = HitResult.ImpactPoint; + // FVector ImpactNormal = HitResult.ImpactNormal; + // FVector LocalImpactPoint = GetTransform().InverseTransformPosition(ImpactPoint); + // FVector LocalImpactNormal = GetTransform().InverseTransformVector(ImpactNormal); + // UE_LOG(LogTemp,Display,TEXT("[AIronBlock::OnHammerHit] ImpactForce:%f,ImpactPoint:%s,ImpactNormal:%s,LocalImpactPoint:%s,LocalImpactNormal:%s") + // ,ImpactForce,*ImpactPoint.ToString(),*ImpactNormal.ToString(),*LocalImpactPoint.ToString(),*LocalImpactNormal.ToString()); + // UpdateComputeShaderParams(LocalImpactPoint, LocalImpactNormal, ImpactForce); - // 默认冲击力 - if (ImpactForce < 10.0f) ImpactForce = 500.0f; - - // 转换到本地空间 - FVector ImpactPoint = HitResult.ImpactPoint; - FVector ImpactNormal = HitResult.ImpactNormal; - FVector LocalImpactPoint = GetTransform().InverseTransformPosition(ImpactPoint); - FVector LocalImpactNormal = GetTransform().InverseTransformVector(ImpactNormal); - UE_LOG(LogTemp,Display,TEXT("[AIronBlock::OnHammerHit] ImpactForce:%f,ImpactPoint:%s,ImpactNormal:%s,LocalImpactPoint:%s,LocalImpactNormal:%s") - ,ImpactForce,*ImpactPoint.ToString(),*ImpactNormal.ToString(),*LocalImpactPoint.ToString(),*LocalImpactNormal.ToString()); - UpdateComputeShaderParams(LocalImpactPoint, LocalImpactNormal, ImpactForce); - - ExecuteDeformationCS(); + //ExecuteDeformationCS(); } -void AIronBlock::UpdateComputeShaderParams(FVector LocalImpactPoint, FVector LocalImpactNormal, float ImpactForce) +void AIronBlock::UpdateComputeShaderParams(FVector LocalImpactPoint, FVector LocalImpactNormal, float _ImpactForce) { // 更新碰撞参数 CurrentImpactPoint = LocalImpactPoint; @@ -313,8 +336,6 @@ void AIronBlock::UpdateComputeShaderParams(FVector LocalImpactPoint, FVector Loc // 切换纹理缓冲索引 CurrentTextureIndex = 1 - CurrentTextureIndex; - UE_LOG(LogTemp,Display,TEXT("[AIronBlock::OnHammerHitUpdateComputeShaderParams]CurrentImpactForce:%f, CurrentImpactPoint:%s,CurrentImpactNormal:%s,CurrentDeformationRadius:%f,CurrentPlasticity:%f") - ,CurrentImpactForce,*CurrentImpactPoint.ToString(),*CurrentImpactNormal.ToString(),CurrentDeformationRadius,CurrentPlasticity); } void AIronBlock::ExecuteDeformationCS() diff --git a/Source/BladeSmith/IronBlock.h b/Source/BladeSmith/IronBlock.h index d7915e2..9f29a82 100644 --- a/Source/BladeSmith/IronBlock.h +++ b/Source/BladeSmith/IronBlock.h @@ -32,6 +32,13 @@ class BLADESMITH_API AIronBlock : public AActor UPROPERTY() UMaterialInstanceDynamic* DynMaterial; + /** 应用于网格的动态材质实例 */ + UPROPERTY() + UMaterialInstanceDynamic* DynCalMaterial; + + UPROPERTY(EditAnywhere) + float ImpactForce; + public: // Sets default values for this actor's properties AIronBlock();