Skip to content

Commit

Permalink
To avoid vector end iterator dereference (this is undefined behaviour…
Browse files Browse the repository at this point in the history
…). And code simplification.
  • Loading branch information
intorr committed Dec 8, 2017
1 parent fcf0cf0 commit 45f50b9
Show file tree
Hide file tree
Showing 13 changed files with 50 additions and 69 deletions.
7 changes: 3 additions & 4 deletions src/Layers/xrRender/DetailManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,10 +353,9 @@ void CDetailManager::UpdateVisibleM()
float R = objects[sp.id]->bv_sphere.R;
float Rq_drcp = R * R * dist_sq_rcp; // reordered expression for 'ssa' calc

SlotItem **siIT = &(*sp.items.begin()), **siEND = &(*sp.items.end());
for (; siIT != siEND; siIT++)
for(auto &siIT : sp.items)
{
SlotItem& Item = *(*siIT);
SlotItem& Item = *siIT;
float scale = Item.scale_calculated = Item.scale * alpha_i;
float ssa = scale * scale * Rq_drcp;
if (ssa < r_ssaDISCARD)
Expand All @@ -367,7 +366,7 @@ void CDetailManager::UpdateVisibleM()
if (ssa > r_ssaCHEAP)
vis_id = Item.vis_ID;

sp.r_items[vis_id].push_back(*siIT);
sp.r_items[vis_id].push_back(siIT);

// 2 visible[vis_id][sp.id].push_back(&Item);
}
Expand Down
10 changes: 5 additions & 5 deletions src/Layers/xrRender/HOM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,8 @@ void CHOM::Render_DB(CFrustum& base)
return;

// Prepare
CDB::RESULT* it = xrc.r_begin();
CDB::RESULT* end = xrc.r_end();
auto it = xrc.r_get()->begin();
auto end = xrc.r_get()->end();

Fvector COP = Device.vCameraPosition;
end = std::remove_if(it, end, pred_fb(m_pTris));
Expand All @@ -185,10 +185,10 @@ void CHOM::Render_DB(CFrustum& base)
stats.VisibleTriangleCount = 0;

// Perfrom selection, sorting, culling
for (; it != end; it++)
for (auto &it : *xrc.r_get())
{
// Control skipping
occTri& T = m_pTris[it->id];
occTri& T = m_pTris[it.id];
u32 next = _frame + ::Random.randI(3, 10);

// Test for good occluder - should be improved :)
Expand All @@ -199,7 +199,7 @@ void CHOM::Render_DB(CFrustum& base)
}

// Access to triangle vertices
CDB::TRI& t = m_pModel->get_tris()[it->id];
CDB::TRI& t = m_pModel->get_tris()[it.id];
Fvector* v = m_pModel->get_verts();
src.clear();
dst.clear();
Expand Down
8 changes: 2 additions & 6 deletions src/Layers/xrRender/r__dsgraph_render.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ void __fastcall mapNormal_Render(mapNormalItems& N)
{
// *** DIRECT ***
std::sort(N.begin(), N.end(), cmp_normal_items);
_NormalItem *I = &*N.begin(), *E = &*N.end();
for (; I != E; I++)
for(auto &Ni : N)
{
_NormalItem& Ni = *I;
float LOD = calcLOD(Ni.ssa, Ni.pVisual->vis.sphere.R);
#ifdef USE_DX11
RCache.LOD.set_LOD(LOD);
Expand All @@ -44,10 +42,8 @@ void __fastcall mapMatrix_Render(mapMatrixItems& N)
{
// *** DIRECT ***
std::sort(N.begin(), N.end(), cmp_matrix_items);
_MatrixItem *I = &*N.begin(), *E = &*N.end();
for (; I != E; I++)
for (auto &Ni : N)
{
_MatrixItem& Ni = *I;
RCache.set_xform_world(Ni.Matrix);
RImplementation.apply_object(Ni.pObject);
RImplementation.apply_lmaterial();
Expand Down
6 changes: 3 additions & 3 deletions src/Layers/xrRenderPC_R1/LightShadows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -491,11 +491,11 @@ void CLightShadows::render()

// Clip polys by frustum
tess.clear();
for (CDB::RESULT* p = xrc.r_begin(); p != xrc.r_end(); p++)
for (auto &p : *xrc.r_get())
{
VERIFY((p->id >= 0) && (p->id < DB->get_tris_count()));
VERIFY((p.id >= 0) && (p.id < DB->get_tris_count()));
//
CDB::TRI& t = TRIS[p->id];
CDB::TRI& t = TRIS[p.id];
if (t.suppress_shadows)
continue;
sPoly A, B;
Expand Down
3 changes: 2 additions & 1 deletion src/xrCDB/xrCDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ class XRCDB_API COLLIDER
void frustum_query(const MODEL* m_def, const CFrustum& F);

ICF RESULT* r_begin() { return &*rd.begin(); };
ICF RESULT* r_end() { return &*rd.end(); };
//ICF RESULT* r_end() { return &*rd.end(); };
ICF xr_vector<RESULT>* r_get() { return &rd; };
RESULT& r_add();
void r_free();
ICF int r_count() { return rd.size(); };
Expand Down
3 changes: 2 additions & 1 deletion src/xrCDB/xrXRC.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ class XRCDB_API xrXRC
}

IC CDB::RESULT* r_begin() { return CL.r_begin(); };
IC CDB::RESULT* r_end() { return CL.r_end(); };
//IC CDB::RESULT* r_end() { return CL.r_end(); };
IC xr_vector<CDB::RESULT>* r_get() { return CL.r_get(); };
IC void r_free() { CL.r_free(); }
IC int r_count() { return CL.r_count(); };
IC void r_clear() { CL.r_clear(); };
Expand Down
8 changes: 4 additions & 4 deletions src/xrCDB/xr_area_query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ bool CObjectSpace::BoxQuery(Fvector const& box_center, Fvector const& box_z_axis

if (out_tris)
{
for (CDB::RESULT* result = xrc.r_begin(); result != xrc.r_end(); ++result)
for (auto &result : *xrc.r_get())
{
out_tris->push_back(result->verts[0]);
out_tris->push_back(result->verts[1]);
out_tris->push_back(result->verts[2]);
out_tris->push_back(result.verts[0]);
out_tris->push_back(result.verts[1]);
out_tris->push_back(result.verts[2]);
}
}

Expand Down
26 changes: 9 additions & 17 deletions src/xrCDB/xr_area_raypick.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,9 @@ BOOL CObjectSpace::_RayQuery2(collide::rq_results& r_dest, const collide::ray_de
{
xrc.ray_options(R.flags);
xrc.ray_query(&Static, R.start, R.dir, R.range);
if (xrc.r_count())
{
CDB::RESULT* _I = xrc.r_begin();
CDB::RESULT* _E = xrc.r_end();
for (; _I != _E; _I++)
r_temp.append_result(rq_result().set(0, _I->range, _I->id));
}

for(auto &i : *xrc.r_get())
r_temp.append_result(rq_result().set(0, i.range, i.id));
}
// Test dynamic
if (R.tgt & d_mask)
Expand All @@ -239,12 +235,10 @@ BOOL CObjectSpace::_RayQuery2(collide::rq_results& r_dest, const collide::ray_de
if (r_temp.r_count())
{
r_temp.r_sort();
collide::rq_result* _I = r_temp.r_begin();
collide::rq_result* _E = r_temp.r_end();
for (; _I != _E; _I++)
for(auto &i : *r_temp.r_get())
{
r_dest.append_result(*_I);
if (!(CB ? CB(*_I, user_data) : TRUE))
r_dest.append_result(i);
if (!(CB ? CB(i, user_data) : TRUE))
return r_dest.r_count();
if (R.flags & (CDB::OPT_ONLYNEAREST | CDB::OPT_ONLYFIRST))
return r_dest.r_count();
Expand Down Expand Up @@ -332,12 +326,10 @@ BOOL CObjectSpace::_RayQuery3(collide::rq_results& r_dest, const collide::ray_de
if (r_temp.r_count())
{
r_temp.r_sort();
collide::rq_result* _I = r_temp.r_begin();
collide::rq_result* _E = r_temp.r_end();
for (; _I != _E; _I++)
for (auto &i : *r_temp.r_get())
{
r_dest.append_result(*_I);
if (!(CB ? CB(*_I, user_data) : TRUE))
r_dest.append_result(i);
if (!(CB ? CB(i, user_data) : TRUE))
return r_dest.r_count();
if (R.flags & CDB::OPT_ONLYFIRST)
return r_dest.r_count();
Expand Down
3 changes: 2 additions & 1 deletion src/xrCDB/xr_collide_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,8 @@ class rq_results

IC int r_count() { return results.size(); }
IC rq_result* r_begin() { return &*results.begin(); }
IC rq_result* r_end() { return &*results.end(); }
//IC rq_result* r_end() { return &*results.end(); }
IC rqVec* r_get() { return &results; }
IC void r_clear() { results.clear_not_free(); }
IC void r_sort() { std::sort(results.begin(), results.end(), r_sort_pred); }
IC rqVec& r_results() { return results; }
Expand Down
6 changes: 2 additions & 4 deletions src/xrGame/ActorCameras.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,11 +123,9 @@ ICF void calc_gl_point(Fvector& pt, const Fmatrix& xform, float radius, float an
}
ICF BOOL test_point(const Fvector& pt, xrXRC& xrc, const Fmatrix33& mat, const Fvector& ext)
{
CDB::RESULT* it = xrc.r_begin();
CDB::RESULT* end = xrc.r_end();
for (; it != end; it++)
for (auto &it : *xrc.r_get())
{
CDB::RESULT& O = *it;
CDB::RESULT& O = it;
if (GMLib.GetMaterialByIdx(O.material)->Flags.is(SGameMtl::flPassable))
continue;
if (CDB::TestBBoxTri(mat, pt, ext, O.verts, FALSE))
Expand Down
6 changes: 2 additions & 4 deletions src/xrGame/wallmark_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,6 @@ void CWalmarkManager::StartWorkflow()

CDB::TRI* T_array = Level().ObjectSpace.GetStaticTris();
Fvector* V_array = Level().ObjectSpace.GetStaticVerts();
CDB::RESULT* R_begin = XRC.r_begin();
CDB::RESULT* R_end = XRC.r_end();
//. Triangle ntri;
//. float ndist = phInfinity;
//. Fvector npoint;
Expand All @@ -115,7 +113,7 @@ void CWalmarkManager::StartWorkflow()
CTimer T; T.Start();
*/
for (CDB::RESULT* Res = R_begin; Res != R_end; ++Res)
for (auto &Res : *XRC.r_get())
{
//. DBG_DrawTri(Res, color_xrgb(0,255,0) );

Expand All @@ -134,7 +132,7 @@ void CWalmarkManager::StartWorkflow()
//. float dist = DistToTri(&tri,cast_fp(m_pos),cast_fp(pdir),cast_fp(end_point),c,V_array);
Fvector _tri[3];

CDB::TRI* _t = T_array + Res->id;
CDB::TRI* _t = T_array + Res.id;

_tri[0] = V_array[_t->verts[0]];
_tri[1] = V_array[_t->verts[1]];
Expand Down
22 changes: 10 additions & 12 deletions src/xrPhysics/PHSimpleCharacter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -924,24 +924,22 @@ bool CPHSimpleCharacter::ValidateWalkOnMesh()
#endif

// if(XRC.r_end()!=XRC.r_begin()) return false;
CDB::RESULT* R_begin = XRC.r_begin();
CDB::RESULT* R_end = XRC.r_end();
for (CDB::RESULT* Res = R_begin; Res != R_end; ++Res)
for (auto &Res : *XRC.r_get())
{
SGameMtl* m = GMLibrary().GetMaterialByIdx(Res->material);
SGameMtl* m = GMLibrary().GetMaterialByIdx(Res.material);
if (m->Flags.test(SGameMtl::flPassable))
continue;
// CDB::TRI* T = T_array + Res->id;
Point vertices[3] = {
Point((dReal*)&Res->verts[0]), Point((dReal*)&Res->verts[1]), Point((dReal*)&Res->verts[2])};
Point((dReal*)&Res.verts[0]), Point((dReal*)&Res.verts[1]), Point((dReal*)&Res.verts[2])};
if (__aabb_tri(Point((float*)&center_forbid), Point((float*)&AABB_forbid), vertices))
{
if (test_sides(center_forbid, sd_dir, accel, obb_fb, Res->id))
if (test_sides(center_forbid, sd_dir, accel, obb_fb, Res.id))
{
#ifdef DEBUG
if (debug_output().ph_dbg_draw_mask().test(phDbgCharacterControl))
{
debug_output().DBG_DrawTri(Res, color_xrgb(255, 0, 0));
debug_output().DBG_DrawTri(&Res, color_xrgb(255, 0, 0));
}
#endif
b_side_contact = true;
Expand All @@ -956,22 +954,22 @@ bool CPHSimpleCharacter::ValidateWalkOnMesh()
}
}

for (CDB::RESULT* Res = R_begin; Res != R_end; ++Res)
for (auto &Res : *XRC.r_get())
{
// CDB::TRI* T = T_array + Res->id;
SGameMtl* m = GMLibrary().GetMaterialByIdx(Res->material);
SGameMtl* m = GMLibrary().GetMaterialByIdx(Res.material);
if (m->Flags.test(SGameMtl::flPassable))
continue;
Point vertices[3] = {
Point((dReal*)&Res->verts[0]), Point((dReal*)&Res->verts[1]), Point((dReal*)&Res->verts[2])};
Point((dReal*)&Res.verts[0]), Point((dReal*)&Res.verts[1]), Point((dReal*)&Res.verts[2])};
if (__aabb_tri(Point((float*)&center), Point((float*)&AABB), vertices))
{
if (test_sides(center, sd_dir, accel, obb, Res->id))
if (test_sides(center, sd_dir, accel, obb, Res.id))
{
#ifdef DEBUG
if (debug_output().ph_dbg_draw_mask().test(phDbgCharacterControl))
{
debug_output().DBG_DrawTri(Res, color_xrgb(0, 255, 0));
debug_output().DBG_DrawTri(&Res, color_xrgb(0, 255, 0));
}
#endif
return true;
Expand Down
11 changes: 4 additions & 7 deletions src/xrPhysics/tri-colliderknoopc/dSortTriPrimitive.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,18 +95,15 @@ IC int dcTriListCollider::dSortTriPrimitiveCollide(
// VERIFY( g_pGameLevel );
XRC.box_query(inl_ph_world().ObjectSpace().GetStaticModel(), cast_fv(p), aabb);

CDB::RESULT* R_begin = XRC.r_begin();
CDB::RESULT* R_end = XRC.r_end();
#ifdef DEBUG

debug_output().dbg_total_saved_tries() -= data->cashed_tries.size();
debug_output().dbg_new_queries_per_step()++;
#endif
data->cashed_tries.clear_not_free();
for (CDB::RESULT* Res = R_begin; Res != R_end; ++Res)
{
data->cashed_tries.push_back(Res->id);
}

for (auto &Res : *XRC.r_get())
data->cashed_tries.push_back(Res.id);

#ifdef DEBUG
debug_output().dbg_total_saved_tries() += data->cashed_tries.size();
#endif
Expand Down

0 comments on commit 45f50b9

Please sign in to comment.