From ae3560c57ca4096b277dbc34cebc0967930e99f6 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 3 Oct 2020 04:52:06 +1000 Subject: [PATCH] emu/render.cpp: Consider that screens can be hidden when choosing a default view. --- src/emu/render.cpp | 33 +++++++++++------------ src/emu/render.h | 9 ++++--- src/emu/rendlay.cpp | 13 ++++++++- src/mame/layout/model1io2.lay | 37 +++++++++++--------------- src/osd/modules/render/bgfx/chain.cpp | 2 +- src/osd/modules/render/d3d/d3dhlsl.cpp | 2 +- 6 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/emu/render.cpp b/src/emu/render.cpp index ef06e0c922c..83cd3524532 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -1082,13 +1082,14 @@ unsigned render_target::configured_view(const char *viewname, int targetindex, i screen_device const &screen = screens[index() % screens.size()]; for (unsigned i = 0; !view && (m_views.size() > i); ++i) { - for (screen_device const &viewscreen : m_views[i].first.get().screens()) + for (layout_view::item &viewitem : m_views[i].first.get().items()) { - if (&viewscreen == &screen) + screen_device const *const viewscreen(viewitem.screen()); + if (viewscreen == &screen) { view = &m_views[i].first.get(); } - else + else if (viewscreen) { view = nullptr; break; @@ -1103,9 +1104,8 @@ unsigned render_target::configured_view(const char *viewname, int targetindex, i for (unsigned i = 0; !view && (m_views.size() > i); ++i) { layout_view &curview = m_views[i].first; - if (curview.screen_count() >= screens.size()) - if (std::find_if(screens.begin(), screens.end(), [&curview] (screen_device &screen) { return !curview.has_screen(screen); }) == screens.end()) - view = &curview; + if (std::find_if(screens.begin(), screens.end(), [&curview] (screen_device &screen) { return !curview.has_screen(screen); }) == screens.end()) + view = &curview; } } } @@ -1467,7 +1467,7 @@ bool render_target::map_point_container(s32 target_x, s32 target_y, render_conta std::swap(target_f.first, target_f.second); // try to find the right container - auto const &items(current_view().screen_items()); + auto const &items(current_view().visible_screen_items()); auto const found(std::find_if( items.begin(), items.end(), @@ -1905,20 +1905,17 @@ void render_target::load_additional_layout_files(const char *basename, bool have int viewindex(0); for (layout_view *view = nth_view(viewindex); need_tiles && view; view = nth_view(++viewindex)) { - if (view->screen_count() >= screens.size()) + bool screen_missing(false); + for (screen_device &screen : iter) { - bool screen_missing(false); - for (screen_device &screen : iter) + if (!view->has_screen(screen)) { - if (!view->has_screen(screen)) - { - screen_missing = true; - break; - } + screen_missing = true; + break; } - if (!screen_missing) - need_tiles = false; } + if (!screen_missing) + need_tiles = false; } } if (need_tiles) @@ -3089,7 +3086,7 @@ bool render_manager::is_live(screen_device &screen) const if (!target.hidden()) { layout_view const *view = &target.current_view(); - if (view->has_screen(screen)) + if (view->has_visible_screen(screen)) return true; } } diff --git a/src/emu/render.h b/src/emu/render.h index 1a32024045e..5ca922b408a 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -901,16 +901,17 @@ public: // getters item_list &items() { return m_items; } + bool has_screen(screen_device &screen); const std::string &name() const { return m_name; } - size_t screen_count() const { return m_screens.size(); } + size_t visible_screen_count() const { return m_screens.size(); } float effective_aspect() const { return m_effaspect; } const render_bounds &bounds() const { return m_bounds; } - bool has_screen(screen_device &screen) const; - const item_ref_vector &screen_items() const { return m_screen_items; } + bool has_visible_screen(screen_device &screen) const; + const item_ref_vector &visible_screen_items() const { return m_screen_items; } const item_ref_vector &interactive_items() const { return m_interactive_items; } const edge_vector &interactive_edges_x() const { return m_interactive_edges_x; } const edge_vector &interactive_edges_y() const { return m_interactive_edges_y; } - const screen_ref_vector &screens() const { return m_screens; } + const screen_ref_vector &visible_screens() const { return m_screens; } const visibility_toggle_vector &visibility_toggles() const { return m_vistoggles; } u32 default_visibility_mask() const { return m_defvismask; } bool has_art() const { return m_has_art; } diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index 5f3fb42b1a8..4c76c72a0c1 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -3446,7 +3446,18 @@ layout_view::~layout_view() // the given screen //------------------------------------------------- -bool layout_view::has_screen(screen_device &screen) const +bool layout_view::has_screen(screen_device &screen) +{ + return std::find_if(m_items.begin(), m_items.end(), [&screen] (auto &itm) { return itm.screen() == &screen; }) != m_items.end(); +} + + +//------------------------------------------------- +// has_visible_screen - return true if this view +// has the given screen visble +//------------------------------------------------- + +bool layout_view::has_visible_screen(screen_device &screen) const { return std::find_if(m_screens.begin(), m_screens.end(), [&screen] (auto const &scr) { return &scr.get() == &screen; }) != m_screens.end(); } diff --git a/src/mame/layout/model1io2.lay b/src/mame/layout/model1io2.lay index 785b3b4540e..493a8de92fb 100644 --- a/src/mame/layout/model1io2.lay +++ b/src/mame/layout/model1io2.lay @@ -21,29 +21,22 @@ license:CC0 - - - + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp index 297d7686837..0efea9b6622 100644 --- a/src/osd/modules/render/bgfx/chain.cpp +++ b/src/osd/modules/render/bgfx/chain.cpp @@ -81,7 +81,7 @@ void bgfx_chain::process(chain_manager::screen_prim &prim, int view, int screen, screen_device_iterator screen_iterator(window.machine().root_device()); screen_device* screen_device = screen_iterator.byindex(screen); - uint16_t screen_count(window.target()->current_view().screen_count()); + uint16_t screen_count(window.target()->current_view().visible_screen_count()); uint16_t screen_width = prim.m_quad_width; uint16_t screen_height = prim.m_quad_height; uint32_t rotation_type = diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 9fa89e0b1c7..e19f8882232 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -2431,7 +2431,7 @@ void uniform::update() } case CU_SCREEN_COUNT: { - int screen_count = win->target()->current_view().screen_count(); + int screen_count = win->target()->current_view().visible_screen_count(); m_shader->set_int("ScreenCount", screen_count); break; }