#pragma once #include #include #include #include #include #include "../base/Assert.h" #include "../base/Color.h" #include "../base/Export.h" #include "../base/Geometry.h" namespace renderive { std::vector get_turbo_color_gradient(); } #define LIB_DECL RENDERIVE_API #define PROP(Type, Name) \ Type Name(); \ void set_##Name(Type); #define RENDERIVE_DEFINE_STATE_PROP(Owner, State, Type, Field) \ Type Owner::Field() { \ return d()->edit_state_value(&State::Field); \ } \ void Owner::set_##Field(Type value) { \ d()->set_state_value(&State::Field, std::move(value)); \ } #define RENDERIVE_DEFINE_WEAK_STATE_PROP(Owner, State, Pointee, Field) \ std::shared_ptr Owner::Field() { \ return d()->edit_state_value(&State::Field).lock(); \ } \ void Owner::set_##Field(std::shared_ptr value) { \ d()->set_state_value(&State::Field, std::weak_ptr(value)); \ } #define PROP_B(TYPE, FIELD) \ public: \ Builder& set_##FIELD(TYPE value) { \ this->FIELD = std::move(value); \ return *this; \ } #define PROP_BT(TYPE, FIELD) \ public: \ That& set_##FIELD(TYPE value) { \ static_cast(this)->FIELD = std::move(value); \ return *static_cast(this); \ } #define PROP_R(TYPE, FIELD) sc->FIELD = this->FIELD; #define PROP_RT(TYPE, FIELD) sc->FIELD = static_cast(this)->FIELD; #define SETTER(TYPE, FIELD, DEFAULT) \ \ TYPE FIELD = DEFAULT; \ public: \ Builder& set_##FIELD(TYPE value) { \ this->FIELD = std::move(value); \ return *this; \ } #undef min #undef max