BGE: LoD Hysteresis clean up

Move scene hysteresis value to KX_Scene where it should be (instead of
KX_GameObject)
This commit is contained in:
Jorge Bernal 2015-03-23 18:57:19 +01:00
parent f65e3c7f1b
commit ddf58004c4
5 changed files with 25 additions and 26 deletions

View File

@ -1556,7 +1556,7 @@ static KX_GameObject *gameobject_from_blenderobject(
}
if (blenderscene->gm.lodflag & SCE_LOD_USE_HYST) {
kxscene->SetLodHysteresis(true);
gameobj->SetLodHysteresisValue(blenderscene->gm.scehysteresis);
kxscene->SetLodHysteresisValue(blenderscene->gm.scehysteresis);
}
}

View File

@ -93,7 +93,6 @@ KX_GameObject::KX_GameObject(
m_layer(0),
m_currentLodLevel(0),
m_previousLodLevel(0),
m_lodHysteresis(0),
m_pBlenderObject(NULL),
m_pBlenderGroupObject(NULL),
m_bSuspendDynamics(false),
@ -786,11 +785,6 @@ void KX_GameObject::AddLodMesh(RAS_MeshObject* mesh)
m_lodmeshes.push_back(mesh);
}
void KX_GameObject::SetLodHysteresisValue(int hysteresis)
{
m_lodHysteresis = hysteresis;
}
void KX_GameObject::UpdateLod(MT_Vector3 &cam_pos)
{
// Handle dupligroups
@ -811,20 +805,20 @@ void KX_GameObject::UpdateLod(MT_Vector3 &cam_pos)
int level = 0;
Object *bob = this->GetBlenderObject();
LodLevel *lod = (LodLevel*) bob->lodlevels.first;
KX_Scene *sce = this->GetScene();
KX_Scene *kxscene = this->GetScene();
for (; lod; lod = lod->next, level++) {
if (!lod->source || lod->source->type != OB_MESH) level--;
if (!lod->next) break;
if (level == (this->m_previousLodLevel) || (level == (this->m_previousLodLevel + 1))) {
short hysteresis = 0;
if (sce->IsActivedLodHysteresis()) {
if (kxscene->IsActivedLodHysteresis()) {
// if exists, LoD level hysteresis will override scene hysteresis
if (lod->next->flags & OB_LOD_USE_HYST) {
hysteresis = lod->next->obhysteresis;
}
else if (this->m_lodHysteresis != 0) {
hysteresis = m_lodHysteresis;
else {
hysteresis = kxscene->GetLodHysteresisValue();
}
}
float hystvariance = MT_abs(lod->next->distance - lod->distance) * hysteresis / 100;
@ -833,13 +827,13 @@ void KX_GameObject::UpdateLod(MT_Vector3 &cam_pos)
}
else if (level == (this->m_previousLodLevel - 1)) {
short hysteresis = 0;
if (sce->IsActivedLodHysteresis()) {
if (kxscene->IsActivedLodHysteresis()) {
// if exists, LoD level hysteresis will override scene hysteresis
if (lod->next->flags & OB_LOD_USE_HYST) {
hysteresis = lod->next->obhysteresis;
}
else if (this->m_lodHysteresis != 0) {
hysteresis = m_lodHysteresis;
else {
hysteresis = kxscene->GetLodHysteresisValue();
}
}
float hystvariance = MT_abs(lod->next->distance - lod->distance) * hysteresis / 100;

View File

@ -91,7 +91,6 @@ protected:
std::vector<RAS_MeshObject*> m_lodmeshes;
int m_currentLodLevel;
short m_previousLodLevel;
int m_lodHysteresis;
SG_QList m_meshSlots; // head of mesh slots of this
struct Object* m_pBlenderObject;
struct Object* m_pBlenderGroupObject;
@ -806,14 +805,6 @@ public:
RAS_MeshObject* mesh
);
/**
* Set lod hysteresis value
*/
void
SetLodHysteresisValue(
int hysteresis
);
/**
* Updates the current lod level based on distance from camera.
*/

View File

@ -157,7 +157,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_active_camera(NULL),
m_ueberExecutionPriority(0),
m_blenderScene(scene),
m_isActivedHysteresis(false)
m_isActivedHysteresis(false),
m_lodHysteresisValue(0)
{
m_suspendedtime = 0.0;
m_suspendeddelta = 0.0;
@ -1774,6 +1775,16 @@ bool KX_Scene::IsActivedLodHysteresis(void)
return m_isActivedHysteresis;
}
void KX_Scene::SetLodHysteresisValue(int hysteresisvalue)
{
m_lodHysteresisValue = hysteresisvalue;
}
int KX_Scene::GetLodHysteresisValue(void)
{
return m_lodHysteresisValue;
}
void KX_Scene::UpdateObjectActivity(void)
{
if (m_activity_culling) {

View File

@ -296,9 +296,10 @@ protected:
KX_ObstacleSimulation* m_obstacleSimulation;
/**
* Does this scene active the LoD Hysteresis?
* LOD Hysteresis settings
*/
bool m_isActivedHysteresis;
int m_lodHysteresisValue;
public:
KX_Scene(class SCA_IInputDevice* keyboarddevice,
@ -552,9 +553,11 @@ public:
// Update the mesh for objects based on level of detail settings
void UpdateObjectLods(void);
// Enable/disable LoD Hysteresis
// LoD Hysteresis functions
void SetLodHysteresis(bool active);
bool IsActivedLodHysteresis();
void SetLodHysteresisValue(int hysteresisvalue);
int GetLodHysteresisValue();
// Update the activity box settings for objects in this scene, if needed.
void UpdateObjectActivity(void);