From 2a7f202e7ebb6fe516cd47455b276aca7935e775 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 14 Jun 2014 23:55:10 -0700 Subject: [PATCH] libobs: Add 'solid' effect for basic primitives --- build/data/libobs/solid.effect | 54 ++++++++++++++++++++++++++++++++++ libobs/obs.c | 14 +++++++++ libobs/obs.h | 3 ++ 3 files changed, 71 insertions(+) create mode 100644 build/data/libobs/solid.effect diff --git a/build/data/libobs/solid.effect b/build/data/libobs/solid.effect new file mode 100644 index 000000000..18a210fcd --- /dev/null +++ b/build/data/libobs/solid.effect @@ -0,0 +1,54 @@ +uniform float4x4 ViewProj; +uniform float4 color = {1.0, 1.0, 1.0, 1.0}; + +struct SolidVertInOut { + float4 pos : POSITION; +}; + +SolidVertInOut VSSolid(SolidVertInOut vert_in) +{ + SolidVertInOut vert_out; + vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj); + return vert_out; +} + +float4 PSSolid(SolidVertInOut vert_in) : TARGET +{ + return color; +} + +struct SolidColoredVertInOut { + float4 pos : POSITION; + float4 color : COLOR; +}; + +SolidColoredVertInOut VSSolidColored(SolidColoredVertInOut vert_in) +{ + SolidColoredVertInOut vert_out; + vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj); + vert_out.color = vert_in.color; + return vert_out; +} + +float4 PSSolidColored(SolidColoredVertInOut vert_in) : TARGET +{ + return vert_in.color * color; +} + +technique Solid +{ + pass + { + vertex_shader = VSSolid(vert_in); + pixel_shader = PSSolid(vert_in); + } +} + +technique SolidColored +{ + pass + { + vertex_shader = VSSolidColored(vert_in); + pixel_shader = PSSolidColored(vert_in); + } +} diff --git a/libobs/obs.c b/libobs/obs.c index 8a694ad2c..ffe22795f 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -218,6 +218,11 @@ static bool obs_init_graphics(struct obs_video_info *ovi) NULL); bfree(filename); + filename = find_libobs_data_file("solid.effect"); + video->solid_effect = gs_create_effect_from_file(filename, + NULL); + bfree(filename); + filename = find_libobs_data_file("format_conversion.effect"); video->conversion_effect = gs_create_effect_from_file(filename, NULL); @@ -225,6 +230,8 @@ static bool obs_init_graphics(struct obs_video_info *ovi) if (!video->default_effect) success = false; + if (!video->solid_effect) + success = false; if (!video->conversion_effect) success = false; } @@ -342,6 +349,7 @@ static void obs_free_graphics(void) gs_entercontext(video->graphics); effect_destroy(video->default_effect); + effect_destroy(video->solid_effect); effect_destroy(video->conversion_effect); video->default_effect = NULL; @@ -964,6 +972,12 @@ effect_t obs_get_default_effect(void) return obs->video.default_effect; } +effect_t obs_get_solid_effect(void) +{ + if (!obs) return NULL; + return obs->video.solid_effect; +} + signal_handler_t obs_signalhandler(void) { if (!obs) return NULL; diff --git a/libobs/obs.h b/libobs/obs.h index d5fb604df..8b25d8354 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -317,6 +317,9 @@ EXPORT char *obs_find_plugin_file(const char *file); /** Returns the default effect for generic RGB/YUV drawing */ EXPORT effect_t obs_get_default_effect(void); +/** Returns the solid effect for drawing solid colors */ +EXPORT effect_t obs_get_solid_effect(void); + /** Returns the primary obs signal handler */ EXPORT signal_handler_t obs_signalhandler(void);