package info.u250.c2d.box2deditor.gdx.scenes;
import info.u250.c2d.box2deditor.adapter.PolygonFixtureDefModel;
import info.u250.c2d.box2deditor.gdx.support.AbstractBox2dHelper;
import info.u250.c2d.box2deditor.gdx.support.Click;
import info.u250.c2d.box2deditor.gdx.support.Geometry;
import info.u250.c2d.engine.Engine;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Vector2;
public class PolygonHelper extends AbstractBox2dHelper<PolygonFixtureDefModel> {
private Vector2 snapPoint = null;
Click click = Click.NONE;
InputAdapter input = new InputAdapter() {
@Override
public boolean touchDown(int x, int y, int pointer, int button) {
if(button == Buttons.LEFT){
if(button == Buttons.LEFT){
if(snapPoint == null){
Vector2 newPoint = new Vector2(Engine.screenToWorld(x, y));
snapPoint = newPoint;
model.polygon.add(newPoint);
updateToUI();
}
}
}else if(button == Buttons.RIGHT){
if(null!=snapPoint){
if(model.polygon.size()>3){
model.polygon.remove(snapPoint);
updateToUI();
}
}
}
return super.touchDown(x, y, pointer, button);
}
@Override
public boolean mouseMoved(int x, int y) {
snapPoint = null;
for(Vector2 v:model.polygon){
if(Engine.screenToWorld(x, y).dst(v)<10){
snapPoint = v;
break;
}
}
return super.mouseMoved(x, y);
}
public boolean touchDragged(int screenX, int screenY, int pointer) {
if(null!=snapPoint){
Vector2 vv = Engine.screenToWorld(screenX, screenY);
for(Vector2 v:model.polygon){
if(vv.dst(v)<10){
return false;
}
}
snapPoint.set(vv);
updateToUI();
if(vv.x>Engine.getDefaultCamera().position.x + Engine.getDefaultCamera().viewportWidth/2){
Engine.getDefaultCamera().position.x = vv.x-Engine.getDefaultCamera().viewportWidth/2;
}else if(vv.x<Engine.getDefaultCamera().position.x - Engine.getDefaultCamera().viewportWidth/2){
Engine.getDefaultCamera().position.x = vv.x+Engine.getDefaultCamera().viewportWidth/2;
}
if(vv.y>Engine.getDefaultCamera().position.y + Engine.getDefaultCamera().viewportHeight/2){
Engine.getDefaultCamera().position.y = vv.y-Engine.getDefaultCamera().viewportHeight/2;
}else if(vv.y<Engine.getDefaultCamera().position.y - Engine.getDefaultCamera().viewportHeight/2){
Engine.getDefaultCamera().position.y = vv.y+Engine.getDefaultCamera().viewportHeight/2;
}
}
return super.touchDragged(screenX, screenY, pointer);
}
};
public PolygonHelper(MainScene adapter) {
super(adapter);
}
Vector2 tmp = new Vector2();
@Override
public void render(float delta) {
Gdx.gl.glEnable(GL20.GL_BLEND);
Geometry.renderPolygon(model, tmp , 0 ,false);
drawSnap();
Gdx.gl.glDisable(GL20.GL_BLEND);
}
void drawSnap(){
final float SPACE = 5;
for(int i=0;i<model.polygon.size();i++){
render.begin(ShapeType.Line);
render.setColor(Color.BLUE);
render.rect(model.polygon.get(i).x-SPACE, model.polygon.get(i).y-SPACE, 2*SPACE, 2*SPACE);
render.end();
}
if(null!=snapPoint){
render.begin(ShapeType.Filled);
render.setColor(Color.BLUE);
render.rect(snapPoint.x-SPACE, snapPoint.y-SPACE, 2*SPACE, 2*SPACE);
render.end();
}
Engine.getSpriteBatch().begin();
for(int i=0;i<model.polygon.size();i++){
Engine.getDefaultFont().setColor(Color.RED);
Engine.getDefaultFont().draw(Engine.getSpriteBatch(), ""+(i+1), model.polygon.get(i).x, model.polygon.get(i).y);
}
Engine.getSpriteBatch().end();
}
@Override
public InputProcessor getInputProcessor() {
return input;
}
@Override
public Class<PolygonFixtureDefModel> getType() {
return PolygonFixtureDefModel.class;
}
}