Extra2D/src/scene/components/sprite_renderer.cpp

53 lines
1.4 KiB
C++
Raw Normal View History

#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