Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/collada/Materials.cpp')
-rw-r--r--source/blender/collada/Materials.cpp118
1 files changed, 79 insertions, 39 deletions
diff --git a/source/blender/collada/Materials.cpp b/source/blender/collada/Materials.cpp
index 4313e634b23..becbe49a55e 100644
--- a/source/blender/collada/Materials.cpp
+++ b/source/blender/collada/Materials.cpp
@@ -21,6 +21,9 @@ MaterialNode::MaterialNode(bContext *C, Material *ma, KeyImageMap &key_image_map
{
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);
}
MaterialNode::MaterialNode(bContext *C,
@@ -118,25 +121,64 @@ void MaterialNode::add_link(bNode *from_node, int from_index, bNode *to_node, in
nodeAddLink(ntree, from_node, from_socket, to_node, to_socket);
}
-void MaterialNode::set_reflectivity(float val)
+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;
+}
+
+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;
+}
+
+void MaterialNode::set_ior(COLLADAFW::FloatOrParam &val)
{
- material->metallic = val;
- bNodeSocket *socket = (bNodeSocket *)BLI_findlink(&shader_node->inputs, BC_PBR_METALLIC);
- *(float *)socket->default_value = val;
+ float ior = val.getFloatValue();
+ if (ior < 0) {
+ fprintf(stderr,
+ "IOR of negative value is not allowed for materials (using Blender default value "
+ "instead)");
+ return;
+ }
+
+ bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "IOR");
+ ((bNodeSocketValueFloat *)socket->default_value)->value = ior;
}
-void MaterialNode::set_ior(float val)
+void MaterialNode::set_alpha(COLLADAFW::EffectCommon::OpaqueMode mode,
+ COLLADAFW::ColorOrTexture &cot,
+ COLLADAFW::FloatOrParam &val)
{
- bNodeSocket *socket = (bNodeSocket *)BLI_findlink(&shader_node->inputs, BC_PBR_IOR);
- *(float *)socket->default_value = val;
+ 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
+
+ bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Alpha");
+ ((bNodeSocketValueFloat *)socket->default_value)->value = alpha;
+ }
+ else if (cot.isTexture()) {
+ int locy = -300 * (node_map.size() - 2);
+ add_texture_node(cot, -300, locy, "Alpha");
+ // TODO: Connect node
+ }
}
-void MaterialNode::set_diffuse(COLLADAFW::ColorOrTexture &cot, std::string label)
+void MaterialNode::set_diffuse(COLLADAFW::ColorOrTexture &cot)
{
int locy = -300 * (node_map.size() - 2);
if (cot.isColor()) {
COLLADAFW::Color col = cot.getColor();
- bNodeSocket *socket = (bNodeSocket *)BLI_findlink(&shader_node->inputs, BC_PBR_DIFFUSE);
+ bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Base Color");
float *fcol = (float *)socket->default_value;
fcol[0] = material->r = col.getRed();
@@ -145,7 +187,7 @@ void MaterialNode::set_diffuse(COLLADAFW::ColorOrTexture &cot, std::string label
fcol[3] = material->a = col.getAlpha();
}
else if (cot.isTexture()) {
- bNode *texture_node = add_texture_node(cot, -300, locy, label);
+ bNode *texture_node = add_texture_node(cot, -300, locy, "Base Color");
if (texture_node != NULL) {
add_link(texture_node, 0, shader_node, 0);
}
@@ -159,7 +201,7 @@ Image *MaterialNode::get_diffuse_image()
return nullptr;
}
- bNodeSocket *in_socket = (bNodeSocket *)BLI_findlink(&shader->inputs, BC_PBR_DIFFUSE);
+ bNodeSocket *in_socket = nodeFindSocket(shader_node, SOCK_IN, "Base Color");
if (in_socket == nullptr) {
return nullptr;
}
@@ -193,54 +235,60 @@ static bNodeSocket *set_color(bNode *node, COLLADAFW::Color col)
return socket;
}
-void MaterialNode::set_ambient(COLLADAFW::ColorOrTexture &cot, std::string label)
+void MaterialNode::set_ambient(COLLADAFW::ColorOrTexture &cot)
{
int locy = -300 * (node_map.size() - 2);
if (cot.isColor()) {
COLLADAFW::Color col = cot.getColor();
- bNode *node = add_node(SH_NODE_RGB, -300, locy, label);
+ bNode *node = add_node(SH_NODE_RGB, -300, locy, "Ambient");
set_color(node, col);
// TODO: Connect node
}
// texture
else if (cot.isTexture()) {
- add_texture_node(cot, -300, locy, label);
+ add_texture_node(cot, -300, locy, "Ambient");
// TODO: Connect node
}
}
-void MaterialNode::set_reflective(COLLADAFW::ColorOrTexture &cot, std::string label)
+
+void MaterialNode::set_reflective(COLLADAFW::ColorOrTexture &cot)
{
int locy = -300 * (node_map.size() - 2);
if (cot.isColor()) {
COLLADAFW::Color col = cot.getColor();
- bNode *node = add_node(SH_NODE_RGB, -300, locy, label);
+ bNode *node = add_node(SH_NODE_RGB, -300, locy, "Reflective");
set_color(node, col);
// TODO: Connect node
}
// texture
else if (cot.isTexture()) {
- add_texture_node(cot, -300, locy, label);
+ add_texture_node(cot, -300, locy, "Reflective");
// TODO: Connect node
}
}
-void MaterialNode::set_emission(COLLADAFW::ColorOrTexture &cot, std::string label)
+void MaterialNode::set_emission(COLLADAFW::ColorOrTexture &cot)
{
int locy = -300 * (node_map.size() - 2);
if (cot.isColor()) {
COLLADAFW::Color col = cot.getColor();
- bNode *node = add_node(SH_NODE_RGB, -300, locy, label);
- set_color(node, col);
- // TODO: Connect node
+ bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Emission");
+ float *fcol = (float *)socket->default_value;
+
+ fcol[0] = col.getRed();
+ fcol[1] = col.getGreen();
+ fcol[2] = col.getBlue();
+ fcol[3] = col.getAlpha();
}
- // texture
else if (cot.isTexture()) {
- add_texture_node(cot, -300, locy, label);
- // TODO: Connect node
+ bNode *texture_node = add_texture_node(cot, -300, locy, "Emission");
+ if (texture_node != NULL) {
+ add_link(texture_node, 0, shader_node, 0);
+ }
}
}
-void MaterialNode::set_opacity(COLLADAFW::ColorOrTexture &cot, std::string label)
+void MaterialNode::set_opacity(COLLADAFW::ColorOrTexture &cot)
{
if (effect == nullptr) {
return;
@@ -254,37 +302,29 @@ void MaterialNode::set_opacity(COLLADAFW::ColorOrTexture &cot, std::string label
if (col.isValid()) {
alpha *= col.getAlpha(); // Assuming A_ONE opaque mode
}
- if (col.isValid() || alpha < 1.0) {
- // not sure what to do here
- }
- bNode *node = add_node(SH_NODE_RGB, -300, locy, label);
- set_color(node, col);
- // TODO: Connect node
+ bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Alpha");
+ ((bNodeSocketValueFloat *)socket->default_value)->value = alpha;
}
// texture
else if (cot.isTexture()) {
- add_texture_node(cot, -300, locy, label);
+ add_texture_node(cot, -300, locy, "Alpha");
// TODO: Connect node
}
}
-void MaterialNode::set_specular(COLLADAFW::ColorOrTexture &cot, std::string label)
+void MaterialNode::set_specular(COLLADAFW::ColorOrTexture &cot)
{
int locy = -300 * (node_map.size() - 2);
if (cot.isColor()) {
COLLADAFW::Color col = cot.getColor();
- material->specr = col.getRed();
- material->specg = col.getGreen();
- material->specb = col.getBlue();
-
- bNode *node = add_node(SH_NODE_RGB, -300, locy, label);
+ bNode *node = add_node(SH_NODE_RGB, -300, locy, "Specular");
set_color(node, col);
// TODO: Connect node
}
// texture
else if (cot.isTexture()) {
- add_texture_node(cot, -300, locy, label);
+ add_texture_node(cot, -300, locy, "Specular");
// TODO: Connect node
}
}