finally fixed rotation bug,

some performance,
This commit is contained in:
Anakin 2017-01-03 14:18:46 +01:00
parent 0fefc6168b
commit c28a12cd8f
5 changed files with 28 additions and 14 deletions

View File

@ -44,4 +44,5 @@ private:
void readUV(Segment* dataDestination, std::streampos position); void readUV(Segment* dataDestination, std::streampos position);
QMatrix4x4 getParentMatrix(std::string parent) const; QMatrix4x4 getParentMatrix(std::string parent) const;
QQuaternion getParentRotation(std::string parent) const;
}; };

View File

@ -10,8 +10,6 @@ GeometryEngine::GeometryEngine()
: m_indexBuf(QOpenGLBuffer::IndexBuffer) : m_indexBuf(QOpenGLBuffer::IndexBuffer)
{ {
initializeOpenGLFunctions(); initializeOpenGLFunctions();
loadFile("..\\Release\\Msh\\cubeTex.msh");
} }
GeometryEngine::~GeometryEngine() GeometryEngine::~GeometryEngine()
@ -63,9 +61,10 @@ void GeometryEngine::loadFile(const char* filePath)
new_info.modelMatrix = modelIterator->m4x4Translation; new_info.modelMatrix = modelIterator->m4x4Translation;
new_info.modelMatrix.rotate(modelIterator->quadRotation); new_info.modelMatrix.rotate(modelIterator->quadRotation);
// add offset to indices // add offset to indices, no need to do it for the first one (maybe it's very big)
for (auto& it : segmentIterator->indices) if(vertexOffset != 0)
it += vertexOffset; for (auto& it : segmentIterator->indices)
it += vertexOffset;
// save data // save data
vertexData += segmentIterator->vertices; vertexData += segmentIterator->vertices;

View File

@ -291,14 +291,14 @@ void MshFile::analyseModlChunks(Model * dataDestination, std::list<ChunkHeader*>
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
m_file.read(F2V(tmp_trans[i]), sizeof(float)); m_file.read(F2V(tmp_trans[i]), sizeof(float));
// modify the matrix // modify the matrix and quaternion
dataDestination->m4x4Translation.scale(tmp_scale[0], tmp_scale[1], tmp_scale[2]); dataDestination->m4x4Translation.scale(tmp_scale[0], tmp_scale[1], tmp_scale[2]);
dataDestination->m4x4Translation.translate(tmp_trans[0], tmp_trans[1], tmp_trans[2]); dataDestination->m4x4Translation.translate(tmp_trans[0], tmp_trans[1], tmp_trans[2]);
dataDestination->quadRotation.setVector(QVector3D(tmp_rotation[0], tmp_rotation[1], tmp_rotation[2])); dataDestination->quadRotation.setVector(QVector3D(tmp_rotation[0], tmp_rotation[1], tmp_rotation[2]));
dataDestination->quadRotation.setScalar(tmp_rotation[3]); dataDestination->quadRotation.setScalar(tmp_rotation[3]);
dataDestination->m4x4Translation = getParentMatrix(dataDestination->parent) * dataDestination->m4x4Translation; dataDestination->m4x4Translation = getParentMatrix(dataDestination->parent) * dataDestination->m4x4Translation;
dataDestination->quadRotation = getParentRotation(dataDestination->parent) * dataDestination->quadRotation;
} }
// geometry data // geometry data
@ -406,10 +406,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
else if (!strcmp("STRP", it->name)) else if (!strcmp("STRP", it->name))
{ {
// don't get null, bone, shadowMesh and hidden mesh indices // don't get null, bone, shadowMesh and hidden mesh indices
if (m_currentType == null || if (m_currentType == null || m_currentType == bone || m_currentType == shadowMesh || m_currentRenderFlag == 1)
m_currentType == bone ||
m_currentType == shadowMesh ||
m_currentRenderFlag == 1)
continue; continue;
// jump to the data section and read the size; // jump to the data section and read the size;
@ -455,7 +452,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++) for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++)
// ..calculate the edge indices // ..calculate the edge indices
for (int triEdge = 0; triEdge < 3; triEdge++) for (int triEdge = 0; triEdge < 3; triEdge++)
new_segment->indices.push_back((GLuint)tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]); new_segment->indices.push_back(tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]);
} }
} // if 2 high bits are set } // if 2 high bits are set
@ -475,7 +472,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++) for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++)
// ..calculate the edge indices // ..calculate the edge indices
for (int triEdge = 0; triEdge < 3; triEdge++) for (int triEdge = 0; triEdge < 3; triEdge++)
new_segment->indices.push_back((GLuint)tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]); new_segment->indices.push_back(tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]);
} }
} }
} }
@ -610,7 +607,6 @@ QMatrix4x4 MshFile::getParentMatrix(std::string parent) const
{ {
if (!strcmp(parent.c_str(), it->name.c_str())) if (!strcmp(parent.c_str(), it->name.c_str()))
{ {
//TODO: the other way around??
matrix = getParentMatrix(it->parent) * it->m4x4Translation; matrix = getParentMatrix(it->parent) * it->m4x4Translation;
break; break;
} }
@ -618,3 +614,19 @@ QMatrix4x4 MshFile::getParentMatrix(std::string parent) const
return matrix; return matrix;
} }
QQuaternion MshFile::getParentRotation(std::string parent) const
{
QQuaternion rotation;
for (auto& it : *m_models)
{
if (!strcmp(parent.c_str(), it->name.c_str()))
{
rotation = getParentRotation(it->parent) * it->quadRotation;
break;
}
}
return rotation;
}

View File

@ -1,11 +1,13 @@
#include "Header\MainWindow.h" #include "Header\MainWindow.h"
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
MainWindow w; MainWindow w;
w.show(); w.show();
return a.exec(); return a.exec();
} }

BIN
Release/Msh/rotTest.msh Normal file

Binary file not shown.