mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-10 22:05:06 +00:00
gfx-effect-source: Add initial code for texture support
This commit is contained in:
parent
e0f1de8c4b
commit
db13c50ec5
3 changed files with 280 additions and 155 deletions
|
@ -10,6 +10,10 @@ CustomShader.Input.Text="Shader Content"
|
|||
CustomShader.Input.Text.Description="Text to load as a shader."
|
||||
CustomShader.Input.File="Shader File"
|
||||
CustomShader.Input.File.Description="File to load as a shader."
|
||||
CustomShader.Texture.Type="Type"
|
||||
CustomShader.Texture.Type.Description="What type of texture do you want to use?"
|
||||
CustomShader.Texture.Type.File="File"
|
||||
CustomShader.Texture.Type.Source="Source"
|
||||
|
||||
# Filter - Blur
|
||||
Filter.Blur="Blur"
|
||||
|
|
|
@ -16,11 +16,12 @@
|
|||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
#include "gfx-effect-source.h"
|
||||
#include "strings.h"
|
||||
#include <util/platform.h>
|
||||
#include <fstream>
|
||||
#include <util/platform.h>
|
||||
#include "strings.h"
|
||||
|
||||
bool gfx::effect_source::property_type_modified(void*, obs_properties_t* props, obs_property_t*, obs_data_t* sett) {
|
||||
bool gfx::effect_source::property_type_modified(void*, obs_properties_t* props, obs_property_t*, obs_data_t* sett)
|
||||
{
|
||||
switch ((InputTypes)obs_data_get_int(sett, D_TYPE)) {
|
||||
default:
|
||||
case InputTypes::Text:
|
||||
|
@ -35,7 +36,8 @@ bool gfx::effect_source::property_type_modified(void*, obs_properties_t* props,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool gfx::effect_source::property_input_modified(void* obj, obs_properties_t*, obs_property_t*, obs_data_t* sett) {
|
||||
bool gfx::effect_source::property_input_modified(void* obj, obs_properties_t*, obs_property_t*, obs_data_t* sett)
|
||||
{
|
||||
const char* text = nullptr;
|
||||
const char* file = nullptr;
|
||||
|
||||
|
@ -52,7 +54,43 @@ bool gfx::effect_source::property_input_modified(void* obj, obs_properties_t*, o
|
|||
return reinterpret_cast<gfx::effect_source*>(obj)->test_for_updates(text, file);
|
||||
}
|
||||
|
||||
gfx::effect_source::effect_source(obs_data_t* data, obs_source_t* owner) {
|
||||
void gfx::effect_source::fill_source_list(obs_property_t* prop)
|
||||
{
|
||||
obs_enum_sources(
|
||||
[](void* ptr, obs_source_t* src) {
|
||||
obs_property_t* prop = (obs_property_t*)ptr;
|
||||
const char* sname = obs_source_get_name(src);
|
||||
obs_property_list_add_string(prop, sname, sname);
|
||||
return true;
|
||||
},
|
||||
prop);
|
||||
}
|
||||
|
||||
bool gfx::effect_source::property_texture_type_modified(void* priv, obs_properties_t* props, obs_property_t* prop,
|
||||
obs_data_t* sett)
|
||||
{
|
||||
texture_parameter* tpm = reinterpret_cast<texture_parameter*>(priv);
|
||||
|
||||
int64_t v = obs_data_get_int(sett, obs_property_name(prop));
|
||||
if (v == 0) { // File
|
||||
obs_property_set_visible(obs_properties_get(props, tpm->ui.names[1]), true);
|
||||
obs_property_set_visible(obs_properties_get(props, tpm->ui.names[2]), false);
|
||||
} else { // Source
|
||||
obs_property_set_visible(obs_properties_get(props, tpm->ui.names[1]), false);
|
||||
obs_property_set_visible(obs_properties_get(props, tpm->ui.names[2]), true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool gfx::effect_source::property_texture_input_modified(void* priv, obs_properties_t* props, obs_property_t* prop,
|
||||
obs_data_t* sett)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
gfx::effect_source::effect_source(obs_data_t* data, obs_source_t* owner)
|
||||
{
|
||||
m_source = owner;
|
||||
m_timeExisting = 0;
|
||||
m_timeActive = 0;
|
||||
|
@ -74,11 +112,13 @@ gfx::effect_source::effect_source(obs_data_t* data, obs_source_t* owner) {
|
|||
m_quadBuffer->update(true);
|
||||
}
|
||||
|
||||
gfx::effect_source::~effect_source() {
|
||||
gfx::effect_source::~effect_source()
|
||||
{
|
||||
m_quadBuffer = nullptr;
|
||||
}
|
||||
|
||||
void gfx::effect_source::get_properties(obs_properties_t* properties) {
|
||||
void gfx::effect_source::get_properties(obs_properties_t* properties)
|
||||
{
|
||||
obs_property_t* p = nullptr;
|
||||
|
||||
p = obs_properties_add_list(properties, D_TYPE, P_TRANSLATE(T_TYPE), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
|
@ -93,7 +133,8 @@ void gfx::effect_source::get_properties(obs_properties_t* properties) {
|
|||
|
||||
{
|
||||
char* tmp_path = obs_module_file(m_defaultShaderPath.c_str());
|
||||
p = obs_properties_add_path(properties, D_INPUT_FILE, P_TRANSLATE(T_INPUT_FILE), OBS_PATH_FILE,
|
||||
p = obs_properties_add_path(
|
||||
properties, D_INPUT_FILE, P_TRANSLATE(T_INPUT_FILE), OBS_PATH_FILE,
|
||||
"Any (*.effect *.shader *.hlsl);;Effect (*.effect);;Shader (*.shader);;DirectX (*.hlsl)", tmp_path);
|
||||
obs_property_set_long_description(p, P_TRANSLATE(P_DESC(T_INPUT_FILE)));
|
||||
obs_property_set_modified_callback2(p, property_input_modified, this);
|
||||
|
@ -104,29 +145,57 @@ void gfx::effect_source::get_properties(obs_properties_t* properties) {
|
|||
for (auto prm : m_parameters) {
|
||||
if (prm.first.second == gs::effect_parameter::type::Boolean) {
|
||||
obs_properties_add_bool(properties, prm.second->ui.names[0], prm.second->ui.descs[0]);
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Integer && prm.first.second <= gs::effect_parameter::type::Integer4) {
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Integer
|
||||
&& prm.first.second <= gs::effect_parameter::type::Integer4) {
|
||||
size_t cnt = (size_t)prm.first.second - (size_t)gs::effect_parameter::type::Integer;
|
||||
|
||||
for (size_t idx = 0; idx <= cnt; idx++) {
|
||||
obs_properties_add_int(properties, prm.second->ui.names[idx], prm.second->ui.descs[idx], INT_MIN, INT_MAX, 1);
|
||||
obs_properties_add_int(properties, prm.second->ui.names[idx], prm.second->ui.descs[idx], INT_MIN,
|
||||
INT_MAX, 1);
|
||||
}
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Float && prm.first.second <= gs::effect_parameter::type::Float4) {
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Float
|
||||
&& prm.first.second <= gs::effect_parameter::type::Float4) {
|
||||
size_t cnt = (size_t)prm.first.second - (size_t)gs::effect_parameter::type::Float;
|
||||
|
||||
for (size_t idx = 0; idx <= cnt; idx++) {
|
||||
obs_properties_add_float(properties, prm.second->ui.names[idx], prm.second->ui.descs[idx], FLT_MIN, FLT_MAX, 0.01);
|
||||
obs_properties_add_float(properties, prm.second->ui.names[idx], prm.second->ui.descs[idx], -FLT_MAX,
|
||||
FLT_MAX, 0.01);
|
||||
}
|
||||
} else if (prm.first.second == gs::effect_parameter::type::Texture) {
|
||||
// Switch between File and Source Input
|
||||
p = obs_properties_add_list(properties, prm.second->ui.names[0], prm.second->ui.descs[0],
|
||||
obs_combo_type::OBS_COMBO_TYPE_LIST, obs_combo_format::OBS_COMBO_FORMAT_INT);
|
||||
obs_property_set_long_description(p, P_TRANSLATE(P_DESC(T_TEXTURE_TYPE)));
|
||||
obs_property_set_modified_callback2(p, property_texture_type_modified, prm.second.get());
|
||||
obs_property_list_add_int(p, P_TRANSLATE(T_TEXTURE_TYPE_FILE), 0);
|
||||
obs_property_list_add_int(p, P_TRANSLATE(T_TEXTURE_TYPE_SOURCE), 1);
|
||||
|
||||
// Texture Path
|
||||
char* defaultPath = obs_module_file("");
|
||||
p = obs_properties_add_path(properties, prm.second->ui.names[1], prm.second->ui.descs[1],
|
||||
obs_path_type::OBS_PATH_FILE, "Images (*.bmp *.jpeg *.jpg *.png *.tga *.tiff)",
|
||||
defaultPath);
|
||||
obs_property_set_modified_callback2(p, property_texture_input_modified, prm.second.get());
|
||||
bfree(defaultPath);
|
||||
|
||||
// Source Name
|
||||
p = obs_properties_add_list(properties, prm.second->ui.names[2], prm.second->ui.descs[2],
|
||||
obs_combo_type::OBS_COMBO_TYPE_LIST, obs_combo_format::OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_set_modified_callback2(p, property_texture_input_modified, prm.second.get());
|
||||
fill_source_list(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void gfx::effect_source::get_defaults(obs_data_t* data) {
|
||||
void gfx::effect_source::get_defaults(obs_data_t* data)
|
||||
{
|
||||
obs_data_set_default_int(data, D_TYPE, (long long)InputTypes::Text);
|
||||
obs_data_set_default_string(data, D_INPUT_TEXT, "");
|
||||
obs_data_set_default_string(data, D_INPUT_FILE, "");
|
||||
}
|
||||
|
||||
void gfx::effect_source::update(obs_data_t* data) {
|
||||
void gfx::effect_source::update(obs_data_t* data)
|
||||
{
|
||||
obs_data_addref(data);
|
||||
|
||||
// Update Shader
|
||||
|
@ -144,7 +213,8 @@ void gfx::effect_source::update(obs_data_t* data) {
|
|||
obs_data_release(data);
|
||||
}
|
||||
|
||||
bool gfx::effect_source::test_for_updates(const char* text, const char* path) {
|
||||
bool gfx::effect_source::test_for_updates(const char* text, const char* path)
|
||||
{
|
||||
bool is_shader_different = false;
|
||||
if (text != nullptr) {
|
||||
if (text != m_shader.text) {
|
||||
|
@ -178,9 +248,7 @@ bool gfx::effect_source::test_for_updates(const char* text, const char* path) {
|
|||
| (m_shader.file_info.file_size != stats.st_size);
|
||||
|
||||
// Mark shader as different if the file was changed.
|
||||
is_shader_different =
|
||||
is_shader_different
|
||||
| m_shader.file_info.modified;
|
||||
is_shader_different = is_shader_different | m_shader.file_info.modified;
|
||||
|
||||
// Update own information
|
||||
m_shader.file_info.time_create = stats.st_ctime;
|
||||
|
@ -258,7 +326,8 @@ bool gfx::effect_source::test_for_updates(const char* text, const char* path) {
|
|||
nparam->ui.descs[0] = nparam->ui.buffer.data() + ui_name.size() + 1;
|
||||
|
||||
param = std::dynamic_pointer_cast<parameter>(nparam);
|
||||
} else if (ident.second >= gs::effect_parameter::type::Integer && ident.second <= gs::effect_parameter::type::Integer4) {
|
||||
} else if (ident.second >= gs::effect_parameter::type::Integer
|
||||
&& ident.second <= gs::effect_parameter::type::Integer4) {
|
||||
std::shared_ptr<int_parameter> nparam = std::make_shared<int_parameter>();
|
||||
|
||||
size_t cnt = (size_t)ident.second - (size_t)gs::effect_parameter::type::Integer;
|
||||
|
@ -297,7 +366,8 @@ bool gfx::effect_source::test_for_updates(const char* text, const char* path) {
|
|||
}
|
||||
|
||||
param = std::dynamic_pointer_cast<parameter>(nparam);
|
||||
} else if (ident.second >= gs::effect_parameter::type::Float && ident.second <= gs::effect_parameter::type::Float4) {
|
||||
} else if (ident.second >= gs::effect_parameter::type::Float
|
||||
&& ident.second <= gs::effect_parameter::type::Float4) {
|
||||
std::shared_ptr<float_parameter> nparam = std::make_shared<float_parameter>();
|
||||
|
||||
size_t cnt = (size_t)ident.second - (size_t)gs::effect_parameter::type::Float;
|
||||
|
@ -336,8 +406,40 @@ bool gfx::effect_source::test_for_updates(const char* text, const char* path) {
|
|||
}
|
||||
|
||||
param = std::dynamic_pointer_cast<parameter>(nparam);
|
||||
} else {
|
||||
} else if (ident.second == gs::effect_parameter::type::Texture) {
|
||||
std::shared_ptr<texture_parameter> nparam = std::make_shared<texture_parameter>();
|
||||
|
||||
std::string ui_name[3], ui_desc[3];
|
||||
size_t bufsize = 0;
|
||||
|
||||
ui_name[0] = ident.first + "_type";
|
||||
ui_desc[0] = ident.first + " Type";
|
||||
ui_name[1] = ident.first + "_file";
|
||||
ui_desc[1] = ident.first + " File";
|
||||
ui_desc[2] = ident.first + "_source";
|
||||
ui_desc[2] = ident.first + " Source";
|
||||
|
||||
for (size_t i = 0; i <= 2; i++) {
|
||||
bufsize += ui_name[i].size() + ui_desc[i].size() + 2;
|
||||
}
|
||||
|
||||
nparam->ui.names.resize(3);
|
||||
nparam->ui.descs.resize(3);
|
||||
|
||||
nparam->ui.buffer.resize(bufsize);
|
||||
memset(nparam->ui.buffer.data(), 0, bufsize);
|
||||
size_t off = 0;
|
||||
for (size_t idx = 0; idx <= 2; idx++) {
|
||||
memcpy(nparam->ui.buffer.data() + off, ui_name[idx].c_str(), ui_name[idx].size());
|
||||
nparam->ui.names[idx] = nparam->ui.buffer.data() + off;
|
||||
off += ui_name[idx].size() + 1;
|
||||
|
||||
memcpy(nparam->ui.buffer.data() + off, ui_desc[idx].c_str(), ui_desc[idx].size());
|
||||
nparam->ui.descs[idx] = nparam->ui.buffer.data() + off;
|
||||
off += ui_desc[idx].size() + 1;
|
||||
}
|
||||
|
||||
param = std::dynamic_pointer_cast<parameter>(nparam);
|
||||
}
|
||||
|
||||
if (param) {
|
||||
|
@ -356,17 +458,20 @@ bool gfx::effect_source::test_for_updates(const char* text, const char* path) {
|
|||
return is_shader_different;
|
||||
}
|
||||
|
||||
void gfx::effect_source::update_parameters(obs_data_t* data) {
|
||||
void gfx::effect_source::update_parameters(obs_data_t* data)
|
||||
{
|
||||
for (auto prm : m_parameters) {
|
||||
if (prm.first.second == gs::effect_parameter::type::Boolean) {
|
||||
auto param = std::static_pointer_cast<bool_parameter>(prm.second);
|
||||
param->value = obs_data_get_bool(data, prm.second->ui.names[0]);
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Integer && prm.first.second <= gs::effect_parameter::type::Integer4) {
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Integer
|
||||
&& prm.first.second <= gs::effect_parameter::type::Integer4) {
|
||||
auto param = std::static_pointer_cast<int_parameter>(prm.second);
|
||||
for (size_t idx = 0; idx < prm.second->ui.names.size(); idx++) {
|
||||
param->value[idx] = obs_data_get_int(data, prm.second->ui.names[idx]);
|
||||
}
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Float && prm.first.second <= gs::effect_parameter::type::Float4) {
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Float
|
||||
&& prm.first.second <= gs::effect_parameter::type::Float4) {
|
||||
auto param = std::static_pointer_cast<float_parameter>(prm.second);
|
||||
for (size_t idx = 0; idx < prm.second->ui.names.size(); idx++) {
|
||||
param->value[idx] = obs_data_get_double(data, prm.second->ui.names[idx]);
|
||||
|
@ -375,12 +480,14 @@ void gfx::effect_source::update_parameters(obs_data_t* data) {
|
|||
}
|
||||
}
|
||||
|
||||
void gfx::effect_source::apply_parameters() {
|
||||
void gfx::effect_source::apply_parameters()
|
||||
{
|
||||
for (auto prm : m_parameters) {
|
||||
if (prm.first.second == gs::effect_parameter::type::Boolean) {
|
||||
auto param = std::static_pointer_cast<bool_parameter>(prm.second);
|
||||
param->param->set_bool(param->value);
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Integer && prm.first.second <= gs::effect_parameter::type::Integer4) {
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Integer
|
||||
&& prm.first.second <= gs::effect_parameter::type::Integer4) {
|
||||
auto param = std::static_pointer_cast<int_parameter>(prm.second);
|
||||
switch (prm.first.second) {
|
||||
case gs::effect_parameter::type::Integer:
|
||||
|
@ -396,7 +503,8 @@ void gfx::effect_source::apply_parameters() {
|
|||
param->param->set_int4(param->value[0], param->value[1], param->value[2], param->value[3]);
|
||||
break;
|
||||
}
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Float && prm.first.second <= gs::effect_parameter::type::Float4) {
|
||||
} else if (prm.first.second >= gs::effect_parameter::type::Float
|
||||
&& prm.first.second <= gs::effect_parameter::type::Float4) {
|
||||
auto param = std::static_pointer_cast<float_parameter>(prm.second);
|
||||
switch (prm.first.second) {
|
||||
case gs::effect_parameter::type::Float:
|
||||
|
@ -416,27 +524,33 @@ void gfx::effect_source::apply_parameters() {
|
|||
}
|
||||
}
|
||||
|
||||
void gfx::effect_source::activate() {
|
||||
void gfx::effect_source::activate()
|
||||
{
|
||||
m_timeActive = 0;
|
||||
}
|
||||
|
||||
void gfx::effect_source::deactivate() {
|
||||
void gfx::effect_source::deactivate()
|
||||
{
|
||||
m_timeActive = 0;
|
||||
}
|
||||
|
||||
std::string gfx::effect_source::get_shader_file() {
|
||||
std::string gfx::effect_source::get_shader_file()
|
||||
{
|
||||
return m_shader.path;
|
||||
}
|
||||
|
||||
uint32_t gfx::effect_source::get_width() {
|
||||
uint32_t gfx::effect_source::get_width()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t gfx::effect_source::get_height() {
|
||||
uint32_t gfx::effect_source::get_height()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gfx::effect_source::video_tick(float time) {
|
||||
void gfx::effect_source::video_tick(float time)
|
||||
{
|
||||
// Shader Timers
|
||||
m_timeExisting += time;
|
||||
m_timeActive += time;
|
||||
|
@ -447,7 +561,8 @@ void gfx::effect_source::video_tick(float time) {
|
|||
video_tick_impl(time);
|
||||
}
|
||||
|
||||
void gfx::effect_source::video_render(gs_effect_t* parent_effect) {
|
||||
void gfx::effect_source::video_render(gs_effect_t* parent_effect)
|
||||
{
|
||||
if (!m_source) {
|
||||
obs_source_skip_video_filter(m_source);
|
||||
return;
|
||||
|
@ -460,8 +575,7 @@ void gfx::effect_source::video_render(gs_effect_t* parent_effect) {
|
|||
return;
|
||||
}
|
||||
|
||||
uint32_t viewW = obs_source_get_base_width(target),
|
||||
viewH = obs_source_get_base_height(target);
|
||||
uint32_t viewW = obs_source_get_base_width(target), viewH = obs_source_get_base_height(target);
|
||||
if (!viewW || !viewH) {
|
||||
obs_source_skip_video_filter(m_source);
|
||||
return;
|
||||
|
|
|
@ -16,17 +16,21 @@
|
|||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <obs.h>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "gfx-source-texture.h"
|
||||
#include "gs-effect.h"
|
||||
#include "gs-mipmapper.h"
|
||||
#include "gs-rendertarget.h"
|
||||
#include "gs-texture.h"
|
||||
#include "gs-vertexbuffer.h"
|
||||
#include "gfx-source-texture.h"
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
extern "C" {
|
||||
#include <obs.h>
|
||||
}
|
||||
|
||||
// Data Defines
|
||||
#define D_TYPE "CustomShader.Type"
|
||||
|
@ -39,6 +43,9 @@
|
|||
#define T_TYPE_FILE "CustomShader.Type.File"
|
||||
#define T_INPUT_TEXT "CustomShader.Input.Text"
|
||||
#define T_INPUT_FILE "CustomShader.Input.File"
|
||||
#define T_TEXTURE_TYPE "CustomShader.Texture.Type"
|
||||
#define T_TEXTURE_TYPE_FILE "CustomShader.Texture.Type.File"
|
||||
#define T_TEXTURE_TYPE_SOURCE "CustomShader.Texture.Type.Source"
|
||||
|
||||
namespace gfx {
|
||||
class effect_source {
|
||||
|
@ -79,6 +86,8 @@ namespace gfx {
|
|||
struct {
|
||||
std::string name = "";
|
||||
std::shared_ptr<gfx::source_texture> tex;
|
||||
std::shared_ptr<gs::texture> final_tex;
|
||||
gs::mipmapper mipmapper;
|
||||
} source;
|
||||
|
||||
struct {
|
||||
|
@ -87,14 +96,10 @@ namespace gfx {
|
|||
std::shared_ptr<gs::rendertarget> rt;
|
||||
} resample;
|
||||
};
|
||||
struct matrix_parameter : parameter {
|
||||
|
||||
};
|
||||
struct matrix_parameter : parameter {};
|
||||
typedef std::pair<std::string, gs::effect_parameter::type> paramident_t;
|
||||
|
||||
private:
|
||||
|
||||
|
||||
protected:
|
||||
obs_source_t* m_source;
|
||||
std::shared_ptr<gs::vertex_buffer> m_quadBuffer;
|
||||
|
@ -121,7 +126,13 @@ namespace gfx {
|
|||
std::string m_defaultShaderPath = "shaders/";
|
||||
|
||||
static bool property_type_modified(void* priv, obs_properties_t* props, obs_property_t* prop, obs_data_t* sett);
|
||||
static bool property_input_modified(void* priv, obs_properties_t* props, obs_property_t* prop, obs_data_t* sett);
|
||||
static bool property_input_modified(void* priv, obs_properties_t* props, obs_property_t* prop,
|
||||
obs_data_t* sett);
|
||||
static void fill_source_list(obs_property_t* prop);
|
||||
static bool property_texture_type_modified(void* priv, obs_properties_t* props, obs_property_t* prop,
|
||||
obs_data_t* sett);
|
||||
static bool property_texture_input_modified(void* priv, obs_properties_t* props, obs_property_t* prop,
|
||||
obs_data_t* sett);
|
||||
|
||||
virtual bool is_special_parameter(std::string name, gs::effect_parameter::type type) = 0;
|
||||
|
||||
|
@ -149,11 +160,7 @@ namespace gfx {
|
|||
void video_tick(float time);
|
||||
void video_render(gs_effect_t* parent_effect);
|
||||
|
||||
|
||||
public:
|
||||
enum class InputTypes {
|
||||
Text,
|
||||
File
|
||||
enum class InputTypes { Text, File };
|
||||
};
|
||||
};
|
||||
}
|
||||
} // namespace gfx
|
||||
|
|
Loading…
Reference in a new issue