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