From 93c50866f886766967ba81c3b69189df301d13eb Mon Sep 17 00:00:00 2001 From: jracek Date: Mon, 7 Apr 2025 17:47:48 +0200 Subject: [PATCH] Better navmesh, Added icons, Added PSXPlayer component --- Editor/PSXNavMeshEditor.cs | 31 ++++++++ Editor/PSXNavMeshEditor.cs.meta | 2 + Icons/PSXNavmesh.png | Bin 0 -> 6837 bytes Icons/PSXNavmesh.png.meta | 130 ++++++++++++++++++++++++++++++++ Icons/PSXPlayer.png | Bin 0 -> 9161 bytes Icons/PSXPlayer.png.meta | 130 ++++++++++++++++++++++++++++++++ Runtime/PSXNavMesh.cs | 39 +++++++++- Runtime/PSXNavMesh.cs.meta | 11 ++- Runtime/PSXPlayer.cs | 30 ++++++++ Runtime/PSXPlayer.cs.meta | 11 +++ Runtime/PSXSceneExporter.cs | 70 ++++++++++++----- Runtime/Utils.cs | 4 +- 12 files changed, 434 insertions(+), 24 deletions(-) create mode 100644 Editor/PSXNavMeshEditor.cs create mode 100644 Editor/PSXNavMeshEditor.cs.meta create mode 100644 Icons/PSXNavmesh.png create mode 100644 Icons/PSXNavmesh.png.meta create mode 100644 Icons/PSXPlayer.png create mode 100644 Icons/PSXPlayer.png.meta create mode 100644 Runtime/PSXPlayer.cs create mode 100644 Runtime/PSXPlayer.cs.meta diff --git a/Editor/PSXNavMeshEditor.cs b/Editor/PSXNavMeshEditor.cs new file mode 100644 index 0000000..6caebda --- /dev/null +++ b/Editor/PSXNavMeshEditor.cs @@ -0,0 +1,31 @@ +using UnityEngine; +using UnityEditor; +using SplashEdit.RuntimeCode; +using System.Linq; + +namespace SplashEdit.EditorCode +{ + [CustomEditor(typeof(PSXNavMesh))] + public class PSXNavMeshEditor : Editor + { + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + + PSXNavMesh comp = (PSXNavMesh)target; + if (GUILayout.Button("Create preview")) + { + PSXSceneExporter exporter = FindObjectsByType(FindObjectsSortMode.None).FirstOrDefault(); + if(exporter != null) + { + comp.CreateNavmesh(exporter.GTEScaling); + } + else + { + Debug.LogError("No PSXSceneExporter found in the scene. We can't pull the GTE scaling from the exporter."); + } + } + + } + } +} \ No newline at end of file diff --git a/Editor/PSXNavMeshEditor.cs.meta b/Editor/PSXNavMeshEditor.cs.meta new file mode 100644 index 0000000..5a8298d --- /dev/null +++ b/Editor/PSXNavMeshEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9d3bd83aac4c3ce9ab1698a6a2bc735d \ No newline at end of file diff --git a/Icons/PSXNavmesh.png b/Icons/PSXNavmesh.png new file mode 100644 index 0000000000000000000000000000000000000000..0b07dfb9e1cb5920546191868c61f40680c013dd GIT binary patch literal 6837 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 literal 0 HcmV?d00001 diff --git a/Icons/PSXNavmesh.png.meta b/Icons/PSXNavmesh.png.meta new file mode 100644 index 0000000..5a379be --- /dev/null +++ b/Icons/PSXNavmesh.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: d695ef52da250cdcea6c30ab1122c56e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Icons/PSXPlayer.png b/Icons/PSXPlayer.png new file mode 100644 index 0000000000000000000000000000000000000000..ef0d609c36ee5af57c87e1369324e889d9483a27 GIT binary patch literal 9161 zcmaiaWmHsO)Hf&~9nwhXATe}z2}2DG4MQW+-Q6NxBHbbmE!{PQw1f=ODGgH6A-wnh ze0bM-K0RyAy?3oy`<%Pa?)}?0Mng@J0G9?A4GoPzSqY*AJRAPIu(5!<Jdx5+t@pg}`> ziKYyBqvM-XGeUTo2L~|=UDt?`bhGafl<6^ zL!M?iE5JseU}yLYGMgO`JQe7UIYcVopR(Jn=;&wqc%DxhLm5gj z$apZnhmyQ4(Auvt@uHvsUl=6b2tOFYP%BS5Ou@Q47yhKd$koHMn?UF07bdemz39+T z0=%#kRc1L*vJy+muq7zjHK*9lKKt@TAI}46iwfB5Yqzu_scS^l0URAp6 z2;_(le?#1Ii;Efus%A^lDl>b5)PTnm?l_$o^VIl7MavRtML+T2Tl5Ny zsXvw0f+D_&Afu=4vM+hpNW)}gz8SajO)f07y$qw26`--QwPi)k&I;R54Uhn`A)3GC zPZxO0$i&zXEpX8G07FdcCL|;rMMh$cZH*i=z1NCWdfhuYsUeZ4mXuw5V~Uur_K+-y zz7~YtIjmV+TwHA5UL3H$?^!c2%V00I;}a240&Gk`AWM5xt_N?b1N%H;$kZ67=W^-*ZZPS&@!V`tw+zcW71@=wyH-yGTg>o zpA|oH)9U7rR{80*wY=U(OQI#Iw}s|Z3=R7WpNYv3lOXrn=%v}ECF7sd)0?y@NsJV6 zKT#-tfGXFVszCH+Rem!NhNAzoyNg|EhBTc>%*~bK%d#9yq>GuKpJ(CE`tf3WXPZv_ zCk`hF9zDdpxVYH4?mA~ckqZIHR=a|5`gpo5s0I|1=qZy|e+e8OaT+yUFDx$7-SJaJ z_9W7YZv#%D&YaS!3Kq2Uf!P$5exOJ`gKYl%RRM=jPfyR8jK2r${?Br|upQNa4ME@a z3zAkPR72E+2`N{f>kX9ovFR#45zTQ^sQxU-YMv`=Xv_jFUApQoU_pFCl>~G2n zy9IcVlv#j^ii+k4J`XSN8^Dd;rBchxdW}mz-s8eh&Sc5Wb0!meuJ_zKi%m{N`XP}UcJ}sPT3hG89o)_yR&D8s7}~;6Qd<}P2mAZ`vGopESkIo> z+1h>vobyPF!{TgvjGm-b0a8`do}S`XISJDGmU>%%dFky?EjQ98 zF#_BQpA4s`r++!j+u7dE%+D__D(XAZ`uo1v&ePjluf@0uS>K+%;r4a1TaYVbRC@?} z>s^bp$k^STwlR;DhF^9GJ_|Fme(gIPe)Np@MEHz^^%821|U2BrB;Dk`#{fG-AR+<9oL!$F5YQvTs4SL_t<5?g^@;LbDf^WUFlcCK z?o(1yT+q6#eK-?I7kJ_m0Rw6uWu@{u74V8GZoQrqC}uv7?D%7cU*jOpWD)lJx}6X! zoE0%%+fL}33Fx2bTIE#XyX>T@{GjEh#NpR23*tR3t7G{J(i4L4pGF6Lm+Vz24FiK1 zb1DMRZ*3^kVP(Ij>{B|f40b8xyUDr|uKew~6+5njJnOF`eJ*->^+n&ZTlylI=#!qA z%%URAJ>Q;*EEpiEv4Kp}!BL_6M?hY?!)rpM!0&TL^ASB`s_P6$kv@rqV0zIc3iYAN zbIKhxSS)hjETYDV}|)JjZ3582s8VY{Y? z)O58HmEU1g5hp0l3yHeh?}DG36TkaTpcq@mma14F;FVg3_)J9`xb{QIIl#ynou>NA z3vs+e8h2I%ABZnkb-};B>@B`-fEhD?Hy#ZA$iS@qtA_*h^vFiRHg=TMcgAM`A zI9qOs{(*tCYdsx;HQ2N)4O-=J2%);V`l1PRc#W4VgW<=-v4_1qZXXX{w}+qI+hh?n zTc937N=ivN-(f0%-F_C@bx`|`scSG4r6 zm8uX!?d8;W0T>n*7Cw+uZ1!R@LK!3Upak~W-m61HN_H?#wgcHbU0+{!=XN3q zOMUaNQc&11GBQ#Lp_S6D&LLVTFQR9Q*2m*aPe&)Hayec|z*|{7k8lwMY+$Z4z-Njl z-YCzV*OyEY?_25ukUH(n%*^}-`at#@DwO^}4x~m2_^=^pe~E|pMda`B$3Wiw9ZF^# z_nj#nGT4_x1047K@{$H99fBy*EWv6ji=Frg9aTsbH7)HD2{uMYT3T9Wu`+W?PnDfy zMK;WaFZT#bizB_D0LHYfwz$1FDL{}k7+!4mXQ`F{6^H>2ozJfnCr_mOPy6qq1M5mk zc7%|t$BF&#qNANiP`1VN?DPdW+1bC#O4`(KT$E9G0^F?$DOpl{Bibo(qa<0y%3^s6 zD1lThMOBpNcat7%O)}ZIp<{>aOSn{ldha@q!%StZAh(GJE9QpE@tcbB^0|)7>456W zn5;>wfBmkyP6Rn{A+B35C>Tg-$x2_H93B5?W{i3v&8dXJh)7OucN`!=k^B^ZwZmpF za^T+#x9}oly)$&qe{8ihR7VqIV_;)E@z>T)k>cTTwR-)0o(Tj8Bl4SCe&o8H%NG{g zHMcGw5jie2lyTI{zvlEEG~uGG(EH}z+|(2)zZnAg>al0jh&2dQ#K*+RIkVr4;OnO% z{sDVm-i3<_jIH=+ThL!Zli9oSiVEpw^S;P7pn&C$yVe!``$c2+;%a(!mhv#& z84ocj>1p_O(k6&O4~Vm)TT@ee=T@61o3YWh-9Skf0w%`R0S>4~Z^9T@>#?0kY6y|& zzUf&TEr{f*7a)Y&rb|}%@)c?f2@45%GsO`b)*VE3YR+D8!*z6~8yg#SZ~mzq4AQa) zOuh!$i&lTkU7BGRmf1Zk#8+q zi0nkQl)qsCWb-+Y$pn$B$hO8t!OUut_j#*(lsHZ?S0 zoCP`QP%J3m{*oK?yw;U7U$rM`?cQ?#C!I8S7CSRD^A-k!y;%_kv#ue6to447J z%^`^gNzz;H@DlPieYoF{%Qgw7-N`)gxD?$5yDf*4d>m*Z_B!Q z$u{9)W+sPLO`$olt;SqNR*`j+C5pxx{M>GbSd(YOpTznCT(C1aq#XJ8NrLNo$EpvE z6PNvj3Q{Aa2(@Rk_H0?|%sD*-&EG5H%hvh_Dy)-+Jo`s;93qdIV+|7;&u(B+HB4b{ zEF%>Z#E1-{kwi}@c`r7BsIvYQ3(uh>hr^!kql{PZ{bXj(og|+UBJmOp&dhN3*SD-Kn3mirkUqZewL|i(k$f&sXy+cYpXnOXcwy>Y*EL z#n|xt)yx#cvd@rNxRQxRaVeW1EduTvy>H%?V^o|MdsL+c@r@5$n@zo@L z+Sok3h|Ozuq&V6`Mm`#R@X;)gHj6HFcl}SuX)RL&Tm-7VyTN3NO!u@(mSQ2+55si{ zoixO*L<4V@ybndvZ&gP{9?r`RD_gpAtNw}Dl|gqfpk-q8>?jM1;XH_`Jbr1C_1Jk+ zsrb2#z<#FCUf4Q{M6DMdXCF*1fW(bS_#BxpGhpVrq~GBiLGh~TOY+cwqk3*RTm1Kx zApw|TWvhzqu2{LXBj_Xf1#9EwM0&V)2% zXDa|E)PRXKw3Z_wV{4hXZ_Ams$9(V?5rgwulyDfEjrz?LuLhfV*&)ssw*AlEL6;!6 zT3fE^{fg7?8?N6UetFSxdZtPD-Br|bHu602wI+1Epm@kI1pUMoI6MH0@7owF;#8 zR4??m!w;XV<%bb=iF>1~`w5ZY2y>Qmu3o=hUta!j<++~kHL$Q>29@48xQ~B&yTtQL zjvs^3^!=%x=a%F}+;0n>S{C-d?@HzcBm+p9;R1QtWAMJOom%2ryF?}>OCe_u;kI$U z4JZ3EPmP!T(Lz@f8&C3j;D2il$m1i7*2r*p)IHNDyTYdr7gYLpuSXx2m8nd*lYd=6 z^ujYy7z!n&qE8BKNsoNl*iWzNqm#C0WX8nwJz&mqi5sQ1`eqcjmJerf3ytvmM89k< zTXSQ5>7j@V>8HU1E4Fm2^erFn;+^8JU*LEhmR$DJvqdS?Z480r>|_^8QWCG;o-ZY_ z%t|Y`y;)|~*=W`19Qm{WX*OfIV;4!>-KcvI+_5XD`c1jHB^rem5~(!o9nfZ6c9{rl`0gD!Wq>BhuqfjJ$>}d-CnK(i7{^5**SZNscm> zIy6Nb&f-AAo=@b~ZMXmK?@#^d=gD8^{|HjB3s$tz!6Z-fA3qBqy;LQ@0a3wcxB_JxUn39Q9etH4YpY?WWijk zLj4X+uv)m$FcI_2N$RQ*an^-S_S=a!|M9yVKsD@kwPe{6IZWUX<7lW@clq7!$8aJR zGdicF+Qr)sYo!XVRpgXuDwU=^>yNK~-5oIH57N*wHgHWFdL?*2M6xDzx?bK)-@c6< zZH9T=G-2l~SPU*L51FnkG*N~=Q=B>JWUSugz0w0U#;xXTstPbsPtU*O zIx}>HHmOd35?j1e#A&5yHs-L5f+Q!*D>+t{z1q1%7Qx6Uy~3y(demt_RM=Wo0o zW7a6~ljBpiyvCvOe}eDu4oz>Js<1+Jii!4`PpPv6V?OyX33b5&19W{;T&u#|Xrtbk45* zt<&_e?1ZB_w4HhC1<_*Gp}T^E~04r(ly5a z!HIIT-OMNKA@0Qrt8?|Dfq_wlXc|rAY@g1KJ?LPTufB}{LFsCq;CJ3iR`{>;jGr?o zde1Q?X%J{}m##3hiH@hYk3xcr?k;xJ-EY{7^;fs!1LeDTOt`*OEJQo*zN~X5C?<&O zR2lf(cFZHVd{?$76`juI$TP}D%W|&CY`t`UU8oRzufYgw^l&_mcN^blHJbfySEfSY zZhvi+33i}ia4ub6%i%KjKeShECUA++(zzhgYPVq!lzjFxrPa(#1alBKNP;oN^vG{& zR8rl#B<+b*c;Yq&-5AbHrBY3uTcR#Z`F+^EM43d!%-r(9&T!`&zX^2x>Y{f(xu z4CR=t^Xr#cHW;W8K$x+=x?IaoAa6Jf)FzWHP~|AAKX}X3PM9x((m0%`spC}+*r0VH zP}URrQ47j_Cx1vQHPJh;f#Rj?Bc=C`3ZkXGM0vHmuX;e+`*GS?C#bEvb4&EI`3B{w z{_F4I!&&RBNJd{mg{Do8$`AAj&(wt~`d)6&^_*z^;NTLCRM~>Wtd_Xt&a^*AK{u&} zRuOM_J{F37>^TlncJBM|Jy%VjkY99zIg9N+`^AA=$`VCe(qc=}gZ@XCi_T90JL84T z!JGrn2T)azPa0R~K=v!6+I?C|FmfRt61DsgL_N)Ev3qHwuV$%DIy~4L#uU9A$)@F7; zH1yvX?9$G`%j&DO6t$ga`pGEe`HX3Ku@PsFrz^t0H@fl~C2COJ(*MZR3@O=?l`<6* zX$uPr-_$#-pVdvObdwcUXziAtpM>jqsUG1mVl`5XECb7CCn9`LvS_dd((8&%f=QB( zfUb2%K|!I)$=SK85@>5%=Bx@ie`B;RzSUjY>;Q+u)vax_#S@lne5(~pBqZ9{hpG#R zPJ4TLu?o{=*iwc&v>`%-1O!3O05~Q%HZ~R}8*4%#MwDp@Uz6UQZK;@tIrMIRiSA({ z3E$q_+vzKEqg3zE9}5z<_bVY~HfPI^f0^El|if zH5Ju$6tG{%vB@r^P!Ye+^+?7ohL+pM_q*IVs_`pd|KnATT8So#|}mO z`}gmW2j~^YJLb}7*T1iBvVP3ZVgF}WilfbqlZE~~1~S4EU&SAkq_y9?=XpD&!{!AG z33=q_?z;Yc{v*E8&uj3XP?}a`u^o{*3`V|(?e51XC}@TD*!b~S7b=;rRx+XT`nk*Q z;bBnl@k%G^XQ^OPqbPu7^zj@~(b2(5-*vJXT0=l2sao3IB2X>~elPLL7YrjX8x!&B{`;sWY z-~SSrRVZ$pF46D1ew~DZQ37LE^iqK$jnl|Ez8ge!HMbSj0DpH>b5&sIDLM8o@q|yGScWH z)$a!kR+3av#)9JF0S>R9?*Tw-j~unzt%xpUg%Q*&EGXETot^E;Nwj{&7sp7S+ouI#S7k3>I_f~mXp2`;6 z`6EBYiP z1TFOX3s}EOiorxX9AvX`N?pR-NDryWV-a93gGdE~?n2GN1Ow_)u|qNjJ=oVs)zYYA z1BVJz7toEd@aIfM`CeigSEt_AEl1?Wd?93^lZWU%y?W}9M1S`W-j}YcBJC6K)VRfb zZ)ccA{ZB+NUcE~)Yv4a;rA{)%SacU{=(3Fo`%U5N4}hc<)=b~N2wlZnz2@n#PwDg` ze_??-S>f*K%8)t(S#AKq68@_fOkIc$d5v-Zq=l?|<30BhHayS9#iU>M7`x*tjz_@n z&m^{Mn%2JGUAZBxykw+Q)=ga6EV^{~AI0r&&3z_G3r29>nmgi-von^VB|Kw8RX(|x z3qV^Wbk{6vo%7Y}>MK~nrdBQ{YFlN_EjI@|IU?S+L?`};>5oCWTMEj!1TW{K2#{!j zzjteMsv@O>9ZZ{sxeV!p>7|0jUz;t=9Vo9EBBnn8#A?I1L1ZL1WGAgfW{)fVCs)Fu zrdr|OmacC|Pmsq$M;JmA++jYfh*8jWjn-<#!qWJZ8A=Zpjx;M*OuND03|@Jm zjMGd&tQl6E0<@zcO9aMG=I;lcgnQHE^B+Yd(#Nc5GkRa3SLs0|ZOn9UZ07L@UV?(x zxYlTfRy=QVeEJr-fdd)O3uhi?DVoKuUnO^@En66AVt(N`mjL|+21HcD`%s%DonDFdUSj7s6d&9hV~Tt-?sp+2R|)@P4WnY z$e%uT;z?a5v260?KdA!G7%OlA=m;juj&v20_Tkp#v#7}Qc>!{4n~!gxR*neWWq20% zn;L@S+>SVz=&9M3?SqAQ;2yKhwsi0{&;2Sx!N<{S-jn=y6IPo5>cjsMbd1rJ6n@4~ zGGrA7?bql>@xr0ssT*agAd5!FZk6YNn4xRbt}za}9Mohw6jtPt781E*ZoH6unO~3doC}>}XT?C;!-y zKEgCb*U&|84j~IJ;YS`O!ulA3sM`nuO3V&rux@biKammHo$kPg4P+?%jnLz1f6m&) z&UQ&>*r_Ae#^i3ToZ?VbhUQdjyfG_Y9^=_fQUMxV4xnp(#H(umzTlni!No`kfLQ1x zryqmVPKoNw`bt&^j{`adcS0Usc0984(20BR%CA8YI(}{=C=Ck#7=W!V?7;h7UiQBX z$Q4WmN#2awa7Ql2RR?KG!T&0Y&HF)d?kMC4@1xsQ%1POA-p5hjOn{*69IBF2H%S2k zHKUoC1A0GXUuSs0HoonhIIVsp2)QdFb*GkQ5f{v8Xj+*1%F)mtJ=7j5o;eX>+`xOM zKP&t9KV983o~&l}2Sq0b2Q(KX9%DBlqEeL!BL-w&#c#;~ucr)in78aE;Ul}Ug=MnhGPKk+BEGSY5s z9~hJ0Ck5is`>oHZ;IAZMKX~tQi1tJc zFeZ3hswp+zg<&FA~`%QQ03$ksd}w!W8y39};}2J>-MqUt6wWg+&%Rb@Us%8vq2 zzzH4KE7&AQMuRD_5!0_v4D0%mifEs30k|^V7JXYc@WKboIe^aXnu8l$k3Ay0*nMBD vkOnQYYj*$(j>u+!!6O#`D?Rl;KI8kEBbE46@E`CQ4w|yO8l+10?fd@+=w#^T literal 0 HcmV?d00001 diff --git a/Icons/PSXPlayer.png.meta b/Icons/PSXPlayer.png.meta new file mode 100644 index 0000000..d3d9874 --- /dev/null +++ b/Icons/PSXPlayer.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 4d7bd095e76e6f3df976224b15405059 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/PSXNavMesh.cs b/Runtime/PSXNavMesh.cs index a8c9e5f..332263a 100644 --- a/Runtime/PSXNavMesh.cs +++ b/Runtime/PSXNavMesh.cs @@ -3,7 +3,6 @@ using Unity.AI.Navigation; using UnityEngine.AI; using System.Collections.Generic; - namespace SplashEdit.RuntimeCode { public struct PSXNavMeshTri @@ -20,23 +19,35 @@ namespace SplashEdit.RuntimeCode public class PSXNavMesh : MonoBehaviour { + Mesh mesh; + [HideInInspector] public List Navmesh { get; set; } public void CreateNavmesh(float GTEScaling) { + mesh = new Mesh(); Navmesh = new List(); NavMeshSurface navMeshSurface = GetComponent(); + navMeshSurface.overrideTileSize = true; + navMeshSurface.tileSize = 16; + navMeshSurface.overrideVoxelSize = true; + navMeshSurface.voxelSize = 0.1f; navMeshSurface.BuildNavMesh(); NavMeshTriangulation triangulation = NavMesh.CalculateTriangulation(); + navMeshSurface.overrideTileSize = false; + navMeshSurface.overrideVoxelSize = false; int[] triangles = triangulation.indices; Vector3[] vertices = triangulation.vertices; + mesh.vertices = vertices; + mesh.triangles = triangles; + + mesh.RecalculateNormals(); + for (int i = 0; i < triangles.Length; i += 3) { - - int vid0 = triangles[i]; int vid1 = triangles[i + 1]; int vid2 = triangles[i + 2]; @@ -58,5 +69,27 @@ namespace SplashEdit.RuntimeCode Navmesh.Add(tri); } } + + + public void OnDrawGizmos() + { + if (mesh == null) return; + Gizmos.DrawMesh(mesh); + Gizmos.color = Color.green; + + var vertices = mesh.vertices; + var triangles = mesh.triangles; + + for (int i = 0; i < triangles.Length; i += 3) + { + Vector3 v0 = vertices[triangles[i]]; + Vector3 v1 = vertices[triangles[i + 1]]; + Vector3 v2 = vertices[triangles[i + 2]]; + + Gizmos.DrawLine(v0, v1); + Gizmos.DrawLine(v1, v2); + Gizmos.DrawLine(v2, v0); + } + } } } \ No newline at end of file diff --git a/Runtime/PSXNavMesh.cs.meta b/Runtime/PSXNavMesh.cs.meta index 142f03a..00c207d 100644 --- a/Runtime/PSXNavMesh.cs.meta +++ b/Runtime/PSXNavMesh.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 6a2f8d45e1591de1e945b3b7bdfb123b \ No newline at end of file +guid: 6a2f8d45e1591de1e945b3b7bdfb123b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: d695ef52da250cdcea6c30ab1122c56e, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/PSXPlayer.cs b/Runtime/PSXPlayer.cs new file mode 100644 index 0000000..32600d2 --- /dev/null +++ b/Runtime/PSXPlayer.cs @@ -0,0 +1,30 @@ +using UnityEngine; +using UnityEngine.AI; + + +namespace SplashEdit.RuntimeCode +{ + public class PSXPlayer : MonoBehaviour + { + public float PlayerHeight; + + [HideInInspector] + public Vector3 camPoint; + float maxDistance = 1000f; + + public void FindNavmesh() + { + NavMeshHit hit; + if (NavMesh.SamplePosition(transform.position, out hit, maxDistance, NavMesh.AllAreas)) + { + camPoint = hit.position + new Vector3(0, PlayerHeight, 0); + } + } + void OnDrawGizmos() + { + FindNavmesh(); + Gizmos.color = Color.red; + Gizmos.DrawSphere(camPoint, 0.2f); + } + } +} diff --git a/Runtime/PSXPlayer.cs.meta b/Runtime/PSXPlayer.cs.meta new file mode 100644 index 0000000..7245d08 --- /dev/null +++ b/Runtime/PSXPlayer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dee32f3a19300d7a3aae7424f01c9332 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 4d7bd095e76e6f3df976224b15405059, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/PSXSceneExporter.cs b/Runtime/PSXSceneExporter.cs index a42e9d6..ee790db 100644 --- a/Runtime/PSXSceneExporter.cs +++ b/Runtime/PSXSceneExporter.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using JetBrains.Annotations; using UnityEditor; using UnityEngine; using UnityEngine.AI; @@ -26,6 +27,10 @@ namespace SplashEdit.RuntimeCode private bool verticalLayout; private List prohibitedAreas; + private Vector3 _playerPos; + private Quaternion _playerRot; + private float _playerHeight; + public void Export() { _psxData = DataStorage.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas); @@ -44,6 +49,21 @@ namespace SplashEdit.RuntimeCode } PackTextures(); + + PSXPlayer player = FindObjectsByType(FindObjectsSortMode.None).FirstOrDefault(); + if (player != null) + { + player.FindNavmesh(); + _playerPos = player.camPoint; + _playerHeight = player.PlayerHeight; + _playerRot = player.transform.rotation; + } + else + { + Debug.LogError("Can't export a scene without a Player created"); + return; + } + ExportFile(); } @@ -103,14 +123,24 @@ namespace SplashEdit.RuntimeCode using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create))) { // Header - writer.Write('S'); // 1 byte - writer.Write('P'); // 1 byte - writer.Write((ushort)1); // 2 bytes - version - writer.Write((ushort)_exporters.Length); // 2 bytes - writer.Write((ushort)_navmeshes.Length); - writer.Write((ushort)_atlases.Length); // 2 bytes - writer.Write((ushort)clutCount); // 2 bytes - for (int i = 0; i < 2; i++) writer.Write((ushort)0); + writer.Write('S'); // 1 byte // 1 + writer.Write('P'); // 1 byte // 2 + writer.Write((ushort)1); // 2 bytes - version // 4 + writer.Write((ushort)_exporters.Length); // 2 bytes // 6 + writer.Write((ushort)_navmeshes.Length); // 8 + writer.Write((ushort)_atlases.Length); // 2 bytes // 10 + writer.Write((ushort)clutCount); // 2 bytes // 12 + writer.Write((ushort)PSXTrig.ConvertCoordinateToPSX(_playerPos.x, GTEScaling)); // 14 + writer.Write((ushort)PSXTrig.ConvertCoordinateToPSX(-_playerPos.y, GTEScaling)); // 16 + writer.Write((ushort)PSXTrig.ConvertCoordinateToPSX(_playerPos.z, GTEScaling)); // 18 + + writer.Write((ushort)PSXTrig.ConvertToFixed12(_playerRot.eulerAngles.x * Mathf.Deg2Rad)); // 20 + writer.Write((ushort)PSXTrig.ConvertToFixed12(_playerRot.eulerAngles.y * Mathf.Deg2Rad)); // 22 + writer.Write((ushort)PSXTrig.ConvertToFixed12(_playerRot.eulerAngles.z * Mathf.Deg2Rad)); // 24 + + writer.Write((ushort)PSXTrig.ConvertCoordinateToPSX(_playerHeight, GTEScaling)); // 26 + + writer.Write((ushort)0); // GameObject section (exporters) foreach (PSXObjectExporter exporter in _exporters) @@ -253,23 +283,25 @@ namespace SplashEdit.RuntimeCode } } - foreach (PSXNavMesh navmesh in _navmeshes) { + foreach (PSXNavMesh navmesh in _navmeshes) + { AlignToFourBytes(writer); long navmeshDataOffset = writer.BaseStream.Position; navmeshDataOffsets.Add(navmeshDataOffset); - foreach(PSXNavMeshTri tri in navmesh.Navmesh) { - writer.Write((ushort) tri.v0.vx); - writer.Write((ushort) tri.v0.vy); - writer.Write((ushort) tri.v0.vz); + foreach (PSXNavMeshTri tri in navmesh.Navmesh) + { + writer.Write((int)tri.v0.vx); + writer.Write((int)tri.v0.vy); + writer.Write((int)tri.v0.vz); - writer.Write((ushort) tri.v1.vx); - writer.Write((ushort) tri.v1.vy); - writer.Write((ushort) tri.v1.vz); + writer.Write((int)tri.v1.vx); + writer.Write((int)tri.v1.vy); + writer.Write((int)tri.v1.vz); - writer.Write((ushort) tri.v2.vx); - writer.Write((ushort) tri.v2.vy); - writer.Write((ushort) tri.v2.vz); + writer.Write((int)tri.v2.vx); + writer.Write((int)tri.v2.vy); + writer.Write((int)tri.v2.vz); } } diff --git a/Runtime/Utils.cs b/Runtime/Utils.cs index bbe32e2..bf9c30f 100644 --- a/Runtime/Utils.cs +++ b/Runtime/Utils.cs @@ -1,6 +1,7 @@ using UnityEditor; using System.Collections.Generic; using UnityEngine; +using System.Linq; namespace SplashEdit.RuntimeCode { @@ -330,7 +331,8 @@ namespace SplashEdit.RuntimeCode } - public static byte ColorUnityToPSX(float v) => (byte)(Mathf.Clamp(v*255, 0, 255)); + public static byte ColorUnityToPSX(float v) => (byte)(Mathf.Clamp(v * 255, 0, 255)); } + }