mirror of
https://github.com/overte-org/overte.git
synced 2025-08-12 14:53:58 +02:00
make OBJ reader able to handle files where some vertices have colors and others don't
This commit is contained in:
parent
71f0899178
commit
5e04e84953
1 changed files with 17 additions and 4 deletions
|
@ -118,7 +118,7 @@ glm::vec3 OBJTokenizer::getVec3() {
|
||||||
auto z = getFloat();
|
auto z = getFloat();
|
||||||
auto v = glm::vec3(x, y, z);
|
auto v = glm::vec3(x, y, z);
|
||||||
while (isNextTokenFloat()) {
|
while (isNextTokenFloat()) {
|
||||||
// the spec(s) get(s) vague here. might be w, might be a color... chop it off.
|
// ignore any following floats
|
||||||
nextToken();
|
nextToken();
|
||||||
}
|
}
|
||||||
return v;
|
return v;
|
||||||
|
@ -130,6 +130,7 @@ bool OBJTokenizer::getVertex(glm::vec3& vertex, glm::vec3& vertexColor) {
|
||||||
auto y = getFloat(); // And order of arguments is different on Windows/Linux.
|
auto y = getFloat(); // And order of arguments is different on Windows/Linux.
|
||||||
auto z = getFloat();
|
auto z = getFloat();
|
||||||
vertex = glm::vec3(x, y, z);
|
vertex = glm::vec3(x, y, z);
|
||||||
|
vertexColor = glm::vec3(1.0f); // default, in case there is not color information
|
||||||
|
|
||||||
auto r = 1.0f, g = 1.0f, b = 1.0f;
|
auto r = 1.0f, g = 1.0f, b = 1.0f;
|
||||||
bool hasVertexColor = false;
|
bool hasVertexColor = false;
|
||||||
|
@ -139,7 +140,7 @@ bool OBJTokenizer::getVertex(glm::vec3& vertex, glm::vec3& vertexColor) {
|
||||||
// only a single value) that it's a vertex color.
|
// only a single value) that it's a vertex color.
|
||||||
r = getFloat();
|
r = getFloat();
|
||||||
if (isNextTokenFloat()) {
|
if (isNextTokenFloat()) {
|
||||||
// Safe to assume the following values are the green/blue components.
|
// Safe to assume the following values are the green/blue components.
|
||||||
g = getFloat();
|
g = getFloat();
|
||||||
b = getFloat();
|
b = getFloat();
|
||||||
|
|
||||||
|
@ -351,6 +352,8 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi
|
||||||
bool result = true;
|
bool result = true;
|
||||||
int originalFaceCountForDebugging = 0;
|
int originalFaceCountForDebugging = 0;
|
||||||
QString currentGroup;
|
QString currentGroup;
|
||||||
|
bool anyVertexColor { false };
|
||||||
|
int vertexCount { 0 };
|
||||||
|
|
||||||
setMeshPartDefaults(meshPart, QString("dontknow") + QString::number(mesh.parts.count()));
|
setMeshPartDefaults(meshPart, QString("dontknow") + QString::number(mesh.parts.count()));
|
||||||
|
|
||||||
|
@ -416,10 +419,20 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi
|
||||||
|
|
||||||
bool hasVertexColor = tokenizer.getVertex(vertex, vertexColor);
|
bool hasVertexColor = tokenizer.getVertex(vertex, vertexColor);
|
||||||
vertices.append(vertex);
|
vertices.append(vertex);
|
||||||
|
|
||||||
if(hasVertexColor) {
|
// if any vertex has color, they all need to.
|
||||||
|
if (hasVertexColor && !anyVertexColor) {
|
||||||
|
// we've had a gap of zero or more vertices without color, followed
|
||||||
|
// by one that has color. catch up:
|
||||||
|
for (int i = 0; i < vertexCount; i++) {
|
||||||
|
vertexColors.append(glm::vec3(1.0f));
|
||||||
|
}
|
||||||
|
anyVertexColor = true;
|
||||||
|
}
|
||||||
|
if (anyVertexColor) {
|
||||||
vertexColors.append(vertexColor);
|
vertexColors.append(vertexColor);
|
||||||
}
|
}
|
||||||
|
vertexCount++;
|
||||||
} else if (token == "vn") {
|
} else if (token == "vn") {
|
||||||
normals.append(tokenizer.getVec3());
|
normals.append(tokenizer.getVec3());
|
||||||
} else if (token == "vt") {
|
} else if (token == "vt") {
|
||||||
|
|
Loading…
Reference in a new issue