babylon.decorators.ts 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. module BABYLON {
  2. function generateSerializableMember(type: number, sourceName?: string) {
  3. return (target: any, propertyKey: string | symbol) => {
  4. if (!target.__serializableMembers) {
  5. target.__serializableMembers = {};
  6. }
  7. if (!target.__serializableMembers[propertyKey]) {
  8. target.__serializableMembers[propertyKey] = { type: type, sourceName: sourceName };
  9. }
  10. }
  11. }
  12. function generateExpandMember(setCallback: string) {
  13. return (target: any, propertyKey: string) => {
  14. if (setCallback) {
  15. var key = "_" + propertyKey;
  16. Object.defineProperty(target, propertyKey, {
  17. get: function () {
  18. return this[key];
  19. },
  20. set: function (value) {
  21. if (this[key] === value) {
  22. return;
  23. }
  24. this[key] = value;
  25. target[setCallback].apply(this);
  26. },
  27. enumerable: true,
  28. configurable: true
  29. });
  30. }
  31. }
  32. }
  33. export function expandToProperty(callback: string) {
  34. return generateExpandMember(callback);
  35. }
  36. export function serialize(sourceName?: string) {
  37. return generateSerializableMember(0, sourceName); // value member
  38. }
  39. export function serializeAsTexture(sourceName?: string) {
  40. return generateSerializableMember(1, sourceName);// texture member
  41. }
  42. export function serializeAsColor3(sourceName?: string) {
  43. return generateSerializableMember(2, sourceName); // color3 member
  44. }
  45. export function serializeAsFresnelParameters(sourceName?: string) {
  46. return generateSerializableMember(3, sourceName); // fresnel parameters member
  47. }
  48. export function serializeAsVector2(sourceName?: string) {
  49. return generateSerializableMember(4, sourceName); // vector2 member
  50. }
  51. export function serializeAsVector3(sourceName?: string) {
  52. return generateSerializableMember(5, sourceName); // vector3 member
  53. }
  54. export function serializeAsMeshReference(sourceName?: string) {
  55. return generateSerializableMember(6, sourceName); // mesh reference member
  56. }
  57. export function serializeAsColorCurves(sourceName?: string) {
  58. return generateSerializableMember(7, sourceName); // color curves
  59. }
  60. export class SerializationHelper {
  61. public static Serialize<T>(entity: T, serializationObject?: any): any {
  62. if (!serializationObject) {
  63. serializationObject = {};
  64. }
  65. // Tags
  66. serializationObject.tags = Tags.GetTags(entity);
  67. // Properties
  68. for (var property in (<any>entity).__serializableMembers) {
  69. var propertyDescriptor = (<any>entity).__serializableMembers[property];
  70. var targetPropertyName = propertyDescriptor.sourceName || property;
  71. var propertyType = propertyDescriptor.type;
  72. var sourceProperty = entity[property];
  73. if (sourceProperty !== undefined && sourceProperty !== null) {
  74. switch (propertyType) {
  75. case 0: // Value
  76. serializationObject[targetPropertyName] = sourceProperty;
  77. break;
  78. case 1: // Texture
  79. serializationObject[targetPropertyName] = sourceProperty.serialize();
  80. break;
  81. case 2: // Color3
  82. serializationObject[targetPropertyName] = sourceProperty.asArray();
  83. break;
  84. case 3: // FresnelParameters
  85. serializationObject[targetPropertyName] = sourceProperty.serialize();
  86. break;
  87. case 4: // Vector2
  88. serializationObject[targetPropertyName] = sourceProperty.asArray();
  89. break;
  90. case 5: // Vector3
  91. serializationObject[targetPropertyName] = sourceProperty.asArray();
  92. break;
  93. case 6: // Mesh reference
  94. serializationObject[targetPropertyName] = sourceProperty.id;
  95. break;
  96. case 7: // Color Curves
  97. serializationObject[targetPropertyName] = sourceProperty.serialize();
  98. break;
  99. }
  100. }
  101. }
  102. return serializationObject;
  103. }
  104. public static Parse<T>(creationFunction: () => T, source: any, scene: Scene, rootUrl?: string): T {
  105. var destination = creationFunction();
  106. // Tags
  107. Tags.AddTagsTo(destination, source.tags);
  108. // Properties
  109. for (var property in (<any>destination).__serializableMembers) {
  110. var propertyDescriptor = (<any>destination).__serializableMembers[property];
  111. var sourceProperty = source[propertyDescriptor.sourceName || property];
  112. var propertyType = propertyDescriptor.type;
  113. if (sourceProperty !== undefined && sourceProperty !== null) {
  114. switch (propertyType) {
  115. case 0: // Value
  116. destination[property] = sourceProperty;
  117. break;
  118. case 1: // Texture
  119. destination[property] = Texture.Parse(sourceProperty, scene, rootUrl);
  120. break;
  121. case 2: // Color3
  122. destination[property] = Color3.FromArray(sourceProperty);
  123. break;
  124. case 3: // FresnelParameters
  125. destination[property] = FresnelParameters.Parse(sourceProperty);
  126. break;
  127. case 4: // Vector2
  128. destination[property] = Vector2.FromArray(sourceProperty);
  129. break;
  130. case 5: // Vector3
  131. destination[property] = Vector3.FromArray(sourceProperty);
  132. break;
  133. case 6: // Mesh reference
  134. destination[property] = scene.getLastMeshByID(sourceProperty);
  135. break;
  136. case 7: // Color Curves
  137. destination[property] = ColorCurves.Parse(sourceProperty);
  138. break;
  139. }
  140. }
  141. }
  142. return destination;
  143. }
  144. public static Clone<T>(creationFunction: () => T, source: T): T {
  145. var destination = creationFunction();
  146. // Tags
  147. Tags.AddTagsTo(destination, (<any>source).tags);
  148. // Properties
  149. for (var property in (<any>destination).__serializableMembers) {
  150. var propertyDescriptor = (<any>destination).__serializableMembers[property];
  151. var sourceProperty = source[property];
  152. var propertyType = propertyDescriptor.type;
  153. if (sourceProperty !== undefined && sourceProperty !== null) {
  154. switch (propertyType) {
  155. case 0: // Value
  156. case 6: // Mesh reference
  157. destination[property] = sourceProperty;
  158. break;
  159. case 1: // Texture
  160. case 2: // Color3
  161. case 3: // FresnelParameters
  162. case 4: // Vector2
  163. case 5: // Vector3
  164. case 7: // Color Curves
  165. destination[property] = sourceProperty.clone();
  166. break;
  167. }
  168. }
  169. }
  170. return destination;
  171. }
  172. }
  173. }