blob: 630e3192f0487eb036456849c87b359e4a4c2ae1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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();
}
|