diff options
| author | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-06-20 15:13:11 +0200 |
|---|---|---|
| committer | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-06-20 15:13:11 +0200 |
| commit | d23024ceeb8e7f04b0a3bde7a0db41ae5e4fd06d (patch) | |
| tree | 03342eb22041fb7343c034e376489295e2a78a19 /libpsn00b/include | |
| parent | 79a966486615e60be3a37d278945dc3dd0fd933b (diff) | |
| download | psn00bsdk-d23024ceeb8e7f04b0a3bde7a0db41ae5e4fd06d.tar.gz | |
Split off libsmd from n00bdemo into separate library
Diffstat (limited to 'libpsn00b/include')
| -rw-r--r-- | libpsn00b/include/psxapi.h | 2 | ||||
| -rw-r--r-- | libpsn00b/include/smd/smd.h | 85 | ||||
| -rw-r--r-- | libpsn00b/include/smd/smd_s.inc | 339 |
3 files changed, 425 insertions, 1 deletions
diff --git a/libpsn00b/include/psxapi.h b/libpsn00b/include/psxapi.h index 5bb2b6f..67fa51a 100644 --- a/libpsn00b/include/psxapi.h +++ b/libpsn00b/include/psxapi.h @@ -310,7 +310,7 @@ int LoadExec(const char *path, int argc, const char **argv); void FlushCache(void); void ResetEntryInt(void); -void HookEntryInt(jmp_buf buf); +void HookEntryInt(const JumpBuffer *buf); void ReturnFromException(void); int SetConf(int evcb, int tcb, uint32_t sp); diff --git a/libpsn00b/include/smd/smd.h b/libpsn00b/include/smd/smd.h new file mode 100644 index 0000000..658f7fa --- /dev/null +++ b/libpsn00b/include/smd/smd.h @@ -0,0 +1,85 @@ +/* + * PSn00bSDK .SMD model parser library + * (C) 2019-2023 Lameguy64, spicyjpeg - MPL licensed + */ + +#pragma once + +#include <stdint.h> +#include <psxgte.h> + +/* Structure definitions */ + +typedef struct { + uint32_t *ot; + int16_t otlen; + uint8_t zdiv,zoff; +} SC_OT; + +typedef struct { + char id[3]; + uint8_t version; + uint16_t flags; + uint16_t n_verts; + uint16_t n_norms; + uint16_t n_prims; + SVECTOR *p_verts; + SVECTOR *p_norms; + void *p_prims; +} SMD; + +typedef struct { + uint8_t type : 2; + uint8_t l_type : 2; + uint8_t c_type : 1; + uint8_t texture : 1; + uint8_t blend : 2; + uint8_t zoff : 4; + uint8_t nocull : 1; + uint8_t mask : 1; + uint8_t texwin : 2; + uint8_t texoff : 2; + uint8_t reserved : 6; + uint8_t len; +} SMD_PRI_TYPE; + +typedef struct { + SMD_PRI_TYPE prim_id; + + uint16_t v0,v1,v2,v3; // Vertex indices + uint16_t n0,n1,n2,n3; // Normal indices + uint8_t r0,g0,b0,code; // RGB0 + uint8_t r1,g1,b1,p0; // RGB1 + uint8_t r2,g2,b2,p1; // RGB2 + uint8_t r3,g3,b3,p2; // RGB3 + uint8_t tu0,tv0; + uint8_t tu1,tv1; + uint8_t tu2,tv2; + uint8_t tu3,tv3; + uint16_t tpage,clut; +} SMD_PRIM; + +/* API */ + +#ifdef __cplusplus +extern "C" { +#endif + +int OpenSMD(const void *smd); +SMD_PRIM *ReadSMD(SMD_PRIM *pri); + +void scSetClipRect(int x0, int y0, int x1, int y1); + +SMD *smdInitData(const void *data); +void smdSetBaseTPage(uint16_t tpage); + +uint8_t *smdSortModel(SC_OT *ot, uint8_t *pribuff, SMD *smd); +uint8_t *smdSortModelFlat(uint32_t *ot, uint8_t *pribuff, SMD *smd); + +void smdSetCelTex(uint16_t tpage, uint16_t clut); +void smdSetCelParam(int udiv, int vdiv, unsigned int col); +uint8_t *smdSortModelCel(SC_OT *ot, uint8_t *pribuff, SMD *smd); + +#ifdef __cplusplus +} +#endif diff --git a/libpsn00b/include/smd/smd_s.inc b/libpsn00b/include/smd/smd_s.inc new file mode 100644 index 0000000..827e9e3 --- /dev/null +++ b/libpsn00b/include/smd/smd_s.inc @@ -0,0 +1,339 @@ +# PSn00bSDK .SMD model parser library +# (C) 2019-2023 Lameguy64, spicyjpeg - MPL licensed + +.set OT_ADDR, 0 +.set OT_LEN, 4 +.set OT_ZDIV, 8 +.set OT_ZOFF, 10 + +.set SMD_HEAD_ID, 0 +.set SMD_HEAD_FLAG, 4 +.set SMD_HEAD_NVERTS, 6 +.set SMD_HEAD_NNORMS, 8 +.set SMD_HEAD_NPRIMS, 10 +.set SMD_HEAD_PVERTS, 12 +.set SMD_HEAD_PNORMS, 16 +.set SMD_HEAD_PPRIMS, 20 +.set SMD_HEAD_SIZE, 24 + +.set POLYF3_tag, 0 +.set POLYF3_tpage, 4 +.set POLYF3_rgbc, 8 +.set POLYF3_xy0, 12 +.set POLYF3_xy1, 16 +.set POLYF3_xy2, 20 +.set POLYF3_len, 24 + +.set POLYFT3_tag, 0 +.set POLYFT3_rgbc, 4 +.set POLYFT3_xy0, 8 +.set POLYFT3_uv0, 12 +.set POLYFT3_clut, 14 +.set POLYFT3_xy1, 16 +.set POLYFT3_uv1, 20 +.set POLYFT3_tpage, 22 +.set POLYFT3_xy2, 24 +.set POLYFT3_uv2, 28 +.set POLYFT3_pad, 30 +.set POLYFT3_len, 32 + +.set POLYG3_tag, 0 +.set POLYG3_tpage, 4 +.set POLYG3_rgbc0, 8 +.set POLYG3_xy0, 12 +.set POLYG3_rgbc1, 16 +.set POLYG3_xy1, 20 +.set POLYG3_rgbc2, 24 +.set POLYG3_xy2, 28 +.set POLYG3_len, 32 + +.set POLYGT3_tag, 0 +.set POLYGT3_rgbc0, 4 +.set POLYGT3_xy0, 8 +.set POLYGT3_uv0, 12 +.set POLYGT3_clut, 14 +.set POLYGT3_rgbc1, 16 +.set POLYGT3_xy1, 20 +.set POLYGT3_uv1, 24 +.set POLYGT3_tpage, 26 +.set POLYGT3_rgbc2, 28 +.set POLYGT3_xy2, 32 +.set POLYGT3_uv2, 36 +.set POLYGT3_pad, 38 +.set POLYGT3_len, 40 + +.set POLYF4_tag, 0 +.set POLYF4_tpage, 4 +.set POLYF4_rgbc, 8 +.set POLYF4_xy0, 12 +.set POLYF4_xy1, 16 +.set POLYF4_xy2, 20 +.set POLYF4_xy3, 24 +.set POLYF4_len, 28 + +.set POLYFT4_tag, 0 +.set POLYFT4_rgbc, 4 +.set POLYFT4_xy0, 8 +.set POLYFT4_uv0, 12 +.set POLYFT4_clut, 14 +.set POLYFT4_xy1, 16 +.set POLYFT4_uv1, 20 +.set POLYFT4_tpage, 22 +.set POLYFT4_xy2, 24 +.set POLYFT4_uv2, 28 +.set POLYFT4_pad0, 30 +.set POLYFT4_xy3, 32 +.set POLYFT4_uv3, 36 +.set POLYFT4_pad1, 38 +.set POLYFT4_len, 40 + +.set POLYG4_tag, 0 +.set POLYG4_tpage, 4 +.set POLYG4_rgbc0, 8 +.set POLYG4_xy0, 12 +.set POLYG4_rgbc1, 16 +.set POLYG4_xy1, 20 +.set POLYG4_rgbc2, 24 +.set POLYG4_xy2, 28 +.set POLYG4_rgbc3, 32 +.set POLYG4_xy3, 36 +.set POLYG4_len, 40 + +.set POLYGT4_tag, 0 +.set POLYGT4_rgbc0, 4 +.set POLYGT4_xy0, 8 +.set POLYGT4_uv0, 12 +.set POLYGT4_clut, 14 +.set POLYGT4_rgbc1, 16 +.set POLYGT4_xy1, 20 +.set POLYGT4_uv1, 24 +.set POLYGT4_tpage, 26 +.set POLYGT4_rgbc2, 28 +.set POLYGT4_xy2, 32 +.set POLYGT4_uv2, 36 +.set POLYGT4_pad0, 38 +.set POLYGT4_rgbc3, 40 +.set POLYGT4_xy3, 44 +.set POLYGT4_uv3, 48 +.set POLYGT4_pad1, 50 +.set POLYGT4_len, 52 + +.set CLIP_LEFT, 1 +.set CLIP_RIGHT, 2 +.set CLIP_TOP, 4 +.set CLIP_BOTTOM, 8 + + +# Clip routine macros, based on Cohen-Sutherland line clipping algorithm +# but only with the off-screen dectection logic extended for polygons + +.macro ClipTestTri + + # X0 clip test + mfc2 $t7, C2_SXY0 + sll $v1, $t8, 16 + sra $v1, 16 + sll $v0, $t7, 16 + sra $v0, 16 + bge $v0, $v1, .no_clip_l_x0 + move $s0, $0 + ori $s0, CLIP_LEFT +.no_clip_l_x0: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x0 + nop + ori $s0, CLIP_RIGHT +.no_clip_r_x0: + # Y0 clip test + sra $v0, $t7, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y0 + nop + ori $s0, CLIP_TOP +.no_clip_t_y0: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y0 + nop + ori $s0, CLIP_BOTTOM +.no_clip_b_y0: + + # X1 clip test + mfc2 $t7, C2_SXY1 + sll $v1, $t8, 16 + sra $v1, 16 + sll $v0, $t7, 16 + sra $v0, 16 + bge $v0, $v1, .no_clip_l_x1 + move $s1, $0 + ori $s1, CLIP_LEFT +.no_clip_l_x1: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x1 + nop + ori $s1, CLIP_RIGHT +.no_clip_r_x1: + # Y1 clip test + sra $v0, $t7, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y1 + nop + ori $s1, CLIP_TOP +.no_clip_t_y1: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y1 + nop + ori $s1, CLIP_BOTTOM +.no_clip_b_y1: + + # X2 clip test + mfc2 $t7, C2_SXY2 + sll $v1, $t8, 16 + sra $v1, 16 + sll $v0, $t7, 16 + sra $v0, 16 + bge $v0, $v1, .no_clip_l_x2 + move $s2, $0 + ori $s2, CLIP_LEFT +.no_clip_l_x2: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x2 + nop + ori $s2, CLIP_RIGHT +.no_clip_r_x2: + # Y2 clip test + sra $v0, $t7, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y2 + nop + ori $s2, CLIP_TOP +.no_clip_t_y2: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y2 + nop + ori $s2, CLIP_BOTTOM +.no_clip_b_y2: + +.endm + + +.macro ClipTestQuad + + # X0 clip test + sll $v0, $t6, 16 + sra $v0, 16 + sll $v1, $t8, 16 + sra $v1, 16 + bge $v0, $v1, .no_clip_l_x0_q + move $s0, $0 + ori $s0, CLIP_LEFT +.no_clip_l_x0_q: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x0_q + nop + ori $s0, CLIP_RIGHT +.no_clip_r_x0_q: + # Y0 clip test + sra $v0, $t6, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y0_q + nop + ori $s0, CLIP_TOP +.no_clip_t_y0_q: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y0_q + nop + ori $s0, CLIP_BOTTOM +.no_clip_b_y0_q: + + # X1 clip test + mfc2 $t7, C2_SXY0 + sll $v1, $t8, 16 + sra $v1, 16 + sll $v0, $t7, 16 + sra $v0, 16 + bge $v0, $v1, .no_clip_l_x1_q + move $s1, $0 + ori $s1, CLIP_LEFT +.no_clip_l_x1_q: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x1_q + nop + ori $s1, CLIP_RIGHT +.no_clip_r_x1_q: + # Y1 clip test + sra $v0, $t7, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y1_q + nop + ori $s1, CLIP_TOP +.no_clip_t_y1_q: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y1_q + nop + ori $s1, CLIP_BOTTOM +.no_clip_b_y1_q: + + # X2 clip test + mfc2 $t7, C2_SXY1 + sll $v1, $t8, 16 + sra $v1, 16 + sll $v0, $t7, 16 + sra $v0, 16 + bge $v0, $v1, .no_clip_l_x2_q + move $s2, $0 + ori $s2, CLIP_LEFT +.no_clip_l_x2_q: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x2_q + nop + ori $s2, CLIP_RIGHT +.no_clip_r_x2_q: + # Y2 clip test + sra $v0, $t7, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y2_q + nop + ori $s2, CLIP_TOP +.no_clip_t_y2_q: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y2_q + nop + ori $s2, CLIP_BOTTOM +.no_clip_b_y2_q: + + # X3 clip test + mfc2 $t7, C2_SXY2 + sll $v1, $t8, 16 + sra $v1, 16 + sll $v0, $t7, 16 + sra $v0, 16 + bge $v0, $v1, .no_clip_l_x3_q + move $s3, $0 + ori $s3, CLIP_LEFT +.no_clip_l_x3_q: + sll $v1, $t9, 16 + sra $v1, 16 + ble $v0, $v1, .no_clip_r_x3_q + nop + ori $s3, CLIP_RIGHT +.no_clip_r_x3_q: + # Y4 clip test + sra $v0, $t7, 16 + sra $v1, $t8, 16 + bge $v0, $v1, .no_clip_t_y3_q + nop + ori $s3, CLIP_TOP +.no_clip_t_y3_q: + sra $v1, $t9, 16 + ble $v0, $v1, .no_clip_b_y3_q + nop + ori $s3, CLIP_BOTTOM +.no_clip_b_y3_q: + +.endm |
