Project

General

Profile

« Previous | Next » 

Revision 22e60fba

Added by Leszek Koltunski about 4 years ago

Fix MeshBase.join()
Only upload Mesh Buffers to GPU when we actually use them.

View differences:

src/main/java/org/distorted/library/main/InternalBuffer.java
21 21

  
22 22
import android.opengl.GLES31;
23 23
import java.nio.Buffer;
24
import java.nio.ByteBuffer;
25
import java.nio.ByteOrder;
26
import java.nio.FloatBuffer;
24 27

  
25 28
///////////////////////////////////////////////////////////////////////////////////////////////////
26 29
/**
......
33 36
 */
34 37
public class InternalBuffer extends InternalObject
35 38
  {
36
  public int[] mIndex;
39
  public final int[] mIndex;
37 40

  
38 41
  private int mTarget, mSize, mUsage;
39 42
  private Buffer mBuffer;
......
54 57
    }
55 58

  
56 59
///////////////////////////////////////////////////////////////////////////////////////////////////
57
// mark for creation only now, when we do have all data ready, in order to avoid the situation
58
// when create() would be called before this.
60
// must be called from a thread holding OpenGL Context.
59 61

  
60
  public void setData(int size, Buffer buffer)
62
  public void createImmediately(int size, float[] buffer)
61 63
    {
62
    mSize   = size;
63
    mBuffer = buffer;
64
    if( mIndex[0]<0 )
65
      {
66
      mSize= size;
67

  
68
      if( buffer!=null )
69
        {
70
        FloatBuffer buf = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()).asFloatBuffer();
71
        buf.put(buffer).position(0);
72
        mBuffer = buf;
73
        }
74
      else
75
        {
76
        mBuffer = null;
77
        }
78

  
79
      GLES31.glGenBuffers( 1, mIndex, 0);
80
      GLES31.glBindBuffer( mTarget, mIndex[0]);
81
      GLES31.glBufferData( mTarget, mSize, mBuffer, mUsage);
82
      GLES31.glBindBuffer( mTarget, 0);
64 83

  
65
    markForCreation();
84
      markWasCreatedImmediately();
85
      }
86
    }
87

  
88
///////////////////////////////////////////////////////////////////////////////////////////////////
89

  
90
  public void invalidate()
91
    {
92
    recreate();
66 93
    }
67 94

  
68 95
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/main/InternalObject.java
212 212
    mType= type;
213 213
    }
214 214

  
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216

  
217
  void markWasCreatedImmediately()
218
    {
219
    mDoneList.add(this);
220
    }
221

  
215 222
///////////////////////////////////////////////////////////////////////////////////////////////////
216 223

  
217 224
  void markForCreation()
src/main/java/org/distorted/library/mesh/MeshBase.java
27 27
import org.distorted.library.main.InternalBuffer;
28 28
import org.distorted.library.program.DistortedProgram;
29 29

  
30
import java.nio.ByteBuffer;
31
import java.nio.ByteOrder;
32
import java.nio.FloatBuffer;
33 30
import java.util.ArrayList;
34 31

  
35 32
///////////////////////////////////////////////////////////////////////////////////////////////////
......
187 184

  
188 185
     mComponent.add(new Component(mNumVertices));
189 186

  
190
     FloatBuffer attribs = ByteBuffer.allocateDirect(mNumVertices*VERT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
191
     attribs.put(vertexAttribs).position(0);
192

  
193
     mVBO.setData(mNumVertices*VERT_SIZE, attribs);
194
     mTFO.setData(mNumVertices*TRAN_SIZE, null   );
187
     mVBO.invalidate();
188
     mTFO.invalidate();
195 189
     }
196 190

  
197 191
///////////////////////////////////////////////////////////////////////////////////////////////////
......
226 220
         }
227 221

  
228 222
       num = mesh.mNumVertices;
229
       mNumVertices+= (i<len-1 ? ( num%2==1 ? num+2 : num+1 ) : num);
223

  
224
       if( mNumVertices==0 ) mNumVertices += (num%2==1 ? num+2 : num+1);
225
       else if( i==len-1 )   mNumVertices += (num+1);
226
       else                  mNumVertices += (num%2==1 ? num+3 : num+2);
230 227
       }
231 228

  
232 229
     // allocate new attrib array
......
251 248
       mesh = meshes[i];
252 249
       num = mesh.mNumVertices;
253 250

  
254
       System.arraycopy(mesh.mVertAttribs, 0, newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS    );
255
       origVertices++;
251
       if( origVertices>0 )
252
         {
253
         System.arraycopy(mesh.mVertAttribs, 0, newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS    );
254
         origVertices++;
255
         }
256 256
       System.arraycopy(mesh.mVertAttribs, 0, newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS*num);
257 257
       origVertices+=num;
258 258

  
......
276 276

  
277 277
     mVertAttribs = newAttribs;
278 278

  
279
     FloatBuffer attribs = ByteBuffer.allocateDirect(mNumVertices*VERT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
280
     attribs.put(mVertAttribs).position(0);
281

  
282
     mVBO.setData(mNumVertices*VERT_SIZE, attribs);
283
     mTFO.setData(mNumVertices*TRAN_SIZE, null   );
279
     mVBO.invalidate();
284 280
     }
285 281

  
286 282
///////////////////////////////////////////////////////////////////////////////////////////////////
......
313 309
 */
314 310
   public void bindVertexAttribs(DistortedProgram program)
315 311
     {
312
     mVBO.createImmediately(mNumVertices*VERT_SIZE, mVertAttribs);
313

  
316 314
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mVBO.mIndex[0] );
317 315
     GLES31.glVertexAttribPointer(program.mAttribute[0], POS_DATA_SIZE, GLES31.GL_FLOAT, false, VERT_SIZE, OFFSET_POS);
318 316
     GLES31.glVertexAttribPointer(program.mAttribute[1], NOR_DATA_SIZE, GLES31.GL_FLOAT, false, VERT_SIZE, OFFSET_NOR);
......
329 327
 */
330 328
   public void bindTransformAttribs(DistortedProgram program)
331 329
     {
330
     mTFO.createImmediately(mNumVertices*TRAN_SIZE, null);
331

  
332 332
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mTFO.mIndex[0] );
333 333
     GLES31.glVertexAttribPointer(program.mAttribute[0], POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0);
334 334
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
......
456 456
         }
457 457
       }
458 458

  
459
     FloatBuffer attribs = ByteBuffer.allocateDirect(mNumVertices*VERT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
460
     attribs.put(mVertAttribs).position(0);
461

  
462
     mVBO.setData(mNumVertices*VERT_SIZE, attribs);
463
     mTFO.setData(mNumVertices*TRAN_SIZE, null   );
459
     mTFO.invalidate();
464 460
     }
465 461

  
466 462
///////////////////////////////////////////////////////////////////////////////////////////////////
......
493 489
         }
494 490
       }
495 491

  
496
     FloatBuffer attribs = ByteBuffer.allocateDirect(mNumVertices*VERT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
497
     attribs.put(mVertAttribs).position(0);
498

  
499
     mVBO.setData(mNumVertices*VERT_SIZE, attribs);
500
     mTFO.setData(mNumVertices*TRAN_SIZE, null   );
492
     mTFO.invalidate();
501 493
     }
502 494

  
503 495
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff