From 052fd0c608e8a4bb0ed300e4ac95638963127043 Mon Sep 17 00:00:00 2001 From: ImJezze Date: Sun, 22 May 2016 20:06:00 +0200 Subject: [PATCH] Moved extension of vector lines to where it belongs (nw) --- src/devices/video/vector.cpp | 56 +++++++----------------------- src/emu/rendutil.cpp | 40 +++++++++++++++------ src/emu/rendutil.h | 2 +- src/osd/modules/render/drawd3d.cpp | 4 +-- src/osd/modules/render/drawogl.cpp | 2 +- 5 files changed, 45 insertions(+), 59 deletions(-) diff --git a/src/devices/video/vector.cpp b/src/devices/video/vector.cpp index 993157e08de..8606fe666aa 100644 --- a/src/devices/video/vector.cpp +++ b/src/devices/video/vector.cpp @@ -27,6 +27,18 @@ * added two new tables Tinten and Tmerge (for 256 color support) * added find_color routine to build above tables .ac * + * Vector Team + * + * Brad Oliver + * Aaron Giles + * Bernd Wiebelt + * Allard van der Bas + * Al Kossow (VECSIM) + * Hedley Rainnie (VECSIM) + * Eric Smith (VECSIM) + * Neil Bradley (technical advice) + * Andrew Caldwell (anti-aliasing) + * **************************************************************************** */ #include "emu.h" @@ -35,25 +47,10 @@ #include "vector.h" -#define FLT_EPSILON 1E-5 - #define VECTOR_WIDTH_DENOM 512 #define MAX_POINTS 10000 -#define VECTOR_TEAM \ - "-* Vector Heads *-\n" \ - "Brad Oliver\n" \ - "Aaron Giles\n" \ - "Bernd Wiebelt\n" \ - "Allard van der Bas\n" \ - "Al Kossow (VECSIM)\n" \ - "Hedley Rainnie (VECSIM)\n" \ - "Eric Smith (VECSIM)\n" \ - "Neil Bradley (technical advice)\n" \ - "Andrew Caldwell (anti-aliasing)\n" \ - "- *** -\n" - float vector_options::s_flicker = 0.0f; float vector_options::s_beam_width_min = 0.0f; float vector_options::s_beam_width_max = 0.0f; @@ -154,10 +151,6 @@ UINT32 vector_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, float yscale = 1.0f / (65536 * visarea.height()); float xoffs = (float)visarea.min_x; float yoffs = (float)visarea.min_y; - float xratio = xscale / yscale; - float yratio = yscale / xscale; - xratio = (xratio < 1.0f) ? xratio : 1.0f; - yratio = (yratio < 1.0f) ? yratio : 1.0f; point *curpoint; int lastx = 0; @@ -188,31 +181,6 @@ UINT32 vector_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, coords.x1 = ((float)curpoint->x - xoffs) * xscale; coords.y1 = ((float)curpoint->y - yoffs) * yscale; - float xdistance = coords.x0 - coords.x1; - float ydistance = coords.y0 - coords.y1; - - // extend zero-length vector line (vector point) by 3/8 beam_width on both sides - if (fabs(xdistance) < FLT_EPSILON && - fabs(ydistance) < FLT_EPSILON) - { - coords.x0 += xratio * beam_width * 0.375f; - coords.y0 += yratio * beam_width * 0.375f; - coords.x1 -= xratio * beam_width * 0.375f; - coords.y1 -= yratio * beam_width * 0.375f; - } - // extend vector line by 3/8 beam_width on both sides - else - { - float length = sqrt(xdistance * xdistance + ydistance * ydistance); - float xdirection = xdistance / length; - float ydirection = ydistance / length; - - coords.x0 += xratio * beam_width * 0.375f * (xdirection / xratio); - coords.y0 += yratio * beam_width * 0.375f * (ydirection / yratio); - coords.x1 -= xratio * beam_width * 0.375f * (xdirection / xratio); - coords.y1 -= yratio * beam_width * 0.375f * (ydirection / yratio); - } - if (curpoint->intensity != 0) { screen.container().add_line( diff --git a/src/emu/rendutil.cpp b/src/emu/rendutil.cpp index fefb23935fd..ee78ad5125d 100644 --- a/src/emu/rendutil.cpp +++ b/src/emu/rendutil.cpp @@ -429,10 +429,9 @@ int render_clip_quad(render_bounds *bounds, const render_bounds *clip, render_qu width to four points -------------------------------------------------*/ -void render_line_to_quad(const render_bounds *bounds, float width, render_bounds *bounds0, render_bounds *bounds1) +void render_line_to_quad(const render_bounds *bounds, float width, float length_extension, render_bounds *bounds0, render_bounds *bounds1) { render_bounds modbounds = *bounds; - float unitx, unity; /* High-level logic -- due to math optimizations, this info is lost below. @@ -480,27 +479,46 @@ void render_line_to_quad(const render_bounds *bounds, float width, render_bounds */ /* we only care about the half-width */ - width *= 0.5f; + float half_width = width * 0.5f; /* compute a vector from point 0 to point 1 */ - unitx = modbounds.x1 - modbounds.x0; - unity = modbounds.y1 - modbounds.y0; + float unitx = modbounds.x1 - modbounds.x0; + float unity = modbounds.y1 - modbounds.y0; /* points just use a +1/+1 unit vector; this gives a nice diamond pattern */ if (unitx == 0 && unity == 0) { - unitx = unity = 0.70710678f * width; - modbounds.x0 -= 0.5f * unitx; - modbounds.y0 -= 0.5f * unity; - modbounds.x1 += 0.5f * unitx; - modbounds.y1 += 0.5f * unity; + /* length of a unit vector (1,1) */ + float unit_length = 0.70710678f; + + unitx = unity = unit_length * half_width; + modbounds.x0 -= unitx; + modbounds.y0 -= unity; + modbounds.x1 += unitx; + modbounds.y1 += unity; } /* lines need to be divided by their length */ else { + float length = sqrtf(unitx * unitx + unity * unity); + + /* extend line length */ + if (length_extension > 0.0f) + { + float half_length_extension = length_extension *0.5f; + + float directionx = unitx / length; + float directiony = unity / length; + + modbounds.x0 -= directionx * half_length_extension; + modbounds.y0 -= directiony * half_length_extension; + modbounds.x1 += directionx * half_length_extension; + modbounds.y1 += directiony * half_length_extension; + } + /* prescale unitx and unity by the half-width */ - float invlength = width / sqrtf(unitx * unitx + unity * unity); + float invlength = half_width / length; unitx *= invlength; unity *= invlength; } diff --git a/src/emu/rendutil.h b/src/emu/rendutil.h index bdf01592307..2aa898ac470 100644 --- a/src/emu/rendutil.h +++ b/src/emu/rendutil.h @@ -24,7 +24,7 @@ void render_resample_argb_bitmap_hq(bitmap_argb32 &dest, bitmap_argb32 &source, const render_color &color, bool force = false); int render_clip_line(render_bounds *bounds, const render_bounds *clip); int render_clip_quad(render_bounds *bounds, const render_bounds *clip, render_quad_texuv *texcoords); -void render_line_to_quad(const render_bounds *bounds, float width, render_bounds *bounds0, render_bounds *bounds1); +void render_line_to_quad(const render_bounds *bounds, float width, float length_extension, render_bounds *bounds0, render_bounds *bounds1); void render_load_jpeg(bitmap_argb32 &bitmap, emu_file &file, const char *dirname, const char *filename); bool render_load_png(bitmap_argb32 &bitmap, emu_file &file, const char *dirname, const char *filename, bool load_as_alpha_to_existing = false); diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index 86534ee8a9e..426ea067590 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -1557,7 +1557,7 @@ void renderer_d3d9::batch_vector(const render_primitive &prim, float line_time) // determine the bounds of a quad to draw this line render_bounds b0, b1; - render_line_to_quad(&prim.bounds, effwidth, &b0, &b1); + render_line_to_quad(&prim.bounds, effwidth, effwidth, &b0, &b1); float dx = b1.x1 - b0.x1; float dy = b1.y1 - b0.y1; @@ -1663,7 +1663,7 @@ void renderer_d3d9::draw_line(const render_primitive &prim) // determine the bounds of a quad to draw this line render_bounds b0, b1; - render_line_to_quad(&prim.bounds, effwidth, &b0, &b1); + render_line_to_quad(&prim.bounds, effwidth, 0.0f, &b0, &b1); // iterate over AA steps for (const line_aa_step *step = PRIMFLAG_GET_ANTIALIAS(prim.flags) ? line_aa_4step : line_aa_1step; diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp index 907b2dd6978..57173e8e2a4 100644 --- a/src/osd/modules/render/drawogl.cpp +++ b/src/osd/modules/render/drawogl.cpp @@ -1239,7 +1239,7 @@ int renderer_ogl::draw(const int update) effwidth = 0.5f; // determine the bounds of a quad to draw this line - render_line_to_quad(&prim.bounds, effwidth, &b0, &b1); + render_line_to_quad(&prim.bounds, effwidth, 0.0f, &b0, &b1); // fix window position b0.x0 += hofs;