UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

2 lines (1 loc) 9.88 kB
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var t=require("../../../build/three.module.js"),n=require("../libs/fflate.module.js");function e(t,n){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=1024/Math.max(t.width,t.height),o=document.createElement("canvas");o.width=t.width*Math.min(1,e),o.height=t.height*Math.min(1,e);const r=o.getContext("2d");if(r.drawImage(t,0,0,o.width,o.height),void 0!==n){const t=parseInt(n,16),e=(t>>16&255)/255,a=(t>>8&255)/255,i=(255&t)/255,s=r.getImageData(0,0,o.width,o.height),u=s.data;for(let n=0;n<u.length;n+=4)u[n+0]=u[n+0]*e,u[n+1]=u[n+1]*a,u[n+2]=u[n+2]*i;r.putImageData(s,0,0)}return o}throw new Error("THREE.USDZExporter: No valid image data found. Unable to process texture.")}function o(){return'#usda 1.0\n(\n customLayerData = {\n string creator = "Three.js USDZExporter"\n }\n metersPerUnit = 1\n upAxis = "Y"\n)\n\n'}function r(t){const n=t.elements;return`( ${a(n,0)}, ${a(n,4)}, ${a(n,8)}, ${a(n,12)} )`}function a(t,n){return`(${t[n+0]}, ${t[n+1]}, ${t[n+2]}, ${t[n+3]})`}function i(t,n){if(void 0===t)return Array(n).fill("(0, 0, 0)").join(", ");const e=[];for(let o=0;o<t.count;o++){const n=t.getX(o),r=t.getY(o),a=t.getZ(o);e.push(`(${n.toPrecision(7)}, ${r.toPrecision(7)}, ${a.toPrecision(7)})`)}return e.join(", ")}function s(n,e){const o=" ",r=[],a=[];function i(t,o,r){const a=t.id+(r?"_"+r.getHexString():""),i=1023===t.format;return e[a]=t,`\n def Shader "Transform2d_${o}" (\n sdrMetadata = {\n string role = "math"\n }\n )\n {\n uniform token info:id = "UsdTransform2d"\n float2 inputs:in.connect = </Materials/Material_${n.id}/uvReader_st.outputs:result>\n float2 inputs:scale = ${l(t.repeat)}\n float2 inputs:translation = ${l(t.offset)}\n float2 outputs:result\n }\n\n def Shader "Texture_${t.id}_${o}"\n {\n uniform token info:id = "UsdUVTexture"\n asset inputs:file = @textures/Texture_${a}.${i?"png":"jpg"}@\n float2 inputs:st.connect = </Materials/Material_${n.id}/Transform2d_${o}.outputs:result>\n token inputs:wrapS = "repeat"\n token inputs:wrapT = "repeat"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n ${n.transparent||n.alphaTest>0?"float outputs:a":""}\n }`}return n.side,t.DoubleSide,null!==n.map?(r.push(`${o}color3f inputs:diffuseColor.connect = </Materials/Material_${n.id}/Texture_${n.map.id}_diffuse.outputs:rgb>`),n.transparent?r.push(`${o}float inputs:opacity.connect = </Materials/Material_${n.id}/Texture_${n.map.id}_diffuse.outputs:a>`):n.alphaTest>0&&(r.push(`${o}float inputs:opacity.connect = </Materials/Material_${n.id}/Texture_${n.map.id}_diffuse.outputs:a>`),r.push(`${o}float inputs:opacityThreshold = ${n.alphaTest}`)),a.push(i(n.map,"diffuse",n.color))):r.push(`${o}color3f inputs:diffuseColor = ${u(n.color)}`),null!==n.emissiveMap?(r.push(`${o}color3f inputs:emissiveColor.connect = </Materials/Material_${n.id}/Texture_${n.emissiveMap.id}_emissive.outputs:rgb>`),a.push(i(n.emissiveMap,"emissive"))):n.emissive.getHex()>0&&r.push(`${o}color3f inputs:emissiveColor = ${u(n.emissive)}`),null!==n.normalMap&&(r.push(`${o}normal3f inputs:normal.connect = </Materials/Material_${n.id}/Texture_${n.normalMap.id}_normal.outputs:rgb>`),a.push(i(n.normalMap,"normal"))),null!==n.aoMap&&(r.push(`${o}float inputs:occlusion.connect = </Materials/Material_${n.id}/Texture_${n.aoMap.id}_occlusion.outputs:r>`),a.push(i(n.aoMap,"occlusion"))),null!==n.roughnessMap&&1===n.roughness?(r.push(`${o}float inputs:roughness.connect = </Materials/Material_${n.id}/Texture_${n.roughnessMap.id}_roughness.outputs:g>`),a.push(i(n.roughnessMap,"roughness"))):r.push(`${o}float inputs:roughness = ${n.roughness}`),null!==n.metalnessMap&&1===n.metalness?(r.push(`${o}float inputs:metallic.connect = </Materials/Material_${n.id}/Texture_${n.metalnessMap.id}_metallic.outputs:b>`),a.push(i(n.metalnessMap,"metallic"))):r.push(`${o}float inputs:metallic = ${n.metalness}`),null!==n.alphaMap?(r.push(`${o}float inputs:opacity.connect = </Materials/Material_${n.id}/Texture_${n.alphaMap.id}_opacity.outputs:r>`),r.push(`${o}float inputs:opacityThreshold = 0.0001`),a.push(i(n.alphaMap,"opacity"))):r.push(`${o}float inputs:opacity = ${n.opacity}`),n.isMeshPhysicalMaterial&&(r.push(`${o}float inputs:clearcoat = ${n.clearcoat}`),r.push(`${o}float inputs:clearcoatRoughness = ${n.clearcoatRoughness}`),r.push(`${o}float inputs:ior = ${n.ior}`)),`\n def Material "Material_${n.id}"\n {\n def Shader "PreviewSurface"\n {\n uniform token info:id = "UsdPreviewSurface"\n${r.join("\n")}\n int inputs:useSpecularWorkflow = 0\n token outputs:surface\n }\n\n token outputs:surface.connect = </Materials/Material_${n.id}/PreviewSurface.outputs:surface>\n token inputs:frame:stPrimvarName = "st"\n\n def Shader "uvReader_st"\n {\n uniform token info:id = "UsdPrimvarReader_float2"\n token inputs:varname.connect = </Materials/Material_${n.id}.inputs:frame:stPrimvarName>\n float2 inputs:fallback = (0.0, 0.0)\n float2 outputs:result\n }\n\n${a.join("\n")}\n\n }\n`}function u(t){return`(${t.r}, ${t.g}, ${t.b})`}function l(t){return`(${t.x}, ${t.y})`}exports.USDZExporter=class{async parse(t,a={}){a=Object.assign({ar:{anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}}},a);const u={};u["model.usda"]=null;let l=o();l+=function(t){return`def Xform "Root"\n{\n def Scope "Scenes" (\n kind = "sceneLibrary"\n )\n {\n def Xform "Scene" (\n customData = {\n bool preliminary_collidesWithEnvironment = 0\n string sceneName = "Scene"\n }\n sceneName = "Scene"\n )\n {\n token preliminary:anchoring:type = "${t.ar.anchoring.type}"\n token preliminary:planeAnchoring:alignment = "${t.ar.planeAnchoring.alignment}"\n\n`}(a);const p={},c={};t.traverseVisible((t=>{if(t.isMesh){const e=t.geometry,a=t.material;if(a.isMeshStandardMaterial){const s="geometries/Geometry_"+e.id+".usd";if(!(s in u)){const t=function(t){return`\ndef "Geometry"\n{\n ${function(t){const n="Geometry",e=t.attributes,o=e.position.count;return`\n def Mesh "${n}"\n {\n int[] faceVertexCounts = [${function(t){const n=null!==t.index?t.index.count:t.attributes.position.count;return Array(n/3).fill(3).join(", ")}(t)}]\n int[] faceVertexIndices = [${function(t){const n=t.index,e=[];if(null!==n)for(let o=0;o<n.count;o++)e.push(n.getX(o));else{const n=t.attributes.position.count;for(let t=0;t<n;t++)e.push(t)}return e.join(", ")}(t)}]\n normal3f[] normals = [${i(e.normal,o)}] (\n interpolation = "vertex"\n )\n point3f[] points = [${i(e.position,o)}]\n float2[] primvars:st = [${function(t,n){if(void 0===t)return Array(n).fill("(0, 0)").join(", ");const e=[];for(let o=0;o<t.count;o++){const n=t.getX(o),r=t.getY(o);e.push(`(${n.toPrecision(7)}, ${1-r.toPrecision(7)})`)}return e.join(", ")}(e.uv,o)}] (\n interpolation = "vertex"\n )\n uniform token subdivisionScheme = "none"\n }\n`}(t)}\n}\n`}(e);u[s]=function(t){let e=o();return e+=t,n.strToU8(e)}(t)}a.uuid in p||(p[a.uuid]=a),l+=function(t,n,e){const o="Object_"+t.id,a=r(t.matrixWorld);t.matrixWorld.determinant();return`def Xform "${o}" (\n prepend references = @./geometries/Geometry_${n.id}.usd@</Geometry>\n)\n{\n matrix4d xformOp:transform = ${a}\n uniform token[] xformOpOrder = ["xformOp:transform"]\n\n rel material:binding = </Materials/Material_${e.id}>\n}\n\n`}(t,e,a)}}else t.isCamera&&(l+=function(t){const n=t.name?t.name:"Camera_"+t.id,e=r(t.matrixWorld);t.matrixWorld.determinant();return t.isOrthographicCamera?`def Camera "${n}"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${e}\n\t\t\tuniform token[] xformOpOrder = ["xformOp:transform"]\n\t\n\t\t\tfloat2 clippingRange = (${t.near.toPrecision(7)}, ${t.far.toPrecision(7)})\n\t\t\tfloat horizontalAperture = ${(10*(Math.abs(t.left)+Math.abs(t.right))).toPrecision(7)}\n\t\t\tfloat verticalAperture = ${(10*(Math.abs(t.top)+Math.abs(t.bottom))).toPrecision(7)}\n\t\t\ttoken projection = "orthographic"\n\t\t}\n\t\n\t`:`def Camera "${n}"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${e}\n\t\t\tuniform token[] xformOpOrder = ["xformOp:transform"]\n\t\n\t\t\tfloat2 clippingRange = (${t.near.toPrecision(7)}, ${t.far.toPrecision(7)})\n\t\t\tfloat focalLength = ${t.getFocalLength().toPrecision(7)}\n\t\t\tfloat focusDistance = ${t.focus.toPrecision(7)}\n\t\t\tfloat horizontalAperture = ${t.getFilmWidth().toPrecision(7)}\n\t\t\ttoken projection = "perspective"\n\t\t\tfloat verticalAperture = ${t.getFilmHeight().toPrecision(7)}\n\t\t}\n\t\n\t`}(t))})),l+="\n }\n }\n}\n\n",l+=function(t,n){const e=[];for(const o in t){const r=t[o];e.push(s(r,n))}return`def "Materials"\n{\n${e.join("")}\n}\n\n`}(p,c),u["model.usda"]=n.strToU8(l),l=null;for(const n in c){const t=c[n],o=n.split("_")[1],r=1023===t.format,a=e(t.image,o),i=await new Promise((t=>a.toBlob(t,r?"image/png":"image/jpeg",1)));u[`textures/Texture_${n}.${r?"png":"jpg"}`]=new Uint8Array(await i.arrayBuffer())}let f=0;for(const n in u){const t=u[n];f+=34+n.length;const e=63&f;if(4!==e){const o=new Uint8Array(64-e);u[n]=[t,{extra:{12345:o}}]}f=t.length}return n.zipSync(u,{level:0})}};