Deprecate matrix4x4d renderer methods, add better Viewport handling

master
Webster Sheets 2020-08-30 16:21:55 -04:00
parent 0d1cca4cd1
commit 4d3fcb5b84
24 changed files with 68 additions and 90 deletions

View File

@ -543,7 +543,7 @@ namespace Background {
void Container::Draw(const matrix4x4d &transform)
{
PROFILE_SCOPED()
m_renderer->SetTransform(transform);
m_renderer->SetTransform(matrix4x4f(transform));
if (DRAW_SKYBOX & m_drawFlags) {
m_universeBox.Draw(m_renderState);
}
@ -551,7 +551,7 @@ namespace Background {
m_milkyWay.Draw(m_renderState);
}
if (DRAW_STARS & m_drawFlags) {
m_renderer->SetTransform(transform);
m_renderer->SetTransform(matrix4x4f(transform));
m_starField.Draw(m_renderState);
}
}

View File

@ -54,7 +54,7 @@ void BaseSphere::DrawAtmosphereSurface(Graphics::Renderer *renderer,
const vector3d xaxis = yaxis.Cross(zaxis);
const matrix4x4d invrot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).Inverse();
renderer->SetTransform(modelView * matrix4x4d::ScaleMatrix(rad) * invrot);
renderer->SetTransform(matrix4x4f(modelView * matrix4x4d::ScaleMatrix(rad) * invrot));
if (!m_atmos)
m_atmos.reset(new Drawables::Sphere3D(renderer, mat, rs, 4, 1.0f, ATTRIB_POSITION));

View File

@ -262,7 +262,7 @@ public:
Graphics::RenderState *rs = gasSphere->GetSurfRenderState();
const vector3d relpos = clipCentroid - campos;
renderer->SetTransform(modelView * matrix4x4d::Translation(relpos));
renderer->SetTransform(matrix4x4f(modelView * matrix4x4d::Translation(relpos)));
Pi::statSceneTris += 2 * (ctx->edgeLen - 1) * (ctx->edgeLen - 1);
++Pi::statNumPatches;
@ -666,7 +666,7 @@ void GasGiant::Render(Graphics::Renderer *renderer, const matrix4x4d &modelView,
matrix4x4d trans = modelView;
trans.Translate(-campos.x, -campos.y, -campos.z);
renderer->SetTransform(trans); //need to set this for the following line to work
renderer->SetTransform(matrix4x4f(trans)); //need to set this for the following line to work
matrix4x4d modv = matrix4x4d(renderer->GetTransform());
matrix4x4d proj = matrix4x4d(renderer->GetProjection());
Graphics::Frustum frustum(modv, proj);
@ -717,7 +717,7 @@ void GasGiant::Render(Graphics::Renderer *renderer, const matrix4x4d &modelView,
renderer->SetAmbientColor(ambient);
renderer->SetTransform(modelView);
renderer->SetTransform(matrix4x4f(modelView));
for (int i = 0; i < NUM_PATCHES; i++) {
m_patches[i]->Render(renderer, campos, modelView, frustum);

View File

@ -239,17 +239,12 @@ namespace GasGiantJobs {
{
PROFILE_SCOPED()
Pi::renderer->SetViewport(0, 0, mData->UVDims(), mData->UVDims());
Pi::renderer->SetTransform(matrix4x4f::Identity());
matrix4x4f savedProj = Pi::renderer->GetProjection();
matrix4x4f savedMV = Pi::renderer->GetTransform();
Graphics::Renderer::StateTicket ticket(Pi::renderer);
// enter ortho
{
Pi::renderer->SetOrthographicProjection(0, mData->UVDims(), mData->UVDims(), 0, -1, 1);
Pi::renderer->SetTransform(matrix4x4f::Identity());
}
Pi::renderer->SetViewport({ 0, 0, mData->UVDims(), mData->UVDims() });
Pi::renderer->SetOrthographicProjection(0, mData->UVDims(), mData->UVDims(), 0, -1, 1);
Pi::renderer->SetTransform(matrix4x4f::Identity());
GasGiant::BeginRenderTarget();
for (Uint32 iFace = 0; iFace < NUM_PATCHES; iFace++) {
@ -266,18 +261,14 @@ namespace GasGiantJobs {
}
GasGiant::EndRenderTarget();
// leave ortho?
{
Pi::renderer->SetProjection(savedProj);
Pi::renderer->SetTransform(savedMV);
}
// add this patches data
SGPUGenResult *sr = new SGPUGenResult();
sr->addResult(mData->Texture(), mData->UVDims());
// store the result
mpResults = sr;
// leave ortho when ticket is destroyed
}
void SingleGPUGenJob::OnFinish() // runs in primary thread of the context

View File

@ -291,7 +291,7 @@ void GeoPatch::Render(Graphics::Renderer *renderer, const vector3d &campos, cons
Graphics::RenderState *rs = m_geosphere->GetSurfRenderState();
const vector3d relpos = m_clipCentroid - campos;
renderer->SetTransform(modelView * matrix4x4d::Translation(relpos));
renderer->SetTransform(matrix4x4f(modelView * matrix4x4d::Translation(relpos)));
Pi::statSceneTris += (m_ctx->GetNumTris());
++Pi::statNumPatches;

View File

@ -379,7 +379,7 @@ void GeoSphere::Render(Graphics::Renderer *renderer, const matrix4x4d &modelView
matrix4x4d trans = modelView;
trans.Translate(-campos.x, -campos.y, -campos.z);
renderer->SetTransform(trans); //need to set this for the following line to work
renderer->SetTransform(matrix4x4f(trans)); //need to set this for the following line to work
matrix4x4d modv = matrix4x4d(renderer->GetTransform());
matrix4x4d proj = matrix4x4d(renderer->GetProjection());
Graphics::Frustum frustum(modv, proj);
@ -443,7 +443,7 @@ void GeoSphere::Render(Graphics::Renderer *renderer, const matrix4x4d &modelView
renderer->SetAmbientColor(ambient);
renderer->SetTransform(modelView);
renderer->SetTransform(matrix4x4f(modelView));
for (int i = 0; i < NUM_PATCHES; i++) {
m_patches[i]->Render(renderer, campos, modelView, frustum);

View File

@ -77,7 +77,7 @@ void HudTrail::Render(Graphics::Renderer *r)
colors.back().a = Uint8(alpha * 255);
}
r->SetTransform(m_transform);
r->SetTransform(matrix4x4f(m_transform));
m_lines.SetData(tvts.size(), &tvts[0], &colors[0]);
m_lines.Draw(r, m_renderState, Graphics::LINE_STRIP);
}

View File

@ -163,7 +163,7 @@ void HyperspaceCloud::Render(Renderer *renderer, const Camera *camera, const vec
vector3d xaxis = vector3d(0, 1, 0).Cross(zaxis).Normalized();
vector3d yaxis = zaxis.Cross(xaxis);
matrix4x4d rot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).Inverse();
renderer->SetTransform(trans * rot);
renderer->SetTransform(matrix4x4f(trans * rot));
// precise to the rendered frame (better than PHYSICS_HZ granularity)
const double preciseTime = Pi::game->GetTime() + Pi::GetGameTickAlpha() * Pi::game->GetTimeStep();

View File

@ -143,7 +143,7 @@ void Intro::Draw(float deltaTime)
m_renderer->ClearDepthBuffer();
m_background->Draw(brot);
m_renderer->SetViewport(m_spinnerLeft, 0, m_spinnerWidth, Graphics::GetScreenHeight());
m_renderer->SetViewport({ m_spinnerLeft, 0, m_spinnerWidth, Graphics::GetScreenHeight() });
m_renderer->SetPerspectiveProjection(75, m_spinnerRatio, 1.f, 10000.f);
matrix4x4f trans =

View File

@ -143,7 +143,8 @@ void ObjectViewerView::Draw3D()
body->Render(m_renderer, m_camera.get(), vector3d(0, 0, -viewingDist), m_camRot);
// industry-standard red/green/blue XYZ axis indiactor
m_renderer->SetTransform(matrix4x4d::Translation(vector3d(0, 0, -viewingDist)) * m_camRot * matrix4x4d::ScaleMatrix(body->GetClipRadius() * 2.0));
matrix4x4d trans = matrix4x4d::Translation(vector3d(0, 0, -viewingDist)) * m_camRot * matrix4x4d::ScaleMatrix(body->GetClipRadius() * 2.0);
m_renderer->SetTransform(matrix4x4f(trans));
Graphics::Drawables::GetAxes3DDrawable(m_renderer)->Draw(m_renderer);
}

View File

@ -256,7 +256,7 @@ void Planet::DrawGasGiantRings(Renderer *renderer, const matrix4x4d &modelView)
if (!m_ringTexture)
GenerateRings(renderer);
renderer->SetTransform(modelView);
renderer->SetTransform(matrix4x4f(modelView));
renderer->DrawTriangles(&m_ringVertices, m_ringState, m_ringMaterial.get(), TRIANGLE_STRIP);
}

View File

@ -1014,7 +1014,7 @@ void SectorView::BuildFarSector(RefCountedPtr<Sector> sec, const vector3f &origi
void SectorView::OnSwitchTo()
{
m_renderer->SetViewport(0, 0, Graphics::GetScreenWidth(), Graphics::GetScreenHeight());
m_renderer->SetViewport({ 0, 0, Graphics::GetScreenWidth(), Graphics::GetScreenHeight() });
Pi::input->PushInputFrame(&InputBindings);
UIView::OnSwitchTo();
Update();

View File

@ -130,7 +130,7 @@ void SpeedLines::Render(Graphics::Renderer *r)
m_vbuffer->Populate(*m_varray);
r->SetTransform(m_transform);
r->SetTransform(matrix4x4f(m_transform));
r->DrawBuffer(m_vbuffer.get(), m_renderState, m_material.Get(), Graphics::LINE_SINGLE);
}

View File

@ -97,7 +97,7 @@ void Star::Render(Graphics::Renderer *renderer, const Camera *camera, const vect
BuildHaloBuffer(renderer, rad);
}
// scale the halo by the new radius from it's unit size
renderer->SetTransform(trans * matrix4x4d::ScaleMatrix(rad) * rot);
renderer->SetTransform(matrix4x4f(trans * matrix4x4d::ScaleMatrix(rad) * rot));
//render star halo
renderer->DrawBuffer(m_haloBuffer.get(), m_haloState, Graphics::vtxColorMaterial, Graphics::TRIANGLE_FAN);

View File

@ -25,7 +25,7 @@ void GuiApplication::BeginFrame()
m_renderer->SetRenderTarget(m_renderTarget);
#endif
// TODO: render target size
m_renderer->SetViewport(0, 0, Graphics::GetScreenWidth(), Graphics::GetScreenHeight());
m_renderer->SetViewport({ 0, 0, Graphics::GetScreenWidth(), Graphics::GetScreenHeight() });
m_renderer->BeginFrame();
}

View File

@ -54,6 +54,23 @@ namespace Graphics {
int height;
};
// Lightweight representation of viewport bounds to simplify viewport state management
struct Viewport {
Viewport() :
x(0),
y(0),
w(0),
h(0) {}
Viewport(int32_t _x, int32_t _y, int32_t _w, int32_t _h) :
x(_x),
y(_y),
w(_w),
h(_h) {}
int32_t x, y, w, h;
};
class Material;
extern Material *vtxColorMaterial;

View File

@ -79,10 +79,10 @@ namespace Graphics {
virtual bool ClearDepthBuffer() = 0;
virtual bool SetClearColor(const Color &c) = 0;
virtual bool SetViewport(int x, int y, int width, int height) = 0;
virtual bool SetViewport(Viewport vp) = 0;
virtual Viewport GetViewport() const = 0;
//set the model view matrix
[[deprecated]] virtual bool SetTransform(const matrix4x4d &m) = 0;
virtual bool SetTransform(const matrix4x4f &m) = 0;
virtual matrix4x4f GetTransform() const = 0;
@ -144,9 +144,6 @@ namespace Graphics {
virtual bool ReloadShaders() = 0;
/// XXX at least use a custom structure you heathens
[[deprecated]] virtual void GetCurrentViewport(Sint32 *vp) const = 0;
// take a ticket representing the current renderer state. when the ticket
// is deleted, the renderer state is restored
// XXX state must die
@ -156,6 +153,7 @@ namespace Graphics {
m_renderer(r)
{
m_renderer->PushState();
m_storedVP = m_renderer->GetViewport();
m_storedProj = m_renderer->GetProjection();
m_storedMV = m_renderer->GetTransform();
}
@ -163,6 +161,7 @@ namespace Graphics {
virtual ~StateTicket()
{
m_renderer->PopState();
m_renderer->SetViewport(m_storedVP);
m_renderer->SetTransform(m_storedMV);
m_renderer->SetProjection(m_storedProj);
}
@ -174,6 +173,7 @@ namespace Graphics {
Renderer *m_renderer;
matrix4x4f m_storedProj;
matrix4x4f m_storedMV;
Viewport m_storedVP;
};
// Temporarily save the current transform matrix to do non-destructive drawing.

View File

@ -43,9 +43,9 @@ namespace Graphics {
virtual bool ClearDepthBuffer() override final { return true; }
virtual bool SetClearColor(const Color &c) override final { return true; }
virtual bool SetViewport(int x, int y, int width, int height) override final { return true; }
virtual bool SetViewport(Viewport v) override final { return true; }
virtual Viewport GetViewport() const override final { return {}; }
virtual bool SetTransform(const matrix4x4d &m) override final { return true; }
virtual bool SetTransform(const matrix4x4f &m) override final { return true; }
virtual matrix4x4f GetTransform() const override final { return matrix4x4f::Identity(); }
virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final { return true; }
@ -79,8 +79,6 @@ namespace Graphics {
virtual bool ReloadShaders() override final { return true; }
virtual void GetCurrentViewport(Sint32 *vp) const override final {}
protected:
virtual void PushState() override final {}
virtual void PopState() override final {}

View File

@ -198,8 +198,6 @@ namespace Graphics {
TextureBuilder::Init();
m_viewportStack.push(Viewport());
const bool useDXTnTextures = vs.useTextureCompression;
m_useCompressedTextures = useDXTnTextures;
@ -223,7 +221,7 @@ namespace Graphics {
glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_NICEST);
SetClearColor(Color4f(0.f, 0.f, 0.f, 0.f));
SetViewport(0, 0, m_width, m_height);
SetViewport(Viewport(0, 0, m_width, m_height));
if (vs.enableDebugMessages)
GLDebug::Enable();
@ -573,22 +571,16 @@ namespace Graphics {
return true;
}
bool RendererOGL::SetViewport(int x, int y, int width, int height)
bool RendererOGL::SetViewport(Viewport v)
{
assert(!m_viewportStack.empty());
Viewport &currentViewport = m_viewportStack.top();
currentViewport.x = x;
currentViewport.y = y;
currentViewport.w = width;
currentViewport.h = height;
glViewport(x, y, width, height);
m_viewport = v;
glViewport(v.x, v.y, v.w, v.h);
return true;
}
bool RendererOGL::SetTransform(const matrix4x4d &m)
Viewport RendererOGL::GetViewport() const
{
PROFILE_SCOPED()
return SetTransform(matrix4x4f(m));
return m_viewport;
}
bool RendererOGL::SetTransform(const matrix4x4f &m)
@ -694,7 +686,6 @@ namespace Graphics {
void RendererOGL::SetMaterialShaderTransforms(Material *m)
{
//m->SetCommonUniforms(m_modelViewStack.top(), m_projectionStack.top());
m->SetCommonUniforms(m_modelViewMat, m_projectionMat);
CheckRenderErrors(__FUNCTION__, __LINE__);
}
@ -1165,15 +1156,12 @@ namespace Graphics {
// only restoring the things that have changed
void RendererOGL::PushState()
{
m_viewportStack.push(m_viewportStack.top());
// empty since viewport handling is now external, evaluate if renderer will need to save any custom state
}
void RendererOGL::PopState()
{
m_viewportStack.pop();
assert(!m_viewportStack.empty());
const Viewport &cvp = m_viewportStack.top();
SetViewport(cvp.x, cvp.y, cvp.w, cvp.h);
// empty since viewport handling is now external, evaluate if renderer will need to save any custom state
}
bool RendererOGL::Screendump(ScreendumpState &sd)

View File

@ -75,9 +75,9 @@ namespace Graphics {
virtual bool ClearDepthBuffer() override final;
virtual bool SetClearColor(const Color &c) override final;
virtual bool SetViewport(int x, int y, int width, int height) override final;
virtual bool SetViewport(Viewport v) override final;
virtual Viewport GetViewport() const override final;
virtual bool SetTransform(const matrix4x4d &m) override final;
virtual bool SetTransform(const matrix4x4f &m) override final;
virtual matrix4x4f GetTransform() const override final;
@ -112,15 +112,6 @@ namespace Graphics {
virtual bool ReloadShaders() override final;
virtual void GetCurrentViewport(Sint32 *vp) const override final
{
const Viewport &cur = m_viewportStack.top();
vp[0] = cur.x;
vp[1] = cur.y;
vp[2] = cur.w;
vp[3] = cur.h;
}
virtual bool Screendump(ScreendumpState &sd) override final;
virtual bool FrameGrab(ScreendumpState &sd) override final;
@ -162,16 +153,7 @@ namespace Graphics {
matrix4x4f m_modelViewMat;
matrix4x4f m_projectionMat;
struct Viewport {
Viewport() :
x(0),
y(0),
w(0),
h(0) {}
Sint32 x, y, w, h;
};
std::stack<Viewport> m_viewportStack;
Viewport m_viewport;
private:
static bool initted;

View File

@ -22,7 +22,7 @@ namespace Gui {
Gui::Widget *Screen::focusedWidget;
matrix4x4f Screen::modelMatrix;
matrix4x4f Screen::projMatrix;
Sint32 Screen::viewport[4];
Graphics::Viewport Screen::viewport;
FontCache Screen::s_fontCache;
std::stack<RefCountedPtr<Text::TextureFont>> Screen::s_fontStack;
@ -124,8 +124,8 @@ namespace Gui {
(vclip[2] / w) * 0.5 + 0.5
};
out.x = v[0] * viewport[2] + viewport[0];
out.y = v[1] * viewport[3] + viewport[1];
out.x = v[0] * viewport.w + viewport.x;
out.y = v[1] * viewport.h + viewport.y;
out.z = v[2];
// map to pixels
@ -143,7 +143,7 @@ namespace Gui {
modelMatrix = r->GetTransform();
projMatrix = r->GetProjection();
r->GetCurrentViewport(&viewport[0]);
viewport = r->GetViewport();
r->SetOrthographicProjection(0, width, height, 0, -1, 1);
r->SetTransform(matrix4x4f::Identity());
}

View File

@ -6,6 +6,7 @@
#include "FontCache.h"
#include "Gui.h"
#include "graphics/Graphics.h"
#include "graphics/RenderState.h"
#include "text/TextureFont.h"
#include <list>
@ -87,7 +88,7 @@ namespace Gui {
static void OnDeleteFocusedWidget();
static matrix4x4f modelMatrix;
static matrix4x4f projMatrix;
static Sint32 viewport[4];
static Graphics::Viewport viewport;
static FontCache s_fontCache;
static std::stack<RefCountedPtr<Text::TextureFont>> s_fontStack;

View File

@ -67,7 +67,7 @@ void ModelSpinner::Render()
r->SetPerspectiveProjection(fov, m_size.x / m_size.y, 1.f, 10000.f);
r->SetTransform(matrix4x4f::Identity());
const auto &desc = m_renderTarget.get()->GetDesc();
r->SetViewport(0, 0, desc.width, desc.height);
r->SetViewport({ 0, 0, desc.width, desc.height });
r->SetLights(1, &m_light);

View File

@ -163,7 +163,7 @@ namespace UI {
// Ticket for the viewport mostly
Graphics::Renderer::StateTicket ticket(r);
r->SetViewport(0, 0, m_width, m_height);
r->SetViewport({ 0, 0, m_width, m_height });
// reset renderer for each layer
for (std::vector<Layer *>::iterator i = m_layers.begin(); i != m_layers.end(); ++i) {