three-stdlib 2.28.3 → 2.28.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedMesh.js","sources":["../../src/objects/BatchedMesh.ts"],"sourcesContent":["import {\n Matrix4,\n Mesh,\n BufferGeometry,\n Material,\n DataTexture,\n IUniform,\n MathUtils,\n RGBAFormat,\n FloatType,\n BufferAttribute,\n} from 'three'\n\nconst _identityMatrix = new Matrix4()\nconst _zeroScaleMatrix = new Matrix4().set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)\n\n// Custom shaders\nconst batchingParsVertex = /* glsl */ `\n#ifdef BATCHING\n\tattribute float id;\n\tuniform highp sampler2D batchingTexture;\n\tuniform int batchingTextureSize;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tfloat j = i * 4.0;\n\t\tfloat x = mod( j, float( batchingTextureSize ) );\n\t\tfloat y = floor( j / float( batchingTextureSize ) );\n\t\tfloat dx = 1.0 / float( batchingTextureSize );\n\t\tfloat dy = 1.0 / float( batchingTextureSize );\n\t\ty = dy * ( y + 0.5 );\n\t\tvec4 v1 = texture2D( batchingTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\tvec4 v2 = texture2D( batchingTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\tvec4 v3 = texture2D( batchingTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\tvec4 v4 = texture2D( batchingTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif\n`\n\nconst batchingbaseVertex = /* glsl */ `\n#ifdef BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( id );\n#endif\n`\n\nconst batchingnormalVertex = /* glsl */ `\n#ifdef BATCHING\n\tobjectNormal = vec4( batchingMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( batchingMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif\n`\n\nconst batchingVertex = /* glsl */ `\n#ifdef BATCHING\n\ttransformed = ( batchingMatrix * vec4( transformed, 1.0 ) ).xyz;\n#endif\n`\n\n// @TODO: SkinnedMesh support?\n// @TODO: Future work if needed. Move into the core. Can be optimized more with WEBGL_multi_draw.\n\nclass BatchedMesh extends Mesh<BufferGeometry, Material> {\n _vertexStarts: number[]\n _vertexCounts: number[]\n _indexStarts: number[]\n _indexCounts: number[]\n _visibles: boolean[]\n _alives: boolean[]\n _maxGeometryCount: number\n _maxVertexCount: number\n _maxIndexCount: number\n _geometryInitialized: boolean\n _geometryCount: number\n _vertexCount: number\n _indexCount: number\n _matrices: Matrix4[]\n _matricesArray: Float32Array | null\n _matricesTexture: DataTexture | null\n _matricesTextureSize: number | null\n _customUniforms: Record<string, IUniform>\n\n constructor(\n maxGeometryCount: number,\n maxVertexCount: number,\n maxIndexCount = maxVertexCount * 2,\n material?: Material,\n ) {\n super(new BufferGeometry(), material)\n\n this._vertexStarts = []\n this._vertexCounts = []\n this._indexStarts = []\n this._indexCounts = []\n\n this._visibles = []\n this._alives = []\n\n this._maxGeometryCount = maxGeometryCount\n this._maxVertexCount = maxVertexCount\n this._maxIndexCount = maxIndexCount\n\n this._geometryInitialized = false\n this._geometryCount = 0\n this._vertexCount = 0\n this._indexCount = 0\n\n // Local matrix per geometry by using data texture\n // @TODO: Support uniform parameter per geometry\n\n this._matrices = []\n this._matricesArray = null\n this._matricesTexture = null\n this._matricesTextureSize = null\n\n // @TODO: Calculate the entire binding box and make frustumCulled true\n this.frustumCulled = false\n\n this._customUniforms = {\n batchingTexture: { value: null },\n batchingTextureSize: { value: 0 },\n }\n\n this._initMatricesTexture()\n this._initShader()\n\n this.onBeforeRender = function () {\n if (this.material.defines) {\n this.material.defines.BATCHING = true\n }\n\n // @TODO: Implement frustum culling for each geometry\n }\n\n this.onAfterRender = function () {\n if (this.material.defines) {\n this.material.defines.BATCHING = false\n }\n }\n }\n\n _initMatricesTexture() {\n // layout (1 matrix = 4 pixels)\n // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n // with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n // 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n // 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n // 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n let size = Math.sqrt(this._maxGeometryCount * 4) // 4 pixels needed for 1 matrix\n size = MathUtils.ceilPowerOfTwo(size)\n size = Math.max(size, 4)\n\n const matricesArray = new Float32Array(size * size * 4) // 4 floats per RGBA pixel\n const matricesTexture = new DataTexture(matricesArray, size, size, RGBAFormat, FloatType)\n\n this._matricesArray = matricesArray\n this._matricesTexture = matricesTexture\n this._matricesTextureSize = size\n\n this._customUniforms.batchingTexture.value = this._matricesTexture\n this._customUniforms.batchingTextureSize.value = this._matricesTextureSize\n }\n\n _initShader() {\n const currentOnBeforeCompile = this.material.onBeforeCompile\n const customUniforms = this._customUniforms\n\n this.material.onBeforeCompile = function onBeforeCompile(parameters, renderer) {\n // Is this replacement stable across any materials?\n parameters.vertexShader = parameters.vertexShader\n .replace('#include <skinning_pars_vertex>', '#include <skinning_pars_vertex>\\n' + batchingParsVertex)\n .replace(\n '#include <skinnormal_vertex>',\n '#include <skinnormal_vertex>\\n' + batchingbaseVertex + batchingnormalVertex,\n )\n .replace('#include <skinning_vertex>', '#include <skinning_vertex>\\n' + batchingVertex)\n\n for (const uniformName in customUniforms) {\n parameters.uniforms[uniformName] = customUniforms[uniformName]\n }\n\n currentOnBeforeCompile.call(this, parameters, renderer)\n }\n\n this.material.defines = this.material.defines || {}\n this.material.defines.BATCHING = false\n }\n\n getGeometryCount() {\n return this._geometryCount\n }\n\n getVertexCount() {\n return this._vertexCount\n }\n\n getIndexCount() {\n return this._indexCount\n }\n\n applyGeometry(geometry: BufferGeometry) {\n // @TODO: geometry.groups support?\n // @TODO: geometry.drawRange support?\n // @TODO: geometry.mortphAttributes support?\n\n if (this._geometryCount >= this._maxGeometryCount) {\n // @TODO: Error handling\n }\n\n if (this._geometryInitialized === false) {\n for (const attributeName in geometry.attributes) {\n const srcAttribute = geometry.getAttribute(attributeName)\n const { array, itemSize, normalized } = srcAttribute\n\n const dstArray = new (array.constructor as Float32ArrayConstructor)(this._maxVertexCount * itemSize)\n const dstAttribute = new (srcAttribute.constructor as any)(dstArray, itemSize, normalized) as BufferAttribute\n\n // TODO: add usage in @types/three\n // @ts-ignore\n dstAttribute.setUsage(srcAttribute.usage)\n\n this.geometry.setAttribute(attributeName, dstAttribute)\n }\n\n if (geometry.getIndex() !== null) {\n const indexArray =\n this._maxVertexCount > 65536 ? new Uint32Array(this._maxIndexCount) : new Uint16Array(this._maxIndexCount)\n\n this.geometry.setIndex(new BufferAttribute(indexArray, 1))\n }\n\n const idArray =\n this._maxGeometryCount > 65536 ? new Uint32Array(this._maxVertexCount) : new Uint16Array(this._maxVertexCount)\n // @TODO: What if attribute name 'id' is already used?\n this.geometry.setAttribute('id', new BufferAttribute(idArray, 1))\n\n this._geometryInitialized = true\n } else {\n // @TODO: Check if geometry has the same attributes set\n }\n\n const hasIndex = this.geometry.getIndex() !== null\n const dstIndex = this.geometry.getIndex()\n const srcIndex = geometry.getIndex()\n\n // Assuming geometry has position attribute\n const srcPositionAttribute = geometry.getAttribute('position')\n\n this._vertexStarts.push(this._vertexCount)\n this._vertexCounts.push(srcPositionAttribute.count)\n\n if (hasIndex) {\n this._indexStarts.push(this._indexCount)\n this._indexCounts.push(srcIndex!.count)\n }\n\n this._visibles.push(true)\n this._alives.push(true)\n\n // @TODO: Error handling if exceeding maxVertexCount or maxIndexCount\n\n for (const attributeName in geometry.attributes) {\n const srcAttribute = geometry.getAttribute(attributeName)\n const dstAttribute = this.geometry.getAttribute(attributeName)\n ;(dstAttribute.array as Float32Array).set(srcAttribute.array, this._vertexCount * dstAttribute.itemSize)\n dstAttribute.needsUpdate = true\n }\n\n if (hasIndex) {\n for (let i = 0; i < srcIndex!.count; i++) {\n dstIndex!.setX(this._indexCount + i, this._vertexCount + srcIndex!.getX(i))\n }\n\n this._indexCount += srcIndex!.count\n dstIndex!.needsUpdate = true\n }\n\n const geometryId = this._geometryCount\n this._geometryCount++\n\n const idAttribute = this.geometry.getAttribute('id')\n\n for (let i = 0; i < srcPositionAttribute.count; i++) {\n idAttribute.setX(this._vertexCount + i, geometryId)\n }\n\n idAttribute.needsUpdate = true\n\n this._vertexCount += srcPositionAttribute.count\n\n this._matrices.push(new Matrix4())\n _identityMatrix.toArray(this._matricesArray ?? undefined, geometryId * 16)\n this._matricesTexture!.needsUpdate = true\n\n return geometryId\n }\n\n deleteGeometry(geometryId: number) {\n if (geometryId >= this._alives.length || this._alives[geometryId] === false) {\n return this\n }\n\n this._alives[geometryId] = false\n _zeroScaleMatrix.toArray(this._matricesArray!, geometryId * 16)\n this._matricesTexture!.needsUpdate = true\n\n // User needs to call optimize() to pack the data.\n\n return this\n }\n\n optimize() {\n // @TODO: Implement\n\n return this\n }\n\n setMatrixAt(geometryId: number, matrix: Matrix4) {\n // @TODO: Map geometryId to index of the arrays because\n // optimize() can make geometryId mismatch the index\n\n if (geometryId >= this._matrices.length || this._alives[geometryId] === false) {\n return this\n }\n\n this._matrices[geometryId].copy(matrix)\n\n if (this._visibles[geometryId] === true) {\n matrix.toArray(this._matricesArray!, geometryId * 16)\n this._matricesTexture!.needsUpdate = true\n }\n\n return this\n }\n\n getMatrixAt(geometryId: number, matrix: Matrix4) {\n if (geometryId >= this._matrices.length || this._alives[geometryId] === false) {\n return matrix\n }\n\n return matrix.copy(this._matrices[geometryId])\n }\n\n setVisibleAt(geometryId: number, visible: boolean) {\n if (geometryId >= this._visibles.length || this._alives[geometryId] === false) {\n return this\n }\n\n if (this._visibles[geometryId] === visible) {\n return this\n }\n\n if (visible === true) {\n this._matrices[geometryId].toArray(this._matricesArray!, geometryId * 16)\n } else {\n _zeroScaleMatrix.toArray(this._matricesArray!, geometryId * 16)\n }\n\n this._matricesTexture!.needsUpdate = true\n this._visibles[geometryId] = visible\n return this\n }\n\n getVisibleAt(geometryId: number) {\n if (geometryId >= this._visibles.length || this._alives[geometryId] === false) {\n return false\n }\n\n return this._visibles[geometryId]\n }\n\n copy(source: BatchedMesh) {\n // @ts-ignore\n super.copy(source)\n\n // @TODO: Implement\n\n return this\n }\n\n toJSON(meta: any) {\n // @TODO: Implement\n\n return super.toJSON(meta)\n }\n\n dispose() {\n // Assuming the geometry is not shared with other meshes\n this.geometry.dispose()\n\n this._matricesTexture?.dispose()\n this._matricesTexture = null\n\n return this\n }\n}\n\nexport { BatchedMesh }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BatchedMesh.js","sources":["../../src/objects/BatchedMesh.ts"],"sourcesContent":["import {\n Matrix4,\n BufferAttribute,\n InterleavedBufferAttribute,\n Mesh,\n BufferGeometry,\n Material,\n DataTexture,\n IUniform,\n MathUtils,\n RGBAFormat,\n FloatType,\n} from 'three'\n\nconst ID_ATTR_NAME = '_batch_id_'\nconst _identityMatrix = new Matrix4()\nconst _zeroScaleMatrix = new Matrix4().set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)\n\n// Custom shaders\nconst batchingParsVertex = /* glsl */ `\n#ifdef BATCHING\n\tattribute float ${ID_ATTR_NAME};\n\tuniform highp sampler2D batchingTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\n\t}\n#endif\n`\n\nconst batchingbaseVertex = /* glsl */ `\n#ifdef BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( ${ID_ATTR_NAME} );\n#endif\n`\n\nconst batchingnormalVertex = /* glsl */ `\n#ifdef BATCHING\n\tobjectNormal = vec4( batchingMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( batchingMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif\n`\n\nconst batchingVertex = /* glsl */ `\n#ifdef BATCHING\n\ttransformed = ( batchingMatrix * vec4( transformed, 1.0 ) ).xyz;\n#endif\n`\n\n// @TODO: SkinnedMesh support?\n// @TODO: Future work if needed. Move into the core. Can be optimized more with WEBGL_multi_draw.\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData(\n src: BufferAttribute | InterleavedBufferAttribute,\n target: BufferAttribute | InterleavedBufferAttribute,\n targetOffset = 0,\n): void {\n const itemSize = target.itemSize\n if (\n (src as InterleavedBufferAttribute).isInterleavedBufferAttribute ||\n src.array.constructor !== target.array.constructor\n ) {\n // use the component getters and setters if the array data cannot\n // be copied directly\n const vertexCount = src.count\n for (let i = 0; i < vertexCount; i++) {\n for (let c = 0; c < itemSize; c++) {\n // @ts-ignore\n target.setComponent(i + targetOffset, c, src.getComponent(i, c))\n }\n }\n } else {\n // faster copy approach using typed array set function\n // @ts-ignore\n target.array.set(src.array, targetOffset * itemSize)\n }\n\n target.needsUpdate = true\n}\n\nclass BatchedMesh extends Mesh<BufferGeometry, Material> {\n _vertexStarts: number[]\n _vertexCounts: number[]\n _indexStarts: number[]\n _indexCounts: number[]\n _reservedRanges: { vertexStart: number; vertexCount: number; indexStart: number; indexCount: number }[]\n _visible: boolean[]\n _active: boolean[]\n _maxGeometryCount: number\n _maxVertexCount: number\n _maxIndexCount: number\n _geometryInitialized: boolean\n _geometryCount: number\n _matrices: Matrix4[]\n _matricesTexture: DataTexture | null\n _customUniforms: Record<string, IUniform>\n\n constructor(\n maxGeometryCount: number,\n maxVertexCount: number,\n maxIndexCount = maxVertexCount * 2,\n material?: Material,\n ) {\n super(new BufferGeometry(), material)\n\n this._vertexStarts = []\n this._vertexCounts = []\n this._indexStarts = []\n this._indexCounts = []\n this._reservedRanges = []\n\n this._visible = []\n this._active = []\n\n this._maxGeometryCount = maxGeometryCount\n this._maxVertexCount = maxVertexCount\n this._maxIndexCount = maxIndexCount\n\n this._geometryInitialized = false\n this._geometryCount = 0\n\n // Local matrix per geometry by using data texture\n // @TODO: Support uniform parameter per geometry\n\n this._matrices = []\n this._matricesTexture = null!\n\n // @TODO: Calculate the entire binding box and make frustumCulled true\n this.frustumCulled = false\n\n this._customUniforms = {\n batchingTexture: { value: null },\n }\n\n this._initMatricesTexture()\n this._initShader()\n\n this.onBeforeRender = function () {\n if (this.material.defines) {\n this.material.defines.BATCHING = true\n }\n\n // @TODO: Implement frustum culling for each geometry\n }\n\n this.onAfterRender = function () {\n if (this.material.defines) {\n this.material.defines.BATCHING = false\n }\n }\n }\n\n _initMatricesTexture(): void {\n // layout (1 matrix = 4 pixels)\n // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n // with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n // 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n // 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n // 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n let size = Math.sqrt(this._maxGeometryCount * 4) // 4 pixels needed for 1 matrix\n size = MathUtils.ceilPowerOfTwo(size)\n size = Math.max(size, 4)\n\n const matricesArray = new Float32Array(size * size * 4) // 4 floats per RGBA pixel\n const matricesTexture = new DataTexture(matricesArray, size, size, RGBAFormat, FloatType)\n\n this._matricesTexture = matricesTexture\n this._customUniforms.batchingTexture.value = this._matricesTexture\n }\n\n _initShader(): void {\n const material = this.material\n const currentOnBeforeCompile = material.onBeforeCompile\n const customUniforms = this._customUniforms\n\n material.onBeforeCompile = function onBeforeCompile(parameters, renderer) {\n // Is this replacement stable across any materials?\n parameters.vertexShader = parameters.vertexShader\n .replace('#include <skinning_pars_vertex>', '#include <skinning_pars_vertex>\\n' + batchingParsVertex)\n .replace('#include <uv_vertex>', '#include <uv_vertex>\\n' + batchingbaseVertex)\n .replace('#include <skinnormal_vertex>', '#include <skinnormal_vertex>\\n' + batchingnormalVertex)\n .replace('#include <skinning_vertex>', '#include <skinning_vertex>\\n' + batchingVertex)\n\n for (const uniformName in customUniforms) {\n parameters.uniforms[uniformName] = customUniforms[uniformName]\n }\n\n currentOnBeforeCompile.call(this, parameters, renderer)\n }\n\n material.defines = material.defines || {}\n material.defines.BATCHING = false\n }\n\n _initializeGeometry(reference: BufferGeometry): void {\n // @TODO: geometry.groups support?\n // @TODO: geometry.drawRange support?\n // @TODO: geometry.morphAttributes support?\n\n const geometry = this.geometry\n const maxVertexCount = this._maxVertexCount\n const maxGeometryCount = this._maxGeometryCount\n const maxIndexCount = this._maxIndexCount\n if (this._geometryInitialized === false) {\n for (const attributeName in reference.attributes) {\n const srcAttribute = reference.getAttribute(attributeName)\n const { array, itemSize, normalized } = srcAttribute\n\n const dstArray = new (array.constructor as Float32ArrayConstructor)(maxVertexCount * itemSize)\n const dstAttribute = new (srcAttribute.constructor as any)(dstArray, itemSize, normalized)\n\n // TODO: add usage in @types/three\n // @ts-ignore\n dstAttribute.setUsage(srcAttribute.usage)\n\n geometry.setAttribute(attributeName, dstAttribute)\n }\n\n if (reference.getIndex() !== null) {\n const indexArray = maxVertexCount > 65536 ? new Uint32Array(maxIndexCount) : new Uint16Array(maxIndexCount)\n\n geometry.setIndex(new BufferAttribute(indexArray, 1))\n }\n\n const idArray = maxGeometryCount > 65536 ? new Uint32Array(maxVertexCount) : new Uint16Array(maxVertexCount)\n geometry.setAttribute(ID_ATTR_NAME, new BufferAttribute(idArray, 1))\n\n this._geometryInitialized = true\n }\n }\n\n // Make sure the geometry is compatible with the existing combined geometry atributes\n _validateGeometry(geometry: BufferGeometry): void {\n // check that the geometry doesn't have a version of our reserved id attribute\n if (geometry.getAttribute(ID_ATTR_NAME)) {\n throw new Error(`BatchedMesh: Geometry cannot use attribute \"${ID_ATTR_NAME}\"`)\n }\n\n // check to ensure the geometries are using consistent attributes and indices\n const batchGeometry = this.geometry\n if (Boolean(geometry.getIndex()) !== Boolean(batchGeometry.getIndex())) {\n throw new Error('BatchedMesh: All geometries must consistently have \"index\".')\n }\n\n for (const attributeName in batchGeometry.attributes) {\n if (attributeName === ID_ATTR_NAME) {\n continue\n }\n\n if (!geometry.hasAttribute(attributeName)) {\n throw new Error(\n `BatchedMesh: Added geometry missing \"${attributeName}\". All geometries must have consistent attributes.`,\n )\n }\n\n const srcAttribute = geometry.getAttribute(attributeName)\n const dstAttribute = batchGeometry.getAttribute(attributeName)\n if (srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized) {\n throw new Error('BatchedMesh: All attributes must have a consistent itemSize and normalized value.')\n }\n }\n }\n\n getGeometryCount(): number {\n return this._geometryCount\n }\n\n getVertexCount(): number {\n const reservedRanges = this._reservedRanges\n if (reservedRanges.length === 0) {\n return 0\n } else {\n const finalRange = reservedRanges[reservedRanges.length - 1]\n return finalRange.vertexStart + finalRange.vertexCount\n }\n }\n\n getIndexCount(): number {\n const reservedRanges = this._reservedRanges\n const geometry = this.geometry\n if (geometry.getIndex() === null || reservedRanges.length === 0) {\n return 0\n } else {\n const finalRange = reservedRanges[reservedRanges.length - 1]\n return finalRange.indexStart + finalRange.indexCount\n }\n }\n\n addGeometry(geometry: BufferGeometry, vertexCount = -1, indexCount = -1): number {\n this._initializeGeometry(geometry)\n\n this._validateGeometry(geometry)\n\n // ensure we're not over geometry\n if (this._geometryCount >= this._maxGeometryCount) {\n throw new Error('BatchedMesh: Maximum geometry count reached.')\n }\n\n // get the necessary range fo the geometry\n const range = {\n vertexStart: -1,\n vertexCount: -1,\n indexStart: -1,\n indexCount: -1,\n }\n\n let lastRange = null\n const reservedRanges = this._reservedRanges\n if (this._geometryCount !== 0) {\n lastRange = reservedRanges[reservedRanges.length - 1]\n }\n\n if (vertexCount === -1) {\n range.vertexCount = geometry.getAttribute('position').count\n } else {\n range.vertexCount = vertexCount\n }\n\n if (lastRange === null) {\n range.vertexStart = 0\n } else {\n range.vertexStart = lastRange.vertexStart + lastRange.vertexCount\n }\n\n if (geometry.getIndex() !== null) {\n if (indexCount === -1) {\n range.indexCount = geometry.getIndex()!.count\n } else {\n range.indexCount = indexCount\n }\n\n if (lastRange === null) {\n range.indexStart = 0\n } else {\n range.indexStart = lastRange.indexStart + lastRange.indexCount\n }\n }\n\n if (\n (range.indexStart !== -1 && range.indexStart + range.indexCount > this._maxIndexCount) ||\n range.vertexStart + range.vertexCount > this._maxVertexCount\n ) {\n throw new Error('BatchedMesh: Reserved space request exceeds the maximum buffer size.')\n }\n\n const indexCounts = this._indexCounts\n const indexStarts = this._indexStarts\n const vertexCounts = this._vertexCounts\n const vertexStarts = this._vertexStarts\n\n const visible = this._visible\n const active = this._active\n const matricesTexture = this._matricesTexture\n const matrices = this._matrices\n const matricesArray = this._matricesTexture!.image.data\n\n // push new visibility states\n visible.push(true)\n active.push(true)\n\n // update id\n const geometryId = this._geometryCount\n this._geometryCount++\n\n // initialize matrix information\n matrices.push(new Matrix4())\n _identityMatrix.toArray(matricesArray, geometryId * 16)\n matricesTexture!.needsUpdate = true\n\n // add the reserved range\n reservedRanges.push(range)\n\n // push new geometry data range\n vertexStarts.push(range.vertexStart)\n vertexCounts.push(range.vertexCount)\n\n if (geometry.getIndex() !== null) {\n // push new index range\n indexStarts.push(range.indexCount)\n indexCounts.push(range.indexCount)\n }\n\n // set the id for the geometry\n const idAttribute = this.geometry.getAttribute(ID_ATTR_NAME)\n for (let i = 0; i < range.vertexCount; i++) {\n idAttribute.setX(range.vertexStart + i, geometryId)\n }\n\n idAttribute.needsUpdate = true\n\n // update the geometry\n this.setGeometryAt(geometryId, geometry)\n\n return geometryId\n }\n\n /**\n * @deprecated use `addGeometry` instead.\n */\n applyGeometry(geometry: BufferGeometry): number {\n return this.addGeometry(geometry)\n }\n\n setGeometryAt(id: number, geometry: BufferGeometry): number {\n if (id >= this._geometryCount) {\n throw new Error('BatchedMesh: Maximum geometry count reached.')\n }\n\n this._validateGeometry(geometry)\n\n const range = this._reservedRanges[id]\n if (\n (geometry.getIndex() !== null && geometry.getIndex()!.count > range.indexCount) ||\n geometry.attributes.position.count > range.vertexCount\n ) {\n throw new Error('BatchedMesh: Reserved space not large enough for provided geometry.')\n }\n\n // copy geometry over\n const batchGeometry = this.geometry\n const srcPositionAttribute = geometry.getAttribute('position')\n const hasIndex = batchGeometry.getIndex() !== null\n const dstIndex = batchGeometry.getIndex()!\n const srcIndex = geometry.getIndex()!\n\n // copy attribute data over\n const vertexStart = range.vertexStart\n const vertexCount = range.vertexCount\n for (const attributeName in batchGeometry.attributes) {\n if (attributeName === ID_ATTR_NAME) {\n continue\n }\n\n const srcAttribute = geometry.getAttribute(attributeName)\n const dstAttribute = batchGeometry.getAttribute(attributeName)\n copyAttributeData(srcAttribute, dstAttribute, vertexStart)\n\n // fill the rest in with zeroes\n const itemSize = srcAttribute.itemSize\n for (let i = srcAttribute.count, l = vertexCount; i < l; i++) {\n const index = vertexStart + i\n for (let c = 0; c < itemSize; c++) {\n // @ts-ignore\n dstAttribute.setComponent(index, c, 0)\n }\n }\n\n dstAttribute.needsUpdate = true\n }\n\n this._vertexCounts[id] = srcPositionAttribute.count\n\n if (hasIndex) {\n // fill the rest in with zeroes\n const indexStart = range.indexStart\n\n // copy index data over\n for (let i = 0; i < srcIndex.count; i++) {\n dstIndex.setX(indexStart + i, vertexStart + srcIndex.getX(i))\n }\n\n // fill the rest in with zeroes\n for (let i = srcIndex.count, l = range.indexCount; i < l; i++) {\n dstIndex.setX(indexStart + i, vertexStart)\n }\n\n dstIndex.needsUpdate = true\n this._indexCounts[id] = srcIndex.count\n }\n\n return id\n }\n\n deleteGeometry(geometryId: number): this {\n // Note: User needs to call optimize() afterward to pack the data.\n\n const active = this._active\n const matricesTexture = this._matricesTexture!\n const matricesArray = matricesTexture.image.data\n if (geometryId >= active.length || active[geometryId] === false) {\n return this\n }\n\n active[geometryId] = false\n _zeroScaleMatrix.toArray(matricesArray, geometryId * 16)\n matricesTexture!.needsUpdate = true\n\n return this\n }\n\n optimize(): never {\n throw new Error('BatchedMesh: Optimize function not implemented.')\n }\n\n setMatrixAt(geometryId: number, matrix: Matrix4): this {\n // @TODO: Map geometryId to index of the arrays because\n // optimize() can make geometryId mismatch the index\n\n const visible = this._visible\n const active = this._active\n const matricesTexture = this._matricesTexture!\n const matrices = this._matrices\n const matricesArray = matricesTexture.image.data\n if (geometryId >= matrices.length || active[geometryId] === false) {\n return this\n }\n\n if (visible[geometryId] === true) {\n matrix.toArray(matricesArray, geometryId * 16)\n matricesTexture.needsUpdate = true\n }\n\n matrices[geometryId].copy(matrix)\n\n return this\n }\n\n getMatrixAt(geometryId: number, matrix: Matrix4): Matrix4 {\n const matrices = this._matrices\n const active = this._active\n if (geometryId >= matrices.length || active[geometryId] === false) {\n return matrix\n }\n\n return matrix.copy(matrices[geometryId])\n }\n\n setVisibleAt(geometryId: number, value: boolean): this {\n const visible = this._visible\n const active = this._active\n const matricesTexture = this._matricesTexture!\n const matrices = this._matrices\n const matricesArray = matricesTexture.image.data\n\n // if the geometry is out of range, not active, or visibility state\n // does not change then return early\n if (geometryId >= visible.length || active[geometryId] === false || visible[geometryId] === value) {\n return this\n }\n\n // scale the matrix to zero if it's hidden\n if (value === true) {\n matrices[geometryId].toArray(matricesArray, geometryId * 16)\n } else {\n _zeroScaleMatrix.toArray(matricesArray, geometryId * 16)\n }\n\n matricesTexture.needsUpdate = true\n visible[geometryId] = value\n\n return this\n }\n\n getVisibleAt(geometryId: number): boolean {\n const visible = this._visible\n const active = this._active\n\n // return early if the geometry is out of range or not active\n if (geometryId >= visible.length || active[geometryId] === false) {\n return false\n }\n\n return visible[geometryId]\n }\n\n raycast(): void {\n console.warn('BatchedMesh: Raycast function not implemented.')\n }\n\n copy(): never {\n // super.copy( source );\n\n throw new Error('BatchedMesh: Copy function not implemented.')\n }\n\n toJSON(): never {\n throw new Error('BatchedMesh: toJSON function not implemented.')\n }\n\n dispose(): this {\n // Assuming the geometry is not shared with other meshes\n this.geometry.dispose()\n\n this._matricesTexture!.dispose()\n this._matricesTexture = null!\n\n return this\n }\n}\n\nexport { BatchedMesh }\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-stdlib",
3
- "version": "2.28.3",
3
+ "version": "2.28.5",
4
4
  "description": "stand-alone library of threejs examples",
5
5
  "keywords": [
6
6
  "three",
@@ -47,7 +47,7 @@ class CSS3DRenderer {
47
47
  let _width, _height;
48
48
  let _widthHalf, _heightHalf;
49
49
  const cache = {
50
- camera: { fov: 0, style: "" },
50
+ camera: { style: "" },
51
51
  objects: /* @__PURE__ */ new WeakMap()
52
52
  };
53
53
  const domElement = parameters.element !== void 0 ? parameters.element : document.createElement("div");
@@ -68,10 +68,6 @@ class CSS3DRenderer {
68
68
  };
69
69
  this.render = function(scene, camera) {
70
70
  const fov = camera.projectionMatrix.elements[5] * _heightHalf;
71
- if (cache.camera.fov !== fov) {
72
- viewElement.style.perspective = camera.isPerspectiveCamera ? fov + "px" : "";
73
- cache.camera.fov = fov;
74
- }
75
71
  if (camera.view && camera.view.enabled) {
76
72
  viewElement.style.transform = `translate( ${-camera.view.offsetX * (_width / camera.view.width)}px, ${-camera.view.offsetY * (_height / camera.view.height)}px )`;
77
73
  viewElement.style.transform += `scale( ${camera.view.fullWidth / camera.view.width}, ${camera.view.fullHeight / camera.view.height} )`;
@@ -89,7 +85,8 @@ class CSS3DRenderer {
89
85
  }
90
86
  const scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;
91
87
  const cameraCSSMatrix = camera.isOrthographicCamera ? `scale( ${scaleByViewOffset} )scale(` + fov + ")translate(" + epsilon(tx) + "px," + epsilon(ty) + "px)" + getCameraCSSMatrix(camera.matrixWorldInverse) : `scale( ${scaleByViewOffset} )translateZ(` + fov + "px)" + getCameraCSSMatrix(camera.matrixWorldInverse);
92
- const style = cameraCSSMatrix + "translate(" + _widthHalf + "px," + _heightHalf + "px)";
88
+ const perspective = camera.isPerspectiveCamera ? "perspective(" + fov + "px) " : "";
89
+ const style = perspective + cameraCSSMatrix + "translate(" + _widthHalf + "px," + _heightHalf + "px)";
93
90
  if (cache.camera.style !== style) {
94
91
  cameraElement.style.transform = style;
95
92
  cache.camera.style = style;
@@ -1 +1 @@
1
- {"version":3,"file":"CSS3DRenderer.cjs","sources":["../../src/renderers/CSS3DRenderer.js"],"sourcesContent":["import { Matrix4, Object3D, Quaternion, Vector3 } from 'three'\n\n/**\n * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n */\n\nconst _position = new Vector3()\nconst _quaternion = new Quaternion()\nconst _scale = new Vector3()\n\nclass CSS3DObject extends Object3D {\n constructor(element = document.createElement('div')) {\n super()\n\n this.isCSS3DObject = true\n\n this.element = element\n this.element.style.position = 'absolute'\n this.element.style.pointerEvents = 'auto'\n this.element.style.userSelect = 'none'\n\n this.element.setAttribute('draggable', false)\n\n this.addEventListener('removed', function () {\n this.traverse(function (object) {\n if (object.element instanceof Element && object.element.parentNode !== null) {\n object.element.parentNode.removeChild(object.element)\n }\n })\n })\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.element = source.element.cloneNode(true)\n\n return this\n }\n}\n\nclass CSS3DSprite extends CSS3DObject {\n constructor(element) {\n super(element)\n\n this.isCSS3DSprite = true\n\n this.rotation2D = 0\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.rotation2D = source.rotation2D\n\n return this\n }\n}\n\n//\n\nconst _matrix = new Matrix4()\nconst _matrix2 = new Matrix4()\n\nclass CSS3DRenderer {\n constructor(parameters = {}) {\n const _this = this\n\n let _width, _height\n let _widthHalf, _heightHalf\n\n const cache = {\n camera: { fov: 0, style: '' },\n objects: new WeakMap(),\n }\n\n const domElement = parameters.element !== undefined ? parameters.element : document.createElement('div')\n\n domElement.style.overflow = 'hidden'\n\n this.domElement = domElement\n\n const viewElement = document.createElement('div')\n viewElement.style.transformOrigin = '0 0'\n viewElement.style.pointerEvents = 'none'\n domElement.appendChild(viewElement)\n\n const cameraElement = document.createElement('div')\n\n cameraElement.style.transformStyle = 'preserve-3d'\n\n viewElement.appendChild(cameraElement)\n\n this.getSize = function () {\n return {\n width: _width,\n height: _height,\n }\n }\n\n this.render = function (scene, camera) {\n const fov = camera.projectionMatrix.elements[5] * _heightHalf\n\n if (cache.camera.fov !== fov) {\n viewElement.style.perspective = camera.isPerspectiveCamera ? fov + 'px' : ''\n cache.camera.fov = fov\n }\n\n if (camera.view && camera.view.enabled) {\n // view offset\n viewElement.style.transform = `translate( ${-camera.view.offsetX * (_width / camera.view.width)}px, ${\n -camera.view.offsetY * (_height / camera.view.height)\n }px )`\n\n // view fullWidth and fullHeight, view width and height\n viewElement.style.transform += `scale( ${camera.view.fullWidth / camera.view.width}, ${\n camera.view.fullHeight / camera.view.height\n } )`\n } else {\n viewElement.style.transform = ''\n }\n\n if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld()\n if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld()\n\n let tx, ty\n\n if (camera.isOrthographicCamera) {\n tx = -(camera.right + camera.left) / 2\n ty = (camera.top + camera.bottom) / 2\n }\n\n const scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1\n const cameraCSSMatrix = camera.isOrthographicCamera\n ? `scale( ${scaleByViewOffset} )` +\n 'scale(' +\n fov +\n ')' +\n 'translate(' +\n epsilon(tx) +\n 'px,' +\n epsilon(ty) +\n 'px)' +\n getCameraCSSMatrix(camera.matrixWorldInverse)\n : `scale( ${scaleByViewOffset} )` + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse)\n\n const style = cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'\n\n if (cache.camera.style !== style) {\n cameraElement.style.transform = style\n\n cache.camera.style = style\n }\n\n renderObject(scene, scene, camera, cameraCSSMatrix)\n }\n\n this.setSize = function (width, height) {\n _width = width\n _height = height\n _widthHalf = _width / 2\n _heightHalf = _height / 2\n\n domElement.style.width = width + 'px'\n domElement.style.height = height + 'px'\n\n viewElement.style.width = width + 'px'\n viewElement.style.height = height + 'px'\n\n cameraElement.style.width = width + 'px'\n cameraElement.style.height = height + 'px'\n }\n\n function epsilon(value) {\n return Math.abs(value) < 1e-10 ? 0 : value\n }\n\n function getCameraCSSMatrix(matrix) {\n const elements = matrix.elements\n\n return (\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(-elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(elements[6]) +\n ',' +\n epsilon(elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(-elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(-elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n )\n }\n\n function getObjectCSSMatrix(matrix) {\n const elements = matrix.elements\n const matrix3d =\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(-elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(-elements[6]) +\n ',' +\n epsilon(-elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n\n return 'translate(-50%,-50%)' + matrix3d\n }\n\n function renderObject(object, scene, camera, cameraCSSMatrix) {\n if (object.isCSS3DObject) {\n const visible = object.visible === true && object.layers.test(camera.layers) === true\n object.element.style.display = visible === true ? '' : 'none'\n\n if (visible === true) {\n object.onBeforeRender(_this, scene, camera)\n\n let style\n\n if (object.isCSS3DSprite) {\n // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n _matrix.copy(camera.matrixWorldInverse)\n _matrix.transpose()\n\n if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D))\n\n object.matrixWorld.decompose(_position, _quaternion, _scale)\n _matrix.setPosition(_position)\n _matrix.scale(_scale)\n\n _matrix.elements[3] = 0\n _matrix.elements[7] = 0\n _matrix.elements[11] = 0\n _matrix.elements[15] = 1\n\n style = getObjectCSSMatrix(_matrix)\n } else {\n style = getObjectCSSMatrix(object.matrixWorld)\n }\n\n const element = object.element\n const cachedObject = cache.objects.get(object)\n\n if (cachedObject === undefined || cachedObject.style !== style) {\n element.style.transform = style\n\n const objectData = { style: style }\n cache.objects.set(object, objectData)\n }\n\n if (element.parentNode !== cameraElement) {\n cameraElement.appendChild(element)\n }\n\n object.onAfterRender(_this, scene, camera)\n }\n }\n\n for (let i = 0, l = object.children.length; i < l; i++) {\n renderObject(object.children[i], scene, camera, cameraCSSMatrix)\n }\n }\n }\n}\n\nexport { CSS3DObject, CSS3DSprite, CSS3DRenderer }\n"],"names":["Vector3","Quaternion","Object3D","Matrix4"],"mappings":";;;AAMA,MAAM,YAAY,IAAIA,MAAAA,QAAS;AAC/B,MAAM,cAAc,IAAIC,MAAAA,WAAY;AACpC,MAAM,SAAS,IAAID,MAAAA,QAAS;AAE5B,MAAM,oBAAoBE,MAAAA,SAAS;AAAA,EACjC,YAAY,UAAU,SAAS,cAAc,KAAK,GAAG;AACnD,UAAO;AAEP,SAAK,gBAAgB;AAErB,SAAK,UAAU;AACf,SAAK,QAAQ,MAAM,WAAW;AAC9B,SAAK,QAAQ,MAAM,gBAAgB;AACnC,SAAK,QAAQ,MAAM,aAAa;AAEhC,SAAK,QAAQ,aAAa,aAAa,KAAK;AAE5C,SAAK,iBAAiB,WAAW,WAAY;AAC3C,WAAK,SAAS,SAAU,QAAQ;AAC9B,YAAI,OAAO,mBAAmB,WAAW,OAAO,QAAQ,eAAe,MAAM;AAC3E,iBAAO,QAAQ,WAAW,YAAY,OAAO,OAAO;AAAA,QACrD;AAAA,MACT,CAAO;AAAA,IACP,CAAK;AAAA,EACF;AAAA,EAED,KAAK,QAAQ,WAAW;AACtB,UAAM,KAAK,QAAQ,SAAS;AAE5B,SAAK,UAAU,OAAO,QAAQ,UAAU,IAAI;AAE5C,WAAO;AAAA,EACR;AACH;AAEA,MAAM,oBAAoB,YAAY;AAAA,EACpC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,gBAAgB;AAErB,SAAK,aAAa;AAAA,EACnB;AAAA,EAED,KAAK,QAAQ,WAAW;AACtB,UAAM,KAAK,QAAQ,SAAS;AAE5B,SAAK,aAAa,OAAO;AAEzB,WAAO;AAAA,EACR;AACH;AAIA,MAAM,UAAU,IAAIC,MAAAA,QAAS;AAC7B,MAAM,WAAW,IAAIA,MAAAA,QAAS;AAE9B,MAAM,cAAc;AAAA,EAClB,YAAY,aAAa,IAAI;AAC3B,UAAM,QAAQ;AAEd,QAAI,QAAQ;AACZ,QAAI,YAAY;AAEhB,UAAM,QAAQ;AAAA,MACZ,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAI;AAAA,MAC7B,SAAS,oBAAI,QAAS;AAAA,IACvB;AAED,UAAM,aAAa,WAAW,YAAY,SAAY,WAAW,UAAU,SAAS,cAAc,KAAK;AAEvG,eAAW,MAAM,WAAW;AAE5B,SAAK,aAAa;AAElB,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,MAAM,kBAAkB;AACpC,gBAAY,MAAM,gBAAgB;AAClC,eAAW,YAAY,WAAW;AAElC,UAAM,gBAAgB,SAAS,cAAc,KAAK;AAElD,kBAAc,MAAM,iBAAiB;AAErC,gBAAY,YAAY,aAAa;AAErC,SAAK,UAAU,WAAY;AACzB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,IACF;AAED,SAAK,SAAS,SAAU,OAAO,QAAQ;AACrC,YAAM,MAAM,OAAO,iBAAiB,SAAS,CAAC,IAAI;AAElD,UAAI,MAAM,OAAO,QAAQ,KAAK;AAC5B,oBAAY,MAAM,cAAc,OAAO,sBAAsB,MAAM,OAAO;AAC1E,cAAM,OAAO,MAAM;AAAA,MACpB;AAED,UAAI,OAAO,QAAQ,OAAO,KAAK,SAAS;AAEtC,oBAAY,MAAM,YAAY,cAAc,CAAC,OAAO,KAAK,WAAW,SAAS,OAAO,KAAK,aACvF,CAAC,OAAO,KAAK,WAAW,UAAU,OAAO,KAAK;AAIhD,oBAAY,MAAM,aAAa,UAAU,OAAO,KAAK,YAAY,OAAO,KAAK,UAC3E,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA,MAE/C,OAAa;AACL,oBAAY,MAAM,YAAY;AAAA,MAC/B;AAED,UAAI,MAAM,0BAA0B;AAAM,cAAM,kBAAmB;AACnE,UAAI,OAAO,WAAW,QAAQ,OAAO,0BAA0B;AAAM,eAAO,kBAAmB;AAE/F,UAAI,IAAI;AAER,UAAI,OAAO,sBAAsB;AAC/B,aAAK,EAAE,OAAO,QAAQ,OAAO,QAAQ;AACrC,cAAM,OAAO,MAAM,OAAO,UAAU;AAAA,MACrC;AAED,YAAM,oBAAoB,OAAO,QAAQ,OAAO,KAAK,UAAU,OAAO,KAAK,SAAS,OAAO,KAAK,aAAa;AAC7G,YAAM,kBAAkB,OAAO,uBAC3B,UAAU,8BAEV,MACA,gBAEA,QAAQ,EAAE,IACV,QACA,QAAQ,EAAE,IACV,QACA,mBAAmB,OAAO,kBAAkB,IAC5C,UAAU,mCAAwC,MAAM,QAAQ,mBAAmB,OAAO,kBAAkB;AAEhH,YAAM,QAAQ,kBAAkB,eAAe,aAAa,QAAQ,cAAc;AAElF,UAAI,MAAM,OAAO,UAAU,OAAO;AAChC,sBAAc,MAAM,YAAY;AAEhC,cAAM,OAAO,QAAQ;AAAA,MACtB;AAED,mBAAa,OAAO,OAAO,MAAuB;AAAA,IACnD;AAED,SAAK,UAAU,SAAU,OAAO,QAAQ;AACtC,eAAS;AACT,gBAAU;AACV,mBAAa,SAAS;AACtB,oBAAc,UAAU;AAExB,iBAAW,MAAM,QAAQ,QAAQ;AACjC,iBAAW,MAAM,SAAS,SAAS;AAEnC,kBAAY,MAAM,QAAQ,QAAQ;AAClC,kBAAY,MAAM,SAAS,SAAS;AAEpC,oBAAc,MAAM,QAAQ,QAAQ;AACpC,oBAAc,MAAM,SAAS,SAAS;AAAA,IACvC;AAED,aAAS,QAAQ,OAAO;AACtB,aAAO,KAAK,IAAI,KAAK,IAAI,QAAQ,IAAI;AAAA,IACtC;AAED,aAAS,mBAAmB,QAAQ;AAClC,YAAM,WAAW,OAAO;AAExB,aACE,cACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,EAAE,CAAC,IACrB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB;AAAA,IAEH;AAED,aAAS,mBAAmB,QAAQ;AAClC,YAAM,WAAW,OAAO;AACxB,YAAM,WACJ,cACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB;AAEF,aAAO,yBAAyB;AAAA,IACjC;AAED,aAAS,aAAa,QAAQ,OAAO,QAAQ,iBAAiB;AAC5D,UAAI,OAAO,eAAe;AACxB,cAAM,UAAU,OAAO,YAAY,QAAQ,OAAO,OAAO,KAAK,OAAO,MAAM,MAAM;AACjF,eAAO,QAAQ,MAAM,UAAU,YAAY,OAAO,KAAK;AAEvD,YAAI,YAAY,MAAM;AACpB,iBAAO,eAAe,OAAO,OAAO,MAAM;AAE1C,cAAI;AAEJ,cAAI,OAAO,eAAe;AAGxB,oBAAQ,KAAK,OAAO,kBAAkB;AACtC,oBAAQ,UAAW;AAEnB,gBAAI,OAAO,eAAe;AAAG,sBAAQ,SAAS,SAAS,cAAc,OAAO,UAAU,CAAC;AAEvF,mBAAO,YAAY,UAAU,WAAW,aAAa,MAAM;AAC3D,oBAAQ,YAAY,SAAS;AAC7B,oBAAQ,MAAM,MAAM;AAEpB,oBAAQ,SAAS,CAAC,IAAI;AACtB,oBAAQ,SAAS,CAAC,IAAI;AACtB,oBAAQ,SAAS,EAAE,IAAI;AACvB,oBAAQ,SAAS,EAAE,IAAI;AAEvB,oBAAQ,mBAAmB,OAAO;AAAA,UAC9C,OAAiB;AACL,oBAAQ,mBAAmB,OAAO,WAAW;AAAA,UAC9C;AAED,gBAAM,UAAU,OAAO;AACvB,gBAAM,eAAe,MAAM,QAAQ,IAAI,MAAM;AAE7C,cAAI,iBAAiB,UAAa,aAAa,UAAU,OAAO;AAC9D,oBAAQ,MAAM,YAAY;AAE1B,kBAAM,aAAa,EAAE,MAAc;AACnC,kBAAM,QAAQ,IAAI,QAAQ,UAAU;AAAA,UACrC;AAED,cAAI,QAAQ,eAAe,eAAe;AACxC,0BAAc,YAAY,OAAO;AAAA,UAClC;AAED,iBAAO,cAAc,OAAO,OAAO,MAAM;AAAA,QAC1C;AAAA,MACF;AAED,eAAS,IAAI,GAAG,IAAI,OAAO,SAAS,QAAQ,IAAI,GAAG,KAAK;AACtD,qBAAa,OAAO,SAAS,CAAC,GAAG,OAAO,MAAuB;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACH;;;;"}
1
+ {"version":3,"file":"CSS3DRenderer.cjs","sources":["../../src/renderers/CSS3DRenderer.js"],"sourcesContent":["import { Matrix4, Object3D, Quaternion, Vector3 } from 'three'\n\n/**\n * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n */\n\nconst _position = new Vector3()\nconst _quaternion = new Quaternion()\nconst _scale = new Vector3()\n\nclass CSS3DObject extends Object3D {\n constructor(element = document.createElement('div')) {\n super()\n\n this.isCSS3DObject = true\n\n this.element = element\n this.element.style.position = 'absolute'\n this.element.style.pointerEvents = 'auto'\n this.element.style.userSelect = 'none'\n\n this.element.setAttribute('draggable', false)\n\n this.addEventListener('removed', function () {\n this.traverse(function (object) {\n if (object.element instanceof Element && object.element.parentNode !== null) {\n object.element.parentNode.removeChild(object.element)\n }\n })\n })\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.element = source.element.cloneNode(true)\n\n return this\n }\n}\n\nclass CSS3DSprite extends CSS3DObject {\n constructor(element) {\n super(element)\n\n this.isCSS3DSprite = true\n\n this.rotation2D = 0\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.rotation2D = source.rotation2D\n\n return this\n }\n}\n\n//\n\nconst _matrix = new Matrix4()\nconst _matrix2 = new Matrix4()\n\nclass CSS3DRenderer {\n constructor(parameters = {}) {\n const _this = this\n\n let _width, _height\n let _widthHalf, _heightHalf\n\n const cache = {\n camera: { style: '' },\n objects: new WeakMap(),\n }\n\n const domElement = parameters.element !== undefined ? parameters.element : document.createElement('div')\n\n domElement.style.overflow = 'hidden'\n\n this.domElement = domElement\n\n const viewElement = document.createElement('div')\n viewElement.style.transformOrigin = '0 0'\n viewElement.style.pointerEvents = 'none'\n domElement.appendChild(viewElement)\n\n const cameraElement = document.createElement('div')\n\n cameraElement.style.transformStyle = 'preserve-3d'\n\n viewElement.appendChild(cameraElement)\n\n this.getSize = function () {\n return {\n width: _width,\n height: _height,\n }\n }\n\n this.render = function (scene, camera) {\n const fov = camera.projectionMatrix.elements[5] * _heightHalf\n\n if (camera.view && camera.view.enabled) {\n // view offset\n viewElement.style.transform = `translate( ${-camera.view.offsetX * (_width / camera.view.width)}px, ${\n -camera.view.offsetY * (_height / camera.view.height)\n }px )`\n\n // view fullWidth and fullHeight, view width and height\n viewElement.style.transform += `scale( ${camera.view.fullWidth / camera.view.width}, ${\n camera.view.fullHeight / camera.view.height\n } )`\n } else {\n viewElement.style.transform = ''\n }\n\n if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld()\n if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld()\n\n let tx, ty\n\n if (camera.isOrthographicCamera) {\n tx = -(camera.right + camera.left) / 2\n ty = (camera.top + camera.bottom) / 2\n }\n\n const scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1\n const cameraCSSMatrix = camera.isOrthographicCamera\n ? `scale( ${scaleByViewOffset} )` +\n 'scale(' +\n fov +\n ')' +\n 'translate(' +\n epsilon(tx) +\n 'px,' +\n epsilon(ty) +\n 'px)' +\n getCameraCSSMatrix(camera.matrixWorldInverse)\n : `scale( ${scaleByViewOffset} )` + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse)\n const perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : ''\n\n const style = perspective + cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'\n\n if (cache.camera.style !== style) {\n cameraElement.style.transform = style\n\n cache.camera.style = style\n }\n\n renderObject(scene, scene, camera, cameraCSSMatrix)\n }\n\n this.setSize = function (width, height) {\n _width = width\n _height = height\n _widthHalf = _width / 2\n _heightHalf = _height / 2\n\n domElement.style.width = width + 'px'\n domElement.style.height = height + 'px'\n\n viewElement.style.width = width + 'px'\n viewElement.style.height = height + 'px'\n\n cameraElement.style.width = width + 'px'\n cameraElement.style.height = height + 'px'\n }\n\n function epsilon(value) {\n return Math.abs(value) < 1e-10 ? 0 : value\n }\n\n function getCameraCSSMatrix(matrix) {\n const elements = matrix.elements\n\n return (\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(-elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(elements[6]) +\n ',' +\n epsilon(elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(-elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(-elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n )\n }\n\n function getObjectCSSMatrix(matrix) {\n const elements = matrix.elements\n const matrix3d =\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(-elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(-elements[6]) +\n ',' +\n epsilon(-elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n\n return 'translate(-50%,-50%)' + matrix3d\n }\n\n function renderObject(object, scene, camera, cameraCSSMatrix) {\n if (object.isCSS3DObject) {\n const visible = object.visible === true && object.layers.test(camera.layers) === true\n object.element.style.display = visible === true ? '' : 'none'\n\n if (visible === true) {\n object.onBeforeRender(_this, scene, camera)\n\n let style\n\n if (object.isCSS3DSprite) {\n // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n _matrix.copy(camera.matrixWorldInverse)\n _matrix.transpose()\n\n if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D))\n\n object.matrixWorld.decompose(_position, _quaternion, _scale)\n _matrix.setPosition(_position)\n _matrix.scale(_scale)\n\n _matrix.elements[3] = 0\n _matrix.elements[7] = 0\n _matrix.elements[11] = 0\n _matrix.elements[15] = 1\n\n style = getObjectCSSMatrix(_matrix)\n } else {\n style = getObjectCSSMatrix(object.matrixWorld)\n }\n\n const element = object.element\n const cachedObject = cache.objects.get(object)\n\n if (cachedObject === undefined || cachedObject.style !== style) {\n element.style.transform = style\n\n const objectData = { style: style }\n cache.objects.set(object, objectData)\n }\n\n if (element.parentNode !== cameraElement) {\n cameraElement.appendChild(element)\n }\n\n object.onAfterRender(_this, scene, camera)\n }\n }\n\n for (let i = 0, l = object.children.length; i < l; i++) {\n renderObject(object.children[i], scene, camera, cameraCSSMatrix)\n }\n }\n }\n}\n\nexport { CSS3DObject, CSS3DSprite, CSS3DRenderer }\n"],"names":["Vector3","Quaternion","Object3D","Matrix4"],"mappings":"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"}
@@ -45,7 +45,7 @@ class CSS3DRenderer {
45
45
  let _width, _height;
46
46
  let _widthHalf, _heightHalf;
47
47
  const cache = {
48
- camera: { fov: 0, style: "" },
48
+ camera: { style: "" },
49
49
  objects: /* @__PURE__ */ new WeakMap()
50
50
  };
51
51
  const domElement = parameters.element !== void 0 ? parameters.element : document.createElement("div");
@@ -66,10 +66,6 @@ class CSS3DRenderer {
66
66
  };
67
67
  this.render = function(scene, camera) {
68
68
  const fov = camera.projectionMatrix.elements[5] * _heightHalf;
69
- if (cache.camera.fov !== fov) {
70
- viewElement.style.perspective = camera.isPerspectiveCamera ? fov + "px" : "";
71
- cache.camera.fov = fov;
72
- }
73
69
  if (camera.view && camera.view.enabled) {
74
70
  viewElement.style.transform = `translate( ${-camera.view.offsetX * (_width / camera.view.width)}px, ${-camera.view.offsetY * (_height / camera.view.height)}px )`;
75
71
  viewElement.style.transform += `scale( ${camera.view.fullWidth / camera.view.width}, ${camera.view.fullHeight / camera.view.height} )`;
@@ -87,7 +83,8 @@ class CSS3DRenderer {
87
83
  }
88
84
  const scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;
89
85
  const cameraCSSMatrix = camera.isOrthographicCamera ? `scale( ${scaleByViewOffset} )scale(` + fov + ")translate(" + epsilon(tx) + "px," + epsilon(ty) + "px)" + getCameraCSSMatrix(camera.matrixWorldInverse) : `scale( ${scaleByViewOffset} )translateZ(` + fov + "px)" + getCameraCSSMatrix(camera.matrixWorldInverse);
90
- const style = cameraCSSMatrix + "translate(" + _widthHalf + "px," + _heightHalf + "px)";
86
+ const perspective = camera.isPerspectiveCamera ? "perspective(" + fov + "px) " : "";
87
+ const style = perspective + cameraCSSMatrix + "translate(" + _widthHalf + "px," + _heightHalf + "px)";
91
88
  if (cache.camera.style !== style) {
92
89
  cameraElement.style.transform = style;
93
90
  cache.camera.style = style;
@@ -1 +1 @@
1
- {"version":3,"file":"CSS3DRenderer.js","sources":["../../src/renderers/CSS3DRenderer.js"],"sourcesContent":["import { Matrix4, Object3D, Quaternion, Vector3 } from 'three'\n\n/**\n * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n */\n\nconst _position = new Vector3()\nconst _quaternion = new Quaternion()\nconst _scale = new Vector3()\n\nclass CSS3DObject extends Object3D {\n constructor(element = document.createElement('div')) {\n super()\n\n this.isCSS3DObject = true\n\n this.element = element\n this.element.style.position = 'absolute'\n this.element.style.pointerEvents = 'auto'\n this.element.style.userSelect = 'none'\n\n this.element.setAttribute('draggable', false)\n\n this.addEventListener('removed', function () {\n this.traverse(function (object) {\n if (object.element instanceof Element && object.element.parentNode !== null) {\n object.element.parentNode.removeChild(object.element)\n }\n })\n })\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.element = source.element.cloneNode(true)\n\n return this\n }\n}\n\nclass CSS3DSprite extends CSS3DObject {\n constructor(element) {\n super(element)\n\n this.isCSS3DSprite = true\n\n this.rotation2D = 0\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.rotation2D = source.rotation2D\n\n return this\n }\n}\n\n//\n\nconst _matrix = new Matrix4()\nconst _matrix2 = new Matrix4()\n\nclass CSS3DRenderer {\n constructor(parameters = {}) {\n const _this = this\n\n let _width, _height\n let _widthHalf, _heightHalf\n\n const cache = {\n camera: { fov: 0, style: '' },\n objects: new WeakMap(),\n }\n\n const domElement = parameters.element !== undefined ? parameters.element : document.createElement('div')\n\n domElement.style.overflow = 'hidden'\n\n this.domElement = domElement\n\n const viewElement = document.createElement('div')\n viewElement.style.transformOrigin = '0 0'\n viewElement.style.pointerEvents = 'none'\n domElement.appendChild(viewElement)\n\n const cameraElement = document.createElement('div')\n\n cameraElement.style.transformStyle = 'preserve-3d'\n\n viewElement.appendChild(cameraElement)\n\n this.getSize = function () {\n return {\n width: _width,\n height: _height,\n }\n }\n\n this.render = function (scene, camera) {\n const fov = camera.projectionMatrix.elements[5] * _heightHalf\n\n if (cache.camera.fov !== fov) {\n viewElement.style.perspective = camera.isPerspectiveCamera ? fov + 'px' : ''\n cache.camera.fov = fov\n }\n\n if (camera.view && camera.view.enabled) {\n // view offset\n viewElement.style.transform = `translate( ${-camera.view.offsetX * (_width / camera.view.width)}px, ${\n -camera.view.offsetY * (_height / camera.view.height)\n }px )`\n\n // view fullWidth and fullHeight, view width and height\n viewElement.style.transform += `scale( ${camera.view.fullWidth / camera.view.width}, ${\n camera.view.fullHeight / camera.view.height\n } )`\n } else {\n viewElement.style.transform = ''\n }\n\n if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld()\n if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld()\n\n let tx, ty\n\n if (camera.isOrthographicCamera) {\n tx = -(camera.right + camera.left) / 2\n ty = (camera.top + camera.bottom) / 2\n }\n\n const scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1\n const cameraCSSMatrix = camera.isOrthographicCamera\n ? `scale( ${scaleByViewOffset} )` +\n 'scale(' +\n fov +\n ')' +\n 'translate(' +\n epsilon(tx) +\n 'px,' +\n epsilon(ty) +\n 'px)' +\n getCameraCSSMatrix(camera.matrixWorldInverse)\n : `scale( ${scaleByViewOffset} )` + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse)\n\n const style = cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'\n\n if (cache.camera.style !== style) {\n cameraElement.style.transform = style\n\n cache.camera.style = style\n }\n\n renderObject(scene, scene, camera, cameraCSSMatrix)\n }\n\n this.setSize = function (width, height) {\n _width = width\n _height = height\n _widthHalf = _width / 2\n _heightHalf = _height / 2\n\n domElement.style.width = width + 'px'\n domElement.style.height = height + 'px'\n\n viewElement.style.width = width + 'px'\n viewElement.style.height = height + 'px'\n\n cameraElement.style.width = width + 'px'\n cameraElement.style.height = height + 'px'\n }\n\n function epsilon(value) {\n return Math.abs(value) < 1e-10 ? 0 : value\n }\n\n function getCameraCSSMatrix(matrix) {\n const elements = matrix.elements\n\n return (\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(-elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(elements[6]) +\n ',' +\n epsilon(elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(-elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(-elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n )\n }\n\n function getObjectCSSMatrix(matrix) {\n const elements = matrix.elements\n const matrix3d =\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(-elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(-elements[6]) +\n ',' +\n epsilon(-elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n\n return 'translate(-50%,-50%)' + matrix3d\n }\n\n function renderObject(object, scene, camera, cameraCSSMatrix) {\n if (object.isCSS3DObject) {\n const visible = object.visible === true && object.layers.test(camera.layers) === true\n object.element.style.display = visible === true ? '' : 'none'\n\n if (visible === true) {\n object.onBeforeRender(_this, scene, camera)\n\n let style\n\n if (object.isCSS3DSprite) {\n // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n _matrix.copy(camera.matrixWorldInverse)\n _matrix.transpose()\n\n if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D))\n\n object.matrixWorld.decompose(_position, _quaternion, _scale)\n _matrix.setPosition(_position)\n _matrix.scale(_scale)\n\n _matrix.elements[3] = 0\n _matrix.elements[7] = 0\n _matrix.elements[11] = 0\n _matrix.elements[15] = 1\n\n style = getObjectCSSMatrix(_matrix)\n } else {\n style = getObjectCSSMatrix(object.matrixWorld)\n }\n\n const element = object.element\n const cachedObject = cache.objects.get(object)\n\n if (cachedObject === undefined || cachedObject.style !== style) {\n element.style.transform = style\n\n const objectData = { style: style }\n cache.objects.set(object, objectData)\n }\n\n if (element.parentNode !== cameraElement) {\n cameraElement.appendChild(element)\n }\n\n object.onAfterRender(_this, scene, camera)\n }\n }\n\n for (let i = 0, l = object.children.length; i < l; i++) {\n renderObject(object.children[i], scene, camera, cameraCSSMatrix)\n }\n }\n }\n}\n\nexport { CSS3DObject, CSS3DSprite, CSS3DRenderer }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CSS3DRenderer.js","sources":["../../src/renderers/CSS3DRenderer.js"],"sourcesContent":["import { Matrix4, Object3D, Quaternion, Vector3 } from 'three'\n\n/**\n * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n */\n\nconst _position = new Vector3()\nconst _quaternion = new Quaternion()\nconst _scale = new Vector3()\n\nclass CSS3DObject extends Object3D {\n constructor(element = document.createElement('div')) {\n super()\n\n this.isCSS3DObject = true\n\n this.element = element\n this.element.style.position = 'absolute'\n this.element.style.pointerEvents = 'auto'\n this.element.style.userSelect = 'none'\n\n this.element.setAttribute('draggable', false)\n\n this.addEventListener('removed', function () {\n this.traverse(function (object) {\n if (object.element instanceof Element && object.element.parentNode !== null) {\n object.element.parentNode.removeChild(object.element)\n }\n })\n })\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.element = source.element.cloneNode(true)\n\n return this\n }\n}\n\nclass CSS3DSprite extends CSS3DObject {\n constructor(element) {\n super(element)\n\n this.isCSS3DSprite = true\n\n this.rotation2D = 0\n }\n\n copy(source, recursive) {\n super.copy(source, recursive)\n\n this.rotation2D = source.rotation2D\n\n return this\n }\n}\n\n//\n\nconst _matrix = new Matrix4()\nconst _matrix2 = new Matrix4()\n\nclass CSS3DRenderer {\n constructor(parameters = {}) {\n const _this = this\n\n let _width, _height\n let _widthHalf, _heightHalf\n\n const cache = {\n camera: { style: '' },\n objects: new WeakMap(),\n }\n\n const domElement = parameters.element !== undefined ? parameters.element : document.createElement('div')\n\n domElement.style.overflow = 'hidden'\n\n this.domElement = domElement\n\n const viewElement = document.createElement('div')\n viewElement.style.transformOrigin = '0 0'\n viewElement.style.pointerEvents = 'none'\n domElement.appendChild(viewElement)\n\n const cameraElement = document.createElement('div')\n\n cameraElement.style.transformStyle = 'preserve-3d'\n\n viewElement.appendChild(cameraElement)\n\n this.getSize = function () {\n return {\n width: _width,\n height: _height,\n }\n }\n\n this.render = function (scene, camera) {\n const fov = camera.projectionMatrix.elements[5] * _heightHalf\n\n if (camera.view && camera.view.enabled) {\n // view offset\n viewElement.style.transform = `translate( ${-camera.view.offsetX * (_width / camera.view.width)}px, ${\n -camera.view.offsetY * (_height / camera.view.height)\n }px )`\n\n // view fullWidth and fullHeight, view width and height\n viewElement.style.transform += `scale( ${camera.view.fullWidth / camera.view.width}, ${\n camera.view.fullHeight / camera.view.height\n } )`\n } else {\n viewElement.style.transform = ''\n }\n\n if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld()\n if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld()\n\n let tx, ty\n\n if (camera.isOrthographicCamera) {\n tx = -(camera.right + camera.left) / 2\n ty = (camera.top + camera.bottom) / 2\n }\n\n const scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1\n const cameraCSSMatrix = camera.isOrthographicCamera\n ? `scale( ${scaleByViewOffset} )` +\n 'scale(' +\n fov +\n ')' +\n 'translate(' +\n epsilon(tx) +\n 'px,' +\n epsilon(ty) +\n 'px)' +\n getCameraCSSMatrix(camera.matrixWorldInverse)\n : `scale( ${scaleByViewOffset} )` + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse)\n const perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : ''\n\n const style = perspective + cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'\n\n if (cache.camera.style !== style) {\n cameraElement.style.transform = style\n\n cache.camera.style = style\n }\n\n renderObject(scene, scene, camera, cameraCSSMatrix)\n }\n\n this.setSize = function (width, height) {\n _width = width\n _height = height\n _widthHalf = _width / 2\n _heightHalf = _height / 2\n\n domElement.style.width = width + 'px'\n domElement.style.height = height + 'px'\n\n viewElement.style.width = width + 'px'\n viewElement.style.height = height + 'px'\n\n cameraElement.style.width = width + 'px'\n cameraElement.style.height = height + 'px'\n }\n\n function epsilon(value) {\n return Math.abs(value) < 1e-10 ? 0 : value\n }\n\n function getCameraCSSMatrix(matrix) {\n const elements = matrix.elements\n\n return (\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(-elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(elements[6]) +\n ',' +\n epsilon(elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(-elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(-elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n )\n }\n\n function getObjectCSSMatrix(matrix) {\n const elements = matrix.elements\n const matrix3d =\n 'matrix3d(' +\n epsilon(elements[0]) +\n ',' +\n epsilon(elements[1]) +\n ',' +\n epsilon(elements[2]) +\n ',' +\n epsilon(elements[3]) +\n ',' +\n epsilon(-elements[4]) +\n ',' +\n epsilon(-elements[5]) +\n ',' +\n epsilon(-elements[6]) +\n ',' +\n epsilon(-elements[7]) +\n ',' +\n epsilon(elements[8]) +\n ',' +\n epsilon(elements[9]) +\n ',' +\n epsilon(elements[10]) +\n ',' +\n epsilon(elements[11]) +\n ',' +\n epsilon(elements[12]) +\n ',' +\n epsilon(elements[13]) +\n ',' +\n epsilon(elements[14]) +\n ',' +\n epsilon(elements[15]) +\n ')'\n\n return 'translate(-50%,-50%)' + matrix3d\n }\n\n function renderObject(object, scene, camera, cameraCSSMatrix) {\n if (object.isCSS3DObject) {\n const visible = object.visible === true && object.layers.test(camera.layers) === true\n object.element.style.display = visible === true ? '' : 'none'\n\n if (visible === true) {\n object.onBeforeRender(_this, scene, camera)\n\n let style\n\n if (object.isCSS3DSprite) {\n // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n _matrix.copy(camera.matrixWorldInverse)\n _matrix.transpose()\n\n if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D))\n\n object.matrixWorld.decompose(_position, _quaternion, _scale)\n _matrix.setPosition(_position)\n _matrix.scale(_scale)\n\n _matrix.elements[3] = 0\n _matrix.elements[7] = 0\n _matrix.elements[11] = 0\n _matrix.elements[15] = 1\n\n style = getObjectCSSMatrix(_matrix)\n } else {\n style = getObjectCSSMatrix(object.matrixWorld)\n }\n\n const element = object.element\n const cachedObject = cache.objects.get(object)\n\n if (cachedObject === undefined || cachedObject.style !== style) {\n element.style.transform = style\n\n const objectData = { style: style }\n cache.objects.set(object, objectData)\n }\n\n if (element.parentNode !== cameraElement) {\n cameraElement.appendChild(element)\n }\n\n object.onAfterRender(_this, scene, camera)\n }\n }\n\n for (let i = 0, l = object.children.length; i < l; i++) {\n renderObject(object.children[i], scene, camera, cameraCSSMatrix)\n }\n }\n }\n}\n\nexport { CSS3DObject, CSS3DSprite, CSS3DRenderer }\n"],"names":[],"mappings":";AAMA,MAAM,YAAY,IAAI,QAAS;AAC/B,MAAM,cAAc,IAAI,WAAY;AACpC,MAAM,SAAS,IAAI,QAAS;AAE5B,MAAM,oBAAoB,SAAS;AAAA,EACjC,YAAY,UAAU,SAAS,cAAc,KAAK,GAAG;AACnD,UAAO;AAEP,SAAK,gBAAgB;AAErB,SAAK,UAAU;AACf,SAAK,QAAQ,MAAM,WAAW;AAC9B,SAAK,QAAQ,MAAM,gBAAgB;AACnC,SAAK,QAAQ,MAAM,aAAa;AAEhC,SAAK,QAAQ,aAAa,aAAa,KAAK;AAE5C,SAAK,iBAAiB,WAAW,WAAY;AAC3C,WAAK,SAAS,SAAU,QAAQ;AAC9B,YAAI,OAAO,mBAAmB,WAAW,OAAO,QAAQ,eAAe,MAAM;AAC3E,iBAAO,QAAQ,WAAW,YAAY,OAAO,OAAO;AAAA,QACrD;AAAA,MACT,CAAO;AAAA,IACP,CAAK;AAAA,EACF;AAAA,EAED,KAAK,QAAQ,WAAW;AACtB,UAAM,KAAK,QAAQ,SAAS;AAE5B,SAAK,UAAU,OAAO,QAAQ,UAAU,IAAI;AAE5C,WAAO;AAAA,EACR;AACH;AAEA,MAAM,oBAAoB,YAAY;AAAA,EACpC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,gBAAgB;AAErB,SAAK,aAAa;AAAA,EACnB;AAAA,EAED,KAAK,QAAQ,WAAW;AACtB,UAAM,KAAK,QAAQ,SAAS;AAE5B,SAAK,aAAa,OAAO;AAEzB,WAAO;AAAA,EACR;AACH;AAIA,MAAM,UAAU,IAAI,QAAS;AAC7B,MAAM,WAAW,IAAI,QAAS;AAE9B,MAAM,cAAc;AAAA,EAClB,YAAY,aAAa,IAAI;AAC3B,UAAM,QAAQ;AAEd,QAAI,QAAQ;AACZ,QAAI,YAAY;AAEhB,UAAM,QAAQ;AAAA,MACZ,QAAQ,EAAE,OAAO,GAAI;AAAA,MACrB,SAAS,oBAAI,QAAS;AAAA,IACvB;AAED,UAAM,aAAa,WAAW,YAAY,SAAY,WAAW,UAAU,SAAS,cAAc,KAAK;AAEvG,eAAW,MAAM,WAAW;AAE5B,SAAK,aAAa;AAElB,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,MAAM,kBAAkB;AACpC,gBAAY,MAAM,gBAAgB;AAClC,eAAW,YAAY,WAAW;AAElC,UAAM,gBAAgB,SAAS,cAAc,KAAK;AAElD,kBAAc,MAAM,iBAAiB;AAErC,gBAAY,YAAY,aAAa;AAErC,SAAK,UAAU,WAAY;AACzB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,IACF;AAED,SAAK,SAAS,SAAU,OAAO,QAAQ;AACrC,YAAM,MAAM,OAAO,iBAAiB,SAAS,CAAC,IAAI;AAElD,UAAI,OAAO,QAAQ,OAAO,KAAK,SAAS;AAEtC,oBAAY,MAAM,YAAY,cAAc,CAAC,OAAO,KAAK,WAAW,SAAS,OAAO,KAAK,aACvF,CAAC,OAAO,KAAK,WAAW,UAAU,OAAO,KAAK;AAIhD,oBAAY,MAAM,aAAa,UAAU,OAAO,KAAK,YAAY,OAAO,KAAK,UAC3E,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA,MAE/C,OAAa;AACL,oBAAY,MAAM,YAAY;AAAA,MAC/B;AAED,UAAI,MAAM,0BAA0B;AAAM,cAAM,kBAAmB;AACnE,UAAI,OAAO,WAAW,QAAQ,OAAO,0BAA0B;AAAM,eAAO,kBAAmB;AAE/F,UAAI,IAAI;AAER,UAAI,OAAO,sBAAsB;AAC/B,aAAK,EAAE,OAAO,QAAQ,OAAO,QAAQ;AACrC,cAAM,OAAO,MAAM,OAAO,UAAU;AAAA,MACrC;AAED,YAAM,oBAAoB,OAAO,QAAQ,OAAO,KAAK,UAAU,OAAO,KAAK,SAAS,OAAO,KAAK,aAAa;AAC7G,YAAM,kBAAkB,OAAO,uBAC3B,UAAU,8BAEV,MACA,gBAEA,QAAQ,EAAE,IACV,QACA,QAAQ,EAAE,IACV,QACA,mBAAmB,OAAO,kBAAkB,IAC5C,UAAU,mCAAwC,MAAM,QAAQ,mBAAmB,OAAO,kBAAkB;AAChH,YAAM,cAAc,OAAO,sBAAsB,iBAAiB,MAAM,SAAS;AAEjF,YAAM,QAAQ,cAAc,kBAAkB,eAAe,aAAa,QAAQ,cAAc;AAEhG,UAAI,MAAM,OAAO,UAAU,OAAO;AAChC,sBAAc,MAAM,YAAY;AAEhC,cAAM,OAAO,QAAQ;AAAA,MACtB;AAED,mBAAa,OAAO,OAAO,MAAuB;AAAA,IACnD;AAED,SAAK,UAAU,SAAU,OAAO,QAAQ;AACtC,eAAS;AACT,gBAAU;AACV,mBAAa,SAAS;AACtB,oBAAc,UAAU;AAExB,iBAAW,MAAM,QAAQ,QAAQ;AACjC,iBAAW,MAAM,SAAS,SAAS;AAEnC,kBAAY,MAAM,QAAQ,QAAQ;AAClC,kBAAY,MAAM,SAAS,SAAS;AAEpC,oBAAc,MAAM,QAAQ,QAAQ;AACpC,oBAAc,MAAM,SAAS,SAAS;AAAA,IACvC;AAED,aAAS,QAAQ,OAAO;AACtB,aAAO,KAAK,IAAI,KAAK,IAAI,QAAQ,IAAI;AAAA,IACtC;AAED,aAAS,mBAAmB,QAAQ;AAClC,YAAM,WAAW,OAAO;AAExB,aACE,cACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,EAAE,CAAC,IACrB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB;AAAA,IAEH;AAED,aAAS,mBAAmB,QAAQ;AAClC,YAAM,WAAW,OAAO;AACxB,YAAM,WACJ,cACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,CAAC,SAAS,CAAC,CAAC,IACpB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,CAAC,CAAC,IACnB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB,MACA,QAAQ,SAAS,EAAE,CAAC,IACpB;AAEF,aAAO,yBAAyB;AAAA,IACjC;AAED,aAAS,aAAa,QAAQ,OAAO,QAAQ,iBAAiB;AAC5D,UAAI,OAAO,eAAe;AACxB,cAAM,UAAU,OAAO,YAAY,QAAQ,OAAO,OAAO,KAAK,OAAO,MAAM,MAAM;AACjF,eAAO,QAAQ,MAAM,UAAU,YAAY,OAAO,KAAK;AAEvD,YAAI,YAAY,MAAM;AACpB,iBAAO,eAAe,OAAO,OAAO,MAAM;AAE1C,cAAI;AAEJ,cAAI,OAAO,eAAe;AAGxB,oBAAQ,KAAK,OAAO,kBAAkB;AACtC,oBAAQ,UAAW;AAEnB,gBAAI,OAAO,eAAe;AAAG,sBAAQ,SAAS,SAAS,cAAc,OAAO,UAAU,CAAC;AAEvF,mBAAO,YAAY,UAAU,WAAW,aAAa,MAAM;AAC3D,oBAAQ,YAAY,SAAS;AAC7B,oBAAQ,MAAM,MAAM;AAEpB,oBAAQ,SAAS,CAAC,IAAI;AACtB,oBAAQ,SAAS,CAAC,IAAI;AACtB,oBAAQ,SAAS,EAAE,IAAI;AACvB,oBAAQ,SAAS,EAAE,IAAI;AAEvB,oBAAQ,mBAAmB,OAAO;AAAA,UAC9C,OAAiB;AACL,oBAAQ,mBAAmB,OAAO,WAAW;AAAA,UAC9C;AAED,gBAAM,UAAU,OAAO;AACvB,gBAAM,eAAe,MAAM,QAAQ,IAAI,MAAM;AAE7C,cAAI,iBAAiB,UAAa,aAAa,UAAU,OAAO;AAC9D,oBAAQ,MAAM,YAAY;AAE1B,kBAAM,aAAa,EAAE,MAAc;AACnC,kBAAM,QAAQ,IAAI,QAAQ,UAAU;AAAA,UACrC;AAED,cAAI,QAAQ,eAAe,eAAe;AACxC,0BAAc,YAAY,OAAO;AAAA,UAClC;AAED,iBAAO,cAAc,OAAO,OAAO,MAAM;AAAA,QAC1C;AAAA,MACF;AAED,eAAS,IAAI,GAAG,IAAI,OAAO,SAAS,QAAQ,IAAI,GAAG,KAAK;AACtD,qBAAa,OAAO,SAAS,CAAC,GAAG,OAAO,MAAuB;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACH;"}