1 /* 2 * Copyright (C) 2008-2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.renderscript; 18 19 import java.util.Vector; 20 21 import android.util.Log; 22 23 /** 24 * @deprecated in API 16 25 * <p>This class is a container for geometric data displayed with 26 * Renderscript. Internally, a mesh is a collection of allocations that 27 * represent vertex data (positions, normals, texture 28 * coordinates) and index data such as triangles and lines. </p> 29 * <p> 30 * Vertex data could either be interleaved within one 31 * allocation that is provided separately, as multiple allocation 32 * objects, or done as a combination of both. When a 33 * vertex channel name matches an input in the vertex program, 34 * Renderscript automatically connects the two together. 35 * </p> 36 * <p> 37 * Parts of the mesh can be rendered with either explicit 38 * index sets or primitive types. 39 * </p> 40 **/ 41 public class Mesh extends BaseObj { 42 43 /** 44 * @deprecated in API 16 45 * Describes the way mesh vertex data is interpreted when rendering 46 * 47 **/ 48 public enum Primitive { 49 /** 50 * @deprecated in API 16 51 * Vertex data will be rendered as a series of points 52 */ 53 POINT (0), 54 /** 55 * @deprecated in API 16 56 * Vertex pairs will be rendered as lines 57 */ 58 LINE (1), 59 /** 60 * @deprecated in API 16 61 * Vertex data will be rendered as a connected line strip 62 */ 63 LINE_STRIP (2), 64 /** 65 * @deprecated in API 16 66 * Vertices will be rendered as individual triangles 67 */ 68 TRIANGLE (3), 69 /** 70 * @deprecated in API 16 71 * Vertices will be rendered as a connected triangle strip 72 * defined by the first three vertices with each additional 73 * triangle defined by a new vertex 74 */ 75 TRIANGLE_STRIP (4), 76 /** 77 * @deprecated in API 16 78 * Vertices will be rendered as a sequence of triangles that all 79 * share first vertex as the origin 80 */ 81 TRIANGLE_FAN (5); 82 83 int mID; Primitive(int id)84 Primitive(int id) { 85 mID = id; 86 } 87 } 88 89 Allocation[] mVertexBuffers; 90 Allocation[] mIndexBuffers; 91 Primitive[] mPrimitives; 92 Mesh(int id, RenderScript rs)93 Mesh(int id, RenderScript rs) { 94 super(id, rs); 95 } 96 97 /** 98 * @deprecated in API 16 99 * @return number of allocations containing vertex data 100 * 101 **/ getVertexAllocationCount()102 public int getVertexAllocationCount() { 103 if(mVertexBuffers == null) { 104 return 0; 105 } 106 return mVertexBuffers.length; 107 } 108 /** 109 * @deprecated in API 16 110 * @param slot index in the list of allocations to return 111 * @return vertex data allocation at the given index 112 * 113 **/ getVertexAllocation(int slot)114 public Allocation getVertexAllocation(int slot) { 115 return mVertexBuffers[slot]; 116 } 117 118 /** 119 * @deprecated in API 16 120 * @return number of primitives or index sets in the mesh 121 * 122 **/ getPrimitiveCount()123 public int getPrimitiveCount() { 124 if(mIndexBuffers == null) { 125 return 0; 126 } 127 return mIndexBuffers.length; 128 } 129 130 /** 131 * @deprecated in API 16 132 * @param slot locaton within the list of index set allocation 133 * @return allocation containing primtive index data or null if 134 * the index data is not specified explicitly 135 * 136 **/ getIndexSetAllocation(int slot)137 public Allocation getIndexSetAllocation(int slot) { 138 return mIndexBuffers[slot]; 139 } 140 /** 141 * @deprecated in API 16 142 * @param slot locaiton within the list of index set primitives 143 * @return index set primitive type 144 * 145 **/ getPrimitive(int slot)146 public Primitive getPrimitive(int slot) { 147 return mPrimitives[slot]; 148 } 149 150 @Override updateFromNative()151 void updateFromNative() { 152 super.updateFromNative(); 153 int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS)); 154 int idxCount = mRS.nMeshGetIndexCount(getID(mRS)); 155 156 int[] vtxIDs = new int[vtxCount]; 157 int[] idxIDs = new int[idxCount]; 158 int[] primitives = new int[idxCount]; 159 160 mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount); 161 mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount); 162 163 mVertexBuffers = new Allocation[vtxCount]; 164 mIndexBuffers = new Allocation[idxCount]; 165 mPrimitives = new Primitive[idxCount]; 166 167 for(int i = 0; i < vtxCount; i ++) { 168 if(vtxIDs[i] != 0) { 169 mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT); 170 mVertexBuffers[i].updateFromNative(); 171 } 172 } 173 174 for(int i = 0; i < idxCount; i ++) { 175 if(idxIDs[i] != 0) { 176 mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT); 177 mIndexBuffers[i].updateFromNative(); 178 } 179 mPrimitives[i] = Primitive.values()[primitives[i]]; 180 } 181 } 182 183 /** 184 * @deprecated in API 16 185 * Mesh builder object. It starts empty and requires you to 186 * add the types necessary to create vertex and index 187 * allocations. 188 * 189 */ 190 public static class Builder { 191 RenderScript mRS; 192 int mUsage; 193 194 class Entry { 195 Type t; 196 Element e; 197 int size; 198 Primitive prim; 199 int usage; 200 } 201 202 int mVertexTypeCount; 203 Entry[] mVertexTypes; 204 Vector mIndexTypes; 205 206 /** 207 * @deprecated in API 16 208 * Creates builder object 209 * @param rs Context to which the mesh will belong. 210 * @param usage specifies how the mesh allocations are to be 211 * handled, whether they need to be uploaded to a 212 * buffer on the gpu, maintain a cpu copy, etc 213 */ Builder(RenderScript rs, int usage)214 public Builder(RenderScript rs, int usage) { 215 mRS = rs; 216 mUsage = usage; 217 mVertexTypeCount = 0; 218 mVertexTypes = new Entry[16]; 219 mIndexTypes = new Vector(); 220 } 221 222 /** 223 * @deprecated in API 16 224 * @return internal index of the last vertex buffer type added to 225 * builder 226 **/ getCurrentVertexTypeIndex()227 public int getCurrentVertexTypeIndex() { 228 return mVertexTypeCount - 1; 229 } 230 231 /** 232 * @deprecated in API 16 233 * @return internal index of the last index set added to the 234 * builder 235 **/ getCurrentIndexSetIndex()236 public int getCurrentIndexSetIndex() { 237 return mIndexTypes.size() - 1; 238 } 239 240 /** 241 * @deprecated in API 16 242 * Adds a vertex data type to the builder object 243 * 244 * @param t type of the vertex data allocation to be created 245 * 246 * @return this 247 **/ addVertexType(Type t)248 public Builder addVertexType(Type t) throws IllegalStateException { 249 if (mVertexTypeCount >= mVertexTypes.length) { 250 throw new IllegalStateException("Max vertex types exceeded."); 251 } 252 253 mVertexTypes[mVertexTypeCount] = new Entry(); 254 mVertexTypes[mVertexTypeCount].t = t; 255 mVertexTypes[mVertexTypeCount].e = null; 256 mVertexTypeCount++; 257 return this; 258 } 259 260 /** 261 * @deprecated in API 16 262 * Adds a vertex data type to the builder object 263 * 264 * @param e element describing the vertex data layout 265 * @param size number of elements in the buffer 266 * 267 * @return this 268 **/ addVertexType(Element e, int size)269 public Builder addVertexType(Element e, int size) throws IllegalStateException { 270 if (mVertexTypeCount >= mVertexTypes.length) { 271 throw new IllegalStateException("Max vertex types exceeded."); 272 } 273 274 mVertexTypes[mVertexTypeCount] = new Entry(); 275 mVertexTypes[mVertexTypeCount].t = null; 276 mVertexTypes[mVertexTypeCount].e = e; 277 mVertexTypes[mVertexTypeCount].size = size; 278 mVertexTypeCount++; 279 return this; 280 } 281 282 /** 283 * @deprecated in API 16 284 * Adds an index set data type to the builder object 285 * 286 * @param t type of the index set data, could be null 287 * @param p primitive type 288 * 289 * @return this 290 **/ addIndexSetType(Type t, Primitive p)291 public Builder addIndexSetType(Type t, Primitive p) { 292 Entry indexType = new Entry(); 293 indexType.t = t; 294 indexType.e = null; 295 indexType.size = 0; 296 indexType.prim = p; 297 mIndexTypes.addElement(indexType); 298 return this; 299 } 300 301 /** 302 * @deprecated in API 16 303 * Adds an index set primitive type to the builder object 304 * 305 * @param p primitive type 306 * 307 * @return this 308 **/ addIndexSetType(Primitive p)309 public Builder addIndexSetType(Primitive p) { 310 Entry indexType = new Entry(); 311 indexType.t = null; 312 indexType.e = null; 313 indexType.size = 0; 314 indexType.prim = p; 315 mIndexTypes.addElement(indexType); 316 return this; 317 } 318 319 /** 320 * @deprecated in API 16 321 * Adds an index set data type to the builder object 322 * 323 * @param e element describing the index set data layout 324 * @param size number of elements in the buffer 325 * @param p primitive type 326 * 327 * @return this 328 **/ addIndexSetType(Element e, int size, Primitive p)329 public Builder addIndexSetType(Element e, int size, Primitive p) { 330 Entry indexType = new Entry(); 331 indexType.t = null; 332 indexType.e = e; 333 indexType.size = size; 334 indexType.prim = p; 335 mIndexTypes.addElement(indexType); 336 return this; 337 } 338 newType(Element e, int size)339 Type newType(Element e, int size) { 340 Type.Builder tb = new Type.Builder(mRS, e); 341 tb.setX(size); 342 return tb.create(); 343 } 344 345 /** 346 * @deprecated in API 16 347 * Create a Mesh object from the current state of the builder 348 * 349 **/ create()350 public Mesh create() { 351 mRS.validate(); 352 int[] vtx = new int[mVertexTypeCount]; 353 int[] idx = new int[mIndexTypes.size()]; 354 int[] prim = new int[mIndexTypes.size()]; 355 356 Allocation[] vertexBuffers = new Allocation[mVertexTypeCount]; 357 Allocation[] indexBuffers = new Allocation[mIndexTypes.size()]; 358 Primitive[] primitives = new Primitive[mIndexTypes.size()]; 359 360 for(int ct = 0; ct < mVertexTypeCount; ct ++) { 361 Allocation alloc = null; 362 Entry entry = mVertexTypes[ct]; 363 if (entry.t != null) { 364 alloc = Allocation.createTyped(mRS, entry.t, mUsage); 365 } else if(entry.e != null) { 366 alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage); 367 } 368 vertexBuffers[ct] = alloc; 369 vtx[ct] = alloc.getID(mRS); 370 } 371 372 for(int ct = 0; ct < mIndexTypes.size(); ct ++) { 373 Allocation alloc = null; 374 Entry entry = (Entry)mIndexTypes.elementAt(ct); 375 if (entry.t != null) { 376 alloc = Allocation.createTyped(mRS, entry.t, mUsage); 377 } else if(entry.e != null) { 378 alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage); 379 } 380 int allocID = (alloc == null) ? 0 : alloc.getID(mRS); 381 indexBuffers[ct] = alloc; 382 primitives[ct] = entry.prim; 383 384 idx[ct] = allocID; 385 prim[ct] = entry.prim.mID; 386 } 387 388 int id = mRS.nMeshCreate(vtx, idx, prim); 389 Mesh newMesh = new Mesh(id, mRS); 390 newMesh.mVertexBuffers = vertexBuffers; 391 newMesh.mIndexBuffers = indexBuffers; 392 newMesh.mPrimitives = primitives; 393 394 return newMesh; 395 } 396 } 397 398 /** 399 * @deprecated in API 16 400 * Mesh builder object. It starts empty and requires the user to 401 * add all the vertex and index allocations that comprise the 402 * mesh 403 * 404 */ 405 public static class AllocationBuilder { 406 RenderScript mRS; 407 408 class Entry { 409 Allocation a; 410 Primitive prim; 411 } 412 413 int mVertexTypeCount; 414 Entry[] mVertexTypes; 415 416 Vector mIndexTypes; 417 418 /** 419 * @deprecated in API 16 420 **/ AllocationBuilder(RenderScript rs)421 public AllocationBuilder(RenderScript rs) { 422 mRS = rs; 423 mVertexTypeCount = 0; 424 mVertexTypes = new Entry[16]; 425 mIndexTypes = new Vector(); 426 } 427 428 /** 429 * @deprecated in API 16 430 * @return internal index of the last vertex buffer type added to 431 * builder 432 **/ getCurrentVertexTypeIndex()433 public int getCurrentVertexTypeIndex() { 434 return mVertexTypeCount - 1; 435 } 436 437 /** 438 * @deprecated in API 16 439 * @return internal index of the last index set added to the 440 * builder 441 **/ getCurrentIndexSetIndex()442 public int getCurrentIndexSetIndex() { 443 return mIndexTypes.size() - 1; 444 } 445 446 /** 447 * @deprecated in API 16 448 * Adds an allocation containing vertex buffer data to the 449 * builder 450 * 451 * @param a vertex data allocation 452 * 453 * @return this 454 **/ addVertexAllocation(Allocation a)455 public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException { 456 if (mVertexTypeCount >= mVertexTypes.length) { 457 throw new IllegalStateException("Max vertex types exceeded."); 458 } 459 460 mVertexTypes[mVertexTypeCount] = new Entry(); 461 mVertexTypes[mVertexTypeCount].a = a; 462 mVertexTypeCount++; 463 return this; 464 } 465 466 /** 467 * @deprecated in API 16 468 * Adds an allocation containing index buffer data and index type 469 * to the builder 470 * 471 * @param a index set data allocation, could be null 472 * @param p index set primitive type 473 * 474 * @return this 475 **/ addIndexSetAllocation(Allocation a, Primitive p)476 public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) { 477 Entry indexType = new Entry(); 478 indexType.a = a; 479 indexType.prim = p; 480 mIndexTypes.addElement(indexType); 481 return this; 482 } 483 484 /** 485 * @deprecated in API 16 486 * Adds an index set type to the builder 487 * 488 * @param p index set primitive type 489 * 490 * @return this 491 **/ addIndexSetType(Primitive p)492 public AllocationBuilder addIndexSetType(Primitive p) { 493 Entry indexType = new Entry(); 494 indexType.a = null; 495 indexType.prim = p; 496 mIndexTypes.addElement(indexType); 497 return this; 498 } 499 500 /** 501 * @deprecated in API 16 502 * Create a Mesh object from the current state of the builder 503 * 504 **/ create()505 public Mesh create() { 506 mRS.validate(); 507 508 int[] vtx = new int[mVertexTypeCount]; 509 int[] idx = new int[mIndexTypes.size()]; 510 int[] prim = new int[mIndexTypes.size()]; 511 512 Allocation[] indexBuffers = new Allocation[mIndexTypes.size()]; 513 Primitive[] primitives = new Primitive[mIndexTypes.size()]; 514 Allocation[] vertexBuffers = new Allocation[mVertexTypeCount]; 515 516 for(int ct = 0; ct < mVertexTypeCount; ct ++) { 517 Entry entry = mVertexTypes[ct]; 518 vertexBuffers[ct] = entry.a; 519 vtx[ct] = entry.a.getID(mRS); 520 } 521 522 for(int ct = 0; ct < mIndexTypes.size(); ct ++) { 523 Entry entry = (Entry)mIndexTypes.elementAt(ct); 524 int allocID = (entry.a == null) ? 0 : entry.a.getID(mRS); 525 indexBuffers[ct] = entry.a; 526 primitives[ct] = entry.prim; 527 528 idx[ct] = allocID; 529 prim[ct] = entry.prim.mID; 530 } 531 532 int id = mRS.nMeshCreate(vtx, idx, prim); 533 Mesh newMesh = new Mesh(id, mRS); 534 newMesh.mVertexBuffers = vertexBuffers; 535 newMesh.mIndexBuffers = indexBuffers; 536 newMesh.mPrimitives = primitives; 537 538 return newMesh; 539 } 540 } 541 542 /** 543 * @deprecated in API 16 544 * Builder that allows creation of a mesh object point by point 545 * and triangle by triangle 546 * 547 **/ 548 public static class TriangleMeshBuilder { 549 float mVtxData[]; 550 int mVtxCount; 551 int mMaxIndex; 552 short mIndexData[]; 553 int mIndexCount; 554 RenderScript mRS; 555 Element mElement; 556 557 float mNX = 0; 558 float mNY = 0; 559 float mNZ = -1; 560 float mS0 = 0; 561 float mT0 = 0; 562 float mR = 1; 563 float mG = 1; 564 float mB = 1; 565 float mA = 1; 566 567 int mVtxSize; 568 int mFlags; 569 570 /** 571 * @deprecated in API 16 572 **/ 573 public static final int COLOR = 0x0001; 574 /** 575 * @deprecated in API 16 576 **/ 577 public static final int NORMAL = 0x0002; 578 /** 579 * @deprecated in API 16 580 **/ 581 public static final int TEXTURE_0 = 0x0100; 582 583 /** 584 * @deprecated in API 16 585 * @param rs Context to which the mesh will belong. 586 * @param vtxSize specifies whether the vertex is a float2 or 587 * float3 588 * @param flags bitfield that is a combination of COLOR, NORMAL, 589 * and TEXTURE_0 that specifies what vertex data 590 * channels are present in the mesh 591 * 592 **/ TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags)593 public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) { 594 mRS = rs; 595 mVtxCount = 0; 596 mMaxIndex = 0; 597 mIndexCount = 0; 598 mVtxData = new float[128]; 599 mIndexData = new short[128]; 600 mVtxSize = vtxSize; 601 mFlags = flags; 602 603 if (vtxSize < 2 || vtxSize > 3) { 604 throw new IllegalArgumentException("Vertex size out of range."); 605 } 606 } 607 makeSpace(int count)608 private void makeSpace(int count) { 609 if ((mVtxCount + count) >= mVtxData.length) { 610 float t[] = new float[mVtxData.length * 2]; 611 System.arraycopy(mVtxData, 0, t, 0, mVtxData.length); 612 mVtxData = t; 613 } 614 } 615 latch()616 private void latch() { 617 if ((mFlags & COLOR) != 0) { 618 makeSpace(4); 619 mVtxData[mVtxCount++] = mR; 620 mVtxData[mVtxCount++] = mG; 621 mVtxData[mVtxCount++] = mB; 622 mVtxData[mVtxCount++] = mA; 623 } 624 if ((mFlags & TEXTURE_0) != 0) { 625 makeSpace(2); 626 mVtxData[mVtxCount++] = mS0; 627 mVtxData[mVtxCount++] = mT0; 628 } 629 if ((mFlags & NORMAL) != 0) { 630 makeSpace(4); 631 mVtxData[mVtxCount++] = mNX; 632 mVtxData[mVtxCount++] = mNY; 633 mVtxData[mVtxCount++] = mNZ; 634 mVtxData[mVtxCount++] = 0.0f; 635 } 636 mMaxIndex ++; 637 } 638 639 /** 640 * @deprecated in API 16 641 * Adds a float2 vertex to the mesh 642 * 643 * @param x position x 644 * @param y position y 645 * 646 * @return this 647 * 648 **/ addVertex(float x, float y)649 public TriangleMeshBuilder addVertex(float x, float y) { 650 if (mVtxSize != 2) { 651 throw new IllegalStateException("add mistmatch with declared components."); 652 } 653 makeSpace(2); 654 mVtxData[mVtxCount++] = x; 655 mVtxData[mVtxCount++] = y; 656 latch(); 657 return this; 658 } 659 660 /** 661 * @deprecated in API 16 662 * Adds a float3 vertex to the mesh 663 * 664 * @param x position x 665 * @param y position y 666 * @param z position z 667 * 668 * @return this 669 * 670 **/ addVertex(float x, float y, float z)671 public TriangleMeshBuilder addVertex(float x, float y, float z) { 672 if (mVtxSize != 3) { 673 throw new IllegalStateException("add mistmatch with declared components."); 674 } 675 makeSpace(4); 676 mVtxData[mVtxCount++] = x; 677 mVtxData[mVtxCount++] = y; 678 mVtxData[mVtxCount++] = z; 679 mVtxData[mVtxCount++] = 1.0f; 680 latch(); 681 return this; 682 } 683 684 /** 685 * @deprecated in API 16 686 * Sets the texture coordinate for the vertices that are added after this method call. 687 * 688 * @param s texture coordinate s 689 * @param t texture coordinate t 690 * 691 * @return this 692 **/ setTexture(float s, float t)693 public TriangleMeshBuilder setTexture(float s, float t) { 694 if ((mFlags & TEXTURE_0) == 0) { 695 throw new IllegalStateException("add mistmatch with declared components."); 696 } 697 mS0 = s; 698 mT0 = t; 699 return this; 700 } 701 702 /** 703 * @deprecated in API 16 704 * Sets the normal vector for the vertices that are added after this method call. 705 * 706 * @param x normal vector x 707 * @param y normal vector y 708 * @param z normal vector z 709 * 710 * @return this 711 **/ setNormal(float x, float y, float z)712 public TriangleMeshBuilder setNormal(float x, float y, float z) { 713 if ((mFlags & NORMAL) == 0) { 714 throw new IllegalStateException("add mistmatch with declared components."); 715 } 716 mNX = x; 717 mNY = y; 718 mNZ = z; 719 return this; 720 } 721 722 /** 723 * @deprecated in API 16 724 * Sets the color for the vertices that are added after this method call. 725 * 726 * @param r red component 727 * @param g green component 728 * @param b blue component 729 * @param a alpha component 730 * 731 * @return this 732 **/ setColor(float r, float g, float b, float a)733 public TriangleMeshBuilder setColor(float r, float g, float b, float a) { 734 if ((mFlags & COLOR) == 0) { 735 throw new IllegalStateException("add mistmatch with declared components."); 736 } 737 mR = r; 738 mG = g; 739 mB = b; 740 mA = a; 741 return this; 742 } 743 744 /** 745 * @deprecated in API 16 746 * Adds a new triangle to the mesh builder 747 * 748 * @param idx1 index of the first vertex in the triangle 749 * @param idx2 index of the second vertex in the triangle 750 * @param idx3 index of the third vertex in the triangle 751 * 752 * @return this 753 **/ addTriangle(int idx1, int idx2, int idx3)754 public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) { 755 if((idx1 >= mMaxIndex) || (idx1 < 0) || 756 (idx2 >= mMaxIndex) || (idx2 < 0) || 757 (idx3 >= mMaxIndex) || (idx3 < 0)) { 758 throw new IllegalStateException("Index provided greater than vertex count."); 759 } 760 if ((mIndexCount + 3) >= mIndexData.length) { 761 short t[] = new short[mIndexData.length * 2]; 762 System.arraycopy(mIndexData, 0, t, 0, mIndexData.length); 763 mIndexData = t; 764 } 765 mIndexData[mIndexCount++] = (short)idx1; 766 mIndexData[mIndexCount++] = (short)idx2; 767 mIndexData[mIndexCount++] = (short)idx3; 768 return this; 769 } 770 771 /** 772 * @deprecated in API 16 773 * Creates the mesh object from the current state of the builder 774 * 775 * @param uploadToBufferObject specifies whether the vertex data 776 * is to be uploaded into the buffer 777 * object indicating that it's likely 778 * not going to be modified and 779 * rendered many times. 780 * Alternatively, it indicates the 781 * mesh data will be updated 782 * frequently and remain in script 783 * accessible memory 784 * 785 **/ create(boolean uploadToBufferObject)786 public Mesh create(boolean uploadToBufferObject) { 787 Element.Builder b = new Element.Builder(mRS); 788 b.add(Element.createVector(mRS, 789 Element.DataType.FLOAT_32, 790 mVtxSize), "position"); 791 if ((mFlags & COLOR) != 0) { 792 b.add(Element.F32_4(mRS), "color"); 793 } 794 if ((mFlags & TEXTURE_0) != 0) { 795 b.add(Element.F32_2(mRS), "texture0"); 796 } 797 if ((mFlags & NORMAL) != 0) { 798 b.add(Element.F32_3(mRS), "normal"); 799 } 800 mElement = b.create(); 801 802 int usage = Allocation.USAGE_SCRIPT; 803 if (uploadToBufferObject) { 804 usage |= Allocation.USAGE_GRAPHICS_VERTEX; 805 } 806 807 Builder smb = new Builder(mRS, usage); 808 smb.addVertexType(mElement, mMaxIndex); 809 smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE); 810 811 Mesh sm = smb.create(); 812 813 sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData); 814 if(uploadToBufferObject) { 815 if (uploadToBufferObject) { 816 sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT); 817 } 818 } 819 820 sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData); 821 if (uploadToBufferObject) { 822 sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT); 823 } 824 825 return sm; 826 } 827 } 828 } 829 830