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