dsgmLib/source/DSGM_sprite.c
2015-02-02 18:23:45 +00:00

211 lines
7.4 KiB
C

#include "DSGM.h"
/*
oam->oamMemory[id].shape = SPRITE_SIZE_SHAPE(size);
oam->oamMemory[id].size = SPRITE_SIZE_SIZE(size);
oam->oamMemory[id].x = x;
oam->oamMemory[id].y = y;
oam->oamMemory[id].palette = palette_alpha;
oam->oamMemory[id].priority = priority;
oam->oamMemory[id].hFlip = hflip;
oam->oamMemory[id].vFlip = vflip;
oam->oamMemory[id].isMosaic = mosaic;
oam->oamMemory[id].gfxIndex = oamGfxPtrToOffset(oam, gfxOffset);
*/
int DSGM_nextFreeSprite[2] = { 0, 0 };
int DSGM_rotsetTracker[2][32];
int DSGM_rotations[2][32] = { { 0 }, { 0 } };
DSGM_Scale DSGM_scales[2][32] = { { [0 ... 31] = { 1 << 8, 1 << 8 } }, { [0 ... 31] = { 1 << 8, 1 << 8 } } };
const DSGM_Size DSGM_Sizes[3][4] = {{{8, 8}, {16, 16}, {32, 32}, {64, 64}}, {{16, 8}, {32, 8}, {32, 16}, {64, 32}}, {{8, 16}, {8, 32}, {16, 32}, {32, 64}}};
inline int DSGM_NextFreeSpriteNumber(u8 screen) {
return DSGM_nextFreeSprite[screen]++;
}
inline int DSGM_NextFreeRotset(u8 screen) {
int i;
for(i = 0; i < 32; i++) {
if(DSGM_rotsetTracker[screen][i] == 0) {
return i;
}
}
return 0;
}
inline int DSGM_GetSpriteWidth(DSGM_Sprite *sprite) {
switch(sprite->size) {
case SpriteSize_8x8: return 8;
case SpriteSize_16x16: return 16;
case SpriteSize_32x32: return 32;
case SpriteSize_64x64: return 64;
case SpriteSize_16x8: return 16;
case SpriteSize_32x8: return 32;
case SpriteSize_32x16: return 32;
case SpriteSize_64x32: return 64;
case SpriteSize_8x16: return 8;
case SpriteSize_8x32: return 8;
case SpriteSize_16x32: return 16;
case SpriteSize_32x64: return 32;
default: return 0;
}
//u16 atr0 = SPRITE_SIZE_SHAPE(sprite->size);
//u16 atr1 = SPRITE_SIZE_SIZE(sprite->size);
//return DSGM_Sizes[atr0][atr1].width;
}
inline int DSGM_GetSpriteHeight(DSGM_Sprite *sprite) {
switch(sprite->size) {
case SpriteSize_8x8: return 8;
case SpriteSize_16x16: return 16;
case SpriteSize_32x32: return 32;
case SpriteSize_64x64: return 64;
case SpriteSize_16x8: return 8;
case SpriteSize_32x8: return 8;
case SpriteSize_32x16: return 16;
case SpriteSize_64x32: return 32;
case SpriteSize_8x16: return 16;
case SpriteSize_8x32: return 32;
case SpriteSize_16x32: return 32;
case SpriteSize_32x64: return 64;
default: return 0;
}
//u16 atr0 = SPRITE_SIZE_SHAPE(sprite->size);
//u16 atr1 = SPRITE_SIZE_SIZE(sprite->size);
//return DSGM_Sizes[atr0][atr1].height;
}
inline bool DSGM_SpriteIsNitro(DSGM_Sprite *sprite) {
return !sprite->tiles;
}
inline bool DSGM_SpriteLoaded(u8 screen, DSGM_Sprite *sprite) {
if(screen == DSGM_TOP) return sprite->topTiles != NULL;
else return sprite->bottomTiles != NULL;
}
void DSGM_ResetSprites(DSGM_Sprite *sprites, int spriteCount) {
int i, j;
for(i = 0; i < spriteCount; i++) {
if(sprites[i].topTiles) {
for(j = 0; j < sprites[i].frames; j++) {
oamFreeGfx(&oamMain, sprites[i].topTiles[j]);
sprites[i].topTiles[j] = NULL;
}
free(sprites[i].topTiles);
sprites[i].topTiles = NULL;
}
if(sprites[i].bottomTiles) {
for(j = 0; j < sprites[i].frames; j++) {
oamFreeGfx(&oamSub, sprites[i].bottomTiles[j]);
sprites[i].bottomTiles[j] = NULL;
}
free(sprites[i].bottomTiles);
sprites[i].bottomTiles = NULL;
}
}
for(i = 0; i < 32; i++) {
DSGM_rotations[DSGM_TOP][i] = 0;
DSGM_rotations[DSGM_BOTTOM][i] = 0;
DSGM_scales[DSGM_TOP][i].x = 1 << 8;
DSGM_scales[DSGM_TOP][i].y = 1 << 8;
DSGM_scales[DSGM_BOTTOM][i].x = 1 << 8;
DSGM_scales[DSGM_BOTTOM][i].y = 1 << 8;
}
DSGM_nextFreeSprite[DSGM_TOP] = 0;
DSGM_nextFreeSprite[DSGM_BOTTOM] = 0;
memset(&DSGM_rotsetTracker, 0, sizeof(DSGM_rotsetTracker));
//DSGM_nextFreeRotset[DSGM_TOP] = 0;
//DSGM_nextFreeRotset[DSGM_BOTTOM] = 0;
oamClear(&oamMain, 0, 0);
oamClear(&oamSub, 0, 0);
//oamUpdate(&oamMain);
//oamUpdate(&oamSub);
}
void DSGM_LoadSpriteFull(u8 screen, DSGM_Sprite *sprite) {
int i;
switch(screen) {
case DSGM_TOP:
//sprite->topTiles = DSGM_TrackedAlloc((void **)&sprite->topTiles, sizeof(u16 *) * sprite->frames);
sprite->topTiles = malloc(sizeof(u16 *) * sprite->frames);
for(i = 0; i < sprite->frames; i++) {
sprite->topTiles[i] = oamAllocateGfx(&oamMain, sprite->size, SpriteColorFormat_256Color);
if(DSGM_SpriteIsNitro(sprite)) {
DSGM_ReadFileManual(sprite->topTiles[i], i * (DSGM_GetSpriteWidth(sprite) * DSGM_GetSpriteHeight(sprite)), DSGM_GetSpriteWidth(sprite) * DSGM_GetSpriteHeight(sprite)/*32 * 32*//*DSGM_AUTO_LENGTH*/, sprite->nitroFilename);
}
else {
dmaCopy(sprite->tiles + (i * DSGM_GetSpriteWidth(sprite) * DSGM_GetSpriteHeight(sprite)), sprite->topTiles[i], *sprite->tilesLength);
}
}
break;
case DSGM_BOTTOM:
//sprite->bottomTiles = DSGM_TrackedAlloc((void **)&sprite->bottomTiles, sizeof(u16 *) * sprite->frames);
sprite->bottomTiles = malloc(sizeof(u16 *) * sprite->frames);
for(i = 0; i < sprite->frames; i++) {
sprite->bottomTiles[i] = oamAllocateGfx(&oamSub, sprite->size, SpriteColorFormat_256Color);
if(DSGM_SpriteIsNitro(sprite)) {
DSGM_ReadFileManual(sprite->bottomTiles[i], i * (DSGM_GetSpriteWidth(sprite) * DSGM_GetSpriteHeight(sprite)), DSGM_GetSpriteWidth(sprite) * DSGM_GetSpriteHeight(sprite)/*DSGM_AUTO_LENGTH*/, sprite->nitroFilename);
}
else {
dmaCopy(sprite->tiles + (i * DSGM_GetSpriteWidth(sprite) * DSGM_GetSpriteHeight(sprite)), sprite->bottomTiles[i], *sprite->tilesLength);
}
}
break;
}
}
void DSGM_CreateSprite(u8 screen, int spriteNumber, int x, int y, ObjPriority priority, int frame, bool hFlip, bool vFlip, DSGM_Sprite *sprite) {
//oamSet(screen == DSGM_TOP ? &oamMain : &oamSub, spriteNumber, 255, 191, 0, sprite->palette->paletteNumber[screen], sprite->size, SpriteColorFormat_256Color, screen == DSGM_TOP ? sprite->topTiles[0] : sprite->bottomTiles[0], -1, false, false, false, false, false);
//swiWaitForVBlank();
//oamUpdate(screen == DSGM_TOP ? &oamMain : &oamSub);
//DSGM_SetSpriteXY(screen, spriteNumber, x, y);
oamSet(screen == DSGM_TOP ? &oamMain : &oamSub, spriteNumber, x, y, priority, sprite->palette->paletteNumber[screen], sprite->size, SpriteColorFormat_256Color, screen == DSGM_TOP ? sprite->topTiles[frame] : sprite->bottomTiles[frame], -1, false, false, hFlip, vFlip, false);
//oamUpdate(screen == DSGM_TOP ? &oamMain : &oamSub);
}
void DSGM_SetRotset(u8 screen, int rotset, int angle, int scaleX, int scaleY) {
oamRotateScale(screen == DSGM_TOP ? &oamMain : &oamSub, rotset, angle, scaleX, scaleY);
}
/*u16 DSGM_GetSpriteColor(DSGM_Sprite *sprite, int frame, int x, int y) {
int tileX = x / 8;
int tileY = y / 8;
int pmx = x - tileX * 8;
int pmy = y - tileY * 8;
if(sprite->topTiles) {
u16 *gfx = sprite->topTiles[frame];
int pixel = 0;
for(pixel = 0; pixel < 32; pixel++) {
unsigned short word = gfx[((tileX + tileY * DSGM_GetSpriteWidth(sprite) / 8) << 5) + pixel];
int px = ((tile & 3) << 3) + ((pixel << 1) & 7);
int py = ((tile >> 2) << 3) + (pixel >> 2);
if((word & 0xF0) >> 4 != 0) {
//if(px == pmx && py == pmy) DSGM_DrawFilledRectangleToBackgroundFull(room, screen, x + ((px + 1) % 8) * size, y + (py % 8) * size, size, size, color);
}
if((word & 0x0F) != 0) {
//if(px == pmx && pmy) DSGM_DrawFilledRectangleToBackgroundFull(room, screen, x + (px % 8) * size, y + (py % 8) * size, size, size, color);
}
}
}
else if(sprite->bottomTiles) {
u16 *gfx = &sprite->bottomTiles[frame][tileX + tileY * DSGM_GetSpriteWidth(sprite) / 8];
}
else {
DSGM_LoadSpriteFull(DSGM_TOP, sprite);
return DSGM_GetSpriteColor(sprite, frame, x, y);
}
}*/