Updated copyright
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / renderer / raster / slicer / Slicer.java
1 /*
2  * Sixth 3D engine. Copyright ©2012-2019, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of version 3 of the GNU Lesser General Public License
6  * or later as published by the Free Software Foundation.
7  *
8  */
9
10 package eu.svjatoslav.sixth.e3d.renderer.raster.slicer;
11
12 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.texturedpolygon.TexturedPolygon;
13
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.List;
17
18 public class Slicer {
19
20     private final double maxDistance;
21     private final List<TexturedPolygon> result = new ArrayList<>();
22
23     public Slicer(final double maxDistance) {
24         this.maxDistance = maxDistance;
25     }
26
27     private void considerSlicing(final PolygonCoordinate c1,
28                                  final PolygonCoordinate c2, final PolygonCoordinate c3,
29                                  final TexturedPolygon originalPolygon) {
30
31         final BorderLine lines[] = new BorderLine[]{
32                 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
33                 new BorderLine(c3, c1, 3)};
34
35         Arrays.sort(lines, lines[0]);
36
37         final BorderLine longestLine = lines[2];
38
39         if (longestLine.getLength() < maxDistance) {
40             final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
41                     originalPolygon.texture);
42
43             polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
44
45             getResult().add(polygon);
46             return;
47         }
48
49         final PolygonCoordinate middle = longestLine.getMiddlePoint();
50
51         switch (longestLine.count) {
52             case 1:
53                 considerSlicing(c1, middle, c3, originalPolygon);
54                 considerSlicing(middle, c2, c3, originalPolygon);
55                 return;
56             case 2:
57                 considerSlicing(c1, c2, middle, originalPolygon);
58                 considerSlicing(middle, c3, c1, originalPolygon);
59                 return;
60             case 3:
61                 considerSlicing(c1, c2, middle, originalPolygon);
62                 considerSlicing(middle, c2, c3, originalPolygon);
63         }
64
65     }
66
67     public List<TexturedPolygon> getResult() {
68         return result;
69     }
70
71     public void slice(final TexturedPolygon originalPolygon) {
72
73         final PolygonCoordinate pc1 = new PolygonCoordinate(
74                 originalPolygon.coordinates[0].coordinate,
75                 originalPolygon.texturePoint1);
76
77         final PolygonCoordinate pc2 = new PolygonCoordinate(
78                 originalPolygon.coordinates[1].coordinate,
79                 originalPolygon.texturePoint2);
80
81         final PolygonCoordinate pc3 = new PolygonCoordinate(
82                 originalPolygon.coordinates[2].coordinate,
83                 originalPolygon.texturePoint3);
84
85         considerSlicing(pc1, pc2, pc3, originalPolygon);
86     }
87
88 }