1164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk/*
2e619de6a4e4326b7662b523ea2f403801291d432Jason Sams * Copyright (C) 2008-2012 The Android Open Source Project
3164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk *
4164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * you may not use this file except in compliance with the License.
6164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * You may obtain a copy of the License at
7164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk *
8164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk *
10164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * See the License for the specific language governing permissions and
14164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk * limitations under the License.
15164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk */
16164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
17164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchoukpackage android.renderscript;
18164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
19164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchoukimport java.util.Vector;
20164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
22a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide
23d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams * @deprecated in API 16
2411518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>This class is a container for geometric data displayed with
25c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * RenderScript. Internally, a mesh is a collection of allocations that
26df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * represent vertex data (positions, normals, texture
2711518acc8c416023d8c2192b441a1767205676d9Robert Ly * coordinates) and index data such as triangles and lines. </p>
2811518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>
2911518acc8c416023d8c2192b441a1767205676d9Robert Ly * Vertex data could either be interleaved within one
3011518acc8c416023d8c2192b441a1767205676d9Robert Ly * allocation that is provided separately, as multiple allocation
3111518acc8c416023d8c2192b441a1767205676d9Robert Ly * objects, or done as a combination of both. When a
32df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * vertex channel name matches an input in the vertex program,
33c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * RenderScript automatically connects the two together.
3411518acc8c416023d8c2192b441a1767205676d9Robert Ly * </p>
3511518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>
3611518acc8c416023d8c2192b441a1767205676d9Robert Ly *  Parts of the mesh can be rendered with either explicit
37df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk *  index sets or primitive types.
3811518acc8c416023d8c2192b441a1767205676d9Robert Ly * </p>
39164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk **/
40164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchoukpublic class Mesh extends BaseObj {
41164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
429c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
43d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
44df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Describes the way mesh vertex data is interpreted when rendering
45df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
46df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
47b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public enum Primitive {
489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
49d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertex data will be rendered as a series of points
51ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
52b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        POINT (0),
539c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
54d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
55ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertex pairs will be rendered as lines
56ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        LINE (1),
589c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
59d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
60ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertex data will be rendered as a connected line strip
61ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
62b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        LINE_STRIP (2),
639c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
64d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
65ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertices will be rendered as individual triangles
66ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
67b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        TRIANGLE (3),
689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
69d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
70ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertices will be rendered as a connected triangle strip
71ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * defined by the first three vertices with each additional
72ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * triangle defined by a new vertex
73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
74b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        TRIANGLE_STRIP (4),
759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
76d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
77ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertices will be rendered as a sequence of triangles that all
78ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * share first vertex as the origin
79ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        TRIANGLE_FAN (5);
81b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
82b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        int mID;
83b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Primitive(int id) {
84b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mID = id;
85b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
86b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
87b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
88164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Allocation[] mVertexBuffers;
89164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Allocation[] mIndexBuffers;
90164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Primitive[] mPrimitives;
91164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
92460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    Mesh(long id, RenderScript rs) {
930de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
94164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
95164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
969c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
97d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
98df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return number of allocations containing vertex data
99df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
100df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
101164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public int getVertexAllocationCount() {
102164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        if(mVertexBuffers == null) {
103164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return 0;
104164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
105164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mVertexBuffers.length;
106164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
1079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
108d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
109df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot index in the list of allocations to return
110df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return vertex data allocation at the given index
111df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
112df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
113164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public Allocation getVertexAllocation(int slot) {
114164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mVertexBuffers[slot];
115164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
116164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
1179c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
118d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
119df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return number of primitives or index sets in the mesh
120df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
121df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
122164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public int getPrimitiveCount() {
123164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        if(mIndexBuffers == null) {
124164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return 0;
125164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
126164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mIndexBuffers.length;
127164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
128df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk
1299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
130d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
131df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot locaton within the list of index set allocation
132df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return allocation containing primtive index data or null if
133df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *         the index data is not specified explicitly
134df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
135df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
136b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public Allocation getIndexSetAllocation(int slot) {
137164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mIndexBuffers[slot];
138164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
1399c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
140d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
141df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot locaiton within the list of index set primitives
142df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return index set primitive type
143df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
144df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
145164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public Primitive getPrimitive(int slot) {
146164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mPrimitives[slot];
147164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
148164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
14980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    @Override
15080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    void updateFromNative() {
15106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
152e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS));
153e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int idxCount = mRS.nMeshGetIndexCount(getID(mRS));
15480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
1559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        long[] vtxIDs = new long[vtxCount];
1569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        long[] idxIDs = new long[idxCount];
15780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        int[] primitives = new int[idxCount];
15880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
159e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount);
160e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount);
16180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
16280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mVertexBuffers = new Allocation[vtxCount];
16380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mIndexBuffers = new Allocation[idxCount];
16480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mPrimitives = new Primitive[idxCount];
16580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
16680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        for(int i = 0; i < vtxCount; i ++) {
16780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            if(vtxIDs[i] != 0) {
168d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams                mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
16980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk                mVertexBuffers[i].updateFromNative();
17080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            }
17180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        }
17280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
17380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        for(int i = 0; i < idxCount; i ++) {
17480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            if(idxIDs[i] != 0) {
175d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams                mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
17680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk                mIndexBuffers[i].updateFromNative();
17780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            }
17880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            mPrimitives[i] = Primitive.values()[primitives[i]];
17980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        }
18080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
18180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
1829c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
183d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
18411518acc8c416023d8c2192b441a1767205676d9Robert Ly    * Mesh builder object. It starts empty and requires you to
185df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * add the types necessary to create vertex and index
18611518acc8c416023d8c2192b441a1767205676d9Robert Ly    * allocations.
187df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
188df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    */
189164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class Builder {
190164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
191d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams        int mUsage;
192164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
193164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        class Entry {
194164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Type t;
195164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Element e;
196164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            int size;
197164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Primitive prim;
198d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            int usage;
199164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
200164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
201164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVertexTypeCount;
202164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Entry[] mVertexTypes;
203164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Vector mIndexTypes;
204164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2059c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
206d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
207df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Creates builder object
208f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the mesh will belong.
209df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param usage specifies how the mesh allocations are to be
210df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              handled, whether they need to be uploaded to a
211df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              buffer on the gpu, maintain a cpu copy, etc
212df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
213d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams        public Builder(RenderScript rs, int usage) {
214164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
215d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            mUsage = usage;
216164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount = 0;
217164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes = new Entry[16];
218164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes = new Vector();
219164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
220164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
222d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
223df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last vertex buffer type added to
224df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
225df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
226b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentVertexTypeIndex() {
227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mVertexTypeCount - 1;
228b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
229b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2309c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
231d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
232df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last index set added to the
233df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
234df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
235b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentIndexSetIndex() {
236b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mIndexTypes.size() - 1;
237b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
238b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2399c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
240d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
241df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a vertex data type to the builder object
242df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
243b11e3d2b0edb03a5e3ea535d58b0cbe2d920ed16Stephen Hines        * @param t type of the vertex data allocation to be created
244df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
245df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
246df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
247b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addVertexType(Type t) throws IllegalStateException {
248164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
249164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
250164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
251164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
252164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
253164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].t = t;
254164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].e = null;
255164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
256b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
257164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
258164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2599c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
260d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
261df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a vertex data type to the builder object
262df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
263df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param e element describing the vertex data layout
264df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param size number of elements in the buffer
265df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
266df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
267df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
268b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addVertexType(Element e, int size) throws IllegalStateException {
269164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
270164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
271164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
272164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
273164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
274164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].t = null;
275164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].e = e;
276164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].size = size;
277164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
278b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
279164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
280164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2819c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
282d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
283df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set data type to the builder object
284df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
285df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param t type of the index set data, could be null
286df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
287df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
288df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
289df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
290b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Type t, Primitive p) {
291164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
292164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = t;
293164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = null;
294164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = 0;
295164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
296164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
297b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
298164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
299164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3009c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
301d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
302df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set primitive type to the builder object
303df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
304df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
305df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
306df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
307df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
308b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Primitive p) {
309164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
310164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = null;
311164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = null;
312164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = 0;
313164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
314164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
315b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
316164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
317164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
319d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
320df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set data type to the builder object
321df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
322df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param e element describing the index set data layout
323df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param size number of elements in the buffer
324df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
325df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
326df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
327df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
328b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Element e, int size, Primitive p) {
329164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
330164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = null;
331164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = e;
332164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = size;
333164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
334164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
335b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
336164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
337164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
338164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Type newType(Element e, int size) {
339164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Type.Builder tb = new Type.Builder(mRS, e);
340bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            tb.setX(size);
341164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return tb.create();
342164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
343164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3449c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
345d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
34625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        * Create a Mesh object from the current state of the builder
34725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        *
34825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        **/
34925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        public Mesh create() {
35025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            mRS.validate();
3519807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] vtx = new long[mVertexTypeCount];
3529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] idx = new long[mIndexTypes.size()];
35325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] prim = new int[mIndexTypes.size()];
354164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
35525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
35625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
35725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Primitive[] primitives = new Primitive[mIndexTypes.size()];
358164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
35925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mVertexTypeCount; ct ++) {
360164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                Allocation alloc = null;
36125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = mVertexTypes[ct];
362164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                if (entry.t != null) {
36325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createTyped(mRS, entry.t, mUsage);
36425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                } else if(entry.e != null) {
36525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
366164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                }
36725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                vertexBuffers[ct] = alloc;
3689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                vtx[ct] = alloc.getID(mRS);
369164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
370164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
37125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
372164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                Allocation alloc = null;
37325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = (Entry)mIndexTypes.elementAt(ct);
374164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                if (entry.t != null) {
37525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createTyped(mRS, entry.t, mUsage);
376164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                } else if(entry.e != null) {
37725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
378164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                }
379460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                long allocID = (alloc == null) ? 0 : alloc.getID(mRS);
38025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                indexBuffers[ct] = alloc;
38125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                primitives[ct] = entry.prim;
38225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
3839807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                idx[ct] = allocID;
38425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                prim[ct] = entry.prim.mID;
385164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
386164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
387460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = mRS.nMeshCreate(vtx, idx, prim);
38825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Mesh newMesh = new Mesh(id, mRS);
38925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mVertexBuffers = vertexBuffers;
39025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mIndexBuffers = indexBuffers;
39125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mPrimitives = primitives;
392164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
39325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            return newMesh;
394164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
395164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
396164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3979c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
398e619de6a4e4326b7662b523ea2f403801291d432Jason Sams    * @deprecated in API 16
399df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Mesh builder object. It starts empty and requires the user to
400df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * add all the vertex and index allocations that comprise the
401df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * mesh
402df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
403df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    */
404164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class AllocationBuilder {
405164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
406164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
407164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        class Entry {
408164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Allocation a;
409164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Primitive prim;
410164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
411164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
412164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVertexTypeCount;
413164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Entry[] mVertexTypes;
414164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
415164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Vector mIndexTypes;
416164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
417e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
418e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
419e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
420164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public AllocationBuilder(RenderScript rs) {
421164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
422164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount = 0;
423164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes = new Entry[16];
424164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes = new Vector();
425164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
426164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4279c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
428e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
429df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last vertex buffer type added to
430df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
431df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
432b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentVertexTypeIndex() {
433b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mVertexTypeCount - 1;
434b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
435b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
4369c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
437e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
438df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last index set added to the
439df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
440df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
441b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentIndexSetIndex() {
442b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mIndexTypes.size() - 1;
443b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
444b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
4459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
446e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
447df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an allocation containing vertex buffer data to the
448df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * builder
449df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
450df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a vertex data allocation
451df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
452df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
453df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
454b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
455164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
456164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
457164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
458164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
459164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
460164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].a = a;
461164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
462b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
463164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
464164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
466e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
467df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an allocation containing index buffer data and index type
468df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * to the builder
469df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
470df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a index set data allocation, could be null
471df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p index set primitive type
472df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
473df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
474df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
475b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
476164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
477164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.a = a;
478164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
479164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
480b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
481164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
482164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
484e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
485df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set type to the builder
486df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
487df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p index set primitive type
488df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
489df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
490df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
491b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addIndexSetType(Primitive p) {
492164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
493164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.a = null;
494164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
495164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
496b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
497164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
498164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4999c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
500e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
50125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        * Create a Mesh object from the current state of the builder
50225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        *
50325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        **/
50425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        public Mesh create() {
50525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            mRS.validate();
506164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] vtx = new long[mVertexTypeCount];
5089807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] idx = new long[mIndexTypes.size()];
50925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] prim = new int[mIndexTypes.size()];
510164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
51125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
51225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Primitive[] primitives = new Primitive[mIndexTypes.size()];
51325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
51425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
51525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mVertexTypeCount; ct ++) {
51625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = mVertexTypes[ct];
51725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                vertexBuffers[ct] = entry.a;
5189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                vtx[ct] = entry.a.getID(mRS);
519164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
520164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
52125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
52225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = (Entry)mIndexTypes.elementAt(ct);
523460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                long allocID = (entry.a == null) ? 0 : entry.a.getID(mRS);
52425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                indexBuffers[ct] = entry.a;
52525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                primitives[ct] = entry.prim;
52625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
5279807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                idx[ct] = allocID;
52825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                prim[ct] = entry.prim.mID;
529164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
530164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
531460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = mRS.nMeshCreate(vtx, idx, prim);
53225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Mesh newMesh = new Mesh(id, mRS);
53325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mVertexBuffers = vertexBuffers;
53425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mIndexBuffers = indexBuffers;
53525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mPrimitives = primitives;
536164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
53725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            return newMesh;
538164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
539164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
540164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5419c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
542e619de6a4e4326b7662b523ea2f403801291d432Jason Sams    * @deprecated in API 16
543df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Builder that allows creation of a mesh object point by point
544df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * and triangle by triangle
545df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
546df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
547164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class TriangleMeshBuilder {
548164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mVtxData[];
549164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVtxCount;
550e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk        int mMaxIndex;
551164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        short mIndexData[];
552164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mIndexCount;
553164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
554164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Element mElement;
555164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
556164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNX = 0;
557164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNY = 0;
558164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNZ = -1;
559164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mS0 = 0;
560164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mT0 = 0;
561164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mR = 1;
562164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mG = 1;
563164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mB = 1;
564164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mA = 1;
565164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
566164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVtxSize;
567164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mFlags;
568164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
569e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
570e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
571e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
572164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int COLOR = 0x0001;
573e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
574e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
575e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
576164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int NORMAL = 0x0002;
577e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
578e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
579e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
580164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int TEXTURE_0 = 0x0100;
581164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5829c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
583e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
584f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the mesh will belong.
585df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param vtxSize specifies whether the vertex is a float2 or
586df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                float3
587df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param flags bitfield that is a combination of COLOR, NORMAL,
588df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              and TEXTURE_0 that specifies what vertex data
589df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              channels are present in the mesh
590df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
591df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
592164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) {
593164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
594164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxCount = 0;
595e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mMaxIndex = 0;
596164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexCount = 0;
597164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData = new float[128];
598164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData = new short[128];
599164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxSize = vtxSize;
600164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mFlags = flags;
601164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
602164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (vtxSize < 2 || vtxSize > 3) {
603164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalArgumentException("Vertex size out of range.");
604164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
605164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
606164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
607164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        private void makeSpace(int count) {
608164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mVtxCount + count) >= mVtxData.length) {
609164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                float t[] = new float[mVtxData.length * 2];
610164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                System.arraycopy(mVtxData, 0, t, 0, mVtxData.length);
611164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData = t;
612164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
613164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
614164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
615164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        private void latch() {
616164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) != 0) {
617164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                makeSpace(4);
618164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mR;
619164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mG;
620164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mB;
621164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mA;
622164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
623164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) != 0) {
624164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                makeSpace(2);
625164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mS0;
626164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mT0;
627164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
628164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) != 0) {
629e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                makeSpace(4);
630164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNX;
631164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNY;
632164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNZ;
633e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mVtxData[mVtxCount++] = 0.0f;
634164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
635e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mMaxIndex ++;
636164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
637164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
639e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
640df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a float2 vertex to the mesh
641df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
642df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x position x
643df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y position y
644df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
645df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
646df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
647df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
648b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addVertex(float x, float y) {
649164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVtxSize != 2) {
650164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
651164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
652164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            makeSpace(2);
653164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = x;
654164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = y;
655164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            latch();
656b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
657164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
658164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6599c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
660e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
661df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a float3 vertex to the mesh
662df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
663df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x position x
664df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y position y
665df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param z position z
666df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
667df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
668df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
669df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
670b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addVertex(float x, float y, float z) {
671164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVtxSize != 3) {
672164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
673164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
674e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            makeSpace(4);
675164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = x;
676164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = y;
677164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = z;
678e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mVtxData[mVtxCount++] = 1.0f;
679164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            latch();
680b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
681164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
682164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
684e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
685f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the texture coordinate for the vertices that are added after this method call.
686df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
687df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param s texture coordinate s
688df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param t texture coordinate t
689df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
690df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
691df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
692b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setTexture(float s, float t) {
693164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) == 0) {
694164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
695164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
696164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mS0 = s;
697164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mT0 = t;
698b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
699164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
700164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7019c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
702e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
703f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the normal vector for the vertices that are added after this method call.
704df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
705df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x normal vector x
706df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y normal vector y
707df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param z normal vector z
708df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
709df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
710df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
711b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setNormal(float x, float y, float z) {
712164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) == 0) {
713164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
714164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
715164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNX = x;
716164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNY = y;
717164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNZ = z;
718b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
719164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
720164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
722e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
723f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the color for the vertices that are added after this method call.
724df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
725df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param r red component
726df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param g green component
727df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param b blue component
728df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a alpha component
729df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
730df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
731df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
732b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
733164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) == 0) {
734164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
735164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
736164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mR = r;
737164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mG = g;
738164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mB = b;
739164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mA = a;
740b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
741164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
742164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
744e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
745df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a new triangle to the mesh builder
746df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
747df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx1 index of the first vertex in the triangle
748df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx2 index of the second vertex in the triangle
749df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx3 index of the third vertex in the triangle
750df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
751df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
752df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
753b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
754e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if((idx1 >= mMaxIndex) || (idx1 < 0) ||
755e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk               (idx2 >= mMaxIndex) || (idx2 < 0) ||
756e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk               (idx3 >= mMaxIndex) || (idx3 < 0)) {
757164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk               throw new IllegalStateException("Index provided greater than vertex count.");
758164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
759164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mIndexCount + 3) >= mIndexData.length) {
760164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                short t[] = new short[mIndexData.length * 2];
761164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
762164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mIndexData = t;
763164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
764164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx1;
765164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx2;
766164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx3;
767b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
768164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
769164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7709c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
771e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
772df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Creates the mesh object from the current state of the builder
773df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
774df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param uploadToBufferObject specifies whether the vertex data
775df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             is to be uploaded into the buffer
776df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             object indicating that it's likely
777df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             not going to be modified and
778df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             rendered many times.
779df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             Alternatively, it indicates the
780df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             mesh data will be updated
781df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             frequently and remain in script
782df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             accessible memory
783df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
784df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
785164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public Mesh create(boolean uploadToBufferObject) {
786164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Element.Builder b = new Element.Builder(mRS);
787164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            b.add(Element.createVector(mRS,
788164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                                       Element.DataType.FLOAT_32,
789164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                                       mVtxSize), "position");
790164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) != 0) {
791164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_4(mRS), "color");
792164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
793164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) != 0) {
794164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_2(mRS), "texture0");
795164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
796164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) != 0) {
797164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_3(mRS), "normal");
798164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
799164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mElement = b.create();
800164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
801d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            int usage = Allocation.USAGE_SCRIPT;
802d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            if (uploadToBufferObject) {
803d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                usage |= Allocation.USAGE_GRAPHICS_VERTEX;
804d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            }
805d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams
806d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            Builder smb = new Builder(mRS, usage);
807e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            smb.addVertexType(mElement, mMaxIndex);
808b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
809164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
810164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Mesh sm = smb.create();
811164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
812e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData);
813164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if(uploadToBufferObject) {
814d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                if (uploadToBufferObject) {
815d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                    sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
816d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                }
817164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
818164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
819b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData);
820d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            if (uploadToBufferObject) {
821b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
822d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            }
823164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
824164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return sm;
825164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
826164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
827164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
828164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
829