summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2020-10-19 10:51:21 +1100
committer Vas Crabb <vas@vastheman.com>2020-10-19 10:51:21 +1100
commit66d2045d356561f15f022ac572835d581a78280e (patch)
treeb535244e37f016b63babe957470167b20c3ea650
parentc88f0006c93e64bdf86e094cc97c8447885549ca (diff)
-emu/rendlay.cpp: Avoid another issue with floating point error accumulation when drawing disk components.
-fidel_dames.cpp: Draw buttons as single elements - improves appearance at small sizes.
-rw-r--r--src/emu/rendlay.cpp47
-rw-r--r--src/mame/layout/fidel_dsc.lay68
2 files changed, 64 insertions, 51 deletions
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index 1f10941bbab..833d9e4e86d 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -38,7 +38,8 @@
#define LOG_GROUP_BOUNDS_RESOLUTION (1U << 1)
#define LOG_INTERACTIVE_ITEMS (1U << 2)
-#define LOG_IMAGE_LOAD (1U << 3)
+#define LOG_DISK_DRAW (1U << 3)
+#define LOG_IMAGE_LOAD (1U << 4)
//#define VERBOSE (LOG_GROUP_BOUNDS_RESOLUTION | LOG_INTERACTIVE_ITEMS | LOG_IMAGE_LOAD)
#define LOG_OUTPUT_FUNC osd_printf_verbose
@@ -2041,6 +2042,8 @@ public:
float const yradius = curbounds.height() * float(dest.height()) * 0.5F;
s32 const miny = s32(curbounds.y0 * float(dest.height()));
s32 const maxy = s32(std::ceil(curbounds.y1 * float(dest.height()))) - 1;
+ LOGMASKED(LOG_DISK_DRAW, "Draw disk: bounds (%s %s %s %s); (((x - %s) ** 2) / (%s ** 2) + ((y - %s) ** 2) / (%s ** 2)) = 1; rows [%s %s]\n",
+ curbounds.x0, curbounds.y0, curbounds.x1, curbounds.y1, xcenter, xradius, ycenter, yradius, miny, maxy);
if (miny == maxy)
{
@@ -2115,17 +2118,18 @@ public:
// draw rows above the axis
s32 y = miny + 1;
float ycoord1 = ycenter - float(y);
- float xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- float l1 = xcenter - xval1;
- float r1 = xcenter + xval1;
+ float xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ float l1 = xcenter - (xval1 * xradius);
+ float r1 = xcenter + (xval1 * xradius);
for ( ; (maxy > y) && (float(y + 1) <= ycenter); ++y)
{
+ float const xval0 = xval1;
float const l0 = l1;
float const r0 = r1;
ycoord1 = ycenter - float(y + 1);
- xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- l1 = xcenter - xval1;
- r1 = xcenter + xval1;
+ xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ l1 = xcenter - (xval1 * xradius);
+ r1 = xcenter + (xval1 * xradius);
s32 minx = int(l1);
s32 maxx = int(std::ceil(r1)) - 1;
u32 *dst = &dest.pix(y, minx);
@@ -2142,13 +2146,13 @@ public:
{
float val = 0.0F;
if (float(x + 1) <= l0)
- val += integral((xcenter - float(x + 1)) / xradius, (xcenter - (std::max)(float(x), l1)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval1), (float(x + 1) - xcenter) / xradius);
else if (float(x) <= l0)
- val += integral((xcenter - l0) / xradius, (xcenter - (std::max)(float(x), l1)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval1), -xval0);
else if (float(x) >= r0)
- val += integral((float(x) - xcenter) / xradius, ((std::min)(float(x + 1), r1) - xcenter) / xradius);
+ val += integral((float(x) - xcenter) / xradius, (std::min)((float(x + 1) - xcenter) / xradius, xval1));
else if (float(x + 1) >= r0)
- val += integral((r0 - xcenter) / xradius, ((std::min)(float(x + 1), r1) - xcenter) / xradius);
+ val += integral(xval0, (std::min)((float(x + 1) - xcenter) / xradius, xval1));
val *= scale;
if (float(x) <= l0)
val -= ((std::min)(float(x + 1), l0) - (std::max)(float(x), l1)) * ycoord1;
@@ -2166,9 +2170,9 @@ public:
float const l0 = l1;
float const r0 = r1;
ycoord1 = float(y + 1) - ycenter;
- xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- l1 = xcenter - xval1;
- r1 = xcenter + xval1;
+ xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ l1 = xcenter - (xval1 * xradius);
+ r1 = xcenter + (xval1 * xradius);
s32 const minx = int(curbounds.x0 * float(dest.width()));
s32 const maxx = int(std::ceil(curbounds.x1 * float(dest.width()))) - 1;
u32 *dst = &dest.pix(y, minx);
@@ -2213,12 +2217,13 @@ public:
for ( ; maxy > y; ++y)
{
float const ycoord0 = ycoord1;
+ float const xval0 = xval1;
float const l0 = l1;
float const r0 = r1;
ycoord1 = float(y + 1) - ycenter;
- xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- l1 = xcenter - xval1;
- r1 = xcenter + xval1;
+ xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ l1 = xcenter - (xval1 * xradius);
+ r1 = xcenter + (xval1 * xradius);
s32 minx = int(l0);
s32 maxx = int(std::ceil(r0)) - 1;
u32 *dst = &dest.pix(y, minx);
@@ -2235,13 +2240,13 @@ public:
{
float val = 0.0F;
if (float(x + 1) <= l1)
- val += integral((xcenter - float(x + 1)) / xradius, (xcenter - (std::max)(float(x), l0)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval0), (float(x + 1) - xcenter) / xradius);
else if (float(x) <= l1)
- val += integral((xcenter - l1) / xradius, (xcenter - (std::max)(float(x), l0)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval0), -xval1);
else if (float(x) >= r1)
- val += integral((float(x) - xcenter) / xradius, ((std::min)(float(x + 1), r0) - xcenter) / xradius);
+ val += integral((float(x) - xcenter) / xradius, (std::min)((float(x + 1) - xcenter) / xradius, xval0));
else if (float(x + 1) >= r1)
- val += integral((r1 - xcenter) / xradius, ((std::min)(float(x + 1), r0) - xcenter) / xradius);
+ val += integral(xval1, (std::min)((float(x + 1) - xcenter) / xradius, xval0));
val *= scale;
if (float(x) <= l1)
val -= ((std::min)(float(x + 1), l1) - (std::max)(float(x), l0)) * ycoord0;
diff --git a/src/mame/layout/fidel_dsc.lay b/src/mame/layout/fidel_dsc.lay
index bf650299775..12f80735c69 100644
--- a/src/mame/layout/fidel_dsc.lay
+++ b/src/mame/layout/fidel_dsc.lay
@@ -8,8 +8,32 @@ license:CC0
<element name="black"><rect><color red="0.17" green="0.15" blue="0.15" /></rect></element>
<element name="white"><rect><color red="0.81" green="0.8" blue="0.79" /></rect></element>
- <element name="disk_black"><disk><color red="0.17" green="0.15" blue="0.15" /></disk></element>
- <element name="disk_white"><disk><color red="0.81" green="0.8" blue="0.79" /></disk></element>
+
+ <element name="btn_white">
+ <disk>
+ <bounds xc="0" yc="0" width="7" height="7" />
+ <color red="0.17" green="0.15" blue="0.15" />
+ </disk>
+ <disk>
+ <bounds xc="0" yc="0" width="5.2" height="5.2" />
+ <color red="0.81" green="0.8" blue="0.79" />
+ </disk>
+ </element>
+
+ <element name="btn_black">
+ <disk>
+ <bounds xc="0" yc="0" width="7" height="7" />
+ <color red="0.17" green="0.15" blue="0.15" />
+ </disk>
+ <disk>
+ <bounds xc="0" yc="0" width="6.2" height="6.2" />
+ <color red="0.81" green="0.8" blue="0.79" />
+ </disk>
+ <disk>
+ <bounds xc="0" yc="0" width="5" height="5" />
+ <color red="0.17" green="0.15" blue="0.15" />
+ </disk>
+ </element>
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
@@ -21,10 +45,7 @@ license:CC0
</element>
<element name="hlb" defstate="0">
- <text string=" ">
- <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
- <color red="0.0" green="0.0" blue="0.0" />
- </text>
+ <rect><color alpha="0" /></rect> <!-- force unit square element bounds -->
<disk state="1">
<bounds x="0.0" y="0.0" width="1.0" height="1.0" />
<color red="1.0" green="1.0" blue="1.0" />
@@ -268,7 +289,7 @@ license:CC0
<element name="cwhite"><rect><color red="0.81" green="0.8" blue="0.79" /></rect></element>
<element name="hlbb" defstate="0">
- <text string=" "><bounds x="0" y="0" width="1" height="1" /></text>
+ <rect><color alpha="0" /></rect> <!-- force unit square element bounds -->
<disk state="1">
<bounds x="0.12" y="0.12" width="0.76" height="0.76" />
<color red="0" green="0" blue="0" />
@@ -276,7 +297,7 @@ license:CC0
</element>
<element name="piece" defstate="0">
- <text string=" "><bounds x="0" y="0" width="1" height="1" /></text>
+ <rect><color alpha="0" /></rect> <!-- force unit square element bounds -->
<disk state="1">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
<color red="1" green="0.9" blue="0.6" />
@@ -523,28 +544,15 @@ license:CC0
<!-- right side -->
- <element ref="disk_black"><bounds x="107" y="14.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="24.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="34.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="44.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="54.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="64.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="74.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="84.5" width="7" height="7" /></element>
- <element ref="disk_black"><bounds x="107" y="94.5" width="7" height="7" /></element>
-
- <element ref="disk_white"><bounds x="107.9" y="15.4" width="5.2" height="5.2" /></element>
- <element ref="disk_white"><bounds x="107.9" y="25.4" width="5.2" height="5.2" /></element>
- <element ref="disk_white"><bounds x="107.9" y="35.4" width="5.2" height="5.2" /></element>
- <element ref="disk_white"><bounds x="107.9" y="45.4" width="5.2" height="5.2" /></element>
- <element ref="disk_white"><bounds x="107.9" y="55.4" width="5.2" height="5.2" /></element>
- <element ref="disk_white"><bounds x="107.9" y="65.4" width="5.2" height="5.2" /></element>
- <element ref="disk_white"><bounds x="107.9" y="75.4" width="5.2" height="5.2" /></element>
-
- <element ref="disk_white"><bounds x="107.4" y="84.9" width="6.2" height="6.2" /></element>
- <element ref="disk_white"><bounds x="107.4" y="94.9" width="6.2" height="6.2" /></element>
- <element ref="disk_black"><bounds x="108" y="85.5" width="5" height="5" /></element>
- <element ref="disk_black"><bounds x="108" y="95.5" width="5" height="5" /></element>
+ <element ref="btn_white"><bounds x="107" y="14.5" width="7" height="7" /></element>
+ <element ref="btn_white"><bounds x="107" y="24.5" width="7" height="7" /></element>
+ <element ref="btn_white"><bounds x="107" y="34.5" width="7" height="7" /></element>
+ <element ref="btn_white"><bounds x="107" y="44.5" width="7" height="7" /></element>
+ <element ref="btn_white"><bounds x="107" y="54.5" width="7" height="7" /></element>
+ <element ref="btn_white"><bounds x="107" y="64.5" width="7" height="7" /></element>
+ <element ref="btn_white"><bounds x="107" y="74.5" width="7" height="7" /></element>
+ <element ref="btn_black"><bounds x="107" y="84.5" width="7" height="7" /></element>
+ <element ref="btn_black"><bounds x="107" y="94.5" width="7" height="7" /></element>
<element ref="text_re"><bounds x="108" y="16.5" width="5" height="3" /></element>
<element ref="text_pb"><bounds x="108" y="26.5" width="5" height="3" /></element>