53 lines
1.4 KiB
C++
53 lines
1.4 KiB
C++
|
|
#include <event/events.h>
|
|||
|
|
#include <scene/components/sprite_renderer.h>
|
|||
|
|
#include <scene/node.h>
|
|||
|
|
#include <utils/logger.h>
|
|||
|
|
|
|||
|
|
namespace extra2d {
|
|||
|
|
|
|||
|
|
SpriteRenderer::SpriteRenderer() {
|
|||
|
|
// 默认材质和纹理为无效句柄
|
|||
|
|
// 渲染时会使用默认材质
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void SpriteRenderer::onAttach(Node *owner) { Component::onAttach(owner); }
|
|||
|
|
|
|||
|
|
void SpriteRenderer::setMaterial(MaterialHandle material) {
|
|||
|
|
material_ = material;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void SpriteRenderer::setTexture(TextureHandle texture) { texture_ = texture; }
|
|||
|
|
|
|||
|
|
void SpriteRenderer::setColor(const Color &color) { color_ = color; }
|
|||
|
|
|
|||
|
|
void SpriteRenderer::render() {
|
|||
|
|
if (!isEnabled() || !owner_ || !owner_->isVisible()) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取世界变换(已包含锚点计算)
|
|||
|
|
Transform worldTransform = owner_->getWorldTransform();
|
|||
|
|
|
|||
|
|
// 构建渲染命令
|
|||
|
|
RenderCommand cmd;
|
|||
|
|
cmd.type = RenderCommandType::DrawMesh;
|
|||
|
|
|
|||
|
|
// 计算排序键(简单实现:材质ID + 纹理ID)
|
|||
|
|
uint32_t materialId = static_cast<uint32_t>(material_ & 0xFFFFFFFF);
|
|||
|
|
uint32_t textureId = static_cast<uint32_t>(texture_ & 0xFFFFFFFF);
|
|||
|
|
cmd.sortKey = (materialId << 16) | (textureId & 0xFFFF);
|
|||
|
|
|
|||
|
|
// 设置网格(使用默认四边形)
|
|||
|
|
cmd.drawMesh.mesh = INVALID_MESH_HANDLE; // 渲染器会使用默认四边形
|
|||
|
|
cmd.drawMesh.material = material_;
|
|||
|
|
cmd.setTransform(worldTransform);
|
|||
|
|
|
|||
|
|
// 设置顶点颜色
|
|||
|
|
cmd.setColor(color_);
|
|||
|
|
|
|||
|
|
// 提交渲染命令
|
|||
|
|
events::OnRenderSubmit::emit(cmd);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} // namespace extra2d
|