📄 gfx.h
字号:
/**********************************************************************
*<
FILE: gfx.h
DESCRIPTION: main graphics system include file.
CREATED BY: Don Brittain
HISTORY:
*> Copyright (c) 1994, All Rights Reserved.
**********************************************************************/
#if !defined(_GFX_H_)
#define _GFX_H_
#include "geomlib.h"
#include "export.h"
#include "mtl.h"
#ifndef UtilExport
#define UtilExport __declspec( dllimport )
#endif
#include "assert1.h"
#include "tab.h"
typedef Tab<DWORD> DWTab;
typedef unsigned short MtlID;
// strip-related stuff
#define PUT_NORMALS_IN_STRIPS
class Strip {
public:
MtlID mID;
DWORD smGrp;
DWTab v;
DWTab tv;
void AddVert(DWORD vtx) { v.Append(1, &vtx); }
void AddVert(DWORD vtx, DWORD tvtx) { v.Append(1, &vtx); tv.Append(1, &tvtx); }
#ifdef PUT_NORMALS_IN_STRIPS
DWTab n;
void AddVertN(DWORD vtx, DWORD nor) { v.Append(1, &vtx); n.Append(1, &nor); }
void AddVertN(DWORD vtx, DWORD tvtx, DWORD nor) { v.Append(1, &vtx); tv.Append(1, &tvtx); n.Append(1, &nor); }
#endif
};
typedef Strip *StripPtr;
typedef Tab<StripPtr> StripTab;
// General definitions
#define WM_SHUTDOWN (WM_USER+2001)
#define WM_INIT_COMPLETE (WM_USER+2002)
#define GW_MAX_FILE_LEN 128
#define GW_MAX_CAPTION_LEN 128
#define GW_MAX_VERTS 32
#define GFX_MAX_STRIP 100
typedef BOOL (*HitFunc)(int, int, void *);
// Rendering modes
#define GW_NO_ATTS 0x00000
#define GW_WIREFRAME 0x00001
#define GW_ILLUM 0x00002
#define GW_FLAT 0x00004
#define GW_SPECULAR 0x00008
#define GW_TEXTURE 0x00010
#define GW_Z_BUFFER 0x00020
#define GW_PERSP_CORRECT 0x00040
#define GW_POLY_EDGES 0x00080
#define GW_BACKCULL 0x00100
#define GW_TWO_SIDED 0x00200
#define GW_COLOR_VERTS 0x00400
#define GW_SHADE_CVERTS 0x00800
#define GW_PICK 0x01000
#define GW_BOX_MODE 0x02000
#define GW_ALL_EDGES 0x04000
#define GW_VERT_TICKS 0x08000
#define GW_SHADE_SEL_FACES 0x10000
#define GW_LIGHTING (GW_ILLUM | GW_SPECULAR)
// spotlight shapes
#define GW_SHAPE_RECT 0
#define GW_SHAPE_CIRCULAR 1
// texture tiling
#define GW_TEX_NO_TILING 0
#define GW_TEX_REPEAT 1
#define GW_TEX_MIRROR 2
// View volume clip flags
#define GW_LEFT_PLANE 0x0100
#define GW_RIGHT_PLANE 0x0200
#define GW_BOTTOM_PLANE 0x0400
#define GW_TOP_PLANE 0x0800
#define GW_FRONT_PLANE 0x1000
#define GW_BACK_PLANE 0x2000
#define GW_PLANE_MASK 0x3f00
// edge styles
#define GW_EDGE_SKIP 0
#define GW_EDGE_VIS 1
#define GW_EDGE_INVIS 2
// buffer types (for dual-plane stuff)
#define BUF_F_BUFFER 0
#define BUF_Z_BUFFER 1
// support method return values
#define GW_DOES_SUPPORT TRUE
#define GW_DOES_NOT_SUPPORT FALSE
// support queries
#define GW_SPT_TXT_CORRECT 0 // allow persp correction to be toggled?
#define GW_SPT_GEOM_ACCEL 1 // do 3D xforms, clipping, lighting thru driver?
#define GW_SPT_TRI_STRIPS 2 // send down strips instead of individual triangles?
#define GW_SPT_DUAL_PLANES 3 // allow dual planes to be used?
#define GW_SPT_SWAP_MODEL 4 // update viewports with complete redraw on WM_PAINT?
#define GW_SPT_INCR_UPDATE 5 // redraw only damaged areas on object move?
#define GW_SPT_1_PASS_DECAL 6 // do decaling with only one pass?
#define GW_SPT_DRIVER_CONFIG 7 // allow driver config dialog box?
#define GW_SPT_TEXTURED_BKG 8 // is viewport background a texture?
#define GW_SPT_VIRTUAL_VPTS 9 // are viewports bigger than the window allowed?
#define GW_SPT_PAINT_DOES_BLIT 10 // does WM_PAINT cause a backbuffer blit?
#define GW_SPT_WIREFRAME_STRIPS 11 // if true, wireframe objects are sent as tristrips
#define GW_SPT_ORG_UPPER_LEFT 12 // true if device origin is at upper left, false o/w
#define GW_SPT_ARRAY_PROCESSING 13 // true if the driver can handle vertex array data
#define GW_SPT_TOTAL 14 // always the max number of spt queries
// display state of the graphics window
#define GW_DISPLAY_MAXIMIZED 1
#define GW_DISPLAY_WINDOWED 2
#define GW_DISPLAY_INVISIBLE 3
// multi-pass rendering
#define GW_PASS_ONE 0
#define GW_PASS_TWO 1
// light types
enum LightType { OMNI_LGT, SPOT_LGT, DIRECT_LGT, AMBIENT_LGT };
// Light attenuation types -- not fully implemented
#define GW_ATTEN_NONE 0x0000
#define GW_ATTEN_START 0x0001
#define GW_ATTEN_END 0x0002
#define GW_ATTEN_LINEAR 0x0010
#define GW_ATTEN_QUAD 0x0020
// General 3D light structure
class Light {
public:
DllExport Light();
LightType type;
Point3 color;
int attenType;
float attenStart;
float attenEnd;
float intensity;
float hotSpotAngle;
float fallOffAngle;
int shape;
float aspect;
int overshoot;
BOOL affectDiffuse;
BOOL affectSpecular;
};
enum CameraType { PERSP_CAM, ORTHO_CAM };
// General camera structure
class Camera {
public:
DllExport Camera();
void setPersp(float f, float asp)
{ type = PERSP_CAM; persp.fov = f;
persp.aspect = asp; makeMatrix(); }
void setOrtho(float l, float t, float r, float b)
{ type = ORTHO_CAM; ortho.left = l; ortho.top = t;
ortho.right = r; ortho.bottom = b; makeMatrix(); }
void setClip(float h, float y)
{ hither = h; yon = y; makeMatrix(); }
CameraType getType(void) { return type; }
float getHither(void) { return hither; }
float getYon(void) { return yon; }
DllExport void reset();
void getProj(float mat[4][4])
{ memcpy(mat, proj, 16 * sizeof(float)); }
private:
DllExport void makeMatrix();
float proj[4][4];
CameraType type;
union {
struct {
float fov;
float aspect;
} persp;
struct {
float left;
float right;
float bottom;
float top;
} ortho;
};
float hither;
float yon;
};
const double pi = 3.141592653589793;
const double piOver180 = 3.141592653589793 / 180.0;
// Color types (used by setColor)
enum ColorType { LINE_COLOR, FILL_COLOR, TEXT_COLOR, CLEAR_COLOR };
// Marker types
enum MarkerType { POINT_MRKR, HOLLOW_BOX_MRKR, PLUS_SIGN_MRKR,
ASTERISK_MRKR, X_MRKR, BIG_BOX_MRKR,
CIRCLE_MRKR, TRIANGLE_MRKR, DIAMOND_MRKR,
SM_HOLLOW_BOX_MRKR, SM_CIRCLE_MRKR,
SM_TRIANGLE_MRKR, SM_DIAMOND_MRKR,
DOT_MRKR, SM_DOT_MRKR
};
// Region types (for built-in hit-testing)
#define POINT_RGN 0x0001
#define RECT_RGN 0x0002
#define CIRCLE_RGN 0x0004
#define FENCE_RGN 0x0008
typedef struct tagCIRCLE
{
LONG x;
LONG y;
LONG r;
} CIRCLE;
class HitRegion {
public:
int type;
int crossing;// not used for point
int epsilon; // not used for rect or circle
union {
POINT pt;
RECT rect;
CIRCLE circle;
POINT * pts;
};
};
inline int ABS(const int x) { return (x > 0) ? x : -x; }
typedef void (*GFX_ESCAPE_FN)(void *);
// driver types for getDriver() method
#define GW_DRV_RENDERER 0
#define GW_DRV_DEVICE 1
// for possible future implementation
#define GW_HEIDI 0
#define GW_OPENGL 1
#define GW_DIRECT3D 2
#define GW_HEIDI3D 3
#define GW_NULL 4
#define GW_CUSTOM 5
// graphics window setup structure
class GWinSetup {
public:
DllExport GWinSetup();
TCHAR caption[GW_MAX_CAPTION_LEN];
TCHAR renderer[GW_MAX_FILE_LEN];
TCHAR device[GW_MAX_FILE_LEN];
DWORD winStyle;
POINT size;
POINT place;
int id;
int type;
};
// abstract graphics window class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -