Mercurial > might-and-magic-trilogy
diff lib/legacy_dx/d3drmdef.h @ 0:8b8875f5b359
Initial commit
author | Nomad |
---|---|
date | Fri, 05 Oct 2012 16:07:14 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/legacy_dx/d3drmdef.h Fri Oct 05 16:07:14 2012 +0200 @@ -0,0 +1,695 @@ +/*==========================================================================; + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * + * File: d3drm.h + * Content: Direct3DRM include file + * + ***************************************************************************/ + +#ifndef __D3DRMDEFS_H__ +#define __D3DRMDEFS_H__ + +#include <stddef.h> +#include "d3dtypes.h" + +#ifdef WIN32 +#define D3DRMAPI __stdcall +#else +#define D3DRMAPI +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef TRUE +#define FALSE 0 +#define TRUE 1 +#endif + +typedef struct _D3DRMVECTOR4D +{ D3DVALUE x, y, z, w; +} D3DRMVECTOR4D, *LPD3DRMVECTOR4D; + +typedef D3DVALUE D3DRMMATRIX4D[4][4]; + +typedef struct _D3DRMQUATERNION +{ D3DVALUE s; + D3DVECTOR v; +} D3DRMQUATERNION, *LPD3DRMQUATERNION; + +typedef struct _D3DRMRAY +{ D3DVECTOR dvDir; + D3DVECTOR dvPos; +} D3DRMRAY, *LPD3DRMRAY; + +typedef struct _D3DRMBOX +{ D3DVECTOR min, max; +} D3DRMBOX, *LPD3DRMBOX; + +typedef void (*D3DRMWRAPCALLBACK) + (LPD3DVECTOR, int* u, int* v, LPD3DVECTOR a, LPD3DVECTOR b, LPVOID); + +typedef enum _D3DRMLIGHTTYPE +{ D3DRMLIGHT_AMBIENT, + D3DRMLIGHT_POINT, + D3DRMLIGHT_SPOT, + D3DRMLIGHT_DIRECTIONAL, + D3DRMLIGHT_PARALLELPOINT +} D3DRMLIGHTTYPE, *LPD3DRMLIGHTTYPE; + +typedef enum _D3DRMSHADEMODE { + D3DRMSHADE_FLAT = 0, + D3DRMSHADE_GOURAUD = 1, + D3DRMSHADE_PHONG = 2, + + D3DRMSHADE_MASK = 7, + D3DRMSHADE_MAX = 8 +} D3DRMSHADEMODE, *LPD3DRMSHADEMODE; + +typedef enum _D3DRMLIGHTMODE { + D3DRMLIGHT_OFF = 0 * D3DRMSHADE_MAX, + D3DRMLIGHT_ON = 1 * D3DRMSHADE_MAX, + + D3DRMLIGHT_MASK = 7 * D3DRMSHADE_MAX, + D3DRMLIGHT_MAX = 8 * D3DRMSHADE_MAX +} D3DRMLIGHTMODE, *LPD3DRMLIGHTMODE; + +typedef enum _D3DRMFILLMODE { + D3DRMFILL_POINTS = 0 * D3DRMLIGHT_MAX, + D3DRMFILL_WIREFRAME = 1 * D3DRMLIGHT_MAX, + D3DRMFILL_SOLID = 2 * D3DRMLIGHT_MAX, + + D3DRMFILL_MASK = 7 * D3DRMLIGHT_MAX, + D3DRMFILL_MAX = 8 * D3DRMLIGHT_MAX +} D3DRMFILLMODE, *LPD3DRMFILLMODE; + +typedef DWORD D3DRMRENDERQUALITY, *LPD3DRMRENDERQUALITY; + +#define D3DRMRENDER_WIREFRAME (D3DRMSHADE_FLAT+D3DRMLIGHT_OFF+D3DRMFILL_WIREFRAME) +#define D3DRMRENDER_UNLITFLAT (D3DRMSHADE_FLAT+D3DRMLIGHT_OFF+D3DRMFILL_SOLID) +#define D3DRMRENDER_FLAT (D3DRMSHADE_FLAT+D3DRMLIGHT_ON+D3DRMFILL_SOLID) +#define D3DRMRENDER_GOURAUD (D3DRMSHADE_GOURAUD+D3DRMLIGHT_ON+D3DRMFILL_SOLID) +#define D3DRMRENDER_PHONG (D3DRMSHADE_PHONG+D3DRMLIGHT_ON+D3DRMFILL_SOLID) + +#define D3DRMRENDERMODE_BLENDEDTRANSPARENCY 1 +#define D3DRMRENDERMODE_SORTEDTRANSPARENCY 2 +#define D3DRMRENDERMODE_LIGHTINMODELSPACE 8 +#define D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR 16 +#define D3DRMRENDERMODE_DISABLESORTEDALPHAZWRITE 32 + +typedef enum _D3DRMTEXTUREQUALITY +{ D3DRMTEXTURE_NEAREST, /* choose nearest texel */ + D3DRMTEXTURE_LINEAR, /* interpolate 4 texels */ + D3DRMTEXTURE_MIPNEAREST, /* nearest texel in nearest mipmap */ + D3DRMTEXTURE_MIPLINEAR, /* interpolate 2 texels from 2 mipmaps */ + D3DRMTEXTURE_LINEARMIPNEAREST, /* interpolate 4 texels in nearest mipmap */ + D3DRMTEXTURE_LINEARMIPLINEAR /* interpolate 8 texels from 2 mipmaps */ +} D3DRMTEXTUREQUALITY, *LPD3DRMTEXTUREQUALITY; + +/* + * Texture flags + */ +#define D3DRMTEXTURE_FORCERESIDENT 0x00000001 /* texture should be kept in video memory */ +#define D3DRMTEXTURE_STATIC 0x00000002 /* texture will not change */ +#define D3DRMTEXTURE_DOWNSAMPLEPOINT 0x00000004 /* point filtering should be used when downsampling */ +#define D3DRMTEXTURE_DOWNSAMPLEBILINEAR 0x00000008 /* bilinear filtering should be used when downsampling */ +#define D3DRMTEXTURE_DOWNSAMPLEREDUCEDEPTH 0x00000010 /* reduce bit depth when downsampling */ +#define D3DRMTEXTURE_DOWNSAMPLENONE 0x00000020 /* texture should never be downsampled */ +#define D3DRMTEXTURE_CHANGEDPIXELS 0x00000040 /* pixels have changed */ +#define D3DRMTEXTURE_CHANGEDPALETTE 0x00000080 /* palette has changed */ +#define D3DRMTEXTURE_INVALIDATEONLY 0x00000100 /* dirty regions are invalid */ + +/* + * Shadow flags + */ +#define D3DRMSHADOW_TRUEALPHA 0x00000001 /* shadow should render without artifacts when true alpha is on */ + +typedef enum _D3DRMCOMBINETYPE +{ D3DRMCOMBINE_REPLACE, + D3DRMCOMBINE_BEFORE, + D3DRMCOMBINE_AFTER +} D3DRMCOMBINETYPE, *LPD3DRMCOMBINETYPE; + +typedef D3DCOLORMODEL D3DRMCOLORMODEL, *LPD3DRMCOLORMODEL; + +typedef enum _D3DRMPALETTEFLAGS +{ D3DRMPALETTE_FREE, /* renderer may use this entry freely */ + D3DRMPALETTE_READONLY, /* fixed but may be used by renderer */ + D3DRMPALETTE_RESERVED /* may not be used by renderer */ +} D3DRMPALETTEFLAGS, *LPD3DRMPALETTEFLAGS; + +typedef struct _D3DRMPALETTEENTRY +{ unsigned char red; /* 0 .. 255 */ + unsigned char green; /* 0 .. 255 */ + unsigned char blue; /* 0 .. 255 */ + unsigned char flags; /* one of D3DRMPALETTEFLAGS */ +} D3DRMPALETTEENTRY, *LPD3DRMPALETTEENTRY; + +typedef struct _D3DRMIMAGE +{ int width, height; /* width and height in pixels */ + int aspectx, aspecty; /* aspect ratio for non-square pixels */ + int depth; /* bits per pixel */ + int rgb; /* if false, pixels are indices into a + palette otherwise, pixels encode + RGB values. */ + int bytes_per_line; /* number of bytes of memory for a + scanline. This must be a multiple + of 4. */ + void* buffer1; /* memory to render into (first buffer). */ + void* buffer2; /* second rendering buffer for double + buffering, set to NULL for single + buffering. */ + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + unsigned long alpha_mask; /* if rgb is true, these are masks for + the red, green and blue parts of a + pixel. Otherwise, these are masks + for the significant bits of the + red, green and blue elements in the + palette. For instance, most SVGA + displays use 64 intensities of red, + green and blue, so the masks should + all be set to 0xfc. */ + int palette_size; /* number of entries in palette */ + D3DRMPALETTEENTRY* palette; /* description of the palette (only if + rgb is false). Must be (1<<depth) + elements. */ +} D3DRMIMAGE, *LPD3DRMIMAGE; + +typedef enum _D3DRMWRAPTYPE +{ D3DRMWRAP_FLAT, + D3DRMWRAP_CYLINDER, + D3DRMWRAP_SPHERE, + D3DRMWRAP_CHROME, + D3DRMWRAP_SHEET, + D3DRMWRAP_BOX +} D3DRMWRAPTYPE, *LPD3DRMWRAPTYPE; + +#define D3DRMWIREFRAME_CULL 1 /* cull backfaces */ +#define D3DRMWIREFRAME_HIDDENLINE 2 /* lines are obscured by closer objects */ + +/* + * Do not use righthanded perspective in Viewport2::SetProjection(). + * Set up righthanded mode by using IDirect3DRM3::SetOptions(). + */ +typedef enum _D3DRMPROJECTIONTYPE +{ D3DRMPROJECT_PERSPECTIVE, + D3DRMPROJECT_ORTHOGRAPHIC, + D3DRMPROJECT_RIGHTHANDPERSPECTIVE, /* Only valid pre-DX6 */ + D3DRMPROJECT_RIGHTHANDORTHOGRAPHIC /* Only valid pre-DX6 */ +} D3DRMPROJECTIONTYPE, *LPD3DRMPROJECTIONTYPE; + +#define D3DRMOPTIONS_LEFTHANDED 0x00000001L /* Default */ +#define D3DRMOPTIONS_RIGHTHANDED 0x00000002L + +typedef enum _D3DRMXOFFORMAT +{ D3DRMXOF_BINARY, + D3DRMXOF_COMPRESSED, + D3DRMXOF_TEXT +} D3DRMXOFFORMAT, *LPD3DRMXOFFORMAT; + +typedef DWORD D3DRMSAVEOPTIONS; +#define D3DRMXOFSAVE_NORMALS 1 +#define D3DRMXOFSAVE_TEXTURECOORDINATES 2 +#define D3DRMXOFSAVE_MATERIALS 4 +#define D3DRMXOFSAVE_TEXTURENAMES 8 +#define D3DRMXOFSAVE_ALL 15 +#define D3DRMXOFSAVE_TEMPLATES 16 +#define D3DRMXOFSAVE_TEXTURETOPOLOGY 32 + +typedef enum _D3DRMCOLORSOURCE +{ D3DRMCOLOR_FROMFACE, + D3DRMCOLOR_FROMVERTEX +} D3DRMCOLORSOURCE, *LPD3DRMCOLORSOURCE; + +typedef enum _D3DRMFRAMECONSTRAINT +{ D3DRMCONSTRAIN_Z, /* use only X and Y rotations */ + D3DRMCONSTRAIN_Y, /* use only X and Z rotations */ + D3DRMCONSTRAIN_X /* use only Y and Z rotations */ +} D3DRMFRAMECONSTRAINT, *LPD3DRMFRAMECONSTRAINT; + +typedef enum _D3DRMMATERIALMODE +{ D3DRMMATERIAL_FROMMESH, + D3DRMMATERIAL_FROMPARENT, + D3DRMMATERIAL_FROMFRAME +} D3DRMMATERIALMODE, *LPD3DRMMATERIALMODE; + +typedef enum _D3DRMFOGMODE +{ D3DRMFOG_LINEAR, /* linear between start and end */ + D3DRMFOG_EXPONENTIAL, /* density * exp(-distance) */ + D3DRMFOG_EXPONENTIALSQUARED /* density * exp(-distance*distance) */ +} D3DRMFOGMODE, *LPD3DRMFOGMODE; + +typedef enum _D3DRMZBUFFERMODE { + D3DRMZBUFFER_FROMPARENT, /* default */ + D3DRMZBUFFER_ENABLE, /* enable zbuffering */ + D3DRMZBUFFER_DISABLE /* disable zbuffering */ +} D3DRMZBUFFERMODE, *LPD3DRMZBUFFERMODE; + +typedef enum _D3DRMSORTMODE { + D3DRMSORT_FROMPARENT, /* default */ + D3DRMSORT_NONE, /* don't sort child frames */ + D3DRMSORT_FRONTTOBACK, /* sort child frames front-to-back */ + D3DRMSORT_BACKTOFRONT /* sort child frames back-to-front */ +} D3DRMSORTMODE, *LPD3DRMSORTMODE; + +typedef struct _D3DRMMATERIALOVERRIDE +{ + DWORD dwSize; /* Size of this structure */ + DWORD dwFlags; /* Indicate which fields are valid */ + D3DCOLORVALUE dcDiffuse; /* RGBA */ + D3DCOLORVALUE dcAmbient; /* RGB */ + D3DCOLORVALUE dcEmissive; /* RGB */ + D3DCOLORVALUE dcSpecular; /* RGB */ + D3DVALUE dvPower; + LPUNKNOWN lpD3DRMTex; +} D3DRMMATERIALOVERRIDE, *LPD3DRMMATERIALOVERRIDE; + +#define D3DRMMATERIALOVERRIDE_DIFFUSE_ALPHAONLY 0x00000001L +#define D3DRMMATERIALOVERRIDE_DIFFUSE_RGBONLY 0x00000002L +#define D3DRMMATERIALOVERRIDE_DIFFUSE 0x00000003L +#define D3DRMMATERIALOVERRIDE_AMBIENT 0x00000004L +#define D3DRMMATERIALOVERRIDE_EMISSIVE 0x00000008L +#define D3DRMMATERIALOVERRIDE_SPECULAR 0x00000010L +#define D3DRMMATERIALOVERRIDE_POWER 0x00000020L +#define D3DRMMATERIALOVERRIDE_TEXTURE 0x00000040L +#define D3DRMMATERIALOVERRIDE_DIFFUSE_ALPHAMULTIPLY 0x00000080L +#define D3DRMMATERIALOVERRIDE_ALL 0x000000FFL + +#define D3DRMFPTF_ALPHA 0x00000001L +#define D3DRMFPTF_NOALPHA 0x00000002L +#define D3DRMFPTF_PALETTIZED 0x00000004L +#define D3DRMFPTF_NOTPALETTIZED 0x00000008L + +#define D3DRMSTATECHANGE_UPDATEONLY 0x000000001L +#define D3DRMSTATECHANGE_VOLATILE 0x000000002L +#define D3DRMSTATECHANGE_NONVOLATILE 0x000000004L +#define D3DRMSTATECHANGE_RENDER 0x000000020L +#define D3DRMSTATECHANGE_LIGHT 0x000000040L + +/* + * Values for flags in RM3::CreateDeviceFromSurface + */ +#define D3DRMDEVICE_NOZBUFFER 0x00000001L + +/* + * Values for flags in Object2::SetClientData + */ +#define D3DRMCLIENTDATA_NONE 0x00000001L +#define D3DRMCLIENTDATA_LOCALFREE 0x00000002L +#define D3DRMCLIENTDATA_IUNKNOWN 0x00000004L + +/* + * Values for flags in Frame2::AddMoveCallback. + */ +#define D3DRMCALLBACK_PREORDER 0 +#define D3DRMCALLBACK_POSTORDER 1 + +/* + * Values for flags in MeshBuilder2::RayPick. + */ +#define D3DRMRAYPICK_ONLYBOUNDINGBOXES 1 +#define D3DRMRAYPICK_IGNOREFURTHERPRIMITIVES 2 +#define D3DRMRAYPICK_INTERPOLATEUV 4 +#define D3DRMRAYPICK_INTERPOLATECOLOR 8 +#define D3DRMRAYPICK_INTERPOLATENORMAL 0x10 + +/* + * Values for flags in MeshBuilder3::AddFacesIndexed. + */ +#define D3DRMADDFACES_VERTICESONLY 1 + +/* + * Values for flags in MeshBuilder2::GenerateNormals. + */ +#define D3DRMGENERATENORMALS_PRECOMPACT 1 +#define D3DRMGENERATENORMALS_USECREASEANGLE 2 + +/* + * Values for MeshBuilder3::GetParentMesh + */ +#define D3DRMMESHBUILDER_DIRECTPARENT 1 +#define D3DRMMESHBUILDER_ROOTMESH 2 + +/* + * Flags for MeshBuilder3::Enable + */ +#define D3DRMMESHBUILDER_RENDERENABLE 0x00000001L +#define D3DRMMESHBUILDER_PICKENABLE 0x00000002L + +/* + * Flags for MeshBuilder3::AddMeshBuilder + */ +#define D3DRMADDMESHBUILDER_DONTCOPYAPPDATA 1 +#define D3DRMADDMESHBUILDER_FLATTENSUBMESHES 2 +#define D3DRMADDMESHBUILDER_NOSUBMESHES 4 + +/* + * Flags for Object2::GetAge when used with MeshBuilders + */ +#define D3DRMMESHBUILDERAGE_GEOMETRY 0x00000001L +#define D3DRMMESHBUILDERAGE_MATERIALS 0x00000002L +#define D3DRMMESHBUILDERAGE_TEXTURES 0x00000004L + +/* + * Format flags for MeshBuilder3::AddTriangles. + */ +#define D3DRMFVF_TYPE 0x00000001L +#define D3DRMFVF_NORMAL 0x00000002L +#define D3DRMFVF_COLOR 0x00000004L +#define D3DRMFVF_TEXTURECOORDS 0x00000008L + +#define D3DRMVERTEX_STRIP 0x00000001L +#define D3DRMVERTEX_FAN 0x00000002L +#define D3DRMVERTEX_LIST 0x00000004L + +/* + * Values for flags in Viewport2::Clear2 + */ +#define D3DRMCLEAR_TARGET 0x00000001L +#define D3DRMCLEAR_ZBUFFER 0x00000002L +#define D3DRMCLEAR_DIRTYRECTS 0x00000004L +#define D3DRMCLEAR_ALL (D3DRMCLEAR_TARGET | \ + D3DRMCLEAR_ZBUFFER | \ + D3DRMCLEAR_DIRTYRECTS) + +/* + * Values for flags in Frame3::SetSceneFogMethod + */ +#define D3DRMFOGMETHOD_VERTEX 0x00000001L +#define D3DRMFOGMETHOD_TABLE 0x00000002L +#define D3DRMFOGMETHOD_ANY 0x00000004L + +/* + * Values for flags in Frame3::SetTraversalOptions + */ +#define D3DRMFRAME_RENDERENABLE 0x00000001L +#define D3DRMFRAME_PICKENABLE 0x00000002L + +typedef DWORD D3DRMANIMATIONOPTIONS; +#define D3DRMANIMATION_OPEN 0x01L +#define D3DRMANIMATION_CLOSED 0x02L +#define D3DRMANIMATION_LINEARPOSITION 0x04L +#define D3DRMANIMATION_SPLINEPOSITION 0x08L +#define D3DRMANIMATION_SCALEANDROTATION 0x00000010L +#define D3DRMANIMATION_POSITION 0x00000020L + +typedef DWORD D3DRMINTERPOLATIONOPTIONS; +#define D3DRMINTERPOLATION_OPEN 0x01L +#define D3DRMINTERPOLATION_CLOSED 0x02L +#define D3DRMINTERPOLATION_NEAREST 0x0100L +#define D3DRMINTERPOLATION_LINEAR 0x04L +#define D3DRMINTERPOLATION_SPLINE 0x08L +#define D3DRMINTERPOLATION_VERTEXCOLOR 0x40L +#define D3DRMINTERPOLATION_SLERPNORMALS 0x80L + +typedef DWORD D3DRMLOADOPTIONS; + +#define D3DRMLOAD_FROMFILE 0x00L +#define D3DRMLOAD_FROMRESOURCE 0x01L +#define D3DRMLOAD_FROMMEMORY 0x02L +#define D3DRMLOAD_FROMSTREAM 0x04L +#define D3DRMLOAD_FROMURL 0x08L + +#define D3DRMLOAD_BYNAME 0x10L +#define D3DRMLOAD_BYPOSITION 0x20L +#define D3DRMLOAD_BYGUID 0x40L +#define D3DRMLOAD_FIRST 0x80L + +#define D3DRMLOAD_INSTANCEBYREFERENCE 0x100L +#define D3DRMLOAD_INSTANCEBYCOPYING 0x200L + +#define D3DRMLOAD_ASYNCHRONOUS 0x400L + +typedef struct _D3DRMLOADRESOURCE { + HMODULE hModule; + LPCTSTR lpName; + LPCTSTR lpType; +} D3DRMLOADRESOURCE, *LPD3DRMLOADRESOURCE; + +typedef struct _D3DRMLOADMEMORY { + LPVOID lpMemory; + DWORD dSize; +} D3DRMLOADMEMORY, *LPD3DRMLOADMEMORY; + +#define D3DRMPMESHSTATUS_VALID 0x01L +#define D3DRMPMESHSTATUS_INTERRUPTED 0x02L +#define D3DRMPMESHSTATUS_BASEMESHCOMPLETE 0x04L +#define D3DRMPMESHSTATUS_COMPLETE 0x08L +#define D3DRMPMESHSTATUS_RENDERABLE 0x10L + +#define D3DRMPMESHEVENT_BASEMESH 0x01L +#define D3DRMPMESHEVENT_COMPLETE 0x02L + +typedef struct _D3DRMPMESHLOADSTATUS { + DWORD dwSize; // Size of this structure + DWORD dwPMeshSize; // Total Size (bytes) + DWORD dwBaseMeshSize; // Total Size of the Base Mesh + DWORD dwBytesLoaded; // Total bytes loaded + DWORD dwVerticesLoaded; // Number of vertices loaded + DWORD dwFacesLoaded; // Number of faces loaded + HRESULT dwLoadResult; // Result of the load operation + DWORD dwFlags; +} D3DRMPMESHLOADSTATUS, *LPD3DRMPMESHLOADSTATUS; + +typedef enum _D3DRMUSERVISUALREASON { + D3DRMUSERVISUAL_CANSEE, + D3DRMUSERVISUAL_RENDER +} D3DRMUSERVISUALREASON, *LPD3DRMUSERVISUALREASON; + + +typedef struct _D3DRMANIMATIONKEY +{ + DWORD dwSize; + DWORD dwKeyType; + D3DVALUE dvTime; + DWORD dwID; +#if (!defined __cplusplus) || (!defined D3D_OVERLOADS) + union + { + D3DRMQUATERNION dqRotateKey; + D3DVECTOR dvScaleKey; + D3DVECTOR dvPositionKey; + }; +#else + /* + * We do this as D3D_OVERLOADS defines constructors for D3DVECTOR, + * this can then not be used in a union. Use the inlines provided + * to extract and set the required component. + */ + D3DVALUE dvK[4]; +#endif +} D3DRMANIMATIONKEY; +typedef D3DRMANIMATIONKEY *LPD3DRMANIMATIONKEY; + +#if (defined __cplusplus) && (defined D3D_OVERLOADS) +inline VOID +D3DRMAnimationGetRotateKey(const D3DRMANIMATIONKEY& rmKey, + D3DRMQUATERNION& rmQuat) +{ + rmQuat.s = rmKey.dvK[0]; + rmQuat.v = D3DVECTOR(rmKey.dvK[1], rmKey.dvK[2], rmKey.dvK[3]); +} + +inline VOID +D3DRMAnimationGetScaleKey(const D3DRMANIMATIONKEY& rmKey, + D3DVECTOR& dvVec) +{ + dvVec = D3DVECTOR(rmKey.dvK[0], rmKey.dvK[1], rmKey.dvK[2]); +} + +inline VOID +D3DRMAnimationGetPositionKey(const D3DRMANIMATIONKEY& rmKey, + D3DVECTOR& dvVec) +{ + dvVec = D3DVECTOR(rmKey.dvK[0], rmKey.dvK[1], rmKey.dvK[2]); +} +inline VOID +D3DRMAnimationSetRotateKey(D3DRMANIMATIONKEY& rmKey, + const D3DRMQUATERNION& rmQuat) +{ + rmKey.dvK[0] = rmQuat.s; + rmKey.dvK[1] = rmQuat.v.x; + rmKey.dvK[2] = rmQuat.v.y; + rmKey.dvK[3] = rmQuat.v.z; +} + +inline VOID +D3DRMAnimationSetScaleKey(D3DRMANIMATIONKEY& rmKey, + const D3DVECTOR& dvVec) +{ + rmKey.dvK[0] = dvVec.x; + rmKey.dvK[1] = dvVec.y; + rmKey.dvK[2] = dvVec.z; +} + +inline VOID +D3DRMAnimationSetPositionKey(D3DRMANIMATIONKEY& rmKey, + const D3DVECTOR& dvVec) +{ + rmKey.dvK[0] = dvVec.x; + rmKey.dvK[1] = dvVec.y; + rmKey.dvK[2] = dvVec.z; +} +#endif + +#define D3DRMANIMATION_ROTATEKEY 0x01 +#define D3DRMANIMATION_SCALEKEY 0x02 +#define D3DRMANIMATION_POSITIONKEY 0x03 + + +typedef DWORD D3DRMMAPPING, D3DRMMAPPINGFLAG, *LPD3DRMMAPPING; +static const D3DRMMAPPINGFLAG D3DRMMAP_WRAPU = 1; +static const D3DRMMAPPINGFLAG D3DRMMAP_WRAPV = 2; +static const D3DRMMAPPINGFLAG D3DRMMAP_PERSPCORRECT = 4; + +typedef struct _D3DRMVERTEX +{ D3DVECTOR position; + D3DVECTOR normal; + D3DVALUE tu, tv; + D3DCOLOR color; +} D3DRMVERTEX, *LPD3DRMVERTEX; + +typedef LONG D3DRMGROUPINDEX; /* group indexes begin a 0 */ +static const D3DRMGROUPINDEX D3DRMGROUP_ALLGROUPS = -1; + +/* + * Create a color from three components in the range 0-1 inclusive. + */ +extern D3DCOLOR D3DRMAPI D3DRMCreateColorRGB(D3DVALUE red, + D3DVALUE green, + D3DVALUE blue); + +/* + * Create a color from four components in the range 0-1 inclusive. + */ +extern D3DCOLOR D3DRMAPI D3DRMCreateColorRGBA(D3DVALUE red, + D3DVALUE green, + D3DVALUE blue, + D3DVALUE alpha); + +/* + * Get the red component of a color. + */ +extern D3DVALUE D3DRMAPI D3DRMColorGetRed(D3DCOLOR); + +/* + * Get the green component of a color. + */ +extern D3DVALUE D3DRMAPI D3DRMColorGetGreen(D3DCOLOR); + +/* + * Get the blue component of a color. + */ +extern D3DVALUE D3DRMAPI D3DRMColorGetBlue(D3DCOLOR); + +/* + * Get the alpha component of a color. + */ +extern D3DVALUE D3DRMAPI D3DRMColorGetAlpha(D3DCOLOR); + +/* + * Add two vectors. Returns its first argument. + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorAdd(LPD3DVECTOR d, + LPD3DVECTOR s1, + LPD3DVECTOR s2); + +/* + * Subtract two vectors. Returns its first argument. + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorSubtract(LPD3DVECTOR d, + LPD3DVECTOR s1, + LPD3DVECTOR s2); +/* + * Reflect a ray about a given normal. Returns its first argument. + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorReflect(LPD3DVECTOR d, + LPD3DVECTOR ray, + LPD3DVECTOR norm); + +/* + * Calculate the vector cross product. Returns its first argument. + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorCrossProduct(LPD3DVECTOR d, + LPD3DVECTOR s1, + LPD3DVECTOR s2); +/* + * Return the vector dot product. + */ +extern D3DVALUE D3DRMAPI D3DRMVectorDotProduct(LPD3DVECTOR s1, + LPD3DVECTOR s2); + +/* + * Scale a vector so that its modulus is 1. Returns its argument or + * NULL if there was an error (e.g. a zero vector was passed). + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorNormalize(LPD3DVECTOR); +#define D3DRMVectorNormalise D3DRMVectorNormalize + +/* + * Return the length of a vector (e.g. sqrt(x*x + y*y + z*z)). + */ +extern D3DVALUE D3DRMAPI D3DRMVectorModulus(LPD3DVECTOR v); + +/* + * Set the rotation part of a matrix to be a rotation of theta radians + * around the given axis. + */ + +extern LPD3DVECTOR D3DRMAPI D3DRMVectorRotate(LPD3DVECTOR r, LPD3DVECTOR v, LPD3DVECTOR axis, D3DVALUE theta); + +/* + * Scale a vector uniformly in all three axes + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorScale(LPD3DVECTOR d, LPD3DVECTOR s, D3DVALUE factor); + +/* + * Return a random unit vector + */ +extern LPD3DVECTOR D3DRMAPI D3DRMVectorRandom(LPD3DVECTOR d); + +/* + * Returns a unit quaternion that represents a rotation of theta radians + * around the given axis. + */ + +extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionFromRotation(LPD3DRMQUATERNION quat, + LPD3DVECTOR v, + D3DVALUE theta); + +/* + * Calculate the product of two quaternions + */ +extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionMultiply(LPD3DRMQUATERNION q, + LPD3DRMQUATERNION a, + LPD3DRMQUATERNION b); + +/* + * Interpolate between two quaternions + */ +extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionSlerp(LPD3DRMQUATERNION q, + LPD3DRMQUATERNION a, + LPD3DRMQUATERNION b, + D3DVALUE alpha); + +/* + * Calculate the matrix for the rotation that a unit quaternion represents + */ +extern void D3DRMAPI D3DRMMatrixFromQuaternion(D3DRMMATRIX4D dmMat, LPD3DRMQUATERNION lpDqQuat); + +/* + * Calculate the quaternion that corresponds to a rotation matrix + */ +extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionFromMatrix(LPD3DRMQUATERNION, D3DRMMATRIX4D); + + +#if defined(__cplusplus) +}; +#endif + +#endif +