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