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
21164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchoukimport android.util.Log;
22164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
24a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide
25d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams * @deprecated in API 16
2611518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>This class is a container for geometric data displayed with
27c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * RenderScript. Internally, a mesh is a collection of allocations that
28df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * represent vertex data (positions, normals, texture
2911518acc8c416023d8c2192b441a1767205676d9Robert Ly * coordinates) and index data such as triangles and lines. </p>
3011518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>
3111518acc8c416023d8c2192b441a1767205676d9Robert Ly * Vertex data could either be interleaved within one
3211518acc8c416023d8c2192b441a1767205676d9Robert Ly * allocation that is provided separately, as multiple allocation
3311518acc8c416023d8c2192b441a1767205676d9Robert Ly * objects, or done as a combination of both. When a
34df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * vertex channel name matches an input in the vertex program,
35c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * RenderScript automatically connects the two together.
3611518acc8c416023d8c2192b441a1767205676d9Robert Ly * </p>
3711518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>
3811518acc8c416023d8c2192b441a1767205676d9Robert Ly *  Parts of the mesh can be rendered with either explicit
39df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk *  index sets or primitive types.
4011518acc8c416023d8c2192b441a1767205676d9Robert Ly * </p>
41164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk **/
42164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchoukpublic class Mesh extends BaseObj {
43164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
449c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
45d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
46df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Describes the way mesh vertex data is interpreted when rendering
47df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
48df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
49b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public enum Primitive {
509c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
51d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
52ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertex data will be rendered as a series of points
53ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
54b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        POINT (0),
559c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
56d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
57ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertex pairs will be rendered as lines
58ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
59b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        LINE (1),
609c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
61d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
62ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertex data will be rendered as a connected line strip
63ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
64b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        LINE_STRIP (2),
659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
66d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
67ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertices will be rendered as individual triangles
68ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
69b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        TRIANGLE (3),
709c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
71d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
72ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertices will be rendered as a connected triangle strip
73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * defined by the first three vertices with each additional
74ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * triangle defined by a new vertex
75ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
76b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        TRIANGLE_STRIP (4),
779c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
78d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
79ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Vertices will be rendered as a sequence of triangles that all
80ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * share first vertex as the origin
81ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        */
82b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        TRIANGLE_FAN (5);
83b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
84b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        int mID;
85b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Primitive(int id) {
86b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mID = id;
87b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
88b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
89b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
90164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Allocation[] mVertexBuffers;
91164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Allocation[] mIndexBuffers;
92164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Primitive[] mPrimitives;
93164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
94164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    Mesh(int id, RenderScript rs) {
950de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
96164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
97164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
989c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
99d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
100df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return number of allocations containing vertex data
101df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
102df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
103164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public int getVertexAllocationCount() {
104164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        if(mVertexBuffers == null) {
105164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return 0;
106164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
107164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mVertexBuffers.length;
108164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
1099c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
110d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
111df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot index in the list of allocations to return
112df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return vertex data allocation at the given index
113df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
114df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
115164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public Allocation getVertexAllocation(int slot) {
116164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mVertexBuffers[slot];
117164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
118164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
1199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
120d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
121df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return number of primitives or index sets in the mesh
122df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
123df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
124164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public int getPrimitiveCount() {
125164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        if(mIndexBuffers == null) {
126164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return 0;
127164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
128164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mIndexBuffers.length;
129164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
130df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk
1319c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
132d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
133df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot locaton within the list of index set allocation
134df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return allocation containing primtive index data or null if
135df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *         the index data is not specified explicitly
136df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
137df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
138b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public Allocation getIndexSetAllocation(int slot) {
139164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mIndexBuffers[slot];
140164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
1419c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
142d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
143df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @param slot locaiton within the list of index set primitives
144df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * @return index set primitive type
145df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
146df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
147164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public Primitive getPrimitive(int slot) {
148164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        return mPrimitives[slot];
149164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
150164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
15180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    @Override
15280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    void updateFromNative() {
15306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
154e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS));
155e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int idxCount = mRS.nMeshGetIndexCount(getID(mRS));
15680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
15780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        int[] vtxIDs = new int[vtxCount];
15880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        int[] idxIDs = new int[idxCount];
15980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        int[] primitives = new int[idxCount];
16080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
161e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount);
162e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount);
16380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
16480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mVertexBuffers = new Allocation[vtxCount];
16580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mIndexBuffers = new Allocation[idxCount];
16680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        mPrimitives = new Primitive[idxCount];
16780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
16880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        for(int i = 0; i < vtxCount; i ++) {
16980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            if(vtxIDs[i] != 0) {
170d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams                mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
17180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk                mVertexBuffers[i].updateFromNative();
17280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            }
17380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        }
17480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
17580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        for(int i = 0; i < idxCount; i ++) {
17680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            if(idxIDs[i] != 0) {
177d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams                mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
17880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk                mIndexBuffers[i].updateFromNative();
17980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            }
18080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk            mPrimitives[i] = Primitive.values()[primitives[i]];
18180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk        }
18280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
18380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
1849c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
185d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    * @deprecated in API 16
18611518acc8c416023d8c2192b441a1767205676d9Robert Ly    * Mesh builder object. It starts empty and requires you to
187df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * add the types necessary to create vertex and index
18811518acc8c416023d8c2192b441a1767205676d9Robert Ly    * allocations.
189df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
190df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    */
191164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class Builder {
192164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
193d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams        int mUsage;
194164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
195164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        class Entry {
196164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Type t;
197164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Element e;
198164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            int size;
199164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Primitive prim;
200d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            int usage;
201164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
202164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
203164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVertexTypeCount;
204164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Entry[] mVertexTypes;
205164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Vector mIndexTypes;
206164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
208d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
209df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Creates builder object
210f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the mesh will belong.
211df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param usage specifies how the mesh allocations are to be
212df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              handled, whether they need to be uploaded to a
213df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              buffer on the gpu, maintain a cpu copy, etc
214df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
215d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams        public Builder(RenderScript rs, int usage) {
216164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
217d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            mUsage = usage;
218164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount = 0;
219164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes = new Entry[16];
220164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes = new Vector();
221164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
222164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
224d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
225df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last vertex buffer type added to
226df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
227df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
228b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentVertexTypeIndex() {
229b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mVertexTypeCount - 1;
230b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
231b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2329c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
233d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
234df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last index set added to the
235df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
236df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
237b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentIndexSetIndex() {
238b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mIndexTypes.size() - 1;
239b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
240b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2419c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
242d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
243df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a vertex data type to the builder object
244df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
245b11e3d2b0edb03a5e3ea535d58b0cbe2d920ed16Stephen Hines        * @param t type of the vertex data allocation to be created
246df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
247df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
248df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
249b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addVertexType(Type t) throws IllegalStateException {
250164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
251164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
252164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
253164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
254164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
255164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].t = t;
256164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].e = null;
257164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
258b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
259164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
260164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2619c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
262d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
263df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a vertex data type to the builder object
264df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
265df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param e element describing the vertex data layout
266df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param size number of elements in the buffer
267df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
268df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
269df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
270b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addVertexType(Element e, int size) throws IllegalStateException {
271164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
272164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
273164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
274164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
275164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
276164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].t = null;
277164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].e = e;
278164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].size = size;
279164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
280b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
281164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
282164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
284d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
285df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set data type to the builder object
286df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
287df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param t type of the index set data, could be null
288df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
289df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
290df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
291df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
292b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Type t, Primitive p) {
293164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
294164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = t;
295164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = null;
296164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = 0;
297164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
298164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
299b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
300164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
301164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
303d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
304df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set primitive type to the builder object
305df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
306df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
307df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
308df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
309df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
310b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Primitive p) {
311164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
312164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = null;
313164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = null;
314164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = 0;
315164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
316164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
317b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
318164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
319164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
321d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
322df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set data type to the builder object
323df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
324df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param e element describing the index set data layout
325df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param size number of elements in the buffer
326df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p primitive type
327df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
328df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
329df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
330b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder addIndexSetType(Element e, int size, Primitive p) {
331164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
332164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.t = null;
333164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.e = e;
334164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.size = size;
335164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
336164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
337b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
338164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
339164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
340164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Type newType(Element e, int size) {
341164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Type.Builder tb = new Type.Builder(mRS, e);
342bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            tb.setX(size);
343164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return tb.create();
344164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
345164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
347d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams        * @deprecated in API 16
34825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        * Create a Mesh object from the current state of the builder
34925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        *
35025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        **/
35125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        public Mesh create() {
35225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            mRS.validate();
35325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] vtx = new int[mVertexTypeCount];
35425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] idx = new int[mIndexTypes.size()];
35525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] prim = new int[mIndexTypes.size()];
356164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
35725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
35825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
35925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Primitive[] primitives = new Primitive[mIndexTypes.size()];
360164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
36125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mVertexTypeCount; ct ++) {
362164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                Allocation alloc = null;
36325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = mVertexTypes[ct];
364164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                if (entry.t != null) {
36525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createTyped(mRS, entry.t, mUsage);
36625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                } else if(entry.e != null) {
36725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
368164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                }
36925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                vertexBuffers[ct] = alloc;
370e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                vtx[ct] = alloc.getID(mRS);
371164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
372164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
37325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
374164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                Allocation alloc = null;
37525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = (Entry)mIndexTypes.elementAt(ct);
376164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                if (entry.t != null) {
37725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createTyped(mRS, entry.t, mUsage);
378164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                } else if(entry.e != null) {
37925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                    alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
380164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                }
381e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                int allocID = (alloc == null) ? 0 : alloc.getID(mRS);
38225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                indexBuffers[ct] = alloc;
38325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                primitives[ct] = entry.prim;
38425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
38525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                idx[ct] = allocID;
38625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                prim[ct] = entry.prim.mID;
387164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
388164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
38925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int id = mRS.nMeshCreate(vtx, idx, prim);
39025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Mesh newMesh = new Mesh(id, mRS);
39125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mVertexBuffers = vertexBuffers;
39225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mIndexBuffers = indexBuffers;
39325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mPrimitives = primitives;
394164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
39525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            return newMesh;
396164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
397164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
398164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
3999c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
400e619de6a4e4326b7662b523ea2f403801291d432Jason Sams    * @deprecated in API 16
401df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Mesh builder object. It starts empty and requires the user to
402df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * add all the vertex and index allocations that comprise the
403df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * mesh
404df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
405df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    */
406164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class AllocationBuilder {
407164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
408164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
409164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        class Entry {
410164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Allocation a;
411164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Primitive prim;
412164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
413164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
414164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVertexTypeCount;
415164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Entry[] mVertexTypes;
416164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
417164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Vector mIndexTypes;
418164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
419e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
420e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
421e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
422164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public AllocationBuilder(RenderScript rs) {
423164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
424164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount = 0;
425164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes = new Entry[16];
426164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes = new Vector();
427164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
428164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
430e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
431df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last vertex buffer type added to
432df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
433df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
434b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentVertexTypeIndex() {
435b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mVertexTypeCount - 1;
436b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
437b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
4389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
439e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
440df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return internal index of the last index set added to the
441df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *         builder
442df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
443b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public int getCurrentIndexSetIndex() {
444b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mIndexTypes.size() - 1;
445b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
446b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
4479c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
448e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
449df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an allocation containing vertex buffer data to the
450df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * builder
451df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
452df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a vertex data allocation
453df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
454df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
455df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
456b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
457164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVertexTypeCount >= mVertexTypes.length) {
458164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("Max vertex types exceeded.");
459164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
460164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
461164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount] = new Entry();
462164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypes[mVertexTypeCount].a = a;
463164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVertexTypeCount++;
464b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
465164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
466164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4679c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
468e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
469df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an allocation containing index buffer data and index type
470df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * to the builder
471df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
472df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a index set data allocation, could be null
473df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p index set primitive type
474df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
475df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
476df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
477b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
478164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
479164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.a = a;
480164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
481164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
482b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
483164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
484164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
4859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
486e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
487df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds an index set type to the builder
488df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
489df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param p index set primitive type
490df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
491df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
492df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
493b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public AllocationBuilder addIndexSetType(Primitive p) {
494164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Entry indexType = new Entry();
495164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.a = null;
496164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            indexType.prim = p;
497164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexTypes.addElement(indexType);
498b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
499164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
500164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5019c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
502e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
50325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        * Create a Mesh object from the current state of the builder
50425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        *
50525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        **/
50625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk        public Mesh create() {
50725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            mRS.validate();
508164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
50925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] vtx = new int[mVertexTypeCount];
51025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] idx = new int[mIndexTypes.size()];
51125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int[] prim = new int[mIndexTypes.size()];
512164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
51325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
51425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Primitive[] primitives = new Primitive[mIndexTypes.size()];
51525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
51625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
51725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mVertexTypeCount; ct ++) {
51825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = mVertexTypes[ct];
51925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                vertexBuffers[ct] = entry.a;
520e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                vtx[ct] = entry.a.getID(mRS);
521164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
522164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
52325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
52425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                Entry entry = (Entry)mIndexTypes.elementAt(ct);
525e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                int allocID = (entry.a == null) ? 0 : entry.a.getID(mRS);
52625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                indexBuffers[ct] = entry.a;
52725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                primitives[ct] = entry.prim;
52825999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk
52925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                idx[ct] = allocID;
53025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                prim[ct] = entry.prim.mID;
531164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
532164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
53325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            int id = mRS.nMeshCreate(vtx, idx, prim);
53425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            Mesh newMesh = new Mesh(id, mRS);
53525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mVertexBuffers = vertexBuffers;
53625999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mIndexBuffers = indexBuffers;
53725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            newMesh.mPrimitives = primitives;
538164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
53925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk            return newMesh;
540164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
541164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
542164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
544e619de6a4e4326b7662b523ea2f403801291d432Jason Sams    * @deprecated in API 16
545df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * Builder that allows creation of a mesh object point by point
546df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    * and triangle by triangle
547df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    *
548df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk    **/
549164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    public static class TriangleMeshBuilder {
550164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mVtxData[];
551164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVtxCount;
552e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk        int mMaxIndex;
553164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        short mIndexData[];
554164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mIndexCount;
555164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        RenderScript mRS;
556164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        Element mElement;
557164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
558164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNX = 0;
559164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNY = 0;
560164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mNZ = -1;
561164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mS0 = 0;
562164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mT0 = 0;
563164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mR = 1;
564164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mG = 1;
565164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mB = 1;
566164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        float mA = 1;
567164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
568164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mVtxSize;
569164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        int mFlags;
570164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
571e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
572e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
573e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
574164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int COLOR = 0x0001;
575e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
576e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
577e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
578164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int NORMAL = 0x0002;
579e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        /**
580e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
581e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        **/
582164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public static final int TEXTURE_0 = 0x0100;
583164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
5849c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
585e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
586f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the mesh will belong.
587df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param vtxSize specifies whether the vertex is a float2 or
588df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                float3
589df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param flags bitfield that is a combination of COLOR, NORMAL,
590df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              and TEXTURE_0 that specifies what vertex data
591df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *              channels are present in the mesh
592df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
593df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
594164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) {
595164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mRS = rs;
596164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxCount = 0;
597e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mMaxIndex = 0;
598164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexCount = 0;
599164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData = new float[128];
600164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData = new short[128];
601164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxSize = vtxSize;
602164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mFlags = flags;
603164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
604164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (vtxSize < 2 || vtxSize > 3) {
605164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalArgumentException("Vertex size out of range.");
606164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
607164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
608164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
609164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        private void makeSpace(int count) {
610164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mVtxCount + count) >= mVtxData.length) {
611164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                float t[] = new float[mVtxData.length * 2];
612164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                System.arraycopy(mVtxData, 0, t, 0, mVtxData.length);
613164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData = t;
614164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
615164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
616164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
617164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        private void latch() {
618164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) != 0) {
619164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                makeSpace(4);
620164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mR;
621164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mG;
622164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mB;
623164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mA;
624164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
625164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) != 0) {
626164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                makeSpace(2);
627164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mS0;
628164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mT0;
629164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
630164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) != 0) {
631e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                makeSpace(4);
632164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNX;
633164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNY;
634164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mVtxData[mVtxCount++] = mNZ;
635e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mVtxData[mVtxCount++] = 0.0f;
636164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
637e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mMaxIndex ++;
638164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
639164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
641e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
642df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a float2 vertex to the mesh
643df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
644df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x position x
645df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y position y
646df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
647df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
648df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
649df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
650b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addVertex(float x, float y) {
651164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVtxSize != 2) {
652164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
653164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
654164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            makeSpace(2);
655164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = x;
656164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = y;
657164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            latch();
658b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
659164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
660164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6619c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
662e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
663df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a float3 vertex to the mesh
664df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
665df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x position x
666df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y position y
667df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param z position z
668df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
669df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
670df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
671df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
672b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addVertex(float x, float y, float z) {
673164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if (mVtxSize != 3) {
674164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
675164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
676e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            makeSpace(4);
677164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = x;
678164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = y;
679164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mVtxData[mVtxCount++] = z;
680e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            mVtxData[mVtxCount++] = 1.0f;
681164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            latch();
682b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
683164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
684164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
6859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
686e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
687f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the texture coordinate for the vertices that are added after this method call.
688df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
689df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param s texture coordinate s
690df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param t texture coordinate t
691df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
692df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
693df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
694b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setTexture(float s, float t) {
695164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) == 0) {
696164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
697164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
698164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mS0 = s;
699164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mT0 = t;
700b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
701164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
702164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7039c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
704e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
705f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the normal vector for the vertices that are added after this method call.
706df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
707df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param x normal vector x
708df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param y normal vector y
709df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param z normal vector z
710df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
711df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
712df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
713b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setNormal(float x, float y, float z) {
714164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) == 0) {
715164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
716164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
717164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNX = x;
718164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNY = y;
719164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mNZ = z;
720b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
721164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
722164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
724e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
725f11ffc1178645762b74f945b6c5ee068dc6000d3Robert Ly        * Sets the color for the vertices that are added after this method call.
726df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
727df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param r red component
728df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param g green component
729df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param b blue component
730df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param a alpha component
731df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
732df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
733df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
734b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
735164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) == 0) {
736164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                throw new IllegalStateException("add mistmatch with declared components.");
737164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
738164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mR = r;
739164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mG = g;
740164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mB = b;
741164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mA = a;
742b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
743164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
744164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
746e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
747df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Adds a new triangle to the mesh builder
748df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
749df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx1 index of the first vertex in the triangle
750df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx2 index of the second vertex in the triangle
751df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param idx3 index of the third vertex in the triangle
752df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
753df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @return this
754df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
755b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
756e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if((idx1 >= mMaxIndex) || (idx1 < 0) ||
757e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk               (idx2 >= mMaxIndex) || (idx2 < 0) ||
758e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk               (idx3 >= mMaxIndex) || (idx3 < 0)) {
759164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk               throw new IllegalStateException("Index provided greater than vertex count.");
760164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
761164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mIndexCount + 3) >= mIndexData.length) {
762164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                short t[] = new short[mIndexData.length * 2];
763164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
764164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                mIndexData = t;
765164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
766164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx1;
767164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx2;
768164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mIndexData[mIndexCount++] = (short)idx3;
769b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
770164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
771164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
7729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
773e619de6a4e4326b7662b523ea2f403801291d432Jason Sams        * @deprecated in API 16
774df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Creates the mesh object from the current state of the builder
775df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
776df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param uploadToBufferObject specifies whether the vertex data
777df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             is to be uploaded into the buffer
778df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             object indicating that it's likely
779df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             not going to be modified and
780df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             rendered many times.
781df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             Alternatively, it indicates the
782df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             mesh data will be updated
783df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             frequently and remain in script
784df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *                             accessible memory
785df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
786df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
787164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        public Mesh create(boolean uploadToBufferObject) {
788164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Element.Builder b = new Element.Builder(mRS);
789164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            b.add(Element.createVector(mRS,
790164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                                       Element.DataType.FLOAT_32,
791164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                                       mVtxSize), "position");
792164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & COLOR) != 0) {
793164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_4(mRS), "color");
794164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
795164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & TEXTURE_0) != 0) {
796164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_2(mRS), "texture0");
797164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
798164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if ((mFlags & NORMAL) != 0) {
799164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk                b.add(Element.F32_3(mRS), "normal");
800164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
801164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            mElement = b.create();
802164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
803d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            int usage = Allocation.USAGE_SCRIPT;
804d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            if (uploadToBufferObject) {
805d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                usage |= Allocation.USAGE_GRAPHICS_VERTEX;
806d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            }
807d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams
808d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            Builder smb = new Builder(mRS, usage);
809e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            smb.addVertexType(mElement, mMaxIndex);
810b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
811164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
812164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            Mesh sm = smb.create();
813164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
814e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData);
815164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            if(uploadToBufferObject) {
816d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                if (uploadToBufferObject) {
817d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                    sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
818d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams                }
819164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            }
820164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
821b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData);
822d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            if (uploadToBufferObject) {
823b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
824d19524047fa2d12ecd45ebcf69543836e1b45579Jason Sams            }
825164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
826164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk            return sm;
827164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk        }
828164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    }
829164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
830164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
831