708 lines
22 KiB
C
708 lines
22 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
|
|
#define IA8_I(ia) ((ia) >> 4)
|
|
#define IA8_A(ia) ((ia) & 0xF)
|
|
#define I4_2_RGBA16(i,a) ((i << 12) | (i << 7) | (i << 2) | (a))
|
|
|
|
void func_8024A3C8(s32 x, s32 y);
|
|
void draw_prim_rect(s32 x, s32 y, s32 w, s32 h);
|
|
void set_prim_color(s32 r, s32 g, s32 b);
|
|
void func_8024A85C(s32 buffer_indx);
|
|
|
|
|
|
extern u16 D_803A5D00[2][0xF660]; //framebuffer
|
|
extern s32 D_80276588; //framebuffer width
|
|
extern s32 D_8027658C; //framebuffer height
|
|
|
|
/* .bss */
|
|
s32 D_802806E0;
|
|
s32 D_802806E4;
|
|
s32 D_802806E8;
|
|
s32 D_802806EC;
|
|
|
|
void draw_sprite_ci4(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled)
|
|
{
|
|
BKSpriteFrame *sprite_frame;
|
|
s32 palette_offset;
|
|
u16 *palette;
|
|
s32 fb_y;
|
|
s32 fb_x;
|
|
s32 iy;
|
|
s32 i_chunk;
|
|
s32 ix;
|
|
u8 *tmem;
|
|
BKSpriteTextureBlock *chunk;
|
|
u16 *pxl_ptr;
|
|
u16 *framebuffer;
|
|
s32 indx1;
|
|
s32 indx2;
|
|
s32 color1;
|
|
s32 color2;
|
|
|
|
framebuffer = D_803A5D00[D_802806EC];
|
|
sprite_frame = spriteGetFramePtr(sprite, (u32) frame);
|
|
if (!alpha_enabled){
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
|
|
}
|
|
|
|
//align palette
|
|
for(palette_offset = (s32) (sprite_frame + 1); palette_offset % 8; palette_offset++){
|
|
continue;
|
|
}
|
|
palette = (u16*)palette_offset;
|
|
|
|
chunk = (BKSpriteTextureBlock *) (palette + 16);
|
|
for (i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) {
|
|
//align texture
|
|
tmem = (u8 *) (chunk + 1);
|
|
while (((s32) tmem) % 8)
|
|
{
|
|
tmem = ((s32) tmem) + 1;
|
|
}
|
|
|
|
//copy texture to framebuffer
|
|
for (iy = 0; iy < chunk->h; iy++) {
|
|
for (ix = 0; ix < chunk->w; ix += 2) {
|
|
indx1 = ((*tmem) >> 4) & 0xF;
|
|
indx2 = *tmem & 0xF;
|
|
fb_x = (chunk->x + x) + ix;
|
|
if ((0 <= fb_x) && (fb_x < D_80276588))
|
|
{
|
|
fb_y = (chunk->y + y) + iy;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C))
|
|
{
|
|
pxl_ptr = (framebuffer + fb_x) + (fb_y * D_80276588);
|
|
color1 = palette[indx1];
|
|
if (color1 & 1) {
|
|
*pxl_ptr = color1;
|
|
} else if (!alpha_enabled) {
|
|
*pxl_ptr = (unsigned long) 1;
|
|
palette_offset = (u16 *) (sprite_frame + 1); //THIS IS GARBAGE for correct reg alloc
|
|
}
|
|
if (palette[indx2] & 1) {
|
|
pxl_ptr[1] = palette[indx2];
|
|
} else if (!alpha_enabled) {
|
|
pxl_ptr[1] = 1;
|
|
}
|
|
}
|
|
}
|
|
tmem++;
|
|
}
|
|
}
|
|
chunk = (BKSpriteTextureBlock *) tmem;
|
|
}
|
|
}
|
|
|
|
void draw_sprite_ci8(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled)
|
|
{
|
|
static s32 D_80275C00 = 0;
|
|
u16 *palette;
|
|
s32 fb_y;
|
|
s32 fb_x;
|
|
s32 iy;
|
|
s32 i_chunk;
|
|
s32 ix;
|
|
u8 *tmem;
|
|
BKSpriteTextureBlock *chunk;
|
|
u16 *pxl_ptr;
|
|
int new_var;
|
|
BKSpriteFrame *sprite_frame;
|
|
u16 *framebuffer;
|
|
s32 indx;
|
|
s32 palette_unaligned;
|
|
D_80275C00++;
|
|
if (D_80275C00 == 0xA) {
|
|
D_80275C00 = 0;
|
|
}
|
|
framebuffer = D_803A5D00[D_802806EC];
|
|
sprite_frame = spriteGetFramePtr(sprite, (u32) frame);
|
|
if (!alpha_enabled){
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
|
|
}
|
|
|
|
palette = (u16 *) (sprite_frame + 1);
|
|
for (palette_unaligned = palette; ((s32) palette_unaligned) % 8; palette_unaligned++){
|
|
;
|
|
}
|
|
palette = palette_unaligned;
|
|
|
|
chunk = (BKSpriteTextureBlock *) (palette + 0x100);
|
|
for (i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++){
|
|
palette_unaligned = (u16 *) (chunk + 1);
|
|
for (tmem = (u16 *) (chunk + 1); ((s32) tmem) % 8; tmem++){
|
|
;
|
|
}
|
|
|
|
for (iy = 0; iy < chunk->h; iy++){
|
|
for (ix = 0; ix < chunk->w; ix++){
|
|
fb_x = (chunk->x + x) + ix;
|
|
if ((0 <= fb_x) && (fb_x < D_80276588))
|
|
{
|
|
fb_y = (chunk->y + y) + iy;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C))
|
|
{
|
|
pxl_ptr = (framebuffer + fb_x) + (fb_y * D_80276588);
|
|
if (palette[*tmem] & 1){
|
|
*pxl_ptr = palette[*tmem];
|
|
}
|
|
else if (!alpha_enabled)
|
|
{
|
|
if (palette[*tmem] & 0xFFFE){
|
|
*pxl_ptr = (D_80275C00 < 5) ? (0xFFFF) : (palette[*tmem] | 1);
|
|
}
|
|
else{
|
|
*pxl_ptr = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
tmem++;
|
|
}
|
|
|
|
}
|
|
|
|
chunk = (BKSpriteTextureBlock *) tmem;
|
|
}
|
|
|
|
}
|
|
|
|
void draw_sprite_rgba16(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) {
|
|
BKSpriteFrame *sprite_ptr;
|
|
BKSpriteTextureBlock *chunk_ptr;
|
|
s16 *tmem;
|
|
u16 *framebuffer_ptr;
|
|
s32 fb_x;
|
|
s32 fb_y;
|
|
s32 i_chunk;
|
|
s32 txtr_x;
|
|
s32 txtr_y;
|
|
u16 *pxl_ptr;
|
|
u16 rgba;
|
|
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
|
|
sprite_ptr = spriteGetFramePtr(sprite, frame);
|
|
if (!alpha_enabled) {
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, sprite_ptr->w, sprite_ptr->h);
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *)(sprite_ptr + 1);
|
|
for(i_chunk = 0; i_chunk < sprite_ptr->chunkCnt; i_chunk++) {
|
|
for(tmem = (u16 *)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
|
|
|
|
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
|
|
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++) {
|
|
fb_x = chunk_ptr->x + x + txtr_x;
|
|
if ((fb_x >= 0) && (fb_x < D_80276588)) {
|
|
fb_y = chunk_ptr->y + y + txtr_y;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
|
|
pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);
|
|
rgba = *tmem;
|
|
if (rgba & 1) {
|
|
*pxl_ptr = rgba;
|
|
} else if (!alpha_enabled) {
|
|
*pxl_ptr = rgba | 1;
|
|
}
|
|
}
|
|
}
|
|
tmem++;
|
|
}
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *) tmem;
|
|
}
|
|
}
|
|
|
|
void draw_sprite_i4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) {
|
|
BKSpriteFrame *frame_ptr;
|
|
BKSpriteTextureBlock *chunk_ptr;
|
|
s16 *temp_v0;
|
|
u8 *tmem;
|
|
s32 fb_x;
|
|
s32 fb_y;
|
|
s32 p1;
|
|
s32 p2;
|
|
u16 *framebuffer_ptr;
|
|
s32 txtr_y;
|
|
s32 i_chunk;
|
|
s32 txtr_x;
|
|
u16 *fb_pxl_ptr;
|
|
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
|
|
frame_ptr = spriteGetFramePtr(sprite, frame);
|
|
if (!aplha_enabled) {
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
|
|
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) {
|
|
for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
|
|
|
|
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
|
|
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) {
|
|
fb_x = chunk_ptr->x + x + txtr_x;
|
|
if ((fb_x >= 0) && (fb_x < D_80276588)) {
|
|
fb_y = chunk_ptr->y + y + txtr_y;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
|
|
p1 = (*tmem >> 4);
|
|
p2 = (*tmem & 0xF);
|
|
fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);
|
|
if (p1) {
|
|
*fb_pxl_ptr = (p1 << 0xC) | (p1 << 0x7) | (p1 << 0x2) | 1;
|
|
} else if (!aplha_enabled) {
|
|
*fb_pxl_ptr = 1;
|
|
}
|
|
if (p2) {
|
|
*(fb_pxl_ptr + 1) = (p2 << 0xC) | (p2 << 7) | (p2 << 2) | 1;
|
|
} else if (!aplha_enabled) {
|
|
*(fb_pxl_ptr + 1) = 1;
|
|
}
|
|
}
|
|
}
|
|
tmem++;
|
|
}
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *) tmem;
|
|
}
|
|
}
|
|
|
|
void draw_sprite_ia4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) {
|
|
BKSpriteFrame *frame_ptr;
|
|
BKSpriteTextureBlock *chunk_ptr;
|
|
s16 *temp_v0;
|
|
u8 *tmem;
|
|
s32 fb_x;
|
|
s32 fb_y;
|
|
s32 p1;
|
|
s32 p2;
|
|
u16 *framebuffer_ptr;
|
|
u32 p1_i;
|
|
u32 p1_a;
|
|
u32 p2_i;
|
|
u32 p2_a;
|
|
s32 txtr_y;
|
|
s32 i_chunk;
|
|
s32 txtr_x;
|
|
u16 *fb_pxl_ptr;
|
|
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
|
|
frame_ptr = spriteGetFramePtr(sprite, frame);
|
|
if (!aplha_enabled) {
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
|
|
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) {
|
|
for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
|
|
|
|
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
|
|
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) {
|
|
fb_x = chunk_ptr->x + x + txtr_x;
|
|
if ((fb_x >= 0) && (fb_x < D_80276588)) {
|
|
fb_y = chunk_ptr->y + y + txtr_y;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
|
|
fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);\
|
|
p1 = (*tmem >> 4);
|
|
p2 = (*tmem & 0xF);
|
|
p1_i = p1 & 0xE;
|
|
p1_a = p1 & 1;
|
|
p2_i = p2 & 0xE;
|
|
p2_a = p2 & 1;
|
|
if (p1_a) { \
|
|
*fb_pxl_ptr = ((p1_i << 0xC) | (p1_i << 0x7) | (p1_i << 0x2)) | p1_a;
|
|
} else if (!aplha_enabled) {
|
|
*fb_pxl_ptr = 1;
|
|
}
|
|
if (p2_a) {\
|
|
*(fb_pxl_ptr + 1) = (p2_i << 0xC) | (p2_i << 7) | (p2_i << 2) | p2_a;
|
|
} else if (!aplha_enabled) {
|
|
*(fb_pxl_ptr + 1) = 1;
|
|
}
|
|
}
|
|
}
|
|
tmem++;
|
|
}
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *) tmem;
|
|
}
|
|
}
|
|
|
|
void draw_sprite_i8(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
|
|
BKSpriteFrame *frame_ptr;
|
|
BKSpriteTextureBlock *chunk_ptr;
|
|
s16 *pixel_ptr;
|
|
u8 *txtr_ptr;
|
|
s32 fb_y;
|
|
u16 *framebuffer_ptr;
|
|
s32 intensity;
|
|
s32 fb_x;
|
|
s32 txtr_x;
|
|
s32 i_chunk;
|
|
s32 txtr_y;
|
|
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
|
|
frame_ptr = spriteGetFramePtr(sprite, frame);
|
|
if (!alpha_enabled) {
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
|
|
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++){
|
|
//align
|
|
for(txtr_ptr = (u8*)(chunk_ptr + 1); (s32)txtr_ptr % 8; txtr_ptr++);
|
|
|
|
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++){
|
|
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++){
|
|
fb_x = chunk_ptr->x + x + txtr_x;
|
|
if (fb_x >= 0) {
|
|
if (fb_x < D_80276588) {
|
|
fb_y = chunk_ptr->y + y + txtr_y;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
|
|
pixel_ptr = framebuffer_ptr + fb_x + fb_y * D_80276588;
|
|
intensity = (s32) *txtr_ptr >> 3;
|
|
if (intensity != 0) {
|
|
*pixel_ptr = (intensity << 0xB) | (intensity << 6) | (intensity << 1) | 1;
|
|
} else if (!alpha_enabled) {
|
|
*pixel_ptr = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
txtr_ptr += 1;
|
|
}
|
|
}
|
|
chunk_ptr = (BKSpriteFrame *) txtr_ptr;
|
|
}
|
|
}
|
|
|
|
void draw_sprite_ia8(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) {
|
|
BKSpriteFrame *sprite_frame;
|
|
BKSpriteTextureBlock *chunk_ptr;
|
|
s16 *temp_a1;
|
|
s16 *temp_v0;
|
|
u8 *var_t2;
|
|
u16 *framebuffer_ptr;
|
|
s32 fb_x;
|
|
s32 fb_y;
|
|
s32 var_a3;
|
|
s32 i_chunk;
|
|
s32 var_t3;
|
|
u32 temp_a2;
|
|
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
|
|
sprite_frame = spriteGetFramePtr(sprite, frame);
|
|
if (!alpha_enabled) {
|
|
//draw blue rect over display area
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1);
|
|
for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) {
|
|
for(var_t2 = (u8*)(chunk_ptr + 1); (s32)var_t2 % 8; var_t2++);//align
|
|
|
|
for(var_t3 = 0; var_t3 < chunk_ptr->h; var_t3++){
|
|
for(var_a3 = 0; var_a3 < chunk_ptr->w; var_a3++) {
|
|
fb_x = chunk_ptr->x + x + var_a3;
|
|
if ((fb_x >= 0) && (fb_x < D_80276588)) {
|
|
fb_y = chunk_ptr->y + y + var_t3;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
|
|
temp_a1 = framebuffer_ptr + fb_x + fb_y * D_80276588;
|
|
temp_a2 = *var_t2;
|
|
if (IA8_A(temp_a2)) {
|
|
*temp_a1 = I4_2_RGBA16(IA8_I(temp_a2), 1);
|
|
} else if (!alpha_enabled) {
|
|
*temp_a1 = 1;
|
|
}
|
|
}
|
|
}
|
|
var_t2++;
|
|
}
|
|
}
|
|
chunk_ptr = (BKSpriteFrame *) var_t2;
|
|
}
|
|
}
|
|
|
|
void draw_sprite_rgba32(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled){
|
|
BKSpriteTextureBlock *chunk_ptr;
|
|
u32 *tmem;
|
|
u32 fb_value;
|
|
s16 var_v1;
|
|
s32 fb_x;
|
|
s32 fb_y;
|
|
u16 *framebuffer;
|
|
s32 temp_t1;
|
|
s32 alpha;
|
|
s32 i_chunk;
|
|
s32 iy;
|
|
s32 ix;
|
|
u16 *pxl_ptr;
|
|
BKSpriteFrame *sprite_frame;
|
|
u16 p1_a;
|
|
u32 txtr_value;
|
|
s32 red8;
|
|
s32 green8;
|
|
s32 blue8;
|
|
|
|
|
|
framebuffer = &D_803A5D00[D_802806EC][0];
|
|
sprite_frame = spriteGetFramePtr(sprite, frame);
|
|
if (!alpha_enabled) {
|
|
set_prim_color(0, 0, 0x80);
|
|
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
|
|
}
|
|
chunk_ptr = (BKSpriteTextureBlock *) (sprite_frame + 1);
|
|
for (i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) {
|
|
if( (((chunk_ptr->x >= (-5)) && (chunk_ptr->x < 0x29))
|
|
&& (chunk_ptr->y >= (-5))) && (chunk_ptr->y < 0x29)
|
|
) {
|
|
tmem = (u32 *) (1 + chunk_ptr);
|
|
while (((s32) tmem) % 8)
|
|
{
|
|
tmem++;
|
|
}
|
|
|
|
for (iy = 0; iy < chunk_ptr->h; iy++)
|
|
{
|
|
for (ix = 0; ix < chunk_ptr->w; ix++)
|
|
{
|
|
fb_x = (chunk_ptr->x + x) + ix;
|
|
if ((fb_x >= 0) && (fb_x < D_80276588))
|
|
{
|
|
fb_y = (chunk_ptr->y + y) + iy;
|
|
if ((fb_y >= 0) && (fb_y < D_8027658C))
|
|
{
|
|
txtr_value = *tmem;
|
|
pxl_ptr = (framebuffer + fb_x) + (fb_y * D_80276588);
|
|
fb_value = (unsigned int) (*pxl_ptr);
|
|
alpha = _SHIFTR(txtr_value, 0, 8);
|
|
if (alpha) {//blend texture with existing pixel color
|
|
red8 = ((_SHIFTR(txtr_value, 24, 8) * alpha) + (((((fb_value >> 11) )) *8) * (0xFF - alpha))) / 0xFF;
|
|
green8 = ((_SHIFTR(txtr_value, 16, 8) * alpha) + ((_SHIFTR(fb_value, 6, 5) * 8) * (0xFF - alpha))) / 0xFF;
|
|
blue8 = ((_SHIFTR(txtr_value, 8, 8) * alpha) + ((_SHIFTR(fb_value, 1, 5) * 8) * (0xFF - alpha))) / 0xFF;
|
|
|
|
*pxl_ptr = ((_SHIFTL((red8 >> 3), 11, 5) | _SHIFTL((green8 >> 3), 6, 5)) | _SHIFTL((blue8 >> 3), 1, 5)) | 1;
|
|
}
|
|
else if (!alpha_enabled) {
|
|
*pxl_ptr = 0x0001;
|
|
}
|
|
}
|
|
}
|
|
tmem++;
|
|
}
|
|
|
|
}
|
|
chunk_ptr = (BKSpriteFrame *) tmem;
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_802499BC(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in
|
|
}
|
|
|
|
void func_802499D0(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in
|
|
}
|
|
|
|
void draw_texture_ci4(s32 x, s32 y, void *tmem, s32 w, s32 h, bool alpha_enabled){
|
|
s32 ix;
|
|
s32 iy;
|
|
s32 icolor;
|
|
u16 *framebuffer_ptr;
|
|
u16 *palette_ptr;
|
|
u8 *pixel_ptr;
|
|
|
|
palette_ptr = (u16*)tmem;
|
|
pixel_ptr = (u8*)&palette_ptr[0x10];
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][x + y * D_80276588];
|
|
for(iy = 0; iy < h; iy++){
|
|
for(ix = 0; ix < w; ix++){
|
|
icolor = (ix & 1)? pixel_ptr[ix/2 + (iy*w)/2] & 0xF
|
|
: pixel_ptr[ix/2 + (iy*w)/2] >> 4;
|
|
*framebuffer_ptr = palette_ptr[icolor];
|
|
framebuffer_ptr++;
|
|
}
|
|
framebuffer_ptr += (D_80276588 - w);
|
|
}
|
|
}
|
|
|
|
void func_80249CEC(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
|
|
s16 temp_v0;
|
|
|
|
temp_v0 = sprite->type;
|
|
if (temp_v0 & SPRITE_TYPE_I4) {
|
|
draw_sprite_i4(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_IA4) {
|
|
draw_sprite_ia4(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_I8) {
|
|
draw_sprite_i8(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_IA8) {
|
|
draw_sprite_ia8(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_RGBA16) {
|
|
draw_sprite_rgba16(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_RGBA32) {
|
|
draw_sprite_rgba32(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_CI4) {
|
|
draw_sprite_ci4(x, y, sprite, frame, alpha_enabled);
|
|
} else if (temp_v0 & SPRITE_TYPE_CI8) {
|
|
draw_sprite_ci8(x, y, sprite, frame, alpha_enabled);
|
|
}
|
|
}
|
|
|
|
//arg4 = alpha enabled?
|
|
void func_80249DE0(s32 x, s32 y, s16 *arg2, s32 arg3, s32 arg4) {
|
|
s32 ix;
|
|
s32 var_t2;
|
|
s32 iy;
|
|
u16 *framebuffer_ptr;
|
|
u16 *texture_ptr;
|
|
u16 temp_v1;
|
|
BKSpriteTextureBlock *temp_v0;
|
|
|
|
temp_v0 = func_8033EFB0(arg2, arg3);
|
|
texture_ptr = (u16*)(temp_v0 + 1);
|
|
if (*arg2 == SPRITE_TYPE_CI4) {
|
|
draw_texture_ci4(x, y, temp_v0 + 1, temp_v0->w, temp_v0->h, arg4);
|
|
return;
|
|
}
|
|
//otherwise RGBA16
|
|
framebuffer_ptr = &D_803A5D00[D_802806EC][x + y*D_80276588];
|
|
for(iy = 0; iy < temp_v0->h; iy++){
|
|
for(ix = 0; ix < temp_v0->w; ix++){
|
|
temp_v1 = *texture_ptr;
|
|
if (temp_v1 & 1) { //if visible
|
|
*framebuffer_ptr = temp_v1;
|
|
} else if (arg4 == 0) {
|
|
*framebuffer_ptr = 1;
|
|
}
|
|
texture_ptr++;
|
|
framebuffer_ptr++;
|
|
}
|
|
framebuffer_ptr += (D_80276588 - temp_v0->w);
|
|
}
|
|
}
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_ABB0/func_80249F34.s")
|
|
|
|
//fill framebuffer with vert and horz lines
|
|
void func_8024A284(s32 x, s32 y, s32 arg2, s32 arg3, s32 horz_spacing, s32 vert_spacing) {
|
|
s32 var_s2;
|
|
s32 var_s3;
|
|
|
|
for(var_s2 = 0; var_s2 < D_80276588; var_s2 += horz_spacing){
|
|
for(var_s3 = 0; var_s3 < D_8027658C; var_s3++){
|
|
func_8024A3C8(x + var_s2, y + var_s3);
|
|
|
|
}
|
|
}
|
|
for(var_s3 = 0; var_s3 < D_8027658C; var_s3 += vert_spacing) {
|
|
for(var_s2 = 0; var_s2 < D_80276588; var_s2++){
|
|
func_8024A3C8(x + var_s2, y + var_s3);
|
|
}
|
|
}
|
|
}
|
|
|
|
//fills in pixel in frame buffer with D_802806E0 color
|
|
void func_8024A3C8(s32 x, s32 y) {
|
|
s32 temp_v0;
|
|
|
|
if (x >= 0) {
|
|
if ((x < D_80276588) && (y >= 0) && (y < D_8027658C)) {
|
|
D_803A5D00[D_802806EC][x + y * D_80276588] = _SHIFTL(D_802806E0 >> 3, 11, 5) | _SHIFTL(D_802806E4 >> 3, 6, 5) | _SHIFTL(D_802806E8 >> 3, 1, 5) | _SHIFTL(1, 0, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//draw rectangular outline
|
|
void func_8024A490(s32 x, s32 y, s32 w, s32 h) {
|
|
s32 var_s1;
|
|
|
|
for(var_s1 = 0; var_s1 < w; var_s1++){
|
|
func_8024A3C8(x + var_s1, y);
|
|
func_8024A3C8(x + var_s1, y + h - 1);
|
|
}
|
|
for(var_s1 = 1; var_s1 < h - 1; var_s1++){
|
|
func_8024A3C8(x, y + var_s1);
|
|
func_8024A3C8(x + w - 1, y + var_s1);
|
|
}
|
|
}
|
|
|
|
void func_8024A564(s32 x, s32 y, u16 *arg2, s32 arg3, s32 arg4, f32 arg5, f32 arg6)
|
|
{
|
|
s32 temp_a2;
|
|
s32 temp_a2_2;
|
|
s32 temp_a2_3;
|
|
s32 temp_f6;
|
|
s32 temp_f6_2;
|
|
s32 temp_lo;
|
|
s32 temp_t5;
|
|
s32 var_a0;
|
|
s32 var_a2;
|
|
s32 new_var;
|
|
f32 new_var3;
|
|
s32 new_var2;
|
|
s32 var_t1;
|
|
s32 var_t3;
|
|
s32 var_v0;
|
|
s32 var_v1;
|
|
u16 temp_t8;
|
|
s16 *var_t0;
|
|
s16 *var_t2;
|
|
var_v0 = 0;
|
|
var_v1 = D_80276588;
|
|
var_t0 = &D_803A5D00[D_802806EC][x + (y * D_80276588)];
|
|
new_var = (s32) (((f64) (256.0f / (new_var3 = arg6))) + 0.5);
|
|
new_var2 = (s32) (((f64) (256.0f / arg5)) + 0.5);
|
|
for (var_t1 = (arg4 * arg6) + 0.5; var_t1 != 0; var_t1--)
|
|
{
|
|
temp_lo = (arg3 * arg5) + 0.5;
|
|
var_a2 = ((var_v0 >> 8) * arg3) << 8;
|
|
var_t2 = var_t0;
|
|
for (var_t3 = temp_lo; var_t3 != 0; var_t3--)
|
|
{
|
|
*var_t2 = arg2[var_a2 >> 8];
|
|
var_a2 += new_var2;
|
|
var_t2++;
|
|
}
|
|
|
|
var_t0 += D_80276588;
|
|
var_v0 += new_var;
|
|
}
|
|
|
|
}
|
|
|
|
//fills in rectangle in frame buffer with D_802806E0 color
|
|
void draw_prim_rect(s32 x, s32 y, s32 w, s32 h) {
|
|
s32 var_s0;
|
|
s32 var_s1;
|
|
s32 var_s4;
|
|
|
|
var_s4 = 0;
|
|
for(var_s4 = 0; var_s4 < w; var_s4++) {
|
|
for(var_s0 = 0; var_s0 < h; var_s0++){
|
|
func_8024A3C8(x + var_s4, y + var_s0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_8024A810(void){
|
|
set_prim_color(0, 0x80, 0);
|
|
func_8024A85C(0);
|
|
}
|
|
|
|
void set_prim_color(s32 r, s32 g, s32 b){
|
|
D_802806E0 = r;
|
|
D_802806E4 = g;
|
|
D_802806E8 = b;
|
|
}
|
|
|
|
void func_8024A85C(s32 buffer_indx){
|
|
D_802806EC = buffer_indx;
|
|
}
|
|
|
|
s32 func_8024A868(void){
|
|
return D_802806EC;
|
|
}
|