-
Notifications
You must be signed in to change notification settings - Fork 0
/
MeshData.cpp
99 lines (92 loc) · 4.11 KB
/
MeshData.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//
// MeshData.cpp
// Curvature
//
// Created by Simon Demeule on 2020-05-05.
// Copyright © 2020 Simon Demeule. All rights reserved.
//
#include "MeshData.hpp"
#include <glm/glm.hpp>
#include <cstring>
#include <vector>
#include <string>
MeshData::MeshData(std::string filePath) {
FILE *file = fopen(filePath.c_str(), "r");
if (file == NULL) {
printf("Unable to open the file ! Are you in the right path ?\n");
getchar();
return;
}
while(1){
char lineHeader[128];
// read the first word of the line
int res = fscanf(file, "%s", lineHeader,128);
if (res == EOF)
break; // EOF = End Of File. Quit the loop.
// else : parse lineHeader
if (strcmp(lineHeader, "v") == 0){
glm::vec3 vertex;
fscanf(file, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z);
vertexData.push_back(vertex);
}
else if (strcmp(lineHeader, "vt") == 0){
glm::vec2 uv;
fscanf(file, "%f %f\n", &uv.x, &uv.y);
uv.y = -uv.y; // Invert V coordinate since we will only use DDS texture, which are inverted. Remove if you want to use TGA or BMP loaders.
uvData.push_back(uv);
}
else if (strcmp(lineHeader, "vn") == 0){
glm::vec3 normal;
fscanf(file, "%f %f %f\n", &normal.x, &normal.y, &normal.z);
normalData.push_back(normal);
}
else if (strcmp(lineHeader, "f") == 0){
int vertexIndex[3], uvIndex[3], normalIndex[3];
bool uv = true;
bool norm = true;
char line [128];
fgets(line, 128, file);
// vertex, uv, norm
int matches = sscanf(line, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &normalIndex[0], &vertexIndex[1], &uvIndex[1], &normalIndex[1], &vertexIndex[2], &uvIndex[2], &normalIndex[2]);
if (matches != 9){
// vertex, norm
matches = sscanf(line, "%d//%d %d//%d %d//%d\n", &vertexIndex[0], &normalIndex[0], &vertexIndex[1], &normalIndex[1], &vertexIndex[2], &normalIndex[2]);
if (matches != 6){
// vertex, uv
matches = sscanf(line, "%d/%d %d/%d %d/%d\n", &vertexIndex[0], &uvIndex[0], &vertexIndex[1], &uvIndex[1], &vertexIndex[2], &uvIndex[2]);
if (matches != 6){
// vertex
matches = sscanf(line, "%d %d %d\n", &vertexIndex[0], &vertexIndex[1], &vertexIndex[2]);
if (matches != 6){
printf("File can't be read by this simple parser. 'f' format expected: d/d/d d/d/d d/d/d || d/d d/d d/d || d//d d//d d//d\n");
printf("Character at %d", ftell(file));
return;
}
uv, norm = false;
} else {
norm;
}
}else{
uv = false;
}
}
vertexIndices.push_back(abs(vertexIndex[0]) - 1);
vertexIndices.push_back(abs(vertexIndex[1]) - 1);
vertexIndices.push_back(abs(vertexIndex[2]) - 1);
if(norm){
normalIndices.push_back(abs(normalIndex[0]) - 1);
normalIndices.push_back(abs(normalIndex[1]) - 1);
normalIndices.push_back(abs(normalIndex[2]) - 1);
}
if(uv){
uvIndices.push_back(abs(uvIndex[0]) - 1);
uvIndices.push_back(abs(uvIndex[1]) - 1);
uvIndices.push_back(abs(uvIndex[2]) - 1);
}
}
else{
char clear[1000];
fgets(clear, 1000, file);
}
}
}