21 const size_t object_index,
27 const array<int> &mesh_shaders = mesh->get_shader();
28 const array<Node *> &mesh_used_shaders = mesh->get_used_shaders();
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;
92 const array<int> &mesh_shaders = mesh->get_shader();
93 const array<Node *> &mesh_used_shaders = mesh->get_used_shaders();
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) {
155 const string msg =
string_printf(
"Computing Displacement %s", mesh->
name.c_str());
162 if (scene->
objects[
i]->get_geometry() == mesh) {
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;
189 for (
Node *node : mesh->get_used_shaders()) {
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];
271 for (
int step = 0;
step < mesh->motion_steps - 1;
step++) {
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
void update_tangents(Scene *scene, bool undisplaced)
unique_ptr_vector< Object > objects