/*******************************************************************************
* Copyright 2012 bmanuel
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.bitfire.postprocessing.effects;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.math.Vector2;
import com.bitfire.postprocessing.PostProcessorEffect;
import com.bitfire.postprocessing.filters.RadialBlur;
import com.bitfire.postprocessing.filters.Zoom;
/** Implements a zooming effect: either a radial blur filter or a zoom filter is used. */
public final class Zoomer extends PostProcessorEffect {
private boolean doRadial = false;
private RadialBlur radialBlur = null;
private Zoom zoom = null;
private float oneOnW, oneOnH;
private float userOriginX, userOriginY;
/** Creating a Zoomer specifying the radial blur quality will enable radial blur */
public Zoomer (int viewportWidth, int viewportHeight, RadialBlur.Quality quality) {
setup(viewportWidth, viewportHeight, new RadialBlur(quality));
}
/** Creating a Zoomer without any parameter will use plain simple zooming */
public Zoomer (int viewportWidth, int viewportHeight) {
setup(viewportWidth, viewportHeight, null);
}
private void setup (int viewportWidth, int viewportHeight, RadialBlur radialBlurFilter) {
radialBlur = radialBlurFilter;
if (radialBlur != null) {
doRadial = true;
zoom = null;
} else {
doRadial = false;
zoom = new Zoom();
}
oneOnW = 1f / (float)viewportWidth;
oneOnH = 1f / (float)viewportHeight;
}
/** Specify the zoom origin, in screen coordinates. */
public void setOrigin (Vector2 o) {
setOrigin(o.x, o.y);
}
/** Specify the zoom origin, in screen coordinates. */
public void setOrigin (float x, float y) {
userOriginX = x;
userOriginY = y;
if (doRadial) {
radialBlur.setOrigin(x * oneOnW, 1f - y * oneOnH);
} else {
zoom.setOrigin(x * oneOnW, 1f - y * oneOnH);
}
}
public void setBlurStrength (float strength) {
if (doRadial) {
radialBlur.setStrength(strength);
}
}
public void setZoom (float zoom) {
if (doRadial) {
radialBlur.setZoom(1f / zoom);
} else {
this.zoom.setZoom(1f / zoom);
}
}
public float getZoom () {
if (doRadial) {
return 1f / radialBlur.getZoom();
} else {
return 1f / zoom.getZoom();
}
}
public float getBlurStrength () {
if (doRadial) {
return radialBlur.getStrength();
}
return -1;
}
public float getOriginX () {
return userOriginX;
}
public float getOriginY () {
return userOriginY;
}
@Override
public void dispose () {
if (radialBlur != null) {
radialBlur.dispose();
radialBlur = null;
}
if (zoom != null) {
zoom.dispose();
zoom = null;
}
}
@Override
public void rebind () {
radialBlur.rebind();
}
@Override
public void render (FrameBuffer src, FrameBuffer dest) {
restoreViewport(dest);
if (doRadial) {
radialBlur.setInput(src).setOutput(dest).render();
} else {
zoom.setInput(src).setOutput(dest).render();
}
}
}