!XT (BREAK-16) (Sandbox) Remove double-newlines at the end of files.
[CRYENGINE.git] / Code / Sandbox / Plugins / MeshImporter / GlobalImportSettings.cpp
blobcdaaed0cc7107f764b71f9a30ad3b64a8389603d
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
2 #include "StdAfx.h"
3 #include "GlobalImportSettings.h"
5 #include <Cry3DEngine/I3DEngine.h>
6 #include <IEditor.h>
7 #include <IResourceSelectorHost.h>
8 #include <Material\Material.h>
9 #include <Material\MaterialManager.h>
11 #include <CrySerialization/yasli/Archive.h>
12 #include <CrySerialization/yasli/Enum.h>
13 #include <CrySerialization/StringList.h>
15 YASLI_ENUM_BEGIN_NESTED2(FbxTool, Axes, EAxis, "Axis")
16 YASLI_ENUM(FbxTool::Axes::EAxis::NegX, "-X", "-X");
17 YASLI_ENUM(FbxTool::Axes::EAxis::NegY, "-Y", "-Y");
18 YASLI_ENUM(FbxTool::Axes::EAxis::NegZ, "-Z", "-Z");
19 YASLI_ENUM(FbxTool::Axes::EAxis::PosX, "+X", "+X");
20 YASLI_ENUM(FbxTool::Axes::EAxis::PosY, "+Y", "+Y");
21 YASLI_ENUM(FbxTool::Axes::EAxis::PosZ, "+Z", "+Z");
22 YASLI_ENUM_END()
24 // If 'scale' corresponds to one of the known standard units (with some small
25 // tolerance), the unit's symbol is returned. Otherwise, the value of 'scale'
26 // is converted to string.
27 static QString FormatUnitSizeInCm(double scale)
29 for (int i = 0; i < FbxMetaData::Units::eUnitSetting_COUNT; ++i)
31 const auto unit = (FbxMetaData::Units::EUnitSetting)i;
32 if (FbxMetaData::Units::eUnitSetting_FromFile != unit)
34 if (IsEquivalent((float)scale, (float)FbxMetaData::Units::GetUnitSizeInCm(unit, -1.0)))
36 return QString::fromLatin1(FbxMetaData::Units::GetSymbol(unit));
40 return QString::fromLatin1("%1").arg(scale);
43 static FbxTool::Axes::EAxis GetNextAxisWrapped(FbxTool::Axes::EAxis axis)
45 return FbxTool::Axes::EAxis(((int)axis + 1) % (int)FbxTool::Axes::EAxis::COUNT);
48 ////////////////////////////////////////////////////
50 CGlobalImportSettings::SConversionSettings::SConversionSettings()
51 : unit(FbxMetaData::Units::EUnitSetting::eUnitSetting_FromFile)
52 , scale(1.0f)
53 , forward(FbxTool::Axes::EAxis::PosX)
54 , up(FbxTool::Axes::EAxis::PosY)
55 , oldForward(FbxTool::Axes::EAxis::PosX)
56 , oldUp(FbxTool::Axes::EAxis::PosY)
59 void CGlobalImportSettings::SConversionSettings::Serialize(yasli::Archive& ar)
61 Serialization::StringList options;
62 FbxMetaData::Units::ForallNames([&options](const char* szUnitName)
64 options.push_back(szUnitName);
65 });
66 options[0] += string(" (") + QtUtil::ToString(fileUnitSizeInCm) + string(")");
68 Serialization::StringListValue dropDown(options, (int)unit);
69 ar(dropDown, "unit", "Unit");
71 if (ar.isInput())
73 unit = (FbxMetaData::Units::EUnitSetting)dropDown.index();
76 ar(scale, "scale", "Scale");
77 scale = std::max(0.0f, scale);
79 ar(forward, "forward", "Forward");
80 ar(up, "up", "Up");
82 // Make axes selection consistent.
84 if (forward != oldForward)
86 assert(!ar.isEdit() || up == oldUp);
87 SetForwardAxis(forward);
89 else if (up != oldUp)
91 assert(!ar.isEdit() || forward == oldForward);
92 SetUpAxis(up);
96 void CGlobalImportSettings::SConversionSettings::SetForwardAxis(FbxTool::Axes::EAxis axis)
98 oldForward = axis;
99 forward = axis;
100 while (FbxTool::Axes::Abs(forward) == FbxTool::Axes::Abs(up))
102 up = GetNextAxisWrapped(up);
106 void CGlobalImportSettings::SConversionSettings::SetUpAxis(FbxTool::Axes::EAxis axis)
108 oldUp = axis;
109 up = axis;
110 while (FbxTool::Axes::Abs(forward) == FbxTool::Axes::Abs(up))
112 forward = GetNextAxisWrapped(forward);
116 ////////////////////////////////////////////////////
118 CGlobalImportSettings::SGeneralSettings::SGeneralSettings()
121 CGlobalImportSettings::SStaticMeshSettings::SStaticMeshSettings()
122 : bMergeAllNodes(false)
123 , bSceneOrigin(false)
124 , bComputeNormals(false)
125 , bComputeUv(false)
128 CGlobalImportSettings::CGlobalImportSettings()
129 : m_bStaticMeshSettingsEnabled(true)
132 CGlobalImportSettings::~CGlobalImportSettings() {}
134 FbxMetaData::Units::EUnitSetting CGlobalImportSettings::GetUnit() const
136 return m_conversionSettings.unit;
139 float CGlobalImportSettings::GetScale() const
141 return m_conversionSettings.scale;
144 FbxTool::Axes::EAxis CGlobalImportSettings::GetUpAxis()
146 return m_conversionSettings.up;
149 FbxTool::Axes::EAxis CGlobalImportSettings::GetForwardAxis()
151 return m_conversionSettings.forward;
154 bool CGlobalImportSettings::IsMergeAllNodes() const
156 return m_staticMeshSettings.bMergeAllNodes;
159 bool CGlobalImportSettings::IsSceneOrigin() const
161 return m_staticMeshSettings.bSceneOrigin;
164 bool CGlobalImportSettings::IsComputeNormals() const
166 return m_staticMeshSettings.bComputeNormals;
169 bool CGlobalImportSettings::IsComputeUv() const
171 return m_staticMeshSettings.bComputeUv;
174 void CGlobalImportSettings::SetInputFilePath(const string& filePath)
176 m_generalSettings.inputFilePath = filePath;
177 m_generalSettings.inputFilename = PathUtil::GetFileName(m_generalSettings.inputFilePath);
180 void CGlobalImportSettings::SetOutputFilePath(const string& filePath)
182 m_generalSettings.outputFilePath = filePath;
183 m_generalSettings.outputFilename = PathUtil::GetFileName(m_generalSettings.outputFilePath);
186 void CGlobalImportSettings::ClearFilePaths()
188 m_generalSettings.inputFilePath.clear();
189 m_generalSettings.outputFilePath.clear();
190 m_generalSettings.inputFilename.clear();
191 m_generalSettings.outputFilename.clear();
194 void CGlobalImportSettings::SetFileUnitSizeInCm(double scale)
196 m_conversionSettings.fileUnitSizeInCm = FormatUnitSizeInCm(scale);
199 void CGlobalImportSettings::SetUnit(FbxMetaData::Units::EUnitSetting unit)
201 m_conversionSettings.unit = unit;
204 void CGlobalImportSettings::SetScale(float scale)
206 m_conversionSettings.scale = std::max(0.0f, scale);
209 void CGlobalImportSettings::SetForwardAxis(FbxTool::Axes::EAxis axis)
211 m_conversionSettings.SetForwardAxis(axis);
214 void CGlobalImportSettings::SetUpAxis(FbxTool::Axes::EAxis axis)
216 m_conversionSettings.SetUpAxis(axis);
219 void CGlobalImportSettings::SetMergeAllNodes(bool bMergeAllNodes)
221 m_staticMeshSettings.bMergeAllNodes = bMergeAllNodes;
224 void CGlobalImportSettings::SetSceneOrigin(bool bSceneOrigin)
226 m_staticMeshSettings.bSceneOrigin = bSceneOrigin;
229 void CGlobalImportSettings::SetComputeNormals(bool bComputeNormals)
231 m_staticMeshSettings.bComputeNormals = bComputeNormals;
234 void CGlobalImportSettings::SetComputeUv(bool bComputeUv)
236 m_staticMeshSettings.bComputeUv = bComputeUv;
239 bool CGlobalImportSettings::IsVertexPositionFormatF32() const
241 return m_outputSettings.bVertexPositionFormatF32;
244 void CGlobalImportSettings::SetVertexPositionFormatF32(bool bIs32Bit)
246 m_outputSettings.bVertexPositionFormatF32 = bIs32Bit;
249 void CGlobalImportSettings::SGeneralSettings::Serialize(yasli::Archive& ar)
251 ar(inputFilename, "input_filename", "!Input filename");
252 ar.doc(inputFilePath);
254 ar(outputFilename, "output_filename", "!Output filename");
255 ar.doc(outputFilePath);
258 void CGlobalImportSettings::SStaticMeshSettings::Serialize(yasli::Archive& ar)
260 ar(bMergeAllNodes, "merge_all_nodes", "Merge all nodes");
261 ar(bSceneOrigin, "scene_origin", "Scene origin");
262 ar(bComputeNormals, "compute_normals", "Compute normals");
263 ar.doc("If true the importer computes normals,\n"
264 "otherwise the normals are imported from the file.\n"
265 "Tangents are computed in any case.");
266 ar(bComputeUv, "compute_uv", "Compute UV's");
267 ar.doc("If true the importer generates an automatic UV mapping,\n"
268 "otherwise the UV's are imported from the file.\n"
269 "Useful for correct calculation of tangents, if the source model does not use textured materials.");
272 void CGlobalImportSettings::Serialize(yasli::Archive& ar)
274 ar(m_generalSettings, "general_settings", "General settings");
275 if (ar.isInput() || m_bStaticMeshSettingsEnabled)
277 ar(m_staticMeshSettings, "static_mesh_settings", "Static mesh settings");
279 ar(m_conversionSettings, "conversion_settings", "Conversion settings");
280 ar(m_outputSettings, "output_settings", "Output settings");
283 void CGlobalImportSettings::SetStaticMeshSettingsEnabled(bool bEnabled)
285 m_bStaticMeshSettingsEnabled = bEnabled;
288 void CGlobalImportSettings::SOutputSettings::Serialize(yasli::Archive& ar)
290 ar(bVertexPositionFormatF32, "use_32_bit_positions", "Use 32bit precision");
291 ar.doc("When this option is selected, the importer stores vertex positions using 32 bit per coordinate instead of 16 bit.");