Hiding is now detach from scene tree

This commit is contained in:
lawnjelly 2019-10-08 16:17:07 +01:00 committed by GitHub
parent aa10d540cc
commit 5da7be42e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 199 additions and 77 deletions

View File

@ -6,7 +6,7 @@ namespace Lawn
int LDebug::m_iLoggingLevel = 0; // 2
int LDebug::m_iWarningLevel = 0;
int LDebug::m_iTabDepth = 0;
bool LDebug::m_bRunning = false;
bool LDebug::m_bRunning = true;
void LDebug::print(String sz)

105
ldob.cpp
View File

@ -24,8 +24,67 @@
#include "ldob.h"
#include "scene/3d/mesh_instance.h"
#include "scene/3d/light.h"
void LHidable::Hidable_Create(Node * pNode)
{
// m_pNode = 0; m_pParent = 0; m_bShow = true;
m_pNode = pNode;
m_pParent = m_pNode->get_parent();
m_bShow = true;
}
void LHidable::Show(bool bShow)
{
// noop
if (bShow == m_bShow)
return;
// new state
m_bShow = bShow;
assert (m_pParent);
if (bShow)
{
// add to tree
m_pParent->add_child(m_pNode);
}
else
{
// remove from tree
m_pParent->remove_child(m_pNode);
}
}
/////////////////////////////////////////////////////////////////////
void LLight::SetDefaults()
{
m_GodotID = 0;
m_eType = LT_DIRECTIONAL;
m_fSpread = 0.0f; // for spotlight
m_fMaxDist = 100.0f;
m_RoomID = -1;
m_FirstCaster = 0;
m_NumCasters = 0;
}
Light * LLight::GetGodotLight()
{
Object * pObj = ObjectDB::get_instance(m_GodotID);
Light * p = Object::cast_to<Light>(pObj);
return p;
}
/////////////////////////////////////////////////////////////////////
Spatial * LSob::GetSpatial() const
{
Object * pObj = ObjectDB::get_instance(m_ID);
@ -60,30 +119,52 @@ VisualInstance * LSob::GetVI() const
}
/*
void LSob::Show(bool bShow)
{
// noop
if (bShow == m_bShow)
return;
// new state
m_bShow = bShow;
Spatial * pS = GetSpatial();
if (!pS)
return;
// noop
if (pS->is_visible() == bShow)
return;
assert (m_pParent);
if (bShow)
pS->show();
else
pS->hide();
GeometryInstance * pGI = Object::cast_to<GeometryInstance>(pS);
if (pGI)
{
// godot visible bug workaround
pGI->set_extra_cull_margin(0.0f);
// add to tree
m_pParent->add_child(m_pNode);
}
else
{
// remove from tree
m_pParent->remove_child(m_pNode);
}
}
// noop
// if (pS->is_visible() == bShow)
// return;
// if (bShow)
// pS->show();
// else
// pS->hide();
// GeometryInstance * pGI = Object::cast_to<GeometryInstance>(pS);
// if (pGI)
// {
// // godot visible bug workaround
// pGI->set_extra_cull_margin(0.0f);
// }
}
*/
Spatial * LDob::GetSpatial() const

49
ldob.h
View File

@ -28,19 +28,33 @@
#include "scene/3d/spatial.h"
class VisualInstance;
class Light;
class LHidable
{
public:
void Hidable_Create(Node * pNode);
void Show(bool bShow);
// new .. can be separated from the scene tree to cull
Node * m_pNode;
Node * m_pParent;
// separate flag so we don't have to touch the godot lookup
bool m_bShow;
};
// static object
class LSob
class LSob : public LHidable
{
public:
Spatial * GetSpatial() const;
VisualInstance * GetVI() const;
void Show(bool bShow);
//void Show(bool bShow);
bool IsShadowCaster() const;
ObjectID m_ID; // godot object
AABB m_aabb; // world space
//bool m_bSOBVisible;
};
// dynamic object
@ -55,3 +69,32 @@ public:
bool m_bVisible;
float m_fRadius;
};
class LLight : public LHidable
{
public:
enum eLightType
{
LT_DIRECTIONAL,
LT_SPOTLIGHT,
LT_OMNI,
};
void SetDefaults();
Light * GetGodotLight();
bool IsGlobal() const {return m_RoomID == -1;}
Vector3 m_ptDir;
Vector3 m_ptPos;
ObjectID m_GodotID;
eLightType m_eType;
float m_fSpread; // for spotlight
float m_fMaxDist; // shadow distance not light distance
// source room
int m_RoomID; // or -1 for global lights
// shadow casters
int m_FirstCaster;
int m_NumCasters;
};

View File

@ -23,27 +23,6 @@
#include "lroom.h"
#include "ldebug.h"
#include "lroom_manager.h"
#include "scene/3d/light.h"
void LLight::SetDefaults()
{
m_GodotID = 0;
m_eType = LT_DIRECTIONAL;
m_fSpread = 0.0f; // for spotlight
m_fMaxDist = 100.0f;
m_RoomID = -1;
m_FirstCaster = 0;
m_NumCasters = 0;
}
Light * LLight::GetGodotLight()
{
Object * pObj = ObjectDB::get_instance(m_GodotID);
Light * p = Object::cast_to<Light>(pObj);
return p;
}

View File

@ -35,33 +35,6 @@ class LRoomManager;
class Light;
class LLight
{
public:
enum eLightType
{
LT_DIRECTIONAL,
LT_SPOTLIGHT,
LT_OMNI,
};
void SetDefaults();
Light * GetGodotLight();
bool IsGlobal() const {return m_RoomID == -1;}
Vector3 m_ptDir;
Vector3 m_ptPos;
ObjectID m_GodotID;
eLightType m_eType;
float m_fSpread; // for spotlight
float m_fMaxDist; // shadow distance not light distance
// source room
int m_RoomID; // or -1 for global lights
// shadow casters
int m_FirstCaster;
int m_NumCasters;
};
class LPortal {

View File

@ -198,7 +198,7 @@ void LRoom::SoftShow(VisualInstance * pVI, uint32_t show_flags)
// naive version, adds all the non visible objects in visible rooms as shadow casters
void LRoom::AddShadowCasters(LRoomManager &manager)
{
LPRINT(2, "ADDSHADOWCASTERS room " + get_name() + ", " + itos(m_iNumShadowCasters_SOB) + " shadow casters");
LPRINT_RUN(2, "ADDSHADOWCASTERS room " + get_name() + ", " + itos(m_iNumShadowCasters_SOB) + " shadow casters");
// add all the active lights in this room
for (int n=0; n<m_LocalLights.size(); n++)
@ -219,7 +219,7 @@ void LRoom::AddShadowCasters(LRoomManager &manager)
// only add to the caster list if not in it already (does this check need to happen, can this ever occur?)
if (!manager.m_BF_caster_SOBs.GetBit(sobID))
{
//LPRINT(2, "\t" + itos(sobID) + ", " + manager.m_SOBs[sobID].GetSpatial()->get_name());
LPRINT_RUN(2, "\t" + itos(sobID) + ", " + manager.m_SOBs[sobID].GetSpatial()->get_name());
manager.m_BF_caster_SOBs.SetBit(sobID, true);
manager.m_CasterList_SOBs.push_back(sobID);
}
@ -363,7 +363,7 @@ void LRoom::Room_MakeVisible(bool bVisible)
//}
// show godot room and all linked dobs and all sobs
void LRoom::Debug_ShowAll()
void LRoom::Debug_ShowAll(bool bActive)
{
Room_MakeVisible(true);
@ -374,6 +374,12 @@ void LRoom::Debug_ShowAll()
// Spatial * pS = sob.GetSpatial();
// if (pS)
// pS->show();
// VisualInstance * pVI = sob.GetVI();
// if (pVI)
// {
// SoftShow(pVI, LRoom::LAYER_MASK_CAMERA | LRoom::LAYER_MASK_LIGHT);
// }
// }
}

View File

@ -112,7 +112,7 @@ public:
// void Hide_All();
// show godot room and all linked dobs and all sobs
void Debug_ShowAll();
void Debug_ShowAll(bool bActive);
// hide all the objects not hit on this frame .. instead of calling godot hide without need
// (it might be expensive)

View File

@ -182,6 +182,7 @@ void LRoomConverter::Convert_Room_FindObjects_Recursive(Node * pParent, LRoom &l
LSob sob;
sob.m_ID = pVI->get_instance_id();
sob.m_aabb = bb;
sob.Hidable_Create(pChild);
//lroom.m_SOBs.push_back(sob);
LRoom_PushBackSOB(lroom, sob);
@ -345,6 +346,15 @@ void LRoomConverter::Convert_HideAll()
LSob &sob = LMAN->m_SOBs[n];
sob.Show(false);
}
// hide all lights that are non global
for (int n=0; n<LMAN->m_Lights.size(); n++)
{
LLight &light = LMAN->m_Lights[n];
if (!light.IsGlobal())
light.Show(false);
}
}
void LRoomConverter::Convert_Lights()

View File

@ -480,6 +480,7 @@ bool LRoomManager::LightCreate(Light * pLight, int roomID)
// create new light
LLight l;
l.SetDefaults();
l.Hidable_Create(pLight);
l.m_GodotID = pLight->get_instance_id();
// direction
@ -535,7 +536,10 @@ bool LRoomManager::LightCreate(Light * pLight, int roomID)
// turn the local light off to start with
if (!l.IsGlobal())
pLight->hide();
{
// l.Show(false);
//pLight->hide();
}
m_Lights.push_back(l);
@ -688,10 +692,33 @@ void LRoomManager::rooms_set_active(bool bActive)
for (int n=0; n<m_Rooms.size(); n++)
{
LRoom &lroom = m_Rooms[n];
lroom.Debug_ShowAll();
lroom.Debug_ShowAll(bActive);
}
for (int n=0; n<m_SOBs.size(); n++)
{
LSob &sob = m_SOBs[n];
Spatial * pS = sob.GetSpatial();
if (pS)
if (!bActive)
pS->show();
else
pS->hide();
VisualInstance * pVI = sob.GetVI();
if (pVI)
{
uint32_t mask = 0;
if (!bActive)
{
mask = LRoom::LAYER_MASK_CAMERA | LRoom::LAYER_MASK_LIGHT;
}
LRoom::SoftShow(pVI, mask);
}
}
}
void LRoomManager::rooms_set_logging(int level)
@ -1015,11 +1042,13 @@ void LRoomManager::FrameUpdate_FinalizeVisibility_SoftShow()
if (!m_BF_ActiveLights_prev.GetBit(lid))
{
LLight &light = m_Lights[lid];
light.Show(true);
Light * pLight = light.GetGodotLight();
if (pLight)
{
//Lawn::LDebug::print("Showing light " + itos (n));
pLight->show();
//pLight->show();
// FIX GODOT BUG - light cull mask is not preserved when hiding and showing
// set culling flag for light
@ -1038,12 +1067,13 @@ void LRoomManager::FrameUpdate_FinalizeVisibility_SoftShow()
if (!m_BF_ActiveLights.GetBit(lid))
{
LLight &light = m_Lights[lid];
Light * pLight = light.GetGodotLight();
if (pLight)
{
//Lawn::LDebug::print("Hiding light " + itos (n));
pLight->hide();
}
light.Show(false);
// Light * pLight = light.GetGodotLight();
// if (pLight)
// {
// //Lawn::LDebug::print("Hiding light " + itos (n));
// pLight->hide();
// }
}
}