MeshStandardNodeMaterial.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
  2. import { diffuseColor, metalness, roughness, specularColor } from '../core/PropertyNode.js';
  3. import { mix } from '../math/MathNode.js';
  4. import { materialRoughness, materialMetalness } from '../accessors/MaterialNode.js';
  5. import getRoughness from '../functions/material/getRoughness.js';
  6. import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
  7. import { float, vec3, vec4 } from '../shadernode/ShaderNode.js';
  8. import { MeshStandardMaterial } from 'three';
  9. const defaultValues = new MeshStandardMaterial();
  10. class MeshStandardNodeMaterial extends NodeMaterial {
  11. constructor( parameters ) {
  12. super();
  13. this.isMeshStandardNodeMaterial = true;
  14. this.emissiveNode = null;
  15. this.metalnessNode = null;
  16. this.roughnessNode = null;
  17. this.setDefaultValues( defaultValues );
  18. this.setValues( parameters );
  19. }
  20. setupLightingModel( /*builder*/ ) {
  21. return new PhysicalLightingModel();
  22. }
  23. setupVariants() {
  24. // METALNESS
  25. const metalnessNode = this.metalnessNode ? float( this.metalnessNode ) : materialMetalness;
  26. metalness.assign( metalnessNode );
  27. // ROUGHNESS
  28. let roughnessNode = this.roughnessNode ? float( this.roughnessNode ) : materialRoughness;
  29. roughnessNode = getRoughness( { roughness: roughnessNode } );
  30. roughness.assign( roughnessNode );
  31. // SPECULAR COLOR
  32. const specularColorNode = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessNode );
  33. specularColor.assign( specularColorNode );
  34. // DIFFUSE COLOR
  35. diffuseColor.assign( vec4( diffuseColor.rgb.mul( metalnessNode.oneMinus() ), diffuseColor.a ) );
  36. }
  37. copy( source ) {
  38. this.emissiveNode = source.emissiveNode;
  39. this.metalnessNode = source.metalnessNode;
  40. this.roughnessNode = source.roughnessNode;
  41. return super.copy( source );
  42. }
  43. }
  44. export default MeshStandardNodeMaterial;
  45. addNodeMaterial( 'MeshStandardNodeMaterial', MeshStandardNodeMaterial );