Overte C++ Documentation
FBXSerializer.h
1 //
2 // FBXSerializer.h
3 // libraries/model-serializers/src
4 //
5 // Created by Andrzej Kapolka on 9/18/13.
6 // Copyright 2013 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_FBXSerializer_h
13 #define hifi_FBXSerializer_h
14 
15 #include <QtGlobal>
16 #include <QMetaType>
17 #include <QSet>
18 #include <QVector>
19 
20 #include <glm/glm.hpp>
21 #include <glm/gtc/quaternion.hpp>
22 
23 #include <Extents.h>
24 #include <Transform.h>
25 #include <shared/HifiTypes.h>
26 
27 #include "FBX.h"
28 #include <hfm/HFMSerializer.h>
29 
30 #include <graphics/Geometry.h>
31 #include <graphics/Material.h>
32 
33 class QIODevice;
34 class FBXNode;
35 
36 class TextureParam {
37 public:
38  glm::vec4 cropping;
39  QString UVSet;
40 
41  glm::vec3 translation;
42  glm::vec3 rotation;
43  glm::vec3 scaling;
44  uint8_t alphaSource;
45  uint8_t currentTextureBlendMode;
46  bool useMaterial;
47 
48  template <typename T>
49  bool assign(T& ref, const T& v) {
50  if (ref == v) {
51  return false;
52  } else {
53  ref = v;
54  isDefault = false;
55  return true;
56  }
57  }
58 
59  bool isDefault;
60 
61  TextureParam() :
62  cropping(0.0f),
63  UVSet("map1"),
64  translation(0.0f),
65  rotation(0.0f),
66  scaling(1.0f),
67  alphaSource(0),
68  currentTextureBlendMode(0),
69  useMaterial(true),
70  isDefault(true)
71  {}
72 
73  TextureParam(const TextureParam& src) :
74  cropping(src.cropping),
75  UVSet(src.UVSet),
76  translation(src.translation),
77  rotation(src.rotation),
78  scaling(src.scaling),
79  alphaSource(src.alphaSource),
80  currentTextureBlendMode(src.currentTextureBlendMode),
81  useMaterial(src.useMaterial),
82  isDefault(src.isDefault)
83  {}
84 
85 };
86 
87 class MaterialParam {
88 public:
89  glm::vec3 translation;
90  glm::vec3 scaling;
91 
92  MaterialParam() :
93  translation(0.0),
94  scaling(1.0)
95  {}
96 
97  MaterialParam(const MaterialParam& src) :
98  translation(src.translation),
99  scaling(src.scaling)
100  {}
101 };
102 
103 class ExtractedMesh;
104 
105 class FBXSerializer : public HFMSerializer {
106 public:
107  virtual ~FBXSerializer() {}
108 
109  MediaType getMediaType() const override;
110  std::unique_ptr<hfm::Serializer::Factory> getFactory() const override;
111 
112  HFMModel* _hfmModel;
115  HFMModel::Pointer read(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url = hifi::URL()) override;
116 
117  FBXNode _rootNode;
118  static FBXNode parseFBX(QIODevice* device);
119 
120  HFMModel* extractHFMModel(const hifi::VariantHash& mapping, const QString& url);
121 
122  static ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex, bool deduplicate);
123  QHash<QString, ExtractedMesh> meshes;
124 
125  HFMTexture getTexture(const QString& textureID, const QString& materialID);
126 
127  QHash<QString, QString> _textureNames;
128  // Hashes the original RelativeFilename of textures
129  QHash<QString, hifi::ByteArray> _textureFilepaths;
130  // Hashes the place to look for textures, in case they are not inlined
131  QHash<QString, hifi::ByteArray> _textureFilenames;
132  // Hashes texture content by filepath, in case they are inlined
133  QHash<hifi::ByteArray, hifi::ByteArray> _textureContent;
134  QHash<QString, TextureParam> _textureParams;
135 
136 
137  QHash<QString, QString> diffuseTextures;
138  QHash<QString, QString> diffuseFactorTextures;
139  QHash<QString, QString> transparentTextures;
140  QHash<QString, QString> bumpTextures;
141  QHash<QString, QString> normalTextures;
142  QHash<QString, QString> specularTextures;
143  QHash<QString, QString> metallicTextures;
144  QHash<QString, QString> roughnessTextures;
145  QHash<QString, QString> shininessTextures;
146  QHash<QString, QString> emissiveTextures;
147  QHash<QString, QString> ambientTextures;
148  QHash<QString, QString> ambientFactorTextures;
149  QHash<QString, QString> occlusionTextures;
150 
151  QHash<QString, HFMMaterial> _hfmMaterials;
152  QHash<QString, MaterialParam> _materialParams;
153 
154  void consolidateHFMMaterials();
155 
156  bool _loadLightmaps { true };
157  float _lightmapOffset { 0.0f };
158  float _lightmapLevel { 1.0f };
159 
160  QMultiMap<QString, QString> _connectionParentMap;
161  QMultiMap<QString, QString> _connectionChildMap;
162 
163  static glm::vec3 getVec3(const QVariantList& properties, int index);
164  static QVector<glm::vec4> createVec4Vector(const QVector<double>& doubleVector);
165  static QVector<glm::vec4> createVec4VectorRGBA(const QVector<double>& doubleVector, glm::vec4& average);
166  static QVector<glm::vec3> createVec3Vector(const QVector<double>& doubleVector);
167  static QVector<glm::vec2> createVec2Vector(const QVector<double>& doubleVector);
168  static glm::mat4 createMat4(const QVector<double>& doubleVector);
169 
170  static QVector<int> getIntVector(const FBXNode& node);
171  static QVector<float> getFloatVector(const FBXNode& node);
172  static QVector<double> getDoubleVector(const FBXNode& node);
173 };
174 
175 #endif // hifi_FBXSerializer_h
A node within an FBX document.
Definition: FBX.h:41
The runtime model format.
Definition: HFM.h:302
A texture map.
Definition: HFM.h:132