forked from Mirrors/openclonk
Fix full map screenshots (#1220).
Fixed upperboard, borders when screenshotting while at the side of the map and issues when multiple viewports were open.issue1247
parent
041532505b
commit
c714e5e3b2
|
@ -249,9 +249,14 @@ bool C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename, f
|
|||
C4TargetFacet bkFct;
|
||||
// mark background to be redrawn
|
||||
InvalidateBg();
|
||||
// draw on one big viewport
|
||||
pVP->SetOutputSize(0,0,0,0, bkWdt, bkHgt);
|
||||
// backup and clear sky parallaxity
|
||||
int32_t iParX=::Landscape.Sky.ParX; ::Landscape.Sky.ParX=10;
|
||||
int32_t iParY=::Landscape.Sky.ParY; ::Landscape.Sky.ParY=10;
|
||||
// backup and clear viewport borders
|
||||
FLOAT_RECT vp_borders = { pVP->BorderLeft, pVP->BorderRight, pVP->BorderTop, pVP->BorderBottom };
|
||||
pVP->BorderLeft = pVP->BorderRight = pVP->BorderTop = pVP->BorderBottom = 0.0f;
|
||||
// temporarily change viewport player
|
||||
int32_t iVpPlr=pVP->Player; pVP->Player=NO_OWNER;
|
||||
// blit all tiles needed
|
||||
|
@ -280,9 +285,16 @@ bool C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename, f
|
|||
}
|
||||
// restore viewport player
|
||||
pVP->Player=iVpPlr;
|
||||
// restore viewport borders
|
||||
pVP->BorderLeft = vp_borders.left;
|
||||
pVP->BorderTop = vp_borders.top;
|
||||
pVP->BorderRight = vp_borders.right;
|
||||
pVP->BorderBottom = vp_borders.bottom;
|
||||
// restore parallaxity
|
||||
::Landscape.Sky.ParX=iParX;
|
||||
::Landscape.Sky.ParY=iParY;
|
||||
// restore viewport size
|
||||
::Viewports.RecalculateViewports();
|
||||
// save!
|
||||
return png.Save(szFilename);
|
||||
}
|
||||
|
|
|
@ -194,20 +194,18 @@ void C4Viewport::Draw(C4TargetFacet &cgo0, bool fDrawOverlay)
|
|||
GameZoom.X = cgo.X; GameZoom.Y = cgo.Y;
|
||||
GameZoom.Zoom = cgo.Zoom;
|
||||
|
||||
if (fDrawOverlay)
|
||||
{
|
||||
// Draw landscape borders. Only if overlay, so complete map screenshots don't get messed up
|
||||
if (BorderLeft > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX,DrawY,BorderLeft,ViewHgt,-DrawX,-DrawY);
|
||||
if (BorderTop > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX+BorderLeft,DrawY,ViewWdt-BorderLeft-BorderRight,BorderTop,-DrawX-BorderLeft,-DrawY);
|
||||
if (BorderRight > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX+ViewWdt-BorderRight,DrawY,BorderRight,ViewHgt,-DrawX-ViewWdt+BorderRight,-DrawY);
|
||||
if (BorderBottom > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX+BorderLeft,DrawY+ViewHgt-BorderBottom,ViewWdt-BorderLeft-BorderRight,BorderBottom,-DrawX-BorderLeft,-DrawY-ViewHgt+BorderBottom);
|
||||
}
|
||||
// Draw landscape borders
|
||||
if (BorderLeft > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX, DrawY, BorderLeft, ViewHgt, -DrawX, -DrawY);
|
||||
if (BorderTop > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX + BorderLeft, DrawY, ViewWdt - BorderLeft - BorderRight, BorderTop, -DrawX - BorderLeft, -DrawY);
|
||||
if (BorderRight > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX + ViewWdt - BorderRight, DrawY, BorderRight, ViewHgt, -DrawX - ViewWdt + BorderRight, -DrawY);
|
||||
if (BorderBottom > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX + BorderLeft, DrawY + ViewHgt - BorderBottom, ViewWdt - BorderLeft - BorderRight, BorderBottom, -DrawX - BorderLeft, -DrawY - ViewHgt + BorderBottom);
|
||||
|
||||
// Compute non-bordered viewport area
|
||||
cgo.X += BorderLeft; cgo.Y += BorderTop; cgo.Wdt -= (BorderLeft+BorderRight)/cgo.Zoom; cgo.Hgt -= (BorderTop+BorderBottom)/cgo.Zoom;
|
||||
GameZoom.X = cgo.X; GameZoom.Y = cgo.Y;
|
||||
cgo.TargetX += BorderLeft/Zoom; cgo.TargetY += BorderTop/Zoom;
|
||||
cgo.X += BorderLeft; cgo.Y += BorderTop; cgo.Wdt -= (BorderLeft + BorderRight) / cgo.Zoom; cgo.Hgt -= (BorderTop + BorderBottom) / cgo.Zoom;
|
||||
cgo.TargetX += BorderLeft / Zoom; cgo.TargetY += BorderTop / Zoom;
|
||||
|
||||
// Apply Zoom
|
||||
GameZoom.X = cgo.X; GameZoom.Y = cgo.Y;
|
||||
pDraw->SetZoom(GameZoom);
|
||||
// Set clipper to integer bounds around floating point viewport region
|
||||
const FLOAT_RECT clipRect = { DrawX + BorderLeft, DrawX + ViewWdt - BorderRight, DrawY + BorderTop, DrawY + ViewHgt - BorderBottom };
|
||||
|
|
Loading…
Reference in New Issue