680 lines
24 KiB
C++
Executable File
680 lines
24 KiB
C++
Executable File
/**********************************************************************
|
|
*<
|
|
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 "tab.h"
|
|
#include "mtl.h"
|
|
#include "BaseInterface.h"
|
|
|
|
typedef Tab<DWORD> DWTab;
|
|
typedef unsigned short MtlID;
|
|
|
|
// strip-related stuff
|
|
|
|
class Strip {
|
|
public:
|
|
MtlID mID;
|
|
DWORD smGrp;
|
|
DWTab v;
|
|
DWTab n;
|
|
DWTab tv;
|
|
void AddVert(DWORD vtx) { v.Append(1, &vtx); }
|
|
void AddVert(DWORD vtx, DWORD tvtx) { v.Append(1, &vtx); tv.Append(1, &tvtx); }
|
|
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); }
|
|
};
|
|
|
|
typedef Strip *StripPtr;
|
|
typedef Tab<StripPtr> StripTab;
|
|
|
|
|
|
// Face Flags: (moved from mesh.h)
|
|
// 3 LSBs hold the edge visibility flags
|
|
// Bit 3 indicates the presence of texture verticies
|
|
|
|
// if bit is 1, edge is visible
|
|
#define EDGE_VIS 1
|
|
#define EDGE_INVIS 0
|
|
|
|
// first edge-visibility bit field
|
|
#define VIS_BIT 0x0001
|
|
#define VIS_MASK 0x0007
|
|
|
|
#define EDGE_A (1<<0)
|
|
#define EDGE_B (1<<1)
|
|
#define EDGE_C (1<<2)
|
|
#define EDGE_ALL (EDGE_A|EDGE_B|EDGE_C)
|
|
|
|
#define FACE_HIDDEN (1<<3)
|
|
#define HAS_TVERTS (1<<4)
|
|
#define FACE_WORK (1<<5) // used in various algorithms
|
|
#define FACE_STRIP (1<<6)
|
|
|
|
// flags to indicate that face normal is used because no smoothing group
|
|
// normal is found
|
|
#define FACE_NORM_A (1<<8)
|
|
#define FACE_NORM_B (1<<9)
|
|
#define FACE_NORM_C (1<<10)
|
|
#define FACE_NORM_MASK 0x0700
|
|
|
|
// The mat ID is stored in the HIWORD of the face flags
|
|
#define FACE_MATID_SHIFT 16
|
|
#define FACE_MATID_MASK 0xFFFF
|
|
|
|
|
|
class GWFace {
|
|
public:
|
|
DWORD v[3]; // indexed references to the vertex array
|
|
DWORD flags; // see face flags description above
|
|
};
|
|
|
|
// Display flags -- for processWireFaces (and general mesh class use: moved from mesh.h)
|
|
#define DISP_VERTTICKS (1<<0)
|
|
#define DISP_SELVERTS (1<<10)
|
|
#define DISP_SELFACES (1<<11)
|
|
#define DISP_SELEDGES (1<<12)
|
|
#define DISP_SELPOLYS (1<<13)
|
|
|
|
#define DISP_OBJSELECTED (1<<8) // mimics COMP_OBJSELECTED in mesh.h
|
|
|
|
|
|
// 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
|
|
#define GFX_MAX_TEXTURES 8
|
|
|
|
typedef BOOL (*HitFunc)(int, int, void *);
|
|
|
|
// Rendering modes
|
|
#define GW_NO_ATTS 0x000000
|
|
#define GW_WIREFRAME 0x000001
|
|
#define GW_ILLUM 0x000002
|
|
#define GW_FLAT 0x000004
|
|
#define GW_SPECULAR 0x000008
|
|
#define GW_TEXTURE 0x000010
|
|
#define GW_Z_BUFFER 0x000020
|
|
#define GW_PERSP_CORRECT 0x000040
|
|
#define GW_POLY_EDGES 0x000080
|
|
#define GW_BACKCULL 0x000100
|
|
#define GW_TWO_SIDED 0x000200
|
|
#define GW_COLOR_VERTS 0x000400
|
|
#define GW_SHADE_CVERTS 0x000800
|
|
#define GW_PICK 0x001000
|
|
#define GW_BOX_MODE 0x002000
|
|
#define GW_ALL_EDGES 0x004000
|
|
#define GW_VERT_TICKS 0x008000
|
|
#define GW_SHADE_SEL_FACES 0x010000
|
|
#define GW_TRANSPARENCY 0x020000
|
|
#define GW_TRANSPARENT_PASS 0x040000
|
|
#define GW_EMISSIVE_VERTS 0x080000
|
|
#define GW_ALL_OPAQUE 0x100000
|
|
|
|
#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
|
|
|
|
// texture operations
|
|
#define GW_TEX_LEAVE 0 // Use the source pixel value
|
|
#define GW_TEX_REPLACE 1 // Use the texture pixel value
|
|
#define GW_TEX_MODULATE 2 // Multiply the source with the texture
|
|
#define GW_TEX_ADD 3 // Add the source and texture
|
|
#define GW_TEX_ADD_SIGNED 4 // Add the source and texture with an 0.5 subtraction
|
|
#define GW_TEX_SUBTRACT 5 // Subtract the source from the texture
|
|
#define GW_TEX_ADD_SMOOTH 6 // Add the source and the texture then subtract their product
|
|
#define GW_TEX_ALPHA_BLEND 7 // Alpha blend the texture with the source
|
|
#define GW_TEX_PREMULT_ALPHA_BLEND 8 // Alpha blend the the source with a premultiplied alpha texture
|
|
|
|
// texture scale factors
|
|
#define GW_TEX_SCALE_1X 0 // Multiply the tex op result by 1
|
|
#define GW_TEX_SCALE_2X 1 // Multiply the tex op result by 2
|
|
#define GW_TEX_SCALE_4X 2 // Multiply the tex op result by 4
|
|
|
|
// texture alpha sources
|
|
#define GW_TEX_ZERO 0 // Use no alpha value
|
|
#define GW_TEX_SOURCE 1 // Use the source alpha
|
|
#define GW_TEX_TEXTURE 2 // Use the texture alpha
|
|
#define GW_TEX_CONSTANT 3 // Use a constant BGRA color as an alpha
|
|
#define GW_TEX_PREVIOUS 4 // Use the previous texture stage alpha
|
|
|
|
// 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_NUM_LIGHTS 14 // number of lights supported
|
|
#define GW_SPT_NUM_TEXTURES 15 // number of multitexture stages supported
|
|
#define GW_SPT_WIRE_FACES 16 // support for wireframe faces with visibility flags
|
|
#define GW_SPT_TOTAL 17 // 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 BaseInterfaceServer {
|
|
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 BaseInterfaceServer {
|
|
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
|
|
};
|
|
|
|
|
|
#define AC_DIR_RL_CROSS 0 // right->left => crossing (AutoCAD compatible)
|
|
#define AC_DIR_LR_CROSS 1 // left->right => crossing (ACAD incompatible)
|
|
|
|
DllExport void setAutoCross(int onOff);
|
|
DllExport int getAutoCross();
|
|
DllExport void setAutoCrossDir(int dir);
|
|
DllExport int getAutoCrossDir();
|
|
|
|
// Region types (for built-in hit-testing)
|
|
#define POINT_RGN 0x0001
|
|
#define RECT_RGN 0x0002
|
|
#define CIRCLE_RGN 0x0004
|
|
#define FENCE_RGN 0x0008
|
|
|
|
// region directions (left or right)
|
|
#define RGN_DIR_UNDEF -1
|
|
#define RGN_DIR_RIGHT 0
|
|
#define RGN_DIR_LEFT 1
|
|
|
|
typedef struct tagCIRCLE
|
|
{
|
|
LONG x;
|
|
LONG y;
|
|
LONG r;
|
|
} CIRCLE;
|
|
|
|
class HitRegion {
|
|
DWORD size;
|
|
public:
|
|
int type;
|
|
int dir; // region direction
|
|
int crossing; // not used for point
|
|
int epsilon; // not used for rect or circle
|
|
union {
|
|
POINT pt;
|
|
RECT rect;
|
|
CIRCLE circle;
|
|
POINT * pts;
|
|
};
|
|
HitRegion() { dir = RGN_DIR_UNDEF; size = sizeof(HitRegion);}
|
|
};
|
|
|
|
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_PTR id;
|
|
// WIN64 Cleanup: Shuler
|
|
int type;
|
|
};
|
|
|
|
// abstract graphics window class
|
|
class GraphicsWindow : public InterfaceServer {
|
|
public:
|
|
virtual ~GraphicsWindow() {}
|
|
virtual void postCreate(int ct, GraphicsWindow **gw) = 0;
|
|
virtual void shutdown() = 0;
|
|
virtual int getVersion() = 0;
|
|
virtual TCHAR * getDriverString(void) = 0;
|
|
virtual void config(HWND hWnd) = 0;
|
|
virtual int querySupport(int what) = 0;
|
|
|
|
virtual HWND getHWnd(void) = 0;
|
|
virtual void setPos(int x, int y, int w, int h) = 0;
|
|
virtual void setDisplayState(int s) = 0;
|
|
virtual int getDisplayState() = 0;
|
|
virtual int getWinSizeX() = 0;
|
|
virtual int getWinSizeY() = 0;
|
|
virtual DWORD getWinDepth(void) = 0;
|
|
virtual DWORD getHitherCoord(void) = 0;
|
|
virtual DWORD getYonCoord(void) = 0;
|
|
virtual void getTextExtents(TCHAR *text, SIZE *sp) = 0;
|
|
virtual int getMaxStripLength() { return GFX_MAX_STRIP; }
|
|
virtual void setFlags(DWORD f) = 0;
|
|
virtual DWORD getFlags() = 0;
|
|
|
|
virtual void resetUpdateRect() = 0;
|
|
virtual void enlargeUpdateRect(RECT *rp) = 0;
|
|
virtual int getUpdateRect(RECT *rp) = 0;
|
|
virtual void updateScreen() = 0;
|
|
|
|
virtual BOOL setBufAccess(int which, int b) = 0;
|
|
virtual BOOL getBufAccess(int which) = 0;
|
|
virtual BOOL getBufSize(int which, int *size) = 0;
|
|
virtual BOOL getBuf(int which, int size, void *buf) = 0;
|
|
virtual BOOL setBuf(int which, int size, void *buf, RECT *rp) = 0;
|
|
virtual BOOL getDIB(BITMAPINFO *bmi, int *size) = 0;
|
|
virtual BOOL setBackgroundDIB(int width, int height, BITMAPINFO *bmi) = 0;
|
|
virtual void setBackgroundOffset(int x, int y) = 0;
|
|
virtual int useClosestTextureSize(int bkg=FALSE) = 0;
|
|
virtual int getTextureSize(int bkg=FALSE) = 0;
|
|
virtual DWORD_PTR getTextureHandle(BITMAPINFO *bmi) = 0;
|
|
// WIN64 Cleanup: Shuler
|
|
virtual void freeTextureHandle(DWORD_PTR handle) = 0;
|
|
// WIN64 Cleanup: Shuler
|
|
virtual BOOL setTextureByHandle(DWORD_PTR handle, int texStage=0) = 0;
|
|
// WIN64 Cleanup: Shuler
|
|
virtual void setTextureColorOp(int texStage=0, int texOp=GW_TEX_MODULATE, int texAlphaSource=GW_TEX_TEXTURE, int texScale=GW_TEX_SCALE_1X) = 0;
|
|
virtual void setTextureAlphaOp(int texStage=0, int texOp=GW_TEX_MODULATE, int texAlphaSource=GW_TEX_TEXTURE, int texScale=GW_TEX_SCALE_1X) = 0;
|
|
virtual BOOL setTextureTiling(int u, int v, int w=GW_TEX_NO_TILING, int texStage=0) = 0;
|
|
virtual int getTextureTiling(int which, int texStage=0) = 0;
|
|
|
|
virtual void beginFrame() = 0;
|
|
virtual void endFrame() = 0;
|
|
virtual void setViewport(int x, int y, int w, int h) = 0;
|
|
virtual void setVirtualViewportParams(float zoom, float xOffset, float yOffset) = 0;
|
|
virtual void setUseVirtualViewport(int onOff) = 0;
|
|
virtual void clearScreen(RECT *rp, int useBkg = FALSE) = 0;
|
|
virtual void setTransform(const Matrix3 &m) = 0;
|
|
virtual Matrix3 getTransform(void) = 0;
|
|
virtual void multiplePass(int pass, BOOL onOff, float scaleFact = 1.005f) = 0;
|
|
virtual void setTransparency(DWORD settings) = 0;
|
|
virtual void setTexTransform(const Matrix3 &m, int texStage=0) = 0;
|
|
virtual BOOL getFlipped(void)=0;
|
|
virtual void setSkipCount(int c) = 0;
|
|
virtual int getSkipCount(void) = 0;
|
|
virtual void setViewportLimits(DWORD l) = 0;
|
|
virtual DWORD getViewportLimits(void) = 0;
|
|
virtual void setRndLimits(DWORD l) = 0;
|
|
virtual DWORD getRndLimits(void) = 0;
|
|
virtual DWORD getRndMode(void) = 0;
|
|
virtual int getMaxLights(void) = 0;
|
|
virtual void setLight(int num, const Light *l) = 0;
|
|
virtual void setLightExclusion(DWORD exclVec) = 0;
|
|
virtual void setCamera(const Camera &c) = 0;
|
|
virtual void setCameraMatrix(float mat[4][4], Matrix3 *invTM, int persp, float hither, float yon) = 0;
|
|
virtual void getCameraMatrix(float mat[4][4], Matrix3 *invTM, int *persp, float *hither, float *yon) = 0;
|
|
virtual void setColor(ColorType t, float r, float g, float b) = 0;
|
|
void setColor(ColorType t, Point3 clr) { setColor(t,clr.x,clr.y,clr.z); }
|
|
virtual void setMaterial(const Material &m, int index=0) = 0;
|
|
virtual Material *getMaterial(void) = 0;
|
|
virtual int getMaxTextures(void) = 0;
|
|
|
|
virtual DWORD hTransPoint(const Point3 *in, IPoint3 *out) = 0;
|
|
virtual DWORD wTransPoint(const Point3 *in, IPoint3 *out) = 0;
|
|
virtual DWORD transPoint(const Point3 *in, Point3 *out) = 0;
|
|
virtual void lightVertex(const Point3 &pos, const Point3 &nor, Point3 &rgb) = 0;
|
|
|
|
virtual void hText(IPoint3 *xyz, TCHAR *s) = 0;
|
|
virtual void hMarker(IPoint3 *xyz, MarkerType type) = 0;
|
|
virtual void hPolyline(int ct, IPoint3 *xyz, Point3 *rgb, int closed, int *es) = 0;
|
|
void hPolyline(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int closed, int *es)
|
|
{ hPolyline(ct, xyz, rgb, closed, es); }
|
|
virtual void hPolygon(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void hTriStrip(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
|
|
virtual void wText(IPoint3 *xyz, TCHAR *s) = 0;
|
|
virtual void wMarker(IPoint3 *xyz, MarkerType type) = 0;
|
|
virtual void wPolyline(int ct, IPoint3 *xyz, Point3 *rgb, int closed, int *es) = 0;
|
|
void wPolyline(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int closed, int *es)
|
|
{ wPolyline(ct, xyz, rgb, closed, es); }
|
|
virtual void wPolygon(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void wTriStrip(int ct, IPoint3 *xyz, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
|
|
virtual void text(Point3 *xyz, TCHAR *s) = 0;
|
|
virtual void startMarkers() = 0;
|
|
virtual void marker(Point3 *xyz, MarkerType type) = 0;
|
|
virtual void endMarkers() = 0;
|
|
virtual void polyline(int ct, Point3 *xyz, Point3 *rgb, int closed, int *es) = 0;
|
|
void polyline(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw, int closed, int *es)
|
|
{ polyline(ct, xyz, rgb, closed, es); }
|
|
virtual void polylineN(int ct, Point3 *xyz, Point3 *nor, int closed, int *es) = 0;
|
|
virtual void startSegments() = 0;
|
|
virtual void segment(Point3 *xyz, int vis) = 0;
|
|
virtual void endSegments() = 0;
|
|
virtual void polygon(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void polygonN(int ct, Point3 *xyz, Point3 *nor, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void triStrip(int ct, Point3 *xyz, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void triStripN(int ct, Point3 *xyz, Point3 *nor, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void startTriangles() = 0;
|
|
virtual void triangle(Point3 *xyz, Point3 *rgb) = 0;
|
|
virtual void triangleN(Point3 *xyz, Point3 *nor, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void triangleNC(Point3 *xyz, Point3 *nor, Point3 *rgb) = 0;
|
|
virtual void triangleNCT(Point3 *xyz, Point3 *nor, Point3 *rgb, Point3 *uvw, int texNum=1) = 0;
|
|
virtual void triangleW(Point3 *xyz, int *es) = 0;
|
|
virtual void triangleNW(Point3 *xyz, Point3 *nor, int *es) = 0;
|
|
virtual void endTriangles() = 0;
|
|
virtual void loadMeshData(DWORD_PTR id, int xyzCt, Point3 *xyz, int norCt, Point3 *nor, int texNum, int uvwCt, Point3 *uvw, int mtlCt, Material *mtl) = 0;
|
|
virtual void processStrips(DWORD_PTR id, int stripCt, StripTab *s, GFX_ESCAPE_FN fn) = 0;
|
|
virtual void processWireFaces(int xyzCt, Point3 *xyz, int faceCt, GWFace *face, int dispFlags, BitArray *faceSel, BitArray *edgeSel, int mtlCt, Material *mtl, GFX_ESCAPE_FN fn) = 0;
|
|
|
|
virtual void setHitRegion(HitRegion *rgn) = 0;
|
|
virtual void clearHitCode(void) = 0;
|
|
virtual BOOL checkHitCode(void) = 0;
|
|
virtual void setHitCode(BOOL h) = 0;
|
|
virtual DWORD getHitDistance(void) = 0;
|
|
virtual void setHitDistance(DWORD d) = 0;
|
|
|
|
virtual int isPerspectiveView(void) = 0;
|
|
virtual float interpWorld(Point3 *world1, Point3 *world2, float sParam, Point3 *interpPt) = 0;
|
|
|
|
virtual void escape(GFX_ESCAPE_FN fn, void *data) = 0;
|
|
};
|
|
|
|
// for Windows int coords with origin at upper-left
|
|
inline int wIsFacingBack(const IPoint3 &v0, const IPoint3 &v1, const IPoint3 &v2, int flip=0 )
|
|
{
|
|
int s = ( (v0[0]-v1[0])*(v2[1]-v1[1]) - (v2[0]-v1[0])*(v0[1]-v1[1]) ) < 0;
|
|
return flip ? !s : s;
|
|
}
|
|
|
|
// for HEIDI int coords with origin at lower-left
|
|
inline int hIsFacingBack(const IPoint3 &v0, const IPoint3 &v1, const IPoint3 &v2, int flip=0 )
|
|
{
|
|
int s = ( (v0[0]-v1[0])*(v2[1]-v1[1]) - (v2[0]-v1[0])*(v0[1]-v1[1]) );
|
|
return flip ? s < 0 : s > 0;
|
|
}
|
|
|
|
DllExport HINSTANCE GetGraphicsLibHandle(TCHAR *driverLibName);
|
|
DllExport BOOL GraphicsSystemIsAvailable(HINSTANCE drv);
|
|
DllExport BOOL GraphicsSystemCanConfigure(HINSTANCE drv);
|
|
DllExport BOOL GraphicsSystemConfigure(HWND hWnd, HINSTANCE drv);
|
|
DllExport void FreeGraphicsLibHandle(HINSTANCE drv);
|
|
|
|
DllExport GraphicsWindow *createGW(HWND hWnd, GWinSetup &gws);
|
|
|
|
DllExport void getRegionRect(HitRegion *hr, RECT *rect);
|
|
DllExport BOOL pointInRegion(int x, int y, HitRegion *hr);
|
|
|
|
DllExport int distToLine(int x, int y, int *p1, int *p2);
|
|
DllExport int lineCrossesRect(RECT *rc, int *p1, int *p2);
|
|
DllExport int segCrossesRect(RECT *rc, int *p1, int *p2);
|
|
DllExport int segCrossesCircle(int cx, int cy, int r, int *p1, int *p2);
|
|
DllExport BOOL insideTriangle(IPoint3 &p0, IPoint3 &p1, IPoint3 &p2, IPoint3 &q);
|
|
DllExport int getZfromTriangle(IPoint3 &p0, IPoint3 &p1, IPoint3 &p2, IPoint3 &q);
|
|
|
|
DllExport int getClosestPowerOf2(int num);
|
|
|
|
// colors for drawing in viewports
|
|
#define COLOR_SELECTION 0
|
|
#define COLOR_SUBSELECTION 1
|
|
#define COLOR_FREEZE 2
|
|
#define COLOR_GRID 3
|
|
#define COLOR_GRID_INTENS 4
|
|
#define COLOR_SF_LIVE 5
|
|
#define COLOR_SF_ACTION 6
|
|
#define COLOR_SF_TITLE 7
|
|
#define COLOR_VP_LABELS 8
|
|
#define COLOR_VP_INACTIVE 9
|
|
#define COLOR_ARCBALL 10
|
|
#define COLOR_ARCBALL_HILITE 11
|
|
#define COLOR_ANIM_BUTTON 12
|
|
#define COLOR_SEL_BOXES 13
|
|
#define COLOR_LINK_LINES 14
|
|
#define COLOR_TRAJECTORY 15
|
|
#define COLOR_ACTIVE_AXIS 16
|
|
#define COLOR_INACTIVE_AXIS 17
|
|
#define COLOR_SPACE_WARPS 18
|
|
#define COLOR_DUMMY_OBJ 19
|
|
#define COLOR_POINT_OBJ 20
|
|
#define COLOR_POINT_AXES 21
|
|
#define COLOR_TAPE_OBJ 22
|
|
#define COLOR_BONES 23
|
|
#define COLOR_GIZMOS 24
|
|
#define COLOR_SEL_GIZMOS 25
|
|
#define COLOR_SPLINE_VECS 26
|
|
#define COLOR_SPLINE_HANDLES 27
|
|
#define COLOR_PATCH_LATTICE 28 // No longer used -- TH 2/20/99
|
|
#define COLOR_PARTICLE_EM 29
|
|
#define COLOR_CAMERA_OBJ 30
|
|
#define COLOR_CAMERA_CONE 31
|
|
#define COLOR_CAMERA_HORIZ 32
|
|
#define COLOR_NEAR_RANGE 33
|
|
#define COLOR_FAR_RANGE 34
|
|
#define COLOR_LIGHT_OBJ 35
|
|
#define COLOR_TARGET_LINE 36
|
|
#define COLOR_HOTSPOT 37
|
|
#define COLOR_FALLOFF 38
|
|
#define COLOR_START_RANGE 39
|
|
#define COLOR_END_RANGE 40
|
|
#define COLOR_VIEWPORT_BKG 41
|
|
#define COLOR_TRAJ_TICS_1 42
|
|
#define COLOR_TRAJ_TICS_2 43
|
|
#define COLOR_TRAJ_TICS_3 44
|
|
#define COLOR_GHOST_BEFORE 45
|
|
#define COLOR_GHOST_AFTER 46
|
|
#define COLOR_12FIELD_GRID 47
|
|
#define COLOR_START_RANGE1 48
|
|
#define COLOR_END_RANGE1 49
|
|
#define COLOR_CAMERA_CLIP 50
|
|
#define COLOR_NURBS_CV 51
|
|
#define COLOR_NURBS_LATTICE 52
|
|
#define COLOR_NURBS_CP 53
|
|
#define COLOR_NURBS_FP 54
|
|
#define COLOR_NURBS_DEP 55
|
|
#define COLOR_NURBS_ERROR 56
|
|
#define COLOR_NURBS_HILITE 57
|
|
#define COLOR_NURBS_FUSE 58
|
|
#define COLOR_END_EFFECTOR 59
|
|
#define COLOR_END_EFFECTOR_STRING 60
|
|
#define COLOR_JOINT_LIMIT_SEL 61
|
|
#define COLOR_JOINT_LIMIT_UNSEL 62
|
|
#define COLOR_IK_TERMINATOR 63
|
|
#define COLOR_SF_USER 64
|
|
#define COLOR_VERT_TICKS 65
|
|
#define COLOR_XRAY 66
|
|
#define COLOR_GROUP_OBJ 67
|
|
#define COLOR_MANIPULATOR_X 68
|
|
#define COLOR_MANIPULATOR_Y 69
|
|
#define COLOR_MANIPULATOR_Z 70
|
|
#define COLOR_MANIPULATOR_ACTIVE 71
|
|
#define COLOR_VPT_CLIPPING 72
|
|
#define COLOR_DECAY_RADIUS 73
|
|
#define COLOR_VERT_NUMBERS 74
|
|
#define COLOR_CROSSHAIR_CURSOR 75
|
|
|
|
#define COLOR_SV_WINBK 76 // SV Window Background
|
|
#define COLOR_SV_NODEBK 77 // SV Default Node Background
|
|
#define COLOR_SV_SELNODEBK 78 // SV Selected Node Background
|
|
#define COLOR_SV_NODE_HIGHLIGHT 79 // SV Viewport Selected Node Highlight
|
|
#define COLOR_SV_MATERIAL_HIGHLIGHT 80 // SV MEDIT Selected Node Highlight
|
|
#define COLOR_SV_MODIFIER_HIGHLIGHT 81 // SV Selected Modifier Highlight
|
|
#define COLOR_SV_PLUGIN_HIGHLIGHT 82 // SV Plug-in Highlight
|
|
#define COLOR_SV_SUBANIM_LINE 83 // SV Subanim line color
|
|
#define COLOR_SV_CHILD_LINE 84 // SV Child node line color
|
|
#define COLOR_SV_FRAME 85 // SV Frame color
|
|
#define COLOR_SV_SELTEXT 86 // SV Selected Label Color
|
|
#define COLOR_SV_TEXT 87 // SV Label Color
|
|
|
|
#define COLOR_UNSEL_TAB 88
|
|
#define COLOR_ATMOS_APPARATUS 89 // mjm - 1.21.99
|
|
#define COLOR_SUBSELECTION_HARD 90 //2-3-99 watje
|
|
#define COLOR_SUBSELECTION_MEDIUM 91 //2-3-99 watje
|
|
#define COLOR_SUBSELECTION_SOFT 92 //2-3-99 watje
|
|
|
|
#define COLOR_SV_UNFOLD_BUTTON 93 // SV Unfold Button
|
|
#define COLOR_SV_GEOMOBJECT_BK 94 // Geometry Object Node Background
|
|
#define COLOR_SV_LIGHT_BK 95 // Light Node Background
|
|
#define COLOR_SV_CAMERA_BK 96 // Camera Node Background
|
|
#define COLOR_SV_SHAPE_BK 97 // Shape Node Background
|
|
#define COLOR_SV_HELPER_BK 98 // Helper Node Background
|
|
#define COLOR_SV_SYSTEM_BK 99 // System Node Background
|
|
#define COLOR_SV_CONTROLLER_BK 100 // Controller Node Background
|
|
#define COLOR_SV_MODIFIER_BK 101 // Modifier Node Background
|
|
#define COLOR_SV_MATERIAL_BK 102 // Material Node Background
|
|
#define COLOR_SV_MAP_BK 103 // Map Node Background
|
|
|
|
#define COLOR_TOTAL 104 // always the max number of colors
|
|
|
|
// Returns/sets color values for drawing in the viewport (selection, subsel, etc)
|
|
DllExport Point3 GetUIColor(int which);
|
|
DllExport void SetUIColor(int which, Point3 *clr);
|
|
DllExport Point3 GetDefaultUIColor(int which);
|
|
|
|
#define GetSelColor() GetUIColor(COLOR_SELECTION)
|
|
#define GetSubSelColor() GetUIColor(COLOR_SUBSELECTION)
|
|
#define GetFreezeColor() GetUIColor(COLOR_FREEZE)
|
|
|
|
|
|
|
|
#endif // _GFX_H_
|
|
|