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);
94eb4dd08ec132f83745b8b28fa7da58eb4478b5b9Yang Ni        guard.open("destroy");
95164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
96164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
979c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
98d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
99df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return number of allocations containing vertex data
100df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
101df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
102164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public int getVertexAllocationCount() {
103164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        if(mVertexBuffers == null) {
104164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return 0;
105164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
106164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mVertexBuffers.length;
107164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
1089c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
109d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
110df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot index in the list of allocations to return
111df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return vertex data allocation at the given index
112df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
113df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
114164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public Allocation getVertexAllocation(int slot) {
115164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mVertexBuffers[slot];
116164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
117164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
1189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
119d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
120df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return number of primitives or index sets in the mesh
121df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
122df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
123164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public int getPrimitiveCount() {
124164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        if(mIndexBuffers == null) {
125164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return 0;
126164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
127164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mIndexBuffers.length;
128164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
129df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk
1309c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
131d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
132df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot locaton within the list of index set allocation
133df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return allocation containing primtive index data or null if
134df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *         the index data is not specified explicitly
135df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
136df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
137b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public Allocation getIndexSetAllocation(int slot) {
138164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mIndexBuffers[slot];
139164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
1409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
141d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
142df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot locaiton within the list of index set primitives
143df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return index set primitive type
144df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
145df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
146164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public Primitive getPrimitive(int slot) {
147164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mPrimitives[slot];
148164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
149164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
15080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    @Override
15180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    void updateFromNative() {
15206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
153e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS));
154e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int idxCount = mRS.nMeshGetIndexCount(getID(mRS));
15580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
1569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        long[] vtxIDs = new long[vtxCount];
1579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        long[] idxIDs = new long[idxCount];
15880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        int[] primitives = new int[idxCount];
15980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
160e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount);
161e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount);
16280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
16380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mVertexBuffers = new Allocation[vtxCount];
16480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mIndexBuffers = new Allocation[idxCount];
16580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mPrimitives = new Primitive[idxCount];
16680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
16780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        for(int i = 0; i < vtxCount; i ++) {
16880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            if(vtxIDs[i] != 0) {
169d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams                mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
17080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk                mVertexBuffers[i].updateFromNative();
17180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            }
17280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        }
17380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
17480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        for(int i = 0; i < idxCount; i ++) {
17580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            if(idxIDs[i] != 0) {
176d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams                mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
17780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk                mIndexBuffers[i].updateFromNative();
17880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            }
17980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            mPrimitives[i] = Primitive.values()[primitives[i]];
18080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        }
18180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
18280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
1839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
184d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
18511518acc8c416023d8c2192b441a1767205676d9Robert Ly    * Mesh builder object. It starts empty and requires you to
186df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * add the types necessary to create vertex and index
18711518acc8c416023d8c2192b441a1767205676d9Robert Ly    * allocations.
188df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
189df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    */
190164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class Builder {
191164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
192d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams        int mUsage;
193164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
194164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        class Entry {
195164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Type t;
196164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Element e;
197164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            int size;
198164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Primitive prim;
199d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            int usage;
200164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
201164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
202164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVertexTypeCount;
203164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Entry[] mVertexTypes;
204164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Vector mIndexTypes;
205164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
207d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
208df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Creates builder object
209f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the mesh will belong.
210df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param usage specifies how the mesh allocations are to be
211df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              handled, whether they need to be uploaded to a
212df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              buffer on the gpu, maintain a cpu copy, etc
213df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
214d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams        public Builder(RenderScript rs, int usage) {
215164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
216d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            mUsage = usage;
217164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount = 0;
218164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes = new Entry[16];
219164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes = new Vector();
220164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
221164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
223d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
224df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last vertex buffer type added to
225df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
226df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentVertexTypeIndex() {
228b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mVertexTypeCount - 1;
229b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
230b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2319c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
232d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
233df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last index set added to the
234df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
235df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
236b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentIndexSetIndex() {
237b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mIndexTypes.size() - 1;
238b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
239b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
241d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
242df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a vertex data type to the builder object
243df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
244b11e3d2b0edb03a5e3ea535d58b0cbe2d920ed16Stephen Hines        * @param t type of the vertex data allocation to be created
245df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
246df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
247df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
248b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addVertexType(Type t) throws IllegalStateException {
249164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
250164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
251164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
252164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
253164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
254164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].t = t;
255164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].e = null;
256164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
257b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
258164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
259164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2609c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
261d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
262df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a vertex data type to the builder object
263df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
264df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param e element describing the vertex data layout
265df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param size number of elements in the buffer
266df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
267df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
268df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
269b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addVertexType(Element e, int size) throws IllegalStateException {
270164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
271164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
272164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
273164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
274164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
275164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].t = null;
276164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].e = e;
277164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].size = size;
278164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
279b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
280164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
281164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2829c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
283d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
284df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set data type to the builder object
285df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
286df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param t type of the index set data, could be null
287df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
288df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
289df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
290df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
291b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Type t, Primitive p) {
292164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
293164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = t;
294164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = null;
295164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = 0;
296164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
297164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
298b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
299164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
300164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3019c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
302d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
303df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set primitive type to the builder object
304df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
305df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
306df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
307df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
308df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
309b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Primitive p) {
310164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
311164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = null;
312164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = null;
313164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = 0;
314164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
315164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
316b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
317164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
318164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
320d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
321df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set data type to the builder object
322df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
323df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param e element describing the index set data layout
324df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param size number of elements in the buffer
325df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
326df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
327df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
328df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
329b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Element e, int size, Primitive p) {
330164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
331164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = null;
332164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = e;
333164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = size;
334164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
335164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
336b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
337164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
338164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
339164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Type newType(Element e, int size) {
340164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Type.Builder tb = new Type.Builder(mRS, e);
341bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            tb.setX(size);
342164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return tb.create();
343164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
344164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
346d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
34725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        * Create a Mesh object from the current state of the builder
34825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        *
34925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        **/
35025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        public Mesh create() {
35125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            mRS.validate();
3529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] vtx = new long[mVertexTypeCount];
3539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] idx = new long[mIndexTypes.size()];
35425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] prim = new int[mIndexTypes.size()];
355164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
35625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
35725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
35825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Primitive[] primitives = new Primitive[mIndexTypes.size()];
359164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
36025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mVertexTypeCount; ct ++) {
361164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                Allocation alloc = null;
36225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = mVertexTypes[ct];
363164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                if (entry.t != null) {
36425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createTyped(mRS, entry.t, mUsage);
36525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                } else if(entry.e != null) {
36625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
367ae5be38ebbfdfa3a6ff18a5ced00e57adefd7348Jason Sams                } else {
368ae5be38ebbfdfa3a6ff18a5ced00e57adefd7348Jason Sams                    // Should never happen because the builder will always set one
369ae5be38ebbfdfa3a6ff18a5ced00e57adefd7348Jason Sams                    throw new IllegalStateException("Builder corrupt, no valid element in entry.");
370164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                }
37125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                vertexBuffers[ct] = alloc;
3729807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                vtx[ct] = alloc.getID(mRS);
373164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
374164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
37525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
376164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                Allocation alloc = null;
37725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = (Entry)mIndexTypes.elementAt(ct);
378164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                if (entry.t != null) {
37925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createTyped(mRS, entry.t, mUsage);
380164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                } else if(entry.e != null) {
38125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
382ae5be38ebbfdfa3a6ff18a5ced00e57adefd7348Jason Sams                } else {
383ae5be38ebbfdfa3a6ff18a5ced00e57adefd7348Jason Sams                    // Should never happen because the builder will always set one
384ae5be38ebbfdfa3a6ff18a5ced00e57adefd7348Jason Sams                    throw new IllegalStateException("Builder corrupt, no valid element in entry.");
385164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                }
386460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                long allocID = (alloc == null) ? 0 : alloc.getID(mRS);
38725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                indexBuffers[ct] = alloc;
38825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                primitives[ct] = entry.prim;
38925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
3909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                idx[ct] = allocID;
39125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                prim[ct] = entry.prim.mID;
392164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
393164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
394460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = mRS.nMeshCreate(vtx, idx, prim);
39525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Mesh newMesh = new Mesh(id, mRS);
39625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mVertexBuffers = vertexBuffers;
39725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mIndexBuffers = indexBuffers;
39825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mPrimitives = primitives;
399164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
40025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            return newMesh;
401164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
402164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
403164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4049c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
405e619de6a4e4326b7662b523ea2f403801291d432Jason Sams    * @deprecated in API 16
406df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Mesh builder object. It starts empty and requires the user to
407df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * add all the vertex and index allocations that comprise the
408df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * mesh
409df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
410df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    */
411164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class AllocationBuilder {
412164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
413164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
414164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        class Entry {
415164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Allocation a;
416164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Primitive prim;
417164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
418164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
419164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVertexTypeCount;
420164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Entry[] mVertexTypes;
421164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
422164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Vector mIndexTypes;
423164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
424e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
425e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
426e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
427164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public AllocationBuilder(RenderScript rs) {
428164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
429164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount = 0;
430164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes = new Entry[16];
431164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes = new Vector();
432164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
433164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4349c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
435e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
436df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last vertex buffer type added to
437df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
438df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
439b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentVertexTypeIndex() {
440b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mVertexTypeCount - 1;
441b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
442b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
4439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
444e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
445df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last index set added to the
446df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
447df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
448b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentIndexSetIndex() {
449b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mIndexTypes.size() - 1;
450b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
451b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
4529c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
453e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
454df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an allocation containing vertex buffer data to the
455df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * builder
456df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
457df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a vertex data allocation
458df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
459df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
460df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
461b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
462164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
463164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
464164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
465164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
466164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
467164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].a = a;
468164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
469b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
470164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
471164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
473e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
474df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an allocation containing index buffer data and index type
475df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * to the builder
476df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
477df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a index set data allocation, could be null
478df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p index set primitive type
479df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
480df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
481df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
482b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
483164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
484164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.a = a;
485164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
486164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
487b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
488164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
489164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4909c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
491e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
492df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set type to the builder
493df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
494df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p index set primitive type
495df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
496df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
497df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
498b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addIndexSetType(Primitive p) {
499164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
500164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.a = null;
501164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
502164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
503b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
504164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
505164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
507e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
50825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        * Create a Mesh object from the current state of the builder
50925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        *
51025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        **/
51125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        public Mesh create() {
51225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            mRS.validate();
513164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] vtx = new long[mVertexTypeCount];
5159807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] idx = new long[mIndexTypes.size()];
51625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] prim = new int[mIndexTypes.size()];
517164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
51825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
51925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Primitive[] primitives = new Primitive[mIndexTypes.size()];
52025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
52125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
52225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mVertexTypeCount; ct ++) {
52325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = mVertexTypes[ct];
52425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                vertexBuffers[ct] = entry.a;
5259807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                vtx[ct] = entry.a.getID(mRS);
526164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
527164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
52825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
52925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = (Entry)mIndexTypes.elementAt(ct);
530460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                long allocID = (entry.a == null) ? 0 : entry.a.getID(mRS);
53125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                indexBuffers[ct] = entry.a;
53225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                primitives[ct] = entry.prim;
53325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
5349807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                idx[ct] = allocID;
53525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                prim[ct] = entry.prim.mID;
536164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
537164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
538460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = mRS.nMeshCreate(vtx, idx, prim);
53925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Mesh newMesh = new Mesh(id, mRS);
54025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mVertexBuffers = vertexBuffers;
54125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mIndexBuffers = indexBuffers;
54225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mPrimitives = primitives;
543164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
54425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            return newMesh;
545164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
546164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
547164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
549e619de6a4e4326b7662b523ea2f403801291d432Jason Sams    * @deprecated in API 16
550df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Builder that allows creation of a mesh object point by point
551df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * and triangle by triangle
552df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
553df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
554164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class TriangleMeshBuilder {
555164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mVtxData[];
556164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVtxCount;
557e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk        int mMaxIndex;
558164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        short mIndexData[];
559164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mIndexCount;
560164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
561164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Element mElement;
562164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
563164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNX = 0;
564164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNY = 0;
565164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNZ = -1;
566164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mS0 = 0;
567164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mT0 = 0;
568164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mR = 1;
569164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mG = 1;
570164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mB = 1;
571164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mA = 1;
572164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
573164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVtxSize;
574164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mFlags;
575164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
576e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
577e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
578e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
579164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int COLOR = 0x0001;
580e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
581e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
582e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
583164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int NORMAL = 0x0002;
584e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
585e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
586e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
587164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int TEXTURE_0 = 0x0100;
588164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
590e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
591f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the mesh will belong.
592df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param vtxSize specifies whether the vertex is a float2 or
593df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                float3
594df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param flags bitfield that is a combination of COLOR, NORMAL,
595df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              and TEXTURE_0 that specifies what vertex data
596df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              channels are present in the mesh
597df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
598df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
599164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) {
600164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
601164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxCount = 0;
602e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mMaxIndex = 0;
603164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexCount = 0;
604164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData = new float[128];
605164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData = new short[128];
606164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxSize = vtxSize;
607164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mFlags = flags;
608164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
609164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (vtxSize < 2 || vtxSize > 3) {
610164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalArgumentException("Vertex size out of range.");
611164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
612164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
613164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
614164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        private void makeSpace(int count) {
615164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mVtxCount + count) >= mVtxData.length) {
616164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                float t[] = new float[mVtxData.length * 2];
617164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                System.arraycopy(mVtxData, 0, t, 0, mVtxData.length);
618164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData = t;
619164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
620164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
621164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
622164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        private void latch() {
623164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) != 0) {
624164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                makeSpace(4);
625164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mR;
626164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mG;
627164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mB;
628164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mA;
629164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
630164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) != 0) {
631164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                makeSpace(2);
632164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mS0;
633164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mT0;
634164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
635164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) != 0) {
636e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                makeSpace(4);
637164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNX;
638164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNY;
639164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNZ;
640e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mVtxData[mVtxCount++] = 0.0f;
641164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
642e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mMaxIndex ++;
643164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
644164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
646e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
647df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a float2 vertex to the mesh
648df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
649df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x position x
650df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y position y
651df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
652df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
653df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
654df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
655b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addVertex(float x, float y) {
656164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVtxSize != 2) {
657164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
658164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
659164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            makeSpace(2);
660164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = x;
661164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = y;
662164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            latch();
663b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
664164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
665164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
667e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
668df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a float3 vertex to the mesh
669df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
670df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x position x
671df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y position y
672df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param z position z
673df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
674df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
675df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
676df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
677b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addVertex(float x, float y, float z) {
678164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVtxSize != 3) {
679164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
680164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
681e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            makeSpace(4);
682164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = x;
683164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = y;
684164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = z;
685e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mVtxData[mVtxCount++] = 1.0f;
686164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            latch();
687b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
688164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
689164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6909c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
691e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
692f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the texture coordinate for the vertices that are added after this method call.
693df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
694df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param s texture coordinate s
695df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param t texture coordinate t
696df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
697df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
698df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
699b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setTexture(float s, float t) {
700164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) == 0) {
701164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
702164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
703164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mS0 = s;
704164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mT0 = t;
705b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
706164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
707164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7089c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
709e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
710f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the normal vector for the vertices that are added after this method call.
711df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
712df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x normal vector x
713df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y normal vector y
714df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param z normal vector z
715df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
716df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
717df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
718b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setNormal(float x, float y, float z) {
719164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) == 0) {
720164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
721164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
722164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNX = x;
723164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNY = y;
724164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNZ = z;
725b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
726164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
727164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7289c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
729e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
730f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the color for the vertices that are added after this method call.
731df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
732df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param r red component
733df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param g green component
734df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param b blue component
735df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a alpha component
736df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
737df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
738df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
739b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
740164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) == 0) {
741164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
742164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
743164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mR = r;
744164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mG = g;
745164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mB = b;
746164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mA = a;
747b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
748164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
749164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7509c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
751e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
752df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a new triangle to the mesh builder
753df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
754df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx1 index of the first vertex in the triangle
755df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx2 index of the second vertex in the triangle
756df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx3 index of the third vertex in the triangle
757df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
758df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
759df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
760b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
761e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if((idx1 >= mMaxIndex) || (idx1 < 0) ||
762e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk               (idx2 >= mMaxIndex) || (idx2 < 0) ||
763e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk               (idx3 >= mMaxIndex) || (idx3 < 0)) {
764164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk               throw new IllegalStateException("Index provided greater than vertex count.");
765164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
766164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mIndexCount + 3) >= mIndexData.length) {
767164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                short t[] = new short[mIndexData.length * 2];
768164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
769164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mIndexData = t;
770164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
771164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx1;
772164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx2;
773164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx3;
774b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
775164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
776164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7779c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
778e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
779df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Creates the mesh object from the current state of the builder
780df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
781df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param uploadToBufferObject specifies whether the vertex data
782df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             is to be uploaded into the buffer
783df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             object indicating that it's likely
784df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             not going to be modified and
785df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             rendered many times.
786df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             Alternatively, it indicates the
787df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             mesh data will be updated
788df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             frequently and remain in script
789df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             accessible memory
790df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
791df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
792164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public Mesh create(boolean uploadToBufferObject) {
793164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Element.Builder b = new Element.Builder(mRS);
794164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            b.add(Element.createVector(mRS,
795164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                                       Element.DataType.FLOAT_32,
796164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                                       mVtxSize), "position");
797164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) != 0) {
798164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_4(mRS), "color");
799164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
800164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) != 0) {
801164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_2(mRS), "texture0");
802164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
803164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) != 0) {
804164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_3(mRS), "normal");
805164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
806164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mElement = b.create();
807164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
808d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            int usage = Allocation.USAGE_SCRIPT;
809d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            if (uploadToBufferObject) {
810d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                usage |= Allocation.USAGE_GRAPHICS_VERTEX;
811d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            }
812d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams
813d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            Builder smb = new Builder(mRS, usage);
814e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            smb.addVertexType(mElement, mMaxIndex);
815b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
816164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
817164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Mesh sm = smb.create();
818164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
819e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData);
820164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if(uploadToBufferObject) {
82116720c184946f3665dd034abaef2d648efdae627Andreas Gampe                sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
822164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
823164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
824b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData);
825d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            if (uploadToBufferObject) {
826b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
827d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            }
828164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
829164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return sm;
830164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
831164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
832164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
833164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
834