/* * ****************************************************************************** * * 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.view.ui.widget.actors; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.utils.Array; import com.kotcrab.vis.ui.widget.VisLabel; import com.uwsoft.editor.view.stage.Sandbox; public class GridView extends Actor { private Array<Segment> lines = new Array<>(); private ShapeRenderer shapeRenderer; private Label zeroLabel; private int pixelsPerWU = 1; private int gridSize; int gridLinesCount; public GridView() { gridSize = 50; gridLinesCount = 40; pixelsPerWU = Sandbox.getInstance().getPixelPerWU(); shapeRenderer = new ShapeRenderer(); for(int i = 0; i <gridLinesCount; i++) { Segment tmp = new Segment(i*gridSize-(gridLinesCount/2-1)*gridSize, -(gridLinesCount/2-1)*gridSize, i*gridSize-(gridLinesCount/2-1)*gridSize, gridSize*gridLinesCount-(gridLinesCount/2-1)*gridSize); lines.add(tmp); } for(int i = 0; i <gridLinesCount; i++) { Segment tmp = new Segment(-(gridLinesCount/2-1)*gridSize, i*gridSize-(gridLinesCount/2-1)*gridSize, gridSize*gridLinesCount-(gridLinesCount/2-1)*gridSize, i*gridSize-(gridLinesCount/2-1)*gridSize); lines.add(tmp); } this.setWidth(gridSize * gridLinesCount); this.setHeight(gridSize * gridLinesCount); zeroLabel = new VisLabel("0.0"); zeroLabel.setColor(new Color(1, 1, 1, 0.4f)); } @Override public void draw(Batch batch, float parentAlpha) { batch.end(); OrthographicCamera uiCamera = (OrthographicCamera) Sandbox.getInstance().getUIStage().getCamera(); Gdx.gl.glLineWidth(1.0f); Gdx.gl.glEnable(GL20.GL_BLEND); Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); shapeRenderer.setProjectionMatrix(uiCamera.projection); drawLines(); Gdx.gl.glDisable(GL20.GL_BLEND); batch.begin(); batch.setColor(Color.WHITE); OrthographicCamera runtimeCamera = Sandbox.getInstance().getCamera(); batch.setProjectionMatrix(uiCamera.projection); zeroLabel.draw(batch, parentAlpha); zeroLabel.setX(-(runtimeCamera.position.x*pixelsPerWU)/runtimeCamera.zoom - 5 - zeroLabel.getWidth()); zeroLabel.setY(-(runtimeCamera.position.y*pixelsPerWU)/runtimeCamera.zoom - zeroLabel.getHeight()); } private void drawLines() { shapeRenderer.begin(ShapeRenderer.ShapeType.Line); OrthographicCamera runtimeCamera = Sandbox.getInstance().getCamera(); float offsetX = (runtimeCamera.position.x*pixelsPerWU)/runtimeCamera.zoom % gridSize; float offsetY = (runtimeCamera.position.y*pixelsPerWU)/runtimeCamera.zoom % gridSize; for(int i = 0; i < lines.size; i++) { shapeRenderer.setColor(getLineColor(i)); shapeRenderer.line(lines.get(i).start.x - offsetX, lines.get(i).start.y-offsetY, lines.get(i).end.x-offsetX, lines.get(i).end.y-offsetY); } shapeRenderer.end(); } private Color getLineColor(int i) { OrthographicCamera runtimeCamera = Sandbox.getInstance().getCamera(); float offsetTmp = ((runtimeCamera.position.x*pixelsPerWU)/runtimeCamera.zoom) / gridSize; if(i >= gridLinesCount) { i-= gridLinesCount; offsetTmp = ((runtimeCamera.position.y*pixelsPerWU)/runtimeCamera.zoom) / gridSize; } // offset int offset = 0; if(offsetTmp > 0) offset = (int) Math.floor(offsetTmp); if(offsetTmp < 0) offset = (int) -Math.floor(-offsetTmp); i += offset; Color color = new Color(Color.WHITE); if((gridLinesCount/2 - i - 1) % 4 == 0) { color.a = 0.1f; } else if((gridLinesCount/2 - i - 1) % 2 == 0) { color.a = 0.05f; } else { color.a = 0.02f; } return color; } public class Segment { public Vector2 start; public Vector2 end; public Segment(float startX, float startY, float endX, float endY) { start = new Vector2(startX, startY); end = new Vector2(endX, endY); } public Segment(Vector2 start, Vector2 end) { this.start = start; this.end = end; } } }