/*
* Copyright (c) 2012, 2013 Hemanta Sapkota.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hemanta Sapkota (laex.pearl@gmail.com)
*/
package com.laex.cg2d.entityeditor.pages;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.utils.Array;
import com.google.common.base.Optional;
import com.laex.cg2d.entityeditor.Activator;
import com.laex.cg2d.model.ScreenModel.CGBounds;
import com.laex.cg2d.model.ScreenModel.CGEntity;
import com.laex.cg2d.model.ScreenModel.CGEntityAnimation;
import com.laex.cg2d.model.ScreenModel.CGEntitySpritesheetItem;
/**
* The Class ExternalAnimationPreview.
*/
public class ExternalAnimationPreview extends ApplicationAdapter {
/** The state time. */
private float stateTime;
/** The spr. */
private Sprite spr;
/** The batch. */
private SpriteBatch batch;
/** The cam. */
private OrthographicCamera cam;
/** The sprite animation. */
private Optional<Animation> spriteAnimation = Optional.absent();
/** The shape renderer. */
private ShapeRenderer shapeRenderer;
/** The h. */
float w, h;
/** The animation name. */
private String animationName;
/** The cge file. */
private String cgeFile;
/**
* Instantiates a new external animation preview.
*
* @param animationName
* the animation name
* @param cgeFile
* the cge file
*/
public ExternalAnimationPreview(String animationName, String cgeFile) {
this.animationName = animationName;
this.cgeFile = cgeFile;
}
/*
* (non-Javadoc)
*
* @see com.badlogic.gdx.ApplicationAdapter#create()
*/
@Override
public void create() {
super.create();
this.shapeRenderer = new ShapeRenderer();
Texture.setEnforcePotImages(false);
batch = new SpriteBatch();
w = Gdx.graphics.getWidth();
h = Gdx.graphics.getHeight();
cam = new OrthographicCamera(w, h);
cam.position.set(0, 0, 0);
CGEntityAnimation anim = null;
FileInputStream fis;
try {
fis = new FileInputStream(cgeFile);
CGEntity entity = CGEntity.parseFrom(fis);
for (CGEntityAnimation ea : entity.getAnimationsList()) {
if (ea.getAnimationName().equals(animationName)) {
anim = ea;
}
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
if (anim == null) {
return;
}
FileHandle handle = Gdx.files.absolute(anim.getSpritesheetFile().getResourceFileAbsolute());
if (!handle.exists()) {
return;
}
Texture tex = new Texture(handle);
tex.setFilter(TextureFilter.Linear, TextureFilter.Linear);
Array<TextureRegion> indexedFrames = new Array<TextureRegion>();
for (CGEntitySpritesheetItem esi : anim.getSpritesheetItemsList()) {
CGBounds b = esi.getExtractBounds();
TextureRegion tr = new TextureRegion(tex, (int) b.getX(), (int) b.getY(), (int) b.getWidth(), (int) b.getHeight());
indexedFrames.add(tr);
}
Animation sa = new Animation(anim.getAnimationDuration(), indexedFrames);
spriteAnimation = Optional.fromNullable(sa);
spr = new Sprite(sa.getKeyFrame(stateTime, true));
}
/*
* (non-Javadoc)
*
* @see com.badlogic.gdx.ApplicationAdapter#dispose()
*/
@Override
public void dispose() {
super.dispose();
if (spr != null)
spr.getTexture().dispose();
batch.dispose();
}
/*
* (non-Javadoc)
*
* @see com.badlogic.gdx.ApplicationAdapter#render()
*/
@Override
public void render() {
GL10 gl = Gdx.graphics.getGL10();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stateTime += Gdx.graphics.getDeltaTime();
batch.setProjectionMatrix(cam.combined);
if (!spriteAnimation.isPresent()) {
return;
}
TextureRegion tr = spriteAnimation.get().getKeyFrame(stateTime, true);
spr.setRegion(tr);
batch.begin();
spr.draw(batch);
batch.end();
shapeRenderer.begin(ShapeType.Line);
shapeRenderer.setColor(Color.ORANGE);
shapeRenderer.line(0, h / 2, w, h / 2);
shapeRenderer.line(w / 2, 0, w / 2, h);
shapeRenderer.end();
}
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(String[] args) {
String animationName = args[0];
String spriteSheetFile = args[1];
LwjglApplicationConfiguration lac = new LwjglApplicationConfiguration();
lac.width = 200;
lac.height = 200;
lac.title = animationName;
try {
ExternalAnimationPreview eap = new ExternalAnimationPreview(animationName, spriteSheetFile);
new LwjglApplication(eap, lac);
} catch (Exception ge) {
System.exit(0);
}
}
}