windows-nt/Source/XPSP1/NT/shell/osshell/control/scrnsave/flyingobjects/flyingobjects.h
2020-09-26 16:20:57 +08:00

469 lines
11 KiB
C++

//-----------------------------------------------------------------------------
// File: FlyingObjects.h
//
// Desc:
//
// Copyright (c) 2000 Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#ifndef _FLYINGOBJECTS_H
#define _FLYINGOBJECTS_H
#include "resource.h"
#define PI 3.14159265358979323846f
// double version of PI
#define PI_D 3.14159265358979323846264338327950288419716939937510
#define ONE_OVER_PI (1.0f / PI)
#define ROOT_TWO 1.414213562373f
#define GEN_STRING_SIZE 64
typedef struct _point2d {
FLOAT x;
FLOAT y;
} POINT2D;
typedef struct _ipoint2d {
int x;
int y;
} IPOINT2D;
typedef D3DXVECTOR3 POINT3D;
typedef struct _ipoint3d {
int x;
int y;
int z;
} IPOINT3D;
typedef struct _texpoint2d {
FLOAT s;
FLOAT t;
} TEX_POINT2D;
typedef struct _isize {
int width;
int height;
} ISIZE;
typedef struct _fsize {
FLOAT width;
FLOAT height;
} FSIZE;
typedef struct _glrect {
int x, y;
int width, height;
} GLRECT;
// texture data
typedef struct {
int width;
int height;
DWORD format;
INT components;
float origAspectRatio; // original width/height aspect ratio
unsigned char *data;
DWORD texObj; // texture object
int pal_size;
int iPalRot; // current palette rotation (not used yet)
RGBQUAD *pal;
} TEXTURE, *HTEXTURE;
// texture resource
#define RT_RGB 99
#define RT_MYBMP 100
#define RT_A8 101
// texture resource types
enum {
TEX_UNKNOWN = 0,
TEX_RGB,
TEX_BMP,
TEX_A8
};
typedef struct {
int type;
int name;
} TEX_RES;
typedef struct _MATRIX {
FLOAT M[4][4];
} MATRIX;
//typedef D3DXMATRIX MATRIX;
typedef struct strRGBA {
FLOAT r;
FLOAT g;
FLOAT b;
FLOAT a;
} RGBA;
typedef struct {
BYTE r;
BYTE g;
BYTE b;
} RGB8;
typedef struct {
BYTE r;
BYTE g;
BYTE b;
BYTE a;
} RGBA8;
typedef struct _MATERIAL {
RGBA ka;
RGBA kd;
RGBA ks;
FLOAT specExp;
} MATERIAL;
// texture file info
typedef struct {
int nOffset; // filename offset into pathname
TCHAR szPathName[MAX_PATH]; // texture pathname
} TEXFILE;
// texture file processing messages
typedef struct {
TCHAR szWarningMsg[MAX_PATH];
TCHAR szBitmapSizeMsg[MAX_PATH];
TCHAR szBitmapInvalidMsg[MAX_PATH];
TCHAR szSelectAnotherBitmapMsg[MAX_PATH];
TCHAR szTextureDialogTitle[GEN_STRING_SIZE];
TCHAR szTextureFilter[2*GEN_STRING_SIZE];
TCHAR szBmp[GEN_STRING_SIZE];
TCHAR szDotBmp[GEN_STRING_SIZE];
} TEX_STRINGS;
// Useful macros
#define SS_MAX( a, b ) \
( a > b ? a : b )
#define SS_MIN( a, b ) \
( a < b ? a : b )
// macro to round up floating values
#define SS_ROUND_UP( fval ) \
( (((fval) - (FLOAT)(int)(fval)) > 0.0f) ? (int) ((fval)+1.0f) : (int) (fval) )
// macros to clamp a value within a range
#define SS_CLAMP_TO_RANGE( a, lo, hi ) ( (a < lo) ? lo : ((a > hi) ? hi : a) )
#define SS_CLAMP_TO_RANGE2( a, lo, hi ) \
( a = (a < lo) ? lo : ((a > hi) ? hi : a) )
// degree<->radian macros
#define ONE_OVER_180 (1.0f / 180.0f)
#define SS_DEG_TO_RAD( a ) ( (a*PI) * ONE_OVER_180 )
#define SS_RAD_TO_DEG( a ) ( (a*180.0f) * ONE_OVER_PI )
extern MATERIAL TeaMaterial[], TexMaterial[], ss_BlackMat;
// color
extern void ss_HsvToRgb(float h, float s, float v, RGBA *color );
// texture file processing
extern void ss_DisableTextureErrorMsgs();
extern void ss_SetTexture( TEXTURE *pTex );
extern void ss_SetTexturePalette( TEXTURE *pTex, int index );
extern void ss_DeleteTexture( TEXTURE *pTex );
extern BOOL ss_LoadTextureResourceStrings();
extern BOOL ss_VerifyTextureFile( TEXFILE *ptf );
extern BOOL ss_SelectTextureFile( HWND hDlg, TEXFILE *ptf );
extern void ss_GetDefaultBmpFile( LPTSTR pszBmpFile );
extern void ss_InitAutoTexture( TEX_POINT2D *pTexRep );
// math functions
extern POINT3D ss_ptZero;
extern void ss_xformPoint(POINT3D *ptOut, POINT3D *ptIn, MATRIX *);
extern void ss_xformNorm(POINT3D *ptOut, POINT3D *ptIn, MATRIX *);
extern void ss_matrixIdent(MATRIX *);
extern void ss_matrixRotate(MATRIX *m, double xTheta, double yTheta, double zTheta);
extern void ss_matrixTranslate(MATRIX *, double xTrans, double yTrans, double zTrans);
extern void ss_matrixMult( MATRIX *m1, MATRIX *m2, MATRIX *m3 );
extern void ss_calcNorm(POINT3D *norm, POINT3D *p1, POINT3D *p2, POINT3D *p3);
extern void ss_normalizeNorm(POINT3D *);
extern void ss_normalizeNorms(POINT3D *, ULONG);
// dialog helper functions
extern int ss_GetTrackbarPos( HWND hDlg, int item );
extern void ss_SetupTrackbar( HWND hDlg, int item, int lo, int hi, int lineSize, int pageSize, int pos );
extern BOOL gbTextureObjects; // from texture.c
//-----------------------------------------------------------------------------
// Name: struct MYVERTEX
// Desc: D3D vertex type for this app
//-----------------------------------------------------------------------------
struct MYVERTEX
{
D3DXVECTOR3 p; // Position
D3DXVECTOR3 n; // Normal
};
#define D3DFVF_MYVERTEX ( D3DFVF_XYZ | D3DFVF_NORMAL )
//-----------------------------------------------------------------------------
// Name: struct MYVERTEX2
// Desc: D3D vertex type for this app
//-----------------------------------------------------------------------------
struct MYVERTEX2
{
D3DXVECTOR3 p; // Position
D3DXVECTOR3 n; // Normal
FLOAT tu, tv; // Vertex texture coordinates
};
#define D3DFVF_MYVERTEX2 ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 )
//-----------------------------------------------------------------------------
// Name: struct MYVERTEX3
// Desc: D3D vertex type for this app
//-----------------------------------------------------------------------------
struct MYVERTEX3
{
D3DXVECTOR3 p; // Position
FLOAT rhw;
DWORD dwDiffuse;
FLOAT tu, tv; // Vertex texture coordinates
};
#define D3DFVF_MYVERTEX3 ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 )
#define MAX_VERTICES 5000
#define MAX_INDICES 5000
//-----------------------------------------------------------------------------
// Name: struct FLOATRECT
// Desc: Floating viewport rect
//-----------------------------------------------------------------------------
struct FLOATRECT
{
FLOAT xMin;
FLOAT yMin;
FLOAT xSize;
FLOAT ySize;
FLOAT xVel;
FLOAT yVel;
FLOAT xOrigin;
FLOAT yOrigin;
FLOAT xVelMax;
FLOAT yVelMax;
};
#ifndef PI
#define PI 3.14159265358979323846
#endif
// Minimum and maximum number of side subdivisions
#define MINSUBDIV 2
#define MAXSUBDIV 10
// Maximum values allowed
#define MAXSIDES 8
#define MAXSPTS ((MAXSUBDIV+1)*(MAXSUBDIV+1))
#define MAXPTS (MAXSIDES*MAXSPTS)
#define MAXSFACES (MAXSUBDIV*MAXSUBDIV)
#define MAXFACES (MAXSIDES*MAXSFACES)
#define MAXFPTS 4
// Allow floating point type configurability
typedef FLOAT FLT;
typedef struct
{
FLT x, y, z;
} PT3;
extern LPDIRECT3DDEVICE8 m_pd3dDevice;
extern LPDIRECT3DINDEXBUFFER8 m_pIB;
extern LPDIRECT3DVERTEXBUFFER8 m_pVB;
extern LPDIRECT3DVERTEXBUFFER8 m_pVB2;
#define DIMA(a) (sizeof(a)/sizeof(a[0]))
#define PALETTE_PER_MATL 32
#define PALETTE_PER_DIFF 26
#define PALETTE_PER_SPEC 6
#define MATL_MAX 7
typedef struct strFACE {
POINT3D p[4];
POINT3D n[4];
POINT3D fn;
int idMatl;
} FACE;
typedef struct strMFACE {
int p[4];
int material;
POINT3D norm;
} MFACE;
typedef struct strMESH {
int numFaces;
int numPoints;
POINT3D *pts;
POINT3D *norms;
MFACE *faces;
INT listID;
} MESH;
/******************************Public*Routine******************************\
*
* Basic vector math macros
*
* History:
* Wed Jul 19 14:49:49 1995 -by- Drew Bliss [drewb]
* Created
*
\**************************************************************************/
#define V3Sub(a, b, r) \
((r)->x = (a)->x-(b)->x, (r)->y = (a)->y-(b)->y, (r)->z = (a)->z-(b)->z)
#define V3Add(a, b, r) \
((r)->x = (a)->x+(b)->x, (r)->y = (a)->y+(b)->y, (r)->z = (a)->z+(b)->z)
#define V3Cross(a, b, r) \
((r)->x = (a)->y*(b)->z-(b)->y*(a)->z,\
(r)->y = (a)->z*(b)->x-(b)->z*(a)->x,\
(r)->z = (a)->x*(b)->y-(b)->x*(a)->y)
extern FLT V3Len(PT3 *v);
#define MAX_DEVICE_OBJECTS 10
struct DeviceObjects
{
LPDIRECT3DTEXTURE8 m_pTexture;
LPDIRECT3DTEXTURE8 m_pTexture2;
LPDIRECT3DINDEXBUFFER8 m_pIB;
LPDIRECT3DVERTEXBUFFER8 m_pVB; // D3DFVF_MYVERTEX (no tex coords)
LPDIRECT3DVERTEXBUFFER8 m_pVB2; // D3DFVF_MYVERTEX2 (tex coords)
};
extern DeviceObjects* g_pDeviceObjects;
extern FLOATRECT* g_pFloatRect;
extern INT g_xScreenOrigin;
extern INT g_yScreenOrigin;
extern INT g_iDevice;
extern BOOL g_bMoveToOrigin;
extern BOOL g_bAtOrigin;
extern BOOL bSmoothShading;
extern BOOL bFalseColor;
extern BOOL bColorCycle;
extern float fTesselFact;
extern TEXFILE gTexFile;
extern BOOL gbBounce;
extern D3DMATERIAL8 Material[];
extern int NumLights;
extern BOOL newMesh(MESH *, int numFaces, int numPts);
extern void delMesh(MESH *);
extern void revolveSurface(MESH *, POINT3D *curve, int steps);
extern void *SaverAlloc(ULONG);
extern void SaverFree(void *);
#ifndef GL_FRONT
#define GL_FRONT 0x0404
#endif
#ifndef GL_FRONT_AND_BACK
#define GL_FRONT_AND_BACK 0x0408
#endif
#ifndef GL_AMBIENT_AND_DIFFUSE
#define GL_AMBIENT_AND_DIFFUSE 0x1602
#endif
#ifndef GL_SHININESS
#define GL_SHININESS 0x1601
#endif
#ifndef GL_SPECULAR
#define GL_SPECULAR 0x1202
#endif
extern VOID myglMaterialfv(INT face, INT pname, FLOAT* params);
extern VOID myglMaterialf(INT face, INT pname, FLOAT param);
VOID SetProjectionMatrixInfo( BOOL bOrtho, FLOAT fWidth,
FLOAT fHeight, FLOAT fNear, FLOAT fFar );
class CFlyingObjectsScreensaver : public CD3DScreensaver
{
protected:
FLOATRECT m_floatrect;
DeviceObjects m_DeviceObjectsArray[MAX_DEVICE_OBJECTS];
DeviceObjects* m_pDeviceObjects;
public:
// Projection matrix settings
BOOL m_bOrtho;
FLOAT m_fWidth;
FLOAT m_fHeight;
FLOAT m_fNear;
FLOAT m_fFar;
protected:
virtual HRESULT RegisterSoftwareDevice();
virtual VOID SetDevice( UINT iDevice );
virtual VOID DoConfig();
virtual VOID ReadSettings();
virtual HRESULT Render();
virtual HRESULT FrameMove();
virtual HRESULT RestoreDeviceObjects();
virtual HRESULT InvalidateDeviceObjects();
virtual HRESULT ConfirmDevice(D3DCAPS8* pCaps, DWORD dwBehavior,
D3DFORMAT fmtBackBuffer);
VOID WriteSettings( HWND hdlg );
VOID ss_ReadSettings();
BOOL ss_RegistrySetup( int section, int file );
int ss_GetRegistryInt( int name, int iDefault );
VOID ss_GetRegistryString( int name, LPTSTR lpDefault, LPTSTR lpDest, int bufSize );
static BOOL CALLBACK ScreenSaverConfigureDialog(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam);
HRESULT SetMaterialColor(FLOAT* pfColors);
BOOL _3dfo_Init(void *data);
void _3dfo_Draw(void *data);
public:
CFlyingObjectsScreensaver();
};
#endif