Project

General

Profile

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

library / src / main / java / org / distorted / library / MeshObject.java @ 7cf57d72

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 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;
21

    
22
import android.opengl.GLES30;
23

    
24
import java.nio.FloatBuffer;
25

    
26
///////////////////////////////////////////////////////////////////////////////////////////////////
27
/**
28
 * Abstract class which represents a Mesh, ie 3 arrays of Vertex attributes: 1) positions
29
 * 2) normals 3) texture coordinates.
30
 * <p>
31
 * If you want to render to a particular shape, extend from here, construct the three FloatBuffers and
32
 * provide correct dataLength, i.e. the number of vertices.
33
 */
34
public abstract class MeshObject extends DistortedObject
35
   {
36
   static final int BYTES_PER_FLOAT   = 4; //
37
   static final int POSITION_DATA_SIZE= 3; // Size of the position data in elements
38
   static final int NORMAL_DATA_SIZE  = 3; // Size of the normal data in elements.
39
   static final int TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
40

    
41
   int dataLength;
42
   FloatBuffer mMeshPositions, mMeshNormals, mMeshTexture;
43
   int[] mPosVBO = new int[1];
44
   int[] mNorVBO = new int[1];
45
   int[] mTexVBO = new int[1];
46

    
47
   int[] mPosTBO = new int[1]; // Transform Feedback
48

    
49
   final float zFactor; // strange workaround for the fact that we need to somehow store the 'depth'
50
                        // of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth().
51

    
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53

    
54
   MeshObject(float factor)
55
     {
56
     super(DistortedObject.NOT_CREATED_YET,DistortedObject.TYPE_USER);
57

    
58
     zFactor = factor;
59
     recreate();
60
     }
61

    
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63
// must be called from a thread holding OpenGL Context
64
//
65
// Do NOT release mMeshPositions etc as we will need them when we need to re-create the buffers after
66
// a loss of OpenGL context!
67

    
68
   void create()
69
     {
70
     if( mPosVBO[0]<0 )
71
       {
72
       GLES30.glGenBuffers(1, mPosVBO, 0);
73
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mPosVBO[0]);
74
       GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, dataLength*POSITION_DATA_SIZE*BYTES_PER_FLOAT, mMeshPositions, GLES30.GL_STATIC_READ);
75
       }
76
     if( mNorVBO[0]<0 )
77
       {
78
       GLES30.glGenBuffers(1, mNorVBO, 0);
79
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mNorVBO[0]);
80
       GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, dataLength*  NORMAL_DATA_SIZE*BYTES_PER_FLOAT, mMeshNormals  , GLES30.GL_STATIC_READ);
81
       }
82
     if( mTexVBO[0]<0 )
83
       {
84
       GLES30.glGenBuffers(1, mTexVBO, 0);
85
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mTexVBO[0]);
86
       GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, dataLength*    TEX_DATA_SIZE*BYTES_PER_FLOAT, mMeshTexture  , GLES30.GL_STATIC_READ);
87
       }
88

    
89
     if( mPosTBO[0]<0 ) // Buffer for Transform Feedback. Since we are rendering with GL_TRIANGLE_STRIP, after passing N vertices
90
                        // we will get (N-2) triangles back, each 3 vertices of 12 bytes.
91
       {
92
       GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, mPosTBO[0]);
93
       GLES30.glBufferData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 3*(dataLength-2)*POSITION_DATA_SIZE*BYTES_PER_FLOAT, null, GLES30.GL_STATIC_READ);
94
       GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0);
95
       }
96

    
97
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);
98
     }
99

    
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101
// must be called from a thread holding OpenGL Context
102

    
103
   void delete()
104
     {
105
     if( mPosVBO[0]>=0 )
106
       {
107
       GLES30.glDeleteBuffers(1, mPosVBO, 0);
108
       mPosVBO[0] = -1;
109
       }
110
     if( mNorVBO[0]>=0 )
111
       {
112
       GLES30.glDeleteBuffers(1, mNorVBO, 0);
113
       mNorVBO[0] = -1;
114
       }
115
     if( mTexVBO[0]>=0 )
116
       {
117
       GLES30.glDeleteBuffers(1, mTexVBO, 0);
118
       mTexVBO[0] = -1;
119
       }
120
     if( mPosTBO[0]>=0 )
121
       {
122
       GLES30.glDeleteBuffers(1, mPosTBO, 0);
123
       mPosTBO[0] = -1;
124
       }
125
     }
126

    
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

    
129
   void recreate()
130
     {
131
     mPosVBO[0] = -1;
132
     mNorVBO[0] = -1;
133
     mTexVBO[0] = -1;
134
     mPosTBO[0] = -1;
135
     }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138
// debugging only
139

    
140
   String printDetails()
141
     {
142
     return getClass().getSimpleName()+" vertices:"+dataLength;
143
     }
144

    
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146
/**
147
 * Get the minimal set of Vertices which have the same convex hull as the whole set.
148
 * <p>
149
 * In case of Flat Meshes, the set is obviously just the 4 corners. In case of the Cubes Mesh,
150
 * it is a subset of the set of each rightmost- and leftmost- corners in each row.
151
 * <p>
152
 * This is used to be able to quickly compute, in window coordinates, the Mesh'es bounding rectangle.
153
 */
154
   abstract float[] getBoundingVertices();
155
   }
156

    
(26-26/26)