Skip to content

Commit

Permalink
Refactor|Renderer|Viewport: Represent viewport and viewwindow geometr…
Browse files Browse the repository at this point in the history
…y as de::Rectanglei
  • Loading branch information
danij-deng committed Dec 14, 2013
1 parent 245e41b commit aae6a42
Show file tree
Hide file tree
Showing 9 changed files with 175 additions and 183 deletions.
2 changes: 1 addition & 1 deletion doomsday/client/include/render/consoleeffect.h
Expand Up @@ -42,7 +42,7 @@ class ConsoleEffect
/**
* Determines the console's view rectangle in window coordinates.
*/
de::Rectanglei viewRect() const;
de::Rectanglei const &viewRect() const;

bool isInited() const;

Expand Down
27 changes: 14 additions & 13 deletions doomsday/client/include/render/viewports.h
Expand Up @@ -24,6 +24,7 @@
# error "viewports.h is for the client only"
#endif

#include <de/Rectangle>
#include <de/Vector>
#include <de/rect.h>

Expand All @@ -33,7 +34,7 @@ class Lumobj;
struct viewport_t
{
int console;
RectRaw geometry;
de::Rectanglei geometry;
};

struct viewer_t
Expand Down Expand Up @@ -78,7 +79,7 @@ struct viewdata_t

float viewCos, viewSin;

RectRaw window, windowTarget, windowOld;
de::Rectanglei window, windowTarget, windowOld;
float windowInter;
};

Expand All @@ -96,7 +97,7 @@ DENG_EXTERN_C boolean firstFrameAfterLoad;
/**
* Register console variables.
*/
void Viewports_Register(void);
void Viewports_Register();

int R_FrameCount();

Expand All @@ -110,15 +111,15 @@ void R_RenderViewPorts(ui::ViewPortLayer layer);
/**
* Render a blank view for the specified player.
*/
void R_RenderBlankView(void);
void R_RenderBlankView();

/**
* Draw the border around the view window.
*/
void R_RenderPlayerViewBorder(void);
void R_RenderPlayerViewBorder();

/// @return Current viewport; otherwise @c NULL.
viewport_t const *R_CurrentViewPort(void);
/// @return Current viewport; otherwise @c 0.
viewport_t const *R_CurrentViewPort();

/**
* Set the current GL viewport.
Expand All @@ -129,22 +130,22 @@ viewdata_t const *R_ViewData(int consoleNum);

void R_UpdateViewer(int consoleNum);

void R_ResetViewer(void);
void R_ResetViewer();

int R_NextViewer(void);
int R_NextViewer();

void R_ClearViewData(void);
void R_ClearViewData();

/**
* To be called at the beginning of a render frame to perform necessary initialization.
*/
void R_BeginFrame(void);
void R_BeginFrame();

/**
* Update the sharp world data by rotating the stored values of plane
* heights and sharp camera positions.
*/
void R_NewSharpWorld(void);
void R_NewSharpWorld();

/**
* Returns @c true iff the BSP leaf is marked as visible for the current frame.
Expand Down Expand Up @@ -183,7 +184,7 @@ void R_ViewerClipLumobjBySight(Lumobj *lum, BspLeaf *bspLeaf);
* Attempt to set up a view grid and calculate the viewports. Set 'numCols' and
* 'numRows' to zero to just update the viewport coordinates.
*/
boolean R_SetViewGrid(int numCols, int numRows);
bool R_SetViewGrid(int numCols, int numRows);

void R_SetupDefaultViewWindow(int consoleNum);

Expand Down
2 changes: 1 addition & 1 deletion doomsday/client/include/ui/widgets/gamewidget.h
Expand Up @@ -39,7 +39,7 @@ class GameWidget : public GuiWidget
*
* This is only intended to support old graphics code that doesn't use libgui.
*/
void glApplyViewport(int x, int y, int width, int height);
void glApplyViewport(de::Rectanglei const &rect);

void viewResized();
void update();
Expand Down
8 changes: 4 additions & 4 deletions doomsday/client/src/gl/gl_draw.cpp
Expand Up @@ -332,10 +332,10 @@ void GL_DrawFilter(void)

glColor4f(filterColor.x, filterColor.y, filterColor.z, filterColor.w);
glBegin(GL_QUADS);
glVertex2f(vd->window.origin.x, vd->window.origin.y);
glVertex2f(vd->window.origin.x + vd->window.size.width, vd->window.origin.y);
glVertex2f(vd->window.origin.x + vd->window.size.width, vd->window.origin.y + vd->window.size.height);
glVertex2f(vd->window.origin.x, vd->window.origin.y + vd->window.size.height);
glVertex2f(vd->window.topLeft.x, vd->window.topLeft.y);
glVertex2f(vd->window.topRight().x, vd->window.topRight().y);
glVertex2f(vd->window.bottomRight.x, vd->window.bottomRight.y);
glVertex2f(vd->window.bottomLeft().x, vd->window.bottomLeft().y);
glEnd();
}

Expand Down
42 changes: 21 additions & 21 deletions doomsday/client/src/gl/gl_main.cpp
Expand Up @@ -468,14 +468,15 @@ void GL_SwitchTo3DState(boolean push_state, viewport_t const *port, viewdata_t c
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);

memcpy(&currentView, port, sizeof(currentView));
std::memcpy(&currentView, port, sizeof(currentView));

viewpx = port->geometry.origin.x + viewData->window.origin.x;
viewpy = port->geometry.origin.y + viewData->window.origin.y;
viewpw = MIN_OF(port->geometry.size.width, viewData->window.size.width);
viewph = MIN_OF(port->geometry.size.height, viewData->window.size.height);
viewpx = port->geometry.topLeft.x + viewData->window.topLeft.x;
viewpy = port->geometry.topLeft.y + viewData->window.topLeft.y;
viewpw = de::min(port->geometry.width(), viewData->window.width());
viewph = de::min(port->geometry.height(), viewData->window.height());

ClientWindow::main().game().glApplyViewport(viewpx, viewpy, viewpw, viewph);
ClientWindow::main().game().glApplyViewport(Rectanglei::fromSize(Vector2i(viewpx, viewpy),
Vector2ui(viewpw, viewph)));

// The 3D projection matrix.
GL_ProjectionMatrix();
Expand All @@ -489,9 +490,9 @@ void GL_Restore2DState(int step, viewport_t const *port, viewdata_t const *viewD
switch(step)
{
case 1: { // After Restore Step 1 normal player sprites are rendered.
int height = (float)(port->geometry.size.width * viewData->window.size.height / viewData->window.size.width) / port->geometry.size.height * SCREENHEIGHT;
int height = (float)(port->geometry.width() * viewData->window.height() / viewData->window.width()) / port->geometry.height() * SCREENHEIGHT;
scalemode_t sm = R_ChooseScaleMode(SCREENWIDTH, SCREENHEIGHT,
port->geometry.size.width, port->geometry.size.height,
port->geometry.width(), port->geometry.height(),
scalemode_t(weaponScaleMode));

glMatrixMode(GL_PROJECTION);
Expand All @@ -509,19 +510,22 @@ void GL_Restore2DState(int step, viewport_t const *port, viewdata_t const *viewD
* corrected coordinate space at 4:3, aligned vertically to
* the bottom and centered horizontally in the window.
*/
glOrtho(0, port->geometry.size.width, port->geometry.size.height, 0, -1, 1);
glTranslatef(port->geometry.size.width/2, port->geometry.size.height, 0);
glOrtho(0, port->geometry.width(), port->geometry.height(), 0, -1, 1);
glTranslatef(port->geometry.width()/2, port->geometry.height(), 0);

if(port->geometry.size.width >= port->geometry.size.height)
glScalef((float)port->geometry.size.height/SCREENHEIGHT, (float)port->geometry.size.height/SCREENHEIGHT, 1);
if(port->geometry.width() >= port->geometry.height())
glScalef((float)port->geometry.height() / SCREENHEIGHT,
(float)port->geometry.height() / SCREENHEIGHT, 1);
else
glScalef((float)port->geometry.size.width/SCREENWIDTH, (float)port->geometry.size.width/SCREENWIDTH, 1);
glScalef((float)port->geometry.width() / SCREENWIDTH,
(float)port->geometry.width() / SCREENWIDTH, 1);

// Special case: viewport height is greater than width.
// Apply an additional scaling factor to prevent player sprites looking too small.
if(port->geometry.size.height > port->geometry.size.width)
// Apply an additional scaling factor to prevent player sprites
// looking too small.
if(port->geometry.height() > port->geometry.width())
{
float extraScale = (((float)port->geometry.size.height*2)/port->geometry.size.width) / 2;
float extraScale = (((float)port->geometry.height()*2)/port->geometry.width()) / 2;
glScalef(extraScale, extraScale, 1);
}

Expand All @@ -538,11 +542,7 @@ void GL_Restore2DState(int step, viewport_t const *port, viewdata_t const *viewD
break; }

case 2: // After Restore Step 2 we're back in 2D rendering mode.
ClientWindow::main().game().
glApplyViewport(currentView.geometry.origin.x,
currentView.geometry.origin.y,
currentView.geometry.size.width,
currentView.geometry.size.height);
ClientWindow::main().game().glApplyViewport(currentView.geometry);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
Expand Down
7 changes: 2 additions & 5 deletions doomsday/client/src/render/consoleeffect.cpp
Expand Up @@ -44,13 +44,10 @@ int ConsoleEffect::console() const
return d->console;
}

Rectanglei ConsoleEffect::viewRect() const
Rectanglei const &ConsoleEffect::viewRect() const
{
viewdata_t const *vd = R_ViewData(d->console);
return Rectanglei(vd->window.origin.x,
vd->window.origin.y,
vd->window.size.width,
vd->window.size.height);
return vd->window;
}

bool ConsoleEffect::isInited() const
Expand Down
50 changes: 23 additions & 27 deletions doomsday/client/src/render/r_draw.cpp
Expand Up @@ -217,21 +217,14 @@ static MaterialVariantSpec const &bgMaterialSpec()
/// @todo Optimize: Do not search for resources (materials, textures) each frame.
void R_DrawViewBorder()
{
DENG_ASSERT(inited);
DENG2_ASSERT(inited);

viewport_t const *port = R_CurrentViewPort();
viewdata_t const *vd = R_ViewData(displayPlayer);
DENG_ASSERT(port != 0 && vd != 0);
DENG2_ASSERT(port != 0 && vd != 0);

if(!vd->window.size.width || !vd->window.size.height)
{
return;
}
if(vd->window.size.width == port->geometry.size.width &&
vd->window.size.height == port->geometry.size.height)
{
return;
}
if(vd->window.isNull()) return;
if(vd->window.size() >= port->geometry.size()) return;

DENG_ASSERT_IN_MAIN_THREAD();
DENG_ASSERT_GL_CONTEXT_ACTIVE();
Expand All @@ -243,15 +236,17 @@ void R_DrawViewBorder()

// Scale from viewport space to fixed 320x200 space.
int border;
if(port->geometry.size.width >= port->geometry.size.height)
if(port->geometry.width() >= port->geometry.height())
{
glScalef(float(SCREENHEIGHT) / port->geometry.size.height, float(SCREENHEIGHT) / port->geometry.size.height, 1);
border = float(borderSize) / SCREENHEIGHT * port->geometry.size.height;
glScalef(float(SCREENHEIGHT) / port->geometry.height(),
float(SCREENHEIGHT) / port->geometry.height(), 1);
border = float(borderSize) / SCREENHEIGHT * port->geometry.height();
}
else
{
glScalef(float(SCREENWIDTH) / port->geometry.size.width, float(SCREENWIDTH) / port->geometry.size.width, 1);
border = float(borderSize) / SCREENWIDTH * port->geometry.size.width;
glScalef(float(SCREENWIDTH) / port->geometry.width(),
float(SCREENWIDTH) / port->geometry.width(), 1);
border = float(borderSize) / SCREENWIDTH * port->geometry.width();
}

glColor4f(1, 1, 1, 1);
Expand All @@ -264,30 +259,31 @@ void R_DrawViewBorder()
.prepare(bgMaterialSpec());

GL_BindTexture(&ms.texture(MTU_PRIMARY));
GL_DrawCutRectf2Tiled(0, 0, port->geometry.size.width, port->geometry.size.height, ms.width(), ms.height(), 0, 0,
vd->window.origin.x - border, vd->window.origin.y - border,
vd->window.size.width + 2 * border, vd->window.size.height + 2 * border);
GL_DrawCutRectf2Tiled(0, 0, port->geometry.width(), port->geometry.height(),
ms.width(), ms.height(), 0, 0,
vd->window.topLeft.x - border, vd->window.topLeft.y - border,
vd->window.width() + 2 * border, vd->window.height() + 2 * border);
}
catch(MaterialManifest::MissingMaterialError const &)
{} // Ignore this error.

if(border)
{
R_DrawPatchTiled(borderTexture(BG_TOP), vd->window.origin.x, vd->window.origin.y - border, vd->window.size.width, border, gl::Repeat, gl::ClampToEdge);
R_DrawPatchTiled(borderTexture(BG_BOTTOM), vd->window.origin.x, vd->window.origin.y + vd->window.size.height , vd->window.size.width, border, gl::Repeat, gl::ClampToEdge);
R_DrawPatchTiled(borderTexture(BG_LEFT), vd->window.origin.x - border, vd->window.origin.y, border, vd->window.size.height, gl::ClampToEdge, gl::Repeat);
R_DrawPatchTiled(borderTexture(BG_RIGHT), vd->window.origin.x + vd->window.size.width, vd->window.origin.y, border, vd->window.size.height, gl::ClampToEdge, gl::Repeat);
R_DrawPatchTiled(borderTexture(BG_TOP), vd->window.topLeft.x, vd->window.topLeft.y - border, vd->window.width(), border, gl::Repeat, gl::ClampToEdge);
R_DrawPatchTiled(borderTexture(BG_BOTTOM), vd->window.topLeft.x, vd->window.bottomRight.y, vd->window.width(), border, gl::Repeat, gl::ClampToEdge);
R_DrawPatchTiled(borderTexture(BG_LEFT), vd->window.topLeft.x - border, vd->window.topLeft.y, border, vd->window.height(), gl::ClampToEdge, gl::Repeat);
R_DrawPatchTiled(borderTexture(BG_RIGHT), vd->window.topRight().x, vd->window.topRight().y, border, vd->window.height(), gl::ClampToEdge, gl::Repeat);
}

glMatrixMode(GL_TEXTURE);
glPopMatrix();

if(border)
{
R_DrawPatch(borderTexture(BG_TOPLEFT), vd->window.origin.x - border, vd->window.origin.y - border, border, border, false);
R_DrawPatch(borderTexture(BG_TOPRIGHT), vd->window.origin.x + vd->window.size.width, vd->window.origin.y - border, border, border, false);
R_DrawPatch(borderTexture(BG_BOTTOMRIGHT), vd->window.origin.x + vd->window.size.width, vd->window.origin.y + vd->window.size.height, border, border, false);
R_DrawPatch(borderTexture(BG_BOTTOMLEFT), vd->window.origin.x - border, vd->window.origin.y + vd->window.size.height, border, border, false);
R_DrawPatch(borderTexture(BG_TOPLEFT), vd->window.topLeft.x - border, vd->window.topLeft.y - border, border, border, false);
R_DrawPatch(borderTexture(BG_TOPRIGHT), vd->window.topRight().x, vd->window.topLeft.y - border, border, border, false);
R_DrawPatch(borderTexture(BG_BOTTOMRIGHT), vd->window.bottomRight.x, vd->window.bottomRight.y, border, border, false);
R_DrawPatch(borderTexture(BG_BOTTOMLEFT), vd->window.bottomLeft().x - border, vd->window.bottomRight.y, border, border, false);
}

glDisable(GL_TEXTURE_2D);
Expand Down

0 comments on commit aae6a42

Please sign in to comment.