6 #include "integrator/shader_eval.h"
32 return norm / normlen;
38 const int object_index,
52 for (
int i = 0; i < num_triangles; i++) {
54 int shader_index = mesh_shaders[i];
55 Shader *shader = (shader_index < mesh_used_shaders.
size()) ?
56 static_cast<Shader *
>(mesh_used_shaders[shader_index]) :
63 for (
int j = 0; j < 3; j++) {
70 int object = object_index;
95 d_input_data[d_input_size++] = in;
112 const int num_motion_steps =
mesh->get_motion_steps();
115 const float *d_output_data = d_output.
data();
116 int d_output_index = 0;
120 for (
int i = 0; i < num_triangles; i++) {
122 int shader_index = mesh_shaders[i];
123 Shader *shader = (shader_index < mesh_used_shaders.
size()) ?
124 static_cast<Shader *
>(mesh_used_shaders[shader_index]) :
131 for (
int j = 0; j < 3; j++) {
135 d_output_data[d_output_index + 1],
136 d_output_data[d_output_index + 2]);
142 if (attr_mP !=
NULL) {
143 for (
int step = 0; step < num_motion_steps - 1; step++) {
160 const size_t num_verts =
mesh->verts.
size();
163 if (num_triangles == 0) {
191 unordered_set<int> stitch_keys;
192 for (pair<int, int> i :
mesh->vert_to_stitching_key_map) {
193 stitch_keys.insert(i.second);
196 typedef unordered_multimap<int, int>::iterator map_it_t;
198 for (
int key : stitch_keys) {
199 pair<map_it_t, map_it_t>
verts =
mesh->vert_stitching_map.equal_range(key);
205 int vert =
v->second;
229 bool need_recompute_vertex_normals =
false;
234 need_recompute_vertex_normals =
true;
239 if (need_recompute_vertex_normals) {
243 for (
size_t i = 0; i < num_triangles; i++) {
244 int shader_index =
mesh->shader[i];
246 static_cast<Shader *
>(
mesh->used_shaders[shader_index]) :
265 for (
size_t i = 0; i < num_triangles; i++) {
266 if (tri_has_true_disp[i]) {
267 for (
size_t j = 0; j < 3; j++) {
274 for (
size_t i = 0; i < num_triangles; i++) {
275 if (tri_has_true_disp[i]) {
276 for (
size_t j = 0; j < 3; j++) {
281 if (stitch_keys.size()) {
282 map_it_t key =
mesh->vert_to_stitching_key_map.find(vert);
284 if (key !=
mesh->vert_to_stitching_key_map.end()) {
285 pair<map_it_t, map_it_t>
verts =
mesh->vert_stitching_map.equal_range(key->second);
288 if (
v->second == vert) {
292 vN[
v->second] += fN[i];
303 for (
size_t i = 0; i < num_triangles; i++) {
304 if (tri_has_true_disp[i]) {
305 for (
size_t j = 0; j < 3; j++) {
314 vN[vert] = -vN[vert];
326 for (
int step = 0; step <
mesh->motion_steps - 1; step++) {
333 for (
size_t i = 0; i < num_triangles; i++) {
334 if (tri_has_true_disp[i]) {
335 for (
size_t j = 0; j < 3; j++) {
342 for (
size_t i = 0; i < num_triangles; i++) {
343 if (tri_has_true_disp[i]) {
344 for (
size_t j = 0; j < 3; j++) {
350 if (stitch_keys.size()) {
351 map_it_t key =
mesh->vert_to_stitching_key_map.find(vert);
353 if (key !=
mesh->vert_to_stitching_key_map.end()) {
354 pair<map_it_t, map_it_t>
verts =
mesh->vert_stitching_map.equal_range(
358 if (
v->second == vert) {
373 for (
size_t i = 0; i < num_triangles; i++) {
374 if (tri_has_true_disp[i]) {
375 for (
size_t j = 0; j < 3; j++) {
384 mN[vert] = -mN[vert];
_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
_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 v1
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
Attribute * find(ustring name) const
void remove(ustring name)
bool displace(Device *device, Scene *scene, Mesh *mesh, Progress &progress)
bool has_true_displacement() const
bool has_motion_blur() 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 function< int(device_vector< KernelShaderEvalInput > &)> &fill_input, const function< void(device_vector< float > &)> &read_output)
#define CCL_NAMESPACE_END
@ ATTR_STD_MOTION_VERTEX_NORMAL
@ ATTR_STD_MOTION_VERTEX_POSITION
ccl_device_inline float3 zero_float3()
static void read_shader_output(const Scene *scene, Mesh *mesh, const device_vector< float > &d_output)
static int fill_shader_input(const Scene *scene, const Mesh *mesh, const int object_index, device_vector< KernelShaderEvalInput > &d_input)
static CCL_NAMESPACE_BEGIN float3 compute_face_normal(const Mesh::Triangle &t, float3 *verts)
vec_base< T, 3 > cross(const vec_base< T, 3 > &a, const vec_base< T, 3 > &b)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
static MutableSpan< MVert > mesh_verts(Mesh &mesh)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
Triangle get_triangle(size_t i) const
size_t num_triangles() const
vector< Object * > objects
ccl_device_inline float ensure_finite(float v)