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