Project

General

Profile

« Previous | Next » 

Revision d6994cc6

Added by Leszek Koltunski almost 8 years ago

Correct construction of boundingVertices in MeshCubes.

View differences:

src/main/java/org/distorted/library/MeshCubes.java
64 64
     }
65 65
   
66 66
   private int mCols, mRows;
67
   private short[][] mCubes;
67
   private int[][] mCubes;
68 68
   private ArrayList<Edge> mEdges = new ArrayList<>();
69 69

  
70 70
   private int remainingVert;
......
161 161

  
162 162
     return ret;
163 163
     }
164
*/  
164
*/
165 165
///////////////////////////////////////////////////////////////////////////////////////////////////
166 166
/*
167 167
   private static String debug(Edge e)
......
194 194
       mCols = cols;
195 195
       mRows = desc.length()/cols;
196 196

  
197
       mCubes = new short[mRows][mCols];
197
       mCubes = new int[mRows][mCols];
198 198
       
199 199
       for(int j=0; j<mCols; j++)
200 200
         for(int i=0; i<mRows; i++)
201
           mCubes[i][j] = (short)(desc.charAt(i*mCols+j) == '1' ? 1:0);
202
       
201
           mCubes[i][j] = (desc.charAt(i*mCols+j) == '1' ? 1:0);
202

  
203
       buildBoundingVert(frontOnly);
204

  
203 205
       markRegions();
204 206
       dataLength = computeDataLength(frontOnly);
205 207

  
206 208
       remainingVert = dataLength;
207
       buildBoundingVert(mCubes,frontOnly);
208 209
       }
209 210
     }
210 211

  
......
219 220

  
220 221
     if( cols>0 && rows>0 )
221 222
       {
222
       mCubes = new short[mRows][mCols];
223
       mCubes = new int[mRows][mCols];
223 224

  
224 225
       for(int j=0; j<mCols; j++)
225 226
         for(int i=0; i<mRows; i++)
226
           mCubes[i][j] = (short)1;
227
           mCubes[i][j] = 1;
227 228

  
228 229
       markRegions();
229 230
       dataLength = computeDataLength(frontOnly);
......
236 237

  
237 238
///////////////////////////////////////////////////////////////////////////////////////////////////
238 239

  
239
  private float retLeftmost(short[][] cubes, int row)
240
  private float retRightmost(int row)
240 241
    {
242
    if( row==0 )
243
      {
244
      for(int i=mCols-1; i>=0; i--)
245
        if( mCubes[0][i]==1 )
246
          return (float)(i+1);
247
      }
248
    else if(row==mRows)
249
      {
250
      for(int i=mCols-1; i>=0; i--)
251
        if( mCubes[mRows-1][i]==1 )
252
          return (float)(i+1);
253
      }
254
    else
255
      {
256
      for(int i=mCols-1; i>=0; i--)
257
        if( mCubes[row][i]==1 || mCubes[row-1][i]==1 )
258
          return (float)(i+1);
259
      }
241 260

  
242 261
    return 0.0f;
243 262
    }
244 263

  
245 264
///////////////////////////////////////////////////////////////////////////////////////////////////
246 265

  
247
 private float retRightmost(short[][] cubes, int row)
266
 private float retLeftmost(int row)
248 267
    {
249 268
    if( row==0 )
250 269
      {
251 270
      for(int i=0; i<mCols; i++)
252
        {
253

  
254
        }
271
        if( mCubes[0][i]==1 )
272
          return (float)i;
255 273
      }
256 274
    else if(row==mRows)
257 275
      {
258 276
      for(int i=0; i<mCols; i++)
259
        {
260

  
261
        }
277
        if( mCubes[mRows-1][i]==1 )
278
          return (float)i;
262 279
      }
263 280
    else
264 281
      {
265 282
      for(int i=0; i<mCols; i++)
266
        {
267

  
268
        }
283
        if( mCubes[row][i]==1 || mCubes[row-1][i]==1 )
284
          return (float)i;
269 285
      }
270 286

  
271
    return 0.0f;
287
    return (float)mCols;
272 288
    }
273 289

  
274 290
///////////////////////////////////////////////////////////////////////////////////////////////////
275 291

  
276
  private int addLeftmost(float[] temp, short[][] cubes, int row, int index)
292
  private int addLeftmost(float[] temp, int row, int index)
277 293
    {
278
    float x2 = retLeftmost(cubes,row);
279
    float y2 = row/mRows - 0.5f;
294
    float x2 = retLeftmost(row)/mCols - 0.5f;
295
    float y2 = (float)row      /mRows - 0.5f;
280 296

  
281 297
    if( index>1 )
282 298
      {
......
285 301
      float x1 = temp[2*index-2];
286 302
      float y1 = temp[2*index-1];
287 303

  
288
      if( (x0-x2)*(y0-y1) <= (x0-x1)*(y0-y2) )
304
      while( (x0-x2)*(y0-y1) <= (x0-x1)*(y0-y2) )
289 305
        {
290
        temp[2*index-2] = x2;
291
        temp[2*index-1] = y2;
292
        return index;
306
        if( --index>1 )
307
          {
308
          x1 = x0;
309
          y1 = y0;
310
          x0 = temp[2*index-4];
311
          y0 = temp[2*index-3];
312
          }
313
        else break;
293 314
        }
294 315
      }
295 316

  
296
    temp[2*index+0] = x2;
317
    temp[2*index  ] = x2;
297 318
    temp[2*index+1] = y2;
298 319
    return index+1;
299 320
    }
300 321

  
301 322
///////////////////////////////////////////////////////////////////////////////////////////////////
302 323

  
303
  private int addRightmost(float[] temp, short[][] cubes, int row, int index)
324
  private int addRightmost(float[] temp, int row, int index)
304 325
    {
305
    float x2 = retRightmost(cubes,row);
306
    float y2 = row/mRows - 0.5f;
326
    float x2 = retRightmost(row)/mCols - 0.5f;
327
    float y2 = (float)row       /mRows - 0.5f;
307 328

  
308 329
    if( index>1 )
309 330
      {
......
312 333
      float x1 = temp[2*index-2];
313 334
      float y1 = temp[2*index-1];
314 335

  
315
      if( (x0-x2)*(y0-y1) >= (x0-x1)*(y0-y2) )
336
      while( (x0-x2)*(y0-y1) >= (x0-x1)*(y0-y2) )
316 337
        {
317
        temp[2*index-2] = x2;
318
        temp[2*index-1] = y2;
319
        return index;
338
        if( --index>1 )
339
          {
340
          x1 = x0;
341
          y1 = y0;
342
          x0 = temp[2*index-4];
343
          y0 = temp[2*index-3];
344
          }
345
        else break;
320 346
        }
321 347
      }
322 348

  
323
    temp[2*index+0] = x2;
349
    temp[2*index  ] = x2;
324 350
    temp[2*index+1] = y2;
325 351
    return index+1;
326 352
    }
......
329 355
// fill up the mBoundingVert array with the smallest set of vertices which form the same convex hull
330 356
// like the whole thing.
331 357

  
332
  private void buildBoundingVert(short[][] cubes, boolean frontOnly)
358
  private void buildBoundingVert(boolean frontOnly)
333 359
    {
334 360
    int lVert=0, rVert=0;
335
    float[] tempL = new float[2*(mRows+1)];
336
    float[] tempR = new float[2*(mRows+1)];
361
    int firstRow=0, lastRow=mRows-1;
337 362

  
338
    for(int i=0; i<=mRows; i++)
363
    for(int i=0; i<mRows; i++)
364
      for(int j=0; j<mCols; j++)
365
        if(mCubes[i][j] !=0 )
366
          {
367
          firstRow = i;
368
          i=mRows;
369
          j=mCols;
370
          }
371

  
372
    for(int i=mRows-1; i>=0; i--)
373
      for(int j=0; j<mCols; j++)
374
        if(mCubes[i][j] !=0 )
375
          {
376
          lastRow = i;
377
          i=-1;
378
          j=mCols;
379
          }
380

  
381
//android.util.Log.d("cubes", "first :"+firstRow+" last: "+lastRow);
382

  
383
    int numLines = lastRow-firstRow+2;
384

  
385
    float[] tempL = new float[2*numLines];
386
    float[] tempR = new float[2*numLines];
387

  
388
    for(int i=firstRow; i<=lastRow+1; i++)
339 389
      {
340
      lVert = addLeftmost (tempL,cubes,i,lVert);
341
      rVert = addRightmost(tempR,cubes,i,rVert);
390
      lVert = addLeftmost (tempL,i,lVert);
391
      rVert = addRightmost(tempR,i,rVert);
342 392
      }
343 393

  
394
//android.util.Log.d("cubes", "LEFT :"+debug(tempL,2));
395
//android.util.Log.d("cubes", "RIGHT:"+debug(tempR,2));
396

  
344 397
    int numVert = lVert+rVert;
345 398

  
346 399
    mBoundingVert = new float[ numVert*(frontOnly ? 3:6) ];
......
368 421
        mBoundingVert[3*(i+numVert)+2] = BACKZ;
369 422
        }
370 423
      }
424

  
425
//android.util.Log.d("cubes", "VERT:"+debug(mBoundingVert,3));
371 426
    }
372 427

  
373 428
///////////////////////////////////////////////////////////////////////////////////////////////////
......
451 506
   
452 507
   private void markRegion(short newVal, int row, int col)
453 508
     {
454
     short val = mCubes[row][col];
509
     int val = mCubes[row][col];
455 510
     mCubes[row][col] = newVal;
456 511
     
457 512
     if( row>0       && mCubes[row-1][col  ]==val ) markRegion(newVal, row-1, col  );
......
560 615

  
561 616
   private int buildFrontBackGrid(boolean front, int vertex, float[] position, float[] normal, float[] texture)
562 617
     {
563
     short last, current;
618
     int last, current;
564 619
     boolean seenLand=false;
565 620
     boolean lastBlockIsNE = false;
566 621
     boolean currentBlockIsNE;

Also available in: Unified diff