2V2-e.1: 3D draw-command channel — recording D3D8 device, StateManager, GrpBase, camera
EterLib/StateManager.cpp and GrpBase.cpp ported verbatim. CGraphicDevice::Create builds a platform IDirect3DDevice8 that keeps the device state and records every Draw* call as a Render3DDraw (vertices decoded by FVF, strips/fans expanded, textures, world/view/proj, blend/depth/light state). The 40250 camera (__UpdateCamera, SetCenterPosition, ...) and the Process order (__UpdateCamera -> OnCameraUpdate -> OnUIUpdate -> Begin/SetInterfaceRenderState/OnUIRender/End) are in place; CScreen Begin/End, CPythonGraphic render states and CCullingManager::Process matrix updates are verbatim. port.login_flow asserts a textured, lit character draw under the RH perspective with every vertex on screen; offline and live pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
668f48d6ec
commit
5bfa13c5cc
@@ -408,6 +408,56 @@ typedef enum _D3DCULL {
|
||||
D3DCULL_FORCE_DWORD = 0x7fffffff,
|
||||
} D3DCULL;
|
||||
|
||||
typedef enum _D3DTEXTUREFILTERTYPE {
|
||||
D3DTEXF_NONE = 0,
|
||||
D3DTEXF_POINT = 1,
|
||||
D3DTEXF_LINEAR = 2,
|
||||
D3DTEXF_ANISOTROPIC = 3,
|
||||
D3DTEXF_FLATCUBIC = 4,
|
||||
D3DTEXF_GAUSSIANCUBIC = 5,
|
||||
D3DTEXF_FORCE_DWORD = 0x7fffffff
|
||||
} D3DTEXTUREFILTERTYPE;
|
||||
|
||||
typedef enum _D3DSHADEMODE {
|
||||
D3DSHADE_FLAT = 1,
|
||||
D3DSHADE_GOURAUD = 2,
|
||||
D3DSHADE_PHONG = 3,
|
||||
D3DSHADE_FORCE_DWORD = 0x7fffffff
|
||||
} D3DSHADEMODE;
|
||||
|
||||
typedef enum _D3DBLENDOP {
|
||||
D3DBLENDOP_ADD = 1,
|
||||
D3DBLENDOP_SUBTRACT = 2,
|
||||
D3DBLENDOP_REVSUBTRACT = 3,
|
||||
D3DBLENDOP_MIN = 4,
|
||||
D3DBLENDOP_MAX = 5,
|
||||
D3DBLENDOP_FORCE_DWORD = 0x7fffffff
|
||||
} D3DBLENDOP;
|
||||
|
||||
typedef enum _D3DFOGMODE {
|
||||
D3DFOG_NONE = 0,
|
||||
D3DFOG_EXP = 1,
|
||||
D3DFOG_EXP2 = 2,
|
||||
D3DFOG_LINEAR = 3,
|
||||
D3DFOG_FORCE_DWORD = 0x7fffffff
|
||||
} D3DFOGMODE;
|
||||
|
||||
typedef enum _D3DMATERIALCOLORSOURCE {
|
||||
D3DMCS_MATERIAL = 0,
|
||||
D3DMCS_COLOR1 = 1,
|
||||
D3DMCS_COLOR2 = 2,
|
||||
D3DMCS_FORCE_DWORD = 0x7fffffff
|
||||
} D3DMATERIALCOLORSOURCE;
|
||||
|
||||
typedef enum _D3DVERTEXBLENDFLAGS {
|
||||
D3DVBF_DISABLE = 0,
|
||||
D3DVBF_1WEIGHTS = 1,
|
||||
D3DVBF_2WEIGHTS = 2,
|
||||
D3DVBF_3WEIGHTS = 3,
|
||||
D3DVBF_TWEENING = 255,
|
||||
D3DVBF_0WEIGHTS = 256
|
||||
} D3DVERTEXBLENDFLAGS;
|
||||
|
||||
#define D3DTS_WORLDMATRIX(index) (D3DTRANSFORMSTATETYPE)(index + 256)
|
||||
#define D3DTS_WORLD D3DTS_WORLDMATRIX(0)
|
||||
#define D3DTS_WORLD1 D3DTS_WORLDMATRIX(1)
|
||||
@@ -593,16 +643,72 @@ typedef struct _D3DCAPS8
|
||||
float MaxPixelShaderValue;
|
||||
} D3DCAPS8;
|
||||
|
||||
// COM interfaces: no methods here; platform/ owns every instance. The resource hierarchy is kept
|
||||
// so the implicit upcasts 40250 relies on (texture -> base texture) compile.
|
||||
#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L
|
||||
#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L
|
||||
#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L
|
||||
#define D3DPTADDRESSCAPS_WRAP 0x00000001L
|
||||
#define D3DPTADDRESSCAPS_MIRROR 0x00000002L
|
||||
#define D3DPTADDRESSCAPS_CLAMP 0x00000004L
|
||||
#define D3DPTADDRESSCAPS_BORDER 0x00000008L
|
||||
|
||||
#define D3DADAPTER_DEFAULT 0
|
||||
#define D3DCREATE_SOFTWARE_VERTEXPROCESSING 0x00000020L
|
||||
#define D3DCREATE_HARDWARE_VERTEXPROCESSING 0x00000040L
|
||||
#define D3DCREATE_MIXED_VERTEXPROCESSING 0x00000080L
|
||||
#define D3DVS_VERSION(_Major, _Minor) (0xFFFE0000 | ((_Major) << 8) | (_Minor))
|
||||
#define D3DPMISCCAPS_CLIPTLVERTS 0x00000200L
|
||||
|
||||
// COM interfaces: platform/ owns every instance. The resource hierarchy is kept so the implicit
|
||||
// upcasts 40250 relies on (texture -> base texture) compile; of the resources only the buffers carry
|
||||
// methods (Lock/Unlock, platform/EterLib/CpuBuffer.h).
|
||||
struct IDirect3D8;
|
||||
struct IDirect3DDevice8;
|
||||
struct IDirect3DResource8 {};
|
||||
struct IDirect3DBaseTexture8 : IDirect3DResource8 {};
|
||||
struct IDirect3DTexture8 : IDirect3DBaseTexture8 {};
|
||||
struct IDirect3DSurface8 : IDirect3DResource8 {};
|
||||
struct IDirect3DVertexBuffer8 : IDirect3DResource8 {};
|
||||
struct IDirect3DIndexBuffer8 : IDirect3DResource8 {};
|
||||
struct IDirect3DVertexBuffer8 : IDirect3DResource8
|
||||
{
|
||||
virtual ~IDirect3DVertexBuffer8() = default;
|
||||
virtual HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags) = 0;
|
||||
virtual HRESULT Unlock() = 0;
|
||||
};
|
||||
struct IDirect3DIndexBuffer8 : IDirect3DResource8
|
||||
{
|
||||
virtual ~IDirect3DIndexBuffer8() = default;
|
||||
virtual HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags) = 0;
|
||||
virtual HRESULT Unlock() = 0;
|
||||
};
|
||||
|
||||
// The device methods the ported code calls (CStateManager), with D3D8's signatures. The platform
|
||||
// implements it (platform/EterLib/RecordingDevice.h) as a device that records draw calls.
|
||||
struct IDirect3DDevice8
|
||||
{
|
||||
virtual ~IDirect3DDevice8() = default;
|
||||
virtual ULONG AddRef() = 0;
|
||||
virtual ULONG Release() = 0;
|
||||
virtual HRESULT GetDeviceCaps(D3DCAPS8* pCaps) = 0;
|
||||
virtual HRESULT GetViewport(D3DVIEWPORT8* pViewport) = 0;
|
||||
virtual UINT GetAvailableTextureMem() = 0;
|
||||
virtual HRESULT BeginScene() = 0;
|
||||
virtual HRESULT EndScene() = 0;
|
||||
virtual HRESULT SetTransform(D3DTRANSFORMSTATETYPE State, const D3DMATRIX* pMatrix) = 0;
|
||||
virtual HRESULT GetTransform(D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix) = 0;
|
||||
virtual HRESULT SetMaterial(const D3DMATERIAL8* pMaterial) = 0;
|
||||
virtual HRESULT SetLight(DWORD Index, const D3DLIGHT8* pLight) = 0;
|
||||
virtual HRESULT SetRenderState(D3DRENDERSTATETYPE State, DWORD Value) = 0;
|
||||
virtual HRESULT SetTexture(DWORD Stage, IDirect3DBaseTexture8* pTexture) = 0;
|
||||
virtual HRESULT SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) = 0;
|
||||
virtual HRESULT SetVertexShader(DWORD Handle) = 0;
|
||||
virtual HRESULT SetPixelShader(DWORD Handle) = 0;
|
||||
virtual HRESULT SetVertexShaderConstant(DWORD Register, const void* pConstantData, DWORD ConstantCount) = 0;
|
||||
virtual HRESULT SetPixelShaderConstant(DWORD Register, const void* pConstantData, DWORD ConstantCount) = 0;
|
||||
virtual HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer8* pStreamData, UINT Stride) = 0;
|
||||
virtual HRESULT SetIndices(IDirect3DIndexBuffer8* pIndexData, UINT BaseVertexIndex) = 0;
|
||||
virtual HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) = 0;
|
||||
virtual HRESULT DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount) = 0;
|
||||
virtual HRESULT DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) = 0;
|
||||
virtual HRESULT DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertexIndices, UINT PrimitiveCount, const void* pIndexData, D3DFORMAT IndexDataFormat, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) = 0;
|
||||
};
|
||||
typedef IDirect3D8* LPDIRECT3D8;
|
||||
typedef IDirect3DDevice8* LPDIRECT3DDEVICE8;
|
||||
typedef IDirect3DResource8* LPDIRECT3DRESOURCE8;
|
||||
|
||||
@@ -341,3 +341,144 @@ D3DXQUATERNION* D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION* pOut, FLOAT y
|
||||
pOut->w = cyaw * cpitch * croll + syaw * spitch * sroll;
|
||||
return pOut;
|
||||
}
|
||||
|
||||
D3DXMATRIX* D3DXMatrixPerspectiveFovRH(D3DXMATRIX* pOut, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf)
|
||||
{
|
||||
const FLOAT yScale = 1.0f / tanf(fovy / 2.0f);
|
||||
*pOut = D3DXMATRIX(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
pOut->_11 = yScale / aspect;
|
||||
pOut->_22 = yScale;
|
||||
pOut->_33 = zf / (zn - zf);
|
||||
pOut->_34 = -1.0f;
|
||||
pOut->_43 = zn * zf / (zn - zf);
|
||||
return pOut;
|
||||
}
|
||||
|
||||
D3DXMATRIX* D3DXMatrixOrthoRH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf)
|
||||
{
|
||||
D3DXMatrixIdentity(pOut);
|
||||
pOut->_11 = 2.0f / w;
|
||||
pOut->_22 = 2.0f / h;
|
||||
pOut->_33 = 1.0f / (zn - zf);
|
||||
pOut->_43 = zn / (zn - zf);
|
||||
return pOut;
|
||||
}
|
||||
|
||||
D3DXMATRIX* D3DXMatrixOrthoOffCenterRH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
|
||||
{
|
||||
D3DXMatrixIdentity(pOut);
|
||||
pOut->_11 = 2.0f / (r - l);
|
||||
pOut->_22 = 2.0f / (t - b);
|
||||
pOut->_33 = 1.0f / (zn - zf);
|
||||
pOut->_41 = (l + r) / (l - r);
|
||||
pOut->_42 = (t + b) / (b - t);
|
||||
pOut->_43 = zn / (zn - zf);
|
||||
return pOut;
|
||||
}
|
||||
|
||||
ID3DXMatrixStack::ID3DXMatrixStack() : m_stack(1)
|
||||
{
|
||||
D3DXMatrixIdentity(&m_stack.back());
|
||||
}
|
||||
|
||||
ULONG ID3DXMatrixStack::Release()
|
||||
{
|
||||
delete this;
|
||||
return 0;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::Pop()
|
||||
{
|
||||
if (m_stack.size() > 1)
|
||||
m_stack.pop_back();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::Push()
|
||||
{
|
||||
m_stack.push_back(m_stack.back());
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::LoadIdentity()
|
||||
{
|
||||
D3DXMatrixIdentity(&m_stack.back());
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::LoadMatrix(const D3DXMATRIX* pM)
|
||||
{
|
||||
m_stack.back() = *pM;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::MultMatrix(const D3DXMATRIX* pM)
|
||||
{
|
||||
D3DXMatrixMultiply(&m_stack.back(), &m_stack.back(), pM);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::MultMatrixLocal(const D3DXMATRIX* pM)
|
||||
{
|
||||
D3DXMatrixMultiply(&m_stack.back(), pM, &m_stack.back());
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::RotateAxis(const D3DXVECTOR3* pV, FLOAT angle)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrix(D3DXMatrixRotationAxis(&m, pV, angle));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::RotateAxisLocal(const D3DXVECTOR3* pV, FLOAT angle)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrixLocal(D3DXMatrixRotationAxis(&m, pV, angle));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::RotateYawPitchRoll(FLOAT yaw, FLOAT pitch, FLOAT roll)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrix(D3DXMatrixRotationYawPitchRoll(&m, yaw, pitch, roll));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::RotateYawPitchRollLocal(FLOAT yaw, FLOAT pitch, FLOAT roll)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrixLocal(D3DXMatrixRotationYawPitchRoll(&m, yaw, pitch, roll));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::Scale(FLOAT x, FLOAT y, FLOAT z)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrix(D3DXMatrixScaling(&m, x, y, z));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::ScaleLocal(FLOAT x, FLOAT y, FLOAT z)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrixLocal(D3DXMatrixScaling(&m, x, y, z));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::Translate(FLOAT x, FLOAT y, FLOAT z)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrix(D3DXMatrixTranslation(&m, x, y, z));
|
||||
}
|
||||
|
||||
HRESULT ID3DXMatrixStack::TranslateLocal(FLOAT x, FLOAT y, FLOAT z)
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
return MultMatrixLocal(D3DXMatrixTranslation(&m, x, y, z));
|
||||
}
|
||||
|
||||
D3DXMATRIX* ID3DXMatrixStack::GetTop()
|
||||
{
|
||||
return &m_stack.back();
|
||||
}
|
||||
|
||||
HRESULT D3DXCreateMatrixStack(DWORD, ID3DXMatrixStack** ppStack)
|
||||
{
|
||||
*ppStack = new ID3DXMatrixStack;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "D3D8Types.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <vector>
|
||||
|
||||
#define D3DX_PI ((FLOAT)3.141592654f)
|
||||
#define D3DX_1BYPI ((FLOAT)0.318309886f)
|
||||
@@ -368,6 +369,9 @@ D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* pOut, FLOAT angle);
|
||||
D3DXMATRIX* D3DXMatrixRotationAxis(D3DXMATRIX* pOut, const D3DXVECTOR3* pV, FLOAT angle);
|
||||
D3DXMATRIX* D3DXMatrixRotationQuaternion(D3DXMATRIX* pOut, const D3DXQUATERNION* pQ);
|
||||
D3DXMATRIX* D3DXMatrixRotationYawPitchRoll(D3DXMATRIX* pOut, FLOAT yaw, FLOAT pitch, FLOAT roll);
|
||||
D3DXMATRIX* D3DXMatrixPerspectiveFovRH(D3DXMATRIX* pOut, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf);
|
||||
D3DXMATRIX* D3DXMatrixOrthoRH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
|
||||
D3DXMATRIX* D3DXMatrixOrthoOffCenterRH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
|
||||
|
||||
// --- D3DXQUATERNION ---
|
||||
inline D3DXQUATERNION* D3DXQuaternionIdentity(D3DXQUATERNION* pOut)
|
||||
@@ -386,3 +390,29 @@ inline FLOAT D3DXPlaneDotCoord(const D3DXPLANE* pP, const D3DXVECTOR3* pV)
|
||||
{
|
||||
return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d;
|
||||
}
|
||||
|
||||
// --- ID3DXMatrixStack --- (the D3DX8 interface, as a plain class: the Local variants pre-multiply)
|
||||
struct ID3DXMatrixStack
|
||||
{
|
||||
ID3DXMatrixStack();
|
||||
ULONG Release();
|
||||
HRESULT Pop();
|
||||
HRESULT Push();
|
||||
HRESULT LoadIdentity();
|
||||
HRESULT LoadMatrix(const D3DXMATRIX* pM);
|
||||
HRESULT MultMatrix(const D3DXMATRIX* pM);
|
||||
HRESULT MultMatrixLocal(const D3DXMATRIX* pM);
|
||||
HRESULT RotateAxis(const D3DXVECTOR3* pV, FLOAT angle);
|
||||
HRESULT RotateAxisLocal(const D3DXVECTOR3* pV, FLOAT angle);
|
||||
HRESULT RotateYawPitchRoll(FLOAT yaw, FLOAT pitch, FLOAT roll);
|
||||
HRESULT RotateYawPitchRollLocal(FLOAT yaw, FLOAT pitch, FLOAT roll);
|
||||
HRESULT Scale(FLOAT x, FLOAT y, FLOAT z);
|
||||
HRESULT ScaleLocal(FLOAT x, FLOAT y, FLOAT z);
|
||||
HRESULT Translate(FLOAT x, FLOAT y, FLOAT z);
|
||||
HRESULT TranslateLocal(FLOAT x, FLOAT y, FLOAT z);
|
||||
D3DXMATRIX* GetTop();
|
||||
|
||||
private:
|
||||
std::vector<D3DXMATRIX> m_stack;
|
||||
};
|
||||
HRESULT D3DXCreateMatrixStack(DWORD Flags, ID3DXMatrixStack** ppStack);
|
||||
|
||||
Reference in New Issue
Block a user