/*******************************************************************************
* Copyright 2014 Rafael Garcia Moreno.
*
* 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.bladecoder.engineeditor.scneditor;
import java.util.ArrayList;
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.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Polygon;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.bladecoder.engine.model.AnchorActor;
import com.bladecoder.engine.model.BaseActor;
import com.bladecoder.engine.model.InteractiveActor;
import com.bladecoder.engine.model.ObstacleActor;
import com.bladecoder.engine.model.Scene;
import com.bladecoder.engine.model.SpriteActor;
import com.bladecoder.engine.model.World;
import com.bladecoder.engine.polygonalpathfinder.NavNodePolygonal;
import com.bladecoder.engineeditor.common.EditorLogger;
public class CanvasDrawer {
public static final float CORNER_DIST = 20;
private static final Color MOUSESELECTION_FILL_COLOR = new Color(0.2f, 0.2f, 0.8f, 0.4f);
private static final Color MOUSESELECTION_STROKE_COLOR = new Color(0.2f, 0.2f, 0.8f, 1f);
private final ShapeRenderer drawer = new ShapeRenderer();
private OrthographicCamera camera;
public CanvasDrawer() {
}
public void setCamera(OrthographicCamera camera) {
this.camera = camera;
}
public void drawBBoxActors(Scene scn) {
drawer.setProjectionMatrix(camera.combined);
drawer.setTransformMatrix(new Matrix4());
drawer.begin(ShapeType.Line);
for (BaseActor a : scn.getActors().values()) {
Polygon p = a.getBBox();
if (p == null) {
EditorLogger.error("ERROR DRAWING BBOX FOR: " + a.getId());
}
// Rectangle r = a.getBBox().getBoundingRectangle();
if (a instanceof ObstacleActor) {
drawer.setColor(Scene.OBSTACLE_COLOR);
drawer.polygon(p.getTransformedVertices());
} else if (a instanceof InteractiveActor) {
InteractiveActor iActor = (InteractiveActor) a;
if (!scn.getLayer(iActor.getLayer()).isVisible())
continue;
drawer.setColor(Scene.ACTOR_BBOX_COLOR);
if (p.getTransformedVertices().length > 2)
drawer.polygon(p.getTransformedVertices());
} else if (a instanceof AnchorActor) {
drawer.setColor(Scene.ANCHOR_COLOR);
drawer.line(p.getX() - Scene.ANCHOR_RADIUS, p.getY(), p.getX() + Scene.ANCHOR_RADIUS, p.getY());
drawer.line(p.getX(), p.getY() - Scene.ANCHOR_RADIUS, p.getX(), p.getY() + Scene.ANCHOR_RADIUS);
}
// drawer.rect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
}
drawer.end();
}
public void drawBBoxWalkZone(Scene scn, boolean lineOfSight) {
if (scn.getPolygonalNavGraph() != null) {
drawer.setProjectionMatrix(camera.combined);
drawer.setTransformMatrix(new Matrix4());
drawer.begin(ShapeType.Line);
drawer.setColor(Scene.WALKZONE_COLOR);
drawer.polygon(scn.getPolygonalNavGraph().getWalkZone().getTransformedVertices());
// DRAW LINEs OF SIGHT
if (lineOfSight) {
drawer.setColor(Color.WHITE);
ArrayList<NavNodePolygonal> nodes = scn.getPolygonalNavGraph().getGraphNodes();
for (NavNodePolygonal n : nodes) {
for (NavNodePolygonal n2 : n.neighbors) {
drawer.line(n.x, n.y, n2.x, n2.y);
}
}
}
drawer.end();
}
}
public void drawSelectedActor(BaseActor selectedActor) {
// Gdx.gl20.glLineWidth(3);
Gdx.gl20.glEnable(GL20.GL_BLEND);
// Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
drawer.setProjectionMatrix(camera.combined);
// drawer.setTransformMatrix(new Matrix4());
if (selectedActor instanceof AnchorActor) {
drawer.begin(ShapeRenderer.ShapeType.Line);
drawer.setColor(MOUSESELECTION_STROKE_COLOR);
drawer.rect(selectedActor.getX() - Scene.ANCHOR_RADIUS, selectedActor.getY() - Scene.ANCHOR_RADIUS,
Scene.ANCHOR_RADIUS * 2, Scene.ANCHOR_RADIUS * 2);
drawer.end();
} else {
Polygon p = selectedActor.getBBox();
Rectangle rect = p.getBoundingRectangle();
drawer.begin(ShapeRenderer.ShapeType.Filled);
drawer.setColor(MOUSESELECTION_FILL_COLOR);
drawer.rect(rect.x, rect.y, rect.width, rect.height);
drawer.end();
drawer.begin(ShapeRenderer.ShapeType.Line);
drawer.setColor(MOUSESELECTION_STROKE_COLOR);
drawer.rect(rect.x, rect.y, rect.width, rect.height);
// DRAW SELECTION BOUNDS
if ((!(selectedActor instanceof SpriteActor) || !((SpriteActor) selectedActor).isBboxFromRenderer())
&& !(selectedActor instanceof AnchorActor)) {
float verts[] = selectedActor.getBBox().getTransformedVertices();
for (int i = 0; i < verts.length; i += 2)
drawer.rect(verts[i] - CORNER_DIST / 2, verts[i + 1] - CORNER_DIST / 2, CORNER_DIST, CORNER_DIST);
}
// DRAW REFPOINT
if (selectedActor instanceof InteractiveActor) {
Vector2 refPoint = ((InteractiveActor) selectedActor).getRefPoint();
float orgX = selectedActor.getX() + refPoint.x;
float orgY = selectedActor.getY() + refPoint.y;
drawer.line(orgX - Scene.ANCHOR_RADIUS, orgY, orgX + Scene.ANCHOR_RADIUS, orgY);
drawer.line(orgX, orgY - Scene.ANCHOR_RADIUS, orgX, orgY + Scene.ANCHOR_RADIUS);
}
drawer.end();
}
}
public void drawBGBounds() {
// Gdx.gl20.glEnable(GL20.GL_BLEND);
// Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
drawer.setProjectionMatrix(camera.combined);
drawer.setTransformMatrix(new Matrix4());
drawer.begin(ShapeRenderer.ShapeType.Line);
drawer.setColor(Color.MAGENTA);
drawer.rect(0, 0, World.getInstance().getWidth(), World.getInstance().getHeight());
drawer.end();
}
public void drawPolygonVertices(Polygon p, Color c) {
float verts[] = p.getTransformedVertices();
drawer.setProjectionMatrix(camera.combined);
drawer.setTransformMatrix(new Matrix4());
drawer.begin(ShapeRenderer.ShapeType.Line);
drawer.setColor(c);
for (int i = 0; i < verts.length; i += 2)
drawer.rect(verts[i] - CORNER_DIST / 2, verts[i + 1] - CORNER_DIST / 2, CORNER_DIST, CORNER_DIST);
drawer.end();
}
}