From 10295f4992b8ff6c00f57e9218221d1a7a301e61 Mon Sep 17 00:00:00 2001 From: frcroth Date: Fri, 21 Apr 2023 15:43:02 +0200 Subject: [PATCH 01/32] Implement reading of mesh chunks with list input --- .../scalableminds/util/tools/ByteUtils.scala | 10 ++++ .../controllers/DSMeshController.scala | 4 +- .../CompressedSegmentation.scala | 13 +--- .../datastore/services/MeshFileService.scala | 59 ++++++++++++------- 4 files changed, 53 insertions(+), 33 deletions(-) diff --git a/util/src/main/scala/com/scalableminds/util/tools/ByteUtils.scala b/util/src/main/scala/com/scalableminds/util/tools/ByteUtils.scala index 3c40cc07c0a..cd8fb50f662 100644 --- a/util/src/main/scala/com/scalableminds/util/tools/ByteUtils.scala +++ b/util/src/main/scala/com/scalableminds/util/tools/ByteUtils.scala @@ -5,4 +5,14 @@ trait ByteUtils { data.forall { byte: Byte => byte == 0 } + + protected def longToBytes(l: Long): Array[Byte] = { + var w = l + val result = new Array[Byte](8) + for (i <- 7 to 0 by -1) { + result(i) = (w & 0xFF).toByte + w >>= 8 + } + result.reverse + } } diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala index 57bfccca51f..4e5a89d26f6 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala @@ -172,8 +172,8 @@ class DSMeshController @Inject()( organizationName: String, dataSetName: String, dataLayerName: String, - formatVersion: Int): Action[MeshChunkDataRequestV3] = - Action.async(validateJson[MeshChunkDataRequestV3]) { implicit request => + formatVersion: Int): Action[Seq[MeshChunkDataRequestV3]] = + Action.async(validateJson[Seq[MeshChunkDataRequestV3]]) { implicit request => accessTokenService.validateAccess(UserAccessRequest.readDataSources(DataSourceId(dataSetName, organizationName)), urlOrHeaderToken(token, request)) { for { diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/datareaders/precomputed/compressedsegmentation/CompressedSegmentation.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/datareaders/precomputed/compressedsegmentation/CompressedSegmentation.scala index 9580ebbdeb6..91716f7bcbe 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/datareaders/precomputed/compressedsegmentation/CompressedSegmentation.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/datareaders/precomputed/compressedsegmentation/CompressedSegmentation.scala @@ -1,6 +1,7 @@ package com.scalableminds.webknossos.datastore.datareaders.precomputed.compressedsegmentation import com.scalableminds.util.geometry.Vec3Int +import com.scalableminds.util.tools.ByteUtils import java.nio.{ByteBuffer, ByteOrder} import scala.reflect.ClassTag @@ -10,7 +11,7 @@ import scala.reflect.ClassTag // For a reference implementation, see also: // https://github.com/janelia-flyem/compressedseg -trait CompressedSegmentation[T <: AnyVal] { +trait CompressedSegmentation[T <: AnyVal] extends ByteUtils { private val kBlockHeaderSize = 2 val defaultBlockSize: Vec3Int = Vec3Int(8, 8, 8) @@ -89,16 +90,6 @@ trait CompressedSegmentation[T <: AnyVal] { val values = decompressChannels(input32, vs, blockSize) values.flatMap(v => longToBytes(valueAsLong(v))) } - - private def longToBytes(l: Long): Array[Byte] = { - var w = l - val result = new Array[Byte](8) - for (i <- 7 to 0 by -1) { - result(i) = (w & 0xFF).toByte - w >>= 8 - } - result.reverse - } } object CompressedSegmentation32 extends CompressedSegmentation[Int] { diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index 810ef419e9d..75de3a2075b 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -3,7 +3,7 @@ package com.scalableminds.webknossos.datastore.services import com.google.common.io.LittleEndianDataInputStream import com.scalableminds.util.geometry.{Vec3Float, Vec3Int} import com.scalableminds.util.io.PathUtils -import com.scalableminds.util.tools.{Fox, FoxImplicits} +import com.scalableminds.util.tools.{ByteUtils, Fox, FoxImplicits} import com.scalableminds.webknossos.datastore.DataStoreConfig import com.scalableminds.webknossos.datastore.storage.CachedHdf5Utils.executeWithCachedHdf5 import com.scalableminds.webknossos.datastore.storage.{CachedHdf5File, Hdf5FileCache} @@ -166,7 +166,8 @@ object WebknossosSegmentInfo { class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionContext) extends FoxImplicits - with LazyLogging { + with LazyLogging + with ByteUtils { private val dataBaseDir = Paths.get(config.Datastore.baseFolder) private val meshesDir = "meshes" @@ -292,6 +293,7 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC // get past the finer lods first, then take offset in selected lod bytesPerLod.take(lod).sum + chunkByteOffsetsInLod(lod)(currentChunk) + def computeGlobalPositionAndOffset(lod: Int, currentChunk: Int): MeshChunk = { val globalPosition = segmentInfo.gridOrigin + segmentInfo .chunkPositions(lod)(currentChunk) @@ -368,24 +370,41 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC def readMeshChunkV3(organizationName: String, dataSetName: String, dataLayerName: String, - meshChunkDataRequest: MeshChunkDataRequestV3, - ): Fox[(Array[Byte], String)] = { - val meshFilePath = dataBaseDir - .resolve(organizationName) - .resolve(dataSetName) - .resolve(dataLayerName) - .resolve(meshesDir) - .resolve(s"${meshChunkDataRequest.meshFile}.$meshFileExtension") - - executeWithCachedHdf5(meshFilePath, meshFileCache) { cachedMeshFile => - val meshFormat = cachedMeshFile.reader.string().getAttr("/", "mesh_format") - val data = - cachedMeshFile.reader - .uint8() - .readArrayBlockWithOffset("neuroglancer", meshChunkDataRequest.byteSize, meshChunkDataRequest.byteOffset) - (data, meshFormat) - } ?~> "mesh.file.readData.failed" - } + meshChunkDataRequests: Seq[MeshChunkDataRequestV3], + ): Fox[(Array[Byte], String)] = + for { + data: List[(Array[Byte], String, Int)] <- Fox.combined( + meshChunkDataRequests.zipWithIndex + .sortBy(requestAndIndex => requestAndIndex._1.byteOffset) + .map(requestAndIndex => { + val meshChunkDataRequest = requestAndIndex._1 + val meshFilePath = dataBaseDir + .resolve(organizationName) + .resolve(dataSetName) + .resolve(dataLayerName) + .resolve(meshesDir) + .resolve(s"${meshChunkDataRequest.meshFile}.$meshFileExtension") + + executeWithCachedHdf5(meshFilePath, meshFileCache) { cachedMeshFile => + val meshFormat = cachedMeshFile.reader.string().getAttr("/", "mesh_format") + val data = + cachedMeshFile.reader + .uint8() + .readArrayBlockWithOffset("neuroglancer", + meshChunkDataRequest.byteSize, + meshChunkDataRequest.byteOffset) + (data, meshFormat, requestAndIndex._2) + } ?~> "mesh.file.readData.failed" + }) + .toList) + dataSorted = data.sortBy(d => d._3) + _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) + encoding = data.map(d => d._2).head + output = longToBytes(data.length.toLong) ++ dataSorted + .map(d => d._1.length) + .scanLeft((data.length + 1).toLong)((a, b) => a + b) + .flatMap(l => longToBytes(l)) ++ dataSorted.flatMap(d => d._1) + } yield (output, encoding) private def positionLiteral(position: Vec3Int) = s"${position.x}_${position.y}_${position.z}" From a031870ef55cc4d22ed27303f71ca862732777ab Mon Sep 17 00:00:00 2001 From: frcroth Date: Mon, 24 Apr 2023 09:40:10 +0200 Subject: [PATCH 02/32] Remove length of jumptable --- .../webknossos/datastore/services/MeshFileService.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index 75de3a2075b..4f56ae4f919 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -400,10 +400,10 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC dataSorted = data.sortBy(d => d._3) _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) encoding = data.map(d => d._2).head - output = longToBytes(data.length.toLong) ++ dataSorted + output = dataSorted .map(d => d._1.length) .scanLeft((data.length + 1).toLong)((a, b) => a + b) - .flatMap(l => longToBytes(l)) ++ dataSorted.flatMap(d => d._1) + .flatMap(l => longToBytes(l)).toArray ++ dataSorted.flatMap(d => d._1) } yield (output, encoding) private def positionLiteral(position: Vec3Int) = From 092fda1703ecc167f3279f22ad9fa1dcf60cb9d4 Mon Sep 17 00:00:00 2001 From: frcroth Date: Mon, 24 Apr 2023 14:26:42 +0200 Subject: [PATCH 03/32] Move meshfile parameter out of list of requests --- .../controllers/DSMeshController.scala | 4 ++-- .../datastore/services/MeshFileService.scala | 24 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala index 4e5a89d26f6..6c2d86a2303 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala @@ -172,8 +172,8 @@ class DSMeshController @Inject()( organizationName: String, dataSetName: String, dataLayerName: String, - formatVersion: Int): Action[Seq[MeshChunkDataRequestV3]] = - Action.async(validateJson[Seq[MeshChunkDataRequestV3]]) { implicit request => + formatVersion: Int): Action[MeshChunkDataRequestV3List] = + Action.async(validateJson[MeshChunkDataRequestV3List]) { implicit request => accessTokenService.validateAccess(UserAccessRequest.readDataSources(DataSourceId(dataSetName, organizationName)), urlOrHeaderToken(token, request)) { for { diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index 4f56ae4f919..27e8b4b604d 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -38,11 +38,15 @@ case class MeshChunkDataRequestV0( ) case class MeshChunkDataRequestV3( - meshFile: String, byteOffset: Long, byteSize: Int ) +case class MeshChunkDataRequestV3List( + meshFile: String, + requests: Seq[MeshChunkDataRequestV3] +) + object MeshChunkDataRequestV0 { implicit val jsonFormat: OFormat[MeshChunkDataRequestV0] = Json.format[MeshChunkDataRequestV0] } @@ -51,6 +55,10 @@ object MeshChunkDataRequestV3 { implicit val jsonFormat: OFormat[MeshChunkDataRequestV3] = Json.format[MeshChunkDataRequestV3] } +object MeshChunkDataRequestV3List { + implicit val jsonFormat: OFormat[MeshChunkDataRequestV3List] = Json.format[MeshChunkDataRequestV3List] +} + case class MeshFileInfo( meshFileName: String, mappingName: Option[String], @@ -293,7 +301,6 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC // get past the finer lods first, then take offset in selected lod bytesPerLod.take(lod).sum + chunkByteOffsetsInLod(lod)(currentChunk) - def computeGlobalPositionAndOffset(lod: Int, currentChunk: Int): MeshChunk = { val globalPosition = segmentInfo.gridOrigin + segmentInfo .chunkPositions(lod)(currentChunk) @@ -302,7 +309,7 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC MeshChunk( position = globalPosition, // This position is in Voxel Space byteOffset = meshByteStartOffset + getChunkByteOffset(lod, currentChunk), - byteSize = segmentInfo.chunkByteSizes(lod)(currentChunk).toInt, // size must be int32 to fit in java array + byteSize = segmentInfo.chunkByteSizes(lod)(currentChunk).toInt // size must be int32 to fit in java array ) } @@ -370,11 +377,11 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC def readMeshChunkV3(organizationName: String, dataSetName: String, dataLayerName: String, - meshChunkDataRequests: Seq[MeshChunkDataRequestV3], + meshChunkDataRequests: MeshChunkDataRequestV3List, ): Fox[(Array[Byte], String)] = for { data: List[(Array[Byte], String, Int)] <- Fox.combined( - meshChunkDataRequests.zipWithIndex + meshChunkDataRequests.requests.zipWithIndex .sortBy(requestAndIndex => requestAndIndex._1.byteOffset) .map(requestAndIndex => { val meshChunkDataRequest = requestAndIndex._1 @@ -383,7 +390,7 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC .resolve(dataSetName) .resolve(dataLayerName) .resolve(meshesDir) - .resolve(s"${meshChunkDataRequest.meshFile}.$meshFileExtension") + .resolve(s"${meshChunkDataRequests.meshFile}.$meshFileExtension") executeWithCachedHdf5(meshFilePath, meshFileCache) { cachedMeshFile => val meshFormat = cachedMeshFile.reader.string().getAttr("/", "mesh_format") @@ -398,12 +405,13 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC }) .toList) dataSorted = data.sortBy(d => d._3) - _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) + _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) // Ensure same encoding for all responses encoding = data.map(d => d._2).head output = dataSorted .map(d => d._1.length) .scanLeft((data.length + 1).toLong)((a, b) => a + b) - .flatMap(l => longToBytes(l)).toArray ++ dataSorted.flatMap(d => d._1) + .flatMap(l => longToBytes(l)) + .toArray ++ dataSorted.flatMap(d => d._1) } yield (output, encoding) private def positionLiteral(position: Vec3Int) = From fcaabac670f4638adfc5f9f2128eefd4675be64a Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Thu, 27 Apr 2023 15:44:38 +0200 Subject: [PATCH 04/32] refactor mesh loading saga into sub sagas --- .../oxalis/model/sagas/isosurface_saga.ts | 223 +++++++++++------- 1 file changed, 139 insertions(+), 84 deletions(-) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 4c2860e6209..a2ab1398471 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -3,7 +3,12 @@ import _ from "lodash"; import { V3 } from "libs/mjs"; import { sleep } from "libs/utils"; import ErrorHandling from "libs/error_handling"; -import type { APIMeshFile, APISegmentationLayer } from "types/api_flow_types"; +import type { + APIDataset, + APIMeshFile, + APIMessage, + APISegmentationLayer, +} from "types/api_flow_types"; import { mergeVertices } from "libs/BufferGeometryUtils"; import Deferred from "libs/deferred"; @@ -624,15 +629,6 @@ function* loadPrecomputedMeshForSegmentId( yield* put(addPrecomputedIsosurfaceAction(layerName, id, seedPosition, meshFileName)); yield* put(startedLoadingIsosurfaceAction(layerName, id)); const dataset = yield* select((state) => state.dataset); - const { segmentMeshController } = yield* call(getSceneController); - const currentLODIndex = yield* call({ - context: segmentMeshController.isosurfacesLODRootGroup, - fn: segmentMeshController.isosurfacesLODRootGroup.getCurrentLOD, - }); - - let availableChunksMap: ChunksMap = {}; - let scale: Vector3 | null = null; - let loadingOrder: number[] = []; const availableMeshFiles = yield* call( dispatchMaybeFetchMeshFilesAsync, @@ -649,72 +645,20 @@ function* loadPrecomputedMeshForSegmentId( return; } - const version = meshFile.formatVersion; + let availableChunksMap: ChunksMap = {}; + let scale: Vector3 | null = null; + let loadingOrder: number[] | null = null; try { - const isosurfaceExtraInfo = yield* call(getIsosurfaceExtraInfo, segmentationLayer.name, null); - - const editableMapping = yield* select((state) => - getEditableMappingForVolumeTracingId(state, segmentationLayer.tracingId), - ); - const tracing = yield* select((state) => - getTracingForSegmentationLayer(state, segmentationLayer), + const chunkDescriptors = yield* call( + _getChunkLoadingDescriptors, + id, + dataset, + segmentationLayer, + meshFile, ); - const mappingName = - // isosurfaceExtraInfo.mappingName contains the currently active mapping - // (can be the id of an editable mapping). However, we always need to - // use the mapping name of the on-disk mapping. - editableMapping != null ? editableMapping.baseMappingName : isosurfaceExtraInfo.mappingName; - - if (version < 3) { - console.warn( - "The active mesh file uses a version lower than 3. webKnossos cannot check whether the mesh file was computed with the correct target mapping. Meshing requests will fail if the mesh file does not match the active mapping.", - ); - } - - // mappingName only exists for versions >= 3 - if (meshFile.mappingName != null && meshFile.mappingName !== mappingName) { - throw Error( - `Trying to use a mesh file that was computed for mapping ${meshFile.mappingName} for a requested mapping of ${mappingName}.`, - ); - } - - if (version >= 3) { - const segmentInfo = yield* call( - meshV3.getMeshfileChunksForSegment, - dataset.dataStore.url, - dataset, - getBaseSegmentationName(segmentationLayer), - meshFileName, - id, - // The back-end should only receive a non-null mapping name, - // if it should perform extra (reverse) look ups to compute a mesh - // with a specific mapping from a mesh file that was computed - // without a mapping. - meshFile.mappingName == null ? mappingName : null, - editableMapping != null && tracing ? tracing.tracingId : null, - ); - scale = [ - segmentInfo.transform[0][0], - segmentInfo.transform[1][1], - segmentInfo.transform[2][2], - ]; - segmentInfo.chunks.lods.forEach((chunks, lodIndex) => { - availableChunksMap[lodIndex] = chunks?.chunks; - loadingOrder.push(lodIndex); - }); - // Load the chunks closest to the current LOD first. - loadingOrder.sort((a, b) => Math.abs(a - currentLODIndex) - Math.abs(b - currentLODIndex)); - } else { - availableChunksMap[NO_LOD_MESH_INDEX] = yield* call( - meshV0.getMeshfileChunksForSegment, - dataset.dataStore.url, - dataset, - getBaseSegmentationName(segmentationLayer), - meshFileName, - id, - ); - loadingOrder = [NO_LOD_MESH_INDEX]; - } + availableChunksMap = chunkDescriptors.availableChunksMap; + scale = chunkDescriptors.scale; + loadingOrder = chunkDescriptors.loadingOrder; } catch (exception) { console.warn("Mesh chunk couldn't be loaded due to", exception); Toast.warning(messages["tracing.mesh_listing_failed"]); @@ -723,7 +667,127 @@ function* loadPrecomputedMeshForSegmentId( return; } - const loadChunksTasks = _.compact( + const loadChunksTasks = _getLoadChunksTasks( + dataset, + layerName, + meshFile, + segmentationLayer, + id, + seedPosition, + availableChunksMap, + loadingOrder, + scale, + ); + + try { + yield* call(processTaskWithPool, loadChunksTasks, PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT); + } catch (exception) { + console.error(exception); + Toast.warning("Some mesh objects could not be loaded."); + } + + yield* put(finishedLoadingIsosurfaceAction(layerName, id)); +} + +function* _getChunkLoadingDescriptors( + id: number, + dataset: APIDataset, + segmentationLayer: APISegmentationLayer, + meshFile: APIMeshFile, +) { + const availableChunksMap: ChunksMap = {}; + let scale: Vector3 | null = null; + let loadingOrder: number[] = []; + + const { segmentMeshController } = getSceneController(); + const currentLODIndex = yield* call({ + context: segmentMeshController.isosurfacesLODRootGroup, + fn: segmentMeshController.isosurfacesLODRootGroup.getCurrentLOD, + }); + const version = meshFile.formatVersion; + const { meshFileName } = meshFile; + const isosurfaceExtraInfo = yield* call(getIsosurfaceExtraInfo, segmentationLayer.name, null); + + const editableMapping = yield* select((state) => + getEditableMappingForVolumeTracingId(state, segmentationLayer.tracingId), + ); + const tracing = yield* select((state) => + getTracingForSegmentationLayer(state, segmentationLayer), + ); + const mappingName = + // isosurfaceExtraInfo.mappingName contains the currently active mapping + // (can be the id of an editable mapping). However, we always need to + // use the mapping name of the on-disk mapping. + editableMapping != null ? editableMapping.baseMappingName : isosurfaceExtraInfo.mappingName; + + if (version < 3) { + console.warn( + "The active mesh file uses a version lower than 3. webKnossos cannot check whether the mesh file was computed with the correct target mapping. Meshing requests will fail if the mesh file does not match the active mapping.", + ); + } + + // mappingName only exists for versions >= 3 + if (meshFile.mappingName != null && meshFile.mappingName !== mappingName) { + throw Error( + `Trying to use a mesh file that was computed for mapping ${meshFile.mappingName} for a requested mapping of ${mappingName}.`, + ); + } + + if (version >= 3) { + const segmentInfo = yield* call( + meshV3.getMeshfileChunksForSegment, + dataset.dataStore.url, + dataset, + getBaseSegmentationName(segmentationLayer), + meshFileName, + id, + // The back-end should only receive a non-null mapping name, + // if it should perform extra (reverse) look ups to compute a mesh + // with a specific mapping from a mesh file that was computed + // without a mapping. + meshFile.mappingName == null ? mappingName : null, + editableMapping != null && tracing ? tracing.tracingId : null, + ); + scale = [segmentInfo.transform[0][0], segmentInfo.transform[1][1], segmentInfo.transform[2][2]]; + segmentInfo.chunks.lods.forEach((chunks, lodIndex) => { + availableChunksMap[lodIndex] = chunks?.chunks; + loadingOrder.push(lodIndex); + }); + // Load the chunks closest to the current LOD first. + loadingOrder.sort((a, b) => Math.abs(a - currentLODIndex) - Math.abs(b - currentLODIndex)); + } else { + availableChunksMap[NO_LOD_MESH_INDEX] = yield* call( + meshV0.getMeshfileChunksForSegment, + dataset.dataStore.url, + dataset, + getBaseSegmentationName(segmentationLayer), + meshFileName, + id, + ); + loadingOrder = [NO_LOD_MESH_INDEX]; + } + + return { + availableChunksMap, + scale, + loadingOrder, + }; +} + +function _getLoadChunksTasks( + dataset: APIDataset, + layerName: string, + meshFile: APIMeshFile, + segmentationLayer: APISegmentationLayer, + id: number, + seedPosition: Vector3, + availableChunksMap: ChunksMap, + loadingOrder: number[], + scale: Vector3 | null, +) { + const { segmentMeshController } = getSceneController(); + const { meshFileName } = meshFile; + return _.compact( _.flatten( loadingOrder.map((lod) => { if (availableChunksMap[lod] == null) { @@ -810,15 +874,6 @@ function* loadPrecomputedMeshForSegmentId( }), ), ); - - try { - yield* call(processTaskWithPool, loadChunksTasks, PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT); - } catch (exception) { - console.error(exception); - Toast.warning("Some mesh objects could not be loaded."); - } - - yield* put(finishedLoadingIsosurfaceAction(layerName, id)); } /* From 5a7d6fc5934269e2447b48fb8005b9c7369cd36e Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Thu, 27 Apr 2023 17:43:46 +0200 Subject: [PATCH 05/32] use new batched mesh loading (still fails) --- frontend/javascripts/admin/api/mesh_v3.ts | 24 ++++-- .../oxalis/model/sagas/isosurface_saga.ts | 84 ++++++++++++------- 2 files changed, 72 insertions(+), 36 deletions(-) diff --git a/frontend/javascripts/admin/api/mesh_v3.ts b/frontend/javascripts/admin/api/mesh_v3.ts index 8a46e000ed5..f20d626ffc1 100644 --- a/frontend/javascripts/admin/api/mesh_v3.ts +++ b/frontend/javascripts/admin/api/mesh_v3.ts @@ -62,26 +62,34 @@ export function getMeshfileChunksForSegment( }); } +type MeshChunkDataRequestV3 = { + byteOffset: number; + byteSize: number; +}; + +type MeshChunkDataRequestV3List = { + meshFile: String; + requests: MeshChunkDataRequestV3[]; +}; + +// todo: this should send batches now export function getMeshfileChunkData( dataStoreUrl: string, datasetId: APIDatasetId, layerName: string, - meshFile: string, - byteOffset: number, - byteSize: number, + batchDescription: MeshChunkDataRequestV3List, ): Promise { return doWithToken(async (token) => { const data = await Request.sendJSONReceiveArraybufferWithHeaders( `${dataStoreUrl}/data/datasets/${datasetId.owningOrganization}/${datasetId.name}/layers/${layerName}/meshes/formatVersion/3/chunks/data?token=${token}`, { - data: { - meshFile, - byteOffset, - byteSize, - }, + data: batchDescription, useWebworkerForArrayBuffer: false, }, ); + + // result needs to be "parsed" + return data; }); } diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index a2ab1398471..c99af5df3fd 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -801,40 +801,67 @@ function _getLoadChunksTasks( V3.length(V3.sub(seedPosition, "position" in chunk ? chunk.position : chunk)), ) as Array | Array; - const tasks = sortedAvailableChunks.map( - (chunk) => - function* loadChunk(): Saga { - if ("position" in chunk) { + let tasks; + if (sortedAvailableChunks.length > 0 && "position" in sortedAvailableChunks[0]) { + // V3 + tasks = _.chunk(sortedAvailableChunks as meshV3.MeshChunk[], 16).map( + (chunks) => + function* loadChunks(): Saga { // V3 - const dracoData = yield* call( + const dracoDataChunksWithJumpTable = yield* call( meshV3.getMeshfileChunkData, dataset.dataStore.url, dataset, getBaseSegmentationName(segmentationLayer), - meshFileName, - chunk.byteOffset, - chunk.byteSize, + { + meshFile: meshFileName, + // Only extract the relevant properties + requests: chunks.map(({ byteOffset, byteSize }) => ({ byteOffset, byteSize })), + }, ); const loader = getDracoLoader(); - const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); - // Compute vertex normals to achieve smooth shading - geometry.computeVertexNormals(); - - yield* call( - { - context: segmentMeshController, - fn: segmentMeshController.addIsosurfaceFromGeometry, - }, - geometry, - id, - chunk.position, - // Apply the scale from the segment info, which includes dataset scale and mag - scale, - lod, - layerName, + const jumpTableDataView = new DataView( + dracoDataChunksWithJumpTable, + 0, + 4 * chunks.length, + ); + const jumpPositionsForChunks = _.range(0, chunks.length).map((idx) => + Number(jumpTableDataView.getBigUint64(4 * idx, true)), ); - } else { + + for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { + const chunk = chunks[chunkIdx]; + // slice copies the data (?). can we create new views instead? + // also: move this code into the mesh_v3 module + const dracoData = dracoDataChunksWithJumpTable.slice( + jumpPositionsForChunks[chunkIdx], + jumpPositionsForChunks[chunkIdx + 1] ?? dracoDataChunksWithJumpTable.byteLength, + ); + const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); + // Compute vertex normals to achieve smooth shading + geometry.computeVertexNormals(); + + yield* call( + { + context: segmentMeshController, + fn: segmentMeshController.addIsosurfaceFromGeometry, + }, + geometry, + id, + chunk.position, + // Apply the scale from the segment info, which includes dataset scale and mag + scale, + lod, + layerName, + ); + } + }, + ); + } else { + tasks = (sortedAvailableChunks as Vector3[]).map( + (chunk) => + function* loadChunk(): Saga { // V0 const stlData = yield* call( meshV0.getMeshfileChunkData, @@ -867,9 +894,10 @@ function _getLoadChunksTasks( lod, layerName, ); - } - }, - ); + }, + ); + } + return tasks; }), ), From fff0ab5e469fa870be424aa26712a66bf2bc37fd Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Thu, 27 Apr 2023 17:44:07 +0200 Subject: [PATCH 06/32] debug and fix incorrect jumptable --- .../oxalis/model/sagas/isosurface_saga.ts | 11 +++++---- .../datastore/services/MeshFileService.scala | 24 ++++++++++++++++--- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index c99af5df3fd..73dc4436f63 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -820,15 +820,16 @@ function _getLoadChunksTasks( }, ); const loader = getDracoLoader(); - + const jumpTableLength = chunks.length + 1; const jumpTableDataView = new DataView( dracoDataChunksWithJumpTable, 0, - 4 * chunks.length, + 8 * jumpTableLength, ); - const jumpPositionsForChunks = _.range(0, chunks.length).map((idx) => - Number(jumpTableDataView.getBigUint64(4 * idx, true)), + const jumpPositionsForChunks = _.range(0, jumpTableLength).map((idx) => + Number(jumpTableDataView.getBigUint64(8 * idx, true)), ); + console.log("jumpPositionsForChunks", jumpPositionsForChunks); for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { const chunk = chunks[chunkIdx]; @@ -836,7 +837,7 @@ function _getLoadChunksTasks( // also: move this code into the mesh_v3 module const dracoData = dracoDataChunksWithJumpTable.slice( jumpPositionsForChunks[chunkIdx], - jumpPositionsForChunks[chunkIdx + 1] ?? dracoDataChunksWithJumpTable.byteLength, + jumpPositionsForChunks[chunkIdx + 1], ); const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); // Compute vertex normals to achieve smooth shading diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index 27e8b4b604d..e1122a6edc0 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -407,11 +407,29 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC dataSorted = data.sortBy(d => d._3) _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) // Ensure same encoding for all responses encoding = data.map(d => d._2).head - output = dataSorted + jumpTable = dataSorted .map(d => d._1.length) - .scanLeft((data.length + 1).toLong)((a, b) => a + b) + .scanLeft((8 * (data.length + 1)).toLong)((a, b) => a + b) .flatMap(l => longToBytes(l)) - .toArray ++ dataSorted.flatMap(d => d._1) + .toArray + jumpTableDebug = dataSorted + .map(d => d._1.length) + .scanLeft((8 * (data.length)).toLong)((a, b) => a + b) + .toArray + output = jumpTable ++ dataSorted.flatMap(d => d._1) + + _ = logger.warn( + s"requests length: ${meshChunkDataRequests.requests.length}\n" + ) + _ = logger.warn( + s"dataSorted length: ${dataSorted.length}\n" + ) + _ = logger.warn( + s"jumpTable: ${jumpTableDebug.mkString(" ")}\n" + ) + _ = logger.warn( + s"jumpTable length: ${jumpTable.length}\n" + ) } yield (output, encoding) private def positionLiteral(position: Vec3Int) = From 3ccf8d1099478c878db189e7c63f754b267142d0 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Thu, 27 Apr 2023 17:47:46 +0200 Subject: [PATCH 07/32] clean up --- .../oxalis/model/sagas/isosurface_saga.ts | 6 +++--- .../datastore/services/MeshFileService.scala | 20 +++---------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 73dc4436f63..9596f697254 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -821,15 +821,15 @@ function _getLoadChunksTasks( ); const loader = getDracoLoader(); const jumpTableLength = chunks.length + 1; + const byteLengthPerJumpTableEntry = 8; const jumpTableDataView = new DataView( dracoDataChunksWithJumpTable, 0, - 8 * jumpTableLength, + byteLengthPerJumpTableEntry * jumpTableLength, ); const jumpPositionsForChunks = _.range(0, jumpTableLength).map((idx) => - Number(jumpTableDataView.getBigUint64(8 * idx, true)), + Number(jumpTableDataView.getBigUint64(byteLengthPerJumpTableEntry * idx, true)), ); - console.log("jumpPositionsForChunks", jumpPositionsForChunks); for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { const chunk = chunks[chunkIdx]; diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index e1122a6edc0..b1ff25a6f2f 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -409,27 +409,13 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC encoding = data.map(d => d._2).head jumpTable = dataSorted .map(d => d._1.length) + // The jump table contains n + 1 elements (that way, for each requested + // chunk i , jumpTable[i] and jumpTable[i + 1] define the byte range). + // The jumptable contains the offsets in bytes (encoded as Longs). .scanLeft((8 * (data.length + 1)).toLong)((a, b) => a + b) .flatMap(l => longToBytes(l)) .toArray - jumpTableDebug = dataSorted - .map(d => d._1.length) - .scanLeft((8 * (data.length)).toLong)((a, b) => a + b) - .toArray output = jumpTable ++ dataSorted.flatMap(d => d._1) - - _ = logger.warn( - s"requests length: ${meshChunkDataRequests.requests.length}\n" - ) - _ = logger.warn( - s"dataSorted length: ${dataSorted.length}\n" - ) - _ = logger.warn( - s"jumpTable: ${jumpTableDebug.mkString(" ")}\n" - ) - _ = logger.warn( - s"jumpTable length: ${jumpTable.length}\n" - ) } yield (output, encoding) private def positionLiteral(position: Vec3Int) = From 514cd8399b93550a0792e4574c070b283f42c530 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Thu, 27 Apr 2023 19:32:17 +0200 Subject: [PATCH 08/32] refactor jump table decoding --- frontend/javascripts/admin/api/mesh_v3.ts | 32 ++++++++++++++++--- frontend/javascripts/libs/task_pool.ts | 10 +++--- .../oxalis/model/sagas/isosurface_saga.ts | 26 ++------------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/frontend/javascripts/admin/api/mesh_v3.ts b/frontend/javascripts/admin/api/mesh_v3.ts index f20d626ffc1..5a31b157637 100644 --- a/frontend/javascripts/admin/api/mesh_v3.ts +++ b/frontend/javascripts/admin/api/mesh_v3.ts @@ -1,4 +1,5 @@ import Request from "libs/request"; +import _ from "lodash"; import { Vector3, Vector4 } from "oxalis/constants"; import { APIDatasetId } from "types/api_flow_types"; import { doWithToken } from "./token"; @@ -78,18 +79,39 @@ export function getMeshfileChunkData( datasetId: APIDatasetId, layerName: string, batchDescription: MeshChunkDataRequestV3List, -): Promise { +): Promise { return doWithToken(async (token) => { - const data = await Request.sendJSONReceiveArraybufferWithHeaders( + const dracoDataChunksWithJumpTable = await Request.sendJSONReceiveArraybuffer( `${dataStoreUrl}/data/datasets/${datasetId.owningOrganization}/${datasetId.name}/layers/${layerName}/meshes/formatVersion/3/chunks/data?token=${token}`, { data: batchDescription, - useWebworkerForArrayBuffer: false, + // Why was this false before? + useWebworkerForArrayBuffer: true, }, ); + const chunkCount = batchDescription.requests.length; + const jumpTableLength = chunkCount + 1; + const byteLengthPerJumpTableEntry = 8; + const jumpTableDataView = new DataView( + dracoDataChunksWithJumpTable, + 0, + byteLengthPerJumpTableEntry * jumpTableLength, + ); + const jumpPositionsForChunks = _.range(0, jumpTableLength).map((idx) => + Number(jumpTableDataView.getBigUint64(byteLengthPerJumpTableEntry * idx, true)), + ); - // result needs to be "parsed" + const dataEntries = []; + for (let chunkIdx = 0; chunkIdx < chunkCount; chunkIdx++) { + // Slice creates a copy of the data, but working with TypedArray views causes + // issues when transferring the data to a webworker. + const dracoData = dracoDataChunksWithJumpTable.slice( + jumpPositionsForChunks[chunkIdx], + jumpPositionsForChunks[chunkIdx + 1], + ); + dataEntries.push(dracoData); + } - return data; + return dataEntries; }); } diff --git a/frontend/javascripts/libs/task_pool.ts b/frontend/javascripts/libs/task_pool.ts index 44653e17af9..ce2a8947b50 100644 --- a/frontend/javascripts/libs/task_pool.ts +++ b/frontend/javascripts/libs/task_pool.ts @@ -1,5 +1,6 @@ import type { Saga, Task } from "oxalis/model/sagas/effect-generators"; import { join, call, fork } from "typed-redux-saga"; + /* Given an array of async tasks, processTaskWithPool allows to execute at most ${poolSize} tasks concurrently. @@ -11,8 +12,7 @@ export default function* processTaskWithPool( ): Saga { const startedTasks: Array> = []; let isFinalResolveScheduled = false; - // @ts-expect-error ts-migrate(7034) FIXME: Variable 'error' implicitly has type 'any' in some... Remove this comment to see the full error message - let error = null; + let error: Error | null = null; // @ts-expect-error ts-migrate(7006) FIXME: Parameter 'fn' implicitly has an 'any' type. function* forkSafely(fn): Saga { @@ -22,7 +22,7 @@ export default function* processTaskWithPool( try { yield* call(fn); } catch (e) { - error = e; + error = e as Error; } } @@ -34,7 +34,6 @@ export default function* processTaskWithPool( // awaited now together. // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. yield* join(startedTasks); - // @ts-expect-error ts-migrate(7005) FIXME: Variable 'error' implicitly has an 'any' type. if (error != null) throw error; } @@ -53,6 +52,7 @@ export default function* processTaskWithPool( for (let i = 0; i < poolSize; i++) { yield* fork(startNextTask); - } // The saga will wait for all forked tasks to terminate before returning, because + } + // The saga will wait for all forked tasks to terminate before returning, because // fork() creates attached forks (in contrast to spawn()). } diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 9596f697254..89862b640ca 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -3,12 +3,7 @@ import _ from "lodash"; import { V3 } from "libs/mjs"; import { sleep } from "libs/utils"; import ErrorHandling from "libs/error_handling"; -import type { - APIDataset, - APIMeshFile, - APIMessage, - APISegmentationLayer, -} from "types/api_flow_types"; +import type { APIDataset, APIMeshFile, APISegmentationLayer } from "types/api_flow_types"; import { mergeVertices } from "libs/BufferGeometryUtils"; import Deferred from "libs/deferred"; @@ -808,7 +803,7 @@ function _getLoadChunksTasks( (chunks) => function* loadChunks(): Saga { // V3 - const dracoDataChunksWithJumpTable = yield* call( + const dataForChunks = yield* call( meshV3.getMeshfileChunkData, dataset.dataStore.url, dataset, @@ -820,25 +815,10 @@ function _getLoadChunksTasks( }, ); const loader = getDracoLoader(); - const jumpTableLength = chunks.length + 1; - const byteLengthPerJumpTableEntry = 8; - const jumpTableDataView = new DataView( - dracoDataChunksWithJumpTable, - 0, - byteLengthPerJumpTableEntry * jumpTableLength, - ); - const jumpPositionsForChunks = _.range(0, jumpTableLength).map((idx) => - Number(jumpTableDataView.getBigUint64(byteLengthPerJumpTableEntry * idx, true)), - ); for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { + const dracoData = dataForChunks[chunkIdx]; const chunk = chunks[chunkIdx]; - // slice copies the data (?). can we create new views instead? - // also: move this code into the mesh_v3 module - const dracoData = dracoDataChunksWithJumpTable.slice( - jumpPositionsForChunks[chunkIdx], - jumpPositionsForChunks[chunkIdx + 1], - ); const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); // Compute vertex normals to achieve smooth shading geometry.computeVertexNormals(); From 067ad1e38f3ad50ab7b0b70bccc28c1c4e63057c Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Fri, 28 Apr 2023 13:06:31 +0200 Subject: [PATCH 09/32] implement dynamic batching and add benchmark code --- frontend/javascripts/admin/api/mesh_v3.ts | 1 - .../oxalis/model/sagas/isosurface_saga.ts | 54 +++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/frontend/javascripts/admin/api/mesh_v3.ts b/frontend/javascripts/admin/api/mesh_v3.ts index 5a31b157637..9a3403f5f62 100644 --- a/frontend/javascripts/admin/api/mesh_v3.ts +++ b/frontend/javascripts/admin/api/mesh_v3.ts @@ -73,7 +73,6 @@ type MeshChunkDataRequestV3List = { requests: MeshChunkDataRequestV3[]; }; -// todo: this should send batches now export function getMeshfileChunkData( dataStoreUrl: string, datasetId: APIDatasetId, diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 89862b640ca..32b0cf7e071 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -78,7 +78,7 @@ export const NO_LOD_MESH_INDEX = -1; const MAX_RETRY_COUNT = 5; const RETRY_WAIT_TIME = 5000; const MESH_CHUNK_THROTTLE_DELAY = 500; -const PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT = 6; +const PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT = 64; // The calculation of an isosurface is spread across multiple requests. // In order to avoid, that a huge amount of chunks is downloaded at full speed, @@ -640,6 +640,9 @@ function* loadPrecomputedMeshForSegmentId( return; } + console.time(`Load mesh for ${id}`); + + console.time("get chunk descriptors"); let availableChunksMap: ChunksMap = {}; let scale: Vector3 | null = null; let loadingOrder: number[] | null = null; @@ -661,7 +664,9 @@ function* loadPrecomputedMeshForSegmentId( yield* put(removeIsosurfaceAction(layerName, id)); return; } + console.timeEnd("get chunk descriptors"); + console.time("load chunks"); const loadChunksTasks = _getLoadChunksTasks( dataset, layerName, @@ -675,11 +680,19 @@ function* loadPrecomputedMeshForSegmentId( ); try { - yield* call(processTaskWithPool, loadChunksTasks, PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT); + yield* call( + processTaskWithPool, + loadChunksTasks, + (window as any).PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT || + PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT, + ); } catch (exception) { console.error(exception); Toast.warning("Some mesh objects could not be loaded."); } + console.timeEnd("load chunks"); + + console.timeEnd(`Load mesh for ${id}`); yield* put(finishedLoadingIsosurfaceAction(layerName, id)); } @@ -796,10 +809,40 @@ function _getLoadChunksTasks( V3.length(V3.sub(seedPosition, "position" in chunk ? chunk.position : chunk)), ) as Array | Array; + function chunkDynamically( + chunks: T[], + threshold: number, + measureFn: (el: T) => number, + ): Array { + const batches = []; + let currentBatch = []; + let currentSize = 0; + + for (let i = 0; i < chunks.length; i++) { + currentBatch.push(chunks[i]); + currentSize += measureFn(chunks[i]); + if (currentSize > threshold || i === chunks.length - 1) { + currentSize = 0; + batches.push(currentBatch); + currentBatch = []; + } + } + return batches; + } + + const chunkSize = (window as any).meshChunkSize || 64; let tasks; if (sortedAvailableChunks.length > 0 && "position" in sortedAvailableChunks[0]) { // V3 - tasks = _.chunk(sortedAvailableChunks as meshV3.MeshChunk[], 16).map( + const batches = (window as any).useDynamicChunking + ? chunkDynamically( + sortedAvailableChunks as meshV3.MeshChunk[], + (window as any).meshChunkSize, + (chunk) => chunk.byteSize, + ) + : _.chunk(sortedAvailableChunks as meshV3.MeshChunk[], chunkSize); + + tasks = batches.map( (chunks) => function* loadChunks(): Saga { // V3 @@ -816,10 +859,14 @@ function _getLoadChunksTasks( ); const loader = getDracoLoader(); + let totalSizePerBatch = 0; for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { + totalSizePerBatch += chunks[chunkIdx].byteSize; const dracoData = dataForChunks[chunkIdx]; const chunk = chunks[chunkIdx]; + const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); + // Compute vertex normals to achieve smooth shading geometry.computeVertexNormals(); @@ -837,6 +884,7 @@ function _getLoadChunksTasks( layerName, ); } + console.log("totalSizePerBatch", totalSizePerBatch); }, ); } else { From 17dd1f264cb0b184992dec2d47a2accbd37a3fa1 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Fri, 28 Apr 2023 13:54:19 +0200 Subject: [PATCH 10/32] clean up --- frontend/javascripts/libs/utils.ts | 27 +++++++++++ .../oxalis/model/sagas/isosurface_saga.ts | 46 ++++--------------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/frontend/javascripts/libs/utils.ts b/frontend/javascripts/libs/utils.ts index 1a5e08a4b86..6c62f24b993 100644 --- a/frontend/javascripts/libs/utils.ts +++ b/frontend/javascripts/libs/utils.ts @@ -964,6 +964,33 @@ export function chunkIntoTimeWindows( ); } +// chunkDynamically takes an array of input elements and splits these +// into batches. Instead of using a constant batch size, the elements +// of a batch are measured with a measureFn. Then, each batch is filled +// until the provided minThreshold is exceeded. +// Note that the threshold will be exceeded for each batch +// (except for the last batch which may contain less). +export function chunkDynamically( + elements: T[], + minThreshold: number, + measureFn: (el: T) => number, +): Array { + const batches = []; + let currentBatch = []; + let currentSize = 0; + + for (let i = 0; i < elements.length; i++) { + currentBatch.push(elements[i]); + currentSize += measureFn(elements[i]); + if (currentSize > minThreshold || i === elements.length - 1) { + currentSize = 0; + batches.push(currentBatch); + currentBatch = []; + } + } + return batches; +} + export function convertBufferToImage( buffer: Uint8Array, width: number, diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 32b0cf7e071..c41e3d51106 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -1,7 +1,7 @@ import { saveAs } from "file-saver"; import _ from "lodash"; import { V3 } from "libs/mjs"; -import { sleep } from "libs/utils"; +import { chunkDynamically, sleep } from "libs/utils"; import ErrorHandling from "libs/error_handling"; import type { APIDataset, APIMeshFile, APISegmentationLayer } from "types/api_flow_types"; import { mergeVertices } from "libs/BufferGeometryUtils"; @@ -78,7 +78,8 @@ export const NO_LOD_MESH_INDEX = -1; const MAX_RETRY_COUNT = 5; const RETRY_WAIT_TIME = 5000; const MESH_CHUNK_THROTTLE_DELAY = 500; -const PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT = 64; +const PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT = 32; +const MIN_BATCH_SIZE_IN_BYTES = 2 ** 16; // The calculation of an isosurface is spread across multiple requests. // In order to avoid, that a huge amount of chunks is downloaded at full speed, @@ -680,12 +681,7 @@ function* loadPrecomputedMeshForSegmentId( ); try { - yield* call( - processTaskWithPool, - loadChunksTasks, - (window as any).PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT || - PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT, - ); + yield* call(processTaskWithPool, loadChunksTasks, PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT); } catch (exception) { console.error(exception); Toast.warning("Some mesh objects could not be loaded."); @@ -809,38 +805,14 @@ function _getLoadChunksTasks( V3.length(V3.sub(seedPosition, "position" in chunk ? chunk.position : chunk)), ) as Array | Array; - function chunkDynamically( - chunks: T[], - threshold: number, - measureFn: (el: T) => number, - ): Array { - const batches = []; - let currentBatch = []; - let currentSize = 0; - - for (let i = 0; i < chunks.length; i++) { - currentBatch.push(chunks[i]); - currentSize += measureFn(chunks[i]); - if (currentSize > threshold || i === chunks.length - 1) { - currentSize = 0; - batches.push(currentBatch); - currentBatch = []; - } - } - return batches; - } - - const chunkSize = (window as any).meshChunkSize || 64; let tasks; if (sortedAvailableChunks.length > 0 && "position" in sortedAvailableChunks[0]) { // V3 - const batches = (window as any).useDynamicChunking - ? chunkDynamically( - sortedAvailableChunks as meshV3.MeshChunk[], - (window as any).meshChunkSize, - (chunk) => chunk.byteSize, - ) - : _.chunk(sortedAvailableChunks as meshV3.MeshChunk[], chunkSize); + const batches = chunkDynamically( + sortedAvailableChunks as meshV3.MeshChunk[], + MIN_BATCH_SIZE_IN_BYTES, + (chunk) => chunk.byteSize, + ); tasks = batches.map( (chunks) => From fecabf6bfffc92766fe2dffa581ed9a2f6181aac Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Fri, 28 Apr 2023 14:22:24 +0200 Subject: [PATCH 11/32] remove comment --- frontend/javascripts/admin/api/mesh_v3.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/javascripts/admin/api/mesh_v3.ts b/frontend/javascripts/admin/api/mesh_v3.ts index 9a3403f5f62..5fd9c17d50d 100644 --- a/frontend/javascripts/admin/api/mesh_v3.ts +++ b/frontend/javascripts/admin/api/mesh_v3.ts @@ -84,7 +84,6 @@ export function getMeshfileChunkData( `${dataStoreUrl}/data/datasets/${datasetId.owningOrganization}/${datasetId.name}/layers/${layerName}/meshes/formatVersion/3/chunks/data?token=${token}`, { data: batchDescription, - // Why was this false before? useWebworkerForArrayBuffer: true, }, ); From 3da38e2b9c75545933d6fac4b935fcee3163745d Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Fri, 28 Apr 2023 14:26:05 +0200 Subject: [PATCH 12/32] add spec for chunkDynamically --- frontend/javascripts/test/libs/utils.spec.ts | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/frontend/javascripts/test/libs/utils.spec.ts b/frontend/javascripts/test/libs/utils.spec.ts index 1932890a15b..5d06d6ea17e 100644 --- a/frontend/javascripts/test/libs/utils.spec.ts +++ b/frontend/javascripts/test/libs/utils.spec.ts @@ -1,5 +1,6 @@ import * as Utils from "libs/utils"; import test from "ava"; + test("filterWithSearchQueryOR: simple case", (t) => { const collection = [ { @@ -228,3 +229,27 @@ test("chunkIntoTimeWindows 2/2", async (t) => { t.is(chunks.length, 3); t.deepEqual(chunks, [chunk1, chunk2, chunk3]); }); + +test.only("chunkDynamically (I)", (t) => { + const elements = [5, 7, 10, 234, 10]; + const batches = Utils.chunkDynamically(elements, 10, (el) => el); + t.deepEqual(batches, [[5, 7], [10, 234], [10]]); +}); + +test.only("chunkDynamically (II)", (t) => { + const elements = [5, 7, 10, 234, 10]; + const batches = Utils.chunkDynamically(elements, 100, (el) => el); + t.deepEqual(batches, [[5, 7, 10, 234], [10]]); +}); + +test.only("chunkDynamically (III)", (t) => { + const elements = [5, 7, 10, 234, 10]; + const batches = Utils.chunkDynamically(elements, 1000, (el) => el); + t.deepEqual(batches, [[5, 7, 10, 234, 10]]); +}); + +test.only("chunkDynamically (IV)", (t) => { + const elements = [5, 7, 10, 234, 10]; + const batches = Utils.chunkDynamically(elements, 1, (el) => el); + t.deepEqual(batches, [[5], [7], [10], [234], [10]]); +}); From 2a60197e10ed9ea2d174523cb48924286892f9a3 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 10:20:54 +0200 Subject: [PATCH 13/32] don't compute jump table in back-end as front-end can compute this on its own --- frontend/javascripts/admin/api/mesh_v3.ts | 19 ++++++++----------- .../datastore/services/MeshFileService.scala | 10 +--------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/frontend/javascripts/admin/api/mesh_v3.ts b/frontend/javascripts/admin/api/mesh_v3.ts index 5fd9c17d50d..267cd15595f 100644 --- a/frontend/javascripts/admin/api/mesh_v3.ts +++ b/frontend/javascripts/admin/api/mesh_v3.ts @@ -88,20 +88,17 @@ export function getMeshfileChunkData( }, ); const chunkCount = batchDescription.requests.length; - const jumpTableLength = chunkCount + 1; - const byteLengthPerJumpTableEntry = 8; - const jumpTableDataView = new DataView( - dracoDataChunksWithJumpTable, - 0, - byteLengthPerJumpTableEntry * jumpTableLength, - ); - const jumpPositionsForChunks = _.range(0, jumpTableLength).map((idx) => - Number(jumpTableDataView.getBigUint64(byteLengthPerJumpTableEntry * idx, true)), - ); + const jumpPositionsForChunks = []; + let cumsum = 0; + for (const req of batchDescription.requests) { + jumpPositionsForChunks.push(cumsum); + cumsum += req.byteSize; + } + jumpPositionsForChunks.push(cumsum); const dataEntries = []; for (let chunkIdx = 0; chunkIdx < chunkCount; chunkIdx++) { - // Slice creates a copy of the data, but working with TypedArray views causes + // slice() creates a copy of the data, but working with TypedArray Views would cause // issues when transferring the data to a webworker. const dracoData = dracoDataChunksWithJumpTable.slice( jumpPositionsForChunks[chunkIdx], diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index b1ff25a6f2f..aa7777a9434 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -407,15 +407,7 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC dataSorted = data.sortBy(d => d._3) _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) // Ensure same encoding for all responses encoding = data.map(d => d._2).head - jumpTable = dataSorted - .map(d => d._1.length) - // The jump table contains n + 1 elements (that way, for each requested - // chunk i , jumpTable[i] and jumpTable[i + 1] define the byte range). - // The jumptable contains the offsets in bytes (encoded as Longs). - .scanLeft((8 * (data.length + 1)).toLong)((a, b) => a + b) - .flatMap(l => longToBytes(l)) - .toArray - output = jumpTable ++ dataSorted.flatMap(d => d._1) + output = dataSorted.flatMap(d => d._1).toArray } yield (output, encoding) private def positionLiteral(position: Vec3Int) = From 4e30c7307901cdaced42ae8a7499a57f067aedb7 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 10:22:52 +0200 Subject: [PATCH 14/32] remove only modifier --- frontend/javascripts/test/libs/utils.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/javascripts/test/libs/utils.spec.ts b/frontend/javascripts/test/libs/utils.spec.ts index 5d06d6ea17e..ff467f8c104 100644 --- a/frontend/javascripts/test/libs/utils.spec.ts +++ b/frontend/javascripts/test/libs/utils.spec.ts @@ -230,25 +230,25 @@ test("chunkIntoTimeWindows 2/2", async (t) => { t.deepEqual(chunks, [chunk1, chunk2, chunk3]); }); -test.only("chunkDynamically (I)", (t) => { +test("chunkDynamically (I)", (t) => { const elements = [5, 7, 10, 234, 10]; const batches = Utils.chunkDynamically(elements, 10, (el) => el); t.deepEqual(batches, [[5, 7], [10, 234], [10]]); }); -test.only("chunkDynamically (II)", (t) => { +test("chunkDynamically (II)", (t) => { const elements = [5, 7, 10, 234, 10]; const batches = Utils.chunkDynamically(elements, 100, (el) => el); t.deepEqual(batches, [[5, 7, 10, 234], [10]]); }); -test.only("chunkDynamically (III)", (t) => { +test("chunkDynamically (III)", (t) => { const elements = [5, 7, 10, 234, 10]; const batches = Utils.chunkDynamically(elements, 1000, (el) => el); t.deepEqual(batches, [[5, 7, 10, 234, 10]]); }); -test.only("chunkDynamically (IV)", (t) => { +test("chunkDynamically (IV)", (t) => { const elements = [5, 7, 10, 234, 10]; const batches = Utils.chunkDynamically(elements, 1, (el) => el); t.deepEqual(batches, [[5], [7], [10], [234], [10]]); From a1b45104543eb8998d1d454edf9ceaa28e102373 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 17:55:08 +0200 Subject: [PATCH 15/32] update draco decoder to v1.5.6 to fix buggy error propagation --- frontend/javascripts/libs/DRACOLoader.ts | 113 +++++---- frontend/javascripts/libs/draco.ts | 4 +- .../oxalis/model/sagas/isosurface_saga.ts | 2 +- public/wasm/draco_decoder.wasm | Bin 281481 -> 285747 bytes public/wasm/draco_wasm_wrapper.js | 222 +++++++++--------- 5 files changed, 193 insertions(+), 148 deletions(-) diff --git a/frontend/javascripts/libs/DRACOLoader.ts b/frontend/javascripts/libs/DRACOLoader.ts index b958c08031b..c7e448898ad 100644 --- a/frontend/javascripts/libs/DRACOLoader.ts +++ b/frontend/javascripts/libs/DRACOLoader.ts @@ -1,7 +1,15 @@ // @ts-nocheck /* eslint-disable */ -// Copied from node_modules/three/examples/jsm/loaders/DRACOLoader.js to fix ERR_REQUIRE_ESM error. -import { BufferAttribute, BufferGeometry, FileLoader, Loader } from "three"; +// Copied from https://github.com/mrdoob/three.js/pull/25475 / DRACOLoader.js to fix ERR_REQUIRE_ESM error. +import { + BufferAttribute, + BufferGeometry, + Color, + FileLoader, + Loader, + LinearSRGBColorSpace, + SRGBColorSpace, +} from "three"; const _taskCache = new WeakMap(); @@ -62,44 +70,35 @@ class DRACOLoader extends Loader { loader.load( url, (buffer) => { - const taskConfig = { - attributeIDs: this.defaultAttributeIDs, - attributeTypes: this.defaultAttributeTypes, - useUniqueIDs: false, - }; - - this.decodeGeometry(buffer, taskConfig).then(onLoad).catch(onError); + this.parse(buffer, onLoad, onError); }, onProgress, onError, ); } - /** @deprecated Kept for backward-compatibility with previous DRACOLoader versions. */ - decodeDracoFile(buffer, callback, attributeIDs, attributeTypes) { + parse(buffer, onLoad, onError) { + this.decodeDracoFile(buffer, onLoad, null, null, SRGBColorSpace).catch(onError); + } + + decodeDracoFile( + buffer, + callback, + attributeIDs, + attributeTypes, + vertexColorSpace = LinearSRGBColorSpace, + ) { const taskConfig = { attributeIDs: attributeIDs || this.defaultAttributeIDs, attributeTypes: attributeTypes || this.defaultAttributeTypes, useUniqueIDs: !!attributeIDs, + vertexColorSpace: vertexColorSpace, }; - this.decodeGeometry(buffer, taskConfig).then(callback); + return this.decodeGeometry(buffer, taskConfig).then(callback); } decodeGeometry(buffer, taskConfig) { - // TODO: For backward-compatibility, support 'attributeTypes' objects containing - // references (rather than names) to typed array constructors. These must be - // serialized before sending them to the worker. - for (const attribute in taskConfig.attributeTypes) { - const type = taskConfig.attributeTypes[attribute]; - - if (type.BYTES_PER_ELEMENT !== undefined) { - taskConfig.attributeTypes[attribute] = type.name; - } - } - - // - const taskKey = JSON.stringify(taskConfig); // Check for an existing task using this buffer. A transferred buffer cannot be transferred @@ -172,17 +171,39 @@ class DRACOLoader extends Loader { } for (let i = 0; i < geometryData.attributes.length; i++) { - const attribute = geometryData.attributes[i]; - const name = attribute.name; - const array = attribute.array; - const itemSize = attribute.itemSize; + const result = geometryData.attributes[i]; + const name = result.name; + const array = result.array; + const itemSize = result.itemSize; + + const attribute = new BufferAttribute(array, itemSize); + + if (name === "color") { + this._assignVertexColorSpace(attribute, result.vertexColorSpace); + } - geometry.setAttribute(name, new BufferAttribute(array, itemSize)); + geometry.setAttribute(name, attribute); } return geometry; } + _assignVertexColorSpace(attribute, inputColorSpace) { + // While .drc files do not specify colorspace, the only 'official' tooling + // is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc + // file is passed into .load() or .parse(). GLTFLoader uses internal APIs + // to decode geometry, and vertex colors are already Linear-sRGB in there. + + if (inputColorSpace !== SRGBColorSpace) return; + + const _color = new Color(); + + for (let i = 0, il = attribute.count; i < il; i++) { + _color.fromBufferAttribute(attribute, i).convertSRGBToLinear(); + attribute.setXYZ(i, _color.r, _color.g, _color.b); + } + } + _loadLibrary(url, responseType) { const loader = new FileLoader(this.manager); loader.setPath(this.decoderPath); @@ -298,6 +319,10 @@ class DRACOLoader extends Loader { this.workerPool.length = 0; + if (this.workerSourceURL !== "") { + URL.revokeObjectURL(this.workerSourceURL); + } + return this; } } @@ -320,7 +345,7 @@ function DRACOWorker() { resolve({ draco: draco }); }; - DracoDecoderModule(decoderConfig); + DracoDecoderModule(decoderConfig); // eslint-disable-line no-undef }); break; @@ -330,11 +355,9 @@ function DRACOWorker() { decoderPending.then((module) => { const draco = module.draco; const decoder = new draco.Decoder(); - const decoderBuffer = new draco.DecoderBuffer(); - decoderBuffer.Init(new Int8Array(buffer), buffer.byteLength); try { - const geometry = decodeGeometry(draco, decoder, decoderBuffer, taskConfig); + const geometry = decodeGeometry(draco, decoder, new Int8Array(buffer), taskConfig); const buffers = geometry.attributes.map((attr) => attr.array.buffer); @@ -346,7 +369,6 @@ function DRACOWorker() { self.postMessage({ type: "error", id: message.id, error: error.message }); } finally { - draco.destroy(decoderBuffer); draco.destroy(decoder); } }); @@ -354,7 +376,7 @@ function DRACOWorker() { } }; - function decodeGeometry(draco, decoder, decoderBuffer, taskConfig) { + function decodeGeometry(draco, decoder, array, taskConfig) { const attributeIDs = taskConfig.attributeIDs; const attributeTypes = taskConfig.attributeTypes; @@ -365,10 +387,10 @@ function DRACOWorker() { if (geometryType === draco.TRIANGULAR_MESH) { dracoGeometry = new draco.Mesh(); - decodingStatus = decoder.DecodeBufferToMesh(decoderBuffer, dracoGeometry); + decodingStatus = decoder.DecodeArrayToMesh(array, array.byteLength, dracoGeometry); } else if (geometryType === draco.POINT_CLOUD) { dracoGeometry = new draco.PointCloud(); - decodingStatus = decoder.DecodeBufferToPointCloud(decoderBuffer, dracoGeometry); + decodingStatus = decoder.DecodeArrayToPointCloud(array, array.byteLength, dracoGeometry); } else { throw new Error("THREE.DRACOLoader: Unexpected geometry type."); } @@ -401,9 +423,20 @@ function DRACOWorker() { attribute = decoder.GetAttribute(dracoGeometry, attributeID); } - geometry.attributes.push( - decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute), + const attributeResult = decodeAttribute( + draco, + decoder, + dracoGeometry, + attributeName, + attributeType, + attribute, ); + + if (attributeName === "color") { + attributeResult.vertexColorSpace = taskConfig.vertexColorSpace; + } + + geometry.attributes.push(attributeResult); } // Add index. diff --git a/frontend/javascripts/libs/draco.ts b/frontend/javascripts/libs/draco.ts index 65189d2f57b..7544ebf518b 100644 --- a/frontend/javascripts/libs/draco.ts +++ b/frontend/javascripts/libs/draco.ts @@ -6,12 +6,12 @@ let _dracoLoader: CustomDRACOLoader | null; class CustomDRACOLoader extends DRACOLoader { // Subclass to create a promise-based API and add typing decodeDracoFileAsync = (buffer: ArrayBuffer, ...args: any[]): Promise => - new Promise((resolve) => { + new Promise((resolve, reject) => { if (_dracoLoader == null) { throw new Error("DracoLoader not instantiated."); } // @ts-ignore - _dracoLoader.decodeDracoFile(buffer, resolve, ...args); + _dracoLoader.parse(buffer, resolve, reject); }); } diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index c41e3d51106..c93a9f49df1 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -684,7 +684,7 @@ function* loadPrecomputedMeshForSegmentId( yield* call(processTaskWithPool, loadChunksTasks, PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT); } catch (exception) { console.error(exception); - Toast.warning("Some mesh objects could not be loaded."); + Toast.warning(`Some mesh objects could not be loaded for segment ${id}.`); } console.timeEnd("load chunks"); diff --git a/public/wasm/draco_decoder.wasm b/public/wasm/draco_decoder.wasm index 3f0ba9ce8ee46caf5822a61235c9c271b79c9fdd..e5a5e06eb51fb061a94a9682cc7e338038fae25c 100644 GIT binary patch literal 285747 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 z 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 z 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 diff --git a/public/wasm/draco_wasm_wrapper.js b/public/wasm/draco_wasm_wrapper.js index 60a3b94fdda..bb5b1224121 100644 --- a/public/wasm/draco_wasm_wrapper.js +++ b/public/wasm/draco_wasm_wrapper.js @@ -1,105 +1,117 @@ -// copied from node_modules/three/examples/js/libs/draco/ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(f){var m=0;return function(){return m=d);)++b;if(16k?d+=String.fromCharCode(k):(k-=65536,d+=String.fromCharCode(55296|k>>10,56320|k&1023))}}else d+=String.fromCharCode(k)}return d}function X(a,c){return a?h(ca,a,c):""}function e(a,c){0=d&&(d=65536+((d&1023)<<10)|a.charCodeAt(++b)&1023);127>=d?++c:c=2047>=d?c+2:65535>=d?c+3:c+4}c=Array(c+1);b=0;d=c.length;if(0=e){var f=a.charCodeAt(++k);e=65536+((e&1023)<<10)|f&1023}if(127>=e){if(b>=d)break;c[b++]=e}else{if(2047>=e){if(b+1>=d)break;c[b++]=192|e>>6}else{if(65535>=e){if(b+2>=d)break;c[b++]=224|e>>12}else{if(b+3>=d)break;c[b++]=240|e>>18;c[b++]=128|e>>12&63}c[b++]=128|e>>6&63}c[b++]=128| -e&63}}c[b]=0}a=n.alloc(c,T);n.copy(c,T,a)}return a}function x(){throw"cannot construct a Status, no constructor in IDL";}function A(){this.ptr=Oa();u(A)[this.ptr]=this}function B(){this.ptr=Pa();u(B)[this.ptr]=this}function C(){this.ptr=Qa();u(C)[this.ptr]=this}function D(){this.ptr=Ra();u(D)[this.ptr]=this}function E(){this.ptr=Sa();u(E)[this.ptr]=this}function q(){this.ptr=Ta();u(q)[this.ptr]=this}function J(){this.ptr=Ua();u(J)[this.ptr]=this}function w(){this.ptr=Va();u(w)[this.ptr]=this}function F(){this.ptr= -Wa();u(F)[this.ptr]=this}function r(){this.ptr=Xa();u(r)[this.ptr]=this}function G(){this.ptr=Ya();u(G)[this.ptr]=this}function H(){this.ptr=Za();u(H)[this.ptr]=this}function O(){this.ptr=$a();u(O)[this.ptr]=this}function K(){this.ptr=ab();u(K)[this.ptr]=this}function g(){this.ptr=bb();u(g)[this.ptr]=this}function y(){this.ptr=cb();u(y)[this.ptr]=this}function Q(){throw"cannot construct a VoidPtr, no constructor in IDL";}function I(){this.ptr=db();u(I)[this.ptr]=this}function L(){this.ptr=eb();u(L)[this.ptr]= -this}m=m||{};var a="undefined"!==typeof m?m:{},Ga=!1,Ha=!1;a.onRuntimeInitialized=function(){Ga=!0;if(Ha&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Ha=!0;if(Ga&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(a){if("string"!==typeof a)return!1;a=a.split(".");return 2>a.length||3=a[1]?!0:0!=a[0]||10>2]},getStr:function(){return X(R.get())}, -get64:function(){var a=R.get();R.get();return a},getZero:function(){R.get()}},Ka={__cxa_allocate_exception:function(a){return ib(a)},__cxa_throw:function(a,c,b){"uncaught_exception"in ta?ta.uncaught_exceptions++:ta.uncaught_exceptions=1;throw a;},abort:function(){z()},emscripten_get_sbrk_ptr:function(){return 18416},emscripten_memcpy_big:function(a,c,b){ca.set(ca.subarray(c,c+b),a)},emscripten_resize_heap:function(a){if(2147418112= -c?e(2*c,65536):Math.min(e((3*c+2147483648)/4,65536),2147418112);a:{try{ia.grow(c-ka.byteLength+65535>>16);l(ia.buffer);var b=1;break a}catch(d){}b=void 0}return b?!0:!1},environ_get:function(a,c){var b=0;ba().forEach(function(d,e){var f=c+b;e=P[a+4*e>>2]=f;for(f=0;f>0]=d.charCodeAt(f);T[e>>0]=0;b+=d.length+1});return 0},environ_sizes_get:function(a,c){var b=ba();P[a>>2]=b.length;var d=0;b.forEach(function(a){d+=a.length+1});P[c>>2]=d;return 0},fd_close:function(a){return 0},fd_seek:function(a, -c,b,d,e){return 0},fd_write:function(a,c,b,d){try{for(var e=0,f=0;f>2],k=P[c+(8*f+4)>>2],h=0;h>2]=e;return 0}catch(ua){return"undefined"!==typeof FS&&ua instanceof FS.ErrnoError||z(ua),ua.errno}},memory:ia,setTempRet0:function(a){},table:gb},La=function(){function e(c,b){a.asm=c.exports;aa--;a.monitorRunDependencies&&a.monitorRunDependencies(aa);0==aa&&(null!==sa&&(clearInterval(sa),sa=null),ja&&(c=ja,ja=null,c()))}function c(a){e(a.instance)} -function b(a){return Ma().then(function(a){return WebAssembly.instantiate(a,d)}).then(a,function(a){Y("failed to asynchronously prepare wasm: "+a);z(a)})}var d={env:Ka,wasi_unstable:Ka};aa++;a.monitorRunDependencies&&a.monitorRunDependencies(aa);if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(Na){return Y("Module.instantiateWasm callback failed with error: "+Na),!1}(function(){if(da||"function"!==typeof WebAssembly.instantiateStreaming||va(U)||"function"!==typeof fetch)return b(c);fetch(U, -{credentials:"same-origin"}).then(function(a){return WebAssembly.instantiateStreaming(a,d).then(c,function(a){Y("wasm streaming compile failed: "+a);Y("falling back to ArrayBuffer instantiation");b(c)})})})();return{}}();a.asm=La;var hb=a.___wasm_call_ctors=function(){return a.asm.__wasm_call_ctors.apply(null,arguments)},jb=a._emscripten_bind_Status_code_0=function(){return a.asm.emscripten_bind_Status_code_0.apply(null,arguments)},kb=a._emscripten_bind_Status_ok_0=function(){return a.asm.emscripten_bind_Status_ok_0.apply(null, -arguments)},lb=a._emscripten_bind_Status_error_msg_0=function(){return a.asm.emscripten_bind_Status_error_msg_0.apply(null,arguments)},mb=a._emscripten_bind_Status___destroy___0=function(){return a.asm.emscripten_bind_Status___destroy___0.apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return a.asm.emscripten_bind_DracoUInt16Array_DracoUInt16Array_0.apply(null,arguments)},nb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt16Array_GetValue_1.apply(null, -arguments)},ob=a._emscripten_bind_DracoUInt16Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt16Array_size_0.apply(null,arguments)},pb=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt16Array___destroy___0.apply(null,arguments)},Pa=a._emscripten_bind_PointCloud_PointCloud_0=function(){return a.asm.emscripten_bind_PointCloud_PointCloud_0.apply(null,arguments)},qb=a._emscripten_bind_PointCloud_num_attributes_0=function(){return a.asm.emscripten_bind_PointCloud_num_attributes_0.apply(null, -arguments)},rb=a._emscripten_bind_PointCloud_num_points_0=function(){return a.asm.emscripten_bind_PointCloud_num_points_0.apply(null,arguments)},sb=a._emscripten_bind_PointCloud___destroy___0=function(){return a.asm.emscripten_bind_PointCloud___destroy___0.apply(null,arguments)},Qa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return a.asm.emscripten_bind_DracoUInt8Array_DracoUInt8Array_0.apply(null,arguments)},tb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt8Array_GetValue_1.apply(null, -arguments)},ub=a._emscripten_bind_DracoUInt8Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt8Array_size_0.apply(null,arguments)},vb=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt8Array___destroy___0.apply(null,arguments)},Ra=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return a.asm.emscripten_bind_DracoUInt32Array_DracoUInt32Array_0.apply(null,arguments)},wb=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt32Array_GetValue_1.apply(null, -arguments)},xb=a._emscripten_bind_DracoUInt32Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt32Array_size_0.apply(null,arguments)},yb=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt32Array___destroy___0.apply(null,arguments)},Sa=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0.apply(null,arguments)},zb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1= -function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1.apply(null,arguments)},Ab=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_quantization_bits_0.apply(null,arguments)},Bb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform___destroy___0.apply(null,arguments)},Ta=a._emscripten_bind_PointAttribute_PointAttribute_0= -function(){return a.asm.emscripten_bind_PointAttribute_PointAttribute_0.apply(null,arguments)},Cb=a._emscripten_bind_PointAttribute_size_0=function(){return a.asm.emscripten_bind_PointAttribute_size_0.apply(null,arguments)},Db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return a.asm.emscripten_bind_PointAttribute_GetAttributeTransformData_0.apply(null,arguments)},Eb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return a.asm.emscripten_bind_PointAttribute_attribute_type_0.apply(null, -arguments)},Fb=a._emscripten_bind_PointAttribute_data_type_0=function(){return a.asm.emscripten_bind_PointAttribute_data_type_0.apply(null,arguments)},Gb=a._emscripten_bind_PointAttribute_num_components_0=function(){return a.asm.emscripten_bind_PointAttribute_num_components_0.apply(null,arguments)},Hb=a._emscripten_bind_PointAttribute_normalized_0=function(){return a.asm.emscripten_bind_PointAttribute_normalized_0.apply(null,arguments)},Ib=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return a.asm.emscripten_bind_PointAttribute_byte_stride_0.apply(null, -arguments)},Jb=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return a.asm.emscripten_bind_PointAttribute_byte_offset_0.apply(null,arguments)},Kb=a._emscripten_bind_PointAttribute_unique_id_0=function(){return a.asm.emscripten_bind_PointAttribute_unique_id_0.apply(null,arguments)},Lb=a._emscripten_bind_PointAttribute___destroy___0=function(){return a.asm.emscripten_bind_PointAttribute___destroy___0.apply(null,arguments)},Ua=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0= -function(){return a.asm.emscripten_bind_AttributeTransformData_AttributeTransformData_0.apply(null,arguments)},Mb=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return a.asm.emscripten_bind_AttributeTransformData_transform_type_0.apply(null,arguments)},Nb=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return a.asm.emscripten_bind_AttributeTransformData___destroy___0.apply(null,arguments)},Va=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0= -function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0.apply(null,arguments)},Ob=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1.apply(null,arguments)},Pb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_quantization_bits_0.apply(null,arguments)}, -Qb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_min_value_1.apply(null,arguments)},Rb=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_range_0.apply(null,arguments)},Sb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform___destroy___0.apply(null,arguments)}, -Wa=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return a.asm.emscripten_bind_DracoInt8Array_DracoInt8Array_0.apply(null,arguments)},Tb=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoInt8Array_GetValue_1.apply(null,arguments)},Ub=a._emscripten_bind_DracoInt8Array_size_0=function(){return a.asm.emscripten_bind_DracoInt8Array_size_0.apply(null,arguments)},Vb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt8Array___destroy___0.apply(null, -arguments)},Xa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return a.asm.emscripten_bind_MetadataQuerier_MetadataQuerier_0.apply(null,arguments)},Wb=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_HasEntry_2.apply(null,arguments)},Xb=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetIntEntry_2.apply(null,arguments)},Yb=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3= -function(){return a.asm.emscripten_bind_MetadataQuerier_GetIntEntryArray_3.apply(null,arguments)},Zb=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetDoubleEntry_2.apply(null,arguments)},$b=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetStringEntry_2.apply(null,arguments)},ac=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return a.asm.emscripten_bind_MetadataQuerier_NumEntries_1.apply(null, -arguments)},bc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetEntryName_2.apply(null,arguments)},cc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return a.asm.emscripten_bind_MetadataQuerier___destroy___0.apply(null,arguments)},Ya=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return a.asm.emscripten_bind_DracoInt16Array_DracoInt16Array_0.apply(null,arguments)},dc=a._emscripten_bind_DracoInt16Array_GetValue_1= -function(){return a.asm.emscripten_bind_DracoInt16Array_GetValue_1.apply(null,arguments)},ec=a._emscripten_bind_DracoInt16Array_size_0=function(){return a.asm.emscripten_bind_DracoInt16Array_size_0.apply(null,arguments)},fc=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt16Array___destroy___0.apply(null,arguments)},Za=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return a.asm.emscripten_bind_DracoFloat32Array_DracoFloat32Array_0.apply(null, -arguments)},gc=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoFloat32Array_GetValue_1.apply(null,arguments)},hc=a._emscripten_bind_DracoFloat32Array_size_0=function(){return a.asm.emscripten_bind_DracoFloat32Array_size_0.apply(null,arguments)},ic=a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoFloat32Array___destroy___0.apply(null,arguments)},$a=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return a.asm.emscripten_bind_GeometryAttribute_GeometryAttribute_0.apply(null, -arguments)},jc=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return a.asm.emscripten_bind_GeometryAttribute___destroy___0.apply(null,arguments)},ab=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return a.asm.emscripten_bind_DecoderBuffer_DecoderBuffer_0.apply(null,arguments)},kc=a._emscripten_bind_DecoderBuffer_Init_2=function(){return a.asm.emscripten_bind_DecoderBuffer_Init_2.apply(null,arguments)},lc=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return a.asm.emscripten_bind_DecoderBuffer___destroy___0.apply(null, -arguments)},bb=a._emscripten_bind_Decoder_Decoder_0=function(){return a.asm.emscripten_bind_Decoder_Decoder_0.apply(null,arguments)},mc=a._emscripten_bind_Decoder_GetEncodedGeometryType_1=function(){return a.asm.emscripten_bind_Decoder_GetEncodedGeometryType_1.apply(null,arguments)},nc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return a.asm.emscripten_bind_Decoder_DecodeBufferToPointCloud_2.apply(null,arguments)},oc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return a.asm.emscripten_bind_Decoder_DecodeBufferToMesh_2.apply(null, -arguments)},pc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeId_2.apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIdByName_2.apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3.apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetAttribute_2= -function(){return a.asm.emscripten_bind_Decoder_GetAttribute_2.apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeByUniqueId_2.apply(null,arguments)},uc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return a.asm.emscripten_bind_Decoder_GetMetadata_1.apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeMetadata_2.apply(null, -arguments)},wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return a.asm.emscripten_bind_Decoder_GetFaceFromMesh_3.apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return a.asm.emscripten_bind_Decoder_GetTriangleStripsFromMesh_2.apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return a.asm.emscripten_bind_Decoder_GetTrianglesUInt16Array_3.apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3= -function(){return a.asm.emscripten_bind_Decoder_GetTrianglesUInt32Array_3.apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeFloat_3.apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3.apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIntForAllPoints_3.apply(null, -arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3.apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3.apply(null,arguments)},Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3.apply(null,arguments)}, -Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3.apply(null,arguments)},Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3.apply(null,arguments)},Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3.apply(null,arguments)},Jc= -a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return a.asm.emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5.apply(null,arguments)},Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return a.asm.emscripten_bind_Decoder_SkipAttributeTransform_1.apply(null,arguments)},Lc=a._emscripten_bind_Decoder___destroy___0=function(){return a.asm.emscripten_bind_Decoder___destroy___0.apply(null,arguments)},cb=a._emscripten_bind_Mesh_Mesh_0=function(){return a.asm.emscripten_bind_Mesh_Mesh_0.apply(null, -arguments)},Mc=a._emscripten_bind_Mesh_num_faces_0=function(){return a.asm.emscripten_bind_Mesh_num_faces_0.apply(null,arguments)},Nc=a._emscripten_bind_Mesh_num_attributes_0=function(){return a.asm.emscripten_bind_Mesh_num_attributes_0.apply(null,arguments)},Oc=a._emscripten_bind_Mesh_num_points_0=function(){return a.asm.emscripten_bind_Mesh_num_points_0.apply(null,arguments)},Pc=a._emscripten_bind_Mesh___destroy___0=function(){return a.asm.emscripten_bind_Mesh___destroy___0.apply(null,arguments)}, -Qc=a._emscripten_bind_VoidPtr___destroy___0=function(){return a.asm.emscripten_bind_VoidPtr___destroy___0.apply(null,arguments)},db=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return a.asm.emscripten_bind_DracoInt32Array_DracoInt32Array_0.apply(null,arguments)},Rc=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoInt32Array_GetValue_1.apply(null,arguments)},Sc=a._emscripten_bind_DracoInt32Array_size_0=function(){return a.asm.emscripten_bind_DracoInt32Array_size_0.apply(null, -arguments)},Tc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt32Array___destroy___0.apply(null,arguments)},eb=a._emscripten_bind_Metadata_Metadata_0=function(){return a.asm.emscripten_bind_Metadata_Metadata_0.apply(null,arguments)},Uc=a._emscripten_bind_Metadata___destroy___0=function(){return a.asm.emscripten_bind_Metadata___destroy___0.apply(null,arguments)},Vc=a._emscripten_enum_draco_StatusCode_OK=function(){return a.asm.emscripten_enum_draco_StatusCode_OK.apply(null, -arguments)},Wc=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return a.asm.emscripten_enum_draco_StatusCode_DRACO_ERROR.apply(null,arguments)},Xc=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return a.asm.emscripten_enum_draco_StatusCode_IO_ERROR.apply(null,arguments)},Yc=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return a.asm.emscripten_enum_draco_StatusCode_INVALID_PARAMETER.apply(null,arguments)},Zc=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION= -function(){return a.asm.emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION.apply(null,arguments)},$c=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return a.asm.emscripten_enum_draco_StatusCode_UNKNOWN_VERSION.apply(null,arguments)},ad=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return a.asm.emscripten_enum_draco_DataType_DT_INVALID.apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INT8=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT8.apply(null, -arguments)},cd=a._emscripten_enum_draco_DataType_DT_UINT8=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT8.apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_INT16=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT16.apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT16.apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT32.apply(null, -arguments)},gd=a._emscripten_enum_draco_DataType_DT_UINT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT32.apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_INT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT64.apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT64.apply(null,arguments)},jd=a._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_FLOAT32.apply(null, -arguments)},kd=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_FLOAT64.apply(null,arguments)},ld=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return a.asm.emscripten_enum_draco_DataType_DT_BOOL.apply(null,arguments)},md=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return a.asm.emscripten_enum_draco_DataType_DT_TYPES_COUNT.apply(null,arguments)},nd=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE.apply(null, -arguments)},od=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD.apply(null,arguments)},pd=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH.apply(null,arguments)},qd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM.apply(null, -arguments)},rd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM.apply(null,arguments)},sd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM.apply(null,arguments)},td=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM.apply(null, -arguments)},ud=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_INVALID.apply(null,arguments)},vd=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_POSITION.apply(null,arguments)},wd=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_NORMAL.apply(null,arguments)},xd=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR= -function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_COLOR.apply(null,arguments)},yd=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD.apply(null,arguments)},zd=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_GENERIC.apply(null,arguments)};a._setThrew=function(){return a.asm.setThrew.apply(null,arguments)};var ta=a.__ZSt18uncaught_exceptionv= -function(){return a.asm._ZSt18uncaught_exceptionv.apply(null,arguments)};a._free=function(){return a.asm.free.apply(null,arguments)};var ib=a._malloc=function(){return a.asm.malloc.apply(null,arguments)};a.stackSave=function(){return a.asm.stackSave.apply(null,arguments)};a.stackAlloc=function(){return a.asm.stackAlloc.apply(null,arguments)};a.stackRestore=function(){return a.asm.stackRestore.apply(null,arguments)};a.__growWasmMemory=function(){return a.asm.__growWasmMemory.apply(null,arguments)}; -a.dynCall_ii=function(){return a.asm.dynCall_ii.apply(null,arguments)};a.dynCall_vi=function(){return a.asm.dynCall_vi.apply(null,arguments)};a.dynCall_iii=function(){return a.asm.dynCall_iii.apply(null,arguments)};a.dynCall_vii=function(){return a.asm.dynCall_vii.apply(null,arguments)};a.dynCall_iiii=function(){return a.asm.dynCall_iiii.apply(null,arguments)};a.dynCall_v=function(){return a.asm.dynCall_v.apply(null,arguments)};a.dynCall_viii=function(){return a.asm.dynCall_viii.apply(null,arguments)}; -a.dynCall_viiii=function(){return a.asm.dynCall_viiii.apply(null,arguments)};a.dynCall_iiiiiii=function(){return a.asm.dynCall_iiiiiii.apply(null,arguments)};a.dynCall_iidiiii=function(){return a.asm.dynCall_iidiiii.apply(null,arguments)};a.dynCall_jiji=function(){return a.asm.dynCall_jiji.apply(null,arguments)};a.dynCall_viiiiii=function(){return a.asm.dynCall_viiiiii.apply(null,arguments)};a.dynCall_viiiii=function(){return a.asm.dynCall_viiiii.apply(null,arguments)};a.asm=La;var fa;a.then=function(e){if(fa)e(a); -else{var c=a.onRuntimeInitialized;a.onRuntimeInitialized=function(){c&&c();e(a)}}return a};ja=function c(){fa||ma();fa||(ja=c)};a.run=ma;if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=n.size?(t(0>=1;break;case 4:d>>=2;break;case 8:d>>=3}for(var c=0;c>>0,$jscomp.propertyToPolyfillSymbol[h]=$jscomp.IS_SYMBOL_NATIVE? +$jscomp.global.Symbol(h):$jscomp.POLYFILL_PREFIX+l+"$"+h),$jscomp.defineProperty(p,$jscomp.propertyToPolyfillSymbol[h],{configurable:!0,writable:!0,value:n})))}; +$jscomp.polyfill("Promise",function(k){function n(){this.batch_=null}function l(f){return f instanceof h?f:new h(function(q,v){q(f)})}if(k&&(!($jscomp.FORCE_POLYFILL_PROMISE||$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&"undefined"===typeof $jscomp.global.PromiseRejectionEvent)||!$jscomp.global.Promise||-1===$jscomp.global.Promise.toString().indexOf("[native code]")))return k;n.prototype.asyncExecute=function(f){if(null==this.batch_){this.batch_=[];var q=this;this.asyncExecuteFunction(function(){q.executeBatch_()})}this.batch_.push(f)}; +var p=$jscomp.global.setTimeout;n.prototype.asyncExecuteFunction=function(f){p(f,0)};n.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var f=this.batch_;this.batch_=[];for(var q=0;q=A}},"es6","es3"); +$jscomp.polyfill("Array.prototype.copyWithin",function(k){function n(l){l=Number(l);return Infinity===l||-Infinity===l?l:l|0}return k?k:function(l,p,h){var A=this.length;l=n(l);p=n(p);h=void 0===h?A:n(h);l=0>l?Math.max(A+l,0):Math.min(l,A);p=0>p?Math.max(A+p,0):Math.min(p,A);h=0>h?Math.max(A+h,0):Math.min(h,A);if(lp;)--h in this?this[--l]=this[h]:delete this[--l];return this}},"es6","es3"); +$jscomp.typedArrayCopyWithin=function(k){return k?k:Array.prototype.copyWithin};$jscomp.polyfill("Int8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8ClampedArray.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); +$jscomp.polyfill("Uint16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float64Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); +var DracoDecoderModule=function(){var k="undefined"!==typeof document&&document.currentScript?document.currentScript.src:void 0;"undefined"!==typeof __filename&&(k=k||__filename);return function(n){function l(e){return a.locateFile?a.locateFile(e,U):U+e}function p(e,b,c){var d=b+c;for(c=b;e[c]&&!(c>=d);)++c;if(16g?d+=String.fromCharCode(g):(g-=65536,d+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else d+=String.fromCharCode(g)}return d}function h(e,b){return e?p(ea,e,b):""}function A(){var e=ja.buffer;a.HEAP8=Y=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAP32=ca=new Int32Array(e);a.HEAPU8=ea=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAPU32=V=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}function f(e){if(a.onAbort)a.onAbort(e); +e="Aborted("+e+")";da(e);wa=!0;e=new WebAssembly.RuntimeError(e+". Build with -sASSERTIONS for more info.");ka(e);throw e;}function q(e){try{if(e==P&&fa)return new Uint8Array(fa);if(ma)return ma(e);throw"both async and sync fetching of the wasm failed";}catch(b){f(b)}}function v(){if(!fa&&(xa||ha)){if("function"==typeof fetch&&!P.startsWith("file://"))return fetch(P,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+P+"'";return e.arrayBuffer()}).catch(function(){return q(P)}); +if(na)return new Promise(function(e,b){na(P,function(c){e(new Uint8Array(c))},b)})}return Promise.resolve().then(function(){return q(P)})}function z(e){for(;0>2]=b};this.get_type=function(){return V[this.ptr+4>>2]};this.set_destructor=function(b){V[this.ptr+8>>2]=b};this.get_destructor=function(){return V[this.ptr+8>>2]};this.set_refcount=function(b){ca[this.ptr>>2]=b};this.set_caught=function(b){Y[this.ptr+ +12>>0]=b?1:0};this.get_caught=function(){return 0!=Y[this.ptr+12>>0]};this.set_rethrown=function(b){Y[this.ptr+13>>0]=b?1:0};this.get_rethrown=function(){return 0!=Y[this.ptr+13>>0]};this.init=function(b,c){this.set_adjusted_ptr(0);this.set_type(b);this.set_destructor(c);this.set_refcount(0);this.set_caught(!1);this.set_rethrown(!1)};this.add_ref=function(){ca[this.ptr>>2]+=1};this.release_ref=function(){var b=ca[this.ptr>>2];ca[this.ptr>>2]=b-1;return 1===b};this.set_adjusted_ptr=function(b){V[this.ptr+ +16>>2]=b};this.get_adjusted_ptr=function(){return V[this.ptr+16>>2]};this.get_exception_ptr=function(){if(ya(this.get_type()))return V[this.excPtr>>2];var b=this.get_adjusted_ptr();return 0!==b?b:this.excPtr}}function ba(){function e(){if(!la&&(la=!0,a.calledRun=!0,!wa)){za=!0;z(oa);Aa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)Ba.unshift(a.postRun.shift());z(Ba)}}if(!(0=d?b++:2047>=d?b+=2:55296<=d&&57343>= +d?(b+=4,++c):b+=3}b=Array(b+1);c=0;d=b.length;if(0=u){var X=e.charCodeAt(++g);u=65536+((u&1023)<<10)|X&1023}if(127>=u){if(c>=d)break;b[c++]=u}else{if(2047>=u){if(c+1>=d)break;b[c++]=192|u>>6}else{if(65535>=u){if(c+2>=d)break;b[c++]=224|u>>12}else{if(c+3>=d)break;b[c++]=240|u>>18;b[c++]=128|u>>12&63}b[c++]=128|u>>6&63}b[c++]=128|u&63}}b[c]=0}e=r.alloc(b,Y);r.copy(b,Y,e);return e}return e}function pa(e){if("object"===typeof e){var b= +r.alloc(e,Y);r.copy(e,Y,b);return b}return e}function Z(){throw"cannot construct a VoidPtr, no constructor in IDL";}function S(){this.ptr=Da();x(S)[this.ptr]=this}function Q(){this.ptr=Ea();x(Q)[this.ptr]=this}function W(){this.ptr=Fa();x(W)[this.ptr]=this}function w(){this.ptr=Ga();x(w)[this.ptr]=this}function C(){this.ptr=Ha();x(C)[this.ptr]=this}function F(){this.ptr=Ia();x(F)[this.ptr]=this}function G(){this.ptr=Ja();x(G)[this.ptr]=this}function E(){this.ptr=Ka();x(E)[this.ptr]=this}function T(){this.ptr= +La();x(T)[this.ptr]=this}function B(){throw"cannot construct a Status, no constructor in IDL";}function H(){this.ptr=Ma();x(H)[this.ptr]=this}function I(){this.ptr=Na();x(I)[this.ptr]=this}function J(){this.ptr=Oa();x(J)[this.ptr]=this}function K(){this.ptr=Pa();x(K)[this.ptr]=this}function L(){this.ptr=Qa();x(L)[this.ptr]=this}function M(){this.ptr=Ra();x(M)[this.ptr]=this}function N(){this.ptr=Sa();x(N)[this.ptr]=this}function y(){this.ptr=Ta();x(y)[this.ptr]=this}function m(){this.ptr=Ua();x(m)[this.ptr]= +this}n=void 0===n?{}:n;var a="undefined"!=typeof n?n:{},Aa,ka;a.ready=new Promise(function(e,b){Aa=e;ka=b});var Va=!1,Wa=!1;a.onRuntimeInitialized=function(){Va=!0;if(Wa&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Wa=!0;if(Va&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(e){if("string"!==typeof e)return!1;e=e.split(".");return 2>e.length||3=e[1]?!0:0!=e[0]||10>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,e+100663296);var g=Math;d=Math.max(e,d);g=g.min.call(g,2147483648,d+(65536-d%65536)%65536);a:{d=ja.buffer;try{ja.grow(g-d.byteLength+65535>>>16);A();var u=1;break a}catch(X){}u=void 0}if(u)return!0}return!1},f:function(e){return 52},d:function(e,b,c,d,g){return 70},c:function(e,b,c,d){for(var g=0,u=0;u>2],ab=V[b+4>>2];b+=8;for(var sa=0;sa>2]=g;return 0}};(function(){function e(g,u){a.asm=g.exports;ja=a.asm.h;A();oa.unshift(a.asm.i);aa--;a.monitorRunDependencies&&a.monitorRunDependencies(aa);0==aa&&(null!==ra&&(clearInterval(ra),ra=null),ia&&(g=ia,ia=null,g()))}function b(g){e(g.instance)}function c(g){return v().then(function(u){return WebAssembly.instantiate(u,d)}).then(function(u){return u}).then(g,function(u){da("failed to asynchronously prepare wasm: "+u);f(u)})}var d={a:xd};aa++;a.monitorRunDependencies&&a.monitorRunDependencies(aa); +if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(g){da("Module.instantiateWasm callback failed with error: "+g),ka(g)}(function(){return fa||"function"!=typeof WebAssembly.instantiateStreaming||P.startsWith("data:application/octet-stream;base64,")||P.startsWith("file://")||Ya||"function"!=typeof fetch?c(b):fetch(P,{credentials:"same-origin"}).then(function(g){return WebAssembly.instantiateStreaming(g,d).then(b,function(u){da("wasm streaming compile failed: "+u);da("falling back to ArrayBuffer instantiation"); +return c(b)})})})().catch(ka);return{}})();var bb=a._emscripten_bind_VoidPtr___destroy___0=function(){return(bb=a._emscripten_bind_VoidPtr___destroy___0=a.asm.k).apply(null,arguments)},Da=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return(Da=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=a.asm.l).apply(null,arguments)},cb=a._emscripten_bind_DecoderBuffer_Init_2=function(){return(cb=a._emscripten_bind_DecoderBuffer_Init_2=a.asm.m).apply(null,arguments)},db=a._emscripten_bind_DecoderBuffer___destroy___0= +function(){return(db=a._emscripten_bind_DecoderBuffer___destroy___0=a.asm.n).apply(null,arguments)},Ea=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(Ea=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=a.asm.o).apply(null,arguments)},eb=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return(eb=a._emscripten_bind_AttributeTransformData_transform_type_0=a.asm.p).apply(null,arguments)},fb=a._emscripten_bind_AttributeTransformData___destroy___0= +function(){return(fb=a._emscripten_bind_AttributeTransformData___destroy___0=a.asm.q).apply(null,arguments)},Fa=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(Fa=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=a.asm.r).apply(null,arguments)},gb=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return(gb=a._emscripten_bind_GeometryAttribute___destroy___0=a.asm.s).apply(null,arguments)},Ga=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(Ga= +a._emscripten_bind_PointAttribute_PointAttribute_0=a.asm.t).apply(null,arguments)},hb=a._emscripten_bind_PointAttribute_size_0=function(){return(hb=a._emscripten_bind_PointAttribute_size_0=a.asm.u).apply(null,arguments)},ib=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return(ib=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=a.asm.v).apply(null,arguments)},jb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return(jb=a._emscripten_bind_PointAttribute_attribute_type_0= +a.asm.w).apply(null,arguments)},kb=a._emscripten_bind_PointAttribute_data_type_0=function(){return(kb=a._emscripten_bind_PointAttribute_data_type_0=a.asm.x).apply(null,arguments)},lb=a._emscripten_bind_PointAttribute_num_components_0=function(){return(lb=a._emscripten_bind_PointAttribute_num_components_0=a.asm.y).apply(null,arguments)},mb=a._emscripten_bind_PointAttribute_normalized_0=function(){return(mb=a._emscripten_bind_PointAttribute_normalized_0=a.asm.z).apply(null,arguments)},nb=a._emscripten_bind_PointAttribute_byte_stride_0= +function(){return(nb=a._emscripten_bind_PointAttribute_byte_stride_0=a.asm.A).apply(null,arguments)},ob=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return(ob=a._emscripten_bind_PointAttribute_byte_offset_0=a.asm.B).apply(null,arguments)},pb=a._emscripten_bind_PointAttribute_unique_id_0=function(){return(pb=a._emscripten_bind_PointAttribute_unique_id_0=a.asm.C).apply(null,arguments)},qb=a._emscripten_bind_PointAttribute___destroy___0=function(){return(qb=a._emscripten_bind_PointAttribute___destroy___0= +a.asm.D).apply(null,arguments)},Ha=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Ha=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=a.asm.E).apply(null,arguments)},rb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return(rb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=a.asm.F).apply(null,arguments)},sb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0= +function(){return(sb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=a.asm.G).apply(null,arguments)},tb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(tb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=a.asm.H).apply(null,arguments)},ub=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(ub=a._emscripten_bind_AttributeQuantizationTransform_range_0=a.asm.I).apply(null,arguments)},vb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0= +function(){return(vb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=a.asm.J).apply(null,arguments)},Ia=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Ia=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=a.asm.K).apply(null,arguments)},wb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(wb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=a.asm.L).apply(null, +arguments)},xb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(xb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=a.asm.M).apply(null,arguments)},yb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(yb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=a.asm.N).apply(null,arguments)},Ja=a._emscripten_bind_PointCloud_PointCloud_0=function(){return(Ja=a._emscripten_bind_PointCloud_PointCloud_0=a.asm.O).apply(null, +arguments)},zb=a._emscripten_bind_PointCloud_num_attributes_0=function(){return(zb=a._emscripten_bind_PointCloud_num_attributes_0=a.asm.P).apply(null,arguments)},Ab=a._emscripten_bind_PointCloud_num_points_0=function(){return(Ab=a._emscripten_bind_PointCloud_num_points_0=a.asm.Q).apply(null,arguments)},Bb=a._emscripten_bind_PointCloud___destroy___0=function(){return(Bb=a._emscripten_bind_PointCloud___destroy___0=a.asm.R).apply(null,arguments)},Ka=a._emscripten_bind_Mesh_Mesh_0=function(){return(Ka= +a._emscripten_bind_Mesh_Mesh_0=a.asm.S).apply(null,arguments)},Cb=a._emscripten_bind_Mesh_num_faces_0=function(){return(Cb=a._emscripten_bind_Mesh_num_faces_0=a.asm.T).apply(null,arguments)},Db=a._emscripten_bind_Mesh_num_attributes_0=function(){return(Db=a._emscripten_bind_Mesh_num_attributes_0=a.asm.U).apply(null,arguments)},Eb=a._emscripten_bind_Mesh_num_points_0=function(){return(Eb=a._emscripten_bind_Mesh_num_points_0=a.asm.V).apply(null,arguments)},Fb=a._emscripten_bind_Mesh___destroy___0=function(){return(Fb= +a._emscripten_bind_Mesh___destroy___0=a.asm.W).apply(null,arguments)},La=a._emscripten_bind_Metadata_Metadata_0=function(){return(La=a._emscripten_bind_Metadata_Metadata_0=a.asm.X).apply(null,arguments)},Gb=a._emscripten_bind_Metadata___destroy___0=function(){return(Gb=a._emscripten_bind_Metadata___destroy___0=a.asm.Y).apply(null,arguments)},Hb=a._emscripten_bind_Status_code_0=function(){return(Hb=a._emscripten_bind_Status_code_0=a.asm.Z).apply(null,arguments)},Ib=a._emscripten_bind_Status_ok_0=function(){return(Ib= +a._emscripten_bind_Status_ok_0=a.asm._).apply(null,arguments)},Jb=a._emscripten_bind_Status_error_msg_0=function(){return(Jb=a._emscripten_bind_Status_error_msg_0=a.asm.$).apply(null,arguments)},Kb=a._emscripten_bind_Status___destroy___0=function(){return(Kb=a._emscripten_bind_Status___destroy___0=a.asm.aa).apply(null,arguments)},Ma=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ma=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=a.asm.ba).apply(null,arguments)}, +Lb=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return(Lb=a._emscripten_bind_DracoFloat32Array_GetValue_1=a.asm.ca).apply(null,arguments)},Mb=a._emscripten_bind_DracoFloat32Array_size_0=function(){return(Mb=a._emscripten_bind_DracoFloat32Array_size_0=a.asm.da).apply(null,arguments)},Nb=a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(Nb=a._emscripten_bind_DracoFloat32Array___destroy___0=a.asm.ea).apply(null,arguments)},Na=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0= +function(){return(Na=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=a.asm.fa).apply(null,arguments)},Ob=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(Ob=a._emscripten_bind_DracoInt8Array_GetValue_1=a.asm.ga).apply(null,arguments)},Pb=a._emscripten_bind_DracoInt8Array_size_0=function(){return(Pb=a._emscripten_bind_DracoInt8Array_size_0=a.asm.ha).apply(null,arguments)},Qb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return(Qb=a._emscripten_bind_DracoInt8Array___destroy___0= +a.asm.ia).apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(Oa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=a.asm.ja).apply(null,arguments)},Rb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(Rb=a._emscripten_bind_DracoUInt8Array_GetValue_1=a.asm.ka).apply(null,arguments)},Sb=a._emscripten_bind_DracoUInt8Array_size_0=function(){return(Sb=a._emscripten_bind_DracoUInt8Array_size_0=a.asm.la).apply(null,arguments)},Tb=a._emscripten_bind_DracoUInt8Array___destroy___0= +function(){return(Tb=a._emscripten_bind_DracoUInt8Array___destroy___0=a.asm.ma).apply(null,arguments)},Pa=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(Pa=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=a.asm.na).apply(null,arguments)},Ub=a._emscripten_bind_DracoInt16Array_GetValue_1=function(){return(Ub=a._emscripten_bind_DracoInt16Array_GetValue_1=a.asm.oa).apply(null,arguments)},Vb=a._emscripten_bind_DracoInt16Array_size_0=function(){return(Vb=a._emscripten_bind_DracoInt16Array_size_0= +a.asm.pa).apply(null,arguments)},Wb=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return(Wb=a._emscripten_bind_DracoInt16Array___destroy___0=a.asm.qa).apply(null,arguments)},Qa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(Qa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=a.asm.ra).apply(null,arguments)},Xb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(Xb=a._emscripten_bind_DracoUInt16Array_GetValue_1=a.asm.sa).apply(null,arguments)}, +Yb=a._emscripten_bind_DracoUInt16Array_size_0=function(){return(Yb=a._emscripten_bind_DracoUInt16Array_size_0=a.asm.ta).apply(null,arguments)},Zb=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(Zb=a._emscripten_bind_DracoUInt16Array___destroy___0=a.asm.ua).apply(null,arguments)},Ra=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return(Ra=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=a.asm.va).apply(null,arguments)},$b=a._emscripten_bind_DracoInt32Array_GetValue_1= +function(){return($b=a._emscripten_bind_DracoInt32Array_GetValue_1=a.asm.wa).apply(null,arguments)},ac=a._emscripten_bind_DracoInt32Array_size_0=function(){return(ac=a._emscripten_bind_DracoInt32Array_size_0=a.asm.xa).apply(null,arguments)},bc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return(bc=a._emscripten_bind_DracoInt32Array___destroy___0=a.asm.ya).apply(null,arguments)},Sa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(Sa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0= +a.asm.za).apply(null,arguments)},cc=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(cc=a._emscripten_bind_DracoUInt32Array_GetValue_1=a.asm.Aa).apply(null,arguments)},dc=a._emscripten_bind_DracoUInt32Array_size_0=function(){return(dc=a._emscripten_bind_DracoUInt32Array_size_0=a.asm.Ba).apply(null,arguments)},ec=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return(ec=a._emscripten_bind_DracoUInt32Array___destroy___0=a.asm.Ca).apply(null,arguments)},Ta=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0= +function(){return(Ta=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=a.asm.Da).apply(null,arguments)},fc=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(fc=a._emscripten_bind_MetadataQuerier_HasEntry_2=a.asm.Ea).apply(null,arguments)},gc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(gc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=a.asm.Fa).apply(null,arguments)},hc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(hc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3= +a.asm.Ga).apply(null,arguments)},ic=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(ic=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=a.asm.Ha).apply(null,arguments)},jc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(jc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=a.asm.Ia).apply(null,arguments)},kc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(kc=a._emscripten_bind_MetadataQuerier_NumEntries_1=a.asm.Ja).apply(null,arguments)}, +lc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(lc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=a.asm.Ka).apply(null,arguments)},mc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return(mc=a._emscripten_bind_MetadataQuerier___destroy___0=a.asm.La).apply(null,arguments)},Ua=a._emscripten_bind_Decoder_Decoder_0=function(){return(Ua=a._emscripten_bind_Decoder_Decoder_0=a.asm.Ma).apply(null,arguments)},nc=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(nc= +a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=a.asm.Na).apply(null,arguments)},oc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(oc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=a.asm.Oa).apply(null,arguments)},pc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return(pc=a._emscripten_bind_Decoder_GetAttributeId_2=a.asm.Pa).apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2= +a.asm.Qa).apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=a.asm.Ra).apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return(sc=a._emscripten_bind_Decoder_GetAttribute_2=a.asm.Sa).apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=a.asm.Ta).apply(null,arguments)}, +uc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return(uc=a._emscripten_bind_Decoder_GetMetadata_1=a.asm.Ua).apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=a.asm.Va).apply(null,arguments)},wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return(wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=a.asm.Wa).apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2= +function(){return(xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=a.asm.Xa).apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=a.asm.Ya).apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=a.asm.Za).apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(Ac= +a._emscripten_bind_Decoder_GetAttributeFloat_3=a.asm._a).apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=a.asm.$a).apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=a.asm.ab).apply(null,arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(Dc= +a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=a.asm.bb).apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return(Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=a.asm.cb).apply(null,arguments)},Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=a.asm.db).apply(null,arguments)},Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3= +function(){return(Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=a.asm.eb).apply(null,arguments)},Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=a.asm.fb).apply(null,arguments)},Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=a.asm.gb).apply(null,arguments)},Jc=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5= +function(){return(Jc=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=a.asm.hb).apply(null,arguments)},Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=a.asm.ib).apply(null,arguments)},Lc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(Lc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=a.asm.jb).apply(null,arguments)},Mc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2= +function(){return(Mc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=a.asm.kb).apply(null,arguments)},Nc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(Nc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=a.asm.lb).apply(null,arguments)},Oc=a._emscripten_bind_Decoder___destroy___0=function(){return(Oc=a._emscripten_bind_Decoder___destroy___0=a.asm.mb).apply(null,arguments)},Pc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return(Pc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM= +a.asm.nb).apply(null,arguments)},Qc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(Qc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=a.asm.ob).apply(null,arguments)},Rc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(Rc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=a.asm.pb).apply(null,arguments)},Sc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM= +function(){return(Sc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=a.asm.qb).apply(null,arguments)},Tc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(Tc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=a.asm.rb).apply(null,arguments)},Uc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(Uc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=a.asm.sb).apply(null,arguments)},Vc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL= +function(){return(Vc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=a.asm.tb).apply(null,arguments)},Wc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(Wc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=a.asm.ub).apply(null,arguments)},Xc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(Xc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=a.asm.vb).apply(null,arguments)},Yc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC= +function(){return(Yc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=a.asm.wb).apply(null,arguments)},Zc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(Zc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=a.asm.xb).apply(null,arguments)},$c=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return($c=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=a.asm.yb).apply(null,arguments)},ad=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH= +function(){return(ad=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=a.asm.zb).apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return(bd=a._emscripten_enum_draco_DataType_DT_INVALID=a.asm.Ab).apply(null,arguments)},cd=a._emscripten_enum_draco_DataType_DT_INT8=function(){return(cd=a._emscripten_enum_draco_DataType_DT_INT8=a.asm.Bb).apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_UINT8=function(){return(dd=a._emscripten_enum_draco_DataType_DT_UINT8= +a.asm.Cb).apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_INT16=function(){return(ed=a._emscripten_enum_draco_DataType_DT_INT16=a.asm.Db).apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return(fd=a._emscripten_enum_draco_DataType_DT_UINT16=a.asm.Eb).apply(null,arguments)},gd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return(gd=a._emscripten_enum_draco_DataType_DT_INT32=a.asm.Fb).apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_UINT32= +function(){return(hd=a._emscripten_enum_draco_DataType_DT_UINT32=a.asm.Gb).apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_INT64=function(){return(id=a._emscripten_enum_draco_DataType_DT_INT64=a.asm.Hb).apply(null,arguments)},jd=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return(jd=a._emscripten_enum_draco_DataType_DT_UINT64=a.asm.Ib).apply(null,arguments)},kd=a._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return(kd=a._emscripten_enum_draco_DataType_DT_FLOAT32=a.asm.Jb).apply(null, +arguments)},ld=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(ld=a._emscripten_enum_draco_DataType_DT_FLOAT64=a.asm.Kb).apply(null,arguments)},md=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return(md=a._emscripten_enum_draco_DataType_DT_BOOL=a.asm.Lb).apply(null,arguments)},nd=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(nd=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=a.asm.Mb).apply(null,arguments)},od=a._emscripten_enum_draco_StatusCode_OK=function(){return(od= +a._emscripten_enum_draco_StatusCode_OK=a.asm.Nb).apply(null,arguments)},pd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(pd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=a.asm.Ob).apply(null,arguments)},qd=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(qd=a._emscripten_enum_draco_StatusCode_IO_ERROR=a.asm.Pb).apply(null,arguments)},rd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return(rd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER= +a.asm.Qb).apply(null,arguments)},sd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(sd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=a.asm.Rb).apply(null,arguments)},td=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(td=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=a.asm.Sb).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Tb).apply(null,arguments)};a._free=function(){return(a._free=a.asm.Ub).apply(null,arguments)}; +var ya=function(){return(ya=a.asm.Vb).apply(null,arguments)};a.___start_em_js=15856;a.___stop_em_js=15954;var la;ia=function b(){la||ba();la||(ia=b)};if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=r.size?(0>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var g=0;gb.byteLength)return a.INVALID_GEOMETRY_TYPE;switch(b[7]){case 0:return a.POINT_CLOUD;case 1:return a.TRIANGULAR_MESH;default:return a.INVALID_GEOMETRY_TYPE}};return n.ready}}(); +"object"===typeof exports&&"object"===typeof module?module.exports=DracoDecoderModule:"function"===typeof define&&define.amd?define([],function(){return DracoDecoderModule}):"object"===typeof exports&&(exports.DracoDecoderModule=DracoDecoderModule); From 1838e0b9a285ef8d4c8ab58bd68c4ff78a46ecda Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 18:06:47 +0200 Subject: [PATCH 16/32] better error reporting and also avoid crashing entire batch if one chunk fails --- frontend/javascripts/libs/DRACOLoader.ts | 3 +- .../oxalis/model/sagas/isosurface_saga.ts | 54 +++++++++++-------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/frontend/javascripts/libs/DRACOLoader.ts b/frontend/javascripts/libs/DRACOLoader.ts index c7e448898ad..2b9c19b0b6f 100644 --- a/frontend/javascripts/libs/DRACOLoader.ts +++ b/frontend/javascripts/libs/DRACOLoader.ts @@ -382,8 +382,7 @@ function DRACOWorker() { let dracoGeometry; let decodingStatus; - - const geometryType = decoder.GetEncodedGeometryType(decoderBuffer); + const geometryType = decoder.GetEncodedGeometryType(array); if (geometryType === draco.TRIANGULAR_MESH) { dracoGeometry = new draco.Mesh(); diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index c93a9f49df1..7937c8cc0fd 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -684,7 +684,7 @@ function* loadPrecomputedMeshForSegmentId( yield* call(processTaskWithPool, loadChunksTasks, PARALLEL_PRECOMPUTED_MESH_LOADING_COUNT); } catch (exception) { console.error(exception); - Toast.warning(`Some mesh objects could not be loaded for segment ${id}.`); + Toast.warning(`Some mesh chunks could not be loaded for segment ${id}.`); } console.timeEnd("load chunks"); @@ -832,29 +832,39 @@ function _getLoadChunksTasks( const loader = getDracoLoader(); let totalSizePerBatch = 0; + const errorsWithDetails = []; for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { - totalSizePerBatch += chunks[chunkIdx].byteSize; - const dracoData = dataForChunks[chunkIdx]; const chunk = chunks[chunkIdx]; - - const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); - - // Compute vertex normals to achieve smooth shading - geometry.computeVertexNormals(); - - yield* call( - { - context: segmentMeshController, - fn: segmentMeshController.addIsosurfaceFromGeometry, - }, - geometry, - id, - chunk.position, - // Apply the scale from the segment info, which includes dataset scale and mag - scale, - lod, - layerName, - ); + try { + totalSizePerBatch += chunks[chunkIdx].byteSize; + const dracoData = dataForChunks[chunkIdx]; + + const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); + + // Compute vertex normals to achieve smooth shading + geometry.computeVertexNormals(); + + yield* call( + { + context: segmentMeshController, + fn: segmentMeshController.addIsosurfaceFromGeometry, + }, + geometry, + id, + chunk.position, + // Apply the scale from the segment info, which includes dataset scale and mag + scale, + lod, + layerName, + ); + } catch (error) { + errorsWithDetails.push({ error, chunk }); + } + } + if (errorsWithDetails.length > 0) { + console.warn("There ware errors while decoding mesh chunks:", errorsWithDetails); + // Use first error as representative + throw errorsWithDetails[0].error; } console.log("totalSizePerBatch", totalSizePerBatch); }, From 327fcd96292efd464c36780d8a1dbe9c4e3899c9 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 18:07:27 +0200 Subject: [PATCH 17/32] clean up --- frontend/javascripts/libs/draco.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/javascripts/libs/draco.ts b/frontend/javascripts/libs/draco.ts index 7544ebf518b..d45ae06e849 100644 --- a/frontend/javascripts/libs/draco.ts +++ b/frontend/javascripts/libs/draco.ts @@ -5,7 +5,7 @@ let _dracoLoader: CustomDRACOLoader | null; class CustomDRACOLoader extends DRACOLoader { // Subclass to create a promise-based API and add typing - decodeDracoFileAsync = (buffer: ArrayBuffer, ...args: any[]): Promise => + decodeDracoFileAsync = (buffer: ArrayBuffer): Promise => new Promise((resolve, reject) => { if (_dracoLoader == null) { throw new Error("DracoLoader not instantiated."); From 79b82808d67266c5ae151cbbc3b06363f3d6a8a6 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 18:20:22 +0200 Subject: [PATCH 18/32] clean up --- frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 7937c8cc0fd..0c0de421ede 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -831,12 +831,10 @@ function _getLoadChunksTasks( ); const loader = getDracoLoader(); - let totalSizePerBatch = 0; const errorsWithDetails = []; for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) { const chunk = chunks[chunkIdx]; try { - totalSizePerBatch += chunks[chunkIdx].byteSize; const dracoData = dataForChunks[chunkIdx]; const geometry = yield* call(loader.decodeDracoFileAsync, dracoData); @@ -866,7 +864,6 @@ function _getLoadChunksTasks( // Use first error as representative throw errorsWithDetails[0].error; } - console.log("totalSizePerBatch", totalSizePerBatch); }, ); } else { From 512279b3378ab08ade8acb40e3696ab26f1790f4 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 18:48:41 +0200 Subject: [PATCH 19/32] wording --- frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 0c0de421ede..c851a3386a8 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -860,7 +860,7 @@ function _getLoadChunksTasks( } } if (errorsWithDetails.length > 0) { - console.warn("There ware errors while decoding mesh chunks:", errorsWithDetails); + console.warn("Errors occurred while decoding mesh chunks:", errorsWithDetails); // Use first error as representative throw errorsWithDetails[0].error; } From 8a01b9c7e43e0cc00be0fc311d0a72edeac8ccd2 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 18:51:51 +0200 Subject: [PATCH 20/32] clean up --- frontend/javascripts/admin/api/mesh_v3.ts | 4 ++-- .../javascripts/oxalis/model/sagas/isosurface_saga.ts | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/frontend/javascripts/admin/api/mesh_v3.ts b/frontend/javascripts/admin/api/mesh_v3.ts index 267cd15595f..aaeb8f643e5 100644 --- a/frontend/javascripts/admin/api/mesh_v3.ts +++ b/frontend/javascripts/admin/api/mesh_v3.ts @@ -80,7 +80,7 @@ export function getMeshfileChunkData( batchDescription: MeshChunkDataRequestV3List, ): Promise { return doWithToken(async (token) => { - const dracoDataChunksWithJumpTable = await Request.sendJSONReceiveArraybuffer( + const dracoDataChunks = await Request.sendJSONReceiveArraybuffer( `${dataStoreUrl}/data/datasets/${datasetId.owningOrganization}/${datasetId.name}/layers/${layerName}/meshes/formatVersion/3/chunks/data?token=${token}`, { data: batchDescription, @@ -100,7 +100,7 @@ export function getMeshfileChunkData( for (let chunkIdx = 0; chunkIdx < chunkCount; chunkIdx++) { // slice() creates a copy of the data, but working with TypedArray Views would cause // issues when transferring the data to a webworker. - const dracoData = dracoDataChunksWithJumpTable.slice( + const dracoData = dracoDataChunks.slice( jumpPositionsForChunks[chunkIdx], jumpPositionsForChunks[chunkIdx + 1], ); diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index c851a3386a8..681e4519df8 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -641,9 +641,6 @@ function* loadPrecomputedMeshForSegmentId( return; } - console.time(`Load mesh for ${id}`); - - console.time("get chunk descriptors"); let availableChunksMap: ChunksMap = {}; let scale: Vector3 | null = null; let loadingOrder: number[] | null = null; @@ -665,9 +662,7 @@ function* loadPrecomputedMeshForSegmentId( yield* put(removeIsosurfaceAction(layerName, id)); return; } - console.timeEnd("get chunk descriptors"); - console.time("load chunks"); const loadChunksTasks = _getLoadChunksTasks( dataset, layerName, @@ -686,9 +681,6 @@ function* loadPrecomputedMeshForSegmentId( console.error(exception); Toast.warning(`Some mesh chunks could not be loaded for segment ${id}.`); } - console.timeEnd("load chunks"); - - console.timeEnd(`Load mesh for ${id}`); yield* put(finishedLoadingIsosurfaceAction(layerName, id)); } From 54fd6e09ed045c33980455a358bbc49820cbd71d Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Tue, 2 May 2023 18:53:12 +0200 Subject: [PATCH 21/32] update changelog --- CHANGELOG.unreleased.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index 52bf56e3ce2..2a062cff32a 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -14,6 +14,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released - In addition to drag and drop, the selected tree(s) in the Skeleton tab can also be moved into another group by right-clicking the target group and selecting "Move selected tree(s) here". [#7005](https://github.com/scalableminds/webknossos/pull/7005) ### Changed +- Loading of precomputed meshes got significantly faster (especially when using a mesh file for an oversegmentation with an applied agglomerate mappings). [#7001](https://github.com/scalableminds/webknossos/pull/7001) ### Fixed - Fixed that changing a segment color could lead to a crash. [#7000](https://github.com/scalableminds/webknossos/pull/7000) From 0034db9ed4ff5284212c13a4fbf2a0c9b4e3cfdc Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 10:29:56 +0200 Subject: [PATCH 22/32] add timing code --- frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 681e4519df8..9cab2226b31 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -663,6 +663,7 @@ function* loadPrecomputedMeshForSegmentId( return; } + console.time("_getLoadChunksTasks"); const loadChunksTasks = _getLoadChunksTasks( dataset, layerName, @@ -681,6 +682,7 @@ function* loadPrecomputedMeshForSegmentId( console.error(exception); Toast.warning(`Some mesh chunks could not be loaded for segment ${id}.`); } + console.timeEnd("_getLoadChunksTasks"); yield* put(finishedLoadingIsosurfaceAction(layerName, id)); } From ca8517091a58e4ee40c78ec4e5c1f5471862b82e Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 10:30:05 +0200 Subject: [PATCH 23/32] use serialCombined --- .../webknossos/datastore/services/MeshFileService.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index aa7777a9434..fe71f03b73c 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -380,10 +380,11 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC meshChunkDataRequests: MeshChunkDataRequestV3List, ): Fox[(Array[Byte], String)] = for { - data: List[(Array[Byte], String, Int)] <- Fox.combined( + data: List[(Array[Byte], String, Int)] <- Fox.serialCombined( meshChunkDataRequests.requests.zipWithIndex .sortBy(requestAndIndex => requestAndIndex._1.byteOffset) - .map(requestAndIndex => { + .toList + )(requestAndIndex => { val meshChunkDataRequest = requestAndIndex._1 val meshFilePath = dataBaseDir .resolve(organizationName) @@ -402,8 +403,7 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC meshChunkDataRequest.byteOffset) (data, meshFormat, requestAndIndex._2) } ?~> "mesh.file.readData.failed" - }) - .toList) + }) dataSorted = data.sortBy(d => d._3) _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) // Ensure same encoding for all responses encoding = data.map(d => d._2).head From a214ab51c698d20fe1512e42143a458bfe7ef7c9 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 10:29:56 +0200 Subject: [PATCH 24/32] add timing code --- frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 681e4519df8..9cab2226b31 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -663,6 +663,7 @@ function* loadPrecomputedMeshForSegmentId( return; } + console.time("_getLoadChunksTasks"); const loadChunksTasks = _getLoadChunksTasks( dataset, layerName, @@ -681,6 +682,7 @@ function* loadPrecomputedMeshForSegmentId( console.error(exception); Toast.warning(`Some mesh chunks could not be loaded for segment ${id}.`); } + console.timeEnd("_getLoadChunksTasks"); yield* put(finishedLoadingIsosurfaceAction(layerName, id)); } From da694d875eebb57d1700bf8ed683a3dc5da108f7 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 10:36:59 +0200 Subject: [PATCH 25/32] temporarily disable most CI checks --- .circleci/not-on-master.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/not-on-master.sh b/.circleci/not-on-master.sh index 581393ebead..e3078cdb9ce 100755 --- a/.circleci/not-on-master.sh +++ b/.circleci/not-on-master.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash set -Eeuo pipefail -if [ "${CIRCLE_BRANCH}" == "master" ]; then +# if [ "${CIRCLE_BRANCH}" == "master" ]; then echo "Skipping this step on master..." -else - exec "$@" -fi +# else +# exec "$@" +# fi From 1d2383c270889d7be93d848e5277c86668a28b43 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 10:37:13 +0200 Subject: [PATCH 26/32] Revert "temporarily disable most CI checks" This reverts commit da694d875eebb57d1700bf8ed683a3dc5da108f7. --- .circleci/not-on-master.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/not-on-master.sh b/.circleci/not-on-master.sh index e3078cdb9ce..581393ebead 100755 --- a/.circleci/not-on-master.sh +++ b/.circleci/not-on-master.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash set -Eeuo pipefail -# if [ "${CIRCLE_BRANCH}" == "master" ]; then +if [ "${CIRCLE_BRANCH}" == "master" ]; then echo "Skipping this step on master..." -# else -# exec "$@" -# fi +else + exec "$@" +fi From da541744288d9c971003bdbab1e1057cb2e692ff Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 10:36:59 +0200 Subject: [PATCH 27/32] temporarily disable most CI checks --- .circleci/not-on-master.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/not-on-master.sh b/.circleci/not-on-master.sh index 581393ebead..e3078cdb9ce 100755 --- a/.circleci/not-on-master.sh +++ b/.circleci/not-on-master.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash set -Eeuo pipefail -if [ "${CIRCLE_BRANCH}" == "master" ]; then +# if [ "${CIRCLE_BRANCH}" == "master" ]; then echo "Skipping this step on master..." -else - exec "$@" -fi +# else +# exec "$@" +# fi From d2d0043762c9f72514ac2a4dd908b11674e3803b Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 11:17:55 +0200 Subject: [PATCH 28/32] format --- .../datastore/services/MeshFileService.scala | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index fe71f03b73c..be0889ad675 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -381,29 +381,25 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC ): Fox[(Array[Byte], String)] = for { data: List[(Array[Byte], String, Int)] <- Fox.serialCombined( - meshChunkDataRequests.requests.zipWithIndex - .sortBy(requestAndIndex => requestAndIndex._1.byteOffset) - .toList - )(requestAndIndex => { - val meshChunkDataRequest = requestAndIndex._1 - val meshFilePath = dataBaseDir - .resolve(organizationName) - .resolve(dataSetName) - .resolve(dataLayerName) - .resolve(meshesDir) - .resolve(s"${meshChunkDataRequests.meshFile}.$meshFileExtension") - - executeWithCachedHdf5(meshFilePath, meshFileCache) { cachedMeshFile => - val meshFormat = cachedMeshFile.reader.string().getAttr("/", "mesh_format") - val data = - cachedMeshFile.reader - .uint8() - .readArrayBlockWithOffset("neuroglancer", - meshChunkDataRequest.byteSize, - meshChunkDataRequest.byteOffset) - (data, meshFormat, requestAndIndex._2) - } ?~> "mesh.file.readData.failed" - }) + meshChunkDataRequests.requests.zipWithIndex.sortBy(requestAndIndex => requestAndIndex._1.byteOffset).toList + )(requestAndIndex => { + val meshChunkDataRequest = requestAndIndex._1 + val meshFilePath = dataBaseDir + .resolve(organizationName) + .resolve(dataSetName) + .resolve(dataLayerName) + .resolve(meshesDir) + .resolve(s"${meshChunkDataRequests.meshFile}.$meshFileExtension") + + executeWithCachedHdf5(meshFilePath, meshFileCache) { cachedMeshFile => + val meshFormat = cachedMeshFile.reader.string().getAttr("/", "mesh_format") + val data = + cachedMeshFile.reader + .uint8() + .readArrayBlockWithOffset("neuroglancer", meshChunkDataRequest.byteSize, meshChunkDataRequest.byteOffset) + (data, meshFormat, requestAndIndex._2) + } ?~> "mesh.file.readData.failed" + }) dataSorted = data.sortBy(d => d._3) _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) // Ensure same encoding for all responses encoding = data.map(d => d._2).head From a21d7504298ee8d4b3093da01c6940617c304942 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 3 May 2023 11:30:03 +0200 Subject: [PATCH 29/32] Revert "temporarily disable most CI checks" This reverts commit da541744288d9c971003bdbab1e1057cb2e692ff. --- .circleci/not-on-master.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/not-on-master.sh b/.circleci/not-on-master.sh index e3078cdb9ce..581393ebead 100755 --- a/.circleci/not-on-master.sh +++ b/.circleci/not-on-master.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash set -Eeuo pipefail -# if [ "${CIRCLE_BRANCH}" == "master" ]; then +if [ "${CIRCLE_BRANCH}" == "master" ]; then echo "Skipping this step on master..." -# else -# exec "$@" -# fi +else + exec "$@" +fi From 91d78ddd3d51e43c6619cfa5dae909b54101405d Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Thu, 4 May 2023 08:24:40 +0200 Subject: [PATCH 30/32] add comment explaining where draco file came from --- public/wasm/draco_wasm_wrapper.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/wasm/draco_wasm_wrapper.js b/public/wasm/draco_wasm_wrapper.js index bb5b1224121..9a235bb6e87 100644 --- a/public/wasm/draco_wasm_wrapper.js +++ b/public/wasm/draco_wasm_wrapper.js @@ -1,3 +1,4 @@ +// copied from https://github.com/mrdoob/three.js/pull/25475 draco_wasm_wrapper.js var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(k){var n=0;return function(){return n Date: Thu, 4 May 2023 10:27:37 +0200 Subject: [PATCH 31/32] fix typo and remove timing code --- CHANGELOG.unreleased.md | 2 +- frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index 2a062cff32a..298915f98d6 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -14,7 +14,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released - In addition to drag and drop, the selected tree(s) in the Skeleton tab can also be moved into another group by right-clicking the target group and selecting "Move selected tree(s) here". [#7005](https://github.com/scalableminds/webknossos/pull/7005) ### Changed -- Loading of precomputed meshes got significantly faster (especially when using a mesh file for an oversegmentation with an applied agglomerate mappings). [#7001](https://github.com/scalableminds/webknossos/pull/7001) +- Loading of precomputed meshes got significantly faster (especially when using a mesh file for an oversegmentation with an applied agglomerate mapping). [#7001](https://github.com/scalableminds/webknossos/pull/7001) ### Fixed - Fixed that changing a segment color could lead to a crash. [#7000](https://github.com/scalableminds/webknossos/pull/7000) diff --git a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts index 9cab2226b31..681e4519df8 100644 --- a/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts +++ b/frontend/javascripts/oxalis/model/sagas/isosurface_saga.ts @@ -663,7 +663,6 @@ function* loadPrecomputedMeshForSegmentId( return; } - console.time("_getLoadChunksTasks"); const loadChunksTasks = _getLoadChunksTasks( dataset, layerName, @@ -682,7 +681,6 @@ function* loadPrecomputedMeshForSegmentId( console.error(exception); Toast.warning(`Some mesh chunks could not be loaded for segment ${id}.`); } - console.timeEnd("_getLoadChunksTasks"); yield* put(finishedLoadingIsosurfaceAction(layerName, id)); } From 4fb584e990d3caa2e78b846b7136cd822415ea0b Mon Sep 17 00:00:00 2001 From: frcroth Date: Fri, 5 May 2023 13:46:46 +0200 Subject: [PATCH 32/32] Apply suggestions from code review --- .../webknossos/datastore/services/MeshFileService.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala index be0889ad675..d370f19c675 100644 --- a/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala +++ b/webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/MeshFileService.scala @@ -380,6 +380,7 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC meshChunkDataRequests: MeshChunkDataRequestV3List, ): Fox[(Array[Byte], String)] = for { + // Sort the requests by byte offset to optimize for spinning disk access data: List[(Array[Byte], String, Int)] <- Fox.serialCombined( meshChunkDataRequests.requests.zipWithIndex.sortBy(requestAndIndex => requestAndIndex._1.byteOffset).toList )(requestAndIndex => { @@ -401,8 +402,8 @@ class MeshFileService @Inject()(config: DataStoreConfig)(implicit ec: ExecutionC } ?~> "mesh.file.readData.failed" }) dataSorted = data.sortBy(d => d._3) - _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) // Ensure same encoding for all responses - encoding = data.map(d => d._2).head + _ <- Fox.bool2Fox(data.map(d => d._2).toSet.size == 1) ?~> "Different encodings for the same mesh chunk request found." + encoding <- data.map(d => d._2).headOption output = dataSorted.flatMap(d => d._1).toArray } yield (output, encoding)