#ifndef _PA_BGROT
#define _PA_BGROT


#include "PA_BgTiles.h"



/*! \file PA_BgRot.h
    \brief Everything concerning rotscale backgrounds

    This file contains all the macros and variables regarding Rotation backgrounds
*/

#define BG_ROT_128X128 0
#define BG_ROT_256X256 1
#define BG_ROT_512X512 2
#define BG_ROT_1024X1024 3


void PA_LoadRotBgMap(u8 screen, u8 bg_select, void* bg_map, u8 bg_size);

#define PA_BGXX(screen, bg) _REG32(0x4000008 + (0x1000 * screen) + (bg << 4))
#define PA_BGXY(screen, bg) _REG32(0x400000C + (0x1000 * screen) + (bg << 4))
#define PA_BGXPA(screen, bg) _REG16(0x4000000 + (0x1000 * screen) + (bg << 4))
#define PA_BGXPB(screen, bg) _REG16(0x4000002 + (0x1000 * screen) + (bg << 4))
#define PA_BGXPC(screen, bg) _REG16(0x4000004 + (0x1000 * screen) + (bg << 4))
#define PA_BGXPD(screen, bg) _REG16(0x4000006 + (0x1000 * screen) + (bg << 4))





/** @defgroup BgRot ROtating Backgrounds
 *  Load rotating backgrounds, move, rotate, scale them
 *  @{
 */


/*!
    \def PA_LoadRotBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound)
    \brief
      \~english Load a background fit for rotating/scaling ! Warning, you must use PA_SetVideoMode to 1 if you want 1 rotating background (Bg3 only !), or 2 for 2 rotating backgrounds (Bg2 and 3). The background MUST be in 256 colors
      \~french Charger un fond pour les rotations/zoom ! Attention, il faut avant utiliser PA_SetVideoMode avec 1 pour utiliser un fond rotatif (le fond 3 uniquement !), ou 2 pour 2 fonds (2 et 3). Le fond DOIT etre de 256 couleurs
    \param screen
         \~english Chose de screen (0 or 1)
         \~french Choix de l'écran (0 ou 1)
    \param bg_select
      \~english Background number to load
      \~french Numéro du fond que l'on veut charger
    \param bg_tiles
      \~english Name of the tiles' info (example: ship_Tiles)
      \~french Nom du tableau contenant les tiles (exemple: ship_Tiles)
    \param bg_map
      \~english Name of the map's info (example : ship_Map)
      \~french Nom du tableau contenant les infos sur la map (exemple : ship_Map)
    \param bg_size
      \~english Background size. Use the following macros : BG_ROT_128X128, or 256X256, 512X512, or 1024X1024
      \~french Taille du fond. Utiliser les macros suivantes : BG_ROT_128X128, ou 256X256, 512X512, ou enfin 1024X1024
    \param wraparound
      \~english If the background wraps around or not. 
      \~french Si le fond boucle ou non. 
*/
#define PA_LoadRotBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound) {\
PA_DeleteBg(screen, bg_select);\
PA_LoadBgTiles(screen, bg_select, bg_tiles); \
PA_LoadRotBgMap(screen, bg_select, (void*)bg_map, bg_size); \
PA_InitBg(screen, bg_select, bg_size, wraparound, 1);\
PA_SetBgRot(screen, bg_select, 0, 0, 0, 0, 0, 256);\
}


/*!
    \def PA_LoadPAGfxRotBg(screen, bg_select, bg_name, wraparound)
    \brief
      \~english Load a background fit for rotating/scaling ! Warning, you must use PA_SetVideoMode to 1 if you want 1 rotating background (Bg3 only !), or 2 for 2 rotating backgrounds (Bg2 and 3). The background MUST be in 256 colors
      \~french Charger un fond pour les rotations/zoom ! Attention, il faut avant utiliser PA_SetVideoMode avec 1 pour utiliser un fond rotatif (le fond 3 uniquement !), ou 2 pour 2 fonds (2 et 3). Le fond DOIT etre de 256 couleurs
    \param screen
         \~english Chose de screen (0 or 1)
         \~french Choix de l'écran (0 ou 1)
    \param bg_select
      \~english Background number to load
      \~french Numéro du fond que l'on veut charger
    \param bg_name
      \~english Background name, like bg0
      \~french Nom du fond, comme bg0
    \param wraparound
      \~english If the background wraps around or not. 
      \~french Si le fond boucle ou non. 
*/
#define PA_LoadPAGfxRotBg(screen, bg_select, bg_name, wraparound) {\
PA_LoadNormalBgPal(screen, (void*)bg_name##_Pal);\
PA_LoadRotBg(screen, bg_select, bg_name##_Tiles, bg_name##_Map, PA_GetPAGfxRotBgSize(bg_name##_Width), wraparound);\
}





/*!
    \def extern inline void PA_SetBgRot(u8 screen, u8 bg_select, s32 x_scroll, s32 y_scroll, s32 x_rotcentre, s32 y_rotcentre, s16 bg_angle, s32 bg_zoom)
    \brief
      \~english Rotate/Scale a RotBg
      \~french Faire tourner/zoomer un fond rotatif
    \param screen
         \~english Chose de screen (0 or 1)
         \~french Choix de l'écran (0 ou 1)
    \param bg_select
      \~english Background number to load
      \~french Numéro du fond que l'on veut charger
    \param x_scroll
      \~english X Scroll...
      \~french Scroll x...
    \param y_scroll
      \~english Y Scroll...
      \~french Scroll y...
    \param x_rotcentre
      \~english X position of the rotation center
      \~french Position X du centre de rotation
	\param y_rotcentre
      \~english Y position of the rotation center
      \~french Position Y du centre de rotation
    \param bg_angle
      \~english Rotation Angle (0-511)
      \~french Angle de rotation (0-511)
    \param bg_zoom
      \~english Zoom (256 for no zoom)
      \~french Zoom (256 pour pas de zoom...)	    
*/
extern inline void PA_SetBgRot(u8 screen, u8 bg_select, s32 x_scroll, s32 y_scroll, s32 x_rotcentre, s32 y_rotcentre, s16 bg_angle, s32 bg_zoom){
	s32 pa, pb, pc, pd;
	
	pa = (PA_Cos(bg_angle) * (bg_zoom)) >> 8;
	pb = (-PA_Sin(bg_angle) * (bg_zoom)) >> 8;
	pc = (PA_Sin(bg_angle) * (bg_zoom)) >> 8;
	pd = pa;
	
	PA_BGXX(screen, bg_select) = (x_scroll << 8) - (x_rotcentre * pa + y_rotcentre * pb);
	PA_BGXY(screen, bg_select) = (y_scroll << 8) - (x_rotcentre * pc + y_rotcentre * pd);
	
	PA_BGXPA(screen, bg_select) = pa;
	PA_BGXPB(screen, bg_select) = pb;
	PA_BGXPC(screen, bg_select) = pc;
	PA_BGXPD(screen, bg_select) = pd;
}

/** @} */ // end of BgRot





#endif

