1- // CRender.cpp: implementation of the CRender class.
2- //
3- // ////////////////////////////////////////////////////////////////////
4-
51#include " stdafx.h"
6- #include " xrEngine/IGame_Persistent.h"
7- #include " xrEngine/Environment.h"
2+ #include " FStaticRender.h"
83#include " Layers/xrRender/FBasicVisual.h"
9- #include " xrEngine/CustomHUD.h"
104#include " xrEngine/xr_object.h"
5+ #include " xrEngine/CustomHUD.h"
6+ #include " xrEngine/IGame_Persistent.h"
7+ #include " xrEngine/Environment.h"
118#include " xrEngine/GameFont.h"
129#include " xrEngine/PerformanceAlert.hpp"
13- #include " xrCore/FMesh.hpp"
1410#include " Layers/xrRender/SkeletonCustom.h"
15- #include " Layers/xrRender/lighttrack .h"
11+ #include " Layers/xrRender/LightTrack .h"
1612#include " Layers/xrRender/dxWallMarkArray.h"
1713#include " Layers/xrRender/dxUIShader.h"
1814
19- using namespace R_dsgraph ;
20-
2115CRender RImplementation;
2216
2317// ////////////////////////////////////////////////////////////////////////
@@ -98,10 +92,8 @@ void CRender::create()
9892
9993 m_bMakeAsyncSS = false ;
10094
101- // ---------
102- Target = new CRenderTarget ();
103- // ---------
104- //
95+ Target = new CRenderTarget (); // Main target
96+
10597 Models = new CModelPool ();
10698 L_Dynamic = new CLightR_Manager ();
10799 PSLibrary.OnCreate ();
@@ -124,7 +116,6 @@ void CRender::destroy()
124116 // *** Components
125117 xr_delete (Target);
126118 Device.seqFrame .Remove (this );
127-
128119 r_dsgraph_destroy ();
129120}
130121
@@ -153,7 +144,11 @@ void CRender::reset_end()
153144 m_bFirstFrameAfterReset = true ;
154145}
155146
156- void CRender::OnFrame () { Models->DeleteQueue (); }
147+ void CRender::OnFrame ()
148+ {
149+ Models->DeleteQueue ();
150+ }
151+
157152// Implementation
158153IRender_ObjectSpecific* CRender::ros_create (IRenderable* parent) { return new CROS_impl (); }
159154void CRender::ros_destroy (IRender_ObjectSpecific*& p) { xr_delete (p); }
@@ -188,7 +183,6 @@ IRenderVisual* CRender::model_CreatePE(LPCSTR name)
188183 R_ASSERT3 (SE, " Particle effect doesn't exist" , name);
189184 return Models->CreatePE (SE);
190185}
191-
192186IRenderVisual* CRender::model_CreateParticles (LPCSTR name)
193187{
194188 PS::CPEDef* SE = PSLibrary.FindPED (name);
@@ -239,25 +233,19 @@ IDirect3DIndexBuffer9* CRender::getIB(int id)
239233 VERIFY (id < int (IB.size ()));
240234 return IB[id];
241235}
242- IRender_Target* CRender::getTarget () { return Target; }
243236FSlideWindowItem* CRender::getSWI (int id)
244237{
245238 VERIFY (id < int (SWIs.size ()));
246239 return &SWIs[id];
247240}
248-
241+ IRender_Target* CRender::getTarget () { return Target; }
249242IRender_Light* CRender::light_create () { return L_DB->Create (); }
250243IRender_Glow* CRender::glow_create () { return new CGlow (); }
251244void CRender::flush () { r_dsgraph_render_graph (0 ); }
252245BOOL CRender::occ_visible (vis_data& P) { return HOM.visible (P); }
253246BOOL CRender::occ_visible (sPoly & P) { return HOM.visible (P); }
254247BOOL CRender::occ_visible (Fbox& P) { return HOM.visible (P); }
255- ENGINE_API extern BOOL g_bRendering;
256- void CRender::add_Visual (IRenderVisual* V)
257- {
258- VERIFY (g_bRendering);
259- add_leafs_Dynamic ((dxRender_Visual*)V);
260- }
248+ void CRender::add_Visual (IRenderVisual* V) { add_leafs_Dynamic ((dxRender_Visual*)V); }
261249void CRender::add_Geometry (IRenderVisual* V) { add_Static ((dxRender_Visual*)V, View->getMask ()); }
262250void CRender::add_StaticWallmark (ref_shader& S, const Fvector& P, float s, CDB::TRI* T, Fvector* verts)
263251{
@@ -281,12 +269,7 @@ void CRender::add_StaticWallmark(const wm_shader& S, const Fvector& P, float s,
281269 add_StaticWallmark (pShader->hShader , P, s, T, V);
282270}
283271
284- void CRender::clear_static_wallmarks ()
285- {
286- if (Wallmarks)
287- Wallmarks->clear ();
288- }
289-
272+ void CRender::clear_static_wallmarks () { Wallmarks->clear (); }
290273void CRender::add_SkeletonWallmark (intrusive_ptr<CSkeletonWallmark> wm) { Wallmarks->AddSkeletonWallmark (wm); }
291274void CRender::add_SkeletonWallmark (
292275 const Fmatrix* xf, CKinematics* obj, ref_shader& sh, const Fvector& start, const Fvector& dir, float size)
@@ -301,16 +284,11 @@ void CRender::add_SkeletonWallmark(
301284 if (pShader)
302285 add_SkeletonWallmark (xf, (CKinematics*)obj, *pShader, start, dir, size);
303286}
304- void CRender::add_Occluder (Fbox2& bb_screenspace)
305- {
306- VERIFY (_valid (bb_screenspace));
307- HOM.occlude (bb_screenspace);
308- }
287+ void CRender::add_Occluder (Fbox2& bb_screenspace) { HOM.occlude (bb_screenspace); }
309288
310289#include " xrEngine/PS_instance.h"
311290void CRender::set_Object (IRenderable* O)
312291{
313- VERIFY (g_bRendering);
314292 val_pObject = O; // NULL is OK, trust me :)
315293 if (val_pObject)
316294 {
@@ -371,6 +349,25 @@ IC void gm_SetNearer(BOOL bNearer)
371349 }
372350}
373351
352+ void CRender::rmNear ()
353+ {
354+ IRender_Target* T = getTarget ();
355+ D3DVIEWPORT9 VP = {0 , 0 , T->get_width (), T->get_height (), 0 , 0 .02f };
356+ CHK_DX (HW.pDevice ->SetViewport (&VP));
357+ }
358+ void CRender::rmFar ()
359+ {
360+ IRender_Target* T = getTarget ();
361+ D3DVIEWPORT9 VP = {0 , 0 , T->get_width (), T->get_height (), 0 .99999f , 1 .f };
362+ CHK_DX (HW.pDevice ->SetViewport (&VP));
363+ }
364+ void CRender::rmNormal ()
365+ {
366+ IRender_Target* T = getTarget ();
367+ D3DVIEWPORT9 VP = {0 , 0 , T->get_width (), T->get_height (), 0 , 1 .f };
368+ CHK_DX (HW.pDevice ->SetViewport (&VP));
369+ }
370+
374371// ////////////////////////////////////////////////////////////////////
375372// Construction/Destruction
376373// ////////////////////////////////////////////////////////////////////
@@ -600,25 +597,6 @@ void CRender::Calculate()
600597 BasicStats.Culling .End ();
601598}
602599
603- void CRender::rmNear ()
604- {
605- IRender_Target* T = getTarget ();
606- D3DVIEWPORT9 VP = {0 , 0 , T->get_width (), T->get_height (), 0 , 0 .02f };
607- CHK_DX (HW.pDevice ->SetViewport (&VP));
608- }
609- void CRender::rmFar ()
610- {
611- IRender_Target* T = getTarget ();
612- D3DVIEWPORT9 VP = {0 , 0 , T->get_width (), T->get_height (), 0 .99999f , 1 .f };
613- CHK_DX (HW.pDevice ->SetViewport (&VP));
614- }
615- void CRender::rmNormal ()
616- {
617- IRender_Target* T = getTarget ();
618- D3DVIEWPORT9 VP = {0 , 0 , T->get_width (), T->get_height (), 0 , 1 .f };
619- CHK_DX (HW.pDevice ->SetViewport (&VP));
620- }
621-
622600extern u32 g_r;
623601void CRender::Render ()
624602{
@@ -745,47 +723,6 @@ void CRender::DumpStatistics(IGameFont& font, IPerformanceAlert* alert)
745723 Sectors_xrc.DumpStatistics (font, alert);
746724}
747725
748- #pragma comment(lib, "d3dx9.lib")
749-
750- static inline bool match_shader_id (
751- LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const & file_set, string_path& result);
752-
753- // --------------------------------------------------------------------------------------------------------------
754- class includer : public ID3DXInclude
755- {
756- public:
757- HRESULT __stdcall Open (
758- D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID* ppData, UINT* pBytes)
759- {
760- string_path pname;
761- strconcat (sizeof (pname), pname, GEnv.Render ->getShaderPath (), pFileName);
762- IReader* R = FS.r_open (" $game_shaders$" , pname);
763- if (nullptr == R)
764- {
765- // possibly in shared directory or somewhere else - open directly
766- R = FS.r_open (" $game_shaders$" , pFileName);
767- if (nullptr == R)
768- return E_FAIL;
769- }
770-
771- // duplicate and zero-terminate
772- u32 size = R->length ();
773- u8 * data = xr_alloc<u8 >(size + 1 );
774- CopyMemory (data, R->pointer (), size);
775- data[size] = 0 ;
776- FS.r_close (R);
777-
778- *ppData = data;
779- *pBytes = size;
780- return D3D_OK;
781- }
782- HRESULT __stdcall Close (LPCVOID pData)
783- {
784- xr_free (pData);
785- return D3D_OK;
786- }
787- };
788-
789726static HRESULT create_shader (LPCSTR const pTarget, DWORD const * buffer, u32 const buffer_size, LPCSTR const file_name,
790727 void *& result, bool const disasm)
791728{
@@ -854,6 +791,44 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
854791 return _result;
855792}
856793
794+ static inline bool match_shader_id (
795+ LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const & file_set, string_path& result);
796+
797+ class includer : public ID3DXInclude
798+ {
799+ public:
800+ HRESULT __stdcall Open (
801+ D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID* ppData, UINT* pBytes)
802+ {
803+ string_path pname;
804+ strconcat (sizeof (pname), pname, GEnv.Render ->getShaderPath (), pFileName);
805+ IReader* R = FS.r_open (" $game_shaders$" , pname);
806+ if (nullptr == R)
807+ {
808+ // possibly in shared directory or somewhere else - open directly
809+ R = FS.r_open (" $game_shaders$" , pFileName);
810+ if (nullptr == R)
811+ return E_FAIL;
812+ }
813+
814+ // duplicate and zero-terminate
815+ u32 size = R->length ();
816+ u8 * data = xr_alloc<u8 >(size + 1 );
817+ CopyMemory (data, R->pointer (), size);
818+ data[size] = 0 ;
819+ FS.r_close (R);
820+
821+ *ppData = data;
822+ *pBytes = size;
823+ return D3D_OK;
824+ }
825+ HRESULT __stdcall Close (LPCVOID pData)
826+ {
827+ xr_free (pData);
828+ return D3D_OK;
829+ }
830+ };
831+
857832HRESULT CRender::shader_compile (LPCSTR name, DWORD const * pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
858833 LPCSTR pTarget, DWORD Flags, void *& result)
859834{
@@ -873,6 +848,7 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
873848 sh_name[len] = ' 0' + char (o.forceskinw );
874849 ++len;
875850
851+ // skinning
876852 if (m_skinning < 0 )
877853 {
878854 defines[def_it].Name = " SKIN_NONE" ;
0 commit comments