Skip to content

Commit de46442

Browse files
avoitishinXottab-DUTY
authored andcommitted
+ detail draw radius console setting (r__detail_radius)
* extended detail density (r__detail_density) * extended extended geometry LOD (r__geometry_lod) * extended sun near (r2_sun_near)
1 parent 565b39e commit de46442

File tree

8 files changed

+225
-10
lines changed

8 files changed

+225
-10
lines changed

src/Common/Config.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99
//#define MOUSE_MOVE_CALLBACK // expose mouse move callback to scripts (configure in bind_stalker)
1010
//#define KEY_RELEASE_CALLBACK // expose key release callback to scripts (configure in bind_stalker)
1111
//#define KEY_HOLD_CALLBACK // expose key hold callback to scripts (configure in bind_stalker)
12-
//#define FP_DEATH // first person death view
12+
//#define FP_DEATH // first person death view
13+
#define DETAIL_RADIUS // detail draw radius (by K.D.)

src/Layers/xrRender/DetailManager.cpp

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,78 @@ CDetailManager::CDetailManager() : xrc("detail manager")
8787
m_time_rot_2 = 0;
8888
m_time_pos = 0;
8989
m_global_time_old = 0;
90+
91+
#ifdef DETAIL_RADIUS
92+
// KD: variable detail radius
93+
dm_size = dm_current_size;
94+
dm_cache_line = dm_current_cache_line;
95+
dm_cache1_line = dm_current_cache1_line;
96+
dm_cache_size = dm_current_cache_size;
97+
dm_fade = dm_current_fade;
98+
ps_r__Detail_density = ps_current_detail_density;
99+
#ifdef USE_MEMORY_MONITOR
100+
cache_level1 = (CacheSlot1**)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1*), "CDetailManager::cache_level1");
101+
#else
102+
cache_level1 = (CacheSlot1**)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1*));
103+
#endif
104+
for (u32 i = 0; i < dm_cache1_line; ++i)
105+
{
106+
#ifdef USE_MEMORY_MONITOR
107+
cache_level1[i] = (CacheSlot1*)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1), "CDetailManager::cache_level1 " + i);
108+
#else
109+
cache_level1[i] = (CacheSlot1*)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1));
110+
#endif
111+
for (u32 j = 0; j < dm_cache1_line; ++j)
112+
new(&cache_level1[i][j]) CacheSlot1();
113+
}
114+
#ifdef USE_MEMORY_MONITOR
115+
cache = (Slot***)Memory.mem_alloc(dm_cache_line * sizeof(Slot**), "CDetailManager::cache");
116+
#else
117+
cache = (Slot***)Memory.mem_alloc(dm_cache_line * sizeof(Slot**));
118+
#endif
119+
for (u32 i = 0; i < dm_cache_line; ++i)
120+
#ifdef USE_MEMORY_MONITOR
121+
cache[i] = (Slot**)Memory.mem_alloc(dm_cache_line * sizeof(Slot*), "CDetailManager::cache " + i);
122+
#else
123+
cache[i] = (Slot**)Memory.mem_alloc(dm_cache_line * sizeof(Slot*));
124+
#endif
125+
126+
#ifdef USE_MEMORY_MONITOR
127+
cache_pool = (Slot *)Memory.mem_alloc(dm_cache_size * sizeof(Slot), "CDetailManager::cache_pool");
128+
#else
129+
cache_pool = (Slot *)Memory.mem_alloc(dm_cache_size * sizeof(Slot));
130+
#endif
131+
132+
for (u32 i = 0; i < dm_cache_size; ++i)
133+
new(&cache_pool[i]) Slot();
134+
/*
135+
CacheSlot1 cache_level1[dm_cache1_line][dm_cache1_line];
136+
Slot* cache [dm_cache_line][dm_cache_line]; // grid-cache itself
137+
Slot cache_pool [dm_cache_size]; // just memory for slots
138+
*/
139+
#endif
90140
}
91141

92-
CDetailManager::~CDetailManager() {}
142+
CDetailManager::~CDetailManager()
143+
{
144+
#ifdef DETAIL_RADIUS
145+
for (u32 i = 0; i < dm_cache_size; ++i)
146+
cache_pool[i].~Slot();
147+
Memory.mem_free(cache_pool);
148+
149+
for (u32 i = 0; i < dm_cache_line; ++i)
150+
Memory.mem_free(cache[i]);
151+
Memory.mem_free(cache);
152+
153+
for (u32 i = 0; i < dm_cache1_line; ++i)
154+
{
155+
for (u32 j = 0; j < dm_cache1_line; ++j)
156+
cache_level1[i][j].~CacheSlot1();
157+
Memory.mem_free(cache_level1[i]);
158+
}
159+
Memory.mem_free(cache_level1);
160+
#endif
161+
}
93162
/*
94163
*/
95164
#ifndef _EDITOR

src/Layers/xrRender/DetailManager.h

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "xrCore/xrPool.h"
1010
#include "DetailFormat.h"
1111
#include "DetailModel.h"
12+
#include "Common/Config.hpp"
1213

1314
#ifdef _EDITOR
1415
//. #include "ESceneClassList.h"
@@ -24,15 +25,37 @@ typedef ObjectMap::iterator ObjectPairIt;
2425
#else
2526
const int dm_max_decompress = 7;
2627
#endif
27-
const int dm_size = 24; //!
28-
const int dm_cache1_count = 4; //
29-
const int dm_cache1_line = dm_size * 2 / dm_cache1_count; //! dm_size*2 must be div dm_cache1_count
28+
//const int dm_size = 24;
29+
const int dm_cache1_count = 4;
30+
//const int dm_cache1_line = dm_size * 2 / dm_cache1_count; //! dm_size*2 must be div dm_cache1_count
3031
const int dm_max_objects = 64;
3132
const int dm_obj_in_slot = 4;
33+
//const int dm_cache_line = dm_size + 1 + dm_size;
34+
//const int dm_cache_size = dm_cache_line * dm_cache_line;
35+
//const float dm_fade = float(2 * dm_size) - .5f;
36+
const float dm_slot_size = DETAIL_SLOT_SIZE;
37+
38+
//AVO: detail radius
39+
#ifdef DETAIL_RADIUS
40+
const u32 dm_max_cache_size = 62001; // assuming max dm_size = 124
41+
extern u32 dm_size;
42+
extern u32 dm_cache1_line;
43+
extern u32 dm_cache_line;
44+
extern u32 dm_cache_size;
45+
extern float dm_fade;
46+
extern u32 dm_current_size;// = iFloor((float)ps_r__detail_radius/4)*2; //!
47+
extern u32 dm_current_cache1_line;// = dm_current_size*2/dm_cache1_count; //! dm_current_size*2 must be div dm_cache1_count
48+
extern u32 dm_current_cache_line;// = dm_current_size+1+dm_current_size;
49+
extern u32 dm_current_cache_size;// = dm_current_cache_line*dm_current_cache_line;
50+
extern float dm_current_fade;// = float(2*dm_current_size)-.5f;
51+
extern float ps_current_detail_density;
52+
#else
53+
const int dm_size = 24;
54+
const int dm_cache1_line = dm_size * 2 / dm_cache1_count; //! dm_size*2 must be div dm_cache1_count
3255
const int dm_cache_line = dm_size + 1 + dm_size;
3356
const int dm_cache_size = dm_cache_line * dm_cache_line;
3457
const float dm_fade = float(2 * dm_size) - .5f;
35-
const float dm_slot_size = DETAIL_SLOT_SIZE;
58+
#endif
3659

3760
class ECORE_API CDetailManager
3861
{
@@ -136,10 +159,19 @@ class ECORE_API CDetailManager
136159
#ifndef _EDITOR
137160
xrXRC xrc;
138161
#endif
162+
//AVO: detail draw radius
163+
#ifdef DETAIL_RADIUS
164+
CacheSlot1** cache_level1;
165+
Slot*** cache; // grid-cache itself
166+
svector<Slot*, dm_max_cache_size> cache_task; // non-unpacked slots
167+
Slot* cache_pool; // just memory for slots
168+
#else
139169
CacheSlot1 cache_level1[dm_cache1_line][dm_cache1_line];
140170
Slot* cache[dm_cache_line][dm_cache_line]; // grid-cache itself
141171
svector<Slot*, dm_cache_size> cache_task; // non-unpacked slots
142172
Slot cache_pool[dm_cache_size]; // just memory for slots
173+
#endif
174+
143175
int cache_cx;
144176
int cache_cz;
145177

src/Layers/xrRender/xrRender_console.cpp

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#pragma hdrstop
33

44
#include "xrRender_console.h"
5+
#include "Common/Config.hpp"
56

67
u32 ps_Preset = 2;
78
xr_token qpreset_token[] = {{"Minimum", 0}, {"Low", 1}, {"Default", 2}, {"High", 3}, {"Extreme", 4}, {nullptr, 0}};
@@ -167,6 +168,27 @@ float ps_r3_dyn_wet_surf_near = 10.f; // 10.0f
167168
float ps_r3_dyn_wet_surf_far = 30.f; // 30.0f
168169
int ps_r3_dyn_wet_surf_sm_res = 256; // 256
169170

171+
//AVO: detail draw radius
172+
Flags32 ps_common_flags = {0}; // r1-only
173+
u32 ps_steep_parallax = 0;
174+
int ps_r__detail_radius = 49;
175+
#ifdef DETAIL_RADIUS // управление радиусом отрисовки травы
176+
u32 dm_size = 24;
177+
u32 dm_cache1_line = 12; //dm_size*2/dm_cache1_count
178+
u32 dm_cache_line = 49; //dm_size+1+dm_size
179+
u32 dm_cache_size = 2401; //dm_cache_line*dm_cache_line
180+
float dm_fade = 47.5; //float(2*dm_size)-.5f;
181+
u32 dm_current_size = 24;
182+
u32 dm_current_cache1_line = 12; //dm_current_size*2/dm_cache1_count
183+
u32 dm_current_cache_line = 49; //dm_current_size+1+dm_current_size
184+
u32 dm_current_cache_size = 2401; //dm_current_cache_line*dm_current_cache_line
185+
float dm_current_fade = 47.5; //float(2*dm_current_size)-.5f;
186+
#endif
187+
float ps_current_detail_density = 0.6;
188+
xr_token ext_quality_token[] = {{"qt_off", 0}, {"qt_low", 1}, {"qt_medium", 2},
189+
{"qt_high", 3}, {"qt_extreme", 4}, {nullptr, 0}};
190+
//-AVO
191+
170192
//- Mad Max
171193
float ps_r2_gloss_factor = 4.0f;
172194
//- Mad Max
@@ -179,6 +201,38 @@ float ps_r2_gloss_factor = 4.0f;
179201
#endif // USE_DX10
180202

181203
//-----------------------------------------------------------------------
204+
205+
//AVO: detail draw radius
206+
#ifdef DETAIL_RADIUS
207+
class CCC_detail_radius : public CCC_Integer
208+
{
209+
public:
210+
void apply()
211+
{
212+
dm_current_size = iFloor((float)ps_r__detail_radius / 4) * 2;
213+
dm_current_cache1_line = dm_current_size * 2 / 4; // assuming cache1_count = 4
214+
dm_current_cache_line = dm_current_size + 1 + dm_current_size;
215+
dm_current_cache_size = dm_current_cache_line * dm_current_cache_line;
216+
dm_current_fade = float(2 * dm_current_size) - .5f;
217+
}
218+
219+
CCC_detail_radius(LPCSTR N, int* V, int _min = 0, int _max = 999) : CCC_Integer(N, V, _min, _max) {};
220+
221+
void Execute(LPCSTR args) override
222+
{
223+
CCC_Integer::Execute(args);
224+
apply();
225+
}
226+
227+
void Status(TStatus& S) override
228+
{
229+
CCC_Integer::Status(S);
230+
}
231+
};
232+
233+
//-AVO
234+
#endif
235+
182236
class CCC_tf_Aniso : public CCC_Integer
183237
{
184238
public:
@@ -626,11 +680,11 @@ void xrRender_initconsole()
626680

627681
Fvector tw_min, tw_max;
628682

629-
CMD4(CCC_Float, "r__geometry_lod", &ps_r__LOD, 0.1f, 1.2f);
683+
CMD4(CCC_Float, "r__geometry_lod", &ps_r__LOD, 0.1f, 3.f); //AVO: extended from 1.2f to 3.f
630684
//CMD4(CCC_Float, "r__geometry_lod_pow", &ps_r__LOD_Power, 0, 2);
631685

632686
//CMD4(CCC_Float, "r__detail_density", &ps_r__Detail_density, .05f, 0.99f);
633-
CMD4(CCC_Float, "r__detail_density", &ps_r__Detail_density, .2f, 0.6f);
687+
CMD4(CCC_Float, "r__detail_density", &ps_current_detail_density/*&ps_r__Detail_density*/, 0.04f, 0.6f); //AVO: extended from 0.2f to 0.04f and replaced variable
634688

635689
#ifdef DEBUG
636690
CMD4(CCC_Float, "r__detail_l_ambient", &ps_r__Detail_l_ambient, .5f, .95f);
@@ -716,7 +770,7 @@ void xrRender_initconsole()
716770
CMD3(CCC_Mask, "r2_sun_tsm", &ps_r2_ls_flags, R2FLAG_SUN_TSM);
717771
CMD4(CCC_Float, "r2_sun_tsm_proj", &ps_r2_sun_tsm_projection, .001f, 0.8f);
718772
CMD4(CCC_Float, "r2_sun_tsm_bias", &ps_r2_sun_tsm_bias, -0.5, +0.5);
719-
CMD4(CCC_Float, "r2_sun_near", &ps_r2_sun_near, 1.f, 50.f);
773+
CMD4(CCC_Float, "r2_sun_near", &ps_r2_sun_near, 1.f, 150.f); //AVO: extended from 50.f to 150.f
720774
#if RENDER != R_R1
721775
CMD4(CCC_Float, "r2_sun_far", &OLES_SUN_LIMIT_27_01_07, 51.f, 180.f);
722776
#endif
@@ -815,6 +869,10 @@ void xrRender_initconsole()
815869
CMD3(CCC_Token, "r3_msaa_alphatest", &ps_r3_msaa_atest, qmsaa__atest_token);
816870
CMD3(CCC_Token, "r3_minmax_sm", &ps_r3_minmax_sm, qminmax_sm_token);
817871

872+
#ifdef DETAIL_RADIUS
873+
CMD4(CCC_detail_radius, "r__detail_radius", &ps_r__detail_radius, 49, 300);
874+
#endif
875+
818876
// Allow real-time fog config reload
819877
#if (RENDER == R_R3) || (RENDER == R_R4)
820878
#ifdef DEBUG

src/Layers/xrRenderPC_R1/FStaticRender.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,14 @@ void CRender::destroy()
133133

134134
void CRender::reset_begin()
135135
{
136+
//AVO: let's reload details while changed details options on vid_restart
137+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
138+
{
139+
Details->Unload();
140+
xr_delete(Details);
141+
}
136142
xr_delete(Target);
137-
//. HWOCC.occq_destroy ();
143+
//HWOCC.occq_destroy();
138144
}
139145

140146
void CRender::reset_end()

src/Layers/xrRenderPC_R2/r2.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,15 @@ void CRender::reset_begin()
354354
Lights_LastFrame.clear();
355355
}
356356

357+
//AVO: let's reload details while changed details options on vid_restart
358+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
359+
{
360+
Details->Unload();
361+
xr_delete(Details);
362+
}
363+
//-AVO
364+
365+
357366
xr_delete(Target);
358367
HWOCC.occq_destroy();
359368
//_RELEASE (q_sync_point[1]);
@@ -372,6 +381,14 @@ void CRender::reset_end()
372381

373382
Target = new CRenderTarget();
374383

384+
//AVO: let's reload details while changed details options on vid_restart
385+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
386+
{
387+
Details = new CDetailManager();
388+
Details->Load();
389+
}
390+
//-AVO
391+
375392
xrRender_apply_tf();
376393

377394
// Set this flag true to skip the first render frame,

src/Layers/xrRenderPC_R3/r3.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,14 @@ void CRender::reset_begin()
470470
Lights_LastFrame.clear();
471471
}
472472

473+
//AVO: let's reload details while changed details options on vid_restart
474+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
475+
{
476+
Details->Unload();
477+
xr_delete(Details);
478+
}
479+
//-AVO
480+
473481
xr_delete(Target);
474482
HWOCC.occq_destroy();
475483
//_RELEASE (q_sync_point[1]);
@@ -496,6 +504,14 @@ void CRender::reset_end()
496504

497505
Target = new CRenderTarget();
498506

507+
//AVO: let's reload details while changed details options on vid_restart
508+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
509+
{
510+
Details = new CDetailManager();
511+
Details->Load();
512+
}
513+
//-AVO
514+
499515
xrRender_apply_tf();
500516
FluidManager.SetScreenSize(Device.dwWidth, Device.dwHeight);
501517

src/Layers/xrRenderPC_R4/r4.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,14 @@ void CRender::reset_begin()
482482
Lights_LastFrame.clear();
483483
}
484484

485+
//AVO: let's reload details while changed details options on vid_restart
486+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
487+
{
488+
Details->Unload();
489+
xr_delete(Details);
490+
}
491+
//-AVO
492+
485493
xr_delete(Target);
486494
HWOCC.occq_destroy();
487495
//_RELEASE (q_sync_point[1]);
@@ -508,6 +516,14 @@ void CRender::reset_end()
508516

509517
Target = new CRenderTarget();
510518

519+
//AVO: let's reload details while changed details options on vid_restart
520+
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
521+
{
522+
Details = new CDetailManager();
523+
Details->Load();
524+
}
525+
//-AVO
526+
511527
xrRender_apply_tf();
512528
FluidManager.SetScreenSize(Device.dwWidth, Device.dwHeight);
513529

0 commit comments

Comments
 (0)