SpriteNodeMaterial.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import NodeMaterial from './NodeMaterial.js';
  2. import { SpriteMaterial } from 'three';
  3. import {
  4. vec2, vec3, vec4,
  5. assign, add, mul, sub,
  6. positionLocal, bypass, length, cos, sin,
  7. modelViewMatrix, cameraProjectionMatrix, modelWorldMatrix, materialRotation
  8. } from '../shadernode/ShaderNodeElements.js';
  9. const defaultValues = new SpriteMaterial();
  10. class SpriteNodeMaterial extends NodeMaterial {
  11. constructor( parameters ) {
  12. super();
  13. this.isSpriteNodeMaterial = true;
  14. this.lights = true;
  15. this.colorNode = null;
  16. this.opacityNode = null;
  17. this.rotationNode = null;
  18. this.alphaTestNode = null;
  19. this.lightNode = null;
  20. this.positionNode = null;
  21. this.setDefaultValues( defaultValues );
  22. this.setValues( parameters );
  23. }
  24. generatePosition( builder ) {
  25. // < VERTEX STAGE >
  26. let vertex = positionLocal;
  27. if ( this.positionNode !== null ) {
  28. vertex = bypass( vertex, assign( positionLocal, this.positionNode ) );
  29. }
  30. let mvPosition = mul( modelViewMatrix, vec4( 0, 0, 0, 1 ) );
  31. const scale = vec2(
  32. length( vec3( modelWorldMatrix[ 0 ].x, modelWorldMatrix[ 0 ].y, modelWorldMatrix[ 0 ].z ) ),
  33. length( vec3( modelWorldMatrix[ 1 ].x, modelWorldMatrix[ 1 ].y, modelWorldMatrix[ 1 ].z ) )
  34. );
  35. const alignedPosition = mul( positionLocal.xy, scale );
  36. const rotation = this.rotationNode || materialRotation;
  37. let rotatedPosition = vec2(
  38. sub( mul( cos( rotation ), alignedPosition.x ), mul( sin( rotation ), alignedPosition.y ) ),
  39. add( mul( sin( rotation ), alignedPosition.x ), mul( cos( rotation ), alignedPosition.y ) )
  40. );
  41. mvPosition = vec4( add( mvPosition.xy, rotatedPosition.xy ), mvPosition.z, mvPosition.w );
  42. const modelViewProjection = mul( cameraProjectionMatrix, mvPosition );
  43. builder.context.vertex = vertex;
  44. builder.addFlow( 'vertex', modelViewProjection );
  45. }
  46. copy( source ) {
  47. this.colorNode = source.colorNode;
  48. this.opacityNode = source.opacityNode;
  49. this.rotationNode = source.rotationNode;
  50. this.alphaTestNode = source.alphaTestNode;
  51. this.lightNode = source.lightNode;
  52. this.positionNode = source.positionNode;
  53. return super.copy( source );
  54. }
  55. }
  56. export default SpriteNodeMaterial;