2 * Sixth 3D engine. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
5 package eu.svjatoslav.sixth.e3d.renderer.raster.shapes;
7 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
8 import eu.svjatoslav.sixth.e3d.gui.RenderingContext;
9 import eu.svjatoslav.sixth.e3d.math.GeometryCoordinate;
10 import eu.svjatoslav.sixth.e3d.math.TransformsPipeline;
11 import eu.svjatoslav.sixth.e3d.renderer.raster.RenderAggregator;
13 import java.util.concurrent.atomic.AtomicInteger;
15 public abstract class AbstractCoordinateShape extends AbstractShape {
17 private static final AtomicInteger lastShapeId = new AtomicInteger();
18 public final int shapeId;
19 public final GeometryCoordinate[] coordinates;
20 public double onScreenZ;
22 public AbstractCoordinateShape(final int pointsCount) {
23 coordinates = new GeometryCoordinate[pointsCount];
24 for (int i = 0; i < pointsCount; i++)
25 coordinates[i] = new GeometryCoordinate();
27 shapeId = lastShapeId.getAndIncrement();
30 public AbstractCoordinateShape(final Point3D... vertexes) {
31 coordinates = new GeometryCoordinate[vertexes.length];
33 for (int i = 0; i < vertexes.length; i++)
34 coordinates[i] = new GeometryCoordinate(vertexes[i]);
36 shapeId = lastShapeId.getAndIncrement();
39 public double getZ() {
43 public abstract void paint(RenderingContext renderBuffer);
46 public void transform(final TransformsPipeline transforms,
47 final RenderAggregator aggregator,
48 final RenderingContext renderingContext) {
50 double accumulatedZ = 0;
53 for (final GeometryCoordinate geometryPoint : coordinates) {
54 geometryPoint.transform(transforms, renderingContext);
56 accumulatedZ += geometryPoint.transformedCoordinate.z;
58 if (!geometryPoint.transformedCoordinate.isVisible())
63 onScreenZ = accumulatedZ / coordinates.length;
64 aggregator.queueShapeForRendering(this);