Code: Select all
static SVECTOR PB0 = {-196/2,-196/2,-196/2,0};
static SVECTOR PB1 = { 196/2,-196/2,-196/2,0};
static SVECTOR PB2 = { 196/2, 196/2,-196/2,0};
static SVECTOR PB3 = {-196/2, 196/2,-196/2,0};
static SVECTOR PB4 = {-196/2,-196/2, 196/2,0};
static SVECTOR PB5 = { 196/2,-196/2, 196/2,0};
static SVECTOR PB6 = { 196/2, 196/2, 196/2,0};
static SVECTOR PB7 = {-196/2, 196/2, 196/2,0};
/* normal */
static SVECTOR N0 = { ONE, 0, 0, 0,};
static SVECTOR N1 = {-ONE, 0, 0, 0,};
static SVECTOR N2 = {0, ONE, 0, 0,};
static SVECTOR N3 = {0, -ONE, 0, 0,};
static SVECTOR N4 = {0, 0, ONE, 0,};
static SVECTOR N5 = {0, 0, -ONE, 0,};
// X1, X2, X3, X4
static SVECTOR *v[6*4] = {
&PB0,&PB1,&PB2,&PB3,
&PB1,&PB5,&PB6,&PB2,
&PB5,&PB4,&PB7,&PB6,
&PB4,&PB0,&PB3,&PB7,
&PB4,&PB5,&PB1,&PB0,
&PB6,&PB7,&PB3,&PB2,
};
static SVECTOR *n[6] = {
&N5, &N0, &N4, &N1, &N3, &N2,
};
int face_cnt = 6;
Code: Select all
// ATTENTION!
// NEVER USE DRAW3DBOW IN GAME CODE!
// THIS UNSTABLE STUFF I MADE ONLY FOR SIMPLE TESTS!
/* Draw textured (FT4) 3D Box into our screen
semitrans: Set semitransparent [Example: false/true]
start_fade_dist: Viev distance (start). If you getting close to te object, it will disappear. 0 = off [Example: 0]
end_fade_dist: View distance (end). If you're too far from the object, it will disappear. 0 = off [Example: 182]
scale: X Y Z scale (in VECTOR) [Example: VECTOR cube_scl = {2048,2048,2048,0}]
pos: X Y Z position (in VECTOR) [Example: VECTOR cube_pos = {0,0,0,0}]
rot: X Y Z rotation (in SVECTOR) [Example: SVECTOR cube_rot = {0,0,0,0}]
color: R G B colors (in CVECTOR) [Example: CVECTOR cube_pos = {128,128,128,0}]
DIVPOLYGON4: Screen resolution to the DIV [Example: DIVPOLYGON4 div]
POLY_FT4: Cube surface [Example: POLY_F4 s[6]]
About POS/ROT/ETC: PlayStation treats angle like as follows: 360 degree = 4096*/
int Draw3DBoxFT4(u_char semitrans, int start_fade_dist, int end_fade_dist, VECTOR scale, VECTOR pos, SVECTOR rot, CVECTOR *color, DIVPOLYGON4 div, POLY_FT4 *obj, /*MATRIX tmtx,*/ u_long *texture_input) {
MATRIX lmtx; // Light Matrix
MATRIX omtx; // Object Matrix
MATRIX tmtx; // Temporary
SVECTOR **vp, **np;
CVECTOR clrtmp;
AGsIMAGE texture;
int i;
int nclip;
long p, OTz, Flag;
u_char p_count = 6;
AGsLoadTim((u_long*)texture_input, &texture);
uv0.page = texture.clutid;
uv1.page = texture.tpage;
SetBackColor(40, 40, 40);
/* GTE has 1 matrix register, so it is better to push the
* matrix to preserve the current matrix register. */
PushMatrix();
// Rotate, translate and scale the matrix according to the specified coordinates
RotMatrix(&rot, &omtx);
TransMatrix(&omtx, &pos);
ScaleMatrix(&omtx, &scale);
MulMatrix0(&lmtx, &omtx, &tmtx);
SetLightMatrix(&tmtx);
// tmtx will be the matrix of the object relative to the camera
CompMatrixLV(&view.view, &omtx, &tmtx);
SetRotMatrix(&tmtx);
SetTransMatrix(&tmtx);
vp = v;
np = n;
NumPrims_local=0;
for (i = 0; i < p_count; i++, obj++, np++, vp += 4) {
obj = (POLY_FT4*)myPrimPtr;
nclip = RotAverageNclip4(
vp[0], vp[1], vp[2], vp[3],
(long *)&obj->x0, (long *)&obj->x1,
(long *)&obj->x3, (long *)&obj->x2,
&p, &OTz, &Flag);
obj->u0 = uv0.u; obj->v0 = uv0.v;
obj->u1 = uv1.u; obj->v1 = uv1.v;
obj->u2 = uv2.u; obj->v2 = uv2.v;
obj->u3 = uv3.u; obj->v3 = uv3.v;
obj->clut = uv0.page;
obj->tpage = uv1.page;
if ((nclip > 0) && (OTz > start_fade_dist)) {
SetPolyFT4(obj);
color[i].cd = obj->code;
SetSemiTrans(obj, semitrans);
OTc = OTz>>(14-OT_LENGTH);
if (end_fade_dist == 0 || (OTc < end_fade_dist)) {
// High LOD level (subdivided)
if (OTc < (LOD_LV2+(LOD_LV2_DISTANCE))) {
setRGB0(obj, color[i].r, color[i].g, color[i].b);
NormalColorCol(*np, color, (CVECTOR *)&obj->r0);
AddPrim((u_long *)myOT[ActiveBuffer].org+OTc, obj);
if (OTc < (LOD_LV1+(LOD_LV1_DISTANCE)))
div.ndiv = 2;
else div.ndiv = 1;
//Our mesh will be divided by 4.
DivideFT4(
&vp[0], &vp[1], &vp[3], &vp[2],
&uv0, &uv1, &uv2, &uv3,
color[i],
obj, (u_long *)myOT[ActiveBuffer].org+OTc,
&div);
// Increment primitive list pointer
myPrimPtr += POLY_FT4_size*((1<<(div.ndiv))<<(div.ndiv));
NumPrims_local += ((1<<(div.ndiv))<<(div.ndiv));
// Low LOD level (no subdivision)
} else {
setRGB0(obj, color[i].r, color[i].g, color[i].b);
NormalColorCol(*np, color, (CVECTOR *)&obj->r0);
AddPrim((u_long *)myOT[ActiveBuffer].org+OTc, obj);
myPrimPtr += POLY_FT4_size;
NumPrims_local += 1;
}
}
}
}
PopMatrix();
return (NumPrims_local);
}