/**
 * @file Transform.h
 * @brief 变换组件数据结构与更新接口。
 */
#pragma once
#include "ComponentsCommon.h"

namespace XEngine::transform {

/**
 * @brief 变换组件初始化参数。
 */
struct init_info
{
	f32 position[3]{};
	f32 rotation[4]{};
	f32 scale[3]{1.f, 1.f, 1.f};
};

/**
 * @brief 变换组件缓存更新标记位。
 */
struct component_flags
{
	enum flags :u32 {
		rotation = 0x01,
		orientation = 0x02,
		position = 0x04,
		scale = 0x08,


		all = rotation | orientation | position| scale
	};
};

/**
 * @brief 变换组件批量更新缓存项。
 */
struct component_cache
{
	math::v4		rotation;
	math::v3		orientation;
	math::v3		position;
	math::v3		scale;

	transform_id	id;
	u32				flags;
};

/**
 * @brief 获取实体的世界矩阵与逆世界矩阵。
 * @param id 实体标识符。
 * @param world 输出世界矩阵。
 * @param inverse_world 输出逆世界矩阵。
 */
void get_transform_matrices(const game_entity::entity_id id, math::m4x4& world, math::m4x4& inverse_world);
/**
 * @brief 为实体创建变换组件。
 * @param info 变换初始化参数。
 * @param entity 目标实体。
 * @return 创建后的变换组件句柄。
 */
component create( init_info info, game_entity::entity entity);
/**
 * @brief 移除变换组件。
 * @param c 变换组件句柄。
 */
void remove(component c);
/**
 * @brief 查询指定实体集合的变换更新标记。
 * @param ids 实体标识符数组。
 * @param count 实体数量。
 * @param flags 输出标记数组。
 */
void get_update_component_flags(const game_entity::entity_id *const ids, u32 count, u8 *const flags);
/**
 * @brief 批量提交变换缓存更新。
 * @param cache 缓存数组首地址。
 * @param count 缓存项数量。
 */
void update(const component_cache *const cache, u32 count);

}
