windows-nt/Source/XPSP1/NT/multimedia/directx/ddrawex/dx3inc/d3di.h
2020-09-26 16:20:57 +08:00

586 lines
17 KiB
C

/*==========================================================================;
*
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
*
* File: d3di.h
* Content: Direct3D internal include file
*@@BEGIN_MSINTERNAL
*
* $Id: d3di.h,v 1.26 1995/12/04 11:29:44 sjl Exp $
*
* History:
* Date By Reason
* ==== == ======
* 05/11/95 stevela Initial rev with this header.
* 11/11/95 stevela Light code changed.
* 21/11/95 colinmc Made Direct3D aggregatable
* (so it can be QI'd off DirectDraw).
* 23/11/95 colinmc Made Direct3D textures and devices aggregatable
* (QI'd off DirectDrawSurfaces).
* 07/12/95 stevela Merged in Colin's changes.
* 10/12/95 stevela Removed AGGREGATE_D3D.
* Removed Validate macros from here. Now in d3dpr.h
* 02/03/96 colinmc Minor build fix
* 17/04/96 stevela Use ddraw.h externally and ddrawp.h internally
*@@END_MSINTERNAL
*
***************************************************************************/
#ifndef _D3DI_H
#define _D3DI_H
//@@BEGIN_MSINTERNAL
#include "ddrawp.h"
#if 0
//@@END_MSINTERNAL
#include "ddraw.h"
//@@BEGIN_MSINTERNAL
#endif
//@@END_MSINTERNAL
#include "d3d.h"
// @@BEGIN_MSINTERNAL
#if !defined(BUILD_RLAPI) && !defined(BUILD_DDDDK)
#include "ddrawi.h"
#include "rlreg.h"
#include "queue.h"
#include "object.h"
/*
typedef D3DCOLORMODEL D3DCOLORMODEL;
#define D3DCOLOR_RAMP D3DCOLOR_RAMP
#define D3DCOLOR_RGB D3DCOLOR_RGB
#define D3D_COLORMODEL D3D_COLORMODEL
*/
#endif /* !BUILD_RLAPI */
// @@END_MSINTERNAL
typedef DWORD D3DI_BUFFERHANDLE, *LPD3DI_BUFFERHANDLE;
/*
* Internal version of executedata
*/
typedef struct _D3DI_ExecuteData {
DWORD dwSize;
D3DI_BUFFERHANDLE dwHandle; /* Handle allocated by driver */
DWORD dwVertexOffset;
DWORD dwVertexCount;
DWORD dwInstructionOffset;
DWORD dwInstructionLength;
DWORD dwHVertexOffset;
D3DSTATUS dsStatus; /* Status after execute */
} D3DI_EXECUTEDATA, *LPD3DI_EXECUTEDATA;
/*
* Internal version of lightdata
*/
typedef struct _D3DI_LIGHT {
D3DLIGHTTYPE type;
BOOL valid;
D3DVALUE red, green, blue, shade;
D3DVECTOR position;
D3DVECTOR model_position;
D3DVECTOR direction;
D3DVECTOR model_direction;
D3DVECTOR halfway;
D3DVALUE range;
D3DVALUE range_squared;
D3DVALUE falloff;
D3DVALUE attenuation0;
D3DVALUE attenuation1;
D3DVALUE attenuation2;
D3DVALUE cos_theta_by_2;
D3DVALUE cos_phi_by_2;
} D3DI_LIGHT, *LPD3DI_LIGHT;
// @@BEGIN_MSINTERNAL
#if !defined(BUILD_RLAPI) && !defined(BUILD_DDDDK)
#ifndef BUILD_HEL
#ifdef BUILD_D3D_LAYER
#include "driver.h"
#endif
typedef struct ID3DObjectVtbl D3DOBJECTVTBL, *LPD3DOBJECTVTBL;
typedef struct IDirect3DVtbl DIRECT3DCALLBACKS, *LPDIRECT3DCALLBACKS;
typedef struct IDirect3DDeviceVtbl DIRECT3DDEVICECALLBACKS, *LPDIRECT3DDEVICECALLBACKS;
typedef struct IDirect3DExecuteBufferVtbl DIRECT3DEXECUTEBUFFERCALLBACKS, *LPDIRECT3DEXECUTEBUFFERCALLBACKS;
typedef struct IDirect3DLightVtbl DIRECT3DLIGHTCALLBACKS, *LPDIRECT3DLIGHTCALLBACKS;
typedef struct IDirect3DMaterialVtbl DIRECT3DMATERIALCALLBACKS, *LPDIRECT3DMATERIALCALLBACKS;
typedef struct IDirect3DTextureVtbl DIRECT3DTEXTURECALLBACKS, *LPDIRECT3DTEXTURECALLBACKS;
typedef struct IDirect3DViewportVtbl DIRECT3DVIEWPORTCALLBACKS, *LPDIRECT3DVIEWPORTCALLBACKS;
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _DIRECT3DI *LPDIRECT3DI;
typedef struct _DIRECT3DDEVICEI *LPDIRECT3DDEVICEI;
typedef struct _DIRECT3DEXECUTEBUFFERI *LPDIRECT3DEXECUTEBUFFERI;
typedef struct _DIRECT3DLIGHTI *LPDIRECT3DLIGHTI;
typedef struct _DIRECT3DMATERIALI *LPDIRECT3DMATERIALI;
typedef struct _DIRECT3DTEXTUREI *LPDIRECT3DTEXTUREI;
typedef struct _DIRECT3DVIEWPORTI *LPDIRECT3DVIEWPORTI;
/*
* If we have an aggreate Direct3D we need a structure to
* represent an interface distinct from the underlying
* object. This is that structure.
*/
typedef struct _DIRECT3DUNKNOWNI
{
LPDIRECT3DCALLBACKS lpVtbl;
LPDIRECT3DI lpObj;
} DIRECT3DUNKNOWNI;
typedef struct _DIRECT3DUNKNOWNI *LPDIRECT3DUNKNOWNI;
/*
* Internal version of Direct3D object; it has data after the vtable
*/
typedef struct _DIRECT3DI
{
/*** Object Interface ***/
LPDIRECT3DCALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count object */
/*** Object Relations ***/
/* Devices */
int numDevs;/* Number of devices */
LIST_HEAD(_devices, _DIRECT3DDEVICEI) devices;
/* Associated IDirect3DDevices */
/* Viewports */
int numViewports; /* Number of viewports */
LIST_HEAD(_viewports, _DIRECT3DVIEWPORTI) viewports;
/* Created IDirect3DViewports */
/* Lights */
int numLights; /* Number of lights */
LIST_HEAD(_lights, _DIRECT3DLIGHTI) lights;
/* Created IDirect3DLights */
/* Materials */
int numMaterials; /* Number of materials */
LIST_HEAD(_materials, _DIRECT3DMATERIALI) materials;
/* Created IDirect3DMaterials */
/*** Object Data ***/
unsigned long v_next; /* id of next viewport to be created */
RLDDIRegistry* lpReg; /* Registry */
/*
* DirectDraw Interface
*/
LPDDRAWI_DIRECTDRAW_INT lpDDInt;
/*
* The special IUnknown interface for the aggregate that does
* not punt to the parent object.
*/
LPUNKNOWN lpOwningIUnknown; /* The owning IUnknown */
DIRECT3DUNKNOWNI lpThisIUnknown; /* Our IUnknown interface */
} DIRECT3DI;
/*
* If we have an aggreate Direct3DDevice we need a structure to
* represent an interface distinct from the underlying
* object. This is that structure.
*/
typedef struct _DIRECT3DDEVICEUNKNOWNI
{
LPDIRECT3DDEVICECALLBACKS lpVtbl;
LPDIRECT3DDEVICEI lpObj;
} DIRECT3DDEVICEUNKNOWNI;
typedef struct _DIRECT3DDEVICEUNKNOWNI *LPDIRECT3DDEVICEUNKNOWNI;
/*
* Internal version of Direct3DDevice object; it has data after the vtable
*/
#include "d3dhal.h"
typedef RLDDIDriver* (*RLDDIDDrawCreateDriverFn)(
LPDDRAWI_DIRECTDRAW_INT lpDDInt,
LPDIRECTDRAWSURFACE lpDDS,
LPDIRECTDRAWSURFACE lpZ,
LPDIRECTDRAWPALETTE lpPal,
LPDIRECT3DDEVICEI);
typedef HRESULT (*RLDDIGetCapsFn)(LPD3DDEVICEDESC*, LPD3DDEVICEDESC*);
typedef void (*RLDDIInitFn)(RLDDIMallocFn, RLDDIReallocFn, RLDDIFreeFn, RLDDIRaiseFn, RLDDIValue**, int, int);
typedef void (*RLDDIPushDriverFn)(RLDDIDriverStack*, RLDDIDriver*);
typedef void (*RLDDIPopDriverFn)(RLDDIDriverStack*);
typedef struct _D3DI_TEXTUREBLOCK
{
LIST_ENTRY(_D3DI_TEXTUREBLOCK) list;
/* Next block in IDirect3DTexture */
LIST_ENTRY(_D3DI_TEXTUREBLOCK) devList;
/* Next block in IDirect3DDevice */
LPDIRECT3DDEVICEI lpD3DDeviceI;
LPDIRECT3DTEXTUREI lpD3DTextureI;
D3DTEXTUREHANDLE hTex;
/* texture handle */
} D3DI_TEXTUREBLOCK;
typedef struct _D3DI_TEXTUREBLOCK *LPD3DI_TEXTUREBLOCK;
typedef struct _D3DI_MATERIALBLOCK
{
LIST_ENTRY(_D3DI_MATERIALBLOCK) list;
/* Next block in IDirect3DMaterial */
LIST_ENTRY(_D3DI_MATERIALBLOCK) devList;
/* Next block in IDirect3DDevice */
LPDIRECT3DDEVICEI lpD3DDeviceI;
LPDIRECT3DMATERIALI lpD3DMaterialI;
D3DMATERIALHANDLE hMat;
/* material handle */
} D3DI_MATERIALBLOCK;
typedef struct _D3DI_MATERIALBLOCK *LPD3DI_MATERIALBLOCK;
typedef struct _DIRECT3DDEVICEI
{
/*** Object Interface ***/
LPDIRECT3DDEVICECALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count */
/*** Object Relations ***/
LPDIRECT3DI lpDirect3DI; /* parent */
LIST_ENTRY(_DIRECT3DDEVICEI)list; /* Next device IDirect3D */
/* Textures */
LIST_HEAD(_textures, _D3DI_TEXTUREBLOCK) texBlocks;
/* Ref to created IDirect3DTextures */
/* Execute buffers */
LIST_HEAD(_buffers, _DIRECT3DEXECUTEBUFFERI) buffers;
/* Created IDirect3DExecuteBuffers */
/* Viewports */
int numViewports;
CIRCLEQ_HEAD(_dviewports, _DIRECT3DVIEWPORTI) viewports;
/* Associated IDirect3DViewports */
/* Materials */
LIST_HEAD(_dmmaterials, _D3DI_MATERIALBLOCK) matBlocks;
/* Ref to associated IDirect3DMaterials */
/*** Object Data ***/
/* Private interfaces */
LPD3DOBJECTVTBL lpClassVtbl; /* Private Vtbl */
LPD3DOBJECTVTBL lpObjVtbl; /* Private Vtbl */
LPD3DHAL_CALLBACKS lpD3DHALCallbacks;
LPD3DHAL_GLOBALDRIVERDATA lpD3DHALGlobalDriverData;
/* Viewports */
unsigned long v_id; /* ID of last viewport rendered */
/* Lights */
int numLights;
/* This indicates the maximum number
of lights that have been set in
the device. */
/* Device characteristics */
int age;
int width;
int height;
int depth;
unsigned long red_mask, green_mask, blue_mask;
int dither;
int ramp_size;
D3DCOLORMODEL color_model;
int wireframe_options;
D3DTEXTUREFILTER texture_quality;
D3DVALUE gamma;
unsigned char gamma_table[256];
int aspectx, aspecty;
D3DVALUE perspective_tolerance;
/* Library information */
#ifdef WIN32
HINSTANCE hDrvDll;
char dllname[MAXPATH];
char base[256];
#endif
#ifdef SHLIB
void* so;
#endif
/* Are we in a scene? */
BOOL bInScene;
/* Our Device type */
GUID guid;
/* GetCaps function from the library */
RLDDIGetCapsFn GetCapsFn;
/* Functions required to build driver */
RLDDIInitFn RLDDIInit;
RLDDIPushDriverFn RLDDIPushDriver;
RLDDIPopDriverFn RLDDIPopDriver;
RLDDIDDrawCreateDriverFn RLDDIDDrawCreateDriver;
/* Device description */
D3DDEVICEDESC d3dHWDevDesc;
D3DDEVICEDESC d3dHELDevDesc;
/* Driver stack */
RLDDIDriverStack* stack;
/*
* The special IUnknown interface for the aggregate that does
* not punt to the parent object.
*/
LPUNKNOWN lpOwningIUnknown; /* The owning IUnknown */
DIRECT3DDEVICEUNKNOWNI lpThisIUnknown; /* Our IUnknown interface */
} DIRECT3DDEVICEI;
/*
* Internal version of Direct3DExecuteBuffer object;
* it has data after the vtable
*/
typedef struct _DIRECT3DEXECUTEBUFFERI
{
/*** Object Interface ***/
LPDIRECT3DEXECUTEBUFFERCALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count */
/*** Object Relations ***/
LPDIRECT3DDEVICEI lpD3DDeviceI; /* Parent */
LIST_ENTRY(_DIRECT3DEXECUTEBUFFERI)list;
/* Next buffer in IDirect3D */
/*** Object Data ***/
DWORD pid; /* Process locking execute buffer */
D3DEXECUTEBUFFERDESC debDesc;
/* Description of the buffer */
D3DEXECUTEDATA exData; /* Execute Data */
BOOL locked; /* Is the buffer locked */
D3DI_BUFFERHANDLE hBuf;
/* Execute buffer handle */
} DIRECT3DEXECUTEBUFFERI;
/*
* Internal version of Direct3DLight object;
* it has data after the vtable
*/
typedef struct _DIRECT3DLIGHTI
{
/*** Object Interface ***/
LPDIRECT3DLIGHTCALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count */
/*** Object Relations ***/
LPDIRECT3DI lpDirect3DI; /* Parent */
LIST_ENTRY(_DIRECT3DLIGHTI)list;
/* Next light in IDirect3D */
LPDIRECT3DVIEWPORTI lpD3DViewportI; /* Guardian */
CIRCLEQ_ENTRY(_DIRECT3DLIGHTI)light_list;
/* Next light in IDirect3DViewport */
/*** Object Data ***/
D3DLIGHT dlLight;/* Data describing light */
D3DI_LIGHT diLightData;
/* Internal representation of light */
} DIRECT3DLIGHTI;
/*
* Internal version of Direct3DMaterial object;
* it has data after the vtable
*/
typedef struct _DIRECT3DMATERIALI
{
/*** Object Interface ***/
LPDIRECT3DMATERIALCALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count */
/*** Object Relations ***/
LPDIRECT3DI lpDirect3DI; /* Parent */
LIST_ENTRY(_DIRECT3DMATERIALI)list;
/* Next MATERIAL in IDirect3D */
LIST_HEAD(_mblocks, _D3DI_MATERIALBLOCK)blocks;
/* devices we're associated with */
/*** Object Data ***/
D3DMATERIAL dmMaterial; /* Data describing material */
BOOL bRes; /* Is this material reserved in the driver */
} DIRECT3DMATERIALI;
/*
* If we have an aggreate Direct3DTexture we need a structure
* to represent an unknown interface distinct from the underlying
* object. This is that structure.
*/
typedef struct _DIRECT3DTEXTUREUNKNOWNI
{
LPDIRECT3DTEXTURECALLBACKS lpVtbl;
LPDIRECT3DTEXTUREI lpObj;
} DIRECT3DTEXTUREUNKNOWNI;
typedef struct _DIRECT3DTEXTUREUNKNOWNI *LPDIRECT3DTEXTUREUNKNOWNI;
/*
* Internal version of Direct3DTexture object; it has data after the vtable
*/
typedef struct _DIRECT3DTEXTUREI
{
/*** Object Interface ***/
LPDIRECT3DTEXTURECALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count */
/*** Object Relations ***/
LIST_HEAD(_blocks, _D3DI_TEXTUREBLOCK) blocks;
/* Devices we're associated with */
/*** Object Data ***/
LPDIRECTDRAWSURFACE lpDDS;
/*
* The special IUnknown interface for the aggregate that does
* not punt to the parent object.
*/
LPUNKNOWN lpOwningIUnknown; /* The owning IUnknown */
DIRECT3DTEXTUREUNKNOWNI lpThisIUnknown; /* Our IUnknown interface */
BOOL bIsPalettized;
} DIRECT3DTEXTUREI;
/*
* Internal version of Direct3DViewport object; it has data after the vtable
*/
typedef struct _DIRECT3DVIEWPORTI
{
/*** Object Interface ***/
LPDIRECT3DVIEWPORTCALLBACKS lpVtbl; /* Pointer to callbacks */
int refCnt; /* Reference count */
/*** Object Relations */
LPDIRECT3DI lpDirect3DI; /* Parent */
LIST_ENTRY(_DIRECT3DVIEWPORTI)list;
/* Next viewport in IDirect3D */
LPDIRECT3DDEVICEI lpD3DDeviceI; /* Guardian */
CIRCLEQ_ENTRY(_DIRECT3DVIEWPORTI)vw_list;
/* Next viewport in IDirect3DDevice */
/* Lights */
int numLights;
CIRCLEQ_HEAD(_dlights, _DIRECT3DLIGHTI) lights;
/* Associated IDirect3DLights */
/*** Object Data ***/
unsigned long v_id; /* Id for this viewport */
D3DVIEWPORT v_data;
BOOL have_background;
D3DMATERIALHANDLE background;
/* Background material */
BOOL have_depth;
LPDIRECTDRAWSURFACE depth; /* Background depth */
BOOL bLightsChanged;
/* Have the lights changed since they
were last collected? */
DWORD clrCount; /* Number of rects allocated */
LPD3DRECT clrRects; /* Rects used for clearing */
} DIRECT3DVIEWPORTI;
/*
* Picking stuff.
*/
typedef struct _D3DI_PICKDATA {
D3DI_EXECUTEDATA* exe;
D3DPICKRECORD* records;
int pick_count;
D3DRECT pick;
} D3DI_PICKDATA, *LPD3DI_PICKDATA;
/*
* Direct3D memory allocation
*/
/*
* Register a set of functions to be used in place of malloc, realloc
* and free for memory allocation. The functions D3DMalloc, D3DRealloc
* and D3DFree will use these functions. The default is to use the
* ANSI C library routines malloc, realloc and free.
*/
typedef LPVOID (*D3DMALLOCFUNCTION)(size_t);
typedef LPVOID (*D3DREALLOCFUNCTION)(LPVOID, size_t);
typedef VOID (*D3DFREEFUNCTION)(LPVOID);
/*
* Allocate size bytes of memory and return a pointer to it in *p_return.
* Returns D3DERR_BADALLOC with *p_return unchanged if the allocation fails.
*/
HRESULT D3DAPI D3DMalloc(LPVOID* p_return, size_t size);
/*
* Change the size of an allocated block of memory. A pointer to the
* block is passed in in *p_inout. If *p_inout is NULL then a new
* block is allocated. If the reallocation is successful, *p_inout is
* changed to point to the new block. If the allocation fails,
* *p_inout is unchanged and D3DERR_BADALLOC is returned.
*/
HRESULT D3DAPI D3DRealloc(LPVOID* p_inout, size_t size);
/*
* Free a block of memory previously allocated with D3DMalloc or
* D3DRealloc.
*/
VOID D3DAPI D3DFree(LPVOID p);
/*
* Used for raising errors from the driver.
*/
HRESULT D3DAPI D3DRaise(HRESULT);
/*
* Convert RLDDI error codes to D3D error codes
*/
#define RLDDITOD3DERR(_errcode) (RLDDIToD3DErrors[_errcode])
extern HRESULT RLDDIToD3DErrors[];
/*
* maths
*/
#if 1 /* defined(STACK_CALL) && defined(__WATCOMC__) */
D3DVALUE D3DIPow(D3DVALUE, D3DVALUE);
#else
#define D3DIPow(v,p) DTOVAL(pow(VALTOD(v), VALTOD(p)))
#endif
/*
* Light utils
*/
void D3DI_DeviceMarkLightEnd(LPDIRECT3DDEVICEI, int);
void D3DI_UpdateLightInternal(LPDIRECT3DLIGHTI);
void D3DI_VectorNormalise12(LPD3DVECTOR v);
D3DTEXTUREHANDLE D3DI_FindTextureHandle(LPDIRECT3DTEXTUREI, LPDIRECT3DDEVICEI);
void D3DI_SetTextureHandle(LPDIRECT3DTEXTUREI, LPDIRECT3DDEVICEI, D3DTEXTUREHANDLE);
void D3DI_RemoveTextureBlock(LPD3DI_TEXTUREBLOCK);
void D3DI_RemoveMaterialBlock(LPD3DI_MATERIALBLOCK);
extern BOOL D3DI_isHALValid(LPD3DHAL_CALLBACKS);
#ifdef BUILD_D3D_LAYER
extern RLDDIValue* RLDDIFInvSqrtTable;
#endif
#ifdef __cplusplus
};
#endif
#endif /* BUILD_HEL */
#endif /* !BUILD_RLAPI */
// @@END_MSINTERNAL
#endif /* _D3DI_H */