1 line
20 KiB
Plaintext
1 line
20 KiB
Plaintext
|
|
{"version":3,"file":"OutlineEffect.cjs","sources":["../../src/effects/OutlineEffect.js"],"sourcesContent":["import { BackSide, Color, ShaderMaterial, UniformsLib, UniformsUtils } from 'three'\nimport { version } from '../_polyfill/constants'\n\n/**\n * Reference: https://en.wikipedia.org/wiki/Cel_shading\n *\n * API\n *\n * 1. Traditional\n *\n * const effect = new OutlineEffect( renderer );\n *\n * function render() {\n *\n * \teffect.render( scene, camera );\n *\n * }\n *\n * 2. VR compatible\n *\n * const effect = new OutlineEffect( renderer );\n * let renderingOutline = false;\n *\n * scene.onAfterRender = function () {\n *\n * \tif ( renderingOutline ) return;\n *\n * \trenderingOutline = true;\n *\n * \teffect.renderOutline( scene, camera );\n *\n * \trenderingOutline = false;\n *\n * };\n *\n * function render() {\n *\n * \trenderer.render( scene, camera );\n *\n * }\n *\n * // How to set default outline parameters\n * new OutlineEffect( renderer, {\n * \tdefaultThickness: 0.01,\n * \tdefaultColor: [ 0, 0, 0 ],\n * \tdefaultAlpha: 0.8,\n * \tdefaultKeepAlive: true // keeps outline material in cache even if material is removed from scene\n * } );\n *\n * // How to set outline parameters for each material\n * material.userData.outlineParameters = {\n * \tthickness: 0.01,\n * \tcolor: [ 0, 0, 0 ],\n * \talpha: 0.8,\n * \tvisible: true,\n * \tkeepAlive: true\n * };\n */\n\nclass OutlineEffect {\n constructor(renderer, parameters = {}) {\n this.enabled = true\n\n const defaultThickness = parameters.defaultThickness !== undefined ? parameters.defaultThickness : 0.003\n const defaultColor = new Color().fromArray(\n parameters.defaultColor !== undefined ? parameters.defaultColor : [0, 0, 0],\n )\n const defaultAlpha = parameters.defaultAlpha !== undefined ? parameters.defaultAlpha : 1.0\n const defaultKeepAlive = parameters.defaultKeepAlive !== undefined ? parameters.defaultKeepAlive : false\n\n // object.material.uuid -> outlineMaterial or\n // object.material[ n ].uuid -> outlineMaterial\n // save at the outline material creation and release\n // if it's unused removeThresholdCount frames\n // unless keepAlive is true.\n const cache = {}\n\n const removeThresholdCount = 60\n\n // outlineMaterial.uuid -> object.material or\n // outlineMaterial.uuid -> object.material[ n ]\n // save before render and release after render.\n const originalMaterials = {}\n\n // object.uuid -> originalOnBeforeRender\n // save before render and release after render.\n const originalOnBeforeRenders = {}\n\n //this.cache = cache; // for debug\n\n const uniformsOutline = {\n outlineThickness: { value: defaultThickness },\n outlineColor: { value: defaultColor },\n outlineAlpha: { value: defaultAlpha },\n }\n\n const vertexShader = [\n '#include <common>',\n '#include <uv_pars_vertex>',\n '#include <displacementmap_pars_vertex>',\n '#include <fog_pars_vertex>',\n '#include <morphtarget_pars_vertex>',\n '#include <skinning_pars_vertex>',\n '#include <logdepthbuf_pars_vertex>',\n '#include <clipping_planes_pars_vertex>',\n\n 'uniform float outlineThickness;',\n\n 'vec4 calculateOutline( vec4 pos, vec3 normal, vec4 skinned ) {',\n '\tfloat thickness = outlineThickness;',\n '\tconst float ratio = 1.0;', // TODO: support outline thickness ratio for each vertex\n '\tvec4 pos2 = projectionMatrix * modelViewMatrix * vec4( skinned.xyz + normal, 1.0 );',\n // NOTE: subtract pos2 from pos because BackSide objectNormal is negative\n '\tvec4 norm = normalize( pos - pos2 );',\n '\treturn pos + norm * thickness * pos.w * ratio;',\n '}',\n\n 'void main() {',\n\n '\t#include <uv_vertex>',\n\n '\t#include <beginnormal_vertex>',\n '\t#include <morphnormal_vertex>',\n '\t#include <skinbase_vertex>',\n '\t#include <skinnormal_vertex>',\n\n '\t#include <begin_vertex>',\n '\t#include <morphtarget_vertex>',\n '\t#include <skinning_vertex>',\n '\
|