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 'intern/cycles/render')
-rw-r--r--intern/cycles/render/CMakeLists.txt1
-rw-r--r--intern/cycles/render/graph.cpp6
-rw-r--r--intern/cycles/render/nodes.cpp26
-rw-r--r--intern/cycles/render/nodes.h2
-rw-r--r--intern/cycles/render/object.cpp4
-rw-r--r--intern/cycles/render/object.h3
-rw-r--r--intern/cycles/render/svm.cpp11
7 files changed, 43 insertions, 10 deletions
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 6b8e3702d03..e75a3b37f3b 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -7,7 +7,6 @@ set(INC
../kernel/osl
../bvh
../util
- ${GLEW_INCLUDE_PATH}
)
set(INC_SYS
${GLEW_INCLUDE_PATH}
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index 20fbfa0cf27..62758128a73 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -181,14 +181,14 @@ void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to)
assert(from && to);
if(to->link) {
- fprintf(stderr, "ShaderGraph connect: input already connected.\n");
+ fprintf(stderr, "Cycles shader graph connect: input already connected.\n");
return;
}
if(from->type != to->type) {
/* for closures we can't do automatic conversion */
if(from->type == SHADER_SOCKET_CLOSURE || to->type == SHADER_SOCKET_CLOSURE) {
- fprintf(stderr, "ShaderGraph connect: can only connect closure to closure "
+ fprintf(stderr, "Cycles shader graph connect: can only connect closure to closure "
"(ShaderNode:%s, ShaderOutput:%s , type:%d -> to ShaderNode:%s, ShaderInput:%s, type:%d).\n",
from->parent->name.c_str(), from->name, (int)from->type,
to->parent->name.c_str(), to->name, (int)to->type);
@@ -363,7 +363,7 @@ void ShaderGraph::break_cycles(ShaderNode *node, vector<bool>& visited, vector<b
if(on_stack[depnode->id]) {
/* break cycle */
disconnect(input);
- fprintf(stderr, "ShaderGraph: detected cycle in graph, connection removed.\n");
+ fprintf(stderr, "Cycles shader graph: detected cycle in graph, connection removed.\n");
}
else if(!visited[depnode->id]) {
/* visit dependencies */
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index eabb97e7238..8173f5d0af2 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -1644,6 +1644,8 @@ TextureCoordinateNode::TextureCoordinateNode()
add_output("Camera", SHADER_SOCKET_POINT);
add_output("Window", SHADER_SOCKET_POINT);
add_output("Reflection", SHADER_SOCKET_NORMAL);
+
+ from_dupli = false;
}
void TextureCoordinateNode::attributes(AttributeRequestSet *attributes)
@@ -1681,9 +1683,15 @@ void TextureCoordinateNode::compile(SVMCompiler& compiler)
compiler.add_node(geom_node, NODE_GEOM_P, out->stack_offset);
}
else {
- int attr = compiler.attribute(ATTR_STD_GENERATED);
- compiler.stack_assign(out);
- compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+ if(from_dupli) {
+ compiler.stack_assign(out);
+ compiler.add_node(texco_node, NODE_TEXCO_DUPLI_GENERATED, out->stack_offset);
+ }
+ else {
+ int attr = compiler.attribute(ATTR_STD_GENERATED);
+ compiler.stack_assign(out);
+ compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+ }
}
}
@@ -1695,9 +1703,15 @@ void TextureCoordinateNode::compile(SVMCompiler& compiler)
out = output("UV");
if(!out->links.empty()) {
- int attr = compiler.attribute(ATTR_STD_UV);
- compiler.stack_assign(out);
- compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+ if(from_dupli) {
+ int attr = compiler.attribute(ATTR_STD_UV);
+ compiler.stack_assign(out);
+ compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+ }
+ else {
+ compiler.stack_assign(out);
+ compiler.add_node(texco_node, NODE_TEXCO_DUPLI_UV, out->stack_offset);
+ }
}
out = output("Object");
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 82bead7e41a..e8e584dd8ef 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -284,6 +284,8 @@ class TextureCoordinateNode : public ShaderNode {
public:
SHADER_NODE_CLASS(TextureCoordinateNode)
void attributes(AttributeRequestSet *attributes);
+
+ bool from_dupli;
};
class LightPathNode : public ShaderNode {
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 7389b239627..d78a82d589a 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -235,6 +235,10 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
}
}
+ /* dupli object coords */
+ objects[offset+16] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], 0.0f);
+ objects[offset+17] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], 0.0f, 0.0f);
+
/* object flag */
if(ob->use_holdout)
flag |= SD_HOLDOUT_MASK;
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index 88677d79dff..e2c3ad4e071 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -49,6 +49,9 @@ public:
bool use_motion;
bool use_holdout;
+ float3 dupli_generated;
+ float2 dupli_uv;
+
int particle_id;
Object();
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index 844ce01569f..da287a10199 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -274,6 +274,17 @@ void SVMCompiler::stack_clear_users(ShaderNode *node, set<ShaderNode*>& done)
foreach(ShaderInput *in, output->links)
in->stack_offset = SVM_STACK_INVALID;
+
+ /* unmark any nodes that have no more valid outputs, see [#31806] */
+ if(done.find(output->parent) != done.end()) {
+ all_done = true;
+ foreach(ShaderOutput *pout, output->parent->outputs)
+ if(pout->stack_offset != SVM_STACK_INVALID)
+ all_done = false;
+
+ if(all_done)
+ done.erase(output->parent);
+ }
}
}
}