2929
3030#ifdef NO_D3DX
3131
32+ // Prevent min-dx8-sdk headers from defining D3DX functions/types
33+ // by pre-defining their include guards (Option A: Include Guard Coordination)
34+ // This allows our compatibility layer to be the sole provider of D3DX functionality
35+ #ifndef __D3DX8_H__
36+ #define __D3DX8_H__
37+ #endif
38+
39+ #ifndef __D3DX8CORE_H__
40+ #define __D3DX8CORE_H__
41+ #endif
42+
43+ #ifndef __D3DX8EFFECT_H__
44+ #define __D3DX8EFFECT_H__
45+ #endif
46+
47+ #ifndef __D3DX8MATH_H__
48+ #define __D3DX8MATH_H__
49+ #endif
50+
51+ #ifndef __D3DX8MATH_INL__
52+ #define __D3DX8MATH_INL__
53+ #endif
54+
55+ #ifndef __D3DX8MESH_H__
56+ #define __D3DX8MESH_H__
57+ #endif
58+
59+ #ifndef __D3DX8SHAPES_H__
60+ #define __D3DX8SHAPES_H__
61+ #endif
62+
63+ #ifndef __D3DX8TEX_H__
64+ #define __D3DX8TEX_H__
65+ #endif
66+
3267// Include D3D8 types
3368#include <d3d8.h>
69+ #include <limits.h>
70+ #include <float.h>
71+
72+ //-----------------------------------------------------------------------------
73+ // D3DX Constants
74+ //-----------------------------------------------------------------------------
75+
76+ // Default values for D3DX functions
77+ #ifndef D3DX_DEFAULT
78+ #define D3DX_DEFAULT ULONG_MAX
79+ #define D3DX_DEFAULT_FLOAT FLT_MAX
80+ #endif
81+
82+ // D3DX math constants
83+ #ifndef D3DX_PI
84+ #define D3DX_PI ((FLOAT) 3.141592654f)
85+ #define D3DX_1BYPI ((FLOAT) 0.318309886f)
86+ #define D3DXToRadian (degree ) ((degree) * (D3DX_PI / 180.0f))
87+ #define D3DXToDegree (radian ) ((radian) * (180.0f / D3DX_PI))
88+ #endif
89+
90+ // D3DX_FILTER flags for texture operations
91+ #ifndef D3DX_FILTER_NONE
92+ #define D3DX_FILTER_NONE (1 << 0)
93+ #define D3DX_FILTER_POINT (2 << 0)
94+ #define D3DX_FILTER_LINEAR (3 << 0)
95+ #define D3DX_FILTER_TRIANGLE (4 << 0)
96+ #define D3DX_FILTER_BOX (5 << 0)
97+
98+ #define D3DX_FILTER_MIRROR_U (1 << 16)
99+ #define D3DX_FILTER_MIRROR_V (2 << 16)
100+ #define D3DX_FILTER_MIRROR_W (4 << 16)
101+ #define D3DX_FILTER_MIRROR (7 << 16)
102+ #define D3DX_FILTER_DITHER (8 << 16)
103+ #endif
104+
105+ //-----------------------------------------------------------------------------
34106
35107// Only include WWMath if we're in a context that has it
36108// (External libraries like gamespy don't need these)
@@ -71,6 +143,10 @@ struct D3DXVECTOR3
71143 D3DXVECTOR3 (const Vector3 & v ) : x (v .X ), y (v .Y ), z (v .Z ) {}
72144
73145 operator Vector3 () const { return Vector3 (x , y , z ); }
146+
147+ // Array access operator for compatibility
148+ float & operator [](int i ) { return (& x )[i ]; }
149+ const float & operator [](int i ) const { return (& x )[i ]; }
74150};
75151
76152struct D3DXVECTOR4
@@ -82,11 +158,33 @@ struct D3DXVECTOR4
82158 D3DXVECTOR4 (const Vector4 & v ) : x (v .X ), y (v .Y ), z (v .Z ), w (v .W ) {}
83159
84160 operator Vector4 () const { return Vector4 (x , y , z , w ); }
161+
162+ // Conversion to pointer for passing to D3D functions
163+ operator const float * () const { return & x ; }
164+ operator float * ( ) { return & x ; }
165+
166+ // Array access operator for compatibility
167+ float & operator [](int i ) { return (& x )[i ]; }
168+ const float & operator [](int i ) const { return (& x )[i ]; }
85169};
86170
87171struct D3DXMATRIX : public D3DMATRIX
88172{
89173 D3DXMATRIX () {}
174+
175+ // Constructor from 16 float values (row-major order)
176+ D3DXMATRIX (float m00 , float m01 , float m02 , float m03 ,
177+ float m10 , float m11 , float m12 , float m13 ,
178+ float m20 , float m21 , float m22 , float m23 ,
179+ float m30 , float m31 , float m32 , float m33 )
180+ {
181+ // D3DMATRIX uses _11, _12, ... _44 notation
182+ _11 = m00 ; _12 = m01 ; _13 = m02 ; _14 = m03 ;
183+ _21 = m10 ; _22 = m11 ; _23 = m12 ; _24 = m13 ;
184+ _31 = m20 ; _32 = m21 ; _33 = m22 ; _34 = m23 ;
185+ _41 = m30 ; _42 = m31 ; _43 = m32 ; _44 = m33 ;
186+ }
187+
90188 D3DXMATRIX (const Matrix4x4 & m )
91189 {
92190 // Matrix4x4 stores row-major, D3DMATRIX is also row-major
@@ -107,6 +205,16 @@ struct D3DXMATRIX : public D3DMATRIX
107205 }
108206 return result ;
109207 }
208+
209+ // operator*= for matrix multiplication
210+ D3DXMATRIX & operator *=(const D3DXMATRIX & other )
211+ {
212+ Matrix4x4 lhs = * (const Matrix4x4 * )this ;
213+ Matrix4x4 rhs = * (const Matrix4x4 * )& other ;
214+ Matrix4x4 result = lhs * rhs ;
215+ * (Matrix4x4 * )this = result ;
216+ return * this ;
217+ }
110218};
111219
112220#else
@@ -262,61 +370,97 @@ inline D3DXMATRIX* D3DXMatrixInverse(
262370
263371/**
264372 * D3DXGetErrorStringA - Get error string for D3D error code
265- * Simple implementation with common D3D8 error codes
373+ * Original API: HRESULT D3DXGetErrorStringA(HRESULT hr, char* pBuffer, UINT BufferLen)
374+ * Compatibility implementation that writes error string to buffer
266375 */
267- inline const char * D3DXGetErrorStringA (HRESULT hr )
376+ inline HRESULT D3DXGetErrorStringA (HRESULT hr , char * pBuffer , UINT BufferLen )
268377{
378+ if (!pBuffer || BufferLen == 0 )
379+ return E_INVALIDARG ;
380+
381+ const char * errorStr = nullptr ;
382+
269383 switch (hr )
270384 {
271385 case D3D_OK :
272- return "No error" ;
386+ errorStr = "No error" ;
387+ break ;
273388 case D3DERR_WRONGTEXTUREFORMAT :
274- return "Wrong texture format" ;
389+ errorStr = "Wrong texture format" ;
390+ break ;
275391 case D3DERR_UNSUPPORTEDCOLOROPERATION :
276- return "Unsupported color operation" ;
392+ errorStr = "Unsupported color operation" ;
393+ break ;
277394 case D3DERR_UNSUPPORTEDCOLORARG :
278- return "Unsupported color argument" ;
395+ errorStr = "Unsupported color argument" ;
396+ break ;
279397 case D3DERR_UNSUPPORTEDALPHAOPERATION :
280- return "Unsupported alpha operation" ;
398+ errorStr = "Unsupported alpha operation" ;
399+ break ;
281400 case D3DERR_UNSUPPORTEDALPHAARG :
282- return "Unsupported alpha argument" ;
401+ errorStr = "Unsupported alpha argument" ;
402+ break ;
283403 case D3DERR_TOOMANYOPERATIONS :
284- return "Too many operations" ;
404+ errorStr = "Too many operations" ;
405+ break ;
285406 case D3DERR_CONFLICTINGTEXTUREFILTER :
286- return "Conflicting texture filter" ;
407+ errorStr = "Conflicting texture filter" ;
408+ break ;
287409 case D3DERR_UNSUPPORTEDFACTORVALUE :
288- return "Unsupported factor value" ;
410+ errorStr = "Unsupported factor value" ;
411+ break ;
289412 case D3DERR_CONFLICTINGRENDERSTATE :
290- return "Conflicting render state" ;
413+ errorStr = "Conflicting render state" ;
414+ break ;
291415 case D3DERR_UNSUPPORTEDTEXTUREFILTER :
292- return "Unsupported texture filter" ;
416+ errorStr = "Unsupported texture filter" ;
417+ break ;
293418 case D3DERR_CONFLICTINGTEXTUREPALETTE :
294- return "Conflicting texture palette" ;
419+ errorStr = "Conflicting texture palette" ;
420+ break ;
295421 case D3DERR_DRIVERINTERNALERROR :
296- return "Driver internal error" ;
422+ errorStr = "Driver internal error" ;
423+ break ;
297424 case D3DERR_NOTFOUND :
298- return "Not found" ;
425+ errorStr = "Not found" ;
426+ break ;
299427 case D3DERR_MOREDATA :
300- return "More data" ;
428+ errorStr = "More data" ;
429+ break ;
301430 case D3DERR_DEVICELOST :
302- return "Device lost" ;
431+ errorStr = "Device lost" ;
432+ break ;
303433 case D3DERR_DEVICENOTRESET :
304- return "Device not reset" ;
434+ errorStr = "Device not reset" ;
435+ break ;
305436 case D3DERR_NOTAVAILABLE :
306- return "Not available" ;
437+ errorStr = "Not available" ;
438+ break ;
307439 case D3DERR_OUTOFVIDEOMEMORY :
308- return "Out of video memory" ;
440+ errorStr = "Out of video memory" ;
441+ break ;
309442 case D3DERR_INVALIDDEVICE :
310- return "Invalid device" ;
443+ errorStr = "Invalid device" ;
444+ break ;
311445 case D3DERR_INVALIDCALL :
312- return "Invalid call" ;
446+ errorStr = "Invalid call" ;
447+ break ;
313448 case D3DERR_DRIVERINVALIDCALL :
314- return "Driver invalid call" ;
449+ errorStr = "Driver invalid call" ;
450+ break ;
315451 case E_OUTOFMEMORY :
316- return "Out of memory" ;
452+ errorStr = "Out of memory" ;
453+ break ;
317454 default :
318- return "Unknown error" ;
455+ errorStr = "Unknown error" ;
456+ break ;
319457 }
458+
459+ // Copy error string to buffer (ensure null termination)
460+ strncpy (pBuffer , errorStr , BufferLen - 1 );
461+ pBuffer [BufferLen - 1 ] = '\0' ;
462+
463+ return D3D_OK ;
320464}
321465
322466/**
@@ -413,8 +557,78 @@ inline D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* pOut, float angle)
413557 return pOut ;
414558}
415559
560+ /**
561+ * D3DXMatrixScaling - Create scaling matrix
562+ * Maps to: Manual matrix construction (simple scaling)
563+ */
564+ inline D3DXMATRIX * D3DXMatrixScaling (D3DXMATRIX * pOut , float sx , float sy , float sz )
565+ {
566+ if (!pOut ) return pOut ;
567+
568+ Matrix4x4 result (true ); // Identity
569+ result [0 ][0 ] = sx ;
570+ result [1 ][1 ] = sy ;
571+ result [2 ][2 ] = sz ;
572+
573+ * (Matrix4x4 * )pOut = result ;
574+ return pOut ;
575+ }
576+
577+ /**
578+ * D3DXMatrixTranslation - Create translation matrix
579+ * Maps to: Manual matrix construction (simple translation)
580+ */
581+ inline D3DXMATRIX * D3DXMatrixTranslation (D3DXMATRIX * pOut , float x , float y , float z )
582+ {
583+ if (!pOut ) return pOut ;
584+
585+ Matrix4x4 result (true ); // Identity
586+ result [0 ][3 ] = x ;
587+ result [1 ][3 ] = y ;
588+ result [2 ][3 ] = z ;
589+
590+ * (Matrix4x4 * )pOut = result ;
591+ return pOut ;
592+ }
593+
416594#endif // WWMATH_AVAILABLE
417595
596+ //-----------------------------------------------------------------------------
597+ // Shader Functions
598+ //-----------------------------------------------------------------------------
599+
600+ #ifdef __cplusplus
601+
602+ // ID3DXBuffer interface stub
603+ struct ID3DXBuffer
604+ {
605+ virtual HRESULT __stdcall QueryInterface (const IID & , void * * ) { return E_NOTIMPL ; }
606+ virtual ULONG __stdcall AddRef () { return 1 ; }
607+ virtual ULONG __stdcall Release () { return 0 ; }
608+ virtual void * __stdcall GetBufferPointer () { return nullptr ; }
609+ virtual DWORD __stdcall GetBufferSize () { return 0 ; }
610+ };
611+
612+ /**
613+ * D3DXAssembleShader - Assemble shader from source
614+ *
615+ * Stub implementation - returns error to indicate shader assembly not available.
616+ */
617+ inline HRESULT D3DXAssembleShader (
618+ const char * pSrcData ,
619+ UINT SrcDataLen ,
620+ DWORD Flags ,
621+ void * ppConstants ,
622+ ID3DXBuffer * * ppCompiledShader ,
623+ ID3DXBuffer * * ppCompilationErrors )
624+ {
625+ // Stub: This function needs proper implementation
626+ // For now, return error to indicate shader assembly not available
627+ return E_NOTIMPL ;
628+ }
629+
630+ #endif // __cplusplus
631+
418632//-----------------------------------------------------------------------------
419633// Texture Functions (Direct3D 8 wrappers and stubs)
420634// These don't need WWMath
0 commit comments