package com.uwsoft.editor.view.stage.tools.transformStrategy;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.math.Vector2;
import com.uwsoft.editor.renderer.components.DimensionsComponent;
import com.uwsoft.editor.renderer.components.TransformComponent;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
import com.uwsoft.editor.utils.TransformCommandBuilder;
import com.uwsoft.editor.view.ui.followers.NormalSelectionFollower;
/**
* Created by Sasun Poghosyan on 4/13/2016.
*/
public class BasicStrategy extends AbstractTransformStrategy {
private float deltaW;
private float deltaH;
@Override
public void calculate(float mouseDx, float mouseDy, int anchor, Entity entity, TransformCommandBuilder transformCommandBuilder, Vector2 mousePointStage, float lastTransformAngle, float lastEntityAngle) {
TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class);
float newWidth = dimensionsComponent.width * transformComponent.scaleX;
float newHeight = dimensionsComponent.height * transformComponent.scaleY;
float[] horizontal = calculateSizeAndXyAmount(mouseDx, mouseDy, transformComponent.rotation);
float[] vertical = calculateSizeAndXyAmount(mouseDx, mouseDy, transformComponent.rotation + 90);
deltaW = horizontal[0];
deltaH = vertical[0];
transformComponent.originX = dimensionsComponent.width * 0.5f;
transformComponent.originY = dimensionsComponent.height * 0.5f;
switch (anchor) {
case NormalSelectionFollower.L:
positionHorizontally(transformComponent, horizontal);
newWidth = dimensionsComponent.width * transformComponent.scaleX - deltaW;
break;
case NormalSelectionFollower.R:
positionHorizontally(transformComponent, horizontal);
newWidth = dimensionsComponent.width * transformComponent.scaleX + deltaW;
break;
case NormalSelectionFollower.B:
positionVertically(transformComponent, vertical);
newHeight = dimensionsComponent.height * transformComponent.scaleY - deltaH;
break;
case NormalSelectionFollower.T:
positionVertically(transformComponent, vertical);
newHeight = dimensionsComponent.height * transformComponent.scaleY + deltaH;
break;
case NormalSelectionFollower.LT:
positionItem(transformComponent, horizontal, vertical);
newWidth = dimensionsComponent.width * transformComponent.scaleX - deltaW;
newHeight = dimensionsComponent.height * transformComponent.scaleY + deltaH;
break;
case NormalSelectionFollower.RT:
positionItem(transformComponent, horizontal, vertical);
newWidth = dimensionsComponent.width * transformComponent.scaleX + deltaW;
newHeight = dimensionsComponent.height * transformComponent.scaleY + deltaH;
break;
case NormalSelectionFollower.RB:
positionItem(transformComponent, horizontal, vertical);
newWidth = dimensionsComponent.width * transformComponent.scaleX + deltaW;
newHeight = dimensionsComponent.height * transformComponent.scaleY - deltaH;
break;
case NormalSelectionFollower.LB:
positionItem(transformComponent, horizontal, vertical);
newWidth = dimensionsComponent.width * transformComponent.scaleX - deltaW;
newHeight = dimensionsComponent.height * transformComponent.scaleY - deltaH;
break;
}
// Rotating
rotating(anchor, transformCommandBuilder, mousePointStage, lastTransformAngle, lastEntityAngle, transformComponent);
float newScaleX = newWidth / dimensionsComponent.width;
float newScaleY = newHeight / dimensionsComponent.height;
transformComponent.scaleX = newScaleX;
transformComponent.scaleY = newScaleY;
transformCommandBuilder.setScale(newScaleX, newScaleY);
}
private void positionItem(TransformComponent transformComponent, float[] horizontal, float[] vertical) {
if (Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) {
deltaW *= 2;
deltaH *= 2;
} else {
transformComponent.x += horizontal[1] * 0.5f;
transformComponent.y += horizontal[2] * 0.5f;
transformComponent.x += vertical[1] * 0.5f;
transformComponent.y += vertical[2] * 0.5f;
}
}
private void positionHorizontally(TransformComponent transformComponent, float[] horizontal) {
if (Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) {
deltaW *= 2;
} else {
transformComponent.x += horizontal[1] * 0.5f;
transformComponent.y += horizontal[2] * 0.5f;
}
}
private void positionVertically(TransformComponent transformComponent, float[] vertical) {
if (Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) {
deltaH *= 2;
} else {
transformComponent.x += vertical[1] * 0.5f;
transformComponent.y += vertical[2] * 0.5f;
}
}
}