diff options
author | 2020-10-03 04:52:06 +1000 | |
---|---|---|
committer | 2020-10-03 04:52:06 +1000 | |
commit | ae3560c57ca4096b277dbc34cebc0967930e99f6 (patch) | |
tree | 22b717655d36435795fe8a9dac2cfcdcc91b9258 | |
parent | c0754c36cde594fdd70c35b334d3bdfbb8ee085c (diff) |
emu/render.cpp: Consider that screens can be hidden when choosing a default view.
-rw-r--r-- | src/emu/render.cpp | 33 | ||||
-rw-r--r-- | src/emu/render.h | 9 | ||||
-rw-r--r-- | src/emu/rendlay.cpp | 13 | ||||
-rw-r--r-- | src/mame/layout/model1io2.lay | 37 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chain.cpp | 2 | ||||
-rw-r--r-- | 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 </element> <view name="Default"> - <!-- workaround for MAME selecting a 2-screen view by default --> - <screen tag="ioboard:screen"><bounds left="0" top="0" right="1" bottom="1" /></screen> - - <screen tag="screen"> - <bounds left="0" top="0" right="4" bottom="3" /> - </screen> - </view> - - <view name="Diagnostic"> - <element ref="background"> - <bounds x="0" y="0" width="496" height="419" /> - </element> + <collection name="Diagnostics" visible="no"> + <element ref="background"> + <bounds x="0" y="0" width="512" height="419" /> + </element> + <screen tag="ioboard:screen"> + <bounds left="8" top="392" right="129" bottom="411" /> + </screen> + <element name="led_comm_err" ref="led_red"> + <bounds x="141" y="399" width="5" height="5" /> + </element> + <element ref="text_comm_err"> + <bounds x="145" y="398" width="40" height="7" /> + </element> + </collection> <screen tag="screen"> - <bounds left="0" top="0" right="496" bottom="384" /> - </screen> - <screen tag="ioboard:screen"> - <bounds left="8" top="392" right="129" bottom="411" /> + <bounds left="0" top="0" right="512" bottom="384" /> </screen> - <element name="led_comm_err" ref="led_red"> - <bounds x="141" y="399" width="5" height="5" /> - </element> - <element ref="text_comm_err"> - <bounds x="145" y="398" width="40" height="7" /> - </element> </view> </mamelayout> 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; } |