/*
* ******************************************************************************
* * Copyright 2015 See AUTHORS file.
* *
* * 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.uwsoft.editor.renderer.factory.component;
import box2dLight.RayHandler;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.graphics.g2d.*;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.utils.Array;
import com.uwsoft.editor.renderer.SceneLoader;
import com.uwsoft.editor.renderer.components.DimensionsComponent;
import com.uwsoft.editor.renderer.components.TextureRegionComponent;
import com.uwsoft.editor.renderer.components.sprite.AnimationComponent;
import com.uwsoft.editor.renderer.components.sprite.SpriteAnimationComponent;
import com.uwsoft.editor.renderer.components.sprite.SpriteAnimationStateComponent;
import com.uwsoft.editor.renderer.data.*;
import com.uwsoft.editor.renderer.factory.EntityFactory;
import com.uwsoft.editor.renderer.resources.IResourceRetriever;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by azakhary on 5/22/2015.
*/
public class SpriteComponentFactory extends ComponentFactory {
public SpriteComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) {
super(rayHandler, world, rm);
}
@Override
public void createComponents(Entity root, Entity entity, MainItemVO vo) {
createCommonComponents(entity, vo, EntityFactory.SPRITE_TYPE);
createParentNodeComponent(root, entity);
createNodeComponent(root, entity);
createSpriteAnimationDataComponent(entity, (SpriteAnimationVO) vo);
}
@Override
protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) {
DimensionsComponent component = new DimensionsComponent();
SpriteAnimationVO sVo = (SpriteAnimationVO) vo;
Array<TextureAtlas.AtlasRegion> regions = getRegions(sVo.animationName);
ResolutionEntryVO resolutionEntryVO = rm.getLoadedResolution();
ProjectInfoVO projectInfoVO = rm.getProjectVO();
float multiplier = resolutionEntryVO.getMultiplier(rm.getProjectVO().originalResolution);
component.width = (float) regions.get(0).getRegionWidth() * multiplier / projectInfoVO.pixelToWorld;
component.height = (float) regions.get(0).getRegionHeight() * multiplier / projectInfoVO.pixelToWorld;
entity.add(component);
return component;
}
protected SpriteAnimationComponent createSpriteAnimationDataComponent(Entity entity, SpriteAnimationVO vo) {
SpriteAnimationComponent spriteAnimationComponent = new SpriteAnimationComponent();
spriteAnimationComponent.animationName = vo.animationName;
spriteAnimationComponent.frameRangeMap = new HashMap<String, FrameRange>();
for(int i = 0; i < vo.frameRangeMap.size(); i++) {
spriteAnimationComponent.frameRangeMap.put(vo.frameRangeMap.get(i).name, vo.frameRangeMap.get(i));
}
spriteAnimationComponent.fps = vo.fps;
spriteAnimationComponent.currentAnimation = vo.currentAnimation;
if(vo.playMode == 0) spriteAnimationComponent.playMode = Animation.PlayMode.NORMAL;
if(vo.playMode == 1) spriteAnimationComponent.playMode = Animation.PlayMode.REVERSED;
if(vo.playMode == 2) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP;
if(vo.playMode == 3) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP_REVERSED;
if(vo.playMode == 4) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP_PINGPONG;
if(vo.playMode == 5) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP_RANDOM;
if(vo.playMode == 6) spriteAnimationComponent.playMode = Animation.PlayMode.NORMAL;
// filtering regions by name
Array<TextureAtlas.AtlasRegion> regions = getRegions(spriteAnimationComponent.animationName);
AnimationComponent animationComponent = new AnimationComponent();
SpriteAnimationStateComponent stateComponent = new SpriteAnimationStateComponent(regions);
if(spriteAnimationComponent.frameRangeMap.isEmpty()) {
spriteAnimationComponent.frameRangeMap.put("Default", new FrameRange("Default", 0, regions.size-1));
}
if(spriteAnimationComponent.currentAnimation == null) {
spriteAnimationComponent.currentAnimation = (String) spriteAnimationComponent.frameRangeMap.keySet().toArray()[0];
}
if(spriteAnimationComponent.playMode == null) {
spriteAnimationComponent.playMode = Animation.PlayMode.LOOP;
}
stateComponent.set(spriteAnimationComponent);
TextureRegionComponent textureRegionComponent = new TextureRegionComponent();
textureRegionComponent.region = regions.get(0);
entity.add(textureRegionComponent);
entity.add(stateComponent);
entity.add(animationComponent);
entity.add(spriteAnimationComponent);
return spriteAnimationComponent;
}
private Array<TextureAtlas.AtlasRegion> getRegions(String filter) {
// filtering regions by name
Array<TextureAtlas.AtlasRegion> allRegions = rm.getSpriteAnimation(filter).getRegions();
Array<TextureAtlas.AtlasRegion> regions = new Array<TextureAtlas.AtlasRegion>();
for(TextureAtlas.AtlasRegion region: allRegions) {
if(region.name.contains(filter)) {
regions.add(region);
}
}
return regions;
}
}