diff options
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/bake.cpp | 126 | ||||
-rw-r--r-- | intern/cycles/render/bake.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/camera.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/render/camera.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/image.cpp | 3 | ||||
-rw-r--r-- | intern/cycles/render/integrator.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/render/light.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/mesh.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/render/mesh.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/object.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/render/osl.cpp | 15 |
11 files changed, 109 insertions, 78 deletions
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp index d7da63dea8a..5723a22dd84 100644 --- a/intern/cycles/render/bake.cpp +++ b/intern/cycles/render/bake.cpp @@ -95,6 +95,7 @@ BakeManager::BakeManager() m_bake_data = NULL; m_is_baking = false; need_update = true; + m_shader_limit = 512 * 512; } BakeManager::~BakeManager() @@ -119,74 +120,99 @@ BakeData *BakeManager::init(const int object, const size_t tri_offset, const siz return m_bake_data; } +void BakeManager::set_shader_limit(const size_t x, const size_t y) +{ + m_shader_limit = x * y; + m_shader_limit = (size_t)pow(2, ceil(log(m_shader_limit)/log(2))); +} + bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress, ShaderEvalType shader_type, BakeData *bake_data, float result[]) { - size_t limit = bake_data->size(); + size_t num_pixels = bake_data->size(); - /* setup input for device task */ - device_vector<uint4> d_input; - uint4 *d_input_data = d_input.resize(limit * 2); - size_t d_input_size = 0; + progress.reset_sample(); + this->num_parts = 0; - for(size_t i = 0; i < limit; i++) { - d_input_data[d_input_size++] = bake_data->data(i); - d_input_data[d_input_size++] = bake_data->differentials(i); - } + /* calculate the total parts for the progress bar */ + for(size_t shader_offset = 0; shader_offset < num_pixels; shader_offset += m_shader_limit) { + size_t shader_size = (size_t)fminf(num_pixels - shader_offset, m_shader_limit); - if(d_input_size == 0) - return false; + DeviceTask task(DeviceTask::SHADER); + task.shader_w = shader_size; - /* run device task */ - device_vector<float4> d_output; - d_output.resize(limit); + this->num_parts += device->get_split_task_count(task); + } - /* needs to be up to data for attribute access */ - device->const_copy_to("__data", &dscene->data, sizeof(dscene->data)); + this->num_samples = is_aa_pass(shader_type)? scene->integrator->aa_samples : 1; - device->mem_alloc(d_input, MEM_READ_ONLY); - device->mem_copy_to(d_input); - device->mem_alloc(d_output, MEM_WRITE_ONLY); + for(size_t shader_offset = 0; shader_offset < num_pixels; shader_offset += m_shader_limit) { + size_t shader_size = (size_t)fminf(num_pixels - shader_offset, m_shader_limit); - DeviceTask task(DeviceTask::SHADER); - task.shader_input = d_input.device_pointer; - task.shader_output = d_output.device_pointer; - task.shader_eval_type = shader_type; - task.shader_x = 0; - task.shader_w = d_output.size(); - task.num_samples = is_aa_pass(shader_type)? scene->integrator->aa_samples: 1; - task.get_cancel = function_bind(&Progress::get_cancel, &progress); - task.update_progress_sample = function_bind(&Progress::increment_sample_update, &progress); + /* setup input for device task */ + device_vector<uint4> d_input; + uint4 *d_input_data = d_input.resize(shader_size * 2); + size_t d_input_size = 0; - this->num_parts = device->get_split_task_count(task); - this->num_samples = task.num_samples; + for(size_t i = shader_offset; i < (shader_offset + shader_size); i++) { + d_input_data[d_input_size++] = bake_data->data(i); + d_input_data[d_input_size++] = bake_data->differentials(i); + } - device->task_add(task); - device->task_wait(); + if(d_input_size == 0) { + m_is_baking = false; + return false; + } + + /* run device task */ + device_vector<float4> d_output; + d_output.resize(shader_size); + + /* needs to be up to data for attribute access */ + device->const_copy_to("__data", &dscene->data, sizeof(dscene->data)); + + device->mem_alloc(d_input, MEM_READ_ONLY); + device->mem_copy_to(d_input); + device->mem_alloc(d_output, MEM_WRITE_ONLY); + + DeviceTask task(DeviceTask::SHADER); + task.shader_input = d_input.device_pointer; + task.shader_output = d_output.device_pointer; + task.shader_eval_type = shader_type; + task.shader_x = 0; + task.offset = shader_offset; + task.shader_w = d_output.size(); + task.num_samples = this->num_samples; + task.get_cancel = function_bind(&Progress::get_cancel, &progress); + task.update_progress_sample = function_bind(&Progress::increment_sample_update, &progress); + + device->task_add(task); + device->task_wait(); + + if(progress.get_cancel()) { + device->mem_free(d_input); + device->mem_free(d_output); + m_is_baking = false; + return false; + } - if(progress.get_cancel()) { + device->mem_copy_from(d_output, 0, 1, d_output.size(), sizeof(float4)); device->mem_free(d_input); device->mem_free(d_output); - m_is_baking = false; - return false; - } - - device->mem_copy_from(d_output, 0, 1, d_output.size(), sizeof(float4)); - device->mem_free(d_input); - device->mem_free(d_output); - /* read result */ - int k = 0; + /* read result */ + int k = 0; - float4 *offset = (float4*)d_output.data_pointer; + float4 *offset = (float4*)d_output.data_pointer; - size_t depth = 4; - for(size_t i = 0; i < limit; i++) { - size_t index = i * depth; - float4 out = offset[k++]; + size_t depth = 4; + for(size_t i=shader_offset; i < (shader_offset + shader_size); i++) { + size_t index = i * depth; + float4 out = offset[k++]; - if(bake_data->is_valid(i)) { - for(size_t j=0; j < 4; j++) { - result[index + j] = out[j]; + if(bake_data->is_valid(i)) { + for(size_t j=0; j < 4; j++) { + result[index + j] = out[j]; + } } } } diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h index 652420c2e19..186fbbeea4d 100644 --- a/intern/cycles/render/bake.h +++ b/intern/cycles/render/bake.h @@ -60,6 +60,8 @@ public: BakeData *init(const int object, const size_t tri_offset, const size_t num_pixels); + void set_shader_limit(const size_t x, const size_t y); + bool bake(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress, ShaderEvalType shader_type, BakeData *bake_data, float result[]); void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); @@ -76,6 +78,7 @@ public: private: BakeData *m_bake_data; bool m_is_baking; + size_t m_shader_limit; }; CCL_NAMESPACE_END diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 8659fe4f7a3..bb0fec759a9 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -38,6 +38,8 @@ Camera::Camera() motion.post = transform_identity(); use_motion = false; + aperture_ratio = 1.0f; + type = CAMERA_PERSPECTIVE; panorama_type = PANORAMA_EQUIRECTANGULAR; fisheye_fov = M_PI_F; @@ -241,6 +243,9 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene) /* type */ kcam->type = type; + /* anamorphic lens bokeh */ + kcam->inv_aperture_ratio = 1.0f / aperture_ratio; + /* panorama */ kcam->panorama_type = panorama_type; kcam->fisheye_fov = fisheye_fov; @@ -291,6 +296,7 @@ bool Camera::modified(const Camera& cam) (viewplane == cam.viewplane) && (border == cam.border) && (matrix == cam.matrix) && + (aperture_ratio == cam.aperture_ratio) && (panorama_type == cam.panorama_type) && (fisheye_fov == cam.fisheye_fov) && (fisheye_lens == cam.fisheye_lens)); diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h index c28670bc55f..50889968a90 100644 --- a/intern/cycles/render/camera.h +++ b/intern/cycles/render/camera.h @@ -54,6 +54,9 @@ public: float fisheye_fov; float fisheye_lens; + /* anamorphic lens bokeh */ + float aperture_ratio; + /* sensor */ float sensorwidth; float sensorheight; diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index f84396ab6a1..076cc3d8b63 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -135,6 +135,7 @@ bool ImageManager::is_float_image(const string& filename, void *builtin_data, bo (colorspace == "" && (strcmp(in->format_name(), "png") == 0 || strcmp(in->format_name(), "tiff") == 0 || + strcmp(in->format_name(), "dpx") == 0 || strcmp(in->format_name(), "jpeg2000") == 0))); } else { @@ -332,7 +333,7 @@ void ImageManager::tag_reload_image(const string& filename, void *builtin_data, /* see if it's in a float texture slot */ for(slot = 0; slot < float_images.size(); slot++) { if(float_images[slot] && image_equals(float_images[slot], filename, builtin_data, interpolation)) { - images[slot]->need_load = true; + float_images[slot]->need_load = true; break; } } diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp index 4a8b490b1ad..32e887d48f1 100644 --- a/intern/cycles/render/integrator.cpp +++ b/intern/cycles/render/integrator.cpp @@ -86,11 +86,7 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1; kintegrator->max_glossy_bounce = max_glossy_bounce + 1; kintegrator->max_transmission_bounce = max_transmission_bounce + 1; - - if(kintegrator->use_volumes) - kintegrator->max_volume_bounce = max_volume_bounce + 1; - else - kintegrator->max_volume_bounce = 1; + kintegrator->max_volume_bounce = max_volume_bounce + 1; kintegrator->transparent_max_bounce = transparent_max_bounce + 1; kintegrator->transparent_min_bounce = transparent_min_bounce + 1; diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 9a0a7ead696..94ab82a600e 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -206,8 +206,10 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen } /* skip motion blurred deforming meshes, not supported yet */ - if(mesh->has_motion_blur()) + if(mesh->has_motion_blur()) { + j++; continue; + } /* skip if we have no emission shaders */ foreach(uint sindex, mesh->used_shaders) { diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 295c934537a..8299cd02fef 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -132,6 +132,7 @@ void Mesh::clear() transform_applied = false; transform_negative_scaled = false; transform_normal = transform_identity(); + geometry_synced = false; } int Mesh::split_vertex(int vertex) @@ -341,13 +342,6 @@ void Mesh::add_vertex_normals() vN[i] = -vN[i]; } } - else if(flip) { - Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL); - float3 *vN = attr_vN->data_float3(); - for(size_t i = 0; i < verts_size; i++) { - vN[i] = -vN[i]; - } - } /* motion vertex normals */ Attribute *attr_mP = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); @@ -382,14 +376,6 @@ void Mesh::add_vertex_normals() } } } - else if(has_motion_blur() && attr_mN && flip) { - for(int step = 0; step < motion_steps - 1; step++) { - float3 *mN = attr_mN->data_float3() + step*verts.size(); - for(size_t i = 0; i < verts_size; i++) { - mN[i] = -mN[i]; - } - } - } } void Mesh::pack_normals(Scene *scene, float *tri_shader, float4 *vnormal) diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h index 5ee774bacc1..d45905611fa 100644 --- a/intern/cycles/render/mesh.h +++ b/intern/cycles/render/mesh.h @@ -71,6 +71,9 @@ public: ustring name; /* Mesh Data */ + bool geometry_synced; /* used to distinguish meshes with no verts + and meshed for which geometry is not created */ + vector<float3> verts; vector<Triangle> triangles; vector<uint> shader; diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 027bfd71931..1f148d34ea6 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -449,6 +449,8 @@ void ObjectManager::apply_static_transforms(DeviceScene *dscene, Scene *scene, u } object_flag[i] |= SD_TRANSFORM_APPLIED; + if(object->mesh->transform_negative_scaled) + object_flag[i] |= SD_NEGATIVE_SCALE_APPLIED; } else have_instancing = true; diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index fa7a242e77b..f57e16471a1 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -248,24 +248,27 @@ void OSLShaderManager::shading_system_free() bool OSLShaderManager::osl_compile(const string& inputfile, const string& outputfile) { -#if OSL_LIBRARY_VERSION_CODE >= 10500 - vector<string_view> options; -#else - vector<string> options; +#if OSL_LIBRARY_VERSION_CODE < 10500 + typedef string string_view; #endif + + vector<string_view> options; string stdosl_path; + string shader_path = path_get("shader"); /* specify output file name */ options.push_back("-o"); options.push_back(outputfile); /* specify standard include path */ - options.push_back("-I" + path_get("shader")); + options.push_back("-I"); + options.push_back(shader_path); + stdosl_path = path_get("shader/stdosl.h"); /* compile */ OSL::OSLCompiler *compiler = OSL::OSLCompiler::create(); - bool ok = compiler->compile(inputfile, options, stdosl_path); + bool ok = compiler->compile(string_view(inputfile), options, string_view(stdosl_path)); delete compiler; return ok; |