summaryrefslogtreecommitdiff
path: root/Runtime/Filters/Mesh/LodMeshFilter.cpp
blob: 512f15396a18390143f4f42dccd3ef4231430643 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "UnityPrefix.h"
#include "LodMeshFilter.h"
#include "LodMesh.h"
#include "MeshRenderer.h"
#include "Runtime/Filters/Particles/MeshParticleEmitter.h"
#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
#include "Runtime/Serialize/TransferFunctions/TransferNameConversions.h"

MeshFilter::MeshFilter (MemLabelId label, ObjectCreationMode mode)
:	Super(label, mode)
{
	m_Mesh = NULL;
}

MeshFilter::~MeshFilter ()
{
}

void MeshFilter::OnDidAddMesh ()
{
	AssignMeshToRenderer ();
}

void MeshFilter::AssignMeshToRenderer ()
{
	if (GetGameObjectPtr())
	{
		MeshRenderer* renderer = QueryComponent(MeshRenderer);
		if (renderer && renderer->GetSharedMesh() != m_Mesh)
			renderer->SetSharedMesh(m_Mesh);	

		MeshParticleEmitter* emitter = QueryComponent(MeshParticleEmitter);
		if (emitter && emitter->GetMesh() != m_Mesh)
			emitter->SetMesh(m_Mesh);	
	}
}

void MeshFilter::SetSharedMesh (PPtr<Mesh> mesh)
{
	m_Mesh = mesh;

	MeshRenderer* renderer = QueryComponent(MeshRenderer);
	if (renderer)
		renderer->SetSharedMesh(m_Mesh);	

	MeshParticleEmitter* emitter = QueryComponent(MeshParticleEmitter);
	if (emitter)
		emitter->SetMesh(m_Mesh);	

	SetDirty ();
}

PPtr<Mesh> MeshFilter::GetSharedMesh ()
{
	return m_Mesh;
}

Mesh* MeshFilter::GetInstantiatedMesh ()
{
	Mesh* instantiated = &Mesh::GetInstantiatedMesh (m_Mesh, *this);
	if (PPtr<Mesh> (instantiated) != m_Mesh)
	{
		SetSharedMesh(instantiated);
	}

	return instantiated;
}

void MeshFilter::SetInstantiatedMesh (Mesh* mesh)
{
	SetSharedMesh(mesh);
}

IMPLEMENT_CLASS_HAS_INIT (MeshFilter)
IMPLEMENT_OBJECT_SERIALIZE (MeshFilter)

template<class TransferFunction> inline
void MeshFilter::Transfer (TransferFunction& transfer)
{
	Super::Transfer (transfer);
	transfer.Transfer (m_Mesh, "m_Mesh", kSimpleEditorMask);
}

void MeshFilter::InitializeClass ()
{
	RegisterAllowNameConversion(GetClassStringStatic(), "m_LodMesh", "m_Mesh");
	RegisterAllowTypeNameConversion ("PPtr<LodMesh>", "PPtr<Mesh>");
	
	REGISTER_MESSAGE_VOID(MeshFilter, kDidAddComponent, OnDidAddMesh);
}

void MeshFilter::AwakeFromLoad (AwakeFromLoadMode awakeMode)
{
	Super::AwakeFromLoad (awakeMode);
	AssignMeshToRenderer ();
}