source: golgotha/src/maxtool/sdk_inc/gfx.h @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 11 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
  • Property svn:keywords set to Id
File size: 10.4 KB
Line 
1/**********************************************************************
2 *<
3        FILE: gfx.h
4
5        DESCRIPTION: main graphics system include file.
6
7        CREATED BY: Don Brittain
8
9        HISTORY:
10
11 *>     Copyright (c) 1994, All Rights Reserved.
12 **********************************************************************/
13
14#if !defined(_GFX_H_)
15
16#define _GFX_H_
17
18#include "geomlib.h"
19#include "export.h"
20#include "mtl.h"
21
22#define WM_SHUTDOWN                     (WM_USER+2001)
23#define WM_INIT_COMPLETE        (WM_USER+2002)
24
25#define GW_MAX_FILE_LEN         128
26#define GW_MAX_CAPTION_LEN      128
27
28#define GW_MAX_VERTS            32
29
30typedef BOOL    (*HitFunc)(int, int, void *);
31
32// Rendering modes
33#define GW_NO_ATTS                      0x0000
34#define GW_WIREFRAME            0x0001
35#define GW_ILLUM                        0x0002
36#define GW_FLAT                         0x0004
37#define GW_SPECULAR                     0x0008
38#define GW_TEXTURE                      0x0010
39#define GW_Z_BUFFER                     0x0020
40#define GW_PERSP_CORRECT        0x0040
41#define GW_BACKCULL                     0x0100
42#define GW_TWO_SIDED            0x0200
43#define GW_WIDE_LINES           0x0400  // not implemented!
44#define GW_PICK                         0x1000
45#define GW_BOX_MODE                     0x2000
46#define GW_ALL_EDGES            0x4000
47
48#define GW_LIGHTING                     (GW_ILLUM | GW_SPECULAR)
49
50
51// spotlight shapes
52#define GW_SHAPE_RECT           0
53#define GW_SHAPE_CIRCULAR       1
54
55// texture tiling
56#define GW_TEX_NO_TILING        0
57#define GW_TEX_REPEAT           1
58#define GW_TEX_MIRROR           2
59
60// View volume clip flags
61#define GW_LEFT_PLANE           0x0100
62#define GW_RIGHT_PLANE          0x0200
63#define GW_BOTTOM_PLANE         0x0400
64#define GW_TOP_PLANE            0x0800
65#define GW_FRONT_PLANE          0x1000
66#define GW_BACK_PLANE           0x2000
67#define GW_PLANE_MASK           0x3f00
68
69// edge styles
70#define GW_EDGE_SKIP            0
71#define GW_EDGE_VIS                     1
72#define GW_EDGE_INVIS           2
73
74// buffer types (for dual-plane stuff)
75#define BUF_F_BUFFER            0
76#define BUF_Z_BUFFER            1
77
78// support method return values
79// DONT_KNOW should be returned for all non-driver dependent queries!
80#define GW_DONT_KNOW            0
81#define GW_DOES_SUPPORT         0x0008
82#define GW_DOES_NOT_SUPPORT 0x0080
83#define GW_ALWAYS_OFF           (0x0020 | GW_DOES_NOT_SUPPORT)
84#define GW_ALWAYS_ON            (0x0002 | GW_DOES_SUPPORT)
85#define GW_CAN_TOGGLE           (0x0004 | GW_DOES_SUPPORT)
86
87// support queries
88#define GW_SPT_TEXTURES         1
89#define GW_SPT_TXT_CORRECT      2
90
91// light types
92enum LightType { OMNI_LGT, SPOT_LGT, DIRECT_LGT, AMBIENT_LGT };
93
94// Light attenuation types -- not fully implemented
95enum Attenuation { NO_ATTEN, LINEAR_ATTEN, INVERSE_ATTEN };
96
97// General 3D light structure
98class Light {
99public:
100    DllExport Light();
101    LightType           type;
102    Point3                      color;
103    Attenuation         attenType;
104    float                       atten;
105    float                       intensity;
106    float                       angle;
107        int                             shape;
108        float                   aspect;
109        int                             overshoot;
110};
111
112enum CameraType { PERSP_CAM, ORTHO_CAM };
113
114// General camera structure
115class Camera {
116public:
117        DllExport Camera();
118        void                    setPersp(float f, float asp)
119                                                { type = PERSP_CAM; persp.fov = f;
120                                                  persp.aspect = asp; makeMatrix(); }
121        void                    setOrtho(float l, float t, float r, float b)
122                                                { type = ORTHO_CAM; ortho.left = l; ortho.top = t;
123                                                  ortho.right = r; ortho.bottom = b; makeMatrix(); }
124        void                    setClip(float h, float y)
125                                                { hither = h; yon = y; makeMatrix(); }
126        CameraType              getType(void)   { return type; }
127        float                   getHither(void) { return hither; }
128        float                   getYon(void)    { return yon; }
129        DllExport void  reset();
130        void                    getProj(float mat[4][4])       
131                                                { memcpy(mat, proj, 16 * sizeof(float)); }
132private:
133        DllExport void  makeMatrix();
134        float                   proj[4][4];
135        CameraType              type;
136        union {
137            struct {
138            float       fov;
139            float       aspect;
140                } persp;
141                struct {
142                    float       left;
143                    float       right;
144                    float       bottom;
145                    float       top;
146                } ortho;
147        };
148        float                   hither;
149        float                   yon;
150};
151
152const double pi        = 3.141592653589793;
153const double piOver180 = 3.141592653589793 / 180.0;
154
155// Color types (used by setColor)
156enum ColorType { LINE_COLOR, FILL_COLOR, TEXT_COLOR, CLEAR_COLOR };
157
158// Marker types
159enum MarkerType  { POINT_MRKR, HOLLOW_BOX_MRKR, PLUS_SIGN_MRKR,
160                                                   ASTERISK_MRKR, X_MRKR, BIG_BOX_MRKR };
161
162// Region types (for built-in hit-testing)
163#define POINT_RGN       0x0001
164#define RECT_RGN        0x0002
165#define CIRCLE_RGN      0x0004
166#define FENCE_RGN       0x0008
167
168typedef struct tagCIRCLE
169{
170    LONG  x;
171    LONG  y;
172        LONG  r;
173} CIRCLE;
174
175class HitRegion {
176public:
177        int                             type;
178        int                             crossing;// not used for point
179        int                             epsilon; // not used for rect or circle
180        union {
181                POINT           pt;
182                RECT            rect;
183                CIRCLE          circle;
184                POINT *         pts;
185        };
186};
187
188inline int ABS(const int x) { return (x > 0) ? x : -x; }
189
190typedef void (*GFX_ESCAPE_FN)(void *);
191
192
193// driver types for getDriver() method
194#define GW_DRV_RENDERER         0
195#define GW_DRV_DEVICE           1
196
197// graphics window setup structure
198class GWinSetup {
199public:
200    DllExport GWinSetup();
201    TCHAR               caption[GW_MAX_CAPTION_LEN];
202        TCHAR           renderer[GW_MAX_FILE_LEN];
203        TCHAR           device[GW_MAX_FILE_LEN];
204        DWORD           winStyle;
205        POINT           size;
206        POINT           place;
207        int                     id;
208};
209
210// abstract graphics window class
211class GraphicsWindow {
212public:
213        virtual ~GraphicsWindow() {}
214        virtual int             getVersion() = 0;
215        virtual TCHAR * getDriver(int which) = 0;
216        virtual TCHAR * getDriverString(void) = 0;
217        virtual HWND    getHWnd(void) = 0;
218        virtual BOOL    canConfig(void) = 0;
219        virtual void    config(HWND hWnd) = 0;
220        virtual int             querySupport(int what) = 0;
221
222    virtual void        setColor(ColorType t, float r, float g, float b) = 0;
223        virtual void    resetUpdateRect() = 0;
224        virtual void    enlargeUpdateRect(RECT *rp) = 0;
225        virtual int             getUpdateRect(RECT *rp) = 0;
226    virtual void        updateScreen() = 0;
227
228        virtual void    setPos(int x, int y, int w, int h) = 0;
229        virtual int             getWinSizeX() = 0;
230        virtual int             getWinSizeY() = 0;
231        virtual DWORD   getWinDepth(void) = 0;
232        virtual DWORD   getHitherCoord(void) = 0;
233        virtual DWORD   getYonCoord(void) = 0;
234        virtual void    getTextExtents(TCHAR *text, SIZE *sp) = 0;
235
236        virtual BOOL    setBufAccess(int which, int b) = 0;
237        virtual BOOL    getBufAccess(int which) = 0;
238        virtual BOOL    getBufSize(int which, int *size) = 0;
239        virtual BOOL    getBuf(int which, int size, void *buf) = 0;
240        virtual BOOL    setBuf(int which, int size, void *buf, RECT *rp) = 0;
241        virtual BOOL    getDIB(BITMAPINFO *bmi, int *size) = 0;
242        virtual BOOL    setBackgroundDIB(BITMAPINFO *bmi) = 0;
243        virtual DWORD   getTextureHandle(BITMAPINFO *bmi) = 0;
244        virtual void    freeTextureHandle(DWORD handle) = 0;
245        virtual BOOL    setTextureByHandle(DWORD handle) = 0;
246        virtual BOOL    setTextureDIB(BITMAPINFO *bmi) = 0;
247        virtual BOOL    setTextureTiling(int u, int v, int w=GW_TEX_NO_TILING) = 0;
248        virtual int             getTextureTiling(int which) = 0;
249
250        virtual void    beginFrame() = 0;
251        virtual void    endFrame() = 0;
252        virtual void    setViewport(int x, int y, int w, int h) = 0;
253    virtual void        clearScreen(RECT *rp, int useBkg = FALSE) = 0;
254    virtual void        setTransform(const Matrix3 &m) = 0;
255    virtual void        setTexTransform(const Matrix3 &m) = 0;
256        virtual BOOL    getFlipped(void)=0;
257        virtual void    setSkipCount(int c) = 0;
258        virtual int             getSkipCount(void) = 0;
259    virtual void        setRndLimits(DWORD l) = 0;
260        virtual DWORD   getRndLimits(void) = 0;
261        virtual DWORD   getRndMode(void) = 0;
262        virtual int             getMaxLights(void) = 0;
263    virtual void        setLight(int num, const Light *l) = 0;
264        virtual void    setLightExclusion(DWORD exclVec) = 0;
265    virtual void        setCamera(const Camera &c) = 0;
266        virtual void    setCameraMatrix(float mat[4][4], Matrix3 *invTM, int persp, float hither, float yon) = 0;
267        virtual void    getCameraMatrix(float mat[4][4], Matrix3 *invTM, int *persp, float *hither, float *yon) = 0;
268    virtual void        setMaterial(const Material &m) = 0;
269        virtual Material *getMaterial(void) = 0;
270
271        virtual DWORD   transPointFWin(const Point3 *in, Point3 *out) = 0;
272        virtual DWORD   transPointIWin(const Point3 *in, IPoint3 *out) = 0;
273        virtual void    lightVertex(const Point3 &pos, const Point3 &nor, Point3 &rgb) = 0;
274
275        virtual void    fWinText(Point3 *xyz, TCHAR *s) = 0;
276        virtual void    fWinMarker(Point3 *xyz, MarkerType type) = 0;
277        virtual void    fWinPolyline(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw, int closed, int *es) = 0;
278        virtual void    fWinPolygon(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw) = 0;
279
280        virtual void    iWinText(IPoint3 *xyz, TCHAR *s) = 0;
281        virtual void    iWinMarker(IPoint3 *xyz, MarkerType type) = 0;
282        virtual void    iWinPolyline(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int closed, int *es) = 0;
283        virtual void    iWinPolygon(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw) = 0;
284
285    virtual void        text(Point3 *xyz, TCHAR *s) = 0;
286    virtual void        marker(Point3 *xyz, MarkerType type) = 0;
287        virtual void    polyline(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw, int closed, int *es) = 0;
288        virtual void    polygon(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw) = 0;
289
290        virtual void    setHitRegion(HitRegion *rgn) = 0;
291        virtual void    clearHitCode(void) = 0;
292        virtual BOOL    checkHitCode(void) = 0;
293        virtual DWORD   getHitDistance(void) = 0;
294
295        virtual int             isPerspectiveView(void) = 0;
296        virtual float   interpWorld(Point3 *world1, Point3 *world2, float sParam, Point3 *interpPt) = 0;
297
298        virtual void    escape(GFX_ESCAPE_FN fn, void *data) = 0;
299
300protected:
301        DWORD                   winStyle;
302        TCHAR                   caption[GW_MAX_CAPTION_LEN];
303};
304
305// for Windows int coords with origin at upper-left
306inline int iWinIsFacingBack(const IPoint3 &v0, const IPoint3 &v1, const IPoint3 &v2, int flip=0 )
307{
308        int s = ( (v0[0]-v1[0])*(v2[1]-v1[1]) - (v2[0]-v1[0])*(v0[1]-v1[1]) ) < 0;
309        return flip ? !s : s;
310}
311
312// for float coords with origin at lower-left
313inline int fWinIsFacingBack(const Point3 &v0, const Point3 &v1, const Point3 &v2, int flip=0 )
314{
315        int s = ( (v0[0]-v1[0])*(v2[1]-v1[1]) - (v2[0]-v1[0])*(v0[1]-v1[1]) ) > 0.0f;
316        return flip ? !s : s;
317}
318
319DllExport GraphicsWindow *createGW(HWND hWnd, GWinSetup &gws);
320
321DllExport void getRegionRect(HitRegion *hr, RECT *rect);
322DllExport BOOL pointInRegion(int x, int y, HitRegion *hr);
323
324DllExport int distToLine(int x, int y, int *p1, int *p2);
325DllExport int lineCrossesRect(RECT *rc, int *p1, int *p2);
326DllExport int segCrossesCircle(int cx, int cy, int r, int *p1, int *p2);
327DllExport BOOL insideTriangle(IPoint3 &p0, IPoint3 &p1, IPoint3 &p2, IPoint3 &q);
328DllExport int getZfromTriangle(IPoint3 &p0, IPoint3 &p1, IPoint3 &p2, IPoint3 &q);
329
330       
331#endif // _GFX_H_
332
Note: See TracBrowser for help on using the repository browser.