diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-02-13 17:06:41 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-02-13 17:06:41 +0300 |
commit | b330804ff3eca68cdd65e26d551d1829fae5ff36 (patch) | |
tree | 7501de6265ae963e064a580e6339539740a9008b /intern | |
parent | 9e2ec6c86a9ea2e387fe5e523df06c0a462819b7 (diff) | |
parent | 9fb1f9c5cdccc14f65ba2047e5656b360142aa43 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/blender_curves.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_hair_info.osl | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_principled_bsdf.osl | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_geometry.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/attribute.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 9 |
9 files changed, 40 insertions, 4 deletions
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 5ed021aa1e4..25455113f66 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -565,9 +565,12 @@ static void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CDa return; Attribute *attr_intercept = NULL; + Attribute *attr_index = NULL; if(mesh->need_attribute(scene, ATTR_STD_CURVE_INTERCEPT)) attr_intercept = mesh->curve_attributes.add(ATTR_STD_CURVE_INTERCEPT); + if(mesh->need_attribute(scene, ATTR_STD_CURVE_INDEX)) + attr_index = mesh->curve_attributes.add(ATTR_STD_CURVE_INDEX); /* compute and reserve size of arrays */ for(int sys = 0; sys < CData->psys_firstcurve.size(); sys++) { @@ -612,12 +615,25 @@ static void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CDa num_curve_keys++; } + if(attr_index != NULL) { + attr_index->add(num_curves); + } + mesh->add_curve(num_keys, CData->psys_shader[sys]); num_keys += num_curve_keys; num_curves++; } } + if(attr_index != NULL) { + /* Normalize index to 0..1 range. */ + float *curve_index = attr_index->data_float(); + const float norm_factor = 1.0f / (float)num_curves; + for(int i = 0; i < num_curves; ++i) { + curve_index[i] *= norm_factor; + } + } + /* check allocation */ if((mesh->curve_keys.size() != num_keys) || (mesh->num_curves() != num_curves)) { VLOG(1) << "Allocation failed, clearing data"; diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index cd3b450932f..0bb5873e75c 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -772,6 +772,7 @@ typedef enum AttributeStandard { ATTR_STD_MOTION_VERTEX_NORMAL, ATTR_STD_PARTICLE, ATTR_STD_CURVE_INTERCEPT, + ATTR_STD_CURVE_INDEX, ATTR_STD_PTEX_FACE_ID, ATTR_STD_PTEX_UV, ATTR_STD_VOLUME_DENSITY, diff --git a/intern/cycles/kernel/shaders/node_hair_info.osl b/intern/cycles/kernel/shaders/node_hair_info.osl index 965d2a3c7f7..79995bdbfc3 100644 --- a/intern/cycles/kernel/shaders/node_hair_info.osl +++ b/intern/cycles/kernel/shaders/node_hair_info.osl @@ -20,11 +20,13 @@ shader node_hair_info( output float IsStrand = 0.0, output float Intercept = 0.0, output float Thickness = 0.0, - output normal TangentNormal = N) + output normal TangentNormal = N, + output float Index = 0) { getattribute("geom:is_curve", IsStrand); getattribute("geom:curve_intercept", Intercept); getattribute("geom:curve_thickness", Thickness); getattribute("geom:curve_tangent_normal", TangentNormal); + getattribute("geom:curve_index", Index); } diff --git a/intern/cycles/kernel/shaders/node_principled_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_bsdf.osl index fc0a1c894da..6f54ba3a462 100644 --- a/intern/cycles/kernel/shaders/node_principled_bsdf.osl +++ b/intern/cycles/kernel/shaders/node_principled_bsdf.osl @@ -63,7 +63,7 @@ shader node_principled_bsdf( BSDF = mixed_ss_base_color * bssrdf("principled", Normal, Subsurface * SubsurfaceRadius, SubsurfaceColor, "roughness", Roughness); } else { - BSDF = mixed_ss_base_color * bssrdf("principled_random_walk", Normal, Subsurface * SubsurfaceRadius, SubsurfaceColor, "roughness", Roughness); + BSDF = mixed_ss_base_color * bssrdf("principled_random_walk", Normal, Subsurface * SubsurfaceRadius, mixed_ss_base_color, "roughness", Roughness); } } else { diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index fa43e1b60d0..5398f36c267 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -187,7 +187,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * if(bssrdf) { bssrdf->radius = subsurface_radius * subsurface; - bssrdf->albedo = subsurface_color; + bssrdf->albedo = (subsurface_method == CLOSURE_BSSRDF_PRINCIPLED_ID)? subsurface_color: mixed_ss_base_color; bssrdf->texture_blur = 0.0f; bssrdf->sharpness = 0.0f; bssrdf->N = N; diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h index 9af4a0182d9..6c88d150b60 100644 --- a/intern/cycles/kernel/svm/svm_geometry.h +++ b/intern/cycles/kernel/svm/svm_geometry.h @@ -180,6 +180,8 @@ ccl_device void svm_node_hair_info(KernelGlobals *kg, } case NODE_INFO_CURVE_INTERCEPT: break; /* handled as attribute */ + case NODE_INFO_CURVE_INDEX: + break; /* handled as attribute */ case NODE_INFO_CURVE_THICKNESS: { data = curve_thickness(kg, sd); stack_store_float(stack, out_offset, data); diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index c0ce0f52cd0..b3a2cf6e9ae 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -176,7 +176,8 @@ typedef enum NodeHairInfo { NODE_INFO_CURVE_THICKNESS, /*fade for minimum hair width transpency*/ /*NODE_INFO_CURVE_FADE,*/ - NODE_INFO_CURVE_TANGENT_NORMAL + NODE_INFO_CURVE_TANGENT_NORMAL, + NODE_INFO_CURVE_INDEX, } NodeHairInfo; typedef enum NodeLightPath { diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp index 95e69df6885..2d1100c9d88 100644 --- a/intern/cycles/render/attribute.cpp +++ b/intern/cycles/render/attribute.cpp @@ -267,6 +267,8 @@ const char *Attribute::standard_name(AttributeStandard std) return "particle"; case ATTR_STD_CURVE_INTERCEPT: return "curve_intercept"; + case ATTR_STD_CURVE_INDEX: + return "curve_index"; case ATTR_STD_PTEX_FACE_ID: return "ptex_face_id"; case ATTR_STD_PTEX_UV: @@ -451,6 +453,9 @@ Attribute *AttributeSet::add(AttributeStandard std, ustring name) case ATTR_STD_CURVE_INTERCEPT: attr = add(name, TypeDesc::TypeFloat, ATTR_ELEMENT_CURVE_KEY); break; + case ATTR_STD_CURVE_INDEX: + attr = add(name, TypeDesc::TypeFloat, ATTR_ELEMENT_CURVE); + break; case ATTR_STD_GENERATED_TRANSFORM: attr = add(name, TypeDesc::TypeMatrix, ATTR_ELEMENT_MESH); break; diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index cb884ba9231..d2a03ceb76a 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -3572,6 +3572,7 @@ NODE_DEFINE(HairInfoNode) #if 0 /*output for minimum hair width transparency - deactivated */ SOCKET_OUT_FLOAT(fade, "Fade"); #endif + SOCKET_OUT_FLOAT(index, "Index"); return type; } @@ -3588,6 +3589,9 @@ void HairInfoNode::attributes(Shader *shader, AttributeRequestSet *attributes) if(!intercept_out->links.empty()) attributes->add(ATTR_STD_CURVE_INTERCEPT); + + if(!output("Index")->links.empty()) + attributes->add(ATTR_STD_CURVE_INDEX); } ShaderNode::attributes(shader, attributes); @@ -3623,6 +3627,11 @@ void HairInfoNode::compile(SVMCompiler& compiler) compiler.add_node(NODE_HAIR_INFO, NODE_INFO_CURVE_FADE, compiler.stack_assign(out)); }*/ + out = output("Index"); + if(!out->links.empty()) { + int attr = compiler.attribute(ATTR_STD_CURVE_INDEX); + compiler.add_node(NODE_ATTR, attr, compiler.stack_assign(out), NODE_ATTR_FLOAT); + } } void HairInfoNode::compile(OSLCompiler& compiler) |