-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsrc.bf3787d2.js.map
1 lines (1 loc) · 98.2 KB
/
src.bf3787d2.js.map
1
{"version":3,"sources":["src/URIBuffers.js","src/logToGLTF.js","src/visualizer.js","src/index.js"],"names":["createStandardPrimitives","accessorI","materialI","mode","attributes","POSITION","NORMAL","TEXCOORD_0","material","indices","CubeMesh","constructor","bufferIndex","viewIndex","accessorIndex","bufferCount","buffers","name","byteLength","uri","viewCount","views","buffer","byteOffset","target","byteStride","accessorCount","accessors","bufferView","componentType","count","max","min","type","primitives","SphereMesh","CylinderMesh","DEFAULT_COLOR","DEFAULT_METALLIC","DEFAULT_ROUGHNESS","BYTES_IN_FLOAT","SCHEMA","linspace","a","b","n","Math","round","ret","Array","i","float32ArrayToBase64","buf","Uint8Array","length","ascii","len","String","fromCharCode","btoa","roundToMultiple","value","multiple","t","LogToGLTF","reset","ajv","Ajv","validator","compile","logObject","glTFObject","scenes","scene","nodes","meshes","materials","animations","bufferViews","asset","version","nodeIndex","meshIndex","materialIndex","cached","dynamicNodes","convert","log","Error","errorsText","errors","createScenes","createAnimations","getTimeEnd","timeEnd","getName","push","objects","map","obj","createNode","node","mesh","getMeshIndex","translation","rotation","scale","static","currentIndex","objMesh","objMaterial","isNew","getMaterialIndex","meshI","findIndex","createMesh","Object","prototype","hasOwnProperty","call","Creator","console","warn","meshData","apply","color","metallic","roughness","createMaterial","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","timeStep","timeSteps","frames","timeData","Float32Array","timeByteLength","timeURI","timeBufferI","addBase64Buffer","timeViewI","addView","timeAccessorI","addAccessor","animProps","forEach","nodeI","data","dataType","animType","valueType","slice","prev","r","s","frame","prop","propI","valueI","animArray","concat","animData","animByteLength","animURI","animBufferI","offset","propLength","propCount","propLengthBytes","propName","propViewI","propAccessorI","addAnimation","dataURI","animAccessorI","samplers","input","interpolation","output","channels","sampler","path","THREE","window","DEFAULT_CAMERA_POSITION","onWindowResize","vis","camera","aspect","innerWidth","innerHeight","updateProjectionMatrix","renderer","setSize","disposeHierarchy","callback","children","child","disposeNode","parentObject","traverse","Mesh","geometry","dispose","materialArray","MeshFaceMaterial","MultiMaterial","mtrl","lightMap","bumpMap","normalMap","specularMap","envMap","save","blob","filename","link","document","createElement","style","display","body","appendChild","href","URL","createObjectURL","download","click","Visualizer","containerID","timeCB","readyCB","endCB","isFollowing","followObject","gltfData","container","getElementById","width","height","Scene","add","AmbientLight","spotLight","SpotLight","position","set","castShadow","shadow","LightShadow","PerspectiveCamera","bias","mapSize","WebGLRenderer","antialias","alpha","setPixelRatio","devicePixelRatio","setClearColor","shadowMap","enabled","domElement","groundMaterial","ShadowMaterial","opacity","groundGeometry","PlaneGeometry","rotateX","PI","ground","receiveShadow","grid","GridHelper","transparent","controls","OrbitControls","enableKeys","axis","AxesHelper","loader","GLTFLoader","clock","Clock","mixer","clips","actions","addEventListener","loadAnimation","converter","gltf","objNames","parse","JSON","stringify","isMesh","needsUpdate","loadedScene","objectColors","Map","traverseVisible","clone","AnimationMixer","clip","clipAction","action","play","paused","setLoop","LoopOnce","Infinity","error","setTime","newTime","time","setPlaybackSpeed","newTimeScale","timeScale","resetCamera","follow","objIdx","getObjectByName","cameraRelativePosition","Vector3","subVectors","unFollow","loop","LoopRepeat","noLoop","pause","enable","getObjectNames","noColor","get","isShutdown","remove","uncacheAction","uncacheClip","start","requestAnimationFrame","isRunning","update","getDelta","render","downloadGltf","Blob","visualizer","app","ports","vis2UiTime","send","title","vis2UiLoaded","vis2UiCommand","urlParams","URLSearchParams","location","search","logParam","Elm","Main","init","flags","ui2VisCommand","subscribe","command","ui2VisTime","ui2VisSpeed","newSpeed","ui2VisData","str","vis2UiError","message"],"mappings":"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","file":"src.bf3787d2.js","sourceRoot":"..","sourcesContent":["\n// TODO: export only needed features\n\n\nexport function createStandardPrimitives(accessorI, materialI) {\n return [{\n mode: 4,\n attributes: {\n POSITION: accessorI + 1,\n NORMAL: accessorI + 2,\n TEXCOORD_0: accessorI + 3,\n },\n material: materialI,\n indices: accessorI,\n }];\n}\n\n\nexport class CubeMesh {\n\n constructor(bufferIndex, viewIndex, accessorIndex, materialI) {\n this.bufferCount = 1;\n this.buffers = [{\n name: 'cube',\n byteLength: 840,\n uri: 'data:application/octet-stream;base64,AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAAAAPwAAAD8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAA',\n }];\n\n\n this.viewCount = 4;\n this.views = [{\n name: 'cube indices',\n buffer: bufferIndex,\n byteOffset: 0,\n byteLength: 72,\n target: 34963,\n }, {\n name: 'cube positions',\n buffer: bufferIndex,\n byteOffset: 72,\n byteLength: 288,\n target: 34962,\n byteStride: 12,\n }, {\n name: 'cube normals',\n buffer: bufferIndex,\n byteOffset: 360,\n byteLength: 288,\n target: 34962,\n byteStride: 12,\n }, {\n name: 'cube texcoords',\n buffer: bufferIndex,\n byteOffset: 648,\n byteLength: 192,\n target: 34962,\n byteStride: 8,\n }];\n\n\n this.accessorCount = 4;\n this.accessors = [{\n name: 'cube indices',\n bufferView: viewIndex,\n componentType: 5123,\n count: 36,\n max: [23],\n min: [0],\n type: 'SCALAR',\n }, {\n name: 'cube positions',\n bufferView: viewIndex + 1,\n componentType: 5126,\n count: 24,\n max: [0.5, 0.5, 0.5],\n min: [-0.5, -0.5, -0.5],\n type: 'VEC3',\n }, {\n name: 'cube normals',\n bufferView: viewIndex + 2,\n componentType: 5126,\n count: 24,\n max: [1, 1, 1],\n min: [-1, -1, -1],\n type: 'VEC3',\n }, {\n name: 'cube texcoords',\n bufferView: viewIndex + 3,\n componentType: 5126,\n count: 24,\n max: [1, 1],\n min: [0, 0],\n type: 'VEC2',\n }];\n\n\n this.primitives = createStandardPrimitives(accessorIndex, materialI);\n }\n}\n\nexport class SphereMesh {\n\n constructor(bufferIndex, viewIndex, accessorIndex, materialI) {\n this.bufferCount = 1;\n this.buffers = [{\n name: 'sphere',\n byteLength: 26624,\n uri: 'data:application/octet-stream;base64,AAAZABoAAQAaABsAAgAbABwAAwAcAB0ABAAdAB4ABQAeAB8ABgAfACAABwAgACEACAAhACIACQAiACMACgAjACQACwAkACUADAAlACYADQAmACcADgAnACgADwAoACkAEAApACoAEQAqACsAEgArACwAEwAsAC0AFAAtAC4AFQAuAC8AFgAvADAAFwAwADEAGgAZADMAGQAyADMAGwAaADQAGgAzADQAHAAbADUAGwA0ADUAHQAcADYAHAA1ADYAHgAdADcAHQA2ADcAHwAeADgAHgA3ADgAIAAfADkAHwA4ADkAIQAgADoAIAA5ADoAIgAhADsAIQA6ADsAIwAiADwAIgA7ADwAJAAjAD0AIwA8AD0AJQAkAD4AJAA9AD4AJgAlAD8AJQA+AD8AJwAmAEAAJgA/AEAAKAAnAEEAJwBAAEEAKQAoAEIAKABBAEIAKgApAEMAKQBCAEMAKwAqAEQAKgBDAEQALAArAEUAKwBEAEUALQAsAEYALABFAEYALgAtAEcALQBGAEcALwAuAEgALgBHAEgAMAAvAEkALwBIAEkAMQAwAEoAMABJAEoAMwAyAEwAMgBLAEwANAAzAE0AMwBMAE0ANQA0AE4ANABNAE4ANgA1AE8ANQBOAE8ANwA2AFAANgBPAFAAOAA3AFEANwBQAFEAOQA4AFIAOABRAFIAOgA5AFMAOQBSAFMAOwA6AFQAOgBTAFQAPAA7AFUAOwBUAFUAPQA8AFYAPABVAFYAPgA9AFcAPQBWAFcAPwA+AFgAPgBXAFgAQAA/AFkAPwBYAFkAQQBAAFoAQABZAFoAQgBBAFsAQQBaAFsAQwBCAFwAQgBbAFwARABDAF0AQwBcAF0ARQBEAF4ARABdAF4ARgBFAF8ARQBeAF8ARwBGAGAARgBfAGAASABHAGEARwBgAGEASQBIAGIASABhAGIASgBJAGMASQBiAGMATABLAGUASwBkAGUATQBMAGYATABlAGYATgBNAGcATQBmAGcATwBOAGgATgBnAGgAUABPAGkATwBoAGkAUQBQAGoAUABpAGoAUgBRAGsAUQBqAGsAUwBSAGwAUgBrAGwAVABTAG0AUwBsAG0AVQBUAG4AVABtAG4AVgBVAG8AVQBuAG8AVwBWAHAAVgBvAHAAWABXAHEAVwBwAHEAWQBYAHIAWABxAHIAWgBZAHMAWQByAHMAWwBaAHQAWgBzAHQAXABbAHUAWwB0AHUAXQBcAHYAXAB1AHYAXgBdAHcAXQB2AHcAXwBeAHgAXgB3AHgAYABfAHkAXwB4AHkAYQBgAHoAYAB5AHoAYgBhAHsAYQB6AHsAYwBiAHwAYgB7AHwAZQBkAH4AZAB9AH4AZgBlAH8AZQB+AH8AZwBmAIAAZgB/AIAAaABnAIEAZwCAAIEAaQBoAIIAaACBAIIAagBpAIMAaQCCAIMAawBqAIQAagCDAIQAbABrAIUAawCEAIUAbQBsAIYAbACFAIYAbgBtAIcAbQCGAIcAbwBuAIgAbgCHAIgAcABvAIkAbwCIAIkAcQBwAIoAcACJAIoAcgBxAIsAcQCKAIsAcwByAIwAcgCLAIwAdABzAI0AcwCMAI0AdQB0AI4AdACNAI4AdgB1AI8AdQCOAI8AdwB2AJAAdgCPAJAAeAB3AJEAdwCQAJEAeQB4AJIAeACRAJIAegB5AJMAeQCSAJMAewB6AJQAegCTAJQAfAB7AJUAewCUAJUAfgB9AJcAfQCWAJcAfwB+AJgAfgCXAJgAgAB/AJkAfwCYAJkAgQCAAJoAgACZAJoAggCBAJsAgQCaAJsAgwCCAJwAggCbAJwAhACDAJ0AgwCcAJ0AhQCEAJ4AhACdAJ4AhgCFAJ8AhQCeAJ8AhwCGAKAAhgCfAKAAiACHAKEAhwCgAKEAiQCIAKIAiAChAKIAigCJAKMAiQCiAKMAiwCKAKQAigCjAKQAjACLAKUAiwCkAKUAjQCMAKYAjAClAKYAjgCNAKcAjQCmAKcAjwCOAKgAjgCnAKgAkACPAKkAjwCoAKkAkQCQAKoAkACpAKoAkgCRAKsAkQCqAKsAkwCSAKwAkgCrAKwAlACTAK0AkwCsAK0AlQCUAK4AlACtAK4AlwCWALAAlgCvALAAmACXALEAlwCwALEAmQCYALIAmACxALIAmgCZALMAmQCyALMAmwCaALQAmgCzALQAnACbALUAmwC0ALUAnQCcALYAnAC1ALYAngCdALcAnQC2ALcAnwCeALgAngC3ALgAoACfALkAnwC4ALkAoQCgALoAoAC5ALoAogChALsAoQC6ALsAowCiALwAogC7ALwApACjAL0AowC8AL0ApQCkAL4ApAC9AL4ApgClAL8ApQC+AL8ApwCmAMAApgC/AMAAqACnAMEApwDAAMEAqQCoAMIAqADBAMIAqgCpAMMAqQDCAMMAqwCqAMQAqgDDAMQArACrAMUAqwDEAMUArQCsAMYArADFAMYArgCtAMcArQDGAMcAsACvAMkArwDIAMkAsQCwAMoAsADJAMoAsgCxAMsAsQDKAMsAswCyAMwAsgDLAMwAtACzAM0AswDMAM0AtQC0AM4AtADNAM4AtgC1AM8AtQDOAM8AtwC2ANAAtgDPANAAuAC3ANEAtwDQANEAuQC4ANIAuADRANIAugC5ANMAuQDSANMAuwC6ANQAugDTANQAvAC7ANUAuwDUANUAvQC8ANYAvADVANYAvgC9ANcAvQDWANcAvwC+ANgAvgDXANgAwAC/ANkAvwDYANkAwQDAANoAwADZANoAwgDBANsAwQDaANsAwwDCANwAwgDbANwAxADDAN0AwwDcAN0AxQDEAN4AxADdAN4AxgDFAN8AxQDeAN8AxwDGAOAAxgDfAOAAyQDIAOIAyADhAOIAygDJAOMAyQDiAOMAywDKAOQAygDjAOQAzADLAOUAywDkAOUAzQDMAOYAzADlAOYAzgDNAOcAzQDmAOcAzwDOAOgAzgDnAOgA0ADPAOkAzwDoAOkA0QDQAOoA0ADpAOoA0gDRAOsA0QDqAOsA0wDSAOwA0gDrAOwA1ADTAO0A0wDsAO0A1QDUAO4A1ADtAO4A1gDVAO8A1QDuAO8A1wDWAPAA1gDvAPAA2ADXAPEA1wDwAPEA2QDYAPIA2ADxAPIA2gDZAPMA2QDyAPMA2wDaAPQA2gDzAPQA3ADbAPUA2wD0APUA3QDcAPYA3AD1APYA3gDdAPcA3QD2APcA3wDeAPgA3gD3APgA4ADfAPkA3wD4APkA4gDhAPsA4QD6APsA4wDiAPwA4gD7APwA5ADjAP0A4wD8AP0A5QDkAP4A5AD9AP4A5gDlAP8A5QD+AP8A5wDmAAAB5gD/AAAB6ADnAAEB5wAAAQEB6QDoAAIB6AABAQIB6gDpAAMB6QACAQMB6wDqAAQB6gADAQQB7ADrAAUB6wAEAQUB7QDsAAYB7AAFAQYB7gDtAAcB7QAGAQcB7wDuAAgB7gAHAQgB8ADvAAkB7wAIAQkB8QDwAAoB8AAJAQoB8gDxAAsB8QAKAQsB8wDyAAwB8gALAQwB9ADzAA0B8wAMAQ0B9QD0AA4B9AANAQ4B9gD1AA8B9QAOAQ8B9wD2ABAB9gAPARAB+AD3ABEB9wAQAREB+QD4ABIB+AARARIB+wD6ABQB+gATARQB/AD7ABUB+wAUARUB/QD8ABYB/AAVARYB/gD9ABcB/QAWARcB/wD+ABgB/gAXARgBAAH/ABkB/wAYARkBAQEAARoBAAEZARoBAgEBARsBAQEaARsBAwECARwBAgEbARwBBAEDAR0BAwEcAR0BBQEEAR4BBAEdAR4BBgEFAR8BBQEeAR8BBwEGASABBgEfASABCAEHASEBBwEgASEBCQEIASIBCAEhASIBCgEJASMBCQEiASMBCwEKASQBCgEjASQBDAELASUBCwEkASUBDQEMASYBDAElASYBDgENAScBDQEmAScBDwEOASgBDgEnASgBEAEPASkBDwEoASkBEQEQASoBEAEpASoBEgERASsBEQEqASsBFAETAS0BEwEsAS0BFQEUAS4BFAEtAS4BFgEVAS8BFQEuAS8BFwEWATABFgEvATABGAEXATEBFwEwATEBGQEYATIBGAExATIBGgEZATMBGQEyATMBGwEaATQBGgEzATQBHAEbATUBGwE0ATUBHQEcATYBHAE1ATYBHgEdATcBHQE2ATcBHwEeATgBHgE3ATgBIAEfATkBHwE4ATkBIQEgAToBIAE5AToBIgEhATsBIQE6ATsBIwEiATwBIgE7ATwBJAEjAT0BIwE8AT0BJQEkAT4BJAE9AT4BJgElAT8BJQE+AT8BJwEmAUABJgE/AUABKAEnAUEBJwFAAUEBKQEoAUIBKAFBAUIBKgEpAUMBKQFCAUMBKwEqAUQBKgFDAUQBLQEsAUYBLAFFAUYBLgEtAUcBLQFGAUcBLwEuAUgBLgFHAUgBMAEvAUkBLwFIAUkBMQEwAUoBMAFJAUoBMgExAUsBMQFKAUsBMwEyAUwBMgFLAUwBNAEzAU0BMwFMAU0BNQE0AU4BNAFNAU4BNgE1AU8BNQFOAU8BNwE2AVABNgFPAVABOAE3AVEBNwFQAVEBOQE4AVIBOAFRAVIBOgE5AVMBOQFSAVMBOwE6AVQBOgFTAVQBPAE7AVUBOwFUAVUBPQE8AVYBPAFVAVYBPgE9AVcBPQFWAVcBPwE+AVgBPgFXAVgBQAE/AVkBPwFYAVkBQQFAAVoBQAFZAVoBQgFBAVsBQQFaAVsBQwFCAVwBQgFbAVwBRAFDAV0BQwFcAV0BRgFFAV8BRQFeAV8BRwFGAWABRgFfAWABSAFHAWEBRwFgAWEBSQFIAWIBSAFhAWIBSgFJAWMBSQFiAWMBSwFKAWQBSgFjAWQBTAFLAWUBSwFkAWUBTQFMAWYBTAFlAWYBTgFNAWcBTQFmAWcBTwFOAWgBTgFnAWgBUAFPAWkBTwFoAWkBUQFQAWoBUAFpAWoBUgFRAWsBUQFqAWsBUwFSAWwBUgFrAWwBVAFTAW0BUwFsAW0BVQFUAW4BVAFtAW4BVgFVAW8BVQFuAW8BVwFWAXABVgFvAXABWAFXAXEBVwFwAXEBWQFYAXIBWAFxAXIBWgFZAXMBWQFyAXMBWwFaAXQBWgFzAXQBXAFbAXUBWwF0AXUBXQFcAXYBXAF1AXYBXwFeAXgBXgF3AXgBYAFfAXkBXwF4AXkBYQFgAXoBYAF5AXoBYgFhAXsBYQF6AXsBYwFiAXwBYgF7AXwBZAFjAX0BYwF8AX0BZQFkAX4BZAF9AX4BZgFlAX8BZQF+AX8BZwFmAYABZgF/AYABaAFnAYEBZwGAAYEBaQFoAYIBaAGBAYIBagFpAYMBaQGCAYMBawFqAYQBagGDAYQBbAFrAYUBawGEAYUBbQFsAYYBbAGFAYYBbgFtAYcBbQGGAYcBbwFuAYgBbgGHAYgBcAFvAYkBbwGIAYkBcQFwAYoBcAGJAYoBcgFxAYsBcQGKAYsBcwFyAYwBcgGLAYwBdAFzAY0BcwGMAY0BdQF0AY4BdAGNAY4BdgF1AY8BdQGOAY8BeAF3AZEBdwGQAZEBeQF4AZIBeAGRAZIBegF5AZMBeQGSAZMBewF6AZQBegGTAZQBfAF7AZUBewGUAZUBfQF8AZYBfAGVAZYBfgF9AZcBfQGWAZcBfwF+AZgBfgGXAZgBgAF/AZkBfwGYAZkBgQGAAZoBgAGZAZoBggGBAZsBgQGaAZsBgwGCAZwBggGbAZwBhAGDAZ0BgwGcAZ0BhQGEAZ4BhAGdAZ4BhgGFAZ8BhQGeAZ8BhwGGAaABhgGfAaABiAGHAaEBhwGgAaEBiQGIAaIBiAGhAaIBigGJAaMBiQGiAaMBiwGKAaQBigGjAaQBjAGLAaUBiwGkAaUBjQGMAaYBjAGlAaYBjgGNAacBjQGmAacBjwGOAagBjgGnAagBkQGQAaoBkAGpAaoBkgGRAasBkQGqAasBkwGSAawBkgGrAawBlAGTAa0BkwGsAa0BlQGUAa4BlAGtAa4BlgGVAa8BlQGuAa8BlwGWAbABlgGvAbABmAGXAbEBlwGwAbEBmQGYAbIBmAGxAbIBmgGZAbMBmQGyAbMBmwGaAbQBmgGzAbQBnAGbAbUBmwG0AbUBnQGcAbYBnAG1AbYBngGdAbcBnQG2AbcBnwGeAbgBngG3AbgBoAGfAbkBnwG4AbkBoQGgAboBoAG5AboBogGhAbsBoQG6AbsBowGiAbwBogG7AbwBpAGjAb0BowG8Ab0BpQGkAb4BpAG9Ab4BpgGlAb8BpQG+Ab8BpwGmAcABpgG/AcABqAGnAcEBpwHAAcEBqgGpAcMBqQHCAcMBqwGqAcQBqgHDAcQBrAGrAcUBqwHEAcUBrQGsAcYBrAHFAcYBrgGtAccBrQHGAccBrwGuAcgBrgHHAcgBsAGvAckBrwHIAckBsQGwAcoBsAHJAcoBsgGxAcsBsQHKAcsBswGyAcwBsgHLAcwBtAGzAc0BswHMAc0BtQG0Ac4BtAHNAc4BtgG1Ac8BtQHOAc8BtwG2AdABtgHPAdABuAG3AdEBtwHQAdEBuQG4AdIBuAHRAdIBugG5AdMBuQHSAdMBuwG6AdQBugHTAdQBvAG7AdUBuwHUAdUBvQG8AdYBvAHVAdYBvgG9AdcBvQHWAdcBvwG+AdgBvgHXAdgBwAG/AdkBvwHYAdkBwQHAAdoBwAHZAdoBwwHCAdwBwgHbAdwBxAHDAd0BwwHcAd0BxQHEAd4BxAHdAd4BxgHFAd8BxQHeAd8BxwHGAeABxgHfAeAByAHHAeEBxwHgAeEByQHIAeIByAHhAeIBygHJAeMByQHiAeMBywHKAeQBygHjAeQBzAHLAeUBywHkAeUBzQHMAeYBzAHlAeYBzgHNAecBzQHmAecBzwHOAegBzgHnAegB0AHPAekBzwHoAekB0QHQAeoB0AHpAeoB0gHRAesB0QHqAesB0wHSAewB0gHrAewB1AHTAe0B0wHsAe0B1QHUAe4B1AHtAe4B1gHVAe8B1QHuAe8B1wHWAfAB1gHvAfAB2AHXAfEB1wHwAfEB2QHYAfIB2AHxAfIB2gHZAfMB2QHyAfMB3AHbAfUB2wH0AfUB3QHcAfYB3AH1AfYB3gHdAfcB3QH2AfcB3wHeAfgB3gH3AfgB4AHfAfkB3wH4AfkB4QHgAfoB4AH5AfoB4gHhAfsB4QH6AfsB4wHiAfwB4gH7AfwB5AHjAf0B4wH8Af0B5QHkAf4B5AH9Af4B5gHlAf8B5QH+Af8B5wHmAQAC5gH/AQAC6AHnAQEC5wEAAgEC6QHoAQIC6AEBAgIC6gHpAQMC6QECAgMC6wHqAQQC6gEDAgQC7AHrAQUC6wEEAgUC7QHsAQYC7AEFAgYC7gHtAQcC7QEGAgcC7wHuAQgC7gEHAggC8AHvAQkC7wEIAgkC8QHwAQoC8AEJAgoC8gHxAQsC8QEKAgsC8wHyAQwC8gELAgwC9QH0AQ4C9AENAg4C9gH1AQ8C9QEOAg8C9wH2ARAC9gEPAhAC+AH3AREC9wEQAhEC+QH4ARIC+AERAhIC+gH5ARMC+QESAhMC+wH6ARQC+gETAhQC/AH7ARUC+wEUAhUC/QH8ARYC/AEVAhYC/gH9ARcC/QEWAhcC/wH+ARgC/gEXAhgCAAL/ARkC/wEYAhkCAQIAAhoCAAIZAhoCAgIBAhsCAQIaAhsCAwICAhwCAgIbAhwCBAIDAh0CAwIcAh0CBQIEAh4CBAIdAh4CBgIFAh8CBQIeAh8CBwIGAiACBgIfAiACCAIHAiECBwIgAiECCQIIAiICCAIhAiICCgIJAiMCCQIiAiMCCwIKAiQCCgIjAiQCDAILAiUCCwIkAiUCDgINAicCDQImAicCDwIOAigCDgInAigCEAIPAikCDwIoAikCEQIQAioCEAIpAioCEgIRAisCEQIqAisCEwISAiwCEgIrAiwCFAITAi0CEwIsAi0CFQIUAi4CFAItAi4CFgIVAi8CFQIuAi8CFwIWAjACFgIvAjACGAIXAjECFwIwAjECGQIYAjICGAIxAjICGgIZAjMCGQIyAjMCGwIaAjQCGgIzAjQCHAIbAjUCGwI0AjUCHQIcAjYCHAI1AjYCHgIdAjcCHQI2AjcCHwIeAjgCHgI3AjgCIAIfAjkCHwI4AjkCIQIgAjoCIAI5AjoCIgIhAjsCIQI6AjsCIwIiAjwCIgI7AjwCJAIjAj0CIwI8Aj0CJQIkAj4CJAI9Aj4CJwImAkACJgI/AkACKAInAkECJwJAAkECKQIoAkICKAJBAkICKgIpAkMCKQJCAkMCKwIqAkQCKgJDAkQCLAIrAkUCKwJEAkUCLQIsAkYCLAJFAkYCLgItAkcCLQJGAkcCLwIuAkgCLgJHAkgC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',\n }];\n\n\n this.viewCount = 4;\n this.views = [{\n name: 'sphere indices',\n buffer: bufferIndex,\n byteOffset: 0,\n byteLength: 6624,\n target: 34963,\n }, {\n name: 'sphere positions',\n buffer: bufferIndex,\n byteOffset: 6624,\n byteLength: 7500,\n target: 34962,\n byteStride: 12,\n }, {\n name: 'sphere normals',\n buffer: bufferIndex,\n byteOffset: 14124,\n byteLength: 7500,\n target: 34962,\n byteStride: 12,\n }, {\n name: 'sphere texcoords',\n buffer: bufferIndex,\n byteOffset: 21624,\n byteLength: 5000,\n target: 34962,\n byteStride: 8,\n }];\n\n\n this.accessorCount = 4;\n this.accessors = [{\n name: 'sphere indices',\n bufferView: viewIndex,\n componentType: 5123,\n count: 3312,\n max: [624],\n min: [0],\n type: 'SCALAR',\n }, {\n name: 'sphere positions',\n bufferView: viewIndex + 1,\n componentType: 5126,\n count: 625,\n max: [1, 1, 1],\n min: [-1, -1, -1],\n type: 'VEC3',\n }, {\n name: 'sphere normals',\n bufferView: viewIndex + 2,\n componentType: 5126,\n count: 625,\n max: [1, 1, 1],\n min: [-1, -1, -1],\n type: 'VEC3',\n }, {\n name: 'sphere texcoords',\n bufferView: viewIndex + 3,\n componentType: 5126,\n count: 625,\n max: [1, 1],\n min: [0, 0],\n type: 'VEC2',\n }];\n\n this.primitives = createStandardPrimitives(accessorIndex, materialI);\n }\n}\n\nexport class CylinderMesh {\n\n constructor(bufferIndex, viewIndex, accessorIndex, materialI) {\n this.bufferCount = 1;\n this.buffers = [{\n name: 'cylinder',\n byteLength: 5312,\n uri: 'data:application/octet-stream;base64,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AAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgD+rqio9AACAP6uqqj0AAIA/AAAAPgAAgD+rqio+AACAP1VVVT4AAIA/AACAPgAAgD9VVZU+AACAP6uqqj4AAIA/AADAPgAAgD9VVdU+AACAP6uq6j4AAIA/AAAAPwAAgD+rqgo/AACAP1VVFT8AAIA/AAAgPwAAgD+rqio/AACAP1VVNT8AAIA/AABAPwAAgD+rqko/AACAP1VVVT8AAIA/AABgPwAAgD+rqmo/AACAP1VVdT8AAIA/AACAPwAAgD8AAAAAAAAAAKuqKj0AAAAAq6qqPQAAAAAAAAA+AAAAAKuqKj4AAAAAVVVVPgAAAAAAAIA+AAAAAFVVlT4AAAAAq6qqPgAAAAAAAMA+AAAAAFVV1T4AAAAAq6rqPgAAAAAAAAA/AAAAAKuqCj8AAAAAVVUVPwAAAAAAACA/AAAAAKuqKj8AAAAAVVU1PwAAAAAAAEA/AAAAAKuqSj8AAAAAVVVVPwAAAAAAAGA/AAAAAKuqaj8AAAAAVVV1PwAAAAAAAIA/AAAAAAAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAgD8AAAA/daN7P/wgIT/s2W4/AABAP3qCWj96glo/AABAP+zZbj/8ICE/daN7PwAAAD8AAIA/Cb69PnWjez8AAIA+7NluPxr2FT56glo/ozCJPQAAQD9ckYs8/CAhPwAAAAAAAAA/XJGLPAm+vT6jMIk9AACAPhr2FT4a9hU+AACAPqMwiT0Jvr0+XJGLPAAAAD8AAAAA/CAhP1yRizwAAEA/ozCJPXqCWj8a9hU+7NluPwAAgD51o3s/Cb69PgAAgD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AACAPwAAAD91o3s/Cb69PuzZbj8AAIA+eoJaPxr2FT4AAEA/ozCJPfwgIT9ckYs8AAAAPwAAAAAJvr0+XJGLPAAAgD6jMIk9GvYVPhr2FT6jMIk9AACAPlyRizwJvr0+AAAAAAAAAD9ckYs8/CAhP6MwiT0AAEA/GvYVPnqCWj8AAIA+7NluPwm+vT51o3s/AAAAPwAAgD/8ICE/daN7PwAAQD/s2W4/eoJaP3qCWj/s2W4/AABAP3Wjez/8ICE/AACAPwAAAD8=',\n }];\n\n\n this.viewCount = 4;\n this.views = [{\n name: 'cylinder indices',\n buffer: bufferIndex,\n byteOffset: 0,\n byteLength: 576,\n target: 34963,\n }, {\n name: 'cylinder positions',\n buffer: bufferIndex,\n byteOffset: 576,\n byteLength: 1776,\n target: 34962,\n byteStride: 12,\n }, {\n name: 'cylinder normals',\n buffer: bufferIndex,\n byteOffset: 2352,\n byteLength: 1776,\n target: 34962,\n byteStride: 12,\n }, {\n name: 'cylinder texcoords',\n buffer: bufferIndex,\n byteOffset: 4128,\n byteLength: 1184,\n target: 34962,\n byteStride: 8,\n }];\n\n\n this.accessorCount = 4;\n this.accessors = [{\n name: 'cylinder indices',\n bufferView: viewIndex,\n componentType: 5123,\n count: 288,\n max: [147],\n min: [0],\n type: 'SCALAR',\n }, {\n name: 'cylinder positions',\n bufferView: viewIndex + 1,\n componentType: 5126,\n count: 148,\n max: [1.0, 0.5, 1.0],\n min: [-1.0, -0.5, -1.0],\n type: 'VEC3',\n }, {\n name: 'cylinder normals',\n bufferView: viewIndex + 2,\n componentType: 5126,\n count: 148,\n max: [1, 1, 1],\n min: [-1, -1, -1],\n type: 'VEC3',\n }, {\n name: 'cylinder texcoords',\n bufferView: viewIndex + 3,\n componentType: 5126,\n count: 148,\n max: [1, 1],\n min: [0, 0],\n type: 'VEC2',\n }];\n\n\n this.primitives = createStandardPrimitives(accessorIndex, materialI);\n }\n}\n","/**\n *\n * Convert a Review log file to glTF.\n *\n * @author Anthony Clark\n *\n */\n\nimport { CubeMesh, SphereMesh, CylinderMesh, createStandardPrimitives } from './URIBuffers';\n\n// https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/README.md\n\n// TODO: export only the needed interface\n\nconst DEFAULT_COLOR = [0.9, 0.9, 0.9, 1.0];\n\nconst DEFAULT_METALLIC = 0.5;\n\nconst DEFAULT_ROUGHNESS = 0.5;\n\nconst BYTES_IN_FLOAT = 4;\n\nconst SCHEMA = {\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Review Log-File\",\n \"description\": \"A visualization of meshes evolving through time.\",\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"description\": \"A unique name for this animation.\",\n \"type\": \"string\"\n },\n \"timeStep\": {\n \"description\": \"Time elapsing between frames.\",\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"objects\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"description\": \"A unique identifier for a single object.\",\n \"type\": \"string\"\n },\n \"mesh\": {\n \"description\": \"Specify the object mesh (primitives only for now).\",\n \"type\": \"string\",\n \"enum\": [\"cube\", \"cylinder\", \"sphere\"]\n }\n },\n \"required\": [\"name\", \"mesh\"]\n },\n \"minItems\": 1\n },\n \"frames\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n },\n \"minItems\": 1\n }\n },\n \"required\": [\"name\", \"timeStep\", \"objects\", \"frames\"]\n};\n\n// function arrayEqual(a, b) {\n// if (a === b) return true;\n// if (a == null || b == null) return false;\n// if (a.length !== b.length) return false;\n// // TODO: arbitrary threshold\n// return a.every((e, i) => Math.abs(e - b[i]) < 0.01);\n// }\n\n\n// function materialEqual(a, b) {\n// if (a === b) return true;\n// return arrayEqual(a.color, b.color)\n// && a.metallic === b.metallic\n// && a.roughness === b.roughness;\n// }\n\n\nfunction linspace(a, b, count) {\n let n = count || Math.max(Math.round(b - a) + 1, 1);\n if (n < 2) return n === 1 ? [a] : [];\n\n const ret = Array(n);\n n -= 1;\n for (let i = n; i >= 0; i -= 1) ret[i] = ((i * b) + ((n - i) * a)) / n;\n return ret;\n}\n\n\n// Float32Array -> ASCII String\nfunction float32ArrayToBase64(a) {\n // Get a Uint8Array view\n const buf = new Uint8Array(a.buffer, 0, a.length * BYTES_IN_FLOAT);\n\n // Convert Uint8Array to ASCII string\n let ascii = '';\n const len = buf.length;\n for (let i = 0; i < len; i += 1) {\n ascii += String.fromCharCode(buf[i]);\n }\n return btoa(ascii);\n}\n\n\n// Round to nearest multiple\nfunction roundToMultiple(value, multiple) {\n const t = 1.0 / multiple;\n return Math.round(value * t) / t;\n}\n\n\nexport class LogToGLTF {\n\n constructor() {\n this.reset();\n\n this.ajv = new Ajv();\n this.validator = this.ajv.compile(SCHEMA);\n }\n\n\n reset() {\n this.logObject = null;\n\n\n this.glTFObject = {\n scenes: [],\n scene: 0,\n nodes: [],\n meshes: [],\n materials: [],\n animations: [],\n accessors: [],\n bufferViews: [],\n buffers: [],\n asset: { version: '2.0' },\n };\n\n\n this.nodeIndex = 0;\n this.meshIndex = 0;\n this.materialIndex = 0;\n this.accessorIndex = 0;\n this.viewIndex = 0;\n this.bufferIndex = 0;\n\n\n this.cached = {\n meshes: [],\n materials: [],\n buffers: {},\n };\n\n\n this.dynamicNodes = [];\n }\n\n\n convert(log) {\n this.reset();\n\n // Validate file with AJV\n const valid = this.validator(log);\n if (!valid) {\n throw new Error(this.ajv.errorsText(this.validator.errors));\n }\n\n // TODO loop through json objects (e.g., multiple files)\n this.logObject = log;\n\n this.createScenes();\n this.createAnimations();\n\n // console.log(this.cached);\n\n return this.glTFObject;\n }\n\n\n getTimeEnd() {\n return this.timeEnd;\n }\n\n\n getName() {\n return this.name;\n }\n\n\n // The scene is the entry point for the description of the scene that\n // is stored in the glTF. It refers to the nodes that define the\n // scene graph.\n createScenes() {\n this.glTFObject.scenes.push({\n // Loop through each node in objects array (can be nested)\n nodes: this.logObject.objects.map(obj => this.createNode(obj)),\n });\n }\n\n\n // The node is one node in the scene graph hierarchy. It can contain a\n // transformation (e.g., rotation or translation), and it may refer to\n // further (child) nodes. Additionally, it may refer to mesh or camera\n // instances that are \"attached\" to the node, or to a skin that describes\n // a mesh deformation.\n createNode(obj) {\n // TODO handle children nodes\n\n const node = {\n mesh: this.getMeshIndex(obj.mesh, obj.material),\n name: obj.name,\n };\n\n if (obj.translation) node.translation = obj.translation;\n if (obj.rotation) node.rotation = obj.rotation;\n if (obj.scale) node.scale = obj.scale;\n if (!obj.static || obj.static === false) this.dynamicNodes.push(this.nodeIndex);\n\n this.glTFObject.nodes.push(node);\n\n const currentIndex = this.nodeIndex;\n this.nodeIndex += 1;\n return currentIndex;\n }\n\n\n // A mesh describes a geometric object that appears in the scene. It refers\n // to accessor objects that are used for accessing the actual geometry data,\n // and to materials that define the appearance of the object when it is\n // rendered.\n getMeshIndex(objMesh, objMaterial) {\n const { materialI, isNew } = this.getMaterialIndex(objMaterial);\n\n if (!isNew) {\n const meshI = this.cached.meshes.findIndex(\n mesh => objMesh === mesh.name && materialI === mesh.materialI);\n\n if (meshI >= 0) return meshI;\n }\n\n return this.createMesh(objMesh, materialI);\n }\n\n\n createMesh(objMesh, materialI) {\n this.cached.meshes.push({ name: objMesh, materialI });\n\n // The accessor is used as an abstract source of arbitrary data. It is used\n // by the mesh, skin, and animation, and provides the geometry data, the\n // skinning parameters and the time-dependent animation values. It refers to a\n // bufferView, which is a part of a buffer that contains the actual raw\n // binary data.\n\n let primitives;\n if (Object.prototype.hasOwnProperty.call(this.cached.buffers, objMesh)) {\n // Use the current buffer/view/accessor but update the material\n primitives = createStandardPrimitives(this.cached.buffers[objMesh].accessorI, materialI);\n } else {\n // Completely new mesh\n // let meshData;\n let Creator;\n if (objMesh === 'cube') {\n // meshData = new CubeMesh(this.bufferIndex, this.viewIndex,\n // this.accessorIndex, materialI);\n Creator = CubeMesh;\n } else if (objMesh === 'sphere') {\n // meshData = new SphereMesh(this.bufferIndex, this.viewIndex,\n // this.accessorIndex, materialI);\n Creator = SphereMesh;\n } else if (objMesh === 'cylinder') {\n // meshData = new CylinderMesh(this.bufferIndex, this.viewIndex,\n // this.accessorIndex, materialI);\n Creator = CylinderMesh;\n } else {\n // eslint-disable-next-line\n console.warn(`Unhandled mesh type: ${objMesh}`);\n // meshData = new CubeMesh(this.bufferIndex, this.viewIndex,\n // this.accessorIndex, materialI);\n Creator = CubeMesh;\n }\n\n const meshData = new Creator(this.bufferIndex, this.viewIndex, this.accessorIndex, materialI);\n\n Array.prototype.push.apply(this.glTFObject.buffers, meshData.buffers);\n Array.prototype.push.apply(this.glTFObject.bufferViews, meshData.views);\n Array.prototype.push.apply(this.glTFObject.accessors, meshData.accessors);\n\n this.cached.buffers[objMesh] = { accessorI: this.accessorIndex };\n\n this.bufferIndex += meshData.bufferCount;\n this.viewIndex += meshData.viewCount;\n this.accessorIndex += meshData.accessorCount;\n\n primitives = meshData.primitives;\n }\n\n // Setup mesh accessor indices\n this.glTFObject.meshes.push({ primitives });\n\n const currentIndex = this.meshIndex;\n this.meshIndex += 1;\n return currentIndex;\n }\n\n\n getMaterialIndex(objMaterial) {\n const material = objMaterial || {};\n if (!material.color) material.color = DEFAULT_COLOR;\n if (!material.metallic) material.metallic = DEFAULT_METALLIC;\n if (!material.roughness) material.roughness = DEFAULT_ROUGHNESS;\n\n // const materialI = this.cached.materials.findIndex(\n // cachedMaterial => materialEqual(material, cachedMaterial));\n\n // TODO: let some objects share materials. Setting isNew to true gives every obejct\n // a unique material.\n\n // if (materialI >= 0) {\n // return { materialI, isNew: true };\n // }\n\n return { materialI: this.createMaterial(material), isNew: true };\n }\n\n\n createMaterial(objMaterial) {\n this.cached.materials.push(objMaterial);\n\n this.glTFObject.materials.push({\n pbrMetallicRoughness: {\n baseColorFactor: objMaterial.color,\n metallicFactor: objMaterial.metallic,\n roughnessFactor: objMaterial.roughness,\n },\n });\n\n const currentIndex = this.materialIndex;\n this.materialIndex += 1;\n return currentIndex;\n }\n\n\n // An animation describes how transformations of certain nodes\n // (e.g., rotation or translation) change over time.\n createAnimations() {\n // Setup time data\n const timeStep = this.logObject.timeStep;\n const timeSteps = this.logObject.frames.length;\n this.timeEnd = roundToMultiple((timeSteps - 1) * timeStep, timeStep);\n this.name = this.logObject.name;\n const timeData = new Float32Array(linspace(0, this.timeEnd, timeSteps));\n const timeByteLength = timeData.length * BYTES_IN_FLOAT;\n const timeURI = float32ArrayToBase64(timeData);\n\n const timeBufferI = this.addBase64Buffer('time', timeByteLength, timeURI);\n const timeViewI = this.addView('time', timeBufferI, 0, timeByteLength);\n const timeAccessorI = this.addAccessor('time', timeViewI, timeData.length,\n 'SCALAR', [0], [this.timeEnd]);\n\n // Setup TRS data for each animated node\n const animProps = [];\n this.dynamicNodes.forEach((nodeI) => {\n const name = this.logObject.objects[nodeI].name;\n const data = this.logObject.frames[0][name];\n // console.log(name, data);\n if (data.t) {\n animProps.push({\n name,\n nodeI,\n dataType: 't',\n animType: 'translation',\n valueType: 'VEC3',\n data: data.t.slice(0),\n prev: data.t.slice(0),\n min: data.t.slice(0),\n max: data.t.slice(0),\n });\n }\n if (data.r) {\n animProps.push({\n name,\n nodeI,\n dataType: 'r',\n animType: 'rotation',\n valueType: 'VEC4',\n data: data.r.slice(0),\n prev: data.r.slice(0),\n min: data.r.slice(0),\n max: data.r.slice(0),\n });\n }\n if (data.s) {\n animProps.push({\n name,\n nodeI,\n dataType: 's',\n animType: 'scale',\n valueType: 'VEC3',\n data: data.s.slice(0),\n prev: data.s.slice(0),\n min: data.s.slice(0),\n max: data.s.slice(0),\n });\n }\n });\n\n // console.log(this.logObject.frames.length);\n\n this.logObject.frames.slice(1).forEach((frame) => {\n animProps.forEach((prop, propI) => {\n // If data exists for this frame\n if (frame[prop.name] && frame[prop.name][prop.dataType]) {\n frame[prop.name][prop.dataType].forEach((value, valueI) => {\n prop.data.push(value);\n animProps[propI].prev[valueI] = value;\n animProps[propI].min[valueI] = Math.min(prop.min[valueI], value);\n animProps[propI].max[valueI] = Math.max(prop.max[valueI], value);\n });\n } else {\n // Copy from previous\n Array.prototype.push.apply(prop.data, prop.prev);\n }\n });\n });\n\n // Combine all animations into a single array and convert to base64\n const animArray = [].concat(...animProps.map(prop => prop.data));\n const animData = new Float32Array(animArray);\n const animByteLength = animData.length * BYTES_IN_FLOAT;\n const animURI = float32ArrayToBase64(animData);\n\n const animBufferI = this.addBase64Buffer('animation', animByteLength, animURI);\n\n // Each animation needs its only view and accessor\n let offset = 0;\n animProps.forEach((prop) => {\n const propLength = prop.data.length;\n const propCount = Math.round(propLength / prop.min.length);\n const propLengthBytes = propLength * BYTES_IN_FLOAT;\n const propName = `${prop.name}-${prop.animType}`;\n\n const propViewI = this.addView(propName, animBufferI, offset, propLengthBytes);\n const propAccessorI = this.addAccessor(propName, propViewI, propCount,\n prop.valueType, prop.min, prop.max);\n\n this.addAnimation(timeAccessorI, propAccessorI, prop.nodeI, prop.animType);\n\n offset += propLengthBytes;\n });\n }\n\n\n addBase64Buffer(name, byteLength, dataURI) {\n this.glTFObject.buffers.push({\n name,\n byteLength,\n uri: `data:application/octet-stream;base64,${dataURI}`,\n });\n\n const currentIndex = this.bufferIndex;\n this.bufferIndex += 1;\n return currentIndex;\n }\n\n\n addView(name, buffer, byteOffset, byteLength) {\n this.glTFObject.bufferViews.push({\n name,\n buffer,\n byteOffset,\n byteLength,\n });\n\n const currentIndex = this.viewIndex;\n this.viewIndex += 1;\n return currentIndex;\n }\n\n\n addAccessor(name, bufferView, count, type, min, max) {\n this.glTFObject.accessors.push({\n name,\n bufferView,\n byteOffset: 0,\n componentType: 5126,\n count,\n type,\n max,\n min,\n });\n\n const currentIndex = this.accessorIndex;\n this.accessorIndex += 1;\n return currentIndex;\n }\n\n\n addAnimation(timeAccessorI, animAccessorI, nodeI, animType) {\n this.glTFObject.animations.push({\n samplers: [{\n input: timeAccessorI,\n interpolation: 'LINEAR',\n output: animAccessorI,\n }],\n channels: [{\n sampler: 0,\n target: {\n node: nodeI,\n path: animType,\n },\n }],\n });\n }\n}\n\n// The camera defines the view configuration for rendering the scene.\n\n// The skin defines parameters that are required for vertex skinning,\n// which allows the deformation of a mesh based on the pose of a virtual\n// character. The values of these parameters are obtained from an accessor.\n\n// The material contains the parameters that define the appearance of an\n// object. It usually refers to texture objects that will be applied to\n// the rendered geometry.\n\n// The texture is defined by a sampler and an image. The sampler defines\n// how the texture image should be placed on the object.\n","/**\n *\n * Visualize mechanic simulations.\n *\n * @author Anthony Clark\n *\n */\n\n\n// TODO: teardown visualization after new log is loaded\n// TODO: look for commented code\n\nlet THREE = window.THREE;\n\n// import {\n// THREE.Scene,\n// THREE.PerspectiveCamera,\n// THREE.WebGLRenderer,\n// THREE.AxesHelper,\n// THREE.Clock,\n// THREE.AmbientLight,\n// THREE.SpotLight,\n// THREE.LightShadow,\n// THREE.PlaneGeometry,\n// THREE.ShadowMaterial,\n// THREE.Mesh,\n// THREE.GridHelper,\n// THREE.AnimationMixer,\n// THREE.LoopOnce,\n// THREE.LoopRepeat,\n// } from 'three';\n\n// import 'three/examples/js/controls/OrbitControls';\n// import 'three/examples/js/loaders/GLTFLoader';\n// import 'three/examples/js/exporters/GLTFExporter';\n\nimport { LogToGLTF } from './logToGLTF';\n\n\nconst DEFAULT_CAMERA_POSITION = [-8, 8, 8];\n\n\nfunction onWindowResize(vis) {\n return () => {\n vis.camera.aspect = window.innerWidth / window.innerHeight;\n vis.camera.updateProjectionMatrix();\n vis.renderer.setSize(window.innerWidth, window.innerHeight);\n };\n}\n\n\nfunction disposeHierarchy(node, callback) {\n for (let i = node.children.length - 1; i >= 0; i -= 1) {\n const child = node.children[i];\n disposeHierarchy(child, callback);\n callback(child);\n }\n}\n\n\nfunction disposeNode(parentObject) {\n parentObject.traverse((node) => {\n if (node instanceof THREE.Mesh) {\n if (node.geometry) {\n node.geometry.dispose();\n }\n if (node.material) {\n let materialArray;\n if (node.material instanceof THREE.MeshFaceMaterial\n || node.material instanceof THREE.MultiMaterial) {\n materialArray = node.material.materials;\n } else if (node.material instanceof Array) {\n materialArray = node.material;\n }\n if (materialArray) {\n materialArray.forEach((mtrl) => {\n if (mtrl.map) mtrl.map.dispose();\n if (mtrl.lightMap) mtrl.lightMap.dispose();\n if (mtrl.bumpMap) mtrl.bumpMap.dispose();\n if (mtrl.normalMap) mtrl.normalMap.dispose();\n if (mtrl.specularMap) mtrl.specularMap.dispose();\n if (mtrl.envMap) mtrl.envMap.dispose();\n mtrl.dispose();\n });\n } else {\n if (node.material.map) node.material.map.dispose();\n if (node.material.lightMap) node.material.lightMap.dispose();\n if (node.material.bumpMap) node.material.bumpMap.dispose();\n if (node.material.normalMap) node.material.normalMap.dispose();\n if (node.material.specularMap) node.material.specularMap.dispose();\n if (node.material.envMap) node.material.envMap.dispose();\n node.material.dispose();\n }\n }\n }\n });\n}\n\n\nfunction save(blob, filename = 'scene.gltf') {\n // https://github.com/mrdoob/three.js/blob/master/examples/misc_exporter_gltf.html\n\n const link = document.createElement('a');\n link.style.display = 'none';\n document.body.appendChild(link); // Firefox workaround, see #6594\n\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n}\n\n\nexport class Visualizer {\n\n constructor(containerID, timeCB, readyCB, endCB) {\n // TODO: detect stuff\n // if (!Detector.webgl) {\n // const warning = Detector.getWebGLErrorMessage();\n // document.getElementById(container_id).appendChild(warning);\n // }\n\n // Visualization state\n this.reset();\n this.isFollowing = false;\n this.followObject = null;\n\n\n this.gltfData = null;\n\n\n const container = document.getElementById(containerID);\n const width = window.innerWidth;\n const height = window.innerHeight;\n\n\n this.scene = new THREE.Scene();\n\n\n this.scene.add(new THREE.AmbientLight(0xffffff));\n\n\n this.spotLight = new THREE.SpotLight(0xffffff, 1.5);\n this.spotLight.position.set(0, 15, 5);\n this.spotLight.castShadow = true;\n this.spotLight.shadow = new THREE.LightShadow(new THREE.PerspectiveCamera(60, 1, 10, 200));\n this.spotLight.shadow.bias = -0.000222;\n this.spotLight.shadow.mapSize.width = 1024;\n this.spotLight.shadow.mapSize.height = 1024;\n this.scene.add(this.spotLight);\n\n\n // TODO: pass in device pixel ratio?\n this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this.renderer.setSize(width, height);\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setClearColor(0xffffff);\n this.renderer.shadowMap.enabled = true;\n container.appendChild(this.renderer.domElement);\n\n\n // fov in degrees, aspect ratio, near clip, far clip\n this.camera = new THREE.PerspectiveCamera(60, width / height, 0.01, 100);\n this.camera.position.set(...DEFAULT_CAMERA_POSITION);\n\n\n const groundMaterial = new THREE.ShadowMaterial({ opacity: 0.8 });\n const groundGeometry = new THREE.PlaneGeometry(100, 100);\n groundGeometry.rotateX(-Math.PI / 2);\n this.ground = new THREE.Mesh(groundGeometry, groundMaterial);\n this.ground.receiveShadow = true;\n this.scene.add(this.ground);\n\n\n this.grid = new THREE.GridHelper(100, 100);\n this.grid.material.opacity = 0.5;\n this.grid.material.transparent = true;\n this.scene.add(this.grid);\n\n\n this.controls = new THREE.OrbitControls(this.camera, this.renderer.domElement);\n this.controls.enableKeys = false;\n // this.controls.target.set(...DEFALUT_CAMERA_LOOKAT);\n\n\n this.axis = new THREE.AxesHelper(50);\n this.scene.add(this.axis);\n\n\n this.loader = new THREE.GLTFLoader();\n // this.exporter = new THREE.GLTFExporter();\n\n\n this.clock = new THREE.Clock();\n\n\n this.mixer = null;\n this.clips = [];\n this.actions = [];\n\n\n this.timeCB = timeCB;\n this.readyCB = readyCB;\n this.endCB = endCB;\n\n\n window.addEventListener('resize', onWindowResize(this), false);\n }\n\n\n loadAnimation(log) {\n\n // TODO: move this to constructor?\n const converter = new LogToGLTF();\n const gltf = converter.convert(log);\n const timeEnd = converter.getTimeEnd();\n const name = converter.getName();\n\n this.objNames = log.objects.map(obj => obj.name);\n\n // TODO: does this need to be saved?\n this.gltfData = gltf;\n\n this.loader.parse(\n // glTF data in JSON format\n JSON.stringify(gltf, null, ' '),\n\n // Path to resources\n '',\n\n // onLoad callback function\n (data) => {\n data.scene.traverse((child) => {\n if (child.isMesh) {\n // child.material.envMap = envMap;\n child.material.needsUpdate = true;\n child.castShadow = true;\n }\n });\n\n this.loadedScene = data.scene;\n this.scene.add(data.scene);\n\n const objectColors = new Map();\n this.scene.traverseVisible(function (node) {\n if (node instanceof THREE.Mesh) {\n objectColors.set(node.name, node.material.color.clone());\n }\n });\n this.objectColors = objectColors;\n\n this.mixer = new THREE.AnimationMixer(data.scene);\n this.clips = data.animations;\n this.actions = this.clips.map(clip => this.mixer.clipAction(clip));\n\n this.actions.forEach((action) => {\n action.play();\n action.paused = true;\n action.setLoop(THREE.LoopOnce, Infinity);\n // action.enabled = true;\n // action.clampWhenFinished = ...;\n // action.isRunning(); <-- read-only\n // action.startAt(mixer.time + 0.5).play();\n // action.weight = ...;\n // action.getEffectiveWeight();\n // action.setEffectiveWeight();\n // action.reset().fadeIn(0.25).play();\n // action.fadeOut(0.25).play();\n // action.timeScale = 1;\n // action.getEffectiveTimeScale();\n // action.setEffectiveTimeScale();\n // action.warp(timeScaleNow, destTimeScale, 4).play();\n // action.loop = +value;\n // action.repetitions = +value;\n });\n\n this.mixer.addEventListener('finished', () => {\n this.endCB();\n });\n\n this.readyCB(timeEnd, name);\n\n // data.animations; // Array<THREE.AnimationClip>\n // data.scene; // THREE.Scene\n // data.scenes; // Array<THREE.Scene>\n // data.cameras; // Array<THREE.Camera>\n },\n\n // onError callback function\n (error) => {\n // eslint-disable-next-line\n console.error(error);\n },\n );\n }\n\n\n setTime(newTime) {\n this.actions.forEach((action) => {\n action.time = newTime;\n });\n }\n\n\n setPlaybackSpeed(newTimeScale) {\n this.actions.forEach((action) => {\n action.timeScale = newTimeScale;\n });\n }\n\n\n resetCamera() {\n this.controls.reset();\n }\n\n\n follow(objIdx) {\n this.controls.enabled = false;\n this.isFollowing = true;\n this.followObject = this.scene.getObjectByName(this.objNames[objIdx || 0]);\n this.cameraRelativePosition = new THREE.Vector3();\n this.cameraRelativePosition.subVectors(this.followObject.position, this.camera.position);\n this.controls.target = this.followObject.position;\n }\n\n\n unFollow() {\n this.controls.target = this.followObject.position.clone();\n this.cameraRelativePosition = null;\n this.followObject = null;\n this.isFollowing = false;\n this.controls.enabled = true;\n }\n\n\n loop() {\n this.actions.forEach((action) => {\n action.setLoop(THREE.LoopRepeat, Infinity);\n });\n }\n\n noLoop() {\n this.actions.forEach((action) => {\n action.setLoop(THREE.LoopOnce, Infinity);\n });\n }\n\n\n play() {\n this.actions.forEach((action) => {\n action.paused = false;\n });\n }\n\n\n pause() {\n this.actions.forEach((action) => {\n action.paused = true;\n });\n }\n\n\n enable() {\n this.actions.forEach((action) => {\n if (!action.enabled) action.reset();\n });\n }\n\n\n getObjectNames() {\n return this.objNames;\n }\n\n\n // setObjectColor(objIdxs, color) {\n // objIdxs.forEach((objI) => {\n // const obj = this.scene.getObjectByName(this.objNames[objI]);\n // if (obj) obj.material.color.set(color);\n // });\n // }\n\n // toggleObjectVisibility(objIdxs) {\n // objIdxs.forEach((objI) => {\n // const obj = this.scene.getObjectByName(this.objNames[objI]);\n // if (obj) obj.visible = !obj.visible;\n // });\n // }\n\n noColor() {\n this.scene.traverseVisible(function (node) {\n if (node.isMesh && node.name !== \"\") {\n node.material.color.set('#FFFFFF');\n }\n });\n }\n\n color() {\n const objectColors = this.objectColors;\n this.scene.traverseVisible(function (node) {\n if (node.isMesh && node.name !== \"\") {\n node.material.color.set(objectColors.get(node.name));\n }\n });\n }\n\n reset() {\n this.isShutdown = true;\n\n\n if (this.loadedScene) {\n disposeHierarchy(this.loadedScene, disposeNode);\n this.scene.remove(this.loadedScene);\n\n\n this.actions.forEach((action) => {\n this.mixer.uncacheAction(action);\n });\n\n\n this.clips.forEach((clip) => {\n this.mixer.uncacheClip(clip);\n });\n\n // mixer.uncacheRoot(root);\n }\n\n this.objNames = [];\n this.actions = [];\n this.clips = [];\n this.mixer = null;\n }\n\n\n start() {\n this.isShutdown = false;\n\n const loop = () => {\n if (!this.isShutdown) {\n requestAnimationFrame(loop);\n\n if (this.actions.length > 0 && this.actions[0].isRunning()) {\n this.timeCB(this.actions[0].time);\n }\n\n if (this.mixer) {\n this.mixer.update(this.clock.getDelta());\n }\n\n if (this.isFollowing) {\n // this.camera.lookAt(objPos);\n this.camera.position.subVectors(this.followObject.position, this.cameraRelativePosition);\n this.controls.update();\n }\n\n this.renderer.render(this.scene, this.camera);\n }\n };\n\n loop();\n }\n\n\n downloadGltf() {\n // TODO: look at the differences below\n // this.exporter.parse(this.scene, (result) => {\n // const text = JSON.stringify(result, null, 2);\n // save(new Blob([text], { type: 'text/plain' }));\n // });\n save(new Blob([JSON.stringify(this.gltfData, null, 2)]));\n }\n}\n","import { Elm } from './Main.elm';\nimport { Visualizer } from './visualizer';\n\n\nlet visualizer = new Visualizer('canvas-container', timeCB, readyCB, endCB);\n\nfunction timeCB(newTime) {\n app.ports.vis2UiTime.send(newTime);\n}\n\nfunction readyCB(timeEnd, name) {\n document.title = `Review: ${name}`;\n app.ports.vis2UiLoaded.send(timeEnd);\n}\n\nfunction endCB() {\n visualizer.enable();\n visualizer.pause();\n app.ports.vis2UiCommand.send('pause');\n}\n\n// Search URL parameters as source of data\nconst urlParams = new URLSearchParams(window.location.search);\nconst logParam = urlParams.get('log');\n\nvar app = Elm.Main.init({\n node: document.getElementById('elm'),\n flags: logParam || ''\n});\n\napp.ports.ui2VisCommand.subscribe(function (command) {\n visualizer[command]();\n});\n\napp.ports.ui2VisTime.subscribe(function (newTime) {\n visualizer.setTime(newTime);\n});\n\napp.ports.ui2VisSpeed.subscribe(function (newSpeed) {\n visualizer.setPlaybackSpeed(newSpeed);\n});\n\napp.ports.ui2VisData.subscribe(function (str) {\n\n let data;\n try {\n data = JSON.parse(str);\n }\n catch (error) {\n app.ports.vis2UiError.send('Could not parse JSON data (see console for more information).');\n console.error(error.message);\n return;\n }\n\n try {\n visualizer.reset();\n visualizer.loadAnimation(data);\n } catch (error) {\n app.ports.vis2UiError.send('Could not parse GLTF data (see console for more information).');\n console.error(error.message);\n return;\n }\n\n visualizer.start();\n});\n\n\n// window.addEventListener(\"dragover\", function (e) {\n// e = e || event;\n// e.preventDefault();\n// }, false);\n// window.addEventListener(\"drop\", function (e) {\n// e = e || event;\n// e.preventDefault();\n// }, false);\n"]}