122 lines
3.4 KiB
C++
122 lines
3.4 KiB
C++
#include "CModelEditorViewport.h"
|
|
#include <Core/Render/CDrawUtil.h>
|
|
|
|
CModelEditorViewport::CModelEditorViewport(QWidget *pParent)
|
|
: CBasicViewport(pParent)
|
|
, mMode(EDrawMode::DrawMesh)
|
|
, mpActiveMaterial(nullptr)
|
|
, mpModelNode(nullptr)
|
|
, mGridEnabled(true)
|
|
{
|
|
mpRenderer = new CRenderer();
|
|
qreal pixelRatio = devicePixelRatioF();
|
|
mpRenderer->SetViewportSize(width() * pixelRatio, height() * pixelRatio);
|
|
mpRenderer->SetClearColor(CColor::skBlack);
|
|
mpRenderer->ToggleGrid(true);
|
|
|
|
mViewInfo.pRenderer = mpRenderer;
|
|
mViewInfo.pScene = nullptr;
|
|
mViewInfo.GameMode = false;
|
|
}
|
|
|
|
CModelEditorViewport::~CModelEditorViewport()
|
|
{
|
|
delete mpRenderer;
|
|
}
|
|
|
|
void CModelEditorViewport::SetNode(CModelNode *pNode)
|
|
{
|
|
mpModelNode = pNode;
|
|
}
|
|
|
|
void CModelEditorViewport::SetActiveMaterial(CMaterial *pMat)
|
|
{
|
|
mpActiveMaterial = pMat;
|
|
}
|
|
|
|
void CModelEditorViewport::SetDrawMode(EDrawMode Mode)
|
|
{
|
|
mMode = Mode;
|
|
}
|
|
|
|
void CModelEditorViewport::SetClearColor(CColor Color)
|
|
{
|
|
mpRenderer->SetClearColor(Color);
|
|
}
|
|
|
|
void CModelEditorViewport::SetGridEnabled(bool Enable)
|
|
{
|
|
mGridEnabled = Enable;
|
|
}
|
|
|
|
void CModelEditorViewport::Paint()
|
|
{
|
|
mpRenderer->BeginFrame();
|
|
mCamera.LoadMatrices();
|
|
|
|
if (!mpModelNode->Model())
|
|
{
|
|
if (mGridEnabled)
|
|
mGrid.AddToRenderer(mpRenderer, mViewInfo);
|
|
|
|
mpRenderer->RenderBuckets(mViewInfo);
|
|
}
|
|
|
|
else if (mMode == EDrawMode::DrawMesh)
|
|
{
|
|
if (mGridEnabled)
|
|
mGrid.AddToRenderer(mpRenderer, mViewInfo);
|
|
|
|
mpModelNode->AddToRenderer(mpRenderer, mViewInfo);
|
|
mpRenderer->RenderBuckets(mViewInfo);
|
|
}
|
|
|
|
else if (mMode == EDrawMode::DrawSphere)
|
|
{
|
|
if (!mpActiveMaterial) return;
|
|
glEnable(GL_CULL_FACE);
|
|
|
|
CGraphics::sVertexBlock.COLOR0_Amb = CGraphics::skDefaultAmbientColor;
|
|
CGraphics::sMVPBlock.ModelMatrix = CMatrix4f::skIdentity;
|
|
CGraphics::UpdateMVPBlock();
|
|
CGraphics::SetDefaultLighting();
|
|
CGraphics::UpdateLightBlock(); // Note: vertex block is updated by the material
|
|
|
|
for (CMaterial* passMat = mpActiveMaterial; passMat; passMat = passMat->GetNextDrawPass())
|
|
{
|
|
passMat->SetCurrent(ERenderOption::EnableUVScroll | ERenderOption::EnableBackfaceCull | ERenderOption::EnableOccluders);
|
|
CDrawUtil::DrawSphere(true);
|
|
}
|
|
}
|
|
|
|
else if (mMode == EDrawMode::DrawSquare)
|
|
{
|
|
if (!mpActiveMaterial) return;
|
|
glDisable(GL_CULL_FACE);
|
|
|
|
CGraphics::SetDefaultLighting();
|
|
CGraphics::UpdateLightBlock();
|
|
CGraphics::sVertexBlock.COLOR0_Amb = CGraphics::skDefaultAmbientColor;
|
|
|
|
CGraphics::sMVPBlock.ModelMatrix = CMatrix4f::skIdentity;
|
|
CGraphics::sMVPBlock.ViewMatrix = CMatrix4f::skIdentity;
|
|
CGraphics::sMVPBlock.ProjectionMatrix = CMatrix4f::skIdentity;
|
|
CGraphics::UpdateMVPBlock();
|
|
|
|
for (CMaterial* passMat = mpActiveMaterial; passMat; passMat = passMat->GetNextDrawPass())
|
|
{
|
|
passMat->SetCurrent(ERenderOption::EnableUVScroll | ERenderOption::EnableOccluders);
|
|
float Aspect = (float) width() / (float) height();
|
|
CDrawUtil::DrawSquare(CVector2f(0,1), CVector2f(1 * Aspect, 1), CVector2f(1 * Aspect, 0), CVector2f(0,0));
|
|
}
|
|
}
|
|
|
|
mpRenderer->EndFrame();
|
|
}
|
|
|
|
void CModelEditorViewport::OnResize()
|
|
{
|
|
qreal pixelRatio = devicePixelRatioF();
|
|
mpRenderer->SetViewportSize(width() * pixelRatio, height() * pixelRatio);
|
|
}
|