21 const size_t object_index,
31 const int num_verts = mesh_verts.
size();
35 for (
int i = 0; i < num_triangles; i++) {
37 const int shader_index = mesh_shaders[i];
38 Shader *shader = (shader_index < mesh_used_shaders.
size()) ?
39 static_cast<Shader *
>(mesh_used_shaders[shader_index]) :
46 for (
int j = 0; j < 3; j++) {
54 const int object = object_index;
80 d_input_data[d_input_size++] =
in;
96 const int num_verts = mesh_verts.
size();
97 const int num_motion_steps =
mesh->get_motion_steps();
100 const float *d_output_data = d_output.
data();
101 int d_output_index = 0;
105 for (
int i = 0; i < num_triangles; i++) {
107 const int shader_index = mesh_shaders[i];
108 Shader *shader = (shader_index < mesh_used_shaders.
size()) ?
109 static_cast<Shader *
>(mesh_used_shaders[shader_index]) :
116 for (
int j = 0; j < 3; j++) {
120 d_output_data[d_output_index + 1],
121 d_output_data[d_output_index + 2]);
126 mesh_verts[t.
v[j]] += off;
127 if (attr_mP !=
nullptr) {
128 for (
int step = 0;
step < num_motion_steps - 1;
step++) {
148 const size_t num_verts =
mesh->verts.size();
151 if (num_triangles == 0) {
170 if (!shader_eval.
eval(
175 return fill_shader_input(scene, mesh, object_index, d_input);
178 read_shader_output(scene, mesh, d_output);
187 bool need_recompute_vertex_normals =
false;
192 need_recompute_vertex_normals =
true;
197 if (need_recompute_vertex_normals) {
201 for (
size_t i = 0; i < num_triangles; i++) {
202 const int shader_index =
mesh->shader[i];
203 Shader *shader = (shader_index <
mesh->used_shaders.size()) ?
204 static_cast<Shader *
>(
mesh->used_shaders[shader_index]) :
220 for (
size_t i = 0; i < num_triangles; i++) {
221 if (tri_has_true_disp[i]) {
223 for (
size_t j = 0; j < 3; j++) {
230 const float3 *verts_data =
mesh->get_verts().data();
231 for (
size_t i = 0; i < num_triangles; i++) {
232 if (tri_has_true_disp[i]) {
236 for (
size_t j = 0; j < 3; j++) {
237 const int vert = triangle.
v[j];
246 for (
size_t i = 0; i < num_triangles; i++) {
247 if (tri_has_true_disp[i]) {
249 for (
size_t j = 0; j < 3; j++) {
250 const int vert = triangle.
v[j];
258 vN[vert] = -vN[vert];
278 for (
size_t i = 0; i < num_triangles; i++) {
279 if (tri_has_true_disp[i]) {
281 for (
size_t j = 0; j < 3; j++) {
288 for (
size_t i = 0; i < num_triangles; i++) {
289 if (tri_has_true_disp[i]) {
293 for (
size_t j = 0; j < 3; j++) {
294 const int vert = triangle.
v[j];
303 for (
size_t i = 0; i < num_triangles; i++) {
304 if (tri_has_true_disp[i]) {
306 for (
size_t j = 0; j < 3; j++) {
307 const int vert = triangle.
v[j];
315 mN[vert] = -mN[vert];
ATTR_WARN_UNUSED_RESULT const BMVert * v
Attribute * find(ustring name) const
bool displace(Device *device, Scene *scene, Mesh *mesh, Progress &progress)
bool has_true_displacement() const
bool transform_negative_scaled
void set_status(const string &status_, const string &substatus_="")
bool eval(const ShaderEvalType type, const int max_num_inputs, const int num_channels, const std::function< int(device_vector< KernelShaderEvalInput > &)> &fill_input, const std::function< void(device_vector< float > &)> &read_output)
#define CCL_NAMESPACE_END
VecBase< float, D > normalize(VecOp< float, D >) RET
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
@ ATTR_STD_MOTION_VERTEX_NORMAL
@ ATTR_STD_MOTION_VERTEX_POSITION
ccl_device_inline float ensure_finite(const float v)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
static void read_shader_output(const Scene *scene, Mesh *mesh, const device_vector< float > &d_output)
static CCL_NAMESPACE_BEGIN int fill_shader_input(const Scene *scene, const Mesh *mesh, const size_t object_index, device_vector< KernelShaderEvalInput > &d_input)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
float3 compute_normal(const float3 *verts) const
void add_undisplaced(Scene *scene)
bool has_motion_blur() const override
size_t num_triangles() const
Triangle get_triangle(const size_t i) const
unique_ptr_vector< Object > objects