Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / helpers / FactoryBandaged3x3Cubit.java @ a7c10d03

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube 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
// Magic Cube 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 Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.objectlib.helpers;
21

    
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23

    
24
import java.util.ArrayList;
25

    
26
public class FactoryBandaged3x3Cubit
27
  {
28
  private static final int WALL_MARKED=0;
29
  private static final int WALL_EMPTY =-1;
30

    
31
  private static final int AXIS_XP = 0;
32
  private static final int AXIS_XM = 1;
33
  private static final int AXIS_YP = 2;
34
  private static final int AXIS_YM = 3;
35
  private static final int AXIS_ZP = 4;
36
  private static final int AXIS_ZM = 5;
37

    
38
  private static FactoryBandaged3x3Cubit mThis;
39
  private ArrayList<float[]> mVertexArray;
40
  private float[][][] mVertices;
41
  private int[][][] mIndices;
42
  private final int[] mWall;
43
  private final boolean[][][] mTmp;
44

    
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

    
47
  private FactoryBandaged3x3Cubit()
48
    {
49
    mWall= new int[9];
50
    mTmp = new boolean[3][3][3];
51
    }
52

    
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54

    
55
  private float[][] getVertices(ArrayList<float[]> list)
56
    {
57
    int length = list.size();
58
    float[][] vertices = new float[length][];
59
    for( int i=0; i<length; i++ ) vertices[i] = list.get(i);
60
    return vertices;
61
    }
62

    
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

    
65
  private int[][] getIndices(ArrayList<float[]> list)
66
    {
67
    int indicesSoFar=0;
68
    int length = list.size();
69
    int[][] indices = new int[length][];
70

    
71
    for( int i=0; i<length; i++ )
72
      {
73
      float[] f = list.get(i);
74
      int len = f.length;
75
      int[] ind = new int[len];
76
      for(int j=0; j<len; j++) ind[j] = (indicesSoFar++);
77
      indices[i] = ind;
78
      }
79

    
80
    return indices;
81
    }
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

    
85
  private boolean cubitExists(float[] pos, float x, float y, float z)
86
    {
87
    int len = pos.length/3;
88

    
89
    for(int i=0; i<len; i++)
90
      if( pos[3*i]==x && pos[3*i+1]==y && pos[3*i+2]==z ) return true;
91

    
92
    return false;
93
    }
94

    
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96

    
97
  private void createRight0(ArrayList<float[]> list)
98
    {
99
    mWall[0] = (mTmp[0][2][2] && !mTmp[1][2][2]) ? WALL_MARKED:WALL_EMPTY;
100
    mWall[1] = (mTmp[0][2][1] && !mTmp[1][2][1]) ? WALL_MARKED:WALL_EMPTY;
101
    mWall[2] = (mTmp[0][2][0] && !mTmp[1][2][0]) ? WALL_MARKED:WALL_EMPTY;
102
    mWall[3] = (mTmp[0][1][2] && !mTmp[1][1][2]) ? WALL_MARKED:WALL_EMPTY;
103
    mWall[4] = (mTmp[0][1][1] && !mTmp[1][1][1]) ? WALL_MARKED:WALL_EMPTY;
104
    mWall[5] = (mTmp[0][1][0] && !mTmp[1][1][0]) ? WALL_MARKED:WALL_EMPTY;
105
    mWall[6] = (mTmp[0][0][2] && !mTmp[1][0][2]) ? WALL_MARKED:WALL_EMPTY;
106
    mWall[7] = (mTmp[0][0][1] && !mTmp[1][0][1]) ? WALL_MARKED:WALL_EMPTY;
107
    mWall[8] = (mTmp[0][0][0] && !mTmp[1][0][0]) ? WALL_MARKED:WALL_EMPTY;
108

    
109
    createVertices(list,mWall,AXIS_XP,0);
110
    }
111

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113

    
114
  private void createRight1(ArrayList<float[]> list)
115
    {
116
    mWall[0] = (mTmp[1][2][2] && !mTmp[2][2][2]) ? WALL_MARKED:WALL_EMPTY;
117
    mWall[1] = (mTmp[1][2][1] && !mTmp[2][2][1]) ? WALL_MARKED:WALL_EMPTY;
118
    mWall[2] = (mTmp[1][2][0] && !mTmp[2][2][0]) ? WALL_MARKED:WALL_EMPTY;
119
    mWall[3] = (mTmp[1][1][2] && !mTmp[2][1][2]) ? WALL_MARKED:WALL_EMPTY;
120
    mWall[4] = (mTmp[1][1][1] && !mTmp[2][1][1]) ? WALL_MARKED:WALL_EMPTY;
121
    mWall[5] = (mTmp[1][1][0] && !mTmp[2][1][0]) ? WALL_MARKED:WALL_EMPTY;
122
    mWall[6] = (mTmp[1][0][2] && !mTmp[2][0][2]) ? WALL_MARKED:WALL_EMPTY;
123
    mWall[7] = (mTmp[1][0][1] && !mTmp[2][0][1]) ? WALL_MARKED:WALL_EMPTY;
124
    mWall[8] = (mTmp[1][0][0] && !mTmp[2][0][0]) ? WALL_MARKED:WALL_EMPTY;
125

    
126
    createVertices(list,mWall,AXIS_XP,1);
127
    }
128

    
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

    
131
  private void createRight2(ArrayList<float[]> list)
132
    {
133
    mWall[0] = mTmp[2][2][2] ? WALL_MARKED:WALL_EMPTY;
134
    mWall[1] = mTmp[2][2][1] ? WALL_MARKED:WALL_EMPTY;
135
    mWall[2] = mTmp[2][2][0] ? WALL_MARKED:WALL_EMPTY;
136
    mWall[3] = mTmp[2][1][2] ? WALL_MARKED:WALL_EMPTY;
137
    mWall[4] = mTmp[2][1][1] ? WALL_MARKED:WALL_EMPTY;
138
    mWall[5] = mTmp[2][1][0] ? WALL_MARKED:WALL_EMPTY;
139
    mWall[6] = mTmp[2][0][2] ? WALL_MARKED:WALL_EMPTY;
140
    mWall[7] = mTmp[2][0][1] ? WALL_MARKED:WALL_EMPTY;
141
    mWall[8] = mTmp[2][0][0] ? WALL_MARKED:WALL_EMPTY;
142

    
143
    createVertices(list,mWall,AXIS_XP,2);
144
    }
145

    
146
///////////////////////////////////////////////////////////////////////////////////////////////////
147

    
148
  private void createLeft0(ArrayList<float[]> list)
149
    {
150
    mWall[0] = mTmp[0][2][0] ? WALL_MARKED:WALL_EMPTY;
151
    mWall[1] = mTmp[0][2][1] ? WALL_MARKED:WALL_EMPTY;
152
    mWall[2] = mTmp[0][2][2] ? WALL_MARKED:WALL_EMPTY;
153
    mWall[3] = mTmp[0][1][0] ? WALL_MARKED:WALL_EMPTY;
154
    mWall[4] = mTmp[0][1][1] ? WALL_MARKED:WALL_EMPTY;
155
    mWall[5] = mTmp[0][1][2] ? WALL_MARKED:WALL_EMPTY;
156
    mWall[6] = mTmp[0][0][0] ? WALL_MARKED:WALL_EMPTY;
157
    mWall[7] = mTmp[0][0][1] ? WALL_MARKED:WALL_EMPTY;
158
    mWall[8] = mTmp[0][0][2] ? WALL_MARKED:WALL_EMPTY;
159

    
160
    createVertices(list,mWall,AXIS_XM,0);
161
    }
162

    
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164

    
165
  private void createLeft1(ArrayList<float[]> list)
166
    {
167
    mWall[0] = (!mTmp[0][2][0] && mTmp[1][2][0]) ? WALL_MARKED:WALL_EMPTY;
168
    mWall[1] = (!mTmp[0][2][1] && mTmp[1][2][1]) ? WALL_MARKED:WALL_EMPTY;
169
    mWall[2] = (!mTmp[0][2][2] && mTmp[1][2][2]) ? WALL_MARKED:WALL_EMPTY;
170
    mWall[3] = (!mTmp[0][1][0] && mTmp[1][1][0]) ? WALL_MARKED:WALL_EMPTY;
171
    mWall[4] = (!mTmp[0][1][1] && mTmp[1][1][1]) ? WALL_MARKED:WALL_EMPTY;
172
    mWall[5] = (!mTmp[0][1][2] && mTmp[1][1][2]) ? WALL_MARKED:WALL_EMPTY;
173
    mWall[6] = (!mTmp[0][0][0] && mTmp[1][0][0]) ? WALL_MARKED:WALL_EMPTY;
174
    mWall[7] = (!mTmp[0][0][1] && mTmp[1][0][1]) ? WALL_MARKED:WALL_EMPTY;
175
    mWall[8] = (!mTmp[0][0][2] && mTmp[1][0][2]) ? WALL_MARKED:WALL_EMPTY;
176

    
177
    createVertices(list,mWall,AXIS_XM,1);
178
    }
179

    
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

    
182
  private void createLeft2(ArrayList<float[]> list)
183
    {
184
    mWall[0] = (!mTmp[1][2][0] && mTmp[2][2][0]) ? WALL_MARKED:WALL_EMPTY;
185
    mWall[1] = (!mTmp[1][2][1] && mTmp[2][2][1]) ? WALL_MARKED:WALL_EMPTY;
186
    mWall[2] = (!mTmp[1][2][2] && mTmp[2][2][2]) ? WALL_MARKED:WALL_EMPTY;
187
    mWall[3] = (!mTmp[1][1][0] && mTmp[2][1][0]) ? WALL_MARKED:WALL_EMPTY;
188
    mWall[4] = (!mTmp[1][1][1] && mTmp[2][1][1]) ? WALL_MARKED:WALL_EMPTY;
189
    mWall[5] = (!mTmp[1][1][2] && mTmp[2][1][2]) ? WALL_MARKED:WALL_EMPTY;
190
    mWall[6] = (!mTmp[1][0][0] && mTmp[2][0][0]) ? WALL_MARKED:WALL_EMPTY;
191
    mWall[7] = (!mTmp[1][0][1] && mTmp[2][0][1]) ? WALL_MARKED:WALL_EMPTY;
192
    mWall[8] = (!mTmp[1][0][2] && mTmp[2][0][2]) ? WALL_MARKED:WALL_EMPTY;
193

    
194
    createVertices(list,mWall,AXIS_XM,2);
195
    }
196

    
197
///////////////////////////////////////////////////////////////////////////////////////////////////
198

    
199
  private void createTop0(ArrayList<float[]> list)
200
    {
201
    mWall[0] = (mTmp[0][0][0] && !mTmp[0][1][0]) ? WALL_MARKED:WALL_EMPTY;
202
    mWall[1] = (mTmp[1][0][0] && !mTmp[1][1][0]) ? WALL_MARKED:WALL_EMPTY;
203
    mWall[2] = (mTmp[2][0][0] && !mTmp[2][1][0]) ? WALL_MARKED:WALL_EMPTY;
204
    mWall[3] = (mTmp[0][0][1] && !mTmp[0][1][1]) ? WALL_MARKED:WALL_EMPTY;
205
    mWall[4] = (mTmp[1][0][1] && !mTmp[1][1][1]) ? WALL_MARKED:WALL_EMPTY;
206
    mWall[5] = (mTmp[2][0][1] && !mTmp[2][1][1]) ? WALL_MARKED:WALL_EMPTY;
207
    mWall[6] = (mTmp[0][0][2] && !mTmp[0][1][2]) ? WALL_MARKED:WALL_EMPTY;
208
    mWall[7] = (mTmp[1][0][2] && !mTmp[1][1][2]) ? WALL_MARKED:WALL_EMPTY;
209
    mWall[8] = (mTmp[2][0][2] && !mTmp[2][1][2]) ? WALL_MARKED:WALL_EMPTY;
210

    
211
    createVertices(list,mWall,AXIS_YP,0);
212
    }
213

    
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

    
216
  private void createTop1(ArrayList<float[]> list)
217
    {
218
    mWall[0] = (mTmp[0][1][0] && !mTmp[0][2][0]) ? WALL_MARKED:WALL_EMPTY;
219
    mWall[1] = (mTmp[1][1][0] && !mTmp[1][2][0]) ? WALL_MARKED:WALL_EMPTY;
220
    mWall[2] = (mTmp[2][1][0] && !mTmp[2][2][0]) ? WALL_MARKED:WALL_EMPTY;
221
    mWall[3] = (mTmp[0][1][1] && !mTmp[0][2][1]) ? WALL_MARKED:WALL_EMPTY;
222
    mWall[4] = (mTmp[1][1][1] && !mTmp[1][2][1]) ? WALL_MARKED:WALL_EMPTY;
223
    mWall[5] = (mTmp[2][1][1] && !mTmp[2][2][1]) ? WALL_MARKED:WALL_EMPTY;
224
    mWall[6] = (mTmp[0][1][2] && !mTmp[0][2][2]) ? WALL_MARKED:WALL_EMPTY;
225
    mWall[7] = (mTmp[1][1][2] && !mTmp[1][2][2]) ? WALL_MARKED:WALL_EMPTY;
226
    mWall[8] = (mTmp[2][1][2] && !mTmp[2][2][2]) ? WALL_MARKED:WALL_EMPTY;
227

    
228
    createVertices(list,mWall,AXIS_YP,1);
229
    }
230

    
231
///////////////////////////////////////////////////////////////////////////////////////////////////
232

    
233
  private void createTop2(ArrayList<float[]> list)
234
    {
235
    mWall[0] = mTmp[0][2][0] ? WALL_MARKED:WALL_EMPTY;
236
    mWall[1] = mTmp[1][2][0] ? WALL_MARKED:WALL_EMPTY;
237
    mWall[2] = mTmp[2][2][0] ? WALL_MARKED:WALL_EMPTY;
238
    mWall[3] = mTmp[0][2][1] ? WALL_MARKED:WALL_EMPTY;
239
    mWall[4] = mTmp[1][2][1] ? WALL_MARKED:WALL_EMPTY;
240
    mWall[5] = mTmp[2][2][1] ? WALL_MARKED:WALL_EMPTY;
241
    mWall[6] = mTmp[0][2][2] ? WALL_MARKED:WALL_EMPTY;
242
    mWall[7] = mTmp[1][2][2] ? WALL_MARKED:WALL_EMPTY;
243
    mWall[8] = mTmp[2][2][2] ? WALL_MARKED:WALL_EMPTY;
244

    
245
    createVertices(list,mWall,AXIS_YP,2);
246
    }
247

    
248
///////////////////////////////////////////////////////////////////////////////////////////////////
249

    
250
  private void createBottom0(ArrayList<float[]> list)
251
    {
252
    mWall[0] = mTmp[0][0][2] ? WALL_MARKED:WALL_EMPTY;
253
    mWall[1] = mTmp[1][0][2] ? WALL_MARKED:WALL_EMPTY;
254
    mWall[2] = mTmp[2][0][2] ? WALL_MARKED:WALL_EMPTY;
255
    mWall[3] = mTmp[0][0][1] ? WALL_MARKED:WALL_EMPTY;
256
    mWall[4] = mTmp[1][0][1] ? WALL_MARKED:WALL_EMPTY;
257
    mWall[5] = mTmp[2][0][1] ? WALL_MARKED:WALL_EMPTY;
258
    mWall[6] = mTmp[0][0][0] ? WALL_MARKED:WALL_EMPTY;
259
    mWall[7] = mTmp[1][0][0] ? WALL_MARKED:WALL_EMPTY;
260
    mWall[8] = mTmp[2][0][0] ? WALL_MARKED:WALL_EMPTY;
261

    
262
    createVertices(list,mWall,AXIS_YM,0);
263
    }
264

    
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266

    
267
  private void createBottom1(ArrayList<float[]> list)
268
    {
269
    mWall[0] = (mTmp[0][1][2] && !mTmp[0][0][2]) ? WALL_MARKED:WALL_EMPTY;
270
    mWall[1] = (mTmp[1][1][2] && !mTmp[1][0][2]) ? WALL_MARKED:WALL_EMPTY;
271
    mWall[2] = (mTmp[2][1][2] && !mTmp[2][0][2]) ? WALL_MARKED:WALL_EMPTY;
272
    mWall[3] = (mTmp[0][1][1] && !mTmp[0][0][1]) ? WALL_MARKED:WALL_EMPTY;
273
    mWall[4] = (mTmp[1][1][1] && !mTmp[1][0][1]) ? WALL_MARKED:WALL_EMPTY;
274
    mWall[5] = (mTmp[2][1][1] && !mTmp[2][0][1]) ? WALL_MARKED:WALL_EMPTY;
275
    mWall[6] = (mTmp[0][1][0] && !mTmp[0][0][0]) ? WALL_MARKED:WALL_EMPTY;
276
    mWall[7] = (mTmp[1][1][0] && !mTmp[1][0][0]) ? WALL_MARKED:WALL_EMPTY;
277
    mWall[8] = (mTmp[2][1][0] && !mTmp[2][0][0]) ? WALL_MARKED:WALL_EMPTY;
278

    
279
    createVertices(list,mWall,AXIS_YM,1);
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  private void createBottom2(ArrayList<float[]> list)
285
    {
286
    mWall[0] = (mTmp[0][2][2] && !mTmp[0][1][2]) ? WALL_MARKED:WALL_EMPTY;
287
    mWall[1] = (mTmp[1][2][2] && !mTmp[1][1][2]) ? WALL_MARKED:WALL_EMPTY;
288
    mWall[2] = (mTmp[2][2][2] && !mTmp[2][1][2]) ? WALL_MARKED:WALL_EMPTY;
289
    mWall[3] = (mTmp[0][2][1] && !mTmp[0][1][1]) ? WALL_MARKED:WALL_EMPTY;
290
    mWall[4] = (mTmp[1][2][1] && !mTmp[1][1][1]) ? WALL_MARKED:WALL_EMPTY;
291
    mWall[5] = (mTmp[2][2][1] && !mTmp[2][1][1]) ? WALL_MARKED:WALL_EMPTY;
292
    mWall[6] = (mTmp[0][2][0] && !mTmp[0][1][0]) ? WALL_MARKED:WALL_EMPTY;
293
    mWall[7] = (mTmp[1][2][0] && !mTmp[1][1][0]) ? WALL_MARKED:WALL_EMPTY;
294
    mWall[8] = (mTmp[2][2][0] && !mTmp[2][1][0]) ? WALL_MARKED:WALL_EMPTY;
295

    
296
    createVertices(list,mWall,AXIS_YM,2);
297
    }
298

    
299
///////////////////////////////////////////////////////////////////////////////////////////////////
300

    
301
  private void createFront0(ArrayList<float[]> list)
302
    {
303
    mWall[0] = (mTmp[0][2][0] && !mTmp[0][2][1]) ? WALL_MARKED:WALL_EMPTY;
304
    mWall[1] = (mTmp[1][2][0] && !mTmp[1][2][1]) ? WALL_MARKED:WALL_EMPTY;
305
    mWall[2] = (mTmp[2][2][0] && !mTmp[2][2][1]) ? WALL_MARKED:WALL_EMPTY;
306
    mWall[3] = (mTmp[0][1][0] && !mTmp[0][1][1]) ? WALL_MARKED:WALL_EMPTY;
307
    mWall[4] = (mTmp[1][1][0] && !mTmp[1][1][1]) ? WALL_MARKED:WALL_EMPTY;
308
    mWall[5] = (mTmp[2][1][0] && !mTmp[2][1][1]) ? WALL_MARKED:WALL_EMPTY;
309
    mWall[6] = (mTmp[0][0][0] && !mTmp[0][0][1]) ? WALL_MARKED:WALL_EMPTY;
310
    mWall[7] = (mTmp[1][0][0] && !mTmp[1][0][1]) ? WALL_MARKED:WALL_EMPTY;
311
    mWall[8] = (mTmp[2][0][0] && !mTmp[2][0][1]) ? WALL_MARKED:WALL_EMPTY;
312

    
313
    createVertices(list,mWall,AXIS_ZP,0);
314
    }
315

    
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317

    
318
  private void createFront1(ArrayList<float[]> list)
319
    {
320
    mWall[0] = (mTmp[0][2][1] && !mTmp[0][2][2]) ? WALL_MARKED:WALL_EMPTY;
321
    mWall[1] = (mTmp[1][2][1] && !mTmp[1][2][2]) ? WALL_MARKED:WALL_EMPTY;
322
    mWall[2] = (mTmp[2][2][1] && !mTmp[2][2][2]) ? WALL_MARKED:WALL_EMPTY;
323
    mWall[3] = (mTmp[0][1][1] && !mTmp[0][1][2]) ? WALL_MARKED:WALL_EMPTY;
324
    mWall[4] = (mTmp[1][1][1] && !mTmp[1][1][2]) ? WALL_MARKED:WALL_EMPTY;
325
    mWall[5] = (mTmp[2][1][1] && !mTmp[2][1][2]) ? WALL_MARKED:WALL_EMPTY;
326
    mWall[6] = (mTmp[0][0][1] && !mTmp[0][0][2]) ? WALL_MARKED:WALL_EMPTY;
327
    mWall[7] = (mTmp[1][0][1] && !mTmp[1][0][2]) ? WALL_MARKED:WALL_EMPTY;
328
    mWall[8] = (mTmp[2][0][1] && !mTmp[2][0][2]) ? WALL_MARKED:WALL_EMPTY;
329

    
330
    createVertices(list,mWall,AXIS_ZP,1);
331
    }
332

    
333
///////////////////////////////////////////////////////////////////////////////////////////////////
334

    
335
  private void createFront2(ArrayList<float[]> list)
336
    {
337
    mWall[0] = mTmp[0][2][2] ? WALL_MARKED:WALL_EMPTY;
338
    mWall[1] = mTmp[1][2][2] ? WALL_MARKED:WALL_EMPTY;
339
    mWall[2] = mTmp[2][2][2] ? WALL_MARKED:WALL_EMPTY;
340
    mWall[3] = mTmp[0][1][2] ? WALL_MARKED:WALL_EMPTY;
341
    mWall[4] = mTmp[1][1][2] ? WALL_MARKED:WALL_EMPTY;
342
    mWall[5] = mTmp[2][1][2] ? WALL_MARKED:WALL_EMPTY;
343
    mWall[6] = mTmp[0][0][2] ? WALL_MARKED:WALL_EMPTY;
344
    mWall[7] = mTmp[1][0][2] ? WALL_MARKED:WALL_EMPTY;
345
    mWall[8] = mTmp[2][0][2] ? WALL_MARKED:WALL_EMPTY;
346

    
347
    createVertices(list,mWall,AXIS_ZP,2);
348
    }
349

    
350
///////////////////////////////////////////////////////////////////////////////////////////////////
351

    
352
  private void createBack0(ArrayList<float[]> list)
353
    {
354
    mWall[0] = mTmp[2][2][0] ? WALL_MARKED:WALL_EMPTY;
355
    mWall[1] = mTmp[1][2][0] ? WALL_MARKED:WALL_EMPTY;
356
    mWall[2] = mTmp[0][2][0] ? WALL_MARKED:WALL_EMPTY;
357
    mWall[3] = mTmp[2][1][0] ? WALL_MARKED:WALL_EMPTY;
358
    mWall[4] = mTmp[1][1][0] ? WALL_MARKED:WALL_EMPTY;
359
    mWall[5] = mTmp[0][1][0] ? WALL_MARKED:WALL_EMPTY;
360
    mWall[6] = mTmp[2][0][0] ? WALL_MARKED:WALL_EMPTY;
361
    mWall[7] = mTmp[1][0][0] ? WALL_MARKED:WALL_EMPTY;
362
    mWall[8] = mTmp[0][0][0] ? WALL_MARKED:WALL_EMPTY;
363

    
364
    createVertices(list,mWall,AXIS_ZM,0);
365
    }
366

    
367
///////////////////////////////////////////////////////////////////////////////////////////////////
368

    
369
  private void createBack1(ArrayList<float[]> list)
370
    {
371
    mWall[0] = (mTmp[2][2][1] && !mTmp[2][2][0]) ? WALL_MARKED:WALL_EMPTY;
372
    mWall[1] = (mTmp[1][2][1] && !mTmp[1][2][0]) ? WALL_MARKED:WALL_EMPTY;
373
    mWall[2] = (mTmp[0][2][1] && !mTmp[0][2][0]) ? WALL_MARKED:WALL_EMPTY;
374
    mWall[3] = (mTmp[2][1][1] && !mTmp[2][1][0]) ? WALL_MARKED:WALL_EMPTY;
375
    mWall[4] = (mTmp[1][1][1] && !mTmp[1][1][0]) ? WALL_MARKED:WALL_EMPTY;
376
    mWall[5] = (mTmp[0][1][1] && !mTmp[0][1][0]) ? WALL_MARKED:WALL_EMPTY;
377
    mWall[6] = (mTmp[2][0][1] && !mTmp[2][0][0]) ? WALL_MARKED:WALL_EMPTY;
378
    mWall[7] = (mTmp[1][0][1] && !mTmp[1][0][0]) ? WALL_MARKED:WALL_EMPTY;
379
    mWall[8] = (mTmp[0][0][1] && !mTmp[0][0][0]) ? WALL_MARKED:WALL_EMPTY;
380

    
381
    createVertices(list,mWall,AXIS_ZM,1);
382
    }
383

    
384
///////////////////////////////////////////////////////////////////////////////////////////////////
385

    
386
  private void createBack2(ArrayList<float[]> list)
387
    {
388
    mWall[0] = (mTmp[2][2][2] && !mTmp[2][2][1]) ? WALL_MARKED:WALL_EMPTY;
389
    mWall[1] = (mTmp[1][2][2] && !mTmp[1][2][1]) ? WALL_MARKED:WALL_EMPTY;
390
    mWall[2] = (mTmp[0][2][2] && !mTmp[0][2][1]) ? WALL_MARKED:WALL_EMPTY;
391
    mWall[3] = (mTmp[2][1][2] && !mTmp[2][1][1]) ? WALL_MARKED:WALL_EMPTY;
392
    mWall[4] = (mTmp[1][1][2] && !mTmp[1][1][1]) ? WALL_MARKED:WALL_EMPTY;
393
    mWall[5] = (mTmp[0][1][2] && !mTmp[0][1][1]) ? WALL_MARKED:WALL_EMPTY;
394
    mWall[6] = (mTmp[2][0][2] && !mTmp[2][0][1]) ? WALL_MARKED:WALL_EMPTY;
395
    mWall[7] = (mTmp[1][0][2] && !mTmp[1][0][1]) ? WALL_MARKED:WALL_EMPTY;
396
    mWall[8] = (mTmp[0][0][2] && !mTmp[0][0][1]) ? WALL_MARKED:WALL_EMPTY;
397

    
398
    createVertices(list,mWall,AXIS_ZM,2);
399
    }
400

    
401
///////////////////////////////////////////////////////////////////////////////////////////////////
402

    
403
  private void markNeighbours(int[] wall, int index, int section)
404
    {
405
    wall[index] = section;
406

    
407
    switch(index)
408
      {
409
      case 0: if( wall[1]==WALL_MARKED ) markNeighbours(wall,1,section);
410
              if( wall[3]==WALL_MARKED ) markNeighbours(wall,3,section);
411
              break;
412
      case 1: if( wall[0]==WALL_MARKED ) markNeighbours(wall,0,section);
413
              if( wall[2]==WALL_MARKED ) markNeighbours(wall,2,section);
414
              if( wall[4]==WALL_MARKED ) markNeighbours(wall,4,section);
415
              break;
416
      case 2: if( wall[1]==WALL_MARKED ) markNeighbours(wall,1,section);
417
              if( wall[5]==WALL_MARKED ) markNeighbours(wall,5,section);
418
              break;
419
      case 3: if( wall[0]==WALL_MARKED ) markNeighbours(wall,0,section);
420
              if( wall[4]==WALL_MARKED ) markNeighbours(wall,4,section);
421
              if( wall[6]==WALL_MARKED ) markNeighbours(wall,6,section);
422
              break;
423
      case 4: if( wall[1]==WALL_MARKED ) markNeighbours(wall,1,section);
424
              if( wall[3]==WALL_MARKED ) markNeighbours(wall,3,section);
425
              if( wall[5]==WALL_MARKED ) markNeighbours(wall,5,section);
426
              if( wall[7]==WALL_MARKED ) markNeighbours(wall,7,section);
427
              break;
428
      case 5: if( wall[2]==WALL_MARKED ) markNeighbours(wall,2,section);
429
              if( wall[4]==WALL_MARKED ) markNeighbours(wall,4,section);
430
              if( wall[8]==WALL_MARKED ) markNeighbours(wall,8,section);
431
              break;
432
      case 6: if( wall[3]==WALL_MARKED ) markNeighbours(wall,3,section);
433
              if( wall[7]==WALL_MARKED ) markNeighbours(wall,7,section);
434
              break;
435
      case 7: if( wall[4]==WALL_MARKED ) markNeighbours(wall,4,section);
436
              if( wall[6]==WALL_MARKED ) markNeighbours(wall,6,section);
437
              if( wall[8]==WALL_MARKED ) markNeighbours(wall,8,section);
438
              break;
439
      case 8: if( wall[5]==WALL_MARKED ) markNeighbours(wall,5,section);
440
              if( wall[7]==WALL_MARKED ) markNeighbours(wall,7,section);
441
              break;
442
      }
443
    }
444

    
445
///////////////////////////////////////////////////////////////////////////////////////////////////
446

    
447
  private int markSections(int[] wall)
448
    {
449
    int sections = 0;
450

    
451
    for(int i=0; i<9; i++)
452
      if( wall[i]==WALL_MARKED )
453
        {
454
        sections++;
455
        markNeighbours(wall,i,sections);
456
        }
457

    
458
    return sections;
459
    }
460

    
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462

    
463
  private float[] buildVertices(int[] wall, int section)
464
    {
465
    return null;
466
    }
467

    
468
///////////////////////////////////////////////////////////////////////////////////////////////////
469

    
470
  private void rotateVertices(float[] vertices, int axis)
471
    {
472

    
473
    }
474

    
475
///////////////////////////////////////////////////////////////////////////////////////////////////
476

    
477
  private void moveVertices(float[] vertices, int axis, int layer)
478
    {
479

    
480
    }
481

    
482
///////////////////////////////////////////////////////////////////////////////////////////////////
483
// 1. assume the 'wall' is in the XY plane
484
// 2. split the wall into individual connected regions and for each such region:
485
//   a. build the list of vertices (Z=0)
486
//   b. take the axis into consideration and rotate the vertices.
487
//   c. take layer into consideration and move the vertices.
488
//   d. add the resulting vertices to the list.
489

    
490
  private void createVertices(ArrayList<float[]> list, int[] wall, int axis, int layer)
491
    {
492
    int sections = markSections(wall);
493

    
494
    for(int i=0; i<sections; i++)
495
      {
496
      float[] vertices = buildVertices(wall,i+1);
497
      rotateVertices(vertices,axis);
498
      moveVertices(vertices,axis,layer);
499
      list.add(vertices);
500
      }
501
    }
502

    
503
///////////////////////////////////////////////////////////////////////////////////////////////////
504

    
505
  private int[] generateBandIndices(float[][] vertices, int[][] indices)
506
    {
507
    return null;
508
    }
509

    
510
///////////////////////////////////////////////////////////////////////////////////////////////////
511

    
512
  private int[] generateCornerIndices(float[][] vertices, int[][] indices)
513
    {
514
    return null;
515
    }
516

    
517
 ///////////////////////////////////////////////////////////////////////////////////////////////////
518

    
519
  private int[] generateCenterIndices(float[][] vertices, int[][] indices)
520
    {
521
    return null;
522
    }
523

    
524
///////////////////////////////////////////////////////////////////////////////////////////////////
525

    
526
  private float[][] generateCenters(float[][] vertices, int[][] indices)
527
    {
528
    return null;
529
    }
530

    
531
///////////////////////////////////////////////////////////////////////////////////////////////////
532
// PUBLIC API
533

    
534
  public static FactoryBandaged3x3Cubit getInstance()
535
    {
536
    if( mThis==null ) mThis = new FactoryBandaged3x3Cubit();
537
    return mThis;
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541

    
542
  public void recreate(int numVariants)
543
    {
544
    if( mVertexArray==null ) mVertexArray = new ArrayList<>();
545
    else                     mVertexArray.clear();
546

    
547
    mVertices= new float[numVariants][][];
548
    mIndices = new int[numVariants][][];
549
    }
550

    
551
///////////////////////////////////////////////////////////////////////////////////////////////////
552

    
553
  public ObjectShape createIrregularShape(int variant, float[] pos)
554
    {
555
    for(int x=0; x<3; x++)
556
      for(int y=0; y<3; y++)
557
        for(int z=0; z<3; z++)
558
          {
559
          mTmp[x][y][z] = cubitExists(pos,x-1.0f,y-1.0f,z-1.0f);
560
          }
561

    
562
    createRight0(mVertexArray);
563
    createRight1(mVertexArray);
564
    createRight2(mVertexArray);
565

    
566
    createLeft0(mVertexArray);
567
    createLeft1(mVertexArray);
568
    createLeft2(mVertexArray);
569

    
570
    createTop0(mVertexArray);
571
    createTop1(mVertexArray);
572
    createTop2(mVertexArray);
573

    
574
    createBottom0(mVertexArray);
575
    createBottom1(mVertexArray);
576
    createBottom2(mVertexArray);
577

    
578
    createFront0(mVertexArray);
579
    createFront1(mVertexArray);
580
    createFront2(mVertexArray);
581

    
582
    createBack0(mVertexArray);
583
    createBack1(mVertexArray);
584
    createBack2(mVertexArray);
585

    
586
    mVertices[variant] = getVertices(mVertexArray);
587
    mIndices[variant]  = getIndices(mVertexArray);
588

    
589
    return new ObjectShape(mVertices[variant], mIndices[variant]);
590
    }
591

    
592
///////////////////////////////////////////////////////////////////////////////////////////////////
593

    
594
  public ObjectFaceShape createIrregularFaceShape(int variant)
595
    {
596
    float defHeight     = 0.048f;
597
    float[][] corners   = { {0.04f,0.15f} };
598
    float[][] bands     = { {defHeight/1,45,0.25f,0.5f,5,1,1},
599
                            {defHeight/2,45,0.25f,0.5f,5,1,1},
600
                            {defHeight/3,45,0.25f,0.5f,5,1,1},
601
                            {     0.001f,45,0.25f,0.5f,5,1,1} };
602

    
603
    int[] bandIndices   = generateBandIndices(mVertices[variant], mIndices[variant]);
604
    float[][] centers   = generateCenters(mVertices[variant], mIndices[variant]);
605
    int[] cornerIndices = generateCornerIndices(mVertices[variant], mIndices[variant]);
606
    int[] centerIndices = generateCenterIndices(mVertices[variant], mIndices[variant]);
607

    
608
    return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
609
    }
610
  }
(2-2/10)