Project

General

Profile

Download (4.93 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / mesh / MeshTriangles.java @ b17aa4aa

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.library.mesh;
21

    
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23
/**
24
 * Create a Mesh which approximates an equilateral triangle.
25
 */
26
public class MeshTriangles extends MeshBase
27
  {
28
  private static final float HEIGHT = (float)Math.sqrt(3)*0.5f;
29
  private int numVertices;
30
  private int remainingVert;
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
  private int addVertex(int vertex, float x, float y, float[] attribs)
35
     {
36
     remainingVert--;
37

    
38
     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x-0.5f;
39
     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = y-HEIGHT/3;
40
     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.0f;
41

    
42
     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = 0.0f;
43
     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 0.0f;
44
     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = 1.0f;
45

    
46
     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = (x-0.5f);
47
     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = (y-HEIGHT/3);
48
     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.01f   ;  // Inflated surface needs to be slightly in front
49

    
50
     attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = x;
51
     attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = y;
52

    
53
     return vertex+1;
54
     }
55

    
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57

    
58
  private void computeNumberOfVertices(int level)
59
     {
60
     numVertices = level*(level+2);
61
     remainingVert = numVertices;
62
     }
63

    
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65

    
66
  private int buildRow(int vertex,float sx, float sy, int length, float dx, float dy, float[] attribs)
67
    {
68
    for(int i=0; i<length; i++)
69
      {
70
      vertex = addVertex(vertex, sx   , sy   , attribs);
71
      vertex = addVertex(vertex, sx+dx, sy+dy, attribs);
72
      sx += 2*dx;
73
      }
74

    
75
    vertex = addVertex(vertex, sx, sy, attribs);
76

    
77
    return vertex;
78
    }
79

    
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81

    
82
  private void buildGrid(float[] attribs, int level)
83
     {
84
     float sx = 0.0f;
85
     float sy = 0.0f;
86
     float dx = 0.5f/level;
87
     float dy = HEIGHT/level;
88
     int vertex = 0;
89

    
90
     for(int row=level; row>=1; row--)
91
       {
92
       vertex = buildRow(vertex,sx,sy,row,dx,dy,attribs);
93

    
94
       sx += 2*dx*(row-0.5f);
95
       sy += dy;
96
       dx *= -1;
97
       }
98
     }
99

    
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101
// PUBLIC API
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103
  /**
104
   * Creates the underlying grid of vertices with the usual attribs which approximates an equilateral
105
   * triangle.
106
   *
107
   * @param level Specifies the level of slicing. Valid values: level &ge; 1
108
   */
109
  public MeshTriangles(int level)
110
     {
111
     super(1,HEIGHT,0);
112

    
113
     computeNumberOfVertices(level);
114

    
115
     float[] attribs= new float[VERT_ATTRIBS*numVertices];
116
     buildGrid(attribs,level);
117

    
118
     if( remainingVert!=0 )
119
       android.util.Log.d("MeshTriangles", "remainingVert " +remainingVert );
120

    
121
     setAttribs(attribs);
122
     }
123
  }
(6-6/6)