123 lines
3.2 KiB
C++
123 lines
3.2 KiB
C++
#include "Canvas.h"
|
|
#include "EngineCore/Game.h"
|
|
#include "EngineFrame/Render/RenderManager.h"
|
|
Canvas::Canvas()
|
|
{
|
|
|
|
}
|
|
Canvas::Canvas(VecSize size)
|
|
{
|
|
Init(size);
|
|
}
|
|
|
|
Canvas::Canvas(int width, int height)
|
|
{
|
|
Init({width, height});
|
|
}
|
|
|
|
void Canvas::Init(VecSize size)
|
|
{
|
|
m_size = size;
|
|
SetSize(size);
|
|
// 创建指定大小的纹理
|
|
m_texture = new Texture();
|
|
m_texture->Init(m_size);
|
|
|
|
// 构造FBO
|
|
glGenFramebuffers(1, &m_fbo);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
|
// 将目标纹理附加到FBO的颜色附着点
|
|
glFramebufferTexture2D(
|
|
GL_FRAMEBUFFER, // 帧缓冲类型
|
|
GL_COLOR_ATTACHMENT0, // 颜色附着点(可多个,这里用第一个)
|
|
GL_TEXTURE_2D, // 纹理类型
|
|
m_texture->getID(), // 目标纹理ID
|
|
0 // 多级渐远纹理级别
|
|
);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0); // 解绑FBO
|
|
}
|
|
|
|
void Canvas::BeginDraw()
|
|
{
|
|
RenderManager *renderer = Game::GetInstance().GetRenderer();
|
|
// 绑定FBO
|
|
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
|
// 清屏
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
// 保存原始的正交矩阵 设置纹理对应的正交矩阵 和 视口
|
|
Oom = renderer->GetOrthoMatrix();
|
|
renderer->SetOrthoMatrix(glm::ortho(0.0f, (float)m_size.width, 0.0f, (float)m_size.height, -1.0f, 1.0f));
|
|
Oviewport = renderer->GetViewport();
|
|
renderer->SetViewport({0, 0, m_size.width, m_size.height});
|
|
|
|
}
|
|
|
|
void Canvas::EndDraw()
|
|
{
|
|
RenderManager *renderer = Game::GetInstance().GetRenderer();
|
|
// 解绑FBO
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
// 恢复原始的正交矩阵 和 视口
|
|
renderer->SetOrthoMatrix(Oom);
|
|
renderer->SetViewport(Oviewport);
|
|
}
|
|
|
|
void Canvas::DrawActor(RefPtr<Actor> actor)
|
|
{
|
|
// 计算矩阵
|
|
actor->PreRender();
|
|
// 设定矩阵并渲染(Render中会调用OnRender)
|
|
actor->Render();
|
|
}
|
|
|
|
void Canvas::Clear()
|
|
{
|
|
m_texture = new Texture();
|
|
m_texture->Init(m_size);
|
|
}
|
|
|
|
void Canvas::OnRender()
|
|
{
|
|
if (!m_texture || !IsVisible())
|
|
return;
|
|
|
|
RenderManager *renderer = Game::GetInstance().GetRenderer();
|
|
if (this->_BlendMode != NONE)
|
|
{
|
|
renderer->SetBlendMode(this->_BlendMode);
|
|
}
|
|
renderer->DrawTexture(m_texture);
|
|
if (this->_BlendMode != NONE)
|
|
{
|
|
renderer->SetBlendMode(NONE);
|
|
}
|
|
}
|
|
|
|
// void Canvas::Render()
|
|
// {
|
|
// RenderManager *renderer = Game::GetInstance().GetRenderer();
|
|
// SDL_FPoint AnchorPos = {0, 0};
|
|
// if (m_dirty)
|
|
// {
|
|
// glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); // 绑定FBO
|
|
// glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
|
// glClear(GL_COLOR_BUFFER_BIT);
|
|
// for (auto &info : m_drawQueue)
|
|
// {
|
|
// renderer->DrawTexture(m_imgMap[info.texture], nullptr, &info.rect, 0.f, &AnchorPos, SDL_FLIP_NONE);
|
|
// }
|
|
// glBindFramebuffer(GL_FRAMEBUFFER, 0); // 解绑FBO
|
|
// m_dirty = false;
|
|
// }
|
|
|
|
// renderer->SetCurrentShaderProgram("flip_y");
|
|
// // 混合
|
|
// if (this->_BlendMode != NONE)
|
|
// Blend();
|
|
// renderer->DrawTexture(m_texture, &m_renderRect, &m_rect, 0.f, &AnchorPos, SDL_FLIP_NONE);
|
|
// // 还原混合
|
|
// if (this->_BlendMode != NONE)
|
|
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
// renderer->SetCurrentShaderProgram("normal");
|
|
// }
|