filter-shape: Fix inability to create complex shapes

This commit is contained in:
Michael Fabian Dirks 2017-06-29 03:40:21 +02:00
parent c07f2123d7
commit ef5ab0e52e
2 changed files with 31 additions and 37 deletions

View File

@ -57,7 +57,7 @@ static void initialize() {
Filter::Shape::Shape() {
memset(&sourceInfo, 0, sizeof(obs_source_info));
sourceInfo.id = "obs-stream-effects-shape";
sourceInfo.id = "obs-stream-effects-filter-shape";
sourceInfo.type = OBS_SOURCE_TYPE_FILTER;
sourceInfo.output_flags = OBS_SOURCE_VIDEO;
sourceInfo.get_name = get_name;
@ -74,7 +74,8 @@ Filter::Shape::Shape() {
sourceInfo.video_tick = video_tick;
sourceInfo.video_render = video_render;
obs_register_source(&sourceInfo);
// Disabled for the time being. 3D Transform is better for this.
//obs_register_source(&sourceInfo);
initialize();
}
@ -114,6 +115,12 @@ obs_properties_t * Filter::Shape::get_properties(void *) {
p = obs_properties_add_bool(pr, P_SHAPE_LOOP, P_TRANSLATE(P_SHAPE_LOOP));
obs_property_set_long_description(p, P_DESC(P_SHAPE_LOOP));
p = obs_properties_add_list(pr, P_SHAPE_MODE, P_TRANSLATE(P_SHAPE_MODE),
obs_combo_type::OBS_COMBO_TYPE_LIST, obs_combo_format::OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, P_TRANSLATE(P_DESC(P_SHAPE_MODE)));
obs_property_list_add_int(p, P_TRANSLATE(P_SHAPE_MODE_TRIS), GS_TRIS);
obs_property_list_add_int(p, P_TRANSLATE(P_SHAPE_MODE_TRISTRIP), GS_TRISTRIP);
p = obs_properties_add_int_slider(pr, P_SHAPE_POINTS, P_TRANSLATE(P_SHAPE_POINTS), minimumPoints, maximumPoints, 1);
obs_property_set_long_description(p, P_DESC(P_SHAPE_POINTS));
obs_property_set_modified_callback(p, modified_properties);
@ -204,8 +211,9 @@ void Filter::Shape::video_render(void *ptr, gs_effect_t *effect) {
Filter::Shape::Instance::Instance(obs_data_t *data, obs_source_t *context)
: context(context) {
obs_enter_graphics();
m_vertexHelper = new Helper::VertexBuffer();
m_vertexHelper = new Helper::VertexBuffer(maximumPoints);
m_vertexHelper->set_uv_layers(1);
m_texRender = gs_texrender_create(GS_RGBA, GS_Z32F);
obs_leave_graphics();
update(data);
@ -247,11 +255,11 @@ void Filter::Shape::Instance::update(obs_data_t *data) {
}
}
v.color = 0xFFFFFFFF;
v.position.z = 10.0f;
v.position.z = 0.0f;
}
drawmode = (gs_draw_mode)obs_data_get_int(data, P_SHAPE_MODE);
obs_enter_graphics();
m_vertexBuffer = m_vertexHelper->update();
m_texRender = gs_texrender_create(GS_RGBA, GS_Z32F);
obs_leave_graphics();
}
@ -298,7 +306,7 @@ void Filter::Shape::Instance::video_render(gs_effect_t *effect) {
gs_texrender_reset(m_texRender);
if (gs_texrender_begin(m_texRender, baseW, baseH)) {
if (obs_source_process_filter_begin(context, GS_RGBA, OBS_ALLOW_DIRECT_RENDERING)) {
if (obs_source_process_filter_begin(context, GS_RGBA, OBS_NO_DIRECT_RENDERING)) {
obs_source_process_filter_end(context, obs_get_base_effect(OBS_EFFECT_OPAQUE), baseW, baseH);
} else {
obs_source_skip_video_filter(context);
@ -308,9 +316,9 @@ void Filter::Shape::Instance::video_render(gs_effect_t *effect) {
obs_source_skip_video_filter(context);
}
gs_texture* tex = gs_texrender_get_texture(m_texRender);
gs_projection_push();
gs_viewport_push();
//gs_projection_push();
//gs_viewport_push();
matrix4 alignedMatrix;
gs_matrix_get(&alignedMatrix);
@ -326,32 +334,15 @@ void Filter::Shape::Instance::video_render(gs_effect_t *effect) {
gs_enable_color(true, true, true, true);
gs_enable_depth_test(false);
gs_effect_t* eff = obs_get_base_effect(OBS_EFFECT_SOLID);
while (gs_effect_loop(eff, "Solid")) {
//gs_effect_set_texture(gs_effect_get_param_by_name(eff, "image"), tex);
//gs_draw_sprite(tex, 0, baseW * m_vertexHelper->at(0).position.x, baseH * m_vertexHelper->at(0).position.y);
//gs_load_default_samplerstate(false, 0);
gs_effect_t* eff = obs_get_base_effect(OBS_EFFECT_OPAQUE);
while (gs_effect_loop(eff, "Draw")) {
gs_effect_set_texture(gs_effect_get_param_by_name(eff, "image"), tex);
gs_load_vertexbuffer(m_vertexBuffer);
gs_load_indexbuffer(nullptr);
gs_draw(GS_LINESTRIP, 0, 3);
gs_render_start(true);
gs_vertex2f(0, 0);
gs_color(0xFFFFFFFF);
gs_vertex2f(1, 0);
gs_color(0xFFFFFFFF);
gs_vertex2f(1, 1);
gs_color(0xFFFFFFFF);
gs_vertex2f(0, 1);
gs_color(0xFFFFFFFF);
gs_render_stop(GS_LINESTRIP);
gs_draw(drawmode, 0, m_vertexHelper->size());
}
gs_matrix_pop();
gs_viewport_pop();
gs_projection_pop();
//gs_viewport_pop();
//gs_projection_pop();
}

View File

@ -15,14 +15,18 @@
* 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 "plugin.h"
#include "gs-helper.h"
#define P_SHAPE "Shape"
#define P_SHAPE "Shape"
#define P_SHAPE_LOOP "Shape.Loop"
#define P_SHAPE_MODE "Shape.Mode"
#define P_SHAPE_MODE_TRIS "Shape.Mode.Tris"
#define P_SHAPE_MODE_TRISTRIP "Shape.Mode.TriStrip"
#define P_SHAPE_MODE "Shape.Mode"
#define P_SHAPE_POINTS "Shape.Points"
#define P_SHAPE_POINT_X "Shape.Point.X"
#define P_SHAPE_POINT_Y "Shape.Point.Y"
@ -34,7 +38,7 @@ namespace Filter {
public:
Shape();
~Shape();
static const char *get_name(void *);
static void get_defaults(obs_data_t *);
static obs_properties_t *get_properties(void *);
@ -76,8 +80,7 @@ namespace Filter {
gs_effect_t *customEffect;
Helper::VertexBuffer *m_vertexHelper;
gs_vertbuffer_t *m_vertexBuffer;
size_t width, height;
gs_draw_mode drawmode;
gs_texrender_t *m_texRender;
};
};