• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008-2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.renderscript;
18 
19 import java.util.Vector;
20 
21 /**
22  * @hide
23  * @deprecated in API 16
24  * <p>This class is a container for geometric data displayed with
25  * RenderScript. Internally, a mesh is a collection of allocations that
26  * represent vertex data (positions, normals, texture
27  * coordinates) and index data such as triangles and lines. </p>
28  * <p>
29  * Vertex data could either be interleaved within one
30  * allocation that is provided separately, as multiple allocation
31  * objects, or done as a combination of both. When a
32  * vertex channel name matches an input in the vertex program,
33  * RenderScript automatically connects the two together.
34  * </p>
35  * <p>
36  *  Parts of the mesh can be rendered with either explicit
37  *  index sets or primitive types.
38  * </p>
39  **/
40 public class Mesh extends BaseObj {
41 
42     /**
43     * @deprecated in API 16
44     * Describes the way mesh vertex data is interpreted when rendering
45     *
46     **/
47     public enum Primitive {
48         /**
49         * @deprecated in API 16
50         * Vertex data will be rendered as a series of points
51         */
52         POINT (0),
53         /**
54         * @deprecated in API 16
55         * Vertex pairs will be rendered as lines
56         */
57         LINE (1),
58         /**
59         * @deprecated in API 16
60         * Vertex data will be rendered as a connected line strip
61         */
62         LINE_STRIP (2),
63         /**
64         * @deprecated in API 16
65         * Vertices will be rendered as individual triangles
66         */
67         TRIANGLE (3),
68         /**
69         * @deprecated in API 16
70         * Vertices will be rendered as a connected triangle strip
71         * defined by the first three vertices with each additional
72         * triangle defined by a new vertex
73         */
74         TRIANGLE_STRIP (4),
75         /**
76         * @deprecated in API 16
77         * Vertices will be rendered as a sequence of triangles that all
78         * share first vertex as the origin
79         */
80         TRIANGLE_FAN (5);
81 
82         int mID;
Primitive(int id)83         Primitive(int id) {
84             mID = id;
85         }
86     }
87 
88     Allocation[] mVertexBuffers;
89     Allocation[] mIndexBuffers;
90     Primitive[] mPrimitives;
91 
Mesh(long id, RenderScript rs)92     Mesh(long id, RenderScript rs) {
93         super(id, rs);
94         guard.open("destroy");
95     }
96 
97     /**
98     * @deprecated in API 16
99     * @return number of allocations containing vertex data
100     *
101     **/
getVertexAllocationCount()102     public int getVertexAllocationCount() {
103         if(mVertexBuffers == null) {
104             return 0;
105         }
106         return mVertexBuffers.length;
107     }
108     /**
109     * @deprecated in API 16
110     * @param slot index in the list of allocations to return
111     * @return vertex data allocation at the given index
112     *
113     **/
getVertexAllocation(int slot)114     public Allocation getVertexAllocation(int slot) {
115         return mVertexBuffers[slot];
116     }
117 
118     /**
119     * @deprecated in API 16
120     * @return number of primitives or index sets in the mesh
121     *
122     **/
getPrimitiveCount()123     public int getPrimitiveCount() {
124         if(mIndexBuffers == null) {
125             return 0;
126         }
127         return mIndexBuffers.length;
128     }
129 
130     /**
131     * @deprecated in API 16
132     * @param slot locaton within the list of index set allocation
133     * @return allocation containing primtive index data or null if
134     *         the index data is not specified explicitly
135     *
136     **/
getIndexSetAllocation(int slot)137     public Allocation getIndexSetAllocation(int slot) {
138         return mIndexBuffers[slot];
139     }
140     /**
141     * @deprecated in API 16
142     * @param slot locaiton within the list of index set primitives
143     * @return index set primitive type
144     *
145     **/
getPrimitive(int slot)146     public Primitive getPrimitive(int slot) {
147         return mPrimitives[slot];
148     }
149 
150     @Override
updateFromNative()151     void updateFromNative() {
152         super.updateFromNative();
153         int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS));
154         int idxCount = mRS.nMeshGetIndexCount(getID(mRS));
155 
156         long[] vtxIDs = new long[vtxCount];
157         long[] idxIDs = new long[idxCount];
158         int[] primitives = new int[idxCount];
159 
160         mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount);
161         mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount);
162 
163         mVertexBuffers = new Allocation[vtxCount];
164         mIndexBuffers = new Allocation[idxCount];
165         mPrimitives = new Primitive[idxCount];
166 
167         for(int i = 0; i < vtxCount; i ++) {
168             if(vtxIDs[i] != 0) {
169                 mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
170                 mVertexBuffers[i].updateFromNative();
171             }
172         }
173 
174         for(int i = 0; i < idxCount; i ++) {
175             if(idxIDs[i] != 0) {
176                 mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
177                 mIndexBuffers[i].updateFromNative();
178             }
179             mPrimitives[i] = Primitive.values()[primitives[i]];
180         }
181     }
182 
183     /**
184     * @deprecated in API 16
185     * Mesh builder object. It starts empty and requires you to
186     * add the types necessary to create vertex and index
187     * allocations.
188     *
189     */
190     public static class Builder {
191         RenderScript mRS;
192         int mUsage;
193 
194         class Entry {
195             Type t;
196             Element e;
197             int size;
198             Primitive prim;
199             int usage;
200         }
201 
202         int mVertexTypeCount;
203         Entry[] mVertexTypes;
204         Vector mIndexTypes;
205 
206         /**
207         * @deprecated in API 16
208         * Creates builder object
209         * @param rs Context to which the mesh will belong.
210         * @param usage specifies how the mesh allocations are to be
211         *              handled, whether they need to be uploaded to a
212         *              buffer on the gpu, maintain a cpu copy, etc
213         */
Builder(RenderScript rs, int usage)214         public Builder(RenderScript rs, int usage) {
215             mRS = rs;
216             mUsage = usage;
217             mVertexTypeCount = 0;
218             mVertexTypes = new Entry[16];
219             mIndexTypes = new Vector();
220         }
221 
222         /**
223         * @deprecated in API 16
224         * @return internal index of the last vertex buffer type added to
225         *         builder
226         **/
getCurrentVertexTypeIndex()227         public int getCurrentVertexTypeIndex() {
228             return mVertexTypeCount - 1;
229         }
230 
231         /**
232         * @deprecated in API 16
233         * @return internal index of the last index set added to the
234         *         builder
235         **/
getCurrentIndexSetIndex()236         public int getCurrentIndexSetIndex() {
237             return mIndexTypes.size() - 1;
238         }
239 
240         /**
241         * @deprecated in API 16
242         * Adds a vertex data type to the builder object
243         *
244         * @param t type of the vertex data allocation to be created
245         *
246         * @return this
247         **/
addVertexType(Type t)248         public Builder addVertexType(Type t) throws IllegalStateException {
249             if (mVertexTypeCount >= mVertexTypes.length) {
250                 throw new IllegalStateException("Max vertex types exceeded.");
251             }
252 
253             mVertexTypes[mVertexTypeCount] = new Entry();
254             mVertexTypes[mVertexTypeCount].t = t;
255             mVertexTypes[mVertexTypeCount].e = null;
256             mVertexTypeCount++;
257             return this;
258         }
259 
260         /**
261         * @deprecated in API 16
262         * Adds a vertex data type to the builder object
263         *
264         * @param e element describing the vertex data layout
265         * @param size number of elements in the buffer
266         *
267         * @return this
268         **/
addVertexType(Element e, int size)269         public Builder addVertexType(Element e, int size) throws IllegalStateException {
270             if (mVertexTypeCount >= mVertexTypes.length) {
271                 throw new IllegalStateException("Max vertex types exceeded.");
272             }
273 
274             mVertexTypes[mVertexTypeCount] = new Entry();
275             mVertexTypes[mVertexTypeCount].t = null;
276             mVertexTypes[mVertexTypeCount].e = e;
277             mVertexTypes[mVertexTypeCount].size = size;
278             mVertexTypeCount++;
279             return this;
280         }
281 
282         /**
283         * @deprecated in API 16
284         * Adds an index set data type to the builder object
285         *
286         * @param t type of the index set data, could be null
287         * @param p primitive type
288         *
289         * @return this
290         **/
addIndexSetType(Type t, Primitive p)291         public Builder addIndexSetType(Type t, Primitive p) {
292             Entry indexType = new Entry();
293             indexType.t = t;
294             indexType.e = null;
295             indexType.size = 0;
296             indexType.prim = p;
297             mIndexTypes.addElement(indexType);
298             return this;
299         }
300 
301         /**
302         * @deprecated in API 16
303         * Adds an index set primitive type to the builder object
304         *
305         * @param p primitive type
306         *
307         * @return this
308         **/
addIndexSetType(Primitive p)309         public Builder addIndexSetType(Primitive p) {
310             Entry indexType = new Entry();
311             indexType.t = null;
312             indexType.e = null;
313             indexType.size = 0;
314             indexType.prim = p;
315             mIndexTypes.addElement(indexType);
316             return this;
317         }
318 
319         /**
320         * @deprecated in API 16
321         * Adds an index set data type to the builder object
322         *
323         * @param e element describing the index set data layout
324         * @param size number of elements in the buffer
325         * @param p primitive type
326         *
327         * @return this
328         **/
addIndexSetType(Element e, int size, Primitive p)329         public Builder addIndexSetType(Element e, int size, Primitive p) {
330             Entry indexType = new Entry();
331             indexType.t = null;
332             indexType.e = e;
333             indexType.size = size;
334             indexType.prim = p;
335             mIndexTypes.addElement(indexType);
336             return this;
337         }
338 
newType(Element e, int size)339         Type newType(Element e, int size) {
340             Type.Builder tb = new Type.Builder(mRS, e);
341             tb.setX(size);
342             return tb.create();
343         }
344 
345         /**
346         * @deprecated in API 16
347         * Create a Mesh object from the current state of the builder
348         *
349         **/
create()350         public Mesh create() {
351             mRS.validate();
352             long[] vtx = new long[mVertexTypeCount];
353             long[] idx = new long[mIndexTypes.size()];
354             int[] prim = new int[mIndexTypes.size()];
355 
356             Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
357             Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
358             Primitive[] primitives = new Primitive[mIndexTypes.size()];
359 
360             for(int ct = 0; ct < mVertexTypeCount; ct ++) {
361                 Allocation alloc = null;
362                 Entry entry = mVertexTypes[ct];
363                 if (entry.t != null) {
364                     alloc = Allocation.createTyped(mRS, entry.t, mUsage);
365                 } else if(entry.e != null) {
366                     alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
367                 } else {
368                     // Should never happen because the builder will always set one
369                     throw new IllegalStateException("Builder corrupt, no valid element in entry.");
370                 }
371                 vertexBuffers[ct] = alloc;
372                 vtx[ct] = alloc.getID(mRS);
373             }
374 
375             for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
376                 Allocation alloc = null;
377                 Entry entry = (Entry)mIndexTypes.elementAt(ct);
378                 if (entry.t != null) {
379                     alloc = Allocation.createTyped(mRS, entry.t, mUsage);
380                 } else if(entry.e != null) {
381                     alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
382                 } else {
383                     // Should never happen because the builder will always set one
384                     throw new IllegalStateException("Builder corrupt, no valid element in entry.");
385                 }
386                 long allocID = (alloc == null) ? 0 : alloc.getID(mRS);
387                 indexBuffers[ct] = alloc;
388                 primitives[ct] = entry.prim;
389 
390                 idx[ct] = allocID;
391                 prim[ct] = entry.prim.mID;
392             }
393 
394             long id = mRS.nMeshCreate(vtx, idx, prim);
395             Mesh newMesh = new Mesh(id, mRS);
396             newMesh.mVertexBuffers = vertexBuffers;
397             newMesh.mIndexBuffers = indexBuffers;
398             newMesh.mPrimitives = primitives;
399 
400             return newMesh;
401         }
402     }
403 
404     /**
405     * @deprecated in API 16
406     * Mesh builder object. It starts empty and requires the user to
407     * add all the vertex and index allocations that comprise the
408     * mesh
409     *
410     */
411     public static class AllocationBuilder {
412         RenderScript mRS;
413 
414         class Entry {
415             Allocation a;
416             Primitive prim;
417         }
418 
419         int mVertexTypeCount;
420         Entry[] mVertexTypes;
421 
422         Vector mIndexTypes;
423 
424         /**
425         * @deprecated in API 16
426         **/
AllocationBuilder(RenderScript rs)427         public AllocationBuilder(RenderScript rs) {
428             mRS = rs;
429             mVertexTypeCount = 0;
430             mVertexTypes = new Entry[16];
431             mIndexTypes = new Vector();
432         }
433 
434         /**
435         * @deprecated in API 16
436         * @return internal index of the last vertex buffer type added to
437         *         builder
438         **/
getCurrentVertexTypeIndex()439         public int getCurrentVertexTypeIndex() {
440             return mVertexTypeCount - 1;
441         }
442 
443         /**
444         * @deprecated in API 16
445         * @return internal index of the last index set added to the
446         *         builder
447         **/
getCurrentIndexSetIndex()448         public int getCurrentIndexSetIndex() {
449             return mIndexTypes.size() - 1;
450         }
451 
452         /**
453         * @deprecated in API 16
454         * Adds an allocation containing vertex buffer data to the
455         * builder
456         *
457         * @param a vertex data allocation
458         *
459         * @return this
460         **/
addVertexAllocation(Allocation a)461         public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
462             if (mVertexTypeCount >= mVertexTypes.length) {
463                 throw new IllegalStateException("Max vertex types exceeded.");
464             }
465 
466             mVertexTypes[mVertexTypeCount] = new Entry();
467             mVertexTypes[mVertexTypeCount].a = a;
468             mVertexTypeCount++;
469             return this;
470         }
471 
472         /**
473         * @deprecated in API 16
474         * Adds an allocation containing index buffer data and index type
475         * to the builder
476         *
477         * @param a index set data allocation, could be null
478         * @param p index set primitive type
479         *
480         * @return this
481         **/
addIndexSetAllocation(Allocation a, Primitive p)482         public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
483             Entry indexType = new Entry();
484             indexType.a = a;
485             indexType.prim = p;
486             mIndexTypes.addElement(indexType);
487             return this;
488         }
489 
490         /**
491         * @deprecated in API 16
492         * Adds an index set type to the builder
493         *
494         * @param p index set primitive type
495         *
496         * @return this
497         **/
addIndexSetType(Primitive p)498         public AllocationBuilder addIndexSetType(Primitive p) {
499             Entry indexType = new Entry();
500             indexType.a = null;
501             indexType.prim = p;
502             mIndexTypes.addElement(indexType);
503             return this;
504         }
505 
506         /**
507         * @deprecated in API 16
508         * Create a Mesh object from the current state of the builder
509         *
510         **/
create()511         public Mesh create() {
512             mRS.validate();
513 
514             long[] vtx = new long[mVertexTypeCount];
515             long[] idx = new long[mIndexTypes.size()];
516             int[] prim = new int[mIndexTypes.size()];
517 
518             Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
519             Primitive[] primitives = new Primitive[mIndexTypes.size()];
520             Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
521 
522             for(int ct = 0; ct < mVertexTypeCount; ct ++) {
523                 Entry entry = mVertexTypes[ct];
524                 vertexBuffers[ct] = entry.a;
525                 vtx[ct] = entry.a.getID(mRS);
526             }
527 
528             for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
529                 Entry entry = (Entry)mIndexTypes.elementAt(ct);
530                 long allocID = (entry.a == null) ? 0 : entry.a.getID(mRS);
531                 indexBuffers[ct] = entry.a;
532                 primitives[ct] = entry.prim;
533 
534                 idx[ct] = allocID;
535                 prim[ct] = entry.prim.mID;
536             }
537 
538             long id = mRS.nMeshCreate(vtx, idx, prim);
539             Mesh newMesh = new Mesh(id, mRS);
540             newMesh.mVertexBuffers = vertexBuffers;
541             newMesh.mIndexBuffers = indexBuffers;
542             newMesh.mPrimitives = primitives;
543 
544             return newMesh;
545         }
546     }
547 
548     /**
549     * @deprecated in API 16
550     * Builder that allows creation of a mesh object point by point
551     * and triangle by triangle
552     *
553     **/
554     public static class TriangleMeshBuilder {
555         float mVtxData[];
556         int mVtxCount;
557         int mMaxIndex;
558         short mIndexData[];
559         int mIndexCount;
560         RenderScript mRS;
561         Element mElement;
562 
563         float mNX = 0;
564         float mNY = 0;
565         float mNZ = -1;
566         float mS0 = 0;
567         float mT0 = 0;
568         float mR = 1;
569         float mG = 1;
570         float mB = 1;
571         float mA = 1;
572 
573         int mVtxSize;
574         int mFlags;
575 
576         /**
577         * @deprecated in API 16
578         **/
579         public static final int COLOR = 0x0001;
580         /**
581         * @deprecated in API 16
582         **/
583         public static final int NORMAL = 0x0002;
584         /**
585         * @deprecated in API 16
586         **/
587         public static final int TEXTURE_0 = 0x0100;
588 
589         /**
590         * @deprecated in API 16
591         * @param rs Context to which the mesh will belong.
592         * @param vtxSize specifies whether the vertex is a float2 or
593         *                float3
594         * @param flags bitfield that is a combination of COLOR, NORMAL,
595         *              and TEXTURE_0 that specifies what vertex data
596         *              channels are present in the mesh
597         *
598         **/
TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags)599         public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) {
600             mRS = rs;
601             mVtxCount = 0;
602             mMaxIndex = 0;
603             mIndexCount = 0;
604             mVtxData = new float[128];
605             mIndexData = new short[128];
606             mVtxSize = vtxSize;
607             mFlags = flags;
608 
609             if (vtxSize < 2 || vtxSize > 3) {
610                 throw new IllegalArgumentException("Vertex size out of range.");
611             }
612         }
613 
makeSpace(int count)614         private void makeSpace(int count) {
615             if ((mVtxCount + count) >= mVtxData.length) {
616                 float t[] = new float[mVtxData.length * 2];
617                 System.arraycopy(mVtxData, 0, t, 0, mVtxData.length);
618                 mVtxData = t;
619             }
620         }
621 
latch()622         private void latch() {
623             if ((mFlags & COLOR) != 0) {
624                 makeSpace(4);
625                 mVtxData[mVtxCount++] = mR;
626                 mVtxData[mVtxCount++] = mG;
627                 mVtxData[mVtxCount++] = mB;
628                 mVtxData[mVtxCount++] = mA;
629             }
630             if ((mFlags & TEXTURE_0) != 0) {
631                 makeSpace(2);
632                 mVtxData[mVtxCount++] = mS0;
633                 mVtxData[mVtxCount++] = mT0;
634             }
635             if ((mFlags & NORMAL) != 0) {
636                 makeSpace(4);
637                 mVtxData[mVtxCount++] = mNX;
638                 mVtxData[mVtxCount++] = mNY;
639                 mVtxData[mVtxCount++] = mNZ;
640                 mVtxData[mVtxCount++] = 0.0f;
641             }
642             mMaxIndex ++;
643         }
644 
645         /**
646         * @deprecated in API 16
647         * Adds a float2 vertex to the mesh
648         *
649         * @param x position x
650         * @param y position y
651         *
652         * @return this
653         *
654         **/
addVertex(float x, float y)655         public TriangleMeshBuilder addVertex(float x, float y) {
656             if (mVtxSize != 2) {
657                 throw new IllegalStateException("add mistmatch with declared components.");
658             }
659             makeSpace(2);
660             mVtxData[mVtxCount++] = x;
661             mVtxData[mVtxCount++] = y;
662             latch();
663             return this;
664         }
665 
666         /**
667         * @deprecated in API 16
668         * Adds a float3 vertex to the mesh
669         *
670         * @param x position x
671         * @param y position y
672         * @param z position z
673         *
674         * @return this
675         *
676         **/
addVertex(float x, float y, float z)677         public TriangleMeshBuilder addVertex(float x, float y, float z) {
678             if (mVtxSize != 3) {
679                 throw new IllegalStateException("add mistmatch with declared components.");
680             }
681             makeSpace(4);
682             mVtxData[mVtxCount++] = x;
683             mVtxData[mVtxCount++] = y;
684             mVtxData[mVtxCount++] = z;
685             mVtxData[mVtxCount++] = 1.0f;
686             latch();
687             return this;
688         }
689 
690         /**
691         * @deprecated in API 16
692         * Sets the texture coordinate for the vertices that are added after this method call.
693         *
694         * @param s texture coordinate s
695         * @param t texture coordinate t
696         *
697         * @return this
698         **/
setTexture(float s, float t)699         public TriangleMeshBuilder setTexture(float s, float t) {
700             if ((mFlags & TEXTURE_0) == 0) {
701                 throw new IllegalStateException("add mistmatch with declared components.");
702             }
703             mS0 = s;
704             mT0 = t;
705             return this;
706         }
707 
708         /**
709         * @deprecated in API 16
710         * Sets the normal vector for the vertices that are added after this method call.
711         *
712         * @param x normal vector x
713         * @param y normal vector y
714         * @param z normal vector z
715         *
716         * @return this
717         **/
setNormal(float x, float y, float z)718         public TriangleMeshBuilder setNormal(float x, float y, float z) {
719             if ((mFlags & NORMAL) == 0) {
720                 throw new IllegalStateException("add mistmatch with declared components.");
721             }
722             mNX = x;
723             mNY = y;
724             mNZ = z;
725             return this;
726         }
727 
728         /**
729         * @deprecated in API 16
730         * Sets the color for the vertices that are added after this method call.
731         *
732         * @param r red component
733         * @param g green component
734         * @param b blue component
735         * @param a alpha component
736         *
737         * @return this
738         **/
setColor(float r, float g, float b, float a)739         public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
740             if ((mFlags & COLOR) == 0) {
741                 throw new IllegalStateException("add mistmatch with declared components.");
742             }
743             mR = r;
744             mG = g;
745             mB = b;
746             mA = a;
747             return this;
748         }
749 
750         /**
751         * @deprecated in API 16
752         * Adds a new triangle to the mesh builder
753         *
754         * @param idx1 index of the first vertex in the triangle
755         * @param idx2 index of the second vertex in the triangle
756         * @param idx3 index of the third vertex in the triangle
757         *
758         * @return this
759         **/
addTriangle(int idx1, int idx2, int idx3)760         public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
761             if((idx1 >= mMaxIndex) || (idx1 < 0) ||
762                (idx2 >= mMaxIndex) || (idx2 < 0) ||
763                (idx3 >= mMaxIndex) || (idx3 < 0)) {
764                throw new IllegalStateException("Index provided greater than vertex count.");
765             }
766             if ((mIndexCount + 3) >= mIndexData.length) {
767                 short t[] = new short[mIndexData.length * 2];
768                 System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
769                 mIndexData = t;
770             }
771             mIndexData[mIndexCount++] = (short)idx1;
772             mIndexData[mIndexCount++] = (short)idx2;
773             mIndexData[mIndexCount++] = (short)idx3;
774             return this;
775         }
776 
777         /**
778         * @deprecated in API 16
779         * Creates the mesh object from the current state of the builder
780         *
781         * @param uploadToBufferObject specifies whether the vertex data
782         *                             is to be uploaded into the buffer
783         *                             object indicating that it's likely
784         *                             not going to be modified and
785         *                             rendered many times.
786         *                             Alternatively, it indicates the
787         *                             mesh data will be updated
788         *                             frequently and remain in script
789         *                             accessible memory
790         *
791         **/
create(boolean uploadToBufferObject)792         public Mesh create(boolean uploadToBufferObject) {
793             Element.Builder b = new Element.Builder(mRS);
794             b.add(Element.createVector(mRS,
795                                        Element.DataType.FLOAT_32,
796                                        mVtxSize), "position");
797             if ((mFlags & COLOR) != 0) {
798                 b.add(Element.F32_4(mRS), "color");
799             }
800             if ((mFlags & TEXTURE_0) != 0) {
801                 b.add(Element.F32_2(mRS), "texture0");
802             }
803             if ((mFlags & NORMAL) != 0) {
804                 b.add(Element.F32_3(mRS), "normal");
805             }
806             mElement = b.create();
807 
808             int usage = Allocation.USAGE_SCRIPT;
809             if (uploadToBufferObject) {
810                 usage |= Allocation.USAGE_GRAPHICS_VERTEX;
811             }
812 
813             Builder smb = new Builder(mRS, usage);
814             smb.addVertexType(mElement, mMaxIndex);
815             smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
816 
817             Mesh sm = smb.create();
818 
819             sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData);
820             if(uploadToBufferObject) {
821                 sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
822             }
823 
824             sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData);
825             if (uploadToBufferObject) {
826                 sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
827             }
828 
829             return sm;
830         }
831     }
832 }
833 
834