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