/******************************************************************************* * Copyright 2014 Rafael Garcia Moreno. * * 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.bladecoder.engineeditor.scneditor; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.ui.Widget; import com.badlogic.gdx.utils.Align; import com.bladecoder.engine.anim.AnimationDesc; import com.bladecoder.engine.anim.AtlasAnimationDesc; import com.bladecoder.engine.anim.Tween; import com.bladecoder.engine.assets.EngineAssetManager; import com.bladecoder.engine.model.ActorRenderer; import com.bladecoder.engine.model.AnimationRenderer; import com.bladecoder.engine.model.AtlasRenderer; import com.bladecoder.engine.model.ImageRenderer; import com.bladecoder.engine.model.Sprite3DRenderer; import com.bladecoder.engine.spine.SpineRenderer; import com.bladecoder.engine.util.RectangleRenderer; import com.bladecoder.engineeditor.common.EditorLogger; import com.bladecoder.engineeditor.model.Project; import com.bladecoder.engineeditor.ui.EditAnimationDialog; public class AnimationWidget extends Widget { private AnimationDesc fa; private ActorRenderer renderer; EditAnimationDialog editFADialog; public AnimationWidget(EditAnimationDialog createEditFADialog) { this.editFADialog = createEditFADialog; } public void setSource(String type, AnimationDesc anim) { fa = anim; if (renderer != null) { renderer.dispose(); renderer = null; } if (type.equals(Project.S3D_RENDERER_STRING)) { renderer = new Sprite3DRenderer(); ((Sprite3DRenderer) renderer).setSpriteSize(new Vector2(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); } else if (type.equals(Project.SPINE_RENDERER_STRING)) { renderer = new SpineRenderer(); ((SpineRenderer) renderer).enableEvents(false); } else if (type.equals(Project.IMAGE_RENDERER_STRING)) { renderer = new ImageRenderer(); } else { renderer = new AtlasRenderer(); } renderer.setOrgAlign(Align.bottom); renderer.loadAssets(); EngineAssetManager.getInstance().finishLoading(); renderer.retrieveAssets(); } public String[] getAnimations() { try { return ((AnimationRenderer)renderer).getInternalAnimations(fa); } catch (Exception e) { // Message.show(getStage(), // "Error loading animations from selected source", 4); EditorLogger.error("Error loading animations from selected source:" + fa.source + ": " + e.getMessage()); return new String[0]; } } public void setAnimation(String id, String speedStr, Tween.Type t) { if (fa != null && id != null && !id.isEmpty()) { if(fa instanceof AtlasAnimationDesc) ((AtlasAnimationDesc) fa).regions = null; Tween.Type type = Tween.Type.REPEAT; float speed = 2.0f; if (speedStr != null && !speedStr.isEmpty()) { try { speed = Float.parseFloat(speedStr); } catch(NumberFormatException e) { speed = 0; } } if (t == Tween.Type.YOYO) type = Tween.Type.YOYO; else if(t == Tween.Type.REVERSE) type = Tween.Type.REVERSE_REPEAT; fa.id = id; fa.duration = speed; fa.animationType = type; fa.count = -1; ((AnimationRenderer)renderer).getAnimations().clear(); ((AnimationRenderer)renderer).addAnimation(fa); ((AnimationRenderer)renderer).startAnimation(fa.id, Tween.Type.SPRITE_DEFINED, 1, null); } } public void draw(Batch batch, float parentAlpha) { super.draw(batch, parentAlpha); if (renderer == null || ((AnimationRenderer)renderer).getCurrentAnimation() == null) return; Color tmp = batch.getColor(); batch.setColor(Color.WHITE); renderer.update(Gdx.graphics.getDeltaTime()); RectangleRenderer.draw((SpriteBatch) batch, getX(), getY(), getWidth(), getHeight(), Color.MAGENTA); float scalew = getWidth() / renderer.getWidth(); float scaleh = getHeight() / renderer.getHeight(); float scale = scalew > scaleh ? scaleh : scalew; renderer.draw((SpriteBatch) batch, getX() + renderer.getWidth() * scale / 2, getY(), scale, 0f, null); batch.setColor(tmp); } public void dispose() { renderer.dispose(); } }