diff options
-rwxr-xr-x | scripts/build/complay.py | 42 | ||||
-rw-r--r-- | src/emu/render.cpp | 36 | ||||
-rw-r--r-- | src/emu/render.h | 87 | ||||
-rw-r--r-- | src/emu/rendlay.cpp | 474 | ||||
-rw-r--r-- | src/lib/util/xmlfile.cpp | 9 | ||||
-rw-r--r-- | src/mame/layout/cgang.lay | 248 |
6 files changed, 440 insertions, 456 deletions
diff --git a/scripts/build/complay.py b/scripts/build/complay.py index 34a43992b7c..a88d0d9f4a5 100755 --- a/scripts/build/complay.py +++ b/scripts/build/complay.py @@ -291,11 +291,11 @@ class LayoutChecker(Minifyer): self.have_bounds.append({ }) self.have_color.append({ }) - def startObject(self): + def startObject(self, name): self.handlers.append((self.objectStartHandler, self.objectEndHandler)) - self.have_bounds.append(None) + self.have_bounds.append(None if 'group' == name else { }) self.have_orientation.append(False) - self.have_color.append(None) + self.have_color.append(None if 'group' == name else { }) def rootStartHandler(self, name, attrs): if 'mamelayout' != name: @@ -499,7 +499,7 @@ class LayoutChecker(Minifyer): if (inputmask is not None) and (0 == inputmask): if (inputraw is None) or (0 == inputraw): self.handleError('Element %s attribute inputmask "%s" is zero' % (name, attrs['inputmask'])) - self.startObject(); + self.startObject(name) elif 'screen' == name: if 'index' in attrs: index = self.checkIntAttribute(name, attrs, 'index', None) @@ -512,7 +512,7 @@ class LayoutChecker(Minifyer): self.checkTag(tag, name, 'tag') if self.BADTAGPATTERN.search(tag): self.handleError('Element screen attribute tag "%s" contains invalid characters' % (tag, )) - self.startObject(); + self.startObject(name) elif 'group' == name: if 'ref' not in attrs: self.handleError('Element group missing attribute ref') @@ -525,7 +525,7 @@ class LayoutChecker(Minifyer): self.current_collections[n] = l else: self.handleError('Element group instantiates collection with duplicate name "%s" from %s (previous %s)' % (n, l, self.current_collections[n])) - self.startObject(); + self.startObject(name) elif 'repeat' == name: if 'count' not in attrs: self.handleError('Element repeat missing attribute count') @@ -579,18 +579,36 @@ class LayoutChecker(Minifyer): def objectStartHandler(self, name, attrs): if 'bounds' == name: - if self.have_bounds[-1] is not None: - self.handleError('Duplicate element bounds (previous %s)' % (self.have_bounds[-1], )) - else: + if self.have_bounds[-1] is None: self.have_bounds[-1] = self.formatLocation() + elif isinstance(self.have_bounds[-1], dict): + state = self.checkIntAttribute(name, attrs, 'state', 0) + if state is not None: + if 0 > state: + self.handleError('Element bounds attribute state "%s" is negative' % (attrs['state'], )) + if state in self.have_bounds[-1]: + self.handleError('Duplicate bounds for state %d (previous %s)' % (state, self.have_bounds[-1][state])) + else: + self.have_bounds[-1][state] = self.formatLocation() + else: + self.handleError('Duplicate element bounds (previous %s)' % (self.have_bounds[-1], )) self.checkBounds(attrs) elif 'orientation' == name: self.checkOrientation(attrs) if 'color' == name: - if self.have_color[-1] is not None: - self.handleError('Duplicate element color (previous %s)' % (self.have_color[-1], )) - else: + if self.have_color[-1] is None: self.have_color[-1] = self.formatLocation() + elif isinstance(self.have_color[-1], dict): + state = self.checkIntAttribute(name, attrs, 'state', 0) + if state is not None: + if 0 > state: + self.handleError('Element color attribute state "%s" is negative' % (attrs['state'], )) + if state in self.have_color[-1]: + self.handleError('Duplicate color for state %d (previous %s)' % (state, self.have_color[-1][state])) + else: + self.have_color[-1][state] = self.formatLocation() + else: + self.handleError('Duplicate element color (previous %s)' % (self.have_color[-1], )) self.checkColor(attrs) self.ignored_depth = 1 diff --git a/src/emu/render.cpp b/src/emu/render.cpp index 4ffa4f0a2ba..531e327c978 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -1356,10 +1356,7 @@ render_primitive_list &render_target::get_primitives() item_xform.yoffs = root_xform.yoffs + bounds.y0 * root_xform.yscale; item_xform.xscale = (bounds.x1 - bounds.x0) * root_xform.xscale; item_xform.yscale = (bounds.y1 - bounds.y0) * root_xform.yscale; - item_xform.color.r = curitem.color().r * root_xform.color.r; - item_xform.color.g = curitem.color().g * root_xform.color.g; - item_xform.color.b = curitem.color().b * root_xform.color.b; - item_xform.color.a = curitem.color().a * root_xform.color.a; + item_xform.color = curitem.color() * root_xform.color; item_xform.orientation = orientation_add(curitem.orientation(), root_xform.orientation); item_xform.no_center = false; @@ -1474,11 +1471,12 @@ bool render_target::map_point_container(s32 target_x, s32 target_y, render_conta if (items.end() != found) { layout_view::item &item(*found); - if (item.bounds().includes(target_f.first, target_f.second)) + render_bounds const bounds(item.bounds()); + if (bounds.includes(target_f.first, target_f.second)) { // point successfully mapped - container_x = (target_f.first - item.bounds().x0) / item.bounds().width(); - container_y = (target_f.second - item.bounds().y0) / item.bounds().height(); + container_x = (target_f.first - bounds.x0) / bounds.width(); + container_y = (target_f.second - bounds.y0) / bounds.height(); return true; } } @@ -1531,17 +1529,21 @@ bool render_target::map_point_input(s32 target_x, s32 target_y, ioport_port *&in if (m_hit_test[i] && m_hit_test[items.size() + i]) { layout_view::item &item(items[i]); - if (item.has_input()) + render_bounds const bounds(item.bounds()); + if (bounds.includes(target_f.first, target_f.second)) { - // point successfully mapped - input_port = item.input_tag_and_mask(input_mask); - input_x = (target_f.first - item.bounds().x0) / item.bounds().width(); - input_y = (target_f.second - item.bounds().y0) / item.bounds().height(); - return true; - } - else - { - break; + if (item.has_input()) + { + // point successfully mapped + input_port = item.input_tag_and_mask(input_mask); + input_x = (target_f.first - bounds.x0) / bounds.width(); + input_y = (target_f.second - bounds.y0) / bounds.height(); + return true; + } + else + { + break; + } } } } diff --git a/src/emu/render.h b/src/emu/render.h index e1be1baf8c4..6a76e23eda4 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -61,14 +61,6 @@ #include <vector> -namespace emu { namespace render { namespace detail { - -class layout_environment; -class view_environment; - -} } } // namespace emu::render::detail - - //************************************************************************** // CONSTANTS //************************************************************************** @@ -196,6 +188,20 @@ struct render_color float r; // red component (0.0 = none, 1.0 = max) float g; // green component (0.0 = none, 1.0 = max) float b; // blue component (0.0 = none, 1.0 = max) + + constexpr render_color operator*(render_color const &c) const + { + return render_color{ a * c.a, r * c.r, g * c.g, b * c.b }; + } + + render_color &operator*=(render_color const &c) + { + a *= c.a; + r *= c.r; + g *= c.g; + b *= c.b; + return *this; + } }; @@ -232,6 +238,31 @@ struct render_texinfo }; +namespace emu { namespace render { namespace detail { + +struct bounds_step +{ + int state; + render_bounds bounds; + render_bounds delta; +}; +using bounds_vector = std::vector<bounds_step>; + +struct color_step +{ + int state; + render_color color; + render_color delta; +}; +using color_vector = std::vector<color_step>; + + +class layout_environment; +class view_environment; + +} } } // namespace emu::render::detail + + // ======================> render_layer_config // render_layer_config - describes the state of layers @@ -585,22 +616,6 @@ public: void preload(); private: - struct bounds_step - { - int state; - render_bounds bounds; - render_bounds delta; - }; - using bounds_vector = std::vector<bounds_step>; - - struct color_step - { - int state; - render_color color; - render_color delta; - }; - using color_vector = std::vector<color_step>; - /// \brief An image, rectangle, or disk in an element /// /// Each layout_element contains one or more components. Each @@ -649,6 +664,9 @@ private: void apply_skew(bitmap_argb32 &dest, int skewwidth); private: + using bounds_vector = emu::render::detail::bounds_vector; + using color_vector = emu::render::detail::color_vector; + // internal state int const m_statemask; // bits of state used to control visibility int const m_stateval; // masked state value to make component visible @@ -791,12 +809,12 @@ public: // getters layout_element *element() const { return m_element; } screen_device *screen() { return m_screen; } - const render_bounds &bounds() const { return m_bounds; } - const render_color &color() const { return m_color; } + render_bounds bounds() const; + render_color color() const; int blend_mode() const { return m_blend_mode; } u32 visibility_mask() const { return m_visibility_mask; } int orientation() const { return m_orientation; } - render_container *screen_container(running_machine &machine) const; + render_container *screen_container() const { return m_screen ? &m_screen->container() : nullptr; } // interactivity bool has_input() const { return bool(m_input_port); } @@ -810,8 +828,13 @@ public: void resolve_tags(); private: + using bounds_vector = emu::render::detail::bounds_vector; + using color_vector = emu::render::detail::color_vector; + static layout_element *find_element(view_environment &env, util::xml::data_node const &itemnode, element_map &elemmap); - static render_bounds make_bounds(view_environment &env, util::xml::data_node const &itemnode, layout_group::transform const &trans); + static bounds_vector make_bounds(view_environment &env, util::xml::data_node const &itemnode, layout_group::transform const &trans); + static color_vector make_color(view_environment &env, util::xml::data_node const &itemnode, render_color const &mult); + static std::string make_animoutput_tag(view_environment &env, util::xml::data_node const &itemnode); static std::string make_input_tag(view_environment &env, util::xml::data_node const &itemnode); static int get_blend_mode(view_environment &env, util::xml::data_node const &itemnode); static unsigned get_input_shift(ioport_value mask); @@ -819,7 +842,9 @@ public: // internal state layout_element *const m_element; // pointer to the associated element (non-screens only) output_finder<> m_output; // associated output + output_finder<> m_animoutput; // associated output for animation if different bool const m_have_output; // whether we actually have an output + bool const m_have_animoutput; // whether we actually have an output for animation ioport_port * m_input_port; // input port of this item ioport_field const * m_input_field; // input port field of this item ioport_value const m_input_mask; // input mask of this item @@ -828,14 +853,14 @@ public: bool m_clickthrough; // should click pass through to lower elements screen_device * m_screen; // pointer to screen int m_orientation; // orientation of this item - render_bounds m_bounds; // bounds of the item - render_color m_color; // color of the item + bounds_vector m_bounds; // bounds of the item + color_vector const m_color; // color of the item int m_blend_mode; // blending mode to use when drawing u32 m_visibility_mask; // combined mask of parent visibility groups // cold items std::string const m_input_tag; // input tag of this item - render_bounds const m_rawbounds; // raw (original) bounds of the item + bounds_vector const m_rawbounds; // raw (original) bounds of the item bool const m_has_clickthrough; // whether clickthrough was explicitly configured }; using item_list = std::list<item>; diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index d877131492f..940923ae0e1 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -78,8 +78,6 @@ enum LINE_CAP_END = 2 }; -std::locale const f_portable_locale("C"); - constexpr layout_group::transform identity_transform{{ {{ 1.0F, 0.0F, 0.0F }}, {{ 0.0F, 1.0F, 0.0F }}, {{ 0.0F, 0.0F, 1.0F }} }}; @@ -97,11 +95,6 @@ inline void render_bounds_transform(render_bounds &bounds, layout_group::transfo (bounds.x1 * trans[1][0]) + (bounds.y1 * trans[1][1]) + trans[1][2] }; } -constexpr render_color render_color_multiply(render_color const &x, render_color const &y) -{ - return render_color{ x.a * y.a, x.r * y.r, x.g * y.g, x.b * y.b }; -} - //************************************************************************** @@ -214,7 +207,7 @@ private: if (m_text_valid && !m_float_valid) { std::istringstream stream(m_text); - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); if (m_text[0] == '$') { stream.get(); @@ -250,7 +243,7 @@ private: if (m_text_valid && !m_int_valid && !m_float_valid) { std::istringstream stream(m_text); - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); if (m_text[0] == '$') { stream.get(); @@ -309,7 +302,7 @@ private: if (m_text_valid && !m_int_valid) { std::istringstream stream(m_text); - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); if (m_text[0] == '$') { stream.get(); @@ -531,7 +524,7 @@ private: int parse_int(char const *begin, char const *end, int defvalue) { std::istringstream stream; - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); int result; if (begin[0] == '$') { @@ -661,7 +654,7 @@ public: unsigned const decprefix((expanded.first[0] == '#') ? 1U : 0U); bool const floatchars(std::find_if(expanded.first, expanded.second, [] (char ch) { return ('.' == ch) || ('e' == ch) || ('E' == ch); }) != expanded.second); std::istringstream stream(std::string(expanded.first + hexprefix + decprefix, expanded.second)); - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); if (!hexprefix && !decprefix && floatchars) { stream >> floatincrement; @@ -768,7 +761,7 @@ public: // similar to what XML nodes do std::pair<char const *, char const *> const expanded(expand(attrib)); std::istringstream stream(std::string(expanded.first, expanded.second)); - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); float result; return (stream >> result) ? result : defvalue; } @@ -912,6 +905,175 @@ public: } } } // namespace emu::render::detail +namespace { + +bool add_bounds_step(emu::render::detail::layout_environment &env, emu::render::detail::bounds_vector &steps, util::xml::data_node const &node) +{ + int const state(env.get_attribute_int(node, "state", 0)); + auto const pos( + std::lower_bound( + steps.begin(), + steps.end(), + state, + [] (emu::render::detail::bounds_step const &lhs, int rhs) { return lhs.state < rhs; })); + if ((steps.end() != pos) && (state == pos->state)) + return false; + + auto &ins(*steps.emplace(pos, emu::render::detail::bounds_step{ state, { 0.0F, 0.0F, 0.0F, 0.0F }, { 0.0F, 0.0F, 0.0F, 0.0F } })); + env.parse_bounds(&node, ins.bounds); + return true; +} + +void set_bounds_deltas(emu::render::detail::bounds_vector &steps) +{ + if (steps.empty()) + { + steps.emplace_back(emu::render::detail::bounds_step{ 0, { 0.0F, 0.0F, 1.0F, 1.0F }, { 0.0F, 0.0F, 0.0F, 0.0F } }); + } + else + { + auto i(steps.begin()); + auto j(i); + while (steps.end() != ++j) + { + assert(j->state > i->state); + + i->delta.x0 = (j->bounds.x0 - i->bounds.x0) / (j->state - i->state); + i->delta.x1 = (j->bounds.x1 - i->bounds.x1) / (j->state - i->state); + i->delta.y0 = (j->bounds.y0 - i->bounds.y0) / (j->state - i->state); + i->delta.y1 = (j->bounds.y1 - i->bounds.y1) / (j->state - i->state); + + i = j; + } + } +} + +void normalize_bounds(emu::render::detail::bounds_vector &steps, float x0, float y0, float xoffs, float yoffs, float xscale, float yscale) +{ + auto i(steps.begin()); + i->bounds.x0 = x0 + (i->bounds.x0 - xoffs) * xscale; + i->bounds.x1 = x0 + (i->bounds.x1 - xoffs) * xscale; + i->bounds.y0 = y0 + (i->bounds.y0 - yoffs) * yscale; + i->bounds.y1 = y0 + (i->bounds.y1 - yoffs) * yscale; + + auto j(i); + while (steps.end() != ++j) + { + j->bounds.x0 = x0 + (j->bounds.x0 - xoffs) * xscale; + j->bounds.x1 = x0 + (j->bounds.x1 - xoffs) * xscale; + j->bounds.y0 = y0 + (j->bounds.y0 - yoffs) * yscale; + j->bounds.y1 = y0 + (j->bounds.y1 - yoffs) * yscale; + + i->delta.x0 = (j->bounds.x0 - i->bounds.x0) / (j->state - i->state); + i->delta.x1 = (j->bounds.x1 - i->bounds.x1) / (j->state - i->state); + i->delta.y0 = (j->bounds.y0 - i->bounds.y0) / (j->state - i->state); + i->delta.y1 = (j->bounds.y1 - i->bounds.y1) / (j->state - i->state); + + i = j; + } +} + +render_bounds accumulate_bounds(emu::render::detail::bounds_vector const &steps) +{ + auto i(steps.begin()); + render_bounds result(i->bounds); + while (steps.end() != ++i) + union_render_bounds(result, i->bounds); + return result; +} + +inline render_bounds interpolate_bounds(emu::render::detail::bounds_vector const &steps, int state) +{ + auto pos( + std::lower_bound( + steps.begin(), + steps.end(), + state, + [] (emu::render::detail::bounds_step const &lhs, int rhs) { return lhs.state < rhs; })); + if (steps.begin() == pos) + { + return pos->bounds; + } + else + { + --pos; + render_bounds result(pos->bounds); + result.x0 += pos->delta.x0 * (state - pos->state); + result.x1 += pos->delta.x1 * (state - pos->state); + result.y0 += pos->delta.y0 * (state - pos->state); + result.y1 += pos->delta.y1 * (state - pos->state); + return result; + } +} + + +bool add_color_step(emu::render::detail::layout_environment &env, emu::render::detail::color_vector &steps, util::xml::data_node const &node) +{ + int const state(env.get_attribute_int(node, "state", 0)); + auto const pos( + std::lower_bound( + steps.begin(), + steps.end(), + state, + [] (emu::render::detail::color_step const &lhs, int rhs) { return lhs.state < rhs; })); + if ((steps.end() != pos) && (state == pos->state)) + return false; + + steps.emplace(pos, emu::render::detail::color_step{ state, env.parse_color(&node), { 0.0F, 0.0F, 0.0F, 0.0F } }); + return true; +} + +void set_color_deltas(emu::render::detail::color_vector &steps) +{ + if (steps.empty()) + { + steps.emplace_back(emu::render::detail::color_step{ 0, { 1.0F, 1.0F, 1.0F, 1.0F }, { 0.0F, 0.0F, 0.0F, 0.0F } }); + } + else + { + auto i(steps.begin()); + auto j(i); + while (steps.end() != ++j) + { + assert(j->state > i->state); + + i->delta.a = (j->color.a - i->color.a) / (j->state - i->state); + i->delta.r = (j->color.r - i->color.r) / (j->state - i->state); + i->delta.g = (j->color.g - i->color.g) / (j->state - i->state); + i->delta.b = (j->color.b - i->color.b) / (j->state - i->state); + + i = j; + } + } +} + +inline render_color interpolate_color(emu::render::detail::color_vector const &steps, int state) +{ + auto pos( + std::lower_bound( + steps.begin(), + steps.end(), + state, + [] (emu::render::detail::color_step const &lhs, int rhs) { return lhs.state < rhs; })); + if (steps.begin() == pos) + { + return pos->color; + } + else + { + --pos; + render_color result(pos->color); + result.a += pos->delta.a * (state - pos->state); + result.r += pos->delta.r * (state - pos->state); + result.g += pos->delta.g * (state - pos->state); + result.b += pos->delta.b * (state - pos->state); + return result; + } +} + +} // anonymous namespace + + //************************************************************************** // LAYOUT ELEMENT @@ -1178,7 +1340,18 @@ void layout_group::resolve_bounds( !strcmp(itemnode->get_name(), "marquee")) { render_bounds itembounds; - env.parse_bounds(itemnode->get_child("bounds"), itembounds); + util::xml::data_node const *boundsnode = itemnode->get_child("bounds"); + env.parse_bounds(boundsnode, itembounds); + while (boundsnode) + { + boundsnode = boundsnode->get_next_sibling("bounds"); + if (boundsnode) + { + render_bounds b; + env.parse_bounds(boundsnode, b); + union_render_bounds(itembounds, b); + } + } if (empty) m_bounds = itembounds; else @@ -2829,84 +3002,27 @@ layout_element::component::component(environment &env, util::xml::data_node cons { if (!strcmp(child->get_name(), "bounds")) { - int const state(env.get_attribute_int(*child, "state", 0)); - auto const pos( - std::lower_bound( - m_bounds.begin(), - m_bounds.end(), - state, - [] (bounds_step const &lhs, int rhs) { return lhs.state < rhs; })); - if ((m_bounds.end() != pos) && (state == pos->state)) + if (!add_bounds_step(env, m_bounds, *child)) { throw layout_syntax_error( util::string_format( - "%s component has duplicate bounds for state %d", - compnode.get_name(), - state)); + "%s component has duplicate bounds for state", + compnode.get_name())); } - bounds_step &ins(*m_bounds.emplace(pos, bounds_step{ state, { 0.0F, 0.0F, 0.0F, 0.0F }, { 0.0F, 0.0F, 0.0F, 0.0F } })); - env.parse_bounds(child, ins.bounds); } else if (!strcmp(child->get_name(), "color")) { - int const state(env.get_attribute_int(*child, "state", 0)); - auto const pos( - std::lower_bound( - m_color.begin(), - m_color.end(), - state, - [] (color_step const &lhs, int rhs) { return lhs.state < rhs; })); - if ((m_color.end() != pos) && (state == pos->state)) + if (!add_color_step(env, m_color, *child)) { throw layout_syntax_error( util::string_format( - "%s component has duplicate color for state %d", - compnode.get_name(), - state)); + "%s component has duplicate color for state", + compnode.get_name())); } - m_color.emplace(pos, color_step{ state, env.parse_color(child), { 0.0F, 0.0F, 0.0F, 0.0F } }); - } - } - if (m_bounds.empty()) - { - m_bounds.emplace_back(bounds_step{ 0, { 0.0F, 0.0F, 1.0F, 1.0F }, { 0.0F, 0.0F, 0.0F, 0.0F } }); - } - else - { - auto i(m_bounds.begin()); - auto j(i); - while (m_bounds.end() != ++j) - { - assert(j->state > i->state); - - i->delta.x0 = (j->bounds.x0 - i->bounds.x0) / (j->state - i->state); - i->delta.x1 = (j->bounds.x1 - i->bounds.x1) / (j->state - i->state); - i->delta.y0 = (j->bounds.y0 - i->bounds.y0) / (j->state - i->state); - i->delta.y1 = (j->bounds.y1 - i->bounds.y1) / (j->state - i->state); - - i = j; - } - } - if (m_color.empty()) - { - m_color.emplace_back(color_step{ 0, { 1.0F, 1.0F, 1.0F, 1.0F }, { 0.0F, 0.0F, 0.0F, 0.0F } }); - } - else - { - auto i(m_color.begin()); - auto j(i); - while (m_color.end() != ++j) - { - assert(j->state > i->state); - - i->delta.a = (j->color.a - i->color.a) / (j->state - i->state); - i->delta.r = (j->color.r - i->color.r) / (j->state - i->state); - i->delta.g = (j->color.g - i->color.g) / (j->state - i->state); - i->delta.b = (j->color.b - i->color.b) / (j->state - i->state); - - i = j; } } + set_bounds_deltas(m_bounds); + set_color_deltas(m_color); } @@ -2916,27 +3032,7 @@ layout_element::component::component(environment &env, util::xml::data_node cons void layout_element::component::normalize_bounds(float xoffs, float yoffs, float xscale, float yscale) { - auto i(m_bounds.begin()); - i->bounds.x0 = (i->bounds.x0 - xoffs) * xscale; - i->bounds.x1 = (i->bounds.x1 - xoffs) * xscale; - i->bounds.y0 = (i->bounds.y0 - yoffs) * yscale; - i->bounds.y1 = (i->bounds.y1 - yoffs) * yscale; - - auto j(i); - while (m_bounds.end() != ++j) - { - j->bounds.x0 = (j->bounds.x0 - xoffs) * xscale; - j->bounds.x1 = (j->bounds.x1 - xoffs) * xscale; - j->bounds.y0 = (j->bounds.y0 - yoffs) * yscale; - j->bounds.y1 = (j->bounds.y1 - yoffs) * yscale; - - i->delta.x0 = (j->bounds.x0 - i->bounds.x0) / (j->state - i->state); - i->delta.x1 = (j->bounds.x1 - i->bounds.x1) / (j->state - i->state); - i->delta.y0 = (j->bounds.y0 - i->bounds.y0) / (j->state - i->state); - i->delta.y1 = (j->bounds.y1 - i->bounds.y1) / (j->state - i->state); - - i = j; - } + ::normalize_bounds(m_bounds, 0.0F, 0.0F, xoffs, yoffs, xscale, yscale); } @@ -2989,11 +3085,7 @@ std::pair<int, bool> layout_element::component::statewrap() const render_bounds layout_element::component::overall_bounds() const { - auto i(m_bounds.begin()); - render_bounds result(i->bounds); - while (m_bounds.end() != ++i) - union_render_bounds(result, i->bounds); - return result; + return accumulate_bounds(m_bounds); } @@ -3003,26 +3095,7 @@ render_bounds layout_element::component::overall_bounds() const render_bounds layout_element::component::bounds(int state) const { - auto pos( - std::lower_bound( - m_bounds.begin(), - m_bounds.end(), - state, - [] (bounds_step const &lhs, int rhs) { return lhs.state < rhs; })); - if (m_bounds.begin() == pos) - { - return pos->bounds; - } - else - { - --pos; - render_bounds result(pos->bounds); - result.x0 += pos->delta.x0 * (state - pos->state); - result.x1 += pos->delta.x1 * (state - pos->state); - result.y0 += pos->delta.y0 * (state - pos->state); - result.y1 += pos->delta.y1 * (state - pos->state); - return result; - } + return interpolate_bounds(m_bounds, state); } @@ -3032,26 +3105,7 @@ render_bounds layout_element::component::bounds(int state) const render_color layout_element::component::color(int state) const { - auto pos( - std::lower_bound( - m_color.begin(), - m_color.end(), - state, - [] (color_step const &lhs, int rhs) { return lhs.state < rhs; })); - if (m_color.begin() == pos) - { - return pos->color; - } - else - { - --pos; - render_color result(pos->color); - result.a += pos->delta.a * (state - pos->state); - result.r += pos->delta.r * (state - pos->state); - result.g += pos->delta.g * (state - pos->state); - result.b += pos->delta.b * (state - pos->state); - return result; - } + return interpolate_color(m_color, state); } @@ -3532,21 +3586,23 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) { if ((visibility_mask & curitem.visibility_mask()) == curitem.visibility_mask()) { + render_bounds const rawbounds = accumulate_bounds(curitem.m_rawbounds); + // accumulate bounds m_visible_items.emplace_back(curitem); if (first) - m_bounds = curitem.m_rawbounds; + m_bounds = rawbounds; else - union_render_bounds(m_bounds, curitem.m_rawbounds); + union_render_bounds(m_bounds, rawbounds); first = false; // accumulate visible screens and their bounds bounds if (curitem.screen()) { if (scrfirst) - scrbounds = curitem.m_rawbounds; + scrbounds = rawbounds; else - union_render_bounds(scrbounds, curitem.m_rawbounds); + union_render_bounds(scrbounds, rawbounds); scrfirst = false; // accumulate active screens @@ -3591,10 +3647,8 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) // normalize all the item bounds for (item &curitem : items()) { - curitem.m_bounds.x0 = target_bounds.x0 + (curitem.m_rawbounds.x0 - xoffs) * xscale; - curitem.m_bounds.x1 = target_bounds.x0 + (curitem.m_rawbounds.x1 - xoffs) * xscale; - curitem.m_bounds.y0 = target_bounds.y0 + (curitem.m_rawbounds.y0 - yoffs) * yscale; - curitem.m_bounds.y1 = target_bounds.y0 + (curitem.m_rawbounds.y1 - yoffs) * yscale; + curitem.m_bounds = curitem.m_rawbounds; + normalize_bounds(curitem.m_bounds, target_bounds.x0, target_bounds.y0, xoffs, yoffs, xscale, yscale); } // sort edges of interactive items @@ -3605,12 +3659,13 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) for (unsigned i = 0; m_interactive_items.size() > i; ++i) { item &curitem(m_interactive_items[i]); + render_bounds const curbounds(accumulate_bounds(curitem.m_bounds)); LOGMASKED(LOG_INTERACTIVE_ITEMS, "%u: (%s %s %s %s) hasinput=%s clickthrough=%s\n", - i, curitem.bounds().x0, curitem.bounds().y0, curitem.bounds().x1, curitem.bounds().y1, curitem.has_input(), curitem.clickthrough()); - m_interactive_edges_x.emplace_back(i, curitem.bounds().x0, false); - m_interactive_edges_x.emplace_back(i, curitem.bounds().x1, true); - m_interactive_edges_y.emplace_back(i, curitem.bounds().y0, false); - m_interactive_edges_y.emplace_back(i, curitem.bounds().y1, true); + i, curbounds.x0, curbounds.y0, curbounds.x1, curbounds.y1, curitem.has_input(), curitem.clickthrough()); + m_interactive_edges_x.emplace_back(i, curbounds.x0, false); + m_interactive_edges_x.emplace_back(i, curbounds.x1, true); + m_interactive_edges_y.emplace_back(i, curbounds.y0, false); + m_interactive_edges_y.emplace_back(i, curbounds.y1, true); } std::sort(m_interactive_edges_x.begin(), m_interactive_edges_x.end()); std::sort(m_interactive_edges_y.begin(), m_interactive_edges_y.end()); @@ -3771,7 +3826,7 @@ void layout_view::add_items( groupmap, orientation_add(grouporient, orientation), grouptrans, - render_color_multiply(env.parse_color(itemnode->get_child("color")), color), + env.parse_color(itemnode->get_child("color")) * color, false, false, true); @@ -3854,7 +3909,9 @@ layout_view::item::item( render_color const &color) : m_element(find_element(env, itemnode, elemmap)) , m_output(env.device(), env.get_attribute_string(itemnode, "name", "")) + , m_animoutput(env.device(), make_animoutput_tag(env, itemnode)) , m_have_output(env.get_attribute_string(itemnode, "name", "")[0]) + , m_have_animoutput(!make_animoutput_tag(env, itemnode).empty()) , m_input_port(nullptr) , m_input_field(nullptr) , m_input_mask(env.get_attribute_int(itemnode, "inputmask", 0)) @@ -3863,7 +3920,7 @@ layout_view::item::item( , m_clickthrough(env.get_attribute_bool(itemnode, "clickthrough", "yes")) , m_screen(nullptr) , m_orientation(orientation_add(env.parse_orientation(itemnode.get_child("orientation")), orientation)) - , m_color(render_color_multiply(env.parse_color(itemnode.get_child("color")), color)) + , m_color(make_color(env, itemnode, color)) , m_blend_mode(get_blend_mode(env, itemnode)) , m_visibility_mask(env.visibility_mask()) , m_input_tag(make_input_tag(env, itemnode)) @@ -3907,13 +3964,28 @@ layout_view::item::~item() //------------------------------------------------- -// screen_container - retrieve screen container +// bounds - get bounds for current state //------------------------------------------------- +render_bounds layout_view::item::bounds() const +{ + if (m_bounds.size() == 1U) + return m_bounds.front().bounds; + else + return interpolate_bounds(m_bounds, m_have_animoutput ? s32(m_animoutput) : state()); +} -render_container *layout_view::item::screen_container(running_machine &machine) const + +//------------------------------------------------- +// color - get color for current state +//------------------------------------------------- + +render_color layout_view::item::color() const { - return (m_screen != nullptr) ? &m_screen->container() : nullptr; + if (m_color.size() == 1U) + return m_color.front().color; + else + return interpolate_color(m_color, m_have_animoutput ? s32(m_animoutput) : state()); } @@ -3963,6 +4035,9 @@ void layout_view::item::resolve_tags() m_output = m_element->default_state(); } + if (m_have_animoutput) + m_animoutput.resolve(); + if (!m_input_tag.empty()) { m_input_port = m_element->machine().root_device().ioport(m_input_tag); @@ -4010,19 +4085,74 @@ layout_element *layout_view::item::find_element(view_environment &env, util::xml // make_bounds - get transformed bounds //--------------------------------------------- -render_bounds layout_view::item::make_bounds( +layout_view::item::bounds_vector layout_view::item::make_bounds( view_environment &env, util::xml::data_node const &itemnode, layout_group::transform const &trans) { - render_bounds bounds; - env.parse_bounds(itemnode.get_child("bounds"), bounds); - render_bounds_transform(bounds, trans); - if (bounds.x0 > bounds.x1) - std::swap(bounds.x0, bounds.x1); - if (bounds.y0 > bounds.y1) - std::swap(bounds.y0, bounds.y1); - return bounds; + bounds_vector result; + for (util::xml::data_node const *bounds = itemnode.get_child("bounds"); bounds; bounds = bounds->get_next_sibling("bounds")) + { + if (!add_bounds_step(env, result, *bounds)) + { + throw layout_syntax_error( + util::string_format( + "%s item has duplicate bounds for state", + itemnode.get_name())); + } + } + for (emu::render::detail::bounds_step &step : result) + { + render_bounds_transform(step.bounds, trans); + if (step.bounds.x0 > step.bounds.x1) + std::swap(step.bounds.x0, step.bounds.x1); + if (step.bounds.y0 > step.bounds.y1) + std::swap(step.bounds.y0, step.bounds.y1); + } + set_bounds_deltas(result); + return result; +} + + +//--------------------------------------------- +// make_color - get color inflection points +//--------------------------------------------- + +layout_view::item::color_vector layout_view::item::make_color( + view_environment &env, + util::xml::data_node const &itemnode, + render_color const &mult) +{ + color_vector result; + for (util::xml::data_node const *color = itemnode.get_child("color"); color; color = color->get_next_sibling("color")) + { + if (!add_color_step(env, result, *color)) + { + throw layout_syntax_error( + util::string_format( + "%s item has duplicate color for state", + itemnode.get_name())); + } + } + for (emu::render::detail::color_step &step : result) + step.color *= mult; + set_color_deltas(result); + return result; +} + + +//--------------------------------------------- +// make_animoutput_tag - get animation output +// tag +//--------------------------------------------- + +std::string layout_view::item::make_animoutput_tag(view_environment &env, util::xml::data_node const &itemnode) +{ + util::xml::data_node const *const animate(itemnode.get_child("animate")); + if (animate) + return env.get_attribute_string(*animate, "name", ""); + else + return std::string(); } diff --git a/src/lib/util/xmlfile.cpp b/src/lib/util/xmlfile.cpp index a61c20d2e3c..8ee3c33fe26 100644 --- a/src/lib/util/xmlfile.cpp +++ b/src/lib/util/xmlfile.cpp @@ -31,7 +31,6 @@ namespace { ***************************************************************************/ constexpr unsigned TEMP_BUFFER_SIZE(4096U); -std::locale const f_portable_locale("C"); /*************************************************************************** @@ -629,7 +628,7 @@ long long data_node::get_attribute_int(const char *attribute, long long defvalue return defvalue; std::istringstream stream; - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); long long result; if (string[0] == '$') { @@ -694,7 +693,7 @@ float data_node::get_attribute_float(const char *attribute, float defvalue) cons return defvalue; std::istringstream stream(string); - stream.imbue(f_portable_locale); + stream.imbue(std::locale::classic()); float result; return (stream >> result) ? result : defvalue; } @@ -732,7 +731,7 @@ void data_node::set_attribute(const char *name, const char *value) void data_node::set_attribute_int(const char *name, long long value) { - set_attribute(name, string_format(f_portable_locale, "%d", value).c_str()); + set_attribute(name, string_format(std::locale::classic(), "%d", value).c_str()); } @@ -743,7 +742,7 @@ void data_node::set_attribute_int(const char *name, long long value) void data_node::set_attribute_float(const char *name, float value) { - set_attribute(name, string_format(f_portable_locale, "%f", value).c_str()); + set_attribute(name, string_format(std::locale::classic(), "%f", value).c_str()); } diff --git a/src/mame/layout/cgang.lay b/src/mame/layout/cgang.lay index bfec018b261..b72cc7c90e1 100644 --- a/src/mame/layout/cgang.lay +++ b/src/mame/layout/cgang.lay @@ -253,213 +253,12 @@ license:CC0 </disk> </element> - <element name="ani_white" defstate="0"> - <rect><bounds x="0" y="0" width="1" height="100" /><color alpha="0" /></rect> - <rect state="1"><bounds x="0" y="0" width="1" height="1" /><color red="1" green="1" blue="1" /></rect> - <rect state="2"><bounds x="0" y="0" width="1" height="2" /><color red="1" green="1" blue="1" /></rect> - <rect state="3"><bounds x="0" y="0" width="1" height="3" /><color red="1" green="1" blue="1" /></rect> - <rect state="4"><bounds x="0" y="0" width="1" height="4" /><color red="1" green="1" blue="1" /></rect> - <rect state="5"><bounds x="0" y="0" width="1" height="5" /><color red="1" green="1" blue="1" /></rect> - <rect state="6"><bounds x="0" y="0" width="1" height="6" /><color red="1" green="1" blue="1" /></rect> - <rect state="7"><bounds x="0" y="0" width="1" height="7" /><color red="1" green="1" blue="1" /></rect> - <rect state="8"><bounds x="0" y="0" width="1" height="8" /><color red="1" green="1" blue="1" /></rect> - <rect state="9"><bounds x="0" y="0" width="1" height="9" /><color red="1" green="1" blue="1" /></rect> - <rect state="10"><bounds x="0" y="0" width="1" height="10" /><color red="1" green="1" blue="1" /></rect> - <rect state="11"><bounds x="0" y="0" width="1" height="11" /><color red="1" green="1" blue="1" /></rect> - <rect state="12"><bounds x="0" y="0" width="1" height="12" /><color red="1" green="1" blue="1" /></rect> - <rect state="13"><bounds x="0" y="0" width="1" height="13" /><color red="1" green="1" blue="1" /></rect> - <rect state="14"><bounds x="0" y="0" width="1" height="14" /><color red="1" green="1" blue="1" /></rect> - <rect state="15"><bounds x="0" y="0" width="1" height="15" /><color red="1" green="1" blue="1" /></rect> - <rect state="16"><bounds x="0" y="0" width="1" height="16" /><color red="1" green="1" blue="1" /></rect> - <rect state="17"><bounds x="0" y="0" width="1" height="17" /><color red="1" green="1" blue="1" /></rect> - <rect state="18"><bounds x="0" y="0" width="1" height="18" /><color red="1" green="1" blue="1" /></rect> - <rect state="19"><bounds x="0" y="0" width="1" height="19" /><color red="1" green="1" blue="1" /></rect> - <rect state="20"><bounds x="0" y="0" width="1" height="20" /><color red="1" green="1" blue="1" /></rect> - <rect state="21"><bounds x="0" y="0" width="1" height="21" /><color red="1" green="1" blue="1" /></rect> - <rect state="22"><bounds x="0" y="0" width="1" height="22" /><color red="1" green="1" blue="1" /></rect> - <rect state="23"><bounds x="0" y="0" width="1" height="23" /><color red="1" green="1" blue="1" /></rect> - <rect state="24"><bounds x="0" y="0" width="1" height="24" /><color red="1" green="1" blue="1" /></rect> - <rect state="25"><bounds x="0" y="0" width="1" height="25" /><color red="1" green="1" blue="1" /></rect> - <rect state="26"><bounds x="0" y="0" width="1" height="26" /><color red="1" green="1" blue="1" /></rect> - <rect state="27"><bounds x="0" y="0" width="1" height="27" /><color red="1" green="1" blue="1" /></rect> - <rect state="28"><bounds x="0" y="0" width="1" height="28" /><color red="1" green="1" blue="1" /></rect> - <rect state="29"><bounds x="0" y="0" width="1" height="29" /><color red="1" green="1" blue="1" /></rect> - <rect state="30"><bounds x="0" y="0" width="1" height="30" /><color red="1" green="1" blue="1" /></rect> - <rect state="31"><bounds x="0" y="0" width="1" height="31" /><color red="1" green="1" blue="1" /></rect> - <rect state="32"><bounds x="0" y="0" width="1" height="32" /><color red="1" green="1" blue="1" /></rect> - <rect state="33"><bounds x="0" y="0" width="1" height="33" /><color red="1" green="1" blue="1" /></rect> - <rect state="34"><bounds x="0" y="0" width="1" height="34" /><color red="1" green="1" blue="1" /></rect> - <rect state="35"><bounds x="0" y="0" width="1" height="35" /><color red="1" green="1" blue="1" /></rect> - <rect state="36"><bounds x="0" y="0" width="1" height="36" /><color red="1" green="1" blue="1" /></rect> - <rect state="37"><bounds x="0" y="0" width="1" height="37" /><color red="1" green="1" blue="1" /></rect> - <rect state="38"><bounds x="0" y="0" width="1" height="38" /><color red="1" green="1" blue="1" /></rect> - <rect state="39"><bounds x="0" y="0" width="1" height="39" /><color red="1" green="1" blue="1" /></rect> - <rect state="40"><bounds x="0" y="0" width="1" height="40" /><color red="1" green="1" blue="1" /></rect> - <rect state="41"><bounds x="0" y="0" width="1" height="41" /><color red="1" green="1" blue="1" /></rect> - <rect state="42"><bounds x="0" y="0" width="1" height="42" /><color red="1" green="1" blue="1" /></rect> - <rect state="43"><bounds x="0" y="0" width="1" height="43" /><color red="1" green="1" blue="1" /></rect> - <rect state="44"><bounds x="0" y="0" width="1" height="44" /><color red="1" green="1" blue="1" /></rect> - <rect state="45"><bounds x="0" y="0" width="1" height="45" /><color red="1" green="1" blue="1" /></rect> - <rect state="46"><bounds x="0" y="0" width="1" height="46" /><color red="1" green="1" blue="1" /></rect> - <rect state="47"><bounds x="0" y="0" width="1" height="47" /><color red="1" green="1" blue="1" /></rect> - <rect state="48"><bounds x="0" y="0" width="1" height="48" /><color red="1" green="1" blue="1" /></rect> - <rect state="49"><bounds x="0" y="0" width="1" height="49" /><color red="1" green="1" blue="1" /></rect> - <rect state="50"><bounds x="0" y="0" width="1" height="50" /><color red="1" green="1" blue="1" /></rect> - <rect state="51"><bounds x="0" y="0" width="1" height="51" /><color red="1" green="1" blue="1" /></rect> - <rect state="52"><bounds x="0" y="0" width="1" height="52" /><color red="1" green="1" blue="1" /></rect> - <rect state="53"><bounds x="0" y="0" width="1" height="53" /><color red="1" green="1" blue="1" /></rect> - <rect state="54"><bounds x="0" y="0" width="1" height="54" /><color red="1" green="1" blue="1" /></rect> - <rect state="55"><bounds x="0" y="0" width="1" height="55" /><color red="1" green="1" blue="1" /></rect> - <rect state="56"><bounds x="0" y="0" width="1" height="56" /><color red="1" green="1" blue="1" /></rect> - <rect state="57"><bounds x="0" y="0" width="1" height="57" /><color red="1" green="1" blue="1" /></rect> - <rect state="58"><bounds x="0" y="0" width="1" height="58" /><color red="1" green="1" blue="1" /></rect> - <rect state="59"><bounds x="0" y="0" width="1" height="59" /><color red="1" green="1" blue="1" /></rect> - <rect state="60"><bounds x="0" y="0" width="1" height="60" /><color red="1" green="1" blue="1" /></rect> - <rect state="61"><bounds x="0" y="0" width="1" height="61" /><color red="1" green="1" blue="1" /></rect> - <rect state="62"><bounds x="0" y="0" width="1" height="62" /><color red="1" green="1" blue="1" /></rect> - <rect state="63"><bounds x="0" y="0" width="1" height="63" /><color red="1" green="1" blue="1" /></rect> - <rect state="64"><bounds x="0" y="0" width="1" height="64" /><color red="1" green="1" blue="1" /></rect> - <rect state="65"><bounds x="0" y="0" width="1" height="65" /><color red="1" green="1" blue="1" /></rect> - <rect state="66"><bounds x="0" y="0" width="1" height="66" /><color red="1" green="1" blue="1" /></rect> - <rect state="67"><bounds x="0" y="0" width="1" height="67" /><color red="1" green="1" blue="1" /></rect> - <rect state="68"><bounds x="0" y="0" width="1" height="68" /><color red="1" green="1" blue="1" /></rect> - <rect state="69"><bounds x="0" y="0" width="1" height="69" /><color red="1" green="1" blue="1" /></rect> - <rect state="70"><bounds x="0" y="0" width="1" height="70" /><color red="1" green="1" blue="1" /></rect> - <rect state="71"><bounds x="0" y="0" width="1" height="71" /><color red="1" green="1" blue="1" /></rect> - <rect state="72"><bounds x="0" y="0" width="1" height="72" /><color red="1" green="1" blue="1" /></rect> - <rect state="73"><bounds x="0" y="0" width="1" height="73" /><color red="1" green="1" blue="1" /></rect> - <rect state="74"><bounds x="0" y="0" width="1" height="74" /><color red="1" green="1" blue="1" /></rect> - <rect state="75"><bounds x="0" y="0" width="1" height="75" /><color red="1" green="1" blue="1" /></rect> - <rect state="76"><bounds x="0" y="0" width="1" height="76" /><color red="1" green="1" blue="1" /></rect> - <rect state="77"><bounds x="0" y="0" width="1" height="77" /><color red="1" green="1" blue="1" /></rect> - <rect state="78"><bounds x="0" y="0" width="1" height="78" /><color red="1" green="1" blue="1" /></rect> - <rect state="79"><bounds x="0" y="0" width="1" height="79" /><color red="1" green="1" blue="1" /></rect> - <rect state="80"><bounds x="0" y="0" width="1" height="80" /><color red="1" green="1" blue="1" /></rect> - <rect state="81"><bounds x="0" y="0" width="1" height="81" /><color red="1" green="1" blue="1" /></rect> - <rect state="82"><bounds x="0" y="0" width="1" height="82" /><color red="1" green="1" blue="1" /></rect> - <rect state="83"><bounds x="0" y="0" width="1" height="83" /><color red="1" green="1" blue="1" /></rect> - <rect state="84"><bounds x="0" y="0" width="1" height="84" /><color red="1" green="1" blue="1" /></rect> - <rect state="85"><bounds x="0" y="0" width="1" height="85" /><color red="1" green="1" blue="1" /></rect> - <rect state="86"><bounds x="0" y="0" width="1" height="86" /><color red="1" green="1" blue="1" /></rect> - <rect state="87"><bounds x="0" y="0" width="1" height="87" /><color red="1" green="1" blue="1" /></rect> - <rect state="88"><bounds x="0" y="0" width="1" height="88" /><color red="1" green="1" blue="1" /></rect> - <rect state="89"><bounds x="0" y="0" width="1" height="89" /><color red="1" green="1" blue="1" /></rect> - <rect state="90"><bounds x="0" y="0" width="1" height="90" /><color red="1" green="1" blue="1" /></rect> - <rect state="91"><bounds x="0" y="0" width="1" height="91" /><color red="1" green="1" blue="1" /></rect> - <rect state="92"><bounds x="0" y="0" width="1" height="92" /><color red="1" green="1" blue="1" /></rect> - <rect state="93"><bounds x="0" y="0" width="1" height="93" /><color red="1" green="1" blue="1" /></rect> - <rect state="94"><bounds x="0" y="0" width="1" height="94" /><color red="1" green="1" blue="1" /></rect> - <rect state="95"><bounds x="0" y="0" width="1" height="95" /><color red="1" green="1" blue="1" /></rect> - <rect state="96"><bounds x="0" y="0" width="1" height="96" /><color red="1" green="1" blue="1" /></rect> - <rect state="97"><bounds x="0" y="0" width="1" height="97" /><color red="1" green="1" blue="1" /></rect> - <rect state="98"><bounds x="0" y="0" width="1" height="98" /><color red="1" green="1" blue="1" /></rect> - <rect state="99"><bounds x="0" y="0" width="1" height="99" /><color red="1" green="1" blue="1" /></rect> - <rect state="100"><bounds x="0" y="0" width="1" height="100" /><color red="1" green="1" blue="1" /></rect> + <element name="crate" defstate="0"> + <rect><color red="0.75" green="0.1" blue="0.15" /></rect> </element> - <element name="ani_crate" defstate="0"> - <rect><bounds x="0" y="0" width="1" height="110" /><color alpha="0" /></rect> - <rect state="0"><bounds x="0" y="0" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="1"><bounds x="0" y="1" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="2"><bounds x="0" y="2" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="3"><bounds x="0" y="3" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="4"><bounds x="0" y="4" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="5"><bounds x="0" y="5" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="6"><bounds x="0" y="6" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="7"><bounds x="0" y="7" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="8"><bounds x="0" y="8" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="9"><bounds x="0" y="9" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="10"><bounds x="0" y="10" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="11"><bounds x="0" y="11" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="12"><bounds x="0" y="12" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="13"><bounds x="0" y="13" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="14"><bounds x="0" y="14" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="15"><bounds x="0" y="15" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="16"><bounds x="0" y="16" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="17"><bounds x="0" y="17" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="18"><bounds x="0" y="18" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="19"><bounds x="0" y="19" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="20"><bounds x="0" y="20" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="21"><bounds x="0" y="21" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="22"><bounds x="0" y="22" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="23"><bounds x="0" y="23" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="24"><bounds x="0" y="24" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="25"><bounds x="0" y="25" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="26"><bounds x="0" y="26" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="27"><bounds x="0" y="27" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="28"><bounds x="0" y="28" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="29"><bounds x="0" y="29" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="30"><bounds x="0" y="30" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="31"><bounds x="0" y="31" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="32"><bounds x="0" y="32" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="33"><bounds x="0" y="33" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="34"><bounds x="0" y="34" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="35"><bounds x="0" y="35" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="36"><bounds x="0" y="36" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="37"><bounds x="0" y="37" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="38"><bounds x="0" y="38" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="39"><bounds x="0" y="39" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="40"><bounds x="0" y="40" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="41"><bounds x="0" y="41" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="42"><bounds x="0" y="42" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="43"><bounds x="0" y="43" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="44"><bounds x="0" y="44" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="45"><bounds x="0" y="45" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="46"><bounds x="0" y="46" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="47"><bounds x="0" y="47" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="48"><bounds x="0" y="48" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="49"><bounds x="0" y="49" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="50"><bounds x="0" y="50" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="51"><bounds x="0" y="51" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="52"><bounds x="0" y="52" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="53"><bounds x="0" y="53" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="54"><bounds x="0" y="54" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="55"><bounds x="0" y="55" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="56"><bounds x="0" y="56" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="57"><bounds x="0" y="57" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="58"><bounds x="0" y="58" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="59"><bounds x="0" y="59" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="60"><bounds x="0" y="60" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="61"><bounds x="0" y="61" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="62"><bounds x="0" y="62" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="63"><bounds x="0" y="63" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="64"><bounds x="0" y="64" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="65"><bounds x="0" y="65" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="66"><bounds x="0" y="66" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="67"><bounds x="0" y="67" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="68"><bounds x="0" y="68" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="69"><bounds x="0" y="69" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="70"><bounds x="0" y="70" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="71"><bounds x="0" y="71" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="72"><bounds x="0" y="72" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="73"><bounds x="0" y="73" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="74"><bounds x="0" y="74" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="75"><bounds x="0" y="75" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="76"><bounds x="0" y="76" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="77"><bounds x="0" y="77" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="78"><bounds x="0" y="78" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="79"><bounds x="0" y="79" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="80"><bounds x="0" y="80" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="81"><bounds x="0" y="81" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="82"><bounds x="0" y="82" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="83"><bounds x="0" y="83" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="84"><bounds x="0" y="84" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="85"><bounds x="0" y="85" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="86"><bounds x="0" y="86" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="87"><bounds x="0" y="87" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="88"><bounds x="0" y="88" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="89"><bounds x="0" y="89" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="90"><bounds x="0" y="90" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="91"><bounds x="0" y="91" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="92"><bounds x="0" y="92" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="93"><bounds x="0" y="93" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="94"><bounds x="0" y="94" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="95"><bounds x="0" y="95" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="96"><bounds x="0" y="96" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="97"><bounds x="0" y="97" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="98"><bounds x="0" y="98" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="99"><bounds x="0" y="99" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> - <rect state="100"><bounds x="0" y="100" width="1" height="10" /><color red="0.75" green="0.1" blue="0.15" /></rect> + <element name="door" defstate="0"> + <rect><color red="0.75" green="0.75" blue="0.75" /></rect> </element> @@ -525,37 +324,48 @@ license:CC0 <element ref="blue"><bounds x="7" y="5" width="48" height="3" /></element> <element ref="black"><bounds x="7" y="5" width="48" height="1.5" /></element> - <!-- unable to move the cosmogangs with artwork, have to do it like this with 'fishing lines' --> <repeat count="5"> <param name="x" start="12.6" increment="9" /> <param name="i" start="0" increment="1" /> <element ref="gray2"><bounds x="~x~" y="17" width="0.8" height="38.5" /></element> - <element name="cg_count~i~" ref="ani_white"><bounds x="~x~" y="17" width="0.8" height="35" /><color alpha="0.5" /></element> - </repeat> - - <repeat count="5"> - <param name="x" start="11.2" increment="9" /> - <param name="i" start="0" increment="1" /> - - <element name="en_count~i~" ref="ani_crate"><bounds x="~x~" y="17" width="3.6" height="38.5" /></element> </repeat> <repeat count="5"> <param name="x" start="10" increment="9" /> <param name="i" start="0" increment="1" /> + <param name="mask" start="0x01" lshift="1" /> - <element name="cg_sol~i~" ref="cosmo"><bounds x="~x~" y="10" width="6" height="7" /></element> + <element name="cg_sol~i~" ref="cosmo"> + <animate name="cg_count~i~" /> + <bounds state="0" x="~x~" y="10" width="6" height="7" /> + <bounds state="100" x="~x~" y="48.5" width="6" height="7" /> + </element> + + <element ref="nothing" inputtag="FAKE1" inputmask="~mask~"> + <animate name="cg_count~i~" /> + <bounds state="0" x="~x~" y="10" width="6" height="7" /> + <bounds state="100" x="~x~" y="48.5" width="6" height="7" /> + </element> </repeat> <repeat count="5"> - <param name="x" start="10" increment="9" /> - <param name="mask" start="0x01" lshift="1" /> + <param name="x" start="11.2" increment="9" /> + <param name="i" start="0" increment="1" /> - <element ref="nothing" blend="add" inputtag="FAKE1" inputmask="~mask~"><bounds x="~x~" y="10" width="6" height="45.5" /></element> + <element ref="crate"> + <animate name="en_count~i~" /> + <bounds state="0" x="~x~" y="13.5" width="3.6" height="3.5" /> + <bounds state="100" x="~x~" y="52" width="3.6" height="3.5" /> + </element> </repeat> - <element name="door_count" ref="ani_white"><bounds x="8.5" y="8" width="45" height="9" /><color alpha="0.3" /></element> + <element ref="door"> + <animate name="door_count" /> + <bounds state="0" x="8.5" y="8" width="45" height="0" /> + <bounds state="100" x="8.5" y="8" width="45" height="9" /> + <color alpha="0.6" /> + </element> </group> |