mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 16:50:43 +02:00
implement on-the-fly conversion of FBXMeshParts that are quads, into their triangle equivalents
This commit is contained in:
parent
452225ddaf
commit
05a4a6aa9b
3 changed files with 62 additions and 5 deletions
|
@ -830,6 +830,56 @@ public:
|
||||||
std::vector<AttributeData> attributes;
|
std::vector<AttributeData> attributes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gpu::BufferPointer FBXMeshPart::getTrianglesForQuads() const {
|
||||||
|
// if we've been asked for our triangulation of the original quads, but we don't yet have them
|
||||||
|
// then create them now.
|
||||||
|
if (!trianglesForQuadsAvailable) {
|
||||||
|
trianglesForQuadsAvailable = true;
|
||||||
|
|
||||||
|
quadsAsTrianglesIndicesBuffer = std::make_shared<gpu::Buffer>();
|
||||||
|
|
||||||
|
// QVector<int> quadIndices; // original indices from the FBX mesh
|
||||||
|
QVector<quint32> quadsAsTrianglesIndices; // triangle versions of quads converted when first needed
|
||||||
|
const int INDICES_PER_ORIGINAL_QUAD = 4;
|
||||||
|
const int INDICES_PER_TRIANGULATED_QUAD = 6;
|
||||||
|
int numberOfQuads = quadIndices.size() / INDICES_PER_ORIGINAL_QUAD;
|
||||||
|
|
||||||
|
quadsAsTrianglesIndices.resize(numberOfQuads * INDICES_PER_TRIANGULATED_QUAD);
|
||||||
|
|
||||||
|
int originalIndex = 0;
|
||||||
|
int triangulatedIndex = 0;
|
||||||
|
for (int fromQuad = 0; fromQuad < numberOfQuads; fromQuad++) {
|
||||||
|
int i0 = quadIndices[originalIndex + 0];
|
||||||
|
int i1 = quadIndices[originalIndex + 1];
|
||||||
|
int i2 = quadIndices[originalIndex + 2];
|
||||||
|
int i3 = quadIndices[originalIndex + 3];
|
||||||
|
|
||||||
|
// Sam's recommended triangle slices
|
||||||
|
// Triangle tri1 = { v0, v1, v3 };
|
||||||
|
// Triangle tri2 = { v1, v2, v3 };
|
||||||
|
// NOTE: Random guy on the internet's recommended triangle slices
|
||||||
|
// Triangle tri1 = { v0, v1, v2 };
|
||||||
|
// Triangle tri2 = { v2, v3, v0 };
|
||||||
|
|
||||||
|
quadsAsTrianglesIndices[triangulatedIndex + 0] = i0;
|
||||||
|
quadsAsTrianglesIndices[triangulatedIndex + 1] = i1;
|
||||||
|
quadsAsTrianglesIndices[triangulatedIndex + 2] = i3;
|
||||||
|
|
||||||
|
quadsAsTrianglesIndices[triangulatedIndex + 3] = i1;
|
||||||
|
quadsAsTrianglesIndices[triangulatedIndex + 4] = i2;
|
||||||
|
quadsAsTrianglesIndices[triangulatedIndex + 5] = i3;
|
||||||
|
|
||||||
|
originalIndex += INDICES_PER_ORIGINAL_QUAD;
|
||||||
|
triangulatedIndex += INDICES_PER_TRIANGULATED_QUAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
trianglesForQuadsIndicesCount = INDICES_PER_TRIANGULATED_QUAD * numberOfQuads;
|
||||||
|
quadsAsTrianglesIndicesBuffer->append(quadsAsTrianglesIndices.size() * sizeof(quint32), (gpu::Byte*)quadsAsTrianglesIndices.data());
|
||||||
|
|
||||||
|
}
|
||||||
|
return quadsAsTrianglesIndicesBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
void appendIndex(MeshData& data, QVector<int>& indices, int index) {
|
void appendIndex(MeshData& data, QVector<int>& indices, int index) {
|
||||||
if (index >= data.polygonIndices.size()) {
|
if (index >= data.polygonIndices.size()) {
|
||||||
return;
|
return;
|
||||||
|
@ -1089,7 +1139,6 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) {
|
||||||
appendIndex(data, part.quadIndices, beginIndex++);
|
appendIndex(data, part.quadIndices, beginIndex++);
|
||||||
appendIndex(data, part.quadIndices, beginIndex++);
|
appendIndex(data, part.quadIndices, beginIndex++);
|
||||||
appendIndex(data, part.quadIndices, beginIndex++);
|
appendIndex(data, part.quadIndices, beginIndex++);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
for (int nextIndex = beginIndex + 1;; ) {
|
for (int nextIndex = beginIndex + 1;; ) {
|
||||||
appendIndex(data, part.triangleIndices, beginIndex);
|
appendIndex(data, part.triangleIndices, beginIndex);
|
||||||
|
|
|
@ -109,9 +109,10 @@ public:
|
||||||
class FBXMeshPart {
|
class FBXMeshPart {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
QVector<int> quadIndices;
|
QVector<int> quadIndices; // original indices from the FBX mesh
|
||||||
QVector<int> triangleIndices;
|
QVector<int> triangleIndices; // original indices from the FBX mesh
|
||||||
|
mutable gpu::BufferPointer quadsAsTrianglesIndicesBuffer;
|
||||||
|
|
||||||
glm::vec3 diffuseColor;
|
glm::vec3 diffuseColor;
|
||||||
glm::vec3 specularColor;
|
glm::vec3 specularColor;
|
||||||
glm::vec3 emissiveColor;
|
glm::vec3 emissiveColor;
|
||||||
|
@ -126,6 +127,10 @@ public:
|
||||||
|
|
||||||
QString materialID;
|
QString materialID;
|
||||||
model::MaterialPointer _material;
|
model::MaterialPointer _material;
|
||||||
|
mutable bool trianglesForQuadsAvailable = false;
|
||||||
|
mutable int trianglesForQuadsIndicesCount = 0;
|
||||||
|
|
||||||
|
gpu::BufferPointer getTrianglesForQuads() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A single mesh (with optional blendshapes) extracted from an FBX document.
|
/// A single mesh (with optional blendshapes) extracted from an FBX document.
|
||||||
|
|
|
@ -2096,8 +2096,11 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran
|
||||||
}
|
}
|
||||||
|
|
||||||
if (part.quadIndices.size() > 0) {
|
if (part.quadIndices.size() > 0) {
|
||||||
batch.drawIndexed(gpu::QUADS, part.quadIndices.size(), offset);
|
batch.setIndexBuffer(gpu::UINT32, part.getTrianglesForQuads(), 0);
|
||||||
|
batch.drawIndexed(gpu::TRIANGLES, part.trianglesForQuadsIndicesCount, 0);
|
||||||
|
|
||||||
offset += part.quadIndices.size() * sizeof(int);
|
offset += part.quadIndices.size() * sizeof(int);
|
||||||
|
batch.setIndexBuffer(gpu::UINT32, (networkMesh._indexBuffer), 0); // restore this in case there are triangles too
|
||||||
}
|
}
|
||||||
|
|
||||||
if (part.triangleIndices.size() > 0) {
|
if (part.triangleIndices.size() > 0) {
|
||||||
|
|
Loading…
Reference in a new issue