link m_collision_obj

This commit is contained in:
Prakxo
2023-09-04 17:59:55 +02:00
parent 1d9045ad10
commit e5f349ee9c
6 changed files with 1172 additions and 86 deletions
+127 -9
View File
@@ -2,7 +2,7 @@
#define M_COLLISION_OBJ_H
#include "types.h"
#include "m_actor.h"
#include "m_actor_type.h"
#include "sys_math3d.h"
#include "m_play_h.h"
@@ -18,6 +18,15 @@ enum collision_type {
ClObj_TYPE_NUM
};
enum weight{
MASS_IMMOVABLE,
MASS_HEAVY,
MASS_NORMAL
};
#define MASSTYPE_IMMOVABLE 0XFF
#define MASSTYPE_HEAVY 0XFE
typedef struct collision_obj_s {
ACTOR* owner_actor; // actor which owns this collision object
ACTOR* collided_actor; // actor which the owner collided with or NULL
@@ -64,6 +73,55 @@ typedef struct collision_obj_pipe_data_s {
ClObjPipeAttrData_c attribute_data;
} ClObjPipeData_c;
typedef struct collision_check_tris_element_attr_data_s{
xyz_t vtx[3];
}ClObjTrisElemAttrData_c;
typedef struct collision_check_tris_element_data_s{
ClObjElemData_c element;
ClObjTrisElemAttrData_c data;
}ClObjTrisElemData_c;
typedef struct collision_check_tris_element_s{
Math3D_triangle_c tri;
xyz_t t;
}ClObjTrisElemAttr_c;
typedef struct collision_tris_elem_s{
ClObjElem_c element;
ClObjTrisElemAttr_c attribute;
}ClObjTrisElem_c;
typedef struct collision_tris_s {
ClObj_c collision_obj;
int count;
ClObjTrisElem_c* elements;
} ClObjTris_c;
typedef struct ClObjTris_Init {
ClObjData_c data;
int count;
ClObjTrisElemData_c* elem_data;
} ClObjTrisData_c;
typedef struct collision_obj_joint_sphere_elem_attribute_s{
Math3D_sphere_c s1;
Math3D_sphere_c s2;
f32 unk8;
u8 unk14;
}ClObjJntSphElemAttr_c;
typedef struct collision_joint_sphere_elem_s{
ClObjElem_c element;
ClObjJntSphElemAttr_c attribute;
}ClObjJntSphElem_c;
typedef struct collision_joint_sphere_s {
ClObj_c collision_obj;
int count;
ClObjJntSphElem_c* elements;
}ClObjJntSph_c;
#define Cl_COLLIDER_NUM 50
typedef struct collision_check_s {
u16 flags;
@@ -95,14 +153,74 @@ typedef struct status_data_s {
u8 weight;
} StatusData_c;
extern void ClObjPipe_ct(GAME_PLAY* play, ClObjPipe_c* pipe);
extern void ClObjPipe_dt(GAME_PLAY* play, ClObjPipe_c* pipe);
extern void ClObjPipe_set5(GAME_PLAY* play, ClObjPipe_c* pipe, ACTOR* owner, ClObjPipeData_c* data);
extern void CollisionCheck_Uty_ActorWorldPosSetPipeC(ACTOR* actor, ClObjPipe_c* col_pipe);
extern int CollisionCheck_setOC(GAME_PLAY* play, CollisionCheck_c* collision_check, ClObj_c* col_obj);
extern void CollisionCheck_Status_set3(Status_c* status, StatusData_c* data);
extern void CollisionCheck_Status_ct(Status_c* status);
extern void CollisionCheck_Status_Clear(Status_c* status);
typedef struct mco_work_s {
int count;
ClObj_c* colliders[10];
} McoWork;
extern McoWork mco_work;
typedef void (*CollisionOCFunction)(GAME_PLAY*, CollisionCheck_c*, ClObj_c*,ClObj_c*);
typedef int (*CollisionOCClear)(GAME_PLAY*, ClObj_c*);
typedef int (*CollisionClearFunction)(GAME_PLAY*, ClObj_c*);
extern void CollisionCheck_workTrisElemCenter(ClObjTrisElem_c *, xyz_t *);
extern int ClObj_ct(GAME_PLAY *, ClObj_c *);
extern int ClObj_dt(GAME_PLAY *, ClObj_c *);
extern int ClObj_set4(GAME_PLAY *, ClObj_c *, ACTOR *, ClObjData_c *);
extern void ClObj_OCClear(GAME_PLAY *, ClObj_c *);
extern int ClObjElem_ct(ClObjElem_c *);
extern int ClObjElem_set(ClObjElem_c *, ClObjElemData_c *);
extern void ClObjElem_OCClear(GAME_PLAY *, ClObjElem_c *);
extern int ClObjJntSphElem_OCClear(GAME_PLAY *, ClObjJntSphElem_c *);
extern int ClObjJntSph_OCClear(GAME_PLAY *, ClObj_c *);
extern int ClObjPipeAttr_ct(GAME_PLAY *, ClObjPipeAttr_c *);
extern int ClObjPipeAttr_dt(GAME_PLAY *, ClObjPipeAttr_c *);
extern int ClObjPipeAttr_set(GAME_PLAY *, ClObjPipeAttr_c *, ClObjPipeAttr_c *);
extern int ClObjPipe_ct(GAME_PLAY *, ClObjPipe_c *);
extern int ClObjPipe_dt(GAME_PLAY *, ClObjPipe_c *);
extern int ClObjPipe_set5(GAME_PLAY *, ClObjPipe_c *, ACTOR *, ClObjPipeData_c *);
extern int ClObjPipe_OCClear(GAME_PLAY *, ClObj_c *);
extern int ClObjTrisElemAttr_ct(GAME_PLAY *, ClObjTrisElemAttr_c *);
extern int ClObjTrisElemAttr_dt(GAME_PLAY *, ClObjTrisElemAttr_c *);
extern int ClObjTrisElemAttr_set(GAME_PLAY *, ClObjTrisElemAttr_c *, ClObjTrisElemAttrData_c *);
extern int ClObjTrisElem_ct(GAME_PLAY *, ClObjTrisElem_c *);
extern int ClObjTrisElem_dt(GAME_PLAY *, ClObjTrisElem_c *);
extern int ClObjTrisElem_set(GAME_PLAY *, ClObjTrisElem_c *, ClObjTrisElemData_c *);
extern int ClObjTrisElem_OCClear(GAME_PLAY *, ClObjTrisElem_c *);
extern int ClObjTris_ct(GAME_PLAY *, ClObjTris_c *);
extern int ClObjTris_dt_nzf(GAME_PLAY *, ClObjTris_c *);
extern int ClObjTris_set5_nzm(GAME_PLAY *, ClObjTris_c *, ACTOR *, ClObjTrisData_c *, ClObjTrisElem_c *);
extern int ClObjTris_OCClear(GAME_PLAY *, ClObj_c *);
extern void CollisionCheck_ct(GAME_PLAY *, CollisionCheck_c *);
extern void CollisionCheck_dt(GAME_PLAY *, CollisionCheck_c *);
extern void CollisionCheck_clear(GAME_PLAY *, CollisionCheck_c *);
extern int CollisionCheck_setOC(GAME_PLAY *, CollisionCheck_c *, ClObj_c *);
extern int get_type(u8);
extern void CollisionCheck_setOC_HitInfo(ClObj_c *, ClObjElem_c *, xyz_t *, ClObj_c *, ClObjElem_c *, xyz_t *, f32);
extern void CollisionCheck_OC_JntSph_Vs_JntSph(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
extern void CollisionCheck_OC_JntSph_Vs_Pipe(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
extern void CollisionCheck_OC_Pipe_Vs_JntSph(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
extern void CollisionCheck_OC_Pipe_Vs_Pipe(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
extern int CollisionCheck_Check1ClObjNoOC(ClObj_c *);
extern int CollisionCheck_Check2ClObjNoOC(ClObj_c *, ClObj_c *);
extern void CollisionCheck_OC(GAME_PLAY *, CollisionCheck_c *);
extern void CollisionCheck_setOCC_HitInfo(GAME_PLAY *, ClObj_c *, ClObjTrisElem_c *, xyz_t *, ClObj_c *, ClObjElem_c *, xyz_t *, xyz_t *);
extern void CollisionCheck_OCC_Tris_Vs_JntSph(GAME_PLAY *, CollisionCheck_c *, ClObjTris_c *, ClObjJntSph_c *);
extern void CollisionCheck_OCC_Tris_Vs_Pipe(GAME_PLAY *, CollisionCheck_c *, ClObjTris_c *, ClObjPipe_c *);
extern int CollisionCheck_Check1ClObjNoOCC(ClObj_c *);
extern void CollisionCheck_OCC(GAME_PLAY *, CollisionCheck_c *);
extern int ClObjTrisElem_OCCClear(GAME_PLAY *, ClObjTrisElem_c *);
extern int ClObj_OCCClear(GAME_PLAY *, ClObj_c *);
extern int ClObjTris_OCCClear(GAME_PLAY *, ClObj_c *);
extern int CollisionCheck_setOCC(GAME_PLAY *, CollisionCheck_c *, ClObj_c *);
extern void CollisionCheck_Status_ct(Status_c *);
extern void CollisionCheck_Status_Clear(Status_c *);
extern void CollisionCheck_Status_set3(Status_c *, StatusData_c *);
extern int CollisionCheck_Uty_ActorWorldPosSetPipeC(ACTOR *, ClObjPipe_c *);
#ifdef __cplusplus
}
+33 -76
View File
@@ -1,5 +1,4 @@
# PowerPC Register Constants
# General Purpose Registers (GPRs)
/* Register name macros */
.set r0, 0
.set r1, 1
.set r2, 2
@@ -32,8 +31,6 @@
.set r29, 29
.set r30, 30
.set r31, 31
# Floating Point Registers (FPRs)
.set f0, 0
.set f1, 1
.set f2, 2
@@ -66,8 +63,6 @@
.set f29, 29
.set f30, 30
.set f31, 31
# Graphics Quantization Registers (GQRs)
.set qr0, 0
.set qr1, 1
.set qr2, 2
@@ -76,73 +71,35 @@
.set qr5, 5
.set qr6, 6
.set qr7, 7
# Special Purpose Registers (SPRs)
.set XER, 1
.set LR, 8
.set CTR, 9
.set DSISR, 18
.set DAR, 19
.set DEC, 22
.set SDR1, 25
.set SRR0, 26
.set SRR1, 27
.set SPRG0, 272
.set SPRG1, 273
.set SPRG2, 274
.set SPRG3, 275
.set EAR, 282
.set PVR, 287
.set IBAT0U, 528
.set IBAT0L, 529
.set IBAT1U, 530
.set IBAT1L, 531
.set IBAT2U, 532
.set IBAT2L, 533
.set IBAT3U, 534
.set IBAT3L, 535
.set DBAT0U, 536
.set DBAT0L, 537
.set DBAT1U, 538
.set DBAT1L, 539
.set DBAT2U, 540
.set DBAT2L, 541
.set DBAT3U, 542
.set DBAT3L, 543
.set GQR0, 912
.set GQR1, 913
.set GQR2, 914
.set GQR3, 915
.set GQR4, 916
.set GQR5, 917
.set GQR6, 918
.set GQR7, 919
.set HID2, 920
.set WPAR, 921
.set DMA_U, 922
.set DMA_L, 923
.set UMMCR0, 936
.set UPMC1, 937
.set UPMC2, 938
.set USIA, 939
.set UMMCR1, 940
.set UPMC3, 941
.set UPMC4, 942
.set USDA, 943
.set MMCR0, 952
.set PMC1, 953
.set PMC2, 954
.set SIA, 955
.set MMCR1, 956
.set PMC3, 957
.set PMC4, 958
.set SDA, 959
.set HID0, 1008
.set HID1, 1009
.set IABR, 1010
.set DABR, 1013
.set L2CR, 1017
.set ICTC, 1019
.set THRM1, 1020
.set THRM2, 1021
.set THRM3, 1022
.set cr0lt, 0
.set cr0gt, 1
.set cr0eq, 2
.set cr0un, 3
.set cr1lt, 4
.set cr1gt, 5
.set cr1eq, 6
.set cr1un, 7
.set cr2lt, 8
.set cr2gt, 9
.set cr2eq, 10
.set cr2un, 11
.set cr3lt, 12
.set cr3gt, 13
.set cr3eq, 14
.set cr3un, 15
.set cr4lt, 16
.set cr4gt, 17
.set cr4eq, 18
.set cr4un, 19
.set cr5lt, 20
.set cr5gt, 21
.set cr5eq, 22
.set cr5un, 23
.set cr6lt, 24
.set cr6gt, 25
.set cr6eq, 26
.set cr6un, 27
.set cr7lt, 28
.set cr7gt, 29
.set cr7eq, 30
.set cr7un, 31
+22
View File
@@ -15,10 +15,32 @@ typedef struct math_3d_pipe_s {
s_xyz center;
} Math3D_pipe_c;
typedef struct math_3d_sphere_s{
s_xyz center;
s16 radius;
}Math3D_sphere_c;
typedef struct math_3d_plane_s {
xyz_t normal;
f32 originDist;
} Math3D_plane_c; // size = 0x10
typedef struct math_3d_triangle_s {
xyz_t vtx[3];
Math3D_plane_c plane;
} Math3D_triangle_c; // size = 0x34
extern f32 Math3DVecLength(xyz_t* vec);
extern void sMath_RotateX(xyz_t* pos, f32 rad);
extern void sMath_RotateY(xyz_t* pos, f32 rad);
extern void sMath_RotateZ(xyz_t* pos, f32 rad);
extern void Math3DPlane(xyz_t* va, xyz_t* vb, xyz_t* vc, f32* nox, f32* noy, f32* noz, f32* odist);
extern int Math3D_sphereCrossSphere_cl(Math3D_sphere_c* a, Math3D_sphere_c* b, f32* in);
extern int Math3D_sphereVsPipe_cl(Math3D_sphere_c* s, Math3D_pipe_c* c, f32* in);
extern int Math3D_pipeVsPipe_cl(Math3D_pipe_c* a, Math3D_pipe_c* b , f32* d);
extern int Math3D_sphereCrossTriangle3_cp(Math3D_sphere_c* s, Math3D_triangle_c* tri, xyz_t* ip);
extern int Math3D_pipeCrossTriangle_cp(Math3D_pipe_c* c,Math3D_triangle_c* tri, xyz_t* in);
extern xyz_t ZeroVec;
extern s_xyz ZeroSVec;