af3d3d39e714b6d37de26b9210b17cc83c6b7009
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / math / GeometryCoordinate.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.math;
6
7 import eu.svjatoslav.sixth.e3d.geometry.Point2D;
8 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
9 import eu.svjatoslav.sixth.e3d.gui.RenderingContext;
10
11 /**
12  * A point in 3D space with a transformed and on-screen coordinates.
13  */
14 public class GeometryCoordinate {
15
16     /**
17      * The original coordinate.
18      */
19     public Point3D coordinate;
20
21     /**
22      * The transformed coordinate.
23      */
24     public Point3D transformedCoordinate;
25
26     /**
27      * The on-screen coordinate.
28      */
29     public Point2D onScreenCoordinate;
30
31     private int lastTransformedFrame;
32
33     public GeometryCoordinate() {
34         coordinate = new Point3D();
35         transformedCoordinate = new Point3D();
36         onScreenCoordinate = new Point2D();
37     }
38
39     public GeometryCoordinate(final Point3D location) {
40         coordinate = location;
41         transformedCoordinate = new Point3D();
42         onScreenCoordinate = new Point2D();
43     }
44
45     /**
46      * Transforms the coordinate.
47      *
48      * @param transforms
49      *            The transform pipe.
50      * @param renderContext
51      *            The rendering context.
52      */
53     public void transform(final TransformsPipeline transforms,
54                           final RenderingContext renderContext) {
55
56         if (lastTransformedFrame == renderContext.frameNumber)
57             return;
58
59         lastTransformedFrame = renderContext.frameNumber;
60
61         transforms.transform(coordinate, transformedCoordinate);
62
63         onScreenCoordinate.x = ((transformedCoordinate.x / transformedCoordinate.z) * renderContext.zoom)
64                 + renderContext.xCenter;
65         onScreenCoordinate.y = ((transformedCoordinate.y / transformedCoordinate.z) * renderContext.zoom)
66                 + renderContext.yCenter;
67     }
68 }