+++ /dev/null
-package eu.svjatoslav.sixth.e3d.examples.life;
-
-import eu.svjatoslav.sixth.e3d.geometry.Point3D;
-import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController;
-import eu.svjatoslav.sixth.e3d.renderer.raster.Color;
-import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.solidpolygon.SolidPolygon;
-import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.base.AbstractCompositeShape;
-
-/**
- * This class corresponds to a single cell within matrix.
- */
-class Cell extends AbstractCompositeShape implements
- MouseInteractionController {
-
- /**
- * cell visual size
- */
- static final int SIZE = 20;
- /**
- * Color of the active cell (R, G, B, A)
- */
- private static final Color ACTIVE_COLOR = new Color("A8FF");
- /**
- * Color of the active cell (R, G, B, A) while mouse is over it.
- */
- private static final Color ACTIVE_COLOR_MOUSE_OVER = new Color("F9FF");
- /**
- * Color of the inactive cell (R, G, B, A)
- */
- private static final Color INACTIVE_COLOR = new Color("55F8");
- /**
- * Color of the inactive cell (R, G, B, A) while mouse is over it.
- */
- private static final Color INACTIVE_COLOR_MOUSE_OVER = new Color("77F8");
- /**
- * A placeholder variable to help in next generation computation. Indicates
- * whether cell is going to survive within next generation.
- */
- public boolean survives;
- /**
- * Indicates whether cell is currently active
- */
- private boolean active;
- /**
- * Indicates whether mouse pointer is currently over this cell.
- */
- private boolean isMouseOver = false;
-
- public Cell(final Point3D center) {
- super(center);
-
- createCellShape();
-
- // enable receiving of mouse events
- setMouseInteractionController(this);
- }
-
- private void createCellShape() {
- final double halfSize = SIZE / 2f;
-
- // define 4 points corresponding to cell borders
- final Point3D p1 = new Point3D(-halfSize, 0, -halfSize);
-
- final Point3D p2 = new Point3D(+halfSize, 0, -halfSize);
-
- final Point3D p3 = new Point3D(+halfSize, 0, +halfSize);
-
- final Point3D p4 = new Point3D(-halfSize, 0, +halfSize);
-
- // connect 4 points with 2 polygons
- addShape(new SolidPolygon(p1, p2, p3, computeCellColor()));
- addShape(new SolidPolygon(p1, p4, p3, computeCellColor()));
- }
-
- /**
- * Compute cell color depending if cell is active and if mouse is over the
- * cell.
- */
- private Color computeCellColor() {
- if (active)
- if (isMouseOver)
- return ACTIVE_COLOR_MOUSE_OVER;
- else
- return ACTIVE_COLOR;
- else if (isMouseOver)
- return INACTIVE_COLOR_MOUSE_OVER;
- else
- return INACTIVE_COLOR;
- }
-
- public boolean isActive() {
- return active;
- }
-
- public void setActive(final boolean active) {
- this.active = active;
- updateColor();
- }
-
- @Override
- public boolean mouseClicked() {
- setActive(!isActive());
- return true;
- }
-
- @Override
- public boolean mouseEntered() {
- setMouseOver(true);
- return true;
- }
-
- @Override
- public boolean mouseExited() {
- setMouseOver(false);
- return true;
- }
-
- private void setMouseOver(final boolean isMouseOver) {
- this.isMouseOver = isMouseOver;
- updateColor();
- }
-
- /**
- * This method is called when cell status is changed to update its color
- * too.
- */
- private void updateColor() {
- setColor(computeCellColor());
- }
-
-}