Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/render/bake.cpp
| Show All 30 Lines | static int aa_samples(Scene *scene, Object *object, ShaderEvalType type) | ||||
| if (type == SHADER_EVAL_UV || type == SHADER_EVAL_ROUGHNESS) { | if (type == SHADER_EVAL_UV || type == SHADER_EVAL_ROUGHNESS) { | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (type == SHADER_EVAL_NORMAL) { | else if (type == SHADER_EVAL_NORMAL) { | ||||
| /* Only antialias normal if mesh has bump mapping. */ | /* Only antialias normal if mesh has bump mapping. */ | ||||
| if (object->get_geometry()) { | if (object->get_geometry()) { | ||||
| foreach (Node *node, object->get_geometry()->get_used_shaders()) { | foreach (Node *node, object->get_geometry()->get_used_shaders()) { | ||||
| Shader *shader = static_cast<Shader *>(node); | Shader *shader = static_cast<Shader *>(node); | ||||
| if (shader->has_bump) { | if (shader->get_has_bump()) { | ||||
| return scene->integrator->get_aa_samples(); | return scene->get_integrator()->get_aa_samples(); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else { | else { | ||||
| return scene->integrator->get_aa_samples(); | return scene->get_integrator()->get_aa_samples(); | ||||
| } | } | ||||
| } | } | ||||
| /* Keep it synced with kernel_bake.h logic */ | /* Keep it synced with kernel_bake.h logic */ | ||||
| static int shader_type_to_pass_filter(ShaderEvalType type, int pass_filter) | static int shader_type_to_pass_filter(ShaderEvalType type, int pass_filter) | ||||
| { | { | ||||
| const int component_flags = pass_filter & | const int component_flags = pass_filter & | ||||
| (BAKE_FILTER_DIRECT | BAKE_FILTER_INDIRECT | BAKE_FILTER_COLOR); | (BAKE_FILTER_DIRECT | BAKE_FILTER_INDIRECT | BAKE_FILTER_COLOR); | ||||
| Show All 37 Lines | void BakeManager::set(Scene *scene, | ||||
| const std::string &object_name_, | const std::string &object_name_, | ||||
| ShaderEvalType type_, | ShaderEvalType type_, | ||||
| int pass_filter_) | int pass_filter_) | ||||
| { | { | ||||
| object_name = object_name_; | object_name = object_name_; | ||||
| type = type_; | type = type_; | ||||
| pass_filter = shader_type_to_pass_filter(type_, pass_filter_); | pass_filter = shader_type_to_pass_filter(type_, pass_filter_); | ||||
| Pass::add(PASS_BAKE_PRIMITIVE, scene->passes); | Pass::add(PASS_BAKE_PRIMITIVE, scene->get_passes()); | ||||
| Pass::add(PASS_BAKE_DIFFERENTIAL, scene->passes); | Pass::add(PASS_BAKE_DIFFERENTIAL, scene->get_passes()); | ||||
| if (type == SHADER_EVAL_UV) { | if (type == SHADER_EVAL_UV) { | ||||
| /* force UV to be available */ | /* force UV to be available */ | ||||
| Pass::add(PASS_UV, scene->passes); | Pass::add(PASS_UV, scene->get_passes()); | ||||
| } | } | ||||
| /* force use_light_pass to be true if we bake more than just colors */ | /* force use_light_pass to be true if we bake more than just colors */ | ||||
| if (pass_filter & ~BAKE_FILTER_COLOR) { | if (pass_filter & ~BAKE_FILTER_COLOR) { | ||||
| Pass::add(PASS_LIGHT, scene->passes); | Pass::add(PASS_LIGHT, scene->get_passes()); | ||||
| } | } | ||||
| /* create device and update scene */ | /* create device and update scene */ | ||||
| scene->film->tag_modified(); | scene->get_film()->tag_modified(); | ||||
| scene->integrator->tag_update(scene); | scene->get_integrator()->tag_update(scene); | ||||
| need_update = true; | need_update = true; | ||||
| } | } | ||||
| void BakeManager::device_update(Device * /*device*/, | void BakeManager::device_update(Device * /*device*/, | ||||
| DeviceScene *dscene, | DeviceScene *dscene, | ||||
| Scene *scene, | Scene *scene, | ||||
| Progress & /* progress */) | Progress & /* progress */) | ||||
| { | { | ||||
| if (!need_update) | if (!need_update) | ||||
| return; | return; | ||||
| scoped_callback_timer timer([scene](double time) { | scoped_callback_timer timer([scene](double time) { | ||||
| if (scene->update_stats) { | if (scene->get_update_stats()) { | ||||
| scene->update_stats->bake.times.add_entry({"device_update", time}); | scene->get_update_stats()->bake.times.add_entry({"device_update", time}); | ||||
| } | } | ||||
| }); | }); | ||||
| KernelIntegrator *kintegrator = &dscene->data.integrator; | KernelIntegrator *kintegrator = &dscene->data.integrator; | ||||
| KernelBake *kbake = &dscene->data.bake; | KernelBake *kbake = &dscene->data.bake; | ||||
| kbake->type = type; | kbake->type = type; | ||||
| kbake->pass_filter = pass_filter; | kbake->pass_filter = pass_filter; | ||||
| int object_index = 0; | int object_index = 0; | ||||
| foreach (Object *object, scene->objects) { | foreach (Object *object, scene->get_objects()) { | ||||
| const Geometry *geom = object->get_geometry(); | const Geometry *geom = object->get_geometry(); | ||||
| if (object->name == object_name && geom->geometry_type == Geometry::MESH) { | if (object->get_name() == object_name && geom->is_mesh()) { | ||||
| kbake->object_index = object_index; | kbake->object_index = object_index; | ||||
| kbake->tri_offset = geom->prim_offset; | kbake->tri_offset = geom->get_prim_offset(); | ||||
| kintegrator->aa_samples = aa_samples(scene, object, type); | kintegrator->aa_samples = aa_samples(scene, object, type); | ||||
| break; | break; | ||||
| } | } | ||||
| object_index++; | object_index++; | ||||
| } | } | ||||
| need_update = false; | need_update = false; | ||||
| } | } | ||||
| void BakeManager::device_free(Device * /*device*/, DeviceScene * /*dscene*/) | void BakeManager::device_free(Device * /*device*/, DeviceScene * /*dscene*/) | ||||
| { | { | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||