Project

General

Profile

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

library / src / main / java / org / distorted / library / main / InternalBuffer.java @ de77a6c5

1 466450b5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2018 Leszek Koltunski                                                               //
3
//                                                                                               //
4 46b572b5 Leszek Koltunski
// This file is part of Distorted.                                                               //
5 466450b5 Leszek Koltunski
//                                                                                               //
6 46b572b5 Leszek Koltunski
// Distorted is free software: you can redistribute it and/or modify                             //
7 466450b5 Leszek Koltunski
// 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 46b572b5 Leszek Koltunski
// Distorted is distributed in the hope that it will be useful,                                  //
12 466450b5 Leszek Koltunski
// 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 46b572b5 Leszek Koltunski
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18 466450b5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.library.main;
21
22 b7074bc6 Leszek Koltunski
import android.opengl.GLES30;
23 0bd9f644 Leszek Koltunski
24
import java.nio.Buffer;
25 22e60fba Leszek Koltunski
import java.nio.ByteBuffer;
26
import java.nio.ByteOrder;
27
import java.nio.FloatBuffer;
28 0bd9f644 Leszek Koltunski
import java.nio.IntBuffer;
29 466450b5 Leszek Koltunski
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31
/**
32
 * Implements OpenGL buffer object such as GL_ARRAY_BUFFER or GL_TRANSFORM_FEEDBACK_BUFFER.
33
 * Main point: deal with Android lifecycle and recreate the buffer on loss of OpenGL context.
34
 * <p>
35
 * Not part of public API, do not document (public only because has to be used in Meshes)
36
 *
37
 * @y.exclude
38
 */
39 7602a827 Leszek Koltunski
public class InternalBuffer extends InternalObject
40 466450b5 Leszek Koltunski
  {
41 43814a57 Leszek Koltunski
  private static final int DONE     = 0;
42 728a7820 Leszek Koltunski
  private static final int RECREATE = 1;
43
  private static final int UPDATE   = 2;
44
45 de77a6c5 Leszek Koltunski
  private int mStatus, mSize;
46 7e53a35f Leszek Koltunski
  private final int[] mIndex;
47 de77a6c5 Leszek Koltunski
  private final int mTarget, mUsage;
48 0bd9f644 Leszek Koltunski
  private Buffer mBuffer;
49 466450b5 Leszek Koltunski
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51
52 7602a827 Leszek Koltunski
  public InternalBuffer(int target, int usage)
53 466450b5 Leszek Koltunski
    {
54 9ec374e8 Leszek Koltunski
    super(InternalObject.TYPE_USER, InternalObject.STORAGE_PRIVATE );
55 466450b5 Leszek Koltunski
56
    mIndex  = new int[1];
57
    mTarget = target;
58
    mUsage  = usage;
59 ccd98f1c Leszek Koltunski
    mBuffer = null;
60
    mSize   = 0;
61 43814a57 Leszek Koltunski
    mStatus = RECREATE;
62 466450b5 Leszek Koltunski
    }
63
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65 22e60fba Leszek Koltunski
// must be called from a thread holding OpenGL Context.
66 466450b5 Leszek Koltunski
67 0bd9f644 Leszek Koltunski
  public int createImmediatelyFloat(int size, float[] buffer)
68 466450b5 Leszek Koltunski
    {
69 728a7820 Leszek Koltunski
    if( (mStatus & RECREATE) != 0 )
70 22e60fba Leszek Koltunski
      {
71
      mSize= size;
72 ccd98f1c Leszek Koltunski
73 22e60fba Leszek Koltunski
      if( buffer!=null )
74
        {
75
        FloatBuffer buf = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()).asFloatBuffer();
76
        buf.put(buffer).position(0);
77
        mBuffer = buf;
78
        }
79
      else
80
        {
81
        mBuffer = null;
82
        }
83
84 b7074bc6 Leszek Koltunski
      GLES30.glGenBuffers( 1, mIndex, 0);
85
      GLES30.glBindBuffer( mTarget, mIndex[0]);
86
      GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
87
      GLES30.glBindBuffer( mTarget, 0);
88 22e60fba Leszek Koltunski
89
      markWasCreatedImmediately();
90
      }
91 728a7820 Leszek Koltunski
    else if( (mStatus & UPDATE) != 0 )
92
      {
93
      updateFloat(buffer);
94
      }
95
96 43814a57 Leszek Koltunski
    mStatus = DONE;
97 7e53a35f Leszek Koltunski
98
    return mIndex[0];
99 22e60fba Leszek Koltunski
    }
100
101 0bd9f644 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
102
// must be called from a thread holding OpenGL Context.
103
104
  public int createImmediatelyInt(int size, int[] buffer)
105
    {
106 728a7820 Leszek Koltunski
    if( (mStatus & RECREATE) != 0 )
107 0bd9f644 Leszek Koltunski
      {
108
      mSize= size;
109
110
      if( buffer!=null )
111
        {
112
        IntBuffer buf = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()).asIntBuffer();
113
        buf.put(buffer).position(0);
114
        mBuffer = buf;
115
        }
116
      else
117
        {
118
        mBuffer = null;
119
        }
120
121
      GLES30.glGenBuffers( 1, mIndex, 0);
122
      GLES30.glBindBuffer( mTarget,  mIndex[0]);
123
      GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
124
      GLES30.glBindBuffer( mTarget,  0);
125
126
      markWasCreatedImmediately();
127
      }
128 728a7820 Leszek Koltunski
    else if( (mStatus & UPDATE) != 0  )
129
      {
130
      updateInt(buffer);
131
      }
132
133 43814a57 Leszek Koltunski
    mStatus = DONE;
134 0bd9f644 Leszek Koltunski
135
    return mIndex[0];
136
    }
137
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139
// buffer non-null!!
140
141
  public void updateFloat(float[] buffer)
142
    {
143
    ((FloatBuffer)mBuffer).put(buffer).position(0);
144
145
    GLES30.glBindBuffer( mTarget, mIndex[0]);
146
    GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
147
    GLES30.glBindBuffer( mTarget, 0);
148 43814a57 Leszek Koltunski
149
    mStatus &= (~UPDATE);
150 0bd9f644 Leszek Koltunski
    }
151
152 342a6773 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
153
// buffer non-null!!
154
155 0bd9f644 Leszek Koltunski
  public void updateInt(int[] buffer)
156 342a6773 Leszek Koltunski
    {
157 0bd9f644 Leszek Koltunski
    ((IntBuffer)mBuffer).put(buffer).position(0);
158 342a6773 Leszek Koltunski
159
    GLES30.glBindBuffer( mTarget, mIndex[0]);
160
    GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
161
    GLES30.glBindBuffer( mTarget, 0);
162 43814a57 Leszek Koltunski
163
    mStatus &= (~UPDATE);
164 342a6773 Leszek Koltunski
    }
165
166 22e60fba Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
167
168
  public void invalidate()
169
    {
170 728a7820 Leszek Koltunski
    mStatus |= UPDATE;
171 466450b5 Leszek Koltunski
    }
172
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174
// must be called from a thread holding OpenGL Context
175
176
  void create()
177
    {
178 728a7820 Leszek Koltunski
    GLES30.glGenBuffers( 1, mIndex, 0);
179
    GLES30.glBindBuffer( mTarget, mIndex[0]);
180
    GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
181
    GLES30.glBindBuffer( mTarget, 0);
182 43814a57 Leszek Koltunski
183
    mStatus = DONE;
184 466450b5 Leszek Koltunski
    }
185
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187
// must be called from a thread holding OpenGL Context
188
189
  void delete()
190
    {
191 728a7820 Leszek Koltunski
    GLES30.glDeleteBuffers(1, mIndex, 0);
192
    mStatus |= RECREATE;
193
    removeFromDone();
194 466450b5 Leszek Koltunski
    }
195
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197
198 728a7820 Leszek Koltunski
  public void recreate()
199 466450b5 Leszek Koltunski
    {
200 728a7820 Leszek Koltunski
    mStatus |= RECREATE;
201 466450b5 Leszek Koltunski
    }
202
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204
// debugging only
205
206
  String printDetails()
207
    {
208
    return getClass().getSimpleName();
209
    }
210
  }