Если бы всё это было артефактами...
collide::ray_defs RD(
pActor->Position(), pActor->Direction(),
100,
CDB::OPT_CULL, collide::rqtBoth);
if (g_pGameLevel->ObjectSpace.RayQuery(RQR, pActor->collidable.model,RD))
{
collide::rq_result* R = RQR.r_begin();
if (R && R->O)
Msg("RQR.r_begin() [%s]",R->O->cName().c_str());
}
collide::ray_defs RD(
pActor->Position(), pActor->Direction(),
100,
CDB::OPT_CULL, collide::rqtBoth);
...
void CCameraManager::UpdateCamEffectors()
{
if (m_EffectorsCam.empty())
return;
auto r_it = m_EffectorsCam.rbegin();
while (r_it != m_EffectorsCam.rend())
{
if (ProcessCameraEffector(*r_it))
++r_it;
else
{
// Dereferencing reverse iterator returns previous element of the list, r_it.base() returns current element
// So, we should use base()-1 iterator to delete just processed element. 'Previous' element would be
// automatically changed after deletion, so r_it would dereferencing to another value, no need to change it
OnEffectorReleased(*r_it);
auto r_to_del = r_it.base();
m_EffectorsCam.erase(--r_to_del);
}
}
m_cam_info.d.normalize();
m_cam_info.n.normalize();
m_cam_info.r.crossproduct(m_cam_info.n, m_cam_info.d);
m_cam_info.n.crossproduct(m_cam_info.d, m_cam_info.r);
}
auto r_it = m_EffectorsCam.rbegin();
auto r_to_del = r_it.base();
CFrustum Frustum;
Frustum.CreateFromMatrix(Device.mFullTransform, FRUSTUM_P_LRTB | FRUSTUM_P_NEAR);
xr_vector<ISpatial*> spatials;
g_SpatialSpace->q_frustum(spatials, 0, STYPE_COLLIDEABLE, Frustum);
строку
auto r_it = m_EffectorsCam.rbegin();
заменил на
EffectorCamVec::reverse_iterator r_it = m_EffectorsCam.rbegin();
подобный код был в файле до правки
auto r_to_del = r_it.base();
class CCC_ENV1 : public CCC_Vector3
{
public:
CCC_ENV1(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().CurrentEnv.ambient.set(v);
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
void xrRender_initconsole ()
...
tw_min.set(0,0,0);
tw_max.set(1,1,1);
CMD4( CCC_ENV1, "env_ambient_color", &ps_env_ambient_color, tw_min, tw_max );
...
extern ECORE_API Fvector ps_env_ambient_color;
extern ECORE_API Fvector ps_env_clouds_color;
extern ECORE_API Fvector ps_env_fog_color;
extern ECORE_API Fvector ps_env_hemi_color;
extern ECORE_API Fvector ps_env_rain_color;
extern ECORE_API Fvector ps_env_sky_color;
extern ECORE_API Fvector ps_env_sun_color;
...
#include "../IGame_Persistent.h"
#include "../Environment.h"
...
// Common
Fvector ps_env_ambient_color = { 0.f, 0.f, 0.f};
Fvector ps_env_clouds_color = { 0.f, 0.f, 0.f};
Fvector ps_env_fog_color = { 0.f, 0.f, 0.f};
Fvector ps_env_hemi_color = { 0.f, 0.f, 0.f};
Fvector ps_env_rain_color = { 0.f, 0.f, 0.f};
Fvector ps_env_sky_color = { 0.f, 0.f, 0.f};
Fvector ps_env_sun_color = { 0.f, 0.f, 0.f};
...
class CCC_ENV1 : public CCC_Vector3
{
public:
CCC_ENV1(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
// old, work only in game pause
//g_pGamePersistent->Environment().CurrentEnv.ambient.set(v);
g_pGamePersistent->Environment().Current[0]->ambient = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
class CCC_ENV2 : public CCC_Vector3
{
public:
CCC_ENV2(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector4 v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->clouds_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
class CCC_ENV3 : public CCC_Vector3
{
public:
CCC_ENV3(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->fog_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
class CCC_ENV4 : public CCC_Vector3
{
public:
CCC_ENV4(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector4 v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->hemi_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
class CCC_ENV5 : public CCC_Vector3
{
public:
CCC_ENV5(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->rain_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
class CCC_ENV6 : public CCC_Vector3
{
public:
CCC_ENV6(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->sky_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
class CCC_ENV7 : public CCC_Vector3
{
public:
CCC_ENV7(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}
virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->sun_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}
};
...
void xrRender_initconsole()
...
CMD4( CCC_ENV1, "env_ambient_color", &ps_env_ambient_color, tw_min, tw_max );
CMD4( CCC_ENV2, "env_clouds_color", &ps_env_clouds_color, tw_min, tw_max );
CMD4( CCC_ENV3, "env_fog_color", &ps_env_fog_color, tw_min, tw_max );
CMD4( CCC_ENV4, "env_hemi_color", &ps_env_hemi_color, tw_min, tw_max );
CMD4( CCC_ENV5, "env_rain_color", &ps_env_rain_color, tw_min, tw_max );
CMD4( CCC_ENV6, "env_sky_color", &ps_env_sky_color, tw_min, tw_max );
CMD4( CCC_ENV7, "env_sun_color", &ps_env_sun_color, tw_min, tw_max );
...