00001 #ifndef _PA_SpriteDual
00002 #define _PA_SpriteDual
00003
00004
00005
00012 #include "PA_Sprite.h"
00013
00014
00029 extern inline void PA_SetScreenSpace(s16 ScreenSpace){
00030 PA_ScreenSpace = 192 + ScreenSpace;
00031 }
00032
00033
00034
00035
00036
00037
00049 extern inline void PA_DualSetSpriteY(u8 obj, s16 y){
00050 s16 y0 = 192; s16 y1 = 192;
00051 if (y < 192) y1 = y;
00052 if (y > PA_ScreenSpace-64) y0 = y - PA_ScreenSpace;
00053 PA_SetSpriteY(0, obj, y0);
00054 PA_SetSpriteY(1, obj, y1);
00055 }
00056
00057
00058
00088 extern inline void PA_DualCreateSprite(u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, s16 x, s16 y) {
00089 PA_CreateSprite(0, obj_number, obj_data, obj_shape, obj_size, color_mode, palette, x, 192);
00090 PA_CreateSprite(1, obj_number, obj_data, obj_shape, obj_size, color_mode, palette, x, 192);
00091 PA_DualSetSpriteY(obj_number, y);
00092 };
00093
00141 extern inline void PA_DualCreateSpriteEx(u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, u8 obj_mode, bool mosaic, bool hflip, bool vflip, u8 prio, bool dblsize, s16 x, s16 y){
00142 PA_CreateSpriteEx(0, obj_number, obj_data, obj_shape, obj_size, color_mode, palette, obj_mode, mosaic, hflip, vflip, prio, dblsize, x, 192);
00143 PA_CreateSpriteEx(1, obj_number, obj_data, obj_shape, obj_size, color_mode, palette, obj_mode, mosaic, hflip, vflip, prio, dblsize, x, 192);
00144 PA_DualSetSpriteY(obj_number, y);
00145 }
00146
00147
00148
00149
00150
00189 extern inline void PA_DualCreate16bitSpriteEx(u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, bool mosaic, bool hflip, bool vflip, u8 prio, bool dblsize, s16 x, s16 y){
00190 u16 mem_size = PA_obj_sizes[obj_size][obj_shape] << 1;
00191 u16 *gfx = (u16*)malloc(mem_size);
00192 mem_size = mem_size >> 1;
00193 s32 i;
00194 u16 *data = (u16*)obj_data;
00195 for (i = 0; i < mem_size; i++) gfx[i] = data[i] + (1 << 15);
00196
00197 PA_obj[0][obj_number].atr2 = PA_CreateGfx(0, gfx, obj_shape, obj_size, 2) + (prio << 10) + (15 << 12);
00198 PA_obj[1][obj_number].atr2 = PA_CreateGfx(1, gfx, obj_shape, obj_size, 2) + (prio << 10) + (15 << 12);
00199 PA_obj[1][obj_number].atr0 = PA_obj[0][obj_number].atr0 = (192 & OBJ_Y) + (dblsize << 9) + (3 << 10) + (mosaic << 12) + (0 << 13) + (obj_shape << 14);
00200 PA_obj[1][obj_number].atr1 = PA_obj[0][obj_number].atr1 = (x & OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00201 PA_DualSetSpriteY(obj_number, y);
00202
00203 free(gfx);
00204 }
00205
00206
00207
00231 extern inline void PA_DualCreate16bitSprite(u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, s16 x, s16 y){
00232 PA_DualCreate16bitSpriteEx(obj_number, obj_data, obj_shape, obj_size, 0, 0, 0, 0, 0, x, y);
00233 }
00234
00235
00236
00237
00267 extern inline void PA_DualCreateSpriteFromGfx(u8 obj_number, u16 *obj_gfx, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, s16 x, s16 y) {
00268 PA_CreateSpriteFromGfx(0, obj_number, obj_gfx[0], obj_shape, obj_size, color_mode, palette, x, 192);
00269 PA_CreateSpriteFromGfx(1, obj_number, obj_gfx[1], obj_shape, obj_size, color_mode, palette, x, 192);
00270 PA_DualSetSpriteY(obj_number, y);
00271 }
00272
00320 extern inline void PA_DualCreateSpriteExFromGfx(u8 obj_number, u16 *obj_gfx, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, u8 obj_mode, bool mosaic, bool hflip, bool vflip, u8 prio, bool dblsize, s16 x, s16 y) {
00321 PA_CreateSpriteExFromGfx(0, obj_number, obj_gfx[0], obj_shape, obj_size, color_mode, palette, obj_mode, mosaic, hflip, vflip, prio, dblsize, x, 192);
00322 PA_CreateSpriteExFromGfx(1, obj_number, obj_gfx[1], obj_shape, obj_size, color_mode, palette, obj_mode, mosaic, hflip, vflip, prio, dblsize, x, 192);
00323 PA_DualSetSpriteY(obj_number, y);
00324 }
00325
00326
00338 extern inline void PA_DualUpdateSpriteGfx(u8 obj_number, void *obj_data){
00339 PA_UpdateSpriteGfx(0, obj_number, obj_data);
00340 PA_UpdateSpriteGfx(1, obj_number, obj_data);
00341 }
00342
00343
00355 extern inline void PA_DualUpdateGfx(u16 gfx_number, void *obj_data){
00356 PA_UpdateGfx(0, gfx_number, obj_data);
00357 PA_UpdateGfx(1, gfx_number, obj_data);
00358 }
00359
00360
00361
00362
00371 extern inline void PA_DualDeleteSprite(u8 obj_number){
00372 PA_DeleteSprite(0, obj_number);
00373 PA_DeleteSprite(1, obj_number);
00374 }
00375
00376
00377
00389 extern inline void PA_DualSetSpriteRotEnable(u8 sprite, u8 rotset){
00390 PA_SetSpriteRotEnable(0, sprite, rotset);
00391 PA_SetSpriteRotEnable(1, sprite, rotset);
00392 }
00393
00394
00395
00404 extern inline void PA_DualSetSpriteRotDisable(u8 sprite){
00405 PA_SetSpriteRotDisable(0, sprite);
00406 PA_SetSpriteRotDisable(1, sprite);
00407 }
00408
00427 extern inline void PA_DualSetRotset(u8 rotset, s16 angle, u16 zoomx, u16 zoomy) {
00428 u8 obj_num = (rotset << 2);
00429 PA_obj[0][obj_num].atr3 = PA_obj[1][obj_num].atr3 = (PA_Cos(angle) * zoomx) >> 8;
00430 PA_obj[0][obj_num + 1].atr3 = PA_obj[1][obj_num + 1].atr3 = (-PA_Sin(angle) * zoomy) >> 8;
00431 PA_obj[0][obj_num + 2].atr3 = PA_obj[1][obj_num + 2].atr3 = (PA_Sin(angle) * zoomx) >> 8;
00432 PA_obj[0][obj_num + 2].atr3 = PA_obj[1][obj_num + 2].atr3 = (PA_Sin(angle) * zoomx) >> 8;
00433 PA_obj[0][obj_num + 3].atr3 = PA_obj[1][obj_num + 3].atr3 = (PA_Cos(angle) * zoomy) >> 8;
00434 }
00435
00447 extern inline void PA_DualSetRotsetNoZoom(u8 rotset, s16 angle) {
00448 u8 obj_num = (rotset << 2);
00449 PA_obj[0][obj_num].atr3 = PA_obj[1][obj_num].atr3 = PA_Cos(angle);
00450 PA_obj[0][obj_num + 1].atr3 = PA_obj[1][obj_num + 1].atr3 = -PA_Sin(angle);
00451 PA_obj[0][obj_num + 2].atr3 = PA_obj[1][obj_num + 2].atr3 = PA_Sin(angle);
00452 PA_obj[0][obj_num + 3].atr3 = PA_obj[1][obj_num + 3].atr3 = PA_Cos(angle);
00453 }
00454
00455
00470 extern inline void PA_DualSetRotsetNoAngle(u8 rotset, u16 zoomx, u16 zoomy) {
00471 u8 obj_num = (rotset << 2);
00472 PA_obj[0][obj_num].atr3 = PA_obj[1][obj_num].atr3 = zoomx;
00473 PA_obj[0][obj_num + 1].atr3 = PA_obj[1][obj_num + 1].atr3 = 0;
00474 PA_obj[0][obj_num + 2].atr3 = PA_obj[1][obj_num + 2].atr3 = 0;
00475 PA_obj[0][obj_num + 3].atr3 = PA_obj[1][obj_num + 3].atr3 = zoomy;
00476 }
00477
00478
00479
00480
00481
00482
00483
00495 extern inline void PA_DualSetSpriteX(u8 obj, s16 x){
00496 PA_obj[0][obj].atr1 = PA_obj[1][obj].atr1 = (PA_obj[0][obj].atr1 & ALL_BUT(OBJ_X)) + ((x) & OBJ_X);
00497 }
00498
00499
00500
00501
00502
00503
00504
00505
00520 extern inline void PA_DualSetSpriteXY(u8 sprite, s16 x, s16 y) {
00521 PA_DualSetSpriteX(sprite, x);
00522 PA_DualSetSpriteY(sprite, y);
00523 }
00524
00525
00526
00538 extern inline void PA_DualSetSpritePal(u8 obj, u8 pal){
00539 PA_SetSpritePal(0, obj, pal);
00540 PA_SetSpritePal(1, obj, pal);
00541 }
00542
00543
00544
00556 extern inline void PA_DualSetSpriteDblsize(u8 obj, bool dblsize){
00557 PA_SetSpriteDblsize(0, obj, dblsize);
00558 PA_SetSpriteDblsize(1, obj, dblsize);
00559 }
00560
00561
00562
00563
00575 extern inline void PA_DualSetSpriteColors(u8 sprite, bool n_colors){
00576 PA_SetSpriteColors(0, sprite, n_colors);
00577 PA_SetSpriteColors(1, sprite, n_colors);
00578
00579 }
00580
00581
00582
00583
00595 extern inline void PA_DualSetSpriteMode(u8 sprite, u8 obj_mode){
00596 PA_SetSpriteMode(0, sprite, obj_mode);
00597 PA_SetSpriteMode(1, sprite, obj_mode);
00598 }
00599
00600
00601
00602
00603
00604
00616 extern inline void PA_DualSetSpriteMosaic(u8 obj, bool mosaic){
00617 PA_SetSpriteMosaic(0, obj, mosaic);
00618 PA_SetSpriteMosaic(1, obj, mosaic);
00619 }
00620
00621
00622
00623
00624
00625
00637 extern inline void PA_DualSetSpriteHflip(u8 obj, bool hflip){
00638 PA_SetSpriteHflip(0, obj, hflip);
00639 PA_SetSpriteHflip(1, obj, hflip);
00640 }
00641
00642
00643
00644
00656 extern inline void PA_DualSetSpriteVflip(u8 obj, bool vflip){
00657 PA_SetSpriteVflip(0, obj, vflip);
00658 PA_SetSpriteVflip(1, obj, vflip);
00659 }
00660
00661
00662
00663
00664
00665
00677 extern inline void PA_DualSetSpriteGfx(u8 obj, u16 *gfx){
00678 PA_SetSpriteGfx(0, obj, gfx[0]);
00679 PA_SetSpriteGfx(1, obj, gfx[1]);
00680 }
00681
00682
00683
00684
00685
00697 extern inline void PA_DualSetSpritePrio(u8 obj, u8 prio){
00698 PA_SetSpritePrio(0, obj, prio);
00699 PA_SetSpritePrio(1, obj, prio);
00700 }
00701
00702
00703
00704
00705
00717 extern inline void PA_DualCloneSprite(u8 obj, u8 target){
00718 PA_CloneSprite(0, obj, target);
00719 PA_CloneSprite(1, obj, target);
00720 }
00721
00722
00723
00724
00725
00726
00727
00748 extern inline void PA_DualSetSpriteAnimEx(u8 sprite, u8 lx, u8 ly, u8 ncolors, s16 animframe){
00749 PA_SetSpriteAnimEx(0, sprite, lx, ly, ncolors, animframe);
00750 PA_SetSpriteAnimEx(1, sprite, lx, ly, ncolors, animframe);
00751 }
00752
00753
00754
00755
00756
00768 extern inline void PA_DualSetSpriteAnim(u8 sprite, s16 animframe){
00769 u8 lx = PA_GetSpriteLx(0, sprite); u8 ly = PA_GetSpriteLy(0, sprite);
00770 bool ncolors = PA_GetSpriteColors(0, sprite);
00771 PA_SetSpriteAnimEx(0, sprite, lx, ly, ncolors, animframe);
00772 PA_SetSpriteAnimEx(1, sprite, lx, ly, ncolors, animframe);
00773 }
00774
00775
00776
00777
00778
00779
00780
00781
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00832
00833
00834
00835
00836
00837
00838
00839
00840
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858 #endif
00859
00860