Fixed git clone URL
[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.gui.RenderingContext;
8 import eu.svjatoslav.sixth.e3d.math.TransformsStack;
9 import eu.svjatoslav.sixth.e3d.math.Vertex;
10 import eu.svjatoslav.sixth.e3d.renderer.raster.RenderAggregator;
11
12 import java.util.concurrent.atomic.AtomicInteger;
13
14 public abstract class AbstractCoordinateShape extends AbstractShape {
15
16     private static final AtomicInteger lastShapeId = new AtomicInteger();
17     public final int shapeId;
18     public final Vertex[] coordinates;
19     public double onScreenZ;
20
21     public AbstractCoordinateShape(final int pointsCount) {
22         coordinates = new Vertex[pointsCount];
23         for (int i = 0; i < pointsCount; i++)
24             coordinates[i] = new Vertex();
25
26         shapeId = lastShapeId.getAndIncrement();
27     }
28
29     public AbstractCoordinateShape(final Vertex... vertexes) {
30         coordinates = vertexes;
31
32         shapeId = lastShapeId.getAndIncrement();
33     }
34
35     public double getZ() {
36         return onScreenZ;
37     }
38
39     public abstract void paint(RenderingContext renderBuffer);
40
41     @Override
42     public void transform(final TransformsStack transforms,
43                           final RenderAggregator aggregator,
44                           final RenderingContext renderingContext) {
45
46         double accumulatedZ = 0;
47         boolean paint = true;
48
49         for (final Vertex geometryPoint : coordinates) {
50             geometryPoint.calculateLocationRelativeToViewer(transforms, renderingContext);
51
52             accumulatedZ += geometryPoint.transformedCoordinate.z;
53
54             if (!geometryPoint.transformedCoordinate.isVisible())
55                 paint = false;
56         }
57
58         if (paint) {
59             onScreenZ = accumulatedZ / coordinates.length;
60             aggregator.queueShapeForRendering(this);
61         }
62     }
63
64 }