/src/away3d/tools/serialize/Serialize.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 178 lines · 153 code · 24 blank · 1 comment · 18 complexity · b758706ac4faef13b71b741c0c44f7e5 MD5 · raw file

  1. package away3d.tools.serialize
  2. {
  3. import away3d.animators.IAnimator;
  4. import away3d.animators.data.JointPose;
  5. import away3d.animators.data.Skeleton;
  6. import away3d.animators.data.SkeletonJoint;
  7. import away3d.animators.data.SkeletonPose;
  8. import away3d.arcane;
  9. import away3d.containers.ObjectContainer3D;
  10. import away3d.containers.Scene3D;
  11. import away3d.core.base.ISubGeometry;
  12. import away3d.core.base.SkinnedSubGeometry;
  13. import away3d.core.base.SubMesh;
  14. import away3d.entities.Mesh;
  15. import away3d.materials.MaterialBase;
  16. import away3d.materials.lightpickers.StaticLightPicker;
  17. import flash.utils.getQualifiedClassName;
  18. use namespace arcane;
  19. public class Serialize
  20. {
  21. public static var tabSize:uint = 2;
  22. public function Serialize()
  23. {
  24. }
  25. public static function serializeScene(scene:Scene3D, serializer:SerializerBase):void
  26. {
  27. for (var i:uint = 0; i < scene.numChildren; i++)
  28. serializeObjectContainer(scene.getChildAt(i), serializer);
  29. }
  30. public static function serializeObjectContainer(objectContainer3D:ObjectContainer3D, serializer:SerializerBase):void
  31. {
  32. if (objectContainer3D is Mesh)
  33. serializeMesh(objectContainer3D as Mesh, serializer); // do not indent any extra for first level here
  34. else
  35. serializeObjectContainerInternal(objectContainer3D, serializer, true /* serializeChildrenAndEnd */);
  36. }
  37. public static function serializeMesh(mesh:Mesh, serializer:SerializerBase):void
  38. {
  39. serializeObjectContainerInternal(mesh as ObjectContainer3D, serializer, false /* serializeChildrenAndEnd */);
  40. serializer.writeBoolean("castsShadows", mesh.castsShadows);
  41. if (mesh.animator)
  42. serializeAnimationState(mesh.animator, serializer);
  43. if (mesh.material)
  44. serializeMaterial(mesh.material, serializer);
  45. if (mesh.subMeshes.length) {
  46. for each (var subMesh:SubMesh in mesh.subMeshes)
  47. serializeSubMesh(subMesh, serializer);
  48. }
  49. serializeChildren(mesh as ObjectContainer3D, serializer);
  50. serializer.endObject();
  51. }
  52. public static function serializeAnimationState(animator:IAnimator, serializer:SerializerBase):void
  53. {
  54. serializer.beginObject(classNameFromInstance(animator), null);
  55. serializeAnimator(animator, serializer);
  56. serializer.endObject();
  57. }
  58. public static function serializeAnimator(animator:IAnimator, serializer:SerializerBase):void
  59. {
  60. serializer.beginObject(classNameFromInstance(animator), null);
  61. serializer.endObject();
  62. }
  63. public static function serializeSubMesh(subMesh:SubMesh, serializer:SerializerBase):void
  64. {
  65. serializer.beginObject(classNameFromInstance(subMesh), null);
  66. if (subMesh.material)
  67. serializeMaterial(subMesh.material, serializer);
  68. if (subMesh.subGeometry)
  69. serializeSubGeometry(subMesh.subGeometry, serializer);
  70. serializer.endObject();
  71. }
  72. public static function serializeMaterial(material:MaterialBase, serializer:SerializerBase):void
  73. {
  74. serializer.beginObject(classNameFromInstance(material), material.name);
  75. if (material.lightPicker is StaticLightPicker)
  76. serializer.writeString("lights", String(StaticLightPicker(material.lightPicker).lights));
  77. serializer.writeBoolean("mipmap", material.mipmap);
  78. serializer.writeBoolean("smooth", material.smooth);
  79. serializer.writeBoolean("repeat", material.repeat);
  80. serializer.writeBoolean("bothSides", material.bothSides);
  81. serializer.writeString("blendMode", material.blendMode);
  82. serializer.writeBoolean("requiresBlending", material.requiresBlending);
  83. serializer.writeUint("uniqueId", material.uniqueId);
  84. serializer.writeUint("numPasses", material.numPasses);
  85. serializer.endObject();
  86. }
  87. public static function serializeSubGeometry(subGeometry:ISubGeometry, serializer:SerializerBase):void
  88. {
  89. serializer.beginObject(classNameFromInstance(subGeometry), null);
  90. serializer.writeUint("numTriangles", subGeometry.numTriangles);
  91. if (subGeometry.indexData)
  92. serializer.writeUint("numIndices", subGeometry.indexData.length);
  93. serializer.writeUint("numVertices", subGeometry.numVertices);
  94. if (subGeometry.UVData)
  95. serializer.writeUint("numUVs", subGeometry.UVData.length);
  96. var skinnedSubGeometry:SkinnedSubGeometry = subGeometry as SkinnedSubGeometry;
  97. if (skinnedSubGeometry) {
  98. if (skinnedSubGeometry.jointWeightsData)
  99. serializer.writeUint("numJointWeights", skinnedSubGeometry.jointWeightsData.length);
  100. if (skinnedSubGeometry.jointIndexData)
  101. serializer.writeUint("numJointIndexes", skinnedSubGeometry.jointIndexData.length);
  102. }
  103. serializer.endObject();
  104. }
  105. public static function serializeSkeletonJoint(skeletonJoint:SkeletonJoint, serializer:SerializerBase):void
  106. {
  107. serializer.beginObject(classNameFromInstance(skeletonJoint), skeletonJoint.name);
  108. serializer.writeInt("parentIndex", skeletonJoint.parentIndex);
  109. serializer.writeTransform("inverseBindPose", skeletonJoint.inverseBindPose);
  110. serializer.endObject();
  111. }
  112. public static function serializeSkeleton(skeleton:Skeleton, serializer:SerializerBase):void
  113. {
  114. serializer.beginObject(classNameFromInstance(skeleton), skeleton.name);
  115. for each (var skeletonJoint:SkeletonJoint in skeleton.joints)
  116. serializeSkeletonJoint(skeletonJoint, serializer);
  117. serializer.endObject();
  118. }
  119. public static function serializeJointPose(jointPose:JointPose, serializer:SerializerBase):void
  120. {
  121. serializer.beginObject(classNameFromInstance(jointPose), jointPose.name);
  122. serializer.writeVector3D("translation", jointPose.translation);
  123. serializer.writeQuaternion("orientation", jointPose.orientation);
  124. serializer.endObject();
  125. }
  126. public static function serializeSkeletonPose(skeletonPose:SkeletonPose, serializer:SerializerBase):void
  127. {
  128. serializer.beginObject(classNameFromInstance(skeletonPose), "" /*skeletonPose.name*/);
  129. serializer.writeUint("numJointPoses", skeletonPose.numJointPoses);
  130. for each (var jointPose:JointPose in skeletonPose.jointPoses)
  131. serializeJointPose(jointPose, serializer);
  132. serializer.endObject();
  133. }
  134. // private stuff - shouldn't ever need to call externally
  135. private static function serializeChildren(parent:ObjectContainer3D, serializer:SerializerBase):void
  136. {
  137. for (var i:uint = 0; i < parent.numChildren; i++)
  138. serializeObjectContainer(parent.getChildAt(i), serializer);
  139. }
  140. private static function classNameFromInstance(instance:*):String
  141. {
  142. return getQualifiedClassName(instance).split("::").pop();
  143. }
  144. private static function serializeObjectContainerInternal(objectContainer:ObjectContainer3D, serializer:SerializerBase, serializeChildrenAndEnd:Boolean):void
  145. {
  146. serializer.beginObject(classNameFromInstance(objectContainer), objectContainer.name);
  147. serializer.writeTransform("transform", objectContainer.transform.rawData);
  148. if (serializeChildrenAndEnd) {
  149. serializeChildren(objectContainer, serializer);
  150. serializer.endObject();
  151. }
  152. }
  153. }
  154. }