mirror of
https://github.com/luksamuk/engine-psx.git
synced 2025-04-28 13:28:02 +03:00
Setup GTE quad rendering
This commit is contained in:
parent
8ca69094ef
commit
4da14b45b4
6 changed files with 129 additions and 13 deletions
|
@ -37,5 +37,8 @@ void free_chara(Chara *chara);
|
||||||
|
|
||||||
void chara_render_frame(Chara *chara, int16_t framenum,
|
void chara_render_frame(Chara *chara, int16_t framenum,
|
||||||
int16_t vx, int16_t vy, uint8_t flipx);
|
int16_t vx, int16_t vy, uint8_t flipx);
|
||||||
|
void chara_draw_gte(Chara *chara, int16_t framenum,
|
||||||
|
int16_t vx, int16_t vy,
|
||||||
|
uint8_t flipx, int32_t angle);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#define OTZ_LAYER_LEVEL_FG_FRONT 2
|
#define OTZ_LAYER_LEVEL_FG_FRONT 2
|
||||||
#define OTZ_LAYER_OBJECTS 3
|
#define OTZ_LAYER_OBJECTS 3
|
||||||
#define OTZ_LAYER_PLAYER 4
|
#define OTZ_LAYER_PLAYER 4
|
||||||
|
#define OTZ_LAYER_UNDER_PLAYER 5
|
||||||
#define OTZ_LAYER_LEVEL_FG_BACK (OT_LENGTH - 3)
|
#define OTZ_LAYER_LEVEL_FG_BACK (OT_LENGTH - 3)
|
||||||
#define OTZ_LAYER_LEVEL_BG (OT_LENGTH - 2)
|
#define OTZ_LAYER_LEVEL_BG (OT_LENGTH - 2)
|
||||||
|
|
||||||
|
|
98
src/chara.c
98
src/chara.c
|
@ -162,3 +162,101 @@ chara_render_frame(Chara *chara, int16_t framenum, int16_t vx, int16_t vy, uint8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
chara_draw_gte(Chara *chara, int16_t framenum,
|
||||||
|
int16_t vx, int16_t vy,
|
||||||
|
uint8_t flipx, int32_t angle)
|
||||||
|
{
|
||||||
|
// Prepare position
|
||||||
|
VECTOR pos = { .vx = vx, .vy = vy, .vz = 0 };
|
||||||
|
SVECTOR rotation = { 0, 0, angle, 0 };
|
||||||
|
/* VECTOR scale = { ONE, flipx ? -ONE : ONE, ONE }; */
|
||||||
|
|
||||||
|
MATRIX world = { 0 };
|
||||||
|
RotMatrix(&rotation, &world);
|
||||||
|
TransMatrix(&world, &pos);
|
||||||
|
/* ScaleMatrix(&world, &scale); */
|
||||||
|
gte_SetRotMatrix(&world);
|
||||||
|
gte_SetTransMatrix(&world);
|
||||||
|
|
||||||
|
CharaFrame *frame = &chara->frames[framenum];
|
||||||
|
|
||||||
|
// Render only one tile
|
||||||
|
uint16_t idx = frame->tiles[0];
|
||||||
|
if(idx == 0) {
|
||||||
|
printf("Bad choice, bro\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get upper left UV from tile index on tileset
|
||||||
|
uint16_t v0idx = idx >> 5; // divide by 32
|
||||||
|
uint16_t u0idx = idx - (v0idx << 5);
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
u0 = (u0idx << 3),
|
||||||
|
v0 = (v0idx << 3);
|
||||||
|
|
||||||
|
/* SPRT_8 *sprite = (SPRT_8 *)get_next_prim(); */
|
||||||
|
/* increment_prim(sizeof(SPRT_8)); */
|
||||||
|
/* setSprt8(sprite); */
|
||||||
|
/* setUV0(sprite, u0, v0); */
|
||||||
|
|
||||||
|
|
||||||
|
/* TILE *sprite = (TILE *)get_next_prim(); */
|
||||||
|
/* increment_prim(sizeof(TILE)); */
|
||||||
|
/* setTile(sprite); */
|
||||||
|
/* setRGB0(sprite, level_fade, level_fade, level_fade); */
|
||||||
|
/* sprite->w = 8; */
|
||||||
|
/* sprite->h = 8; */
|
||||||
|
/* //setXY0 */
|
||||||
|
/* SVECTOR p = { 0, 0, 8 << 12, 0 }; */
|
||||||
|
/* RotTransPers(&p, (uint32_t *)&sprite->x0); */
|
||||||
|
/* sort_prim(sprite, OTZ_LAYER_PLAYER); */
|
||||||
|
|
||||||
|
|
||||||
|
POLY_G4 *poly = (POLY_G4 *)get_next_prim();
|
||||||
|
increment_prim(sizeof(POLY_G4));
|
||||||
|
setPolyG4(poly);
|
||||||
|
|
||||||
|
if(flipx) {
|
||||||
|
setRGB1(poly, 128, 0, 0);
|
||||||
|
setRGB0(poly, 0, 128, 0);
|
||||||
|
setRGB3(poly, 0, 0, 128);
|
||||||
|
setRGB2(poly, 128, 128, 0);
|
||||||
|
} else {
|
||||||
|
setRGB0(poly, 128, 0, 0);
|
||||||
|
setRGB1(poly, 0, 128, 0);
|
||||||
|
setRGB2(poly, 0, 0, 128);
|
||||||
|
setRGB3(poly, 128, 128, 0);
|
||||||
|
}
|
||||||
|
/* setRGB0(poly, level_fade, level_fade, level_fade); */
|
||||||
|
|
||||||
|
|
||||||
|
SVECTOR vertices[] = {
|
||||||
|
{ -4, -4, 0, 0 },
|
||||||
|
{ 4, -4, 0, 0 },
|
||||||
|
{ -4, 4, 0, 0 },
|
||||||
|
{ 4, 4, 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
int otz;
|
||||||
|
RotAverageNclip4(
|
||||||
|
&vertices[0],
|
||||||
|
&vertices[1],
|
||||||
|
&vertices[2],
|
||||||
|
&vertices[3],
|
||||||
|
(uint32_t *)&poly->x0,
|
||||||
|
(uint32_t *)&poly->x1,
|
||||||
|
(uint32_t *)&poly->x2,
|
||||||
|
(uint32_t *)&poly->x3,
|
||||||
|
&otz);
|
||||||
|
|
||||||
|
sort_prim(poly, OTZ_LAYER_PLAYER);
|
||||||
|
|
||||||
|
printf("Position: (%4d, %4d)\n", poly->x0, poly->y0);
|
||||||
|
|
||||||
|
/* DR_TPAGE *tpage = get_next_prim(); */
|
||||||
|
/* increment_prim(sizeof(DR_TPAGE)); */
|
||||||
|
/* setDrawTPage(tpage, 0, 1, getTPage(1, 1, chara->prectx, chara->precty)); */
|
||||||
|
/* sort_prim(tpage, OTZ_LAYER_PLAYER); */
|
||||||
|
}
|
||||||
|
|
|
@ -72,7 +72,8 @@ main(void)
|
||||||
/* mdec_fmv_init(); */
|
/* mdec_fmv_init(); */
|
||||||
|
|
||||||
// Set first scene
|
// Set first scene
|
||||||
scene_change(SCREEN_DISCLAIMER);
|
//scene_change(SCREEN_DISCLAIMER);
|
||||||
|
scene_change(SCREEN_SPRITETEST);
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
// Update systems
|
// Update systems
|
||||||
|
|
|
@ -298,7 +298,7 @@ begin_render_routine:
|
||||||
|| (state->id == OBJ_EXPLOSION)
|
|| (state->id == OBJ_EXPLOSION)
|
||||||
|| (state->id == OBJ_BUBBLE))
|
|| (state->id == OBJ_BUBBLE))
|
||||||
? OTZ_LAYER_OBJECTS
|
? OTZ_LAYER_OBJECTS
|
||||||
: OTZ_LAYER_PLAYER;
|
: OTZ_LAYER_UNDER_PLAYER;
|
||||||
|
|
||||||
// NOTABLE EXCEPTION: if this is a bubble object which animation has gone
|
// NOTABLE EXCEPTION: if this is a bubble object which animation has gone
|
||||||
// beyond the first digit display, it should be rendered on text layer
|
// beyond the first digit display, it should be rendered on text layer
|
||||||
|
|
|
@ -16,6 +16,7 @@ typedef struct {
|
||||||
VECTOR pos;
|
VECTOR pos;
|
||||||
int16_t frame;
|
int16_t frame;
|
||||||
uint8_t play_frames;
|
uint8_t play_frames;
|
||||||
|
uint8_t flipx;
|
||||||
int32_t angle;
|
int32_t angle;
|
||||||
} screen_sprite_test_data;
|
} screen_sprite_test_data;
|
||||||
|
|
||||||
|
@ -34,11 +35,13 @@ screen_sprite_test_load()
|
||||||
|
|
||||||
load_chara(&data->chara, "\\SPRITES\\SONIC.CHARA;1", &tim);
|
load_chara(&data->chara, "\\SPRITES\\SONIC.CHARA;1", &tim);
|
||||||
|
|
||||||
data->pos = (VECTOR){ .vx = CENTERX, .vy = CENTERY, .vz = 0 };
|
data->pos = (VECTOR){ .vx = 0, .vy = 0, .vz = 0 };
|
||||||
data->frame = 0;
|
data->frame = 0;
|
||||||
data->play_frames = 0;
|
data->play_frames = 0;
|
||||||
data->angle = 0;
|
data->angle = 0;
|
||||||
|
data->flipx = 0;
|
||||||
level_fade = 0x7f;
|
level_fade = 0x7f;
|
||||||
|
set_clear_color(36, 0, 180);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -55,6 +58,7 @@ screen_sprite_test_update(void *d)
|
||||||
screen_sprite_test_data *data = (screen_sprite_test_data *) d;
|
screen_sprite_test_data *data = (screen_sprite_test_data *) d;
|
||||||
|
|
||||||
const int32_t spd = 5;
|
const int32_t spd = 5;
|
||||||
|
const int32_t rotspd = 5;
|
||||||
|
|
||||||
if(pad_pressing(PAD_UP)) {
|
if(pad_pressing(PAD_UP)) {
|
||||||
data->pos.vy -= spd;
|
data->pos.vy -= spd;
|
||||||
|
@ -76,6 +80,10 @@ screen_sprite_test_update(void *d)
|
||||||
data->play_frames ^= 1;
|
data->play_frames ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(pad_pressed(PAD_TRIANGLE)) {
|
||||||
|
data->flipx ^= 1;
|
||||||
|
}
|
||||||
|
|
||||||
if(pad_pressed(PAD_SELECT)) {
|
if(pad_pressed(PAD_SELECT)) {
|
||||||
scene_change(SCREEN_LEVELSELECT);
|
scene_change(SCREEN_LEVELSELECT);
|
||||||
}
|
}
|
||||||
|
@ -88,14 +96,14 @@ screen_sprite_test_update(void *d)
|
||||||
else if(pad_pressed(PAD_SQUARE)) data->frame--;
|
else if(pad_pressed(PAD_SQUARE)) data->frame--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pad_pressing(PAD_R1)) data->angle += spd;
|
if(pad_pressing(PAD_R1)) data->angle += rotspd;
|
||||||
else if(pad_pressing(PAD_L1)) data->angle -= spd;
|
else if(pad_pressing(PAD_L1)) data->angle -= rotspd;
|
||||||
|
|
||||||
if(data->frame < 0) data->frame = data->chara.numframes - 1;
|
if(data->frame < 0) data->frame = data->chara.numframes - 1;
|
||||||
else if(data->frame >= data->chara.numframes) data->frame = 0;
|
else if(data->frame >= data->chara.numframes) data->frame = 0;
|
||||||
|
|
||||||
if(data->angle < 0) data->angle = ONE - spd;
|
//if(data->angle < 0) data->angle = ONE - spd;
|
||||||
else if(data->angle >= ONE) data->angle = 0;
|
//else if(data->angle >= ONE) data->angle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -117,10 +125,15 @@ screen_sprite_test_draw(void *d)
|
||||||
font_set_color(128, 128, 128);
|
font_set_color(128, 128, 128);
|
||||||
font_draw_sm(buffer, 10, 10);
|
font_draw_sm(buffer, 10, 10);
|
||||||
|
|
||||||
chara_render_frame(&data->chara,
|
/* chara_render_frame(&data->chara, */
|
||||||
data->frame,
|
/* data->frame, */
|
||||||
(int16_t)(data->pos.vx),
|
/* (int16_t)(data->pos.vx), */
|
||||||
(int16_t)(data->pos.vy),
|
/* (int16_t)(data->pos.vy), */
|
||||||
0 // flipx
|
/* data->flipx); */
|
||||||
);
|
chara_draw_gte(&data->chara,
|
||||||
|
data->frame,
|
||||||
|
(int16_t)(data->pos.vx),
|
||||||
|
(int16_t)(data->pos.vy),
|
||||||
|
data->flipx,
|
||||||
|
data->angle);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue