summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/qgltf/qgltf.cpp31
1 files changed, 30 insertions, 1 deletions
diff --git a/tools/qgltf/qgltf.cpp b/tools/qgltf/qgltf.cpp
index 9a6e73cab..7d40029d9 100644
--- a/tools/qgltf/qgltf.cpp
+++ b/tools/qgltf/qgltf.cpp
@@ -229,6 +229,7 @@ struct Options {
ETC1
};
TextureCompression texComp;
+ bool commonMat;
bool showLog;
} opts;
@@ -1190,7 +1191,7 @@ bool Exporter::nodeIsUseful(const Importer::Node *n) const
void Exporter::copyExternalTextures(const QString &inputFilename)
{
- // External textures needs copying only when output dir was specified.
+ // External textures need copying only when output dir was specified.
if (!opts.outDir.isEmpty()) {
foreach (const QString &textureFilename, m_importer->externalTextures()) {
QString dst = opts.outDir + textureFilename;
@@ -1265,6 +1266,7 @@ private:
QString semantic;
uint type;
};
+ QString commonTechniqueName;
QString vertShader;
QString fragShader;
QVector<Param> attributes;
@@ -1551,6 +1553,7 @@ void GltfExporter::initShaderInfo()
ProgramInfo p;
p = ProgramInfo();
+ p.commonTechniqueName = "PHONG"; // diffuse RGBA, specular RGBA
p.vertShader = "color.vert";
p.fragShader = "color.frag";
p.attributes << ProgramInfo::Param("position", "vertexPosition", "POSITION", GLT_FLOAT_VEC3);
@@ -1567,6 +1570,7 @@ void GltfExporter::initShaderInfo()
m_progs << p;
p = ProgramInfo();
+ p.commonTechniqueName = "PHONG"; // diffuse texture, specular RGBA
p.vertShader = "diffusemap.vert";
p.fragShader = "diffusemap.frag";
p.attributes << ProgramInfo::Param("position", "vertexPosition", "POSITION", GLT_FLOAT_VEC3);
@@ -1584,6 +1588,7 @@ void GltfExporter::initShaderInfo()
m_progs << p;
p = ProgramInfo();
+ p.commonTechniqueName = "PHONG"; // diffuse texture, specular texture
p.vertShader = "diffusemap.vert";
p.fragShader = "diffusespecularmap.frag";
p.attributes << ProgramInfo::Param("position", "vertexPosition", "POSITION", GLT_FLOAT_VEC3);
@@ -1601,6 +1606,7 @@ void GltfExporter::initShaderInfo()
m_progs << p;
p = ProgramInfo();
+ p.commonTechniqueName = "PHONG"; // diffuse texture, specular RGBA, normalmap texture
p.vertShader = "normaldiffusemap.vert";
p.fragShader = "normaldiffusemap.frag";
p.attributes << ProgramInfo::Param("position", "vertexPosition", "POSITION", GLT_FLOAT_VEC3);
@@ -1620,6 +1626,7 @@ void GltfExporter::initShaderInfo()
m_progs << p;
p = ProgramInfo();
+ p.commonTechniqueName = "PHONG"; // diffuse texture, specular texture, normalmap texture
p.vertShader = "normaldiffusemap.vert";
p.fragShader = "normaldiffusespecularmap.frag";
p.attributes << ProgramInfo::Param("position", "vertexPosition", "POSITION", GLT_FLOAT_VEC3);
@@ -1830,6 +1837,25 @@ void GltfExporter::exportMaterials(QJsonObject &materials, QHash<QString, QStrin
material["techniqueGL2"] = techniqueInfo.gl2Name;
}
+ if (opts.commonMat) {
+ // The built-in shaders we output are of little use in practice.
+ // Ideally we want Qt3D's own standard materials in order to have our
+ // models participate in lighting for example. To achieve this, output
+ // a KHR_materials_common block which Qt3D's loader will recognize and
+ // prefer over the shader-based techniques.
+ if (!prog->commonTechniqueName.isEmpty()) {
+ QJsonObject commonMat;
+ commonMat["technique"] = prog->commonTechniqueName;
+ // Set the values as-is. "normalmap" is our own extension, not in the spec.
+ commonMat["values"] = vals;
+ if (!opaque)
+ commonMat["transparent"] = true;
+ QJsonObject extensions;
+ extensions["KHR_materials_common"] = commonMat;
+ material["extensions"] = extensions;
+ }
+ }
+
materials[matInfo.name] = material;
}
}
@@ -2442,6 +2468,8 @@ int main(int argc, char **argv)
cmdLine.addOption(coreOpt);
QCommandLineOption etc1Opt(QStringLiteral("1"), QStringLiteral("Generate ETC1 compressed textures by invoking etc1tool (PNG only)"));
cmdLine.addOption(etc1Opt);
+ QCommandLineOption noCommonMatOpt(QStringLiteral("T"), QStringLiteral("Do not generate KHR_materials_common block"));
+ cmdLine.addOption(noCommonMatOpt);
QCommandLineOption silentOpt(QStringLiteral("s"), QStringLiteral("Silence debug output"));
cmdLine.addOption(silentOpt);
cmdLine.process(app);
@@ -2461,6 +2489,7 @@ int main(int argc, char **argv)
}
opts.genCore = cmdLine.isSet(coreOpt);
opts.texComp = cmdLine.isSet(etc1Opt) ? Options::ETC1 : Options::NoTextureCompression;
+ opts.commonMat = !cmdLine.isSet(noCommonMatOpt);
opts.showLog = !cmdLine.isSet(silentOpt);
if (!opts.outDir.isEmpty()) {
if (!opts.outDir.endsWith('/'))