package com.overlap2d.plugins.tiled.tools;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.commons.view.tools.Tool;
import com.overlap2d.plugins.tiled.TiledPlugin;
import com.puremvc.patterns.observer.Notification;
import com.uwsoft.editor.renderer.components.DimensionsComponent;
import com.uwsoft.editor.renderer.components.MainItemComponent;
import com.uwsoft.editor.renderer.components.TextureRegionComponent;
import com.uwsoft.editor.renderer.components.TransformComponent;
import com.uwsoft.editor.renderer.data.ProjectInfoVO;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
import com.uwsoft.editor.renderer.utils.CustomVariables;
/**
* Created by mariam on 3/29/16.
*/
public class DrawTileTool implements Tool {
public static final String NAME = "ADD_TILE_TOOL";
private TiledPlugin tiledPlugin;
private float gridWidth;
private float gridHeight;
public DrawTileTool(TiledPlugin tiledPlugin) {
this.tiledPlugin = tiledPlugin;
}
@Override
public void initTool() {
}
@Override
public boolean stageMouseDown(float x, float y) {
initGridThings();
drawImage(x, y);
return true;
}
@Override
public void stageMouseUp(float x, float y) {
}
@Override
public void stageMouseDragged(float x, float y) {
drawImage(x, y);
}
@Override
public void stageMouseDoubleClick(float x, float y) {
}
@Override
public boolean itemMouseDown(Entity entity, float x, float y) {
initGridThings();
drawOnEntity(entity, x, y);
return true;
}
@Override
public void itemMouseUp(Entity entity, float x, float y) {
}
@Override
public void itemMouseDragged(Entity entity, float x, float y) {
drawImage(x, y);
}
@Override
public void itemMouseDoubleClick(Entity entity, float x, float y) {
if (!tiledPlugin.isOnCurrentSelectedLayer(entity)) return;
if (entity != null) {
TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class);
// there is already other tile under this one
if (textureRegionComponent.regionName.equals(tiledPlugin.getSelectedTileName())) {
//rotate
TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
if (transformComponent.scaleX > 0 && transformComponent.scaleY > 0) {
transformComponent.scaleX *= -1f;
return;
}
if (transformComponent.scaleX < 0 && transformComponent.scaleY > 0) {
transformComponent.scaleY *= -1f;
return;
}
if (transformComponent.scaleX < 0 && transformComponent.scaleY < 0) {
transformComponent.scaleX *= -1f;
return;
}
if (transformComponent.scaleX > 0 && transformComponent.scaleY < 0) {
transformComponent.scaleY *= -1f;
return;
}
}
}
}
@Override
public String getName() {
return NAME;
}
@Override
public void handleNotification(Notification notification) {
}
@Override
public void keyDown(Entity entity, int keycode) {
if(keycode == Input.Keys.SHIFT_LEFT) {
tiledPlugin.getAPI().toolHotSwap(tiledPlugin.deleteTileTool);
tiledPlugin.deleteTileTool.setHotSwapped();
}
}
@Override
public void keyUp(Entity entity, int keycode) {
}
private void initGridThings() {
gridWidth = tiledPlugin.dataToSave.getParameterVO().gridWidth;
gridHeight = tiledPlugin.dataToSave.getParameterVO().gridHeight;
}
private void drawImage(float x, float y) {
if (tiledPlugin.getSelectedTileName().equals("")) return;
float newX = MathUtils.floor(x / gridWidth) * gridWidth + tiledPlugin.getSelectedTileGridOffset().x;
float newY = MathUtils.floor(y / gridHeight) * gridHeight + tiledPlugin.getSelectedTileGridOffset().y;
int row = MathUtils.floor(newY / gridHeight);
int column = MathUtils.floor(newX / gridWidth);
Entity underneathTile = tiledPlugin.getPluginEntityWithParams(row, column);
if (underneathTile != null) {
updateRegion(underneathTile, tiledPlugin.getSelectedTileName());
return;
}
Entity imageEntity = tiledPlugin.getAPI().drawImage(tiledPlugin.getSelectedTileName(), new Vector2(newX, newY));
MainItemComponent mainItemComponent = ComponentRetriever.get(imageEntity, MainItemComponent.class);
mainItemComponent.tags.add(TiledPlugin.TILE_TAG);
CustomVariables customVariables = new CustomVariables();
customVariables.setVariable(TiledPlugin.ROW, Integer.toString(row));
customVariables.setVariable(TiledPlugin.COLUMN, Integer.toString(column));
mainItemComponent.customVars = customVariables.saveAsString();
}
private void drawOnEntity(Entity entity, float x, float y) {
if (!tiledPlugin.isOnCurrentSelectedLayer(entity)) return;
if (entity != null) {
TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class);
// there is already other tile under this one
if(textureRegionComponent.regionName.equals(tiledPlugin.getSelectedTileName())) {
return;
} else {
//replace
updateRegion(entity, tiledPlugin.getSelectedTileName());
}
return;
}
drawImage(x, y);
}
private void updateRegion(Entity entity, String region) {
TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class);
DimensionsComponent size = ComponentRetriever.get(entity, DimensionsComponent.class);
textureRegionComponent.regionName = tiledPlugin.getSelectedTileName();
textureRegionComponent.region = tiledPlugin.getAPI().getSceneLoader().getRm().getTextureRegion(region);
ProjectInfoVO projectInfoVO = tiledPlugin.getAPI().getSceneLoader().getRm().getProjectVO();
float ppwu = projectInfoVO.pixelToWorld;
size.width = textureRegionComponent.region.getRegionWidth() / ppwu;
size.height = textureRegionComponent.region.getRegionHeight() / ppwu;
}
}