diff --git a/.gitignore b/.gitignore index 1c9c525ae1..4cf17268f8 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ thumbs.db .clang-format /.vscode /Dependencies/MaxSDK/maxsdk +out/build ## IntelliJ, CLion, etc. /.idea 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/shdlib.h b/Core/Libraries/Source/WWVegas/WW3D2/shdlib.h similarity index 91% rename from GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h rename to Core/Libraries/Source/WWVegas/WW3D2/shdlib.h index 3275741d40..6601f69181 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/shdlib.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/shdlib.h @@ -27,7 +27,7 @@ * Org Author:: Kenny Mitchell * * * $Author:: Kenny_m - * + * * $Modtime:: 07/01/02 9:58p $* * * * $Revision:: 1 $* @@ -39,7 +39,7 @@ #ifndef SHDLIB_H #define SHDLIB_H -// TheSuperHackers @build Removes the unused WWShade code. (#596) +// 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 @@ -60,14 +60,14 @@ extern void 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 +#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 +#endif // SHDLIB_H \ No newline at end of file diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp index 75c5dd4119..67e735534b 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; @@ -126,8 +160,11 @@ LightEnvironmentClass* DX8Wrapper::Light_Environment = NULL; RenderInfoClass* DX8Wrapper::Render_Info = NULL; 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]; @@ -262,8 +299,15 @@ 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); + /* ** Initialize all variables! */ @@ -276,7 +320,7 @@ bool DX8Wrapper::Init(void * hwnd, bool lite) // Initialize Render2DClass Screen Resolution 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; @@ -346,9 +390,9 @@ void DX8Wrapper::Shutdown(void) if (CurrentCaps) { int max=CurrentCaps->Get_Max_Textures_Per_Pass(); - for (int i = 0; i < max; i++) + for (int i = 0; i < max; i++) { - if (Textures[i]) + if (Textures[i]) { Textures[i]->Release(); Textures[i] = NULL; @@ -368,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 @@ -385,8 +429,9 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Inits(void) ** 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 @@ -474,8 +519,10 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Shutdowns(void) ** Shutdown ww3d systems */ int i; - if (render_state.vertex_buffer) render_state.vertex_buffer->Release_Engine_Ref(); - REF_PTR_RELEASE(render_state.vertex_buffer); + for (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); @@ -490,6 +537,7 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Shutdowns(void) PointGroupClass::_Shutdown(); VertexMaterialClass::Shutdown(); BoxRenderObjClass::Shutdown(); + SHD_SHUTDOWN; TheDX8MeshRenderer.Shutdown(); MissingTexture::_Deinit(); @@ -641,8 +689,11 @@ void DX8Wrapper::Release_Device(void) /* ** Release the current vertex and index buffers */ - if (render_state.vertex_buffer) render_state.vertex_buffer->Release_Engine_Ref(); - REF_PTR_RELEASE(render_state.vertex_buffer); + for (unsigned 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); @@ -832,7 +883,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) { - + // Calculate what the main window's bounding rectangle should be to // accommodate this resolution rect.left = 0; @@ -1713,20 +1764,20 @@ 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(); + 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; } @@ -1765,14 +1816,18 @@ 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;iRelease_Engine_Ref(); DynamicVBAccessClass& vba=const_cast(vba_); - render_state.vertex_buffer_type=vba.Get_Type(); + 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_buffer,vba.VertexBuffer); - render_state.vertex_buffer->Add_Engine_Ref(); + 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,14 +1865,14 @@ 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.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::WriteLockClass lock(&dyn_vb_access); - VertexFormatXYZNDUV2* src = static_cast(render_state.vertex_buffer)->VertexBuffer; + 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); @@ -1833,7 +1888,11 @@ void DX8Wrapper::Draw_Sorting_IB_VB( 0, static_cast(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; @@ -1955,10 +2014,10 @@ void DX8Wrapper::Draw( if (vertex_count<3) { min_vertex_index=0; - switch (render_state.vertex_buffer_type) { + switch (render_state.vertex_buffer_types[0]) { case BUFFER_TYPE_DX8: case BUFFER_TYPE_SORTING: - vertex_count=render_state.vertex_buffer->Get_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: @@ -1967,7 +2026,7 @@ void DX8Wrapper::Draw( } } - 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) { @@ -2161,26 +2220,34 @@ void DX8Wrapper::Apply_Render_State_Changes() } 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;iType()) { + 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) { @@ -2406,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 55d58479d2..d9d9c1d01a 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,12 +1256,18 @@ 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;iRelease_Engine_Ref(); + } } render_state=state; @@ -1266,52 +1277,83 @@ WWINLINE void DX8Wrapper::Set_Render_State(const RenderStateStruct& state) render_state.index_buffer->Add_Engine_Ref(); } - if (render_state.vertex_buffer) { - render_state.vertex_buffer->Add_Engine_Ref(); + for (i=0;iAdd_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;iRelease_Engine_Ref(); + } } - REF_PTR_RELEASE(render_state.vertex_buffer); + for (i=0;i 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;isorting_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,6 +699,7 @@ void SortingRendererClass::Flush_Sorting_Pool() void SortingRendererClass::Flush() { + WWPROFILE("SortingRenderer::Flush"); Matrix4x4 old_view; Matrix4x4 old_world; DX8Wrapper::Get_Transform(D3DTS_VIEW,old_view); @@ -703,9 +707,9 @@ void SortingRendererClass::Flush() 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)) { + (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 { @@ -717,7 +721,10 @@ void SortingRendererClass::Flush() } } + 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_Vertex_Buffer(0); @@ -732,6 +739,7 @@ void SortingRendererClass::Flush() } + // ---------------------------------------------------------------------------- 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..123b7ff33e 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp @@ -101,7 +101,7 @@ void TextureFilterClass::Apply(unsigned int stage) //! Init filters (legacy) /*! */ -void TextureFilterClass::_Init_Filters(void) +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..8db3f5c73d 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/texturefilter.h @@ -115,7 +115,7 @@ 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 _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()); } 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