LightingContextNode.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import ContextNode from '../core/ContextNode.js';
  2. import { float, vec3, add, temp } from '../shadernode/ShaderNodeBaseElements.js';
  3. class LightingContextNode extends ContextNode {
  4. constructor( node, lightingModelNode = null ) {
  5. super( node );
  6. this.lightingModelNode = lightingModelNode;
  7. }
  8. getNodeType( /*builder*/ ) {
  9. return 'vec3';
  10. }
  11. generate( builder ) {
  12. const { context, lightingModelNode } = this;
  13. if ( context.reflectedLight === undefined ) {
  14. const directDiffuse = temp( vec3() ),
  15. directSpecular = temp( vec3() ),
  16. indirectDiffuse = temp( vec3() ),
  17. indirectSpecular = temp( vec3() );
  18. context.reflectedLight = {
  19. directDiffuse,
  20. directSpecular,
  21. indirectDiffuse,
  22. indirectSpecular,
  23. total: add( directDiffuse, directSpecular, indirectDiffuse, indirectSpecular )
  24. };
  25. context.radiance = temp( vec3() );
  26. context.irradiance = temp( vec3() );
  27. context.iblIrradiance = temp( vec3() );
  28. context.ambientOcclusion = temp( float( 1 ) );
  29. }
  30. context.lightingModelNode = lightingModelNode || context.lightingModelNode;
  31. const type = this.getNodeType( builder );
  32. super.generate( builder, type );
  33. if ( lightingModelNode?.indirectDiffuse ) lightingModelNode.indirectDiffuse.call( context );
  34. if ( lightingModelNode?.indirectSpecular ) lightingModelNode.indirectSpecular.call( context );
  35. if ( lightingModelNode?.ambientOcclusion ) lightingModelNode.ambientOcclusion.call( context );
  36. return context.reflectedLight.total.build( builder, type );
  37. }
  38. }
  39. export default LightingContextNode;
粤ICP备19079148号