summaryrefslogtreecommitdiff
path: root/Runtime/Camera/SceneSettings.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Camera/SceneSettings.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Camera/SceneSettings.cpp')
-rw-r--r--Runtime/Camera/SceneSettings.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/Runtime/Camera/SceneSettings.cpp b/Runtime/Camera/SceneSettings.cpp
new file mode 100644
index 0000000..9ee2d9d
--- /dev/null
+++ b/Runtime/Camera/SceneSettings.cpp
@@ -0,0 +1,140 @@
+#include "UnityPrefix.h"
+#include "SceneSettings.h"
+#include "UnityScene.h"
+#include "Runtime/Camera/OcclusionPortal.h"
+#include "Runtime/Filters/Renderer.h"
+#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
+#include "Runtime/BaseClasses/ManagerContext.h"
+#include "Runtime/Misc/BuildSettings.h"
+#include "UmbraBackwardsCompatibility.h"
+
+SceneSettings::SceneSettings (MemLabelId label, ObjectCreationMode mode)
+: Super(label, mode)
+{
+}
+
+SceneSettings::~SceneSettings ()
+{
+ if (GetScene().GetUmbraTome () == m_UmbraTome)
+ InvalidatePVSOnScene();
+
+ Cleanup();
+}
+
+void SceneSettings::InitializeClass ()
+{
+ Scene::InitializeClass();
+}
+
+void SceneSettings::CleanupClass ()
+{
+ Scene::CleanupClass();
+}
+
+void SceneSettings::Cleanup ()
+{
+ CleanupUmbraTomeData(m_UmbraTome);
+}
+
+void SceneSettings::AwakeFromLoad (AwakeFromLoadMode awakeMode)
+{
+ Super::AwakeFromLoad(awakeMode);
+
+ InvalidatePVSOnScene();
+}
+
+int SceneSettings::GetUmbraTotalDataSize() const
+{
+ return m_UmbraTome.tome ? m_UmbraTome.tome->getStatistic(Umbra::Tome::STAT_TOTAL_DATA_SIZE) : 0;
+}
+
+int SceneSettings::GetPortalDataSize() const
+{
+ return m_UmbraTome.tome ? m_UmbraTome.tome->getStatistic(Umbra::Tome::STAT_PORTAL_DATA_SIZE) : 0;
+}
+
+void SceneSettings::InvalidatePVSOnScene ()
+{
+ GetScene().CleanupPVSAndRequestRebuild();
+}
+
+template<class TransferFunction> inline
+void SceneSettings::Transfer (TransferFunction& transfer)
+{
+ Super::Transfer (transfer);
+
+ dynamic_array<UInt8> tempPVSData;
+ if (transfer.IsWriting () && m_UmbraTome.tome != NULL)
+ {
+ UInt8* tomeData = (UInt8*)(m_UmbraTome.tome);
+ tempPVSData.assign(tomeData, tomeData + UMBRA_TOME_METHOD(m_UmbraTome, getSize()));
+
+ // Strip tomeData when building player data
+// if (transfer.IsWritingGameReleaseData())
+// {
+// Umbra::Tome* tempTomeData = (Umbra::Tome*)tempPVSData.begin();
+// Umbra::Tome::stripDebugInfo(tempTomeData);
+// tempPVSData.resize_uninitialized(tempTomeData->getSize());
+// }
+ }
+
+ ///@TODO: make a fast path for loading tome data when we know that the data version matches. (Just alllocate&read tome data directly...)
+ transfer.Transfer(tempPVSData, "m_PVSData");
+
+ if (transfer.DidReadLastProperty ())
+ {
+ Cleanup();
+
+ // In free editor don't load occlusion data since there is no way to clear or rebake it.
+ if (GetBuildSettings().hasPROVersion && !tempPVSData.empty())
+ m_UmbraTome = LoadUmbraTome(tempPVSData.begin(), tempPVSData.size());
+ }
+
+ TRANSFER(m_PVSObjectsArray);
+ TRANSFER(m_PVSPortalsArray);
+
+ TRANSFER_EDITOR_ONLY(m_OcclusionBakeSettings);
+}
+
+template<class TransferFunction> inline
+void OcclusionBakeSettings::Transfer (TransferFunction& transfer)
+{
+ TRANSFER(smallestOccluder);
+ TRANSFER(smallestHole);
+ TRANSFER(backfaceThreshold);
+}
+
+
+/*
+ CheckConsistency...
+
+void ComputationParameterGUIChange()
+{
+ m_SmallestOccluder = Mathf.Max(m_SmallestOccluder, 0.1F);
+ StaticOcclusionCullingVisualization.smallestOccluder = m_SmallestOccluder;
+
+ m_SmallestHole = Mathf.Max(m_SmallestHole, 0.001F);
+ m_SmallestHole = Mathf.Min(m_SmallestHole, m_SmallestOccluder);
+ StaticOcclusionCullingVisualization.smallestHole = m_SmallestHole;
+*/
+
+void SceneSettings::SetUmbraTome(const dynamic_array<PPtr<Renderer> >& pvsObjectsArray, const dynamic_array<PPtr<OcclusionPortal> >& portalArray, const UInt8* visibilitybuffer, int size)
+{
+ InvalidatePVSOnScene();
+ Cleanup();
+
+ m_PVSObjectsArray = pvsObjectsArray;
+ m_PVSPortalsArray = portalArray;
+ if (size != 0)
+ m_UmbraTome.tome = Umbra::TomeLoader::loadFromBuffer(visibilitybuffer, size);
+ else
+ m_UmbraTome = UmbraTomeData();
+
+ SetDirty();
+}
+
+
+GET_MANAGER(SceneSettings)
+
+IMPLEMENT_CLASS_HAS_INIT (SceneSettings)
+IMPLEMENT_OBJECT_SERIALIZE (SceneSettings)