PA_BgTiles.h

Aller à la documentation de ce fichier.
00001 #ifndef _PA_BGTILES
00002 #define _PA_BGTILES
00003 
00004 //#include <PA9.h>
00005 //#include <PA_FS.h>
00006 #include <nds.h>
00007 #include "PA_General.h"
00008 
00009 
00010 #define BG_TILEDBG   2
00011 #define BG_ROTBG     3
00012 #define BG_LARGEMAP 4
00013 #define BG_INFINITEMAP 5
00014 
00015 void PA_EasyBgLoadEx(u8 screen, u8 bg_number, u32 *Infos, void *Tiles, u32 TileSize, void *Map, u32 MapSize, void *Palette);
00016 
00017 
00018 // Extracts the size from PAGfx convertions
00019 extern inline u8 PA_GetPAGfxBgSize(u16 width, u16 height)
00020 {
00021        u8 bg_size = 0;
00022        if (height == 512)   bg_size = 2;
00023        if (width == 512)    bg_size ++;   
00024        return bg_size;
00025 }
00026 
00027 // Extracts the size from PAGfx convertions
00028 extern inline u8 PA_GetPAGfxRotBgSize(u16 width)
00029 {
00030        u8 bg_size = 1; //256x256 by default
00031        if (width <= 128)    bg_size = 0;  
00032        else if (width <= 256)      bg_size = 1;  
00033        else if (width <= 512)      bg_size = 2;         
00034        else if (width <= 1024) bg_size = 3;             
00035        
00036        return bg_size;
00037 }
00038 
00039 
00040 typedef u8 (*EasyBgPixels)(u8, u8, s32, s32);  
00041 
00042 extern EasyBgPixels PA_EasyBgPixel[6];
00043 
00053 
00054 // Système de Tiles
00056 
00057 
00058 //background memory offset macros
00059 #define CharBaseBlock(screen, n) (((n)*0x4000) + 0x6000000 + (0x200000 *  screen))
00060 #define ScreenBaseBlock(screen, n) (((n)*0x800) + 0x6000000 + (0x200000 *  screen))
00061 
00062 // Pointers towards background arrays
00063 typedef struct{
00064        void *Tiles;
00065        void *Map;
00066        void *Palette;
00067        u32 TileSize, MapSize;
00068        u32 Type, Width, Height; 
00069 } PA_BgDefaultInfos;
00070        
00071 
00072 typedef struct{
00073        // Memory management info...
00074 
00075 
00076        u32 tilesetsize; // Place utilisée pour chaque tileset
00077        u16 mapsize; // Place utilisée pour chaque map
00078 //extern u8 tilesetchar[2][4];  // Emplacement mémoire de chaque tileset
00079        u8 mapchar;  // Emplacement mémoire de chaque map
00080 
00081 
00082        u32 Map; // Map pointer
00083        u8 TileSetChar;
00084        
00085        u32 NTiles;
00086        u32 *TilePos;
00087        void *Tiles;  
00088        
00089        PA_BgDefaultInfos Infos; // Pointers towards background arrays
00090        
00091        s32 ScrollX, ScrollY; // Scroll values
00092        
00093        u8 BgMode; // Background mode
00094 } PA_BgInfos;
00095 extern PA_BgInfos PA_BgInfo[2][4];
00096 
00097 extern u8 charblocks[2][70];
00098 //extern u32 PA_bgmap[2][4]; // Pointeur vers les maps, 4 maps par screen
00099 //extern u8 tilesetchar[2][4];
00100 
00101 // Quantité de données à charger en fonction de la taille de la map...
00102 
00103 extern u16 *PA_DrawBg[2]; // Fond dessinable
00104 
00105 extern u16 bg_sizes[4];
00106 extern u8 bg_place[4];
00107 
00108 
00109 extern u8 charsetstart[2];
00110 extern s32 PA_parallaxX[2][4];
00111 extern s32 PA_parallaxY[2][4];
00112 
00113 
00114 
00115 
00116 
00117 typedef struct {
00118        u8 infscroll; // Passe à 1 si scrolling infini activé...
00119        u16* bg_map; // Map
00120 //     s32 x, y;
00121        s32 lx, ly;
00122        s32 scrollx, scrolly;
00123        s32 maxx; // 32 ou 64, en fonction de la largeur...
00124 //     s32 startx, starty;
00125 }scrollpositions;
00126 
00127 extern scrollpositions scrollpos[2][4]; // Pour chaque écran et pour chaque fond :)
00128 
00129 
00130 
00131 
00132 
00133 
00134 // Mode de couleur
00135 #define BG_COLOR16 0x00
00136 #define BG_COLOR256 0x80
00137 
00138 
00139 #define CHAR_SHIFT 2
00140 #define SCREEN_SHIFT 8
00141 #define WRAPAROUND 0x1
00142 
00143 #define SCREEN_TILES 24576  // Taille à convertir pour avoir un écran complet...
00144 
00145 
00146 //scrolling registers for background 0
00147 
00148 
00149 // Registre pour les controles de chaque écran
00150 
00151 #define REG_BGSCREEN0  0x04000000
00152 #define REG_BGSCREEN1  0x04001000
00153 #define REG_BGSCREEN(screen) (0x04000000 + (screen * 0x1000))
00154 
00155 #define REG_BGCNT(screen, bg_number) (0x4000008 + (screen * 0x1000) + (bg_number << 1))
00156 
00157 // Premier registre pour les scroll. On en déduit les autres en ajoutant pour le screen et le numéro du Bg
00158 #define REG_BGSCROLLX 0x4000010
00159 #define REG_BGSCROLLY 0x4000012
00160 
00161 
00162 // Tailles pour les Bg :
00163 #define BG_256X256 0
00164 #define BG_512X256 1
00165 #define BG_256X512 2
00166 #define BG_512X512 3
00167 
00168 
00169 
00170 //ALL_BUT() pour faire tout sauf...
00171 #define TILE_N 1023
00172 #define TILE_PAL 61440
00173 #define TILE_HFLIP 1024
00174 #define TILE_VFLIP 2048
00175 
00176 
00177 
00178 
00179 
00191 void PA_ResetBgSys(void);
00192 
00193 
00203 void PA_ResetBgSysScreen(u8 screen);
00204 
00227 void PA_InitBg(u8 screen, u8 bg_select, u8 bg_size, u8 wraparound, u8 color_mode);
00228 //#define PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode) {    PA_bgmap[screen][bg_select] = ScreenBaseBlock(screen, ((bg_select + 1) << 3) - bg_place[bg_size]);_REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select)); _REG16(REG_BGCNT(screen, bg_select)) = ((bg_select) | (bg_size << 14) |((((bg_select + 1) << 3) - bg_place[bg_size]) << SCREEN_SHIFT) | (wraparound << 13) | ((bg_select) << 2)) + (color_mode << 7);}
00229 
00230 
00243 #define PA_HideBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) &= ~(0x100 << (bg_select))
00244 
00245 
00258 #define PA_ShowBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select))
00259 
00260 
00270 #define PA_ResetBg(screen) _REG16(REG_BGSCREEN(screen)) &= ~(0xF00)
00271 
00272 
00273 
00289 #define PA_LoadBgTiles(screen, bg_select, bg_tiles) PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, SIZEOF_16BIT(bg_tiles))
00290 //#define PA_LoadBgTiles(screen, bg_select, bg_tiles) {DMA_Copy((void*)(bg_tiles), (void*)CharBaseBlock(screen, bg_select),SIZEOF_16BIT(bg_tiles), DMA_16NOW);}
00291 
00292 
00312 void PA_LoadBgTilesEx(u8 screen, u8 bg_select, void* bg_tiles, u32 size);
00313 
00314 
00330 void PA_ReLoadBgTiles(u8 screen, u8 bg_select, void* bg_tiles);
00331 
00332 
00345 void PA_DeleteTiles(u8 screen, u8 bg_select);
00346 
00347 
00360 void PA_DeleteMap(u8 screen, u8 bg_select);
00361 
00362 
00363 
00376 extern inline void PA_DeleteBg(u8 screen, u8 bg_select) {
00377        PA_HideBg(screen, bg_select);
00378        PA_DeleteTiles(screen, bg_select);
00379        PA_DeleteMap(screen, bg_select);
00380 }
00381 
00401 void PA_LoadBgMap(u8 screen, u8 bg_select, void* bg_map, u8 bg_size);
00402 
00403 
00404 
00405 
00406 
00423 #define PA_LoadTiledBg(screen, bg_number, bg_name){\
00424        PA_LoadBgPal(screen, bg_number, (void*)bg_name##_Pal); \
00425        PA_LoadSimpleBg(screen, bg_number, bg_name##_Tiles, bg_name##_Map, PA_GetPAGfxBgSize(bg_name##_Info[1], bg_name##_Info[2]), 0, 1);}
00426 
00427 
00428 
00429 
00458 #define PA_LoadSimpleBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound, color_mode) {\
00459 PA_DeleteBg(screen, bg_select);\
00460 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00461 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00462 PA_InitBg(screen, bg_select, bg_size, 0, color_mode);\
00463 PA_BGScrollXY(screen, bg_select, 0, 0);}
00464 
00465 
00466 
00467 
00499 #define PA_LoadBg(screen, bg_select, bg_tiles, tile_size, bg_map, bg_size, wraparound, color_mode) {\
00500 PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, tile_size); \
00501 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00502 PA_InitBg(screen, bg_select, bg_size, 0, color_mode);\
00503 PA_BGScrollXY(screen, bg_select, 0, 0);}
00504 
00505 
00506 
00522 extern inline void PA_BGScrollX(u8 screen, u8 bg_number, s32 x) {
00523        PA_BgInfo[screen][bg_number].ScrollX = (x)&1023;
00524        _REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2)) = (x)&1023;
00525 }      
00526 
00542 extern inline void PA_BGScrollY(u8 screen, u8 bg_number, s32 y) {
00543        PA_BgInfo[screen][bg_number].ScrollY = (y)&1023;
00544        _REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2)) = (y)&1023;
00545 }      
00546 
00547 
00548 
00567 extern inline void PA_BGScrollXY(u8 screen, u8 bg_number, s32 x, s32 y) {
00568        PA_BGScrollX(screen, bg_number, x); 
00569        PA_BGScrollY(screen, bg_number, y);
00570 }
00571 
00572 
00573 
00574 
00596 extern inline void PA_SetMapTile(u8 screen, u8 bg_select, s16 x, s16 y, s16 tile_number) {
00597 *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) &= ~(TILE_N); 
00598 *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) |= ((tile_number)&TILE_N);
00599 }
00600 
00601 
00623 #define PA_SetMapTileAll(screen, bg_select, x, y, tile_info) *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) = (tile_info)
00624 
00625 
00626 
00627 
00628 
00650 extern inline void PA_SetLargeMapTile(u8 screen, u8 bg_select, s32 x, s32 y, u32 tile_info) {
00651        u32 truex;
00652        u32 mapblock = 0;
00653        truex = x&31;
00654        mapblock = ((x >> 5) << 11) + ((y >> 5) << 12); // Permet d'avoir le bon block...
00655        
00656        *(u16*)(PA_BgInfo[screen][bg_select].Map + ((truex) << 1) + ((y&31) << 6) + mapblock) = tile_info;
00657 }
00658 
00659 
00660 
00682 #define PA_SetMapTileHflip(screen, bg_select, x, y, hflip) {*(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_HFLIP); *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) |= ((hflip) << 10);}
00683 
00684 
00706 #define PA_SetMapTileVflip(screen, bg_select, x, y, vflip) {*(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_VFLIP); *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) |= ((vflip) << 11);}
00707 
00708 
00730 #define PA_SetMapTilePal(screen, bg_select, x, y, palette_number) {*(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_PAL); *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) |= ((palette_number) << 12);}
00731 
00732 
00763 extern inline void PA_SetMapTileEx(u8 screen, u8 bg_select, s16 x, s16 y, u16 tile_number, u8 hflip, u8 vflip, u8 palette_number) {
00764        *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) = (tile_number) + ((hflip) << 10) + ((vflip) << 11) + ((palette_number) << 12);
00765 }
00766 
00767 
00768 
00769 
00770 
00771 
00772 
00773 
00774 
00775 
00791 extern inline void PA_SetBgPrio(u8 screen, u8 bg, u8 prio) {
00792        _REG16(REG_BGCNT(screen, bg)) &= ~3;
00793        _REG16(REG_BGCNT(screen, bg)) |= prio;
00794 }
00795 
00796 extern inline void PA_CreateBgFromTiles(u8 screen, u8 bg_select, u8 bg_tiles, void *bg_map, u8 bg_size){
00797 PA_LoadBgMap(screen, bg_select, bg_map, bg_size);
00798 scrollpos[screen][bg_select].infscroll = 0; // Par défaut pas de scrolling infini...
00799 PA_BgInfo[screen][bg_select].Map = ScreenBaseBlock(screen, PA_BgInfo[screen][bg_select].mapchar);
00800 PA_BgInfo[screen][bg_select].TileSetChar = PA_BgInfo[screen][bg_tiles].TileSetChar;
00801 PA_BgInfo[screen][bg_select].tilesetsize = PA_BgInfo[screen][bg_tiles].tilesetsize;
00802 
00803 _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select));
00804 _REG16(REG_BGCNT(screen, bg_select)) = bg_select | (bg_size << 14) |(PA_BgInfo[screen][bg_select].mapchar << SCREEN_SHIFT) | (1 << 13) | (PA_BgInfo[screen][bg_select].TileSetChar << 2) | (1 << 7);
00805 PA_BGScrollXY(screen, bg_select, 0, 0);   
00806 }
00807 
00808 
00809 
00832 extern inline void PA_SetBgPrioSeq(u8 screen, u8  priority0, u8  priority1, u8  priority2, u8  priority3)
00833 {
00834    PA_SetBgPrio(screen, priority0, 0);
00835    PA_SetBgPrio(screen, priority1, 1);
00836    PA_SetBgPrio(screen, priority2, 2);
00837    PA_SetBgPrio(screen, priority3, 3);
00838 } 
00839 
00840 
00841 
00842 
00854 extern inline void PA_ClearBg(u8 screen, u8 bg_select){
00855 u8 i, j;
00856 for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) PA_SetMapTileAll(screen, bg_select, i, j, 0);
00857 }
00858 
00859 
00860 
00861 
00862 
00877 #define PA_EasyBgLoad(screen, bg_number, bg_name)       PA_BgInfo[screen][bg_number].BgMode = bg_name##_Info[0];\
00878        PA_StoreEasyBgInfos(screen, bg_number, bg_name##_Info[0], bg_name##_Info[1], bg_name##_Info[2], (void*)bg_name##_Tiles, SIZEOF_16BIT(bg_name##_Tiles), (void*)bg_name##_Map, SIZEOF_16BIT(bg_name##_Map), (void*)bg_name##_Pal);\
00879        if(PA_BgInfo[screen][bg_number].BgMode == BG_TILEDBG){  PA_LoadTiledBg(screen, bg_number, bg_name);}\
00880        else{PA_LoadPAGfxLargeBg(screen, bg_number, bg_name);}
00881 
00882 /*PA_EasyBgLoadEx(screen, bg_number, (u32*)bg_name##_Info, (void*)bg_name##_Tiles, SIZEOF_16BIT(bg_name##_Tiles), (void*)bg_name##_Map, SIZEOF_16BIT(bg_name##_Map), (void*)bg_name##_Pal)*/
00883 
00884 
00885 
00901 void PA_EasyBgScrollX(u8 screen, u8 bg_number, s32 x);
00902 
00903 
00904 
00920 void PA_EasyBgScrollY(u8 screen, u8 bg_number, s32 y);
00921 
00922 
00941 extern inline void PA_EasyBgScrollXY(u8 screen, u8 bg_number, s32 x, s32 y){
00942        PA_EasyBgScrollX(screen, bg_number, x);
00943        PA_EasyBgScrollY(screen, bg_number, y);
00944 }
00945 
00946 
00965 extern inline u8 PA_EasyBgGetPixel(u8 screen, u8 bg_number, s32 x, s32 y){
00966        return PA_EasyBgPixel[PA_BgInfo[screen][bg_number].Infos.Type](screen, bg_number, x, y);
00967 }
00968 
00969 
00988 extern inline u16 PA_EasyBgGetPixelCol(u8 screen, u8 bg_number, s32 x, s32 y){
00989        return ((u16*)(PA_BgInfo[screen][bg_number].Infos.Palette))[PA_EasyBgGetPixel(screen, bg_number, x, y)];
00990 }
00991 
00992 
00993 
00994  // end of BgTiles
00996 
00997 
00998 /*
00999 
01000 void PA_StoreEasyBgInfos(u8 screen, u8 bg_number, u32 *Infos, void *Tiles, u32 TileSize, void *Map, u32 MapSize, void *Palette);
01001        
01002 */
01003 
01004 
01005 // Get pixel functions
01006 
01007 u8 PAEasyBgGetPixelTiled(u8 screen, u8 bg_number, s32 x, s32 y);
01008 
01009 u8 PAEasyBgGetPixelLarge(u8 screen, u8 bg_number, s32 x, s32 y);
01010 
01011 u8 PAEasyBgGetPixelInf(u8 screen, u8 bg_number, s32 x, s32 y);
01012 
01013 u8 PANoPixel(u8 screen, u8 bg_number, s32 x, s32 y);
01014 
01015 extern inline void PA_UpdateBgTile(u8 screen, u8 bg_select, u16 tilepos, void *tile){
01016 tilepos = tilepos << 4;
01017 u32 *tilecopy = (u32*)tile;
01018 u8 i;
01019        for (i = 0; i < 16; i++)
01020               PA_BgInfo[screen][bg_select].TilePos[tilepos+i] = tilecopy[i];
01021 }
01022 
01023 void PA_StoreEasyBgInfos(u8 screen, u8 bg_number, u32 Type, u32 Width, u32 Height, void *Tiles, u32 TileSize, void *Map, u32 MapSize, void *Palette);
01024 
01025 
01026 #endif
01027 

Généré le Tue Jan 30 23:10:49 2007 pour PAlib par  doxygen 1.3.9.1