From 9d4ad48aef50a9fbf4f624b8583fef8e7a8abe5a Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sat, 5 Aug 2023 14:54:42 +0200 Subject: [PATCH 1/3] Update 8 Compatibility --- Content/InitGameInstance.uasset | Bin 5624 -> 11063 bytes Content/Input/IA_FIC_Editor_Control.uasset | Bin 0 -> 1378 bytes Content/Input/IA_FIC_Editor_FOV.uasset | Bin 0 -> 1917 bytes Content/Input/IA_FIC_Editor_Frame.uasset | Bin 0 -> 1903 bytes Content/Input/IA_FIC_Editor_Grab.uasset | Bin 0 -> 1783 bytes Content/Input/IA_FIC_Editor_Movement.uasset | Bin 0 -> 1878 bytes .../Input/IA_FIC_Editor_NextKeyframe.uasset | Bin 0 -> 1889 bytes .../Input/IA_FIC_Editor_PrevKeyframe.uasset | Bin 0 -> 1897 bytes Content/Input/IA_FIC_Editor_Redo.uasset | Bin 0 -> 1783 bytes Content/Input/IA_FIC_Editor_Rotation.uasset | Bin 0 -> 1916 bytes Content/Input/IA_FIC_Editor_Shift.uasset | Bin 0 -> 1368 bytes Content/Input/IA_FIC_Editor_Speed.uasset | Bin 0 -> 1947 bytes Content/Input/IA_FIC_Editor_SpeedUp.uasset | Bin 0 -> 1810 bytes .../IA_FIC_Editor_ToggleAllKeyframes.uasset | Bin 0 -> 1949 bytes .../IA_FIC_Editor_ToggleAutoKeyframe.uasset | Bin 0 -> 1951 bytes .../Input/IA_FIC_Editor_ToggleCursor.uasset | Bin 0 -> 1851 bytes .../IA_FIC_Editor_ToggleLockCamera.uasset | Bin 0 -> 1881 bytes .../Input/IA_FIC_Editor_ToggleShowPath.uasset | Bin 0 -> 1835 bytes Content/Input/IA_FIC_Editor_Undo.uasset | Bin 0 -> 1785 bytes .../IA_FIC_Playback_StopAnimation.uasset | Bin 0 -> 2089 bytes Content/Input/IC_FIC_Editor.uasset | Bin 0 -> 34899 bytes Content/Input/IC_FIC_Playback.uasset | Bin 0 -> 3814 bytes Source/FicsItCam/FicsItCam.Build.cs | 11 +- .../Private/Data/Attributes/FICAttribute.cpp | 4 +- .../Data/Attributes/FICAttributeFloat.cpp | 1 + .../Data/Attributes/FICAttributeGroup.cpp | 2 +- .../Private/Data/Objects/FICWorldSettings.cpp | 1 + .../Editor/Data/FICEditorAttributeBase.cpp | 2 +- .../Editor/Data/FICEditorAttributeBool.cpp | 2 +- .../Editor/Data/FICEditorAttributeGroup.cpp | 3 +- .../Editor/Data/FICEditorCameraActor.cpp | 7 +- .../Editor/FICEditorCameraCharacter.cpp | 190 ++++++++++-------- .../Private/Editor/FICEditorContext.cpp | 1 + .../Private/Editor/FICEditorSubsystem.cpp | 30 ++- .../Editor/ITF/FICSelectionInteraction.cpp | 11 +- .../ITF/FICToolsContextRenderComponent.cpp | 32 +-- .../Editor/ITF/FICTransformInteraction.cpp | 20 +- .../FicsItCam/Private/Editor/UI/FICEditor.cpp | 80 ++------ .../Private/Editor/UI/FICRangeSelector.cpp | 2 +- .../Private/Editor/UI/FICSceneSettings.cpp | 10 +- .../Editor/UI/FICSequencerTreeView.cpp | 4 +- .../Private/Editor/UI/FICTimeline.cpp | 1 + .../Private/Editor/UI/FICTimelineScrubber.cpp | 2 +- .../Private/Editor/UI/SelectionManager.cpp | 2 +- Source/FicsItCam/Private/FICUtils.cpp | 10 +- Source/FicsItCam/Private/FicsItCamModule.cpp | 30 +++ Source/FicsItCam/Private/InitGameInstance.cpp | 82 -------- .../Runtime/FICRuntimeProcessorCharacter.cpp | 15 +- .../Public/Command/Scene/FICCommandCreate.h | 4 +- .../Public/Data/Attributes/FICAttribute.h | 5 +- Source/FicsItCam/Public/Data/FICTypes.h | 5 +- .../FicsItCam/Public/Data/Objects/FICCamera.h | 1 + .../Public/Data/Objects/FICSceneObject.h | 1 - .../Editor/Data/FICEditorAttributeBase.h | 7 +- .../Editor/Data/FICEditorAttributeGroup.h | 2 +- .../Data/FICEditorAttributeGroupDynamic.h | 1 + .../Public/Editor/Data/FICEditorCameraActor.h | 3 +- .../FicsItCam/Public/Editor/FICChangeList.h | 2 +- .../Public/Editor/FICEditorCameraCharacter.h | 41 ++-- .../Public/Editor/FICEditorContext.h | 10 +- .../Public/Editor/FICEditorSubsystem.h | 4 +- .../Editor/ITF/FICToolsContextQueries.h | 29 ++- .../Editor/ITF/FICTransformInteraction.h | 4 +- Source/FicsItCam/Public/FicsItCamModule.h | 4 + .../Process/FICRuntimeProcessRenderScene.h | 3 +- 65 files changed, 339 insertions(+), 342 deletions(-) create mode 100644 Content/Input/IA_FIC_Editor_Control.uasset create mode 100644 Content/Input/IA_FIC_Editor_FOV.uasset create mode 100644 Content/Input/IA_FIC_Editor_Frame.uasset create mode 100644 Content/Input/IA_FIC_Editor_Grab.uasset create mode 100644 Content/Input/IA_FIC_Editor_Movement.uasset create mode 100644 Content/Input/IA_FIC_Editor_NextKeyframe.uasset create mode 100644 Content/Input/IA_FIC_Editor_PrevKeyframe.uasset create mode 100644 Content/Input/IA_FIC_Editor_Redo.uasset create mode 100644 Content/Input/IA_FIC_Editor_Rotation.uasset create mode 100644 Content/Input/IA_FIC_Editor_Shift.uasset create mode 100644 Content/Input/IA_FIC_Editor_Speed.uasset create mode 100644 Content/Input/IA_FIC_Editor_SpeedUp.uasset create mode 100644 Content/Input/IA_FIC_Editor_ToggleAllKeyframes.uasset create mode 100644 Content/Input/IA_FIC_Editor_ToggleAutoKeyframe.uasset create mode 100644 Content/Input/IA_FIC_Editor_ToggleCursor.uasset create mode 100644 Content/Input/IA_FIC_Editor_ToggleLockCamera.uasset create mode 100644 Content/Input/IA_FIC_Editor_ToggleShowPath.uasset create mode 100644 Content/Input/IA_FIC_Editor_Undo.uasset create mode 100644 Content/Input/IA_FIC_Playback_StopAnimation.uasset create mode 100644 Content/Input/IC_FIC_Editor.uasset create mode 100644 Content/Input/IC_FIC_Playback.uasset diff --git a/Content/InitGameInstance.uasset b/Content/InitGameInstance.uasset index 9079addaa467c8c1635fa26aa0d372d7948f80f7..1774a9a278d6f1f40c37c18f503a1610082906c4 100644 GIT binary patch literal 11063 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 V;@#0lk4mCt&vVh5!u+qFu928a_Cd;y* z8(I9cgq+1M#=jqQn~7o3XyTH^e(;mg_;usUT-41OlR3M^8C`eI>%DDhtHyL9_r|5th2Po1awz8{FS zqHUxe?I?FnXH*o7ZNi~Ra5EB~*XQ_S#_`0;m;>cyob0nPCZT=`<+nI4W;zBYbw zdB;LN`Dh{cG*XlN^v%)TKlFdyRGqt_)So3j`62g4=4A%qxK!Nn`hriRhOqwR~i06gFC-pL^lg z>fK&su#Vw$c49{B7??=UZr75jDR$*-t_i-hDIgh!;EXK}Zy7ZB(e?#gH6&rICI;3j z6|UDM;h`zwT!$`ps9I`EN=vcZ2QC0~n7zr;(dDbI)>@FVYkZ%Y)|fi@K(d#nL)qyW zHLHEh`j*fCjt9wxQt1yme6>W^RF(E+49Cb#U#`e1^Wxnz{mA4mqsqBa6%qA?xMyUgKjDJpx2!PdVd*dNH*xPn8?NDzC;PeXC(xxylRT^BGV zTjtB@6it;3`s4^}am4+s#S!fsY5 z1T(Txk{}?5-Slx1sOyJx4M`1_PG-6gqCay8?On8zl-I5~O4g zmNVcB)tS&>+{v;%PqjU^TKLudsUfJWf{00LSfaCANYi!u8O(hdQ{`&!uQY zoF3>EO_b2{r`Bpj&EG|bMW8zW4|>1}B3;2~qJ+Q`a?}c+#0oa6LQ*~1mu0`4$l^f}w`9EyfFGm0X diff --git a/Content/Input/IA_FIC_Editor_Control.uasset b/Content/Input/IA_FIC_Editor_Control.uasset new file mode 100644 index 0000000000000000000000000000000000000000..f3c561a56a542365b904e6869af741ea5d0e7595 GIT binary patch literal 1378 zcmX@utTpe)|Ns9Jm>C$jm>3v70BIm%UrTvn0PL-Z?+7q$ocJsE~ny8;D~-<^e$g z&SADFWNcz#VCZb*23HJJ&maJF5YSq%<_jRl z0l^I*4Z<&g*j|)7Ze?q$*Sr8_|JJ!dk@qy;WhX3FaGAd0rf^);g=-+YLFRxQ!V2^m zBZC=`#RJ6J+NOGjdWO2r!NFh|28N>R@r>v)K!spn_$YKEh#>`Zj2Xr_K}a#3bMiN14wQEI4vQdVkm3BwOhT{|%(IoG_5#JuFx6mU#2TwQni z4I5C_IVZ8Wn4zS+Vj@T__V|Oc;H0hkz! z529gW$m&383LX3d+Jh_x3Mdc&r5#W}fB-0-aRE?TgQj%`piwAhf%Kq@aX}3Nr5i^m z`z@0B$mT(%;S{=Aa0x67kU8iPi96cw0E6o))D<9|xK%0vWnoDWC7J0VCmE3MKt2si z%qdL`sVqok0L8geetu4BVjkFCe!$#NmI_Idwn%0oC2KvftU5v4)WL-XKhO|D06B0K ofr<&1N(X_Z<@9e$8}zJ?Tm<<^2F-@DdlrE#r}k?aK*d4o0mBIr9RL6T literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_FOV.uasset b/Content/Input/IA_FIC_Editor_FOV.uasset new file mode 100644 index 0000000000000000000000000000000000000000..6fa654f58c990ade76ee5fc2bf60111b06ef9857 GIT binary patch literal 1917 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 CcXx9D literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_Movement.uasset b/Content/Input/IA_FIC_Editor_Movement.uasset new file mode 100644 index 0000000000000000000000000000000000000000..7031a515457fdefebea81a4f0d4af7c512e9f8ad GIT binary patch literal 1878 zcmb7FT}TvB6h7up+q8==K$n2b%SsmBat&hF;o_o%jbI(0LcgOn= z-CS5&T53%MNZkbR16TY(0*-GTqjO&zSLf3{m~PvjxeN!9SCRritI_3^!fu%teMYxG z*d-g?_7<0$Z*jJHbW9Mrg^l!_5oBI4ColSPgkz}--05+u3aTFIHHkb^iQr_cHBmkl5mV{^tDk>Pw zPMjfv(b=0-US!4?E>Uo{AfrH&Wg%^sWN*MPu&@;J28o1$q4%@9P~ubqr^-)?on5S{ zH^^XdYI1h}deX{DdyhA45y0`2yOcp%{w`lbC=g^JxfdFzhilL?s1NuV%qPCc*oT`2 zQ938Kv!ek??DSp~$%A^)$HGBTVvr^G4w9KB)*~;QnW&VXq#|?0r^Ly@vj0hX$*s)K z*=WJ&Q7&!d10ikwEXSbOwc8Ap>R6rvt{bPd|V&BcM zwrt1)J?NH%G1|g<${hJNo*tD8L9h1*&r!MROqn8( zzmFA4eN8lS%|gjg5`rt5T4jrrqj{860yVl_p#Wy7mNe+?MR<`l+E#=gYb86;RkuNr z7GOu_YHrY{8>r@^IA&WI^c7C`Tiu@Y+Gy_rIaZHN-p$kws?wR%b)i9#7REiSP|2vi zBG4X0g4#}-WgI~2bi8N1S$X{9Hc;#y)LvEP|A~&JwkA+m6;Nmh`ZCnhBqL>dBnf#q l;&}|?_z!vg*GQk?$izE3Acwxxq5BipnDlzAs7&LL{$JIJhhzW% literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_NextKeyframe.uasset b/Content/Input/IA_FIC_Editor_NextKeyframe.uasset new file mode 100644 index 0000000000000000000000000000000000000000..15e145d0af38538797af00cb2d4a2dff309cbd14 GIT binary patch literal 1889 zcmcIlT}TvB6u#=(k3S^#Ly+NE4_4}|J1?z!iF_uO;O zxwClj(Dk)+Iz3QCNJ$|fpMk?i3ZQ))zO(XPy0TjOMz|q9kog0ktKLLNJ#e=iRg*!} zuZ*~ZT4L062gQgS^hY`eqo!^|LUh7BMpHwEGD5-HMarR95EN)0_Nf8xZ}zrGZ7m+J zoJs~7~JGT_*%pv@*$$0L2y!Mh86 zg%7)LuXcP9+iPNnV#G^rZV1d3$p(#v-MKtj4k$!gJ) z^1U$VQPh}nj&|v)5|3U`&@cq?OC}VRl1ei*jlTCnWP1!fK@BrSmfFqx8@-LGf#s_^ z0LUF?-njj`K~Hv{Jx^7WtOXm6>~hR?YQu`A(m{5`L z7eCYA_88;HmRms}mAePZwu0_BHI;y3Dr9AH;qn$x*rzASqtiPpevPws*XrjeOQ0}J zhN;P^qlQ5>lVeH7nL1|$zeORZ9ka+GB(51>}o zV`d7nB>6-^^fpPYa+_cBdIV9DrGOOhH%YSGNKS*%21x9rGv)a`cAl>Jv!KE>(Kru+UV@4LJNr28^$r_hvtPug>MavyXco3H)}@m98eF0=QKOOR<3F z6T7VeIohLH1D;kP;A^dK4{M6r+Njdr12o>Diro~vvq&L)MGOiw0sE8y7X-iEX19Bt zcDLVacME=ZjYn{JZC>{-o6}M4Vo9Jg{K)<+3`59m$Sx-v1fU||I5-%mhZbtL{DiX=wD{USOBp?*9`V^HOIdtL_l{7LRsNB2WWUH4uMOmWl?25^oi5Fksbi@}CV=k zGUX^kEf0ZpvH>*RPOnSwI~@+UP$iHSa9Tkd@P989zZ@W# ziJ1^AND0LK0I22ZD%K{32msb8;kN*OSZ*X%JzY%tWiU{8;n$Nc^da^;F9RYCH=;m+Xl~x_kC21^w6ewloG74S5YEVlv##BcrbdY-kY_i zn5O>bnYAqKZe{ERTMI$VgntW2cXVcaOMxFt_mUrH?|s^i`j4HB7m*;dj5?fSeUVCF mq&p3ngg?z|-){}@d!}Y^;bvTEqTUa#!&%Rt?64U+^#28^#-nxs literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_Redo.uasset b/Content/Input/IA_FIC_Editor_Redo.uasset new file mode 100644 index 0000000000000000000000000000000000000000..3dc5ac6d887714e42b92c81c8d374a463bb84324 GIT binary patch literal 1783 zcmbtVT}V_>5I&~%;}3=X&_ltRf|+^u*ZolnclYkbLjI)%5wYIx9&&5FciFwWxjk7D zNCXu{J{1w=Q<)D&4?$rXL4r{bLP8-36%-Um_)u*#=iasJs;tnk=ggd$@64GqXXfr` z-=16Z>2$g?pOB(8gnS1MKavOITi5XH7ti&%;`in|?k9e3H|Qn{38@5b^oPZGK=BIQ z#()$}D8_(0=nr^^_9o1@NZwfUT8 zhuh)eExg<0aoVixa0J7Tz_JRALBAcf#LkJv#ffl*Ua$C){Et+&0MSqOFW-9~PEh=GI;%Qurg`+5v3s>IG0FX4x5+!r_FG_d9qE!%2 z3n%G8Srj7SvjPH}g>D*;3L+(CN~#}Y@1Q+OYfO&Pn35vn^~&Q)P_E_`&J8q8Zb582 zi^AxYWAt##iBnWm$b6u7|2Cb?Cv^#uNJH#N$-AM6uXr18M2N?Ua;E3%W>_ur&@+!d zR$$)PHuch^Y6SVsn> ziyERanheW{cqC;=NFm6c0aL+pWe7_Q5*I0`DJwt@_NqmU1!v{$HoJv)+AQ`utKVkw z`Ars+!)h07GK9`^^%(YYe{NJ!{^gh^`KYvK}yzB2y6)goUA&emb2AYoU!nMBC> zOkl9q`_s$|EZf(DVHpAaWLM=11^gO1_qmos+_nO27nm|_w5U}$edXi5@O_U6kp%5X zMJdauN0uX0kXS^`P`62{w$(nJPhD$r%vzQ6v?}(|*$7VbgkNx^%PQ063gE|beSD9z zPjt?X`M>7G9A`)`qYl@YLZosSxdJAm@E11l^Ik94F#ZNN?!cWoN`7#*6});@ZPIjz F{|lsJeJB6` literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_Rotation.uasset b/Content/Input/IA_FIC_Editor_Rotation.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ebf2a05e5cdc7cac620f7571d9d05d96115c58f9 GIT binary patch literal 1916 zcmb7FTSyd982(Mo@=_*dJyfhkSemnUcQvxs+1Xl9)3kaB(P=#7mhLXQ{0$73DUg*B@+G zjb2xy$165U%|0~{YCINDWz`q(qhtzf!nuJIBC=3j z!t~0)A5Lp$_RULlH|ZfmQc-gflpvLfqo~L(m<4mOSXak60HN{5q<9Vray)1#pCY0Q z?>v&GokeGi;T#2L9UfFhcsWSB6pDkJg_V#m$U}1R>ida2hguHZm9U_yplyy{`R(-P$0-cYB$u5_a8#bpgQ1ZFrEA=YddagWaXTE zhE)a>xz*RhlTt0Wv2ajU804tkeWa$Ib*V8mBW3E-bUd85DfvU6>3@>`SQ!;_QG>CL zJ8cvLA$I)e>9b5xVa8irPTog(lD|dvE3BCZ1I7m5e8V7u*eZv^pmug$+k(4gYRf$I zsg+WtizDQ0ZOUAaXH`s<-LfjfWbc#fl#@stAbhxQbN2i`CfC339^*B-8=1U(nL%w~ zh7KR=H2D0S4lB&h42+k!fMQykP&vCKtJz_*h&GEwvU%Jli^JnCwO3dqhiH+UB`&B% zp;h*bu(Z3v;z}Y5^dQFx8QKD~Sd$wfH1$su@p6Aqj>>?rl-x#*#pmd|iR7q)2zt4{ zc#n3f&6GR>+54JP+6N{=E?Ou*JV&^qss*}8IR1?COrYL(aS9+!*SC6o5q4~e*A-(d zL6DyKLR_J4OR-6Ej1bxwye+xU7oQ!-b$gpbc`wpfx)d8JKU1JKI zTafUw0-jNQMW8;2cmqAOiD4H~rxJbX8~FbqVFRtYEu;Cxe+36MKY=36LD3@UD^pJs tkA&${O325N$O#z6|LE;s_j`r?Bk$;fZSC$jm>3v70BIm%UrTvn0PLJ~$&Ytpuoyfq@%{qd=wsK^D*g zMIdcqZeVWeY;Iy=VC-V(4g2d!h2BDJ54x+;~ z`}sR25ul0s!O2CL1tt2<`9-Or{z+M>$t4UwJaz5FkmOwRG7|HWQ&YgP#Bg=p={IaZ zS?8R@;$nu9@`{NdbFjtTy~z7opr8Qjb4&)gmO)4&frk?)=9^lQ=#p5H$nd0L%VZ9q z0Mu&?#qJ%V0th}_-CUg|snDnchBO5H1%??&FFHV1_Xnts9bFNS4^szn5DdV?V0;h_ z6GK)9N>AwEAJ86TF;Fmp04UNy0RaM_IK~A)=?t3A8GuHim<7^rprPWkycsfl@DH~9f`L0Kv!G1?-TiIkxAz_RKDZBqvq68u0z2m$1PRRk&~ mSQ;G!mXXuHEp5=VK5`M{CmA#w%I;YNvYgtlX#f=msRsav?+-Ts literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_Speed.uasset b/Content/Input/IA_FIC_Editor_Speed.uasset new file mode 100644 index 0000000000000000000000000000000000000000..e15b91a3bdcddd732c223e29327656210eb29c7e GIT binary patch literal 1947 zcmb_dTWkzr6h76~t*#9saa;FWJA2j6R$QjDJF?0u#RHLcI{mdvcV_KO*H%0<5lO`Z zLJ&zwgjexEL?ndp!V`@U4-(QBLDEDceNc7IKf7zJZPtS?^Upc|IcLuQ|L5}0;}dJH z4v&tGwv+-)9tSXp6dx$T@wMajz^D2PLly75*QE!FunJ|N@c_$_x|Nt_Ml4y4yCZs{ z%W_AgW+fswhudP7k!)^CFxG}h9F%=ZUElmTr5Whu^B0iMjY2JFZz09sC(;~_%iXznbyj?r#^4h zTP}w0*PWl&aO8LutxbMtBjxD11Zt3*f@AI4b%Iy$R?AIITmz7N(_E6TK|>CGmvN7n z9$d41f-TFwF@U2KnTaSkoY7SxFKJfH&_m4BlCcD_aPsV{4|7lx=25ftd)3Y^w!1sQ zVB~fGhlOKl>*}O*%=Cs}U}pIARI<{$;*Cio!ID-t?0nNl5rL?oGZ-p;Hgy3`8ddGE z+RnBan%WsVrqT|gYMhw~Rbx&|F_j;D2-nLq@!nbVZB4uHP*%>0k3bp_<|7xxl=Vwu#TqBk)J|U zbuIesA|=TYL8zSDGG!9Vwlhl&sg?=@J$KGiHZl|n8w~ja z^@>mN$w7b6>sJ&}lxu^&V2xjb1~mGYkO~DtApBidw6+rz3_^uXU<504T85`?$|B$H z2ij3l5DM8%w^jU|{kE7L)f2&K_Y>E#rS_W=N}&CI>6jbk+j;gUnIj0!?yQiroHUH~sV2VD{bN&pANk>IRWCr>&urpuPF7)P<=!DIZ*UiyBsM_B*#B`q+YzH}h< QUffys{LyMpMn?9(0RH)*MF0Q* literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_SpeedUp.uasset b/Content/Input/IA_FIC_Editor_SpeedUp.uasset new file mode 100644 index 0000000000000000000000000000000000000000..cbce0a8bc0305945b8cba0c283794894c801d306 GIT binary patch literal 1810 zcmbtVT}TvB6uzcr`9mQYJtVF5pr+3LxbAL+!OW~18~GEfzErH!dRw>Fon?14?IDB+ zgo1t{C^U$KdWrtPhma8Lp?XTPz)CQrD6)Ex5c=89xie$qy0S%wx%ZrV&v(x~_uO;t zjGov!IG;!)+A;~rT|vlK;P8t_<5iX8L%qLj9`L;;vZ3ZUPQ_JFR!7A3%~B5$)eJyyHN;uP(o zVB=kO(dDYPReN~BQsZFzBN#qXl!ayp=>o?lPyl)Z9NR3k*Oy=A`flcU?%4bJkF}=< zZ&VbU-b?p(U)e^+M;?#7z`fB9I+6{RGl&DEd}tLFHJp{RR*60z(-0DS>CZ^k0Fcr5 zQ_p1-HbD%gR;qJ)48nywIJKA?o;h?~X(u}~C6a`No>GyqA19HC?`^HD)D z44S0C5h+Ob$N?!FIwm2oLF%OOs1%^2Q0eVQ-l%qZ85S#kC zg}XyvFnVmIdUR5_p)G$k%+*sxa!ZOtX8P`5SOpW>nMr(Cf6>}M;|1J6<#o!^rWTZ1 zLYWT9F;lA)?xH3UoD7B{K@;1|R7SZVXR4RGX(x>+l_pPPs|umzuv|@O%sfG`Se-7n z+g{_eiw>tn;00iUD7fn!B5${mMgaX?c5^9%z%9LU+}}ue{YW_~BR?T|ay6NqSd)`+ zKLCfJL`sFrQ&p_j*QUeid2Gb}f_)682;LSF+8<_;`VeU15{9;PdthpjEd(deVagz3 zk@8F;WI%Te#zuRZdVwX|T2Q1A&`xrCE}zWPP|K5A7;)wD$jzYD3u{sFaK=Kw)8Q?% z^lk2qQWjT1mcvwvFuxk0@Vlv6Xqfc6O+&GAOk1jJmffwCy+mukh>`GRM>?-Et=|HC zU%D6h0DHI7R?mOeDn?o-ql|Mn#wa3{KuhN{8HK;wrEf!h+>WtlxNsw`G*I`HYj4(* LhvgP+4)MPMDdvV2 literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_ToggleAllKeyframes.uasset b/Content/Input/IA_FIC_Editor_ToggleAllKeyframes.uasset new file mode 100644 index 0000000000000000000000000000000000000000..fbd8bfe43e461e97ee0cc4a439e590848da0a690 GIT binary patch literal 1949 zcmcIlU1$?Q5Z>C>|57O`J}8_&&}#M4G-;Fi2bW7uf?8`^eeoyVUbkuNB^U0t)d*ri zg@PiA7N1m*3W87+MIS^|P!W9)1r>Y{gueJw@S$iCwa(m6y|zMBaJb!>ot^!5c6Mg( z-k}xeMn*?RTM7x8Ifal>9{RBP zXyO%pKU`Y(_3(`^1ATq<$1~@bB|-;laBsvxM~VTtfYgFC8(L*$jp!HstK_C8YlaZx zRia?x3>aE;?NY~a6nbFK)HGY?_7Kfc3={g9cIL`JmQnT@T{n3#@Z=+$k;ob~O~Uu? zJBfFhHwg|L+iqY?Ef6~(q-;UU>=~fj%s7owPRU@;^;6S9;Y5O%8+zx>`86K1JG-)< zS;@2$CS`+B&dim93~nZwDd>jK$kKW@h@EZ{3hjoT7O18Plyf81+65~FylXbBj)}|N=dz4ov?IE% zF`BWwt%sMTo7v^N&V%WB0z_-JJnwGh)>BssAYQ`12+~!XIsH=LJMumGyR1;;t+fAL z_IM{Qd1ch$7=w(2_m=NSPlMl^*JT6W&_%_|EbwM~C)50Wjpe APXGV_ literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_ToggleAutoKeyframe.uasset b/Content/Input/IA_FIC_Editor_ToggleAutoKeyframe.uasset new file mode 100644 index 0000000000000000000000000000000000000000..fb2b7b5f309bf7aebeeed6f5b6f85567ceb8213e GIT binary patch literal 1951 zcmcIlUq}=|7#~x!)F`B)hoaM!oK=bho!>M`eZ9ONfr^cy6A%$L^eEPen!2 zi$y_C^$h6>ox9BlqLddeF7bCqxGBkL#M9;0o>c zCyaE4`xB9lctYt=yLE0_9c^YZnPQO)H+QkY9*g!fSW`k4L7zlupog$qHE^{d6mDo# z0-=zi%Hc*?Rn>-ir75gN<4yH)AS#Z6#_*9;3BnLE3TLb<1pz1o99s;UFE$#uF*dd5 z=FRD$FB7lmz(oJ!vv2)7&YWF*hSrqZxHsb9K}rF+h%|sy32o!X%~DVbZcyD!Q888&|Zurzr6i&dNePxa=+k-b}&`o$w)19jVIihjhG-AxwEIo}PIeqTs2LK=~ zroqT$@smZXV6cyBeKg5-n;K2&$0!=MfdA|?)flPbgF|@sHg=Tnv&=NJ_#heC!tecC zOp+H@mn{W2f2%l?UokCqU~ku9rg1Wr*tC7QXHGSGsiCoM5pFVe>-i_RBT-V+wh2FS z^gPD0U=pnTHvANQDnJ~Ekg64(l?y?)hjALCoRab5cP}geh3g4oHxDga@@t&4yIgmT ziDYVrN!6fTDQ5d)x-A4BqX9XthC_0b5)DUUQALgs21b8f9#SFK zNpsT&Pvs>{C8TUVeuqRXcT}Q?ToKaSp{(6B*kJ&Wgg+fIXIJ5lk!9Bwvcud!^4k4? zeH^XRV~mjy|Fw{u_r(?GFvQB@0n{ukG|tyyq9I|yM}$O3ZT8YI_TstIIhK!=oA`}@ zIQdCk4Z1=hC1LPpv+F4Y`J+WOV3@7fSv4tniwf_Iu|G&t8P+zKW(2(*HO&;GhB$2t z6vY5@>UWz5)AI&MVs>4@-PVb>ZZUv(34bF+!4ZIKUFM0N0L%`Lc{ZIS=yvqOp literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_ToggleCursor.uasset b/Content/Input/IA_FIC_Editor_ToggleCursor.uasset new file mode 100644 index 0000000000000000000000000000000000000000..95bf31789170700e087539f6eccb5feb9b92b73f GIT binary patch literal 1851 zcmbtVZ%7nT5Fb-B|6xc)P{CP*mAcoR-XE33yS+O(Ff+6uBF=Sv>D9S=-0qnQg;9YJ zN>b6M`VjS1`Va&KgS`j=s&;n9n3zmxY688ppb%$?K#@lAoD$^T>Y&Fdy1Z2`x6A1h z{Q*bN?RI;`fERUce~<@3&iDgI7Qq0FV052JK>CWDMs7BMD=F$j6T`mqQyK3rR!`K< z)(@U5QfeB9r(f3O0Gd>V!CdCk!X3D1 zmgLh?Cu>w?DHiRQ$gxT4W?Ed585HY%gA{u!>(!eRYMdqXJ{YgjAFTB@J~j;XZ$cn@ z3y;PwstI=FQ2Qw+>o6a#sM}((1(hyIky!`7VwfC#@gBbp#F(UMpr7d-*@mlsT>STb zwwv)wp0wYM42jdeWwMF6SH? zVC@h3PP*@-QY^_@`{E2J!+uqbF-hSOHsQ|<08C~LyF)@kr;3f_9_ACbhv{8@AJAH zg41qyd7NHnuqMd+?3IGc=Wsh&Am|J~63RguLasxEdAXnfmVv~v0mk#m8(%^rm9?XJ z)%>Z~yAM<+T3gn%O$aByKDqqrt`f$*kp~0G1?DW`1+5T9dAWykaE=P0p@FRs5}$0( zN?!p-hIgl1@1xQJdu~~*+l(jVGKopTILlIN7SR2Y7E$CNRi$_&hAKI6=Gj{yAa#mN z$#nL^qGFiTi&Br+g_#qhkz*n{)jcWsByh^+CFDEkW zx;e2D$ZQQPBAcMZY16(#N2sKcnQ+C<)uy!?xm%Pa+R2WZytwuF1N=iGL`794T3`R! zjWEkl0JT-?nlYb@LQe*5Wr3)>hE}ckHJ|mnxc#bL zNPbwvDpPGuaulUi>!wx_a-E=7iItvJQc^A z-S(h6U=Mm+Za&}@oV>@!3n9MJ?ehkR2u^=l{M?^Y!_6-ZjK~Zu6NFJ~-=WCzbrWll zlnSM*!|?kCewbhc7QX?*ufQ;XG;Ept@Z=F@zaOxVZq=W7h6v;zWtx6-q||u=xePv_ zn!|<8={77R1U9puX@pD}fx+C&ms*|`>0Gl5zfq7Uy=WIu>lVmmaVi|7Simcrz|H8y zIo-yY8wUR`o_n(x?WK(aF-kDg0Y!;YQD%|W!IhDqdS_OfI8EKnvDMOyyOpv#Y&npa zfgcCNd0nKQn?WATbeFfW8$V-*;eq~lPh;8*n02(_95ab1fsrY0G6o;X3!kqIay!PK X;*0C?O%oDt`29JL9+crVj6naNgQ}Wi literal 0 HcmV?d00001 diff --git a/Content/Input/IA_FIC_Editor_ToggleShowPath.uasset b/Content/Input/IA_FIC_Editor_ToggleShowPath.uasset new file mode 100644 index 0000000000000000000000000000000000000000..52abdb5434144e1eacea7c266b625003ba918e60 GIT binary patch literal 1835 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 literal 0 HcmV?d00001 diff --git a/Source/FicsItCam/FicsItCam.Build.cs b/Source/FicsItCam/FicsItCam.Build.cs index 63734b1..14f6f07 100644 --- a/Source/FicsItCam/FicsItCam.Build.cs +++ b/Source/FicsItCam/FicsItCam.Build.cs @@ -14,17 +14,10 @@ public FicsItCam(ReadOnlyTargetRules Target) : base(Target) "Core", "CoreUObject", "Engine", "InputCore", - "OnlineSubsystem", "OnlineSubsystemUtils", "OnlineSubsystemNULL", - "SignificanceManager", - "PhysX", "APEX", "PhysXVehicles", "ApexDestruction", - "AkAudio", "ReplicationGraph", "UMG", - "AIModule", - "NavigationSystem", "AssetRegistry", "GameplayTasks", - "AnimGraphRuntime", "Slate", "SlateCore", "InteractiveToolsFramework", "CinematicCamera", @@ -32,7 +25,9 @@ public FicsItCam(ReadOnlyTargetRules Target) : base(Target) "Renderer", "RenderCore", "ImageWrapper", - "Niagara" + "Niagara", + "EnhancedInput", + "GameplayTags" }); if (Target.Type == TargetRules.TargetType.Editor) { diff --git a/Source/FicsItCam/Private/Data/Attributes/FICAttribute.cpp b/Source/FicsItCam/Private/Data/Attributes/FICAttribute.cpp index 8f8b04d..fdbdf60 100644 --- a/Source/FicsItCam/Private/Data/Attributes/FICAttribute.cpp +++ b/Source/FicsItCam/Private/Data/Attributes/FICAttribute.cpp @@ -1,4 +1,6 @@ -#include "FicsItCam/Public/Data/Attributes/FICAttribute.h" +#include "Data/Attributes/FICAttribute.h" + +TSharedRef FFICAttribute::CreateEditorAttribute() { checkf(false, TEXT("Not Implemented!")); return MakeShareable(nullptr); } void FFICAttribute::RecalculateAllKeyframes() { TArray Keys; diff --git a/Source/FicsItCam/Private/Data/Attributes/FICAttributeFloat.cpp b/Source/FicsItCam/Private/Data/Attributes/FICAttributeFloat.cpp index c86e843..c7036f6 100644 --- a/Source/FicsItCam/Private/Data/Attributes/FICAttributeFloat.cpp +++ b/Source/FicsItCam/Private/Data/Attributes/FICAttributeFloat.cpp @@ -1,5 +1,6 @@ #include "FicsItCam/Public/Data/Attributes/FICAttributeFloat.h" +#include "Editor/Data/FICEditorAttributeBase.h" #include "FicsItCam/Public/FICUtils.h" TMap> FFICFloatAttribute::GetKeyframes() { diff --git a/Source/FicsItCam/Private/Data/Attributes/FICAttributeGroup.cpp b/Source/FicsItCam/Private/Data/Attributes/FICAttributeGroup.cpp index a7e6803..c5fa6f6 100644 --- a/Source/FicsItCam/Private/Data/Attributes/FICAttributeGroup.cpp +++ b/Source/FicsItCam/Private/Data/Attributes/FICAttributeGroup.cpp @@ -1,4 +1,4 @@ -#include "FicsItCam/Public/Data/Attributes/FICAttributeGroup.h" +#include "Data/Attributes/FICAttributeGroup.h" #include "Editor/Data/FICEditorAttributeGroup.h" diff --git a/Source/FicsItCam/Private/Data/Objects/FICWorldSettings.cpp b/Source/FicsItCam/Private/Data/Objects/FICWorldSettings.cpp index c72b414..0cbf1ce 100644 --- a/Source/FicsItCam/Private/Data/Objects/FICWorldSettings.cpp +++ b/Source/FicsItCam/Private/Data/Objects/FICWorldSettings.cpp @@ -6,6 +6,7 @@ #include "FGTimeSubsystem.h" #include "FICUtils.h" #include "Editor/FICEditorContext.h" +#include "Editor/Data/FICEditorAttributeBase.h" UFICWorldSettings::UFICWorldSettings() { RootAttribute.AddChildAttribute(TEXT("Active"), &Active); diff --git a/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBase.cpp b/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBase.cpp index 2ba6d19..7e1bbb7 100644 --- a/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBase.cpp +++ b/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBase.cpp @@ -1,4 +1,4 @@ -#include "FicsItCam/Public/Editor/Data/FICEditorAttributeBase.h" +#include "Editor/Data/FICEditorAttributeBase.h" #include "Data/Attributes/FICAttribute.h" #include "Editor/UI/FICSequencer.h" diff --git a/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBool.cpp b/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBool.cpp index 5d4f34e..2eb2ca3 100644 --- a/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBool.cpp +++ b/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeBool.cpp @@ -26,7 +26,7 @@ void FFICEditorAttributeBool::UpdateValue(FICFrame Time) { SetActiveValue(Attribute->GetValue(Time)); } -float FFICEditorAttributeBool::GetValue(FICFrame InFrame) const { +FICValue FFICEditorAttributeBool::GetValue(FICFrame InFrame) const { return Attribute->GetValue(InFrame) ? 1.0 : 0.0; } diff --git a/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeGroup.cpp b/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeGroup.cpp index 11e5c83..6d31da4 100644 --- a/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeGroup.cpp +++ b/Source/FicsItCam/Private/Editor/Data/FICEditorAttributeGroup.cpp @@ -1,7 +1,6 @@ #include "Editor/Data/FICEditorAttributeGroup.h" #include "Data/Attributes/FICAttributeGroup.h" -#include "Widgets/Layout/SExpandableArea.h" FFICEditorAttributeGroupBase::FFICEditorAttributeGroupBase(FFICAttributeValueChanged OnValueChanged, FLinearColor GraphColor): FFICEditorAttributeBase(GraphColor) { OnCreateAttributeDetailsWidget.BindLambda([this](UFICEditorContext* Context) { @@ -47,7 +46,7 @@ void FFICEditorAttributeGroupBase::UpdateValue(FICFrame Time) { } } -float FFICEditorAttributeGroupBase::GetValue(FICFrame InFrame) const { +FICValue FFICEditorAttributeGroupBase::GetValue(FICFrame InFrame) const { float Sum = 0.0f; for (const TTuple>& Attribute : Attributes) { Sum += Attribute.Value->GetValue(InFrame); diff --git a/Source/FicsItCam/Private/Editor/Data/FICEditorCameraActor.cpp b/Source/FicsItCam/Private/Editor/Data/FICEditorCameraActor.cpp index 69c5c5b..5cee1d0 100644 --- a/Source/FicsItCam/Private/Editor/Data/FICEditorCameraActor.cpp +++ b/Source/FicsItCam/Private/Editor/Data/FICEditorCameraActor.cpp @@ -1,11 +1,10 @@ #include "Editor/Data/FICEditorCameraActor.h" -#include "FicsItCamModule.h" -#include "BaseGizmos/TransformGizmo.h" #include "Components/LineBatchComponent.h" #include "Components/SceneCaptureComponent2D.h" #include "Editor/Data/FICEditorAttributeBool.h" #include "Engine/TextureRenderTarget2D.h" +#include "BaseGizmos/CombinedTransformGizmo.h" UFICEditorCameraPathComponent::UFICEditorCameraPathComponent() { bAutoActivate = true; @@ -141,8 +140,8 @@ void AFICEditorCameraActor::Tick(float DeltaSeconds) { } CaptureComponent->HiddenActors.Empty(); - for (TActorIterator Gizmo(GetWorld()); Gizmo; ++Gizmo) { - CaptureComponent->HiddenActors.Add(*Gizmo); + for (TActorIterator Gizmo(GetWorld()); Gizmo; ++Gizmo) { + CaptureComponent->HiddenActors.Add(TObjectPtr((AActor*)*Gizmo)); } // TODO: This is a shitty fix for something that would require a big change (layer system to define when what editor stuff needs to get rendered) } diff --git a/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp b/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp index 605c122..1dfb6d0 100644 --- a/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp +++ b/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp @@ -10,14 +10,15 @@ #include "Components/CapsuleComponent.h" #include "Components/InputComponent.h" #include "Data/Objects/FICCamera.h" -#include "Editor/Data/FICEditorCameraActor.h" #include "Editor/FICEditorContext.h" #include "Editor/FICEditorSubsystem.h" +#include "Editor/Data/FICEditorAttributeBase.h" +#include "Editor/Data/FICEditorAttributeGroupDynamic.h" #include "GameFramework/CharacterMovementComponent.h" #include "GameFramework/Controller.h" #include "GameFramework/InputSettings.h" #include "GameFramework/PlayerController.h" -#include "Slate/SceneViewport.h" +#include "Input/FGEnhancedInputComponent.h" AFICEditorCameraCharacter::AFICEditorCameraCharacter() { PrimaryActorTick.bCanEverTick = true; @@ -53,7 +54,7 @@ void AFICEditorCameraCharacter::Tick(float DeltaSeconds) { bReposses = true; PController->UnPossess(); PController->Possess(this); - UFGInputLibrary::UpdateInputMappings(Cast(PController)); + //UFGInputLibrary::UpdateInputMappings(Cast(PController)); UFGGameUserSettings::GetFGGameUserSettings()->ApplySettings(false); bReposses = false; @@ -139,32 +140,31 @@ void AFICEditorCameraCharacter::EndPlay(const EEndPlayReason::Type EndPlayReason void AFICEditorCameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); - - UInputSettings* Settings = const_cast(GetDefault()); - Settings->AddAxisMapping(FInputAxisKeyMapping("FicsItCam.Zoom", EKeys::MouseWheelAxis)); - PlayerInputComponent->BindAxis("MoveForward", this, &AFICEditorCameraCharacter::MoveForward); - PlayerInputComponent->BindAxis("MoveRight", this, &AFICEditorCameraCharacter::MoveRight); - PlayerInputComponent->BindAxis("DefaultPawn_MoveUp", this, &AFICEditorCameraCharacter::FlyUp); - PlayerInputComponent->BindAxis("FicsItCam.MoveRoll", this, &AFICEditorCameraCharacter::RotateRoll); - PlayerInputComponent->BindAxis("FicsItCam.Zoom", this, &AFICEditorCameraCharacter::Zoom); - - PlayerInputComponent->BindAxis("Turn", this, &AFICEditorCameraCharacter::RotateYaw); - PlayerInputComponent->BindAxis("LookUp", this, &AFICEditorCameraCharacter::RotatePitch); - + UFGEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent); + const UFGInputSettings* Settings = UFGInputSettings::Get(); + + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Movement"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::Move); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Rotation"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::Rotate); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Redo"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::Redo); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Undo"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::Undo); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Frame"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ChangeFrame); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.NextKeyframe"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::NextKeyframe); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.PrevKeyframe"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::PrevKeyframe); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.ToggleAllKeyframes"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ToggleAllKeyframes); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.ToggleAutoKeyframe"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ToggleAutoKeyframe); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.ToggleCursor"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ToggleCursor); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.ToggleLockCamera"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ToggleLockCamera); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.ToggleShowPath"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ToggleShowPath); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Grab"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::Grab); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.FOV"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ChangeFOV); + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Editor.Speed"))), ETriggerEvent::Triggered, this, &AFICEditorCameraCharacter::ChangeSpeed); + PlayerInputComponent->BindKey(EKeys::RightMouseButton, EInputEvent::IE_Pressed, this, &AFICEditorCameraCharacter::RightMousePress); PlayerInputComponent->BindKey(EKeys::RightMouseButton, EInputEvent::IE_Released, this, &AFICEditorCameraCharacter::RightMouseRelease); PlayerInputComponent->BindKey(EKeys::LeftMouseButton, IE_Pressed, this, &AFICEditorCameraCharacter::OnLeftMouseDown); PlayerInputComponent->BindKey(EKeys::LeftMouseButton, IE_Released, this, &AFICEditorCameraCharacter::OnLeftMouseUp); - - TArray& Mappings = Cast(GetController())->PlayerInput->ActionMappings; - TMap& KeyMappings = AFICEditorSubsystem::GetFICEditorSubsystem(this)->KeyMappings; - KeyMappings.Empty(); - for (const FInputActionKeyMapping& KeyMapping : Mappings) { - KeyMappings.Add(KeyMapping.ActionName, KeyMapping); - } - Mappings.Empty(); } void AFICEditorCameraCharacter::PossessedBy(AController* NewController) { @@ -195,43 +195,100 @@ void AFICEditorCameraCharacter::UnPossessed() { } } -void AFICEditorCameraCharacter::MoveForward(float Value) { - FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X); +void AFICEditorCameraCharacter::Move(const FInputActionValue& ActionValue) { + if (!IsControlView()) return; + float Multi = FlyMultiplier; - if (Cast(GetController())->PlayerInput->IsShiftPressed()) Multi *= 3; - AddMovementInput(Direction, Value * Multi); + // if (Cast(GetController())->PlayerInput->IsShiftPressed()) Multi *= 3; TODO: Check if SpeedUp + AddMovementInput(Controller->GetCharacter()->GetTransform().TransformVector(ActionValue.Get()).GetSafeNormal(), ActionValue.GetMagnitude() * Multi); } -void AFICEditorCameraCharacter::MoveRight(float Value) { +void AFICEditorCameraCharacter::Rotate(const FInputActionValue& ActionValue) { if (!IsControlView()) return; - FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); - float Multi = FlyMultiplier; - if (Cast(GetController())->PlayerInput->IsShiftPressed()) Multi *= 3; - AddMovementInput(Direction, Value * Multi); + + FVector Value = ActionValue.Get(); + AddControllerPitchInput(Value.X); + AddControllerYawInput(Value.Z); + AddControllerRollInput(Value.Y); } -void AFICEditorCameraCharacter::RotatePitch(float Value) { - if (!IsControlView()) return; - AddControllerPitchInput(Value); + +void AFICEditorCameraCharacter::ChangeFOV(const FInputActionValue& ActionValue) { + float Delta = ActionValue.GetMagnitude(); + // if (bIsSprinting) Delta *= 2; TODO: Check if SpeedUp + if (EditorContext->GetLockCameraToView()) { + TFICEditorAttribute& FOV_Attr = EditorContext->GetCameraEditor()->Get("Lens Settings").Get>("FOV"); + EditorContext->CommitAutoKeyframe(this); + FOV_Attr.SetValue(FOV_Attr.GetValue() + Delta); + EditorContext->CommitAutoKeyframe(nullptr); + } else { + FOV += Delta; + } } -void AFICEditorCameraCharacter::RotateYaw(float Value) { - if (!IsControlView()) return; - AddControllerYawInput(Value); +void AFICEditorCameraCharacter::ChangeSpeed(const FInputActionValue& ActionValue) { + float Delta = ActionValue.GetMagnitude() * 100; + // if (bIsSprinting) Delta *= 2; TODO: Check if SpeedUp + //if (Delta) EditorContext->SetFlySpeed(EditorContext->GetFlySpeed() + Delta); + // TODO: Fly Speed! } -void AFICEditorCameraCharacter::RotateRoll(float Value) { - if (!IsControlView()) return; - AddControllerRollInput(Value); - RollRotationFixValue += Value; +void AFICEditorCameraCharacter::ChangeFrame(const FInputActionValue& ActionValue) { + float Delta = ActionValue.GetMagnitude(); + // if (bIsSprinting) Delta *= 2; TODO: Check if SpeedUp + if (Delta) EditorContext->SetCurrentFrame(EditorContext->GetCurrentFrame() + Delta); } -void AFICEditorCameraCharacter::FlyUp(float Value) { - if (!IsControlView()) return; - FVector Direction = GetActorUpVector(); - float Multi = FlyMultiplier; - if (Cast(GetController())->PlayerInput->IsShiftPressed()) Multi *= 3; - AddMovementInput(Direction, Value * Multi); - AddActorLocalRotation(FRotator(0, 0, Value)); +void AFICEditorCameraCharacter::Redo() { + TSharedPtr Change = EditorContext->ChangeList.PushChange(); + if (Change) Change->RedoChange(); +} + +void AFICEditorCameraCharacter::Undo() { + TSharedPtr Change = EditorContext->ChangeList.PopChange(); + if (Change) Change->UndoChange(); +} + +void AFICEditorCameraCharacter::NextKeyframe() { + int64 Time; + TSharedPtr KF = EditorContext->GetAllAttributes()->GetAttribute().GetNextKeyframe(EditorContext->GetCurrentFrame(), Time); + if (KF) EditorContext->SetCurrentFrame(Time); +} + +void AFICEditorCameraCharacter::PrevKeyframe() { + int64 Time; + TSharedPtr KF = EditorContext->GetAllAttributes()->GetAttribute().GetPrevKeyframe(EditorContext->GetCurrentFrame(), Time); + if (KF) EditorContext->SetCurrentFrame(Time); +} + +void AFICEditorCameraCharacter::ToggleAllKeyframes() { + auto Change = MakeShared(); + Change->PushChange(MakeShared(EditorContext, TNumericLimits::Min(), EditorContext->GetCurrentFrame())); + BEGIN_ATTRIB_CHANGE(EditorContext->GetAllAttributes()->GetAttribute()) + EditorContext->ToggleCurrentKeyframes(); + END_ATTRIB_CHANGE(Change) + EditorContext->ChangeList.PushChange(Change); +} + +void AFICEditorCameraCharacter::ToggleAutoKeyframe() { + EditorContext->SetLockCameraToView(!EditorContext->GetLockCameraToView()); +} + +void AFICEditorCameraCharacter::ToggleCursor() { + EditorContext->GetPlayerCharacter()->ControlViewToggle(); +} + +void AFICEditorCameraCharacter::ToggleLockCamera() { + EditorContext->SetLockCameraToView(!EditorContext->GetLockCameraToView()); +} + +void AFICEditorCameraCharacter::ToggleShowPath() { + EditorContext->bShowPath = !EditorContext->bShowPath; +} + +void AFICEditorCameraCharacter::Grab() { + UInteractiveToolManager* ToolManager = AFICEditorSubsystem::GetFICEditorSubsystem(EditorContext)->ToolsContext->ToolManager; + ToolManager->SelectActiveToolType(EToolSide::Mouse, "Grab"); + ToolManager->ActivateTool(EToolSide::Mouse); } void AFICEditorCameraCharacter::RightMousePress() { @@ -244,43 +301,12 @@ void AFICEditorCameraCharacter::RightMouseRelease() { } } -void AFICEditorCameraCharacter::Zoom(float Value) { - APlayerController* PlayerController = Cast(GetController()); - bool bIsSprinting = PlayerController->PlayerInput->IsShiftPressed(); - if (bIsSprinting && PlayerController->PlayerInput->IsCtrlPressed()) { - float Delta = Value; - if (bIsSprinting) Delta *= 2; - if (EditorContext->GetLockCameraToView()) { - TFICEditorAttribute& FOV_Attr = EditorContext->GetCameraEditor()->Get("Lens Settings").Get>("FOV"); - EditorContext->CommitAutoKeyframe(this); - FOV_Attr.SetValue(FOV_Attr.GetValue() + Delta); - EditorContext->CommitAutoKeyframe(nullptr); - } else { - FOV += Delta; - } - } else if (PlayerController->PlayerInput->IsCtrlPressed()) { - float Delta = Value * 100; - if (bIsSprinting) Delta *= 2; - //if (Delta) EditorContext->SetFlySpeed(EditorContext->GetFlySpeed() + Delta); - // TODO: Fly Speed! - } else { - float Delta = Value; - int64 Range = EditorContext->GetScene()->AnimationRange.Length(); - while (Range > 300) { - Range /= 10; - Delta *= 10; - } - if (bIsSprinting) Delta *= 2; - if (Delta) EditorContext->SetCurrentFrame(EditorContext->GetCurrentFrame() + Delta); - } -} - void AFICEditorCameraCharacter::OnLeftMouseDown() { - AFICEditorSubsystem::GetFICEditorSubsystem(GetWorld())->OnLeftMouseDown(); + AFICEditorSubsystem::GetFICEditorSubsystem(GetWorld())->OnLeftMouseDown(); // TODO: Register Input Handler in EditorSubsystem Instead } void AFICEditorCameraCharacter::OnLeftMouseUp() { - AFICEditorSubsystem::GetFICEditorSubsystem(GetWorld())->OnLeftMouseUp(); + AFICEditorSubsystem::GetFICEditorSubsystem(GetWorld())->OnLeftMouseUp(); // TODO: Register Input Handler in EditorSubsystem Instead } void AFICEditorCameraCharacter::SetEditorContext(UFICEditorContext* InEditorContext) { diff --git a/Source/FicsItCam/Private/Editor/FICEditorContext.cpp b/Source/FicsItCam/Private/Editor/FICEditorContext.cpp index 2bdf48d..587ceda 100644 --- a/Source/FicsItCam/Private/Editor/FICEditorContext.cpp +++ b/Source/FicsItCam/Private/Editor/FICEditorContext.cpp @@ -5,6 +5,7 @@ #include "Data/Objects/FICCamera.h" #include "Data/Objects/FICSceneObject.h" #include "Editor/Data/FICEditorAttributeBool.h" +#include "Editor/Data/FICEditorAttributeGroupDynamic.h" void UFICEditorContext::SetAnimPlayer(EFICAnimPlayerState InAnimPlayerState, float InAnimPlayerFactor) { AnimPlayerFactor = InAnimPlayerFactor; diff --git a/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp b/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp index 385e63c..de4e038 100644 --- a/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp +++ b/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp @@ -1,7 +1,11 @@ #include "Editor/FICEditorSubsystem.h" +#include "ContextObjectStore.h" +#include "EnhancedInputSubsystems.h" #include "FGGameUserSettings.h" #include "FGInputLibrary.h" +#include "TestLibWrapper.h" +#include "BaseGizmos/GizmoViewContext.h" #include "Blueprint/WidgetBlueprintLibrary.h" #include "Editor/FICEditorContext.h" #include "Editor/ITF/FICGrabTool.h" @@ -10,6 +14,7 @@ #include "Editor/ITF/FICToolsContextRender.h" #include "Editor/ITF/FICTransformInteraction.h" #include "Engine/GameEngine.h" +#include "Input/FGInputMappingContext.h" #include "Slate/SceneViewport.h" #include "Slate/SGameLayerManager.h" @@ -39,6 +44,7 @@ void AFICEditorSubsystem::InitInteractiveTools() { // register tools ToolsContext->ToolManager->RegisterToolType("Grab", NewObject(ToolsContext->ToolManager)); + } void AFICEditorSubsystem::ShutdownInteractiveTools() { @@ -77,6 +83,9 @@ AFICEditorSubsystem::AFICEditorSubsystem() { void AFICEditorSubsystem::BeginPlay() { Super::BeginPlay(); + + //FString nice = TestLibWrapper_foo(); + //UE_LOG(LogTemp, Warning, TEXT("Nice!")); } void AFICEditorSubsystem::Tick(float DeltaTime) { @@ -160,11 +169,11 @@ void AFICEditorSubsystem::Tick(float DeltaTime) { // fudge factor so we don't hit actor... Origin += 1.0 * Direction; - InputState.Mouse.Position2D = ViewportMousePos; - InputState.Mouse.Delta2D = CurrentMouseState.Mouse.Position2D - PrevMousePosition; - PrevMousePosition = InputState.Mouse.Position2D; + InputState.Mouse.Delta2D = ViewportMousePos - PrevMousePosition; + PrevMousePosition = InputState.Mouse.Position2D = ViewportMousePos; InputState.Mouse.WorldRay = FRay(Origin, Direction); + ToolsContext->ToolManager->GetContextObjectStore()->FindContext()->ResetFromSceneView(*SceneView); // if we are in camera control we don't send any events bool bInCameraControl = ActiveEditorContext->IsViewportCameraControl(); @@ -240,7 +249,7 @@ void AFICEditorSubsystem::OpenEditor(AFICScene* InScene) { // Initialize Editor Player Character // TODO: Persist "Viewport Camera Transform" sepperately in persistent editor storage for given scene Controller->Possess(Character); - UFGInputLibrary::UpdateInputMappings(Controller); + //UFGInputLibrary::UpdateInputMappings(Controller); UFGGameUserSettings::GetFGGameUserSettings()->ApplySettings(false); Character->SetEditorContext(Context); Controller->PlayerInput->ActionMappings.Empty(); @@ -268,6 +277,10 @@ void AFICEditorSubsystem::OpenEditor(AFICScene* InScene) { // Finish Editor Opening ActiveEditorContext = Context; EditorPlayerCharacter = Character; + + // Add Editor Input Context + UFGInputMappingContext* InputMappingContext = LoadObject(nullptr, TEXT("/FicsItCam/Input/IC_FIC_Editor.IC_FIC_Editor")); + Controller->GetLocalPlayer()->GetSubsystem()->AddMappingContext(InputMappingContext, -2); InitInteractiveTools(); } @@ -281,6 +294,8 @@ void AFICEditorSubsystem::CloseEditor() { // Don't do anything if no scene is opened in editor if (!Context) return; + APlayerController* Controller = GetWorld()->GetFirstPlayerController(); + // Copy Editor Settings bAutoKeyframe = Context->GetAutoKeyframe(); bLockCameraToView = Context->GetLockCameraToView(); @@ -293,6 +308,10 @@ void AFICEditorSubsystem::CloseEditor() { // Shutdown Interactive Tools ShutdownInteractiveTools(); + // Remove Editor Input Context + UFGInputMappingContext* InputMappingContext = LoadObject(nullptr, TEXT("/FicsItCam/Input/IC_FIC_Editor.IC_FIC_Editor")); + Controller->GetLocalPlayer()->GetSubsystem()->RemoveMappingContext(InputMappingContext); + // Focus back to viewport Character->SetControlView(true); @@ -304,7 +323,7 @@ void AFICEditorSubsystem::CloseEditor() { // Swap PlayerCharacter to FG Player Character GetWorld()->GetFirstPlayerController()->Possess(OriginalPlayerCharacter); - UFGInputLibrary::UpdateInputMappings(GetWorld()->GetFirstPlayerController()); + //UFGInputLibrary::UpdateInputMappings(GetWorld()->GetFirstPlayerController()); UFGGameUserSettings::GetFGGameUserSettings()->ApplySettings(false); // Add Game Viewport Back @@ -317,7 +336,6 @@ void AFICEditorSubsystem::CloseEditor() { Cast(GEngine)->CreateGameViewport(GEngine->GameViewport); // Enabled Game Inputs/WorldControl - APlayerController* Controller = GetWorld()->GetFirstPlayerController(); UWidgetBlueprintLibrary::SetInputMode_GameOnly(Controller); UGameplayStatics::SetGamePaused(this, false); Cast(Controller)->GetHUD()->SetHUDVisibility(true); diff --git a/Source/FicsItCam/Private/Editor/ITF/FICSelectionInteraction.cpp b/Source/FicsItCam/Private/Editor/ITF/FICSelectionInteraction.cpp index 81f9e9d..0de80e0 100644 --- a/Source/FicsItCam/Private/Editor/ITF/FICSelectionInteraction.cpp +++ b/Source/FicsItCam/Private/Editor/ITF/FICSelectionInteraction.cpp @@ -23,7 +23,8 @@ FInputRayHit UFICSelectionInteraction::IsHitByClick(const FInputDeviceRay& Click FHitResult Result; GetWorld()->LineTraceSingleByChannel(Result, ClickPos.WorldRay.Origin, ClickPos.WorldRay.Origin + ClickPos.WorldRay.Direction * 10000, ECollisionChannel::ECC_GameTraceChannel10); - if (Result.Actor.IsValid() && Result.GetActor()->Implements()) { + //GetWorld()->LineBatcher->DrawLine(ClickPos.WorldRay.Origin, ClickPos.WorldRay.Origin + ClickPos.WorldRay.Direction * 1000, FColor::Green, 0, 10, 10000); + if (IsValid(Result.GetActor()) && Result.GetActor()->Implements()) { RayHit.bHit = true; RayHit.HitDepth = Result.Distance; //RayHit.HitNormal = ; // todo - can compute from bary coords @@ -52,7 +53,7 @@ FInputRayHit UFICSelectionInteraction::IsHitByClick(const FInputDeviceRay& Click void UFICSelectionInteraction::OnClicked(const FInputDeviceRay& ClickPos) { FHitResult Result; GetWorld()->LineTraceSingleByChannel(Result, ClickPos.WorldRay.Origin, ClickPos.WorldRay.Origin + ClickPos.WorldRay.Direction * 10000, ECollisionChannel::ECC_GameTraceChannel10); - if (Result.Actor.IsValid() && Result.GetActor()->Implements()) { + if (IsValid(Result.GetActor()) && Result.GetActor()->Implements()) { UObject* SelectedObject = Cast(Result.GetActor())->Select(); if (SelectedObject) Context->SetSelectedSceneObject(SelectedObject); } else { @@ -89,7 +90,7 @@ void UFICSelectionInteraction::OnBeginHover(const FInputDeviceRay& DevicePos) { int32 Frame; float Distance; if (HitCameraPath(DevicePos.WorldRay, LastHovered, Frame, Distance)) { - LastHovered->EditorCameraActor->CameraPathComponent->Hovered = Frame - Context->GetScene()->AnimationRange.Begin; + LastHovered->EditorCameraActor->CameraPathComponent->Hovered = Frame - Context->GetActiveRange().Begin; } } @@ -98,7 +99,7 @@ bool UFICSelectionInteraction::OnUpdateHover(const FInputDeviceRay& DevicePos) { int32 Frame; float Distance; if (HitCameraPath(DevicePos.WorldRay, LastHovered, Frame, Distance)) { - LastHovered->EditorCameraActor->CameraPathComponent->Hovered = Frame - Context->GetScene()->AnimationRange.Begin; + LastHovered->EditorCameraActor->CameraPathComponent->Hovered = Frame - Context->GetActiveRange().Begin; return true; } return false; @@ -124,7 +125,7 @@ bool UFICSelectionInteraction::HitCameraPath(const FRay& InRay, UFICCamera*& Out float OriginDistance = FVector::Distance(Point, InRay.Origin); if (OriginDistance < OutDistance) { OutDistance = OriginDistance; - OutFrame = Context->GetScene()->AnimationRange.Begin + PointIndex; + OutFrame = Context->GetActiveRange().Begin + PointIndex; BestCamera = Camera; } } diff --git a/Source/FicsItCam/Private/Editor/ITF/FICToolsContextRenderComponent.cpp b/Source/FicsItCam/Private/Editor/ITF/FICToolsContextRenderComponent.cpp index 3fae168..c62dcf6 100644 --- a/Source/FicsItCam/Private/Editor/ITF/FICToolsContextRenderComponent.cpp +++ b/Source/FicsItCam/Private/Editor/ITF/FICToolsContextRenderComponent.cpp @@ -68,8 +68,7 @@ class FToolsContextRenderComponentSceneProxy final : public FPrimitiveSceneProxy virtual uint32 GetMemoryFootprint(void) const override { return sizeof * this + GetAllocatedSize(); } uint32 GetAllocatedSize(void) const { return FPrimitiveSceneProxy::GetAllocatedSize(); } - - + // set to lambda that steals current lines/points from the Component TUniqueFunction&, TArray&)> GetGeometryQueryFunc; }; @@ -93,29 +92,34 @@ class FToolsContextRenderComponentPDI : public FPrimitiveDrawInterface LineBatchComponent = LineBatchComponentIn; } - virtual bool IsHitTesting() { return false; } - virtual void SetHitProxy(HHitProxy* HitProxy) { }; - virtual void RegisterDynamicResource(FDynamicPrimitiveResource* DynamicResource) { ensure(false); } - virtual void AddReserveLines(uint8 DepthPriorityGroup, int32 NumLines, bool bDepthBiased = false, bool bThickLines = false) { ensure(false); } - virtual int32 DrawMesh(const FMeshBatch& Mesh) { ensure(false); return 0; } - virtual void DrawSprite( - const FVector& Position, float SizeX, float SizeY, - const FTexture* Sprite, const FLinearColor& Color, uint8 DepthPriorityGroup, - float U, float UL, float V, float VL, uint8 BlendMode = 1 /*SE_BLEND_Masked*/ ) { ensure(false); } - + virtual bool IsHitTesting() override { return false; } + virtual void SetHitProxy(HHitProxy* HitProxy) override { }; + virtual void RegisterDynamicResource(FDynamicPrimitiveResource* DynamicResource) override { ensure(false); } + virtual void AddReserveLines(uint8 DepthPriorityGroup, int32 NumLines, bool bDepthBiased = false, bool bThickLines = false) override { ensure(false); } + virtual int32 DrawMesh(const FMeshBatch& Mesh) override { ensure(false); return 0; } virtual void DrawLine( const FVector& Start, const FVector& End, const FLinearColor& Color, - uint8 DepthPriorityGroup, float Thickness = 0.0f, float DepthBias = 0.0f, bool bScreenSpace = false ) + uint8 DepthPriorityGroup, float Thickness = 0.0f, float DepthBias = 0.0f, bool bScreenSpace = false ) override { if (RenderComponent) RenderComponent->DrawLine(Start, End, Color, DepthPriorityGroup, Thickness, DepthBias, bScreenSpace); if (LineBatchComponent) LineBatchComponent->DrawLine(Start, End, Color, DepthPriorityGroup, Thickness); } - virtual void DrawPoint( const FVector& Position, const FLinearColor& Color, float PointSize, uint8 DepthPriorityGroup ) + virtual void DrawPoint( const FVector& Position, const FLinearColor& Color, float PointSize, uint8 DepthPriorityGroup ) override { if (RenderComponent) RenderComponent->DrawPoint(Position, Color, PointSize, DepthPriorityGroup); if (LineBatchComponent) LineBatchComponent->DrawPoint(Position, Color, PointSize, DepthPriorityGroup); } + virtual void DrawSprite(const FVector& Position, float SizeX, float SizeY, const FTexture* Sprite, + const FLinearColor& Color, uint8 DepthPriorityGroup, float U, float UL, float V, float VL, uint8 BlendMode, + float OpacityMaskRefVal) override { + ensure(false); + } + virtual void DrawTranslucentLine(const FVector& Start, const FVector& End, const FLinearColor& Color, + uint8 DepthPriorityGroup, float Thickness, float DepthBias, bool bScreenSpace) override { + if (RenderComponent) RenderComponent->DrawLine(Start, End, Color, DepthPriorityGroup, Thickness, DepthBias, bScreenSpace); + if (LineBatchComponent) LineBatchComponent->DrawLine(Start, End, Color, DepthPriorityGroup, Thickness); + } }; diff --git a/Source/FicsItCam/Private/Editor/ITF/FICTransformInteraction.cpp b/Source/FicsItCam/Private/Editor/ITF/FICTransformInteraction.cpp index 6ab9548..33d7b71 100644 --- a/Source/FicsItCam/Private/Editor/ITF/FICTransformInteraction.cpp +++ b/Source/FicsItCam/Private/Editor/ITF/FICTransformInteraction.cpp @@ -1,25 +1,9 @@ #include "Editor/ITF/FICTransformInteraction.h" -#include "FGColoredInstanceMeshProxy.h" -#include "BaseGizmos/TransformGizmo.h" +#include "BaseGizmos/CombinedTransformGizmo.h" #include "BaseGizmos/TransformProxy.h" -#include "Buildables/FGBuildable.h" -#include "Components/ProxyInstancedStaticMeshComponent.h" #include "Editor/FICEditorSubsystem.h" - -#pragma optimize("", off) -void Test(UTransformProxy* Proxy, FTransform Transform) { - AFICEditorSubsystem* SubSys = AFICEditorSubsystem::GetFICEditorSubsystem(Proxy->GetWorld()); - AActor* Selection = SubSys->GetSelection(); - auto SavedMobility = Selection->GetRootComponent()->Mobility; - Selection->GetRootComponent()->SetMobility(EComponentMobility::Movable); - Selection->GetRootComponent()->SetWorldTransform(Transform, false, nullptr, ETeleportType::TeleportPhysics); - Selection->GetRootComponent()->SetMobility(SavedMobility); - - Selection->RerunConstructionScripts(); - UE_LOG(LogTemp, Warning, TEXT("MeeP!!!!")); -} -#pragma optimize("", on) +#include "Editor/Data/FICEditorAttributeBase.h" void UFICTransformInteraction::Tick(float DeltaTime) { /*if (Context && TransformGizmo) { diff --git a/Source/FicsItCam/Private/Editor/UI/FICEditor.cpp b/Source/FicsItCam/Private/Editor/UI/FICEditor.cpp index 4cffd36..910b21f 100644 --- a/Source/FicsItCam/Private/Editor/UI/FICEditor.cpp +++ b/Source/FicsItCam/Private/Editor/UI/FICEditor.cpp @@ -1,12 +1,13 @@ #include "Editor/UI/FICEditor.h" +#include "EnhancedPlayerInput.h" #include "FICConfigurationStruct.h" #include "FICSubsystem.h" #include "FICUtils.h" #include "Engine/World.h" -#include "Blueprint/WidgetBlueprintLibrary.h" #include "Editor/FICEditorContext.h" #include "Editor/FICEditorSubsystem.h" +#include "Editor/Data/FICEditorAttributeGroupDynamic.h" #include "Slate/SceneViewport.h" #include "Widgets/Docking/SDockTab.h" #include "Editor/UI/FICTimeline.h" @@ -16,8 +17,6 @@ #include "Editor/UI/FICSceneObjectOutliner.h" #include "Editor/UI/FICSceneSettings.h" #include "Editor/UI/FICViewport.h" -#include "Slate/Private/Framework/Docking/SDockingArea.h" -#include "Slate/Private/Framework/Docking/SDockingTabStack.h" #include "Widgets/Layout/SDPIScaler.h" #define LOCTEXT_NAMESPACE "FicsItCam.Editor" @@ -261,64 +260,7 @@ FReply SFICEditor::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKey InputState.Keyboard.ActiveKey.SetStates(true, true, !false); AFICEditorSubsystem::GetFICEditorSubsystem(Context)->ToolsContext->InputRouter->PostInputEvent(InputState); - if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.ToggleCursor"))) { - Context->GetPlayerCharacter()->ControlViewToggle(); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.ToggleAllKeyframes"))) { - auto Change = MakeShared(); - Change->PushChange(MakeShared(Context, TNumericLimits::Min(), Context->GetCurrentFrame())); - BEGIN_ATTRIB_CHANGE(Context->GetAllAttributes()->GetAttribute()) - Context->ToggleCurrentKeyframes(); - END_ATTRIB_CHANGE(Change) - Context->ChangeList.PushChange(Change); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.PrevFrame"))) { - int64 Rate = 1; - if (InKeyEvent.GetModifierKeys().IsControlDown()) Rate = 10; - Context->SetCurrentFrame(Context->GetCurrentFrame()-Rate); - bIsLeft = true; - KeyPressTime = 0; - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.NextFrame"))) { - int64 Rate = 1; - if (InKeyEvent.GetModifierKeys().IsControlDown()) Rate = 10; - Context->SetCurrentFrame(Context->GetCurrentFrame()+Rate); - bIsRight= true; - KeyPressTime = 0; - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.PrevKeyframe"))) { - int64 Time; - TSharedPtr KF = Context->GetAllAttributes()->GetAttribute().GetPrevKeyframe(Context->GetCurrentFrame(), Time); - if (KF) Context->SetCurrentFrame(Time); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.NextKeyframe"))) { - int64 Time; - TSharedPtr KF = Context->GetAllAttributes()->GetAttribute().GetNextKeyframe(Context->GetCurrentFrame(), Time); - if (KF) Context->SetCurrentFrame(Time); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.ToggleAutoKeyframe"))) { - Context->SetLockCameraToView(!Context->GetLockCameraToView()); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.ToggleShowPath"))) { - Context->bShowPath = !Context->bShowPath; - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.ToggleLockCamera"))) { - Context->SetLockCameraToView(!Context->GetLockCameraToView()); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.Undo"))) { - TSharedPtr Change = Context->ChangeList.PopChange(); - if (Change) Change->UndoChange(); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.Redo"))) { - TSharedPtr Change = Context->ChangeList.PushChange(); - if (Change) Change->RedoChange(); - return FReply::Handled(); - } else if (UFICUtils::IsAction(Context, InKeyEvent, TEXT("FicsItCam.Grab"))) { - UInteractiveToolManager* ToolManager = AFICEditorSubsystem::GetFICEditorSubsystem(Context)->ToolsContext->ToolManager; - ToolManager->SelectActiveToolType(EToolSide::Mouse, "Grab"); - ToolManager->ActivateTool(EToolSide::Mouse); - return FReply::Handled(); - } else if (InKeyEvent.GetKey() == EKeys::Delete) { + if (InKeyEvent.GetKey() == EKeys::Delete) { if (Context->GetSelectedSceneObject()) { Context->ChangeList.PushChange(MakeShared(Context, Context->GetSelectedSceneObject())); Context->RemoveSceneObject(Context->GetSelectedSceneObject()); @@ -332,7 +274,13 @@ FReply SFICEditor::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKey Context->GetPlayerCharacter()->SetControlView(false); } } - return SCompoundWidget::OnKeyDown(MyGeometry, InKeyEvent); + FReply Reply = SCompoundWidget::OnKeyDown(MyGeometry, InKeyEvent); + if (!Reply.IsEventHandled()) { + FInputKeyParams Params(InKeyEvent.GetKey(), IE_Pressed, 1.0); + Context->GetWorld()->GetFirstPlayerController()->InputKey(Params); + return FReply::Handled(); + } + return Reply; } FReply SFICEditor::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) { @@ -352,7 +300,13 @@ FReply SFICEditor::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& InKeyEv bIsRight = false; return FReply::Handled(); } - return SCompoundWidget::OnKeyUp(MyGeometry, InKeyEvent); + FReply Reply = SCompoundWidget::OnKeyUp(MyGeometry, InKeyEvent); + if (!Reply.IsEventHandled()) { + FInputKeyParams Params(InKeyEvent.GetKey(), IE_Released, 1.0); + Context->GetWorld()->GetFirstPlayerController()->InputKey(Params); + return FReply::Handled(); + } + return Reply; } FReply SFICEditor::OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) { diff --git a/Source/FicsItCam/Private/Editor/UI/FICRangeSelector.cpp b/Source/FicsItCam/Private/Editor/UI/FICRangeSelector.cpp index 84ad083..72cd290 100644 --- a/Source/FicsItCam/Private/Editor/UI/FICRangeSelector.cpp +++ b/Source/FicsItCam/Private/Editor/UI/FICRangeSelector.cpp @@ -152,7 +152,7 @@ float SFICRangeSelector::FrameToLocalPos(FICFrame Frame) const { FICFrame SFICRangeSelector::LocalPosToFrame(float LocalPos) const { FFICFrameRange Range = FullRange.Get(); - return FMath::RoundToFloat(FMath::Lerp((float)Range.Begin, (float)Range.End, FMath::GetRangePct(0.0f, GetCachedGeometry().GetLocalSize().X, LocalPos))); + return FMath::RoundToFloat(FMath::Lerp((float)Range.Begin, (float)Range.End, FMath::GetRangePct(0.0, GetCachedGeometry().GetLocalSize().X, LocalPos))); } bool SFICRangeSelector::IsLocalPosNearFrame(float LocalPos, FICFrame Frame) const { diff --git a/Source/FicsItCam/Private/Editor/UI/FICSceneSettings.cpp b/Source/FicsItCam/Private/Editor/UI/FICSceneSettings.cpp index 4ab7271..0ef7a1c 100644 --- a/Source/FicsItCam/Private/Editor/UI/FICSceneSettings.cpp +++ b/Source/FicsItCam/Private/Editor/UI/FICSceneSettings.cpp @@ -80,8 +80,9 @@ void SFICSceneSettings::Construct(const FArguments& InArgs, UFICEditorContext* I .MinValue(1) .LinearDeltaSensitivity(10) .AllowSpin(false) - .OnValueCommitted_Lambda([this](int Val, auto) { - Context->GetScene()->ResolutionWidth = FMath::Max(1, Val); + .OnValueCommitted_Lambda([this](int Value, auto) { + if (Value % 2 != 0) Value += 1; + Context->GetScene()->ResolutionWidth = FMath::Max(1, Value); }) .TypeInterface(MakeShared>()) .ToolTipText(FText::FromString(TEXT("Resolution Width"))) @@ -100,8 +101,9 @@ void SFICSceneSettings::Construct(const FArguments& InArgs, UFICEditorContext* I .MinValue(1) .LinearDeltaSensitivity(10) .AllowSpin(false) - .OnValueCommitted_Lambda([this](int Val, auto) { - Context->GetScene()->ResolutionHeight = FMath::Max(1, Val); + .OnValueCommitted_Lambda([this](int Value, auto) { + if (Value % 2 != 0) Value += 1; + Context->GetScene()->ResolutionHeight = FMath::Max(1, Value); }) .TypeInterface(MakeShared>()) .ToolTipText(FText::FromString(TEXT("Resolution Height"))) diff --git a/Source/FicsItCam/Private/Editor/UI/FICSequencerTreeView.cpp b/Source/FicsItCam/Private/Editor/UI/FICSequencerTreeView.cpp index 42cd3e1..50cf64a 100644 --- a/Source/FicsItCam/Private/Editor/UI/FICSequencerTreeView.cpp +++ b/Source/FicsItCam/Private/Editor/UI/FICSequencerTreeView.cpp @@ -71,12 +71,12 @@ SFICSequencerTreeView::~SFICSequencerTreeView() { } void SFICSequencerTreeView::RequestListRefresh() { - STreeView>::RequestListRefresh(); + STreeView>::RequestListRefresh(); bDirty = true; } void SFICSequencerTreeView::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) { - STreeView>::Tick(AllottedGeometry, InCurrentTime, InDeltaTime); + STreeView>::Tick(AllottedGeometry, InCurrentTime, InDeltaTime); if (bDirty) { TriggerUpdate(); bDirty = false; diff --git a/Source/FicsItCam/Private/Editor/UI/FICTimeline.cpp b/Source/FicsItCam/Private/Editor/UI/FICTimeline.cpp index a920f40..c9cffaa 100644 --- a/Source/FicsItCam/Private/Editor/UI/FICTimeline.cpp +++ b/Source/FicsItCam/Private/Editor/UI/FICTimeline.cpp @@ -92,6 +92,7 @@ void SFICTimelinePanel::Construct(const FArguments& InArgs, UFICEditorContext* I return &Style->SequencerIcon; } }) + .ColorAndOpacity(FSlateColor::UseForeground()) ] ] ] diff --git a/Source/FicsItCam/Private/Editor/UI/FICTimelineScrubber.cpp b/Source/FicsItCam/Private/Editor/UI/FICTimelineScrubber.cpp index 973d3d3..18bea76 100644 --- a/Source/FicsItCam/Private/Editor/UI/FICTimelineScrubber.cpp +++ b/Source/FicsItCam/Private/Editor/UI/FICTimelineScrubber.cpp @@ -103,7 +103,7 @@ float SFICTimelineScrubber::FrameToLocalPos(FICFrame InFrame) const { FICFrame SFICTimelineScrubber::LocalPosToFrame(float LocalPos) const { const FFICFrameRange Range = ActiveRange.Get(); - return FMath::RoundToFloat(FMath::Lerp((float)Range.Begin, (float)Range.End, FMath::GetRangePct(0.0f, GetCachedGeometry().GetLocalSize().X, LocalPos))); + return FMath::RoundToFloat(FMath::Lerp((float)Range.Begin, (float)Range.End, FMath::GetRangePct(0.0, GetCachedGeometry().GetLocalSize().X, LocalPos))); } void SFICTimelineScrubber::SetActiveFrame(FICFrame InFrame) { diff --git a/Source/FicsItCam/Private/Editor/UI/SelectionManager.cpp b/Source/FicsItCam/Private/Editor/UI/SelectionManager.cpp index bdcc8c2..93066f3 100644 --- a/Source/FicsItCam/Private/Editor/UI/SelectionManager.cpp +++ b/Source/FicsItCam/Private/Editor/UI/SelectionManager.cpp @@ -78,7 +78,7 @@ void FSelectionManager::BeginBoxSelection(const FModifierKeysState& InModifiers) if (!InModifiers.IsCommandDown() && !InModifiers.IsShiftDown() && !InModifiers.IsAltDown()) { SetSelection({}); } - BoxSelection = FBox2D(0); + BoxSelection = FBox2D(); BoxSelection.bIsValid = true; } diff --git a/Source/FicsItCam/Private/FICUtils.cpp b/Source/FicsItCam/Private/FICUtils.cpp index 6c8dd34..5b6b958 100644 --- a/Source/FicsItCam/Private/FICUtils.cpp +++ b/Source/FicsItCam/Private/FICUtils.cpp @@ -1,9 +1,11 @@ #include "FICUtils.h" #include "FicsItCam/Public/FICUtils.h" +#include "EnhancedPlayerInput.h" #include "Editor/FICEditorSubsystem.h" #include "GameFramework/InputSettings.h" #include "GameFramework/PlayerInput.h" +#include "Input/FGEnhancedInputComponent.h" #include "Runtime/FICCameraReference.h" FRotator UFICUtils::NormalizeRotator(FRotator Rot) { @@ -70,12 +72,16 @@ bool UFICUtils::IsValidFICObjectName(const FString& InName) { } bool UFICUtils::IsAction(UObject* WorldContext, const FKeyEvent& InKeyEvent, const FName& InActionName) { - const FInputActionKeyMapping* Mapping = AFICEditorSubsystem::GetFICEditorSubsystem(WorldContext)->KeyMappings.Find(InActionName); + //UInputAction* Action; + //Cast(WorldContext->GetWorld()->GetFirstPlayerController()->GetCharacter()->InputComponent)->KeyBindings + /*const FInputActionKeyMapping* Mapping = AFICEditorSubsystem::GetFICEditorSubsystem(WorldContext)->KeyMappings.Find(InActionName); return Mapping && Mapping->Key == InKeyEvent.GetKey() && Mapping->bAlt == InKeyEvent.GetModifierKeys().IsAltDown() && Mapping->bCmd == InKeyEvent.GetModifierKeys().IsCommandDown() && Mapping->bCtrl == InKeyEvent.GetModifierKeys().IsControlDown() && - Mapping->bShift == InKeyEvent.GetModifierKeys().IsShiftDown(); + Mapping->bShift == InKeyEvent.GetModifierKeys().IsShiftDown();*/ + return false; + // TODO: Maybe use Enhanced Input System directly, even if Editor Widget is Focused... needs some experiments } FRotator UFICUtils::AdditiveRotation(FRotator OldRotation, FRotator NewRotation) { diff --git a/Source/FicsItCam/Private/FicsItCamModule.cpp b/Source/FicsItCam/Private/FicsItCamModule.cpp index 0c48643..28f8473 100644 --- a/Source/FicsItCam/Private/FicsItCamModule.cpp +++ b/Source/FicsItCam/Private/FicsItCamModule.cpp @@ -1,5 +1,7 @@ #include "FicsItCamModule.h" +#include + #include "FGGameMode.h" #include "FGItemRegrowSubsystem.h" #include "Editor/UI/FICEditorStyle.h" @@ -9,6 +11,24 @@ DEFINE_LOG_CATEGORY(LogFicsItCam); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Movement, "Input.FIC.Editor.Movement"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Rotation, "Input.FIC.Editor.Rotation"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_FOV, "Input.FIC.Editor.FOV"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Frame, "Input.FIC.Editor.Frame"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Grab, "Input.FIC.Editor.Grab"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_NextKeyframe, "Input.FIC.Editor.NextKeyframe"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_PrevKeyframe, "Input.FIC.Editor.PrevKeyframe"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Redo, "Input.FIC.Editor.Redo"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Undo, "Input.FIC.Editor.Undo"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_Speed, "Input.FIC.Editor.Speed"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_SpeedUp, "Input.FIC.Editor.SpeedUp"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_ToggleAllKeyframes, "Input.FIC.Editor.ToggleAllKeyframes"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_ToggleAutoKeyframes, "Input.FIC.Editor.ToggleAutoKeyframes"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_ToggleCursor, "Input.FIC.Editor.ToggleCursor"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_ToggleLockCamera, "Input.FIC.Editor.ToggleLockCamera"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Editor_ToggleShowPath, "Input.FIC.Editor.ToggleShowPath"); +UE_DEFINE_GAMEPLAY_TAG(Input_FIC_Playback_StopAnimation, "Input.FIC.Playback.StopAnimation"); + #pragma optimize("", off) void FFicsItCamModule::AddPickup_Override(CallScope& Scope, AFGItemRegrowSubsystem* self, AFGItemPickup* Item) { if (!self || !Item || self->mPickups.Contains(Item)) { @@ -19,6 +39,13 @@ void FFicsItCamModule::AddPickup_Override(CallScope& Scope, AActor* gm, bool) { } +void FfmpegLogCallback(void* ptr, int level, const char* fmt, va_list varargs) { + char msg[4096]; + int len = vsnprintf(msg, sizeof(msg), fmt, varargs); + FUTF8ToTCHAR conv(msg, len); + UE_LOG(LogFicsItCam, Warning, TEXT("FFmpeg Log: %s"), conv.Get()); +} + void FFicsItCamModule::StartupModule() { FSlateStyleRegistry::UnRegisterSlateStyle(FFICEditorStyles::GetStyleSetName()); FFICEditorStyles::Initialize(); @@ -33,6 +60,9 @@ void FFicsItCamModule::StartupModule() { AFGGameMode* gm = const_cast(GetDefault()); gm->ReplaySpectatorPlayerControllerClass = gm->PlayerControllerClass; }); + + //av_log_set_level(AV_LOG_DEBUG); + //av_log_set_callback(FfmpegLogCallback); } void FFicsItCamModule::ShutdownModule() { diff --git a/Source/FicsItCam/Private/InitGameInstance.cpp b/Source/FicsItCam/Private/InitGameInstance.cpp index 39af84b..1e6c1b1 100644 --- a/Source/FicsItCam/Private/InitGameInstance.cpp +++ b/Source/FicsItCam/Private/InitGameInstance.cpp @@ -4,86 +4,4 @@ UInitGameInstanceFicsItCam::UInitGameInstanceFicsItCam() { bRootModule = false; - ModAxisBindings.Add(FModAxisBindingInfo{ - TEXT("FicsItCam.MoveRoll"), - FInputAxisKeyMapping("FicsItCam.MoveRoll", EKeys::E, 1), - FInputAxisKeyMapping("FicsItCam.MoveRoll", EKeys::Q, -1), - LOCTEXT("RollClockwise", "Rolls the camera in Editor clockwise"), - LOCTEXT("RollCounterclockwise", "Rolls the camera in Editor counterclockwise"), - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ChangeFOV"), - FInputActionKeyMapping(TEXT("FicsItCam.ChangeFOV"), EKeys::LeftShift, false, true), - FText::FromString(TEXT("Mousewheel -> Change FOV")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ChangeSpeed"), - FInputActionKeyMapping(TEXT("FicsItCam.ChangeSpeed"), EKeys::LeftControl), - FText::FromString(TEXT("Mousewheel -> Change Speed")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ToggleAllKeyframes"), - FInputActionKeyMapping(TEXT("FicsItCam.ToggleAllKeyframes"), EKeys::I), - FText::FromString(TEXT("Toggle all keyframes")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.NextKeyframe"), - FInputActionKeyMapping(TEXT("FicsItCam.NextKeyframe"), EKeys::Period), - FText::FromString(TEXT("Goto next keyframe")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.PrevKeyframe"), - FInputActionKeyMapping(TEXT("FicsItCam.PrevKeyframe"), EKeys::Comma), - FText::FromString(TEXT("Goto previous keyframe")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.NextFrame"), - FInputActionKeyMapping(TEXT("FicsItCam.NextFrame"), EKeys::Right), - FText::FromString(TEXT("Goto next frame")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.PrevFrame"), - FInputActionKeyMapping(TEXT("FicsItCam.PrevFrame"), EKeys::Left), - FText::FromString(TEXT("Goto previous frame")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ToggleCursor"), - FInputActionKeyMapping(TEXT("FicsItCam.ToggleCursor"), EKeys::G), - FText::FromString(TEXT("Toggles the mouse cursor")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.StopAnimation"), - FInputActionKeyMapping(TEXT("FicsItCam.StopAnimation"), EKeys::C), - FText::FromString(TEXT("Stops the currently running animation")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ToggleAutoKeyframe"), - FInputActionKeyMapping(TEXT("FicsItCam.ToggleAutoKeyframe"), EKeys::K), - FText::FromString(TEXT("Toggles all keyframes")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ToggleShowPath"), - FInputActionKeyMapping(TEXT("FicsItCam.ToggleShowPath"), EKeys::L), - FText::FromString(TEXT("Shows/Hides the 3D camnera path")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.ToggleLockCamera"), - FInputActionKeyMapping(TEXT("FicsItCam.ToggleLockCamera"), EKeys::J), - FText::FromString(TEXT("Enables/Disables view lock to path camera")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.Undo"), - FInputActionKeyMapping(TEXT("FicsItCam.Undo"), EKeys::Z, false, true), - FText::FromString(TEXT("Undos a previous change you applied.")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.Redo"), - FInputActionKeyMapping(TEXT("FicsItCam.Redo"), EKeys::Y, false, true), - FText::FromString(TEXT("Redos a change you have previously un-done.")) - }); - ModKeyBindings.Add({ - TEXT("FicsItCam.Grab"), - FInputActionKeyMapping(TEXT("FicsItCam.Grab"), EKeys::G, false, true), - FText::FromString(TEXT("Activates the grab tool.")) - }); } diff --git a/Source/FicsItCam/Private/Runtime/FICRuntimeProcessorCharacter.cpp b/Source/FicsItCam/Private/Runtime/FICRuntimeProcessorCharacter.cpp index 071cbad..d68601b 100644 --- a/Source/FicsItCam/Private/Runtime/FICRuntimeProcessorCharacter.cpp +++ b/Source/FicsItCam/Private/Runtime/FICRuntimeProcessorCharacter.cpp @@ -1,9 +1,14 @@ #include "Runtime/FICRuntimeProcessorCharacter.h" #include "CineCameraComponent.h" +#include "EnhancedInputSubsystems.h" +#include "FGInputSettings.h" #include "Engine/World.h" #include "FGPlayerController.h" +#include "FGPlayerInput.h" #include "FICSubsystem.h" +#include "Input/FGEnhancedInputComponent.h" +#include "Input/FGInputMappingContext.h" #include "Runtime/Process/FICRuntimeProcess.h" void AFICRuntimeProcessorCharacter::StopProcess() { @@ -32,7 +37,10 @@ void AFICRuntimeProcessorCharacter::BeginPlay() { } void AFICRuntimeProcessorCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { - PlayerInputComponent->BindAction("FicsItCam.StopAnimation", EInputEvent::IE_Pressed, this, &AFICRuntimeProcessorCharacter::StopProcess); + UFGEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent); + const UFGInputSettings* Settings = UFGInputSettings::Get(); + + EnhancedInputComponent->BindAction(Settings->GetInputActionForTag(FGameplayTag::RequestGameplayTag(TEXT("Input.FIC.Playback.StopAnimation"))), ETriggerEvent::Triggered, this, &AFICRuntimeProcessorCharacter::StopProcess); } void AFICRuntimeProcessorCharacter::PossessedBy(AController* NewController) { @@ -42,6 +50,9 @@ void AFICRuntimeProcessorCharacter::PossessedBy(AController* NewController) { AFGPlayerController* PlayerController = Cast(NewController); NewController->DisableInput(PlayerController); PlayerController->GetHUD()->SetPumpiMode(true); + + UFGInputMappingContext* InputMappingContext = LoadObject(nullptr, TEXT("/FicsItCam/Input/IC_FIC_Playback.IC_FIC_Playback")); + PlayerController->GetLocalPlayer()->GetSubsystem()->AddMappingContext(InputMappingContext, -2); } } @@ -57,6 +68,8 @@ void AFICRuntimeProcessorCharacter::UnPossessed() { if (OldController) { // Make sure if not able to recover, game is interactable AFGPlayerController* PlayerController = Cast(OldController); + UFGInputMappingContext* InputMappingContext = LoadObject(nullptr, TEXT("/FicsItCam/Input/IC_FIC_Playback.IC_FIC_Playback")); + PlayerController->GetLocalPlayer()->GetSubsystem()->RemoveMappingContext(InputMappingContext); PlayerController->GetHUD()->SetPumpiMode(false); OldController->EnableInput(PlayerController); diff --git a/Source/FicsItCam/Public/Command/Scene/FICCommandCreate.h b/Source/FicsItCam/Public/Command/Scene/FICCommandCreate.h index 374fbfc..434b7b0 100644 --- a/Source/FicsItCam/Public/Command/Scene/FICCommandCreate.h +++ b/Source/FicsItCam/Public/Command/Scene/FICCommandCreate.h @@ -28,8 +28,8 @@ class UFICCommandCreate : public UFICCommand { AFICScene* Scene = InSender->GetWorld()->SpawnActor(); FIntPoint Resolution = UFGGameUserSettings::GetFGGameUserSettings()->GetScreenResolution(); - Scene->ResolutionWidth = Resolution.X; - Scene->ResolutionHeight = Resolution.Y; + Scene->ResolutionWidth = Resolution.X + (Resolution.X % 2 != 0 ? 1 : 0); + Scene->ResolutionHeight = Resolution.Y + (Resolution.Y % 2 != 0 ? 1 : 0); Scene->SceneName = InArgs[0]; UFICCamera* CDO = UFICCamera::StaticClass()->GetDefaultObject(); if (CDO) Scene->AddSceneObject(CDO->CreateNewObject(AFICSubsystem::GetFICSubsystem(InSender), Scene)); diff --git a/Source/FicsItCam/Public/Data/Attributes/FICAttribute.h b/Source/FicsItCam/Public/Data/Attributes/FICAttribute.h index 1baee8f..be0a71b 100644 --- a/Source/FicsItCam/Public/Data/Attributes/FICAttribute.h +++ b/Source/FicsItCam/Public/Data/Attributes/FICAttribute.h @@ -1,9 +1,10 @@ #pragma once #include "FICKeyframe.h" -#include "Editor/Data/FICEditorAttributeBase.h" #include "FICAttribute.generated.h" +class FFICEditorAttributeBase; + USTRUCT(BlueprintType) struct FFICAttribute { GENERATED_BODY() @@ -45,7 +46,7 @@ struct FFICAttribute { virtual void Set(TSharedRef InAttrib) { checkf(false, TEXT("Not Implemented!")); } virtual TSharedRef Get() { checkf(false, TEXT("Not Implemented!")); return MakeShareable(nullptr); } - virtual TSharedRef CreateEditorAttribute() { checkf(false, TEXT("Not Implemented!")); return MakeShareable(nullptr); } + virtual TSharedRef CreateEditorAttribute(); virtual const TMap& GetChildAttributes() const { static TMap Keyframes; diff --git a/Source/FicsItCam/Public/Data/FICTypes.h b/Source/FicsItCam/Public/Data/FICTypes.h index 97f44c9..17f5ba0 100644 --- a/Source/FicsItCam/Public/Data/FICTypes.h +++ b/Source/FicsItCam/Public/Data/FICTypes.h @@ -1,9 +1,10 @@ #pragma once +#include "CoreMinimal.h" #include "FICTypes.generated.h" typedef int64 FICFrame; -typedef float FICFrameFloat; +typedef double FICFrameFloat; struct FFICFrameRangeIterator { FICFrame Frame; @@ -114,7 +115,7 @@ struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2> GetChildAttributes() override; virtual TSharedRef CreateDetailsWidget(UFICEditorContext* Context) override; diff --git a/Source/FicsItCam/Public/Editor/Data/FICEditorAttributeGroupDynamic.h b/Source/FicsItCam/Public/Editor/Data/FICEditorAttributeGroupDynamic.h index 985acc9..5b9a353 100644 --- a/Source/FicsItCam/Public/Editor/Data/FICEditorAttributeGroupDynamic.h +++ b/Source/FicsItCam/Public/Editor/Data/FICEditorAttributeGroupDynamic.h @@ -1,5 +1,6 @@ #pragma once +#include "FICEditorAttributeBase.h" #include "FICEditorAttributeGroup.h" #include "Data/Attributes/FICAttributeGroup.h" diff --git a/Source/FicsItCam/Public/Editor/Data/FICEditorCameraActor.h b/Source/FicsItCam/Public/Editor/Data/FICEditorCameraActor.h index 3e892bc..8130309 100644 --- a/Source/FicsItCam/Public/Editor/Data/FICEditorCameraActor.h +++ b/Source/FicsItCam/Public/Editor/Data/FICEditorCameraActor.h @@ -1,7 +1,6 @@ #pragma once #include "Editor/FICEditorContext.h" -#include "BaseGizmos/TransformGizmo.h" #include "Editor/ITF/FICSelectionInteraction.h" #include "FICEditorCameraActor.generated.h" @@ -57,7 +56,7 @@ class AFICEditorCameraActor : public AActor, public IFICSelectionInteractionTarg USceneCaptureComponent2D* CaptureComponent = nullptr; UPROPERTY() UTextureRenderTarget2D* RenderTarget = nullptr; - FSlateImageBrush CameraPreviewBrush = FSlateImageBrush("CameraPreview", FVector2D(1,1), FColor::Green); + FSlateImageBrush CameraPreviewBrush = FSlateImageBrush(TEXT("CameraPreview"), FVector2D(1,1), FLinearColor::Green); UPROPERTY() ULineBatchComponent* LineBatcher = nullptr; diff --git a/Source/FicsItCam/Public/Editor/FICChangeList.h b/Source/FicsItCam/Public/Editor/FICChangeList.h index 4443aca..9399ae9 100644 --- a/Source/FicsItCam/Public/Editor/FICChangeList.h +++ b/Source/FicsItCam/Public/Editor/FICChangeList.h @@ -56,7 +56,7 @@ struct FFICChangeSource { bool IsValid() { return !!SourcePtr; } - bool operator==(const FFICChangeSource& Other) { + bool operator==(const FFICChangeSource& Other) const { return SourcePtr == Other.SourcePtr && SourceKey == Other.SourceKey; } }; diff --git a/Source/FicsItCam/Public/Editor/FICEditorCameraCharacter.h b/Source/FicsItCam/Public/Editor/FICEditorCameraCharacter.h index 80d4b01..257164b 100644 --- a/Source/FicsItCam/Public/Editor/FICEditorCameraCharacter.h +++ b/Source/FicsItCam/Public/Editor/FICEditorCameraCharacter.h @@ -8,9 +8,8 @@ class UFICCamera; class UCineCameraComponent; class AFICEditorCameraActor; class UTransformProxy; -class ATransformGizmoActor; - class UFICEditorContext; + UCLASS() class AFICEditorCameraCharacter : public ACharacter { GENERATED_BODY() @@ -55,29 +54,43 @@ class AFICEditorCameraCharacter : public ACharacter { virtual void PossessedBy(AController* NewController) override; virtual void UnPossessed() override; // End ACharacter - + UFUNCTION() - void MoveForward(float Value); + void Move(const FInputActionValue& ActionValue); UFUNCTION() - void MoveRight(float Value); + void Rotate(const FInputActionValue& ActionValue); UFUNCTION() - void RotatePitch(float Value); + void ChangeFOV(const FInputActionValue& ActionValue); UFUNCTION() - void RotateYaw(float Value); + void ChangeSpeed(const FInputActionValue& ActionValue); UFUNCTION() - void RotateRoll(float Value); - + void ChangeFrame(const FInputActionValue& ActionValue); UFUNCTION() - void FlyUp(float Value); - + void Redo(); + UFUNCTION() + void Undo(); + UFUNCTION() + void NextKeyframe(); + UFUNCTION() + void PrevKeyframe(); + UFUNCTION() + void ToggleAllKeyframes(); + UFUNCTION() + void ToggleAutoKeyframe(); + UFUNCTION() + void ToggleCursor(); + UFUNCTION() + void ToggleLockCamera(); + UFUNCTION() + void ToggleShowPath(); + UFUNCTION() + void Grab(); + UFUNCTION() void RightMousePress(); UFUNCTION() void RightMouseRelease(); - UFUNCTION() - void Zoom(float Value); - UFUNCTION() void OnLeftMouseDown(); UFUNCTION() diff --git a/Source/FicsItCam/Public/Editor/FICEditorContext.h b/Source/FicsItCam/Public/Editor/FICEditorContext.h index 171a3b5..a37a701 100644 --- a/Source/FicsItCam/Public/Editor/FICEditorContext.h +++ b/Source/FicsItCam/Public/Editor/FICEditorContext.h @@ -3,12 +3,12 @@ #include "FICChangeList.h" #include "FICEditorCameraCharacter.h" #include "Data/FICActiveSceneObjectManager.h" -#include "Data/FICEditorAttributeBool.h" -#include "Data/FICEditorAttributeGroupDynamic.h" #include "Data/FICScene.h" -#include "UI/FICEditor.h" #include "FICEditorContext.generated.h" +class FFICEditorAttributeBase; +class FFICEditorAttributeGroupDynamic; + #define FICAttributeCacheFuncs(Name) \ void Set ## Name (float inVal) { \ if (Name == inVal) return; \ @@ -46,6 +46,7 @@ class UFICEditorContext : public UObject, public FTickableGameObject { FFICFrameRange ActiveRange; TSharedPtr AllAttributes; + TMap> EditorAttributes; TMap DataAttributeOnUpdateDelegateHandles; TMap> EditorAttributeMap; @@ -53,7 +54,8 @@ class UFICEditorContext : public UObject, public FTickableGameObject { EFICAnimPlayerState AnimPlayerState = FIC_PLAY_PAUSED; float AnimPlayerDelta = 0.0f; float AnimPlayerFactor = 1.0f; - + + UPROPERTY() UObject* SelectedSceneObject = nullptr; TArray> OverlayWidgets; diff --git a/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h b/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h index 11b7fbe..2bc640d 100644 --- a/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h +++ b/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h @@ -86,8 +86,8 @@ class FICSITCAM_API AFICEditorSubsystem : public AModSubsystem, public IFGSaveIn UPROPERTY(SaveGame) FString LastEditorLayout; - UPROPERTY() - TMap KeyMappings; + //UPROPERTY() + //TMap KeyMappings; AFICEditorSubsystem(); diff --git a/Source/FicsItCam/Public/Editor/ITF/FICToolsContextQueries.h b/Source/FicsItCam/Public/Editor/ITF/FICToolsContextQueries.h index 8bebb01..7b66e9a 100644 --- a/Source/FicsItCam/Public/Editor/ITF/FICToolsContextQueries.h +++ b/Source/FicsItCam/Public/Editor/ITF/FICToolsContextQueries.h @@ -1,10 +1,16 @@ #pragma once +#include "CoreMinimal.h" +#include "HitProxies.h" #include "InteractiveToolsContext.h" #include "GameFramework/Character.h" +#include "Materials/Material.h" +#include "SceneQueries/SceneSnappingManager.h" class FFICToolsContextQueries : public IToolsContextQueriesAPI { public: + // TODO: Check Updates on InteractiveToolsFramework (Snapping, Viewports, World etc.) + FFICToolsContextQueries(UInteractiveToolsContext* InContext, UWorld* InWorld) { ToolsContext = InContext; TargetWorld = InWorld; @@ -41,15 +47,28 @@ class FFICToolsContextQueries : public IToolsContextQueriesAPI { return EToolContextCoordinateSystem::Local; } - virtual bool ExecuteSceneSnapQuery(const FSceneSnapQueryRequest& Request, TArray& Results) const override { - return false; - } - virtual UMaterialInterface* GetStandardMaterial(EStandardToolContextMaterials MaterialType) const override { return UMaterial::GetDefaultMaterial(MD_Surface); } - virtual HHitProxy* GetHitProxy(int32 X, int32 Y) const { return nullptr; } + virtual UWorld* GetCurrentEditingWorld() const override { + return TargetWorld; + } + + virtual FToolContextSnappingConfiguration GetCurrentSnappingSettings() const override { + FToolContextSnappingConfiguration Config; + Config.bEnablePositionGridSnapping = false; + Config.bEnableRotationGridSnapping = false; + return Config; + } + + virtual FViewport* GetHoveredViewport() const override { + return nullptr; + } + + virtual FViewport* GetFocusedViewport() const override { + return nullptr; + } protected: UInteractiveToolsContext* ToolsContext; diff --git a/Source/FicsItCam/Public/Editor/ITF/FICTransformInteraction.h b/Source/FicsItCam/Public/Editor/ITF/FICTransformInteraction.h index bc8ee68..336c2bd 100644 --- a/Source/FicsItCam/Public/Editor/ITF/FICTransformInteraction.h +++ b/Source/FicsItCam/Public/Editor/ITF/FICTransformInteraction.h @@ -4,7 +4,7 @@ #include "FICTransformInteraction.generated.h" class UTransformProxy; -class UTransformGizmo; +class UCombinedTransformGizmo; class URuntimeMeshSceneObject; UCLASS() @@ -22,7 +22,7 @@ class UFICTransformInteraction : public UObject, public FTickableGameObject { UTransformProxy* TransformProxy; UPROPERTY() - UTransformGizmo* TransformGizmo; + UCombinedTransformGizmo* TransformGizmo; public: // Begin FTickableGameObject diff --git a/Source/FicsItCam/Public/FicsItCamModule.h b/Source/FicsItCam/Public/FicsItCamModule.h index 219ae38..aad39a9 100644 --- a/Source/FicsItCam/Public/FicsItCamModule.h +++ b/Source/FicsItCam/Public/FicsItCamModule.h @@ -1,10 +1,14 @@ #pragma once +#include "NativeGameplayTags.h" #include "Modules/ModuleManager.h" #include "Patching/NativeHookManager.h" DECLARE_LOG_CATEGORY_EXTERN(LogFicsItCam, Log, Log); +UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_FIC_Editor_Movement) +UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_FIC_Editor_Rotation) + #define FIC_ModRef "FicsItCam" static FIntPoint FIC_LastViewSize; diff --git a/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessRenderScene.h b/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessRenderScene.h index 8653733..887202a 100644 --- a/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessRenderScene.h +++ b/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessRenderScene.h @@ -1,5 +1,6 @@ #pragma once +#include "CoreMinimal.h" #include "FICRuntimeProcessPlayScene.h" #include "FICSubsystem.h" #include "Util/SequenceExporter.h" @@ -62,7 +63,7 @@ class FFICRendererViewport : public FViewport, public FFICRenderTarget { virtual void InitDynamicRHI() override { FTexture2DRHIRef ShaderResourceTextureRHI; - FRHIResourceCreateInfo CreateInfo; + FRHIResourceCreateInfo CreateInfo(TEXT("FIC Renderer Surface")); RHICreateTargetableShaderResource2D( SizeX, SizeY, PF_R8G8B8A8, 1, TexCreate_Shared | TexCreate_Dynamic | TexCreate_DisableSRVCreation, TexCreate_RenderTargetable, false, CreateInfo, RenderTargetTextureRHI, ShaderResourceTextureRHI ); } From 0f3219d64b056af58444b14d28bbdc8ee0c36161 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sat, 5 Aug 2023 15:29:05 +0200 Subject: [PATCH 2/3] Version Bump --- FicsItCam.uplugin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FicsItCam.uplugin b/FicsItCam.uplugin index 854bc8f..d5fd656 100644 --- a/FicsItCam.uplugin +++ b/FicsItCam.uplugin @@ -2,7 +2,7 @@ "FileVersion": 3, "Version": 0, "VersionName": "0.3", - "SemVersion": "0.3.5", + "SemVersion": "0.3.6", "AcceptsAnyRemoteVersion": true, "FriendlyName": "FicsIt-Cam", "Description": "This mod allows you to create beautiful camera animations in-game.", @@ -26,7 +26,7 @@ "Plugins": [ { "Name": "SML", - "SemVersion": "^3.3.2", + "SemVersion": "^3.5.0", "Enabled": true } ] From e2a757daf1349c698d306621e944ddf1491148bb Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Tue, 8 Aug 2023 19:28:12 +0200 Subject: [PATCH 3/3] Fix Image Export issues --- .../Editor/FICEditorCameraCharacter.cpp | 6 --- .../Private/Editor/FICEditorSubsystem.cpp | 11 ++--- Source/FicsItCam/Private/FICSubsystem.cpp | 10 ++-- .../Private/Runtime/FICCaptureCamera.cpp | 17 ++++--- .../Process/FICRuntimeProcessCameraFeed.cpp | 48 +++++++++++++++++-- .../Process/FICRuntimeProcessRenderScene.cpp | 11 ++--- .../FICRuntimeProcessTimelapseCamera.cpp | 4 +- .../Private/Util/SequenceExporter.cpp | 8 ++-- .../Public/Editor/FICEditorSubsystem.h | 1 + .../Process/FICRuntimeProcessCameraFeed.h | 3 ++ .../FicsItCam/Public/Util/SequenceExporter.h | 6 +-- 11 files changed, 81 insertions(+), 44 deletions(-) diff --git a/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp b/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp index 1dfb6d0..5674a2e 100644 --- a/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp +++ b/Source/FicsItCam/Private/Editor/FICEditorCameraCharacter.cpp @@ -54,8 +54,6 @@ void AFICEditorCameraCharacter::Tick(float DeltaSeconds) { bReposses = true; PController->UnPossess(); PController->Possess(this); - //UFGInputLibrary::UpdateInputMappings(Cast(PController)); - UFGGameUserSettings::GetFGGameUserSettings()->ApplySettings(false); bReposses = false; Camera->SetActive(true); @@ -171,7 +169,6 @@ void AFICEditorCameraCharacter::PossessedBy(AController* NewController) { Super::PossessedBy(NewController); if (bReposses) return; - if (NewController) NewController->DisableInput(Cast(NewController)); } void AFICEditorCameraCharacter::UnPossessed() { @@ -185,9 +182,6 @@ void AFICEditorCameraCharacter::UnPossessed() { CustomTimeDilation = 1; if (OldController) { - // Make sure if not able to recover, game is interactable - OldController->EnableInput(Cast(OldController)); - // Force Close the editor AFICEditorSubsystem* SubSys = AFICEditorSubsystem::GetFICEditorSubsystem(this); if (SubSys->GetEditorPlayerCharacter() == this) SubSys->CloseEditor(); diff --git a/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp b/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp index de4e038..436d465 100644 --- a/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp +++ b/Source/FicsItCam/Private/Editor/FICEditorSubsystem.cpp @@ -3,8 +3,6 @@ #include "ContextObjectStore.h" #include "EnhancedInputSubsystems.h" #include "FGGameUserSettings.h" -#include "FGInputLibrary.h" -#include "TestLibWrapper.h" #include "BaseGizmos/GizmoViewContext.h" #include "Blueprint/WidgetBlueprintLibrary.h" #include "Editor/FICEditorContext.h" @@ -249,14 +247,12 @@ void AFICEditorSubsystem::OpenEditor(AFICScene* InScene) { // Initialize Editor Player Character // TODO: Persist "Viewport Camera Transform" sepperately in persistent editor storage for given scene Controller->Possess(Character); - //UFGInputLibrary::UpdateInputMappings(Controller); - UFGGameUserSettings::GetFGGameUserSettings()->ApplySettings(false); Character->SetEditorContext(Context); - Controller->PlayerInput->ActionMappings.Empty(); Cast(Controller)->GetHUD()->SetHUDVisibility(false); Cast(Controller)->GetHUD()->SetHiddenHUDMode(true); // Get widgets to inject editor UI into and store necessery recovery data + PrevResolution = GSystemResolution; GEngine->GameViewport->GetGameViewportWidget()->SetRenderDirectlyToWindow(false); GEngine->GameViewport->GetGameLayerManager()->SetSceneViewport(nullptr); Cast(GEngine)->CleanupGameViewport(); @@ -265,7 +261,7 @@ void AFICEditorSubsystem::OpenEditor(AFICScene* InScene) { GameViewport = FSlateApplication::Get().GetGameViewport(); GameViewportContainer = StaticCastSharedPtr(GameViewport->GetParentWidget()); GameOverlay = StaticCastSharedPtr(GameViewportContainer->GetParentWidget()); - + check(GameOverlay->RemoveSlot(GameViewportContainer.ToSharedRef()) == true); // Create & Inject Editor Widget @@ -323,8 +319,6 @@ void AFICEditorSubsystem::CloseEditor() { // Swap PlayerCharacter to FG Player Character GetWorld()->GetFirstPlayerController()->Possess(OriginalPlayerCharacter); - //UFGInputLibrary::UpdateInputMappings(GetWorld()->GetFirstPlayerController()); - UFGGameUserSettings::GetFGGameUserSettings()->ApplySettings(false); // Add Game Viewport Back GameOverlay->AddSlot()[ @@ -333,6 +327,7 @@ void AFICEditorSubsystem::CloseEditor() { GEngine->GameViewport->GetGameViewportWidget()->SetRenderDirectlyToWindow(true); GEngine->GameViewport->GetGameLayerManager()->SetSceneViewport(nullptr); Cast(GEngine)->CleanupGameViewport(); + GSystemResolution = PrevResolution; Cast(GEngine)->CreateGameViewport(GEngine->GameViewport); // Enabled Game Inputs/WorldControl diff --git a/Source/FicsItCam/Private/FICSubsystem.cpp b/Source/FicsItCam/Private/FICSubsystem.cpp index 6376182..c715590 100644 --- a/Source/FicsItCam/Private/FICSubsystem.cpp +++ b/Source/FicsItCam/Private/FICSubsystem.cpp @@ -55,10 +55,10 @@ void AFICSubsystem::Tick(float DeltaSeconds) { if (NextRequest->RenderFence.IsFenceComplete() && NextRequest->Readback.IsReady()) { FRenderTarget* Target = NextRequest->RenderTarget->GetRenderTarget(); FIntPoint Size = NextRequest->RenderTarget->GetRenderTarget()->GetSizeXY(); - int64 RawSize = Size.X * Size.Y * sizeof(FColor); + FIntPoint ReadSize; ENQUEUE_RENDER_COMMAND(ReadbackFICCameraFootage)( [&](FRHICommandListImmediate& RHICmdList) { - void* data = NextRequest->Readback.Lock(RawSize); - if (data) NextRequest->Exporter->AddFrame(data, RawSize); + void* data = NextRequest->Readback.Lock(ReadSize.X, &ReadSize.Y); + if (data) NextRequest->Exporter->AddFrame(data, ReadSize, Size); }); FlushRenderingCommands(); RenderRequestQueue.Pop(); @@ -186,14 +186,14 @@ void AFICSubsystem::DestoryRuntimeProcessorCharacter(AFICRuntimeProcessorCharact void AFICSubsystem::ExportRenderTarget(TSharedRef Exporter, TSharedRef RenderTarget) { TSharedRef RenderRequest = MakeShared(RenderTarget, Exporter, FRHIGPUTextureReadback(TEXT("FICSubsystem Texture Readback"))); - + ENQUEUE_RENDER_COMMAND(SceneDrawCompletion)([this, RenderTarget, RenderRequest](FRHICommandListImmediate& RHICmdList){ FTexture2DRHIRef Target = RenderTarget->GetRenderTarget()->GetRenderTargetTexture(); RenderRequest->Readback.EnqueueCopy(RHICmdList, Target); }); RenderRequestQueue.Enqueue(RenderRequest); - RenderRequest->RenderFence.BeginFence(); + RenderRequest->RenderFence.BeginFence(true); } AFICScene* AFICSubsystem::FindSceneByName(const FString& InSceneName) { diff --git a/Source/FicsItCam/Private/Runtime/FICCaptureCamera.cpp b/Source/FicsItCam/Private/Runtime/FICCaptureCamera.cpp index 3ce7e15..223cccb 100644 --- a/Source/FicsItCam/Private/Runtime/FICCaptureCamera.cpp +++ b/Source/FicsItCam/Private/Runtime/FICCaptureCamera.cpp @@ -1,7 +1,11 @@ #include "Runtime/FICCaptureCamera.h" +#include "FGGameViewportClient.h" +#include "FGSettings.h" +#include "Blueprint/GameViewportSubsystem.h" #include "Components/SceneCaptureComponent2D.h" #include "Engine/TextureRenderTarget2D.h" +#include "Settings/FGUserSetting.h" AFICCaptureCamera::AFICCaptureCamera() { SetRootComponent(CreateDefaultSubobject(TEXT("RootComponent"))); @@ -16,13 +20,13 @@ AFICCaptureCamera::AFICCaptureCamera() { CaptureComponent->bCaptureEveryFrame = false; CaptureComponent->bCaptureOnMovement = false; - CaptureComponent->CaptureSource = ESceneCaptureSource::SCS_FinalColorLDR; + CaptureComponent->CaptureSource = ESceneCaptureSource::SCS_SceneColorHDR; + if (GEngine) CaptureComponent->ShowFlags = *GEngine->GameViewport->GetEngineShowFlags(); + // Kinda performance intense -// CaptureComponent->DetailMode = DM_MAX; -// CaptureComponent->LODDistanceFactor = 0.01; -// CaptureComponent->PrimitiveRenderMode = ESceneCapturePrimitiveRenderMode::PRM_RenderScenePrimitives; - CaptureComponent->bUseRayTracingIfEnabled = true; - CaptureComponent->ShowFlags.SetTemporalAA(true); + CaptureComponent->DetailMode = DM_MAX; + CaptureComponent->LODDistanceFactor = 0.01; + CaptureComponent->PrimitiveRenderMode = ESceneCapturePrimitiveRenderMode::PRM_RenderScenePrimitives; } void AFICCaptureCamera::SetCamera(bool bEnabled, bool bCinematic) { @@ -52,6 +56,7 @@ void AFICCaptureCamera::UpdateCaptureWithCameraData(UCameraComponent* InCamera) InCamera->GetCameraView(0, ViewInfo); CaptureComponent->SetCameraView(ViewInfo); //FWeightedBlendables Blendables = CaptureComponent->PostProcessSettings.WeightedBlendables; + //InCamera = Cast(GetWorld()->GetFirstPlayerController()->GetCharacter()->GetComponentByClass(UCameraComponent::StaticClass())); CaptureComponent->PostProcessSettings = InCamera->PostProcessSettings; //CaptureComponent->PostProcessSettings.WeightedBlendables = Blendables; CaptureComponent->PostProcessBlendWeight = InCamera->PostProcessBlendWeight; diff --git a/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessCameraFeed.cpp b/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessCameraFeed.cpp index e300c8d..a58329f 100644 --- a/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessCameraFeed.cpp +++ b/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessCameraFeed.cpp @@ -6,8 +6,43 @@ #include "Components/SceneCaptureComponent2D.h" #include "Engine/TextureRenderTarget2D.h" #include "Runtime/FICCaptureCamera.h" +#include "Slate/SceneViewport.h" +#include "Slate/SlateTextures.h" #include "Widgets/Images/SImage.h" +class FFICFeedView : public ISlateViewport +{ +public: + FFICFeedView(FTexture2DRHIRef RenderTargetTexture, FIntPoint InSize) + : RenderTarget( new FSlateRenderTargetRHI(RenderTargetTexture, InSize.X, InSize.Y)) + , Size(InSize) { + BeginInitResource(RenderTarget); + } + + ~FFICFeedView() { + ReleaseResourceAndFlush(RenderTarget); + delete RenderTarget; + } + + // Begin ISlateViewport + virtual FIntPoint GetSize() const override { + return Size; + } + + virtual FSlateShaderResource* GetViewportRenderTargetTexture() const override { + return RenderTarget; + } + + virtual bool RequiresVsync() const override { + return false; + } + // End ISlateViewport + +private: + FSlateRenderTargetRHI* RenderTarget; + FIntPoint Size; +}; + void UFICRuntimeProcessCameraFeed::SaveWindowSettings() { WindowLocation = Window->GetPositionInScreen(); WindowSize = Window->GetSizeInScreen(); @@ -24,11 +59,18 @@ void UFICRuntimeProcessCameraFeed::Start(AFICRuntimeProcessorCharacter* InCharac Camera = GetWorld()->SpawnActor(); CameraArgument.InitalizeCaptureCamera(Camera); - Brush = FSlateImageBrush(Camera->RenderTarget, FVector2D(Camera->RenderTarget->SizeX, Camera->RenderTarget->SizeY)); + FlushRenderingCommands(); + + FIntPoint Size = FIntPoint(Camera->RenderTarget->SizeX, Camera->RenderTarget->SizeY); FVector2D Resolution = CameraArgument.GetResolution(this); + View = MakeShared(Camera->RenderTarget->GameThread_GetRenderTargetResource()->GetRenderTargetTexture(), Size); + Window = SNew(SWindow)[ - SNew(SImage) - .Image(&Brush) + SNew(SViewport) + .ViewportInterface(View.ToSharedRef()) + .ForceVolatile(true) + .IsEnabled(true) + .RenderOpacity(1.0) ] .Title(FText::FromString(CameraArgument.GetName())) .ClientSize(Resolution) diff --git a/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessRenderScene.cpp b/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessRenderScene.cpp index 11dca5d..1db5d45 100644 --- a/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessRenderScene.cpp +++ b/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessRenderScene.cpp @@ -25,7 +25,7 @@ void UFICRuntimeProcessRenderScene::Start(AFICRuntimeProcessorCharacter* InChara Settings->MaxUndilatedFrameTime = Settings->MinUndilatedFrameTime; } FrameProgress = Scene->AnimationRange.Begin; - //FAudioDeviceManager::Get()->GetActiveAudioDevice().GetAudioDevice()->) + //FAudioDeviceManager::Get()->GetActiveAudioDevice().GetAudioDevice()->) // TODO: Audio Capture? FAudioThread::StopAudioThread(); FViewportClient* ViewportClient = GetWorld()->GetGameViewport(); @@ -43,6 +43,7 @@ void UFICRuntimeProcessRenderScene::Start(AFICRuntimeProcessorCharacter* InChara Path = FPaths::Combine(FSP, FDateTime::Now().ToString() + TEXT(".mp4")); Exporter = MakeShared(FIntPoint(Scene->ResolutionWidth, Scene->ResolutionHeight), Scene->FPS, Path); + //Exporter = MakeShared(Path, FIntPoint(Scene->ResolutionWidth, Scene->ResolutionHeight)); Exporter->Init(); } @@ -54,17 +55,11 @@ void UFICRuntimeProcessRenderScene::Tick(AFICRuntimeProcessorCharacter* InCharac // Capture Image FlushRenderingCommands(); - - //DummyViewport->EnqueueBeginRenderFrame(false); + UGameViewportClient* ViewportClient = GetWorld()->GetGameViewport(); FCanvas Canvas(DummyViewport.Get(), NULL, ViewportClient->GetWorld(), ViewportClient->GetWorld()->FeatureLevel); ViewportClient->Draw(DummyViewport.Get(), &Canvas); Canvas.Flush_GameThread(); - //FIntPoint RestoreSize(ViewportClient->Viewport->GetSizeXY().X, ViewportClient->Viewport->GetSizeXY().Y); - //ENQUEUE_RENDER_COMMAND(EndDrawingCommand)([RestoreSize, this](FRHICommandListImmediate& RHICmdList) { - //DummyViewport->EndRenderFrame(RHICmdList, false, false); - //GetRendererModule().SceneRenderTargetsSetBufferSize(RestoreSize.X, RestoreSize.Y); - //}); // Store Image AFICSubsystem::GetFICSubsystem(this)->ExportRenderTarget(Exporter.ToSharedRef(), DummyViewport.ToSharedRef()); diff --git a/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessTimelapseCamera.cpp b/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessTimelapseCamera.cpp index 54bd544..9780633 100644 --- a/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessTimelapseCamera.cpp +++ b/Source/FicsItCam/Private/Runtime/Process/FICRuntimeProcessTimelapseCamera.cpp @@ -28,12 +28,14 @@ void UFICRuntimeProcessTimelapseCamera::Tick(AFICRuntimeProcessorCharacter* InCh Time -= SecondsPerFrame; AFGPlayerController* Controller = Cast(GetWorld()->GetFirstPlayerController()); + //AFGCharacterPlayer* Character = Cast(Controller->GetCharacter()); //if (Character) Character->SetThirdPersonMode(); + // TODO: Fix character and creature animation in capture CameraArgument.UpdateCameraSettings(CaptureCamera); CaptureCamera->UpdateCaptureWithCameraData(); - CaptureCamera->CaptureComponent->CaptureSceneDeferred(); + CaptureCamera->CaptureComponent->CaptureScene(); AFICSubsystem::GetFICSubsystem(this)->ExportRenderTarget(Exporter.ToSharedRef(), MakeShared(CaptureCamera->RenderTarget->GameThread_GetRenderTargetResource())); diff --git a/Source/FicsItCam/Private/Util/SequenceExporter.cpp b/Source/FicsItCam/Private/Util/SequenceExporter.cpp index cf3976e..f0549c5 100644 --- a/Source/FicsItCam/Private/Util/SequenceExporter.cpp +++ b/Source/FicsItCam/Private/Util/SequenceExporter.cpp @@ -137,7 +137,7 @@ void FSequenceMP4Exporter::Finish() { } } -void FSequenceMP4Exporter::AddFrame(void* ptr, size_t len) { +void FSequenceMP4Exporter::AddFrame(void* ptr, FIntPoint ReadSize, FIntPoint Size) { if (bFinished) return; int64 FramePts = FrameNr++; @@ -149,7 +149,7 @@ void FSequenceMP4Exporter::AddFrame(void* ptr, size_t len) { } const uint8* data[] = {(uint8*)ptr, NULL}; - int stride[] = {ImageSize.X*4, 0}; + int stride[] = {ReadSize.X*4, 0}; ret = sws_scale(SwsContext, data, stride, 0, CodecContext->height, Frame->data, Frame->linesize); if (ret < 0) { @@ -194,12 +194,12 @@ bool FSequenceImageExporter::Init() { return true; } -void FSequenceImageExporter::AddFrame(void* ptr, size_t len) { +void FSequenceImageExporter::AddFrame(void* ptr, FIntPoint ReadSize, FIntPoint Size) { FString FilePath = FPaths::Combine(Path, FString::Printf(TEXT("%s-%05llu.jpg"), *StartTime.ToString(), Increment++)); IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG); - ImageWrapper->SetRaw(ptr, len, ImageSize.X, ImageSize.Y, ERGBFormat::RGBA, 8); + ImageWrapper->SetRaw(ptr, ReadSize.X*ReadSize.Y*4, Size.X, Size.Y, ERGBFormat::RGBA, 8, ReadSize.X*4); TArray64 CompressedData = ImageWrapper->GetCompressed(100); FFileHelper::SaveArrayToFile(CompressedData, *FilePath); diff --git a/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h b/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h index 2bc640d..c6b47fc 100644 --- a/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h +++ b/Source/FicsItCam/Public/Editor/FICEditorSubsystem.h @@ -43,6 +43,7 @@ class FICSITCAM_API AFICEditorSubsystem : public AModSubsystem, public IFGSaveIn TSharedPtr GameViewport; TSharedPtr GameViewportContainer; TSharedPtr GameOverlay; + FSystemResolution PrevResolution; // Interactive Tools UPROPERTY() diff --git a/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessCameraFeed.h b/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessCameraFeed.h index bea8af6..cf2d178 100644 --- a/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessCameraFeed.h +++ b/Source/FicsItCam/Public/Runtime/Process/FICRuntimeProcessCameraFeed.h @@ -7,6 +7,8 @@ #include "FICRuntimeProcessCameraFeed.generated.h" +class FFICFeedView; + UCLASS() class UFICRuntimeProcessCameraFeed : public UFICRuntimeProcess, public IFGSaveInterface { GENERATED_BODY() @@ -19,6 +21,7 @@ class UFICRuntimeProcessCameraFeed : public UFICRuntimeProcess, public IFGSaveIn FSlateImageBrush Brush = FSlateImageBrush("CameraFeed", FVector2D(1,1)); TSharedPtr Window; + TSharedPtr View; UPROPERTY(SaveGame) FVector2D WindowLocation; diff --git a/Source/FicsItCam/Public/Util/SequenceExporter.h b/Source/FicsItCam/Public/Util/SequenceExporter.h index a0f5c39..b3f4d69 100644 --- a/Source/FicsItCam/Public/Util/SequenceExporter.h +++ b/Source/FicsItCam/Public/Util/SequenceExporter.h @@ -13,7 +13,7 @@ class FSequenceExporter { virtual ~FSequenceExporter() = default; virtual bool Init() = 0; - virtual void AddFrame(void* ptr, size_t len) = 0; + virtual void AddFrame(void* ptr, FIntPoint ReadSize, FIntPoint Size) = 0; virtual void Finish() = 0; }; @@ -38,7 +38,7 @@ class FSequenceMP4Exporter : public FSequenceExporter { ~FSequenceMP4Exporter(); virtual bool Init() override; - virtual void AddFrame(void* ptr, size_t len) override; + virtual void AddFrame(void* ptr, FIntPoint ReadSize, FIntPoint Size) override; virtual void Finish() override; void ReadBuffer(); @@ -55,6 +55,6 @@ class FSequenceImageExporter : public FSequenceExporter { FSequenceImageExporter(FString InPath, FIntPoint InImageSize); virtual bool Init() override; - virtual void AddFrame(void* ptr, size_t len) override; + virtual void AddFrame(void* ptr, FIntPoint ReadSize, FIntPoint Size) override; virtual void Finish() override; }; \ No newline at end of file