Skip to content

Commit

Permalink
Changes 21.02.24
Browse files Browse the repository at this point in the history
-Support usage of multiple spawn_loadout sections in character descriptions (OpenXRay#1590)
-Support for linear space rendering in R4 renderer (OpenXRay#1576)
-Fixed "Naruto run"
-Fog affects npc vision
-Smopth peak
-Landscape render phase (IXRAY)
-Volumetric light optimization (fixed light flickering by Graff46)
-Fixed visual memory manager formula
-Optimazed light renderer (https://github.com/OpenXRay/xray-16/pull/1600/files)
-Fixed HOM cache (dsh2dsh)
-Fixed CKinematics::LL_SetBoneVisible (Anomaly)
  • Loading branch information
OneMorePseudoCoder committed Feb 21, 2024
1 parent b1be0c1 commit 1bee541
Show file tree
Hide file tree
Showing 45 changed files with 400 additions and 509 deletions.
4 changes: 2 additions & 2 deletions res/gamedata/scripts/visual_memory_manager.script
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
-- called from engine
-- This occurs during the visible check. If value >= visiblity_threshold then object is considered visible
-- warning npc and who can be nil sometimes
function get_visible_value(npc, who, time_delta, time_quant, luminocity, velocity_factor, velocity, distance, object_distance, always_visible_distance)
function get_visible_value(npc, who, time_delta, time_quant, luminocity, velocity_factor, velocity, distance, object_distance, always_visible_distance, fog_factor)
distance = distance <= 0 and 0.00001 or distance
luminocity = luminocity <= 0 and 0.0001 or luminocity

-- if (level_weathers.bLevelUnderground) then
-- luminocity = luminocity + 0.35
-- end

return time_delta / time_quant * luminocity * (1 + velocity_factor * velocity) * (distance - object_distance) / distance
return time_delta / time_quant * luminocity * (1 + velocity_factor * velocity) * (distance - object_distance) / (distance - always_visible_distance) * fog_factor
end
Binary file added res/gamedata/shaders/r3/yuv2rgb.ps
Binary file not shown.
Binary file modified res/gamedata/shaders/r5/yuv2rgb.ps
Binary file not shown.
35 changes: 4 additions & 31 deletions src/Layers/xrRender/FTreeVisual.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,33 +64,8 @@ void FTreeVisual::Load(const char* N, IReader* data, u32 dwFlags)
c_bias.rgb.mul(.5f);
c_bias.hemi *= .5f;
c_bias.sun *= .5f;
// Msg ("hemi[%f / %f], sun[%f / %f]",c_scale.hemi,c_bias.hemi,c_scale.sun,c_bias.sun);
}

/*if (RImplementation.o.ffp && dcl_equal(vFormat, mu_model_decl_unpacked))
{
const size_t vertices_size = vCount * sizeof(mu_model_vert_unpacked);
const auto new_buffer = xr_new<VertexStagingBuffer>();
new_buffer->Create(vertices_size);
auto vert_new = static_cast<mu_model_vert_unpacked*>(new_buffer->Map());
const auto vert_orig = static_cast<mu_model_vert_unpacked*>(p_rm_Vertices->Map(vBase, vertices_size, true)); // read-back
CopyMemory(vert_new, vert_orig, vertices_size);
for (size_t i = 0; i < vCount; ++i)
{
//vert_new->P.mul(xform.j);
++vert_new;
}
new_buffer->Unmap(true);
p_rm_Vertices->Unmap(false);
_RELEASE(p_rm_Vertices);
p_rm_Vertices = new_buffer;
vBase = 0;
}*/

// Geom
rm_geom.create(vFormat, *p_rm_Vertices, *p_rm_Indices);

Expand All @@ -114,7 +89,7 @@ struct FTreeVisual_setup
Fvector4 wave;
Fvector4 wind;

FTreeVisual_setup(): dwFrame(0), scale(0) {}
FTreeVisual_setup(): dwFrame(0), scale(M_MIN_SCALE) {}

void calculate()
{
Expand All @@ -123,23 +98,21 @@ struct FTreeVisual_setup
const float tm_rot = PI_MUL_2 * Device.fTimeGlobal / ps_r__Tree_w_rot;

// Calc wind-vector3, scale

wind.set(_sin(tm_rot), 0, _cos(tm_rot), 0);
wind.normalize();

#if RENDER!=R_R1
const auto& env = g_pGamePersistent->Environment().CurrentEnv;
const float fValue = env.m_fTreeAmplitudeIntensity;
wind.mul(fValue); // dir1*amplitude
wind.mul(fValue);
#else
wind.mul(ps_r__Tree_w_amp); // dir1*amplitude
wind.mul(ps_r__Tree_w_amp);
#endif

scale = 1.f / float(FTreeVisual_quant);

// setup constants
wave.set(
ps_r__Tree_Wave.x, ps_r__Tree_Wave.y, ps_r__Tree_Wave.z, Device.fTimeGlobal * ps_r__Tree_w_speed); // wave
wave.set(ps_r__Tree_Wave.x, ps_r__Tree_Wave.y, ps_r__Tree_Wave.z, Device.fTimeGlobal * ps_r__Tree_w_speed); // wave
wave.div(PI_MUL_2);
}
};
Expand Down
36 changes: 11 additions & 25 deletions src/Layers/xrRender/HOM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
#include "xrEngine/GameFont.h"
#include "xrEngine/PerformanceAlert.hpp"

float psOSSR = .001f;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -155,15 +153,11 @@ void CHOM::Render_DB(CFrustum& base)
// Update projection matrices on every frame to ensure valid HOM culling
float view_dim = occ_dim_0;
#if defined(USE_DX9) || defined(USE_DX11)
Fmatrix m_viewport = {view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
view_dim / 2.f + 0 + 0, view_dim / 2.f + 0 + 0, 0.0f, 1.0f};
Fmatrix m_viewport_01 = {1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
1.f / 2.f + 0 + 0, 1.f / 2.f + 0 + 0, 0.0f, 1.0f};
Fmatrix m_viewport = {view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, view_dim / 2.f + 0 + 0, view_dim / 2.f + 0 + 0, 0.0f, 1.0f};
Fmatrix m_viewport_01 = {1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.f / 2.f + 0 + 0, 1.f / 2.f + 0 + 0, 0.0f, 1.0f};
#elif defined(USE_OGL)
Fmatrix m_viewport = {view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, -view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
view_dim / 2.f + 0 + 0, view_dim / 2.f + 0 + 0, 0.0f, 1.0f};
Fmatrix m_viewport_01 = {1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, -1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
1.f / 2.f + 0 + 0, 1.f / 2.f + 0 + 0, 0.0f, 1.0f};
Fmatrix m_viewport = {view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, -view_dim / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, view_dim / 2.f + 0 + 0, view_dim / 2.f + 0 + 0, 0.0f, 1.0f};
Fmatrix m_viewport_01 = {1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, -1.f / 2.f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.f / 2.f + 0 + 0, 1.f / 2.f + 0 + 0, 0.0f, 1.0f};
#else
# error No graphics API selected or enabled!
#endif
Expand Down Expand Up @@ -344,11 +338,15 @@ BOOL CHOM::visible(const Fbox2& B, float depth) const

BOOL CHOM::visible(vis_data& vis) const
{
if (Device.dwFrame < vis.hom_frame)
return TRUE; // not at this time :)
if (!bEnabled)
return TRUE; // return - everything visible

if (vis.hom_tested == Device.dwFrame)
return vis.hom_frame > vis.hom_tested;

if (Device.dwFrame < vis.hom_frame)
return TRUE; // not at this time :)

ScopeStatTimer scopeStats(stats.Total, stats.TotalTimerLock);

// Now, the test time comes
Expand All @@ -357,20 +355,8 @@ BOOL CHOM::visible(vis_data& vis) const
// 1. The object was visible, but we must to re-check it - test | frame-new, tested-???, hom_res = true;
// 2. New object slides into view - delay test| frame-old, tested-old, hom_res = ???;
const u32 frame_current = Device.dwFrame;
// u32 frame_prev = frame_current-1;

const BOOL result = _visible(vis.box, m_xform_01);
u32 delay = 1;
if (result)
{
// visible - delay next test
delay = ::Random.randI(5 * 2, 5 * 5);
}
else
{
// hidden - shedule to next frame
}
vis.hom_frame = frame_current + delay;
vis.hom_frame = result ? frame_current + ::Random.randI(5 * 2, 5 * 5) : frame_current;
vis.hom_tested = frame_current;
return result;
}
Expand Down
5 changes: 4 additions & 1 deletion src/Layers/xrRender/Shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ void resptrcode_shader::create(LPCSTR s_shader, LPCSTR s_textures, LPCSTR s_cons
{
_set(RImplementation.Resources->Create(s_shader, s_textures, s_constants, s_matrices));
}

void resptrcode_shader::create(IBlender* B, LPCSTR s_shader, LPCSTR s_textures, LPCSTR s_constants, LPCSTR s_matrices)
{
_set(RImplementation.Resources->Create(B, s_shader, s_textures, s_constants, s_matrices));
Expand All @@ -36,7 +37,6 @@ void resptrcode_geom::create(const VertexElement* decl, VertexBufferHandle vb, I
_set(RImplementation.Resources->CreateGeom(decl, vb, ib));
}


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -86,6 +86,7 @@ ShaderElement::ShaderElement()
flags.bEmissive = FALSE;
flags.bDistort = FALSE;
flags.bWmark = FALSE;
flags.bLandscape = FALSE;
}

BOOL ShaderElement::equal(ShaderElement& S)
Expand All @@ -100,6 +101,8 @@ BOOL ShaderElement::equal(ShaderElement& S)
return FALSE;
if (flags.bDistort != S.flags.bDistort)
return FALSE;
if (flags.bLandscape != S.flags.bLandscape)
return FALSE;
if (passes.size() != S.passes.size())
return FALSE;
for (u32 p = 0; p < passes.size(); p++)
Expand Down
1 change: 1 addition & 0 deletions src/Layers/xrRender/Shader.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ struct ECORE_API ShaderElement : public xr_resource_flagged
u32 bEmissive : 1;
u32 bDistort : 1;
u32 bWmark : 1;
u32 bLandscape : 1;
};

Sflags flags;
Expand Down
43 changes: 24 additions & 19 deletions src/Layers/xrRender/SkeletonCustom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -489,26 +489,31 @@ void CKinematics::Release()

void CKinematics::LL_SetBoneVisible(u16 bone_id, BOOL val, BOOL bRecursive)
{
VERIFY(bone_id < LL_BoneCount());
u64 mask = u64(1) << bone_id;
visimask.set(mask, val);
if (!visimask.is(mask))
{
bone_instances[bone_id].mTransform.scale(0.f, 0.f, 0.f);
}
else
{
CalculateBones_Invalidate();
}
bone_instances[bone_id].mRenderTransform.mul_43(
bone_instances[bone_id].mTransform, (*bones)[bone_id]->m2b_transform);
if (bRecursive)
{
for (xr_vector<CBoneData*>::iterator C = (*bones)[bone_id]->children.begin();
C != (*bones)[bone_id]->children.end(); ++C)
VERIFY(bone_id < LL_BoneCount());
if (bone_id >= LL_BoneCount())
return;
u64 mask = u64(1) << bone_id;
visimask.set(mask, val);
if (!visimask.is(mask))
{
bone_instances[bone_id].mTransform.scale(M_MIN_SCALE, M_MIN_SCALE, M_MIN_SCALE);
if (LL_GetData(bone_id).GetParentID() < LL_BoneCount() && LL_GetData(bone_id).GetParentID() != BI_NONE)
bone_instances[bone_id].mTransform.c = LL_GetBoneInstance(LL_GetData(bone_id).GetParentID()).mTransform.c;
}
else
{
CalculateBones_Invalidate();
}

bone_instances[bone_id].mRenderTransform.mul_43(bone_instances[bone_id].mTransform, (*bones)[bone_id]->m2b_transform);

if (bRecursive)
{
for (xr_vector<CBoneData*>::iterator C = (*bones)[bone_id]->children.begin(); C != (*bones)[bone_id]->children.end(); ++C)
LL_SetBoneVisible((*C)->GetSelfID(), val, bRecursive);
}
Visibility_Invalidate();

Visibility_Invalidate();
}

void CKinematics::LL_SetBonesVisible(u64 mask)
Expand All @@ -525,7 +530,7 @@ void CKinematics::LL_SetBonesVisible(u64 mask)
{
Fmatrix& A = bone_instances[b].mTransform;
Fmatrix& B = bone_instances[b].mRenderTransform;
A.scale(0.f, 0.f, 0.f);
A.scale(M_MIN_SCALE, M_MIN_SCALE, M_MIN_SCALE);
B.mul_43(A, (*bones)[b]->m2b_transform);
}
}
Expand Down
26 changes: 18 additions & 8 deletions src/Layers/xrRender/blenders/Blender_BmmD_deferred.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,18 +80,22 @@ void CBlender_BmmD::Compile(CBlender_Compile& C)
switch (C.iElement)
{
case SE_R2_NORMAL_HQ: // deffer
C.SH->flags.bLandscape = true;
C.r_Pass("shadow_direct_base", "shadow_direct_base", FALSE, TRUE, TRUE);
C.r_ColorWriteEnable(false, false, false, false);
C.r_End();

uber_deffer(C, true, "impl", "impl", false, oT2_Name[0] ? oT2_Name : 0, true);

C.RS.SetRS(D3DRS_ZFUNC, D3DCMP_EQUAL);

C.r_Sampler("s_mask", mask);
C.r_Sampler("s_lmap", C.L_textures[1]);

C.r_Sampler(
"s_dt_r", oR_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler(
"s_dt_g", oG_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler(
"s_dt_b", oB_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler(
"s_dt_a", oA_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler("s_dt_r", oR_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler("s_dt_g", oG_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler("s_dt_b", oB_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);
C.r_Sampler("s_dt_a", oA_Name, false, D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC);

C.r_Sampler("s_dn_r", strconcat(sizeof(mask), mask, oR_Name, "_bump"));
C.r_Sampler("s_dn_g", strconcat(sizeof(mask), mask, oG_Name, "_bump"));
Expand All @@ -114,7 +118,13 @@ void CBlender_BmmD::Compile(CBlender_Compile& C)
C.r_End();
break;
case SE_R2_NORMAL_LQ: // deffer
// landscape sorting
C.SH->flags.bLandscape = true;
C.r_Pass("shadow_direct_base", "shadow_direct_base", FALSE, TRUE, TRUE);
C.r_ColorWriteEnable(false, false, false, false);
C.r_End();
uber_deffer(C, false, "base", "impl", false, oT2_Name[0] ? oT2_Name : 0, true);
C.RS.SetRS(D3DRS_ZFUNC, D3DCMP_EQUAL);
C.r_Sampler("s_lmap", C.L_textures[1]);
C.r_End();
break;
Expand Down
25 changes: 5 additions & 20 deletions src/Layers/xrRender/blenders/uber_deffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
#include "uber_deffer.h"
void fix_texture_name(pstr fn);

void uber_deffer(CBlender_Compile& C, bool hq, LPCSTR _vspec, LPCSTR _pspec, BOOL _aref, LPCSTR _detail_replace,
bool DO_NOT_FINISH)
void uber_deffer(CBlender_Compile& C, bool hq, LPCSTR _vspec, LPCSTR _pspec, BOOL _aref, LPCSTR _detail_replace, bool DO_NOT_FINISH)
{
// Uber-parse
string256 fname, fnameA, fnameB;
xr_strcpy(fname, *C.L_textures[0]); //. andy if (strext(fname)) *strext(fname)=0;
xr_strcpy(fname, *C.L_textures[0]);
fix_texture_name(fname);
ref_texture _t;
_t.create(fname);
Expand Down Expand Up @@ -166,25 +165,11 @@ void uber_deffer(CBlender_Compile& C, bool hq, LPCSTR _vspec, LPCSTR _pspec, BOO
C.r_dx11Texture("s_tdetailBumpX", texDetailBumpX);
}
}
else if (C.SH->flags.bLandscape)
C.r_Pass(vs, ps, FALSE, TRUE, FALSE);
else
{
C.r_Pass(vs, ps, FALSE);
}
// C.r_Sampler("s_base", C.L_textures[0], false, D3DTADDRESS_WRAP,
// D3DTEXF_ANISOTROPIC,D3DTEXF_LINEAR,
// D3DTEXF_ANISOTROPIC);
// C.r_Sampler("s_bumpX", fnameB, false, D3DTADDRESS_WRAP,
// D3DTEXF_ANISOTROPIC,D3DTEXF_LINEAR,
// D3DTEXF_ANISOTROPIC); // should be before base bump
// C.r_Sampler("s_bump", fnameA, false, D3DTADDRESS_WRAP,
// D3DTEXF_ANISOTROPIC,D3DTEXF_LINEAR,
// D3DTEXF_ANISOTROPIC);
// C.r_Sampler("s_bumpD", dt, false, D3DTADDRESS_WRAP,
// D3DTEXF_ANISOTROPIC,D3DTEXF_LINEAR,
// D3DTEXF_ANISOTROPIC);
// C.r_Sampler("s_detail", dt, false, D3DTADDRESS_WRAP,
// D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR,
// D3DTEXF_ANISOTROPIC);

C.r_dx11Texture("s_base", C.L_textures[0]);
C.r_dx11Texture("s_bumpX", fnameB); // should be before base bump
C.r_dx11Texture("s_bump", fnameA);
Expand Down
14 changes: 13 additions & 1 deletion src/Layers/xrRender/dxRainRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ const int max_particles = 1000;
const int particles_cache = 400;
const float particles_time = .3f;

namespace
{

float srgbToLinear(float c) { return std::pow(c, 2.2f); }

Fvector3 srgbToLinear(const Fvector3 c)
{
return Fvector3{srgbToLinear(c.x), srgbToLinear(c.y), srgbToLinear(c.z)};
}

} // namespace

dxRainRender::dxRainRender()
{
IReader* F = FS.r_open("$game_meshes$", "dm" DELIMITER "rain.dm");
Expand Down Expand Up @@ -84,7 +96,7 @@ void dxRainRender::Render(CEffect_Rain& owner)

// visual
const float factor_visual = factor / 2.f + .5f;
const Fvector3 f_rain_color = g_pGamePersistent->Environment().CurrentEnv.rain_color;
const Fvector3 f_rain_color = srgbToLinear(g_pGamePersistent->Environment().CurrentEnv.rain_color);
const u32 u_rain_color = color_rgba_f(f_rain_color.x, f_rain_color.y, f_rain_color.z, factor_visual);

const float b_radius_wrap_sqr = _sqr((source_radius + .5f));
Expand Down
7 changes: 7 additions & 0 deletions src/Layers/xrRender/r__dsgraph_build.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ ICF float CalcSSA(float& distSQ, Fvector& C, dxRender_Visual* V)
distSQ = Device.vCameraPosition.distance_to_sqr(C) + EPS;
return R / distSQ;
}

ICF float CalcSSA(float& distSQ, Fvector& C, float R)
{
distSQ = Device.vCameraPosition.distance_to_sqr(C) + EPS;
Expand Down Expand Up @@ -221,6 +222,12 @@ void R_dsgraph_structure::insert_static(dxRender_Visual* pVisual)

counter_S++;

if (sh->flags.bLandscape && o.phase == CRender::PHASE_NORMAL)
{
mapLandscape.insert_anyway(distSQ, _MatrixItemS({ SSA, nullptr, pVisual, Fidentity, sh }));
return;
}

for (u32 iPass = 0; iPass < sh->passes.size(); ++iPass)
{
SPass* pass = sh->passes[iPass]._get();
Expand Down
Loading

0 comments on commit 1bee541

Please sign in to comment.