PrimeWorldEditor/src/Editor/ModelEditor/CModelEditorViewport.cpp

122 lines
3.4 KiB
C++
Raw Normal View History

#include "CModelEditorViewport.h"
#include <Core/Render/CDrawUtil.h>
CModelEditorViewport::CModelEditorViewport(QWidget *pParent)
2016-03-27 12:09:38 -07:00
: CBasicViewport(pParent)
2018-12-16 13:00:40 -08:00
, mMode(EDrawMode::DrawMesh)
2016-03-27 12:09:38 -07:00
, mpActiveMaterial(nullptr)
, mpModelNode(nullptr)
, mGridEnabled(true)
{
mpRenderer = new CRenderer();
2019-11-06 18:52:45 -08:00
qreal pixelRatio = devicePixelRatioF();
mpRenderer->SetViewportSize(width() * pixelRatio, height() * pixelRatio);
mpRenderer->SetClearColor(CColor::skBlack);
mpRenderer->ToggleGrid(true);
2015-11-27 04:26:32 -08:00
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;
}
2016-03-27 12:09:38 -07:00
void CModelEditorViewport::SetDrawMode(EDrawMode Mode)
{
2016-03-27 12:09:38 -07:00
mMode = Mode;
}
2016-03-27 12:09:38 -07:00
void CModelEditorViewport::SetClearColor(CColor Color)
{
2016-03-27 12:09:38 -07:00
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);
}
2018-12-16 13:00:40 -08:00
else if (mMode == EDrawMode::DrawMesh)
{
if (mGridEnabled)
mGrid.AddToRenderer(mpRenderer, mViewInfo);
mpModelNode->AddToRenderer(mpRenderer, mViewInfo);
mpRenderer->RenderBuckets(mViewInfo);
}
2018-12-16 13:00:40 -08:00
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
2019-11-24 18:46:57 -08:00
for (CMaterial* passMat = mpActiveMaterial; passMat; passMat = passMat->GetNextDrawPass())
{
passMat->SetCurrent(ERenderOption::EnableUVScroll | ERenderOption::EnableBackfaceCull | ERenderOption::EnableOccluders);
CDrawUtil::DrawSphere(true);
}
}
2018-12-16 13:00:40 -08:00
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();
2019-11-24 18:46:57 -08:00
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()
{
2019-11-06 18:52:45 -08:00
qreal pixelRatio = devicePixelRatioF();
mpRenderer->SetViewportSize(width() * pixelRatio, height() * pixelRatio);
}