mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-11 06:15:05 +00:00
5291b193e2
Fixes rendering at unexpected sizes by first rendering to a render target and then rendering the contents of that render target to the frame buffer instead. This also prevent rendering twice or more, which might cause severe FPS impact.
122 lines
3.3 KiB
C++
122 lines
3.3 KiB
C++
// Modern effects for a modern Streamer
|
|
// Copyright (C) 2017 Michael Fabian Dirks
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
#pragma once
|
|
#include "common.hpp"
|
|
#include <filesystem>
|
|
#include <list>
|
|
#include <map>
|
|
#include <random>
|
|
#include "gfx/shader/gfx-shader-param.hpp"
|
|
#include "obs/gs/gs-effect.hpp"
|
|
#include "obs/gs/gs-rendertarget.hpp"
|
|
|
|
namespace gfx {
|
|
namespace shader {
|
|
enum class size_type {
|
|
Pixel,
|
|
Percent,
|
|
};
|
|
|
|
enum class shader_mode {
|
|
Source,
|
|
Filter,
|
|
Transition,
|
|
};
|
|
|
|
typedef std::map<std::string, std::shared_ptr<parameter>> shader_param_map_t;
|
|
|
|
class shader {
|
|
obs_source_t* _self;
|
|
|
|
// Inputs
|
|
shader_mode _mode;
|
|
std::uint32_t _base_width;
|
|
std::uint32_t _base_height;
|
|
|
|
// Shader
|
|
gs::effect _shader;
|
|
std::filesystem::path _shader_file;
|
|
std::string _shader_tech;
|
|
std::filesystem::file_time_type _shader_file_mt;
|
|
uintmax_t _shader_file_sz;
|
|
float_t _shader_file_tick;
|
|
shader_param_map_t _shader_params;
|
|
|
|
// Options
|
|
size_type _width_type;
|
|
double_t _width_value;
|
|
size_type _height_type;
|
|
double_t _height_value;
|
|
|
|
// Cache
|
|
float_t _time;
|
|
float_t _time_loop;
|
|
int32_t _loops;
|
|
std::mt19937_64 _random;
|
|
bool _have_current_params;
|
|
|
|
// Rendering
|
|
bool _rt_up_to_date;
|
|
std::shared_ptr<gs::rendertarget> _rt;
|
|
|
|
public:
|
|
shader(obs_source_t* self, shader_mode mode);
|
|
~shader();
|
|
|
|
bool is_shader_different(const std::filesystem::path& file);
|
|
|
|
bool is_technique_different(const std::string& tech);
|
|
|
|
bool load_shader(const std::filesystem::path& file, const std::string& tech, bool& shader_dirty,
|
|
bool& param_dirty);
|
|
|
|
static void defaults(obs_data_t* data);
|
|
|
|
void properties(obs_properties_t* props);
|
|
|
|
bool on_refresh_properties(obs_properties_t* props, obs_property_t* prop);
|
|
|
|
bool on_shader_or_technique_modified(obs_properties_t* props, obs_property_t* prop, obs_data_t* data);
|
|
|
|
bool update_shader(obs_data_t* data, bool& shader_dirty, bool& param_dirty);
|
|
|
|
void update(obs_data_t* data);
|
|
|
|
std::uint32_t width();
|
|
|
|
std::uint32_t height();
|
|
|
|
bool tick(float_t time);
|
|
|
|
void prepare_render();
|
|
|
|
void render();
|
|
|
|
public:
|
|
void set_size(std::uint32_t w, std::uint32_t h);
|
|
|
|
void set_input_a(std::shared_ptr<gs::texture> tex);
|
|
|
|
void set_input_b(std::shared_ptr<gs::texture> tex);
|
|
|
|
void set_transition_time(float_t t);
|
|
|
|
void set_transition_size(std::uint32_t w, std::uint32_t h);
|
|
};
|
|
} // namespace shader
|
|
} // namespace gfx
|