Commit 9808cd03 authored by Anakin's avatar Anakin

save more material information,

hold default material in geometry separated,
load diffuse color if texture cannot be opened,
fixed gamma correction on the texture,
parent abd9070e
...@@ -42,12 +42,14 @@ struct Model { ...@@ -42,12 +42,14 @@ struct Model {
struct Material { struct Material {
QString name; QString name;
QString textureName;
QOpenGLTexture* texture = Q_NULLPTR; QOpenGLTexture* texture = Q_NULLPTR;
QVector4D specularColor = { 1.0, 1.0, 1.0, 1.0 };
QVector4D diffuseColor = { 1.0, 0.0, 0.0, 1.0 };
QVector4D ambientColor = { 1.0, 1.0, 1.0, 1.0 };
float shininess = 80;
bool flags[8] = { false };
bool transparent = false; bool transparent = false;
float shininess = 80; //TODO: read from file
QVector4D specularColor = {1.0,1.0,1.0, 1.0}; //TODO: read from file, change to 4D
QVector4D diffuseColor;
QVector4D ambientColor;
}; };
class FileInterface : public QObject class FileInterface : public QObject
...@@ -110,8 +112,8 @@ public: ...@@ -110,8 +112,8 @@ public:
virtual QVector<Material>* getMaterials() const { return m_materials; }; virtual QVector<Material>* getMaterials() const { return m_materials; };
virtual BoundingBox getBoundingBox() const { return m_sceneBbox; }; virtual BoundingBox getBoundingBox() const { return m_sceneBbox; };
static Material getDefaultMaterial() { static Material* getDefaultMaterial() {
Material defMaterial; Material* defMaterial = new Material;
QImage img(1, 1, QImage::Format_RGB32); QImage img(1, 1, QImage::Format_RGB32);
img.fill(Qt::red); img.fill(Qt::red);
...@@ -128,7 +130,8 @@ public: ...@@ -128,7 +130,8 @@ public:
// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
new_texture->setWrapMode(QOpenGLTexture::Repeat); new_texture->setWrapMode(QOpenGLTexture::Repeat);
defMaterial.texture = new_texture; defMaterial->texture = new_texture;
defMaterial->name = "Default Material";
return defMaterial; return defMaterial;
}; };
......
...@@ -28,6 +28,7 @@ private: ...@@ -28,6 +28,7 @@ private:
QVector<Material>* m_materials = Q_NULLPTR; QVector<Material>* m_materials = Q_NULLPTR;
QVector<DrawInformation> m_drawList; QVector<DrawInformation> m_drawList;
BoundingBox m_boundings; BoundingBox m_boundings;
Material* m_defaultMaterial;
void clearData(); void clearData();
......
...@@ -61,7 +61,6 @@ void main() ...@@ -61,7 +61,6 @@ void main()
// final color after gama correction // final color after gama correction
vec3 gamma = vec3(1.0/2.2); vec3 gamma = vec3(1.0/2.2);
gl_FragColor = vec4(pow(linearColor, gamma), surfaceColor.a); gl_FragColor = vec4(pow(linearColor, gamma), surfaceColor.a);
//gl_FragColor = vec4(linearColor, surfaceColor.a);
} }
else else
{ {
......
...@@ -14,11 +14,15 @@ GeometryEngine::GeometryEngine(QObject *parent) ...@@ -14,11 +14,15 @@ GeometryEngine::GeometryEngine(QObject *parent)
, m_indexBuf(QOpenGLBuffer::IndexBuffer) , m_indexBuf(QOpenGLBuffer::IndexBuffer)
{ {
initializeOpenGLFunctions(); initializeOpenGLFunctions();
m_defaultMaterial = FileInterface::getDefaultMaterial();
} }
GeometryEngine::~GeometryEngine() GeometryEngine::~GeometryEngine()
{ {
clearData(); clearData();
delete m_defaultMaterial->texture;
delete m_defaultMaterial;
} }
...@@ -113,9 +117,6 @@ void GeometryEngine::loadFile(QString filePath) ...@@ -113,9 +117,6 @@ void GeometryEngine::loadFile(QString filePath)
m_indexBuf.bind(); m_indexBuf.bind();
m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint)); m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint));
//pushback a default material
m_materials->push_back(FileInterface::getDefaultMaterial());
emit requestUpdate(); emit requestUpdate();
emit sendMessage("done..", 0); emit sendMessage("done..", 0);
emit sendFileInfo(filePath.right(filePath.size() - filePath.lastIndexOf(QRegExp("/|\\\\")) - 1), m_materials, vertexData.size(), indexData.size() / 3); emit sendFileInfo(filePath.right(filePath.size() - filePath.lastIndexOf(QRegExp("/|\\\\")) - 1), m_materials, vertexData.size(), indexData.size() / 3);
...@@ -185,12 +186,12 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe) ...@@ -185,12 +186,12 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe)
m_materials->at(it.textureIndex).texture->bind(); m_materials->at(it.textureIndex).texture->bind();
tmp_transparent = m_materials->at(it.textureIndex).transparent; tmp_transparent = m_materials->at(it.textureIndex).transparent;
shininess = m_materials->at(it.textureIndex).shininess; shininess = m_materials->at(it.textureIndex).shininess;
specularColor = m_materials->at(it.textureIndex).specularColor; specularColor = m_materials->at(it.textureIndex).specularColor.toVector3D();
} }
else else
{ {
m_materials->last().texture->bind(); m_defaultMaterial->texture->bind();
tmp_transparent = m_materials->last().transparent; tmp_transparent = m_defaultMaterial->transparent;
} }
// Set model matrix // Set model matrix
program->setUniformValue("m_matrix", it.modelMatrix); program->setUniformValue("m_matrix", it.modelMatrix);
......
#include "..\Header\MshFile.h" #include "..\Header\MshFile.h"
#include "..\Header\tga.h" #include "..\Header\tga.h"
#include <QColor>
// helper function to save data from file to any variable type // helper function to save data from file to any variable type
#define F2V(variableName) reinterpret_cast<char*>(&variableName) #define F2V(variableName) reinterpret_cast<char*>(&variableName)
...@@ -160,7 +161,6 @@ void MshFile::analyseMsh2Chunks(std::list<ChunkHeader*>& chunkList) ...@@ -160,7 +161,6 @@ void MshFile::analyseMsh2Chunks(std::list<ChunkHeader*>& chunkList)
std::list<ChunkHeader*> tmp_matdChunks; std::list<ChunkHeader*> tmp_matdChunks;
loadChunks(tmp_matdChunks, it->position, it->size); loadChunks(tmp_matdChunks, it->position, it->size);
//TODO: materialy without texture have null pointer need to fix that
m_materials->push_back(Material()); m_materials->push_back(Material());
// analyse MATD subchunks // analyse MATD subchunks
...@@ -217,27 +217,41 @@ void MshFile::analyseMatdChunks(std::list<ChunkHeader*>& chunkList) ...@@ -217,27 +217,41 @@ void MshFile::analyseMatdChunks(std::list<ChunkHeader*>& chunkList)
{ {
for (auto& it : chunkList) for (auto& it : chunkList)
{ {
// name // name
if (!strcmp("NAME", it->name)) if (!strcmp("NAME", it->name))
{ {
m_file.seekg(it->position); m_file.seekg(it->position);
char* buffer = new char[it->size + 1]; char* buffer = new char[it->size + 1];
*buffer = { 0 }; *buffer = { 0 };
m_file.read(buffer, it->size); m_file.read(buffer, it->size);
m_materials->back().name = buffer; m_materials->back().name = buffer;
delete[] buffer; delete[] buffer;
} }
// TODO: read the data information
// data // data
else if(!strcmp("DATA", it->name)) else if(!strcmp("DATA", it->name))
{ {
m_file.seekg(it->position);
} // diffuse
// TODO: use diffuse color instead of default texture for (unsigned int i = 0; i < 4; i++)
//TODO: get information from flags m_file.read(F2V(m_materials->back().diffuseColor[i]), sizeof(float));
// specular
for (unsigned int i = 0; i < 4; i++)
m_file.read(F2V(m_materials->back().specularColor[i]), sizeof(float));
// ambient
for (unsigned int i = 0; i < 4; i++)
m_file.read(F2V(m_materials->back().ambientColor[i]), sizeof(float));
// shininess
m_file.read(F2V(m_materials->back().shininess), sizeof(float));
}
// TODO: evaluate specular, gloss,.. and save values
// attributes // attributes
if (!strcmp("ATRB", it->name)) else if (!strcmp("ATRB", it->name))
{ {
// read the attributes // read the attributes
m_file.seekg(it->position); m_file.seekg(it->position);
...@@ -247,31 +261,21 @@ void MshFile::analyseMatdChunks(std::list<ChunkHeader*>& chunkList) ...@@ -247,31 +261,21 @@ void MshFile::analyseMatdChunks(std::list<ChunkHeader*>& chunkList)
m_file.read(F2V(data[0]), sizeof(data[0])); m_file.read(F2V(data[0]), sizeof(data[0]));
m_file.read(F2V(data[1]), sizeof(data[1])); m_file.read(F2V(data[1]), sizeof(data[1]));
// specular // flags
if (flag >> 7) // 0: emissive
{ // 1: glow
std::cout << "specular" << std::endl; // 2: single-sided transparency
} // 3: double-sided transparency
// additive transparency || hard edged transparency || double-sided transparency || single-sided transparency // 4: hard-edged transparency
if ((flag << 1) >> 7 || (flag << 3) >> 7 || (flag << 4) >> 7 || (flag << 5) >> 7) // 5: per-pixel lighting
{ // 6: additive transparency
m_materials->back().transparent = true; // 7: specular
}
// per-pixel lighting for (unsigned int i = 0; i < 8; i++)
if ((flag << 2) >> 7) m_materials->back().flags[i] = (flag << (7 - i)) >> 7;
{
std::cout << "per-pixel lighting" << std::endl; m_materials->back().transparent = m_materials->back().flags[2] || m_materials->back().flags[3] || m_materials->back().flags[4] || m_materials->back().flags[6];
}
// glow
if ((flag << 6) >> 7)
{
std::cout << "glow" << std::endl;
}
// emissive
if ((flag << 7) >> 7)
{
std::cout << "emissive" << std::endl;
}
} }
// texture zero // texture zero
...@@ -282,13 +286,12 @@ void MshFile::analyseMatdChunks(std::list<ChunkHeader*>& chunkList) ...@@ -282,13 +286,12 @@ void MshFile::analyseMatdChunks(std::list<ChunkHeader*>& chunkList)
char* buffer = new char[it->size + 1]; char* buffer = new char[it->size + 1];
*buffer = { 0 }; *buffer = { 0 };
m_file.read(buffer, it->size); m_file.read(buffer, it->size);
QString texName(buffer); m_materials->back().textureName = buffer;
delete[] buffer; delete[] buffer;
// load the texture if the name is not empty // load the texture if the name is not empty
// TODO: save filename for the output if (!m_materials->back().textureName.isEmpty())
if (!texName.isEmpty()) loadTexture(m_materials->back().texture, m_filepath + "/" + m_materials->back().textureName);
loadTexture(m_materials->back().texture, m_filepath + "/" + texName);
} }
} }
} }
...@@ -684,10 +687,21 @@ void MshFile::loadTexture(QOpenGLTexture *& destination, QString filepath) ...@@ -684,10 +687,21 @@ void MshFile::loadTexture(QOpenGLTexture *& destination, QString filepath)
bool loadSuccess(false); bool loadSuccess(false);
QImage img = loadTga(filepath, loadSuccess); QImage img = loadTga(filepath, loadSuccess);
if (filepath.isEmpty())
{
loadSuccess = true;
img = QImage(1, 1, QImage::Format_RGB32);
img.fill(Qt::red);
}
else
img = loadTga(filepath, loadSuccess);
if (!loadSuccess) if (!loadSuccess)
{ {
emit sendMessage("WARNING: texture not found or corrupted: " + m_materials->back().name, 1); emit sendMessage("WARNING: texture not found or corrupted: " + m_materials->back().name, 1);
return;
img = QImage(1, 1, QImage::Format_RGB32);
img.fill(QColor(m_materials->back().diffuseColor[0] * 255, m_materials->back().diffuseColor[1] * 255, m_materials->back().diffuseColor[2] * 255));
} }
// Load image to OglTexture // Load image to OglTexture
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment