Cogs.Core
FollowComponent.cpp
1#include "FollowComponent.h"
2
3#include "Types.h"
4
5#include "Components/Core/TransformComponent.h"
6
7#include <glm/gtc/quaternion.hpp>
8
9using namespace Cogs::Reflection;
10
11void Cogs::Core::FollowComponent::registerType()
12{
13 Field fields [] = {
14 Field(Name("target"), &FollowComponent::target),
15 Field(Name("offset"), &FollowComponent::offset),
16 };
17
18 Method methods [] = {
19 Method(Name("update"), &FollowComponent::update),
20 Method(Name("initialize"), &FollowComponent::initialize),
21 Method(Name("cleanup"), &FollowComponent::cleanup),
22 };
23
24 DynamicComponent::registerDerivedType<FollowComponent>().setFields(fields).setMethods(methods);
25}
26
27void Cogs::Core::FollowComponent::initialize(Context * /*context*/)
28{
29 if (target) {
30 update();
31 }
32}
33
34void Cogs::Core::FollowComponent::update()
35{
36 auto transform = getComponent<TransformComponent>();
37
38 static float time = 0;
39
40 time += 0.1f;
41
42 if (target) {
43 auto targetTransform = target->getComponent<TransformComponent>();
44
45 if (!targetTransform) return;
46
47 transform->position = targetTransform->position +
48 glm::vec3(glm::mat4_cast(targetTransform->rotation) * glm::vec4(offset + glm::vec3(0, std::sin(time) * 10.0f, 0), 1.0f));
49
50 transform->setChanged();
51 }
52}
53
54void Cogs::Core::FollowComponent::cleanup(Context * /*context*/)
55{
56 if (target) {
57 target = nullptr;
58 }
59}
Field definition describing a single data member of a data structure.
Definition: Field.h:68
Simple method definition.
Definition: Method.h:72
Contains reflection support.
Definition: Component.h:11
Represents an unique name.
Definition: Name.h:70