serializationTools.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { NodeMaterial } from 'babylonjs/Materials/Node/nodeMaterial';
  2. import { GlobalState } from './globalState';
  3. import { INodeLocationInfo } from './nodeLocationInfo';
  4. import { Texture } from 'babylonjs/Materials/Textures/texture';
  5. import { DataStorage } from './dataStorage';
  6. export class SerializationTools {
  7. public static Serialize(material: NodeMaterial, globalState: GlobalState) {
  8. let bufferSerializationState = Texture.SerializeBuffers;
  9. Texture.SerializeBuffers = DataStorage.ReadBoolean("EmbedTextures", true);
  10. let serializationObject = material.serialize();
  11. // Store node locations
  12. for (var block of material.attachedBlocks) {
  13. let node = globalState.onGetNodeFromBlock(block);
  14. if (!serializationObject.locations) {
  15. serializationObject.locations = [];
  16. }
  17. serializationObject.locations.push({
  18. blockId: block.uniqueId,
  19. x: node ? node.x : 0,
  20. y: node ? node.y : 0
  21. });
  22. }
  23. Texture.SerializeBuffers = bufferSerializationState;
  24. return JSON.stringify(serializationObject, undefined, 2);
  25. }
  26. public static Deserialize(serializationObject:any, globalState: GlobalState) {
  27. globalState.onIsLoadingChanged.notifyObservers(true);
  28. globalState.nodeMaterial!.loadFromSerialization(serializationObject, "");
  29. // Check for id mapping
  30. if (serializationObject.locations && serializationObject.map) {
  31. let map: {[key: number]: number} = serializationObject.map;
  32. let locations: INodeLocationInfo[] = serializationObject.locations;
  33. for (var location of locations) {
  34. location.blockId = map[location.blockId];
  35. }
  36. }
  37. globalState.onResetRequiredObservable.notifyObservers(serializationObject.locations);
  38. }
  39. }