/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Flemming N. Larsen
* - Initial implementation
*******************************************************************************/
package net.sf.robocode.ui.gfx;
import java.awt.*;
import java.awt.geom.*;
/**
* This class is used for rendering the Robocode logo.
*
* @author Flemming N. Larsen (original)
*/
public class RobocodeLogo {
public final static int WIDTH = 570;
public final static int HEIGHT = 213;
private final static Color WHITE_ALPHA_7F = new Color(0xff, 0xff, 0xff, 0x7f);
private final static Color GLOW_GREEN = new Color(0x0A, 0xff, 0x0A, 0x66);
private final static Color DARK_GREEN_ALPHA_80 = new Color(0x00, 0x70, 0x00, 0x80);
private final static Color GREEN_ALPHA_08 = new Color(0x00, 0xff, 0x00, 0x08);
private final static Color GREEN_ALPHA_20 = new Color(0x00, 0xff, 0x00, 0x20);
private final static Color GREEN_ALPHA_40 = new Color(0x00, 0xff, 0x00, 0x40);
private final static Color GREEN_ALPHA_48 = new Color(0x00, 0xff, 0x00, 0x48);
private final static Color GREEN_ALPHA_80 = new Color(0x00, 0xff, 0x00, 0x80);
private final static Shape I_SHAPE = new Rectangle2D.Float(0, 0, 13, 46);
private final static Stroke THIN_STROKE = new BasicStroke(1.5f);
public void paintLogoWithTanks(Graphics graphics) {
Graphics2D g = (Graphics2D) graphics;
AffineTransform origTransform = g.getTransform();
g.setColor(Color.BLACK);
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
drawTanks(g);
drawOuterDecoration(g);
drawMiddleEllipse(g);
drawMiddleDecoration(g);
drawInnerDecoration(g);
drawInnerSubDecoration(g);
drawRobocodeText(g);
g.setTransform(origTransform);
}
private void transform(Graphics2D g, AffineTransform tx) {
AffineTransform at = new AffineTransform();
if (tx != null) {
at.concatenate(tx);
}
g.setTransform(at);
}
private void drawTanks(Graphics2D g) {
AffineTransform origTransform = g.getTransform();
drawRobot(g, 22, 192, (float) Math.PI / 2, -0.2f, -0.2f, new Color(0x30, 0x00, 0x10, 0xff));
drawRobot(g, 22, 92, (float) Math.PI / 2, (float) Math.PI, (float) Math.PI, new Color(0x16, 0x00, 0x2c, 0xff));
drawRobot(g, 212, 173, 0.75f, 0.75f, 0.75f, new Color(0x02, 0x01, 0x00, 0xff));
drawRobot(g, 455, 50, 2.4f, 2f, 2f, new Color(0x02, 0x00, 0x01, 0xff));
drawRobot(g, 492, 82, -0.3f, -0.27f, -0.27f, new Color(0x00, 0x00, 0x01, 0xff));
transform(g, AffineTransform.getTranslateInstance(270, -25));
RenderImage explRenderImage1 = new RenderImage(
ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion2-24.png"));
explRenderImage1.paint(g);
transform(g, AffineTransform.getTranslateInstance(23, 102));
RenderImage explRenderImage2 = new RenderImage(
ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion1-8.png"));
explRenderImage2.setTransform(AffineTransform.getScaleInstance(0.3, 0.3));
explRenderImage2.paint(g);
transform(g, AffineTransform.getTranslateInstance(464, 55));
RenderImage explRenderImage3 = new RenderImage(
ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion1-1.png"));
explRenderImage3.setTransform(AffineTransform.getScaleInstance(0.5, 0.5));
explRenderImage3.paint(g);
transform(g, AffineTransform.getTranslateInstance(488, 72));
RenderImage explRenderImage4 = new RenderImage(
ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion1-6.png"));
explRenderImage4.setTransform(AffineTransform.getScaleInstance(0.4, 0.4));
explRenderImage4.paint(g);
transform(g, origTransform);
g.setColor(Color.LIGHT_GRAY);
g.fillOval(20, 154, 3, 3);
}
private void drawRobot(Graphics2D g, int x, int y, float bodyAngle, float gunAngle, float radarAngle, Color color) {
transform(g, AffineTransform.getTranslateInstance(x, y));
RenderImage bodyRenderImage = new RenderImage(
ImageUtil.createColouredRobotImage(ImageUtil.getImage("/net/sf/robocode/ui/images/body.png"), color));
bodyRenderImage.setTransform(AffineTransform.getRotateInstance(bodyAngle));
bodyRenderImage.paint(g);
RenderImage gunRenderImage = new RenderImage(
ImageUtil.createColouredRobotImage(ImageUtil.getImage("/net/sf/robocode/ui/images/turret.png"), color));
gunRenderImage.setTransform(AffineTransform.getRotateInstance(gunAngle));
gunRenderImage.paint(g);
RenderImage radarRenderImage = new RenderImage(
ImageUtil.createColouredRobotImage(ImageUtil.getImage("/net/sf/robocode/ui/images/radar.png"), color));
radarRenderImage.setTransform(AffineTransform.getRotateInstance(radarAngle));
radarRenderImage.paint(g);
}
private void drawOuterDecoration(Graphics2D g) {
Shape shape = getOuterDecoration();
transform(g, AffineTransform.getTranslateInstance(26, 24));
g.setColor(WHITE_ALPHA_7F);
g.fill(shape);
g.setStroke(THIN_STROKE);
g.drawOval(16, 5, 490, 163);
}
private void drawMiddleEllipse(Graphics2D g) {
transform(g, null);
Shape ellipse = new Ellipse2D.Float(68, 38, 440, 146);
g.setColor(DARK_GREEN_ALPHA_80);
g.fill(ellipse);
g.setColor(GREEN_ALPHA_40);
g.setStroke(THIN_STROKE);
g.draw(ellipse);
}
private void drawMiddleDecoration(Graphics2D g) {
Shape shape = getMiddleDecoration();
transform(g, AffineTransform.getTranslateInstance(77, 41));
g.setColor(GREEN_ALPHA_20);
g.fill(shape);
g.setStroke(THIN_STROKE);
g.setColor(GREEN_ALPHA_48);
g.draw(shape);
}
private void drawInnerDecoration(Graphics2D g) {
Shape shape = getInnerDecoration();
transform(g, AffineTransform.getTranslateInstance(103, 52));
g.setColor(DARK_GREEN_ALPHA_80);
g.fill(shape);
g.setStroke(THIN_STROKE);
g.setColor(GLOW_GREEN);
g.draw(shape);
}
private void drawInnerSubDecoration(Graphics2D g) {
Shape shape = getInnerSubDecoration();
transform(g, AffineTransform.getTranslateInstance(110, 54));
g.setColor(GREEN_ALPHA_08);
g.fill(shape);
g.setStroke(THIN_STROKE);
g.setColor(GREEN_ALPHA_48);
g.draw(shape);
}
private void drawRobocodeText(Graphics2D g) {
Shape shape = getRobocodeText();
transform(g, AffineTransform.getTranslateInstance(121, 88));
g.setColor(GREEN_ALPHA_40);
g.fill(shape);
g.setStroke(THIN_STROKE);
g.setColor(GREEN_ALPHA_80);
g.draw(shape);
}
private Area outerDecoration;
private Shape getOuterDecoration() {
if (outerDecoration == null) {
float W = 523;
float H = 174;
outerDecoration = new Area(new Ellipse2D.Float(0, 0, W, H));
outerDecoration.subtract(new Area(new Ellipse2D.Float(16, 5, W - 2 * 16, H - 2 * 5)));
outerDecoration.subtract(new Area(new Rectangle2D.Float(W / 2, 0, W / 2, H / 2)));
outerDecoration.subtract(new Area(new Rectangle2D.Float(0, H / 2, W / 2, H / 2)));
}
return outerDecoration;
}
private Area middleDecoration;
private Shape getMiddleDecoration() {
if (middleDecoration == null) {
middleDecoration = new Area(new Ellipse2D.Float(0, 0, 420, 140));
Rectangle2D.Float rect = new Rectangle2D.Float(180, 69, 500, 3);
for (float deg = 120; deg <= 335; deg += 4.8f) {
Area rectArea = new Area(rect);
rectArea.transform(AffineTransform.getRotateInstance(Math.toRadians(deg), 151, 72));
middleDecoration.subtract(rectArea);
}
middleDecoration.subtract(new Area(new Ellipse2D.Float(18, 2, 408, 144)));
}
return middleDecoration;
}
private Area innerSubDecoration;
private Shape getInnerSubDecoration() {
if (innerSubDecoration == null) {
innerSubDecoration = new Area(new Ellipse2D.Float(0, 0, 356, 114));
innerSubDecoration.subtract(
new Area(new Rectangle2D.Float(Float.MIN_VALUE, Float.MIN_VALUE, Float.MAX_VALUE, 88)));
innerSubDecoration.subtract(
new Area(new Rectangle2D.Float(Float.MIN_VALUE, Float.MIN_VALUE, 184, Float.MAX_VALUE)));
innerSubDecoration.subtract(new Area(new Rectangle2D.Float(209, Float.MIN_VALUE, 3, Float.MAX_VALUE)));
}
return innerSubDecoration;
}
private Area innerDecoration;
private Shape getInnerDecoration() {
if (innerDecoration == null) {
innerDecoration = new Area(new Ellipse2D.Float(0, 0, 368, 120));
innerDecoration.subtract(new Area(new Rectangle2D.Float(Float.MIN_VALUE, 30, Float.MAX_VALUE, 56)));
innerDecoration.subtract(new Area(new Rectangle2D.Float(181, Float.MIN_VALUE, 7, Float.MAX_VALUE)));
}
return innerDecoration;
}
private GeneralPath robocodeTextPath;
public GeneralPath getRobocodeText() {
if (robocodeTextPath == null) {
robocodeTextPath = new GeneralPath();
GeneralPath R = getPathR();
GeneralPath o = getPathO();
GeneralPath b = getPathB();
GeneralPath c = getPathC();
GeneralPath d = getPathD();
GeneralPath e = getPathE();
robocodeTextPath.append(R, false);
o.transform(AffineTransform.getTranslateInstance(42, 16));
robocodeTextPath.append(o, false);
b.transform(AffineTransform.getTranslateInstance(84, 0));
robocodeTextPath.append(b, false);
o.transform(AffineTransform.getTranslateInstance(127 - 42, 0));
robocodeTextPath.append(o, false);
c.transform(AffineTransform.getTranslateInstance(170, 16));
robocodeTextPath.append(c, false);
o.transform(AffineTransform.getTranslateInstance(204 - 127, 0));
robocodeTextPath.append(o, false);
d.transform(AffineTransform.getTranslateInstance(246, 0));
robocodeTextPath.append(d, false);
e.transform(AffineTransform.getTranslateInstance(290, 16));
robocodeTextPath.append(e, false);
}
return robocodeTextPath;
}
private GeneralPath getPathR() {
GeneralPath path = new GeneralPath(I_SHAPE);
GeneralPath bow = getPathPBow();
bow.transform(AffineTransform.getTranslateInstance(15, 0));
path.append(bow, false);
path.moveTo(21, 29);
path.lineTo(31, 46);
path.lineTo(44.5f, 46);
path.lineTo(33.5f, 27);
path.curveTo(33.5f, 27, 31, 29, 21, 29);
path.closePath();
return path;
}
private GeneralPath getPathO() {
GeneralPath path = getPathOBow();
path.transform(AffineTransform.getTranslateInstance(20, 0));
GeneralPath bow2 = getPathOBow();
bow2.transform(AffineTransform.getScaleInstance(-1, 1));
bow2.transform(AffineTransform.getTranslateInstance(18, 0));
path.append(bow2, false);
return path;
}
private GeneralPath getPathB() {
GeneralPath path = new GeneralPath(I_SHAPE);
GeneralPath bow = getPathPBow();
bow.transform(AffineTransform.getTranslateInstance(15, 20));
path.append(bow, false);
return path;
}
private GeneralPath getPathC() {
GeneralPath path = getPathCBow();
GeneralPath bow2 = getPathCBow();
bow2.transform(AffineTransform.getScaleInstance(1, -1));
bow2.transform(AffineTransform.getTranslateInstance(0, 31));
path.append(bow2, false);
return path;
}
private GeneralPath getPathD() {
GeneralPath path = new GeneralPath(I_SHAPE);
path.transform(AffineTransform.getTranslateInstance(27, 0));
GeneralPath bow = getPathPBow();
bow.transform(AffineTransform.getScaleInstance(-1, 1));
bow.transform(AffineTransform.getTranslateInstance(25, 20));
path.append(bow, false);
return path;
}
private GeneralPath getPathE() {
GeneralPath path = new GeneralPath();
path.moveTo(0, 14.5f);
path.lineTo(31, 14.5f);
path.curveTo(31, -4.5f, 0, -4.5f, 0, 14.5f);
path.closePath();
path.moveTo(12, 11);
path.lineTo(20, 11);
path.curveTo(20, 8, 12, 8, 12, 11);
path.closePath();
GeneralPath bow2 = getPathCBow();
bow2.transform(AffineTransform.getScaleInstance(1, -1));
bow2.transform(AffineTransform.getTranslateInstance(0, 31));
path.append(bow2, false);
return path;
}
private GeneralPath getPathPBow() {
GeneralPath path = new GeneralPath();
path.moveTo(0, 0);
path.lineTo(10, 0);
path.curveTo(30, 0, 30, 26, 10, 26);
path.lineTo(0, 26);
path.lineTo(0, 17);
path.lineTo(8, 17);
path.curveTo(14, 18, 14, 9, 8, 9);
path.lineTo(0, 9);
path.lineTo(0, 0);
path.closePath();
return path;
}
private GeneralPath getPathOBow() {
GeneralPath path = new GeneralPath();
path.moveTo(0, 0);
path.curveTo(23, 0, 23, 31, 0, 31);
path.lineTo(0, 20);
path.curveTo(8, 20, 8, 11, 0, 11);
path.lineTo(0, 0);
path.closePath();
return path;
}
private GeneralPath getPathCBow() {
GeneralPath path = new GeneralPath();
path.moveTo(31, 12);
path.curveTo(29, -3.5f, 2, -5.5f, 0, 14.5f);
path.lineTo(11, 14.5f);
path.curveTo(11, 8.5f, 18, 9, 18, 12);
path.lineTo(31, 12);
path.closePath();
return path;
}
}