1 // Modern effects for a modern Streamer
2 // Copyright (C) 2019 Michael Fabian Dirks
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
17 
18 #pragma once
19 #include "common.hpp"
20 #include <mutex>
21 #include "gfx-blur-base.hpp"
22 #include "obs/gs/gs-effect.hpp"
23 #include "obs/gs/gs-rendertarget.hpp"
24 #include "obs/gs/gs-texture.hpp"
25 
26 namespace gfx {
27 	namespace blur {
28 		class box_data {
29 			gs::effect _effect;
30 
31 			public:
32 			box_data();
33 			virtual ~box_data();
34 
35 			gs::effect get_effect();
36 		};
37 
38 		class box_factory : public ::gfx::blur::ifactory {
39 			std::mutex                           _data_lock;
40 			std::weak_ptr<::gfx::blur::box_data> _data;
41 
42 			public:
43 			box_factory();
44 			virtual ~box_factory() override;
45 
46 			virtual bool is_type_supported(::gfx::blur::type type) override;
47 
48 			virtual std::shared_ptr<::gfx::blur::base> create(::gfx::blur::type type) override;
49 
50 			virtual double_t get_min_size(::gfx::blur::type type) override;
51 
52 			virtual double_t get_step_size(::gfx::blur::type type) override;
53 
54 			virtual double_t get_max_size(::gfx::blur::type type) override;
55 
56 			virtual double_t get_min_angle(::gfx::blur::type type) override;
57 
58 			virtual double_t get_step_angle(::gfx::blur::type type) override;
59 
60 			virtual double_t get_max_angle(::gfx::blur::type type) override;
61 
62 			virtual bool is_step_scale_supported(::gfx::blur::type type) override;
63 
64 			virtual double_t get_min_step_scale_x(::gfx::blur::type type) override;
65 
66 			virtual double_t get_step_step_scale_x(::gfx::blur::type type) override;
67 
68 			virtual double_t get_max_step_scale_x(::gfx::blur::type type) override;
69 
70 			virtual double_t get_min_step_scale_y(::gfx::blur::type type) override;
71 
72 			virtual double_t get_step_step_scale_y(::gfx::blur::type type) override;
73 
74 			virtual double_t get_max_step_scale_y(::gfx::blur::type type) override;
75 
76 			std::shared_ptr<::gfx::blur::box_data> data();
77 
78 			public: // Singleton
79 			static ::gfx::blur::box_factory& get();
80 		};
81 
82 		class box : public ::gfx::blur::base {
83 			protected:
84 			std::shared_ptr<::gfx::blur::box_data> _data;
85 
86 			double_t                            _size;
87 			std::pair<double_t, double_t>       _step_scale;
88 			std::shared_ptr<::gs::texture>      _input_texture;
89 			std::shared_ptr<::gs::rendertarget> _rendertarget;
90 
91 			private:
92 			std::shared_ptr<::gs::rendertarget> _rendertarget2;
93 
94 			public:
95 			box();
96 			virtual ~box() override;
97 
98 			virtual void set_input(std::shared_ptr<::gs::texture> texture) override;
99 
100 			virtual ::gfx::blur::type get_type() override;
101 
102 			virtual double_t get_size() override;
103 			virtual void     set_size(double_t width) override;
104 
105 			virtual void     set_step_scale(double_t x, double_t y) override;
106 			virtual void     get_step_scale(double_t& x, double_t& y) override;
107 			virtual double_t get_step_scale_x() override;
108 			virtual double_t get_step_scale_y() override;
109 
110 			virtual std::shared_ptr<::gs::texture> render() override;
111 			virtual std::shared_ptr<::gs::texture> get() override;
112 		};
113 
114 		class box_directional : public ::gfx::blur::box, public ::gfx::blur::base_angle {
115 			double_t _angle;
116 
117 			public:
118 			box_directional();
119 
120 			virtual ::gfx::blur::type get_type() override;
121 
122 			virtual double_t get_angle() override;
123 			virtual void     set_angle(double_t angle) override;
124 
125 			virtual std::shared_ptr<::gs::texture> render() override;
126 		};
127 
128 		class box_rotational : public ::gfx::blur::box,
129 							   public ::gfx::blur::base_angle,
130 							   public ::gfx::blur::base_center {
131 			std::pair<double_t, double_t> _center;
132 			double_t                      _angle;
133 
134 			public:
135 			virtual ::gfx::blur::type get_type() override;
136 
137 			virtual void set_center(double_t x, double_t y) override;
138 			virtual void get_center(double_t& x, double_t& y) override;
139 
140 			virtual double_t get_angle() override;
141 			virtual void     set_angle(double_t angle) override;
142 
143 			virtual std::shared_ptr<::gs::texture> render() override;
144 		};
145 
146 		class box_zoom : public ::gfx::blur::box, public ::gfx::blur::base_center {
147 			std::pair<double_t, double_t> _center;
148 
149 			public:
150 			virtual ::gfx::blur::type get_type() override;
151 
152 			virtual void set_center(double_t x, double_t y) override;
153 			virtual void get_center(double_t& x, double_t& y) override;
154 
155 			virtual std::shared_ptr<::gs::texture> render() override;
156 		};
157 	} // namespace blur
158 } // namespace gfx
159