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