1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-10 17:42:29 +01:00

Line drawing algorithms now use screen coords

This commit is contained in:
Michael Bernardi
2024-09-25 00:55:38 +10:00
parent 88856ed5a1
commit 914ff59b3b
3 changed files with 22 additions and 34 deletions

View File

@@ -607,9 +607,8 @@ uint8_t OpenGLDrawingContext::ComputeOutCode(
// based on: https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm
bool OpenGLDrawingContext::CohenSutherlandLineClip(ScreenLine& line, const DrawPixelInfo& dpi)
{
// TODO (mber) make this work entirely with screen coords.
ScreenCoordsXY topLeft = { dpi.WorldX(), dpi.WorldY() };
ScreenCoordsXY bottomRight = { dpi.WorldX() + dpi.WorldWidth() - 1, dpi.WorldY() + dpi.WorldHeight() - 1 };
ScreenCoordsXY topLeft = { dpi.ScreenX(), dpi.ScreenY() };
ScreenCoordsXY bottomRight = { dpi.ScreenX() + dpi.ScreenWidth() - 1, dpi.ScreenY() + dpi.ScreenHeight() - 1 };
uint8_t outcode1 = ComputeOutCode(line.Point1, topLeft, bottomRight);
uint8_t outcode2 = ComputeOutCode(line.Point2, topLeft, bottomRight);
@@ -672,8 +671,9 @@ bool OpenGLDrawingContext::CohenSutherlandLineClip(ScreenLine& line, const DrawP
void OpenGLDrawingContext::DrawLine(DrawPixelInfo& dpi, uint32_t colour, const ScreenLine& line)
{
// TODO (mber) make this work entirely with screen coords.
ScreenLine trimmedLine = line;
const ZoomLevel zoom = dpi.zoom_level;
ScreenLine trimmedLine = { { zoom.ApplyInversedTo(line.GetX1()), zoom.ApplyInversedTo(line.GetY1()) },
{ zoom.ApplyInversedTo(line.GetX2()), zoom.ApplyInversedTo(line.GetY2()) } };
if (!CohenSutherlandLineClip(trimmedLine, dpi))
return;
@@ -681,10 +681,10 @@ void OpenGLDrawingContext::DrawLine(DrawPixelInfo& dpi, uint32_t colour, const S
DrawLineCommand& command = _commandBuffers.lines.allocate();
const int32_t x1 = dpi.zoom_level.ApplyInversedTo(trimmedLine.GetX1() - dpi.WorldX()) + _clipLeft;
const int32_t y1 = dpi.zoom_level.ApplyInversedTo(trimmedLine.GetY1() - dpi.WorldY()) + _clipTop;
const int32_t x2 = dpi.zoom_level.ApplyInversedTo(trimmedLine.GetX2() - dpi.WorldX()) + _clipLeft;
const int32_t y2 = dpi.zoom_level.ApplyInversedTo(trimmedLine.GetY2() - dpi.WorldY()) + _clipTop;
const int32_t x1 = trimmedLine.GetX1() - dpi.ScreenX() + _clipLeft;
const int32_t y1 = trimmedLine.GetY1() - dpi.ScreenY() + _clipTop;
const int32_t x2 = trimmedLine.GetX2() - dpi.ScreenX() + _clipLeft;
const int32_t y2 = trimmedLine.GetY2() - dpi.ScreenY() + _clipTop;
command.bounds = { x1, y1, x2, y2 };
command.colour = colour & 0xFF;

View File

@@ -18,13 +18,10 @@
*/
static void GfxDrawLineOnBuffer(DrawPixelInfo& dpi, char colour, const ScreenCoordsXY& coords, int32_t no_pixels)
{
ScreenCoordsXY offset{ coords.x - dpi.WorldX(), coords.y - dpi.WorldY() };
ScreenCoordsXY offset{ coords.x - dpi.ScreenX(), coords.y - dpi.ScreenY() };
offset.x = dpi.zoom_level.ApplyInversedTo(offset.x);
offset.y = dpi.zoom_level.ApplyInversedTo(offset.y);
no_pixels = dpi.zoom_level.ApplyInversedTo(no_pixels);
const int32_t width = dpi.zoom_level.ApplyInversedTo(dpi.WorldWidth());
const int32_t height = dpi.zoom_level.ApplyInversedTo(dpi.WorldHeight());
const int32_t width = dpi.ScreenWidth();
const int32_t height = dpi.ScreenHeight();
// Check to make sure point is in the y range
if (offset.y < 0)
@@ -57,7 +54,7 @@ static void GfxDrawLineOnBuffer(DrawPixelInfo& dpi, char colour, const ScreenCoo
}
// Get the buffer we are drawing to and move to the first coordinate.
uint8_t* bits_pointer = dpi.bits + offset.y * (static_cast<int64_t>(dpi.pitch) + static_cast<int64_t>(width)) + offset.x;
uint8_t* bits_pointer = dpi.bits + offset.y * dpi.LineStride() + offset.x;
// Draw the line to the specified colour
for (; no_pixels > 0; --no_pixels, ++bits_pointer)
@@ -79,28 +76,28 @@ static void GfxDrawLineOnBuffer(DrawPixelInfo& dpi, char colour, const ScreenCoo
void GfxDrawLineSoftware(DrawPixelInfo& dpi, const ScreenLine& line, int32_t colour)
{
// TODO: (mber) Rewrite to work with screen DPI coordinates rather than world.
int32_t x1 = line.GetX1();
int32_t x2 = line.GetX2();
int32_t y1 = line.GetY1();
int32_t y2 = line.GetY2();
const ZoomLevel zoom = dpi.zoom_level;
int32_t x1 = zoom.ApplyInversedTo(line.GetX1());
int32_t x2 = zoom.ApplyInversedTo(line.GetX2());
int32_t y1 = zoom.ApplyInversedTo(line.GetY1());
int32_t y2 = zoom.ApplyInversedTo(line.GetY2());
// Check to make sure the line is within the drawing area
if ((x1 < dpi.WorldX()) && (x2 < dpi.WorldX()))
if ((x1 < dpi.ScreenX()) && (x2 < dpi.ScreenX()))
{
return;
}
if ((y1 < dpi.WorldY()) && (y2 < dpi.WorldY()))
if ((y1 < dpi.ScreenY()) && (y2 < dpi.ScreenY()))
{
return;
}
if ((x1 > (dpi.WorldX() + dpi.WorldWidth())) && (x2 > (dpi.WorldX() + dpi.WorldWidth())))
if ((x1 > (dpi.ScreenX() + dpi.ScreenWidth())) && (x2 > (dpi.ScreenX() + dpi.ScreenWidth())))
{
return;
}
if ((y1 > (dpi.WorldY() + dpi.WorldHeight())) && (y2 > (dpi.WorldY() + dpi.WorldHeight())))
if ((y1 > (dpi.ScreenY() + dpi.ScreenHeight())) && (y2 > (dpi.ScreenY() + dpi.ScreenHeight())))
{
return;
}

View File

@@ -2026,14 +2026,5 @@ void ViewportSetSavedView()
ZoomLevel ZoomLevel::min()
{
// TODO (mber) complete work for sofware zooming or revert change.
return ZoomLevel{ -2 };
// #ifndef DISABLE_OPENGL
// if (drawing_engine_get_type() == DrawingEngine::OpenGL)
// {
// return ZoomLevel{ -2 };
// }
// #endif
//
// return ZoomLevel{ 0 };
}