ClangFormat: apply to source, most of intern
[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(color Color = color(0.5, 0.5, 0.5),
20                               float Density = 1.0,
21                               float Anisotropy = 0.0,
22                               color AbsorptionColor = color(0.0, 0.0, 0.0),
23                               float EmissionStrength = 0.0,
24                               color EmissionColor = color(1.0, 1.0, 1.0),
25                               float BlackbodyIntensity = 0.0,
26                               color BlackbodyTint = color(1.0, 1.0, 1.0),
27                               float Temperature = 1500.0,
28                               string DensityAttribute = "geom:density",
29                               string ColorAttribute = "geom:color",
30                               string TemperatureAttribute = "geom:temperature",
31                               output closure color Volume = 0)
32 {
33   /* Compute density. */
34   float primitive_density = 1.0;
35   float density = max(Density, 0.0);
36
37   if (density > 1e-5) {
38     if (getattribute(DensityAttribute, primitive_density)) {
39       density = max(density * primitive_density, 0.0);
40     }
41   }
42
43   if (density > 1e-5) {
44     /* Compute scattering color. */
45     color scatter_color = Color;
46     color primitive_color;
47     if (getattribute(ColorAttribute, primitive_color)) {
48       scatter_color *= primitive_color;
49     }
50
51     /* Add scattering and absorption closures. */
52     color scatter_coeff = scatter_color;
53     color absorption_color = sqrt(max(AbsorptionColor, 0.0));
54     color absorption_coeff = max(1.0 - scatter_color, 0.0) * max(1.0 - absorption_color, 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 }