Skip to content

Commit 03a4984

Browse files
committed
adds option to point clamp, uses texture's alpha channel
1 parent 66a6cca commit 03a4984

File tree

3 files changed

+53
-15
lines changed

3 files changed

+53
-15
lines changed

data/locale/en-US.ini

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ NineSlice="9-Slicing"
77
NineSlice.Description="9-sliced Image filter"
88
NineSlice.Name="9-Slice"
99
NineSlice.ShowUVs="[Debug] Show UVs"
10+
NineSlice.UniformScale="Uniform Scale"
11+
NineSlice.LinearFiltering="Use Linear Texture Filtering"
1012
NineSlice.ScaleX="Output Scale X"
1113
NineSlice.ScaleY="Output Scale Y"
1214
NineSlice.Top="Top (Px.)"

data/sliced.hlsl

+19-7
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,28 @@ uniform bool show_uvs;
1111
uniform float4 border;
1212
uniform float2 output_size;
1313
uniform float2 source_size;
14+
uniform bool use_linear_filtering;
1415
uniform bool debug;
1516

1617
// General constants
1718
#define UVLow 0.0
1819
#define UVHigh 1.0
1920

21+
// Interpolation method and wrap mode for sampling a texture
22+
SamplerState point_clamp
23+
{
24+
Filter = Point; // Anisotropy / Point / Linear
25+
AddressU = Clamp; // Wrap / Clamp / Mirror / border / MirrorOnce
26+
AddressV = Clamp; // Wrap / Clamp / Mirror / border / MirrorOnce
27+
borderColor = 00000000; // Used only with border edges (optional)
28+
};
29+
2030
// Interpolation method and wrap mode for sampling a texture
2131
SamplerState linear_clamp
2232
{
23-
Filter = Linear; // Anisotropy / Point / Linear
24-
AddressU = Clamp; // Wrap / Clamp / Mirror / border / MirrorOnce
25-
AddressV = Clamp; // Wrap / Clamp / Mirror / border / MirrorOnce
33+
Filter = Linear; // Anisotropy / Point / Linear
34+
AddressU = Clamp; // Wrap / Clamp / Mirror / border / MirrorOnce
35+
AddressV = Clamp; // Wrap / Clamp / Mirror / border / MirrorOnce
2636
borderColor = 00000000; // Used only with border edges (optional)
2737
};
2838

@@ -93,12 +103,14 @@ float4 PS9Slice(pixel_data pixel) : TARGET
93103
);
94104

95105
// sample the texture or show UVs
96-
float3 color = show_uvs
97-
? float3(uv, 0.0)
98-
: image.Sample(linear_clamp, uv);
106+
float4 color = show_uvs
107+
? float4(uv, 0.0, 1.0)
108+
: use_linear_filtering
109+
? image.Sample(linear_clamp, uv)
110+
: image.Sample(point_clamp, uv);
99111

100112
// and return the color
101-
return float4(color, 1.0);
113+
return color;
102114
}
103115

104116
technique Draw

src/filter-9slice.c

+32-8
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,14 @@ struct filter_9slice {
4545
struct vec2 output_pixel_scale;
4646
struct vec2 last_source_size;
4747
bool show_uvs;
48+
bool uniform_scale;
49+
bool use_linear_filtering;
4850
struct filter_9slice_params_t {
4951
gs_eparam_t *border;
5052
gs_eparam_t *output_size;
5153
gs_eparam_t *source_size;
5254
gs_eparam_t *show_uvs;
55+
gs_eparam_t *use_linear_filtering;
5356
} params;
5457
};
5558

@@ -97,6 +100,7 @@ static bool filter_reload_effect(void *data)
97100
params->border = NULL;
98101
params->output_size = NULL;
99102
params->source_size = NULL;
103+
params->use_linear_filtering = NULL;
100104
params->show_uvs = NULL;
101105

102106
if (!context->effect) {
@@ -107,12 +111,17 @@ static bool filter_reload_effect(void *data)
107111

108112
params->show_uvs =
109113
gs_effect_get_param_by_name(effect, "show_uvs");
114+
params->use_linear_filtering =
115+
gs_effect_get_param_by_name(effect, "use_linear_filtering");
110116
params->border = gs_effect_get_param_by_name(effect, "border");
111117
params->output_size =
112118
gs_effect_get_param_by_name(effect, "output_size");
113119
params->source_size =
114120
gs_effect_get_param_by_name(effect, "source_size");
115121

122+
if (params->use_linear_filtering == NULL) {
123+
warn("Failed to get use_linear_filtering param.");
124+
}
116125
if (params->show_uvs == NULL) {
117126
warn("Failed to get show_uvs param.");
118127
}
@@ -161,6 +170,8 @@ static void filter_render(void *data, gs_effect_t *effect)
161170
gs_effect_set_vec2(params->source_size, &context->last_source_size);
162171
gs_effect_set_vec2(params->output_size, &output_size);
163172
gs_effect_set_bool(params->show_uvs, context->show_uvs);
173+
gs_effect_set_bool(params->use_linear_filtering,
174+
context->use_linear_filtering);
164175

165176
obs_source_process_filter_end(context->source, context->effect, width,
166177
height);
@@ -171,6 +182,9 @@ static void filter_update(void *data, obs_data_t *settings)
171182
struct filter_9slice *context = data;
172183

173184
const bool show_uvs = obs_data_get_bool(settings, "show_uvs");
185+
const bool uniform_scale = obs_data_get_bool(settings, "uniform_scale");
186+
const bool use_linear_filtering =
187+
obs_data_get_bool(settings, "use_linear_filtering");
174188

175189
const double output_scale_x =
176190
obs_data_get_double(settings, "output_scale_x");
@@ -185,9 +199,15 @@ static void filter_update(void *data, obs_data_t *settings)
185199
obs_data_get_double(settings, "border_right");
186200

187201
context->show_uvs = show_uvs;
202+
context->uniform_scale = uniform_scale;
203+
context->use_linear_filtering = use_linear_filtering;
188204

189205
context->output_pixel_scale.x = (float)output_scale_x;
190-
context->output_pixel_scale.y = (float)output_scale_y;
206+
context->output_pixel_scale.y = uniform_scale ? (float) output_scale_x : (float)output_scale_y;
207+
208+
if (uniform_scale) {
209+
obs_data_set_double(settings, "output_scale_y", output_scale_x);
210+
}
191211

192212
context->border.x = (float)border_top;
193213
context->border.y = (float)border_left;
@@ -221,6 +241,8 @@ static void filter_get_defaults(obs_data_t *settings)
221241
const double BorderDefault = 8.0;
222242

223243
obs_data_set_default_bool(settings, "show_uvs", false);
244+
obs_data_set_default_bool(settings, "uniform_scale", true);
245+
obs_data_set_default_bool(settings, "use_linear_filtering", false);
224246

225247
obs_data_set_default_double(settings, "output_scale_x", ScaleDefault);
226248
obs_data_set_default_double(settings, "output_scale_y", ScaleDefault);
@@ -246,25 +268,27 @@ static obs_properties_t *filter_get_properties(void *data)
246268

247269
// limit the border sizes to half of the source size
248270
const double SliceWidthMax =
249-
context == NULL
250-
? ScaleMin
251-
: floor((context->last_source_size.x / 2.0) - 0.5);
271+
context == NULL ? ScaleMin : context->last_source_size.x - 1.0;
252272
const double SliceHeightMax =
253-
context == NULL
254-
? ScaleMin
255-
: floor((context->last_source_size.y / 2.0) - 0.5);
273+
context == NULL ? ScaleMin : context->last_source_size.y - 1.0;
256274

257275
// debug options
258276
obs_properties_add_bool(props, "show_uvs",
259277
obs_module_text("NineSlice.ShowUVs"));
260278

279+
obs_properties_add_bool(props, "uniform_scale",
280+
obs_module_text("NineSlice.UniformScale"));
281+
282+
obs_properties_add_bool(props, "use_linear_filtering",
283+
obs_module_text("NineSlice.LinearFiltering"));
284+
261285
// output scale x/y
262286
obs_properties_add_float_slider(props, "output_scale_x",
263287
obs_module_text("NineSlice.ScaleX"),
264288
ScaleMin, ScaleMax, ScaleStep);
265289

266290
obs_properties_add_float_slider(props, "output_scale_y",
267-
obs_module_text("NineSlice.Scaley"),
291+
obs_module_text("NineSlice.ScaleY"),
268292
ScaleMin, ScaleMax, ScaleStep);
269293

270294
// border sizes

0 commit comments

Comments
 (0)