three-instanced-uniforms-mesh
Advanced tools
Comparing version 0.45.0 to 0.46.0
@@ -6,2 +6,10 @@ # Change Log | ||
# [0.46.0](https://github.com/protectwise/troika/compare/v0.45.0...v0.46.0) (2022-03-05) | ||
**Note:** Version bump only for package three-instanced-uniforms-mesh | ||
# [0.45.0](https://github.com/protectwise/troika/compare/v0.44.0...v0.45.0) (2022-01-02) | ||
@@ -8,0 +16,0 @@ |
import { InstancedMesh, MeshBasicMaterial, InstancedBufferAttribute } from 'three'; | ||
import { createDerivedMaterial, getShaderUniformTypes, voidMainRegExp, getShadersForMaterial } from 'troika-three-utils'; | ||
const precededByUniformRE = /\buniform\s+(int|float|vec[234])\s+$/; | ||
const attrRefReplacer = (name, index, str) => (precededByUniformRE.test(str.substr(0, index)) ? name : `troika_attr_${name}`); | ||
const varyingRefReplacer = (name, index, str) => (precededByUniformRE.test(str.substr(0, index)) ? name : `troika_vary_${name}`); | ||
function createInstancedUniformsDerivedMaterial (baseMaterial) { | ||
@@ -28,14 +24,20 @@ let _uniformNames = []; | ||
let fragType = fragmentUniforms[name]; | ||
if (vertType || fragType) { | ||
let finder = new RegExp(`\\b${name}\\b`, 'g'); | ||
vertexDeclarations.push(`attribute ${vertType || fragType} troika_attr_${name};`); | ||
const type = vertType || fragType; | ||
if (type) { | ||
const declarationFinder = new RegExp(`\\buniform\\s+${type}\\s+${name}\\s*;`, 'g'); | ||
const referenceFinder = new RegExp(`\\b${name}\\b`, 'g'); | ||
const attrName = `troika_attr_${name}`; | ||
const varyingName = `troika_vary_${name}`; | ||
vertexDeclarations.push(`attribute ${type} ${attrName};`); | ||
if (vertType) { | ||
vertexShader = vertexShader.replace(finder, attrRefReplacer); | ||
vertexShader = vertexShader.replace(declarationFinder, ''); | ||
vertexShader = vertexShader.replace(referenceFinder, attrName); | ||
} | ||
if (fragType) { | ||
fragmentShader = fragmentShader.replace(finder, varyingRefReplacer); | ||
let varyingDecl = `varying ${fragType} troika_vary_${name};`; | ||
fragmentShader = fragmentShader.replace(declarationFinder, ''); | ||
fragmentShader = fragmentShader.replace(referenceFinder, varyingName); | ||
let varyingDecl = `varying ${fragType} ${varyingName};`; | ||
vertexDeclarations.push(varyingDecl); | ||
fragmentDeclarations.push(varyingDecl); | ||
vertexAssignments.push(`troika_vary_${name} = troika_attr_${name};`); | ||
vertexAssignments.push(`${varyingName} = ${attrName};`); | ||
} | ||
@@ -154,3 +156,3 @@ } | ||
* @param {number} index - the index of the instance to set the value for | ||
* @param {number|Vector2|Vector3|Vector4|Color|Array} value - the uniform value for this instance | ||
* @param {number|Vector2|Vector3|Vector4|Color|Array|Matrix3|Matrix4|Quaternion} value - the uniform value for this instance | ||
*/ | ||
@@ -202,2 +204,6 @@ setUniformAt (name, index, value) { | ||
attr.setXYZW(index, value.x, value.y, value.z, value.w); | ||
} else if (value.toArray) { | ||
value.toArray(attr.array, index * size); | ||
} else { | ||
attr.set(value, index * size); | ||
} | ||
@@ -224,3 +230,4 @@ } | ||
: value.isVector3 || value.isColor ? 3 | ||
: value.isVector4 ? 4 | ||
: value.isVector4 || value.isQuaternion ? 4 | ||
: value.elements ? value.elements.length | ||
: Array.isArray(value) ? value.length | ||
@@ -227,0 +234,0 @@ : 0 |
@@ -7,6 +7,2 @@ (function (global, factory) { | ||
const precededByUniformRE = /\buniform\s+(int|float|vec[234])\s+$/; | ||
const attrRefReplacer = (name, index, str) => (precededByUniformRE.test(str.substr(0, index)) ? name : `troika_attr_${name}`); | ||
const varyingRefReplacer = (name, index, str) => (precededByUniformRE.test(str.substr(0, index)) ? name : `troika_vary_${name}`); | ||
function createInstancedUniformsDerivedMaterial (baseMaterial) { | ||
@@ -32,14 +28,20 @@ let _uniformNames = []; | ||
let fragType = fragmentUniforms[name]; | ||
if (vertType || fragType) { | ||
let finder = new RegExp(`\\b${name}\\b`, 'g'); | ||
vertexDeclarations.push(`attribute ${vertType || fragType} troika_attr_${name};`); | ||
const type = vertType || fragType; | ||
if (type) { | ||
const declarationFinder = new RegExp(`\\buniform\\s+${type}\\s+${name}\\s*;`, 'g'); | ||
const referenceFinder = new RegExp(`\\b${name}\\b`, 'g'); | ||
const attrName = `troika_attr_${name}`; | ||
const varyingName = `troika_vary_${name}`; | ||
vertexDeclarations.push(`attribute ${type} ${attrName};`); | ||
if (vertType) { | ||
vertexShader = vertexShader.replace(finder, attrRefReplacer); | ||
vertexShader = vertexShader.replace(declarationFinder, ''); | ||
vertexShader = vertexShader.replace(referenceFinder, attrName); | ||
} | ||
if (fragType) { | ||
fragmentShader = fragmentShader.replace(finder, varyingRefReplacer); | ||
let varyingDecl = `varying ${fragType} troika_vary_${name};`; | ||
fragmentShader = fragmentShader.replace(declarationFinder, ''); | ||
fragmentShader = fragmentShader.replace(referenceFinder, varyingName); | ||
let varyingDecl = `varying ${fragType} ${varyingName};`; | ||
vertexDeclarations.push(varyingDecl); | ||
fragmentDeclarations.push(varyingDecl); | ||
vertexAssignments.push(`troika_vary_${name} = troika_attr_${name};`); | ||
vertexAssignments.push(`${varyingName} = ${attrName};`); | ||
} | ||
@@ -158,3 +160,3 @@ } | ||
* @param {number} index - the index of the instance to set the value for | ||
* @param {number|Vector2|Vector3|Vector4|Color|Array} value - the uniform value for this instance | ||
* @param {number|Vector2|Vector3|Vector4|Color|Array|Matrix3|Matrix4|Quaternion} value - the uniform value for this instance | ||
*/ | ||
@@ -206,2 +208,6 @@ setUniformAt (name, index, value) { | ||
attr.setXYZW(index, value.x, value.y, value.z, value.w); | ||
} else if (value.toArray) { | ||
value.toArray(attr.array, index * size); | ||
} else { | ||
attr.set(value, index * size); | ||
} | ||
@@ -228,3 +234,4 @@ } | ||
: value.isVector3 || value.isColor ? 3 | ||
: value.isVector4 ? 4 | ||
: value.isVector4 || value.isQuaternion ? 4 | ||
: value.elements ? value.elements.length | ||
: Array.isArray(value) ? value.length | ||
@@ -231,0 +238,0 @@ : 0 |
@@ -1,7 +0,7 @@ | ||
'use strict';(function(f,h){"object"===typeof exports&&"undefined"!==typeof module?h(exports,require("three"),require("troika-three-utils")):"function"===typeof define&&define.amd?define(["exports","three","troika-three-utils"],h):(f="undefined"!==typeof globalThis?globalThis:f||self,h(f.three_instanced_uniforms_mesh={},f.THREE,f.troika_three_utils))})(this,function(f,h,k){function l(a){let b=[],c="";a=k.createDerivedMaterial(a,{chained:!0,customRewriter({vertexShader:a,fragmentShader:d}){let c=[], | ||
e=[],f=[],h=k.getShaderUniformTypes(a),p=k.getShaderUniformTypes(d);b.forEach(b=>{var g=h[b];let k=p[b];if(g||k){let h=new RegExp(`\\b${b}\\b`,"g");c.push(`attribute ${g||k} troika_attr_${b};`);g&&(a=a.replace(h,q));k&&(d=d.replace(h,r),g=`varying ${k} troika_vary_${b};`,c.push(g),f.push(g),e.push(`troika_vary_${b} = troika_attr_${b};`))}});a=`${c.join("\n")}\n${a.replace(k.voidMainRegExp,`\n$&\n${e.join("\n")}`)}`;f.length&&(d=`${f.join("\n")}\n${d}`);return{vertexShader:a,fragmentShader:d}}});a.setUniformNames= | ||
function(a){b=a||[];a=b.sort().join("|");a!==c&&(c=a,this.needsUpdate=!0)};let e=a.customProgramCacheKey();a.customProgramCacheKey=function(){return e+"|"+c};a.isInstancedUniformsMaterial=!0;return a}function m(a,b,c){let e=a.itemSize;1===e?a.setX(b,c):2===e?a.setXY(b,c.x,c.y):3===e?c.isColor?a.setXYZ(b,c.r,c.g,c.b):a.setXYZ(b,c.x,c.y,c.z):4===e&&a.setXYZW(b,c.x,c.y,c.z,c.w)}let n=/\buniform\s+(int|float|vec[234])\s+$/,q=(a,b,c)=>n.test(c.substr(0,b))?a:`troika_attr_${a}`,r=(a,b,c)=>n.test(c.substr(0, | ||
b))?a:`troika_vary_${a}`;class t extends h.InstancedMesh{constructor(a,b,c){super(a,b,c);this._instancedUniformNames=[]}get geometry(){let a=this._derivedGeometry,b=this._baseGeometry;a&&a.baseGeometry===b||(a=this._derivedGeometry=Object.create(b),a.baseGeometry=b,a.attributes=Object.create(b.attributes),b.addEventListener("dispose",function(){a.dispose()}));return a}set geometry(a){this._baseGeometry=a}get material(){let a=this._derivedMaterial,b=this._baseMaterial||this._defaultMaterial||(this._defaultMaterial= | ||
new h.MeshBasicMaterial);a&&a.baseMaterial===b||(a=this._derivedMaterial=l(b),b.addEventListener("dispose",function e(){b.removeEventListener("dispose",e);a.dispose()}));a.setUniformNames(this._instancedUniformNames);return a}set material(a){if(Array.isArray(a))throw Error("InstancedUniformsMesh does not support multiple materials");for(;a&&a.isInstancedUniformsMaterial;)a=a.baseMaterial;this._baseMaterial=a}get customDepthMaterial(){return this.material.getDepthMaterial()}get customDistanceMaterial(){return this.material.getDistanceMaterial()}setUniformAt(a, | ||
b,c){var e=this.geometry.attributes;let f=`troika_attr_${a}`;var d=e[f];if(!d){var g=this._baseMaterial;g=(d=g.uniforms)&&d[a]?d[a].value:(d=k.getShadersForMaterial(g).uniforms)&&d[a]?d[a].value:null;d=g;d=null==d?0:"number"===typeof d?1:d.isVector2?2:d.isVector3||d.isColor?3:d.isVector4?4:Array.isArray(d)?d.length:0;d=e[f]=new h.InstancedBufferAttribute(new Float32Array(d*this.count),d);if(null!==g)for(e=0;e<this.count;e++)m(d,e,g);this._instancedUniformNames=[...this._instancedUniformNames,a]}m(d, | ||
b,c);d.needsUpdate=!0}unsetUniform(a){this.geometry.deleteAttribute(`troika_attr_${a}`);this._instancedUniformNames=this._instancedUniformNames.filter(b=>b!==a)}}f.InstancedUniformsMesh=t;f.createInstancedUniformsDerivedMaterial=l;Object.defineProperty(f,"__esModule",{value:!0})}) | ||
'use strict';(function(f,h){"object"===typeof exports&&"undefined"!==typeof module?h(exports,require("three"),require("troika-three-utils")):"function"===typeof define&&define.amd?define(["exports","three","troika-three-utils"],h):(f="undefined"!==typeof globalThis?globalThis:f||self,h(f.three_instanced_uniforms_mesh={},f.THREE,f.troika_three_utils))})(this,function(f,h,k){function p(a){let b=[],d="";a=k.createDerivedMaterial(a,{chained:!0,customRewriter({vertexShader:a,fragmentShader:c}){let d=[], | ||
e=[],f=[],h=k.getShaderUniformTypes(a),l=k.getShaderUniformTypes(c);b.forEach(b=>{var g=h[b];let k=l[b];const m=g||k;if(m){const h=new RegExp(`\\buniform\\s+${m}\\s+${b}\\s*;`,"g"),l=new RegExp(`\\b${b}\\b`,"g"),n=`troika_attr_${b}`;b=`troika_vary_${b}`;d.push(`attribute ${m} ${n};`);g&&(a=a.replace(h,""),a=a.replace(l,n));k&&(c=c.replace(h,""),c=c.replace(l,b),g=`varying ${k} ${b};`,d.push(g),f.push(g),e.push(`${b} = ${n};`))}});a=`${d.join("\n")}\n${a.replace(k.voidMainRegExp,`\n$&\n${e.join("\n")}`)}`; | ||
f.length&&(c=`${f.join("\n")}\n${c}`);return{vertexShader:a,fragmentShader:c}}});a.setUniformNames=function(a){b=a||[];a=b.sort().join("|");a!==d&&(d=a,this.needsUpdate=!0)};let e=a.customProgramCacheKey();a.customProgramCacheKey=function(){return e+"|"+d};a.isInstancedUniformsMaterial=!0;return a}function q(a,b,d){let e=a.itemSize;1===e?a.setX(b,d):2===e?a.setXY(b,d.x,d.y):3===e?d.isColor?a.setXYZ(b,d.r,d.g,d.b):a.setXYZ(b,d.x,d.y,d.z):4===e?a.setXYZW(b,d.x,d.y,d.z,d.w):d.toArray?d.toArray(a.array, | ||
b*e):a.set(d,b*e)}class r extends h.InstancedMesh{constructor(a,b,d){super(a,b,d);this._instancedUniformNames=[]}get geometry(){let a=this._derivedGeometry,b=this._baseGeometry;a&&a.baseGeometry===b||(a=this._derivedGeometry=Object.create(b),a.baseGeometry=b,a.attributes=Object.create(b.attributes),b.addEventListener("dispose",function(){a.dispose()}));return a}set geometry(a){this._baseGeometry=a}get material(){let a=this._derivedMaterial,b=this._baseMaterial||this._defaultMaterial||(this._defaultMaterial= | ||
new h.MeshBasicMaterial);a&&a.baseMaterial===b||(a=this._derivedMaterial=p(b),b.addEventListener("dispose",function e(){b.removeEventListener("dispose",e);a.dispose()}));a.setUniformNames(this._instancedUniformNames);return a}set material(a){if(Array.isArray(a))throw Error("InstancedUniformsMesh does not support multiple materials");for(;a&&a.isInstancedUniformsMaterial;)a=a.baseMaterial;this._baseMaterial=a}get customDepthMaterial(){return this.material.getDepthMaterial()}get customDistanceMaterial(){return this.material.getDistanceMaterial()}setUniformAt(a, | ||
b,d){var e=this.geometry.attributes;let f=`troika_attr_${a}`;var c=e[f];if(!c){var g=this._baseMaterial;g=(c=g.uniforms)&&c[a]?c[a].value:(c=k.getShadersForMaterial(g).uniforms)&&c[a]?c[a].value:null;c=g;c=null==c?0:"number"===typeof c?1:c.isVector2?2:c.isVector3||c.isColor?3:c.isVector4||c.isQuaternion?4:c.elements?c.elements.length:Array.isArray(c)?c.length:0;c=e[f]=new h.InstancedBufferAttribute(new Float32Array(c*this.count),c);if(null!==g)for(e=0;e<this.count;e++)q(c,e,g);this._instancedUniformNames= | ||
[...this._instancedUniformNames,a]}q(c,b,d);c.needsUpdate=!0}unsetUniform(a){this.geometry.deleteAttribute(`troika_attr_${a}`);this._instancedUniformNames=this._instancedUniformNames.filter(b=>b!==a)}}f.InstancedUniformsMesh=r;f.createInstancedUniformsDerivedMaterial=p;Object.defineProperty(f,"__esModule",{value:!0})}) |
{ | ||
"name": "three-instanced-uniforms-mesh", | ||
"version": "0.45.0", | ||
"version": "0.46.0", | ||
"description": "Extension to Three.js InstancedMesh supporting per-instance uniform values", | ||
@@ -17,3 +17,3 @@ "author": "Jason Johnston <jason.johnston@protectwise.com>", | ||
"dependencies": { | ||
"troika-three-utils": "^0.45.0" | ||
"troika-three-utils": "^0.46.0" | ||
}, | ||
@@ -23,3 +23,3 @@ "peerDependencies": { | ||
}, | ||
"gitHead": "a1ab2b36832518827f444a8654053a4b0d5d95d7" | ||
"gitHead": "35c7e224bd18df91952377d00609da049fd67384" | ||
} |
@@ -39,8 +39,10 @@ # InstancedUniformsMesh | ||
| For a uniform of type: | Pass a value of this type: | | ||
| ---------------------- | -------------------------------- | | ||
| float | Number | | ||
| vec2 | `THREE.Vector2` | | ||
| vec3 | `THREE.Vector3` or `THREE.Color` | | ||
| vec4 | `THREE.Vector4` | | ||
| For a uniform of type: | Pass a value of this type: | | ||
|---------------------------|----------------------------------| | ||
| float | Number | | ||
| vec2 | `THREE.Vector2` | | ||
| vec3 | `THREE.Vector3` or `THREE.Color` | | ||
| vec4 | `THREE.Vector4` | | ||
| mat3 (ThreeJS r132+ only) | `THREE.Matrix3` | | ||
| mat4 (ThreeJS r132+ only) | `THREE.Matrix4` | | ||
@@ -47,0 +49,0 @@ |
import { createDerivedMaterial, getShaderUniformTypes, voidMainRegExp } from 'troika-three-utils' | ||
const precededByUniformRE = /\buniform\s+(int|float|vec[234])\s+$/ | ||
const attrRefReplacer = (name, index, str) => (precededByUniformRE.test(str.substr(0, index)) ? name : `troika_attr_${name}`) | ||
const varyingRefReplacer = (name, index, str) => (precededByUniformRE.test(str.substr(0, index)) ? name : `troika_vary_${name}`) | ||
export function createInstancedUniformsDerivedMaterial (baseMaterial) { | ||
@@ -27,14 +23,20 @@ let _uniformNames = [] | ||
let fragType = fragmentUniforms[name] | ||
if (vertType || fragType) { | ||
let finder = new RegExp(`\\b${name}\\b`, 'g') | ||
vertexDeclarations.push(`attribute ${vertType || fragType} troika_attr_${name};`) | ||
const type = vertType || fragType | ||
if (type) { | ||
const declarationFinder = new RegExp(`\\buniform\\s+${type}\\s+${name}\\s*;`, 'g') | ||
const referenceFinder = new RegExp(`\\b${name}\\b`, 'g') | ||
const attrName = `troika_attr_${name}` | ||
const varyingName = `troika_vary_${name}` | ||
vertexDeclarations.push(`attribute ${type} ${attrName};`) | ||
if (vertType) { | ||
vertexShader = vertexShader.replace(finder, attrRefReplacer) | ||
vertexShader = vertexShader.replace(declarationFinder, '') | ||
vertexShader = vertexShader.replace(referenceFinder, attrName) | ||
} | ||
if (fragType) { | ||
fragmentShader = fragmentShader.replace(finder, varyingRefReplacer) | ||
let varyingDecl = `varying ${fragType} troika_vary_${name};` | ||
fragmentShader = fragmentShader.replace(declarationFinder, '') | ||
fragmentShader = fragmentShader.replace(referenceFinder, varyingName) | ||
let varyingDecl = `varying ${fragType} ${varyingName};` | ||
vertexDeclarations.push(varyingDecl) | ||
fragmentDeclarations.push(varyingDecl) | ||
vertexAssignments.push(`troika_vary_${name} = troika_attr_${name};`) | ||
vertexAssignments.push(`${varyingName} = ${attrName};`) | ||
} | ||
@@ -41,0 +43,0 @@ } |
@@ -78,3 +78,3 @@ import { InstancedBufferAttribute, InstancedMesh, MeshBasicMaterial } from 'three' | ||
* @param {number} index - the index of the instance to set the value for | ||
* @param {number|Vector2|Vector3|Vector4|Color|Array} value - the uniform value for this instance | ||
* @param {number|Vector2|Vector3|Vector4|Color|Array|Matrix3|Matrix4|Quaternion} value - the uniform value for this instance | ||
*/ | ||
@@ -126,2 +126,6 @@ setUniformAt (name, index, value) { | ||
attr.setXYZW(index, value.x, value.y, value.z, value.w) | ||
} else if (value.toArray) { | ||
value.toArray(attr.array, index * size) | ||
} else { | ||
attr.set(value, index * size) | ||
} | ||
@@ -148,3 +152,4 @@ } | ||
: value.isVector3 || value.isColor ? 3 | ||
: value.isVector4 ? 4 | ||
: value.isVector4 || value.isQuaternion ? 4 | ||
: value.elements ? value.elements.length | ||
: Array.isArray(value) ? value.length | ||
@@ -151,0 +156,0 @@ : 0 |
38306
651
62
+ Addedtroika-three-utils@0.46.0(transitive)
- Removedtroika-three-utils@0.45.0(transitive)
Updatedtroika-three-utils@^0.46.0