troika-three-utils
Advanced tools
Comparing version 0.15.3 to 0.15.6
@@ -1,2 +0,2 @@ | ||
import { ShaderChunk, UniformsUtils, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, ShaderLib, DataTexture } from 'three'; | ||
import { ShaderChunk, UniformsUtils, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, ShaderLib, DataTexture, Vector3, MeshStandardMaterial, DoubleSide, Mesh, CylinderBufferGeometry, Vector2 } from 'three'; | ||
@@ -109,3 +109,3 @@ /** | ||
var privateBeforeCompileProp = "_onBeforeCompile" + id; | ||
var depthMaterial, distanceMaterial; | ||
var distanceMaterialTpl, depthMaterialTpl; | ||
@@ -181,11 +181,15 @@ // Private onBeforeCompile handler that injects the modified shaders and uniforms when | ||
*/ | ||
getDepthMaterial: {value: function value() { | ||
getDepthMaterial: {value: function() { | ||
var depthMaterial = this._depthMaterial; | ||
if (!depthMaterial) { | ||
depthMaterial = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDepthMaterial() | ||
: new MeshDepthMaterial({depthPacking: RGBADepthPacking}), | ||
options | ||
); | ||
depthMaterial.defines.IS_DEPTH_MATERIAL = ''; | ||
if (!depthMaterialTpl) { | ||
depthMaterialTpl = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDepthMaterial() | ||
: new MeshDepthMaterial({depthPacking: RGBADepthPacking}), | ||
options | ||
); | ||
depthMaterialTpl.defines.IS_DEPTH_MATERIAL = ''; | ||
} | ||
depthMaterial = this._depthMaterial = depthMaterialTpl.clone(); | ||
} | ||
@@ -199,11 +203,15 @@ return depthMaterial | ||
*/ | ||
getDistanceMaterial: {value: function value() { | ||
getDistanceMaterial: {value: function() { | ||
var distanceMaterial = this._distanceMaterial; | ||
if (!distanceMaterial) { | ||
distanceMaterial = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDistanceMaterial() | ||
: new MeshDistanceMaterial(), | ||
options | ||
); | ||
distanceMaterial.defines.IS_DISTANCE_MATERIAL = ''; | ||
if (!distanceMaterialTpl) { | ||
distanceMaterialTpl = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDistanceMaterial() | ||
: new MeshDistanceMaterial(), | ||
options | ||
); | ||
distanceMaterialTpl.defines.IS_DISTANCE_MATERIAL = ''; | ||
} | ||
distanceMaterial = this._distanceMaterial = distanceMaterialTpl.clone(); | ||
} | ||
@@ -597,2 +605,171 @@ return distanceMaterial | ||
export { ShaderFloatArray, createDerivedMaterial, expandShaderIncludes, getShaderUniformTypes, getShadersForMaterial, voidMainRegExp }; | ||
/* | ||
Input geometry is a cylinder with r=1, height in y dimension from 0 to 1, | ||
divided into a reasonable number of height segments. | ||
*/ | ||
var vertexDefs = "\nuniform vec3 pointA;\nuniform vec3 controlA;\nuniform vec3 controlB;\nuniform vec3 pointB;\nuniform float radius;\nvarying float bezierT;\n\nvec3 cubicBezier(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n float b0 = t2 * t2 * t2;\n float b1 = 3.0 * t * t2 * t2;\n float b2 = 3.0 * t * t * t2;\n float b3 = t * t * t;\n return b0 * p1 + b1 * c1 + b2 * c2 + b3 * p2;\n}\n\nvec3 cubicBezierDerivative(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n return -3.0 * p1 * t2 * t2 +\n c1 * (3.0 * t2 * t2 - 6.0 * t2 * t) +\n c2 * (6.0 * t2 * t - 3.0 * t * t) +\n 3.0 * p2 * t * t;\n}\n"; | ||
var vertexTransform = "\nfloat t = position.y;\nbezierT = t;\nvec3 bezierCenterPos = cubicBezier(pointA, controlA, controlB, pointB, t);\nvec3 bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t));\n\n// Make \"sideways\" always perpendicular to the camera ray; this ensures that any twists\n// in the cylinder occur where you won't see them: \nvec3 viewDirection = normalMatrix * vec3(0.0, 0.0, 1.0);\nif (bezierDir == viewDirection) {\n bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t == 1.0 ? t - 0.0001 : t + 0.0001));\n}\nvec3 sideways = normalize(cross(bezierDir, viewDirection));\nvec3 upish = normalize(cross(sideways, bezierDir));\n\n// Build a matrix for transforming this disc in the cylinder:\nmat4 discTx;\ndiscTx[0].xyz = sideways * radius;\ndiscTx[1].xyz = bezierDir * radius;\ndiscTx[2].xyz = upish * radius;\ndiscTx[3].xyz = bezierCenterPos;\ndiscTx[3][3] = 1.0;\n\n// Apply transform, ignoring original y\nposition = (discTx * vec4(position.x, 0.0, position.z, 1.0)).xyz;\nnormal = normalize(mat3(discTx) * normal);\n"; | ||
var fragmentDefs = "\nuniform vec3 dashing;\nvarying float bezierT;\n"; | ||
var fragmentMainIntro = "\nif (dashing.x + dashing.y > 0.0) {\n float dashFrac = mod(bezierT - dashing.z, dashing.x + dashing.y);\n if (dashFrac > dashing.x) {\n discard;\n }\n}\n"; | ||
// Debugging: separate color for each of the 6 sides: | ||
// const fragmentColorTransform = ` | ||
// float sideNum = floor(vUV.x * 6.0); | ||
// vec3 mixColor = sideNum < 1.0 ? vec3(1.0, 0.0, 0.0) : | ||
// sideNum < 2.0 ? vec3(0.0, 1.0, 1.0) : | ||
// sideNum < 3.0 ? vec3(1.0, 1.0, 0.0) : | ||
// sideNum < 4.0 ? vec3(0.0, 0.0, 1.0) : | ||
// sideNum < 5.0 ? vec3(0.0, 1.0, 0.0) : | ||
// vec3(1.0, 0.0, 1.0); | ||
// gl_FragColor.xyz = mix(gl_FragColor.xyz, mixColor, 0.5); | ||
// ` | ||
function createBezierMeshMaterial(baseMaterial) { | ||
return createDerivedMaterial( | ||
baseMaterial, | ||
{ | ||
uniforms: { | ||
pointA: {value: new Vector3()}, | ||
controlA: {value: new Vector3()}, | ||
controlB: {value: new Vector3()}, | ||
pointB: {value: new Vector3()}, | ||
radius: {value: 0.01}, | ||
dashing: {value: new Vector3()} //on, off, offset | ||
}, | ||
vertexDefs: vertexDefs, | ||
vertexTransform: vertexTransform, | ||
fragmentDefs: fragmentDefs, | ||
fragmentMainIntro: fragmentMainIntro | ||
} | ||
) | ||
} | ||
var geometry = null; | ||
var defaultBaseMaterial = new MeshStandardMaterial({color: 0xffffff, side: DoubleSide}); | ||
/** | ||
* A ThreeJS `Mesh` that bends a tube shape along a 3D cubic bezier path. The bending is done | ||
* by deforming a straight cylindrical geometry in the vertex shader based on a set of four | ||
* control point uniforms. It patches the necessary GLSL into the mesh's assigned `material` | ||
* automatically. | ||
* | ||
* The cubiz bezier path is determined by its four `Vector3` properties: | ||
* - `pointA` | ||
* - `controlA` | ||
* - `controlB` | ||
* - `pointB` | ||
* | ||
* The tube's radius is controlled by its `radius` property, which defaults to `0.01`. | ||
* | ||
* You can also give the tube a dashed appearance with two properties: | ||
* | ||
* - `dashArray` - an array of two numbers, defining the length of "on" and "off" parts of | ||
* the dash. Each is a 0-1 ratio of the entire path's length. (Actually this is the `t` length | ||
* used as input to the cubic bezier function, not its visible length.) | ||
* - `dashOffset` - offset of where the dash starts. You can animate this to make the dashes move. | ||
* | ||
* Note that the dashes will appear like a hollow tube, not solid. This will be more apparent on | ||
* thicker tubes. | ||
* | ||
* TODO: proper geometry bounding sphere and raycasting | ||
* TODO: allow control of the geometry's segment counts | ||
*/ | ||
var BezierMesh = (function (Mesh) { | ||
function BezierMesh() { | ||
Mesh.call( | ||
this, geometry || (geometry = | ||
new CylinderBufferGeometry(1, 1, 1, 6, 64).translate(0, 0.5, 0) | ||
), | ||
defaultBaseMaterial | ||
); | ||
this.pointA = new Vector3(); | ||
this.controlA = new Vector3(); | ||
this.controlB = new Vector3(); | ||
this.pointB = new Vector3(); | ||
this.radius = 0.01; | ||
this.dashArray = new Vector2(); | ||
this.dashOffset = 0; | ||
// TODO - disabling frustum culling until I figure out how to customize the | ||
// geometry's bounding sphere that gets used | ||
this.frustumCulled = false; | ||
} | ||
if ( Mesh ) BezierMesh.__proto__ = Mesh; | ||
BezierMesh.prototype = Object.create( Mesh && Mesh.prototype ); | ||
BezierMesh.prototype.constructor = BezierMesh; | ||
var prototypeAccessors = { material: { configurable: true },customDepthMaterial: { configurable: true },customDistanceMaterial: { configurable: true } }; | ||
// Handler for automatically wrapping the base material with our upgrades. We do the wrapping | ||
// lazily on _read_ rather than write to avoid unnecessary wrapping on transient values. | ||
prototypeAccessors.material.get = function () { | ||
var derivedMaterial = this._derivedMaterial; | ||
var baseMaterial = this._baseMaterial || defaultBaseMaterial; | ||
if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) { | ||
if (derivedMaterial) { | ||
derivedMaterial.dispose(); | ||
} | ||
derivedMaterial = this._derivedMaterial = createBezierMeshMaterial(baseMaterial); | ||
// dispose the derived material when its base material is disposed: | ||
baseMaterial.addEventListener('dispose', function onDispose() { | ||
baseMaterial.removeEventListener('dispose', onDispose); | ||
derivedMaterial.dispose(); | ||
}); | ||
} | ||
return derivedMaterial | ||
}; | ||
prototypeAccessors.material.set = function (baseMaterial) { | ||
this._baseMaterial = baseMaterial; | ||
}; | ||
// Create and update material for shadows upon request: | ||
prototypeAccessors.customDepthMaterial.get = function () { | ||
return this._updateBezierUniforms(this.material.getDepthMaterial()) | ||
}; | ||
prototypeAccessors.customDistanceMaterial.get = function () { | ||
return this._updateBezierUniforms(this.material.getDistanceMaterial()) | ||
}; | ||
BezierMesh.prototype.onBeforeRender = function onBeforeRender (shaderInfo) { | ||
this._updateBezierUniforms(this.material); | ||
}; | ||
BezierMesh.prototype._updateBezierUniforms = function _updateBezierUniforms (material) { | ||
var uniforms = material.uniforms; | ||
var ref = this; | ||
var pointA = ref.pointA; | ||
var controlA = ref.controlA; | ||
var controlB = ref.controlB; | ||
var pointB = ref.pointB; | ||
var radius = ref.radius; | ||
var dashArray = ref.dashArray; | ||
var dashOffset = ref.dashOffset; | ||
uniforms.pointA.value.copy(pointA); | ||
uniforms.controlA.value.copy(controlA); | ||
uniforms.controlB.value.copy(controlB); | ||
uniforms.pointB.value.copy(pointB); | ||
uniforms.radius.value = radius; | ||
uniforms.dashing.value.set(dashArray.x, dashArray.y, dashOffset || 0); | ||
return material | ||
}; | ||
BezierMesh.prototype.raycast = function raycast (raycaster, intersects) { | ||
// TODO - just fail for now | ||
}; | ||
Object.defineProperties( BezierMesh.prototype, prototypeAccessors ); | ||
return BezierMesh; | ||
}(Mesh)); | ||
export { BezierMesh, ShaderFloatArray, createDerivedMaterial, expandShaderIncludes, getShaderUniformTypes, getShadersForMaterial, voidMainRegExp }; |
@@ -113,3 +113,3 @@ (function (global, factory) { | ||
var privateBeforeCompileProp = "_onBeforeCompile" + id; | ||
var depthMaterial, distanceMaterial; | ||
var distanceMaterialTpl, depthMaterialTpl; | ||
@@ -185,11 +185,15 @@ // Private onBeforeCompile handler that injects the modified shaders and uniforms when | ||
*/ | ||
getDepthMaterial: {value: function value() { | ||
getDepthMaterial: {value: function() { | ||
var depthMaterial = this._depthMaterial; | ||
if (!depthMaterial) { | ||
depthMaterial = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDepthMaterial() | ||
: new three.MeshDepthMaterial({depthPacking: three.RGBADepthPacking}), | ||
options | ||
); | ||
depthMaterial.defines.IS_DEPTH_MATERIAL = ''; | ||
if (!depthMaterialTpl) { | ||
depthMaterialTpl = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDepthMaterial() | ||
: new three.MeshDepthMaterial({depthPacking: three.RGBADepthPacking}), | ||
options | ||
); | ||
depthMaterialTpl.defines.IS_DEPTH_MATERIAL = ''; | ||
} | ||
depthMaterial = this._depthMaterial = depthMaterialTpl.clone(); | ||
} | ||
@@ -203,11 +207,15 @@ return depthMaterial | ||
*/ | ||
getDistanceMaterial: {value: function value() { | ||
getDistanceMaterial: {value: function() { | ||
var distanceMaterial = this._distanceMaterial; | ||
if (!distanceMaterial) { | ||
distanceMaterial = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDistanceMaterial() | ||
: new three.MeshDistanceMaterial(), | ||
options | ||
); | ||
distanceMaterial.defines.IS_DISTANCE_MATERIAL = ''; | ||
if (!distanceMaterialTpl) { | ||
distanceMaterialTpl = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDistanceMaterial() | ||
: new three.MeshDistanceMaterial(), | ||
options | ||
); | ||
distanceMaterialTpl.defines.IS_DISTANCE_MATERIAL = ''; | ||
} | ||
distanceMaterial = this._distanceMaterial = distanceMaterialTpl.clone(); | ||
} | ||
@@ -601,2 +609,172 @@ return distanceMaterial | ||
/* | ||
Input geometry is a cylinder with r=1, height in y dimension from 0 to 1, | ||
divided into a reasonable number of height segments. | ||
*/ | ||
var vertexDefs = "\nuniform vec3 pointA;\nuniform vec3 controlA;\nuniform vec3 controlB;\nuniform vec3 pointB;\nuniform float radius;\nvarying float bezierT;\n\nvec3 cubicBezier(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n float b0 = t2 * t2 * t2;\n float b1 = 3.0 * t * t2 * t2;\n float b2 = 3.0 * t * t * t2;\n float b3 = t * t * t;\n return b0 * p1 + b1 * c1 + b2 * c2 + b3 * p2;\n}\n\nvec3 cubicBezierDerivative(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n return -3.0 * p1 * t2 * t2 +\n c1 * (3.0 * t2 * t2 - 6.0 * t2 * t) +\n c2 * (6.0 * t2 * t - 3.0 * t * t) +\n 3.0 * p2 * t * t;\n}\n"; | ||
var vertexTransform = "\nfloat t = position.y;\nbezierT = t;\nvec3 bezierCenterPos = cubicBezier(pointA, controlA, controlB, pointB, t);\nvec3 bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t));\n\n// Make \"sideways\" always perpendicular to the camera ray; this ensures that any twists\n// in the cylinder occur where you won't see them: \nvec3 viewDirection = normalMatrix * vec3(0.0, 0.0, 1.0);\nif (bezierDir == viewDirection) {\n bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t == 1.0 ? t - 0.0001 : t + 0.0001));\n}\nvec3 sideways = normalize(cross(bezierDir, viewDirection));\nvec3 upish = normalize(cross(sideways, bezierDir));\n\n// Build a matrix for transforming this disc in the cylinder:\nmat4 discTx;\ndiscTx[0].xyz = sideways * radius;\ndiscTx[1].xyz = bezierDir * radius;\ndiscTx[2].xyz = upish * radius;\ndiscTx[3].xyz = bezierCenterPos;\ndiscTx[3][3] = 1.0;\n\n// Apply transform, ignoring original y\nposition = (discTx * vec4(position.x, 0.0, position.z, 1.0)).xyz;\nnormal = normalize(mat3(discTx) * normal);\n"; | ||
var fragmentDefs = "\nuniform vec3 dashing;\nvarying float bezierT;\n"; | ||
var fragmentMainIntro = "\nif (dashing.x + dashing.y > 0.0) {\n float dashFrac = mod(bezierT - dashing.z, dashing.x + dashing.y);\n if (dashFrac > dashing.x) {\n discard;\n }\n}\n"; | ||
// Debugging: separate color for each of the 6 sides: | ||
// const fragmentColorTransform = ` | ||
// float sideNum = floor(vUV.x * 6.0); | ||
// vec3 mixColor = sideNum < 1.0 ? vec3(1.0, 0.0, 0.0) : | ||
// sideNum < 2.0 ? vec3(0.0, 1.0, 1.0) : | ||
// sideNum < 3.0 ? vec3(1.0, 1.0, 0.0) : | ||
// sideNum < 4.0 ? vec3(0.0, 0.0, 1.0) : | ||
// sideNum < 5.0 ? vec3(0.0, 1.0, 0.0) : | ||
// vec3(1.0, 0.0, 1.0); | ||
// gl_FragColor.xyz = mix(gl_FragColor.xyz, mixColor, 0.5); | ||
// ` | ||
function createBezierMeshMaterial(baseMaterial) { | ||
return createDerivedMaterial( | ||
baseMaterial, | ||
{ | ||
uniforms: { | ||
pointA: {value: new three.Vector3()}, | ||
controlA: {value: new three.Vector3()}, | ||
controlB: {value: new three.Vector3()}, | ||
pointB: {value: new three.Vector3()}, | ||
radius: {value: 0.01}, | ||
dashing: {value: new three.Vector3()} //on, off, offset | ||
}, | ||
vertexDefs: vertexDefs, | ||
vertexTransform: vertexTransform, | ||
fragmentDefs: fragmentDefs, | ||
fragmentMainIntro: fragmentMainIntro | ||
} | ||
) | ||
} | ||
var geometry = null; | ||
var defaultBaseMaterial = new three.MeshStandardMaterial({color: 0xffffff, side: three.DoubleSide}); | ||
/** | ||
* A ThreeJS `Mesh` that bends a tube shape along a 3D cubic bezier path. The bending is done | ||
* by deforming a straight cylindrical geometry in the vertex shader based on a set of four | ||
* control point uniforms. It patches the necessary GLSL into the mesh's assigned `material` | ||
* automatically. | ||
* | ||
* The cubiz bezier path is determined by its four `Vector3` properties: | ||
* - `pointA` | ||
* - `controlA` | ||
* - `controlB` | ||
* - `pointB` | ||
* | ||
* The tube's radius is controlled by its `radius` property, which defaults to `0.01`. | ||
* | ||
* You can also give the tube a dashed appearance with two properties: | ||
* | ||
* - `dashArray` - an array of two numbers, defining the length of "on" and "off" parts of | ||
* the dash. Each is a 0-1 ratio of the entire path's length. (Actually this is the `t` length | ||
* used as input to the cubic bezier function, not its visible length.) | ||
* - `dashOffset` - offset of where the dash starts. You can animate this to make the dashes move. | ||
* | ||
* Note that the dashes will appear like a hollow tube, not solid. This will be more apparent on | ||
* thicker tubes. | ||
* | ||
* TODO: proper geometry bounding sphere and raycasting | ||
* TODO: allow control of the geometry's segment counts | ||
*/ | ||
var BezierMesh = (function (Mesh) { | ||
function BezierMesh() { | ||
Mesh.call( | ||
this, geometry || (geometry = | ||
new three.CylinderBufferGeometry(1, 1, 1, 6, 64).translate(0, 0.5, 0) | ||
), | ||
defaultBaseMaterial | ||
); | ||
this.pointA = new three.Vector3(); | ||
this.controlA = new three.Vector3(); | ||
this.controlB = new three.Vector3(); | ||
this.pointB = new three.Vector3(); | ||
this.radius = 0.01; | ||
this.dashArray = new three.Vector2(); | ||
this.dashOffset = 0; | ||
// TODO - disabling frustum culling until I figure out how to customize the | ||
// geometry's bounding sphere that gets used | ||
this.frustumCulled = false; | ||
} | ||
if ( Mesh ) BezierMesh.__proto__ = Mesh; | ||
BezierMesh.prototype = Object.create( Mesh && Mesh.prototype ); | ||
BezierMesh.prototype.constructor = BezierMesh; | ||
var prototypeAccessors = { material: { configurable: true },customDepthMaterial: { configurable: true },customDistanceMaterial: { configurable: true } }; | ||
// Handler for automatically wrapping the base material with our upgrades. We do the wrapping | ||
// lazily on _read_ rather than write to avoid unnecessary wrapping on transient values. | ||
prototypeAccessors.material.get = function () { | ||
var derivedMaterial = this._derivedMaterial; | ||
var baseMaterial = this._baseMaterial || defaultBaseMaterial; | ||
if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) { | ||
if (derivedMaterial) { | ||
derivedMaterial.dispose(); | ||
} | ||
derivedMaterial = this._derivedMaterial = createBezierMeshMaterial(baseMaterial); | ||
// dispose the derived material when its base material is disposed: | ||
baseMaterial.addEventListener('dispose', function onDispose() { | ||
baseMaterial.removeEventListener('dispose', onDispose); | ||
derivedMaterial.dispose(); | ||
}); | ||
} | ||
return derivedMaterial | ||
}; | ||
prototypeAccessors.material.set = function (baseMaterial) { | ||
this._baseMaterial = baseMaterial; | ||
}; | ||
// Create and update material for shadows upon request: | ||
prototypeAccessors.customDepthMaterial.get = function () { | ||
return this._updateBezierUniforms(this.material.getDepthMaterial()) | ||
}; | ||
prototypeAccessors.customDistanceMaterial.get = function () { | ||
return this._updateBezierUniforms(this.material.getDistanceMaterial()) | ||
}; | ||
BezierMesh.prototype.onBeforeRender = function onBeforeRender (shaderInfo) { | ||
this._updateBezierUniforms(this.material); | ||
}; | ||
BezierMesh.prototype._updateBezierUniforms = function _updateBezierUniforms (material) { | ||
var uniforms = material.uniforms; | ||
var ref = this; | ||
var pointA = ref.pointA; | ||
var controlA = ref.controlA; | ||
var controlB = ref.controlB; | ||
var pointB = ref.pointB; | ||
var radius = ref.radius; | ||
var dashArray = ref.dashArray; | ||
var dashOffset = ref.dashOffset; | ||
uniforms.pointA.value.copy(pointA); | ||
uniforms.controlA.value.copy(controlA); | ||
uniforms.controlB.value.copy(controlB); | ||
uniforms.pointB.value.copy(pointB); | ||
uniforms.radius.value = radius; | ||
uniforms.dashing.value.set(dashArray.x, dashArray.y, dashOffset || 0); | ||
return material | ||
}; | ||
BezierMesh.prototype.raycast = function raycast (raycaster, intersects) { | ||
// TODO - just fail for now | ||
}; | ||
Object.defineProperties( BezierMesh.prototype, prototypeAccessors ); | ||
return BezierMesh; | ||
}(three.Mesh)); | ||
exports.BezierMesh = BezierMesh; | ||
exports.ShaderFloatArray = ShaderFloatArray; | ||
@@ -603,0 +781,0 @@ exports.createDerivedMaterial = createDerivedMaterial; |
@@ -1,14 +0,20 @@ | ||
'use strict';(function(f,k){"object"===typeof exports&&"undefined"!==typeof module?k(exports,require("three")):"function"===typeof define&&define.amd?define(["exports","three"],k):(f=f||self,k(f.troika_three_utils={},f.THREE))})(this,function(f,k){function p(a){return a.replace(/^[ \t]*#include +<([\w\d./]+)>/gm,function(a,c){return(c=k.ShaderChunk[c])?p(c):a})}function r(a,b){function c(c){a.onBeforeCompile.call(this,c);var d=this[h]||(this[h]={vertex:{},fragment:{}}),e=d.vertex;d=d.fragment;if(e.source!== | ||
c.vertexShader||d.source!==c.fragmentShader){var g=y(c,b,f);e.source=c.vertexShader;e.result=g.vertexShader;d.source=c.fragmentShader;d.result=g.fragmentShader}c.vertexShader=e.result;c.fragmentShader=d.result;n(c.uniforms,this.uniforms);b.timeUniform&&(c.uniforms[b.timeUniform]={get value(){return Date.now()-z}});if(this[t])this[t](c)}function d(){a.constructor.apply(this,arguments);this._listeners=void 0}var e=JSON.stringify(b,A),g=w.get(a);g||(g=Object.create(null),w.set(a,g));if(g[e])return g[e].clone(); | ||
var f=++B,h="_derivedShaders"+f,t="_onBeforeCompile"+f,l,q;d.prototype=Object.create(a,{constructor:{value:d},isDerivedMaterial:{value:!0},baseMaterial:{value:a},onBeforeCompile:{get:function(){return c},set:function(a){this[t]=a}},copy:{value:function(b){a.copy.call(this,b);a.isShaderMaterial||a.isDerivedMaterial||(this.extensions=b.extensions,this.defines=n({},b.defines),this.uniforms=k.UniformsUtils.clone(b.uniforms));return this}},getDepthMaterial:{value:function(){l||(l=r(a.isDerivedMaterial? | ||
a.getDepthMaterial():new k.MeshDepthMaterial({depthPacking:k.RGBADepthPacking}),b),l.defines.IS_DEPTH_MATERIAL="");return l}},getDistanceMaterial:{value:function(){q||(q=r(a.isDerivedMaterial?a.getDistanceMaterial():new k.MeshDistanceMaterial,b),q.defines.IS_DISTANCE_MATERIAL="");return q}},dispose:{value:function(){var b=this._depthMaterial,c=this._distanceMaterial;b&&b.dispose();c&&c.dispose();a.dispose.call(this)}}});var m=new d;m.copy(a);m.uniforms=n(k.UniformsUtils.clone(a.uniforms||{}),b.uniforms); | ||
m.defines=n({},a.defines,b.defines);m.defines.TROIKA_DERIVED_MATERIAL=f;m.extensions=n({},a.extensions,b.extensions);g[e]=m;return m.clone()}function y(a,b,c){var d=a.vertexShader;a=a.fragmentShader;var e=b.vertexDefs,g=b.vertexMainIntro,f=b.vertexTransform,h=b.fragmentDefs,k=b.fragmentMainIntro,l=b.fragmentColorTransform;if(b=b.timeUniform)b="\nuniform float "+b+";\n",e=(e||"")+b,h=(h||"")+b;if(e||g||f)f&&(d=p(d),e=(e||"")+"\nvoid troikaVertexTransform"+c+"(inout vec3 position, inout vec3 normal, inout vec2 uv) {\n "+ | ||
f+"\n}\n",d=d.replace(/\b(position|normal|uv)\b/g,function(a,b,d,e){return/\battribute\s+vec3\s+$/.test(e.substr(0,d))?b:"troika_"+b+"_"+c}),g="\nvec3 troika_position_"+c+" = vec3(position);\nvec3 troika_normal_"+c+" = vec3(normal);\nvec2 troika_uv_"+c+" = vec2(uv);\ntroikaVertexTransform"+c+"(troika_position_"+c+", troika_normal_"+c+", troika_uv_"+c+");\n"+(g||"")+"\n"),d=d.replace(u,(e||"")+"\n\n$&\n\n"+(g||""));if(h||k||l)a=p(a),a=a.replace(u,"\n"+(h||"")+"\nvoid troikaOrigMain"+c+"() {\n"+(k|| | ||
"")+"\n"),a+="\nvoid main() {\n troikaOrigMain"+c+"();\n "+(l||"")+"\n}";return{vertexShader:d,fragmentShader:a}}function A(a,b){return"uniforms"===a?void 0:b}function x(a,b,c){a*=255;var d=a%1*255,e=d%1*255;var g=Math.round(e%1*255)&255;b[c]=a&255;b[c+1]=d&255;b[c+2]=e&255;b[c+3]=g;return b}var u=/\bvoid\s+main\s*\(\s*\)\s*{/g,n=Object.assign||function(){for(var a=arguments,b=arguments[0],c=1,d=arguments.length;c<d;c++){var e=a[c];if(e)for(var g in e)e.hasOwnProperty(g)&&(b[g]=e[g])}return b}, | ||
B=0,z=Date.now(),w=new WeakMap,C={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},h=function(a){this.name=a;this.textureUniform="dataTex_"+ | ||
a;this.textureSizeUniform="dataTexSize_"+a;this.multiplierUniform="dataMultiplier_"+a;this.dataSizeUniform="dataSize_"+a;this.readFunction="readData_"+a;this._raw=new Float32Array(0);this._texture=new k.DataTexture(new Uint8Array(0),0,1);this._length=0;this._multiplier=1},v={length:{configurable:!0}};v.length.set=function(a){if(a!==this._length){var b=Math.pow(2,Math.ceil(Math.log2(a))),c=this._raw;b<c.length?this._raw=c.subarray(0,b):b>c.length&&(this._raw=new Float32Array(b),this._raw.set(c));this._length= | ||
a}};v.length.get=function(){return this._length};h.prototype.push=function(a){return this.set(this.length++,a)};h.prototype.setArray=function(a){this.length=a.length;this._raw.set(a);this._needsRepack=!0};h.prototype.get=function(a){return this._raw[a]};h.prototype.set=function(a,b){a+1>this._length&&(this.length=a+1);b!==this._raw[a]&&(this._raw[a]=b,x(b/this._multiplier,this._texture.image.data,4*a),this._needsMultCheck=!0)};h.prototype.clone=function(){var a=new h(this.name);a.setArray(this._raw); | ||
return a};h.prototype.getShaderUniforms=function(){var a,b=this;return a={},a[this.textureUniform]={get value(){b._sync();return b._texture}},a[this.textureSizeUniform]={get value(){b._sync();return b._texture.image.width}},a[this.dataSizeUniform]={get value(){b._sync();return b.length}},a[this.multiplierUniform]={get value(){b._sync();return b._multiplier}},a};h.prototype.getShaderHeaderCode=function(){var a=this.textureUniform,b=this.textureSizeUniform,c=this.multiplierUniform;return"\nuniform sampler2D "+ | ||
a+";\nuniform float "+b+";\nuniform float "+this.dataSizeUniform+";\nuniform float "+c+";\n\nfloat "+this.readFunction+"(float index) {\n vec2 texUV = vec2((index + 0.5) / "+b+", 0.5);\n vec4 pixel = texture2D("+a+", texUV);\n return dot(pixel, 1.0 / vec4(1.0, 255.0, 65025.0, 16581375.0)) * "+c+";\n}\n"};h.prototype._sync=function(){var a=this._texture,b=this._raw,c=this._needsRepack;b.length!==a.image.width&&(a.image={data:new Uint8Array(4*b.length),width:b.length,height:1},c=!0);if(c||this._needsMultCheck){var d= | ||
this._raw.reduce(function(a,b){return Math.max(a,b)},0);d=Math.pow(2,Math.ceil(Math.log2(d)));d!==this._multiplier&&(this._multiplier=d,c=!0);a.needsUpdate=!0;this._needsMultCheck=!1}if(c){c=0;d=b.length;for(var e=this._multiplier;c<d;c++)x(b[c]/e,a.image.data,4*c);this._needsRepack=!1}};Object.defineProperties(h.prototype,v);f.ShaderFloatArray=h;f.createDerivedMaterial=r;f.expandShaderIncludes=p;f.getShaderUniformTypes=function(a){for(var b=/\buniform\s+(int|float|vec[234])\s+([A-Za-z_][\w]*)/g, | ||
c=Object.create(null),d;null!==(d=b.exec(a));)c[d[2]]=d[1];return c};f.getShadersForMaterial=function(a){var b=C[a.type];return b?k.ShaderLib[b]:a};f.voidMainRegExp=u;Object.defineProperty(f,"__esModule",{value:!0})}); | ||
'use strict';(function(h,d){"object"===typeof exports&&"undefined"!==typeof module?d(exports,require("three")):"function"===typeof define&&define.amd?define(["exports","three"],d):(h=h||self,d(h.troika_three_utils={},h.THREE))})(this,function(h,d){function r(a){return a.replace(/^[ \t]*#include +<([\w\d./]+)>/gm,function(a,c){return(c=d.ShaderChunk[c])?r(c):a})}function t(a,b){function c(c){a.onBeforeCompile.call(this,c);var e=this[h]||(this[h]={vertex:{},fragment:{}}),f=e.vertex;e=e.fragment;if(f.source!== | ||
c.vertexShader||e.source!==c.fragmentShader){var d=A(c,b,n);f.source=c.vertexShader;f.result=d.vertexShader;e.source=c.fragmentShader;e.result=d.fragmentShader}c.vertexShader=f.result;c.fragmentShader=e.result;k(c.uniforms,this.uniforms);b.timeUniform&&(c.uniforms[b.timeUniform]={get value(){return Date.now()-B}});if(this[g])this[g](c)}function e(){a.constructor.apply(this,arguments);this._listeners=void 0}var f=JSON.stringify(b,C),p=w.get(a);p||(p=Object.create(null),w.set(a,p));if(p[f])return p[f].clone(); | ||
var n=++D,h="_derivedShaders"+n,g="_onBeforeCompile"+n,l,u;e.prototype=Object.create(a,{constructor:{value:e},isDerivedMaterial:{value:!0},baseMaterial:{value:a},onBeforeCompile:{get:function(){return c},set:function(a){this[g]=a}},copy:{value:function(b){a.copy.call(this,b);a.isShaderMaterial||a.isDerivedMaterial||(this.extensions=b.extensions,this.defines=k({},b.defines),this.uniforms=d.UniformsUtils.clone(b.uniforms));return this}},getDepthMaterial:{value:function(){var c=this._depthMaterial;c|| | ||
(u||(u=t(a.isDerivedMaterial?a.getDepthMaterial():new d.MeshDepthMaterial({depthPacking:d.RGBADepthPacking}),b),u.defines.IS_DEPTH_MATERIAL=""),c=this._depthMaterial=u.clone());return c}},getDistanceMaterial:{value:function(){var c=this._distanceMaterial;c||(l||(l=t(a.isDerivedMaterial?a.getDistanceMaterial():new d.MeshDistanceMaterial,b),l.defines.IS_DISTANCE_MATERIAL=""),c=this._distanceMaterial=l.clone());return c}},dispose:{value:function(){var b=this._depthMaterial,c=this._distanceMaterial;b&& | ||
b.dispose();c&&c.dispose();a.dispose.call(this)}}});var m=new e;m.copy(a);m.uniforms=k(d.UniformsUtils.clone(a.uniforms||{}),b.uniforms);m.defines=k({},a.defines,b.defines);m.defines.TROIKA_DERIVED_MATERIAL=n;m.extensions=k({},a.extensions,b.extensions);p[f]=m;return m.clone()}function A(a,b,c){var e=a.vertexShader;a=a.fragmentShader;var f=b.vertexDefs,d=b.vertexMainIntro,h=b.vertexTransform,g=b.fragmentDefs,k=b.fragmentMainIntro,l=b.fragmentColorTransform;if(b=b.timeUniform)b="\nuniform float "+ | ||
b+";\n",f=(f||"")+b,g=(g||"")+b;if(f||d||h)h&&(e=r(e),f=(f||"")+"\nvoid troikaVertexTransform"+c+"(inout vec3 position, inout vec3 normal, inout vec2 uv) {\n "+h+"\n}\n",e=e.replace(/\b(position|normal|uv)\b/g,function(a,b,e,f){return/\battribute\s+vec3\s+$/.test(f.substr(0,e))?b:"troika_"+b+"_"+c}),d="\nvec3 troika_position_"+c+" = vec3(position);\nvec3 troika_normal_"+c+" = vec3(normal);\nvec2 troika_uv_"+c+" = vec2(uv);\ntroikaVertexTransform"+c+"(troika_position_"+c+", troika_normal_"+c+", troika_uv_"+ | ||
c+");\n"+(d||"")+"\n"),e=e.replace(v,(f||"")+"\n\n$&\n\n"+(d||""));if(g||k||l)a=r(a),a=a.replace(v,"\n"+(g||"")+"\nvoid troikaOrigMain"+c+"() {\n"+(k||"")+"\n"),a+="\nvoid main() {\n troikaOrigMain"+c+"();\n "+(l||"")+"\n}";return{vertexShader:e,fragmentShader:a}}function C(a,b){return"uniforms"===a?void 0:b}function x(a,b,c){a*=255;var e=a%1*255,f=e%1*255;var d=Math.round(f%1*255)&255;b[c]=a&255;b[c+1]=e&255;b[c+2]=f&255;b[c+3]=d;return b}var v=/\bvoid\s+main\s*\(\s*\)\s*{/g,k=Object.assign||function(){for(var a= | ||
arguments,b=arguments[0],c=1,e=arguments.length;c<e;c++){var f=a[c];if(f)for(var d in f)f.hasOwnProperty(d)&&(b[d]=f[d])}return b},D=0,B=Date.now(),w=new WeakMap,E={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed", | ||
PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},g=function(a){this.name=a;this.textureUniform="dataTex_"+a;this.textureSizeUniform="dataTexSize_"+a;this.multiplierUniform="dataMultiplier_"+a;this.dataSizeUniform="dataSize_"+a;this.readFunction="readData_"+a;this._raw=new Float32Array(0);this._texture=new d.DataTexture(new Uint8Array(0),0,1);this._length=0;this._multiplier=1},q={length:{configurable:!0}};q.length.set=function(a){if(a!==this._length){var b=Math.pow(2,Math.ceil(Math.log2(a))), | ||
c=this._raw;b<c.length?this._raw=c.subarray(0,b):b>c.length&&(this._raw=new Float32Array(b),this._raw.set(c));this._length=a}};q.length.get=function(){return this._length};g.prototype.push=function(a){return this.set(this.length++,a)};g.prototype.setArray=function(a){this.length=a.length;this._raw.set(a);this._needsRepack=!0};g.prototype.get=function(a){return this._raw[a]};g.prototype.set=function(a,b){a+1>this._length&&(this.length=a+1);b!==this._raw[a]&&(this._raw[a]=b,x(b/this._multiplier,this._texture.image.data, | ||
4*a),this._needsMultCheck=!0)};g.prototype.clone=function(){var a=new g(this.name);a.setArray(this._raw);return a};g.prototype.getShaderUniforms=function(){var a,b=this;return a={},a[this.textureUniform]={get value(){b._sync();return b._texture}},a[this.textureSizeUniform]={get value(){b._sync();return b._texture.image.width}},a[this.dataSizeUniform]={get value(){b._sync();return b.length}},a[this.multiplierUniform]={get value(){b._sync();return b._multiplier}},a};g.prototype.getShaderHeaderCode= | ||
function(){var a=this.textureUniform,b=this.textureSizeUniform,c=this.multiplierUniform;return"\nuniform sampler2D "+a+";\nuniform float "+b+";\nuniform float "+this.dataSizeUniform+";\nuniform float "+c+";\n\nfloat "+this.readFunction+"(float index) {\n vec2 texUV = vec2((index + 0.5) / "+b+", 0.5);\n vec4 pixel = texture2D("+a+", texUV);\n return dot(pixel, 1.0 / vec4(1.0, 255.0, 65025.0, 16581375.0)) * "+c+";\n}\n"};g.prototype._sync=function(){var a=this._texture,b=this._raw,c=this._needsRepack; | ||
b.length!==a.image.width&&(a.image={data:new Uint8Array(4*b.length),width:b.length,height:1},c=!0);if(c||this._needsMultCheck){var e=this._raw.reduce(function(a,b){return Math.max(a,b)},0);e=Math.pow(2,Math.ceil(Math.log2(e)));e!==this._multiplier&&(this._multiplier=e,c=!0);a.needsUpdate=!0;this._needsMultCheck=!1}if(c){c=0;e=b.length;for(var d=this._multiplier;c<e;c++)x(b[c]/d,a.image.data,4*c);this._needsRepack=!1}};Object.defineProperties(g.prototype,q);var y=null,z=new d.MeshStandardMaterial({color:16777215, | ||
side:d.DoubleSide});q=function(a){function b(){a.call(this,y||(y=(new d.CylinderBufferGeometry(1,1,1,6,64)).translate(0,.5,0)),z);this.pointA=new d.Vector3;this.controlA=new d.Vector3;this.controlB=new d.Vector3;this.pointB=new d.Vector3;this.radius=.01;this.dashArray=new d.Vector2;this.dashOffset=0;this.frustumCulled=!1}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);b.prototype.constructor=b;var c={material:{configurable:!0},customDepthMaterial:{configurable:!0},customDistanceMaterial:{configurable:!0}}; | ||
c.material.get=function(){var a=this._derivedMaterial,b=this._baseMaterial||z;a&&a.baseMaterial===b||(a&&a.dispose(),a=this._derivedMaterial=t(b,{uniforms:{pointA:{value:new d.Vector3},controlA:{value:new d.Vector3},controlB:{value:new d.Vector3},pointB:{value:new d.Vector3},radius:{value:.01},dashing:{value:new d.Vector3}},vertexDefs:"\nuniform vec3 pointA;\nuniform vec3 controlA;\nuniform vec3 controlB;\nuniform vec3 pointB;\nuniform float radius;\nvarying float bezierT;\n\nvec3 cubicBezier(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n float b0 = t2 * t2 * t2;\n float b1 = 3.0 * t * t2 * t2;\n float b2 = 3.0 * t * t * t2;\n float b3 = t * t * t;\n return b0 * p1 + b1 * c1 + b2 * c2 + b3 * p2;\n}\n\nvec3 cubicBezierDerivative(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n return -3.0 * p1 * t2 * t2 +\n c1 * (3.0 * t2 * t2 - 6.0 * t2 * t) +\n c2 * (6.0 * t2 * t - 3.0 * t * t) +\n 3.0 * p2 * t * t;\n}\n", | ||
vertexTransform:'\nfloat t = position.y;\nbezierT = t;\nvec3 bezierCenterPos = cubicBezier(pointA, controlA, controlB, pointB, t);\nvec3 bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t));\n\n// Make "sideways" always perpendicular to the camera ray; this ensures that any twists\n// in the cylinder occur where you won\'t see them: \nvec3 viewDirection = normalMatrix * vec3(0.0, 0.0, 1.0);\nif (bezierDir == viewDirection) {\n bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t == 1.0 ? t - 0.0001 : t + 0.0001));\n}\nvec3 sideways = normalize(cross(bezierDir, viewDirection));\nvec3 upish = normalize(cross(sideways, bezierDir));\n\n// Build a matrix for transforming this disc in the cylinder:\nmat4 discTx;\ndiscTx[0].xyz = sideways * radius;\ndiscTx[1].xyz = bezierDir * radius;\ndiscTx[2].xyz = upish * radius;\ndiscTx[3].xyz = bezierCenterPos;\ndiscTx[3][3] = 1.0;\n\n// Apply transform, ignoring original y\nposition = (discTx * vec4(position.x, 0.0, position.z, 1.0)).xyz;\nnormal = normalize(mat3(discTx) * normal);\n', | ||
fragmentDefs:"\nuniform vec3 dashing;\nvarying float bezierT;\n",fragmentMainIntro:"\nif (dashing.x + dashing.y > 0.0) {\n float dashFrac = mod(bezierT - dashing.z, dashing.x + dashing.y);\n if (dashFrac > dashing.x) {\n discard;\n }\n}\n"}),b.addEventListener("dispose",function n(){b.removeEventListener("dispose",n);a.dispose()}));return a};c.material.set=function(a){this._baseMaterial=a};c.customDepthMaterial.get=function(){return this._updateBezierUniforms(this.material.getDepthMaterial())}; | ||
c.customDistanceMaterial.get=function(){return this._updateBezierUniforms(this.material.getDistanceMaterial())};b.prototype.onBeforeRender=function(a){this._updateBezierUniforms(this.material)};b.prototype._updateBezierUniforms=function(a){var b=a.uniforms,c=this.controlA,d=this.controlB,e=this.pointB,h=this.radius,g=this.dashArray,k=this.dashOffset;b.pointA.value.copy(this.pointA);b.controlA.value.copy(c);b.controlB.value.copy(d);b.pointB.value.copy(e);b.radius.value=h;b.dashing.value.set(g.x,g.y, | ||
k||0);return a};b.prototype.raycast=function(a,b){};Object.defineProperties(b.prototype,c);return b}(d.Mesh);h.BezierMesh=q;h.ShaderFloatArray=g;h.createDerivedMaterial=t;h.expandShaderIncludes=r;h.getShaderUniformTypes=function(a){for(var b=/\buniform\s+(int|float|vec[234])\s+([A-Za-z_][\w]*)/g,c=Object.create(null),d;null!==(d=b.exec(a));)c[d[2]]=d[1];return c};h.getShadersForMaterial=function(a){var b=E[a.type];return b?d.ShaderLib[b]:a};h.voidMainRegExp=v;Object.defineProperty(h,"__esModule", | ||
{value:!0})}); |
{ | ||
"name": "troika-three-utils", | ||
"version": "0.15.3", | ||
"version": "0.15.6", | ||
"description": "Various utilities related to Three.js", | ||
@@ -17,3 +17,3 @@ "author": "Jason Johnston <jason.johnston@protectwise.com>", | ||
"module:es2015": "src/index.js", | ||
"gitHead": "5286e414c66aa8c471091aaaea28c08b86bed0f6" | ||
"gitHead": "13acfe60f037e5156d7b29940ea87c66b3e71ead" | ||
} |
@@ -88,3 +88,3 @@ import { voidMainRegExp } from './voidMainRegExp.js' | ||
const privateBeforeCompileProp = `_onBeforeCompile${id}` | ||
let depthMaterial, distanceMaterial | ||
let distanceMaterialTpl, depthMaterialTpl | ||
@@ -158,11 +158,15 @@ // Private onBeforeCompile handler that injects the modified shaders and uniforms when | ||
*/ | ||
getDepthMaterial: {value() { | ||
getDepthMaterial: {value: function() { | ||
let depthMaterial = this._depthMaterial | ||
if (!depthMaterial) { | ||
depthMaterial = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDepthMaterial() | ||
: new MeshDepthMaterial({depthPacking: RGBADepthPacking}), | ||
options | ||
) | ||
depthMaterial.defines.IS_DEPTH_MATERIAL = '' | ||
if (!depthMaterialTpl) { | ||
depthMaterialTpl = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDepthMaterial() | ||
: new MeshDepthMaterial({depthPacking: RGBADepthPacking}), | ||
options | ||
) | ||
depthMaterialTpl.defines.IS_DEPTH_MATERIAL = '' | ||
} | ||
depthMaterial = this._depthMaterial = depthMaterialTpl.clone() | ||
} | ||
@@ -176,11 +180,15 @@ return depthMaterial | ||
*/ | ||
getDistanceMaterial: {value() { | ||
getDistanceMaterial: {value: function() { | ||
let distanceMaterial = this._distanceMaterial | ||
if (!distanceMaterial) { | ||
distanceMaterial = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDistanceMaterial() | ||
: new MeshDistanceMaterial(), | ||
options | ||
) | ||
distanceMaterial.defines.IS_DISTANCE_MATERIAL = '' | ||
if (!distanceMaterialTpl) { | ||
distanceMaterialTpl = createDerivedMaterial( | ||
baseMaterial.isDerivedMaterial | ||
? baseMaterial.getDistanceMaterial() | ||
: new MeshDistanceMaterial(), | ||
options | ||
) | ||
distanceMaterialTpl.defines.IS_DISTANCE_MATERIAL = '' | ||
} | ||
distanceMaterial = this._distanceMaterial = distanceMaterialTpl.clone() | ||
} | ||
@@ -187,0 +195,0 @@ return distanceMaterial |
@@ -10,1 +10,2 @@ // Troika Three.js Utilities exports | ||
export {voidMainRegExp} from './voidMainRegExp.js' | ||
export {BezierMesh} from './BezierMesh' |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
109026
16
2288
3