Skip to content

Commit

Permalink
IRenderable: move data to RenderableBase.
Browse files Browse the repository at this point in the history
  • Loading branch information
nitrocaster committed Nov 11, 2015
1 parent 4ad28f0 commit e08653c
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 54 deletions.
14 changes: 7 additions & 7 deletions src/Layers/xrRender/LightTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,15 +179,15 @@ void CROS_impl::update (IRenderable* O)
if (dwFrame==Device.dwFrame) return;
dwFrame = Device.dwFrame;
if (0==O) return;
if (0==O->renderable.visual) return;
if (0==O->GetRenderData().visual) return;
VERIFY (dynamic_cast<CROS_impl*> (O->renderable_ROS()));
//float dt = Device.fTimeDelta;

CObject* _object = dynamic_cast<CObject*> (O);

// select sample, randomize position inside object
vis_data &vis = O->renderable.visual->getVisData();
Fvector position; O->renderable.xform.transform_tiny (position,vis.sphere.P);
vis_data &vis = O->GetRenderData().visual->getVisData();
Fvector position; O->GetRenderData().xform.transform_tiny (position,vis.sphere.P);
position.y += .3f * vis.sphere.R;
Fvector direction; direction.random_dir();
//. position.mad(direction,0.25f*radius);
Expand Down Expand Up @@ -292,15 +292,15 @@ static const s32 s_iUTIdleMax = 2000;
void CROS_impl::smart_update(IRenderable* O)
{
if (!O) return;
if (0==O->renderable.visual) return;
if (0==O->GetRenderData().visual) return;

--ticks_to_update;

// Acquire current position
Fvector position;
VERIFY(dynamic_cast<CROS_impl*> (O->renderable_ROS()));
vis_data &vis = O->renderable.visual->getVisData();
O->renderable.xform.transform_tiny( position, vis.sphere.P );
vis_data &vis = O->GetRenderData().visual->getVisData();
O->GetRenderData().xform.transform_tiny( position, vis.sphere.P );

if ( ticks_to_update <= 0)
{
Expand Down Expand Up @@ -422,7 +422,7 @@ void CROS_impl::prepare_lights(Fvector& position, IRenderable* O)
CObject* _object = dynamic_cast<CObject*> (O);
float dt = Device.fTimeDelta;

vis_data &vis = O->renderable.visual->getVisData();
vis_data &vis = O->GetRenderData().visual->getVisData();
float radius; radius = vis.sphere.R;
// light-tracing
BOOL bTraceLights = MODE & IRender_ObjectSpecific::TRACE_LIGHTS;
Expand Down
10 changes: 5 additions & 5 deletions src/Layers/xrRenderPC_R1/FStaticRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ void CRender::set_Object (IRenderable* O )
val_pObject = O; // NULL is OK, trust me :)
if (val_pObject) {
VERIFY(dynamic_cast<CObject*>(O)||dynamic_cast<CPS_Instance*>(O));
if (O->renderable.pROS) { VERIFY(dynamic_cast<CROS_impl*>(O->renderable.pROS)); }
if (O->GetRenderData().pROS) { VERIFY(dynamic_cast<CROS_impl*>(O->GetRenderData().pROS)); }
}
if (PHASE_NORMAL==phase) {
if (L_Shadows)
Expand All @@ -287,9 +287,9 @@ void CRender::apply_object (IRenderable* O )
{
if (0==O) return ;
if (PHASE_NORMAL==phase && O->renderable_ROS()) {
CROS_impl& LT = *((CROS_impl*)O->renderable.pROS);
CROS_impl& LT = *((CROS_impl*)O->GetRenderData().pROS);
VERIFY(dynamic_cast<CObject*>(O)||dynamic_cast<CPS_Instance*>(O));
VERIFY(dynamic_cast<CROS_impl*>(O->renderable.pROS));
VERIFY(dynamic_cast<CROS_impl*>(O->GetRenderData().pROS));
float o_hemi = 0.5f*LT.get_hemi ();
float o_sun = 0.5f*LT.get_sun ();
RCache.set_c (c_ldynamic_props,o_sun,o_sun,o_sun,o_hemi);
Expand Down Expand Up @@ -483,9 +483,9 @@ void CRender::Calculate ()
#endif
} else {
// Occlusiond
vis_data& v_orig = renderable->renderable.visual->getVisData();
vis_data& v_orig = renderable->GetRenderData().visual->getVisData();
vis_data v_copy = v_orig;
v_copy.box.xform (renderable->renderable.xform);
v_copy.box.xform (renderable->GetRenderData().xform);
BOOL bVisible = HOM.visible(v_copy);
v_orig.accept_frame = v_copy.accept_frame;
v_orig.marker = v_copy.marker;
Expand Down
20 changes: 10 additions & 10 deletions src/Layers/xrRenderPC_R1/LightProjector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ void CLightProjector::set_object (IRenderable* O)
return;
}

const vis_data &vis = O->renderable.visual->getVisData();
Fvector C; O->renderable.xform.transform_tiny (C,vis.sphere.P);
const vis_data &vis = O->GetRenderData().visual->getVisData();
Fvector C; O->GetRenderData().xform.transform_tiny (C,vis.sphere.P);
float R = vis.sphere.R;
float D = C.distance_to (Device.vCameraPosition)+R;

Expand Down Expand Up @@ -102,7 +102,7 @@ void CLightProjector::setup (int id)
return;
}
recv& R = cache[id];
float Rd = R.O->renderable.visual->getVisData().sphere.R;
float Rd = R.O->GetRenderData().visual->getVisData().sphere.R;
float dist = R.C.distance_to (Device.vCameraPosition)+Rd;
float factor = _sqr(dist/clipD(Rd))*(1-ps_r1_lmodel_lerp) + ps_r1_lmodel_lerp;
RCache.set_c (c_xform, R.UVgen);
Expand Down Expand Up @@ -145,7 +145,7 @@ void CLightProjector::calculate ()
else if (cache[slot].O!=O) bValid = FALSE; // not the same object
else {
// seems to be valid
Fbox bb; bb.xform (O->renderable.visual->getVisData().box,O->renderable.xform);
Fbox bb; bb.xform (O->GetRenderData().visual->getVisData().box,O->GetRenderData().xform);
if (cache[slot].BB.contains(bb)) {
// inside, but maybe timelimit exceeded?
if (Device.dwTimeGlobal > cache[slot].dwTimeValid) bValid = FALSE; // timeout
Expand Down Expand Up @@ -178,25 +178,25 @@ void CLightProjector::calculate ()
int tid = taskid.back(); taskid.pop_back();
recv& R = cache [c_it];
IRenderable* O = receivers [tid];
const vis_data& vis = O->renderable.visual->getVisData();
const vis_data& vis = O->GetRenderData().visual->getVisData();
CROS_impl* LT = (CROS_impl*)O->renderable_ROS();
VERIFY2 (_valid(O->renderable.xform),"Invalid object transformation");
VERIFY2 (_valid(O->GetRenderData().xform),"Invalid object transformation");
VERIFY2 (_valid(vis.sphere.P),"Invalid object's visual sphere");

Fvector C; O->renderable.xform.transform_tiny (C,vis.sphere.P);
Fvector C; O->GetRenderData().xform.transform_tiny (C,vis.sphere.P);
R.O = O;
R.C = C;
R.C.y += vis.sphere.R*0.1f; //. YURA: 0.1 can be more
R.BB.xform (vis.box,O->renderable.xform).scale(0.1f);
R.BB.xform (vis.box,O->GetRenderData().xform).scale(0.1f);
R.dwTimeValid = Device.dwTimeGlobal + ::Random.randI(time_min,time_max);
LT->shadow_recv_slot = c_it;

// Msg ("[%f,%f,%f]-%f",C.C.x,C.C.y,C.C.z,C.O->renderable.visual->vis.sphere.R);
// calculate projection-matrix
Fmatrix mProject;
float p_R = R.O->renderable.visual->getVisData().sphere.R * 1.1f;
float p_R = R.O->GetRenderData().visual->getVisData().sphere.R * 1.1f;
//VERIFY2 (p_R>EPS_L,"Object has no physical size");
VERIFY3 (p_R>EPS_L,"Object has no physical size", R.O->renderable.visual->getDebugName().c_str());
VERIFY3 (p_R>EPS_L,"Object has no physical size", R.O->GetRenderData().visual->getDebugName().c_str());
float p_hat = p_R/P_cam_dist;
float p_asp = 1.f;
float p_near = P_cam_dist-EPS_L;
Expand Down
12 changes: 6 additions & 6 deletions src/Layers/xrRenderPC_R1/LightShadows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ void CLightShadows::set_object (IRenderable* O)
return;
}

const vis_data &vis = O->renderable.visual->getVisData();
Fvector C; O->renderable.xform.transform_tiny (C,vis.sphere.P);
const vis_data &vis = O->GetRenderData().visual->getVisData();
Fvector C; O->GetRenderData().xform.transform_tiny (C,vis.sphere.P);
float R = vis.sphere.R;
float D = C.distance_to(Device.vCameraPosition)+R;
// D=0 -> P=0;
Expand Down Expand Up @@ -196,7 +196,7 @@ void CLightShadows::calculate ()
if (_dist>EPS_L) break;
Lpos.y += .01f; //. hack to avoid light-in-the-center-of-object
}
float _R = C.O->renderable.visual->getVisData().sphere.R+0.1f;
float _R = C.O->GetRenderData().visual->getVisData().sphere.R+0.1f;
//Msg ("* o-r: %f",_R);
if (_dist<_R) {
Fvector Ldir;
Expand All @@ -210,7 +210,7 @@ void CLightShadows::calculate ()
// calculate projection-matrix
Fmatrix mProject,mProjectR;
float p_dist = C.C.distance_to(Lpos);
float p_R = C.O->renderable.visual->getVisData().sphere.R;
float p_R = C.O->GetRenderData().visual->getVisData().sphere.R;
float p_hat = p_R/p_dist;
float p_asp = 1.f;
float p_near = p_dist-p_R-eps;
Expand Down Expand Up @@ -425,7 +425,7 @@ void CLightShadows::render ()
// Everything, OK. Check if info is still relevant...
CI = &*CI_ptr;
bValid = TRUE;
if (!CI->Op.similar(CI->O->renderable.xform.c)) bValid = FALSE;
if (!CI->Op.similar(CI->O->GetRenderData().xform.c)) bValid = FALSE;
else if (!CI->Lp.similar(CI->L->position)) bValid = FALSE;
}
}
Expand Down Expand Up @@ -484,7 +484,7 @@ void CLightShadows::render ()

// Remember params which builded cache item
CI->O = S.O;
CI->Op = CI->O->renderable.xform.c;
CI->Op = CI->O->GetRenderData().xform.c;
CI->L = S.L;
CI->Lp = CI->L->position;
CI->tcnt = tess.size();
Expand Down
4 changes: 2 additions & 2 deletions src/Layers/xrRenderPC_R2/r2_R_render.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ void CRender::render_main (Fmatrix& m_ViewProjection, bool _fportals)

// Occlusion
// casting is faster then using getVis method
vis_data& v_orig = ((dxRender_Visual*)renderable->renderable.visual)->vis;
vis_data& v_orig = ((dxRender_Visual*)renderable->GetRenderData().visual)->vis;
vis_data v_copy = v_orig;
v_copy.box.xform (renderable->renderable.xform);
v_copy.box.xform (renderable->GetRenderData().xform);
BOOL bVisible = HOM.visible(v_copy);
v_orig.marker = v_copy.marker;
v_orig.accept_frame = v_copy.accept_frame;
Expand Down
4 changes: 2 additions & 2 deletions src/Layers/xrRenderPC_R3/r3_R_render.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,9 @@ void CRender::render_main (Fmatrix& m_ViewProjection, bool _fportals)

// Occlusion
// casting is faster then using getVis method
vis_data& v_orig = ((dxRender_Visual*)renderable->renderable.visual)->vis;
vis_data& v_orig = ((dxRender_Visual*)renderable->GetRenderData().visual)->vis;
vis_data v_copy = v_orig;
v_copy.box.xform (renderable->renderable.xform);
v_copy.box.xform (renderable->GetRenderData().xform);
BOOL bVisible = HOM.visible(v_copy);
v_orig.marker = v_copy.marker;
v_orig.accept_frame = v_copy.accept_frame;
Expand Down
4 changes: 2 additions & 2 deletions src/Layers/xrRenderPC_R4/r4_R_render.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ void CRender::render_main (Fmatrix& m_ViewProjection, bool _fportals)

// Occlusion
// casting is faster then using getVis method
vis_data& v_orig = ((dxRender_Visual*)renderable->renderable.visual)->vis;
vis_data& v_orig = ((dxRender_Visual*)renderable->GetRenderData().visual)->vis;
vis_data v_copy = v_orig;
v_copy.box.xform (renderable->renderable.xform);
v_copy.box.xform (renderable->GetRenderData().xform);
BOOL bVisible = HOM.visible(v_copy);
v_orig.marker = v_copy.marker;
v_orig.accept_frame = v_copy.accept_frame;
Expand Down
8 changes: 4 additions & 4 deletions src/xrEngine/IRenderable.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include "stdafx.h"
#include "xrCDB/ISpatial.h"
#include "IRenderable.h"

IRenderable::IRenderable()
// XXX: rename this file to RenderableBase.cpp
RenderableBase::RenderableBase()
{
renderable.xform.identity();
renderable.visual = NULL;
Expand All @@ -13,7 +13,7 @@ IRenderable::IRenderable()
}

extern ENGINE_API BOOL g_bRendering;
IRenderable::~IRenderable()
RenderableBase::~RenderableBase()
{
VERIFY(!g_bRendering);
GlobalEnv.Render->model_Delete(renderable.visual);
Expand All @@ -22,7 +22,7 @@ IRenderable::~IRenderable()
renderable.pROS = NULL;
}

IRender_ObjectSpecific* IRenderable::renderable_ROS()
IRender_ObjectSpecific* RenderableBase::renderable_ROS()
{
if (0 == renderable.pROS && renderable.pROS_Allowed) renderable.pROS = GlobalEnv.Render->ros_create(this);
return renderable.pROS;
Expand Down
45 changes: 31 additions & 14 deletions src/xrEngine/IRenderable.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,41 @@

//////////////////////////////////////////////////////////////////////////
// definition ("Renderable")
class ENGINE_API IRenderable

class RenderData
{
public:
Fmatrix xform;
IRenderVisual *visual;
IRender_ObjectSpecific *pROS;
BOOL pROS_Allowed;
};

class IRenderable
{
public:
virtual ~IRenderable() = 0;
virtual RenderData &GetRenderData() = 0;
virtual void renderable_Render() = 0;
virtual IRender_ObjectSpecific *renderable_ROS() = 0;
virtual BOOL renderable_ShadowGenerate() = 0;
virtual BOOL renderable_ShadowReceive() = 0;
};

inline IRenderable::~IRenderable() {}

class ENGINE_API RenderableBase : public IRenderable
{
public:
struct
{
Fmatrix xform;
IRenderVisual* visual;
IRender_ObjectSpecific* pROS;
BOOL pROS_Allowed;
} renderable;
RenderData renderable;
public:
IRenderable();
virtual ~IRenderable();
IRender_ObjectSpecific* renderable_ROS();
RenderableBase();
virtual ~RenderableBase();
virtual RenderData &GetRenderData() override final { return renderable; }
virtual IRender_ObjectSpecific *renderable_ROS() override final;
BENCH_SEC_SCRAMBLEVTBL2
virtual void renderable_Render() = 0;
virtual BOOL renderable_ShadowGenerate() { return FALSE; };
virtual BOOL renderable_ShadowReceive() { return FALSE; };
virtual BOOL renderable_ShadowGenerate() override { return FALSE; }
virtual BOOL renderable_ShadowReceive() override { return FALSE; }
};

#endif // IRENDERABLE_H_INCLUDED
2 changes: 1 addition & 1 deletion src/xrEngine/PS_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class ENGINE_API CPS_Instance :
public SpatialBase,
public ScheduledBase,
public IRenderable
public RenderableBase
{
friend class IGame_Persistent;

Expand Down
2 changes: 1 addition & 1 deletion src/xrEngine/xr_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ENGINE_API CObject :
public DLL_Pure,
public SpatialBase,
public ScheduledBase,
public IRenderable,
public RenderableBase,
public CollidableBase
{
public:
Expand Down

0 comments on commit e08653c

Please sign in to comment.