2 * Sixth 3D engine. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
8 package eu.svjatoslav.sixth.e3d.renderer.raster.shapes;
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;
16 import java.util.concurrent.atomic.AtomicInteger;
18 public abstract class AbstractCoordinateShape extends AbstractShape {
20 private static final AtomicInteger lastShapeId = new AtomicInteger();
21 public final int shapeId;
22 public final GeometryCoordinate[] coordinates;
23 public double onScreenZ;
25 public AbstractCoordinateShape(final int pointsCount) {
26 coordinates = new GeometryCoordinate[pointsCount];
27 for (int i = 0; i < pointsCount; i++)
28 coordinates[i] = new GeometryCoordinate();
30 shapeId = lastShapeId.getAndIncrement();
33 public AbstractCoordinateShape(final Point3D... vertexes) {
34 coordinates = new GeometryCoordinate[vertexes.length];
36 for (int i = 0; i < vertexes.length; i++)
37 coordinates[i] = new GeometryCoordinate(vertexes[i]);
39 shapeId = lastShapeId.getAndIncrement();
42 public double getZ() {
46 public abstract void paint(RenderingContext renderBuffer);
49 public void transform(final TransformPipe transforms,
50 final RenderAggregator aggregator,
51 final RenderingContext renderingContext) {
53 double accumulatedZ = 0;
56 for (final GeometryCoordinate geometryPoint : coordinates) {
57 geometryPoint.transform(transforms, renderingContext);
59 accumulatedZ += geometryPoint.transformedCoordinate.z;
61 if (!geometryPoint.transformedCoordinate.isVisible())
66 onScreenZ = accumulatedZ / coordinates.length;
67 aggregator.queueShapeForRendering(this);