aboutsummaryrefslogtreecommitdiff
path: root/js/lib/geom/shape-primitive.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/lib/geom/shape-primitive.js')
-rw-r--r--js/lib/geom/shape-primitive.js213
1 files changed, 208 insertions, 5 deletions
diff --git a/js/lib/geom/shape-primitive.js b/js/lib/geom/shape-primitive.js
index 5a44deb3..c70eae03 100644
--- a/js/lib/geom/shape-primitive.js
+++ b/js/lib/geom/shape-primitive.js
@@ -1,7 +1,31 @@
1/* <copyright> 1/* <copyright>
2This file contains proprietary software owned by Motorola Mobility, Inc.<br/> 2Copyright (c) 2012, Motorola Mobility, Inc
3No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/> 3All Rights Reserved.
4(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. 4BSD License.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8
9 - Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11 - Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
14 - Neither the name of Motorola Mobility nor the names of its contributors
15 may be used to endorse or promote products derived from this software
16 without specific prior written permission.
17
18THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28POSSIBILITY OF SUCH DAMAGE.
5</copyright> */ 29</copyright> */
6 30
7// Helper function for generating a RDGE primitive 31// Helper function for generating a RDGE primitive
@@ -144,7 +168,7 @@ ShapePrimitive.refineMesh = function( verts, norms, uvs, indices, nVertices, pa
144 { 168 {
145 // check thesize of the triangle in uv space. If small enough, advance 169 // check thesize of the triangle in uv space. If small enough, advance
146 // to the next triangle. If not small enough, split the triangle into 3; 170 // to the next triangle. If not small enough, split the triangle into 3;
147 var du = uMax - uMin, dv = vMax - vMin; 171 var du = Math.abs(uMax) - uMin, dv = Math.abs(vMax - vMin);
148 if ((du < tolerance) && (dv < tolerance)) 172 if ((du < tolerance) && (dv < tolerance))
149 { 173 {
150 iTriangle++; 174 iTriangle++;
@@ -205,7 +229,186 @@ ShapePrimitive.refineMesh = function( verts, norms, uvs, indices, nVertices, pa
205 return nVertices; 229 return nVertices;
206}; 230};
207 231
232ShapePrimitive.convertTriangleStripToTriangles = function( indices )
233{
234 if (!indices || (indices.length < 3)) return;
235
236 var indOut = [];
237 var nInd = indices.length;
238 for (var i=2; i<nInd; i++)
239 {
240 indOut.push( indices[i-2] );
241 indOut.push( indices[i-1] );
242 indOut.push( indices[i] );
243 }
244
245 return indOut;
246};
247
248ShapePrimitive.subdivideOversizedMesh = function( vertices, normals, uvs, indices )
249{
250 var rtnArray;
251 var nVrtBytes = vertices.length*4,
252 nIndBytes = indices.length*4;
253
254 // only subdivide the input mesh if it exceeds limits
255 if ((nVrtBytes >= 65000) || (nIndBytes >= 65000))
256 {
257 var nVerts = vertices.length / 3;
258 var nVerts0 = 0, nVerts1 = 0;
259 var iSplitVrt = nVerts/2; // any triangle referencing vertex iSplitVrt or greater goes to the second half
260 var nTriangles = indices.length/3;
261 var v0 = [], v1 = [], n0 = [], n1 = [], uv0 = [], uv1 = [], i0 = [], i1 = [];
262 var map0 = [], map1 = [];
263 var index = 0;
264 for (var iTri=0; iTri<nTriangles; iTri++)
265 {
266 // determine which side to move the triangle into
267 var vDst, nDst, uvDst, iDst, mapDst, nOut;
268 var iVrts = [ indices[index], indices[index+1], indices[index+2] ];
269 if ( (iVrts[0] >= iSplitVrt) || (iVrts[1] >= iSplitVrt) || (iVrts[2] >= iSplitVrt) )
270 {
271 vDst = v0; nDst = n0; uvDst = uv0; iDst = i0; mapDst = map0; nOut = v0.length / 3;
272 }
273 else
274 {
275 vDst = v1; nDst = n1; uvDst = uv1; iDst = i1; mapDst = map1; nOut = v1.length / 3;
276 }
277
278 for (var i=0; i<3; i++)
279 {
280 var iVrt = iVrts[i];
281
282 // if this is the first time that the vertex has been encountered, copy it over to the output
283 var iOut = mapDst[iVrt];
284 if (!iOut)
285 {
286 mapDst[iVrt] = nOut;
287 vDst.push( vertices[3*iVrt] ); vDst.push( vertices[3*iVrt + 1] ); vDst.push( vertices[3*iVrt + 2] );
288 nDst.push( normals[3*iVrt] ); nDst.push( normals[3*iVrt + 1] ); nDst.push( normals[3*iVrt + 2] );
289 uvDst.push( uvs[2*iVrt] ); uvDst.push( uvs[2*iVrt + 1] );
290 iDst.push( nOut );
291 nOut++;
292 }
293 else
294 iDst.push( iOut );
295 }
296
297 index += 3;
298 }
299
300 // create objects out of the 2 halves
301 var obj1 =
302 {
303 vertices: v0,
304 normals: n0,
305 uvs: uv0,
306 indices: i0
307 },
308 obj2 =
309 {
310 vertices: v1,
311 normals: n1,
312 uvs: uv1,
313 indices: i1
314 };
315
316 console.log( "mesh split into 2 parts: " + obj1.vertices.length/3 + ", " + obj2.vertices.length/3 );
317
318 // recurse on the 2 halves in case they need subdivision
319 var arr1 = ShapePrimitive.subdivideOversizedMesh( obj1.vertices, obj1.normals, obj1.uvs, obj1.indices );
320 var arr2 = ShapePrimitive.subdivideOversizedMesh( obj2.vertices, obj2.normals, obj2.uvs, obj2.indices );
321 rtnArray = arr1.concat( arr2 );
322 }
323 else
324 {
325 rtnArray =
326 [
327 {
328 vertices: vertices,
329 normals: normals,
330 uvs: uvs,
331 indices: indices
332 }
333 ];
334 }
335
336 return rtnArray;
337};
338
339
340////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
341
342ShapePrimitive.convertTrianglesToLines = function( verts, norms, uvs, indices, vertsOut, normsOut, uvsOut, indicesOut )
343{
344 var iTriangle = 0;
345 var nTriangles = indices.length/3;
346 var index = 0;
347 var nVertices = 0;
348 while (iTriangle < nTriangles)
349 {
350 // get the indices of the 3 vertices
351 var i0 = indices[index],
352 i1 = indices[index+1],
353 i2 = indices[index+2];
354
355 // get the uv values
356 //var vrtIndex = 3*iTriangle;
357 var iuv0 = 2 * i0,
358 iuv1 = 2 * i1,
359 iuv2 = 2 * i2;
360 var u0 = uvs[iuv0], v0 = uvs[iuv0+1],
361 u1 = uvs[iuv1], v1 = uvs[iuv1+1],
362 u2 = uvs[iuv2], v2 = uvs[iuv2+1];
363
364 //calculate the position of the new vertex
365 var iPt0 = 3 * i0,
366 iPt1 = 3 * i1,
367 iPt2 = 3 * i2;
368 var x0 = verts[iPt0], y0 = verts[iPt0+1], z0 = verts[iPt0+2],
369 x1 = verts[iPt1], y1 = verts[iPt1+1], z1 = verts[iPt1+2],
370 x2 = verts[iPt2], y2 = verts[iPt2+1], z2 = verts[iPt2+2];
371
372 // calculate the normals for the new points
373 var nx0 = norms[iPt0], ny0 = norms[iPt0+1], nz0 = norms[iPt0+2],
374 nx1 = norms[iPt1], ny1 = norms[iPt1+1], nz1 = norms[iPt1+2],
375 nx2 = norms[iPt2], ny2 = norms[iPt2+1], nz2 = norms[iPt2+2];
376
377 // push everything
378 vertsOut.push( x0 ); vertsOut.push( y0 ); vertsOut.push( z0 );
379 vertsOut.push( x1 ); vertsOut.push( y1 ); vertsOut.push( z1 );
380 vertsOut.push( x1 ); vertsOut.push( y1 ); vertsOut.push( z1 );
381 vertsOut.push( x2 ); vertsOut.push( y2 ); vertsOut.push( z2 );
382 vertsOut.push( x2 ); vertsOut.push( y2 ); vertsOut.push( z2 );
383 vertsOut.push( x0 ); vertsOut.push( y0 ); vertsOut.push( z0 );
384 indicesOut.push( index ); indicesOut.push( index + 1 );
385 indicesOut.push( index + 1 ); indicesOut.push( index + 2 );
386 indicesOut.push( index + 2 ); indicesOut.push( index );
387
388 normsOut.push( nx0 ); normsOut.push( ny0 ); normsOut.push( nz0 );
389 normsOut.push( nx1 ); normsOut.push( ny1 ); normsOut.push( nz1 );
390 normsOut.push( nx1 ); normsOut.push( ny1 ); normsOut.push( nz1 );
391 normsOut.push( nx2 ); normsOut.push( ny2 ); normsOut.push( nz2 );
392 normsOut.push( nx2 ); normsOut.push( ny2 ); normsOut.push( nz2 );
393 normsOut.push( nx0 ); normsOut.push( ny0 ); normsOut.push( nz0 );
394
395 uvsOut.push( u0 ); uvsOut.push( v0 );
396 uvsOut.push( u1 ); uvsOut.push( v1 );
397 uvsOut.push( u1 ); uvsOut.push( v1 );
398 uvsOut.push( u2 ); uvsOut.push( v2 );
399 uvsOut.push( u2 ); uvsOut.push( v2 );
400 uvsOut.push( u0 ); uvsOut.push( v0 );
401