summaryrefslogtreecommitdiff
path: root/Runtime/Terrain/Tree.cpp
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();
}