11 #include "integrator/shader_eval.h"
21 const float *curve_radius,
46 const float *curve_radius,
52 P[0] = curve_keys[
max(first_key + k - 1, first_key)];
53 P[1] = curve_keys[first_key + k];
54 P[2] = curve_keys[first_key + k + 1];
55 P[3] = curve_keys[
min(first_key + k + 2, first_key +
num_keys - 1)];
69 float mr =
max(curve_radius[first_key + k], curve_radius[first_key + k + 1]);
91 float mr =
max(keys[1].
w, keys[2].
w);
98 const float *curve_radius,
100 size_t num_curve_keys,
108 const size_t max_step = num_steps - 1;
109 const size_t step =
std::min((
size_t)(
time * max_step), max_step - 1);
110 const float t =
time * max_step - step;
115 curve_keys, curve_radius, key_steps, num_curve_keys, num_steps, step, k0, k1, curr_keys);
117 curve_keys, curve_radius, key_steps, num_curve_keys, num_steps, step + 1, k0, k1, next_keys);
119 r_keys[0] = (1.0f -
t) * curr_keys[0] +
t * next_keys[0];
120 r_keys[1] = (1.0f -
t) * curr_keys[1] +
t * next_keys[1];
124 const float *curve_radius,
126 size_t num_curve_keys,
136 const size_t max_step = num_steps - 1;
137 const size_t step =
min((
size_t)(
time * max_step), max_step - 1);
138 const float t =
time * max_step - step;
142 cardinal_keys_for_step(curve_keys,
153 cardinal_keys_for_step(curve_keys,
165 r_keys[0] = (1.0f -
t) * curr_keys[0] +
t * next_keys[0];
166 r_keys[1] = (1.0f -
t) * curr_keys[1] +
t * next_keys[1];
167 r_keys[2] = (1.0f -
t) * curr_keys[2] +
t * next_keys[2];
168 r_keys[3] = (1.0f -
t) * curr_keys[3] +
t * next_keys[3];
172 const float *curve_radius,
174 size_t num_curve_keys,
181 k0 =
max(k0, (
size_t)0);
183 const size_t center_step = ((num_steps - 1) / 2);
184 if (step == center_step) {
190 curve_keys[first_key + k0].
y,
191 curve_keys[first_key + k0].
z,
192 curve_radius[first_key + k0]);
194 curve_keys[first_key + k1].
y,
195 curve_keys[first_key + k1].
z,
196 curve_radius[first_key + k1]);
200 if (step > center_step) {
203 const size_t offset = first_key + step * num_curve_keys;
207 curve_radius[first_key + k0]);
211 curve_radius[first_key + k1]);
216 const float *curve_radius,
218 size_t num_curve_keys,
227 k0 =
max(k0, (
size_t)0);
229 const size_t center_step = ((num_steps - 1) / 2);
230 if (step == center_step) {
233 curve_keys[first_key + k0].
y,
234 curve_keys[first_key + k0].
z,
235 curve_radius[first_key + k0]);
237 curve_keys[first_key + k1].
y,
238 curve_keys[first_key + k1].
z,
239 curve_radius[first_key + k1]);
241 curve_keys[first_key + k2].
y,
242 curve_keys[first_key + k2].
z,
243 curve_radius[first_key + k2]);
245 curve_keys[first_key + k3].
y,
246 curve_keys[first_key + k3].
z,
247 curve_radius[first_key + k3]);
251 if (step > center_step) {
254 const size_t offset = first_key + step * num_curve_keys;
258 curve_radius[first_key + k0]);
262 curve_radius[first_key + k1]);
266 curve_radius[first_key + k2]);
270 curve_radius[first_key + k3]);
301 curve_keys.resize(numkeys);
302 curve_radius.resize(numkeys);
303 curve_first_key.resize(numcurves);
304 curve_shader.resize(numcurves);
311 curve_keys.reserve(numkeys);
312 curve_radius.reserve(numkeys);
313 curve_first_key.reserve(numcurves);
314 curve_shader.reserve(numcurves);
324 curve_radius.clear();
325 curve_first_key.clear();
326 curve_shader.clear();
333 curve_keys.push_back_reserved(co);
334 curve_radius.push_back_reserved(radius);
336 tag_curve_keys_modified();
337 tag_curve_radius_modified();
342 curve_first_key.push_back_reserved(first_key);
343 curve_shader.push_back_reserved(shader);
345 tag_curve_first_key_modified();
346 tag_curve_shader_modified();
353 float3 *keys = &curve_keys[0];
354 size_t numkeys = curve_keys.size();
378 size_t curve_keys_size = curve_keys.size();
380 if (curve_keys_size > 0) {
381 for (
size_t i = 0; i < curve_keys_size; i++)
382 bnds.
grow(curve_keys[i], curve_radius[i]);
385 if (use_motion_blur && curve_attr) {
386 size_t steps_size = curve_keys.size() * (motion_steps - 1);
389 for (
size_t i = 0; i < steps_size; i++)
390 bnds.
grow(key_steps[i]);
397 for (
size_t i = 0; i < curve_keys_size; i++)
398 bnds.
grow_safe(curve_keys[i], curve_radius[i]);
400 if (use_motion_blur && curve_attr) {
401 size_t steps_size = curve_keys.size() * (motion_steps - 1);
404 for (
size_t i = 0; i < steps_size; i++)
427 for (
size_t i = 0; i < curve_keys.size(); i++) {
429 float radius = curve_radius[i] * scalar;
433 curve_radius[i] = radius;
436 tag_curve_keys_modified();
437 tag_curve_radius_modified();
439 if (apply_to_motion) {
444 size_t steps_size = curve_keys.size() * (motion_steps - 1);
447 for (
size_t i = 0; i < steps_size; i++) {
449 float radius = key_steps[i].w * scalar;
453 key_steps[i].w = radius;
464 size_t curve_keys_size = curve_keys.size();
467 if (curve_keys_size) {
468 float3 *keys_ptr = curve_keys.data();
469 float *radius_ptr = curve_radius.data();
471 for (
size_t i = 0; i < curve_keys_size; i++)
472 curve_key_co[i] =
make_float4(keys_ptr[i].
x, keys_ptr[i].
y, keys_ptr[i].
z, radius_ptr[i]);
481 for (
size_t i = 0; i < curve_num; i++) {
483 int shader_id = curve_shader[i];
484 Shader *shader = (shader_id < used_shaders.size()) ?
485 static_cast<Shader *
>(used_shaders[shader_id]) :
489 curves[i].shader_id = shader_id;
511 const int object_index,
514 int d_input_size = 0;
518 for (
int i = 0; i < num_curves; i++) {
520 const int num_segments =
curve.num_segments();
522 for (
int j = 0; j < num_segments + 1; j++) {
526 in.
u = (j < num_segments) ? 0.0f : 1.0f;
528 d_input_data[d_input_size++] = in;
537 bool &is_fully_opaque,
540 const int num_keys = d_output.
size();
541 const float *output_data = d_output.
data();
542 bool is_opaque =
true;
544 for (
int i = 0; i < num_keys; i++) {
545 shadow_transparency[i] = output_data[i];
546 if (shadow_transparency[i] > 0.0f) {
551 is_fully_opaque = is_opaque;
556 for (
const Node *
node : used_shaders) {
585 const bool attribute_exists = (attr !=
nullptr);
586 if (!attribute_exists) {
604 bool is_fully_opaque =
false;
611 if (is_fully_opaque) {
613 return attribute_exists;
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to curves
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Attribute * add(ustring name, TypeDesc type, AttributeElement element)
Attribute * find(ustring name) const
void remove(ustring name)
void resize(bool reserve_only=false)
void clear(bool preserve_voxel_data=false)
void get_uv_tiles(Geometry *geom, AttributePrimitive prim, unordered_set< int > &tiles) const
int motion_step(float time) const
bool has_motion_blur() const
virtual void clear(bool preserve_shaders=false)
void resize_curves(int numcurves, int numkeys)
void add_curve(int first_key, int shader)
Curve get_curve(size_t i) const
bool need_shadow_transparency()
void compute_bounds() override
void reserve_curves(int numcurves, int numkeys)
size_t curve_segment_offset
size_t num_curves() const
bool update_shadow_transparency(Device *device, Scene *scene, Progress &progress)
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
void copy_center_to_motion_step(const int motion_step)
void pack_curves(Scene *scene, float4 *curve_key_co, KernelCurve *curve, KernelCurveSegment *curve_segments)
CurveShapeType curve_shape
void clear(bool preserve_shaders=false) override
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
PrimitiveType primitive_type() const override
void add_curve_key(float3 loc, float radius)
void set_status(const string &status_, const string &substatus_="")
bool eval(const ShaderEvalType type, const int max_num_inputs, const int num_channels, const function< int(device_vector< KernelShaderEvalInput > &)> &fill_input, const function< void(device_vector< float > &)> &read_output)
int get_shader_id(Shader *shader, bool smooth=false)
bool has_surface_transparent
#define CCL_NAMESPACE_END
static void read_shader_output(float *shadow_transparency, bool &is_fully_opaque, const device_vector< float > &d_output)
static int fill_shader_input(const Hair *hair, const int object_index, device_vector< KernelShaderEvalInput > &d_input)
@ SHADER_EVAL_CURVE_SHADOW_TRANSPARENCY
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
#define PRIMITIVE_PACK_SEGMENT(type, segment)
@ PRIMITIVE_MOTION_CURVE_RIBBON
@ PRIMITIVE_MOTION_CURVE_THICK
@ ATTR_STD_MOTION_VERTEX_POSITION
@ ATTR_STD_SHADOW_TRANSPARENCY
ccl_device_inline float3 zero_float3()
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value)
Allocate a new IDProperty of type IDP_INT, set its name and value.
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, 3 > cross(const vec_base< T, 3 > &a, const vec_base< T, 3 > &b)
SocketIndexByIdentifierMap * map
#define SOCKET_POINT_ARRAY(name, ui_name, default_value,...)
#define SOCKET_FLOAT_ARRAY(name, ui_name, default_value,...)
#define SOCKET_INT_ARRAY(name, ui_name, default_value,...)
CCL_NAMESPACE_BEGIN void curvebounds(float *lower, float *upper, float3 *p, int dim)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
__forceinline bool valid() const
__forceinline void grow_safe(const float3 &pt)
__forceinline void grow(const float3 &pt)
void keys_for_step(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, size_t step, size_t k0, size_t k1, float4 r_keys[2]) const
void cardinal_motion_keys(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, float time, size_t k0, size_t k1, size_t k2, size_t k3, float4 r_keys[4]) const
void cardinal_keys_for_step(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, size_t step, size_t k0, size_t k1, size_t k2, size_t k3, float4 r_keys[4]) const
void motion_keys(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, float time, size_t k0, size_t k1, float4 r_keys[2]) const
void bounds_grow(const int k, const float3 *curve_keys, const float *curve_radius, BoundBox &bounds) const
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
vector< Object * > objects
ShaderManager * shader_manager
ccl_device_inline float4 float3_to_float4(const float3 a)
ccl_device_inline float3 float4_to_float3(const float4 a)
ccl_device_inline float __int_as_float(int i)