summaryrefslogtreecommitdiff
path: root/Runtime/Terrain/Tree.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/Terrain/Tree.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Terrain/Tree.cpp')
-rw-r--r--Runtime/Terrain/Tree.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/Runtime/Terrain/Tree.cpp b/Runtime/Terrain/Tree.cpp
new file mode 100644
index 0000000..630e319
--- /dev/null
+++ b/Runtime/Terrain/Tree.cpp
@@ -0,0 +1,78 @@
+#include "UnityPrefix.h"
+#include "Tree.h"
+#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
+#include "Runtime/Input/TimeManager.h"
+#include "Runtime/Shaders/MaterialProperties.h"
+#include "Runtime/Filters/Mesh/MeshRenderer.h"
+#include "External/shaderlab/Library/FastPropertyName.h"
+#include "Wind.h"
+#include "Runtime/Mono/MonoBehaviour.h"
+#include "Runtime/BaseClasses/SupportedMessageOptimization.h"
+
+IMPLEMENT_CLASS_HAS_INIT(Tree)
+IMPLEMENT_OBJECT_SERIALIZE(Tree)
+
+SHADERPROP(Wind);
+
+Tree::Tree(MemLabelId label, ObjectCreationMode mode)
+: Super(label, mode)
+{
+}
+
+Tree::~Tree()
+{
+}
+
+void Tree::InitializeClass ()
+{
+ REGISTER_MESSAGE_VOID (Tree, kOnWillRenderObject, OnWillRenderObject);
+}
+
+UInt32 Tree::CalculateSupportedMessages ()
+{
+ return kHasOnWillRenderObject;
+}
+
+
+template<class TransferFunc>
+void Tree::Transfer (TransferFunc& transfer)
+{
+ Super::Transfer(transfer);
+ TRANSFER_EDITOR_ONLY(m_TreeData);
+}
+
+void Tree::SetTreeData (PPtr<MonoBehaviour> tree)
+{
+ #if UNITY_EDITOR
+ m_TreeData = tree;
+ SetDirty();
+ #endif
+}
+
+PPtr<MonoBehaviour> Tree::GetTreeData ()
+{
+ #if UNITY_EDITOR
+ return m_TreeData;
+ #else
+ return NULL;
+ #endif
+}
+
+void Tree::OnWillRenderObject()
+{
+ MeshRenderer* renderer = QueryComponent(MeshRenderer);
+ if (renderer == NULL)
+ return;
+
+ AABB bounds;
+ renderer->GetWorldAABB(bounds);
+
+ // Compute wind factor from wind zones
+ Vector4f wind = WindManager::GetInstance().ComputeWindForce(bounds);
+
+ // Apply material property block
+ MaterialPropertyBlock& block = renderer->GetPropertyBlockRememberToUpdateHash ();
+ block.Clear();
+ block.AddPropertyVector(kSLPropWind, wind);
+ renderer->ComputeCustomPropertiesHash();
+}