gfx-shader: Initial code

This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-12-18 06:37:47 +01:00
parent 0a761b97a2
commit f1b9a1a712
2 changed files with 336 additions and 1365 deletions

File diff suppressed because it is too large Load diff

View file

@ -16,19 +16,13 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#pragma once
#include <limits>
#include <filesystem>
#include <list>
#include <map>
#include <memory>
#include <random>
#include <string>
#include <utility>
#include <vector>
#include "gfx-source-texture.hpp"
#include "gfx/shader/gfx-shader-param.hpp"
#include "obs/gs/gs-effect.hpp"
#include "obs/gs/gs-mipmapper.hpp"
#include "obs/gs/gs-rendertarget.hpp"
#include "obs/gs/gs-texture.hpp"
#include "obs/gs/gs-vertexbuffer.hpp"
// OBS
extern "C" {
@ -43,281 +37,82 @@ extern "C" {
#endif
}
#define S_SHADER_FILE "Shader.File"
#define S_SHADER_TECHNIQUE "Shader.Technique"
namespace gfx {
namespace effect_source {
/* enum class value_mode {
INPUT,
SLIDER,
};
enum class string_mode {
TEXT,
MULTILINE,
PASSWORD,
};
enum class texture_mode {
FILE,
SOURCE,
namespace shader {
enum class size_type {
Pixel,
Percent,
};
class effect_source;
class parameter {
protected:
std::weak_ptr<gfx::effect_source::effect_source> _parent;
std::shared_ptr<gs::effect> _effect;
std::shared_ptr<gs::effect_parameter> _param;
std::string _name;
std::string _visible_name;
std::string _description;
std::string _formulae;
bool _visible;
public:
parameter(std::shared_ptr<gfx::effect_source::effect_source> parent, std::shared_ptr<gs::effect> effect,
std::shared_ptr<gs::effect_parameter> param);
virtual ~parameter();
virtual void defaults(obs_properties_t* props, obs_data_t* data) = 0;
virtual void properties(obs_properties_t* props) = 0;
virtual void remove_properties(obs_properties_t* props) = 0;
virtual void update(obs_data_t* data) = 0;
virtual void tick(float_t time) = 0;
virtual void prepare() = 0;
virtual void assign() = 0;
std::shared_ptr<gs::effect_parameter> get_param();
virtual void enum_active_sources(obs_source_enum_proc_t, void*){};
public:
static std::shared_ptr<gfx::effect_source::parameter>
create(std::shared_ptr<gfx::effect_source::effect_source> parent, std::shared_ptr<gs::effect> effect,
std::shared_ptr<gs::effect_parameter> param);
enum class shader_mode {
Source,
Filter,
Transition,
};
class bool_parameter : public parameter {
bool _value;
class shader {
obs_source_t* _self;
public:
bool_parameter(std::shared_ptr<gfx::effect_source::effect_source> parent,
std::shared_ptr<gs::effect> effect, std::shared_ptr<gs::effect_parameter> param);
// Inputs
shader_mode _mode;
uint32_t _base_width;
uint32_t _base_height;
std::shared_ptr<gs::texture> _input_a;
std::shared_ptr<gs::texture> _input_b;
virtual void defaults(obs_properties_t* props, obs_data_t* data) override;
virtual void properties(obs_properties_t* props) override;
virtual void remove_properties(obs_properties_t* props) override;
virtual void update(obs_data_t* data) override;
virtual void tick(float_t time) override;
virtual void prepare() override;
virtual void assign() override;
};
class value_parameter : public parameter {
union {
float_t f[4];
int32_t i[4];
} _value;
union {
float_t f[4];
int32_t i[4];
} _minimum;
union {
float_t f[4];
int32_t i[4];
} _maximum;
union {
float_t f[4];
int32_t i[4];
} _step;
value_mode _mode = value_mode::INPUT;
struct {
std::string name[4];
std::string visible_name[4];
} _cache;
public:
value_parameter(std::shared_ptr<gfx::effect_source::effect_source> parent,
std::shared_ptr<gs::effect> effect, std::shared_ptr<gs::effect_parameter> param);
virtual void defaults(obs_properties_t* props, obs_data_t* data) override;
virtual void properties(obs_properties_t* props) override;
virtual void remove_properties(obs_properties_t* props) override;
virtual void update(obs_data_t* data) override;
virtual void tick(float_t time) override;
virtual void prepare() override;
virtual void assign() override;
};
class matrix_parameter : public parameter {
matrix4 _value;
matrix4 _minimum;
matrix4 _maximum;
matrix4 _step;
value_mode _mode = value_mode::INPUT;
struct {
std::string name[16];
std::string visible_name[16];
} _cache;
public:
matrix_parameter(std::shared_ptr<gfx::effect_source::effect_source> parent,
std::shared_ptr<gs::effect> effect, std::shared_ptr<gs::effect_parameter> param);
virtual void defaults(obs_properties_t* props, obs_data_t* data) override;
virtual void properties(obs_properties_t* props) override;
virtual void remove_properties(obs_properties_t* props) override;
virtual void update(obs_data_t* data) override;
virtual void tick(float_t time) override;
virtual void prepare() override;
virtual void assign() override;
};
class string_parameter : public parameter {
std::string _value;
string_mode _mode = string_mode::TEXT;
public:
string_parameter(std::shared_ptr<gfx::effect_source::effect_source> parent,
std::shared_ptr<gs::effect> effect, std::shared_ptr<gs::effect_parameter> param);
virtual void defaults(obs_properties_t* props, obs_data_t* data) override;
virtual void properties(obs_properties_t* props) override;
virtual void remove_properties(obs_properties_t* props) override;
virtual void update(obs_data_t* data) override;
virtual void tick(float_t time) override;
virtual void prepare() override;
virtual void assign() override;
};
class texture_parameter : public parameter {
std::string _file_name;
std::shared_ptr<gs::texture> _file;
float_t _last_check;
size_t _last_size;
time_t _last_modify_time;
time_t _last_create_time;
std::string _source_name;
std::shared_ptr<obs::source> _source;
std::shared_ptr<gfx::source_texture> _source_renderer;
std::shared_ptr<gs::texture> _source_tex;
texture_mode _mode = texture_mode::FILE;
struct {
std::string name[4];
std::string visible_name[4];
} _cache;
void load_texture(std::string file);
public:
texture_parameter(std::shared_ptr<gfx::effect_source::effect_source> parent,
std::shared_ptr<gs::effect> effect, std::shared_ptr<gs::effect_parameter> param);
bool modified2(obs_properties_t* props, obs_property_t* property, obs_data_t* settings);
virtual void defaults(obs_properties_t* props, obs_data_t* data) override;
virtual void properties(obs_properties_t* props) override;
virtual void remove_properties(obs_properties_t* props) override;
virtual void update(obs_data_t* data) override;
virtual void tick(float_t time) override;
virtual void prepare() override;
virtual void assign() override;
virtual void enum_active_sources(obs_source_enum_proc_t, void*) override;
};
typedef std::pair<gs::effect_parameter::type, std::string> param_ident_t;
typedef std::function<bool(std::shared_ptr<gs::effect_parameter> param)> valid_property_cb_t;
typedef std::function<void(std::shared_ptr<gs::effect> effect)> param_override_cb_t;
*/
class effect_source {
// Shader
std::string _source_file;
std::shared_ptr<gs::effect> _effect;
gs::effect _shader;
std::filesystem::path _shader_file;
std::string _shader_tech;
std::string _file;
std::shared_ptr<gs::effect> _effect;
std::string _tech;
std::map<param_ident_t, std::shared_ptr<parameter>> _params;
// Shader Params
std::map<std::string, std::shared_ptr<parameter>> _shader_params;
std::shared_ptr<gs::vertex_buffer> _tri;
// Options
size_type _width_type;
double_t _width_value;
size_type _height_type;
double_t _height_value;
float_t _last_check;
size_t _last_size;
time_t _last_modify_time;
time_t _last_create_time;
float_t _time;
float_t _time_active;
float_t _time_since_last_tick;
std::uniform_real_distribution<float_t> _random_dist{0.f, 1.f};
std::default_random_engine _random_generator;
void load_file(std::string file);
// Cache
float_t _time;
std::mt19937_64 _random;
std::list<std::string> _string_cache;
public:
effect_source(obs_source_t* self);
~effect_source();
shader(obs_source_t* self, shader_mode mode);
~shader();
void load_shader(std::filesystem::path file);
void load_shader_params();
void properties(obs_properties_t* props);
bool on_shader_changed(obs_properties_t* props, obs_property_t* prop, obs_data_t* data);
bool on_technique_changed(obs_properties_t* props, obs_property_t* prop, obs_data_t* data);
void update_shader(obs_data_t* data);
void update_technique(obs_data_t* data);
void update(obs_data_t* data);
uint32_t width();
uint32_t height();
bool tick(float_t time);
void render(bool is_matrix_valid = false);
void render();
obs_source_t* get_self();
public:
void set_size(uint32_t w, uint32_t h);
void enum_active_sources(obs_source_enum_proc_t, void*);
void set_input_a(std::shared_ptr<gs::texture> tex);
bool modified2(obs_properties_t* props, obs_property_t* property, obs_data_t* settings);
void set_input_b(std::shared_ptr<gs::texture> tex);
};
} // namespace effect_source
} // namespace shader
} // namespace gfx