39 const size_t num_steps,
45 const size_t max_step = num_steps - 1;
46 const size_t step =
min((
size_t)(time * max_step), max_step - 1);
47 const float t = time * max_step -
step;
54 return (1.0f - t) * curr_key + t * next_key;
61 const size_t num_steps,
65 const size_t center_step = ((num_steps - 1) / 2);
66 if (
step == center_step) {
71 if (
step > center_step) {
75 return point_steps[offset + p];
83 "pointcloud", create,
NodeType::NONE, Geometry::get_node_base_type());
98 points.resize(numpoints);
99 radius.resize(numpoints);
100 shader.resize(numpoints);
103 tag_points_modified();
104 tag_radius_modified();
105 tag_shader_modified();
110 points.reserve(numpoints);
111 radius.reserve(numpoints);
112 shader.reserve(numpoints);
130 tag_points_modified();
131 tag_radius_modified();
132 tag_shader_modified();
137 points.push_back_reserved(co);
138 radius.push_back_reserved(r);
139 shader.push_back_reserved(shader_index);
141 tag_points_modified();
142 tag_radius_modified();
143 tag_shader_modified();
150 float3 *points_data = points.data();
151 const size_t numpoints = points.size();
152 float *radius_data = radius.data();
155 for (
int i = 0;
i < numpoints;
i++) {
157 const float r = radius_data[
i];
182 const size_t numpoints = points.size();
185 for (
size_t i = 0;
i < numpoints;
i++) {
186 bnds.
grow(points[
i], radius[
i]);
190 if (use_motion_blur && attr) {
191 const size_t steps_size = points.size() * (motion_steps - 1);
194 for (
size_t i = 0;
i < steps_size;
i++) {
203 for (
size_t i = 0;
i < numpoints;
i++) {
207 if (use_motion_blur && attr) {
208 const size_t steps_size = points.size() * (motion_steps - 1);
211 for (
size_t i = 0;
i < steps_size;
i++) {
235 for (
size_t i = 0;
i < points.size();
i++) {
237 const float r = radius[
i] * scalar;
245 if (apply_to_motion) {
250 const size_t steps_size = points.size() * (motion_steps - 1);
253 for (
size_t i = 0;
i < steps_size;
i++) {
255 const float radius = point_steps[
i].
w * scalar;
260 point_steps[
i].
w = radius;
268 const size_t numpoints = points.size();
269 float3 *points_data = points.data();
270 float *radius_data = radius.data();
271 int *shader_data = shader.data();
273 for (
size_t i = 0;
i < numpoints;
i++) {
278 uint last_shader = -1;
279 for (
size_t i = 0;
i < numpoints;
i++) {
280 if (last_shader != shader_data[
i]) {
281 last_shader = shader_data[
i];
282 Shader *shader = (last_shader < used_shaders.size()) ?
283 static_cast<Shader *
>(used_shaders[last_shader]) :
287 packed_shader[
i] = shader_id;
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
int motion_step(const float time) const
virtual bool has_motion_blur() const
Geometry(const NodeType *node_type, const Type type)
virtual void clear(bool preserve_shaders=false)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define CCL_NAMESPACE_END
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
@ ATTR_STD_MOTION_VERTEX_POSITION
#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,...)
#define NODE_DEFINE(structname)
void get_uv_tiles(Geometry *geom, AttributePrimitive prim, unordered_set< int > &tiles) const
__forceinline bool valid() const
__forceinline void grow_safe(const float3 &pt)
__forceinline void grow(const float3 &pt)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=nullptr)
float4 point_for_step(const float3 *points, const float *radius, const float4 *point_steps, const size_t num_points, const size_t num_steps, const size_t step, size_t p) const
void bounds_grow(const float3 *points, const float *radius, BoundBox &bounds) const
float4 motion_key(const float3 *points, const float *radius, const float4 *point_steps, const size_t num_points, const size_t num_steps, const float time, size_t p) const
void pack(Scene *scene, float4 *packed_points, uint *packed_shader)
void clear(const bool preserve_shaders=false) override
void resize(const int numpoints)
void add_point(const float3 co, const float radius, const int shader=0)
void reserve(const int numpoints)
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
size_t num_points() const
void copy_center_to_motion_step(const int motion_step)
void compute_bounds() override
PrimitiveType primitive_type() const override
unique_ptr< ShaderManager > shader_manager