{"version":3,"file":"SVGRenderer.cjs","sources":["../../src/renderers/SVGRenderer.js"],"sourcesContent":["import { Box2, Camera, Color, Matrix3, Matrix4, Object3D, Vector3 } from 'three'\nimport { Projector, RenderableFace, RenderableLine, RenderableSprite } from '../renderers/Projector'\n\nclass SVGObject extends Object3D {\n  constructor(node) {\n    super()\n\n    this.isSVGObject = true\n\n    this.node = node\n  }\n}\n\nclass SVGRenderer {\n  constructor() {\n    let _renderData,\n      _elements,\n      _lights,\n      _svgWidth,\n      _svgHeight,\n      _svgWidthHalf,\n      _svgHeightHalf,\n      _v1,\n      _v2,\n      _v3,\n      _svgNode,\n      _pathCount = 0,\n      _precision = null,\n      _quality = 1,\n      _currentPath,\n      _currentStyle\n\n    const _this = this,\n      _clipBox = new Box2(),\n      _elemBox = new Box2(),\n      _color = new Color(),\n      _diffuseColor = new Color(),\n      _ambientLight = new Color(),\n      _directionalLights = new Color(),\n      _pointLights = new Color(),\n      _clearColor = new Color(),\n      _vector3 = new Vector3(), // Needed for PointLight\n      _centroid = new Vector3(),\n      _normal = new Vector3(),\n      _normalViewMatrix = new Matrix3(),\n      _viewMatrix = new Matrix4(),\n      _viewProjectionMatrix = new Matrix4(),\n      _svgPathPool = [],\n      _projector = new Projector(),\n      _svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\n    this.domElement = _svg\n\n    this.autoClear = true\n    this.sortObjects = true\n    this.sortElements = true\n\n    this.overdraw = 0.5\n\n    this.info = {\n      render: {\n        vertices: 0,\n        faces: 0,\n      },\n    }\n\n    this.setQuality = function (quality) {\n      switch (quality) {\n        case 'high':\n          _quality = 1\n          break\n        case 'low':\n          _quality = 0\n          break\n      }\n    }\n\n    this.setClearColor = function (color) {\n      _clearColor.set(color)\n    }\n\n    this.setPixelRatio = function () {}\n\n    this.setSize = function (width, height) {\n      _svgWidth = width\n      _svgHeight = height\n      _svgWidthHalf = _svgWidth / 2\n      _svgHeightHalf = _svgHeight / 2\n\n      _svg.setAttribute('viewBox', -_svgWidthHalf + ' ' + -_svgHeightHalf + ' ' + _svgWidth + ' ' + _svgHeight)\n      _svg.setAttribute('width', _svgWidth)\n      _svg.setAttribute('height', _svgHeight)\n\n      _clipBox.min.set(-_svgWidthHalf, -_svgHeightHalf)\n      _clipBox.max.set(_svgWidthHalf, _svgHeightHalf)\n    }\n\n    this.getSize = function () {\n      return {\n        width: _svgWidth,\n        height: _svgHeight,\n      }\n    }\n\n    this.setPrecision = function (precision) {\n      _precision = precision\n    }\n\n    function removeChildNodes() {\n      _pathCount = 0\n\n      while (_svg.childNodes.length > 0) {\n        _svg.removeChild(_svg.childNodes[0])\n      }\n    }\n\n    function convert(c) {\n      return _precision !== null ? c.toFixed(_precision) : c\n    }\n\n    this.clear = function () {\n      removeChildNodes()\n      _svg.style.backgroundColor = _clearColor.getStyle()\n    }\n\n    this.render = function (scene, camera) {\n      if (camera instanceof Camera === false) {\n        console.error('THREE.SVGRenderer.render: camera is not an instance of Camera.')\n        return\n      }\n\n      const background = scene.background\n\n      if (background && background.isColor) {\n        removeChildNodes()\n        _svg.style.backgroundColor = background.getStyle()\n      } else if (this.autoClear === true) {\n        this.clear()\n      }\n\n      _this.info.render.vertices = 0\n      _this.info.render.faces = 0\n\n      _viewMatrix.copy(camera.matrixWorldInverse)\n      _viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, _viewMatrix)\n\n      _renderData = _projector.projectScene(scene, camera, this.sortObjects, this.sortElements)\n      _elements = _renderData.elements\n      _lights = _renderData.lights\n\n      _normalViewMatrix.getNormalMatrix(camera.matrixWorldInverse)\n\n      calculateLights(_lights)\n\n      // reset accumulated path\n\n      _currentPath = ''\n      _currentStyle = ''\n\n      for (let e = 0, el = _elements.length; e < el; e++) {\n        const element = _elements[e]\n        const material = element.material\n\n        if (material === undefined || material.opacity === 0) continue\n\n        _elemBox.makeEmpty()\n\n        if (element instanceof RenderableSprite) {\n          _v1 = element\n          _v1.x *= _svgWidthHalf\n          _v1.y *= -_svgHeightHalf\n\n          renderSprite(_v1, element, material)\n        } else if (element instanceof RenderableLine) {\n          _v1 = element.v1\n          _v2 = element.v2\n\n          _v1.positionScreen.x *= _svgWidthHalf\n          _v1.positionScreen.y *= -_svgHeightHalf\n          _v2.positionScreen.x *= _svgWidthHalf\n          _v2.positionScreen.y *= -_svgHeightHalf\n\n          _elemBox.setFromPoints([_v1.positionScreen, _v2.positionScreen])\n\n          if (_clipBox.intersectsBox(_elemBox) === true) {\n            renderLine(_v1, _v2, material)\n          }\n        } else if (element instanceof RenderableFace) {\n          _v1 = element.v1\n          _v2 = element.v2\n          _v3 = element.v3\n\n          if (_v1.positionScreen.z < -1 || _v1.positionScreen.z > 1) continue\n          if (_v2.positionScreen.z < -1 || _v2.positionScreen.z > 1) continue\n          if (_v3.positionScreen.z < -1 || _v3.positionScreen.z > 1) continue\n\n          _v1.positionScreen.x *= _svgWidthHalf\n          _v1.positionScreen.y *= -_svgHeightHalf\n          _v2.positionScreen.x *= _svgWidthHalf\n          _v2.positionScreen.y *= -_svgHeightHalf\n          _v3.positionScreen.x *= _svgWidthHalf\n          _v3.positionScreen.y *= -_svgHeightHalf\n\n          if (this.overdraw > 0) {\n            expand(_v1.positionScreen, _v2.positionScreen, this.overdraw)\n            expand(_v2.positionScreen, _v3.positionScreen, this.overdraw)\n            expand(_v3.positionScreen, _v1.positionScreen, this.overdraw)\n          }\n\n          _elemBox.setFromPoints([_v1.positionScreen, _v2.positionScreen, _v3.positionScreen])\n\n          if (_clipBox.intersectsBox(_elemBox) === true) {\n            renderFace3(_v1, _v2, _v3, element, material)\n          }\n        }\n      }\n\n      flushPath() // just to flush last svg:path\n\n      scene.traverseVisible(function (object) {\n        if (object.isSVGObject) {\n          _vector3.setFromMatrixPosition(object.matrixWorld)\n          _vector3.applyMatrix4(_viewProjectionMatrix)\n\n          if (_vector3.z < -1 || _vector3.z > 1) return\n\n          const x = _vector3.x * _svgWidthHalf\n          const y = -_vector3.y * _svgHeightHalf\n\n          const node = object.node\n          node.setAttribute('transform', 'translate(' + x + ',' + y + ')')\n\n          _svg.appendChild(node)\n        }\n      })\n    }\n\n    function calculateLights(lights) {\n      _ambientLight.setRGB(0, 0, 0)\n      _directionalLights.setRGB(0, 0, 0)\n      _pointLights.setRGB(0, 0, 0)\n\n      for (let l = 0, ll = lights.length; l < ll; l++) {\n        const light = lights[l]\n        const lightColor = light.color\n\n        if (light.isAmbientLight) {\n          _ambientLight.r += lightColor.r\n          _ambientLight.g += lightColor.g\n          _ambientLight.b += lightColor.b\n        } else if (light.isDirectionalLight) {\n          _directionalLights.r += lightColor.r\n          _directionalLights.g += lightColor.g\n          _directionalLights.b += lightColor.b\n        } else if (light.isPointLight) {\n          _pointLights.r += lightColor.r\n          _pointLights.g += lightColor.g\n          _pointLights.b += lightColor.b\n        }\n      }\n    }\n\n    function calculateLight(lights, position, normal, color) {\n      for (let l = 0, ll = lights.length; l < ll; l++) {\n        const light = lights[l]\n        const lightColor = light.color\n\n        if (light.isDirectionalLight) {\n          const lightPosition = _vector3.setFromMatrixPosition(light.matrixWorld).normalize()\n\n          let amount = normal.dot(lightPosition)\n\n          if (amount <= 0) continue\n\n          amount *= light.intensity\n\n          color.r += lightColor.r * amount\n          color.g += lightColor.g * amount\n          color.b += lightColor.b * amount\n        } else if (light.isPointLight) {\n          const lightPosition = _vector3.setFromMatrixPosition(light.matrixWorld)\n\n          let amount = normal.dot(_vector3.subVectors(lightPosition, position).normalize())\n\n          if (amount <= 0) continue\n\n          amount *= light.distance == 0 ? 1 : 1 - Math.min(position.distanceTo(lightPosition) / light.distance, 1)\n\n          if (amount == 0) continue\n\n          amount *= light.intensity\n\n          color.r += lightColor.r * amount\n          color.g += lightColor.g * amount\n          color.b += lightColor.b * amount\n        }\n      }\n    }\n\n    function renderSprite(v1, element, material) {\n      let scaleX = element.scale.x * _svgWidthHalf\n      let scaleY = element.scale.y * _svgHeightHalf\n\n      if (material.isPointsMaterial) {\n        scaleX *= material.size\n        scaleY *= material.size\n      }\n\n      const path =\n        'M' +\n        convert(v1.x - scaleX * 0.5) +\n        ',' +\n        convert(v1.y - scaleY * 0.5) +\n        'h' +\n        convert(scaleX) +\n        'v' +\n        convert(scaleY) +\n        'h' +\n        convert(-scaleX) +\n        'z'\n      let style = ''\n\n      if (material.isSpriteMaterial || material.isPointsMaterial) {\n        style = 'fill:' + material.color.getStyle() + ';fill-opacity:' + material.opacity\n      }\n\n      addPath(style, path)\n    }\n\n    function renderLine(v1, v2, material) {\n      const path =\n        'M' +\n        convert(v1.positionScreen.x) +\n        ',' +\n        convert(v1.positionScreen.y) +\n        'L' +\n        convert(v2.positionScreen.x) +\n        ',' +\n        convert(v2.positionScreen.y)\n\n      if (material.isLineBasicMaterial) {\n        let style =\n          'fill:none;stroke:' +\n          material.color.getStyle() +\n          ';stroke-opacity:' +\n          material.opacity +\n          ';stroke-width:' +\n          material.linewidth +\n          ';stroke-linecap:' +\n          material.linecap\n\n        if (material.isLineDashedMaterial) {\n          style = style + ';stroke-dasharray:' + material.dashSize + ',' + material.gapSize\n        }\n\n        addPath(style, path)\n      }\n    }\n\n    function renderFace3(v1, v2, v3, element, material) {\n      _this.info.render.vertices += 3\n      _this.info.render.faces++\n\n      const path =\n        'M' +\n        convert(v1.positionScreen.x) +\n        ',' +\n        convert(v1.positionScreen.y) +\n        'L' +\n        convert(v2.positionScreen.x) +\n        ',' +\n        convert(v2.positionScreen.y) +\n        'L' +\n        convert(v3.positionScreen.x) +\n        ',' +\n        convert(v3.positionScreen.y) +\n        'z'\n      let style = ''\n\n      if (material.isMeshBasicMaterial) {\n        _color.copy(material.color)\n\n        if (material.vertexColors) {\n          _color.multiply(element.color)\n        }\n      } else if (material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial) {\n        _diffuseColor.copy(material.color)\n\n        if (material.vertexColors) {\n          _diffuseColor.multiply(element.color)\n        }\n\n        _color.copy(_ambientLight)\n\n        _centroid.copy(v1.positionWorld).add(v2.positionWorld).add(v3.positionWorld).divideScalar(3)\n\n        calculateLight(_lights, _centroid, element.normalModel, _color)\n\n        _color.multiply(_diffuseColor).add(material.emissive)\n      } else if (material.isMeshNormalMaterial) {\n        _normal.copy(element.normalModel).applyMatrix3(_normalViewMatrix).normalize()\n\n        _color.setRGB(_normal.x, _normal.y, _normal.z).multiplyScalar(0.5).addScalar(0.5)\n      }\n\n      if (material.wireframe) {\n        style =\n          'fill:none;stroke:' +\n          _color.getStyle() +\n          ';stroke-opacity:' +\n          material.opacity +\n          ';stroke-width:' +\n          material.wireframeLinewidth +\n          ';stroke-linecap:' +\n          material.wireframeLinecap +\n          ';stroke-linejoin:' +\n          material.wireframeLinejoin\n      } else {\n        style = 'fill:' + _color.getStyle() + ';fill-opacity:' + material.opacity\n      }\n\n      addPath(style, path)\n    }\n\n    // Hide anti-alias gaps\n\n    function expand(v1, v2, pixels) {\n      let x = v2.x - v1.x,\n        y = v2.y - v1.y\n      const det = x * x + y * y\n\n      if (det === 0) return\n\n      const idet = pixels / Math.sqrt(det)\n\n      x *= idet\n      y *= idet\n\n      v2.x += x\n      v2.y += y\n      v1.x -= x\n      v1.y -= y\n    }\n\n    function addPath(style, path) {\n      if (_currentStyle === style) {\n        _currentPath += path\n      } else {\n        flushPath()\n\n        _currentStyle = style\n        _currentPath = path\n      }\n    }\n\n    function flushPath() {\n      if (_currentPath) {\n        _svgNode = getPathNode(_pathCount++)\n        _svgNode.setAttribute('d', _currentPath)\n        _svgNode.setAttribute('style', _currentStyle)\n        _svg.appendChild(_svgNode)\n      }\n\n      _currentPath = ''\n      _currentStyle = ''\n    }\n\n    function getPathNode(id) {\n      if (_svgPathPool[id] == null) {\n        _svgPathPool[id] = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n        if (_quality == 0) {\n          _svgPathPool[id].setAttribute('shape-rendering', 'crispEdges') //optimizeSpeed\n        }\n\n        return _svgPathPool[id]\n      }\n\n      return _svgPathPool[id]\n    }\n  }\n}\n\nexport { SVGObject, SVGRenderer }\n"],"names":["Object3D","Box2","Color","Vector3","Matrix3","Matrix4","Projector","Camera","RenderableSprite","RenderableLine","RenderableFace"],"mappings":"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"}