Object3DNode.js 2.8 KB

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