#ifndef _RIVE_WORLD_TRANSFORM_COMPONENT_BASE_HPP_
#define _RIVE_WORLD_TRANSFORM_COMPONENT_BASE_HPP_
#include "rive/container_component.hpp"
#include "rive/core/field_types/core_double_type.hpp"
namespace rive
{
	class WorldTransformComponentBase : public ContainerComponent
	{
	protected:
		typedef ContainerComponent Super;

	public:
		static const uint16_t typeKey = 91;

		/// Helper to quickly determine if a core object extends another without
		/// RTTI at runtime.
		bool isTypeOf(uint16_t typeKey) const override
		{
			switch (typeKey)
			{
				case WorldTransformComponentBase::typeKey:
				case ContainerComponentBase::typeKey:
				case ComponentBase::typeKey:
					return true;
				default:
					return false;
			}
		}

		uint16_t coreType() const override { return typeKey; }

		static const uint16_t opacityPropertyKey = 18;

	private:
		float m_Opacity = 1.0f;
	public:
		inline float opacity() const { return m_Opacity; }
		void opacity(float value)
		{
			if (m_Opacity == value)
			{
				return;
			}
			m_Opacity = value;
			opacityChanged();
		}

		void copy(const WorldTransformComponentBase& object)
		{
			m_Opacity = object.m_Opacity;
			ContainerComponent::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case opacityPropertyKey:
					m_Opacity = CoreDoubleType::deserialize(reader);
					return true;
			}
			return ContainerComponent::deserialize(propertyKey, reader);
		}

	protected:
		virtual void opacityChanged() {}
	};
} // namespace rive

#endif