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