00001
00002 #ifndef DX_H
00003 #define DX_H
00004
00005
00006
00007 #define MAX_DISPLAY_MODES 32
00008 #define MAX_DISPLAY_MODE_TEXT 32
00009 #define MAX_DRAW_DEVICES 3
00010 #define MAX_DRAW_DEVICE_NAME 128
00011
00012 enum {
00013 GAMMA_UNAVAILABLE,
00014 GAMMA_AVAILABLE,
00015 GAMMA_AUTO,
00016 };
00017
00018
00019
00020 #if SCREEN_DEBUG
00021
00022 #define SET_RENDER_STATE(_s, _v) \
00023 { \
00024 D3Ddevice->SetRenderState((_s), (_v)); \
00025 RenderStateChange++; \
00026 }
00027
00028 #define SET_STAGE_STATE(_t, _s, _v) \
00029 { \
00030 D3Ddevice->SetTextureStageState((_t), (_s), (_v)); \
00031 RenderStateChange++; \
00032 }
00033
00034 #define SET_TEXTURE(_t, _tex) \
00035 { \
00036 D3Ddevice->SetTexture((_t), (_tex)); \
00037 TextureStateChange++; \
00038 }
00039
00040 #else
00041
00042 #define SET_RENDER_STATE(_s, _v) \
00043 { \
00044 D3Ddevice->SetRenderState(_s, _v); \
00045 }
00046
00047 #define SET_STAGE_STATE(_t, _s, _v) \
00048 { \
00049 D3Ddevice->SetTextureStageState((_t), (_s), (_v)); \
00050 }
00051
00052 #define SET_TEXTURE(_t, _tex) \
00053 { \
00054 D3Ddevice->SetTexture((_t), (_tex)) \
00055 }
00056
00057 #endif
00058
00059 #define MIPMAP_LODBIAS(_n) \
00060 { \
00061 float _f = _n; \
00062 SET_STAGE_STATE(0, D3DTSS_MIPMAPLODBIAS, *(DWORD*)&_f); \
00063 SET_STAGE_STATE(1, D3DTSS_MIPMAPLODBIAS, *(DWORD*)&_f); \
00064 }
00065
00066 #define TEXTURE_ADDRESS(_w) \
00067 { \
00068 SET_STAGE_STATE(0, D3DTSS_ADDRESS, _w); \
00069 SET_STAGE_STATE(1, D3DTSS_ADDRESS, _w); \
00070 }
00071
00072 #define FOG_ON() \
00073 { \
00074 if (!RenderFog) SET_RENDER_STATE(D3DRENDERSTATE_FOGENABLE, (RenderFog = TRUE)); \
00075 }
00076
00077 #define FOG_OFF() \
00078 { \
00079 if (RenderFog) SET_RENDER_STATE(D3DRENDERSTATE_FOGENABLE, (RenderFog = FALSE)); \
00080 }
00081
00082 #define ALPHA_ON() \
00083 { \
00084 if (!RenderAlpha) SET_RENDER_STATE(D3DRENDERSTATE_ALPHABLENDENABLE, (RenderAlpha = TRUE)); \
00085 }
00086
00087 #define ALPHA_OFF() \
00088 { \
00089 if (RenderAlpha) SET_RENDER_STATE(D3DRENDERSTATE_ALPHABLENDENABLE, (RenderAlpha = FALSE)); \
00090 }
00091
00092 #define ALPHA_SRC(_a) \
00093 { \
00094 if (RenderAlphaSrc != _a) SET_RENDER_STATE(D3DRENDERSTATE_SRCBLEND, (RenderAlphaSrc = _a)); \
00095 }
00096
00097 #define ALPHA_DEST(_a) \
00098 { \
00099 if (RenderAlphaDest != _a) SET_RENDER_STATE(D3DRENDERSTATE_DESTBLEND, (RenderAlphaDest = _a)); \
00100 }
00101
00102 #define ZWRITE_ON() \
00103 { \
00104 if (!RenderZwrite) SET_RENDER_STATE(D3DRENDERSTATE_ZWRITEENABLE, (RenderZwrite = TRUE)); \
00105 }
00106
00107 #define ZWRITE_OFF() \
00108 { \
00109 if (RenderZwrite) SET_RENDER_STATE(D3DRENDERSTATE_ZWRITEENABLE, (RenderZwrite = FALSE)); \
00110 }
00111
00112 #define ZBUFFER_ON() \
00113 { \
00114 if (RenderZbuffer != D3DZB_TRUE) SET_RENDER_STATE(D3DRENDERSTATE_ZENABLE, (RenderZbuffer = D3DZB_TRUE)); \
00115 }
00116
00117 #define ZBUFFER_OFF() \
00118 { \
00119 if (RenderZbuffer != D3DZB_FALSE) SET_RENDER_STATE(D3DRENDERSTATE_ZENABLE, (RenderZbuffer = D3DZB_FALSE)); \
00120 }
00121
00122 #define ZCMP(_c) \
00123 { \
00124 if (RenderZcmp != _c) SET_RENDER_STATE(D3DRENDERSTATE_ZFUNC, (RenderZcmp = _c)); \
00125 }
00126
00127 #define PERSPECTIVE_ON() \
00128 SET_RENDER_STATE(D3DRENDERSTATE_TEXTUREPERSPECTIVE, DxState.Perspective)
00129
00130 #define PERSPECTIVE_OFF() \
00131 SET_RENDER_STATE(D3DRENDERSTATE_TEXTUREPERSPECTIVE, FALSE)
00132
00133 #define DITHER_ON() \
00134 SET_RENDER_STATE(D3DRENDERSTATE_DITHERENABLE, DxState.Dither)
00135
00136 #define DITHER_OFF() \
00137 SET_RENDER_STATE(D3DRENDERSTATE_DITHERENABLE, FALSE)
00138
00139 #define COLORKEY_ON() \
00140 SET_RENDER_STATE(D3DRENDERSTATE_COLORKEYENABLE, DxState.ColorKey)
00141
00142 #define COLORKEY_OFF() \
00143 SET_RENDER_STATE(D3DRENDERSTATE_COLORKEYENABLE, FALSE)
00144
00145 #define ANTIALIAS_ON() \
00146 SET_RENDER_STATE(D3DRENDERSTATE_ANTIALIAS, DxState.AntiAlias)
00147
00148 #define ANTIALIAS_OFF() \
00149 SET_RENDER_STATE(D3DRENDERSTATE_ANTIALIAS, D3DANTIALIAS_NONE)
00150
00151 #define CULL_ON() \
00152 SET_RENDER_STATE(D3DRENDERSTATE_CULLMODE, D3DCULL_CCW)
00153
00154 #define CULL_OFF() \
00155 SET_RENDER_STATE(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE)
00156
00157 #define SPECULAR_ON() \
00158 SET_RENDER_STATE(D3DRENDERSTATE_SPECULARENABLE, TRUE)
00159
00160 #define SPECULAR_OFF() \
00161 SET_RENDER_STATE(D3DRENDERSTATE_SPECULARENABLE, FALSE)
00162
00163 #define WIREFRAME_ON() \
00164 SET_RENDER_STATE(D3DRENDERSTATE_FILLMODE, DxState.Wireframe)
00165
00166 #define WIREFRAME_OFF() \
00167 SET_RENDER_STATE(D3DRENDERSTATE_FILLMODE, D3DFILL_SOLID)
00168
00169 #define TEXTUREFILTER_OFF() \
00170 { \
00171 SET_STAGE_STATE(0, D3DTSS_MINFILTER, D3DTFN_POINT); \
00172 SET_STAGE_STATE(0, D3DTSS_MAGFILTER, D3DTFG_POINT); \
00173 SET_STAGE_STATE(1, D3DTSS_MINFILTER, D3DTFN_POINT); \
00174 SET_STAGE_STATE(1, D3DTSS_MAGFILTER, D3DTFG_POINT); \
00175 }
00176
00177 #define TEXTUREFILTER_ON() \
00178 { \
00179 switch (DxState.TextureFilter) \
00180 { \
00181 case 0: \
00182 SET_STAGE_STATE(0, D3DTSS_MINFILTER, D3DTFN_POINT); \
00183 SET_STAGE_STATE(0, D3DTSS_MAGFILTER, D3DTFG_POINT); \
00184 SET_STAGE_STATE(1, D3DTSS_MINFILTER, D3DTFN_POINT); \
00185 SET_STAGE_STATE(1, D3DTSS_MAGFILTER, D3DTFG_POINT); \
00186 break; \
00187 case 1: \
00188 SET_STAGE_STATE(0, D3DTSS_MINFILTER, D3DTFN_LINEAR); \
00189 SET_STAGE_STATE(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR); \
00190 SET_STAGE_STATE(1, D3DTSS_MINFILTER, D3DTFN_LINEAR); \
00191 SET_STAGE_STATE(1, D3DTSS_MAGFILTER, D3DTFG_LINEAR); \
00192 break; \
00193 case 2: \
00194 SET_STAGE_STATE(0, D3DTSS_MINFILTER, D3DTFN_ANISOTROPIC); \
00195 SET_STAGE_STATE(0, D3DTSS_MAGFILTER, D3DTFG_ANISOTROPIC); \
00196 SET_STAGE_STATE(1, D3DTSS_MINFILTER, D3DTFN_ANISOTROPIC); \
00197 SET_STAGE_STATE(1, D3DTSS_MAGFILTER, D3DTFG_ANISOTROPIC); \
00198 break; \
00199 } \
00200 }
00201
00202 #define MIPMAP_OFF() \
00203 { \
00204 SET_STAGE_STATE(0, D3DTSS_MIPFILTER, D3DTFP_NONE); \
00205 SET_STAGE_STATE(1, D3DTSS_MIPFILTER, D3DTFP_NONE); \
00206 }
00207
00208 #define MIPMAP_ON() \
00209 { \
00210 SET_STAGE_STATE(0, D3DTSS_MIPFILTER, DxState.MipMap + 1); \
00211 SET_STAGE_STATE(1, D3DTSS_MIPFILTER, DxState.MipMap + 1); \
00212 }
00213
00214 #define FOG_COLOR(_c) \
00215 SET_RENDER_STATE(D3DRENDERSTATE_FOGCOLOR, _c)
00216
00217 #define FOG_COLOR(_c) \
00218 SET_RENDER_STATE(D3DRENDERSTATE_FOGCOLOR, _c)
00219
00220 #define SORT_INDEPENDENT_ON() \
00221 SET_RENDER_STATE(D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT, TRUE)
00222
00223 #define SORT_INDEPENDENT_OFF() \
00224 SET_RENDER_STATE(D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT, FALSE)
00225
00226 #define SET_TPAGE(_tp) \
00227 { \
00228 if (RenderTP != _tp) \
00229 { \
00230 if ((RenderTP = _tp) == -1) \
00231 { \
00232 SET_TEXTURE(0, NULL); \
00233 } \
00234 else \
00235 { \
00236 SET_TEXTURE(0, TexInfo[RenderTP].Texture); \
00237 } \
00238 } \
00239 }
00240
00241 #define SET_TPAGE2(_tp) \
00242 { \
00243 if (RenderTP2 != _tp) \
00244 { \
00245 if ((RenderTP2 = _tp) == -1) \
00246 { \
00247 SET_TEXTURE(1, NULL); \
00248 } \
00249 else \
00250 { \
00251 SET_TEXTURE(1, TexInfo[RenderTP].Texture); \
00252 } \
00253 } \
00254 }
00255
00256
00257
00258 typedef struct {
00259 long WireframeEnabled, Wireframe;
00260 long PerspectiveEnabled, Perspective;
00261 long TextureFilterFlag, TextureFilter;
00262 long MipMapFlag, MipMap;
00263 long FogEnabled, Fog;
00264 long DitherEnabled, Dither;
00265 long ColorKeyEnabled, ColorKey;
00266 long AntiAliasEnabled, AntiAlias;
00267 } DX_STATE;
00268
00269 typedef struct {
00270 DWORD Width, Height, Bpp, Refresh;
00271 char DisplayText[MAX_DISPLAY_MODE_TEXT];
00272 } DISPLAY_MODE;
00273
00274 typedef struct {
00275 char Name[MAX_DRAW_DEVICE_NAME];
00276 long DisplayModeNum, BestDisplayMode;
00277 DISPLAY_MODE DisplayMode[MAX_DISPLAY_MODES];
00278 } DRAW_DEVICE;
00279
00280
00281
00282 extern BOOL InitDD(void);
00283 extern BOOL InitD3D(DWORD width, DWORD height, DWORD bpp, DWORD refresh);
00284 extern void ReleaseDX(void);
00285 extern void ReleaseD3D(void);
00286 extern void SetGamma(long brightness, long contrast);
00287 extern void ErrorDX(HRESULT r, char *mess);
00288 extern void SetBackgroundColor(long col);
00289 extern HRESULT CALLBACK EnumZedBufferCallback(DDPIXELFORMAT *ddpf, void *user);
00290 extern void CheckSurfaces(void);
00291 extern void FlipBuffers(void);
00292 extern void ClearBuffers(void);
00293 extern void SetFrontBufferRGB(long rgb);
00294 extern void SetupDxState(void);
00295 extern void GetDrawDevices(void);
00296 extern BOOL CALLBACK GetDrawDeviceCallback(GUID *lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam);
00297 extern BOOL CALLBACK CreateDrawDeviceCallback(GUID *lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam);
00298 extern HRESULT CALLBACK DisplayModesCallback(DDSURFACEDESC2 *Mode, void *UserArg);
00299
00300
00301
00302 extern DX_STATE DxState;
00303 extern IDirectDraw4 *DD;
00304 extern IDirectDrawSurface4 *FrontBuffer;
00305 extern IDirectDrawSurface4 *BackBuffer;
00306 extern IDirectDrawSurface4 *ZedBuffer;
00307 extern IDirectDrawGammaControl *GammaControl;
00308 extern IDirect3D3 *D3D;
00309 extern IDirect3DDevice3 *D3Ddevice;
00310 extern IDirect3DViewport3 *D3Dviewport;
00311 extern D3DDEVICEDESC D3Dcaps;
00312 extern DDPIXELFORMAT ZedBufferFormat;
00313 extern DWORD ScreenXsize;
00314 extern DWORD ScreenYsize;
00315 extern DWORD ScreenBpp;
00316 extern DWORD ScreenRefresh;
00317 extern long GammaFlag;
00318 extern long NoColorKey;
00319 extern long DrawDeviceNum, CurrentDrawDevice;
00320 extern long DisplayModeCount, RenderStateChange, TextureStateChange;
00321 extern DRAW_DEVICE DrawDevices[];
00322 extern short RenderTP, RenderTP2, RenderFog, RenderAlpha, RenderAlphaSrc, RenderAlphaDest;
00323 extern short RenderZcmp, RenderZwrite, RenderZbuffer;
00324
00325 #endif