122 lines
3.1 KiB
C
122 lines
3.1 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <scene/component.h>
|
|||
|
|
#include <renderer/render_types.h>
|
|||
|
|
#include <types/math/color.h>
|
|||
|
|
|
|||
|
|
namespace extra2d {
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 精灵渲染组件
|
|||
|
|
*
|
|||
|
|
* 负责渲染2D精灵,通过事件提交渲染命令
|
|||
|
|
*
|
|||
|
|
* 使用材质作为纹理和着色器的中间层:
|
|||
|
|
* - 材质包含着色器、参数和纹理
|
|||
|
|
* - 如果只想使用默认着色器,可以设置纹理,组件会自动处理
|
|||
|
|
*
|
|||
|
|
* 使用示例:
|
|||
|
|
* @code
|
|||
|
|
* // 方式1:使用完整材质(推荐)
|
|||
|
|
* auto material = makePtr<Material>();
|
|||
|
|
* material->setShader(customShader);
|
|||
|
|
* material->setTexture("uTexture", textureHandle, 0);
|
|||
|
|
* material->setColor("uTintColor", Color::Red);
|
|||
|
|
* MaterialHandle matHandle = renderer->registerMaterial(material);
|
|||
|
|
* sprite->setMaterial(matHandle);
|
|||
|
|
*
|
|||
|
|
* // 方式2:只设置纹理(使用默认材质)
|
|||
|
|
* sprite->setTexture(textureHandle);
|
|||
|
|
* @endcode
|
|||
|
|
*/
|
|||
|
|
class SpriteRenderer : public Component {
|
|||
|
|
public:
|
|||
|
|
static constexpr const char* TYPE_NAME = "SpriteRenderer";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 构造函数
|
|||
|
|
*/
|
|||
|
|
SpriteRenderer();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取组件类型名称
|
|||
|
|
* @return 类型名称
|
|||
|
|
*/
|
|||
|
|
const char* getTypeName() const override { return TYPE_NAME; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 组件附加到节点时调用
|
|||
|
|
* @param owner 所属节点
|
|||
|
|
*/
|
|||
|
|
void onAttach(Node* owner) override;
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 材质设置(推荐方式)
|
|||
|
|
// ========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置材质
|
|||
|
|
*
|
|||
|
|
* 材质包含着色器、参数和纹理
|
|||
|
|
* @param material 材质句柄
|
|||
|
|
*/
|
|||
|
|
void setMaterial(MaterialHandle material);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取材质
|
|||
|
|
* @return 材质句柄
|
|||
|
|
*/
|
|||
|
|
MaterialHandle getMaterial() const { return material_; }
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 纹理设置(便捷方式)
|
|||
|
|
// ========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置纹理
|
|||
|
|
*
|
|||
|
|
* 如果没有设置材质,渲染时会使用默认材质并绑定此纹理
|
|||
|
|
* 如果设置了材质,此设置被忽略(材质中的纹理优先)
|
|||
|
|
* @param texture 纹理句柄
|
|||
|
|
*/
|
|||
|
|
void setTexture(TextureHandle texture);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取纹理
|
|||
|
|
* @return 纹理句柄
|
|||
|
|
*/
|
|||
|
|
TextureHandle getTexture() const { return texture_; }
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 颜色(顶点颜色)
|
|||
|
|
// ========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置颜色
|
|||
|
|
* @param color 颜色
|
|||
|
|
*/
|
|||
|
|
void setColor(const Color& color);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取颜色
|
|||
|
|
* @return 颜色
|
|||
|
|
*/
|
|||
|
|
Color getColor() const { return color_; }
|
|||
|
|
|
|||
|
|
// ========================================
|
|||
|
|
// 渲染
|
|||
|
|
// ========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 渲染时调用
|
|||
|
|
*/
|
|||
|
|
void render() override;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
MaterialHandle material_ = INVALID_MATERIAL_HANDLE; // 材质句柄
|
|||
|
|
TextureHandle texture_ = INVALID_TEXTURE_HANDLE; // 纹理句柄(便捷方式)
|
|||
|
|
Color color_ = Color::White; // 顶点颜色
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
} // namespace extra2d
|