2026-03-02 04:50:28 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <scene/component.h>
|
|
|
|
|
|
#include <renderer/render_types.h>
|
|
|
|
|
|
#include <types/math/color.h>
|
2026-03-02 22:44:42 +08:00
|
|
|
|
#include <assets/handle.h>
|
2026-03-02 04:50:28 +08:00
|
|
|
|
|
|
|
|
|
|
namespace extra2d {
|
|
|
|
|
|
|
2026-03-02 22:44:42 +08:00
|
|
|
|
// 前向声明
|
|
|
|
|
|
class Material;
|
|
|
|
|
|
class Texture;
|
|
|
|
|
|
|
2026-03-02 04:50:28 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 精灵渲染组件
|
|
|
|
|
|
*
|
|
|
|
|
|
* 负责渲染2D精灵,通过事件提交渲染命令
|
|
|
|
|
|
*
|
|
|
|
|
|
* 使用材质作为纹理和着色器的中间层:
|
|
|
|
|
|
* - 材质包含着色器、参数和纹理
|
|
|
|
|
|
* - 如果只想使用默认着色器,可以设置纹理,组件会自动处理
|
|
|
|
|
|
*
|
|
|
|
|
|
* 使用示例:
|
|
|
|
|
|
* @code
|
|
|
|
|
|
* // 方式1:使用完整材质(推荐)
|
|
|
|
|
|
* auto material = makePtr<Material>();
|
|
|
|
|
|
* material->setShader(customShader);
|
|
|
|
|
|
* material->setTexture("uTexture", textureHandle, 0);
|
|
|
|
|
|
* material->setColor("uTintColor", Color::Red);
|
2026-03-02 22:44:42 +08:00
|
|
|
|
* Handle<Material> matHandle = assets->load<Material>("material.mat");
|
2026-03-02 04:50:28 +08:00
|
|
|
|
* 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 材质句柄
|
|
|
|
|
|
*/
|
2026-03-02 22:44:42 +08:00
|
|
|
|
void setMaterial(Handle<Material> material);
|
2026-03-02 04:50:28 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 获取材质
|
|
|
|
|
|
* @return 材质句柄
|
|
|
|
|
|
*/
|
2026-03-02 22:44:42 +08:00
|
|
|
|
Handle<Material> getMaterial() const { return material_; }
|
2026-03-02 04:50:28 +08:00
|
|
|
|
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
// 纹理设置(便捷方式)
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置纹理
|
|
|
|
|
|
*
|
|
|
|
|
|
* 如果没有设置材质,渲染时会使用默认材质并绑定此纹理
|
|
|
|
|
|
* 如果设置了材质,此设置被忽略(材质中的纹理优先)
|
|
|
|
|
|
* @param texture 纹理句柄
|
|
|
|
|
|
*/
|
2026-03-02 22:44:42 +08:00
|
|
|
|
void setTexture(Handle<Texture> texture);
|
2026-03-02 04:50:28 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 获取纹理
|
|
|
|
|
|
* @return 纹理句柄
|
|
|
|
|
|
*/
|
2026-03-02 22:44:42 +08:00
|
|
|
|
Handle<Texture> getTexture() const { return texture_; }
|
2026-03-02 04:50:28 +08:00
|
|
|
|
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
// 颜色(顶点颜色)
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置颜色
|
|
|
|
|
|
* @param color 颜色
|
|
|
|
|
|
*/
|
|
|
|
|
|
void setColor(const Color& color);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 获取颜色
|
|
|
|
|
|
* @return 颜色
|
|
|
|
|
|
*/
|
|
|
|
|
|
Color getColor() const { return color_; }
|
|
|
|
|
|
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
// 渲染
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 渲染时调用
|
|
|
|
|
|
*/
|
|
|
|
|
|
void render() override;
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
2026-03-02 22:44:42 +08:00
|
|
|
|
Handle<Material> material_; // 材质句柄
|
|
|
|
|
|
Handle<Texture> texture_; // 纹理句柄(便捷方式)
|
|
|
|
|
|
Color color_ = Color::White; // 顶点颜色
|
2026-03-02 04:50:28 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace extra2d
|