3
0

LegacyTransformComponentConverter.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. """
  2. Copyright (c) Contributors to the Open 3D Engine Project.
  3. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. SPDX-License-Identifier: Apache-2.0 OR MIT
  5. Lumberyard Transform Component to O3de Non-Linear Transform Component Conversion Script
  6. """
  7. import math
  8. from LegacyConversionHelpers import *
  9. class Transform_Component_Converter(Component_Converter):
  10. """
  11. Converts transform components using non-linear scaling
  12. """
  13. def __init__(self, assetCatalogHelper, statsCollector, _):
  14. Component_Converter.__init__(self, assetCatalogHelper, statsCollector)
  15. self.scale = ""
  16. def is_this_the_component_im_looking_for(self, xmlElement, parent):
  17. if "name" in xmlElement.keys() and xmlElement.get("name") == "TransformComponent":
  18. return True
  19. return False
  20. def gather_info_for_conversion(self, xmlElement, _):
  21. # First, get the data that we need
  22. # <Class name="TransformComponent" field="element" version="9" type="{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0}">
  23. # <Class name="EditorComponentBase" field="BaseClass1" version="1" type="{D5346BD4-7F20-444E-B370-327ACD03D4A0}">
  24. # <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
  25. # <Class name="AZ::u64" field="Id" value="3473792412003464537" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
  26. # </Class>
  27. # </Class>
  28. # <Class name="EntityId" field="Parent Entity" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
  29. # <Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
  30. # </Class>
  31. # <Class name="EditorTransform" field="Transform Data" version="2" type="{B02B7063-D238-4F40-A724-405F7A6D68CB}">
  32. # <Class name="Vector3" field="Translate" value="0.0000000 0.0000000 0.0000000" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/>
  33. # <Class name="Vector3" field="Rotate" value="0.0000000 0.0000000 0.0000000" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/>
  34. # <Class name="Vector3" field="Scale" value="1.0000000 2.0000000 1.0000000" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/>
  35. # <Class name="bool" field="Locked" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
  36. # </Class>
  37. # <Class name="Transform" field="Cached World Transform" value="1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000" type="{5D9958E9-9F1E-4985-B532-FFFDE75FEDFD}"/>
  38. # <Class name="EntityId" field="Cached World Transform Parent" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
  39. # <Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
  40. # </Class>
  41. # <Class name="unsigned int" field="Parent Activation Transform Mode" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
  42. # <Class name="bool" field="IsStatic" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
  43. # <Class name="bool" field="Sync Enabled" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
  44. # <Class name="unsigned int" field="InterpolatePosition" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
  45. # <Class name="unsigned int" field="InterpolateRotation" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
  46. # </Class>
  47. for transformComponentChild in xmlElement:
  48. if "name" in transformComponentChild.keys() and transformComponentChild.get("name") == "EditorTransform":
  49. for editorTransformNodeChild in transformComponentChild:
  50. if "field" in editorTransformNodeChild.keys() and editorTransformNodeChild.get("field") == "Scale":
  51. self.scale = editorTransformNodeChild.get("value")
  52. def scale_is_uniform(self, scale):
  53. xyzValues = scale.split(' ')
  54. if len(xyzValues) != 3:
  55. return False
  56. if not math.isclose(float(xyzValues[0]), float(xyzValues[1]), abs_tol = 0.01):
  57. return False
  58. if not math.isclose(float(xyzValues[1]), float(xyzValues[2]), abs_tol = 0.01):
  59. return False
  60. return True
  61. def create_non_uniform_scale_component(self, scale):
  62. # <Class name="EditorNonUniformScaleComponent" field="element" version="1" type="{2933FB4F-B3DA-4CD1-8106-F37300730777}">
  63. # <Class name="EditorComponentBase" field="BaseClass1" version="1" type="{D5346BD4-7F20-444E-B370-327ACD03D4A0}">
  64. # <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
  65. # <Class name="AZ::u64" field="Id" value="11681351500092629784" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
  66. # </Class>
  67. # </Class>
  68. # <Class name="Vector3" field="NonUniformScale" value="2.0000000 1.0000000 1.0000000" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/>
  69. # <Class name="ComponentModeDelegate" field="ComponentMode" version="1" type="{635B28F0-601A-43D2-A42A-02C4A88CD9C2}"/>
  70. # </Class>
  71. editorNonUniformScaleComponent = xml.etree.ElementTree.Element("Class", {
  72. 'name': "EditorNonUniformScaleComponent",
  73. 'field': "element",
  74. 'version': "1",
  75. 'type': "{2933FB4F-B3DA-4CD1-8106-F37300730777}"
  76. })
  77. editorComponentBase = xml.etree.ElementTree.Element("Class", {
  78. 'name': "EditorComponentBase",
  79. 'field': "BaseClass1",
  80. 'version': "1",
  81. 'type': "{D5346BD4-7F20-444E-B370-327ACD03D4A0}"
  82. })
  83. component = xml.etree.ElementTree.Element("Class", {
  84. 'name': "AZ::Component",
  85. 'field': "BaseClass1",
  86. 'type': "{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"
  87. })
  88. u64 = xml.etree.ElementTree.Element("Class", {
  89. 'name': "AZ::u64",
  90. 'field': "Id",
  91. 'value': "11681351500092629784",
  92. 'type': "{D6597933-47CD-4FC8-B911-63F3E2B0993A}"
  93. })
  94. component.append(u64)
  95. editorComponentBase.append(component)
  96. vector3 = xml.etree.ElementTree.Element("Class", {
  97. 'name': "Vector3",
  98. 'field': "NonUniformScale",
  99. 'value': scale,
  100. 'type': "{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"
  101. })
  102. componentModeDelegate = xml.etree.ElementTree.Element("Class", {
  103. 'name': "ComponentModeDelegate",
  104. 'field': "ComponentMode",
  105. 'version': "1",
  106. 'type': "{635B28F0-601A-43D2-A42A-02C4A88CD9C2}"
  107. })
  108. editorNonUniformScaleComponent.append(editorComponentBase)
  109. editorNonUniformScaleComponent.append(vector3)
  110. editorNonUniformScaleComponent.append(componentModeDelegate)
  111. return editorNonUniformScaleComponent
  112. def convert(self, xmlElement, parent):
  113. if self.scale_is_uniform(self.scale):
  114. return
  115. # Reset scale
  116. for transformComponentChild in xmlElement:
  117. if "name" in transformComponentChild.keys() and transformComponentChild.get("name") == "EditorTransform":
  118. for editorTransformNodeChild in transformComponentChild:
  119. if "field" in editorTransformNodeChild.keys() and editorTransformNodeChild.get("field") == "Scale":
  120. editorTransformNodeChild.set("value", "1.0000000 1.0000000 1.0000000")
  121. parent.append(self.create_non_uniform_scale_component(
  122. self.scale
  123. ))
  124. def reset(self):
  125. self.scale = ""