UNPKG

@pixiv/three-vrm

Version:

VRM file loader for three.js.

11 lines (10 loc) 12.7 kB
/*! (c) 2019-2025 pixiv Inc. - https://github.com/pixiv/three-vrm/blob/release/LICENSE */ import*as W from"three";import*as n from"three/webgpu";import*as r from"three/webgpu";import*as l from"three/webgpu";import*as s from"three/webgpu";import*as c from"three/webgpu";import*as i from"three/webgpu";import*as E from"three/webgpu";var P=parseInt(W.REVISION,10);P<167&&console.warn(`MToonNodeMaterial requires Three.js r167 or higher (You are using r${P}). This would not work correctly.`);var D=r.materialReference("color","color"),k=r.materialReference("map","texture"),Y=r.materialReference("normalMap","texture"),X=r.materialReference("normalScale","vec2"),z=r.materialReference("emissive","color"),B=r.materialReference("emissiveIntensity","float"),q=r.materialReference("emissiveMap","texture"),K=r.materialReference("shadeColorFactor","color"),j=r.materialReference("shadingShiftFactor","float"),A=r.materialReference("shadeMultiplyTexture","texture"),Z=r.materialReference("shadeMultiplyTextureScale","float"),$=r.materialReference("shadingToonyFactor","float"),G=r.materialReference("rimLightingMixFactor","float"),J=r.materialReference("rimMultiplyTexture","texture"),Q=r.materialReference("matcapFactor","color"),tt=r.materialReference("matcapTexture","texture"),et=r.materialReference("parametricRimColorFactor","color"),it=r.materialReference("parametricRimLiftFactor","float"),ot=r.materialReference("parametricRimFresnelPowerFactor","float"),rt=r.materialReference("outlineWidthMultiplyTexture","texture"),at=r.materialReference("outlineWidthFactor","float"),O=r.materialReference("outlineColorFactor","color"),lt=r.materialReference("outlineLightingMixFactor","float"),nt=r.materialReference("uvAnimationMaskTexture","texture"),st=r.materialReference("uvAnimationScrollXOffset","float"),ut=r.materialReference("uvAnimationScrollYOffset","float"),mt=r.materialReference("uvAnimationRotationPhase","float"),ht=class extends n.TempNode{constructor(t){super("vec2"),this.hasMaskTexture=t}setup(){let t=1;this.hasMaskTexture&&(t=n.vec4(nt).context({getUV:()=>n.uv()}).r);let e=n.uv(),o=mt.mul(t),a=n.cos(o),u=n.sin(o);e=e.sub(n.vec2(.5,.5)),e=e.mul(n.mat2(a,u,u.negate(),a)),e=e.add(n.vec2(.5,.5));let m=n.vec2(st,ut).mul(t);return e=e.add(m),e.toVar("AnimatedUV")}},U=s.nodeImmutable(s.PropertyNode,"vec3").toVar("ShadeColor"),I=s.nodeImmutable(s.PropertyNode,"float").toVar("ShadingShift"),b=s.nodeImmutable(s.PropertyNode,"float").toVar("ShadingToony"),v=s.nodeImmutable(s.PropertyNode,"float").toVar("RimLightingMix"),N=s.nodeImmutable(s.PropertyNode,"vec3").toVar("RimMultiply"),g=s.nodeImmutable(s.PropertyNode,"vec3").toVar("matcap"),H=s.nodeImmutable(s.PropertyNode,"vec3").toVar("ParametricRim"),T=t=>parseInt(c.REVISION,10)>=168?c.Fn(t):c.tslFn(t),dt=T(({a:t,b:e,t:o})=>{let a=o.sub(t),u=e.sub(t);return a.div(u).clamp()}),ct=T(({dotNL:t})=>{let o=l.float(1).sub(b),a=t.add(I);return a=dt({a:o.negate(),b:o,t:a}),a=a.mul(1),a}),Et=T(({shading:t,lightColor:e})=>{let o=l.mix(U,l.diffuseColor,t);return e.mul(l.BRDF_Lambert({diffuseColor:o}))}),pt=class extends l.LightingModel{constructor(){super()}direct({lightDirection:t,lightColor:e,reflectedLight:o}){let a=l.transformedNormalView.dot(t).clamp(-1,1),u=ct({dotNL:a});o.directDiffuse.assign(o.directDiffuse.add(Et({shading:u,lightColor:e}))),o.directSpecular.assign(o.directSpecular.add(H.add(g).mul(N).mul(l.mix(l.vec3(0),l.BRDF_Lambert({diffuseColor:e}),v))))}indirect(t){this.indirectDiffuse(t),this.indirectSpecular(t)}indirectDiffuse({irradiance:t,reflectedLight:e}){e.indirectDiffuse.assign(e.indirectDiffuse.add(t.mul(l.BRDF_Lambert({diffuseColor:l.diffuseColor}))))}indirectSpecular({reflectedLight:t}){t.indirectSpecular.assign(t.indirectSpecular.add(H.add(g).mul(N).mul(l.mix(l.vec3(1),l.vec3(0),v))))}},R={None:"none",WorldCoordinates:"worldCoordinates",ScreenCoordinates:"screenCoordinates"},Rt=T(({parametricRimLift:t,parametricRimFresnelPower:e,parametricRimColor:o})=>{let a=E.modelViewPosition.normalize(),u=E.transformedNormalView.dot(a.negate());return E.float(1).sub(u).add(t).clamp().pow(e).mul(o)}),ft=class extends i.NodeMaterial{customProgramCacheKey(){let t=super.customProgramCacheKey();return t+=`isOutline:${this.isOutline},`,t}get isMToonNodeMaterial(){return!0}constructor(t={}){super(),t.transparentWithZWrite&&(t.depthWrite=!0),delete t.transparentWithZWrite,delete t.giEqualizationFactor,delete t.v0CompatShade,delete t.debugMode,this.emissiveNode=null,this.lights=!0,this.color=new i.Color(1,1,1),this.map=null,this.emissive=new i.Color(0,0,0),this.emissiveIntensity=1,this.emissiveMap=null,this.normalMap=null,this.normalScale=new i.Vector2(1,1),this.shadeColorFactor=new i.Color(0,0,0),this.shadeMultiplyTexture=null,this.shadingShiftFactor=0,this.shadingShiftTexture=null,this.shadingShiftTextureScale=1,this.shadingToonyFactor=.9,this.rimLightingMixFactor=1,this.rimMultiplyTexture=null,this.matcapFactor=new i.Color(1,1,1),this.matcapTexture=null,this.parametricRimColorFactor=new i.Color(0,0,0),this.parametricRimLiftFactor=0,this.parametricRimFresnelPowerFactor=5,this.outlineWidthMode=R.None,this.outlineWidthMultiplyTexture=null,this.outlineWidthFactor=0,this.outlineColorFactor=new i.Color(0,0,0),this.outlineLightingMixFactor=1,this.uvAnimationScrollXSpeedFactor=0,this.uvAnimationScrollYSpeedFactor=0,this.uvAnimationRotationSpeedFactor=0,this.uvAnimationMaskTexture=null,this.shadeColorNode=null,this.shadingShiftNode=null,this.shadingToonyNode=null,this.rimLightingMixNode=null,this.rimMultiplyNode=null,this.matcapNode=null,this.parametricRimColorNode=null,this.parametricRimLiftNode=null,this.parametricRimFresnelPowerNode=null,this.uvAnimationScrollXOffset=0,this.uvAnimationScrollYOffset=0,this.uvAnimationRotationPhase=0,this.isOutline=!1,this._animatedUVNode=null,this.setValues(t)}setupLightingModel(){return new pt}setup(t){var e;this._animatedUVNode=new ht((e=this.uvAnimationMaskTexture&&this.uvAnimationMaskTexture.isTexture===!0)!=null?e:!1),super.setup(t)}setupDiffuseColor(t){let e=null;if(this.colorNode==null){if(e=D,this.map&&this.map.isTexture===!0){let o=k.context({getUV:()=>this._animatedUVNode});e=e.mul(o)}this.colorNode=e}this.vertexColors===!0&&t.geometry.hasAttribute("color")&&(console.warn("MToonNodeMaterial: MToon ignores vertex colors. Consider using a model without vertex colors instead."),this.vertexColors=!1),super.setupDiffuseColor(t),parseInt(i.REVISION,10)<166&&this.transparent===!1&&this.blending===i.NormalBlending&&this.alphaToCoverage===!1&&i.diffuseColor.a.assign(1),this.colorNode===e&&(this.colorNode=null)}setupVariants(){U.assign(this._setupShadeColorNode()),I.assign(this._setupShadingShiftNode()),b.assign(this._setupShadingToonyNode()),v.assign(this._setupRimLightingMixNode()),N.assign(this._setupRimMultiplyNode()),g.assign(this._setupMatcapNode()),H.assign(this._setupParametricRimNode())}setupNormal(t){let e=this.normalNode;if(this.normalNode==null){if(this.normalNode=i.materialNormal,this.normalMap&&this.normalMap.isTexture===!0){let a=Y.context({getUV:()=>this._animatedUVNode});this.normalNode=i.normalMap(a,X)}this.isOutline&&(this.normalNode=this.normalNode.negate())}if(parseInt(i.REVISION,10)>=168){let a=this.normalNode;return this.normalNode=e,a}else{super.setupNormal(t),this.normalNode=e;return}}setupLighting(t){let e=null;if(this.emissiveNode==null){if(e=z.mul(B),this.emissiveMap&&this.emissiveMap.isTexture===!0){let a=q.context({getUV:()=>this._animatedUVNode});e=e.mul(a)}this.emissiveNode=e}let o=super.setupLighting(t);return this.emissiveNode===e&&(this.emissiveNode=null),o}setupOutput(t,e){return this.isOutline&&this.outlineWidthMode!==R.None&&(e=i.vec4(i.mix(O,e.xyz.mul(O),lt),e.w)),super.setupOutput(t,e)}setupPosition(t){var e,o;let a=this.positionNode;if(this.isOutline&&this.outlineWidthMode!==R.None){(e=this.positionNode)!=null||(this.positionNode=i.positionLocal);let m=i.normalLocal.normalize(),h=at;if(this.outlineWidthMultiplyTexture&&this.outlineWidthMultiplyTexture.isTexture===!0){let d=rt.context({getUV:()=>this._animatedUVNode});h=h.mul(d)}let f=i.length(i.modelNormalMatrix.mul(m)),p=h.mul(f).mul(m);if(this.outlineWidthMode===R.WorldCoordinates)this.positionNode=this.positionNode.add(p);else if(this.outlineWidthMode===R.ScreenCoordinates){let d=i.cameraProjectionMatrix.element(1).element(1);this.positionNode=this.positionNode.add(p.div(d).mul(i.positionView.z.negate()))}(o=this.positionNode)!=null||(this.positionNode=i.positionLocal)}let u=super.setupPosition(t);return u.z.add(u.w.mul(1e-6)),this.positionNode=a,u}copy(t){var e,o,a,u,m,h,f,p,d,M,x,S,F,y,C,_,V,L,w;return this.color.copy(t.color),this.map=(e=t.map)!=null?e:null,this.emissive.copy(t.emissive),this.emissiveIntensity=t.emissiveIntensity,this.emissiveMap=(o=t.emissiveMap)!=null?o:null,this.normalMap=(a=t.normalMap)!=null?a:null,this.normalScale.copy(t.normalScale),this.shadeColorFactor.copy(t.shadeColorFactor),this.shadeMultiplyTexture=(u=t.shadeMultiplyTexture)!=null?u:null,this.shadingShiftFactor=t.shadingShiftFactor,this.shadingShiftTexture=(m=t.shadingShiftTexture)!=null?m:null,this.shadingShiftTextureScale=t.shadingShiftTextureScale,this.shadingToonyFactor=t.shadingToonyFactor,this.rimLightingMixFactor=t.rimLightingMixFactor,this.rimMultiplyTexture=(h=t.rimMultiplyTexture)!=null?h:null,this.matcapFactor.copy(t.matcapFactor),this.matcapTexture=(f=t.matcapTexture)!=null?f:null,this.parametricRimColorFactor.copy(t.parametricRimColorFactor),this.parametricRimLiftFactor=t.parametricRimLiftFactor,this.parametricRimFresnelPowerFactor=t.parametricRimFresnelPowerFactor,this.outlineWidthMode=t.outlineWidthMode,this.outlineWidthMultiplyTexture=(p=t.outlineWidthMultiplyTexture)!=null?p:null,this.outlineWidthFactor=t.outlineWidthFactor,this.outlineColorFactor.copy(t.outlineColorFactor),this.outlineLightingMixFactor=t.outlineLightingMixFactor,this.uvAnimationScrollXSpeedFactor=t.uvAnimationScrollXSpeedFactor,this.uvAnimationScrollYSpeedFactor=t.uvAnimationScrollYSpeedFactor,this.uvAnimationRotationSpeedFactor=t.uvAnimationRotationSpeedFactor,this.uvAnimationMaskTexture=(d=t.uvAnimationMaskTexture)!=null?d:null,this.shadeColorNode=(M=t.shadeColorNode)!=null?M:null,this.shadingShiftNode=(x=t.shadingShiftNode)!=null?x:null,this.shadingToonyNode=(S=t.shadingToonyNode)!=null?S:null,this.rimLightingMixNode=(F=t.rimLightingMixNode)!=null?F:null,this.rimMultiplyNode=(y=t.rimMultiplyNode)!=null?y:null,this.matcapNode=(C=t.matcapNode)!=null?C:null,this.parametricRimColorNode=(_=t.parametricRimColorNode)!=null?_:null,this.parametricRimLiftNode=(V=t.parametricRimLiftNode)!=null?V:null,this.parametricRimFresnelPowerNode=(L=t.parametricRimFresnelPowerNode)!=null?L:null,this.isOutline=(w=t.isOutline)!=null?w:null,super.copy(t)}update(t){this.uvAnimationScrollXOffset+=t*this.uvAnimationScrollXSpeedFactor,this.uvAnimationScrollYOffset+=t*this.uvAnimationScrollYSpeedFactor,this.uvAnimationRotationPhase+=t*this.uvAnimationRotationSpeedFactor}_setupShadeColorNode(){if(this.shadeColorNode!=null)return i.vec3(this.shadeColorNode);let t=K;if(this.shadeMultiplyTexture&&this.shadeMultiplyTexture.isTexture===!0){let e=A.context({getUV:()=>this._animatedUVNode});t=t.mul(e)}return t}_setupShadingShiftNode(){if(this.shadingShiftNode!=null)return i.float(this.shadingShiftNode);let t=j;if(this.shadingShiftTexture&&this.shadingShiftTexture.isTexture===!0){let e=A.context({getUV:()=>this._animatedUVNode});t=t.add(e.mul(Z))}return t}_setupShadingToonyNode(){return this.shadingToonyNode!=null?i.float(this.shadingToonyNode):$}_setupRimLightingMixNode(){return this.rimLightingMixNode!=null?i.float(this.rimLightingMixNode):G}_setupRimMultiplyNode(){return this.rimMultiplyNode!=null?i.vec3(this.rimMultiplyNode):this.rimMultiplyTexture&&this.rimMultiplyTexture.isTexture===!0?J.context({getUV:()=>this._animatedUVNode}):i.vec3(1)}_setupMatcapNode(){return this.matcapNode!=null?i.vec3(this.matcapNode):this.matcapTexture&&this.matcapTexture.isTexture===!0?tt.context({getUV:()=>i.matcapUV.mul(1,-1).add(0,1)}).mul(Q):i.vec3(0)}_setupParametricRimNode(){let t=this.parametricRimColorNode!=null?i.vec3(this.parametricRimColorNode):et,e=this.parametricRimLiftNode!=null?i.float(this.parametricRimLiftNode):it,o=this.parametricRimFresnelPowerNode!=null?i.float(this.parametricRimFresnelPowerNode):ot;return Rt({parametricRimLift:e,parametricRimFresnelPower:o,parametricRimColor:t})}};export{ht as MToonAnimatedUVNode,pt as MToonLightingModel,ft as MToonNodeMaterial}; /*! * @pixiv/three-vrm-materials-mtoon v3.3.6 * MToon (toon material) module for @pixiv/three-vrm * * Copyright (c) 2019-2025 pixiv Inc. * @pixiv/three-vrm-materials-mtoon is distributed under MIT License * https://github.com/pixiv/three-vrm/blob/release/LICENSE */