diff --git a/data/odyssey_functions.csv b/data/odyssey_functions.csv index df2d92f1..86032768 100644 --- a/data/odyssey_functions.csv +++ b/data/odyssey_functions.csv @@ -45157,7 +45157,7 @@ Address,Quality,Size,Name 0x0000007100723968,O,000004,_ZN2nn3gfx6detail3Nvn16GetBufferAddressENS0_10GpuAddressE 0x000000710072396c,O,000064,_ZN2nn3gfx6detail3Nvn26SetupScanBufferTextureInfoEPNS0_11TextureInfoERKNS0_13SwapChainInfoE 0x00000071007239ac,O,000016,_ZN2nn3gfx6detail3Nvn14GetCounterTypeENS0_11QueryTargetE -0x00000071007239bc,U,000660,_ZN2nn3gfx6detail3Nvn16GetDeviceFeatureEPK9NVNdevice +0x00000071007239bc,O,000660,_ZN2nn3gfx6detail3Nvn16GetDeviceFeatureEPK9NVNdevice 0x0000007100723c50,O,000024,_ZN2nn3gfx6detail3Nvn22GetImageFormatPropertyEPNS0_19ImageFormatPropertyE9NVNformat 0x0000007100723c68,O,000024,_ZN2nn3gfx6detail3Nvn17GetGfxImageFormatE9NVNformat 0x0000007100723c80,O,000040,_ZN2nn3gfx6detail3Nvn13DebugCallbackE22NVNdebugCallbackSource20NVNdebugCallbackTypei24NVNdebugCallbackSeverityPKcPv @@ -45175,7 +45175,7 @@ Address,Quality,Size,Name 0x0000007100724290,O,000056,_ZN2nn3gfx6detail11TextureImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE8FinalizeEPNS1_10DeviceImplIS8_EE 0x00000071007242c8,O,000028,_ZN2nn3gfx6detail15TextureViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEEC2Ev 0x00000071007242e4,O,000004,_ZN2nn3gfx6detail15TextureViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEED2Ev -0x00000071007242e8,U,000332,_ZN2nn3gfx6detail15TextureViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE10InitializeEPNS1_10DeviceImplIS8_EERKNS0_15TextureViewInfoE +0x00000071007242e8,O,000332,_ZN2nn3gfx6detail15TextureViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE10InitializeEPNS1_10DeviceImplIS8_EERKNS0_15TextureViewInfoE 0x0000007100724434,O,000012,_ZN2nn3gfx6detail15TextureViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE8FinalizeEPNS1_10DeviceImplIS8_EE 0x0000007100724440,O,000028,_ZN2nn3gfx6detail19ColorTargetViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEEC2Ev 0x000000710072445c,O,000004,_ZN2nn3gfx6detail19ColorTargetViewImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEED2Ev @@ -45488,7 +45488,7 @@ Address,Quality,Size,Name 0x0000007100731018,U,000020,_ZN4sead15GameFrameworkNx10initializeERKNS_9Framework13InitializeArgE 0x000000710073102c,U,000224,_ZN4sead15GameFrameworkNxC1ERKNS0_9CreateArgE 0x000000710073110c,U,000020,_ZN4sead15GameFrameworkNxD2Ev -0x0000007100731120,U,000004,_ZN4sead18LogicalFrameBufferD2Ev +0x0000007100731120,O,000004,_ZN4sead18LogicalFrameBufferD2Ev 0x0000007100731124,U,000052,_ZN4sead15GameFrameworkNxD0Ev 0x0000007100731158,U,002372,_ZN4sead15GameFrameworkNx24initializeGraphicsSystemEPNS_4HeapERKNS_7Vector2IfEE 0x0000007100731a9c,U,000016, @@ -45526,9 +45526,9 @@ Address,Quality,Size,Name 0x00000071007326f8,O,000004,_ZN4sead13GameFramework14saveScreenShotERKNS_14SafeStringBaseIcEE 0x00000071007326fc,O,000008,_ZNK4sead13GameFramework16isScreenShotBusyEv 0x0000007100732704,U,000004,_ZN4sead15GameFrameworkNx10setCaptionERKNS_14SafeStringBaseIcEE -0x0000007100732708,U,000112,_ZNK4sead18LogicalFrameBuffer27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE -0x0000007100732778,U,000092,_ZNK4sead18LogicalFrameBuffer18getRuntimeTypeInfoEv -0x00000071007327d4,U,000004,_ZN4sead18LogicalFrameBufferD0Ev +0x0000007100732708,O,000112,_ZNK4sead18LogicalFrameBuffer27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE +0x0000007100732778,O,000092,_ZNK4sead18LogicalFrameBuffer18getRuntimeTypeInfoEv +0x00000071007327d4,O,000004,_ZN4sead18LogicalFrameBufferD0Ev 0x00000071007327d8,U,000048,_ZN4sead9Delegate2INS_15GameFrameworkNxEPNS_6ThreadElE6invokeES3_l 0x0000007100732808,U,000092,_ZNK4sead9Delegate2INS_15GameFrameworkNxEPNS_6ThreadElE5cloneEPNS_4HeapE 0x0000007100732864,U,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_13MethodTreeMgrEE9isDerivedEPKNS0_9InterfaceE @@ -45786,7 +45786,7 @@ Address,Quality,Size,Name 0x000000710073a864,U,000204,_ZNK4sead16DisplayBufferNvn27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE 0x000000710073a930,U,000092,_ZNK4sead16DisplayBufferNvn18getRuntimeTypeInfoEv 0x000000710073a98c,U,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_11FrameBufferEE9isDerivedEPKNS0_9InterfaceE -0x000000710073aa18,U,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_18LogicalFrameBufferEE9isDerivedEPKNS0_9InterfaceE +0x000000710073aa18,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_18LogicalFrameBufferEE9isDerivedEPKNS0_9InterfaceE 0x000000710073aaa4,U,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_13DisplayBufferEE9isDerivedEPKNS0_9InterfaceE 0x000000710073ab30,U,000196,_ZN4sead11GraphicsNvnC1ERKNS0_9CreateArgE 0x000000710073abf4,U,000004,_ZN4sead11GraphicsNvn24defaultNvnDebugCallback_ERKNS0_21NvnDebugCallbackParamE @@ -46658,17 +46658,17 @@ Address,Quality,Size,Name 0x000000710075dec4,O,000032,_ZN4seaddvERKNS_7Color4fEf 0x000000710075dee4,O,000164,_ZN4sead7Color4f14adjustOverflowEv 0x000000710075df88,O,000092,_ZN4seadeqERKNS_7Color4fES2_ -0x000000710075dfe4,U,000004,_ZN4sead11FrameBufferD0Ev -0x000000710075dfe8,U,000012,_ZNK4sead11FrameBuffer4bindEPNS_11DrawContextE -0x000000710075dff4,U,000004,_ZNK4sead11FrameBuffer8clearMRTEPNS_11DrawContextEjRKNS_7Color4fE +0x000000710075dfe4,O,000004,_ZN4sead11FrameBufferD0Ev +0x000000710075dfe8,O,000012,_ZNK4sead11FrameBuffer4bindEPNS_11DrawContextE +0x000000710075dff4,O,000004,_ZNK4sead11FrameBuffer8clearMRTEPNS_11DrawContextEjRKNS_7Color4fE 0x000000710075dff8,U,000108,_ZN4sead20ReferenceFrameBufferC1EPKNS_11FrameBufferERKNS_7Vector2IfEERKNS_9BoundBox2IfEE 0x000000710075e064,U,000136,_ZN4sead20ReferenceFrameBufferC1EPKNS_11FrameBufferERKNS_7Vector2IfEES7_S7_ -0x000000710075e0ec,U,000204,_ZNK4sead11FrameBuffer27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE -0x000000710075e1b8,U,000092,_ZNK4sead11FrameBuffer18getRuntimeTypeInfoEv -0x000000710075e214,U,000004,_ZNK4sead11FrameBuffer19copyToDisplayBufferEPNS_11DrawContextEPKNS_13DisplayBufferE +0x000000710075e0ec,O,000204,_ZNK4sead11FrameBuffer27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE +0x000000710075e1b8,O,000092,_ZNK4sead11FrameBuffer18getRuntimeTypeInfoEv +0x000000710075e214,O,000004,_ZNK4sead11FrameBuffer19copyToDisplayBufferEPNS_11DrawContextEPKNS_13DisplayBufferE 0x000000710075e218,U,000288,_ZNK4sead20ReferenceFrameBuffer27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE 0x000000710075e338,U,000092,_ZNK4sead20ReferenceFrameBuffer18getRuntimeTypeInfoEv -0x000000710075e394,U,000004,_ZN4sead11FrameBufferD2Ev +0x000000710075e394,O,000004,_ZN4sead11FrameBufferD2Ev 0x000000710075e398,U,000004,_ZN4sead20ReferenceFrameBufferD0Ev 0x000000710075e39c,U,000016,_ZNK4sead20ReferenceFrameBuffer5clearEPNS_11DrawContextEjRKNS_7Color4fEfj 0x000000710075e3ac,U,000016,_ZNK4sead20ReferenceFrameBuffer8clearMRTEPNS_11DrawContextEjRKNS_7Color4fE @@ -52418,7 +52418,7 @@ Address,Quality,Size,Name 0x000000710085225c,U,000020,_ZNK2al16KCollisionServer12getPrismDataEjPKNS_13KCPrismHeaderE 0x0000007100852270,U,000204,_ZNK2al16KCollisionServer20isNearParallelNormalEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE 0x000000710085233c,U,000624,_ZNK2al16KCollisionServer10isNanPrismEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE -0x00000071008525ac,U,000312,_ZNK2al16KCollisionServer12calcPosLocalEPN4sead7Vector3IfEEPKNS_11KCPrismDataEiPKNS_13KCPrismHeaderE +0x00000071008525ac,W,000312,_ZNK2al16KCollisionServer12calcPosLocalEPN4sead7Vector3IfEEPKNS_11KCPrismDataEiPKNS_13KCPrismHeaderE 0x00000071008526e4,U,000044,_ZNK2al16KCollisionServer9getMinMaxEPN4sead7Vector3IfEES4_ 0x0000007100852710,U,000044,_ZNK2al16KCollisionServer16getAreaSpaceSizeEPN4sead7Vector3IfEEPKNS_13KCPrismHeaderE 0x000000710085273c,U,000040,_ZNK2al16KCollisionServer16getAreaSpaceSizeEPiS1_S1_PKNS_13KCPrismHeaderE @@ -52441,18 +52441,18 @@ Address,Quality,Size,Name 0x0000007100855ba0,U,000116,_ZN2al16KCollisionServer16searchPrismArrowERKN4sead7Vector3IfEES5_RNS1_10IDelegate2IPKNS_11KCPrismDataEPKNS_13KCPrismHeaderEEE 0x0000007100855c14,U,000296,_ZN2al16KCollisionServer15searchPrismDiskERKN4sead7Vector3IfEES5_ffRNS1_10IDelegate2IPKNS_11KCPrismDataEPKNS_13KCPrismHeaderEEE 0x0000007100855d3c,U,000244,_ZNK2al16KCollisionServer16isParallelNormalEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE -0x0000007100855e30,U,000024,_ZNK2al16KCollisionServer13getFaceNormalEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE -0x0000007100855e48,U,000024,_ZNK2al16KCollisionServer14getEdgeNormal1EPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE -0x0000007100855e60,U,000024,_ZNK2al16KCollisionServer14getEdgeNormal2EPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE -0x0000007100855e78,U,000024,_ZNK2al16KCollisionServer14getEdgeNormal3EPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE +0x0000007100855e30,m,000024,_ZNK2al16KCollisionServer13getFaceNormalEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE +0x0000007100855e48,m,000024,_ZNK2al16KCollisionServer14getEdgeNormal1EPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE +0x0000007100855e60,m,000024,_ZNK2al16KCollisionServer14getEdgeNormal2EPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE +0x0000007100855e78,m,000024,_ZNK2al16KCollisionServer14getEdgeNormal3EPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE 0x0000007100855e90,U,000984, 0x0000007100856268,U,002336,_ZN2al16KCollisionServer9KCHitDiscEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderERKN4sead7Vector3IfEESB_ffPS9_Pf 0x0000007100856b88,U,000032,_ZNK2al16KCollisionServer7toIndexEPKNS_11KCPrismDataEPKNS_13KCPrismHeaderE -0x0000007100856ba8,U,000020,_ZNK2al16KCollisionServer9getNormalEjPKNS_13KCPrismHeaderE -0x0000007100856bbc,U,000084,_ZN2al16KCollisionServer7calXvecEPKN4sead7Vector3IfEES5_PS3_ -0x0000007100856c10,U,000020,_ZNK2al16KCollisionServer13getVertexDataEjPKNS_13KCPrismHeaderE -0x0000007100856c24,U,000028,_ZNK2al16KCollisionServer12getVertexNumEPKNS_13KCPrismHeaderE -0x0000007100856c40,U,000032,_ZNK2al16KCollisionServer12getNormalNumEPKNS_13KCPrismHeaderE +0x0000007100856ba8,m,000020,_ZNK2al16KCollisionServer9getNormalEjPKNS_13KCPrismHeaderE +0x0000007100856bbc,O,000084,_ZN2al16KCollisionServer7calXvecEPKN4sead7Vector3IfEES5_PS3_ +0x0000007100856c10,m,000020,_ZNK2al16KCollisionServer13getVertexDataEjPKNS_13KCPrismHeaderE +0x0000007100856c24,O,000028,_ZNK2al16KCollisionServer12getVertexNumEPKNS_13KCPrismHeaderE +0x0000007100856c40,O,000032,_ZNK2al16KCollisionServer12getNormalNumEPKNS_13KCPrismHeaderE 0x0000007100856c60,U,000008,_ZNK2al16KCollisionServer22getAttributeElementNumEv 0x0000007100856c68,U,000028,_ZNK2al16KCollisionServer13getAttributesEPNS_9ByamlIterEjPKNS_13KCPrismHeaderE 0x0000007100856c84,U,000012,_ZNK2al16KCollisionServer13getAttributesEPNS_9ByamlIterEPKNS_11KCPrismDataE @@ -52461,7 +52461,7 @@ Address,Quality,Size,Name 0x0000007100856d04,U,000300,_ZN2al16KCollisionServer10doBoxCheckEPKN4sead7Vector3IfEES5_PNS2_IjEES7_PKNS_13KCPrismHeaderE 0x0000007100856e30,U,000052,_ZNK2al16KCollisionServer19calcAreaBlockOffsetERKN4sead7Vector3IjEEPKNS_13KCPrismHeaderE 0x0000007100856e64,U,000040,_ZN2al16KCollisionServer20calcChildBlockOffsetERKN4sead7Vector3IjEEi -0x0000007100856e8c,U,000008,_ZN2al16KCollisionServer12getBlockDataEPKjj +0x0000007100856e8c,O,000008,_ZN2al16KCollisionServer12getBlockDataEPKjj 0x0000007100856e94,U,000196,_ZN2al18SphereInterpolator11startInterpERKN4sead7Vector3IfEES5_fff 0x0000007100856f58,U,000036,_ZN2al18SphereInterpolator8nextStepEv 0x0000007100856f7c,U,000068,_ZNK2al18SphereInterpolator13calcInterpPosEPN4sead7Vector3IfEE @@ -69957,7 +69957,7 @@ Address,Quality,Size,Name 0x0000007100aea1c4,O,000056,_ZN2nn3gfx6detail11SamplerImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE8FinalizeEPNS1_10DeviceImplIS8_EE 0x0000007100aea1fc,O,000016,_ZN2nn3gfx6detail19RasterizerStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEEC2Ev 0x0000007100aea20c,O,000004,_ZN2nn3gfx6detail19RasterizerStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEED2Ev -0x0000007100aea210,U,000460,_ZN2nn3gfx6detail19RasterizerStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE10InitializeEPNS1_10DeviceImplIS8_EERKNS0_19RasterizerStateInfoE +0x0000007100aea210,O,000460,_ZN2nn3gfx6detail19RasterizerStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE10InitializeEPNS1_10DeviceImplIS8_EERKNS0_19RasterizerStateInfoE 0x0000007100aea3dc,O,000008,_ZN2nn3gfx6detail19RasterizerStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE8FinalizeEPNS1_10DeviceImplIS8_EE 0x0000007100aea3e4,O,000012,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE21GetRequiredMemorySizeERKNS0_14BlendStateInfoE 0x0000007100aea3f0,O,000016,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEEC2Ev @@ -69965,7 +69965,7 @@ Address,Quality,Size,Name 0x0000007100aea404,O,000012,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE9SetMemoryEPvm 0x0000007100aea410,O,000008,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE9GetMemoryEv 0x0000007100aea418,O,000008,_ZNK2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE9GetMemoryEv -0x0000007100aea420,U,000548,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE10InitializeEPNS1_10DeviceImplIS8_EERKNS0_14BlendStateInfoE +0x0000007100aea420,O,000548,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE10InitializeEPNS1_10DeviceImplIS8_EERKNS0_14BlendStateInfoE 0x0000007100aea644,O,000008,_ZN2nn3gfx6detail14BlendStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE8FinalizeEPNS1_10DeviceImplIS8_EE 0x0000007100aea64c,O,000016,_ZN2nn3gfx6detail21DepthStencilStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEEC2Ev 0x0000007100aea65c,O,000004,_ZN2nn3gfx6detail21DepthStencilStateImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEED2Ev @@ -70013,7 +70013,7 @@ Address,Quality,Size,Name 0x0000007100aeb0a4,O,000024,_ZN2nn3gfx14ResTextureFile7IsValidEPKv 0x0000007100aeb0bc,O,000052,_ZN2nn3gfx14ResTextureFile7ResCastEPv 0x0000007100aeb0f0,O,000032,_ZN2nn3gfx20MultisampleStateInfo10SetDefaultEv -0x0000007100aeb110,U,000072,_ZN2nn3gfx19RasterizerStateInfo10SetDefaultEv +0x0000007100aeb110,O,000072,_ZN2nn3gfx19RasterizerStateInfo10SetDefaultEv 0x0000007100aeb158,O,000048,_ZN2nn3gfx20BlendTargetStateInfo10SetDefaultEv 0x0000007100aeb188,O,000048,_ZN2nn3gfx14BlendStateInfo10SetDefaultEv 0x0000007100aeb1b8,O,000016,_ZN2nn3gfx16StencilStateInfo10SetDefaultEv diff --git a/lib/al/collision/KCPrism.h b/lib/al/collision/KCPrism.h new file mode 100644 index 00000000..03e56c2e --- /dev/null +++ b/lib/al/collision/KCPrism.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace al { +struct KCPrismData { // triangle + float mLength; + u16 mPosIndex; + u16 mFaceNormalIndex; + u16 mEdgeNormalIndex[3]; + u16 mCollisionType; + u32 mTriIndex; +}; + +struct KCPrismHeader { // model + u32 mPositionsOffset; + u32 mNormalsOffset; + u32 mTrianglesOffset; + u32 mOctreeOffset; + float mThickness; + sead::Vector3f mOctreeOrigin; + u32 mXMask; + u32 mYMask; + u32 mZMask; + u32 mCoordShift; + u32 mYShift; + u32 mZShift; + float mHitboxRadiusCap; +}; +} diff --git a/lib/al/collision/KCollisionServer.h b/lib/al/collision/KCollisionServer.h new file mode 100644 index 00000000..612d8325 --- /dev/null +++ b/lib/al/collision/KCollisionServer.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +namespace al { + +struct KCPrismHeader; +struct KCPrismData; + +class KCollisionServer { +public: + bool isNearParallelNormal(const KCPrismData*, const KCPrismHeader*) const; + void calcPosLocal(sead::Vector3f*, const KCPrismData*, int, const KCPrismHeader*) const; + const sead::Vector3f& getFaceNormal(const KCPrismData*, const KCPrismHeader*) const; + const sead::Vector3f& getEdgeNormal1(const KCPrismData*, const KCPrismHeader*) const; + const sead::Vector3f& getEdgeNormal2(const KCPrismData*, const KCPrismHeader*) const; + const sead::Vector3f& getEdgeNormal3(const KCPrismData*, const KCPrismHeader*) const; + const sead::Vector3f& getNormal(u32, const KCPrismHeader*) const; + const sead::Vector3f& getVertexData(u32, const KCPrismHeader*) const; + u32 getVertexNum(const KCPrismHeader*) const; + u32 getNormalNum(const KCPrismHeader*) const; + + static void calXvec(const sead::Vector3f*, const sead::Vector3f*, sead::Vector3f*); + static u32 getBlockData(const u32*, u32); +}; + +} diff --git a/src/al/CMakeLists.txt b/src/al/CMakeLists.txt index 5fe35238..7d456c9d 100644 --- a/src/al/CMakeLists.txt +++ b/src/al/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(actor) add_subdirectory(async) add_subdirectory(byaml) +add_subdirectory(collision) add_subdirectory(factory) add_subdirectory(graph) add_subdirectory(hack) diff --git a/src/al/collision/CMakeLists.txt b/src/al/collision/CMakeLists.txt new file mode 100644 index 00000000..836725a6 --- /dev/null +++ b/src/al/collision/CMakeLists.txt @@ -0,0 +1,3 @@ +target_sources(odyssey PRIVATE + KCollisionServer.cpp +) diff --git a/src/al/collision/KCollisionServer.cpp b/src/al/collision/KCollisionServer.cpp new file mode 100644 index 00000000..6e1a1b4a --- /dev/null +++ b/src/al/collision/KCollisionServer.cpp @@ -0,0 +1,93 @@ +#include "al/collision/KCollisionServer.h" +#include + +#include "al/collision/KCPrism.h" +#include "math/seadVector.h" + +namespace al { + +bool KCollisionServer::isNearParallelNormal(const KCPrismData* data, const KCPrismHeader* header) const { + +} + +void KCollisionServer::calcPosLocal(sead::Vector3f* out, const KCPrismData* data, int vIndex, + const KCPrismHeader* header) const { + switch (vIndex) { + case 0: { + sead::Vector3f pos = getVertexData(data->mPosIndex, header); + *out = pos; + break; + } + case 2: { + const sead::Vector3f& normalA = getEdgeNormal1(data, header); + const sead::Vector3f& dirNormal = getFaceNormal(data, header); + const sead::Vector3f& normalC = getEdgeNormal3(data, header); + sead::Vector3f cross; + calXvec(&normalA, &dirNormal, &cross); + //cross.setCross(normalA, dirNormal); + float factor = data->mLength / fmax(cross.dot(normalC), 0.00000011921f); + const sead::Vector3f& pos = getVertexData(data->mPosIndex, header); + *out = pos + (cross * factor); + break; + } + case 1: { + const sead::Vector3f& normalA = getFaceNormal(data, header); + const sead::Vector3f& dirNormal = getEdgeNormal2(data, header); + const sead::Vector3f& normalC = getEdgeNormal3(data, header); + sead::Vector3f cross; + calXvec(&normalA, &dirNormal, &cross); + //cross.setCross(normalA, dirNormal); + float factor = data->mLength / fmax(cross.dot(normalC), 0.00000011921f); + const sead::Vector3f& pos = getVertexData(data->mPosIndex, header); + *out = pos + (cross * factor); + break; + } + default: + *out = {0, 0, 0}; + break; + } +} + +const sead::Vector3f& KCollisionServer::getFaceNormal(const KCPrismData* data, + const KCPrismHeader* header) const { + return getNormal(data->mFaceNormalIndex, header); +} +const sead::Vector3f& KCollisionServer::getEdgeNormal1(const KCPrismData* data, + const KCPrismHeader* header) const { + return getNormal(data->mEdgeNormalIndex[0], header); +} +const sead::Vector3f& KCollisionServer::getEdgeNormal2(const KCPrismData* data, + const KCPrismHeader* header) const { + return getNormal(data->mEdgeNormalIndex[1], header); +} +const sead::Vector3f& KCollisionServer::getEdgeNormal3(const KCPrismData* data, + const KCPrismHeader* header) const { + return getNormal(data->mEdgeNormalIndex[2], header); +} +const sead::Vector3f& KCollisionServer::getNormal(u32 index, const KCPrismHeader* header) const { + return reinterpret_cast(reinterpret_cast(header) + + header->mNormalsOffset)[(int)index]; +} +void KCollisionServer::calXvec(const sead::Vector3f* a, const sead::Vector3f* b, + sead::Vector3f* out) { + out->x = (a->z * b->y) - (a->y * b->z); + out->y = (a->x * b->z) - (a->z * b->x); + out->z = (a->y * b->x) - (a->x * b->y); +} +const sead::Vector3f& KCollisionServer::getVertexData(u32 index, const KCPrismHeader* header) const { + return reinterpret_cast(reinterpret_cast(header) + header->mPositionsOffset)[(int)index]; +} +u32 KCollisionServer::getVertexNum(const KCPrismHeader* header) const { + // somehow needs to be this weird to produce matching code + //return ((header->mNormalsOffset - header->mPositionsOffset) >> 2) / 0x18; + return 0xAAAAAAAB * ((header->mNormalsOffset - (u64)header->mPositionsOffset) >> 2); +} +u32 KCollisionServer::getNormalNum(const KCPrismHeader* header) const { + return 4 * ((header->mOctreeOffset - (u64)header->mTrianglesOffset) / 0x14); +} + +u32 KCollisionServer::getBlockData(const u32* data, u32 offset) { + return *reinterpret_cast(reinterpret_cast(data) + offset); +} + +} // namespace al