viewDirectionBlock.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { NodeMaterialBlock } from '../nodeMaterialBlock';
  2. import { NodeMaterialBlockConnectionPointTypes } from '../Enums/nodeMaterialBlockConnectionPointTypes';
  3. import { NodeMaterialBuildState } from '../nodeMaterialBuildState';
  4. import { NodeMaterialConnectionPoint } from '../nodeMaterialBlockConnectionPoint';
  5. import { NodeMaterialBlockTargets } from '../Enums/nodeMaterialBlockTargets';
  6. import { _TypeStore } from '../../../Misc/typeStore';
  7. import { NodeMaterial } from '../nodeMaterial';
  8. import { NodeMaterialSystemValues } from '../Enums/nodeMaterialSystemValues';
  9. import { InputBlock } from './Input/inputBlock';
  10. /**
  11. * Block used to get the view direction
  12. */
  13. export class ViewDirectionBlock extends NodeMaterialBlock {
  14. /**
  15. * Creates a new ViewDirectionBlock
  16. * @param name defines the block name
  17. */
  18. public constructor(name: string) {
  19. super(name, NodeMaterialBlockTargets.Neutral);
  20. this.registerInput("worldPosition", NodeMaterialBlockConnectionPointTypes.Vector4);
  21. this.registerInput("cameraPosition", NodeMaterialBlockConnectionPointTypes.Vector3);
  22. this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.Vector3);
  23. }
  24. /**
  25. * Gets the current class name
  26. * @returns the class name
  27. */
  28. public getClassName() {
  29. return "ViewDirectionBlock";
  30. }
  31. /**
  32. * Gets the world position component
  33. */
  34. public get worldPosition(): NodeMaterialConnectionPoint {
  35. return this._inputs[0];
  36. }
  37. /**
  38. * Gets the camera position component
  39. */
  40. public get cameraPosition(): NodeMaterialConnectionPoint {
  41. return this._inputs[1];
  42. }
  43. /**
  44. * Gets the output component
  45. */
  46. public get output(): NodeMaterialConnectionPoint {
  47. return this._outputs[0];
  48. }
  49. public autoConfigure(material: NodeMaterial) {
  50. if (!this.cameraPosition.isConnected) {
  51. let cameraPositionInput = material.getInputBlockByPredicate((b) => b.systemValue === NodeMaterialSystemValues.CameraPosition);
  52. if (!cameraPositionInput) {
  53. cameraPositionInput = new InputBlock("cameraPosition");
  54. cameraPositionInput.setAsSystemValue(NodeMaterialSystemValues.CameraPosition);
  55. }
  56. cameraPositionInput.output.connectTo(this.cameraPosition);
  57. }
  58. }
  59. protected _buildBlock(state: NodeMaterialBuildState) {
  60. super._buildBlock(state);
  61. let output = this._outputs[0];
  62. state.compilationString += this._declareOutput(output, state) + ` = normalize(${this.cameraPosition.associatedVariableName} - ${this.worldPosition.associatedVariableName}.xyz);\r\n`;
  63. return this;
  64. }
  65. }
  66. _TypeStore.RegisteredTypes["BABYLON.ViewDirectionBlock"] = ViewDirectionBlock;