/*******************************************************************************
* DialogueEditor
* Copyright (C) 2013-2014 Pawel Pastuszak
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package pl.kotcrab.jdialogue.editor.components;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Rectangle;
import pl.kotcrab.jdialogue.editor.components.types.RelayComponent;
public class ConnectionRenderer {
private boolean renderCurves = true;
Rectangle cameraRect;
private int rendered;
public int renderLines (ShapeRenderer shapeRenderer, DComponent comp, boolean ignoreInvisible) {
rendered = 0;
if (ignoreInvisible == false && comp instanceof RelayComponent) {
if ((boolean) comp.getTableModel().data[0][1] == true) return rendered;
}
Connector[] outputs = comp.getOutputs();
for (int i = 0; i < outputs.length; i++) {
Connector con = outputs[i];
Connector target = con.getTarget();
if (target == null) continue;
float x1 = con.getX() + 6;
float y1 = con.getY() + 6;
float x2 = target.getX() + 6;
float y2 = target.getY() + 6;
float startX;
if (x2 > x1) {
startX = x1;
shapeRenderer.setColor(Color.BLACK);
} else {
shapeRenderer.setColor(Color.BLUE);
startX = x2;
}
float startY;
if (y2 > y1)
startY = y1;
else
startY = y2;
if (cameraRect.overlaps(new Rectangle(startX, startY, Math.abs(x2 - x1), Math.abs(y2 - y1))) == false)
continue;
float d = 0;
if (renderCurves) {
d = Math.abs(y1 - y2);
if (d > 100) d = 100; // limit
}
if (renderCurves)
shapeRenderer.curve(x1, y1, x1 + d, y1, x2 - d, y2, x2, y2, 32); // connection line
else
shapeRenderer.line(x1, y1, x2 - 12, y2);
rendered++;
}
return rendered;
}
public void renderTraingles (ShapeRenderer shapeRenderer, DComponent comp, boolean ignoreInvisible) {
if (comp instanceof RelayComponent) {
RelayComponent rcomp = (RelayComponent) comp;
if ((boolean) rcomp.getTableModel().data[0][1] == true) shapeRenderer.setColor(Color.RED);
}
Connector[] inputs = comp.getOutputs();
for (int i = 0; i < inputs.length; i++) {
Connector con = inputs[i];
Connector target = con.getTarget();
if (target == null) continue;
if (target.getParrentComponent().isVisible() == false && con.getParrentComponent().isVisible() == false)
continue;
float y2 = target.getY() + 6;
if (ignoreInvisible == false && comp instanceof RelayComponent && (boolean) comp.getTableModel().data[0][1] == true) {
shapeRenderer.setColor(Color.RED);
shapeRenderer.triangle(target.getX() - 8, target.getY() + 20, target.getX() - 8, target.getY() + 32, target.getX() + 3, y2 + 20); // ending triangle
shapeRenderer.triangle(con.getX() + 12, con.getY(), con.getX() + 12, con.getY() + 12, con.getX() + 22, con.getY() + 6); // ending triangle
} else {
shapeRenderer.setColor(Color.BLACK);
shapeRenderer.triangle(target.getX() - 8, target.getY(), target.getX() - 8, target.getY() + 12, target.getX() + 3, y2); // ending triangle
}
}
}
public void render (ShapeRenderer shapeRenderer, Connector selectedConnection, float x2, float y2) {
shapeRenderer.begin(ShapeType.Line);
shapeRenderer.setColor(Color.ORANGE);
float x1 = selectedConnection.getX() + 6;
float y1 = selectedConnection.getY() + 6;
float d = 0;
if (renderCurves) {
d = Math.abs(y1 - y2);
if (d > 100) d = 100; // limit
}
if (selectedConnection.isInput() == true) // swaping values because curve will look weird without this
{
float temp = x1;
x1 = x2;
x2 = temp;
temp = y1;
y1 = y2;
y2 = temp;
}
if (renderCurves)
shapeRenderer.curve(x1, y1, x1 + d, y1, x2 - d, y2, x2, y2, 32);
else
shapeRenderer.line(x1, y1, x2, y2);
shapeRenderer.end();
}
public void setCameraCalc (Rectangle cameraRect) {
this.cameraRect = cameraRect;
}
public void setRenderCurves (boolean renderCurves) {
this.renderCurves = renderCurves;
}
}