132 lines
5.2 KiB
C++
132 lines
5.2 KiB
C++
#ifndef __MSPSGP_H_
|
|
#define __MSPSGP_H_
|
|
/*==========================================================================;
|
|
*
|
|
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: mspsgp.h
|
|
* Content: Defines for Microsoft's PSPG implementation
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "vvm.h"
|
|
|
|
// DEBUG_PIPELINE is defined to check performance and to allow to choose
|
|
// diifferent paths in the geometry pipeline
|
|
// Undefine DEBUG_PIPELINE for final
|
|
|
|
//#define DEBUG_PIPELINE
|
|
|
|
#ifdef DEBUG_PIPELINE
|
|
const DWORD __DEBUG_NORENDERING = 1; // Disable writing drawing command to the command buffer
|
|
const DWORD __DEBUG_ONEPASS = 2; // Disable clip and light in one pass
|
|
const DWORD __DEBUG_MODELSPACE = 4; // Disable lighting in model space
|
|
#endif
|
|
|
|
//---------------------------------------------------------------------
|
|
// Returns TRUE if cipping is needed
|
|
//
|
|
inline BOOL CheckIfNeedClipping(LPD3DFE_PROCESSVERTICES pv)
|
|
{
|
|
if (pv->dwDeviceFlags & D3DDEV_GUARDBAND)
|
|
{
|
|
if (pv->dwClipUnion & ~__D3DCS_INGUARDBAND)
|
|
return TRUE;
|
|
}
|
|
else
|
|
if (pv->dwClipUnion)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
// Direct3D default implementation of PVFUNCS
|
|
//
|
|
class D3DFE_PVFUNCSI : public ID3DFE_PVFUNCS
|
|
{
|
|
public:
|
|
DWORD ProcessVertices(LPD3DFE_PROCESSVERTICES);
|
|
HRESULT ProcessPrimitive(LPD3DFE_PROCESSVERTICES);
|
|
HRESULT ProcessIndexedPrimitive(LPD3DFE_PROCESSVERTICES);
|
|
int ClipSingleTriangle(D3DFE_PROCESSVERTICES *pv,
|
|
ClipTriangle *tri,
|
|
ClipVertex ***clipVertexPointer);
|
|
HRESULT DoDrawIndexedPrimitive(LPD3DFE_PROCESSVERTICES pv);
|
|
HRESULT DoDrawPrimitive(LPD3DFE_PROCESSVERTICES pv);
|
|
HRESULT ProcessLineList(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessLineStrip(D3DFE_PROCESSVERTICES *pv);
|
|
DWORD ProcessVerticesVVM(LPD3DFE_PROCESSVERTICES pv);
|
|
HRESULT CreateShader(CVElement* pElements, DWORD dwNumElements,
|
|
DWORD* pdwShaderCode, DWORD dwOutputFVF,
|
|
CPSGPShader** ppPSGPShader);
|
|
HRESULT SetActiveShader(CPSGPShader* pPSGPShader);
|
|
HRESULT LoadShaderConstants(DWORD start, DWORD count, LPVOID buffer);
|
|
HRESULT GetShaderConstants(DWORD start, DWORD count, LPVOID buffer);
|
|
HRESULT SetOutputFVF(DWORD dwFVF) {return D3D_OK;}
|
|
|
|
HRESULT ProcessTriangleList(LPD3DFE_PROCESSVERTICES);
|
|
HRESULT ProcessTriangleFan(LPD3DFE_PROCESSVERTICES);
|
|
HRESULT ProcessTriangleStrip(LPD3DFE_PROCESSVERTICES);
|
|
|
|
HRESULT Clip(D3DFE_PROCESSVERTICES *pv, ClipVertex *cv1,
|
|
ClipVertex *cv2,
|
|
ClipVertex *cv3);
|
|
int ClipSingleLine(D3DFE_PROCESSVERTICES *pv, ClipTriangle *line);
|
|
HRESULT ProcessClippedTriangleFan(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedIndexedTriangleFan(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedLine(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedTriangleList(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedTriangleStrip(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedIndexedTriangleList(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedIndexedTriangleStrip(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedIndexedLine(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedPoints(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ProcessClippedIndexedPoints(D3DFE_PROCESSVERTICES *pv);
|
|
HRESULT ClipLine(D3DFE_PROCESSVERTICES *pv, ClipVertex *v1, ClipVertex *v2);
|
|
|
|
CVertexVM m_VertexVM;
|
|
|
|
};
|
|
//-----------------------------------------------------------------------------
|
|
// Does projected texture emulation
|
|
// Parameters:
|
|
// pOut - output texture coordinates
|
|
// pIn - input texture coordinates
|
|
// dwOutTexSize - size of output texture coordinates in bytes
|
|
// Assumes that input texture coordinates have one float more than the output
|
|
//
|
|
inline void DoTextureProjection(float* pIn, float* pOut, DWORD dwOutTexSize)
|
|
{
|
|
UINT n = dwOutTexSize >> 2; // Number of output floats
|
|
float w = 1.0f/pIn[n];
|
|
for (UINT i=0; i < n; i++)
|
|
{
|
|
pOut[i] = pIn[i] * w;
|
|
}
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
inline void
|
|
DoBlending(float blendFactor, D3DVECTOR* v1, D3DVECTOR* v2, D3DVECTOR* out)
|
|
{
|
|
out->x = v1->x + (v2->x - v1->x) * blendFactor;
|
|
out->y = v1->y + (v2->y - v1->y) * blendFactor;
|
|
out->z = v1->z + (v2->z - v1->z) * blendFactor;
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
// Returns TRUE if we can do one pass transformation-lighting-clipping for
|
|
// non-indexed primitives
|
|
//
|
|
inline BOOL DoOnePassPrimProcessing(D3DFE_PROCESSVERTICES* pv)
|
|
{
|
|
return ((pv->dwDeviceFlags & (D3DDEV_DONOTCLIP | D3DDEV_VERTEXSHADERS)) |
|
|
(pv->dwFlags & (D3DPV_POSITION_TWEENING | D3DPV_NORMAL_TWEENING))) == 0;
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
// Returns TRUE if we never read from the internal TL buffer
|
|
//
|
|
inline BOOL NeverReadFromTLBuffer(D3DFE_PROCESSVERTICES* pv)
|
|
{
|
|
return (pv->dwDeviceFlags & D3DDEV_DONOTCLIP) | DoOnePassPrimProcessing(pv);
|
|
}
|
|
|
|
#endif // __MSPSGP_H_
|