12 #ifndef hifi_OBJSerializer_h
13 #define hifi_OBJSerializer_h
15 #include <QtNetwork/QNetworkReply>
16 #include <hfm/HFMSerializer.h>
20 OBJTokenizer(QIODevice* device);
23 NO_PUSHBACKED_TOKEN = -1,
27 int nextToken(
bool allowSpaceChar =
false);
28 const hifi::ByteArray& getDatum()
const {
return _datum; }
29 bool isNextTokenFloat();
30 const hifi::ByteArray getLineAsDatum();
31 void skipLine() { _device->readLine(); }
32 void pushBackToken(
int token) { _pushedBackToken = token; }
33 void ungetChar(
char ch) { _device->ungetChar(ch); }
34 const QString getComment()
const {
return _comment; }
36 bool getVertex(glm::vec3& vertex, glm::vec3& vertexColor);
42 hifi::ByteArray _datum;
49 QVector<int> vertexIndices;
50 QVector<int> textureUVIndices;
51 QVector<int> normalIndices;
55 bool add(
const hifi::ByteArray& vertexIndex,
const hifi::ByteArray& textureIndex,
const hifi::ByteArray& normalIndex,
56 const QVector<glm::vec3>& vertices,
const QVector<glm::vec3>& vertexColors);
59 QVector<OBJFace> triangulate();
61 void addFrom(
const OBJFace* face,
int index);
64 class OBJMaterialTextureOptions {
66 float bumpMultiplier { 1.0f };
75 glm::vec3 diffuseColor;
76 glm::vec3 specularColor;
77 glm::vec3 emissiveColor;
78 hifi::ByteArray diffuseTextureFilename;
79 hifi::ByteArray specularTextureFilename;
80 hifi::ByteArray emissiveTextureFilename;
81 hifi::ByteArray bumpTextureFilename;
82 hifi::ByteArray opacityTextureFilename;
84 OBJMaterialTextureOptions bumpTextureOptions;
85 int illuminationModel;
87 bool userSpecifiesUV {
false };
88 OBJMaterial() : shininess(0.0f), opacity(1.0f), diffuseColor(0.9f), specularColor(0.9f), emissiveColor(0.0f), illuminationModel(-1) {}
91 class OBJSerializer:
public QObject,
public HFMSerializer {
94 MediaType getMediaType()
const override;
95 std::unique_ptr<hfm::Serializer::Factory> getFactory()
const override;
97 typedef QVector<OBJFace> FaceGroup;
98 QVector<glm::vec3> vertices;
99 QVector<glm::vec3> vertexColors;
100 QVector<glm::vec2> textureUVs;
101 QVector<glm::vec3> normals;
102 QVector<FaceGroup> faceGroups;
103 QString currentMaterialName;
104 QHash<QString, OBJMaterial> materials;
106 HFMModel::Pointer read(
const hifi::ByteArray& data,
const hifi::VariantHash& mapping,
const hifi::URL& url = hifi::URL())
override;
111 QHash<hifi::ByteArray, bool> librariesSeen;
112 bool parseOBJGroup(OBJTokenizer& tokenizer,
const hifi::VariantHash& mapping,
HFMModel& hfmModel,
113 float& scaleGuess,
bool combineParts);
114 void parseMaterialLibrary(QIODevice* device);
115 void parseTextureLine(
const hifi::ByteArray& textureLine, hifi::ByteArray& filename, OBJMaterialTextureOptions& textureOptions);
116 bool isValidTexture(
const hifi::ByteArray &filename);
118 int _partCounter { 0 };
122 void setMeshPartDefaults(
HFMMeshPart& meshPart, QString materialID);
123 void hfmDebugDump(
const HFMModel& hfmModel);
A single part of a mesh (with the same material).
Definition: HFM.h:152
The runtime model format.
Definition: HFM.h:302