528 lines
18 KiB
C
528 lines
18 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
#include "ml/mtx.h"
|
|
|
|
void func_80252330(f32, f32, f32);
|
|
void func_803382D8(s32 arg0);
|
|
void func_803382E4(s32 arg0);
|
|
void spriteRender_set1Primative(bool boolean);
|
|
void func_803382FC(s32 arg0);
|
|
void func_80338308(s32 arg0, s32 arg1);
|
|
BKSpriteTextureBlock *func_8033EFB0(Struct84s *arg0, s32 arg1);
|
|
|
|
/* .data */
|
|
Gfx D_80370260[] = {
|
|
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
|
|
gsSPSetGeometryMode(G_SHADE | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
|
|
gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
|
|
gsDPSetCycleType(G_CYC_1CYCLE),
|
|
gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2),
|
|
gsSPEndDisplayList()
|
|
};
|
|
|
|
Gfx D_80370290[] = {
|
|
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
|
|
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
|
|
gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
|
|
gsDPSetCycleType(G_CYC_1CYCLE),
|
|
gsDPSetRenderMode(G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2),
|
|
gsSPEndDisplayList()
|
|
};
|
|
|
|
Gfx D_803702C0[] = {
|
|
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
|
|
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
|
|
gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
|
|
gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
|
|
gsDPSetCycleType(G_CYC_1CYCLE),
|
|
gsDPSetAlphaCompare(G_AC_THRESHOLD),
|
|
gsDPSetBlendColor(0x00, 0x00, 0x00, 0x80),
|
|
gsDPSetRenderMode(Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
|
|
gsSPEndDisplayList()
|
|
};
|
|
|
|
|
|
Gfx D_80370308[] = {
|
|
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
|
|
gsSPSetGeometryMode(G_SHADE | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
|
|
gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
|
|
gsDPSetCycleType(G_CYC_2CYCLE),
|
|
gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2),
|
|
gsSPEndDisplayList()
|
|
};
|
|
|
|
u8 D_80370338[4] = {1, 0, 0, 0};
|
|
u8 D_8037033C = 0;
|
|
|
|
/* .bss */
|
|
s32 D_80383610;
|
|
s32 D_80383614;
|
|
s32 D_80383618;
|
|
s32 D_8038361C;
|
|
s32 D_80383620;
|
|
s32 D_80383624;
|
|
s32 D_80383628;
|
|
s32 D_8038362C;
|
|
u32 D_80383630;
|
|
u32 D_80383634;
|
|
u32 D_80383638;
|
|
s32 D_8038363C;
|
|
s32 D_80383640;
|
|
s32 D_80383644;
|
|
|
|
void spriteRender_drawWithSegment(Gfx **gfx, Vtx **vtx, BKSprite *sprite, u32 frame, u32 segment);
|
|
void func_803380F8(Gfx **gfx, Mtx **mtx, f32 arg2[3]);
|
|
void func_803381B4(Gfx **gfx, Mtx **mtx, f32 arg2[3]);
|
|
|
|
/* .code */
|
|
void func_80335D30(Gfx **gfx){
|
|
gDPPipeSync((*gfx)++);
|
|
if (D_80370338[0] == 0) {
|
|
gDPSetColorDither((*gfx)++, G_CD_DISABLE);
|
|
}//L80335D7C
|
|
switch(D_80383634 + 1){
|
|
case 0:
|
|
return;
|
|
|
|
case 15:
|
|
gSPDisplayList((*gfx)++, D_803702C0);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, 0xFF);
|
|
return;
|
|
|
|
case 12:
|
|
gSPDisplayList((*gfx)++, D_80370290);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, 0xFF);
|
|
return;
|
|
|
|
case 10:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineLERP((*gfx)++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, D_8038363C);
|
|
gDPSetEnvColor((*gfx)++, D_80383620, D_80383624, D_80383628, 0xFF);
|
|
return;
|
|
|
|
case 16:
|
|
gSPDisplayList((*gfx)++, D_80370290);
|
|
gDPSetCombineLERP((*gfx)++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, D_8038363C);
|
|
gDPSetEnvColor((*gfx)++, D_80383620, D_80383624, D_80383628, 0xFF);
|
|
return;
|
|
|
|
case 8:
|
|
if (D_8038361C != 0) {
|
|
gSPDisplayList((*gfx)++, D_80370308);
|
|
gDPSetCombineLERP((*gfx)++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, COMBINED, ENVIRONMENT, COMBINED, 0, 0, 0, COMBINED);
|
|
gDPSetEnvColor((*gfx)++, D_8038361C, D_8038361C, D_8038361C, 0xFF);
|
|
} else {
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
}
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, D_8038363C);
|
|
return;
|
|
|
|
case 7:
|
|
if (D_8038361C != 0) {
|
|
gSPDisplayList((*gfx)++, D_80370308);
|
|
gDPSetCombineLERP((*gfx)++, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0, PRIMITIVE, COMBINED, PRIMITIVE_ALPHA, COMBINED, 0, 0, 0, COMBINED);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, D_8038361C);
|
|
} else {
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, 0xFF);
|
|
}
|
|
return;
|
|
|
|
case 6:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, D_8038363C);
|
|
return;
|
|
|
|
case 13:
|
|
gSPDisplayList((*gfx)++, D_80370290);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, D_8038363C);
|
|
return;
|
|
|
|
case 5:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383610, D_80383614, D_80383618, 0xFF);
|
|
return;
|
|
|
|
case 9:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383630, D_80383630, D_80383630, D_8038363C);
|
|
return;
|
|
|
|
case 14:
|
|
gSPDisplayList((*gfx)++, D_80370290);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383630, D_80383630, D_80383630, D_8038363C);
|
|
return;
|
|
|
|
case 1:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383630, D_80383630, D_80383630, 0xFF);
|
|
return;
|
|
|
|
case 2:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineLERP((*gfx)++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, 0, 0, 0, D_8038363C);
|
|
return;
|
|
|
|
case 11:
|
|
gSPDisplayList((*gfx)++, D_80370290);
|
|
gDPSetCombineLERP((*gfx)++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, 0, 0, 0, D_8038363C);
|
|
return;
|
|
|
|
case 4:
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineMode((*gfx)++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, D_80383620, D_80383624, D_80383628, D_8038362C);
|
|
return;
|
|
|
|
default://L80336814
|
|
gSPDisplayList((*gfx)++, D_80370260);
|
|
gDPSetCombineLERP((*gfx)++, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE);
|
|
gDPSetPrimColor((*gfx)++, 0, 0, 0, 0, 0, 0xFF);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void func_8033687C( Gfx **gfx )
|
|
{
|
|
/* Turn off texturing */
|
|
gDPPipeSync((*gfx)++);
|
|
if (D_80370338[0] == 0) {
|
|
gDPSetColorDither((*gfx)++, G_CD_MAGICSQ);
|
|
D_80370338[0] = 1;
|
|
}
|
|
|
|
if(D_80383634 == 0x0E){
|
|
gDPSetAlphaCompare((*gfx)++, G_AC_NONE);
|
|
}
|
|
}
|
|
|
|
void spriteRender_draw(Gfx **gfx, Vtx **vtx, BKSprite *sp, u32 frame){
|
|
spriteRender_drawWithSegment(gfx, vtx, sp, frame, 0);
|
|
}
|
|
|
|
void spriteRender_drawWithSegment(Gfx **gfx, Vtx **vtx, BKSprite *sprite, u32 frame, u32 segment) {
|
|
s32 ix;
|
|
s32 pixel_size_nibbles; //sp1C0
|
|
s32 sp1BC;
|
|
Vtx *var_a3;
|
|
Gfx *sp1B4;
|
|
Vtx *sp1B0;
|
|
u32 palette_mem;
|
|
u8 *tmem;
|
|
BKSpriteTextureBlock *var_t2;
|
|
f32 temp_f0;
|
|
f32 temp_f2;
|
|
Gfx *var_a2;
|
|
s32 temp_a2_2;
|
|
s32 i_vtx;
|
|
BKSpriteFrame *frame_ptr; //sp18c
|
|
s32 var_t1_8;
|
|
Vtx *vtx_start; //sp184
|
|
s32 temp_ra;
|
|
s32 iy;
|
|
|
|
vtx_start = *vtx;
|
|
|
|
//get pize size in nibs
|
|
func_80349AD0();
|
|
if (sprite->type & SPRITE_TYPE_CI4) {
|
|
pixel_size_nibbles = 1;
|
|
} else if (sprite->type & SPRITE_TYPE_CI8) {
|
|
pixel_size_nibbles = 2;
|
|
} else if (sprite->type & SPRITE_TYPE_I8){
|
|
pixel_size_nibbles = 2;
|
|
} else if (sprite->type & SPRITE_TYPE_IA8){
|
|
pixel_size_nibbles = 2;
|
|
} else if (sprite->type & SPRITE_TYPE_RGBA16) {
|
|
pixel_size_nibbles = 4;
|
|
} else if (sprite->type & SPRITE_TYPE_RGBA32){
|
|
pixel_size_nibbles = 8;
|
|
}
|
|
func_80335D30(gfx);
|
|
|
|
//set to 1Prim if using
|
|
if(D_80383638 || (sprite->type & SPRITE_TYPE_CI8)){
|
|
gDPPipelineMode((*gfx)++, G_PM_1PRIMITIVE);
|
|
}
|
|
|
|
frame_ptr = spriteGetFramePtr(sprite, frame);
|
|
|
|
//load palette in indexed pixels
|
|
var_t2 = (BKSpriteTextureBlock *)(frame_ptr + 1);
|
|
if (sprite->type & SPRITE_TYPE_CI4) {
|
|
gDPSetTextureLUT((*gfx)++, G_TT_RGBA16);
|
|
palette_mem = ALIGN(frame_ptr + 1, 8);
|
|
gDPLoadTLUT_pal16((*gfx)++, 0, palette_mem);
|
|
var_t2 = (BKSpriteTextureBlock *)(palette_mem + 0x20);
|
|
} else if (sprite->type & SPRITE_TYPE_CI8) {
|
|
gDPSetTextureLUT((*gfx)++, G_TT_RGBA16);
|
|
palette_mem = ALIGN(frame_ptr + 1, 8);
|
|
gDPLoadTLUT_pal256((*gfx)++, palette_mem);
|
|
var_t2 = (BKSpriteTextureBlock *)(palette_mem + 0x200);
|
|
}
|
|
|
|
//start new vtx seg
|
|
i_vtx = 0;
|
|
var_a3 = *vtx;
|
|
sp1B4 = *gfx;
|
|
sp1B0 = var_a3;
|
|
if(segment != 0){
|
|
gSPVertex((*gfx)++, SEGMENT_ADDR(segment, (s32)sp1B0 - (s32)vtx_start), 0, 0);
|
|
}else{
|
|
gSPVertex((*gfx)++, sp1B0, 0, 0);
|
|
}
|
|
//for each texture (chunk) in frame
|
|
// sp1B4 = sp1B4;
|
|
for(sp1BC = 0; sp1BC < frame_ptr->chunkCnt; sp1BC++){
|
|
temp_ra = var_t2->h;
|
|
tmem = (u8*)ALIGN(var_t2 + 1, 8); //align
|
|
|
|
//load texture block
|
|
if (sprite->type & SPRITE_TYPE_RGBA16) {
|
|
gDPLoadTextureBlock((*gfx)++, tmem, G_IM_FMT_RGBA, G_IM_SIZ_16b, var_t2->w, temp_ra, NULL, 0, 0, 0, 0, 0, 0);
|
|
} else if (sprite->type & SPRITE_TYPE_RGBA32) {
|
|
gDPLoadTextureBlock((*gfx)++, tmem, G_IM_FMT_RGBA, G_IM_SIZ_32b, var_t2->w, temp_ra, NULL, 0, 0, 0, 0, 0, 0);
|
|
} else if (sprite->type & SPRITE_TYPE_CI4) {
|
|
gDPLoadTextureBlock_4b((*gfx)++, tmem, G_IM_FMT_CI, var_t2->w, temp_ra, NULL, 0, 0, 0, 0, 0, 0);
|
|
} else if (sprite->type & SPRITE_TYPE_CI8) {
|
|
gDPLoadTextureBlock((*gfx)++, tmem, G_IM_FMT_CI, G_IM_SIZ_8b, var_t2->w, temp_ra, NULL, 0, 0, 0, 0, 0, 0);
|
|
}else if (sprite->type & SPRITE_TYPE_IA8) {
|
|
gDPLoadTextureBlock((*gfx)++, tmem, G_IM_FMT_CI, G_IM_SIZ_8b, var_t2->w, temp_ra, NULL, 0, 0, 0, 0, 0, 0);
|
|
} else if (sprite->type & SPRITE_TYPE_I8) {
|
|
gDPLoadTextureBlock((*gfx)++, tmem, G_IM_FMT_I, G_IM_SIZ_8b, var_t2->w, temp_ra, NULL, 0, 0, 0, 0, 0, 0);
|
|
}
|
|
|
|
//generate vtx coords for texture
|
|
gSP2Triangles((*gfx)++, i_vtx, i_vtx + 1, i_vtx + 3, i_vtx, i_vtx, i_vtx + 3, i_vtx + 2, i_vtx);
|
|
temp_f0 = ((f32) D_80383640 / (f32) frame_ptr->w);
|
|
temp_f2 = ((f32) D_80383644 / (f32) frame_ptr->h);
|
|
temp_a2_2 = var_t2->x - frame_ptr->unk0;
|
|
var_t1_8 = (frame_ptr->unk2 - var_t2->y);
|
|
for(iy = 0; iy < 2; iy++){
|
|
for(ix = 0; ix < 2; ix++){
|
|
var_a3->v.ob[0] = (s32)((temp_a2_2 + (var_t2->w - 1) * ix) * temp_f0);
|
|
var_a3->v.ob[1] = (s32)((var_t1_8 + -(temp_ra - 1) * iy) * temp_f2);
|
|
var_a3->v.ob[2] = 0;
|
|
var_a3->v.tc[0] = 0x20*(2*var_t2->w * ix - 1);
|
|
var_a3->v.tc[1] = 0x20*(2*temp_ra * (iy^0) - 1);
|
|
*(u32*)&var_a3->v.cn = 0x7F80;
|
|
var_a3++;
|
|
}
|
|
}
|
|
i_vtx += 4;
|
|
//rewrite vtx seg start with correct vtx count
|
|
if (i_vtx == 0x10) {
|
|
i_vtx = 0;
|
|
if(segment != 0){
|
|
gSPVertex(sp1B4, SEGMENT_ADDR(segment, (s32)sp1B0 - (s32)vtx_start), 16, 0);
|
|
}else{
|
|
gSPVertex(sp1B4, sp1B0, 16, 0);
|
|
}
|
|
//start new vtx seg
|
|
sp1B4 = *gfx;
|
|
sp1B0 = var_a3;
|
|
if (segment) {
|
|
gSPVertex((*gfx)++, SEGMENT_ADDR(segment, (s32)sp1B0 - (s32)vtx_start), 0, 0);
|
|
} else {
|
|
gSPVertex((*gfx)++, sp1B0, 0, 0);
|
|
}
|
|
}
|
|
var_t2 = (BKSpriteTextureBlock *)(tmem + ((s32) (var_t2->w * var_t2->h) * pixel_size_nibbles / 2));
|
|
}
|
|
// sp1B4 = reinterpret_cast(Gfx *,sp1B4);
|
|
*vtx = var_a3;
|
|
|
|
|
|
//rewrite vtx seg start with correct vtx count
|
|
if (i_vtx > 0) {
|
|
if(segment != 0){
|
|
gSPVertex(sp1B4, SEGMENT_ADDR(segment, (s32)sp1B0 - (s32)vtx_start), i_vtx, 0);
|
|
}else{
|
|
if(1);
|
|
gSPVertex(sp1B4, sp1B0, i_vtx, 0);
|
|
}
|
|
}
|
|
else {
|
|
//no vtx, overwrite gSPVertex() command;
|
|
*gfx = sp1B4;
|
|
}
|
|
|
|
gDPPipeSync((*gfx)++);
|
|
|
|
//clear palette if used
|
|
if (( sprite->type & SPRITE_TYPE_CI4) || ( sprite->type & SPRITE_TYPE_CI8)) {
|
|
gDPSetTextureLUT((*gfx)++, G_TT_NONE);
|
|
}
|
|
|
|
//restore pipeline to NPrim mode if set to 1Prim
|
|
if ((D_80383638 != 0) || (sprite->type & SPRITE_TYPE_CI8)) {
|
|
gDPPipelineMode((*gfx)++, G_PM_NPRIMITIVE);
|
|
}
|
|
if(sp1B4);
|
|
func_8033687C(gfx);
|
|
}
|
|
|
|
void func_80337B68(Gfx **gfx, Vtx **vtx, Struct84s *texture_list, s32 texture_index) {
|
|
s32 var_s1;
|
|
s32 var_t2;
|
|
s32 var_v1;
|
|
Vtx *start_vtx;
|
|
BKSpriteTextureBlock *txtr_ptr;
|
|
s32 temp_lo;
|
|
s32 var_a0;
|
|
s32 var_a2;
|
|
u16 *tmem;
|
|
s32 i_vtx0;
|
|
s32 size;
|
|
|
|
func_80335D30(gfx);
|
|
txtr_ptr = func_8033EFB0(texture_list, texture_index);
|
|
start_vtx = *vtx;
|
|
temp_lo = (s32) D_80383644 / 3;
|
|
var_a2 = -((f32) txtr_ptr->x / (f32) txtr_ptr->w) * D_80383640;
|
|
var_a0 = ((f32) txtr_ptr->y / (f32) txtr_ptr->h) * D_80383644;
|
|
|
|
for(var_s1 = 0, size = 3; var_s1 < size; var_s1++){
|
|
for(var_t2 = 0; var_t2 < 2; var_t2++){
|
|
for(var_v1 = 0; var_v1 < 2; var_v1++){
|
|
(*vtx)->v.ob[0] = (var_v1 * D_80383640) + var_a2;
|
|
(*vtx)->v.ob[1] = var_a0 - (var_t2*temp_lo) ;
|
|
(*vtx)->v.ob[2] = 0;
|
|
(*vtx)->v.tc[0] = ((txtr_ptr->w - 1) * var_v1) << 6;
|
|
(*vtx)->v.tc[1] = ((0x1A)*var_t2) << 6;
|
|
*(u32*)((*vtx)->v.cn) = 0x7F80;
|
|
(*vtx)++;
|
|
}
|
|
}
|
|
var_a0 -= temp_lo;
|
|
}
|
|
|
|
tmem = (u16*)(txtr_ptr + 1);
|
|
gSPVertex((*gfx)++, start_vtx, 12, 0);
|
|
|
|
i_vtx0 = 0;
|
|
for(var_s1 = 0; var_s1 < size; var_s1++){
|
|
gDPLoadTextureBlock((*gfx)++, tmem , G_IM_FMT_RGBA, G_IM_SIZ_16b, txtr_ptr->w, 0x1A + ((var_s1 < 2) ? 1 : 0) , NULL, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
|
gSP2Triangles((*gfx)++,
|
|
i_vtx0 + 0, i_vtx0 + 1, i_vtx0 + 3, i_vtx0,
|
|
i_vtx0 + 0, i_vtx0 + 3, i_vtx0 + 2, i_vtx0);
|
|
tmem += txtr_ptr->w * 0x1A;
|
|
i_vtx0 += 4;
|
|
}
|
|
func_8033687C(gfx);
|
|
}
|
|
|
|
void func_80338048(Gfx **gfx, Mtx **mtx, Vtx **vtx, f32 arg3[3], Struct84s *arg4, s32 arg5) {
|
|
func_803380F8(gfx, mtx, arg3);
|
|
func_80337B68(gfx, vtx, arg4, arg5);
|
|
gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW);
|
|
}
|
|
|
|
void func_803380A0(Gfx **gfx, Mtx **mtx, Vtx **vtx, f32 arg3[3], Struct84s *arg4, s32 arg5) {
|
|
func_803381B4(gfx, mtx, arg3);
|
|
func_80337B68(gfx, vtx, arg4, arg5);
|
|
gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW);
|
|
}
|
|
|
|
void func_803380F8(Gfx **gfx, Mtx **mtx, f32 arg2[3]) {
|
|
f32 sp2C[3];
|
|
f32 sp20[3];
|
|
|
|
viewport_get_position_vec3f(sp2C);
|
|
sp20[0] = arg2[0] - sp2C[0];
|
|
sp20[1] = arg2[1] - sp2C[1];
|
|
sp20[2] = arg2[2] - sp2C[2];
|
|
mlMtxSet(func_8024DD90());
|
|
func_80252330(sp20[0], sp20[1], sp20[2]);
|
|
mlMtxApply(*mtx);
|
|
gSPMatrix((*gfx)++, (*mtx)++, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
}
|
|
|
|
void func_803381B4(Gfx **gfx, Mtx **mtx, f32 arg2[3]) {
|
|
f32 sp2C[3];
|
|
f32 sp20[3];
|
|
|
|
viewport_get_position_vec3f(sp2C);
|
|
sp20[0] = arg2[0] - sp2C[0];
|
|
sp20[1] = arg2[1] - sp2C[1];
|
|
sp20[2] = arg2[2] - sp2C[2];
|
|
mlMtxSet(func_8024DD9C());
|
|
func_80252330(sp20[0], sp20[1], sp20[2]);
|
|
mlMtxApply(*mtx);
|
|
gSPMatrix((*gfx)++, (*mtx)++, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
}
|
|
|
|
void func_80338270(){
|
|
func_803382D8(0xFF);
|
|
func_803382E4(0);
|
|
spriteRender_set1Primative(0);
|
|
func_803382FC(0xFF);
|
|
func_80338308(100, 100);
|
|
|
|
}
|
|
|
|
void func_803382B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3){
|
|
D_80383620 = arg0;
|
|
D_80383624 = arg1;
|
|
D_80383628 = arg2;
|
|
D_8038362C = arg3;
|
|
}
|
|
|
|
void func_803382D8(s32 arg0){
|
|
D_80383630 = arg0;
|
|
}
|
|
|
|
void func_803382E4(s32 arg0){
|
|
D_80383634 = arg0;
|
|
}
|
|
|
|
void spriteRender_set1Primative(bool boolean){
|
|
D_80383638 = boolean;
|
|
}
|
|
|
|
void func_803382FC(s32 arg0){
|
|
D_8038363C = arg0;
|
|
}
|
|
|
|
void func_80338308(s32 arg0, s32 arg1){
|
|
D_80383640 = arg0;
|
|
D_80383644 = arg1;
|
|
}
|
|
|
|
void func_8033831C(s32 *arg0, s32 *arg1){
|
|
*arg0 = D_80383640;
|
|
*arg1 = D_80383644;
|
|
}
|
|
|
|
void func_80338338(s32 r, s32 g, s32 b){
|
|
D_80383610 = r;
|
|
D_80383614 = g;
|
|
D_80383618 = b;
|
|
}
|
|
|
|
void func_80338354(s32 arg0){
|
|
D_8038361C = arg0 / 8 ;
|
|
}
|
|
|
|
void func_80338370(void){
|
|
D_80370338[0] = 0;
|
|
}
|
|
|
|
void func_8033837C(s32 arg0){
|
|
D_8037033C = arg0;
|
|
}
|