Object3DNode.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import Node, { addNodeClass } from '../core/Node.js';
  2. import { NodeUpdateType } from '../core/constants.js';
  3. import UniformNode from '../core/UniformNode.js';
  4. import { nodeProxy } from '../shadernode/ShaderNode.js';
  5. import { Vector3 } from 'three';
  6. class Object3DNode extends Node {
  7. constructor( scope = Object3DNode.VIEW_MATRIX, object3d = null ) {
  8. super();
  9. this.scope = scope;
  10. this.object3d = object3d;
  11. this.updateType = NodeUpdateType.OBJECT;
  12. this._uniformNode = new UniformNode( null );
  13. }
  14. getNodeType() {
  15. const scope = this.scope;
  16. if ( scope === Object3DNode.WORLD_MATRIX || scope === Object3DNode.VIEW_MATRIX ) {
  17. return 'mat4';
  18. } else if ( scope === Object3DNode.NORMAL_MATRIX ) {
  19. return 'mat3';
  20. } else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) {
  21. return 'vec3';
  22. }
  23. }
  24. update( frame ) {
  25. const object = this.object3d;
  26. const uniformNode = this._uniformNode;
  27. const scope = this.scope;
  28. if ( scope === Object3DNode.VIEW_MATRIX ) {
  29. uniformNode.value = object.modelViewMatrix;
  30. } else if ( scope === Object3DNode.NORMAL_MATRIX ) {
  31. uniformNode.value = object.normalMatrix;
  32. } else if ( scope === Object3DNode.WORLD_MATRIX ) {
  33. uniformNode.value = object.matrixWorld;
  34. } else if ( scope === Object3DNode.POSITION ) {
  35. uniformNode.value = uniformNode.value || new Vector3();
  36. uniformNode.value.setFromMatrixPosition( object.matrixWorld );
  37. } else if ( scope === Object3DNode.SCALE ) {
  38. uniformNode.value = uniformNode.value || new Vector3();
  39. uniformNode.value.setFromMatrixScale( object.matrixWorld );
  40. } else if ( scope === Object3DNode.DIRECTION ) {
  41. uniformNode.value = uniformNode.value || new Vector3();
  42. object.getWorldDirection( uniformNode.value );
  43. } else if ( scope === Object3DNode.VIEW_POSITION ) {
  44. const camera = frame.camera;
  45. uniformNode.value = uniformNode.value || new Vector3();
  46. uniformNode.value.setFromMatrixPosition( object.matrixWorld );
  47. uniformNode.value.applyMatrix4( camera.matrixWorldInverse );
  48. }
  49. }
  50. generate( builder ) {
  51. const scope = this.scope;
  52. if ( scope === Object3DNode.WORLD_MATRIX || scope === Object3DNode.VIEW_MATRIX ) {
  53. this._uniformNode.nodeType = 'mat4';
  54. } else if ( scope === Object3DNode.NORMAL_MATRIX ) {
  55. this._uniformNode.nodeType = 'mat3';
  56. } else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) {
  57. this._uniformNode.nodeType = 'vec3';
  58. }
  59. return this._uniformNode.build( builder );
  60. }
  61. serialize( data ) {
  62. super.serialize( data );
  63. data.scope = this.scope;
  64. }
  65. deserialize( data ) {
  66. super.deserialize( data );
  67. this.scope = data.scope;
  68. }
  69. }
  70. Object3DNode.VIEW_MATRIX = 'viewMatrix';
  71. Object3DNode.NORMAL_MATRIX = 'normalMatrix';
  72. Object3DNode.WORLD_MATRIX = 'worldMatrix';
  73. Object3DNode.POSITION = 'position';
  74. Object3DNode.SCALE = 'scale';
  75. Object3DNode.VIEW_POSITION = 'viewPosition';
  76. Object3DNode.DIRECTION = 'direction';
  77. export default Object3DNode;
  78. export const objectDirection = nodeProxy( Object3DNode, Object3DNode.DIRECTION );
  79. export const objectViewMatrix = nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX );
  80. export const objectNormalMatrix = nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX );
  81. export const objectWorldMatrix = nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX );
  82. export const objectPosition = nodeProxy( Object3DNode, Object3DNode.POSITION );
  83. export const objectScale = nodeProxy( Object3DNode, Object3DNode.SCALE );
  84. export const objectViewPosition = nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION );
  85. addNodeClass( 'Object3DNode', Object3DNode );