source-mirror: 'Point' rescale should use point sampling

This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2018-01-19 05:10:42 +01:00
parent 102e4e5eeb
commit 0565065c2b
2 changed files with 26 additions and 12 deletions

View file

@ -206,6 +206,7 @@ Source::Mirror::Mirror(obs_data_t* data, obs_source_t* src) {
m_width = m_height = 1;
m_renderTarget = std::make_unique<GS::RenderTarget>(GS_RGBA, GS_ZS_NONE);
m_renderTargetScale = std::make_unique<GS::RenderTarget>(GS_RGBA, GS_ZS_NONE);
m_sampler = std::make_shared<GS::Sampler>();
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_DEFAULT);
update(data);
@ -270,21 +271,26 @@ void Source::Mirror::update(obs_data_t* data) {
ScalingMethod scaler = (ScalingMethod)obs_data_get_int(data, P_SCALING_METHOD);
switch (scaler) {
case ScalingMethod::Bilinear:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_DEFAULT);
break;
case ScalingMethod::BilinearLowRes:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_BILINEAR_LOWRES);
break;
case ScalingMethod::Bicubic:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_BICUBIC);
break;
case ScalingMethod::Lanczos:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_LANCZOS);
break;
case ScalingMethod::Point:
default:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_DEFAULT);
m_sampler->SetSampleFilter(GS_FILTER_POINT);
break;
case ScalingMethod::Bilinear:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_DEFAULT);
m_sampler->SetSampleFilter(GS_FILTER_LINEAR);
break;
case ScalingMethod::BilinearLowRes:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_BILINEAR_LOWRES);
m_sampler->SetSampleFilter(GS_FILTER_LINEAR);
break;
case ScalingMethod::Bicubic:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_BICUBIC);
m_sampler->SetSampleFilter(GS_FILTER_LINEAR);
break;
case ScalingMethod::Lanczos:
m_scalingEffect = obs_get_base_effect(obs_base_effect::OBS_EFFECT_LANCZOS);
m_sampler->SetSampleFilter(GS_FILTER_LINEAR);
break;
}
@ -342,14 +348,20 @@ void Source::Mirror::video_render(gs_effect_t* effect) {
gs_ortho(0, m_width, 0, m_height, 0, 1);
gs_clear(GS_CLEAR_COLOR, &black, 0, 0);
while (gs_effect_loop(m_scalingEffect, "Draw")) {
gs_eparam_t* image = gs_effect_get_param_by_name(m_scalingEffect, "image");
gs_effect_set_next_sampler(image, m_sampler->GetObject());
obs_source_draw(m_renderTarget->GetTextureObject(), 0, 0, m_width, m_height, false);
}
}
while (gs_effect_loop(obs_get_base_effect(OBS_EFFECT_DEFAULT), "Draw")) {
gs_eparam_t* image = gs_effect_get_param_by_name(obs_get_base_effect(OBS_EFFECT_DEFAULT), "image");
gs_effect_set_next_sampler(image, m_sampler->GetObject());
obs_source_draw(m_renderTargetScale->GetTextureObject(), 0, 0, sw, sh, false);
}
} else {
while (gs_effect_loop(m_scalingEffect, "Draw")) {
gs_eparam_t* image = gs_effect_get_param_by_name(m_scalingEffect, "image");
gs_effect_set_next_sampler(image, m_sampler->GetObject());
obs_source_draw(m_renderTarget->GetTextureObject(), 0, 0, m_width, m_height, false);
}
}

View file

@ -20,6 +20,7 @@
#pragma once
#include "plugin.h"
#include "gs-rendertarget.h"
#include "gs-sampler.h"
#include <memory>
namespace Source {
@ -74,6 +75,7 @@ namespace Source {
uint32_t m_width, m_height;
std::unique_ptr<GS::RenderTarget> m_renderTarget;
std::unique_ptr<GS::RenderTarget> m_renderTargetScale;
std::shared_ptr<GS::Sampler> m_sampler;
gs_effect_t* m_scalingEffect;
};
};