Shipwright/soh/soh/Enhancements/gfx.c

64 lines
1.8 KiB
C

#include "gfx.h"
#include "global.h"
#include "z64.h"
extern GlobalContext* gGlobalCtx;
/**
* Simple wrapper to load a texture to be drawn.
*/
void sprite_load(sprite_t* sprite) {
OPEN_DISPS(gGlobalCtx->state.gfxCtx);
if (sprite->im_siz == G_IM_SIZ_16b) {
gDPLoadTextureBlock(
OVERLAY_DISP++,
sprite->tex,
sprite->im_fmt,
G_IM_SIZ_16b, // @TEMP until I figure out how to use sprite->im_siz
sprite->width, sprite->height,
0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD
);
} else {
gDPLoadTextureBlock(
OVERLAY_DISP++,
sprite->tex,
sprite->im_fmt,
G_IM_SIZ_32b, // @TEMP until I figure out how to use sprite->im_siz
sprite->width, sprite->height,
0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD
);
}
CLOSE_DISPS(gGlobalCtx->state.gfxCtx);
}
/**
* Simple wrapper to draw a sprite/texture on the screen.
* sprite_load needs to be ran right before this.
*/
void sprite_draw(sprite_t* sprite, int left, int top, int width, int height) {
int width_factor = (1 << 10) * sprite->width / width;
int height_factor = (1 << 10) * sprite->height / height;
OPEN_DISPS(gGlobalCtx->state.gfxCtx);
gSPWideTextureRectangle(
OVERLAY_DISP++,
OTRGetRectDimensionFromRightEdge(left) << 2, top << 2,
(OTRGetRectDimensionFromRightEdge(left) + width) << 2, (top + height) << 2,
G_TX_RENDERTILE,
0, 0,
width_factor, height_factor
);
CLOSE_DISPS(gGlobalCtx->state.gfxCtx);
}