UI: Sequencer: Move header spacer in to Preview modes
[blender.git] / source / blender / collada / Materials.cpp
index becbe49a55e96474cad6a288fc9c644cc841e879..3b2c68ef95e48f8d68f372c5f4c5eafca3418c39 100644 (file)
 MaterialNode::MaterialNode(bContext *C, Material *ma, KeyImageMap &key_image_map)
     : mContext(C), material(ma), effect(nullptr), key_image_map(&key_image_map)
 {
-  ntree = prepare_material_nodetree();
+  bNodeTree *new_ntree = prepare_material_nodetree();
   setShaderType();
-  shader_node = add_node(SH_NODE_BSDF_PRINCIPLED, 0, 300, "");
-  output_node = add_node(SH_NODE_OUTPUT_MATERIAL, 300, 300, "");
-  add_link(shader_node, 0, output_node, 0);
+  if (new_ntree) {
+    shader_node = add_node(SH_NODE_BSDF_PRINCIPLED, 0, 300, "");
+    output_node = add_node(SH_NODE_OUTPUT_MATERIAL, 300, 300, "");
+    add_link(shader_node, 0, output_node, 0);
+  }
 }
 
 MaterialNode::MaterialNode(bContext *C,
@@ -32,7 +34,7 @@ MaterialNode::MaterialNode(bContext *C,
                            UidImageMap &uid_image_map)
     : mContext(C), material(ma), effect(ef), uid_image_map(&uid_image_map)
 {
-  ntree = prepare_material_nodetree();
+  prepare_material_nodetree();
   setShaderType();
 
   std::map<std::string, bNode *> nmap;
@@ -89,13 +91,18 @@ void MaterialNode::setShaderType()
 #endif
 }
 
+// returns null if material already has a node tree
 bNodeTree *MaterialNode::prepare_material_nodetree()
 {
-  if (material->nodetree == NULL) {
-    material->nodetree = ntreeAddTree(NULL, "Shader Nodetree", "ShaderNodeTree");
-    material->use_nodes = true;
+  if (material->nodetree) {
+    ntree = material->nodetree;
+    return NULL;
   }
-  return material->nodetree;
+
+  material->nodetree = ntreeAddTree(NULL, "Shader Nodetree", "ShaderNodeTree");
+  material->use_nodes = true;
+  ntree = material->nodetree;
+  return ntree;
 }
 
 bNode *MaterialNode::add_node(int node_type, int locx, int locy, std::string label)
@@ -124,18 +131,24 @@ void MaterialNode::add_link(bNode *from_node, int from_index, bNode *to_node, in
 void MaterialNode::set_reflectivity(COLLADAFW::FloatOrParam &val)
 {
   float reflectivity = val.getFloatValue();
-  bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Metallic");
-  ((bNodeSocketValueFloat *)socket->default_value)->value = reflectivity;
-
-  material->metallic = reflectivity;
+  if (reflectivity >= 0) {
+    bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Metallic");
+    ((bNodeSocketValueFloat *)socket->default_value)->value = reflectivity;
+    material->metallic = reflectivity;
+  }
 }
 
+#if 0
+// needs rework to be done for 2.81
 void MaterialNode::set_shininess(COLLADAFW::FloatOrParam &val)
 {
   float roughness = val.getFloatValue();
-  bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Roughness");
-  ((bNodeSocketValueFloat *)socket->default_value)->value = roughness;
+  if (roughness >= 0) {
+    bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Roughness");
+    ((bNodeSocketValueFloat *)socket->default_value)->value = roughness;
+  }
 }
+#endif
 
 void MaterialNode::set_ior(COLLADAFW::FloatOrParam &val)
 {
@@ -155,13 +168,37 @@ void MaterialNode::set_alpha(COLLADAFW::EffectCommon::OpaqueMode mode,
                              COLLADAFW::ColorOrTexture &cot,
                              COLLADAFW::FloatOrParam &val)
 {
+  /*  Handling the alpha value according to the Collada 1.4 reference guide
+   *  see page 7-5 Determining Transparency (Opacity)
+   */
+
   if (effect == nullptr) {
     return;
   }
 
   if (cot.isColor() || !cot.isValid()) {
-    COLLADAFW::Color col = (cot.isValid()) ? cot.getColor() : COLLADAFW::Color(1, 1, 1, 1);
-    float alpha = val.getFloatValue() * col.getAlpha();  // Assuming A_ONE opaque mode
+    // transparent_cot is either a color or not defined
+
+    float transparent_alpha;
+    if (cot.isValid()) {
+      COLLADAFW::Color col = cot.getColor();
+      transparent_alpha = col.getAlpha();
+    }
+    else {
+      // no transparent color defined
+      transparent_alpha = 1;
+    }
+
+    float transparency_alpha = val.getFloatValue();
+    if (transparency_alpha < 0) {
+      // transparency is not defined
+      transparency_alpha = 1;  // set to opaque
+    }
+
+    float alpha = transparent_alpha * transparency_alpha;
+    if (mode == COLLADAFW::EffectCommon::RGB_ZERO) {
+      alpha = 1 - alpha;
+    }
 
     bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Alpha");
     ((bNodeSocketValueFloat *)socket->default_value)->value = alpha;
@@ -169,7 +206,6 @@ void MaterialNode::set_alpha(COLLADAFW::EffectCommon::OpaqueMode mode,
   else if (cot.isTexture()) {
     int locy = -300 * (node_map.size() - 2);
     add_texture_node(cot, -300, locy, "Alpha");
-    // TODO: Connect node
   }
 }
 
@@ -201,7 +237,7 @@ Image *MaterialNode::get_diffuse_image()
     return nullptr;
   }
 
-  bNodeSocket *in_socket = nodeFindSocket(shader_node, SOCK_IN, "Base Color");
+  bNodeSocket *in_socket = nodeFindSocket(shader, SOCK_IN, "Base Color");
   if (in_socket == nullptr) {
     return nullptr;
   }