- メインページ
- モジュール
- データ構造
- ファイル
- ディレクトリ

- ファイル一覧
- グローバル

# graphics.h

説明を見る。

    00001 #include "dxlibp.h"
    00002 #include <pspgu.h>
    00003 #include <valloc.h>
    00004 /*
    00005 3D系の画像を扱う場合は画像サイズは2^nのみとする
    00006
    00007 頂点バッファをフラッシュする条件
    00008
    00009 テクスチャの切り替え
    00010 2D、3Dの切り替え
    00011 テクスチャの有無
    00012 バッファが足りなくなった時
    00013
    00014 頂点バッファの書き込み後にオーバーランしていたらエラー出して強制終了
    00015 頂点バッファの書き込み後に残りが1割切っていたらフラッシュ
    00016
    00017 VRAM上ではswizzleしない
    00018 DRAM上ではswizzleする
    00019 →VRAM-DRAM間のデータ転送の時点でswizzle、unswizzle処理をしてしまおう
    00020 */
    00021
    00022 //macros ----
    00023 #define VRAM_BASE   (0x44000000)
    00024 #define VRAM_OFFSET2ADDRESS(OFFSET) (VRAM_BASE | OFFSET)
    00025
    00026 #define GULIST_LEN  262144  /*(256 * 1024) 1MByte*/
    00027 #define GULIST_LIM  200000
    00028
    00029
    00030 #define DXP_DRAWSTATE_EITHER    0xffffffff
    00031 #define DXP_DRAWSTATE_NONTEX2D  0
    00032 #define DXP_DRAWSTATE_TEX2D     1
    00033 #define DXP_DRAWSTATE_NONTEX3D  2
    00034 #define DXP_DRAWSTATE_TEX3D     3
    00035 #define DXP_DRAWSTATE_INTRAFONT 4
    00036
    00037 #define GUENABLE(STATUS) {if(!sceGuGetStatus(STATUS))sceGuEnable(STATUS);}
    00038 #define GUDISABLE(STATUS) {if(sceGuGetStatus(STATUS))sceGuDisable(STATUS);}
    00039 #define GUINITCHECK {if(!dxpGraphicsData.init)return -1;}
    00040 #define GUSTART     {if(!dxpGraphicsData.gustarted){sceGuStart(GU_DIRECT,dxpGuList);dxpGraphicsData.gustarted = 1;}}
    00041 #define GUFINISH    {if(dxpGraphicsData.gustarted){sceGuFinish();dxpGraphicsData.gustarted = 0;}}
    00042 #define GUSYNC      {GUFINISH;sceGuSync(0,0);}
    00043
    00044 #define MIN(a,b) (a < b ? a : b)
    00045 #define GHANDLE2GPTR(PTR,HANDLE) {if(HANDLE < 0 || HANDLE >= DXP_BUILDOPTION_GHANDLE_MAXNUM)return -1;PTR = dxpGraphicsData.grapharray[HANDLE];if(!PTR)return -1;if(!PTR->tex)return -1;}
    00046
    00047 static inline int dxpN_2(int num)
    00048 {
    00049     unsigned int i;
    00050     num -= 1;
    00051     __asm__(
    00052         "clz %0, %1¥n"
    00053         :"=r"(i):"r"(num)
    00054     );
    00055     return 1 << (32-i);
    00056 }
    00057
    00058 static inline u32 dxpGraphics4444_8888(u32 src)
    00059 {
    00060     return ((src & 0xf000) << 28) | ((src & 0xf000) << 24) | ((src & 0x0f00) << 20) | ((src & 0x0f00) << 16) | ((src & 0x00f0) << 12) | ((src & 0x00f0) << 8 ) | ((src & 0x000f) << 4 ) | ((src & 0x000f) << 0 );
    00061 }
    00062
    00063 static inline u32 dxpGraphics5551_8888(u32 src)
    00064 {
    00065     return ((src & 0x8000) << 16) | ((src & 0x8000) << 15) | ((src & 0x8000) << 14) | ((src & 0x8000) << 13) | ((src & 0x8000) << 12) | ((src & 0x8000) << 11) | ((src & 0x8000) << 10) | ((src & 0x8000) << 9) |
    00066         ((src & 0x7c00) << 9) | ((src & 0x7000) << 4) | ((src & 0x03e0) << 6) | ((src & 0x0380) << 1) | ((src & 0x001f) << 3) | ((src & 0x001c) >> 2);
    00067 }
    00068
    00069 static inline u32 dxpGraphics5650_8888(u32 src)
    00070 {
    00071     return 0xff000000 | ((src & 0xf800) << 8) | ((src & 0xe000) << 3) | ((src & 0x07e0) << 5) | ((src & 0x0600) >> 1) | ((src & 0x001f) << 3) | ((src & 0x001c) >> 2);
    00072 }
    00073
    00074 static inline u32 dxpGraphics8888_4444(u32 src)
    00075 {
    00076     return ((src & 0xf0000000) >> 16) | ((src & 0x00f00000) >> 12) | ((src & 0x0000f000) >> 8 ) | ((src & 0x000000f0) >> 4 );
    00077 }
    00078
    00079 static inline u32 dxpGraphics8888_5551(u32 src)
    00080 {
    00081     return ((src & 0x80000000) >> 16) | ((src & 0x00f80000) >> 9 ) | ((src & 0x0000f800) >> 6 ) | ((src & 0x000000f8) >> 3 );
    00082 }
    00083
    00084 static inline u32 dxpGraphics8888_5650(u32 src)
    00085 {
    00086     return ((src & 0x00f80000) >> 8) | ((src & 0x0000fc00) >> 5) | ((src & 0x000000f8) >> 3);
    00087 }
    00088 //structures ----
    00089
    00090 //typedef struct STREAMDATA STREAMDATA;
    00091
    00092 #define DXP_VTYPE_2D    (GU_VERTEX_16BIT)
    00093 typedef struct DXP_FVF_2D
    00094 {
    00095     s16         x,y,z;
    00096 }DXP_FVF_2D;
    00097
    00098 #define DXP_VTYPE_2DTEX (GU_VERTEX_16BIT | GU_TEXTURE_16BIT)
    00099 typedef struct DXP_FVF_2DTEX
    00100 {
    00101     u16         u,v;
    00102     s16         x,y,z;
    00103 }DXP_FVF_2DTEX;
    00104
    00105 #define DXP_VTYPE_2DTEX_F (GU_VERTEX_32BITF | GU_TEXTURE_16BIT)
    00106 typedef struct DXP_FVF_2DTEX_F
    00107 {
    00108     u16         u,v;
    00109     float       x,y,z;
    00110 }DXP_FVF_2DTEX_F;
    00111
    00112 typedef struct DXPTEXTURE3
    00113 {
    00114     int         psm;
    00115     u32         *ppalette;
    00116     void*       texdata;                /*テクスチャの実データ*/
    00117     void*       texvram;                /*vramにコピーしたデータ*/
    00118     u16         width;                  /*テクスチャの横サイズ*/
    00119     u16         height;                 /*テクスチャの縦サイズ*/
    00120     u16         pitch;                  /*テクスチャの横サイズ*/
    00121     u16         umax,vmax;              /*有効なUV座標の最大値*/
    00122     u32         colorkey;               /*カラーキー*/
    00123
    00124     unsigned    size2_nflag:1;          /*テクスチャサイズが2のn乗になっているかどうか*/
    00125     unsigned    swizzledflag:1;
    00126     unsigned    reloadflag:1;
    00127     unsigned    alphabit:1;             /*読み込んだ画像にα情報が存在したかどうか*/
    00128     u32         refcount;
    00129     struct DXPTEXTURE3 **thisptrptr;            /*インデックス→テクスチャ配列のどこが自分を指しているか*/
    00130 }DXPTEXTURE3;
    00131
    00132 typedef struct  DXPGRAPHICSHANDLE
    00133 {
    00134     DXPTEXTURE3 *tex;
    00135     u16         u0,v0,u1,v1;
    00136     int         handle;
    00137 }DXPGRAPHICSHANDLE;
    00138
    00139 typedef struct DXPMATERIAL
    00140 {
    00141     const char *name;
    00142     u32 emissive;
    00143     u32 ambient;
    00144     u32 diffuse;
    00145     u32 specular;
    00146 }DXPMATERIAL;
    00147
    00148 typedef struct DXPMESH
    00149 {
    00150     const char *name;
    00151 }DXPMESH;
    00152
    00153 typedef struct DXPMODEL
    00154 {
    00155 }DXPMODEL;
    00156
    00157
    00158 typedef struct DXPGRAPHICSDATA
    00159 {
    00160     unsigned    init : 1;
    00161     u32         display_psm;
    00162     DXPTEXTURE3 displaybuffer[2];       /*フレームバッファ*/
    00163     DXPTEXTURE3 *displaybuffer_back;    /*バックバッファ*/
    00164     DXPTEXTURE3 depthbuffer;            /*深度バッファ*/
    00165     DXPTEXTURE3 *rendertarget;          /*描画先*/
    00166     DXPTEXTURE3 *texture;               /*テクスチャ*/
    00167
    00168     void (*debugScreenCallback)();
    00169
    00170     u32         clear_color_value;
    00171     u32         clear_depth_value;
    00172     u32         clear_stencil_value;
    00173
    00174     unsigned    gustarted : 1;          /*ON between GUSTART and GUFINISH*/
    00175     unsigned    clear_depth : 1;        /*clear depth buffer when ClearDrawScreen is called*/
    00176     unsigned    clear_stencil : 1;      /*clear stencil buffer when ClearDrawScreen is called*/
    00177     unsigned    bilinear_enable : 1;    /*bilinear or nearest*/
    00178     unsigned    create_vram_graph: 1;
    00179     unsigned    create_swizzled_graph: 1;
    00180     unsigned    usestencil:1;
    00181     unsigned    writestencil:1;
    00182     unsigned    waitvsinc:1;
    00183
    00184     u32         colorkey;   /*カラーキー*/
    00185     int         blendmode;  /*ブレンドモード*/
    00186     u32         drawstate;
    00187     int         flag;
    00188     unsigned    forceupdate : 1;
    00189     u16 z_2d;       /*2D描画時に指定されるz座標*/
    00190     u32 color;  /*SetDrawBrightとSetDrawBlendmodeのパラメータ*/
    00191
    00192     u32 gucolor;/*設定されたディフューズ色*/
    00193     int op;
    00194     int src;
    00195     int dest;
    00196     u32 srcfix;
    00197     u32 destfix;
    00198     int tfx,tcc;
    00199     unsigned usedepth:1;
    00200     unsigned writedepth:1;
    00201     unsigned usedepth3d:1;
    00202     unsigned writedepth3d:1;
    00203     float fog_near,fog_far;
    00204     u32 fog_color;
    00205
    00206     int intrafont_statebuf;
    00207     int intrafont_scissor[4];
    00208
    00209
    00210     DXPTEXTURE3 *texarray[DXP_BUILDOPTION_TEXTURE_MAXNUM];
    00211     DXPGRAPHICSHANDLE *grapharray[DXP_BUILDOPTION_GHANDLE_MAXNUM];
    00212 }DXPGRAPHICSDATA;
    00213
    00214 int dxpGraphicsInit();
    00215 int dxpGraphicsEnd();
    00216
    00217 int dxpGraphicsCalcTexSize(int width,int height,int psm);
    00218
    00219 DXPTEXTURE3* dxpGraphicsCreateTexture();
    00220 int dxpGraphicsReleseTexture(DXPTEXTURE3* texptr);
    00221
    00222 DXPGRAPHICSHANDLE* dxpGraphicsCreateGraphicHandle();
    00223 int dxpGraphicsReleseGraphicHandle(DXPGRAPHICSHANDLE* gptr);
    00224
    00225
    00226 int dxpGraphicsSetup2DTex(DXPTEXTURE3 *texptr,int flag);
    00227 int dxpGraphicsSetup2D(u32 color);
    00228
    00229 #define PSM2BYTEX2(PSM) (PSM == GU_PSM_5650 || PSM == GU_PSM_5551 || PSM == GU_PSM_4444 ? 4 : (PSM == GU_PSM_8888 ? 8 : (PSM == GU_PSM_T8 ? 2 : 1)))
    00230
    00231 void dxpGraphicsWaitVSync();
    00232
    00233 //variables ----
    00234
    00235 extern DXPGRAPHICSDATA dxpGraphicsData;
    00236 extern u32 dxpGuList[GULIST_LEN];
    00237 extern u8 dxpPsm2SliceSize[11][2];
    00238
    00239 static inline DXPTEXTURE3* dxpGraphHandle2TexPtr(int gh)
    00240 {
    00241     if(gh < 0 || gh >= DXP_BUILDOPTION_GHANDLE_MAXNUM)return NULL;
    00242     return dxpGraphicsData.grapharray[gh]->tex;
    00243 }
    00244
    00245 static inline void* dxpGuGetMemory(u32 size)
    00246 {
    00247     int p = sceGuCheckList();
    00248     if(p > GULIST_LEN){return NULL;}//致命的なエラー。バッファオーバーランが発生している
    00249     if(p > GULIST_LIM){GUSYNC;GUSTART;}//コマンドリストが残り少ないので一度同期をとる
    00250     return sceGuGetMemory(size);
    00251 }