blob: 9e4f90573ae989e34cda7f61d9e188530c0ac3fd [file] [log] [blame]
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07001/*
Jason Samse619de62012-05-08 18:40:58 -07002 * Copyright (C) 2008-2012 The Android Open Source Project
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07003 *
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
17package android.renderscript;
18
19import java.util.Vector;
20
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070021/**
Tim Murraya9084222013-04-05 22:06:43 +000022 * @hide
Jason Samsd4ca9912012-05-08 19:02:07 -070023 * @deprecated in API 16
Robert Ly11518ac2011-02-09 13:57:06 -080024 * <p>This class is a container for geometric data displayed with
Tim Murrayc11e25c2013-04-09 11:01:01 -070025 * RenderScript. Internally, a mesh is a collection of allocations that
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080026 * represent vertex data (positions, normals, texture
Robert Ly11518ac2011-02-09 13:57:06 -080027 * coordinates) and index data such as triangles and lines. </p>
28 * <p>
29 * Vertex data could either be interleaved within one
30 * allocation that is provided separately, as multiple allocation
31 * objects, or done as a combination of both. When a
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080032 * vertex channel name matches an input in the vertex program,
Tim Murrayc11e25c2013-04-09 11:01:01 -070033 * RenderScript automatically connects the two together.
Robert Ly11518ac2011-02-09 13:57:06 -080034 * </p>
35 * <p>
36 * Parts of the mesh can be rendered with either explicit
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080037 * index sets or primitive types.
Robert Ly11518ac2011-02-09 13:57:06 -080038 * </p>
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -070039 **/
40public class Mesh extends BaseObj {
41
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070042 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070043 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080044 * Describes the way mesh vertex data is interpreted when rendering
45 *
46 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080047 public enum Primitive {
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070048 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070049 * @deprecated in API 16
Alex Sakhartchoukec0d3352011-01-17 15:23:22 -080050 * Vertex data will be rendered as a series of points
51 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080052 POINT (0),
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070053 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070054 * @deprecated in API 16
Alex Sakhartchoukec0d3352011-01-17 15:23:22 -080055 * Vertex pairs will be rendered as lines
56 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080057 LINE (1),
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070058 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070059 * @deprecated in API 16
Alex Sakhartchoukec0d3352011-01-17 15:23:22 -080060 * Vertex data will be rendered as a connected line strip
61 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080062 LINE_STRIP (2),
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070063 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070064 * @deprecated in API 16
Alex Sakhartchoukec0d3352011-01-17 15:23:22 -080065 * Vertices will be rendered as individual triangles
66 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080067 TRIANGLE (3),
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070068 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070069 * @deprecated in API 16
Alex Sakhartchoukec0d3352011-01-17 15:23:22 -080070 * Vertices will be rendered as a connected triangle strip
71 * defined by the first three vertices with each additional
72 * triangle defined by a new vertex
73 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080074 TRIANGLE_STRIP (4),
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070075 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070076 * @deprecated in API 16
Alex Sakhartchoukec0d3352011-01-17 15:23:22 -080077 * Vertices will be rendered as a sequence of triangles that all
78 * share first vertex as the origin
79 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080080 TRIANGLE_FAN (5);
81
82 int mID;
83 Primitive(int id) {
84 mID = id;
85 }
86 }
87
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -070088 Allocation[] mVertexBuffers;
89 Allocation[] mIndexBuffers;
90 Primitive[] mPrimitives;
91
Tim Murray460a0492013-11-19 12:45:54 -080092 Mesh(long id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -070093 super(id, rs);
Yang Nieb4dd082016-03-24 09:40:32 -070094 guard.open("destroy");
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -070095 }
96
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070097 /**
Jason Samsd4ca9912012-05-08 19:02:07 -070098 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080099 * @return number of allocations containing vertex data
100 *
101 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700102 public int getVertexAllocationCount() {
103 if(mVertexBuffers == null) {
104 return 0;
105 }
106 return mVertexBuffers.length;
107 }
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700108 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700109 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800110 * @param slot index in the list of allocations to return
111 * @return vertex data allocation at the given index
112 *
113 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700114 public Allocation getVertexAllocation(int slot) {
115 return mVertexBuffers[slot];
116 }
117
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700118 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700119 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800120 * @return number of primitives or index sets in the mesh
121 *
122 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700123 public int getPrimitiveCount() {
124 if(mIndexBuffers == null) {
125 return 0;
126 }
127 return mIndexBuffers.length;
128 }
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800129
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700130 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700131 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800132 * @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 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800137 public Allocation getIndexSetAllocation(int slot) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700138 return mIndexBuffers[slot];
139 }
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700140 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700141 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800142 * @param slot locaiton within the list of index set primitives
143 * @return index set primitive type
144 *
145 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700146 public Primitive getPrimitive(int slot) {
147 return mPrimitives[slot];
148 }
149
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700150 @Override
151 void updateFromNative() {
Jason Sams06d69de2010-11-09 17:11:40 -0800152 super.updateFromNative();
Jason Samse07694b2012-04-03 15:36:36 -0700153 int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS));
154 int idxCount = mRS.nMeshGetIndexCount(getID(mRS));
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700155
Ashok Bhat98071552014-02-12 09:54:43 +0000156 long[] vtxIDs = new long[vtxCount];
157 long[] idxIDs = new long[idxCount];
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700158 int[] primitives = new int[idxCount];
159
Jason Samse07694b2012-04-03 15:36:36 -0700160 mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount);
161 mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700162
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) {
Jason Samsd4b23b52010-12-13 15:32:35 -0800169 mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700170 mVertexBuffers[i].updateFromNative();
171 }
172 }
173
174 for(int i = 0; i < idxCount; i ++) {
175 if(idxIDs[i] != 0) {
Jason Samsd4b23b52010-12-13 15:32:35 -0800176 mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700177 mIndexBuffers[i].updateFromNative();
178 }
179 mPrimitives[i] = Primitive.values()[primitives[i]];
180 }
181 }
182
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700183 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700184 * @deprecated in API 16
Robert Ly11518ac2011-02-09 13:57:06 -0800185 * Mesh builder object. It starts empty and requires you to
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800186 * add the types necessary to create vertex and index
Robert Ly11518ac2011-02-09 13:57:06 -0800187 * allocations.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800188 *
189 */
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700190 public static class Builder {
191 RenderScript mRS;
Jason Samsd1952402010-12-20 12:55:28 -0800192 int mUsage;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700193
194 class Entry {
195 Type t;
196 Element e;
197 int size;
198 Primitive prim;
Jason Samsd1952402010-12-20 12:55:28 -0800199 int usage;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700200 }
201
202 int mVertexTypeCount;
203 Entry[] mVertexTypes;
204 Vector mIndexTypes;
205
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700206 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700207 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800208 * Creates builder object
Alex Sakhartchoukf5c876e2011-01-13 14:53:43 -0800209 * @param rs Context to which the mesh will belong.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800210 * @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 */
Jason Samsd1952402010-12-20 12:55:28 -0800214 public Builder(RenderScript rs, int usage) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700215 mRS = rs;
Jason Samsd1952402010-12-20 12:55:28 -0800216 mUsage = usage;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700217 mVertexTypeCount = 0;
218 mVertexTypes = new Entry[16];
219 mIndexTypes = new Vector();
220 }
221
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700222 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700223 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800224 * @return internal index of the last vertex buffer type added to
225 * builder
226 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800227 public int getCurrentVertexTypeIndex() {
228 return mVertexTypeCount - 1;
229 }
230
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700231 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700232 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800233 * @return internal index of the last index set added to the
234 * builder
235 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800236 public int getCurrentIndexSetIndex() {
237 return mIndexTypes.size() - 1;
238 }
239
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700240 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700241 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800242 * Adds a vertex data type to the builder object
243 *
Stephen Hinesb11e3d22011-01-11 19:30:58 -0800244 * @param t type of the vertex data allocation to be created
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800245 *
246 * @return this
247 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800248 public Builder addVertexType(Type t) throws IllegalStateException {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700249 if (mVertexTypeCount >= mVertexTypes.length) {
250 throw new IllegalStateException("Max vertex types exceeded.");
251 }
252
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700253 mVertexTypes[mVertexTypeCount] = new Entry();
254 mVertexTypes[mVertexTypeCount].t = t;
255 mVertexTypes[mVertexTypeCount].e = null;
256 mVertexTypeCount++;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800257 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700258 }
259
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700260 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700261 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800262 * 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 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800269 public Builder addVertexType(Element e, int size) throws IllegalStateException {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700270 if (mVertexTypeCount >= mVertexTypes.length) {
271 throw new IllegalStateException("Max vertex types exceeded.");
272 }
273
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700274 mVertexTypes[mVertexTypeCount] = new Entry();
275 mVertexTypes[mVertexTypeCount].t = null;
276 mVertexTypes[mVertexTypeCount].e = e;
277 mVertexTypes[mVertexTypeCount].size = size;
278 mVertexTypeCount++;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800279 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700280 }
281
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700282 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700283 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800284 * 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 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800291 public Builder addIndexSetType(Type t, Primitive p) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700292 Entry indexType = new Entry();
293 indexType.t = t;
294 indexType.e = null;
295 indexType.size = 0;
296 indexType.prim = p;
297 mIndexTypes.addElement(indexType);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800298 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700299 }
300
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700301 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700302 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800303 * Adds an index set primitive type to the builder object
304 *
305 * @param p primitive type
306 *
307 * @return this
308 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800309 public Builder addIndexSetType(Primitive p) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700310 Entry indexType = new Entry();
311 indexType.t = null;
312 indexType.e = null;
313 indexType.size = 0;
314 indexType.prim = p;
315 mIndexTypes.addElement(indexType);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800316 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700317 }
318
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700319 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700320 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800321 * 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 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800329 public Builder addIndexSetType(Element e, int size, Primitive p) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700330 Entry indexType = new Entry();
331 indexType.t = null;
332 indexType.e = e;
333 indexType.size = size;
334 indexType.prim = p;
335 mIndexTypes.addElement(indexType);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800336 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700337 }
338
339 Type newType(Element e, int size) {
340 Type.Builder tb = new Type.Builder(mRS, e);
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800341 tb.setX(size);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700342 return tb.create();
343 }
344
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700345 /**
Jason Samsd4ca9912012-05-08 19:02:07 -0700346 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800347 * Create a Mesh object from the current state of the builder
348 *
349 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700350 public Mesh create() {
351 mRS.validate();
Ashok Bhat98071552014-02-12 09:54:43 +0000352 long[] vtx = new long[mVertexTypeCount];
353 long[] idx = new long[mIndexTypes.size()];
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700354 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);
Jason Samsae5be382015-03-26 14:47:17 -0700367 } else {
368 // Should never happen because the builder will always set one
369 throw new IllegalStateException("Builder corrupt, no valid element in entry.");
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700370 }
371 vertexBuffers[ct] = alloc;
Ashok Bhat98071552014-02-12 09:54:43 +0000372 vtx[ct] = alloc.getID(mRS);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700373 }
374
375 for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
376 Allocation alloc = null;
377 Entry entry = (Entry)mIndexTypes.elementAt(ct);
378 if (entry.t != null) {
379 alloc = Allocation.createTyped(mRS, entry.t, mUsage);
380 } else if(entry.e != null) {
381 alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
Jason Samsae5be382015-03-26 14:47:17 -0700382 } else {
383 // Should never happen because the builder will always set one
384 throw new IllegalStateException("Builder corrupt, no valid element in entry.");
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700385 }
Tim Murray460a0492013-11-19 12:45:54 -0800386 long allocID = (alloc == null) ? 0 : alloc.getID(mRS);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700387 indexBuffers[ct] = alloc;
388 primitives[ct] = entry.prim;
389
Ashok Bhat98071552014-02-12 09:54:43 +0000390 idx[ct] = allocID;
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700391 prim[ct] = entry.prim.mID;
392 }
393
Tim Murray460a0492013-11-19 12:45:54 -0800394 long id = mRS.nMeshCreate(vtx, idx, prim);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700395 Mesh newMesh = new Mesh(id, mRS);
396 newMesh.mVertexBuffers = vertexBuffers;
397 newMesh.mIndexBuffers = indexBuffers;
398 newMesh.mPrimitives = primitives;
399
400 return newMesh;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700401 }
402 }
403
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700404 /**
Jason Samse619de62012-05-08 18:40:58 -0700405 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800406 * Mesh builder object. It starts empty and requires the user to
407 * add all the vertex and index allocations that comprise the
408 * mesh
409 *
410 */
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700411 public static class AllocationBuilder {
412 RenderScript mRS;
413
414 class Entry {
415 Allocation a;
416 Primitive prim;
417 }
418
419 int mVertexTypeCount;
420 Entry[] mVertexTypes;
421
422 Vector mIndexTypes;
423
Jason Samse619de62012-05-08 18:40:58 -0700424 /**
425 * @deprecated in API 16
426 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700427 public AllocationBuilder(RenderScript rs) {
428 mRS = rs;
429 mVertexTypeCount = 0;
430 mVertexTypes = new Entry[16];
431 mIndexTypes = new Vector();
432 }
433
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700434 /**
Jason Samse619de62012-05-08 18:40:58 -0700435 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800436 * @return internal index of the last vertex buffer type added to
437 * builder
438 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800439 public int getCurrentVertexTypeIndex() {
440 return mVertexTypeCount - 1;
441 }
442
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700443 /**
Jason Samse619de62012-05-08 18:40:58 -0700444 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800445 * @return internal index of the last index set added to the
446 * builder
447 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800448 public int getCurrentIndexSetIndex() {
449 return mIndexTypes.size() - 1;
450 }
451
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700452 /**
Jason Samse619de62012-05-08 18:40:58 -0700453 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800454 * Adds an allocation containing vertex buffer data to the
455 * builder
456 *
457 * @param a vertex data allocation
458 *
459 * @return this
460 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800461 public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700462 if (mVertexTypeCount >= mVertexTypes.length) {
463 throw new IllegalStateException("Max vertex types exceeded.");
464 }
465
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700466 mVertexTypes[mVertexTypeCount] = new Entry();
467 mVertexTypes[mVertexTypeCount].a = a;
468 mVertexTypeCount++;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800469 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700470 }
471
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700472 /**
Jason Samse619de62012-05-08 18:40:58 -0700473 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800474 * Adds an allocation containing index buffer data and index type
475 * to the builder
476 *
477 * @param a index set data allocation, could be null
478 * @param p index set primitive type
479 *
480 * @return this
481 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800482 public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700483 Entry indexType = new Entry();
484 indexType.a = a;
485 indexType.prim = p;
486 mIndexTypes.addElement(indexType);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800487 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700488 }
489
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700490 /**
Jason Samse619de62012-05-08 18:40:58 -0700491 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800492 * Adds an index set type to the builder
493 *
494 * @param p index set primitive type
495 *
496 * @return this
497 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800498 public AllocationBuilder addIndexSetType(Primitive p) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700499 Entry indexType = new Entry();
500 indexType.a = null;
501 indexType.prim = p;
502 mIndexTypes.addElement(indexType);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800503 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700504 }
505
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700506 /**
Jason Samse619de62012-05-08 18:40:58 -0700507 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800508 * Create a Mesh object from the current state of the builder
509 *
510 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700511 public Mesh create() {
512 mRS.validate();
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700513
Ashok Bhat98071552014-02-12 09:54:43 +0000514 long[] vtx = new long[mVertexTypeCount];
515 long[] idx = new long[mIndexTypes.size()];
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700516 int[] prim = new int[mIndexTypes.size()];
517
518 Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
519 Primitive[] primitives = new Primitive[mIndexTypes.size()];
520 Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
521
522 for(int ct = 0; ct < mVertexTypeCount; ct ++) {
523 Entry entry = mVertexTypes[ct];
524 vertexBuffers[ct] = entry.a;
Ashok Bhat98071552014-02-12 09:54:43 +0000525 vtx[ct] = entry.a.getID(mRS);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700526 }
527
528 for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
529 Entry entry = (Entry)mIndexTypes.elementAt(ct);
Tim Murray460a0492013-11-19 12:45:54 -0800530 long allocID = (entry.a == null) ? 0 : entry.a.getID(mRS);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700531 indexBuffers[ct] = entry.a;
532 primitives[ct] = entry.prim;
533
Ashok Bhat98071552014-02-12 09:54:43 +0000534 idx[ct] = allocID;
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700535 prim[ct] = entry.prim.mID;
536 }
537
Tim Murray460a0492013-11-19 12:45:54 -0800538 long id = mRS.nMeshCreate(vtx, idx, prim);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700539 Mesh newMesh = new Mesh(id, mRS);
540 newMesh.mVertexBuffers = vertexBuffers;
541 newMesh.mIndexBuffers = indexBuffers;
542 newMesh.mPrimitives = primitives;
543
544 return newMesh;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700545 }
546 }
547
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700548 /**
Jason Samse619de62012-05-08 18:40:58 -0700549 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800550 * Builder that allows creation of a mesh object point by point
551 * and triangle by triangle
552 *
553 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700554 public static class TriangleMeshBuilder {
555 float mVtxData[];
556 int mVtxCount;
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800557 int mMaxIndex;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700558 short mIndexData[];
559 int mIndexCount;
560 RenderScript mRS;
561 Element mElement;
562
563 float mNX = 0;
564 float mNY = 0;
565 float mNZ = -1;
566 float mS0 = 0;
567 float mT0 = 0;
568 float mR = 1;
569 float mG = 1;
570 float mB = 1;
571 float mA = 1;
572
573 int mVtxSize;
574 int mFlags;
575
Jason Samse619de62012-05-08 18:40:58 -0700576 /**
577 * @deprecated in API 16
578 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700579 public static final int COLOR = 0x0001;
Jason Samse619de62012-05-08 18:40:58 -0700580 /**
581 * @deprecated in API 16
582 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700583 public static final int NORMAL = 0x0002;
Jason Samse619de62012-05-08 18:40:58 -0700584 /**
585 * @deprecated in API 16
586 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700587 public static final int TEXTURE_0 = 0x0100;
588
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700589 /**
Jason Samse619de62012-05-08 18:40:58 -0700590 * @deprecated in API 16
Alex Sakhartchoukf5c876e2011-01-13 14:53:43 -0800591 * @param rs Context to which the mesh will belong.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800592 * @param vtxSize specifies whether the vertex is a float2 or
593 * float3
594 * @param flags bitfield that is a combination of COLOR, NORMAL,
595 * and TEXTURE_0 that specifies what vertex data
596 * channels are present in the mesh
597 *
598 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700599 public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) {
600 mRS = rs;
601 mVtxCount = 0;
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800602 mMaxIndex = 0;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700603 mIndexCount = 0;
604 mVtxData = new float[128];
605 mIndexData = new short[128];
606 mVtxSize = vtxSize;
607 mFlags = flags;
608
609 if (vtxSize < 2 || vtxSize > 3) {
610 throw new IllegalArgumentException("Vertex size out of range.");
611 }
612 }
613
614 private void makeSpace(int count) {
615 if ((mVtxCount + count) >= mVtxData.length) {
616 float t[] = new float[mVtxData.length * 2];
617 System.arraycopy(mVtxData, 0, t, 0, mVtxData.length);
618 mVtxData = t;
619 }
620 }
621
622 private void latch() {
623 if ((mFlags & COLOR) != 0) {
624 makeSpace(4);
625 mVtxData[mVtxCount++] = mR;
626 mVtxData[mVtxCount++] = mG;
627 mVtxData[mVtxCount++] = mB;
628 mVtxData[mVtxCount++] = mA;
629 }
630 if ((mFlags & TEXTURE_0) != 0) {
631 makeSpace(2);
632 mVtxData[mVtxCount++] = mS0;
633 mVtxData[mVtxCount++] = mT0;
634 }
635 if ((mFlags & NORMAL) != 0) {
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800636 makeSpace(4);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700637 mVtxData[mVtxCount++] = mNX;
638 mVtxData[mVtxCount++] = mNY;
639 mVtxData[mVtxCount++] = mNZ;
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800640 mVtxData[mVtxCount++] = 0.0f;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700641 }
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800642 mMaxIndex ++;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700643 }
644
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700645 /**
Jason Samse619de62012-05-08 18:40:58 -0700646 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800647 * Adds a float2 vertex to the mesh
648 *
649 * @param x position x
650 * @param y position y
651 *
652 * @return this
653 *
654 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800655 public TriangleMeshBuilder addVertex(float x, float y) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700656 if (mVtxSize != 2) {
657 throw new IllegalStateException("add mistmatch with declared components.");
658 }
659 makeSpace(2);
660 mVtxData[mVtxCount++] = x;
661 mVtxData[mVtxCount++] = y;
662 latch();
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800663 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700664 }
665
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700666 /**
Jason Samse619de62012-05-08 18:40:58 -0700667 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800668 * Adds a float3 vertex to the mesh
669 *
670 * @param x position x
671 * @param y position y
672 * @param z position z
673 *
674 * @return this
675 *
676 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800677 public TriangleMeshBuilder addVertex(float x, float y, float z) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700678 if (mVtxSize != 3) {
679 throw new IllegalStateException("add mistmatch with declared components.");
680 }
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800681 makeSpace(4);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700682 mVtxData[mVtxCount++] = x;
683 mVtxData[mVtxCount++] = y;
684 mVtxData[mVtxCount++] = z;
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800685 mVtxData[mVtxCount++] = 1.0f;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700686 latch();
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800687 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700688 }
689
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700690 /**
Jason Samse619de62012-05-08 18:40:58 -0700691 * @deprecated in API 16
Robert Lyf11ffc112012-02-22 10:59:12 -0800692 * Sets the texture coordinate for the vertices that are added after this method call.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800693 *
694 * @param s texture coordinate s
695 * @param t texture coordinate t
696 *
697 * @return this
698 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800699 public TriangleMeshBuilder setTexture(float s, float t) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700700 if ((mFlags & TEXTURE_0) == 0) {
701 throw new IllegalStateException("add mistmatch with declared components.");
702 }
703 mS0 = s;
704 mT0 = t;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800705 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700706 }
707
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700708 /**
Jason Samse619de62012-05-08 18:40:58 -0700709 * @deprecated in API 16
Robert Lyf11ffc112012-02-22 10:59:12 -0800710 * Sets the normal vector for the vertices that are added after this method call.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800711 *
712 * @param x normal vector x
713 * @param y normal vector y
714 * @param z normal vector z
715 *
716 * @return this
717 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800718 public TriangleMeshBuilder setNormal(float x, float y, float z) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700719 if ((mFlags & NORMAL) == 0) {
720 throw new IllegalStateException("add mistmatch with declared components.");
721 }
722 mNX = x;
723 mNY = y;
724 mNZ = z;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800725 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700726 }
727
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700728 /**
Jason Samse619de62012-05-08 18:40:58 -0700729 * @deprecated in API 16
Robert Lyf11ffc112012-02-22 10:59:12 -0800730 * Sets the color for the vertices that are added after this method call.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800731 *
732 * @param r red component
733 * @param g green component
734 * @param b blue component
735 * @param a alpha component
736 *
737 * @return this
738 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800739 public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700740 if ((mFlags & COLOR) == 0) {
741 throw new IllegalStateException("add mistmatch with declared components.");
742 }
743 mR = r;
744 mG = g;
745 mB = b;
746 mA = a;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800747 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700748 }
749
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700750 /**
Jason Samse619de62012-05-08 18:40:58 -0700751 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800752 * Adds a new triangle to the mesh builder
753 *
754 * @param idx1 index of the first vertex in the triangle
755 * @param idx2 index of the second vertex in the triangle
756 * @param idx3 index of the third vertex in the triangle
757 *
758 * @return this
759 **/
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800760 public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800761 if((idx1 >= mMaxIndex) || (idx1 < 0) ||
762 (idx2 >= mMaxIndex) || (idx2 < 0) ||
763 (idx3 >= mMaxIndex) || (idx3 < 0)) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700764 throw new IllegalStateException("Index provided greater than vertex count.");
765 }
766 if ((mIndexCount + 3) >= mIndexData.length) {
767 short t[] = new short[mIndexData.length * 2];
768 System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
769 mIndexData = t;
770 }
771 mIndexData[mIndexCount++] = (short)idx1;
772 mIndexData[mIndexCount++] = (short)idx2;
773 mIndexData[mIndexCount++] = (short)idx3;
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800774 return this;
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700775 }
776
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700777 /**
Jason Samse619de62012-05-08 18:40:58 -0700778 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800779 * Creates the mesh object from the current state of the builder
780 *
781 * @param uploadToBufferObject specifies whether the vertex data
782 * is to be uploaded into the buffer
783 * object indicating that it's likely
784 * not going to be modified and
785 * rendered many times.
786 * Alternatively, it indicates the
787 * mesh data will be updated
788 * frequently and remain in script
789 * accessible memory
790 *
791 **/
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700792 public Mesh create(boolean uploadToBufferObject) {
793 Element.Builder b = new Element.Builder(mRS);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700794 b.add(Element.createVector(mRS,
795 Element.DataType.FLOAT_32,
796 mVtxSize), "position");
797 if ((mFlags & COLOR) != 0) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700798 b.add(Element.F32_4(mRS), "color");
799 }
800 if ((mFlags & TEXTURE_0) != 0) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700801 b.add(Element.F32_2(mRS), "texture0");
802 }
803 if ((mFlags & NORMAL) != 0) {
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700804 b.add(Element.F32_3(mRS), "normal");
805 }
806 mElement = b.create();
807
Jason Samsd1952402010-12-20 12:55:28 -0800808 int usage = Allocation.USAGE_SCRIPT;
809 if (uploadToBufferObject) {
810 usage |= Allocation.USAGE_GRAPHICS_VERTEX;
811 }
812
813 Builder smb = new Builder(mRS, usage);
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800814 smb.addVertexType(mElement, mMaxIndex);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800815 smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700816
817 Mesh sm = smb.create();
818
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800819 sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700820 if(uploadToBufferObject) {
Andreas Gampe16720c12015-03-17 19:10:14 -0700821 sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700822 }
823
Jason Samsb97b2512011-01-16 15:04:08 -0800824 sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData);
Jason Samsd1952402010-12-20 12:55:28 -0800825 if (uploadToBufferObject) {
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800826 sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
Jason Samsd1952402010-12-20 12:55:28 -0800827 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700828
829 return sm;
830 }
831 }
832}
833