Changed license to Creative Commons Zero (CC0).
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / renderer / raster / ShapeCollection.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;
9
10 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
11 import eu.svjatoslav.sixth.e3d.gui.Avatar;
12 import eu.svjatoslav.sixth.e3d.gui.RenderingContext;
13 import eu.svjatoslav.sixth.e3d.gui.ViewPanel;
14 import eu.svjatoslav.sixth.e3d.math.Transform;
15 import eu.svjatoslav.sixth.e3d.math.TransformPipe;
16 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.AbstractShape;
17
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.List;
21
22 public class ShapeCollection {
23
24     private final RenderAggregator aggregator = new RenderAggregator();
25     private final TransformPipe transformPipe = new TransformPipe();
26     private final List<AbstractShape> shapes = new ArrayList<>();
27
28     public synchronized void addShape(final AbstractShape shape) {
29         shapes.add(shape);
30     }
31
32     public Collection<AbstractShape> getShapes() {
33         return shapes;
34     }
35
36     public void clear() {
37         shapes.clear();
38     }
39
40     public synchronized void paint(final ViewPanel viewPanel,
41                                    final RenderingContext renderingContext) {
42
43         renderingContext.frameNumber++;
44
45         aggregator.reset();
46         transformPipe.clear();
47
48         // translate scene according to camera current location
49         final Avatar avatar = viewPanel.getAvatar();
50
51         // rotate scene according to avatar looking direction
52         transformPipe.addTransform(new Transform(new Point3D(), avatar
53                 .getAngleXZ(), avatar.getAngleYZ()));
54
55         // translate scene according to avatar location in the world
56         final Point3D translation = new Point3D(-avatar.getLocation().x,
57                 -avatar.getLocation().y, -avatar.getLocation().z);
58
59         transformPipe.addTransform(new Transform(translation, 0, 0));
60
61         for (final AbstractShape shape : shapes)
62             shape.transform(transformPipe, aggregator, renderingContext);
63
64         aggregator.paint(renderingContext);
65     }
66 }