From 92a4d0ec0c9199781bf49d42a713d3557c29ea69 Mon Sep 17 00:00:00 2001 From: ryan-de-boer Date: Mon, 4 Aug 2025 19:18:33 +0800 Subject: [PATCH 1/5] Unify dx8wrapper part 1 --- .gitignore | 4 +- .../Source/WWVegas/WW3D2/dx8wrapper.cpp | 340 +++++++++++------- .../Source/WWVegas/WW3D2/dx8wrapper.h | 126 +++++-- .../Libraries/Source/WWVegas/WW3D2/shdlib.h | 73 ++++ .../Source/WWVegas/WW3D2/sortingrenderer.cpp | 40 ++- .../Source/WWVegas/WW3D2/texturefilter.cpp | 6 +- .../Source/WWVegas/WW3D2/texturefilter.h | 3 +- 7 files changed, 397 insertions(+), 195 deletions(-) create mode 100644 Generals/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h diff --git a/.gitignore b/.gitignore index 1c9c525ae1..ab89ed30f0 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,8 @@ thumbs.db .clang-format /.vscode /Dependencies/MaxSDK/maxsdk +out/build/x64-debug +out/build/x86-debug ## IntelliJ, CLion, etc. /.idea @@ -57,4 +59,4 @@ cmake-build-*/ ## Ninja .ninja_deps .ninja_log -build.ninja \ No newline at end of file +build.ninja diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp index 75c5dd4119..0248368e69 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp @@ -82,6 +82,40 @@ #include "bound.h" #include "dx8webbrowser.h" +#include "shdlib.h" + +class ZTextureClass : public TextureBaseClass +{ +public: + // Create a z texture with desired height, width and format + ZTextureClass + ( + unsigned width, + unsigned height, + WW3DZFormat zformat, + MipCountType mip_level_count = MIP_LEVELS_ALL, + PoolType pool = POOL_MANAGED + ); + + WW3DZFormat Get_Texture_Format() const { return DepthStencilTextureFormat; } + + virtual TexAssetType Get_Asset_Type() const { return TEX_REGULAR; } + + virtual void Init() {} + + // Background texture loader will call this when texture has been loaded + virtual void Apply_New_Surface(IDirect3DBaseTexture8* tex, bool initialized, bool disable_auto_invalidation = false); // If the parameter is true, the texture will be flagged as initialised + + virtual void Apply(unsigned int stage); + + IDirect3DSurface8* Get_D3D_Surface_Level(unsigned int level = 0); + virtual unsigned Get_Texture_Memory_Usage() const; + +private: + + WW3DZFormat DepthStencilTextureFormat; +}; + const int DEFAULT_RESOLUTION_WIDTH = 640; const int DEFAULT_RESOLUTION_HEIGHT = 480; @@ -125,6 +159,7 @@ Vector4 DX8Wrapper::Pixel_Shader_Constants[MAX_PIXEL_SHADER_CONSTANTS]; LightEnvironmentClass* DX8Wrapper::Light_Environment = NULL; RenderInfoClass* DX8Wrapper::Render_Info = NULL; +ZTextureClass* DX8Wrapper::Shadow_Map[MAX_SHADOW_MAPS]; DWORD DX8Wrapper::Vertex_Processing_Behavior = 0; Vector3 DX8Wrapper::Ambient_Color; // shader system additions KJM ^ @@ -257,29 +292,35 @@ void MoveRectIntoOtherRect(const RECT& inner, const RECT& outer, int* x, int* y) *y += dy; } - -bool DX8Wrapper::Init(void * hwnd, bool lite) +bool DX8Wrapper::Init(void* hwnd, bool lite) { WWASSERT(!IsInitted); - memset(Vertex_Shader_Constants,0,sizeof(Vector4)*MAX_VERTEX_SHADER_CONSTANTS); - memset(Pixel_Shader_Constants,0,sizeof(Vector4)*MAX_PIXEL_SHADER_CONSTANTS); + // zero memory + memset(Textures, 0, sizeof(IDirect3DBaseTexture8*) * MAX_TEXTURE_STAGES); + memset(RenderStates, 0, sizeof(unsigned) * 256); + memset(TextureStageStates, 0, sizeof(unsigned) * 32 * MAX_TEXTURE_STAGES); + memset(Vertex_Shader_Constants, 0, sizeof(Vector4) * MAX_VERTEX_SHADER_CONSTANTS); + memset(Pixel_Shader_Constants, 0, sizeof(Vector4) * MAX_PIXEL_SHADER_CONSTANTS); + memset(&render_state, 0, sizeof(RenderStateStruct)); + memset(Shadow_Map, 0, sizeof(ZTextureClass*) * MAX_SHADOW_MAPS); + /* ** Initialize all variables! */ _Hwnd = (HWND)hwnd; - _MainThreadID=ThreadClass::_Get_Current_Thread_ID(); - WWDEBUG_SAY(("DX8Wrapper main thread: 0x%x",_MainThreadID)); + _MainThreadID = ThreadClass::_Get_Current_Thread_ID(); + WWDEBUG_SAY(("DX8Wrapper main thread: 0x%x", _MainThreadID)); CurRenderDevice = -1; ResolutionWidth = DEFAULT_RESOLUTION_WIDTH; ResolutionHeight = DEFAULT_RESOLUTION_HEIGHT; // Initialize Render2DClass Screen Resolution - Render2DClass::Set_Screen_Resolution( RectClass( 0, 0, ResolutionWidth, ResolutionHeight ) ); + Render2DClass::Set_Screen_Resolution(RectClass(0, 0, ResolutionWidth, ResolutionHeight)); BitDepth = DEFAULT_BIT_DEPTH; IsWindowed = false; DX8Wrapper_IsWindowed = false; - for (int light=0;light<4;++light) CurrentDX8LightEnables[light]=false; + for (int light = 0; light < 4; ++light) CurrentDX8LightEnables[light] = false; ::ZeroMemory(&old_world, sizeof(D3DMATRIX)); ::ZeroMemory(&old_view, sizeof(D3DMATRIX)); @@ -305,7 +346,7 @@ bool DX8Wrapper::Init(void * hwnd, bool lite) if (D3D8Lib == NULL) return false; // Return false at this point if init failed - Direct3DCreate8Ptr = (Direct3DCreate8Type) GetProcAddress(D3D8Lib, "Direct3DCreate8"); + Direct3DCreate8Ptr = (Direct3DCreate8Type)GetProcAddress(D3D8Lib, "Direct3DCreate8"); if (Direct3DCreate8Ptr == NULL) return false; /* @@ -333,19 +374,19 @@ void DX8Wrapper::Shutdown(void) { if (D3DDevice) { - Set_Render_Target ((IDirect3DSurface8 *)NULL); + Set_Render_Target((IDirect3DSurface8*)NULL); Release_Device(); } if (D3DInterface) { D3DInterface->Release(); - D3DInterface=NULL; + D3DInterface = NULL; } if (CurrentCaps) { - int max=CurrentCaps->Get_Max_Textures_Per_Pass(); + int max = CurrentCaps->Get_Max_Textures_Per_Pass(); for (int i = 0; i < max; i++) { if (Textures[i]) @@ -357,8 +398,8 @@ void DX8Wrapper::Shutdown(void) } if (D3DInterface) { - UINT newRefCount=D3DInterface->Release(); - D3DInterface=NULL; + UINT newRefCount = D3DInterface->Release(); + D3DInterface = NULL; } if (D3D8Lib) { @@ -381,12 +422,13 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Inits(void) */ Compute_Caps(D3DFormat_To_WW3DFormat(DisplayFormat)); - /* - ** Initalize any other subsystems inside of WW3D - */ + /* + ** Initalize any other subsystems inside of WW3D + */ MissingTexture::_Init(); - TextureFilterClass::_Init_Filters(); + TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter()); TheDX8MeshRenderer.Init(); + SHD_INIT; BoxRenderObjClass::Init(); VertexMaterialClass::Init(); PointGroupClass::_Init(); // This needs the VertexMaterialClass to be initted @@ -400,57 +442,58 @@ inline DWORD F2DW(float f) { return *((unsigned*)&f); } void DX8Wrapper::Set_Default_Global_Render_States(void) { DX8_THREAD_ASSERT(); - const D3DCAPS8 &caps = Get_Current_Caps()->Get_DX8_Caps(); + const D3DCAPS8& caps = Get_Current_Caps()->Get_DX8_Caps(); Set_DX8_Render_State(D3DRS_RANGEFOGENABLE, (caps.RasterCaps & D3DPRASTERCAPS_FOGRANGE) ? TRUE : FALSE); Set_DX8_Render_State(D3DRS_FOGTABLEMODE, D3DFOG_NONE); Set_DX8_Render_State(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR); Set_DX8_Render_State(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL); Set_DX8_Render_State(D3DRS_COLORVERTEX, TRUE); - Set_DX8_Render_State(D3DRS_ZBIAS,0); + Set_DX8_Render_State(D3DRS_ZBIAS, 0); Set_DX8_Texture_Stage_State(1, D3DTSS_BUMPENVLSCALE, F2DW(1.0f)); Set_DX8_Texture_Stage_State(1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT00,F2DW(1.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT01,F2DW(0.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT10,F2DW(0.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT11,F2DW(1.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT00, F2DW(1.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT01, F2DW(0.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT10, F2DW(0.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT11, F2DW(1.0f)); -// Set_DX8_Render_State(D3DRS_CULLMODE, D3DCULL_CW); - // Set dither mode here? + // Set_DX8_Render_State(D3DRS_CULLMODE, D3DCULL_CW); + // Set dither mode here? } //MW: I added this for 'Generals'. bool DX8Wrapper::Validate_Device(void) -{ DWORD numPasses=0; +{ + DWORD numPasses = 0; HRESULT hRes; - hRes=_Get_D3D_Device8()->ValidateDevice(&numPasses); + hRes = _Get_D3D_Device8()->ValidateDevice(&numPasses); return (hRes == D3D_OK); } void DX8Wrapper::Invalidate_Cached_Render_States(void) { - render_state_changed=0; + render_state_changed = 0; int a; - for (a=0;aSetTexture(a,NULL); + _Get_D3D_Device8()->SetTexture(a, NULL); if (Textures[a] != NULL) { Textures[a]->Release(); } - Textures[a]=NULL; + Textures[a] = NULL; } ShaderClass::Invalidate(); @@ -459,11 +502,11 @@ void DX8Wrapper::Invalidate_Cached_Render_States(void) Release_Render_State(); // (gth) clear the matrix shadows too - for (int i=0; iRelease_Engine_Ref(); - REF_PTR_RELEASE(render_state.vertex_buffer); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + if (render_state.vertex_buffers[i]) render_state.vertex_buffers[i]->Release_Engine_Ref(); + REF_PTR_RELEASE(render_state.vertex_buffers[i]); + } if (render_state.index_buffer) render_state.index_buffer->Release_Engine_Ref(); REF_PTR_RELEASE(render_state.index_buffer); REF_PTR_RELEASE(render_state.material); - for (i=0;iGet_Max_Textures_Per_Pass();++i) REF_PTR_RELEASE(render_state.Textures[i]); + for (i = 0; i < CurrentCaps->Get_Max_Textures_Per_Pass(); ++i) REF_PTR_RELEASE(render_state.Textures[i]); TextureLoader::Deinit(); @@ -490,12 +535,13 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Shutdowns(void) PointGroupClass::_Shutdown(); VertexMaterialClass::Shutdown(); BoxRenderObjClass::Shutdown(); + SHD_SHUTDOWN; TheDX8MeshRenderer.Shutdown(); MissingTexture::_Deinit(); if (CurrentCaps) { delete CurrentCaps; - CurrentCaps=NULL; + CurrentCaps = NULL; } } @@ -629,20 +675,23 @@ void DX8Wrapper::Release_Device(void) { if (D3DDevice) { - for (int a=0;aRelease_Engine_Ref(); - REF_PTR_RELEASE(render_state.vertex_buffer); + for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i) + { + if (render_state.vertex_buffers[i]) render_state.vertex_buffers[i]->Release_Engine_Ref(); + REF_PTR_RELEASE(render_state.vertex_buffers[i]); + } if (render_state.index_buffer) render_state.index_buffer->Release_Engine_Ref(); REF_PTR_RELEASE(render_state.index_buffer); @@ -656,7 +705,7 @@ void DX8Wrapper::Release_Device(void) */ D3DDevice->Release(); - D3DDevice=NULL; + D3DDevice = NULL; } } @@ -1713,22 +1762,22 @@ void DX8Wrapper::Set_Viewport(CONST D3DVIEWPORT8* pViewport) // // ---------------------------------------------------------------------------- -void DX8Wrapper::Set_Vertex_Buffer(const VertexBufferClass* vb) +void DX8Wrapper::Set_Vertex_Buffer(const VertexBufferClass* vb, unsigned stream) { - render_state.vba_offset=0; - render_state.vba_count=0; - if (render_state.vertex_buffer) { - render_state.vertex_buffer->Release_Engine_Ref(); + render_state.vba_offset = 0; + render_state.vba_count = 0; + if (render_state.vertex_buffers[stream]) { + render_state.vertex_buffers[stream]->Release_Engine_Ref(); } - REF_PTR_SET(render_state.vertex_buffer,const_cast(vb)); + REF_PTR_SET(render_state.vertex_buffers[stream], const_cast(vb)); if (vb) { vb->Add_Engine_Ref(); - render_state.vertex_buffer_type=vb->Type(); + render_state.vertex_buffer_types[stream] = vb->Type(); } else { - render_state.index_buffer_type=BUFFER_TYPE_INVALID; + render_state.vertex_buffer_types[stream] = BUFFER_TYPE_INVALID; } - render_state_changed|=VERTEX_BUFFER_CHANGED; + render_state_changed |= VERTEX_BUFFER_CHANGED; } // ---------------------------------------------------------------------------- @@ -1765,16 +1814,20 @@ void DX8Wrapper::Set_Index_Buffer(const IndexBufferClass* ib,unsigned short inde void DX8Wrapper::Set_Vertex_Buffer(const DynamicVBAccessClass& vba_) { - if (render_state.vertex_buffer) render_state.vertex_buffer->Release_Engine_Ref(); + // Release all streams (only one stream allowed in the legacy pipeline) + for (int i = 1; i < MAX_VERTEX_STREAMS; ++i) { + DX8Wrapper::Set_Vertex_Buffer(NULL, i); + } - DynamicVBAccessClass& vba=const_cast(vba_); - render_state.vertex_buffer_type=vba.Get_Type(); - render_state.vba_offset=vba.VertexBufferOffset; - render_state.vba_count=vba.Get_Vertex_Count(); - REF_PTR_SET(render_state.vertex_buffer,vba.VertexBuffer); - render_state.vertex_buffer->Add_Engine_Ref(); - render_state_changed|=VERTEX_BUFFER_CHANGED; - render_state_changed|=INDEX_BUFFER_CHANGED; // vba_offset changes so index buffer needs to be reset as well. + if (render_state.vertex_buffers[0]) render_state.vertex_buffers[0]->Release_Engine_Ref(); + DynamicVBAccessClass& vba = const_cast(vba_); + render_state.vertex_buffer_types[0] = vba.Get_Type(); + render_state.vba_offset = vba.VertexBufferOffset; + render_state.vba_count = vba.Get_Vertex_Count(); + REF_PTR_SET(render_state.vertex_buffers[0], vba.VertexBuffer); + render_state.vertex_buffers[0]->Add_Engine_Ref(); + render_state_changed |= VERTEX_BUFFER_CHANGED; + render_state_changed |= INDEX_BUFFER_CHANGED; // vba_offset changes so index buffer needs to be reset as well. } // ---------------------------------------------------------------------------- @@ -1810,22 +1863,22 @@ void DX8Wrapper::Draw_Sorting_IB_VB( unsigned short min_vertex_index, unsigned short vertex_count) { - WWASSERT(render_state.vertex_buffer_type==BUFFER_TYPE_SORTING || render_state.vertex_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING); - WWASSERT(render_state.index_buffer_type==BUFFER_TYPE_SORTING || render_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING); + WWASSERT(render_state.vertex_buffer_types[0] == BUFFER_TYPE_SORTING || render_state.vertex_buffer_types[0] == BUFFER_TYPE_DYNAMIC_SORTING); + WWASSERT(render_state.index_buffer_type == BUFFER_TYPE_SORTING || render_state.index_buffer_type == BUFFER_TYPE_DYNAMIC_SORTING); // Fill dynamic vertex buffer with sorting vertex buffer vertices - DynamicVBAccessClass dyn_vb_access(BUFFER_TYPE_DYNAMIC_DX8,dynamic_fvf_type,vertex_count); + DynamicVBAccessClass dyn_vb_access(BUFFER_TYPE_DYNAMIC_DX8, dynamic_fvf_type, vertex_count); { DynamicVBAccessClass::WriteLockClass lock(&dyn_vb_access); - VertexFormatXYZNDUV2* src = static_cast(render_state.vertex_buffer)->VertexBuffer; - VertexFormatXYZNDUV2* dest= lock.Get_Formatted_Vertex_Array(); + VertexFormatXYZNDUV2* src = static_cast(render_state.vertex_buffers[0])->VertexBuffer; + VertexFormatXYZNDUV2* dest = lock.Get_Formatted_Vertex_Array(); src += render_state.vba_offset + render_state.index_base_offset + min_vertex_index; - unsigned size = dyn_vb_access.FVF_Info().Get_FVF_Size()*vertex_count/sizeof(unsigned); - unsigned *dest_u =(unsigned*) dest; - unsigned *src_u = (unsigned*) src; + unsigned size = dyn_vb_access.FVF_Info().Get_FVF_Size() * vertex_count / sizeof(unsigned); + unsigned* dest_u = (unsigned*)dest; + unsigned* src_u = (unsigned*)src; - for (unsigned i=0;i(dyn_vb_access.VertexBuffer)->Get_DX8_Vertex_Buffer(), dyn_vb_access.FVF_Info().Get_FVF_Size())); - DX8CALL(SetVertexShader(dyn_vb_access.FVF_Info().Get_FVF())); + // If using FVF format VB, set the FVF as vertex shader (may not be needed here KM) + unsigned fvf = dyn_vb_access.FVF_Info().Get_FVF(); + if (fvf != 0) { + DX8CALL(SetVertexShader(fvf)); + } DX8_RECORD_VERTEX_BUFFER_CHANGE(); - unsigned index_count=0; + unsigned index_count = 0; switch (primitive_type) { - case D3DPT_TRIANGLELIST: index_count=polygon_count*3; break; - case D3DPT_TRIANGLESTRIP: index_count=polygon_count+2; break; - case D3DPT_TRIANGLEFAN: index_count=polygon_count+2; break; + case D3DPT_TRIANGLELIST: index_count = polygon_count * 3; break; + case D3DPT_TRIANGLESTRIP: index_count = polygon_count + 2; break; + case D3DPT_TRIANGLEFAN: index_count = polygon_count + 2; break; default: WWASSERT(0); break; // Unsupported primitive type } // Fill dynamic index buffer with sorting index buffer vertices - DynamicIBAccessClass dyn_ib_access(BUFFER_TYPE_DYNAMIC_DX8,index_count); + DynamicIBAccessClass dyn_ib_access(BUFFER_TYPE_DYNAMIC_DX8, index_count); { DynamicIBAccessClass::WriteLockClass lock(&dyn_ib_access); - unsigned short* dest=lock.Get_Index_Array(); - unsigned short* src=NULL; - src=static_cast(render_state.index_buffer)->index_buffer; - src+=render_state.iba_offset+start_index; + unsigned short* dest = lock.Get_Index_Array(); + unsigned short* src = NULL; + src = static_cast(render_state.index_buffer)->index_buffer; + src += render_state.iba_offset + start_index; - for (unsigned short i=0;iGet_Vertex_Count()-render_state.index_base_offset-render_state.vba_offset-min_vertex_index; + vertex_count = render_state.vertex_buffers[0]->Get_Vertex_Count() - render_state.index_base_offset - render_state.vba_offset - min_vertex_index; break; case BUFFER_TYPE_DYNAMIC_DX8: case BUFFER_TYPE_DYNAMIC_SORTING: - vertex_count=render_state.vba_count; + vertex_count = render_state.vba_count; break; } } - switch (render_state.vertex_buffer_type) { + switch (render_state.vertex_buffer_types[0]) { case BUFFER_TYPE_DX8: case BUFFER_TYPE_DYNAMIC_DX8: switch (render_state.index_buffer_type) { case BUFFER_TYPE_DX8: case BUFFER_TYPE_DYNAMIC_DX8: - { -/* if ((start_index+render_state.iba_offset+polygon_count*3) > render_state.index_buffer->Get_Index_Count()) - { WWASSERT_PRINT(0,"OVERFLOWING INDEX BUFFER"); - ///@todo: MUST FIND OUT WHY THIS HAPPENS WITH LOTS OF PARTICLES ON BIG FIGHT! -MW - break; - }*/ - DX8_RECORD_RENDER(polygon_count,vertex_count,render_state.shader); - DX8_RECORD_DRAW_CALLS(); - DX8CALL(DrawIndexedPrimitive( - (D3DPRIMITIVETYPE)primitive_type, - min_vertex_index, - vertex_count, - start_index+render_state.iba_offset, - polygon_count)); - } - break; + { + /* if ((start_index+render_state.iba_offset+polygon_count*3) > render_state.index_buffer->Get_Index_Count()) + { WWASSERT_PRINT(0,"OVERFLOWING INDEX BUFFER"); + ///@todo: MUST FIND OUT WHY THIS HAPPENS WITH LOTS OF PARTICLES ON BIG FIGHT! -MW + break; + }*/ + DX8_RECORD_RENDER(polygon_count, vertex_count, render_state.shader); + DX8_RECORD_DRAW_CALLS(); + DX8CALL(DrawIndexedPrimitive( + (D3DPRIMITIVETYPE)primitive_type, + min_vertex_index, + vertex_count, + start_index + render_state.iba_offset, + polygon_count)); + } + break; case BUFFER_TYPE_SORTING: case BUFFER_TYPE_DYNAMIC_SORTING: - WWASSERT_PRINT(0,"VB and IB must of same type (sorting or dx8)"); + WWASSERT_PRINT(0, "VB and IB must of same type (sorting or dx8)"); break; case BUFFER_TYPE_INVALID: WWASSERT(0); @@ -2003,11 +2060,11 @@ void DX8Wrapper::Draw( switch (render_state.index_buffer_type) { case BUFFER_TYPE_DX8: case BUFFER_TYPE_DYNAMIC_DX8: - WWASSERT_PRINT(0,"VB and IB must of same type (sorting or dx8)"); + WWASSERT_PRINT(0, "VB and IB must of same type (sorting or dx8)"); break; case BUFFER_TYPE_SORTING: case BUFFER_TYPE_DYNAMIC_SORTING: - Draw_Sorting_IB_VB(primitive_type,start_index,polygon_count,min_vertex_index,vertex_count); + Draw_Sorting_IB_VB(primitive_type, start_index, polygon_count, min_vertex_index, vertex_count); break; case BUFFER_TYPE_INVALID: WWASSERT(0); @@ -2159,28 +2216,37 @@ void DX8Wrapper::Apply_Render_State_Changes() SNAPSHOT_SAY(("DX8 - apply view matrix")); _Set_DX8_Transform(D3DTS_VIEW,render_state.view); } - if (render_state_changed&VERTEX_BUFFER_CHANGED) { + if (render_state_changed & VERTEX_BUFFER_CHANGED) { SNAPSHOT_SAY(("DX8 - apply vb change")); - if (render_state.vertex_buffer) { - switch (render_state.vertex_buffer_type) {//->Type()) { - case BUFFER_TYPE_DX8: - case BUFFER_TYPE_DYNAMIC_DX8: - DX8CALL(SetStreamSource( - 0, - static_cast(render_state.vertex_buffer)->Get_DX8_Vertex_Buffer(), - render_state.vertex_buffer->FVF_Info().Get_FVF_Size())); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + if (render_state.vertex_buffers[i]) { + switch (render_state.vertex_buffer_types[i]) {//->Type()) { + case BUFFER_TYPE_DX8: + case BUFFER_TYPE_DYNAMIC_DX8: + DX8CALL(SetStreamSource( + i, + static_cast(render_state.vertex_buffers[i])->Get_DX8_Vertex_Buffer(), + render_state.vertex_buffers[i]->FVF_Info().Get_FVF_Size())); + DX8_RECORD_VERTEX_BUFFER_CHANGE(); + { + // If the VB format is FVF, set the FVF as a vertex shader + unsigned fvf = render_state.vertex_buffers[i]->FVF_Info().Get_FVF(); + if (fvf != 0) { + Set_Vertex_Shader(fvf); + } + } + break; + case BUFFER_TYPE_SORTING: + case BUFFER_TYPE_DYNAMIC_SORTING: + break; + default: + WWASSERT(0); + } + } + else { + DX8CALL(SetStreamSource(i, NULL, 0)); DX8_RECORD_VERTEX_BUFFER_CHANGE(); - DX8CALL(SetVertexShader(render_state.vertex_buffer->FVF_Info().Get_FVF())); - break; - case BUFFER_TYPE_SORTING: - case BUFFER_TYPE_DYNAMIC_SORTING: - break; - default: - WWASSERT(0); } - } else { - DX8CALL(SetStreamSource(0,NULL,0)); - DX8_RECORD_VERTEX_BUFFER_CHANGE(); } } if (render_state_changed&INDEX_BUFFER_CHANGED) { diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index 55d58479d2..79c245ca53 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h @@ -100,6 +100,8 @@ class TextureClass; class LightClass; class SurfaceClass; +class ZTextureClass; + #define DX8_RECORD_MATRIX_CHANGE() matrix_changes++ #define DX8_RECORD_MATERIAL_CHANGE() material_changes++ #define DX8_RECORD_VERTEX_BUFFER_CHANGE() vertex_buffer_changes++ @@ -178,14 +180,15 @@ struct RenderStateStruct TextureBaseClass * Textures[MAX_TEXTURE_STAGES]; D3DLIGHT8 Lights[4]; bool LightEnable[4]; + //unsigned lightsHash; Matrix4x4 world; Matrix4x4 view; - unsigned vertex_buffer_type; + unsigned vertex_buffer_types[MAX_VERTEX_STREAMS]; unsigned index_buffer_type; unsigned short vba_offset; unsigned short vba_count; unsigned short iba_offset; - VertexBufferClass* vertex_buffer; + VertexBufferClass* vertex_buffers[MAX_VERTEX_STREAMS]; IndexBufferClass* index_buffer; unsigned short index_base_offset; @@ -278,7 +281,7 @@ class DX8Wrapper static void Set_Viewport(CONST D3DVIEWPORT8* pViewport); - static void Set_Vertex_Buffer(const VertexBufferClass* vb); + static void Set_Vertex_Buffer(const VertexBufferClass* vb, unsigned stream = 0); static void Set_Vertex_Buffer(const DynamicVBAccessClass& vba); static void Set_Index_Buffer(const IndexBufferClass* ib,unsigned short index_base_offset); static void Set_Index_Buffer(const DynamicIBAccessClass& iba,unsigned short index_base_offset); @@ -459,6 +462,8 @@ class DX8Wrapper static void Set_Vertex_Shader_Constant(int reg, const void* data, int count); static void Set_Pixel_Shader_Constant(int reg, const void* data, int count); + static ZTextureClass* Shadow_Map[MAX_SHADOW_MAPS]; + static DWORD Get_Vertex_Processing_Behavior() { return Vertex_Processing_Behavior; } // Needed by scene lighting class @@ -1251,94 +1256,137 @@ WWINLINE bool DX8Wrapper::Is_Light_Enabled(unsigned index) WWINLINE void DX8Wrapper::Set_Render_State(const RenderStateStruct& state) { + int i; + if (render_state.index_buffer) { render_state.index_buffer->Release_Engine_Ref(); } - if (render_state.vertex_buffer) { - render_state.vertex_buffer->Release_Engine_Ref(); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) + { + if (render_state.vertex_buffers[i]) + { + render_state.vertex_buffers[i]->Release_Engine_Ref(); + } } - render_state=state; - render_state_changed=0xffffffff; + render_state = state; + render_state_changed = 0xffffffff; if (render_state.index_buffer) { render_state.index_buffer->Add_Engine_Ref(); } - if (render_state.vertex_buffer) { - render_state.vertex_buffer->Add_Engine_Ref(); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) + { + if (render_state.vertex_buffers[i]) + { + render_state.vertex_buffers[i]->Add_Engine_Ref(); + } } } WWINLINE void DX8Wrapper::Release_Render_State() { + int i; + if (render_state.index_buffer) { render_state.index_buffer->Release_Engine_Ref(); } - if (render_state.vertex_buffer) { - render_state.vertex_buffer->Release_Engine_Ref(); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + if (render_state.vertex_buffers[i]) { + render_state.vertex_buffers[i]->Release_Engine_Ref(); + } } - REF_PTR_RELEASE(render_state.vertex_buffer); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + REF_PTR_RELEASE(render_state.vertex_buffers[i]); + } REF_PTR_RELEASE(render_state.index_buffer); REF_PTR_RELEASE(render_state.material); - for (unsigned i=0;i. +*/ + + /*********************************************************************************************** + *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** + *********************************************************************************************** + * * + * Project Name : WW3D * + * * + * $Archive:: /Commando/Code/wwshade/shdlib.h $* + * + * Org Author:: Kenny Mitchell + * * + * $Author:: Kenny_m + * + * $Modtime:: 07/01/02 9:58p $* + * * + * $Revision:: 1 $* + * * + *---------------------------------------------------------------------------------------------* + * Functions: * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +#ifndef SHDLIB_H +#define SHDLIB_H + +// TheSuperHackers @compile Removes the unused WWShade code. (#596) +// If there is a desire to revive this, then the WWShade library needs to be re-added. + +#ifdef USE_WWSHADE + +extern void SHD_Init(); +extern void SHD_Shutdown(); +extern void SHD_Init_Shaders(); +extern void SHD_Shutdown_Shaders(); +extern void SHD_Flush(); +extern void SHD_Register_Loader(); + +#define SHD_INIT SHD_Init() +#define SHD_SHUTDOWN SHD_Shutdown() +#define SHD_INIT_SHADERS SHD_Init_Shaders() +#define SHD_SHUTDOWN_SHADERS SHD_Shutdown_Shaders() +#define SHD_FLUSH SHD_Flush() +#define SHD_REG_LOADER SHD_Register_Loader() + +#else // USE_WWSHADE + +#define SHD_INIT +#define SHD_SHUTDOWN +#define SHD_INIT_SHADERS +#define SHD_SHUTDOWN_SHADERS +#define SHD_FLUSH +#define SHD_REG_LOADER + +#endif // USE_WWSHADE + + +#endif // SHDLIB_H \ No newline at end of file diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp index f17ba4de0d..1c408fc4fe 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp @@ -25,6 +25,7 @@ #include "d3d8.h" #include "d3dx8math.h" #include "statistics.h" +#include bool SortingRendererClass::_EnableTriangleDraw=true; unsigned DEFAULT_SORTING_POLY_COUNT = 16384; // (count * 3) must be less than 65536 @@ -338,7 +339,7 @@ void SortingRendererClass::Insert_Triangles( WWASSERT( ((state->sorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) && - (state->sorting_state.vertex_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING))); + (state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_DYNAMIC_SORTING))); state->bounding_sphere=bounding_sphere; @@ -347,7 +348,7 @@ void SortingRendererClass::Insert_Triangles( state->min_vertex_index=min_vertex_index; state->vertex_count=vertex_count; - SortingVertexBufferClass* vertex_buffer=static_cast(state->sorting_state.vertex_buffer); + SortingVertexBufferClass* vertex_buffer=static_cast(state->sorting_state.vertex_buffers[0]); WWASSERT(vertex_buffer); WWASSERT(state->vertex_count<=vertex_buffer->Get_Vertex_Count()); @@ -421,7 +422,9 @@ void SortingRendererClass::Insert_Triangles( void Release_Refs(SortingNodeStruct* state) { int i; - REF_PTR_RELEASE(state->sorting_state.vertex_buffer); + for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + REF_PTR_RELEASE(state->sorting_state.vertex_buffers[i]); + } REF_PTR_RELEASE(state->sorting_state.index_buffer); REF_PTR_RELEASE(state->sorting_state.material); for (i=0;iGet_Max_Textures_Per_Pass();++i) @@ -544,7 +547,7 @@ void SortingRendererClass::Flush_Sorting_Pool() float* vertex_z_array=Get_Vertex_Z_Array(state->vertex_count); VertexFormatXYZNDUV2* src_verts=NULL; - SortingVertexBufferClass* vertex_buffer=static_cast(state->sorting_state.vertex_buffer); + SortingVertexBufferClass* vertex_buffer=static_cast(state->sorting_state.vertex_buffers[0]); WWASSERT(vertex_buffer); src_verts=vertex_buffer->VertexBuffer; WWASSERT(src_verts); @@ -696,42 +699,47 @@ void SortingRendererClass::Flush_Sorting_Pool() void SortingRendererClass::Flush() { + WWPROFILE("SortingRenderer::Flush"); Matrix4x4 old_view; Matrix4x4 old_world; - DX8Wrapper::Get_Transform(D3DTS_VIEW,old_view); - DX8Wrapper::Get_Transform(D3DTS_WORLD,old_world); + DX8Wrapper::Get_Transform(D3DTS_VIEW, old_view); + DX8Wrapper::Get_Transform(D3DTS_WORLD, old_world); - while (SortingNodeStruct* state=sorted_list.Head()) { + while (SortingNodeStruct* state = sorted_list.Head()) { state->Remove(); - if ((state->sorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) && - (state->sorting_state.vertex_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING)) { + if ((state->sorting_state.index_buffer_type == BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type == BUFFER_TYPE_DYNAMIC_SORTING) && + (state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_DYNAMIC_SORTING)) { Insert_To_Sorting_Pool(state); } else { DX8Wrapper::Set_Render_State(state->sorting_state); - DX8Wrapper::Draw_Triangles(state->start_index,state->polygon_count,state->min_vertex_index,state->vertex_count); + DX8Wrapper::Draw_Triangles(state->start_index, state->polygon_count, state->min_vertex_index, state->vertex_count); DX8Wrapper::Release_Render_State(); Release_Refs(state); clean_list.Add_Head(state); } } + bool old_enable = DX8Wrapper::_Is_Triangle_Draw_Enabled(); + DX8Wrapper::_Enable_Triangle_Draw(_EnableTriangleDraw); Flush_Sorting_Pool(); + DX8Wrapper::_Enable_Triangle_Draw(old_enable); - DX8Wrapper::Set_Index_Buffer(0,0); + DX8Wrapper::Set_Index_Buffer(0, 0); DX8Wrapper::Set_Vertex_Buffer(0); - total_sorting_vertices=0; + total_sorting_vertices = 0; DynamicIBAccessClass::_Reset(false); DynamicVBAccessClass::_Reset(false); - DX8Wrapper::Set_Transform(D3DTS_VIEW,old_view); - DX8Wrapper::Set_Transform(D3DTS_WORLD,old_world); + DX8Wrapper::Set_Transform(D3DTS_VIEW, old_view); + DX8Wrapper::Set_Transform(D3DTS_WORLD, old_world); } + // ---------------------------------------------------------------------------- void SortingRendererClass::Deinit() @@ -803,7 +811,7 @@ void SortingRendererClass::Insert_VolumeParticle( WWASSERT( ((state->sorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) && - (state->sorting_state.vertex_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING))); + (state->sorting_state.vertex_buffer_types[0] ==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0] ==BUFFER_TYPE_DYNAMIC_SORTING))); state->bounding_sphere=bounding_sphere; state->start_index=start_index; @@ -811,7 +819,7 @@ void SortingRendererClass::Insert_VolumeParticle( state->polygon_count=polygon_count * layerCount;//THIS IS VOLUME_PARTICLE SPECIFIC state->vertex_count=vertex_count * layerCount;//THIS IS VOLUME_PARTICLE SPECIFIC - SortingVertexBufferClass* vertex_buffer=static_cast(state->sorting_state.vertex_buffer); + SortingVertexBufferClass* vertex_buffer=static_cast(state->sorting_state.vertex_buffers[0]); WWASSERT(vertex_buffer); WWASSERT(state->vertex_count<=vertex_buffer->Get_Vertex_Count()); diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp index 6ccbabc5c3..9987f79fb6 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp @@ -101,7 +101,11 @@ void TextureFilterClass::Apply(unsigned int stage) //! Init filters (legacy) /*! */ -void TextureFilterClass::_Init_Filters(void) +void TextureFilterClass::_Init_Filters() +{ + _Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter()); +} +void TextureFilterClass::_Init_Filters(TextureFilterMode texture_filter) { const D3DCAPS8& dx8caps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps(); diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h index e3566cc23b..d71cee7af7 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h @@ -115,7 +115,8 @@ class TextureFilterClass void Set_V_Addr_Mode(TxtAddrMode mode) { VAddressMode=mode; } // This needs to be called after device has been created - static void _Init_Filters(void); + static void _Init_Filters(TextureFilterMode texture_filter); + static void _Init_Filters(); static void _Set_Default_Min_Filter(FilterType filter); static void _Set_Default_Mag_Filter(FilterType filter); From c44b4162bf7bcb4b4922a7e6fd9b64bd1273cde2 Mon Sep 17 00:00:00 2001 From: ryan-de-boer Date: Fri, 8 Aug 2025 17:27:07 +0800 Subject: [PATCH 2/5] Fix up whitespace and share shdlib.h --- .gitignore | 5 +- .../Libraries/Source/WWVegas/WW3D2/shdlib.h | 0 .../Source/WWVegas/WW3D2/dx8wrapper.cpp | 257 +++++++++--------- .../Source/WWVegas/WW3D2/dx8wrapper.h | 80 +++--- .../Source/WWVegas/WW3D2/sortingrenderer.cpp | 30 +- .../Libraries/Source/WWVegas/WW3D2/shdlib.h | 73 ----- 6 files changed, 186 insertions(+), 259 deletions(-) rename {Generals/Code => Core}/Libraries/Source/WWVegas/WW3D2/shdlib.h (100%) delete mode 100644 GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h diff --git a/.gitignore b/.gitignore index ab89ed30f0..4cf17268f8 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,7 @@ thumbs.db .clang-format /.vscode /Dependencies/MaxSDK/maxsdk -out/build/x64-debug -out/build/x86-debug +out/build ## IntelliJ, CLion, etc. /.idea @@ -59,4 +58,4 @@ cmake-build-*/ ## Ninja .ninja_deps .ninja_log -build.ninja +build.ninja \ No newline at end of file diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h b/Core/Libraries/Source/WWVegas/WW3D2/shdlib.h similarity index 100% rename from Generals/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h rename to Core/Libraries/Source/WWVegas/WW3D2/shdlib.h diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp index 0248368e69..e57bd16d53 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp @@ -159,10 +159,12 @@ Vector4 DX8Wrapper::Pixel_Shader_Constants[MAX_PIXEL_SHADER_CONSTANTS]; LightEnvironmentClass* DX8Wrapper::Light_Environment = NULL; RenderInfoClass* DX8Wrapper::Render_Info = NULL; -ZTextureClass* DX8Wrapper::Shadow_Map[MAX_SHADOW_MAPS]; DWORD DX8Wrapper::Vertex_Processing_Behavior = 0; +ZTextureClass* DX8Wrapper::Shadow_Map[MAX_SHADOW_MAPS]; + Vector3 DX8Wrapper::Ambient_Color; // shader system additions KJM ^ + bool DX8Wrapper::world_identity; unsigned DX8Wrapper::RenderStates[256]; unsigned DX8Wrapper::TextureStageStates[MAX_TEXTURE_STAGES][32]; @@ -292,35 +294,36 @@ void MoveRectIntoOtherRect(const RECT& inner, const RECT& outer, int* x, int* y) *y += dy; } -bool DX8Wrapper::Init(void* hwnd, bool lite) + +bool DX8Wrapper::Init(void * hwnd, bool lite) { WWASSERT(!IsInitted); // zero memory - memset(Textures, 0, sizeof(IDirect3DBaseTexture8*) * MAX_TEXTURE_STAGES); - memset(RenderStates, 0, sizeof(unsigned) * 256); - memset(TextureStageStates, 0, sizeof(unsigned) * 32 * MAX_TEXTURE_STAGES); - memset(Vertex_Shader_Constants, 0, sizeof(Vector4) * MAX_VERTEX_SHADER_CONSTANTS); - memset(Pixel_Shader_Constants, 0, sizeof(Vector4) * MAX_PIXEL_SHADER_CONSTANTS); - memset(&render_state, 0, sizeof(RenderStateStruct)); - memset(Shadow_Map, 0, sizeof(ZTextureClass*) * MAX_SHADOW_MAPS); + memset(Textures,0,sizeof(IDirect3DBaseTexture8*)*MAX_TEXTURE_STAGES); + memset(RenderStates,0,sizeof(unsigned)*256); + memset(TextureStageStates,0,sizeof(unsigned)*32*MAX_TEXTURE_STAGES); + memset(Vertex_Shader_Constants,0,sizeof(Vector4)*MAX_VERTEX_SHADER_CONSTANTS); + memset(Pixel_Shader_Constants,0,sizeof(Vector4)*MAX_PIXEL_SHADER_CONSTANTS); + memset(&render_state,0,sizeof(RenderStateStruct)); + memset(Shadow_Map,0,sizeof(ZTextureClass*)*MAX_SHADOW_MAPS); /* ** Initialize all variables! */ _Hwnd = (HWND)hwnd; - _MainThreadID = ThreadClass::_Get_Current_Thread_ID(); - WWDEBUG_SAY(("DX8Wrapper main thread: 0x%x", _MainThreadID)); + _MainThreadID=ThreadClass::_Get_Current_Thread_ID(); + WWDEBUG_SAY(("DX8Wrapper main thread: 0x%x",_MainThreadID)); CurRenderDevice = -1; ResolutionWidth = DEFAULT_RESOLUTION_WIDTH; ResolutionHeight = DEFAULT_RESOLUTION_HEIGHT; // Initialize Render2DClass Screen Resolution - Render2DClass::Set_Screen_Resolution(RectClass(0, 0, ResolutionWidth, ResolutionHeight)); + Render2DClass::Set_Screen_Resolution( RectClass( 0, 0, ResolutionWidth, ResolutionHeight ) ); BitDepth = DEFAULT_BIT_DEPTH; - IsWindowed = false; + IsWindowed = false; DX8Wrapper_IsWindowed = false; - for (int light = 0; light < 4; ++light) CurrentDX8LightEnables[light] = false; + for (int light=0;light<4;++light) CurrentDX8LightEnables[light]=false; ::ZeroMemory(&old_world, sizeof(D3DMATRIX)); ::ZeroMemory(&old_view, sizeof(D3DMATRIX)); @@ -346,7 +349,7 @@ bool DX8Wrapper::Init(void* hwnd, bool lite) if (D3D8Lib == NULL) return false; // Return false at this point if init failed - Direct3DCreate8Ptr = (Direct3DCreate8Type)GetProcAddress(D3D8Lib, "Direct3DCreate8"); + Direct3DCreate8Ptr = (Direct3DCreate8Type) GetProcAddress(D3D8Lib, "Direct3DCreate8"); if (Direct3DCreate8Ptr == NULL) return false; /* @@ -374,22 +377,22 @@ void DX8Wrapper::Shutdown(void) { if (D3DDevice) { - Set_Render_Target((IDirect3DSurface8*)NULL); + Set_Render_Target ((IDirect3DSurface8 *)NULL); Release_Device(); } if (D3DInterface) { D3DInterface->Release(); - D3DInterface = NULL; + D3DInterface=NULL; } if (CurrentCaps) { - int max = CurrentCaps->Get_Max_Textures_Per_Pass(); - for (int i = 0; i < max; i++) + int max=CurrentCaps->Get_Max_Textures_Per_Pass(); + for (int i = 0; i < max; i++) { - if (Textures[i]) + if (Textures[i]) { Textures[i]->Release(); Textures[i] = NULL; @@ -398,8 +401,8 @@ void DX8Wrapper::Shutdown(void) } if (D3DInterface) { - UINT newRefCount = D3DInterface->Release(); - D3DInterface = NULL; + UINT newRefCount=D3DInterface->Release(); + D3DInterface=NULL; } if (D3D8Lib) { @@ -409,7 +412,7 @@ void DX8Wrapper::Shutdown(void) _RenderDeviceNameTable.Clear(); // note - Delete_All() resizes the vector, causing a reallocation. Clear is better. jba. _RenderDeviceShortNameTable.Clear(); - _RenderDeviceDescriptionTable.Clear(); + _RenderDeviceDescriptionTable.Clear(); DX8Caps::Shutdown(); IsInitted = false; // 010803 srj @@ -422,9 +425,9 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Inits(void) */ Compute_Caps(D3DFormat_To_WW3DFormat(DisplayFormat)); - /* - ** Initalize any other subsystems inside of WW3D - */ + /* + ** Initalize any other subsystems inside of WW3D + */ MissingTexture::_Init(); TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter()); TheDX8MeshRenderer.Init(); @@ -442,58 +445,57 @@ inline DWORD F2DW(float f) { return *((unsigned*)&f); } void DX8Wrapper::Set_Default_Global_Render_States(void) { DX8_THREAD_ASSERT(); - const D3DCAPS8& caps = Get_Current_Caps()->Get_DX8_Caps(); + const D3DCAPS8 &caps = Get_Current_Caps()->Get_DX8_Caps(); Set_DX8_Render_State(D3DRS_RANGEFOGENABLE, (caps.RasterCaps & D3DPRASTERCAPS_FOGRANGE) ? TRUE : FALSE); Set_DX8_Render_State(D3DRS_FOGTABLEMODE, D3DFOG_NONE); Set_DX8_Render_State(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR); Set_DX8_Render_State(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL); Set_DX8_Render_State(D3DRS_COLORVERTEX, TRUE); - Set_DX8_Render_State(D3DRS_ZBIAS, 0); + Set_DX8_Render_State(D3DRS_ZBIAS,0); Set_DX8_Texture_Stage_State(1, D3DTSS_BUMPENVLSCALE, F2DW(1.0f)); Set_DX8_Texture_Stage_State(1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT00, F2DW(1.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT01, F2DW(0.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT10, F2DW(0.0f)); - Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT11, F2DW(1.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT00,F2DW(1.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT01,F2DW(0.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT10,F2DW(0.0f)); + Set_DX8_Texture_Stage_State(0, D3DTSS_BUMPENVMAT11,F2DW(1.0f)); - // Set_DX8_Render_State(D3DRS_CULLMODE, D3DCULL_CW); - // Set dither mode here? +// Set_DX8_Render_State(D3DRS_CULLMODE, D3DCULL_CW); + // Set dither mode here? } //MW: I added this for 'Generals'. bool DX8Wrapper::Validate_Device(void) -{ - DWORD numPasses = 0; +{ DWORD numPasses=0; HRESULT hRes; - hRes = _Get_D3D_Device8()->ValidateDevice(&numPasses); + hRes=_Get_D3D_Device8()->ValidateDevice(&numPasses); return (hRes == D3D_OK); } void DX8Wrapper::Invalidate_Cached_Render_States(void) { - render_state_changed = 0; + render_state_changed=0; int a; - for (a = 0; a < sizeof(RenderStates) / sizeof(unsigned); ++a) { - RenderStates[a] = 0x12345678; + for (a=0;aSetTexture(a, NULL); + _Get_D3D_Device8()->SetTexture(a,NULL); if (Textures[a] != NULL) { Textures[a]->Release(); } - Textures[a] = NULL; + Textures[a]=NULL; } ShaderClass::Invalidate(); @@ -502,11 +504,11 @@ void DX8Wrapper::Invalidate_Cached_Render_States(void) Release_Render_State(); // (gth) clear the matrix shadows too - for (int i = 0; i < D3DTS_WORLD + 1; i++) { - DX8Transforms[i][0].Set(0, 0, 0, 0); - DX8Transforms[i][1].Set(0, 0, 0, 0); - DX8Transforms[i][2].Set(0, 0, 0, 0); - DX8Transforms[i][3].Set(0, 0, 0, 0); + for (int i=0; iRelease_Engine_Ref(); REF_PTR_RELEASE(render_state.vertex_buffers[i]); } if (render_state.index_buffer) render_state.index_buffer->Release_Engine_Ref(); REF_PTR_RELEASE(render_state.index_buffer); REF_PTR_RELEASE(render_state.material); - for (i = 0; i < CurrentCaps->Get_Max_Textures_Per_Pass(); ++i) REF_PTR_RELEASE(render_state.Textures[i]); + for (i=0;iGet_Max_Textures_Per_Pass();++i) REF_PTR_RELEASE(render_state.Textures[i]); TextureLoader::Deinit(); @@ -541,7 +543,7 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Shutdowns(void) if (CurrentCaps) { delete CurrentCaps; - CurrentCaps = NULL; + CurrentCaps=NULL; } } @@ -675,19 +677,19 @@ void DX8Wrapper::Release_Device(void) { if (D3DDevice) { - for (int a = 0; a < MAX_TEXTURE_STAGES; ++a) + for (int a=0;aRelease_Engine_Ref(); REF_PTR_RELEASE(render_state.vertex_buffers[i]); @@ -705,7 +707,7 @@ void DX8Wrapper::Release_Device(void) */ D3DDevice->Release(); - D3DDevice = NULL; + D3DDevice=NULL; } } @@ -880,8 +882,8 @@ void DX8Wrapper::Resize_And_Position_Window() // Is the window the correct size for this resolution? if ((rect.right-rect.left) != ResolutionWidth || - (rect.bottom-rect.top) != ResolutionHeight) { - + (rect.bottom-rect.top) != ResolutionHeight) { + // Calculate what the main window's bounding rectangle should be to // accommodate this resolution rect.left = 0; @@ -1764,20 +1766,20 @@ void DX8Wrapper::Set_Viewport(CONST D3DVIEWPORT8* pViewport) void DX8Wrapper::Set_Vertex_Buffer(const VertexBufferClass* vb, unsigned stream) { - render_state.vba_offset = 0; - render_state.vba_count = 0; + render_state.vba_offset=0; + render_state.vba_count=0; if (render_state.vertex_buffers[stream]) { render_state.vertex_buffers[stream]->Release_Engine_Ref(); } REF_PTR_SET(render_state.vertex_buffers[stream], const_cast(vb)); if (vb) { vb->Add_Engine_Ref(); - render_state.vertex_buffer_types[stream] = vb->Type(); + render_state.vertex_buffer_types[stream]=vb->Type(); } else { - render_state.vertex_buffer_types[stream] = BUFFER_TYPE_INVALID; + render_state.vertex_buffer_types[stream]=BUFFER_TYPE_INVALID; } - render_state_changed |= VERTEX_BUFFER_CHANGED; + render_state_changed|=VERTEX_BUFFER_CHANGED; } // ---------------------------------------------------------------------------- @@ -1815,19 +1817,19 @@ void DX8Wrapper::Set_Index_Buffer(const IndexBufferClass* ib,unsigned short inde void DX8Wrapper::Set_Vertex_Buffer(const DynamicVBAccessClass& vba_) { // Release all streams (only one stream allowed in the legacy pipeline) - for (int i = 1; i < MAX_VERTEX_STREAMS; ++i) { + for (int i=1;iRelease_Engine_Ref(); - DynamicVBAccessClass& vba = const_cast(vba_); - render_state.vertex_buffer_types[0] = vba.Get_Type(); - render_state.vba_offset = vba.VertexBufferOffset; - render_state.vba_count = vba.Get_Vertex_Count(); - REF_PTR_SET(render_state.vertex_buffers[0], vba.VertexBuffer); + DynamicVBAccessClass& vba=const_cast(vba_); + render_state.vertex_buffer_types[0]=vba.Get_Type(); + render_state.vba_offset=vba.VertexBufferOffset; + render_state.vba_count=vba.Get_Vertex_Count(); + REF_PTR_SET(render_state.vertex_buffers[0],vba.VertexBuffer); render_state.vertex_buffers[0]->Add_Engine_Ref(); - render_state_changed |= VERTEX_BUFFER_CHANGED; - render_state_changed |= INDEX_BUFFER_CHANGED; // vba_offset changes so index buffer needs to be reset as well. + render_state_changed|=VERTEX_BUFFER_CHANGED; + render_state_changed|=INDEX_BUFFER_CHANGED; // vba_offset changes so index buffer needs to be reset as well. } // ---------------------------------------------------------------------------- @@ -1863,22 +1865,22 @@ void DX8Wrapper::Draw_Sorting_IB_VB( unsigned short min_vertex_index, unsigned short vertex_count) { - WWASSERT(render_state.vertex_buffer_types[0] == BUFFER_TYPE_SORTING || render_state.vertex_buffer_types[0] == BUFFER_TYPE_DYNAMIC_SORTING); - WWASSERT(render_state.index_buffer_type == BUFFER_TYPE_SORTING || render_state.index_buffer_type == BUFFER_TYPE_DYNAMIC_SORTING); + WWASSERT(render_state.vertex_buffer_types[0]==BUFFER_TYPE_SORTING || render_state.vertex_buffer_types[0]==BUFFER_TYPE_DYNAMIC_SORTING); + WWASSERT(render_state.index_buffer_type==BUFFER_TYPE_SORTING || render_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING); // Fill dynamic vertex buffer with sorting vertex buffer vertices - DynamicVBAccessClass dyn_vb_access(BUFFER_TYPE_DYNAMIC_DX8, dynamic_fvf_type, vertex_count); + DynamicVBAccessClass dyn_vb_access(BUFFER_TYPE_DYNAMIC_DX8,dynamic_fvf_type,vertex_count); { DynamicVBAccessClass::WriteLockClass lock(&dyn_vb_access); VertexFormatXYZNDUV2* src = static_cast(render_state.vertex_buffers[0])->VertexBuffer; - VertexFormatXYZNDUV2* dest = lock.Get_Formatted_Vertex_Array(); + VertexFormatXYZNDUV2* dest= lock.Get_Formatted_Vertex_Array(); src += render_state.vba_offset + render_state.index_base_offset + min_vertex_index; - unsigned size = dyn_vb_access.FVF_Info().Get_FVF_Size() * vertex_count / sizeof(unsigned); - unsigned* dest_u = (unsigned*)dest; - unsigned* src_u = (unsigned*)src; + unsigned size = dyn_vb_access.FVF_Info().Get_FVF_Size()*vertex_count/sizeof(unsigned); + unsigned *dest_u =(unsigned*) dest; + unsigned *src_u = (unsigned*) src; - for (unsigned i = 0; i < size; ++i) { - *dest_u++ = *src_u++; + for (unsigned i=0;i(dyn_vb_access.VertexBuffer)->Get_DX8_Vertex_Buffer(), dyn_vb_access.FVF_Info().Get_FVF_Size())); // If using FVF format VB, set the FVF as vertex shader (may not be needed here KM) - unsigned fvf = dyn_vb_access.FVF_Info().Get_FVF(); - if (fvf != 0) { + unsigned fvf=dyn_vb_access.FVF_Info().Get_FVF(); + if (fvf!=0) { DX8CALL(SetVertexShader(fvf)); } DX8_RECORD_VERTEX_BUFFER_CHANGE(); - unsigned index_count = 0; + unsigned index_count=0; switch (primitive_type) { - case D3DPT_TRIANGLELIST: index_count = polygon_count * 3; break; - case D3DPT_TRIANGLESTRIP: index_count = polygon_count + 2; break; - case D3DPT_TRIANGLEFAN: index_count = polygon_count + 2; break; + case D3DPT_TRIANGLELIST: index_count=polygon_count*3; break; + case D3DPT_TRIANGLESTRIP: index_count=polygon_count+2; break; + case D3DPT_TRIANGLEFAN: index_count=polygon_count+2; break; default: WWASSERT(0); break; // Unsupported primitive type } // Fill dynamic index buffer with sorting index buffer vertices - DynamicIBAccessClass dyn_ib_access(BUFFER_TYPE_DYNAMIC_DX8, index_count); + DynamicIBAccessClass dyn_ib_access(BUFFER_TYPE_DYNAMIC_DX8,index_count); { DynamicIBAccessClass::WriteLockClass lock(&dyn_ib_access); - unsigned short* dest = lock.Get_Index_Array(); - unsigned short* src = NULL; - src = static_cast(render_state.index_buffer)->index_buffer; - src += render_state.iba_offset + start_index; + unsigned short* dest=lock.Get_Index_Array(); + unsigned short* src=NULL; + src=static_cast(render_state.index_buffer)->index_buffer; + src+=render_state.iba_offset+start_index; - for (unsigned short i = 0; i < index_count; ++i) { - unsigned short index = *src++; - index -= min_vertex_index; - WWASSERT(index < vertex_count); - *dest++ = index; + for (unsigned short i=0;iGet_Vertex_Count() - render_state.index_base_offset - render_state.vba_offset - min_vertex_index; + vertex_count=render_state.vertex_buffers[0]->Get_Vertex_Count()-render_state.index_base_offset-render_state.vba_offset-min_vertex_index; break; case BUFFER_TYPE_DYNAMIC_DX8: case BUFFER_TYPE_DYNAMIC_SORTING: - vertex_count = render_state.vba_count; + vertex_count=render_state.vba_count; break; } } @@ -2030,25 +2032,25 @@ void DX8Wrapper::Draw( switch (render_state.index_buffer_type) { case BUFFER_TYPE_DX8: case BUFFER_TYPE_DYNAMIC_DX8: - { - /* if ((start_index+render_state.iba_offset+polygon_count*3) > render_state.index_buffer->Get_Index_Count()) - { WWASSERT_PRINT(0,"OVERFLOWING INDEX BUFFER"); - ///@todo: MUST FIND OUT WHY THIS HAPPENS WITH LOTS OF PARTICLES ON BIG FIGHT! -MW - break; - }*/ - DX8_RECORD_RENDER(polygon_count, vertex_count, render_state.shader); - DX8_RECORD_DRAW_CALLS(); - DX8CALL(DrawIndexedPrimitive( - (D3DPRIMITIVETYPE)primitive_type, - min_vertex_index, - vertex_count, - start_index + render_state.iba_offset, - polygon_count)); - } - break; + { +/* if ((start_index+render_state.iba_offset+polygon_count*3) > render_state.index_buffer->Get_Index_Count()) + { WWASSERT_PRINT(0,"OVERFLOWING INDEX BUFFER"); + ///@todo: MUST FIND OUT WHY THIS HAPPENS WITH LOTS OF PARTICLES ON BIG FIGHT! -MW + break; + }*/ + DX8_RECORD_RENDER(polygon_count,vertex_count,render_state.shader); + DX8_RECORD_DRAW_CALLS(); + DX8CALL(DrawIndexedPrimitive( + (D3DPRIMITIVETYPE)primitive_type, + min_vertex_index, + vertex_count, + start_index+render_state.iba_offset, + polygon_count)); + } + break; case BUFFER_TYPE_SORTING: case BUFFER_TYPE_DYNAMIC_SORTING: - WWASSERT_PRINT(0, "VB and IB must of same type (sorting or dx8)"); + WWASSERT_PRINT(0,"VB and IB must of same type (sorting or dx8)"); break; case BUFFER_TYPE_INVALID: WWASSERT(0); @@ -2060,11 +2062,11 @@ void DX8Wrapper::Draw( switch (render_state.index_buffer_type) { case BUFFER_TYPE_DX8: case BUFFER_TYPE_DYNAMIC_DX8: - WWASSERT_PRINT(0, "VB and IB must of same type (sorting or dx8)"); + WWASSERT_PRINT(0,"VB and IB must of same type (sorting or dx8)"); break; case BUFFER_TYPE_SORTING: case BUFFER_TYPE_DYNAMIC_SORTING: - Draw_Sorting_IB_VB(primitive_type, start_index, polygon_count, min_vertex_index, vertex_count); + Draw_Sorting_IB_VB(primitive_type,start_index,polygon_count,min_vertex_index,vertex_count); break; case BUFFER_TYPE_INVALID: WWASSERT(0); @@ -2216,9 +2218,9 @@ void DX8Wrapper::Apply_Render_State_Changes() SNAPSHOT_SAY(("DX8 - apply view matrix")); _Set_DX8_Transform(D3DTS_VIEW,render_state.view); } - if (render_state_changed & VERTEX_BUFFER_CHANGED) { + if (render_state_changed&VERTEX_BUFFER_CHANGED) { SNAPSHOT_SAY(("DX8 - apply vb change")); - for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + for (i=0;iType()) { case BUFFER_TYPE_DX8: @@ -2230,8 +2232,8 @@ void DX8Wrapper::Apply_Render_State_Changes() DX8_RECORD_VERTEX_BUFFER_CHANGE(); { // If the VB format is FVF, set the FVF as a vertex shader - unsigned fvf = render_state.vertex_buffers[i]->FVF_Info().Get_FVF(); - if (fvf != 0) { + unsigned fvf=render_state.vertex_buffers[i]->FVF_Info().Get_FVF(); + if (fvf!=0) { Set_Vertex_Shader(fvf); } } @@ -2242,9 +2244,8 @@ void DX8Wrapper::Apply_Render_State_Changes() default: WWASSERT(0); } - } - else { - DX8CALL(SetStreamSource(i, NULL, 0)); + } else { + DX8CALL(SetStreamSource(i,NULL,0)); DX8_RECORD_VERTEX_BUFFER_CHANGE(); } } @@ -2472,7 +2473,7 @@ IDirect3DSurface8 * DX8Wrapper::_Create_DX8_Surface(const char *filename_) strncpy(compressed_name,filename_, ARRAY_SIZE(compressed_name)); compressed_name[ARRAY_SIZE(compressed_name)-1] = '\0'; char *ext = strstr(compressed_name, "."); - if ( ext && (strlen(ext)==4) && + if ( ext && (strlen(ext)==4) && ( (ext[1] == 't') || (ext[1] == 'T') ) && ( (ext[2] == 'g') || (ext[2] == 'G') ) && ( (ext[3] == 'a') || (ext[3] == 'A') ) ) { diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index 79c245ca53..d9d9c1d01a 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h @@ -1262,24 +1262,24 @@ WWINLINE void DX8Wrapper::Set_Render_State(const RenderStateStruct& state) render_state.index_buffer->Release_Engine_Ref(); } - for (i = 0; i < MAX_VERTEX_STREAMS; ++i) + for (i=0;iRelease_Engine_Ref(); } } - render_state = state; - render_state_changed = 0xffffffff; + render_state=state; + render_state_changed=0xffffffff; if (render_state.index_buffer) { render_state.index_buffer->Add_Engine_Ref(); } - for (i = 0; i < MAX_VERTEX_STREAMS; ++i) + for (i=0;iAdd_Engine_Ref(); } @@ -1294,20 +1294,20 @@ WWINLINE void DX8Wrapper::Release_Render_State() render_state.index_buffer->Release_Engine_Ref(); } - for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + for (i=0;iRelease_Engine_Ref(); } } - for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + for (i=0;isorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) && - (state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_DYNAMIC_SORTING))); + (state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_DYNAMIC_SORTING))); state->bounding_sphere=bounding_sphere; @@ -422,7 +422,7 @@ void SortingRendererClass::Insert_Triangles( void Release_Refs(SortingNodeStruct* state) { int i; - for (i = 0; i < MAX_VERTEX_STREAMS; ++i) { + for (i=0;isorting_state.vertex_buffers[i]); } REF_PTR_RELEASE(state->sorting_state.index_buffer); @@ -702,40 +702,40 @@ void SortingRendererClass::Flush() WWPROFILE("SortingRenderer::Flush"); Matrix4x4 old_view; Matrix4x4 old_world; - DX8Wrapper::Get_Transform(D3DTS_VIEW, old_view); - DX8Wrapper::Get_Transform(D3DTS_WORLD, old_world); + DX8Wrapper::Get_Transform(D3DTS_VIEW,old_view); + DX8Wrapper::Get_Transform(D3DTS_WORLD,old_world); - while (SortingNodeStruct* state = sorted_list.Head()) { + while (SortingNodeStruct* state=sorted_list.Head()) { state->Remove(); - - if ((state->sorting_state.index_buffer_type == BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type == BUFFER_TYPE_DYNAMIC_SORTING) && - (state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0] == BUFFER_TYPE_DYNAMIC_SORTING)) { + + if ((state->sorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) && + (state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_DYNAMIC_SORTING)) { Insert_To_Sorting_Pool(state); } else { DX8Wrapper::Set_Render_State(state->sorting_state); - DX8Wrapper::Draw_Triangles(state->start_index, state->polygon_count, state->min_vertex_index, state->vertex_count); + DX8Wrapper::Draw_Triangles(state->start_index,state->polygon_count,state->min_vertex_index,state->vertex_count); DX8Wrapper::Release_Render_State(); Release_Refs(state); clean_list.Add_Head(state); } } - bool old_enable = DX8Wrapper::_Is_Triangle_Draw_Enabled(); + bool old_enable=DX8Wrapper::_Is_Triangle_Draw_Enabled(); DX8Wrapper::_Enable_Triangle_Draw(_EnableTriangleDraw); Flush_Sorting_Pool(); DX8Wrapper::_Enable_Triangle_Draw(old_enable); - DX8Wrapper::Set_Index_Buffer(0, 0); + DX8Wrapper::Set_Index_Buffer(0,0); DX8Wrapper::Set_Vertex_Buffer(0); - total_sorting_vertices = 0; + total_sorting_vertices=0; DynamicIBAccessClass::_Reset(false); DynamicVBAccessClass::_Reset(false); - DX8Wrapper::Set_Transform(D3DTS_VIEW, old_view); - DX8Wrapper::Set_Transform(D3DTS_WORLD, old_world); + DX8Wrapper::Set_Transform(D3DTS_VIEW,old_view); + DX8Wrapper::Set_Transform(D3DTS_WORLD,old_world); } @@ -811,7 +811,7 @@ void SortingRendererClass::Insert_VolumeParticle( WWASSERT( ((state->sorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) && - (state->sorting_state.vertex_buffer_types[0] ==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0] ==BUFFER_TYPE_DYNAMIC_SORTING))); + (state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_DYNAMIC_SORTING))); state->bounding_sphere=bounding_sphere; state->start_index=start_index; diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h deleted file mode 100644 index 3275741d40..0000000000 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -** Command & Conquer Generals Zero Hour(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - - /*********************************************************************************************** - *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** - *********************************************************************************************** - * * - * Project Name : WW3D * - * * - * $Archive:: /Commando/Code/wwshade/shdlib.h $* - * - * Org Author:: Kenny Mitchell - * * - * $Author:: Kenny_m - * - * $Modtime:: 07/01/02 9:58p $* - * * - * $Revision:: 1 $* - * * - *---------------------------------------------------------------------------------------------* - * Functions: * - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -#ifndef SHDLIB_H -#define SHDLIB_H - -// TheSuperHackers @build Removes the unused WWShade code. (#596) -// If there is a desire to revive this, then the WWShade library needs to be re-added. - -#ifdef USE_WWSHADE - -extern void SHD_Init(); -extern void SHD_Shutdown(); -extern void SHD_Init_Shaders(); -extern void SHD_Shutdown_Shaders(); -extern void SHD_Flush(); -extern void SHD_Register_Loader(); - -#define SHD_INIT SHD_Init() -#define SHD_SHUTDOWN SHD_Shutdown() -#define SHD_INIT_SHADERS SHD_Init_Shaders() -#define SHD_SHUTDOWN_SHADERS SHD_Shutdown_Shaders() -#define SHD_FLUSH SHD_Flush() -#define SHD_REG_LOADER SHD_Register_Loader() - -#else // USE_WWSHADE - -#define SHD_INIT -#define SHD_SHUTDOWN -#define SHD_INIT_SHADERS -#define SHD_SHUTDOWN_SHADERS -#define SHD_FLUSH -#define SHD_REG_LOADER - -#endif // USE_WWSHADE - - -#endif // SHDLIB_H From d1cf98a475cf248997cd6d4e36e82fc07c15f797 Mon Sep 17 00:00:00 2001 From: ryan-de-boer Date: Fri, 8 Aug 2025 17:51:15 +0800 Subject: [PATCH 3/5] Remove _Init_Filters() --- .../Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp | 4 ---- Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h | 1 - Generals/Code/Libraries/Source/WWVegas/WW3D2/ww3d.cpp | 2 +- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp index 9987f79fb6..123b7ff33e 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp @@ -101,10 +101,6 @@ void TextureFilterClass::Apply(unsigned int stage) //! Init filters (legacy) /*! */ -void TextureFilterClass::_Init_Filters() -{ - _Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter()); -} void TextureFilterClass::_Init_Filters(TextureFilterMode texture_filter) { const D3DCAPS8& dx8caps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps(); diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h index d71cee7af7..8db3f5c73d 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h @@ -116,7 +116,6 @@ class TextureFilterClass // This needs to be called after device has been created static void _Init_Filters(TextureFilterMode texture_filter); - static void _Init_Filters(); static void _Set_Default_Min_Filter(FilterType filter); static void _Set_Default_Mag_Filter(FilterType filter); diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/ww3d.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/ww3d.cpp index 507e92ebf2..b9540c8e0d 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/ww3d.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/ww3d.cpp @@ -778,7 +778,7 @@ void WW3D::Set_Texture_Filter(int texture_filter) if (texture_filter<0) texture_filter=0; if (texture_filter>TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC) texture_filter=TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC; TextureFilter=texture_filter; - TextureFilterClass::_Init_Filters(); + TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter()); } From fcf210f1fc6c61813a0e09b7f5c069e0cba062a7 Mon Sep 17 00:00:00 2001 From: ryan-de-boer Date: Fri, 8 Aug 2025 18:51:18 +0800 Subject: [PATCH 4/5] Fix trailing whitespace --- Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp index e57bd16d53..67e735534b 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp @@ -882,7 +882,7 @@ void DX8Wrapper::Resize_And_Position_Window() // Is the window the correct size for this resolution? if ((rect.right-rect.left) != ResolutionWidth || - (rect.bottom-rect.top) != ResolutionHeight) { + (rect.bottom-rect.top) != ResolutionHeight) { // Calculate what the main window's bounding rectangle should be to // accommodate this resolution From 8202536812f4315f0d595942f1f7ac212082462f Mon Sep 17 00:00:00 2001 From: ryan-de-boer Date: Sat, 9 Aug 2025 12:29:53 +0800 Subject: [PATCH 5/5] Fix Makefile merge --- Core/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt | 2 +- GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt b/Core/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt index 628746e29f..31bb17711f 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt +++ b/Core/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt @@ -178,7 +178,7 @@ set(WW3D2_SRC #shader.h shattersystem.cpp shattersystem.h - #shdlib.h + shdlib.h snappts.cpp snapPts.h #sortingrenderer.cpp diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt index b1a9848837..0d88e88d76 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/CMakeLists.txt @@ -178,7 +178,7 @@ set(WW3D2_SRC shader.h #shattersystem.cpp #shattersystem.h - shdlib.h + #shdlib.h #snappts.cpp #snapPts.h sortingrenderer.cpp