609fb95866d3f61b2ea6d2e599e26a302254f3cb
[blender.git] / intern / cycles / kernel / shaders / node_principled_volume.osl
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "stdosl.h"
18
19 shader node_principled_volume(
20         color Color = color(0.5, 0.5, 0.5),
21         float Density = 1.0,
22         float Anisotropy = 0.0,
23         color AbsorptionColor = color(0.0, 0.0, 0.0),
24         float EmissionStrength = 0.0,
25         color EmissionColor = color(1.0, 1.0, 1.0),
26         float BlackbodyIntensity = 0.0,
27         color BlackbodyTint = color(1.0, 1.0, 1.0),
28         float Temperature = 1500.0,
29         string DensityAttribute = "geom:density",
30         string ColorAttribute = "geom:color",
31         string TemperatureAttribute = "geom:temperature",
32         output closure color Volume = 0)
33 {
34         /* Compute density. */
35         float primitive_density = 1.0;
36         float density = max(Density, 0.0);
37
38         if(density > 1e-5) {
39                 if(getattribute(DensityAttribute, primitive_density)) {
40                         density = max(density * primitive_density, 0.0);
41                 }
42         }
43
44         if(density > 1e-5) {
45                 /* Compute scattering color. */
46                 color scatter_color = Color;
47                 color primitive_color;
48                 if(getattribute(ColorAttribute, primitive_color)) {
49                         scatter_color *= primitive_color;
50                 }
51
52                 /* Add scattering and absorption closures. */
53                 color scatter_coeff = scatter_color;
54                 color absorption_coeff = max(1.0 - scatter_color, 0.0) * max(1.0 - AbsorptionColor, 0.0);
55                 Volume = scatter_coeff * density * henyey_greenstein(Anisotropy) +
56                          absorption_coeff * density * absorption();
57         }
58
59         /* Compute emission. */
60         float emission_strength = max(EmissionStrength, 0.0);
61         float blackbody_intensity = BlackbodyIntensity;
62
63         if(emission_strength > 1e-5) {
64                 Volume += emission_strength * EmissionColor * emission();
65         }
66
67         if(blackbody_intensity > 1e-3) {
68                 float T = Temperature;
69
70                 /* Add temperature from attribute if available. */
71                 float temperature;
72                 if(getattribute(TemperatureAttribute, temperature)) {
73                         T *= max(temperature, 0.0);
74                 }
75
76                 T = max(T, 0.0);
77
78                 /* Stefan-Boltzman law. */
79                 float T4 = (T * T) * (T * T);
80                 float sigma = 5.670373e-8 * 1e-6 / M_PI;
81                 float intensity = sigma * mix(1.0, T4, blackbody_intensity);
82
83                 if(intensity > 1e-5) {
84                         color bb = blackbody(T);
85                         float l = luminance(bb);
86
87                         if(l != 0.0) {
88                                 bb *= BlackbodyTint * intensity / l;
89                                 Volume += bb * emission();
90                         }
91                 }
92         }
93 }
94