Files
Seele/src/Engine/Scene/Components/Component.h
T

87 lines
2.4 KiB
C++
Raw Normal View History

2020-04-15 02:03:56 +02:00
#pragma once
#include "MinimalEngine.h"
2020-05-05 01:51:13 +02:00
#include "Math/Transform.h"
2022-01-12 14:40:26 +01:00
#include "Scene/Util.h"
#include "ThreadPool.h"
2020-04-15 02:03:56 +02:00
namespace Seele
{
2021-04-01 16:40:14 +02:00
DECLARE_REF(Actor)
DECLARE_REF(Scene)
DECLARE_REF(Component)
2020-04-15 02:03:56 +02:00
class Component
{
public:
Component();
virtual ~Component();
2022-01-12 14:40:26 +01:00
void launchStart();
virtual void start() {};
Array<Job> launchTick(float deltaTime) const;
2022-03-26 16:15:50 +01:00
virtual Job tick(float) const { co_return; }
2022-01-12 14:40:26 +01:00
Array<Job> launchUpdate();
virtual Job update() { co_return; }
2020-04-15 02:03:56 +02:00
PComponent getParent();
PActor getOwner();
2022-01-12 14:40:26 +01:00
const Array<PComponent>& getChildComponents();
void setParent(PComponent parent);
void setOwner(PActor owner);
2022-01-12 14:40:26 +01:00
void addChildComponent(PComponent component);
2020-05-05 01:51:13 +02:00
virtual void notifySceneAttach(PScene scene);
2020-04-15 02:03:56 +02:00
2022-03-19 22:45:30 +01:00
//void setAbsoluteLocation(Vector location);
//void setAbsoluteRotation(Vector rotation);
//void setAbsoluteRotation(Quaternion rotation);
//void setWorldScale(Vector scale);
2020-04-15 02:03:56 +02:00
void setRelativeLocation(Vector location);
void setRelativeRotation(Vector rotation);
void setRelativeRotation(Quaternion rotation);
void setRelativeScale(Vector scale);
2020-05-05 01:51:13 +02:00
2022-03-19 22:45:30 +01:00
//void addAbsoluteTranslation(Vector translation);
//void addAbsoluteRotation(Vector rotation);
//void addAbsoluteRotation(Quaternion rotation);
void addRelativeLocation(Vector translation);
void addRelativeRotation(Vector rotation);
void addRelativeRotation(Quaternion rotation);
2020-04-15 02:03:56 +02:00
Transform getTransform() const;
2022-03-19 22:45:30 +01:00
Transform getAbsoluteTransform() const;
2020-05-05 01:51:13 +02:00
2022-01-12 14:40:26 +01:00
template<typename ComponentType>
RefPtr<ComponentType> getComponent()
{
return tryFindComponent<ComponentType>();
}
2022-03-19 22:45:30 +01:00
2020-04-15 02:03:56 +02:00
private:
2022-01-12 14:40:26 +01:00
template<typename ComponentType>
RefPtr<ComponentType> tryFindComponent()
{
for(auto child : children)
{
RefPtr<ComponentType> result = child.cast<ComponentType>();
if(result != nullptr)
{
return result;
}
result = parent->tryFindComponent<ComponentType>();
if(result != nullptr)
{
return result;
}
}
return nullptr;
}
2022-03-26 12:55:04 +01:00
void propagateTransformUpdate();
2020-04-15 02:03:56 +02:00
Transform transform;
2022-03-26 12:55:04 +01:00
Transform absoluteTransform;
2020-05-05 01:51:13 +02:00
PScene owningScene;
2020-04-15 02:03:56 +02:00
PActor owner;
PComponent parent;
Array<PComponent> children;
2020-05-05 01:51:13 +02:00
friend class Actor;
2020-04-15 02:03:56 +02:00
};
DEFINE_REF(Component)
2020-05-05 01:51:13 +02:00
} // namespace Seele