Package com.bitfire.postprocessing.demo

Source Code of com.bitfire.postprocessing.demo.PostProcessingDemo

/*******************************************************************************
* 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.demo;

import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;

import org.lwjgl.opengl.Display;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.TimeUtils;
import com.bitfire.utils.ShaderLoader;

public class PostProcessingDemo implements ApplicationListener, InputProcessor {
  private static final boolean UsePanelAnimator = true;
  private static final boolean UseRightScreen = false;

  SpriteBatch batch;
  Sprite badlogic;
  OrthographicCamera camera;
  float angle;
  float width, height, halfWidth, halfHeight;
  long startMs;
  boolean quitPending = false, quitScheduled = false;
  Vector2 circleOffset = new Vector2();
  PostProcessing post;
  InputMultiplexer plex;

  UI ui;

  public static void main( String[] argv ) {
    LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();

    config.title = "libgdx's post-processing demo";
    config.width = 1280;
    config.height = 720;
    config.samples = 0;
    config.depth = 0;
    config.vSyncEnabled = true;
    config.fullscreen = false;

    new LwjglApplication( new PostProcessingDemo(), config );

    if( UseRightScreen ) {
      // move the window to the right screen
      GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
      GraphicsDevice primary = env.getDefaultScreenDevice();
      GraphicsDevice[] devices = env.getScreenDevices();
      GraphicsDevice target = null;

      // search for the first target screen
      for( int i = 0; i < devices.length; i++ ) {
        boolean isPrimary = (primary == devices[i]);
        if( !isPrimary ) {
          target = devices[i];
          break;
        }
      }

      if( target != null ) {
        DisplayMode pmode = primary.getDisplayMode();
        DisplayMode tmode = target.getDisplayMode();

        Display.setLocation( pmode.getWidth() + (tmode.getWidth() - config.width) / 2,
            (tmode.getHeight() - config.height) / 2 );
      }
    }
  }

  @Override
  public void create() {
    ShaderLoader.BasePath = "shaders/";
    plex = new InputMultiplexer();
    plex.addProcessor( this );
    Gdx.input.setInputProcessor( plex );
    post = new PostProcessing();

    createScene();
    ui = new UI( plex, post, UsePanelAnimator );
  }

  private void createScene() {
    width = Gdx.graphics.getWidth();
    height = Gdx.graphics.getHeight();
    halfWidth = width / 2;
    halfHeight = height / 2;

    camera = new OrthographicCamera( width, height );
    camera.setToOrtho( true );

    batch = new SpriteBatch();
    batch.setProjectionMatrix( camera.projection );
    batch.setTransformMatrix( camera.view );

    badlogic = ResourceFactory.newSprite( "badlogic.jpg" );

    angle = 0;
    startMs = TimeUtils.millis();
  }

  @Override
  public void dispose() {
    ResourceFactory.dispose();
    post.dispose();
  }

  @Override
  public void render() {
    if( !quitPending ) {
      update();
      draw();
    } else {
      quit();
    }
  }

  private void quit() {
    if( !quitScheduled ) {
      Gdx.app.exit();
      quitScheduled = true;
    } else {
      try {
        Thread.sleep( 50 );
      } catch( Exception e ) {
      }
    }
  }

  private void update() {
    float delta = Gdx.graphics.getDeltaTime();
    float angleSpeed = 50;
    float angleAmplitude = 50;
    float elapsedSecs = (float)(TimeUtils.millis() - startMs) / 1000;

    // circling offset
    circleOffset.x = halfWidth + (angleAmplitude * 8) * MathUtils.sin( angle * MathUtils.degreesToRadians );
    circleOffset.y = halfHeight + (angleAmplitude * 4.5f) * MathUtils.cos( angle * MathUtils.degreesToRadians );

    // angle
    angle += angleSpeed * delta;
    if( angle > 360 ) {
      angle -= 360;
    }

    // UI
    ui.update( Gdx.graphics.getDeltaTime() );

    // post-processing
    post.update( elapsedSecs );
  }

  private void draw() {

    boolean willPostProcess = post.isReady();
    boolean backgroundFirst = (willPostProcess && !ui.backgroundAffected && ui.drawBackground)
        || (!willPostProcess && ui.drawBackground);
    boolean drawbg = ui.drawBackground && ui.backgroundAffected;
    boolean drawsmth = drawbg || ui.drawSprite;
    // post.blending = backgroundFirst && willPostProcess;

    if( !ui.backgroundAffected || (backgroundFirst && willPostProcess && (post.postProcessor.getEnabledEffectsCount() == 1)) ) {
      post.enableBlending();
    } else {
      post.disableBlending();
    }

    if( backgroundFirst || !willPostProcess || !ui.drawBackground ) {
      Gdx.gl20.glClearColor( 0, 0, 0, 0 );
      Gdx.gl20.glClear( GL20.GL_COLOR_BUFFER_BIT );
      if( backgroundFirst ) {
        batch.begin();
        ui.background.draw( batch );
        batch.end();
      }
    }

    if( drawsmth ) {
      post.begin();
      batch.begin();
      {
        if( drawbg ) {
          ui.background.draw( batch );
        }

        if( ui.drawSprite ) {
          badlogic.setPosition( circleOffset.x - badlogic.getWidth() / 2, circleOffset.y - badlogic.getHeight() / 2 );
          badlogic.draw( batch );
        }
      }
      batch.end();
      post.end();
    }

    ui.draw();
  }

  @Override
  public void pause() {
  }

  @Override
  public void resume() {
    post.rebind();
  }

  @Override
  public void resize( int width, int height ) {
  }

  @Override
  public boolean keyDown( int keycode ) {
    return false;
  }

  @Override
  public boolean keyUp( int keycode ) {
    // check for quitting in keyUp, avoid multiple re-entrant keydown events
    if( keycode == Keys.Q || keycode == Keys.ESCAPE ) {
      quitPending = true;
    }
    return false;
  }

  @Override
  public boolean keyTyped( char character ) {
    return false;
  }

  @Override
  public boolean touchDown( int x, int y, int pointer, int button ) {
    return false;
  }

  @Override
  public boolean touchUp( int x, int y, int pointer, int button ) {
    return false;
  }

  @Override
  public boolean touchDragged( int x, int y, int pointer ) {
    return false;
  }

  @Override
  public boolean mouseMoved( int x, int y ) {
    if( post.zoomer.isEnabled() ) {
      post.zoomer.setOrigin( x, y );
    }

    ui.mouseMoved( x, y );
    return false;
  }

  @Override
  public boolean scrolled( int amount ) {
    post.zoomAmount += amount * -1;
    post.zoomAmount = MathUtils.clamp( post.zoomAmount, 0, 15 );
    return false;
  }
}
TOP

Related Classes of com.bitfire.postprocessing.demo.PostProcessingDemo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.