UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

1 lines 5.55 kB
{"version":3,"file":"UVsDebug.cjs","sources":["../../src/utils/UVsDebug.js"],"sourcesContent":["import { Vector2 } from 'three'\n\n/**\n * tool for \"unwrapping\" and debugging three.js geometries UV mapping\n *\n * Sample usage:\n *\tdocument.body.appendChild( UVsDebug( new THREE.SphereGeometry( 10, 10, 10, 10 ) );\n *\n */\n\nfunction UVsDebug(geometry, size = 1024) {\n // handles wrapping of uv.x > 1 only\n\n const abc = 'abc'\n const a = new Vector2()\n const b = new Vector2()\n\n const uvs = [new Vector2(), new Vector2(), new Vector2()]\n\n const face = []\n\n const canvas = document.createElement('canvas')\n const width = size // power of 2 required for wrapping\n const height = size\n canvas.width = width\n canvas.height = height\n\n const ctx = canvas.getContext('2d')\n ctx.lineWidth = 1\n ctx.strokeStyle = 'rgb( 63, 63, 63 )'\n ctx.textAlign = 'center'\n\n // paint background white\n\n ctx.fillStyle = 'rgb( 255, 255, 255 )'\n ctx.fillRect(0, 0, width, height)\n\n const index = geometry.index\n const uvAttribute = geometry.attributes.uv\n\n if (index) {\n // indexed geometry\n\n for (let i = 0, il = index.count; i < il; i += 3) {\n face[0] = index.getX(i)\n face[1] = index.getX(i + 1)\n face[2] = index.getX(i + 2)\n\n uvs[0].fromBufferAttribute(uvAttribute, face[0])\n uvs[1].fromBufferAttribute(uvAttribute, face[1])\n uvs[2].fromBufferAttribute(uvAttribute, face[2])\n\n processFace(face, uvs, i / 3)\n }\n } else {\n // non-indexed geometry\n\n for (let i = 0, il = uvAttribute.count; i < il; i += 3) {\n face[0] = i\n face[1] = i + 1\n face[2] = i + 2\n\n uvs[0].fromBufferAttribute(uvAttribute, face[0])\n uvs[1].fromBufferAttribute(uvAttribute, face[1])\n uvs[2].fromBufferAttribute(uvAttribute, face[2])\n\n processFace(face, uvs, i / 3)\n }\n }\n\n return canvas\n\n function processFace(face, uvs, index) {\n // draw contour of face\n\n ctx.beginPath()\n\n a.set(0, 0)\n\n for (let j = 0, jl = uvs.length; j < jl; j++) {\n const uv = uvs[j]\n\n a.x += uv.x\n a.y += uv.y\n\n if (j === 0) {\n ctx.moveTo(uv.x * (width - 2) + 0.5, (1 - uv.y) * (height - 2) + 0.5)\n } else {\n ctx.lineTo(uv.x * (width - 2) + 0.5, (1 - uv.y) * (height - 2) + 0.5)\n }\n }\n\n ctx.closePath()\n ctx.stroke()\n\n // calculate center of face\n\n a.divideScalar(uvs.length)\n\n // label the face number\n\n ctx.font = '18px Arial'\n ctx.fillStyle = 'rgb( 63, 63, 63 )'\n ctx.fillText(index, a.x * width, (1 - a.y) * height)\n\n if (a.x > 0.95) {\n // wrap x // 0.95 is arbitrary\n\n ctx.fillText(index, (a.x % 1) * width, (1 - a.y) * height)\n }\n\n //\n\n ctx.font = '12px Arial'\n ctx.fillStyle = 'rgb( 191, 191, 191 )'\n\n // label uv edge orders\n\n for (let j = 0, jl = uvs.length; j < jl; j++) {\n const uv = uvs[j]\n b.addVectors(a, uv).divideScalar(2)\n\n const vnum = face[j]\n ctx.fillText(abc[j] + vnum, b.x * width, (1 - b.y) * height)\n\n if (b.x > 0.95) {\n // wrap x\n\n ctx.fillText(abc[j] + vnum, (b.x % 1) * width, (1 - b.y) * height)\n }\n }\n }\n}\n\nexport { UVsDebug }\n"],"names":["Vector2","face","uvs","index"],"mappings":"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"}