serializationTools.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { NodeMaterial } from 'babylonjs/Materials/Node/nodeMaterial';
  2. import { GlobalState } from './globalState';
  3. import { Texture } from 'babylonjs/Materials/Textures/texture';
  4. import { DataStorage } from 'babylonjs/Misc/dataStorage';
  5. import { NodeMaterialBlock } from 'babylonjs/Materials/Node/nodeMaterialBlock';
  6. import { Nullable } from 'babylonjs/types';
  7. import { GraphFrame } from './diagram/graphFrame';
  8. export class SerializationTools {
  9. public static UpdateLocations(material: NodeMaterial, globalState: GlobalState, frame?: Nullable<GraphFrame>) {
  10. material.editorData = {
  11. locations: []
  12. };
  13. // Store node locations
  14. const blocks: NodeMaterialBlock[] = frame ? frame.nodes.map(n => n.block) : material.attachedBlocks;
  15. for (var block of blocks) {
  16. let node = globalState.onGetNodeFromBlock(block);
  17. material.editorData.locations.push({
  18. blockId: block.uniqueId,
  19. x: node ? node.x : 0,
  20. y: node ? node.y : 0
  21. });
  22. }
  23. globalState.storeEditorData(material.editorData, frame);
  24. }
  25. public static Serialize(material: NodeMaterial, globalState: GlobalState, frame?: Nullable<GraphFrame>) {
  26. let bufferSerializationState = Texture.SerializeBuffers;
  27. Texture.SerializeBuffers = DataStorage.ReadBoolean("EmbedTextures", true);
  28. this.UpdateLocations(material, globalState, frame);
  29. const selectedBlocks = frame ? frame.nodes.map(n => n.block) : undefined;
  30. let serializationObject = material.serialize(selectedBlocks);
  31. Texture.SerializeBuffers = bufferSerializationState;
  32. return JSON.stringify(serializationObject, undefined, 2);
  33. }
  34. public static Deserialize(serializationObject: any, globalState: GlobalState) {
  35. globalState.onIsLoadingChanged.notifyObservers(true);
  36. globalState.nodeMaterial!.loadFromSerialization(serializationObject, "");
  37. }
  38. public static AddFrameToMaterial(serializationObject: any, globalState: GlobalState, currentMaterial: NodeMaterial) {
  39. globalState.onIsLoadingChanged.notifyObservers(true);
  40. this.UpdateLocations(currentMaterial, globalState);
  41. globalState.nodeMaterial!.loadFromSerialization(serializationObject, "", true);
  42. globalState.onImportFrameObservable.notifyObservers(serializationObject);
  43. }
  44. }