Merge branch 'master' into blender2.8
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 28 Feb 2018 20:33:40 +0000 (21:33 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 28 Feb 2018 20:34:09 +0000 (21:34 +0100)
1  2 
source/blender/editors/armature/armature_naming.c
source/blender/editors/armature/pose_edit.c
source/blender/editors/include/ED_armature.h
source/blender/gpu/shaders/gpu_shader_material.glsl
source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c
source/blender/windowmanager/intern/wm_operators.c

index 1269f81180c3f70b16e8c683601e7f70bb443a40,1f5ffbdcc7e25df60f0e3147bd85b02876dc04c5..602ca16b08d522faf8df9cc9338d60fcb0a23b3c
@@@ -3028,130 -2795,16 +3028,131 @@@ void node_emission(vec4 color, float st
  
  void background_transform_to_world(vec3 viewvec, out vec3 worldvec)
  {
 -      vec4 v = (gl_ProjectionMatrix[3][3] == 0.0) ? vec4(viewvec, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
 -      vec4 co_homogenous = (gl_ProjectionMatrixInverse * v);
 +      vec4 v = (ProjectionMatrix[3][3] == 0.0) ? vec4(viewvec, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
 +      vec4 co_homogenous = (ProjectionMatrixInverse * v);
  
        vec4 co = vec4(co_homogenous.xyz / co_homogenous.w, 0.0);
 -      worldvec = (gl_ModelViewMatrixInverse * co).xyz;
 +#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
 +      worldvec = (ViewMatrixInverse * co).xyz;
 +#else
 +      worldvec = (ModelViewMatrixInverse * co).xyz;
 +#endif
 +}
 +
 +void node_background(vec4 color, float strength, out Closure result)
 +{
 +#ifndef VOLUMETRICS
 +      color *= strength;
 +#ifdef EEVEE_ENGINE
 +      result = CLOSURE_DEFAULT;
 +      result.radiance = color.rgb;
 +      result.opacity = color.a;
 +#else
 +      result = Closure(color.rgb, color.a);
 +#endif
 +#else
 +      result = CLOSURE_DEFAULT;
 +#endif
 +}
 +
 +/* volumes */
 +
 +void node_volume_scatter(vec4 color, float density, float anisotropy, out Closure result)
 +{
 +#ifdef VOLUMETRICS
 +      result = Closure(vec3(0.0), color.rgb * density, vec3(0.0), anisotropy);
 +#else
 +      result = CLOSURE_DEFAULT;
 +#endif
  }
  
 -void node_background(vec4 color, float strength, vec3 N, out vec4 result)
 +void node_volume_absorption(vec4 color, float density, out Closure result)
  {
 -      result = color * strength;
 +#ifdef VOLUMETRICS
 +      result = Closure((1.0 - color.rgb) * density, vec3(0.0), vec3(0.0), 0.0);
 +#else
 +      result = CLOSURE_DEFAULT;
 +#endif
 +}
 +
 +void node_blackbody(float temperature, sampler2D spectrummap, out vec4 color)
 +{
 +    if(temperature >= 12000.0) {
 +        color = vec4(0.826270103, 0.994478524, 1.56626022, 1.0);
 +    }
 +    else if(temperature < 965.0) {
 +        color = vec4(4.70366907, 0.0, 0.0, 1.0);
 +    }
 +      else {
 +              float t = (temperature - 965.0) / (12000.0 - 965.0);
 +              color = vec4(texture(spectrummap, vec2(t, 0.0)).rgb, 1.0);
 +      }
 +}
 +
 +void node_volume_principled(
 +      vec4 color,
 +      float density,
 +      float anisotropy,
 +      vec4 absorption_color,
 +      float emission_strength,
 +      vec4 emission_color,
 +      float blackbody_intensity,
 +      vec4 blackbody_tint,
 +      float temperature,
 +      float density_attribute,
 +      vec4 color_attribute,
 +      float temperature_attribute,
 +      sampler2D spectrummap,
 +      out Closure result)
 +{
 +#ifdef VOLUMETRICS
 +      vec3 absorption_coeff = vec3(0.0);
 +      vec3 scatter_coeff = vec3(0.0);
 +      vec3 emission_coeff = vec3(0.0);
 +
 +      /* Compute density. */
 +      density = max(density, 0.0);
 +
 +      if(density > 1e-5) {
 +              density = max(density * density_attribute, 0.0);
 +      }
 +
 +      if(density > 1e-5) {
 +              /* Compute scattering and absorption coefficients. */
 +              vec3 scatter_color = color.rgb * color_attribute.rgb;
 +
 +              scatter_coeff = scatter_color * density;
++              absorption_color.rgb = sqrt(max(absorption_color.rgb, 0.0));
 +              absorption_coeff = max(1.0 - scatter_color, 0.0) * max(1.0 - absorption_color.rgb, 0.0) * density;
 +      }
 +
 +      /* Compute emission. */
 +      emission_strength = max(emission_strength, 0.0);
 +
 +      if(emission_strength > 1e-5) {
 +              emission_coeff += emission_strength * emission_color.rgb;
 +      }
 +
 +      if(blackbody_intensity > 1e-3) {
 +              /* Add temperature from attribute. */
 +              float T = max(temperature * max(temperature_attribute, 0.0), 0.0);
 +
 +              /* Stefan-Boltzman law. */
 +              float T4 = (T * T) * (T * T);
 +              float sigma = 5.670373e-8 * 1e-6 / M_PI;
 +              float intensity = sigma * mix(1.0, T4, blackbody_intensity);
 +
 +              if(intensity > 1e-5) {
 +                      vec4 bb;
 +                      node_blackbody(T, spectrummap, bb);
 +                      emission_coeff += bb.rgb * blackbody_tint.rgb * intensity;
 +              }
 +      }
 +
 +      result = Closure(absorption_coeff, scatter_coeff, emission_coeff, anisotropy);
 +#else
 +      result = CLOSURE_DEFAULT;
 +#endif
  }
  
  /* closures */