Cycles: add utility functions for zero float2/float3/float4/transform

Ref D8237, T78710
This commit is contained in:
Brecht Van Lommel 2021-02-17 01:47:18 +01:00
parent 8119f0aad2
commit 68dd7617d7
44 changed files with 369 additions and 364 deletions

View File

@ -564,19 +564,19 @@ static void xml_read_transform(xml_node node, Transform &tfm)
}
if (node.attribute("translate")) {
float3 translate = make_float3(0.0f, 0.0f, 0.0f);
float3 translate = zero_float3();
xml_read_float3(&translate, node, "translate");
tfm = tfm * transform_translate(translate);
}
if (node.attribute("rotate")) {
float4 rotate = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 rotate = zero_float4();
xml_read_float4(&rotate, node, "rotate");
tfm = tfm * transform_rotate(DEG2RADF(rotate.x), make_float3(rotate.y, rotate.z, rotate.w));
}
if (node.attribute("scale")) {
float3 scale = make_float3(0.0f, 0.0f, 0.0f);
float3 scale = zero_float3();
xml_read_float3(&scale, node, "scale");
tfm = tfm * transform_scale(scale);
}

View File

@ -112,7 +112,7 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings &b_rende
bcam->focaldistance = 10.0f;
bcam->zoom = 1.0f;
bcam->pixelaspect = make_float2(1.0f, 1.0f);
bcam->pixelaspect = one_float2();
bcam->aperture_ratio = 1.0f;
bcam->sensor_width = 36.0f;

View File

@ -121,8 +121,8 @@ static bool ObtainCacheParticleData(
CData->curve_firstkey.push_back_slow(keyno);
float curve_length = 0.0f;
float3 prev_co_world = make_float3(0.0f, 0.0f, 0.0f);
float3 prev_co_object = make_float3(0.0f, 0.0f, 0.0f);
float3 prev_co_world = zero_float3();
float3 prev_co_object = zero_float3();
for (int step_no = 0; step_no < ren_step; step_no++) {
float3 co_world = prev_co_world;
b_psys.co_hair(*b_ob, pa_no, step_no, &co_world.x);
@ -197,7 +197,7 @@ static bool ObtainCacheParticleUV(Hair *hair,
BL::Mesh::uv_layers_iterator l;
b_mesh->uv_layers.begin(l);
float2 uv = make_float2(0.0f, 0.0f);
float2 uv = zero_float2();
if (b_mesh->uv_layers.length())
b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uv_num, &uv.x);
CData->curve_uv.push_back_slow(uv);
@ -678,7 +678,7 @@ static void export_hair_curves(Scene *scene, Hair *hair, BL::Hair b_hair)
const int first_point_index = b_curve.first_point_index();
const int num_points = b_curve.num_points();
float3 prev_co = make_float3(0.0f, 0.0f, 0.0f);
float3 prev_co = zero_float3();
float length = 0.0f;
if (attr_intercept) {
points_length.clear();

View File

@ -716,7 +716,7 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b
/* STEP 2: Calculate vertex normals taking into account their possible
* duplicates which gets "welded" together.
*/
vector<float3> vert_normal(num_verts, make_float3(0.0f, 0.0f, 0.0f));
vector<float3> vert_normal(num_verts, zero_float3());
/* First we accumulate all vertex normals in the original index. */
for (int vert_index = 0; vert_index < num_verts; ++vert_index) {
const float3 normal = get_float3(b_mesh.vertices[vert_index].normal());
@ -733,7 +733,7 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b
/* STEP 3: Calculate pointiness using single ring neighborhood. */
vector<int> counter(num_verts, 0);
vector<float> raw_data(num_verts, 0.0f);
vector<float3> edge_accum(num_verts, make_float3(0.0f, 0.0f, 0.0f));
vector<float3> edge_accum(num_verts, zero_float3());
BL::Mesh::edges_iterator e;
EdgeMap visited_edges;
int edge_index = 0;

View File

@ -323,8 +323,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
object->set_random_id(b_instance.random_id());
}
else {
object->set_dupli_generated(make_float3(0.0f, 0.0f, 0.0f));
object->set_dupli_uv(make_float2(0.0f, 0.0f));
object->set_dupli_generated(zero_float3());
object->set_dupli_uv(zero_float2());
object->set_random_id(hash_uint2(hash_string(object->name.c_str()), 0));
}

View File

@ -1404,7 +1404,7 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
world_color = get_float3(b_world.color());
}
else {
world_color = make_float3(0.0f, 0.0f, 0.0f);
world_color = zero_float3();
}
BackgroundNode *background = graph->create_node<BackgroundNode>();
@ -1535,7 +1535,7 @@ void BlenderSync::sync_lights(BL::Depsgraph &b_depsgraph, bool update_all)
}
else {
EmissionNode *emission = graph->create_node<EmissionNode>();
emission->set_color(make_float3(1.0f, 1.0f, 1.0f));
emission->set_color(one_float3());
emission->set_strength(1.0f);
graph->add(emission);

View File

@ -43,8 +43,8 @@ void point_density_texture_space(BL::Depsgraph &b_depsgraph,
{
BL::Object b_ob(b_point_density_node.object());
if (!b_ob) {
loc = make_float3(0.0f, 0.0f, 0.0f);
size = make_float3(0.0f, 0.0f, 0.0f);
loc = zero_float3();
size = zero_float3();
return;
}
float3 min, max;

View File

@ -360,7 +360,7 @@ void BVHBuild::add_references(BVHRange &root)
/* happens mostly on empty meshes */
if (!bounds.valid())
bounds.grow(make_float3(0.0f, 0.0f, 0.0f));
bounds.grow(zero_float3());
root = BVHRange(bounds, center, 0, references.size());
}

View File

@ -32,11 +32,11 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval,
eval->use_light_pass = use_light_pass;
if (eval->use_light_pass) {
eval->diffuse = make_float3(0.0f, 0.0f, 0.0f);
eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
eval->transparent = make_float3(0.0f, 0.0f, 0.0f);
eval->volume = make_float3(0.0f, 0.0f, 0.0f);
eval->diffuse = zero_float3();
eval->glossy = zero_float3();
eval->transmission = zero_float3();
eval->transparent = zero_float3();
eval->volume = zero_float3();
if (type == CLOSURE_BSDF_TRANSPARENT_ID)
eval->transparent = value;
@ -55,7 +55,7 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval,
eval->diffuse = value;
}
#ifdef __SHADOW_TRICKS__
eval->sum_no_mis = make_float3(0.0f, 0.0f, 0.0f);
eval->sum_no_mis = zero_float3();
#endif
}
@ -174,55 +174,55 @@ ccl_device_inline void path_radiance_init(KernelGlobals *kg, PathRadiance *L)
L->use_light_pass = kernel_data.film.use_light_pass;
if (kernel_data.film.use_light_pass) {
L->indirect = make_float3(0.0f, 0.0f, 0.0f);
L->direct_emission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect = zero_float3();
L->direct_emission = zero_float3();
L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->color_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->color_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->color_diffuse = zero_float3();
L->color_glossy = zero_float3();
L->color_transmission = zero_float3();
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->direct_volume = make_float3(0.0f, 0.0f, 0.0f);
L->direct_diffuse = zero_float3();
L->direct_glossy = zero_float3();
L->direct_transmission = zero_float3();
L->direct_volume = zero_float3();
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_diffuse = zero_float3();
L->indirect_glossy = zero_float3();
L->indirect_transmission = zero_float3();
L->indirect_volume = zero_float3();
L->transparent = 0.0f;
L->emission = make_float3(0.0f, 0.0f, 0.0f);
L->background = make_float3(0.0f, 0.0f, 0.0f);
L->ao = make_float3(0.0f, 0.0f, 0.0f);
L->shadow = make_float3(0.0f, 0.0f, 0.0f);
L->emission = zero_float3();
L->background = zero_float3();
L->ao = zero_float3();
L->shadow = zero_float3();
L->mist = 0.0f;
L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->state.glossy = make_float3(0.0f, 0.0f, 0.0f);
L->state.transmission = make_float3(0.0f, 0.0f, 0.0f);
L->state.volume = make_float3(0.0f, 0.0f, 0.0f);
L->state.direct = make_float3(0.0f, 0.0f, 0.0f);
L->state.diffuse = zero_float3();
L->state.glossy = zero_float3();
L->state.transmission = zero_float3();
L->state.volume = zero_float3();
L->state.direct = zero_float3();
}
else
#endif
{
L->transparent = 0.0f;
L->emission = make_float3(0.0f, 0.0f, 0.0f);
L->emission = zero_float3();
}
#ifdef __SHADOW_TRICKS__
L->path_total = make_float3(0.0f, 0.0f, 0.0f);
L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f);
L->shadow_background_color = make_float3(0.0f, 0.0f, 0.0f);
L->path_total = zero_float3();
L->path_total_shaded = zero_float3();
L->shadow_background_color = zero_float3();
L->shadow_throughput = 0.0f;
L->shadow_transparency = 1.0f;
L->has_shadow_catcher = 0;
#endif
#ifdef __DENOISING_FEATURES__
L->denoising_normal = make_float3(0.0f, 0.0f, 0.0f);
L->denoising_albedo = make_float3(0.0f, 0.0f, 0.0f);
L->denoising_normal = zero_float3();
L->denoising_albedo = zero_float3();
L->denoising_depth = 0.0f;
#endif
@ -561,13 +561,13 @@ ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L)
{
#ifdef __PASSES__
if (L->use_light_pass) {
L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->state.glossy = make_float3(0.0f, 0.0f, 0.0f);
L->state.transmission = make_float3(0.0f, 0.0f, 0.0f);
L->state.volume = make_float3(0.0f, 0.0f, 0.0f);
L->state.diffuse = zero_float3();
L->state.glossy = zero_float3();
L->state.transmission = zero_float3();
L->state.volume = zero_float3();
L->direct_emission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect = make_float3(0.0f, 0.0f, 0.0f);
L->direct_emission = zero_float3();
L->indirect = zero_float3();
}
#endif
}
@ -642,19 +642,19 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg,
/* Reject invalid value */
if (!isfinite_safe(sum)) {
kernel_assert(!"Non-finite sum in path_radiance_clamp_and_sum!");
L_sum = make_float3(0.0f, 0.0f, 0.0f);
L_sum = zero_float3();
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->direct_volume = make_float3(0.0f, 0.0f, 0.0f);
L->direct_diffuse = zero_float3();
L->direct_glossy = zero_float3();
L->direct_transmission = zero_float3();
L->direct_volume = zero_float3();
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_diffuse = zero_float3();
L->indirect_glossy = zero_float3();
L->indirect_transmission = zero_float3();
L->indirect_volume = zero_float3();
L->emission = make_float3(0.0f, 0.0f, 0.0f);
L->emission = zero_float3();
}
}
@ -668,7 +668,7 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg,
float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z);
if (!isfinite_safe(sum)) {
kernel_assert(!"Non-finite final sum in path_radiance_clamp_and_sum!");
L_sum = make_float3(0.0f, 0.0f, 0.0f);
L_sum = zero_float3();
}
}
@ -711,7 +711,7 @@ ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg,
# undef ADD_COMPONENT
#else
*noisy = L->emission;
*clean = make_float3(0.0f, 0.0f, 0.0f);
*clean = zero_float3();
#endif
#ifdef __SHADOW_TRICKS__

View File

@ -23,7 +23,7 @@ ccl_device_noinline void compute_light_pass(
{
kernel_assert(kernel_data.film.use_light_pass);
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
float3 throughput = one_float3();
/* Emission and indirect shader data memory used by various functions. */
ShaderDataTinyStorage emission_sd_storage;
@ -176,7 +176,7 @@ ccl_device_inline float3 kernel_bake_shader_bsdf(KernelGlobals *kg,
return shader_bsdf_transmission(kg, sd);
default:
kernel_assert(!"Unknown bake type passed to BSDF evaluate");
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
}
}
@ -192,12 +192,12 @@ ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg,
const bool is_color = (pass_filter & BAKE_FILTER_COLOR) != 0;
const bool is_direct = (pass_filter & BAKE_FILTER_DIRECT) != 0;
const bool is_indirect = (pass_filter & BAKE_FILTER_INDIRECT) != 0;
float3 out = make_float3(0.0f, 0.0f, 0.0f);
float3 out = zero_float3();
if (is_color) {
if (is_direct || is_indirect) {
/* Leave direct and diffuse channel colored. */
color = make_float3(1.0f, 1.0f, 1.0f);
color = one_float3();
}
else {
/* surface color of the pass only */
@ -315,7 +315,7 @@ ccl_device void kernel_bake_evaluate(
if (kernel_data.bake.pass_filter & ~BAKE_FILTER_COLOR)
compute_light_pass(kg, &sd, &L, rng_hash, pass_filter, sample);
float3 out = make_float3(0.0f, 0.0f, 0.0f);
float3 out = zero_float3();
ShaderEvalType type = (ShaderEvalType)kernel_data.bake.type;
switch (type) {
@ -409,7 +409,7 @@ ccl_device void kernel_bake_evaluate(
/* setup ray */
Ray ray;
ray.P = make_float3(0.0f, 0.0f, 0.0f);
ray.P = zero_float3();
ray.D = normalize(P);
ray.t = 0.0f;
# ifdef __CAMERA_MOTION__
@ -486,7 +486,7 @@ ccl_device void kernel_background_evaluate(KernelGlobals *kg,
float u = __uint_as_float(in.x);
float v = __uint_as_float(in.y);
ray.P = make_float3(0.0f, 0.0f, 0.0f);
ray.P = zero_float3();
ray.D = equirectangular_to_direction(u, v);
ray.t = 0.0f;
#ifdef __CAMERA_MOTION__

View File

@ -71,7 +71,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg,
}
#endif
float3 P = make_float3(0.0f, 0.0f, 0.0f);
float3 P = zero_float3();
float3 D = Pcamera;
/* modify ray for depth of field */
@ -130,7 +130,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg,
* because we don't want to be affected by depth of field. We compute
* ray origin and direction for the center and two neighboring pixels
* and simply take their differences. */
float3 Pnostereo = transform_point(&cameratoworld, make_float3(0.0f, 0.0f, 0.0f));
float3 Pnostereo = transform_point(&cameratoworld, zero_float3());
float3 Pcenter = Pnostereo;
float3 Dcenter = Pcamera;
@ -250,7 +250,7 @@ ccl_device_inline void camera_sample_panorama(ccl_constant KernelCamera *cam,
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
/* create ray form raster position */
float3 P = make_float3(0.0f, 0.0f, 0.0f);
float3 P = zero_float3();
float3 D = panorama_to_direction(cam, Pcamera.x, Pcamera.y);
/* indicates ray should not receive any light, outside of the lens */

View File

@ -106,8 +106,8 @@ ccl_device differential differential_zero()
ccl_device differential3 differential3_zero()
{
differential3 d;
d.dx = make_float3(0.0f, 0.0f, 0.0f);
d.dy = make_float3(0.0f, 0.0f, 0.0f);
d.dx = zero_float3();
d.dy = zero_float3();
return d;
}

View File

@ -27,7 +27,7 @@ ccl_device_noinline_cpu float3 direct_emissive_eval(KernelGlobals *kg,
float time)
{
/* setup shading at emitter */
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
if (shader_constant_emission_eval(kg, ls->shader, &eval)) {
if ((ls->prim != PRIM_NONE) && dot(ls->Ng, I) < 0.0f) {
@ -146,13 +146,13 @@ ccl_device_noinline_cpu bool direct_emission(KernelGlobals *kg,
/* use visibility flag to skip lights */
if (ls->shader & SHADER_EXCLUDE_ANY) {
if (ls->shader & SHADER_EXCLUDE_DIFFUSE)
eval->diffuse = make_float3(0.0f, 0.0f, 0.0f);
eval->diffuse = zero_float3();
if (ls->shader & SHADER_EXCLUDE_GLOSSY)
eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
eval->glossy = zero_float3();
if (ls->shader & SHADER_EXCLUDE_TRANSMIT)
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
eval->transmission = zero_float3();
if (ls->shader & SHADER_EXCLUDE_SCATTER)
eval->volume = make_float3(0.0f, 0.0f, 0.0f);
eval->volume = zero_float3();
}
#endif
@ -266,7 +266,7 @@ ccl_device_noinline_cpu void indirect_lamp_emission(KernelGlobals *kg,
/* shadow attenuation */
Ray volume_ray = *ray;
volume_ray.t = ls.t;
float3 volume_tp = make_float3(1.0f, 1.0f, 1.0f);
float3 volume_tp = one_float3();
kernel_volume_shadow(kg, emission_sd, state, &volume_ray, &volume_tp);
lamp_L *= volume_tp;
}
@ -303,11 +303,11 @@ ccl_device_noinline_cpu float3 indirect_background(KernelGlobals *kg,
((shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)) ||
((shader & SHADER_EXCLUDE_CAMERA) && (state->flag & PATH_RAY_CAMERA)) ||
((shader & SHADER_EXCLUDE_SCATTER) && (state->flag & PATH_RAY_VOLUME_SCATTER)))
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
}
/* Evaluate background shader. */
float3 L = make_float3(0.0f, 0.0f, 0.0f);
float3 L = zero_float3();
if (!shader_constant_emission_eval(kg, shader, &L)) {
# ifdef __SPLIT_KERNEL__
Ray priv_ray = *ray;

View File

@ -277,7 +277,7 @@ ccl_device float3 background_portal_sample(KernelGlobals *kg,
portal--;
}
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
}
ccl_device_inline float3 background_sun_sample(KernelGlobals *kg,

View File

@ -154,7 +154,7 @@ ccl_device float2 concentric_sample_disk(float u1, float u2)
float b = 2.0f * u2 - 1.0f;
if (a == 0.0f && b == 0.0f) {
return make_float2(0.0f, 0.0f);
return zero_float2();
}
else if (a * a > b * b) {
r = a;

View File

@ -59,9 +59,9 @@ ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg,
return;
}
float3 normal = make_float3(0.0f, 0.0f, 0.0f);
float3 diffuse_albedo = make_float3(0.0f, 0.0f, 0.0f);
float3 specular_albedo = make_float3(0.0f, 0.0f, 0.0f);
float3 normal = zero_float3();
float3 diffuse_albedo = zero_float3();
float3 specular_albedo = zero_float3();
float sum_weight = 0.0f, sum_nonspecular_weight = 0.0f;
for (int i = 0; i < sd->num_closure; i++) {

View File

@ -267,7 +267,7 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg,
if (state->flag & PATH_RAY_TRANSPARENT_BACKGROUND) {
state->flag |= (PATH_RAY_SHADOW_CATCHER | PATH_RAY_STORE_SHADOW_INFO);
float3 bg = make_float3(0.0f, 0.0f, 0.0f);
float3 bg = zero_float3();
if (!kernel_data.background.transparent) {
bg = indirect_background(kg, emission_sd, state, NULL, ray);
}
@ -288,7 +288,7 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg,
if (kernel_data.background.transparent) {
L->transparent += average(holdout_weight * throughput);
}
if (isequal_float3(holdout_weight, make_float3(1.0f, 1.0f, 1.0f))) {
if (isequal_float3(holdout_weight, one_float3())) {
return false;
}
}
@ -460,7 +460,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg,
# ifdef __AO__
/* ambient occlusion */
if (kernel_data.integrator.use_ambient_occlusion) {
kernel_path_ao(kg, sd, emission_sd, L, state, throughput, make_float3(0.0f, 0.0f, 0.0f));
kernel_path_ao(kg, sd, emission_sd, L, state, throughput, zero_float3());
}
# endif /* __AO__ */
@ -670,7 +670,7 @@ ccl_device void kernel_path_trace(
}
/* Initialize state. */
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
float3 throughput = one_float3();
PathRadiance L;
path_radiance_init(kg, &L);

View File

@ -374,7 +374,7 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg,
PathRadiance *L)
{
/* initialize */
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
float3 throughput = one_float3();
path_radiance_init(kg, L);

View File

@ -41,11 +41,11 @@ ccl_device_inline void path_state_init(KernelGlobals *kg,
if (kernel_data.film.pass_denoising_data) {
state->flag |= PATH_RAY_STORE_SHADOW_INFO;
state->denoising_feature_weight = 1.0f;
state->denoising_feature_throughput = make_float3(1.0f, 1.0f, 1.0f);
state->denoising_feature_throughput = one_float3();
}
else {
state->denoising_feature_weight = 0.0f;
state->denoising_feature_throughput = make_float3(0.0f, 0.0f, 0.0f);
state->denoising_feature_throughput = zero_float3();
}
#endif /* __DENOISING_FEATURES__ */

View File

@ -56,7 +56,7 @@ ccl_device float3 spherical_to_direction(float theta, float phi)
ccl_device float2 direction_to_equirectangular_range(float3 dir, float4 range)
{
if (is_zero(dir))
return make_float2(0.0f, 0.0f);
return zero_float2();
float u = (atan2f(dir.y, dir.x) - range.y) / range.x;
float v = (acosf(dir.z / len(dir)) - range.w) / range.z;
@ -103,7 +103,7 @@ ccl_device float3 fisheye_to_direction(float u, float v, float fov)
float r = sqrtf(u * u + v * v);
if (r > 1.0f)
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
float phi = safe_acosf((r != 0.0f) ? u / r : 0.0f);
float theta = r * fov * 0.5f;
@ -136,7 +136,7 @@ fisheye_equisolid_to_direction(float u, float v, float lens, float fov, float wi
float r = sqrtf(u * u + v * v);
if (r > rmax)
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
float phi = safe_acosf((r != 0.0f) ? u / r : 0.0f);
float theta = 2.0f * asinf(r / (2.0f * lens));
@ -158,7 +158,7 @@ ccl_device float3 mirrorball_to_direction(float u, float v)
dir.z = 2.0f * v - 1.0f;
if (dir.x * dir.x + dir.z * dir.z > 1.0f)
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
dir.y = -sqrtf(max(1.0f - dir.x * dir.x - dir.z * dir.z, 0.0f));

View File

@ -330,8 +330,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
}
else {
#ifdef __DPDU__
sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
sd->dPdu = zero_float3();
sd->dPdv = zero_float3();
#endif
}
@ -367,7 +367,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
ccl_device void shader_setup_from_displace(
KernelGlobals *kg, ShaderData *sd, int object, int prim, float u, float v)
{
float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f);
float3 P, Ng, I = zero_float3();
int shader;
triangle_point_normal(kg, object, prim, u, v, &P, &Ng, &shader);
@ -419,8 +419,8 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg,
#ifdef __DPDU__
/* dPdu/dPdv */
sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
sd->dPdu = zero_float3();
sd->dPdv = zero_float3();
#endif
#ifdef __RAY_DIFFERENTIALS__
@ -466,8 +466,8 @@ ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *s
# ifdef __DPDU__
/* dPdu/dPdv */
sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
sd->dPdu = zero_float3();
sd->dPdv = zero_float3();
# endif
# ifdef __RAY_DIFFERENTIALS__
@ -617,8 +617,7 @@ ccl_device_inline
{
PROFILING_INIT(kg, PROFILING_CLOSURE_EVAL);
bsdf_eval_init(
eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
bsdf_eval_init(eval, NBUILTIN_CLOSURES, zero_float3(), kernel_data.film.use_light_pass);
#ifdef __BRANCHED_PATH__
if (kernel_data.integrator.branched)
@ -757,7 +756,7 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
kernel_assert(CLOSURE_IS_BSDF(sc->type));
int label;
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
*pdf = 0.0f;
label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
@ -787,7 +786,7 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg,
PROFILING_INIT(kg, PROFILING_CLOSURE_SAMPLE);
int label;
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
*pdf = 0.0f;
label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
@ -831,13 +830,13 @@ ccl_device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughn
ccl_device float3 shader_bsdf_transparency(KernelGlobals *kg, const ShaderData *sd)
{
if (sd->flag & SD_HAS_ONLY_VOLUME) {
return make_float3(1.0f, 1.0f, 1.0f);
return one_float3();
}
else if (sd->flag & SD_TRANSPARENT) {
return sd->closure_transparent_extinction;
}
else {
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
}
}
@ -849,7 +848,7 @@ ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData *
if (sc->type == CLOSURE_BSDF_TRANSPARENT_ID) {
sc->sample_weight = 0.0f;
sc->weight = make_float3(0.0f, 0.0f, 0.0f);
sc->weight = zero_float3();
}
}
@ -859,17 +858,17 @@ ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData *
ccl_device float3 shader_bsdf_alpha(KernelGlobals *kg, ShaderData *sd)
{
float3 alpha = make_float3(1.0f, 1.0f, 1.0f) - shader_bsdf_transparency(kg, sd);
float3 alpha = one_float3() - shader_bsdf_transparency(kg, sd);
alpha = max(alpha, make_float3(0.0f, 0.0f, 0.0f));
alpha = min(alpha, make_float3(1.0f, 1.0f, 1.0f));
alpha = max(alpha, zero_float3());
alpha = min(alpha, one_float3());
return alpha;
}
ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd)
{
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
@ -884,7 +883,7 @@ ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd)
ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd)
{
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
@ -898,7 +897,7 @@ ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd)
ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd)
{
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
@ -912,7 +911,7 @@ ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd)
ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd)
{
float3 N = make_float3(0.0f, 0.0f, 0.0f);
float3 N = zero_float3();
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
@ -925,8 +924,8 @@ ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd)
ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_)
{
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 N = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
float3 N = zero_float3();
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
@ -945,8 +944,8 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac
#ifdef __SUBSURFACE__
ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_blur_)
{
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 N = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
float3 N = zero_float3();
float texture_blur = 0.0f, weight_sum = 0.0f;
for (int i = 0; i < sd->num_closure; i++) {
@ -999,7 +998,7 @@ ccl_device float3 shader_background_eval(ShaderData *sd)
return sd->closure_emission_background;
}
else {
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
}
}
@ -1011,7 +1010,7 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd)
return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background;
}
else {
return make_float3(0.0f, 0.0f, 0.0f);
return zero_float3();
}
}
@ -1019,13 +1018,13 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd)
ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd)
{
float3 weight = make_float3(0.0f, 0.0f, 0.0f);
float3 weight = zero_float3();
/* For objects marked as holdout, preserve transparency and remove all other
* closures, replacing them with a holdout weight. */
if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) {
if ((sd->flag & SD_TRANSPARENT) && !(sd->flag & SD_HAS_ONLY_VOLUME)) {
weight = make_float3(1.0f, 1.0f, 1.0f) - sd->closure_transparent_extinction;
weight = one_float3() - sd->closure_transparent_extinction;
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
@ -1037,7 +1036,7 @@ ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd)
sd->flag &= ~(SD_CLOSURE_FLAGS - (SD_TRANSPARENT | SD_BSDF));
}
else {
weight = make_float3(1.0f, 1.0f, 1.0f);
weight = one_float3();
}
}
else {
@ -1150,8 +1149,7 @@ ccl_device void shader_volume_phase_eval(
{
PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_EVAL);
bsdf_eval_init(
eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
bsdf_eval_init(eval, NBUILTIN_CLOSURES, zero_float3(), kernel_data.film.use_light_pass);
_shader_volume_phase_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
}
@ -1209,7 +1207,7 @@ ccl_device int shader_volume_phase_sample(KernelGlobals *kg,
* depending on color channels, even if this is perhaps not a common case */
const ShaderClosure *sc = &sd->closure[sampled];
int label;
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
*pdf = 0.0f;
label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
@ -1234,7 +1232,7 @@ ccl_device int shader_phase_sample_closure(KernelGlobals *kg,
PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_SAMPLE);
int label;
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
float3 eval = zero_float3();
*pdf = 0.0f;
label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);

View File

@ -165,7 +165,7 @@ ccl_device bool shadow_blocked_transparent_all_loop(KernelGlobals *kg,
* shade them.
*/
if (!blocked && num_hits > 0) {
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
float3 throughput = one_float3();
float3 Pend = ray->P + ray->D * ray->t;
float last_t = 0.0f;
int bounce = state->transparent_bounce;
@ -305,7 +305,7 @@ ccl_device bool shadow_blocked_transparent_stepped_loop(KernelGlobals *kg,
# endif
# endif
if (blocked && is_transparent_isect) {
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
float3 throughput = one_float3();
float3 Pend = ray->P + ray->D * ray->t;
int bounce = state->transparent_bounce;
# ifdef __VOLUME__
@ -390,7 +390,7 @@ ccl_device_inline bool shadow_blocked(KernelGlobals *kg,
Ray *ray,
float3 *shadow)
{
*shadow = make_float3(1.0f, 1.0f, 1.0f);
*shadow = one_float3();
#if !defined(__KERNEL_OPTIX__)
/* Some common early checks.
* Avoid conditional trace call in OptiX though, since those hurt performance there.

View File

@ -27,7 +27,7 @@ subsurface_scatter_eval(ShaderData *sd, const ShaderClosure *sc, float disk_r, f
{
/* this is the veach one-sample model with balance heuristic, some pdf
* factors drop out when using balance heuristic weighting */
float3 eval_sum = make_float3(0.0f, 0.0f, 0.0f);
float3 eval_sum = zero_float3();
float pdf_sum = 0.0f;
float sample_weight_inv = 0.0f;
@ -62,7 +62,7 @@ subsurface_scatter_eval(ShaderData *sd, const ShaderClosure *sc, float disk_r, f
}
}
return (pdf_sum > 0.0f) ? eval_sum / pdf_sum : make_float3(0.0f, 0.0f, 0.0f);
return (pdf_sum > 0.0f) ? eval_sum / pdf_sum : zero_float3();
}
/* replace closures with a single diffuse bsdf closure after scatter step */
@ -107,7 +107,7 @@ ccl_device void subsurface_scatter_setup_diffuse_bsdf(
/* optionally do blurring of color and/or bump mapping, at the cost of a shader evaluation */
ccl_device float3 subsurface_color_pow(float3 color, float exponent)
{
color = max(color, make_float3(0.0f, 0.0f, 0.0f));
color = max(color, zero_float3());
if (exponent == 1.0f) {
/* nothing to do */
@ -243,7 +243,7 @@ ccl_device_inline int subsurface_scatter_disk(KernelGlobals *kg,
}
#endif /* __OBJECT_MOTION__ */
else {
ss_isect->weight[hit] = make_float3(0.0f, 0.0f, 0.0f);
ss_isect->weight[hit] = zero_float3();
continue;
}
@ -450,7 +450,7 @@ ccl_device_noinline
/* Convert subsurface to volume coefficients.
* The single-scattering albedo is named alpha to avoid confusion with the surface albedo. */
float3 sigma_t, alpha;
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
float3 throughput = one_float3();
subsurface_random_walk_coefficients(sc, &sigma_t, &alpha, &throughput);
float3 sigma_s = sigma_t * alpha;

View File

@ -70,11 +70,9 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals *kg,
if (!(sd->flag & (SD_EXTINCTION | SD_SCATTER | SD_EMISSION)))
return false;
coeff->sigma_s = make_float3(0.0f, 0.0f, 0.0f);
coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction :
make_float3(0.0f, 0.0f, 0.0f);
coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background :
make_float3(0.0f, 0.0f, 0.0f);
coeff->sigma_s = zero_float3();
coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction : zero_float3();
coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background : zero_float3();
if (sd->flag & SD_SCATTER) {
for (int i = 0; i < sd->num_closure; i++) {
@ -204,7 +202,7 @@ ccl_device void kernel_volume_shadow_homogeneous(KernelGlobals *kg,
ShaderData *sd,
float3 *throughput)
{
float3 sigma_t = make_float3(0.0f, 0.0f, 0.0f);
float3 sigma_t = zero_float3();
if (volume_shader_extinction_sample(kg, sd, state, ray->P, &sigma_t))
*throughput *= volume_color_transmittance(sigma_t, ray->t);
@ -230,7 +228,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg,
/* compute extinction at the start */
float t = 0.0f;
float3 sum = make_float3(0.0f, 0.0f, 0.0f);
float3 sum = zero_float3();
for (int i = 0; i < max_steps; i++) {
/* advance to new position */
@ -243,7 +241,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg,
}
float3 new_P = ray->P + ray->D * (t + step_offset);
float3 sigma_t = make_float3(0.0f, 0.0f, 0.0f);
float3 sigma_t = zero_float3();
/* compute attenuation over segment */
if (volume_shader_extinction_sample(kg, sd, state, new_P, &sigma_t)) {
@ -365,8 +363,7 @@ ccl_device float kernel_volume_distance_sample(
float sample_t = min(max_t, -logf(1.0f - xi * (1.0f - sample_transmittance)) / sample_sigma_t);
*transmittance = volume_color_transmittance(sigma_t, sample_t);
*pdf = safe_divide_color(sigma_t * *transmittance,
make_float3(1.0f, 1.0f, 1.0f) - full_transmittance);
*pdf = safe_divide_color(sigma_t * *transmittance, one_float3() - full_transmittance);
/* todo: optimization: when taken together with hit/miss decision,
* the full_transmittance cancels out drops out and xi does not
@ -380,8 +377,7 @@ ccl_device float3 kernel_volume_distance_pdf(float max_t, float3 sigma_t, float
float3 full_transmittance = volume_color_transmittance(sigma_t, max_t);
float3 transmittance = volume_color_transmittance(sigma_t, sample_t);
return safe_divide_color(sigma_t * transmittance,
make_float3(1.0f, 1.0f, 1.0f) - full_transmittance);
return safe_divide_color(sigma_t * transmittance, one_float3() - full_transmittance);
}
/* Emission */
@ -508,7 +504,7 @@ kernel_volume_integrate_homogeneous(KernelGlobals *kg,
/* modify pdf for hit/miss decision */
if (probalistic_scatter)
pdf *= make_float3(1.0f, 1.0f, 1.0f) - volume_color_transmittance(coeff.sigma_t, t);
pdf *= one_float3() - volume_color_transmittance(coeff.sigma_t, t);
new_tp = *throughput * coeff.sigma_s * transmittance / dot(channel_pdf, pdf);
t = sample_t;
@ -578,7 +574,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg,
/* compute coefficients at the start */
float t = 0.0f;
float3 accum_transmittance = make_float3(1.0f, 1.0f, 1.0f);
float3 accum_transmittance = one_float3();
/* pick random color channel, we use the Veach one-sample
* model with balance heuristic for the channels */
@ -654,7 +650,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg,
new_tp = tp * transmittance;
}
else {
transmittance = make_float3(0.0f, 0.0f, 0.0f);
transmittance = zero_float3();
new_tp = tp;
}
@ -671,7 +667,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg,
/* stop if nearly all light blocked */
if (tp.x < tp_eps && tp.y < tp_eps && tp.z < tp_eps) {
tp = make_float3(0.0f, 0.0f, 0.0f);
tp = zero_float3();
break;
}
}
@ -811,10 +807,10 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg,
}
/* init accumulation variables */
float3 accum_emission = make_float3(0.0f, 0.0f, 0.0f);
float3 accum_transmittance = make_float3(1.0f, 1.0f, 1.0f);
float3 accum_albedo = make_float3(0.0f, 0.0f, 0.0f);
float3 cdf_distance = make_float3(0.0f, 0.0f, 0.0f);
float3 accum_emission = zero_float3();
float3 accum_transmittance = one_float3();
float3 accum_albedo = zero_float3();
float3 cdf_distance = zero_float3();
float t = 0.0f;
segment->numsteps = 0;
@ -880,8 +876,8 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg,
}
else {
/* store empty step */
step->sigma_t = make_float3(0.0f, 0.0f, 0.0f);
step->sigma_s = make_float3(0.0f, 0.0f, 0.0f);
step->sigma_t = zero_float3();
step->sigma_s = zero_float3();
step->closure_flag = 0;
segment->numsteps++;
@ -1011,12 +1007,12 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals *
step = segment->steps;
float prev_t = 0.0f;
float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f);
float3 step_pdf_distance = one_float3();
if (segment->numsteps > 1) {
float prev_cdf = 0.0f;
float step_cdf = 1.0f;
float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f);
float3 prev_cdf_distance = zero_float3();
for (int i = 0;; i++, step++) {
/* todo: optimize using binary search */
@ -1047,7 +1043,7 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals *
/* modify pdf for hit/miss decision */
if (probalistic_scatter)
distance_pdf *= make_float3(1.0f, 1.0f, 1.0f) - segment->accum_transmittance;
distance_pdf *= one_float3() - segment->accum_transmittance;
pdf = dot(channel_pdf, distance_pdf * step_pdf_distance);
@ -1066,10 +1062,10 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals *
step = segment->steps;
float prev_t = 0.0f;
float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f);
float3 step_pdf_distance = one_float3();
if (segment->numsteps > 1) {
float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f);
float3 prev_cdf_distance = zero_float3();
int numsteps = segment->numsteps;
int high = numsteps - 1;

View File

@ -189,8 +189,8 @@ Camera::Camera() : Node(node_type)
full_rastertocamera = projection_identity();
dx = make_float3(0.0f, 0.0f, 0.0f);
dy = make_float3(0.0f, 0.0f, 0.0f);
dx = zero_float3();
dy = zero_float3();
need_device_update = true;
need_flags_update = true;
@ -310,8 +310,8 @@ void Camera::update(Scene *scene)
transform_perspective(&full_rastertocamera, make_float3(0, 0, 0));
}
else {
dx = make_float3(0.0f, 0.0f, 0.0f);
dy = make_float3(0.0f, 0.0f, 0.0f);
dx = zero_float3();
dy = zero_float3();
}
dx = transform_direction(&cameratoworld, dx);
@ -568,7 +568,7 @@ float3 Camera::transform_raster_to_world(float raster_x, float raster_y)
if (camera_type == CAMERA_PERSPECTIVE) {
D = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
float3 Pclip = normalize(D);
P = make_float3(0.0f, 0.0f, 0.0f);
P = zero_float3();
/* TODO(sergey): Aperture support? */
P = transform_point(&cameratoworld, P);
D = normalize(transform_direction(&cameratoworld, D));
@ -643,7 +643,7 @@ float Camera::world_to_raster_size(float3 P)
float3 p = transform_point(&worldtocamera, P);
float3 v1 = transform_perspective(&full_rastertocamera,
make_float3(full_width, full_height, 0.0f));
float3 v2 = transform_perspective(&full_rastertocamera, make_float3(0.0f, 0.0f, 0.0f));
float3 v2 = transform_perspective(&full_rastertocamera, zero_float3());
/* Create point clamped to frustum */
float3 c;

View File

@ -86,7 +86,7 @@ void ConstantFolder::make_zero() const
make_constant(0.0f);
}
else if (SocketType::is_float3(output->type())) {
make_constant(make_float3(0.0f, 0.0f, 0.0f));
make_constant(zero_float3());
}
else {
assert(0);
@ -99,7 +99,7 @@ void ConstantFolder::make_one() const
make_constant(1.0f);
}
else if (SocketType::is_float3(output->type())) {
make_constant(make_float3(1.0f, 1.0f, 1.0f));
make_constant(one_float3());
}
else {
assert(0);
@ -184,7 +184,7 @@ bool ConstantFolder::is_zero(ShaderInput *input) const
return node->get_float(input->socket_type) == 0.0f;
}
else if (SocketType::is_float3(input->type())) {
return node->get_float3(input->socket_type) == make_float3(0.0f, 0.0f, 0.0f);
return node->get_float3(input->socket_type) == zero_float3();
}
}
@ -198,7 +198,7 @@ bool ConstantFolder::is_one(ShaderInput *input) const
return node->get_float(input->socket_type) == 1.0f;
}
else if (SocketType::is_float3(input->type())) {
return node->get_float3(input->socket_type) == make_float3(1.0f, 1.0f, 1.0f);
return node->get_float3(input->socket_type) == one_float3();
}
}

View File

@ -273,7 +273,7 @@ void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to)
if (to->type() == SocketType::CLOSURE) {
EmissionNode *emission = create_node<EmissionNode>();
emission->set_color(make_float3(1.0f, 1.0f, 1.0f));
emission->set_color(one_float3());
emission->set_strength(1.0f);
convert = add(emission);
/* Connect float inputs to Strength to save an additional Value->Color conversion. */

View File

@ -416,7 +416,7 @@ void Hair::compute_bounds()
if (!bnds.valid()) {
/* empty mesh */
bnds.grow(make_float3(0.0f, 0.0f, 0.0f));
bnds.grow(zero_float3());
}
bounds = bnds;

View File

@ -116,17 +116,17 @@ NODE_DEFINE(Light)
type_enum.insert("spot", LIGHT_SPOT);
SOCKET_ENUM(light_type, "Type", type_enum, LIGHT_POINT);
SOCKET_COLOR(strength, "Strength", make_float3(1.0f, 1.0f, 1.0f));
SOCKET_COLOR(strength, "Strength", one_float3());
SOCKET_POINT(co, "Co", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_POINT(co, "Co", zero_float3());
SOCKET_VECTOR(dir, "Dir", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_VECTOR(dir, "Dir", zero_float3());
SOCKET_FLOAT(size, "Size", 0.0f);
SOCKET_FLOAT(angle, "Angle", 0.0f);
SOCKET_VECTOR(axisu, "Axis U", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_VECTOR(axisu, "Axis U", zero_float3());
SOCKET_FLOAT(sizeu, "Size U", 1.0f);
SOCKET_VECTOR(axisv, "Axis V", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_VECTOR(axisv, "Axis V", zero_float3());
SOCKET_FLOAT(sizev, "Size V", 1.0f);
SOCKET_BOOLEAN(round, "Round", false);
@ -173,7 +173,7 @@ void Light::tag_update(Scene *scene)
bool Light::has_contribution(Scene *scene)
{
if (strength == make_float3(0.0f, 0.0f, 0.0f)) {
if (strength == zero_float3()) {
return false;
}
if (is_portal) {

View File

@ -333,7 +333,7 @@ void Mesh::add_vertex(float3 P)
tag_verts_modified();
if (get_num_subd_faces()) {
vert_patch_uv.push_back_reserved(make_float2(0.0f, 0.0f));
vert_patch_uv.push_back_reserved(zero_float2());
tag_vert_patch_uv_modified();
}
}
@ -344,7 +344,7 @@ void Mesh::add_vertex_slow(float3 P)
tag_verts_modified();
if (get_num_subd_faces()) {
vert_patch_uv.push_back_slow(make_float2(0.0f, 0.0f));
vert_patch_uv.push_back_slow(zero_float2());
tag_vert_patch_uv_modified();
}
}
@ -494,7 +494,7 @@ void Mesh::compute_bounds()
if (!bnds.valid()) {
/* empty mesh */
bnds.grow(make_float3(0.0f, 0.0f, 0.0f));
bnds.grow(zero_float3());
}
bounds = bnds;

View File

@ -197,7 +197,7 @@ bool GeometryManager::displace(
for (int key : stitch_keys) {
pair<map_it_t, map_it_t> verts = mesh->vert_stitching_map.equal_range(key);
float3 pos = make_float3(0.0f, 0.0f, 0.0f);
float3 pos = zero_float3();
int num = 0;
for (map_it_t v = verts.first; v != verts.second; ++v) {
@ -264,7 +264,7 @@ bool GeometryManager::displace(
for (size_t i = 0; i < num_triangles; i++) {
if (tri_has_true_disp[i]) {
for (size_t j = 0; j < 3; j++) {
vN[mesh->get_triangle(i).v[j]] = make_float3(0.0f, 0.0f, 0.0f);
vN[mesh->get_triangle(i).v[j]] = zero_float3();
}
}
}
@ -333,7 +333,7 @@ bool GeometryManager::displace(
for (size_t i = 0; i < num_triangles; i++) {
if (tri_has_true_disp[i]) {
for (size_t j = 0; j < 3; j++) {
mN[mesh->get_triangle(i).v[j]] = make_float3(0.0f, 0.0f, 0.0f);
mN[mesh->get_triangle(i).v[j]] = zero_float3();
}
}
}

View File

@ -341,9 +341,9 @@ struct OsdPatch : Patch {
float3 du, dv;
if (P)
*P = make_float3(0.0f, 0.0f, 0.0f);
du = make_float3(0.0f, 0.0f, 0.0f);
dv = make_float3(0.0f, 0.0f, 0.0f);
*P = zero_float3();
du = zero_float3();
dv = zero_float3();
for (int i = 0; i < cv.size(); i++) {
float3 p = osd_data->verts[cv[i]].value;
@ -484,8 +484,8 @@ void Mesh::tessellate(DiagSplit *split)
}
else {
/* ngon */
float3 center_vert = make_float3(0.0f, 0.0f, 0.0f);
float3 center_normal = make_float3(0.0f, 0.0f, 0.0f);
float3 center_vert = zero_float3();
float3 center_normal = zero_float3();
float inv_num_corners = 1.0f / float(face.num_corners);
for (int corner = 0; corner < face.num_corners; corner++) {
@ -613,7 +613,7 @@ void Mesh::tessellate(DiagSplit *split)
uchar *center = (uchar *)data + (subd_face_corners.size() + ngons) * stride;
float inv_num_corners = 1.0f / float(face.num_corners);
float4 val = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 val = zero_float4();
for (int corner = 0; corner < face.num_corners; corner++) {
for (int i = 0; i < 4; i++) {

View File

@ -43,9 +43,9 @@ CCL_NAMESPACE_BEGIN
/* Texture Mapping */
#define TEXTURE_MAPPING_DEFINE(TextureNode) \
SOCKET_POINT(tex_mapping.translation, "Translation", make_float3(0.0f, 0.0f, 0.0f)); \
SOCKET_VECTOR(tex_mapping.rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); \
SOCKET_VECTOR(tex_mapping.scale, "Scale", make_float3(1.0f, 1.0f, 1.0f)); \
SOCKET_POINT(tex_mapping.translation, "Translation", zero_float3()); \
SOCKET_VECTOR(tex_mapping.rotation, "Rotation", zero_float3()); \
SOCKET_VECTOR(tex_mapping.scale, "Scale", one_float3()); \
\
SOCKET_VECTOR(tex_mapping.min, "Min", make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); \
SOCKET_VECTOR(tex_mapping.max, "Max", make_float3(FLT_MAX, FLT_MAX, FLT_MAX)); \
@ -80,7 +80,7 @@ TextureMapping::TextureMapping()
Transform TextureMapping::compute_transform()
{
Transform mmat = transform_scale(make_float3(0.0f, 0.0f, 0.0f));
Transform mmat = transform_scale(zero_float3());
if (x_mapping != NONE)
mmat[0][x_mapping - 1] = 1.0f;
@ -137,11 +137,11 @@ Transform TextureMapping::compute_transform()
bool TextureMapping::skip()
{
if (translation != make_float3(0.0f, 0.0f, 0.0f))
if (translation != zero_float3())
return false;
if (rotation != make_float3(0.0f, 0.0f, 0.0f))
if (rotation != zero_float3())
return false;
if (scale != make_float3(1.0f, 1.0f, 1.0f))
if (scale != one_float3())
return false;
if (x_mapping != X || y_mapping != Y || z_mapping != Z)
@ -250,7 +250,7 @@ NODE_DEFINE(ImageTextureNode)
SOCKET_INT_ARRAY(tiles, "Tiles", array<int>());
SOCKET_BOOLEAN(animated, "Animated", false);
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_UV);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_UV);
SOCKET_OUT_COLOR(color, "Color");
SOCKET_OUT_FLOAT(alpha, "Alpha");
@ -517,7 +517,7 @@ NODE_DEFINE(EnvironmentTextureNode)
SOCKET_BOOLEAN(animated, "Animated", false);
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_POSITION);
SOCKET_OUT_COLOR(color, "Color");
SOCKET_OUT_FLOAT(alpha, "Alpha");
@ -811,8 +811,7 @@ NODE_DEFINE(SkyTextureNode)
SOCKET_FLOAT(dust_density, "Dust", 1.0f);
SOCKET_FLOAT(ozone_density, "Ozone", 1.0f);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_OUT_COLOR(color, "Color");
@ -993,8 +992,7 @@ NODE_DEFINE(GradientTextureNode)
type_enum.insert("spherical", NODE_BLEND_SPHERICAL);
SOCKET_ENUM(gradient_type, "Type", type_enum, NODE_BLEND_LINEAR);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_OUT_COLOR(color, "Color");
SOCKET_OUT_FLOAT(fac, "Fac");
@ -1046,8 +1044,7 @@ NODE_DEFINE(NoiseTextureNode)
dimensions_enum.insert("4D", 4);
SOCKET_ENUM(dimensions, "Dimensions", dimensions_enum, 3);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_FLOAT(w, "W", 0.0f);
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
SOCKET_IN_FLOAT(detail, "Detail", 2.0f);
@ -1137,8 +1134,7 @@ NODE_DEFINE(VoronoiTextureNode)
feature_enum.insert("n_sphere_radius", NODE_VORONOI_N_SPHERE_RADIUS);
SOCKET_ENUM(feature, "Feature", feature_enum, NODE_VORONOI_F1);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_FLOAT(w, "W", 0.0f);
SOCKET_IN_FLOAT(scale, "Scale", 5.0f);
SOCKET_IN_FLOAT(smoothness, "Smoothness", 5.0f);
@ -1226,8 +1222,7 @@ NODE_DEFINE(IESLightNode)
SOCKET_STRING(filename, "File Name", ustring());
SOCKET_IN_FLOAT(strength, "Strength", 1.0f);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_NORMAL);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_NORMAL);
SOCKET_OUT_FLOAT(fac, "Fac");
@ -1317,7 +1312,7 @@ NODE_DEFINE(WhiteNoiseTextureNode)
dimensions_enum.insert("4D", 4);
SOCKET_ENUM(dimensions, "Dimensions", dimensions_enum, 3);
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(vector, "Vector", zero_float3());
SOCKET_IN_FLOAT(w, "W", 0.0f);
SOCKET_OUT_FLOAT(value, "Value");
@ -1377,8 +1372,7 @@ NODE_DEFINE(MusgraveTextureNode)
type_enum.insert("hetero_terrain", NODE_MUSGRAVE_HETERO_TERRAIN);
SOCKET_ENUM(musgrave_type, "Type", type_enum, NODE_MUSGRAVE_FBM);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_FLOAT(w, "W", 0.0f);
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
SOCKET_IN_FLOAT(detail, "Detail", 2.0f);
@ -1477,8 +1471,7 @@ NODE_DEFINE(WaveTextureNode)
profile_enum.insert("tri", NODE_WAVE_PROFILE_TRI);
SOCKET_ENUM(profile, "Profile", profile_enum, NODE_WAVE_PROFILE_SIN);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
SOCKET_IN_FLOAT(distortion, "Distortion", 0.0f);
SOCKET_IN_FLOAT(detail, "Detail", 2.0f);
@ -1555,8 +1548,7 @@ NODE_DEFINE(MagicTextureNode)
SOCKET_INT(depth, "Depth", 2);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_FLOAT(scale, "Scale", 5.0f);
SOCKET_IN_FLOAT(distortion, "Distortion", 1.0f);
@ -1608,10 +1600,9 @@ NODE_DEFINE(CheckerTextureNode)
TEXTURE_MAPPING_DEFINE(CheckerTextureNode);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_COLOR(color1, "Color1", zero_float3());
SOCKET_IN_COLOR(color2, "Color2", zero_float3());
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
SOCKET_OUT_COLOR(color, "Color");
@ -1668,12 +1659,11 @@ NODE_DEFINE(BrickTextureNode)
SOCKET_FLOAT(squash, "Squash", 1.0f);
SOCKET_INT(squash_frequency, "Squash Frequency", 2);
SOCKET_IN_POINT(
vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED);
SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(mortar, "Mortar", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color1, "Color1", zero_float3());
SOCKET_IN_COLOR(color2, "Color2", zero_float3());
SOCKET_IN_COLOR(mortar, "Mortar", zero_float3());
SOCKET_IN_FLOAT(scale, "Scale", 5.0f);
SOCKET_IN_FLOAT(mortar_size, "Mortar Size", 0.02f);
SOCKET_IN_FLOAT(mortar_smooth, "Mortar Smooth", 0.0f);
@ -1772,7 +1762,7 @@ NODE_DEFINE(PointDensityTextureNode)
SOCKET_TRANSFORM(tfm, "Transform", transform_identity());
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION);
SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_POSITION);
SOCKET_OUT_FLOAT(density, "Density");
SOCKET_OUT_COLOR(color, "Color");
@ -1887,9 +1877,9 @@ NODE_DEFINE(NormalNode)
{
NodeType *type = NodeType::add("normal", create, NodeType::SHADER);
SOCKET_VECTOR(direction, "direction", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_VECTOR(direction, "direction", zero_float3());
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_NORMAL(normal, "Normal", zero_float3());
SOCKET_OUT_NORMAL(normal, "Normal");
SOCKET_OUT_FLOAT(dot, "Dot");
@ -1934,10 +1924,10 @@ NODE_DEFINE(MappingNode)
type_enum.insert("normal", NODE_MAPPING_TYPE_NORMAL);
SOCKET_ENUM(mapping_type, "Type", type_enum, NODE_MAPPING_TYPE_POINT);
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(location, "Location", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(scale, "Scale", make_float3(1.0f, 1.0f, 1.0f));
SOCKET_IN_POINT(vector, "Vector", zero_float3());
SOCKET_IN_POINT(location, "Location", zero_float3());
SOCKET_IN_POINT(rotation, "Rotation", zero_float3());
SOCKET_IN_POINT(scale, "Scale", one_float3());
SOCKET_OUT_POINT(vector, "Vector");
@ -1993,7 +1983,7 @@ NODE_DEFINE(RGBToBWNode)
{
NodeType *type = NodeType::add("rgb_to_bw", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_OUT_FLOAT(val, "Val");
return type;
@ -2291,7 +2281,7 @@ NODE_DEFINE(AnisotropicBsdfNode)
NodeType *type = NodeType::add("anisotropic_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum distribution_enum;
@ -2301,7 +2291,7 @@ NODE_DEFINE(AnisotropicBsdfNode)
distribution_enum.insert("ashikhmin_shirley", CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID);
SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_ID);
SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT);
SOCKET_IN_VECTOR(tangent, "Tangent", zero_float3(), SocketType::LINK_TANGENT);
SOCKET_IN_FLOAT(roughness, "Roughness", 0.5f);
SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.5f);
@ -2353,7 +2343,7 @@ NODE_DEFINE(GlossyBsdfNode)
NodeType *type = NodeType::add("glossy_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum distribution_enum;
@ -2445,7 +2435,7 @@ NODE_DEFINE(GlassBsdfNode)
NodeType *type = NodeType::add("glass_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum distribution_enum;
@ -2538,7 +2528,7 @@ NODE_DEFINE(RefractionBsdfNode)
NodeType *type = NodeType::add("refraction_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum distribution_enum;
@ -2629,7 +2619,7 @@ NODE_DEFINE(ToonBsdfNode)
NodeType *type = NodeType::add("toon_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum component_enum;
@ -2669,7 +2659,7 @@ NODE_DEFINE(VelvetBsdfNode)
NodeType *type = NodeType::add("velvet_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_IN_FLOAT(sigma, "Sigma", 1.0f);
@ -2700,7 +2690,7 @@ NODE_DEFINE(DiffuseBsdfNode)
NodeType *type = NodeType::add("diffuse_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f);
@ -2760,15 +2750,12 @@ NODE_DEFINE(PrincipledBsdfNode)
SOCKET_IN_FLOAT(transmission, "Transmission", 0.0f);
SOCKET_IN_FLOAT(transmission_roughness, "Transmission Roughness", 0.0f);
SOCKET_IN_FLOAT(anisotropic_rotation, "Anisotropic Rotation", 0.0f);
SOCKET_IN_COLOR(emission, "Emission", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(emission, "Emission", zero_float3());
SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 1.0f);
SOCKET_IN_FLOAT(alpha, "Alpha", 1.0f);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(clearcoat_normal,
"Clearcoat Normal",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(clearcoat_normal, "Clearcoat Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(tangent, "Tangent", zero_float3(), SocketType::LINK_TANGENT);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
@ -2789,7 +2776,7 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph)
ShaderInput *emission_in = input("Emission");
ShaderInput *emission_strength_in = input("Emission Strength");
if ((emission_in->link || emission != make_float3(0.0f, 0.0f, 0.0f)) &&
if ((emission_in->link || emission != zero_float3()) &&
(emission_strength_in->link || emission_strength != 0.0f)) {
/* Create add closure and emission, and relink inputs. */
AddClosureNode *add = graph->create_node<AddClosureNode>();
@ -2879,7 +2866,7 @@ void PrincipledBsdfNode::compile(SVMCompiler &compiler,
ShaderInput *clearcoat_normal_in = input("Clearcoat Normal");
ShaderInput *tangent_in = input("Tangent");
float3 weight = make_float3(1.0f, 1.0f, 1.0f);
float3 weight = one_float3();
compiler.add_node(NODE_CLOSURE_SET_WEIGHT, weight);
@ -2989,7 +2976,7 @@ NODE_DEFINE(TranslucentBsdfNode)
NodeType *type = NodeType::add("translucent_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
@ -3018,7 +3005,7 @@ NODE_DEFINE(TransparentBsdfNode)
{
NodeType *type = NodeType::add("transparent_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(1.0f, 1.0f, 1.0f));
SOCKET_IN_COLOR(color, "Color", one_float3());
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
@ -3048,7 +3035,7 @@ NODE_DEFINE(SubsurfaceScatteringNode)
NodeType *type = NodeType::add("subsurface_scattering", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum falloff_enum;
@ -3138,8 +3125,7 @@ void EmissionNode::constant_fold(const ConstantFolder &folder)
ShaderInput *color_in = input("Color");
ShaderInput *strength_in = input("Strength");
if ((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) ||
(!strength_in->link && strength == 0.0f)) {
if ((!color_in->link && color == zero_float3()) || (!strength_in->link && strength == 0.0f)) {
folder.discard();
}
}
@ -3188,8 +3174,7 @@ void BackgroundNode::constant_fold(const ConstantFolder &folder)
ShaderInput *color_in = input("Color");
ShaderInput *strength_in = input("Strength");
if ((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) ||
(!strength_in->link && strength == 0.0f)) {
if ((!color_in->link && color == zero_float3()) || (!strength_in->link && strength == 0.0f)) {
folder.discard();
}
}
@ -3214,7 +3199,7 @@ HoldoutNode::HoldoutNode() : ShaderNode(node_type)
void HoldoutNode::compile(SVMCompiler &compiler)
{
float3 value = make_float3(1.0f, 1.0f, 1.0f);
float3 value = one_float3();
compiler.add_node(NODE_CLOSURE_SET_WEIGHT, value);
compiler.add_node(NODE_CLOSURE_HOLDOUT, compiler.closure_mix_weight_offset());
@ -3233,9 +3218,9 @@ NODE_DEFINE(AmbientOcclusionNode)
SOCKET_INT(samples, "Samples", 16);
SOCKET_IN_COLOR(color, "Color", make_float3(1.0f, 1.0f, 1.0f));
SOCKET_IN_COLOR(color, "Color", one_float3());
SOCKET_IN_FLOAT(distance, "Distance", 1.0f);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_BOOLEAN(inside, "Inside", false);
SOCKET_BOOLEAN(only_local, "Only Local", false);
@ -3393,11 +3378,11 @@ NODE_DEFINE(PrincipledVolumeNode)
SOCKET_IN_COLOR(color, "Color", make_float3(0.5f, 0.5f, 0.5f));
SOCKET_IN_FLOAT(density, "Density", 1.0f);
SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.0f);
SOCKET_IN_COLOR(absorption_color, "Absorption Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(absorption_color, "Absorption Color", zero_float3());
SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 0.0f);
SOCKET_IN_COLOR(emission_color, "Emission Color", make_float3(1.0f, 1.0f, 1.0f));
SOCKET_IN_COLOR(emission_color, "Emission Color", one_float3());
SOCKET_IN_FLOAT(blackbody_intensity, "Blackbody Intensity", 0.0f);
SOCKET_IN_COLOR(blackbody_tint, "Blackbody Tint", make_float3(1.0f, 1.0f, 1.0f));
SOCKET_IN_COLOR(blackbody_tint, "Blackbody Tint", one_float3());
SOCKET_IN_FLOAT(temperature, "Temperature", 1000.0f);
SOCKET_IN_FLOAT(volume_mix_weight, "VolumeMixWeight", 0.0f, SocketType::SVM_INTERNAL);
@ -3523,7 +3508,7 @@ NODE_DEFINE(PrincipledHairBsdfNode)
SOCKET_IN_FLOAT(random_color, "Random Color", 0.0f);
SOCKET_IN_FLOAT(random, "Random", 0.0f);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
@ -3548,7 +3533,7 @@ void PrincipledHairBsdfNode::attributes(Shader *shader, AttributeRequestSet *att
/* Prepares the input data for the SVM shader. */
void PrincipledHairBsdfNode::compile(SVMCompiler &compiler)
{
compiler.add_node(NODE_CLOSURE_SET_WEIGHT, make_float3(1.0f, 1.0f, 1.0f));
compiler.add_node(NODE_CLOSURE_SET_WEIGHT, one_float3());
ShaderInput *roughness_in = input("Roughness");
ShaderInput *radial_roughness_in = input("Radial Roughness");
@ -3625,7 +3610,7 @@ NODE_DEFINE(HairBsdfNode)
NodeType *type = NodeType::add("hair_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
static NodeEnum component_enum;
@ -3635,7 +3620,7 @@ NODE_DEFINE(HairBsdfNode)
SOCKET_IN_FLOAT(offset, "Offset", 0.0f);
SOCKET_IN_FLOAT(roughness_u, "RoughnessU", 0.2f);
SOCKET_IN_FLOAT(roughness_v, "RoughnessV", 0.2f);
SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(tangent, "Tangent", zero_float3());
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
@ -3666,10 +3651,8 @@ NODE_DEFINE(GeometryNode)
{
NodeType *type = NodeType::add("geometry", create, NodeType::SHADER);
SOCKET_IN_NORMAL(normal_osl,
"NormalIn",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_NORMAL(
normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_OUT_POINT(position, "Position");
SOCKET_OUT_NORMAL(normal, "Normal");
@ -3817,10 +3800,8 @@ NODE_DEFINE(TextureCoordinateNode)
SOCKET_BOOLEAN(use_transform, "Use Transform", false);
SOCKET_TRANSFORM(ob_tfm, "Object Transform", transform_identity());
SOCKET_IN_NORMAL(normal_osl,
"NormalIn",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_NORMAL(
normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_OUT_POINT(generated, "Generated");
SOCKET_OUT_NORMAL(normal, "Normal");
@ -4656,7 +4637,7 @@ NODE_DEFINE(ColorNode)
{
NodeType *type = NodeType::add("color", create, NodeType::SHADER);
SOCKET_COLOR(value, "Value", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_COLOR(value, "Value", zero_float3());
SOCKET_OUT_COLOR(color, "Color");
return type;
@ -4829,7 +4810,7 @@ NODE_DEFINE(InvertNode)
NodeType *type = NodeType::add("invert", create, NodeType::SHADER);
SOCKET_IN_FLOAT(fac, "Fac", 1.0f);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_OUT_COLOR(color, "Color");
@ -4848,7 +4829,7 @@ void InvertNode::constant_fold(const ConstantFolder &folder)
if (!fac_in->link) {
/* evaluate fully constant node */
if (!color_in->link) {
folder.make_constant(interp(color, make_float3(1.0f, 1.0f, 1.0f) - color, fac));
folder.make_constant(interp(color, one_float3() - color, fac));
}
/* remove no-op node */
else if (fac == 0.0f) {
@ -4904,8 +4885,8 @@ NODE_DEFINE(MixNode)
SOCKET_BOOLEAN(use_clamp, "Use Clamp", false);
SOCKET_IN_FLOAT(fac, "Fac", 0.5f);
SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color1, "Color1", zero_float3());
SOCKET_IN_COLOR(color2, "Color2", zero_float3());
SOCKET_OUT_COLOR(color, "Color");
@ -5099,7 +5080,7 @@ NODE_DEFINE(GammaNode)
{
NodeType *type = NodeType::add("gamma", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_IN_FLOAT(gamma, "Gamma", 1.0f);
SOCKET_OUT_COLOR(color, "Color");
@ -5153,7 +5134,7 @@ NODE_DEFINE(BrightContrastNode)
{
NodeType *type = NodeType::add("brightness_contrast", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_IN_FLOAT(bright, "Bright", 0.0f);
SOCKET_IN_FLOAT(contrast, "Contrast", 0.0f);
@ -5198,7 +5179,7 @@ NODE_DEFINE(SeparateRGBNode)
{
NodeType *type = NodeType::add("separate_rgb", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Image", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Image", zero_float3());
SOCKET_OUT_FLOAT(r, "R");
SOCKET_OUT_FLOAT(g, "G");
@ -5251,7 +5232,7 @@ NODE_DEFINE(SeparateXYZNode)
{
NodeType *type = NodeType::add("separate_xyz", create, NodeType::SHADER);
SOCKET_IN_COLOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(vector, "Vector", zero_float3());
SOCKET_OUT_FLOAT(x, "X");
SOCKET_OUT_FLOAT(y, "Y");
@ -5304,7 +5285,7 @@ NODE_DEFINE(SeparateHSVNode)
{
NodeType *type = NodeType::add("separate_hsv", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_OUT_FLOAT(h, "H");
SOCKET_OUT_FLOAT(s, "S");
@ -5360,7 +5341,7 @@ NODE_DEFINE(HSVNode)
SOCKET_IN_FLOAT(saturation, "Saturation", 1.0f);
SOCKET_IN_FLOAT(value, "Value", 1.0f);
SOCKET_IN_FLOAT(fac, "Fac", 1.0f);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_OUT_COLOR(color, "Color");
@ -5525,10 +5506,8 @@ NODE_DEFINE(FresnelNode)
{
NodeType *type = NodeType::add("fresnel", create, NodeType::SHADER);
SOCKET_IN_NORMAL(normal,
"Normal",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_NORMAL(
normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_FLOAT(IOR, "IOR", 1.45f);
SOCKET_OUT_FLOAT(fac, "Fac");
@ -5564,10 +5543,8 @@ NODE_DEFINE(LayerWeightNode)
{
NodeType *type = NodeType::add("layer_weight", create, NodeType::SHADER);
SOCKET_IN_NORMAL(normal,
"Normal",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_NORMAL(
normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_FLOAT(blend, "Blend", 0.5f);
SOCKET_OUT_FLOAT(fresnel, "Fresnel");
@ -5735,8 +5712,8 @@ NODE_DEFINE(OutputNode)
SOCKET_IN_CLOSURE(surface, "Surface");
SOCKET_IN_CLOSURE(volume, "Volume");
SOCKET_IN_VECTOR(displacement, "Displacement", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(displacement, "Displacement", zero_float3());
SOCKET_IN_NORMAL(normal, "Normal", zero_float3());
return type;
}
@ -5928,7 +5905,7 @@ NODE_DEFINE(OutputAOVNode)
{
NodeType *type = NodeType::add("aov_output", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(color, "Color", zero_float3());
SOCKET_IN_FLOAT(value, "Value", 0.0f);
SOCKET_STRING(name, "AOV Name", ustring(""));
@ -6126,9 +6103,9 @@ NODE_DEFINE(VectorMathNode)
type_enum.insert("tangent", NODE_VECTOR_MATH_TANGENT);
SOCKET_ENUM(math_type, "Type", type_enum, NODE_VECTOR_MATH_ADD);
SOCKET_IN_VECTOR(vector1, "Vector1", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(vector2, "Vector2", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(vector3, "Vector3", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(vector1, "Vector1", zero_float3());
SOCKET_IN_VECTOR(vector2, "Vector2", zero_float3());
SOCKET_IN_VECTOR(vector3, "Vector3", zero_float3());
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
SOCKET_OUT_FLOAT(value, "Value");
@ -6144,7 +6121,7 @@ VectorMathNode::VectorMathNode() : ShaderNode(node_type)
void VectorMathNode::constant_fold(const ConstantFolder &folder)
{
float value = 0.0f;
float3 vector = make_float3(0.0f, 0.0f, 0.0f);
float3 vector = zero_float3();
if (folder.all_inputs_constant()) {
svm_vector_math(&value, &vector, math_type, vector1, vector2, vector3, scale);
@ -6216,9 +6193,9 @@ NODE_DEFINE(VectorRotateNode)
SOCKET_BOOLEAN(invert, "Invert", false);
SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_POINT(center, "Center", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(vector, "Vector", zero_float3());
SOCKET_IN_POINT(rotation, "Rotation", zero_float3());
SOCKET_IN_POINT(center, "Center", zero_float3());
SOCKET_IN_VECTOR(axis, "Axis", make_float3(0.0f, 0.0f, 1.0f));
SOCKET_IN_FLOAT(angle, "Angle", 0.0f);
SOCKET_OUT_VECTOR(vector, "Vector");
@ -6276,7 +6253,7 @@ NODE_DEFINE(VectorTransformNode)
SOCKET_ENUM(convert_from, "Convert From", space_enum, NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD);
SOCKET_ENUM(convert_to, "Convert To", space_enum, NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT);
SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(vector, "Vector", zero_float3());
SOCKET_OUT_VECTOR(vector, "Vector");
return type;
@ -6321,7 +6298,7 @@ NODE_DEFINE(BumpNode)
SOCKET_IN_FLOAT(sample_center, "SampleCenter", 0.0f);
SOCKET_IN_FLOAT(sample_x, "SampleX", 0.0f);
SOCKET_IN_FLOAT(sample_y, "SampleY", 0.0f);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(strength, "Strength", 1.0f);
SOCKET_IN_FLOAT(distance, "Distance", 0.1f);
@ -6470,7 +6447,7 @@ NODE_DEFINE(RGBCurvesNode)
SOCKET_FLOAT(max_x, "Max X", 1.0f);
SOCKET_IN_FLOAT(fac, "Fac", 0.0f);
SOCKET_IN_COLOR(value, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(value, "Color", zero_float3());
SOCKET_OUT_COLOR(value, "Color");
@ -6507,7 +6484,7 @@ NODE_DEFINE(VectorCurvesNode)
SOCKET_FLOAT(max_x, "Max X", 1.0f);
SOCKET_IN_FLOAT(fac, "Fac", 0.0f);
SOCKET_IN_VECTOR(value, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(value, "Vector", zero_float3());
SOCKET_OUT_VECTOR(value, "Vector");
@ -6618,7 +6595,7 @@ NODE_DEFINE(SetNormalNode)
{
NodeType *type = NodeType::add("set_normal", create, NodeType::SHADER);
SOCKET_IN_VECTOR(direction, "Direction", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_VECTOR(direction, "Direction", zero_float3());
SOCKET_OUT_NORMAL(normal, "Normal");
return type;
@ -6736,10 +6713,8 @@ NODE_DEFINE(NormalMapNode)
SOCKET_STRING(attribute, "Attribute", ustring());
SOCKET_IN_NORMAL(normal_osl,
"NormalIn",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_NORMAL(
normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_FLOAT(strength, "Strength", 1.0f);
SOCKET_IN_COLOR(color, "Color", make_float3(0.5f, 0.5f, 1.0f));
@ -6835,10 +6810,8 @@ NODE_DEFINE(TangentNode)
SOCKET_STRING(attribute, "Attribute", ustring());
SOCKET_IN_NORMAL(normal_osl,
"NormalIn",
make_float3(0.0f, 0.0f, 0.0f),
SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_NORMAL(
normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_OUT_NORMAL(tangent, "Tangent");
return type;
@ -6907,7 +6880,7 @@ NODE_DEFINE(BevelNode)
SOCKET_INT(samples, "Samples", 4);
SOCKET_IN_FLOAT(radius, "Radius", 0.05f);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_OUT_NORMAL(bevel, "Normal");
@ -6952,7 +6925,7 @@ NODE_DEFINE(DisplacementNode)
SOCKET_IN_FLOAT(height, "Height", 0.0f);
SOCKET_IN_FLOAT(midlevel, "Midlevel", 0.5f);
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_OUT_VECTOR(displacement, "Displacement");
@ -7009,7 +6982,7 @@ NODE_DEFINE(VectorDisplacementNode)
SOCKET_ENUM(space, "Space", space_enum, NODE_NORMAL_MAP_TANGENT);
SOCKET_STRING(attribute, "Attribute", ustring());
SOCKET_IN_COLOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_IN_COLOR(vector, "Vector", zero_float3());
SOCKET_IN_FLOAT(midlevel, "Midlevel", 0.0f);
SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
@ -7025,7 +6998,7 @@ VectorDisplacementNode::VectorDisplacementNode() : ShaderNode(node_type)
void VectorDisplacementNode::constant_fold(const ConstantFolder &folder)
{
if (folder.all_inputs_constant()) {
if ((vector == make_float3(0.0f, 0.0f, 0.0f) && midlevel == 0.0f) || (scale == 0.0f)) {
if ((vector == zero_float3() && midlevel == 0.0f) || (scale == 0.0f)) {
folder.make_zero();
}
}

View File

@ -85,13 +85,13 @@ NODE_DEFINE(Object)
SOCKET_NODE(geometry, "Geometry", &Geometry::node_base_type);
SOCKET_TRANSFORM(tfm, "Transform", transform_identity());
SOCKET_UINT(visibility, "Visibility", ~0);
SOCKET_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_COLOR(color, "Color", zero_float3());
SOCKET_UINT(random_id, "Random ID", 0);
SOCKET_INT(pass_id, "Pass ID", 0);
SOCKET_BOOLEAN(use_holdout, "Use Holdout", false);
SOCKET_BOOLEAN(hide_on_missing_motion, "Hide on Missing Motion", false);
SOCKET_POINT(dupli_generated, "Dupli Generated", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_POINT2(dupli_uv, "Dupli UV", make_float2(0.0f, 0.0f));
SOCKET_POINT(dupli_generated, "Dupli Generated", zero_float3());
SOCKET_POINT2(dupli_uv, "Dupli UV", zero_float2());
SOCKET_TRANSFORM_ARRAY(motion, "Motion", array<Transform>());
SOCKET_FLOAT(shadow_terminator_offset, "Terminator Offset", 0.0f);
SOCKET_STRING(asset_name, "Asset Name", ustring());
@ -270,7 +270,7 @@ int Object::motion_step(float time) const
bool Object::is_traceable() const
{
/* Mesh itself can be empty,can skip all such objects. */
if (!bounds.valid() || bounds.size() == make_float3(0.0f, 0.0f, 0.0f)) {
if (!bounds.valid() || bounds.size() == zero_float3()) {
return false;
}
/* TODO(sergey): Check for mesh vertices/curves. visibility flags. */
@ -337,7 +337,7 @@ float Object::compute_volume_step_size() const
if (voxel_step_size == 0.0f) {
/* Auto detect step size. */
float3 size = make_float3(1.0f, 1.0f, 1.0f);
float3 size = one_float3();
#ifdef WITH_NANOVDB
/* Dimensions were not applied to image transform with NanOVDB (see image_vdb.cpp) */
if (metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT &&
@ -397,7 +397,7 @@ static float object_volume_density(const Transform &tfm, Geometry *geom)
if (geom->geometry_type == Geometry::VOLUME) {
/* Volume density automatically adjust to object scale. */
if (static_cast<Volume *>(geom)->get_object_space()) {
const float3 unit = normalize(make_float3(1.0f, 1.0f, 1.0f));
const float3 unit = normalize(one_float3());
return 1.0f / len(transform_direction(&tfm, unit));
}
}

View File

@ -564,7 +564,7 @@ void ShaderManager::device_update_common(Device *device,
flag |= SD_HAS_DISPLACEMENT;
/* constant emission check */
float3 constant_emission = make_float3(0.0f, 0.0f, 0.0f);
float3 constant_emission = zero_float3();
if (shader->is_constant_emission(&constant_emission))
flag |= SD_HAS_CONSTANT_EMISSION;

View File

@ -68,9 +68,9 @@ class Subpatch {
explicit Subpatch(Patch *patch = nullptr)
: patch(patch),
c00(make_float2(0.0f, 0.0f)),
c00(zero_float2()),
c01(make_float2(0.0f, 1.0f)),
c11(make_float2(1.0f, 1.0f)),
c11(one_float2()),
c10(make_float2(1.0f, 0.0f))
{
}

View File

@ -259,9 +259,7 @@ TEST_F(RenderGraph, constant_fold_emission1)
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Discarding closure Emission.");
builder
.add_node(ShaderNodeBuilder<EmissionNode>(graph, "Emission")
.set("Color", make_float3(0.0f, 0.0f, 0.0f)))
builder.add_node(ShaderNodeBuilder<EmissionNode>(graph, "Emission").set("Color", zero_float3()))
.output_closure("Emission::Emission");
graph.finalize(scene);
@ -288,8 +286,7 @@ TEST_F(RenderGraph, constant_fold_background1)
CORRECT_INFO_MESSAGE(log, "Discarding closure Background.");
builder
.add_node(ShaderNodeBuilder<BackgroundNode>(graph, "Background")
.set("Color", make_float3(0.0f, 0.0f, 0.0f)))
.add_node(ShaderNodeBuilder<BackgroundNode>(graph, "Background").set("Color", zero_float3()))
.output_closure("Background::Background");
graph.finalize(scene);
@ -892,8 +889,7 @@ TEST_F(RenderGraph, constant_fold_gamma_part_0)
builder
.add_attribute("Attribute")
/* constant on the left */
.add_node(ShaderNodeBuilder<GammaNode>(graph, "Gamma_Cx")
.set("Color", make_float3(0.0f, 0.0f, 0.0f)))
.add_node(ShaderNodeBuilder<GammaNode>(graph, "Gamma_Cx").set("Color", zero_float3()))
.add_connection("Attribute::Fac", "Gamma_Cx::Gamma")
/* constant on the right */
.add_node(ShaderNodeBuilder<GammaNode>(graph, "Gamma_xC").set("Gamma", 0.0f))
@ -922,8 +918,7 @@ TEST_F(RenderGraph, constant_fold_gamma_part_1)
builder
.add_attribute("Attribute")
/* constant on the left */
.add_node(ShaderNodeBuilder<GammaNode>(graph, "Gamma_Cx")
.set("Color", make_float3(1.0f, 1.0f, 1.0f)))
.add_node(ShaderNodeBuilder<GammaNode>(graph, "Gamma_Cx").set("Color", one_float3()))
.add_connection("Attribute::Fac", "Gamma_Cx::Gamma")
/* constant on the right */
.add_node(ShaderNodeBuilder<GammaNode>(graph, "Gamma_xC").set("Gamma", 1.0f))

View File

@ -33,7 +33,7 @@ TEST(transform_motion_decompose, Degenerated)
// Copy from previous to current.
{
vector<Transform> motion = {transform_rotate(M_PI_4_F, make_float3(1.0f, 1.0f, 1.0f)),
vector<Transform> motion = {transform_rotate(M_PI_4_F, one_float3()),
transform_scale(0.0f, 0.0f, 0.0f)};
vector<DecomposedTransform> decomp(motion.size());
transform_motion_decompose(decomp.data(), motion.data(), motion.size());
@ -43,7 +43,7 @@ TEST(transform_motion_decompose, Degenerated)
// Copy from next to current.
{
vector<Transform> motion = {transform_scale(0.0f, 0.0f, 0.0f),
transform_rotate(M_PI_4_F, make_float3(1.0f, 1.0f, 1.0f))};
transform_rotate(M_PI_4_F, one_float3())};
vector<DecomposedTransform> decomp(motion.size());
transform_motion_decompose(decomp.data(), motion.data(), motion.size());
EXPECT_NEAR(len(decomp[0].x - decomp[1].x), 0.0f, 1e-6f);

View File

@ -277,16 +277,16 @@ ccl_device float4 color_srgb_to_linear_v4(float4 c)
ccl_device float3 color_highlight_compress(float3 color, float3 *variance)
{
color += make_float3(1.0f, 1.0f, 1.0f);
color += one_float3();
if (variance) {
*variance *= sqr3(make_float3(1.0f, 1.0f, 1.0f) / color);
*variance *= sqr3(one_float3() / color);
}
return log3(color);
}
ccl_device float3 color_highlight_uncompress(float3 color)
{
return exp3(color) - make_float3(1.0f, 1.0f, 1.0f);
return exp3(color) - one_float3();
}
CCL_NAMESPACE_END

View File

@ -72,6 +72,16 @@ ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b)
* Definition.
*/
ccl_device_inline float2 zero_float2()
{
return make_float2(0.0f, 0.0f);
}
ccl_device_inline float2 one_float2()
{
return make_float2(1.0f, 1.0f);
}
#ifndef __KERNEL_OPENCL__
ccl_device_inline float2 operator-(const float2 &a)
{
@ -256,7 +266,7 @@ ccl_device_inline float2 floor(const float2 &a)
ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b)
{
return (b != 0.0f) ? a / b : make_float2(0.0f, 0.0f);
return (b != 0.0f) ? a / b : zero_float2();
}
CCL_NAMESPACE_END

View File

@ -91,6 +91,20 @@ ccl_device_inline bool isequal_float3(const float3 a, const float3 b);
* Definition.
*/
ccl_device_inline float3 zero_float3()
{
#ifdef __KERNEL_SSE__
return float3(_mm_setzero_ps());
#else
return make_float3(0.0f, 0.0f, 0.0f);
#endif
}
ccl_device_inline float3 one_float3()
{
return make_float3(1.0f, 1.0f, 1.0f);
}
#ifndef __KERNEL_OPENCL__
ccl_device_inline float3 operator-(const float3 &a)
{
@ -373,8 +387,7 @@ ccl_device_inline float3 reflect(const float3 incident, const float3 normal)
ccl_device_inline float3 project(const float3 v, const float3 v_proj)
{
float len_squared = dot(v_proj, v_proj);
return (len_squared != 0.0f) ? (dot(v, v_proj) / len_squared) * v_proj :
make_float3(0.0f, 0.0f, 0.0f);
return (len_squared != 0.0f) ? (dot(v, v_proj) / len_squared) * v_proj : zero_float3();
}
ccl_device_inline float3 saturate3(float3 a)
@ -410,7 +423,7 @@ ccl_device_inline float3 safe_divide_float3_float3(const float3 a, const float3
ccl_device_inline float3 safe_divide_float3_float(const float3 a, const float b)
{
return (b != 0.0f) ? a / b : make_float3(0.0f, 0.0f, 0.0f);
return (b != 0.0f) ? a / b : zero_float3();
}
ccl_device_inline float3 interp(float3 a, float3 b, float t)

View File

@ -98,6 +98,20 @@ ccl_device_inline float4 reduce_add(const float4 &a);
* Definition.
*/
ccl_device_inline float4 zero_float4()
{
#ifdef __KERNEL_SSE__
return float4(_mm_setzero_ps());
#else
return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
#endif
}
ccl_device_inline float4 one_float4()
{
return make_float4(1.0f, 1.0f, 1.0f, 1.0f);
}
#ifndef __KERNEL_OPENCL__
ccl_device_inline float4 operator-(const float4 &a)
{
@ -474,7 +488,7 @@ ccl_device_inline float4 load_float4(const float *v)
ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b)
{
return (b != 0.0f) ? a / b : make_float4(0.0f, 0.0f, 0.0f, 0.0f);
return (b != 0.0f) ? a / b : zero_float4();
}
ccl_device_inline bool isfinite4_safe(float4 v)

View File

@ -51,7 +51,7 @@ ccl_device_inline float3 transform_perspective(const ProjectionTransform *t, con
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
float w = dot(t->w, b);
return (w != 0.0f) ? c / w : make_float3(0.0f, 0.0f, 0.0f);
return (w != 0.0f) ? c / w : zero_float3();
}
ccl_device_inline float3 transform_perspective_direction(const ProjectionTransform *t,

View File

@ -186,6 +186,12 @@ ccl_device_inline Transform make_transform_frame(float3 N)
#ifndef __KERNEL_GPU__
ccl_device_inline Transform transform_zero()
{
Transform zero = {zero_float4(), zero_float4(), zero_float4()};
return zero;
}
ccl_device_inline Transform operator*(const Transform a, const Transform b)
{
float4 c_x = make_float4(b.x.x, b.y.x, b.z.x, 0.0f);