From fbd1efad81a88494842cde4095ea780757b24ed9 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 16 Sep 2014 17:52:39 -0700 Subject: [PATCH 1/3] Allow specifying material opacity. --- interface/resources/shaders/model.frag | 2 +- .../shaders/model_cascaded_shadow_map.frag | 2 +- .../model_cascaded_shadow_normal_map.frag | 2 +- ...l_cascaded_shadow_normal_specular_map.frag | 5 +++-- .../model_cascaded_shadow_specular_map.frag | 5 +++-- .../resources/shaders/model_normal_map.frag | 2 +- .../shaders/model_normal_specular_map.frag | 5 +++-- .../resources/shaders/model_shadow_map.frag | 2 +- .../shaders/model_shadow_normal_map.frag | 2 +- .../model_shadow_normal_specular_map.frag | 5 +++-- .../shaders/model_shadow_specular_map.frag | 5 +++-- .../resources/shaders/model_specular_map.frag | 6 ++--- interface/src/renderer/GeometryCache.cpp | 6 ++--- interface/src/renderer/GeometryCache.h | 2 +- interface/src/renderer/Model.cpp | 22 +++++++++---------- interface/src/renderer/Model.h | 2 +- libraries/fbx/src/FBXReader.cpp | 8 ++++++- libraries/fbx/src/FBXReader.h | 1 + 18 files changed, 48 insertions(+), 36 deletions(-) diff --git a/interface/resources/shaders/model.frag b/interface/resources/shaders/model.frag index d8e1efab14..cf17b0ad72 100644 --- a/interface/resources/shaders/model.frag +++ b/interface/resources/shaders/model.frag @@ -48,6 +48,6 @@ void main(void) { normalizedNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); } diff --git a/interface/resources/shaders/model_cascaded_shadow_map.frag b/interface/resources/shaders/model_cascaded_shadow_map.frag index 63500e7e2a..39ae7f2f92 100644 --- a/interface/resources/shaders/model_cascaded_shadow_map.frag +++ b/interface/resources/shaders/model_cascaded_shadow_map.frag @@ -66,6 +66,6 @@ void main(void) { normalizedNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); } diff --git a/interface/resources/shaders/model_cascaded_shadow_normal_map.frag b/interface/resources/shaders/model_cascaded_shadow_normal_map.frag index 1fef1ef82a..9f7897dabc 100644 --- a/interface/resources/shaders/model_cascaded_shadow_normal_map.frag +++ b/interface/resources/shaders/model_cascaded_shadow_normal_map.frag @@ -79,6 +79,6 @@ void main(void) { normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); } diff --git a/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag b/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag index f0751bcca9..7168706414 100644 --- a/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag +++ b/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag @@ -82,6 +82,7 @@ void main(void) { normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb * + texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); } diff --git a/interface/resources/shaders/model_cascaded_shadow_specular_map.frag b/interface/resources/shaders/model_cascaded_shadow_specular_map.frag index b2881e6c13..700328e4dc 100644 --- a/interface/resources/shaders/model_cascaded_shadow_specular_map.frag +++ b/interface/resources/shaders/model_cascaded_shadow_specular_map.frag @@ -69,6 +69,7 @@ void main(void) { normalizedNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb * + texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); } diff --git a/interface/resources/shaders/model_normal_map.frag b/interface/resources/shaders/model_normal_map.frag index 73d2fc0ef6..8b3e88950a 100644 --- a/interface/resources/shaders/model_normal_map.frag +++ b/interface/resources/shaders/model_normal_map.frag @@ -60,6 +60,6 @@ void main(void) { normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); } diff --git a/interface/resources/shaders/model_normal_specular_map.frag b/interface/resources/shaders/model_normal_specular_map.frag index 5eb804292c..63cdacab89 100644 --- a/interface/resources/shaders/model_normal_specular_map.frag +++ b/interface/resources/shaders/model_normal_specular_map.frag @@ -63,6 +63,7 @@ void main(void) { normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb * + texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); } diff --git a/interface/resources/shaders/model_shadow_map.frag b/interface/resources/shaders/model_shadow_map.frag index 807a9d162f..161fea8bda 100644 --- a/interface/resources/shaders/model_shadow_map.frag +++ b/interface/resources/shaders/model_shadow_map.frag @@ -58,6 +58,6 @@ void main(void) { normalizedNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); } diff --git a/interface/resources/shaders/model_shadow_normal_map.frag b/interface/resources/shaders/model_shadow_normal_map.frag index 454b88dd23..0685ce46b4 100644 --- a/interface/resources/shaders/model_shadow_normal_map.frag +++ b/interface/resources/shaders/model_shadow_normal_map.frag @@ -70,6 +70,6 @@ void main(void) { normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); } diff --git a/interface/resources/shaders/model_shadow_normal_specular_map.frag b/interface/resources/shaders/model_shadow_normal_specular_map.frag index 8283d10b93..e4fd56f62d 100644 --- a/interface/resources/shaders/model_shadow_normal_specular_map.frag +++ b/interface/resources/shaders/model_shadow_normal_specular_map.frag @@ -73,6 +73,7 @@ void main(void) { normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb * + texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); } diff --git a/interface/resources/shaders/model_shadow_specular_map.frag b/interface/resources/shaders/model_shadow_specular_map.frag index f30f3d7b06..93bfd16cb5 100644 --- a/interface/resources/shaders/model_shadow_specular_map.frag +++ b/interface/resources/shaders/model_shadow_specular_map.frag @@ -61,6 +61,7 @@ void main(void) { normalizedNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb * + texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); } diff --git a/interface/resources/shaders/model_specular_map.frag b/interface/resources/shaders/model_specular_map.frag index 824746d575..7c5e000886 100644 --- a/interface/resources/shaders/model_specular_map.frag +++ b/interface/resources/shaders/model_specular_map.frag @@ -51,7 +51,7 @@ void main(void) { normalizedNormal)); // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); - + gl_FragColor = vec4(base.rgb, gl_FrontMaterial.diffuse.a) * texture2D(diffuseMap, gl_TexCoord[0].st) + + vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb * + texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); } diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 2b0af384b0..1ec6ea8f23 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -684,10 +684,10 @@ bool NetworkMeshPart::isTranslucent() const { return diffuseTexture && diffuseTexture->isTranslucent(); } -int NetworkMesh::getTranslucentPartCount() const { +int NetworkMesh::getTranslucentPartCount(const FBXMesh& fbxMesh) const { int count = 0; - foreach (const NetworkMeshPart& part, parts) { - if (part.isTranslucent()) { + for (int i = 0; i < parts.size(); i++) { + if (parts.at(i).isTranslucent() || fbxMesh.parts.at(i).opacity != 1.0f) { count++; } } diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index 41bedc5e05..2e5725e1b1 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -145,7 +145,7 @@ public: QVector parts; - int getTranslucentPartCount() const; + int getTranslucentPartCount(const FBXMesh& fbxMesh) const; }; #endif // hifi_GeometryCache_h diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 51e1249bd9..2e8fc32566 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -608,13 +608,13 @@ bool Model::render(float alpha, RenderMode mode, bool receiveShadows) { glAlphaFunc(GL_GREATER, 0.5f * alpha); receiveShadows &= Menu::getInstance()->getShadowsEnabled(); - renderMeshes(alpha, mode, false, receiveShadows); + renderMeshes(mode, false, receiveShadows); glDisable(GL_ALPHA_TEST); // render translucent meshes afterwards - renderMeshes(alpha, mode, true, receiveShadows); + renderMeshes(mode, true, receiveShadows); glDisable(GL_CULL_FACE); @@ -1356,7 +1356,7 @@ void Model::deleteGeometry() { } } -void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool receiveShadows) { +void Model::renderMeshes(RenderMode mode, bool translucent, bool receiveShadows) { updateVisibleJointStates(); const FBXGeometry& geometry = _geometry->getFBXGeometry(); const QVector& networkMeshes = _geometry->getMeshes(); @@ -1365,13 +1365,13 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re for (int i = 0; i < networkMeshes.size(); i++) { // exit early if the translucency doesn't match what we're drawing const NetworkMesh& networkMesh = networkMeshes.at(i); - if (translucent ? (networkMesh.getTranslucentPartCount() == 0) : - (networkMesh.getTranslucentPartCount() == networkMesh.parts.size())) { + const FBXMesh& mesh = geometry.meshes.at(i); + if (translucent ? (networkMesh.getTranslucentPartCount(mesh) == 0) : + (networkMesh.getTranslucentPartCount(mesh) == networkMesh.parts.size())) { continue; } const_cast(networkMesh.indexBuffer).bind(); - - const FBXMesh& mesh = geometry.meshes.at(i); + int vertexCount = mesh.vertices.size(); if (vertexCount == 0) { // sanity check @@ -1528,7 +1528,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re if (!mesh.colors.isEmpty()) { glEnableClientState(GL_COLOR_ARRAY); } else { - glColor4f(1.0f, 1.0f, 1.0f, alpha); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } if (!mesh.texCoords.isEmpty()) { glEnableClientState(GL_TEXTURE_COORD_ARRAY); @@ -1538,7 +1538,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re for (int j = 0; j < networkMesh.parts.size(); j++) { const NetworkMeshPart& networkPart = networkMesh.parts.at(j); const FBXMeshPart& part = mesh.parts.at(j); - if (networkPart.isTranslucent() != translucent) { + if ((networkPart.isTranslucent() || part.opacity != 1.0f) != translucent) { offset += (part.quadIndices.size() + part.triangleIndices.size()) * sizeof(int); continue; } @@ -1547,8 +1547,8 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re glBindTexture(GL_TEXTURE_2D, 0); } else { - glm::vec4 diffuse = glm::vec4(part.diffuseColor, alpha); - glm::vec4 specular = glm::vec4(part.specularColor, alpha); + glm::vec4 diffuse = glm::vec4(part.diffuseColor, part.opacity); + glm::vec4 specular = glm::vec4(part.specularColor, part.opacity); glMaterialfv(GL_FRONT, GL_AMBIENT, (const float*)&diffuse); glMaterialfv(GL_FRONT, GL_DIFFUSE, (const float*)&diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, (const float*)&specular); diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index c41fd7d5de..f32d53fcd8 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -256,7 +256,7 @@ private: void applyNextGeometry(); void deleteGeometry(); - void renderMeshes(float alpha, RenderMode mode, bool translucent, bool receiveShadows); + void renderMeshes(RenderMode mode, bool translucent, bool receiveShadows); QVector createJointStates(const FBXGeometry& geometry); void initJointTransforms(); diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index d81e297b24..d46339efb7 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -657,6 +657,7 @@ public: glm::vec3 diffuse; glm::vec3 specular; float shininess; + float opacity; }; class Cluster { @@ -1280,7 +1281,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) textureContent.insert(filename, content); } } else if (object.name == "Material") { - Material material = { glm::vec3(1.0f, 1.0f, 1.0f), glm::vec3(1.0f, 1.0f, 1.0f), 96.0f }; + Material material = { glm::vec3(1.0f, 1.0f, 1.0f), glm::vec3(1.0f, 1.0f, 1.0f), 96.0f, 1.0f }; foreach (const FBXNode& subobject, object.children) { bool properties = false; QByteArray propertyName; @@ -1306,6 +1307,9 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) } else if (property.properties.at(0) == "Shininess") { material.shininess = property.properties.at(index).value(); + + } else if (property.properties.at(0) == "Opacity") { + material.opacity = 0.5f; // property.properties.at(index).value(); } } } @@ -1602,6 +1606,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) part.diffuseColor = material.diffuse; part.specularColor = material.specular; part.shininess = material.shininess; + part.opacity = material.opacity; if (!diffuseTexture.filename.isNull()) { part.diffuseTexture = diffuseTexture; } @@ -2042,6 +2047,7 @@ FBXGeometry readSVO(const QByteArray& model) { FBXMeshPart part; part.diffuseColor = glm::vec3(1.0f, 1.0f, 1.0f); part.shininess = 96.0f; + part.opacity = 1.0f; mesh.parts.append(part); VoxelTree tree; diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 48ac4fc81f..363cf491d8 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -109,6 +109,7 @@ public: glm::vec3 diffuseColor; glm::vec3 specularColor; float shininess; + float opacity; FBXTexture diffuseTexture; FBXTexture normalTexture; From 213b4e6ee6e7e9f2465eb12ed7877cb901aedb33 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 16 Sep 2014 17:53:40 -0700 Subject: [PATCH 2/3] Removed testing code. --- libraries/fbx/src/FBXReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index d46339efb7..7d32d97752 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -1309,7 +1309,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) material.shininess = property.properties.at(index).value(); } else if (property.properties.at(0) == "Opacity") { - material.opacity = 0.5f; // property.properties.at(index).value(); + material.opacity = property.properties.at(index).value(); } } } From f1458dec3f762dbb81b2b2cbc405a6709b922870 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 17 Sep 2014 08:46:08 -0700 Subject: [PATCH 3/3] fix presentation of checkboxes who default to true --- domain-server/resources/web/settings/index.shtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/resources/web/settings/index.shtml b/domain-server/resources/web/settings/index.shtml index 73e3cdbea2..bd3e00eb61 100644 --- a/domain-server/resources/web/settings/index.shtml +++ b/domain-server/resources/web/settings/index.shtml @@ -17,7 +17,7 @@
<% if (setting.type === "checkbox") { %> - <% var checked_box = (values[group_key] || {})[setting_key] || setting.default %> + <% var checked_box = _.has(values, group_key) ? values[group_key][setting_key] : setting.default %> > <% } else { %> <% if (setting.input_addon) { %>