0518 Signal&Connect&Disconnect
고도에 있는 시그널을 도입할 필요가 있다.
시그널이란, "오브젝트와 오브젝트 간의 소통."
// ================================================
// ================================================
// ================================================
*** 이거 구현하고 나면
IViewport의 리사이징 콜백 부분 갈아끼우기 ******
// ================================================
// ================================================
// ================================================
** 참고로 왜 struct & std::variant로 정적이게 만들지 않냐면,,,
애초에 스크립팅 때문에 이렇게 해야 하고,
유저가 (C++인터페이스에서) 직접 만드는 시그널을 구현해야 하기 때문이다.
오브젝트 안에
std::map<Signal, std::vector<IObject*>> m_connected_objects { };
가 있고,
void connect(const Signal& signal, IObject* object);
void disconnect(const Signal& signal, IObject* object);
가 있고,
오브젝트 안에
// 가상 함수로, 인터페이스로써 시그널 받기 가능.
virtual void on_signal_received(const Signal& signal, const SignalArgs& args);
// 강제로 그 오브젝트의 특정 시그널을 발산
void emit(const Signal& signal, const SignalArgs& args);
즉, 오브젝트에서 시그널이 발산되려면
for (auto& obj : m_connected_objects[특정시그널_키]){
obj->on_signal_received([특정시그널_키], args);
}
Signal은 다음과 같음.
struct Signal {
IObject* source = nullptr;
std::string description = "ERROR";
};
SignalArgs는 다음과 같음.
using SignalArgs = std::vector<Variant>;
Variant는 다음과 같음.
class Variant{
private:
union {
bool b;
int i;
float f;
double d;
Vector2f v2;
Vector3f v3;
Vector4f v4;
Matrix2f m2;
Matrix3f m3;
Matrix4f m4;
std::string s;
} m_data;
PrimitiveType m_type;
public:
Variant() = delete;
explicit Variant(bool value) : m_data.b(value), m_type(PrimitiveType::Boolean) {}
explicit Variant(int value); ...
explicit Variant(float value); ...
...
public:
const bool& get_boolean()const;
const int& get_int()const;
const float& get_float() const;
public:
const PrimitiveType& get_type() const;
}