diff options
Diffstat (limited to 'source/blender/nodes/shader')
4 files changed, 48 insertions, 19 deletions
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c index 04c32574a65..67ed7ddd76e 100644 --- a/source/blender/nodes/shader/node_shader_util.c +++ b/source/blender/nodes/shader/node_shader_util.c @@ -332,3 +332,17 @@ void node_shader_gpu_tex_mapping(GPUMaterial *mat, } } } + +void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data) +{ + const float *xyz_to_rgb = IMB_colormangement_get_xyz_to_rgb(); + data->r[0] = xyz_to_rgb[0]; + data->r[1] = xyz_to_rgb[3]; + data->r[2] = xyz_to_rgb[6]; + data->g[0] = xyz_to_rgb[1]; + data->g[1] = xyz_to_rgb[4]; + data->g[2] = xyz_to_rgb[7]; + data->b[0] = xyz_to_rgb[2]; + data->b[1] = xyz_to_rgb[5]; + data->b[2] = xyz_to_rgb[8]; +} diff --git a/source/blender/nodes/shader/node_shader_util.h b/source/blender/nodes/shader/node_shader_util.h index 857a9914354..dc44f0fa98f 100644 --- a/source/blender/nodes/shader/node_shader_util.h +++ b/source/blender/nodes/shader/node_shader_util.h @@ -95,6 +95,11 @@ typedef struct ShaderCallData { int dummy; } ShaderCallData; +typedef struct XYZ_to_RGB /* Transposed #imbuf_xyz_to_rgb, passed as 3x vec3. */ +{ + float r[3], g[3], b[3]; +} XYZ_to_RGB; + void nodestack_get_vec(float *in, short type_in, bNodeStack *ns); void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, struct bNodeStack *ns); @@ -113,6 +118,7 @@ void node_shader_gpu_tex_mapping(struct GPUMaterial *mat, void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, struct bNode *output_node); +void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data); #ifdef __cplusplus } diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_sky.c b/source/blender/nodes/shader/nodes/node_shader_tex_sky.c index 9ef05d781bd..5dc11c4df00 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_sky.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_sky.c @@ -60,11 +60,6 @@ typedef struct SkyModelPreetham { float radiance[3]; } SkyModelPreetham; -typedef struct XYZ_to_RGB /* transposed imbuf_xyz_to_rgb, passed as 3x vec3 */ -{ - float r[3], g[3], b[3]; -} XYZ_to_RGB; - static float sky_perez_function(const float *lam, float theta, float gamma) { float ctheta = cosf(theta); @@ -119,20 +114,6 @@ static void sky_precompute_old(SkyModelPreetham *sunsky, const float sun_angles[ sunsky->radiance[2] /= sky_perez_function(sunsky->config_y, 0, theta); } -static void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data) -{ - const float *xyz_to_rgb = IMB_colormangement_get_xyz_to_rgb(); - data->r[0] = xyz_to_rgb[0]; - data->r[1] = xyz_to_rgb[3]; - data->r[2] = xyz_to_rgb[6]; - data->g[0] = xyz_to_rgb[1]; - data->g[1] = xyz_to_rgb[4]; - data->g[2] = xyz_to_rgb[7]; - data->b[0] = xyz_to_rgb[2]; - data->b[1] = xyz_to_rgb[5]; - data->b[2] = xyz_to_rgb[8]; -} - static int node_shader_gpu_tex_sky(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), diff --git a/source/blender/nodes/shader/nodes/node_shader_wavelength.c b/source/blender/nodes/shader/nodes/node_shader_wavelength.c index 6b7e1399328..30f69557020 100644 --- a/source/blender/nodes/shader/nodes/node_shader_wavelength.c +++ b/source/blender/nodes/shader/nodes/node_shader_wavelength.c @@ -30,6 +30,33 @@ static bNodeSocketTemplate sh_node_wavelength_out[] = { {-1, ""}, }; +static int node_shader_gpu_wavelength(GPUMaterial *mat, + bNode *node, + bNodeExecData *UNUSED(execdata), + GPUNodeStack *in, + GPUNodeStack *out) +{ + const int size = CM_TABLE + 1; + float *data = MEM_mallocN(sizeof(float) * size * 4, "cie_xyz texture"); + + wavelength_to_xyz_table(data, size); + + float layer; + GPUNodeLink *ramp_texture = GPU_color_band(mat, size, data, &layer); + XYZ_to_RGB xyz_to_rgb; + get_XYZ_to_RGB_for_gpu(&xyz_to_rgb); + return GPU_stack_link(mat, + node, + "node_wavelength", + in, + out, + ramp_texture, + GPU_constant(&layer), + GPU_uniform(xyz_to_rgb.r), + GPU_uniform(xyz_to_rgb.g), + GPU_uniform(xyz_to_rgb.b)); +} + /* node type definition */ void register_node_type_sh_wavelength(void) { @@ -40,6 +67,7 @@ void register_node_type_sh_wavelength(void) node_type_socket_templates(&ntype, sh_node_wavelength_in, sh_node_wavelength_out); node_type_init(&ntype, NULL); node_type_storage(&ntype, "", NULL, NULL); + node_type_gpu(&ntype, node_shader_gpu_wavelength); nodeRegisterType(&ntype); } |