Advertisement
Guest User

Untitled

a guest
Oct 5th, 2018
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 55.26 KB | None | 0 0
  1. diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
  2. index 86ad6e1a061..d1008d5c983 100644
  3. --- a/intern/cycles/kernel/kernel_accumulate.h
  4. +++ b/intern/cycles/kernel/kernel_accumulate.h
  5. @@ -440,6 +440,7 @@ ccl_device_inline void path_radiance_accum_total_light(
  6.  #endif
  7.  }
  8.  
  9. +// bookmark: does the value here need to be converted to spectral?
  10.  ccl_device_inline void path_radiance_accum_background(
  11.          PathRadiance *L,
  12.          ccl_addr_space PathState *state,
  13. diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h
  14. index afb63152830..f1014da7649 100644
  15. --- a/intern/cycles/kernel/kernel_bake.h
  16. +++ b/intern/cycles/kernel/kernel_bake.h
  17. @@ -68,7 +68,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg,
  18.  
  19.         /* sample emission */
  20.         if((pass_filter & BAKE_FILTER_EMISSION) && (sd->flag & SD_EMISSION)) {
  21. -           float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf);
  22. +           float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf, state.wavelengths);
  23.             path_radiance_accum_emission(&L_sample, &state, throughput, emission);
  24.         }
  25.  
  26. @@ -137,7 +137,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg,
  27.  
  28.         /* sample emission */
  29.         if((pass_filter & BAKE_FILTER_EMISSION) && (sd->flag & SD_EMISSION)) {
  30. -           float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf);
  31. +           float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf, state.wavelengths);
  32.             path_radiance_accum_emission(&L_sample, &state, throughput, emission);
  33.         }
  34.  
  35. @@ -352,7 +352,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
  36.                 out = make_float3(roughness, roughness, roughness);
  37.             }
  38.             else {
  39. -               out = shader_emissive_eval(kg, &sd);
  40. +               out = shader_emissive_eval(kg, &sd, state.wavelengths);
  41.             }
  42.             break;
  43.         }
  44. diff --git a/intern/cycles/kernel/kernel_color.h b/intern/cycles/kernel/kernel_color.h
  45. index 990e798543a..2dd82b356c5 100644
  46. --- a/intern/cycles/kernel/kernel_color.h
  47. +++ b/intern/cycles/kernel/kernel_color.h
  48. @@ -33,6 +33,754 @@ ccl_device float linear_rgb_to_gray(KernelGlobals *kg, float3 c)
  49.      return dot(c, float4_to_float3(kernel_data.film.rgb_to_y));
  50.  }
  51.  
  52. +ccl_device float float_lerp(float start, float end, float progress)
  53. +{
  54. +    return start + ((end - start) * progress);
  55. +}
  56. +
  57. +ccl_device float3 wavelength_to_xyz(float wavelength)
  58. +{
  59. +    float4 lookup[] = {
  60. +        make_float4(380.0, 0.0014, 0.0000, 0.0065),
  61. +        make_float4(381.0, 0.0015, 0.0000, 0.0070),
  62. +        make_float4(382.0, 0.0016, 0.0000, 0.0077),
  63. +        make_float4(383.0, 0.0018, 0.0001, 0.0085),
  64. +        make_float4(384.0, 0.0020, 0.0001, 0.0094),
  65. +        make_float4(385.0, 0.0022, 0.0001, 0.0105),
  66. +        make_float4(386.0, 0.0025, 0.0001, 0.0120),
  67. +        make_float4(387.0, 0.0029, 0.0001, 0.0136),
  68. +        make_float4(388.0, 0.0033, 0.0001, 0.0155),
  69. +        make_float4(389.0, 0.0037, 0.0001, 0.0177),
  70. +        make_float4(390.0, 0.0042, 0.0001, 0.0201),
  71. +        make_float4(391.0, 0.0048, 0.0001, 0.0225),
  72. +        make_float4(392.0, 0.0053, 0.0002, 0.0252),
  73. +        make_float4(393.0, 0.0060, 0.0002, 0.0284),
  74. +        make_float4(394.0, 0.0068, 0.0002, 0.0320),
  75. +        make_float4(395.0, 0.0077, 0.0002, 0.0362),
  76. +        make_float4(396.0, 0.0088, 0.0002, 0.0415),
  77. +        make_float4(397.0, 0.0100, 0.0003, 0.0473),
  78. +        make_float4(398.0, 0.0113, 0.0003, 0.0536),
  79. +        make_float4(399.0, 0.0128, 0.0004, 0.0605),
  80. +        make_float4(400.0, 0.0143, 0.0004, 0.0679),
  81. +        make_float4(401.0, 0.0156, 0.0004, 0.0741),
  82. +        make_float4(402.0, 0.0171, 0.0005, 0.0810),
  83. +        make_float4(403.0, 0.0188, 0.0005, 0.0891),
  84. +        make_float4(404.0, 0.0208, 0.0006, 0.0988),
  85. +        make_float4(405.0, 0.0232, 0.0006, 0.1102),
  86. +        make_float4(406.0, 0.0263, 0.0007, 0.1249),
  87. +        make_float4(407.0, 0.0298, 0.0008, 0.1418),
  88. +        make_float4(408.0, 0.0339, 0.0009, 0.1612),
  89. +        make_float4(409.0, 0.0384, 0.0011, 0.1830),
  90. +        make_float4(410.0, 0.0435, 0.0012, 0.2074),
  91. +        make_float4(411.0, 0.0489, 0.0014, 0.2334),
  92. +        make_float4(412.0, 0.0550, 0.0015, 0.2625),
  93. +        make_float4(413.0, 0.0618, 0.0017, 0.2949),
  94. +        make_float4(414.0, 0.0693, 0.0019, 0.3311),
  95. +        make_float4(415.0, 0.0776, 0.0022, 0.3713),
  96. +        make_float4(416.0, 0.0871, 0.0025, 0.4170),
  97. +        make_float4(417.0, 0.0976, 0.0028, 0.4673),
  98. +        make_float4(418.0, 0.1089, 0.0031, 0.5221),
  99. +        make_float4(419.0, 0.1212, 0.0035, 0.5815),
  100. +        make_float4(420.0, 0.1344, 0.0040, 0.6456),
  101. +        make_float4(421.0, 0.1497, 0.0046, 0.7201),
  102. +        make_float4(422.0, 0.1657, 0.0052, 0.7980),
  103. +        make_float4(423.0, 0.1820, 0.0058, 0.8780),
  104. +        make_float4(424.0, 0.1985, 0.0065, 0.9588),
  105. +        make_float4(425.0, 0.2148, 0.0073, 1.0391),
  106. +        make_float4(426.0, 0.2299, 0.0081, 1.1141),
  107. +        make_float4(427.0, 0.2445, 0.0089, 1.1868),
  108. +        make_float4(428.0, 0.2584, 0.0098, 1.2566),
  109. +        make_float4(429.0, 0.2716, 0.0107, 1.3230),
  110. +        make_float4(430.0, 0.2839, 0.0116, 1.3856),
  111. +        make_float4(431.0, 0.2948, 0.0126, 1.4419),
  112. +        make_float4(432.0, 0.3047, 0.0136, 1.4939),
  113. +        make_float4(433.0, 0.3136, 0.0146, 1.5414),
  114. +        make_float4(434.0, 0.3216, 0.0157, 1.5844),
  115. +        make_float4(435.0, 0.3285, 0.0168, 1.6230),
  116. +        make_float4(436.0, 0.3343, 0.0180, 1.6561),
  117. +        make_float4(437.0, 0.3391, 0.0192, 1.6848),
  118. +        make_float4(438.0, 0.3430, 0.0204, 1.7094),
  119. +        make_float4(439.0, 0.3461, 0.0217, 1.7301),
  120. +        make_float4(440.0, 0.3483, 0.0230, 1.7471),
  121. +        make_float4(441.0, 0.3496, 0.0243, 1.7599),
  122. +        make_float4(442.0, 0.3501, 0.0256, 1.7695),
  123. +        make_float4(443.0, 0.3500, 0.0270, 1.7763),
  124. +        make_float4(444.0, 0.3493, 0.0284, 1.7805),
  125. +        make_float4(445.0, 0.3481, 0.0298, 1.7826),
  126. +        make_float4(446.0, 0.3464, 0.0313, 1.7833),
  127. +        make_float4(447.0, 0.3444, 0.0329, 1.7823),
  128. +        make_float4(448.0, 0.3420, 0.0345, 1.7800),
  129. +        make_float4(449.0, 0.3392, 0.0362, 1.7765),
  130. +        make_float4(450.0, 0.3362, 0.0380, 1.7721),
  131. +        make_float4(451.0, 0.3333, 0.0398, 1.7688),
  132. +        make_float4(452.0, 0.3301, 0.0418, 1.7647),
  133. +        make_float4(453.0, 0.3267, 0.0438, 1.7593),
  134. +        make_float4(454.0, 0.3229, 0.0458, 1.7525),
  135. +        make_float4(455.0, 0.3187, 0.0480, 1.7441),
  136. +        make_float4(456.0, 0.3140, 0.0502, 1.7335),
  137. +        make_float4(457.0, 0.3089, 0.0526, 1.7208),
  138. +        make_float4(458.0, 0.3033, 0.0550, 1.7060),
  139. +        make_float4(459.0, 0.2973, 0.0574, 1.6889),
  140. +        make_float4(460.0, 0.2908, 0.0600, 1.6692),
  141. +        make_float4(461.0, 0.2839, 0.0626, 1.6473),
  142. +        make_float4(462.0, 0.2766, 0.0653, 1.6226),
  143. +        make_float4(463.0, 0.2687, 0.0680, 1.5946),
  144. +        make_float4(464.0, 0.2602, 0.0709, 1.5632),
  145. +        make_float4(465.0, 0.2511, 0.0739, 1.5281),
  146. +        make_float4(466.0, 0.2406, 0.0770, 1.4849),
  147. +        make_float4(467.0, 0.2297, 0.0803, 1.4386),
  148. +        make_float4(468.0, 0.2184, 0.0837, 1.3897),
  149. +        make_float4(469.0, 0.2069, 0.0872, 1.3392),
  150. +        make_float4(470.0, 0.1954, 0.0910, 1.2876),
  151. +        make_float4(471.0, 0.1844, 0.0949, 1.2382),
  152. +        make_float4(472.0, 0.1735, 0.0991, 1.1887),
  153. +        make_float4(473.0, 0.1628, 0.1034, 1.1394),
  154. +        make_float4(474.0, 0.1523, 0.1079, 1.0904),
  155. +        make_float4(475.0, 0.1421, 0.1126, 1.0419),
  156. +        make_float4(476.0, 0.1322, 0.1175, 0.9943),
  157. +        make_float4(477.0, 0.1226, 0.1226, 0.9474),
  158. +        make_float4(478.0, 0.1133, 0.1279, 0.9015),
  159. +        make_float4(479.0, 0.1043, 0.1334, 0.8567),
  160. +        make_float4(480.0, 0.0956, 0.1390, 0.8130),
  161. +        make_float4(481.0, 0.0873, 0.1446, 0.7706),
  162. +        make_float4(482.0, 0.0793, 0.1504, 0.7296),
  163. +        make_float4(483.0, 0.0718, 0.1564, 0.6902),
  164. +        make_float4(484.0, 0.0646, 0.1627, 0.6523),
  165. +        make_float4(485.0, 0.0580, 0.1693, 0.6162),
  166. +        make_float4(486.0, 0.0519, 0.1763, 0.5825),
  167. +        make_float4(487.0, 0.0463, 0.1836, 0.5507),
  168. +        make_float4(488.0, 0.0412, 0.1913, 0.5205),
  169. +        make_float4(489.0, 0.0364, 0.1994, 0.4920),
  170. +        make_float4(490.0, 0.0320, 0.2080, 0.4652),
  171. +        make_float4(491.0, 0.0279, 0.2171, 0.4399),
  172. +        make_float4(492.0, 0.0241, 0.2267, 0.4162),
  173. +        make_float4(493.0, 0.0207, 0.2368, 0.3939),
  174. +        make_float4(494.0, 0.0175, 0.2474, 0.3730),
  175. +        make_float4(495.0, 0.0147, 0.2586, 0.3533),
  176. +        make_float4(496.0, 0.0121, 0.2702, 0.3349),
  177. +        make_float4(497.0, 0.0099, 0.2824, 0.3176),
  178. +        make_float4(498.0, 0.0079, 0.2952, 0.3014),
  179. +        make_float4(499.0, 0.0063, 0.3087, 0.2862),
  180. +        make_float4(500.0, 0.0049, 0.3230, 0.2720),
  181. +        make_float4(501.0, 0.0037, 0.3385, 0.2588),
  182. +        make_float4(502.0, 0.0029, 0.3548, 0.2464),
  183. +        make_float4(503.0, 0.0024, 0.3717, 0.2346),
  184. +        make_float4(504.0, 0.0022, 0.3893, 0.2233),
  185. +        make_float4(505.0, 0.0024, 0.4073, 0.2123),
  186. +        make_float4(506.0, 0.0029, 0.4256, 0.2010),
  187. +        make_float4(507.0, 0.0038, 0.4443, 0.1899),
  188. +        make_float4(508.0, 0.0052, 0.4635, 0.1790),
  189. +        make_float4(509.0, 0.0070, 0.4830, 0.1685),
  190. +        make_float4(510.0, 0.0093, 0.5030, 0.1582),
  191. +        make_float4(511.0, 0.0122, 0.5237, 0.1481),
  192. +        make_float4(512.0, 0.0156, 0.5447, 0.1384),
  193. +        make_float4(513.0, 0.0195, 0.5658, 0.1290),
  194. +        make_float4(514.0, 0.0240, 0.5870, 0.1201),
  195. +        make_float4(515.0, 0.0291, 0.6082, 0.1117),
  196. +        make_float4(516.0, 0.0349, 0.6293, 0.1040),
  197. +        make_float4(517.0, 0.0412, 0.6502, 0.0968),
  198. +        make_float4(518.0, 0.0480, 0.6707, 0.0901),
  199. +        make_float4(519.0, 0.0554, 0.6906, 0.0839),
  200. +        make_float4(520.0, 0.0633, 0.7100, 0.0782),
  201. +        make_float4(521.0, 0.0716, 0.7280, 0.0733),
  202. +        make_float4(522.0, 0.0805, 0.7453, 0.0687),
  203. +        make_float4(523.0, 0.0898, 0.7619, 0.0646),
  204. +        make_float4(524.0, 0.0995, 0.7778, 0.0608),
  205. +        make_float4(525.0, 0.1096, 0.7932, 0.0573),
  206. +        make_float4(526.0, 0.1202, 0.8082, 0.0539),
  207. +        make_float4(527.0, 0.1311, 0.8225, 0.0507),
  208. +        make_float4(528.0, 0.1423, 0.8363, 0.0477),
  209. +        make_float4(529.0, 0.1538, 0.8495, 0.0449),
  210. +        make_float4(530.0, 0.1655, 0.8620, 0.0422),
  211. +        make_float4(531.0, 0.1772, 0.8738, 0.0395),
  212. +        make_float4(532.0, 0.1891, 0.8849, 0.0369),
  213. +        make_float4(533.0, 0.2011, 0.8955, 0.0344),
  214. +        make_float4(534.0, 0.2133, 0.9054, 0.0321),
  215. +        make_float4(535.0, 0.2257, 0.9149, 0.0298),
  216. +        make_float4(536.0, 0.2383, 0.9237, 0.0277),
  217. +        make_float4(537.0, 0.2511, 0.9321, 0.0257),
  218. +        make_float4(538.0, 0.2640, 0.9399, 0.0238),
  219. +        make_float4(539.0, 0.2771, 0.9472, 0.0220),
  220. +        make_float4(540.0, 0.2904, 0.9540, 0.0203),
  221. +        make_float4(541.0, 0.3039, 0.9602, 0.0187),
  222. +        make_float4(542.0, 0.3176, 0.9660, 0.0172),
  223. +        make_float4(543.0, 0.3314, 0.9712, 0.0159),
  224. +        make_float4(544.0, 0.3455, 0.9760, 0.0146),
  225. +        make_float4(545.0, 0.3597, 0.9803, 0.0134),
  226. +        make_float4(546.0, 0.3741, 0.9841, 0.0123),
  227. +        make_float4(547.0, 0.3886, 0.9874, 0.0113),
  228. +        make_float4(548.0, 0.4034, 0.9904, 0.0104),
  229. +        make_float4(549.0, 0.4183, 0.9929, 0.0095),
  230. +        make_float4(550.0, 0.4334, 0.9950, 0.0087),
  231. +        make_float4(551.0, 0.4488, 0.9967, 0.0080),
  232. +        make_float4(552.0, 0.4644, 0.9981, 0.0074),
  233. +        make_float4(553.0, 0.4801, 0.9992, 0.0068),
  234. +        make_float4(554.0, 0.4960, 0.9998, 0.0062),
  235. +        make_float4(555.0, 0.5121, 1.0000, 0.0057),
  236. +        make_float4(556.0, 0.5283, 0.9998, 0.0053),
  237. +        make_float4(557.0, 0.5447, 0.9993, 0.0049),
  238. +        make_float4(558.0, 0.5612, 0.9983, 0.0045),
  239. +        make_float4(559.0, 0.5778, 0.9969, 0.0042),
  240. +        make_float4(560.0, 0.5945, 0.9950, 0.0039),
  241. +        make_float4(561.0, 0.6112, 0.9926, 0.0036),
  242. +        make_float4(562.0, 0.6280, 0.9897, 0.0034),
  243. +        make_float4(563.0, 0.6448, 0.9865, 0.0031),
  244. +        make_float4(564.0, 0.6616, 0.9827, 0.0029),
  245. +        make_float4(565.0, 0.6784, 0.9786, 0.0027),
  246. +        make_float4(566.0, 0.6953, 0.9741, 0.0026),
  247. +        make_float4(567.0, 0.7121, 0.9692, 0.0024),
  248. +        make_float4(568.0, 0.7288, 0.9639, 0.0023),
  249. +        make_float4(569.0, 0.7455, 0.9581, 0.0022),
  250. +        make_float4(570.0, 0.7621, 0.9520, 0.0021),
  251. +        make_float4(571.0, 0.7785, 0.9454, 0.0020),
  252. +        make_float4(572.0, 0.7948, 0.9385, 0.0019),
  253. +        make_float4(573.0, 0.8109, 0.9312, 0.0019),
  254. +        make_float4(574.0, 0.8268, 0.9235, 0.0018),
  255. +        make_float4(575.0, 0.8425, 0.9154, 0.0018),
  256. +        make_float4(576.0, 0.8579, 0.9070, 0.0018),
  257. +        make_float4(577.0, 0.8731, 0.8983, 0.0017),
  258. +        make_float4(578.0, 0.8879, 0.8892, 0.0017),
  259. +        make_float4(579.0, 0.9023, 0.8798, 0.0017),
  260. +        make_float4(580.0, 0.9163, 0.8700, 0.0017),
  261. +        make_float4(581.0, 0.9298, 0.8598, 0.0016),
  262. +        make_float4(582.0, 0.9428, 0.8494, 0.0016),
  263. +        make_float4(583.0, 0.9553, 0.8386, 0.0015),
  264. +        make_float4(584.0, 0.9672, 0.8276, 0.0015),
  265. +        make_float4(585.0, 0.9786, 0.8163, 0.0014),
  266. +        make_float4(586.0, 0.9894, 0.8048, 0.0013),
  267. +        make_float4(587.0, 0.9996, 0.7931, 0.0013),
  268. +        make_float4(588.0, 1.0091, 0.7812, 0.0012),
  269. +        make_float4(589.0, 1.0181, 0.7692, 0.0012),
  270. +        make_float4(590.0, 1.0263, 0.7570, 0.0011),
  271. +        make_float4(591.0, 1.0340, 0.7448, 0.0011),
  272. +        make_float4(592.0, 1.0410, 0.7324, 0.0011),
  273. +        make_float4(593.0, 1.0471, 0.7200, 0.0010),
  274. +        make_float4(594.0, 1.0524, 0.7075, 0.0010),
  275. +        make_float4(595.0, 1.0567, 0.6949, 0.0010),
  276. +        make_float4(596.0, 1.0597, 0.6822, 0.0010),
  277. +        make_float4(597.0, 1.0617, 0.6695, 0.0009),
  278. +        make_float4(598.0, 1.0628, 0.6567, 0.0009),
  279. +        make_float4(599.0, 1.0630, 0.6439, 0.0008),
  280. +        make_float4(600.0, 1.0622, 0.6310, 0.0008),
  281. +        make_float4(601.0, 1.0608, 0.6182, 0.0008),
  282. +        make_float4(602.0, 1.0585, 0.6053, 0.0007),
  283. +        make_float4(603.0, 1.0552, 0.5925, 0.0007),
  284. +        make_float4(604.0, 1.0509, 0.5796, 0.0006),
  285. +        make_float4(605.0, 1.0456, 0.5668, 0.0006),
  286. +        make_float4(606.0, 1.0389, 0.5540, 0.0005),
  287. +        make_float4(607.0, 1.0313, 0.5411, 0.0005),
  288. +        make_float4(608.0, 1.0226, 0.5284, 0.0004),
  289. +        make_float4(609.0, 1.0131, 0.5157, 0.0004),
  290. +        make_float4(610.0, 1.0026, 0.5030, 0.0003),
  291. +        make_float4(611.0, 0.9914, 0.4905, 0.0003),
  292. +        make_float4(612.0, 0.9794, 0.4781, 0.0003),
  293. +        make_float4(613.0, 0.9665, 0.4657, 0.0003),
  294. +        make_float4(614.0, 0.9529, 0.4534, 0.0003),
  295. +        make_float4(615.0, 0.9384, 0.4412, 0.0002),
  296. +        make_float4(616.0, 0.9232, 0.4291, 0.0002),
  297. +        make_float4(617.0, 0.9072, 0.4170, 0.0002),
  298. +        make_float4(618.0, 0.8904, 0.4050, 0.0002),
  299. +        make_float4(619.0, 0.8728, 0.3930, 0.0002),
  300. +        make_float4(620.0, 0.8544, 0.3810, 0.0002),
  301. +        make_float4(621.0, 0.8349, 0.3689, 0.0002),
  302. +        make_float4(622.0, 0.8148, 0.3568, 0.0002),
  303. +        make_float4(623.0, 0.7941, 0.3447, 0.0001),
  304. +        make_float4(624.0, 0.7729, 0.3328, 0.0001),
  305. +        make_float4(625.0, 0.7514, 0.3210, 0.0001),
  306. +        make_float4(626.0, 0.7296, 0.3094, 0.0001),
  307. +        make_float4(627.0, 0.7077, 0.2979, 0.0001),
  308. +        make_float4(628.0, 0.6858, 0.2867, 0.0001),
  309. +        make_float4(629.0, 0.6640, 0.2757, 0.0001),
  310. +        make_float4(630.0, 0.6424, 0.2650, 0.0000),
  311. +        make_float4(631.0, 0.6217, 0.2548, 0.0000),
  312. +        make_float4(632.0, 0.6013, 0.2450, 0.0000),
  313. +        make_float4(633.0, 0.5812, 0.2354, 0.0000),
  314. +        make_float4(634.0, 0.5614, 0.2261, 0.0000),
  315. +        make_float4(635.0, 0.5419, 0.2170, 0.0000),
  316. +        make_float4(636.0, 0.5226, 0.2081, 0.0000),
  317. +        make_float4(637.0, 0.5035, 0.1995, 0.0000),
  318. +        make_float4(638.0, 0.4847, 0.1911, 0.0000),
  319. +        make_float4(639.0, 0.4662, 0.1830, 0.0000),
  320. +        make_float4(640.0, 0.4479, 0.1750, 0.0000),
  321. +        make_float4(641.0, 0.4298, 0.1672, 0.0000),
  322. +        make_float4(642.0, 0.4121, 0.1596, 0.0000),
  323. +        make_float4(643.0, 0.3946, 0.1523, 0.0000),
  324. +        make_float4(644.0, 0.3775, 0.1451, 0.0000),
  325. +        make_float4(645.0, 0.3608, 0.1382, 0.0000),
  326. +        make_float4(646.0, 0.3445, 0.1315, 0.0000),
  327. +        make_float4(647.0, 0.3286, 0.1250, 0.0000),
  328. +        make_float4(648.0, 0.3131, 0.1188, 0.0000),
  329. +        make_float4(649.0, 0.2980, 0.1128, 0.0000),
  330. +        make_float4(650.0, 0.2835, 0.1070, 0.0000),
  331. +        make_float4(651.0, 0.2696, 0.1015, 0.0000),
  332. +        make_float4(652.0, 0.2562, 0.0962, 0.0000),
  333. +        make_float4(653.0, 0.2432, 0.0911, 0.0000),
  334. +        make_float4(654.0, 0.2307, 0.0863, 0.0000),
  335. +        make_float4(655.0, 0.2187, 0.0816, 0.0000),
  336. +        make_float4(656.0, 0.2071, 0.0771, 0.0000),
  337. +        make_float4(657.0, 0.1959, 0.0728, 0.0000),
  338. +        make_float4(658.0, 0.1852, 0.0687, 0.0000),
  339. +        make_float4(659.0, 0.1748, 0.0648, 0.0000),
  340. +        make_float4(660.0, 0.1649, 0.0610, 0.0000),
  341. +        make_float4(661.0, 0.1554, 0.0574, 0.0000),
  342. +        make_float4(662.0, 0.1462, 0.0539, 0.0000),
  343. +        make_float4(663.0, 0.1375, 0.0507, 0.0000),
  344. +        make_float4(664.0, 0.1291, 0.0475, 0.0000),
  345. +        make_float4(665.0, 0.1212, 0.0446, 0.0000),
  346. +        make_float4(666.0, 0.1136, 0.0418, 0.0000),
  347. +        make_float4(667.0, 0.1065, 0.0391, 0.0000),
  348. +        make_float4(668.0, 0.0997, 0.0366, 0.0000),
  349. +        make_float4(669.0, 0.0934, 0.0342, 0.0000),
  350. +        make_float4(670.0, 0.0874, 0.0320, 0.0000),
  351. +        make_float4(671.0, 0.0819, 0.0300, 0.0000),
  352. +        make_float4(672.0, 0.0768, 0.0281, 0.0000),
  353. +        make_float4(673.0, 0.0721, 0.0263, 0.0000),
  354. +        make_float4(674.0, 0.0677, 0.0247, 0.0000),
  355. +        make_float4(675.0, 0.0636, 0.0232, 0.0000),
  356. +        make_float4(676.0, 0.0598, 0.0218, 0.0000),
  357. +        make_float4(677.0, 0.0563, 0.0205, 0.0000),
  358. +        make_float4(678.0, 0.0529, 0.0193, 0.0000),
  359. +        make_float4(679.0, 0.0498, 0.0181, 0.0000),
  360. +        make_float4(680.0, 0.0468, 0.0170, 0.0000),
  361. +        make_float4(681.0, 0.0437, 0.0159, 0.0000),
  362. +        make_float4(682.0, 0.0408, 0.0148, 0.0000),
  363. +        make_float4(683.0, 0.0380, 0.0138, 0.0000),
  364. +        make_float4(684.0, 0.0354, 0.0128, 0.0000),
  365. +        make_float4(685.0, 0.0329, 0.0119, 0.0000),
  366. +        make_float4(686.0, 0.0306, 0.0111, 0.0000),
  367. +        make_float4(687.0, 0.0284, 0.0103, 0.0000),
  368. +        make_float4(688.0, 0.0264, 0.0095, 0.0000),
  369. +        make_float4(689.0, 0.0245, 0.0088, 0.0000),
  370. +        make_float4(690.0, 0.0227, 0.0082, 0.0000),
  371. +        make_float4(691.0, 0.0211, 0.0076, 0.0000),
  372. +        make_float4(692.0, 0.0196, 0.0071, 0.0000),
  373. +        make_float4(693.0, 0.0182, 0.0066, 0.0000),
  374. +        make_float4(694.0, 0.0170, 0.0061, 0.0000),
  375. +        make_float4(695.0, 0.0158, 0.0057, 0.0000),
  376. +        make_float4(696.0, 0.0148, 0.0053, 0.0000),
  377. +        make_float4(697.0, 0.0138, 0.0050, 0.0000),
  378. +        make_float4(698.0, 0.0129, 0.0047, 0.0000),
  379. +        make_float4(699.0, 0.0121, 0.0044, 0.0000),
  380. +        make_float4(700.0, 0.0114, 0.0041, 0.0000),
  381. +        make_float4(701.0, 0.0106, 0.0038, 0.0000),
  382. +        make_float4(702.0, 0.0099, 0.0036, 0.0000),
  383. +        make_float4(703.0, 0.0093, 0.0034, 0.0000),
  384. +        make_float4(704.0, 0.0087, 0.0031, 0.0000),
  385. +        make_float4(705.0, 0.0081, 0.0029, 0.0000),
  386. +        make_float4(706.0, 0.0076, 0.0027, 0.0000),
  387. +        make_float4(707.0, 0.0071, 0.0026, 0.0000),
  388. +        make_float4(708.0, 0.0066, 0.0024, 0.0000),
  389. +        make_float4(709.0, 0.0062, 0.0022, 0.0000),
  390. +        make_float4(710.0, 0.0058, 0.0021, 0.0000),
  391. +        make_float4(711.0, 0.0054, 0.0020, 0.0000),
  392. +        make_float4(712.0, 0.0051, 0.0018, 0.0000),
  393. +        make_float4(713.0, 0.0047, 0.0017, 0.0000),
  394. +        make_float4(714.0, 0.0044, 0.0016, 0.0000),
  395. +        make_float4(715.0, 0.0041, 0.0015, 0.0000),
  396. +        make_float4(716.0, 0.0038, 0.0014, 0.0000),
  397. +        make_float4(717.0, 0.0036, 0.0013, 0.0000),
  398. +        make_float4(718.0, 0.0033, 0.0012, 0.0000),
  399. +        make_float4(719.0, 0.0031, 0.0011, 0.0000),
  400. +        make_float4(720.0, 0.0029, 0.0010, 0.0000),
  401. +        make_float4(721.0, 0.0027, 0.0010, 0.0000),
  402. +        make_float4(722.0, 0.0025, 0.0009, 0.0000),
  403. +        make_float4(723.0, 0.0024, 0.0008, 0.0000),
  404. +        make_float4(724.0, 0.0022, 0.0008, 0.0000),
  405. +        make_float4(725.0, 0.0020, 0.0007, 0.0000),
  406. +        make_float4(726.0, 0.0019, 0.0007, 0.0000),
  407. +        make_float4(727.0, 0.0018, 0.0006, 0.0000),
  408. +        make_float4(728.0, 0.0017, 0.0006, 0.0000),
  409. +        make_float4(729.0, 0.0015, 0.0006, 0.0000),
  410. +        make_float4(730.0, 0.0014, 0.0005, 0.0000),
  411. +        make_float4(731.0, 0.0013, 0.0005, 0.0000),
  412. +        make_float4(732.0, 0.0012, 0.0004, 0.0000),
  413. +        make_float4(733.0, 0.0012, 0.0004, 0.0000),
  414. +        make_float4(734.0, 0.0011, 0.0004, 0.0000),
  415. +        make_float4(735.0, 0.0010, 0.0004, 0.0000),
  416. +        make_float4(736.0, 0.0009, 0.0003, 0.0000),
  417. +        make_float4(737.0, 0.0009, 0.0003, 0.0000),
  418. +        make_float4(738.0, 0.0008, 0.0003, 0.0000),
  419. +        make_float4(739.0, 0.0007, 0.0003, 0.0000),
  420. +        make_float4(740.0, 0.0007, 0.0002, 0.0000),
  421. +        make_float4(741.0, 0.0006, 0.0002, 0.0000),
  422. +        make_float4(742.0, 0.0006, 0.0002, 0.0000),
  423. +        make_float4(743.0, 0.0006, 0.0002, 0.0000),
  424. +        make_float4(744.0, 0.0005, 0.0002, 0.0000),
  425. +        make_float4(745.0, 0.0005, 0.0002, 0.0000),
  426. +        make_float4(746.0, 0.0004, 0.0002, 0.0000),
  427. +        make_float4(747.0, 0.0004, 0.0001, 0.0000),
  428. +        make_float4(748.0, 0.0004, 0.0001, 0.0000),
  429. +        make_float4(749.0, 0.0004, 0.0001, 0.0000),
  430. +        make_float4(750.0, 0.0003, 0.0001, 0.0000),
  431. +        make_float4(751.0, 0.0003, 0.0001, 0.0000),
  432. +        make_float4(752.0, 0.0003, 0.0001, 0.0000),
  433. +        make_float4(753.0, 0.0003, 0.0001, 0.0000),
  434. +        make_float4(754.0, 0.0003, 0.0001, 0.0000),
  435. +        make_float4(755.0, 0.0002, 0.0001, 0.0000),
  436. +        make_float4(756.0, 0.0002, 0.0001, 0.0000),
  437. +        make_float4(757.0, 0.0002, 0.0001, 0.0000),
  438. +        make_float4(758.0, 0.0002, 0.0001, 0.0000),
  439. +        make_float4(759.0, 0.0002, 0.0001, 0.0000),
  440. +        make_float4(760.0, 0.0002, 0.0001, 0.0000),
  441. +        make_float4(761.0, 0.0002, 0.0001, 0.0000),
  442. +        make_float4(762.0, 0.0001, 0.0001, 0.0000),
  443. +        make_float4(763.0, 0.0001, 0.0000, 0.0000),
  444. +        make_float4(764.0, 0.0001, 0.0000, 0.0000),
  445. +        make_float4(765.0, 0.0001, 0.0000, 0.0000),
  446. +        make_float4(766.0, 0.0001, 0.0000, 0.0000),
  447. +        make_float4(767.0, 0.0001, 0.0000, 0.0000),
  448. +        make_float4(768.0, 0.0001, 0.0000, 0.0000),
  449. +        make_float4(769.0, 0.0001, 0.0000, 0.0000),
  450. +        make_float4(770.0, 0.0001, 0.0000, 0.0000),
  451. +        make_float4(771.0, 0.0001, 0.0000, 0.0000),
  452. +        make_float4(772.0, 0.0001, 0.0000, 0.0000),
  453. +        make_float4(773.0, 0.0001, 0.0000, 0.0000),
  454. +        make_float4(774.0, 0.0001, 0.0000, 0.0000),
  455. +        make_float4(775.0, 0.0001, 0.0000, 0.0000),
  456. +        make_float4(776.0, 0.0001, 0.0000, 0.0000),
  457. +        make_float4(777.0, 0.0001, 0.0000, 0.0000),
  458. +        make_float4(778.0, 0.0000, 0.0000, 0.0000),
  459. +        make_float4(779.0, 0.0000, 0.0000, 0.0000),
  460. +        make_float4(780.0, 0.0000, 0.0000, 0.0000)
  461. +    };
  462. +    int lower_bound = int(wavelength) - 380;
  463. +    int upper_bound = lower_bound + 1;
  464. +    float progress = wavelength - int(wavelength);
  465. +    return make_float3(
  466. +        float_lerp(lookup[lower_bound][1], lookup[upper_bound][1], progress),
  467. +        float_lerp(lookup[lower_bound][2], lookup[upper_bound][2], progress),
  468. +        float_lerp(lookup[lower_bound][3], lookup[upper_bound][3], progress)
  469. +    );
  470. +}
  471. +
  472. +ccl_device float3 find_position_in_lookup(float4 lookup[], float wavelength)
  473. +{
  474. +    int upper_bound = 0;
  475. +    while(lookup[upper_bound][0] < wavelength) {
  476. +        upper_bound++;
  477. +    }
  478. +    int lower_bound = upper_bound -1;
  479. +    float progress = (wavelength - lookup[lower_bound][0]) / (lookup[upper_bound][0] - lookup[lower_bound][0]);
  480. +    return make_float3(
  481. +        float_lerp(lookup[lower_bound][1], lookup[upper_bound][1], progress),
  482. +        float_lerp(lookup[lower_bound][2], lookup[upper_bound][2], progress),
  483. +        float_lerp(lookup[lower_bound][3], lookup[upper_bound][3], progress)
  484. +    );
  485. +}
  486. +
  487. +ccl_device float find_position_in_lookup_2d(float2 lookup[], float wavelength)
  488. +{
  489. +    int upper_bound = 0;
  490. +    while(lookup[upper_bound][0] < wavelength) {
  491. +        upper_bound++;
  492. +    }
  493. +    int lower_bound = upper_bound -1;
  494. +    float progress = (wavelength - lookup[lower_bound][0]) / (lookup[upper_bound][0] - lookup[lower_bound][0]);
  495. +    return float_lerp(lookup[lower_bound][1], lookup[upper_bound][1], progress);
  496. +}
  497. +
  498. +ccl_device float get_d65_intensity(float wavelength) {
  499. +    float2 a_lookup[] = {
  500. +        make_float2(300.0, 0.003556865),
  501. +        make_float2(305.0, 0.004312696),
  502. +        make_float2(310.0, 0.005189907),
  503. +        make_float2(315.0, 0.006200985),
  504. +        make_float2(320.0, 0.007358812),
  505. +        make_float2(325.0, 0.008676539),
  506. +        make_float2(330.0, 0.010167392),
  507. +        make_float2(335.0, 0.011844749),
  508. +        make_float2(340.0, 0.013721913),
  509. +        make_float2(345.0, 0.015812112),
  510. +        make_float2(350.0, 0.018128225),
  511. +        make_float2(355.0, 0.020682946),
  512. +        make_float2(360.0, 0.023488429),
  513. +        make_float2(365.0, 0.026556372),
  514. +        make_float2(370.0, 0.029897898),
  515. +        make_float2(375.0, 0.033523444),
  516. +        make_float2(380.0, 0.037442757),
  517. +        make_float2(385.0, 0.041664819),
  518. +        make_float2(390.0, 0.046197277),
  519. +        make_float2(395.0, 0.051048157),
  520. +        make_float2(400.0, 0.056222812),
  521. +        make_float2(405.0, 0.061727357),
  522. +        make_float2(410.0, 0.067565615),
  523. +        make_float2(415.0, 0.073740644),
  524. +        make_float2(420.0, 0.080255503),
  525. +        make_float2(425.0, 0.087110573),
  526. +        make_float2(430.0, 0.094307001),
  527. +        make_float2(435.0, 0.10184364),
  528. +        make_float2(440.0, 0.109718962),
  529. +        make_float2(445.0, 0.117930291),
  530. +        make_float2(450.0, 0.126474186),
  531. +        make_float2(455.0, 0.13534606),
  532. +        make_float2(460.0, 0.144540562),
  533. +        make_float2(465.0, 0.154051575),
  534. +        make_float2(470.0, 0.163872218),
  535. +        make_float2(475.0, 0.173994847),
  536. +        make_float2(480.0, 0.184411052),
  537. +        make_float2(485.0, 0.195112423),
  538. +        make_float2(490.0, 0.206088638),
  539. +        make_float2(495.0, 0.21732976),
  540. +        make_float2(500.0, 0.228825085),
  541. +        make_float2(505.0, 0.24056391),
  542. +        make_float2(510.0, 0.252534384),
  543. +        make_float2(515.0, 0.264724658),
  544. +        make_float2(520.0, 0.277122881),
  545. +        make_float2(525.0, 0.289716057),
  546. +        make_float2(530.0, 0.302492336),
  547. +        make_float2(535.0, 0.315438338),
  548. +        make_float2(540.0, 0.328541066),
  549. +        make_float2(545.0, 0.341787907),
  550. +        make_float2(550.0, 0.35516548),
  551. +        make_float2(555.0, 0.368660408),
  552. +        make_float2(560.0, 0.382260074),
  553. +        make_float2(565.0, 0.39595263),
  554. +        make_float2(570.0, 0.409721638),
  555. +        make_float2(575.0, 0.42355563),
  556. +        make_float2(580.0, 0.437443139),
  557. +        make_float2(585.0, 0.451372696),
  558. +        make_float2(590.0, 0.465329011),
  559. +        make_float2(595.0, 0.479300617),
  560. +        make_float2(600.0, 0.493279868),
  561. +        make_float2(605.0, 0.507247651),
  562. +        make_float2(610.0, 0.521196321),
  563. +        make_float2(615.0, 0.535118233),
  564. +        make_float2(620.0, 0.548994274),
  565. +        make_float2(625.0, 0.562820621),
  566. +        make_float2(630.0, 0.576585806),
  567. +        make_float2(635.0, 0.590278362),
  568. +        make_float2(640.0, 0.603890643),
  569. +        make_float2(645.0, 0.617411182),
  570. +        make_float2(650.0, 0.630836156),
  571. +        make_float2(655.0, 0.644146451),
  572. +        make_float2(660.0, 0.657345892),
  573. +        make_float2(665.0, 0.670419186),
  574. +        make_float2(670.0, 0.683362513),
  575. +        make_float2(675.0, 0.696164402),
  576. +        make_float2(680.0, 0.708821033),
  577. +        make_float2(685.0, 0.721328583),
  578. +        make_float2(690.0, 0.733675584),
  579. +        make_float2(695.0, 0.745858212),
  580. +        make_float2(700.0, 0.757872646),
  581. +        make_float2(705.0, 0.769715063),
  582. +        make_float2(710.0, 0.781373996),
  583. +        make_float2(715.0, 0.792849443),
  584. +        make_float2(720.0, 0.804141406),
  585. +        make_float2(725.0, 0.815238416),
  586. +        make_float2(730.0, 0.826140473),
  587. +        make_float2(735.0, 0.836843755),
  588. +        make_float2(740.0, 0.847344439),
  589. +        make_float2(745.0, 0.857642526),
  590. +        make_float2(750.0, 0.867730369),
  591. +        make_float2(755.0, 0.877611792),
  592. +        make_float2(760.0, 0.887282972),
  593. +        make_float2(765.0, 0.896740086),
  594. +        make_float2(770.0, 0.905986957),
  595. +        make_float2(775.0, 0.91501594),
  596. +        make_float2(780.0, 0.923827035),
  597. +        make_float2(785.0, 0.932424064),
  598. +        make_float2(790.0, 0.940803205),
  599. +        make_float2(795.0, 0.948964457),
  600. +        make_float2(800.0, 0.956907822),
  601. +        make_float2(805.0, 0.964633298),
  602. +        make_float2(810.0, 0.972140886),
  603. +        make_float2(815.0, 0.979430585),
  604. +        make_float2(820.0, 0.986502397),
  605. +        make_float2(825.0, 0.993360143),
  606. +        make_float2(830.0, 1)
  607. +    };
  608. +    float2 d65_lookup[] = {
  609. +        make_float2(300.0, 0.000289444),
  610. +        make_float2(305.0, 0.014126744),
  611. +        make_float2(310.0, 0.027964044),
  612. +        make_float2(315.0, 0.09986419),
  613. +        make_float2(320.0, 0.171765185),
  614. +        make_float2(325.0, 0.243139069),
  615. +        make_float2(330.0, 0.314513802),
  616. +        make_float2(335.0, 0.326801175),
  617. +        make_float2(340.0, 0.339089397),
  618. +        make_float2(345.0, 0.360151767),
  619. +        make_float2(350.0, 0.381214987),
  620. +        make_float2(355.0, 0.388542763),
  621. +        make_float2(360.0, 0.39587054),
  622. +        make_float2(365.0, 0.419004006),
  623. +        make_float2(370.0, 0.442137473),
  624. +        make_float2(375.0, 0.43316725),
  625. +        make_float2(380.0, 0.424197026),
  626. +        make_float2(385.0, 0.444027773),
  627. +        make_float2(390.0, 0.463859369),
  628. +        make_float2(395.0, 0.58314518),
  629. +        make_float2(400.0, 0.702431841),
  630. +        make_float2(405.0, 0.73948664),
  631. +        make_float2(410.0, 0.776542288),
  632. +        make_float2(415.0, 0.78480036),
  633. +        make_float2(420.0, 0.793058432),
  634. +        make_float2(425.0, 0.764412793),
  635. +        make_float2(430.0, 0.735768003),
  636. +        make_float2(435.0, 0.812935864),
  637. +        make_float2(440.0, 0.890104573),
  638. +        make_float2(445.0, 0.941635827),
  639. +        make_float2(450.0, 0.993175568),
  640. +        make_float2(455.0, 0.996587784),
  641. +        make_float2(460.0, 1),
  642. +        make_float2(465.0, 0.987471565),
  643. +        make_float2(470.0, 0.974951618),
  644. +        make_float2(475.0, 0.979458799),
  645. +        make_float2(480.0, 0.98396598),
  646. +        make_float2(485.0, 0.953782297),
  647. +        make_float2(490.0, 0.923598615),
  648. +        make_float2(495.0, 0.92589889),
  649. +        make_float2(500.0, 0.928207653),
  650. +        make_float2(505.0, 0.921620888),
  651. +        make_float2(510.0, 0.915034122),
  652. +        make_float2(515.0, 0.902251044),
  653. +        make_float2(520.0, 0.889467966),
  654. +        make_float2(525.0, 0.901767222),
  655. +        make_float2(530.0, 0.914074967),
  656. +        make_float2(535.0, 0.900137507),
  657. +        make_float2(540.0, 0.886200048),
  658. +        make_float2(545.0, 0.88467219),
  659. +        make_float2(550.0, 0.88315282),
  660. +        make_float2(555.0, 0.865981394),
  661. +        make_float2(560.0, 0.848809968),
  662. +        make_float2(565.0, 0.833252131),
  663. +        make_float2(570.0, 0.817694293),
  664. +        make_float2(575.0, 0.815376193),
  665. +        make_float2(580.0, 0.813058093),
  666. +        make_float2(585.0, 0.782915153),
  667. +        make_float2(590.0, 0.752772213),
  668. +        make_float2(595.0, 0.758376906),
  669. +        make_float2(600.0, 0.763981598),
  670. +        make_float2(605.0, 0.762253421),
  671. +        make_float2(610.0, 0.760526092),
  672. +        make_float2(615.0, 0.7524607),
  673. +        make_float2(620.0, 0.744395308),
  674. +        make_float2(625.0, 0.725678199),
  675. +        make_float2(630.0, 0.706961939),
  676. +        make_float2(635.0, 0.708704546),
  677. +        make_float2(640.0, 0.710447153),
  678. +        make_float2(645.0, 0.694861304),
  679. +        make_float2(650.0, 0.679275456),
  680. +        make_float2(655.0, 0.680072488),
  681. +        make_float2(660.0, 0.680869521),
  682. +        make_float2(665.0, 0.689625845),
  683. +        make_float2(670.0, 0.698382168),
  684. +        make_float2(675.0, 0.681433131),
  685. +        make_float2(680.0, 0.664484093),
  686. +        make_float2(685.0, 0.628142295),
  687. +        make_float2(690.0, 0.591801345),
  688. +        make_float2(695.0, 0.599813262),
  689. +        make_float2(700.0, 0.607825179),
  690. +        make_float2(705.0, 0.619453027),
  691. +        make_float2(710.0, 0.631081723),
  692. +        make_float2(715.0, 0.576991308),
  693. +        make_float2(720.0, 0.522900893),
  694. +        make_float2(725.0, 0.558048416),
  695. +        make_float2(730.0, 0.593195939),
  696. +        make_float2(735.0, 0.61527094),
  697. +        make_float2(740.0, 0.637345941),
  698. +        make_float2(745.0, 0.588563134),
  699. +        make_float2(750.0, 0.539781177),
  700. +        make_float2(755.0, 0.466891318),
  701. +        make_float2(760.0, 0.394002309),
  702. +        make_float2(765.0, 0.480526602),
  703. +        make_float2(770.0, 0.567050895),
  704. +        make_float2(775.0, 0.55252521),
  705. +        make_float2(780.0, 0.537999525),
  706. +        make_float2(785.0, 0.541909143),
  707. +        make_float2(790.0, 0.545818762),
  708. +        make_float2(795.0, 0.525225783),
  709. +        make_float2(800.0, 0.504633654),
  710. +        make_float2(805.0, 0.472832988),
  711. +        make_float2(810.0, 0.441033171),
  712. +        make_float2(815.0, 0.464297355),
  713. +        make_float2(820.0, 0.487561539),
  714. +        make_float2(825.0, 0.499749601),
  715. +        make_float2(830.0, 0.511938512)
  716. +    };
  717. +    return find_position_in_lookup_2d(d65_lookup, wavelength);
  718. +
  719. +}
  720. +ccl_device float3 get_d65_intensities(float3 wavelengths) {
  721. +    return make_float3(
  722. +        get_d65_intensity(wavelengths[0]),
  723. +        get_d65_intensity(wavelengths[1]),
  724. +        get_d65_intensity(wavelengths[2])
  725. +    );
  726. +}
  727. +
  728. +ccl_device float3 rec709_to_wavelength_intensities(float3 rgb, float3 wavelengths)
  729. +{
  730. +    float4 lookup[] = {
  731. +        make_float4(380.0, 0.021592459, 0.010542406, 0.967865135),
  732. +        make_float4(390.0, 0.020293111, 0.010878976, 0.968827912),
  733. +        make_float4(400.0, 0.021807906, 0.011063512, 0.967128582),
  734. +        make_float4(410.0, 0.023803297, 0.010736566, 0.965460137),
  735. +        make_float4(420.0, 0.025208132, 0.011681813, 0.963110055),
  736. +        make_float4(430.0, 0.025414957, 0.012434719, 0.962150324),
  737. +        make_float4(440.0, 0.024621282, 0.014986907, 0.960391811),
  738. +        make_float4(450.0, 0.020973705, 0.020100392, 0.958925903),
  739. +        make_float4(460.0, 0.015752802, 0.030356263, 0.953890935),
  740. +        make_float4(470.0, 0.01116804, 0.063388962, 0.925442998),
  741. +        make_float4(480.0, 0.008578277, 0.173423837, 0.817997886),
  742. +        make_float4(490.0, 0.006581877, 0.568321142, 0.42509696),
  743. +        make_float4(500.0, 0.005171723, 0.827791998, 0.167036273),
  744. +        make_float4(510.0, 0.004545205, 0.916560468, 0.078894327),
  745. +        make_float4(520.0, 0.00414512, 0.952002841, 0.043852038),
  746. +        make_float4(530.0, 0.004343112, 0.964096452, 0.031560435),
  747. +        make_float4(540.0, 0.005238155, 0.970590861, 0.024170984),
  748. +        make_float4(550.0, 0.007251939, 0.972502542, 0.020245519),
  749. +        make_float4(560.0, 0.012543656, 0.969148203, 0.01830814),
  750. +        make_float4(570.0, 0.028067132, 0.955344651, 0.016588218),
  751. +        make_float4(580.0, 0.091342277, 0.892637233, 0.01602049),
  752. +        make_float4(590.0, 0.484081092, 0.5003641, 0.015554808),
  753. +        make_float4(600.0, 0.870378324, 0.116236717, 0.013384959),
  754. +        make_float4(610.0, 0.939513128, 0.047951391, 0.012535491),
  755. +        make_float4(620.0, 0.960926994, 0.027873526, 0.011199484),
  756. +        make_float4(630.0, 0.968623763, 0.020057963, 0.011318274),
  757. +        make_float4(640.0, 0.971263883, 0.017382174, 0.011353953),
  758. +        make_float4(650.0, 0.972285819, 0.015429109, 0.012285073),
  759. +        make_float4(660.0, 0.971898742, 0.01543808, 0.012663188),
  760. +        make_float4(670.0, 0.972691859, 0.014546826, 0.012761325),
  761. +        make_float4(680.0, 0.971734812, 0.015197773, 0.013067426),
  762. +        make_float4(690.0, 0.97234454, 0.014285896, 0.013369566),
  763. +        make_float4(700.0, 0.97150339, 0.015069123, 0.013427487),
  764. +        make_float4(710.0, 0.970857997, 0.015506263, 0.01363574),
  765. +        make_float4(720.0, 0.970553866, 0.015545797, 0.013893597),
  766. +        make_float4(730.0, 0.969671404, 0.016302839, 0.014025757),
  767. +
  768. +    };
  769. +    // find position in lookup of first wavelength
  770. +    float3 wavelength_one_magnitudes = find_position_in_lookup(lookup, wavelengths[0]);
  771. +    // multiply the lookups by the RGB factors
  772. +    float3 contributions_one = wavelength_one_magnitudes * rgb;
  773. +    // add the three components
  774. +    float wavelength_one_brightness = contributions_one[0] + contributions_one[1] + contributions_one[2];
  775. +
  776. +    // repeat for other two wavelengths
  777. +    float3 wavelength_two_magnitudes = find_position_in_lookup(lookup, wavelengths[1]);
  778. +    float3 contributions_two = wavelength_two_magnitudes * rgb;
  779. +    float wavelength_two_brightness = contributions_two[0] + contributions_two[1] + contributions_two[2];
  780. +
  781. +    float3 wavelength_three_magnitudes = find_position_in_lookup(lookup, wavelengths[2]);
  782. +    float3 contributions_three = wavelength_three_magnitudes * rgb;
  783. +    float wavelength_three_brightness = contributions_three[0] + contributions_three[1] + contributions_three[2];
  784. +
  785. +    return make_float3(
  786. +        wavelength_one_brightness,
  787. +        wavelength_two_brightness,
  788. +        wavelength_three_brightness
  789. +    );
  790. +}
  791. +
  792. +ccl_device float3 xyz_to_rec709(float3 xyz)
  793. +{
  794. +    float red   = (3.2404542 * xyz[0]) + (-1.5371385 * xyz[1]) + (-0.4985314 * xyz[2]);
  795. +    float green = (-0.9692660 * xyz[0]) + (1.8760108 * xyz[1]) + (0.0415560 * xyz[2]);
  796. +    float blue  = (0.0556434 * xyz[0]) + (-0.2040259 * xyz[1]) + (1.0572252 * xyz[2]);
  797. +    return make_float3(red, green, blue);
  798. +}
  799. +
  800.  CCL_NAMESPACE_END
  801.  
  802.  #endif /* __KERNEL_COLOR_H__ */
  803. diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
  804. index 302bb047647..f05dcc81252 100644
  805. --- a/intern/cycles/kernel/kernel_emission.h
  806. +++ b/intern/cycles/kernel/kernel_emission.h
  807. @@ -74,7 +74,7 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
  808.         path_state_modify_bounce(state, false);
  809.  
  810.         /* Evaluate emissive closure. */
  811. -       eval = shader_emissive_eval(kg, emission_sd);
  812. +       eval = shader_emissive_eval(kg, emission_sd, state->wavelengths);
  813.     }
  814.  
  815.     eval *= ls->eval_fac;
  816. @@ -116,7 +116,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
  817.  
  818.  #ifdef __VOLUME__
  819.     if(sd->prim != PRIM_NONE)
  820. -       shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS);
  821. +       shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS, state->wavelengths);
  822.     else {
  823.         float bsdf_pdf;
  824.         shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
  825. @@ -127,7 +127,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
  826.         }
  827.     }
  828.  #else
  829. -   shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS);
  830. +   shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS, state->wavelengths);
  831.  #endif
  832.  
  833.     bsdf_eval_mul3(eval, light_eval/ls->pdf);
  834. @@ -198,10 +198,10 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
  835.  
  836.  /* Indirect Primitive Emission */
  837.  
  838. -ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf)
  839. +ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf, float3 wavelengths)
  840.  {
  841.     /* evaluate emissive closure */
  842. -   float3 L = shader_emissive_eval(kg, sd);
  843. +   float3 L = shader_emissive_eval(kg, sd, wavelengths);
  844.  
  845.  #ifdef __HAIR__
  846.     if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_USE_MIS) && (sd->type & PRIMITIVE_ALL_TRIANGLE))
  847. diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
  848. index 458aa6c2a97..43473c4dbc9 100644
  849. --- a/intern/cycles/kernel/kernel_passes.h
  850. +++ b/intern/cycles/kernel/kernel_passes.h
  851. @@ -335,12 +335,20 @@ ccl_device_inline void kernel_write_light_passes(KernelGlobals *kg, ccl_global f
  852.  ccl_device_inline void kernel_write_result(KernelGlobals *kg,
  853.                                             ccl_global float *buffer,
  854.                                             int sample,
  855. -                                           PathRadiance *L)
  856. +                                           PathRadiance *L,
  857. +                                          float3 wavelengths)
  858.  {
  859.     float alpha;
  860.     float3 L_sum = path_radiance_clamp_and_sum(kg, L, &alpha);
  861.  
  862. -   kernel_write_pass_float4(buffer, make_float4(L_sum.x, L_sum.y, L_sum.z, alpha));
  863. +   // convert L_sum to RGB based on wavelengths
  864. +   float3 channel1_xyz = wavelength_to_xyz(wavelengths[0]) * L_sum[0];
  865. +   float3 channel2_xyz = wavelength_to_xyz(wavelengths[1]) * L_sum[1];
  866. +   float3 channel3_xyz = wavelength_to_xyz(wavelengths[2]) * L_sum[2];
  867. +   float3 combined_xyz = channel1_xyz + channel2_xyz + channel3_xyz;
  868. +   float3 combined_rgb = xyz_to_rec709(combined_xyz);
  869. +
  870. +   kernel_write_pass_float4(buffer, make_float4(combined_rgb[0], combined_rgb[1], combined_rgb[2], alpha));
  871.  
  872.     kernel_write_light_passes(kg, buffer, L);
  873.  
  874. diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
  875. index 5745762e183..4ea012288f1 100644
  876. --- a/intern/cycles/kernel/kernel_path.h
  877. +++ b/intern/cycles/kernel/kernel_path.h
  878. @@ -339,7 +339,8 @@ ccl_device_forceinline bool kernel_path_shader_apply(
  879.  #ifdef __EMISSION__
  880.     /* emission */
  881.     if(sd->flag & SD_EMISSION) {
  882. -       float3 emission = indirect_primitive_emission(kg, sd, sd->ray_length, state->flag, state->ray_pdf);
  883. +       float3 emission = indirect_primitive_emission(kg, sd, sd->ray_length, state->flag, state->ray_pdf, state->wavelengths);
  884. +       // float3 wavelength_intensities = rec709_to_wavelength_intensities(emission, state->wavelengths);
  885.         path_radiance_accum_emission(L, state, throughput, emission);
  886.     }
  887.  #endif  /* __EMISSION__ */
  888. @@ -717,7 +718,7 @@ ccl_device_forceinline void kernel_path_integrate(
  889.  
  890.  ccl_device void kernel_path_trace(KernelGlobals *kg,
  891.     ccl_global float *buffer,
  892. -   int sample, int x, int y, int offset, int stride)
  893. +   int sample, int x, int y, int offset, int stride, float3 wavelengths)
  894.  {
  895.     /* buffer offset */
  896.     int index = offset + x + y*stride;
  897. @@ -756,7 +757,7 @@ ccl_device void kernel_path_trace(KernelGlobals *kg,
  898.                           buffer,
  899.                           emission_sd);
  900.  
  901. -   kernel_write_result(kg, buffer, sample, &L);
  902. +   kernel_write_result(kg, buffer, sample, &L, state.wavelengths);
  903.  }
  904.  
  905.  #endif  /* __SPLIT_KERNEL__ */
  906. diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h
  907. index 80fcf5b0565..470eb40501f 100644
  908. --- a/intern/cycles/kernel/kernel_path_branched.h
  909. +++ b/intern/cycles/kernel/kernel_path_branched.h
  910. @@ -591,7 +591,7 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg,
  911.  
  912.  ccl_device void kernel_branched_path_trace(KernelGlobals *kg,
  913.     ccl_global float *buffer,
  914. -   int sample, int x, int y, int offset, int stride)
  915. +   int sample, int x, int y, int offset, int stride, float3 wavelengths)
  916.  {
  917.     /* buffer offset */
  918.     int index = offset + x + y*stride;
  919. @@ -610,7 +610,7 @@ ccl_device void kernel_branched_path_trace(KernelGlobals *kg,
  920.  
  921.     if(ray.t != 0.0f) {
  922.         kernel_branched_path_integrate(kg, rng_hash, sample, ray, buffer, &L);
  923. -       kernel_write_result(kg, buffer, sample, &L);
  924. +       kernel_write_result(kg, buffer, sample, &L, wavelengths);
  925.     }
  926.  }
  927.  
  928. diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h
  929. index e85050df4bb..bbfc22ed9e4 100644
  930. --- a/intern/cycles/kernel/kernel_path_state.h
  931. +++ b/intern/cycles/kernel/kernel_path_state.h
  932. @@ -36,6 +36,12 @@ ccl_device_inline void path_state_init(KernelGlobals *kg,
  933.     state->glossy_bounce = 0;
  934.     state->transmission_bounce = 0;
  935.     state->transparent_bounce = 0;
  936. +
  937. +   state->wavelengths = make_float3(
  938. +       (path_state_rng_1D(kg, state, 1 ) * 350) + 380,
  939. +       (path_state_rng_1D(kg, state, 2 ) * 350) + 380,
  940. +       (path_state_rng_1D(kg, state, 3 ) * 350) + 380
  941. +   );
  942.  
  943.  #ifdef __DENOISING_FEATURES__
  944.     if(kernel_data.film.pass_denoising_data) {
  945. diff --git a/intern/cycles/kernel/kernel_path_surface.h b/intern/cycles/kernel/kernel_path_surface.h
  946. index c9202ccb16d..d794c9062fa 100644
  947. --- a/intern/cycles/kernel/kernel_path_surface.h
  948. +++ b/intern/cycles/kernel/kernel_path_surface.h
  949. @@ -286,7 +286,7 @@ ccl_device bool kernel_path_surface_bounce(KernelGlobals *kg,
  950.         int label;
  951.  
  952.         label = shader_bsdf_sample(kg, sd, bsdf_u, bsdf_v, &bsdf_eval,
  953. -           &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
  954. +           &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf, state->wavelengths);
  955.  
  956.         if(bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval))
  957.             return false;
  958. diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
  959. index e834b701f96..b8c9e01de61 100644
  960. --- a/intern/cycles/kernel/kernel_shader.h
  961. +++ b/intern/cycles/kernel/kernel_shader.h
  962. @@ -529,8 +529,15 @@ ccl_device_inline void shader_prepare_closures(ShaderData *sd,
  963.  
  964.  /* BSDF */
  965.  
  966. -ccl_device_inline void _shader_bsdf_multi_eval(KernelGlobals *kg, ShaderData *sd, const float3 omega_in, float *pdf,
  967. -   const ShaderClosure *skip_sc, BsdfEval *result_eval, float sum_pdf, float sum_sample_weight)
  968. +ccl_device_inline void _shader_bsdf_multi_eval( KernelGlobals *kg,
  969. +                                               ShaderData *sd,
  970. +                                               const float3 omega_in,
  971. +                                               float *pdf,
  972. +                                               const ShaderClosure *skip_sc,
  973. +                                               BsdfEval *result_eval,
  974. +                                               float sum_pdf,
  975. +                                               float sum_sample_weight,
  976. +                                               float3 wavelengths)
  977.  {
  978.     /* this is the veach one-sample model with balance heuristic, some pdf
  979.      * factors drop out when using balance heuristic weighting */
  980. @@ -542,7 +549,10 @@ ccl_device_inline void _shader_bsdf_multi_eval(KernelGlobals *kg, ShaderData *sd
  981.             float3 eval = bsdf_eval(kg, sd, sc, omega_in, &bsdf_pdf);
  982.  
  983.             if(bsdf_pdf != 0.0f) {
  984. -               bsdf_eval_accum(result_eval, sc->type, eval*sc->weight, 1.0f);
  985. +               // rgb to spectrum  
  986. +               float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
  987. +
  988. +               bsdf_eval_accum(result_eval, sc->type, eval * wavelength_intensities, 1.0f);
  989.                 sum_pdf += bsdf_pdf*sc->sample_weight;
  990.             }
  991.  
  992. @@ -589,7 +599,8 @@ void shader_bsdf_eval(KernelGlobals *kg,
  993.                        const float3 omega_in,
  994.                        BsdfEval *eval,
  995.                        float light_pdf,
  996. -                      bool use_mis)
  997. +                      bool use_mis,
  998. +                     float3 wavelengths)
  999.  {
  1000.     bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
  1001.  
  1002. @@ -600,7 +611,7 @@ void shader_bsdf_eval(KernelGlobals *kg,
  1003.  #endif
  1004.     {
  1005.         float pdf;
  1006. -       _shader_bsdf_multi_eval(kg, sd, omega_in, &pdf, NULL, eval, 0.0f, 0.0f);
  1007. +       _shader_bsdf_multi_eval(kg, sd, omega_in, &pdf, NULL, eval, 0.0f, 0.0f, wavelengths);
  1008.         if(use_mis) {
  1009.             float weight = power_heuristic(light_pdf, pdf);
  1010.             bsdf_eval_mis(eval, weight);
  1011. @@ -718,7 +729,8 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
  1012.                                           BsdfEval *bsdf_eval,
  1013.                                           float3 *omega_in,
  1014.                                           differential3 *domega_in,
  1015. -                                         float *pdf)
  1016. +                                         float *pdf,
  1017. +                                       float3 wavelengths)
  1018.  {
  1019.     const ShaderClosure *sc = shader_bsdf_pick(sd, &randu);
  1020.     if(sc == NULL) {
  1021. @@ -734,13 +746,14 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
  1022.  
  1023.     *pdf = 0.0f;
  1024.     label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
  1025. +   // float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
  1026.  
  1027.     if(*pdf != 0.0f) {
  1028. -       bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
  1029. +       bsdf_eval_init(bsdf_eval, sc->type, eval * sc->weight, kernel_data.film.use_light_pass);
  1030.  
  1031.         if(sd->num_closure > 1) {
  1032.             float sweight = sc->sample_weight;
  1033. -           _shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sc, bsdf_eval, *pdf*sweight, sweight);
  1034. +           _shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sc, bsdf_eval, *pdf*sweight, sweight, wavelengths);
  1035.         }
  1036.     }
  1037.  
  1038. @@ -757,8 +770,10 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, ShaderData *sd,
  1039.     *pdf = 0.0f;
  1040.     label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
  1041.  
  1042. +   // float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
  1043. +
  1044.     if(*pdf != 0.0f)
  1045. -       bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
  1046. +       bsdf_eval_init(bsdf_eval, sc->type, eval * sc->weight, kernel_data.film.use_light_pass);
  1047.  
  1048.     return label;
  1049.  }
  1050. @@ -953,10 +968,12 @@ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_b
  1051.  
  1052.  /* Emission */
  1053.  
  1054. -ccl_device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd)
  1055. +// bookmark: This might need to be converted to wavelength intensities
  1056. +ccl_device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd, float3 wavelengths)
  1057.  {
  1058.     if(sd->flag & SD_EMISSION) {
  1059. -       return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background;
  1060. +       float3 wavelength_intensities = rec709_to_wavelength_intensities(sd->closure_emission_background, wavelengths);
  1061. +       return emissive_simple_eval(sd->Ng, sd->I) * wavelength_intensities;
  1062.     }
  1063.     else {
  1064.         return make_float3(0.0f, 0.0f, 0.0f);
  1065. @@ -1024,6 +1041,7 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
  1066.  
  1067.  /* Background Evaluation */
  1068.  
  1069. +// bookmark: This might need to be converted to wavelength intensities
  1070.  ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
  1071.     ccl_addr_space PathState *state, int path_flag)
  1072.  {
  1073. @@ -1042,7 +1060,9 @@ ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
  1074.     }
  1075.  
  1076.     if(sd->flag & SD_EMISSION) {
  1077. -       return sd->closure_emission_background;
  1078. +       float3 wavelength_intensities = rec709_to_wavelength_intensities(sd->closure_emission_background, state->wavelengths);
  1079. +       wavelength_intensities *= get_d65_intensities(state->wavelengths);
  1080. +       return wavelength_intensities;
  1081.     }
  1082.     else {
  1083.         return make_float3(0.0f, 0.0f, 0.0f);
  1084. diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h
  1085. index a06fbe72ffa..ba7d2efe127 100644
  1086. --- a/intern/cycles/kernel/kernel_subsurface.h
  1087. +++ b/intern/cycles/kernel/kernel_subsurface.h
  1088. @@ -26,7 +26,8 @@ ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd,
  1089.                                                   const ShaderClosure *sc,
  1090.                                                   float disk_r,
  1091.                                                   float r,
  1092. -                                                 bool all)
  1093. +                                                 bool all,
  1094. +                                                float3 wavelengths)
  1095.  {
  1096.     /* this is the veach one-sample model with balance heuristic, some pdf
  1097.      * factors drop out when using balance heuristic weighting */
  1098. @@ -60,6 +61,8 @@ ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd,
  1099.             float3 eval = bssrdf_eval(sc, r);
  1100.             float pdf = bssrdf_pdf(sc, disk_r);
  1101.  
  1102. +           // float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
  1103. +
  1104.             eval_sum += sc->weight * eval;
  1105.             pdf_sum += sample_weight * pdf;
  1106.         }
  1107. @@ -173,7 +176,8 @@ ccl_device_inline int subsurface_scatter_disk(
  1108.          uint *lcg_state,
  1109.          float disk_u,
  1110.          float disk_v,
  1111. -        bool all)
  1112. +        bool all,
  1113. +       float3 wavelengths)
  1114.  {
  1115.     /* pick random axis in local frame and point on disk */
  1116.     float3 disk_N, disk_T, disk_B;
  1117. @@ -291,7 +295,7 @@ ccl_device_inline int subsurface_scatter_disk(
  1118.         float r = len(hit_P - sd->P);
  1119.  
  1120.         /* Evaluate profiles. */
  1121. -       float3 eval = subsurface_scatter_eval(sd, sc, disk_r, r, all) * w;
  1122. +       float3 eval = subsurface_scatter_eval(sd, sc, disk_r, r, all, wavelengths) * w;
  1123.  
  1124.         ss_isect->weight[hit] = eval;
  1125.     }
  1126. @@ -519,7 +523,8 @@ ccl_device_inline int subsurface_scatter_multi_intersect(
  1127.                                        lcg_state,
  1128.                                        bssrdf_u,
  1129.                                        bssrdf_v,
  1130. -                                      all);
  1131. +                                      all,
  1132. +                                      state->wavelengths);
  1133.     }
  1134.     else {
  1135.         return subsurface_random_walk(kg,
  1136. diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
  1137. index e93100a6442..0828c2c33c9 100644
  1138. --- a/intern/cycles/kernel/kernel_types.h
  1139. +++ b/intern/cycles/kernel/kernel_types.h
  1140. @@ -1090,6 +1090,8 @@ typedef struct PathState {
  1141.     int transmission_bounce;
  1142.     int transparent_bounce;
  1143.  
  1144. +   float3 wavelengths;
  1145. +
  1146.  #ifdef __DENOISING_FEATURES__
  1147.     float denoising_feature_weight;
  1148.  #endif  /* __DENOISING_FEATURES__ */
  1149. diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
  1150. index 5ec1655ab05..11dab26464e 100644
  1151. --- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
  1152. +++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
  1153. @@ -83,19 +83,23 @@ void KERNEL_FUNCTION_FULL_NAME(path_trace)(KernelGlobals *kg,
  1154.  #ifdef KERNEL_STUB
  1155.     STUB_ASSERT(KERNEL_ARCH, path_trace);
  1156.  #else
  1157. +   float3 wavelengths = make_float3(0.0, 0.0, 0.0);
  1158.  #  ifdef __BRANCHED_PATH__
  1159.     if(kernel_data.integrator.branched) {
  1160. +
  1161. +       // remove this once it is working:
  1162.         kernel_branched_path_trace(kg,
  1163.                                    buffer,
  1164.                                    sample,
  1165.                                    x, y,
  1166.                                    offset,
  1167. -                                  stride);
  1168. +                                  stride,
  1169. +                                  wavelengths);
  1170.     }
  1171.     else
  1172.  #  endif
  1173.     {
  1174. -       kernel_path_trace(kg, buffer, sample, x, y, offset, stride);
  1175. +       kernel_path_trace(kg, buffer, sample, x, y, offset, stride, wavelengths);
  1176.     }
  1177.  #endif /* KERNEL_STUB */
  1178.  }
  1179. diff --git a/intern/cycles/kernel/split/kernel_buffer_update.h b/intern/cycles/kernel/split/kernel_buffer_update.h
  1180. index 180c0b57077..6f27fbe6854 100644
  1181. --- a/intern/cycles/kernel/split/kernel_buffer_update.h
  1182. +++ b/intern/cycles/kernel/split/kernel_buffer_update.h
  1183. @@ -87,7 +87,7 @@ ccl_device void kernel_buffer_update(KernelGlobals *kg,
  1184.         ccl_global float *buffer = kernel_split_params.tile.buffer + buffer_offset;
  1185.  
  1186.         /* accumulate result in output buffer */
  1187. -       kernel_write_result(kg, buffer, sample, L);
  1188. +       kernel_write_result(kg, buffer, sample, L, state->wavelengths);
  1189.  
  1190.         ASSIGN_RAY_STATE(ray_state, ray_index, RAY_TO_REGENERATE);
  1191.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement