summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author ImJezze <jezze@gmx.net>2016-05-22 20:06:00 +0200
committer ImJezze <jezze@gmx.net>2016-05-22 20:54:31 +0200
commit052fd0c608e8a4bb0ed300e4ac95638963127043 (patch)
treefbe6e94537cce505778cc2a49443d461070130b0 /src
parent92c2bdf9170662274f0c2ca1e3a30357f02ca977 (diff)
Moved extension of vector lines to where it belongs (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/video/vector.cpp56
-rw-r--r--src/emu/rendutil.cpp40
-rw-r--r--src/emu/rendutil.h2
-rw-r--r--src/osd/modules/render/drawd3d.cpp4
-rw-r--r--src/osd/modules/render/drawogl.cpp2
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;