three-stdlib
Version:
stand-alone library of threejs examples
1 lines • 34.3 kB
Source Map (JSON)
{"version":3,"file":"Projector.cjs","sources":["../../src/renderers/Projector.js"],"sourcesContent":["import { Box3, Color, DoubleSide, Frustum, Matrix3, Matrix4, Vector2, Vector3, Vector4 } from 'three'\n\nclass RenderableObject {\n constructor() {\n this.id = 0\n\n this.object = null\n this.z = 0\n this.renderOrder = 0\n }\n}\n\n//\n\nclass RenderableFace {\n constructor() {\n this.id = 0\n\n this.v1 = new RenderableVertex()\n this.v2 = new RenderableVertex()\n this.v3 = new RenderableVertex()\n\n this.normalModel = new Vector3()\n\n this.vertexNormalsModel = [new Vector3(), new Vector3(), new Vector3()]\n this.vertexNormalsLength = 0\n\n this.color = new Color()\n this.material = null\n this.uvs = [new Vector2(), new Vector2(), new Vector2()]\n\n this.z = 0\n this.renderOrder = 0\n }\n}\n\n//\n\nclass RenderableVertex {\n constructor() {\n this.position = new Vector3()\n this.positionWorld = new Vector3()\n this.positionScreen = new Vector4()\n\n this.visible = true\n }\n\n copy(vertex) {\n this.positionWorld.copy(vertex.positionWorld)\n this.positionScreen.copy(vertex.positionScreen)\n }\n}\n\n//\n\nclass RenderableLine {\n constructor() {\n this.id = 0\n\n this.v1 = new RenderableVertex()\n this.v2 = new RenderableVertex()\n\n this.vertexColors = [new Color(), new Color()]\n this.material = null\n\n this.z = 0\n this.renderOrder = 0\n }\n}\n\n//\n\nclass RenderableSprite {\n constructor() {\n this.id = 0\n\n this.object = null\n\n this.x = 0\n this.y = 0\n this.z = 0\n\n this.rotation = 0\n this.scale = new Vector2()\n\n this.material = null\n this.renderOrder = 0\n }\n}\n\n//\n\nclass Projector {\n constructor() {\n let _object,\n _objectCount,\n _objectPoolLength = 0,\n _vertex,\n _vertexCount,\n _vertexPoolLength = 0,\n _face,\n _faceCount,\n _facePoolLength = 0,\n _line,\n _lineCount,\n _linePoolLength = 0,\n _sprite,\n _spriteCount,\n _spritePoolLength = 0,\n _modelMatrix\n\n const _renderData = { objects: [], lights: [], elements: [] },\n _vector3 = new Vector3(),\n _vector4 = new Vector4(),\n _clipBox = new Box3(new Vector3(-1, -1, -1), new Vector3(1, 1, 1)),\n _boundingBox = new Box3(),\n _points3 = new Array(3),\n _viewMatrix = new Matrix4(),\n _viewProjectionMatrix = new Matrix4(),\n _modelViewProjectionMatrix = new Matrix4(),\n _frustum = new Frustum(),\n _objectPool = [],\n _vertexPool = [],\n _facePool = [],\n _linePool = [],\n _spritePool = []\n\n //\n\n function RenderList() {\n const normals = []\n const colors = []\n const uvs = []\n\n let object = null\n\n const normalMatrix = new Matrix3()\n\n function setObject(value) {\n object = value\n\n normalMatrix.getNormalMatrix(object.matrixWorld)\n\n normals.length = 0\n colors.length = 0\n uvs.length = 0\n }\n\n function projectVertex(vertex) {\n const position = vertex.position\n const positionWorld = vertex.positionWorld\n const positionScreen = vertex.positionScreen\n\n positionWorld.copy(position).applyMatrix4(_modelMatrix)\n positionScreen.copy(positionWorld).applyMatrix4(_viewProjectionMatrix)\n\n const invW = 1 / positionScreen.w\n\n positionScreen.x *= invW\n positionScreen.y *= invW\n positionScreen.z *= invW\n\n vertex.visible =\n positionScreen.x >= -1 &&\n positionScreen.x <= 1 &&\n positionScreen.y >= -1 &&\n positionScreen.y <= 1 &&\n positionScreen.z >= -1 &&\n positionScreen.z <= 1\n }\n\n function pushVertex(x, y, z) {\n _vertex = getNextVertexInPool()\n _vertex.position.set(x, y, z)\n\n projectVertex(_vertex)\n }\n\n function pushNormal(x, y, z) {\n normals.push(x, y, z)\n }\n\n function pushColor(r, g, b) {\n colors.push(r, g, b)\n }\n\n function pushUv(x, y) {\n uvs.push(x, y)\n }\n\n function checkTriangleVisibility(v1, v2, v3) {\n if (v1.visible === true || v2.visible === true || v3.visible === true) return true\n\n _points3[0] = v1.positionScreen\n _points3[1] = v2.positionScreen\n _points3[2] = v3.positionScreen\n\n return _clipBox.intersectsBox(_boundingBox.setFromPoints(_points3))\n }\n\n function checkBackfaceCulling(v1, v2, v3) {\n return (\n (v3.positionScreen.x - v1.positionScreen.x) * (v2.positionScreen.y - v1.positionScreen.y) -\n (v3.positionScreen.y - v1.positionScreen.y) * (v2.positionScreen.x - v1.positionScreen.x) <\n 0\n )\n }\n\n function pushLine(a, b) {\n const v1 = _vertexPool[a]\n const v2 = _vertexPool[b]\n\n // Clip\n\n v1.positionScreen.copy(v1.position).applyMatrix4(_modelViewProjectionMatrix)\n v2.positionScreen.copy(v2.position).applyMatrix4(_modelViewProjectionMatrix)\n\n if (clipLine(v1.positionScreen, v2.positionScreen) === true) {\n // Perform the perspective divide\n v1.positionScreen.multiplyScalar(1 / v1.positionScreen.w)\n v2.positionScreen.multiplyScalar(1 / v2.positionScreen.w)\n\n _line = getNextLineInPool()\n _line.id = object.id\n _line.v1.copy(v1)\n _line.v2.copy(v2)\n _line.z = Math.max(v1.positionScreen.z, v2.positionScreen.z)\n _line.renderOrder = object.renderOrder\n\n _line.material = object.material\n\n if (object.material.vertexColors) {\n _line.vertexColors[0].fromArray(colors, a * 3)\n _line.vertexColors[1].fromArray(colors, b * 3)\n }\n\n _renderData.elements.push(_line)\n }\n }\n\n function pushTriangle(a, b, c, material) {\n const v1 = _vertexPool[a]\n const v2 = _vertexPool[b]\n const v3 = _vertexPool[c]\n\n if (checkTriangleVisibility(v1, v2, v3) === false) return\n\n if (material.side === DoubleSide || checkBackfaceCulling(v1, v2, v3) === true) {\n _face = getNextFaceInPool()\n\n _face.id = object.id\n _face.v1.copy(v1)\n _face.v2.copy(v2)\n _face.v3.copy(v3)\n _face.z = (v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z) / 3\n _face.renderOrder = object.renderOrder\n\n // face normal\n _vector3.subVectors(v3.position, v2.position)\n _vector4.subVectors(v1.position, v2.position)\n _vector3.cross(_vector4)\n _face.normalModel.copy(_vector3)\n _face.normalModel.applyMatrix3(normalMatrix).normalize()\n\n for (let i = 0; i < 3; i++) {\n const normal = _face.vertexNormalsModel[i]\n normal.fromArray(normals, arguments[i] * 3)\n normal.applyMatrix3(normalMatrix).normalize()\n\n const uv = _face.uvs[i]\n uv.fromArray(uvs, arguments[i] * 2)\n }\n\n _face.vertexNormalsLength = 3\n\n _face.material = material\n\n if (material.vertexColors) {\n _face.color.fromArray(colors, a * 3)\n }\n\n _renderData.elements.push(_face)\n }\n }\n\n return {\n setObject: setObject,\n projectVertex: projectVertex,\n checkTriangleVisibility: checkTriangleVisibility,\n checkBackfaceCulling: checkBackfaceCulling,\n pushVertex: pushVertex,\n pushNormal: pushNormal,\n pushColor: pushColor,\n pushUv: pushUv,\n pushLine: pushLine,\n pushTriangle: pushTriangle,\n }\n }\n\n const renderList = new RenderList()\n\n function projectObject(object) {\n if (object.visible === false) return\n\n if (object.isLight) {\n _renderData.lights.push(object)\n } else if (object.isMesh || object.isLine || object.isPoints) {\n if (object.material.visible === false) return\n if (object.frustumCulled === true && _frustum.intersectsObject(object) === false) return\n\n addObject(object)\n } else if (object.isSprite) {\n if (object.material.visible === false) return\n if (object.frustumCulled === true && _frustum.intersectsSprite(object) === false) return\n\n addObject(object)\n }\n\n const children = object.children\n\n for (let i = 0, l = children.length; i < l; i++) {\n projectObject(children[i])\n }\n }\n\n function addObject(object) {\n _object = getNextObjectInPool()\n _object.id = object.id\n _object.object = object\n\n _vector3.setFromMatrixPosition(object.matrixWorld)\n _vector3.applyMatrix4(_viewProjectionMatrix)\n _object.z = _vector3.z\n _object.renderOrder = object.renderOrder\n\n _renderData.objects.push(_object)\n }\n\n this.projectScene = function (scene, camera, sortObjects, sortElements) {\n _faceCount = 0\n _lineCount = 0\n _spriteCount = 0\n\n _renderData.elements.length = 0\n\n if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld()\n if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld()\n\n _viewMatrix.copy(camera.matrixWorldInverse)\n _viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, _viewMatrix)\n\n _frustum.setFromProjectionMatrix(_viewProjectionMatrix)\n\n //\n\n _objectCount = 0\n\n _renderData.objects.length = 0\n _renderData.lights.length = 0\n\n projectObject(scene)\n\n if (sortObjects === true) {\n _renderData.objects.sort(painterSort)\n }\n\n //\n\n const objects = _renderData.objects\n\n for (let o = 0, ol = objects.length; o < ol; o++) {\n const object = objects[o].object\n const geometry = object.geometry\n\n renderList.setObject(object)\n\n _modelMatrix = object.matrixWorld\n\n _vertexCount = 0\n\n if (object.isMesh) {\n let material = object.material\n\n const isMultiMaterial = Array.isArray(material)\n\n const attributes = geometry.attributes\n const groups = geometry.groups\n\n if (attributes.position === undefined) continue\n\n const positions = attributes.position.array\n\n for (let i = 0, l = positions.length; i < l; i += 3) {\n let x = positions[i]\n let y = positions[i + 1]\n let z = positions[i + 2]\n\n const morphTargets = geometry.morphAttributes.position\n\n if (morphTargets !== undefined) {\n const morphTargetsRelative = geometry.morphTargetsRelative\n const morphInfluences = object.morphTargetInfluences\n\n for (let t = 0, tl = morphTargets.length; t < tl; t++) {\n const influence = morphInfluences[t]\n\n if (influence === 0) continue\n\n const target = morphTargets[t]\n\n if (morphTargetsRelative) {\n x += target.getX(i / 3) * influence\n y += target.getY(i / 3) * influence\n z += target.getZ(i / 3) * influence\n } else {\n x += (target.getX(i / 3) - positions[i]) * influence\n y += (target.getY(i / 3) - positions[i + 1]) * influence\n z += (target.getZ(i / 3) - positions[i + 2]) * influence\n }\n }\n }\n\n renderList.pushVertex(x, y, z)\n }\n\n if (attributes.normal !== undefined) {\n const normals = attributes.normal.array\n\n for (let i = 0, l = normals.length; i < l; i += 3) {\n renderList.pushNormal(normals[i], normals[i + 1], normals[i + 2])\n }\n }\n\n if (attributes.color !== undefined) {\n const colors = attributes.color.array\n\n for (let i = 0, l = colors.length; i < l; i += 3) {\n renderList.pushColor(colors[i], colors[i + 1], colors[i + 2])\n }\n }\n\n if (attributes.uv !== undefined) {\n const uvs = attributes.uv.array\n\n for (let i = 0, l = uvs.length; i < l; i += 2) {\n renderList.pushUv(uvs[i], uvs[i + 1])\n }\n }\n\n if (geometry.index !== null) {\n const indices = geometry.index.array\n\n if (groups.length > 0) {\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]\n\n material = isMultiMaterial === true ? object.material[group.materialIndex] : object.material\n\n if (material === undefined) continue\n\n for (let i = group.start, l = group.start + group.count; i < l; i += 3) {\n renderList.pushTriangle(indices[i], indices[i + 1], indices[i + 2], material)\n }\n }\n } else {\n for (let i = 0, l = indices.length; i < l; i += 3) {\n renderList.pushTriangle(indices[i], indices[i + 1], indices[i + 2], material)\n }\n }\n } else {\n if (groups.length > 0) {\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]\n\n material = isMultiMaterial === true ? object.material[group.materialIndex] : object.material\n\n if (material === undefined) continue\n\n for (let i = group.start, l = group.start + group.count; i < l; i += 3) {\n renderList.pushTriangle(i, i + 1, i + 2, material)\n }\n }\n } else {\n for (let i = 0, l = positions.length / 3; i < l; i += 3) {\n renderList.pushTriangle(i, i + 1, i + 2, material)\n }\n }\n }\n } else if (object.isLine) {\n _modelViewProjectionMatrix.multiplyMatrices(_viewProjectionMatrix, _modelMatrix)\n\n const attributes = geometry.attributes\n\n if (attributes.position !== undefined) {\n const positions = attributes.position.array\n\n for (let i = 0, l = positions.length; i < l; i += 3) {\n renderList.pushVertex(positions[i], positions[i + 1], positions[i + 2])\n }\n\n if (attributes.color !== undefined) {\n const colors = attributes.color.array\n\n for (let i = 0, l = colors.length; i < l; i += 3) {\n renderList.pushColor(colors[i], colors[i + 1], colors[i + 2])\n }\n }\n\n if (geometry.index !== null) {\n const indices = geometry.index.array\n\n for (let i = 0, l = indices.length; i < l; i += 2) {\n renderList.pushLine(indices[i], indices[i + 1])\n }\n } else {\n const step = object.isLineSegments ? 2 : 1\n\n for (let i = 0, l = positions.length / 3 - 1; i < l; i += step) {\n renderList.pushLine(i, i + 1)\n }\n }\n }\n } else if (object.isPoints) {\n _modelViewProjectionMatrix.multiplyMatrices(_viewProjectionMatrix, _modelMatrix)\n\n const attributes = geometry.attributes\n\n if (attributes.position !== undefined) {\n const positions = attributes.position.array\n\n for (let i = 0, l = positions.length; i < l; i += 3) {\n _vector4.set(positions[i], positions[i + 1], positions[i + 2], 1)\n _vector4.applyMatrix4(_modelViewProjectionMatrix)\n\n pushPoint(_vector4, object, camera)\n }\n }\n } else if (object.isSprite) {\n object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld)\n _vector4.set(_modelMatrix.elements[12], _modelMatrix.elements[13], _modelMatrix.elements[14], 1)\n _vector4.applyMatrix4(_viewProjectionMatrix)\n\n pushPoint(_vector4, object, camera)\n }\n }\n\n if (sortElements === true) {\n _renderData.elements.sort(painterSort)\n }\n\n return _renderData\n }\n\n function pushPoint(_vector4, object, camera) {\n const invW = 1 / _vector4.w\n\n _vector4.z *= invW\n\n if (_vector4.z >= -1 && _vector4.z <= 1) {\n _sprite = getNextSpriteInPool()\n _sprite.id = object.id\n _sprite.x = _vector4.x * invW\n _sprite.y = _vector4.y * invW\n _sprite.z = _vector4.z\n _sprite.renderOrder = object.renderOrder\n _sprite.object = object\n\n _sprite.rotation = object.rotation\n\n _sprite.scale.x =\n object.scale.x *\n Math.abs(\n _sprite.x -\n (_vector4.x + camera.projectionMatrix.elements[0]) / (_vector4.w + camera.projectionMatrix.elements[12]),\n )\n _sprite.scale.y =\n object.scale.y *\n Math.abs(\n _sprite.y -\n (_vector4.y + camera.projectionMatrix.elements[5]) / (_vector4.w + camera.projectionMatrix.elements[13]),\n )\n\n _sprite.material = object.material\n\n _renderData.elements.push(_sprite)\n }\n }\n\n // Pools\n\n function getNextObjectInPool() {\n if (_objectCount === _objectPoolLength) {\n const object = new RenderableObject()\n _objectPool.push(object)\n _objectPoolLength++\n _objectCount++\n return object\n }\n\n return _objectPool[_objectCount++]\n }\n\n function getNextVertexInPool() {\n if (_vertexCount === _vertexPoolLength) {\n const vertex = new RenderableVertex()\n _vertexPool.push(vertex)\n _vertexPoolLength++\n _vertexCount++\n return vertex\n }\n\n return _vertexPool[_vertexCount++]\n }\n\n function getNextFaceInPool() {\n if (_faceCount === _facePoolLength) {\n const face = new RenderableFace()\n _facePool.push(face)\n _facePoolLength++\n _faceCount++\n return face\n }\n\n return _facePool[_faceCount++]\n }\n\n function getNextLineInPool() {\n if (_lineCount === _linePoolLength) {\n const line = new RenderableLine()\n _linePool.push(line)\n _linePoolLength++\n _lineCount++\n return line\n }\n\n return _linePool[_lineCount++]\n }\n\n function getNextSpriteInPool() {\n if (_spriteCount === _spritePoolLength) {\n const sprite = new RenderableSprite()\n _spritePool.push(sprite)\n _spritePoolLength++\n _spriteCount++\n return sprite\n }\n\n return _spritePool[_spriteCount++]\n }\n\n //\n\n function painterSort(a, b) {\n if (a.renderOrder !== b.renderOrder) {\n return a.renderOrder - b.renderOrder\n } else if (a.z !== b.z) {\n return b.z - a.z\n } else if (a.id !== b.id) {\n return a.id - b.id\n } else {\n return 0\n }\n }\n\n function clipLine(s1, s2) {\n let alpha1 = 0,\n alpha2 = 1\n\n // Calculate the boundary coordinate of each vertex for the near and far clip planes,\n // Z = -1 and Z = +1, respectively.\n\n const bc1near = s1.z + s1.w,\n bc2near = s2.z + s2.w,\n bc1far = -s1.z + s1.w,\n bc2far = -s2.z + s2.w\n\n if (bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0) {\n // Both vertices lie entirely within all clip planes.\n return true\n } else if ((bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0)) {\n // Both vertices lie entirely outside one of the clip planes.\n return false\n } else {\n // The line segment spans at least one clip plane.\n\n if (bc1near < 0) {\n // v1 lies outside the near plane, v2 inside\n alpha1 = Math.max(alpha1, bc1near / (bc1near - bc2near))\n } else if (bc2near < 0) {\n // v2 lies outside the near plane, v1 inside\n alpha2 = Math.min(alpha2, bc1near / (bc1near - bc2near))\n }\n\n if (bc1far < 0) {\n // v1 lies outside the far plane, v2 inside\n alpha1 = Math.max(alpha1, bc1far / (bc1far - bc2far))\n } else if (bc2far < 0) {\n // v2 lies outside the far plane, v2 inside\n alpha2 = Math.min(alpha2, bc1far / (bc1far - bc2far))\n }\n\n if (alpha2 < alpha1) {\n // The line segment spans two boundaries, but is outside both of them.\n // (This can't happen when we're only clipping against just near/far but good\n // to leave the check here for future usage if other clip planes are added.)\n return false\n } else {\n // Update the s1 and s2 vertices to match the clipped line segment.\n s1.lerp(s2, alpha1)\n s2.lerp(s1, 1 - alpha2)\n\n return true\n }\n }\n }\n }\n}\n\nexport { RenderableObject, RenderableFace, RenderableVertex, RenderableLine, RenderableSprite, Projector }\n"],"names":["Vector3","Color","Vector2","Vector4","Box3","Matrix4","Frustum","Matrix3","DoubleSide","_vector4"],"mappings":"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"}