Updated readability of the code.
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / renderer / raster / shapes / AbstractCoordinateShape.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko. 
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.sixth.e3d.renderer.raster.shapes;
6
7 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
8 import eu.svjatoslav.sixth.e3d.gui.RenderingContext;
9 import eu.svjatoslav.sixth.e3d.math.TransformsStack;
10 import eu.svjatoslav.sixth.e3d.math.Vertex;
11 import eu.svjatoslav.sixth.e3d.renderer.raster.RenderAggregator;
12
13 import java.util.concurrent.atomic.AtomicInteger;
14
15 public abstract class AbstractCoordinateShape extends AbstractShape {
16
17     private static final AtomicInteger lastShapeId = new AtomicInteger();
18     public final int shapeId;
19     public final Vertex[] coordinates;
20     public double onScreenZ;
21
22     public AbstractCoordinateShape(final int pointsCount) {
23         coordinates = new Vertex[pointsCount];
24         for (int i = 0; i < pointsCount; i++)
25             coordinates[i] = new Vertex();
26
27         shapeId = lastShapeId.getAndIncrement();
28     }
29
30     public AbstractCoordinateShape(final Point3D... vertexes) {
31         coordinates = new Vertex[vertexes.length];
32
33         for (int i = 0; i < vertexes.length; i++)
34             coordinates[i] = new Vertex(vertexes[i]);
35
36         shapeId = lastShapeId.getAndIncrement();
37     }
38
39     public double getZ() {
40         return onScreenZ;
41     }
42
43     public abstract void paint(RenderingContext renderBuffer);
44
45     @Override
46     public void transform(final TransformsStack transforms,
47                           final RenderAggregator aggregator,
48                           final RenderingContext renderingContext) {
49
50         double accumulatedZ = 0;
51         boolean paint = true;
52
53         for (final Vertex geometryPoint : coordinates) {
54             geometryPoint.calculateLocationRelativeToViewer(transforms, renderingContext);
55
56             accumulatedZ += geometryPoint.transformedCoordinate.z;
57
58             if (!geometryPoint.transformedCoordinate.isVisible())
59                 paint = false;
60         }
61
62         if (paint) {
63             onScreenZ = accumulatedZ / coordinates.length;
64             aggregator.queueShapeForRendering(this);
65         }
66     }
67
68 }