CameraNode.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import Object3DNode from './Object3DNode.js';
  2. import { addNodeClass } from '../core/Node.js';
  3. import { label } from '../core/ContextNode.js';
  4. import { nodeImmutable } from '../shadernode/ShaderNode.js';
  5. class CameraNode extends Object3DNode {
  6. constructor( scope = CameraNode.POSITION ) {
  7. super( scope );
  8. }
  9. getNodeType( builder ) {
  10. const scope = this.scope;
  11. if ( scope === CameraNode.PROJECTION_MATRIX ) {
  12. return 'mat4';
  13. } else if ( scope === CameraNode.NEAR || scope === CameraNode.FAR ) {
  14. return 'float';
  15. }
  16. return super.getNodeType( builder );
  17. }
  18. update( frame ) {
  19. const camera = frame.camera;
  20. const uniformNode = this._uniformNode;
  21. const scope = this.scope;
  22. if ( scope === CameraNode.VIEW_MATRIX ) {
  23. uniformNode.value = camera.matrixWorldInverse;
  24. } else if ( scope === CameraNode.PROJECTION_MATRIX ) {
  25. uniformNode.value = camera.projectionMatrix;
  26. } else if ( scope === CameraNode.NEAR ) {
  27. uniformNode.value = camera.near;
  28. } else if ( scope === CameraNode.FAR ) {
  29. uniformNode.value = camera.far;
  30. } else {
  31. this.object3d = camera;
  32. super.update( frame );
  33. }
  34. }
  35. generate( builder ) {
  36. const scope = this.scope;
  37. if ( scope === CameraNode.PROJECTION_MATRIX ) {
  38. this._uniformNode.nodeType = 'mat4';
  39. } else if ( scope === CameraNode.NEAR || scope === CameraNode.FAR ) {
  40. this._uniformNode.nodeType = 'float';
  41. }
  42. return super.generate( builder );
  43. }
  44. }
  45. CameraNode.PROJECTION_MATRIX = 'projectionMatrix';
  46. CameraNode.NEAR = 'near';
  47. CameraNode.FAR = 'far';
  48. export default CameraNode;
  49. export const cameraProjectionMatrix = label( nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX ), 'projectionMatrix' );
  50. export const cameraNear = nodeImmutable( CameraNode, CameraNode.NEAR );
  51. export const cameraFar = nodeImmutable( CameraNode, CameraNode.FAR );
  52. export const cameraViewMatrix = nodeImmutable( CameraNode, CameraNode.VIEW_MATRIX );
  53. export const cameraNormalMatrix = nodeImmutable( CameraNode, CameraNode.NORMAL_MATRIX );
  54. export const cameraWorldMatrix = nodeImmutable( CameraNode, CameraNode.WORLD_MATRIX );
  55. export const cameraPosition = nodeImmutable( CameraNode, CameraNode.POSITION );
  56. addNodeClass( CameraNode );