Skip to content

Commit

Permalink
+ detail draw radius console setting (r__detail_radius)
Browse files Browse the repository at this point in the history
* extended detail density (r__detail_density)
* extended extended geometry LOD (r__geometry_lod)
* extended sun near (r2_sun_near)
  • Loading branch information
avoitishin authored and Xottab-DUTY committed Aug 15, 2017
1 parent 565b39e commit de46442
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 10 deletions.
3 changes: 2 additions & 1 deletion src/Common/Config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
//#define MOUSE_MOVE_CALLBACK // expose mouse move callback to scripts (configure in bind_stalker)
//#define KEY_RELEASE_CALLBACK // expose key release callback to scripts (configure in bind_stalker)
//#define KEY_HOLD_CALLBACK // expose key hold callback to scripts (configure in bind_stalker)
//#define FP_DEATH // first person death view
//#define FP_DEATH // first person death view
#define DETAIL_RADIUS // detail draw radius (by K.D.)
71 changes: 70 additions & 1 deletion src/Layers/xrRender/DetailManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,78 @@ CDetailManager::CDetailManager() : xrc("detail manager")
m_time_rot_2 = 0;
m_time_pos = 0;
m_global_time_old = 0;

#ifdef DETAIL_RADIUS
// KD: variable detail radius
dm_size = dm_current_size;
dm_cache_line = dm_current_cache_line;
dm_cache1_line = dm_current_cache1_line;
dm_cache_size = dm_current_cache_size;
dm_fade = dm_current_fade;
ps_r__Detail_density = ps_current_detail_density;
#ifdef USE_MEMORY_MONITOR
cache_level1 = (CacheSlot1**)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1*), "CDetailManager::cache_level1");
#else
cache_level1 = (CacheSlot1**)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1*));
#endif
for (u32 i = 0; i < dm_cache1_line; ++i)
{
#ifdef USE_MEMORY_MONITOR
cache_level1[i] = (CacheSlot1*)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1), "CDetailManager::cache_level1 " + i);
#else
cache_level1[i] = (CacheSlot1*)Memory.mem_alloc(dm_cache1_line * sizeof(CacheSlot1));
#endif
for (u32 j = 0; j < dm_cache1_line; ++j)
new(&cache_level1[i][j]) CacheSlot1();
}
#ifdef USE_MEMORY_MONITOR
cache = (Slot***)Memory.mem_alloc(dm_cache_line * sizeof(Slot**), "CDetailManager::cache");
#else
cache = (Slot***)Memory.mem_alloc(dm_cache_line * sizeof(Slot**));
#endif
for (u32 i = 0; i < dm_cache_line; ++i)
#ifdef USE_MEMORY_MONITOR
cache[i] = (Slot**)Memory.mem_alloc(dm_cache_line * sizeof(Slot*), "CDetailManager::cache " + i);
#else
cache[i] = (Slot**)Memory.mem_alloc(dm_cache_line * sizeof(Slot*));
#endif

#ifdef USE_MEMORY_MONITOR
cache_pool = (Slot *)Memory.mem_alloc(dm_cache_size * sizeof(Slot), "CDetailManager::cache_pool");
#else
cache_pool = (Slot *)Memory.mem_alloc(dm_cache_size * sizeof(Slot));
#endif

for (u32 i = 0; i < dm_cache_size; ++i)
new(&cache_pool[i]) Slot();
/*
CacheSlot1 cache_level1[dm_cache1_line][dm_cache1_line];
Slot* cache [dm_cache_line][dm_cache_line]; // grid-cache itself
Slot cache_pool [dm_cache_size]; // just memory for slots
*/
#endif
}

CDetailManager::~CDetailManager() {}
CDetailManager::~CDetailManager()
{
#ifdef DETAIL_RADIUS
for (u32 i = 0; i < dm_cache_size; ++i)
cache_pool[i].~Slot();
Memory.mem_free(cache_pool);

for (u32 i = 0; i < dm_cache_line; ++i)
Memory.mem_free(cache[i]);
Memory.mem_free(cache);

for (u32 i = 0; i < dm_cache1_line; ++i)
{
for (u32 j = 0; j < dm_cache1_line; ++j)
cache_level1[i][j].~CacheSlot1();
Memory.mem_free(cache_level1[i]);
}
Memory.mem_free(cache_level1);
#endif
}
/*
*/
#ifndef _EDITOR
Expand Down
40 changes: 36 additions & 4 deletions src/Layers/xrRender/DetailManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "xrCore/xrPool.h"
#include "DetailFormat.h"
#include "DetailModel.h"
#include "Common/Config.hpp"

#ifdef _EDITOR
//. #include "ESceneClassList.h"
Expand All @@ -24,15 +25,37 @@ typedef ObjectMap::iterator ObjectPairIt;
#else
const int dm_max_decompress = 7;
#endif
const int dm_size = 24; //!
const int dm_cache1_count = 4; //
const int dm_cache1_line = dm_size * 2 / dm_cache1_count; //! dm_size*2 must be div dm_cache1_count
//const int dm_size = 24;
const int dm_cache1_count = 4;
//const int dm_cache1_line = dm_size * 2 / dm_cache1_count; //! dm_size*2 must be div dm_cache1_count
const int dm_max_objects = 64;
const int dm_obj_in_slot = 4;
//const int dm_cache_line = dm_size + 1 + dm_size;
//const int dm_cache_size = dm_cache_line * dm_cache_line;
//const float dm_fade = float(2 * dm_size) - .5f;
const float dm_slot_size = DETAIL_SLOT_SIZE;

//AVO: detail radius
#ifdef DETAIL_RADIUS
const u32 dm_max_cache_size = 62001; // assuming max dm_size = 124
extern u32 dm_size;
extern u32 dm_cache1_line;
extern u32 dm_cache_line;
extern u32 dm_cache_size;
extern float dm_fade;
extern u32 dm_current_size;// = iFloor((float)ps_r__detail_radius/4)*2; //!
extern u32 dm_current_cache1_line;// = dm_current_size*2/dm_cache1_count; //! dm_current_size*2 must be div dm_cache1_count
extern u32 dm_current_cache_line;// = dm_current_size+1+dm_current_size;
extern u32 dm_current_cache_size;// = dm_current_cache_line*dm_current_cache_line;
extern float dm_current_fade;// = float(2*dm_current_size)-.5f;
extern float ps_current_detail_density;
#else
const int dm_size = 24;
const int dm_cache1_line = dm_size * 2 / dm_cache1_count; //! dm_size*2 must be div dm_cache1_count
const int dm_cache_line = dm_size + 1 + dm_size;
const int dm_cache_size = dm_cache_line * dm_cache_line;
const float dm_fade = float(2 * dm_size) - .5f;
const float dm_slot_size = DETAIL_SLOT_SIZE;
#endif

class ECORE_API CDetailManager
{
Expand Down Expand Up @@ -136,10 +159,19 @@ class ECORE_API CDetailManager
#ifndef _EDITOR
xrXRC xrc;
#endif
//AVO: detail draw radius
#ifdef DETAIL_RADIUS
CacheSlot1** cache_level1;
Slot*** cache; // grid-cache itself
svector<Slot*, dm_max_cache_size> cache_task; // non-unpacked slots
Slot* cache_pool; // just memory for slots
#else
CacheSlot1 cache_level1[dm_cache1_line][dm_cache1_line];
Slot* cache[dm_cache_line][dm_cache_line]; // grid-cache itself
svector<Slot*, dm_cache_size> cache_task; // non-unpacked slots
Slot cache_pool[dm_cache_size]; // just memory for slots
#endif

int cache_cx;
int cache_cz;

Expand Down
64 changes: 61 additions & 3 deletions src/Layers/xrRender/xrRender_console.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#pragma hdrstop

#include "xrRender_console.h"
#include "Common/Config.hpp"

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

//AVO: detail draw radius
Flags32 ps_common_flags = {0}; // r1-only
u32 ps_steep_parallax = 0;
int ps_r__detail_radius = 49;
#ifdef DETAIL_RADIUS // управление радиусом отрисовки травы
u32 dm_size = 24;
u32 dm_cache1_line = 12; //dm_size*2/dm_cache1_count
u32 dm_cache_line = 49; //dm_size+1+dm_size
u32 dm_cache_size = 2401; //dm_cache_line*dm_cache_line
float dm_fade = 47.5; //float(2*dm_size)-.5f;
u32 dm_current_size = 24;
u32 dm_current_cache1_line = 12; //dm_current_size*2/dm_cache1_count
u32 dm_current_cache_line = 49; //dm_current_size+1+dm_current_size
u32 dm_current_cache_size = 2401; //dm_current_cache_line*dm_current_cache_line
float dm_current_fade = 47.5; //float(2*dm_current_size)-.5f;
#endif
float ps_current_detail_density = 0.6;
xr_token ext_quality_token[] = {{"qt_off", 0}, {"qt_low", 1}, {"qt_medium", 2},
{"qt_high", 3}, {"qt_extreme", 4}, {nullptr, 0}};
//-AVO

//- Mad Max
float ps_r2_gloss_factor = 4.0f;
//- Mad Max
Expand All @@ -179,6 +201,38 @@ float ps_r2_gloss_factor = 4.0f;
#endif // USE_DX10

//-----------------------------------------------------------------------

//AVO: detail draw radius
#ifdef DETAIL_RADIUS
class CCC_detail_radius : public CCC_Integer
{
public:
void apply()
{
dm_current_size = iFloor((float)ps_r__detail_radius / 4) * 2;
dm_current_cache1_line = dm_current_size * 2 / 4; // assuming cache1_count = 4
dm_current_cache_line = dm_current_size + 1 + dm_current_size;
dm_current_cache_size = dm_current_cache_line * dm_current_cache_line;
dm_current_fade = float(2 * dm_current_size) - .5f;
}

CCC_detail_radius(LPCSTR N, int* V, int _min = 0, int _max = 999) : CCC_Integer(N, V, _min, _max) {};

void Execute(LPCSTR args) override
{
CCC_Integer::Execute(args);
apply();
}

void Status(TStatus& S) override
{
CCC_Integer::Status(S);
}
};

//-AVO
#endif

class CCC_tf_Aniso : public CCC_Integer
{
public:
Expand Down Expand Up @@ -626,11 +680,11 @@ void xrRender_initconsole()

Fvector tw_min, tw_max;

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

//CMD4(CCC_Float, "r__detail_density", &ps_r__Detail_density, .05f, 0.99f);
CMD4(CCC_Float, "r__detail_density", &ps_r__Detail_density, .2f, 0.6f);
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

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

#ifdef DETAIL_RADIUS
CMD4(CCC_detail_radius, "r__detail_radius", &ps_r__detail_radius, 49, 300);
#endif

// Allow real-time fog config reload
#if (RENDER == R_R3) || (RENDER == R_R4)
#ifdef DEBUG
Expand Down
8 changes: 7 additions & 1 deletion src/Layers/xrRenderPC_R1/FStaticRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,14 @@ void CRender::destroy()

void CRender::reset_begin()
{
//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details->Unload();
xr_delete(Details);
}
xr_delete(Target);
//. HWOCC.occq_destroy ();
//HWOCC.occq_destroy();
}

void CRender::reset_end()
Expand Down
17 changes: 17 additions & 0 deletions src/Layers/xrRenderPC_R2/r2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,15 @@ void CRender::reset_begin()
Lights_LastFrame.clear();
}

//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details->Unload();
xr_delete(Details);
}
//-AVO


xr_delete(Target);
HWOCC.occq_destroy();
//_RELEASE (q_sync_point[1]);
Expand All @@ -372,6 +381,14 @@ void CRender::reset_end()

Target = new CRenderTarget();

//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details = new CDetailManager();
Details->Load();
}
//-AVO

xrRender_apply_tf();

// Set this flag true to skip the first render frame,
Expand Down
16 changes: 16 additions & 0 deletions src/Layers/xrRenderPC_R3/r3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,14 @@ void CRender::reset_begin()
Lights_LastFrame.clear();
}

//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details->Unload();
xr_delete(Details);
}
//-AVO

xr_delete(Target);
HWOCC.occq_destroy();
//_RELEASE (q_sync_point[1]);
Expand All @@ -496,6 +504,14 @@ void CRender::reset_end()

Target = new CRenderTarget();

//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details = new CDetailManager();
Details->Load();
}
//-AVO

xrRender_apply_tf();
FluidManager.SetScreenSize(Device.dwWidth, Device.dwHeight);

Expand Down
16 changes: 16 additions & 0 deletions src/Layers/xrRenderPC_R4/r4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,14 @@ void CRender::reset_begin()
Lights_LastFrame.clear();
}

//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details->Unload();
xr_delete(Details);
}
//-AVO

xr_delete(Target);
HWOCC.occq_destroy();
//_RELEASE (q_sync_point[1]);
Expand All @@ -508,6 +516,14 @@ void CRender::reset_end()

Target = new CRenderTarget();

//AVO: let's reload details while changed details options on vid_restart
if (b_loaded && (dm_current_size != dm_size || ps_r__Detail_density != ps_current_detail_density))
{
Details = new CDetailManager();
Details->Load();
}
//-AVO

xrRender_apply_tf();
FluidManager.SetScreenSize(Device.dwWidth, Device.dwHeight);

Expand Down

0 comments on commit de46442

Please sign in to comment.