1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 crsshair.h 6 7 Crosshair handling. 8 9 ***************************************************************************/ 10 11 #ifndef MAME_EMU_CRSSHAIR_H 12 #define MAME_EMU_CRSSHAIR_H 13 14 #pragma once 15 16 17 /*************************************************************************** 18 CONSTANTS 19 ***************************************************************************/ 20 21 #define CROSSHAIR_SCREEN_NONE ((screen_device *) 0) 22 #define CROSSHAIR_SCREEN_ALL ((screen_device *) ~0) 23 24 /* user settings for visibility mode */ 25 #define CROSSHAIR_VISIBILITY_OFF 0 26 #define CROSSHAIR_VISIBILITY_ON 1 27 #define CROSSHAIR_VISIBILITY_AUTO 2 28 #define CROSSHAIR_VISIBILITY_DEFAULT CROSSHAIR_VISIBILITY_AUTO 29 30 /* range allowed for auto visibility */ 31 #define CROSSHAIR_VISIBILITY_AUTOTIME_MIN 0 32 #define CROSSHAIR_VISIBILITY_AUTOTIME_MAX 50 33 #define CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT 15 34 35 36 37 /*************************************************************************** 38 TYPE DEFINITIONS 39 ***************************************************************************/ 40 41 // ======================> render_crosshair 42 43 class render_crosshair 44 { 45 public: 46 // construction/destruction 47 render_crosshair(running_machine &machine, int player); 48 ~render_crosshair(); 49 50 // getters machine()51 running_machine &machine() const { return m_machine; } player()52 int player() const { return m_player; } is_used()53 bool is_used() const { return m_used; } mode()54 u8 mode() const { return m_mode; } is_visible()55 bool is_visible() const { return m_visible; } screen()56 screen_device *screen() const { return m_screen; } x()57 float x() const { return m_x; } y()58 float y() const { return m_y; } bitmap_name()59 const char *bitmap_name() const { return m_name.c_str(); } 60 61 // setters set_used(bool used)62 void set_used(bool used) { m_used = used; } set_mode(u8 mode)63 void set_mode(u8 mode) { m_mode = mode; } set_visible(bool visible)64 void set_visible(bool visible) { m_visible = visible; } set_screen(screen_device * screen)65 void set_screen(screen_device *screen) { m_screen = screen; } 66 //void setxy(float x, float y); 67 void set_bitmap_name(const char *name); 68 void set_default_bitmap(); 69 70 // updates 71 void animate(u16 auto_time); 72 void draw(render_container &container, u8 fade); 73 74 private: 75 // private helpers 76 void create_bitmap(); 77 void update_position(); 78 79 // private state 80 running_machine & m_machine; // reference to our machine 81 int m_player; // player number 82 bool m_used; // usage for this crosshair 83 u8 m_mode; // visibility mode for this crosshair 84 bool m_visible; // visibility for this crosshair 85 std::unique_ptr<bitmap_argb32> m_bitmap; // bitmap for this crosshair 86 render_texture * m_texture; // texture for this crosshair 87 screen_device * m_screen; // the screen on which this crosshair is drawn 88 float m_x; // current X position 89 float m_y; // current Y position 90 float m_last_x; // last X position 91 float m_last_y; // last Y position 92 u16 m_time; // time since last movement 93 std::string m_name; // name of png file 94 }; 95 96 97 // ======================> crosshair_manager 98 99 class crosshair_manager 100 { 101 public: 102 // construction/destruction 103 crosshair_manager(running_machine &machine); 104 105 /* draws crosshair(s) in a given screen, if necessary */ 106 void render(screen_device &screen); 107 108 // return true if any crosshairs are used get_usage()109 bool get_usage() const { return m_usage; } 110 111 // getters machine()112 running_machine &machine() const { return m_machine; } get_crosshair(int player)113 render_crosshair &get_crosshair(int player) const { assert(player >= 0 && player < MAX_PLAYERS); assert(m_crosshair[player] != nullptr); return *m_crosshair[player]; } auto_time()114 u16 auto_time() const { return m_auto_time; } set_auto_time(u16 auto_time)115 void set_auto_time(u16 auto_time) { m_auto_time = auto_time; } 116 117 private: 118 void exit(); 119 void animate(screen_device &device, bool vblank_state); 120 121 void config_load(config_type cfg_type, util::xml::data_node const *parentnode); 122 void config_save(config_type cfg_type, util::xml::data_node *parentnode); 123 124 // internal state 125 running_machine & m_machine; // reference to our machine 126 127 bool m_usage; // true if any crosshairs are used 128 std::unique_ptr<render_crosshair> m_crosshair[MAX_PLAYERS]; // per-player crosshair state 129 u8 m_fade; // color fading factor 130 u8 m_animation_counter; // animation frame index 131 u16 m_auto_time; // time in seconds to turn invisible 132 }; 133 134 #endif /* MAME_EMU_CRSSHAIR_H */ 135