Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/scene/osl.cpp
| Show First 20 Lines • Show All 131 Lines • ▼ Show 20 Lines | device->foreach_device( | ||||
| OSLGlobals *og = (OSLGlobals *)sub_device->get_cpu_osl_memory(); | OSLGlobals *og = (OSLGlobals *)sub_device->get_cpu_osl_memory(); | ||||
| OSL::ShadingSystem *ss = ss_shared[sub_device->info.type]; | OSL::ShadingSystem *ss = ss_shared[sub_device->info.type]; | ||||
| OSLCompiler compiler(this, ss, scene); | OSLCompiler compiler(this, ss, scene); | ||||
| compiler.background = background; | compiler.background = background; | ||||
| compiler.compile(og, shader); | compiler.compile(og, shader); | ||||
| }); | }); | ||||
| if (shader->get_use_mis() && shader->has_surface_emission) | if (shader->emission_sampling != EMISSION_SAMPLING_NONE) | ||||
| scene->light_manager->tag_update(scene, LightManager::SHADER_COMPILED); | scene->light_manager->tag_update(scene, LightManager::SHADER_COMPILED); | ||||
| } | } | ||||
| /* setup shader engine */ | /* setup shader engine */ | ||||
| int background_id = scene->shader_manager->get_shader_id(background_shader); | int background_id = scene->shader_manager->get_shader_id(background_shader); | ||||
| device->foreach_device([background_id](Device *sub_device) { | device->foreach_device([background_id](Device *sub_device) { | ||||
| OSLGlobals *og = (OSLGlobals *)sub_device->get_cpu_osl_memory(); | OSLGlobals *og = (OSLGlobals *)sub_device->get_cpu_osl_memory(); | ||||
| ▲ Show 20 Lines • Show All 665 Lines • ▼ Show 20 Lines | foreach (ShaderInput *input, node->inputs) { | ||||
| } | } | ||||
| } | } | ||||
| /* test if we shader contains specific closures */ | /* test if we shader contains specific closures */ | ||||
| OSLShaderInfo *info = manager->shader_loaded_info(name); | OSLShaderInfo *info = manager->shader_loaded_info(name); | ||||
| if (current_type == SHADER_TYPE_SURFACE) { | if (current_type == SHADER_TYPE_SURFACE) { | ||||
| if (info) { | if (info) { | ||||
| if (info->has_surface_emission) | if (info->has_surface_emission && node->special_type == SHADER_SPECIAL_TYPE_OSL) { | ||||
| current_shader->has_surface_emission = true; | /* Will be used by Shader::estimate_emission. */ | ||||
| OSLNode *oslnode = static_cast<OSLNode *>(node); | |||||
| oslnode->has_emission = true; | |||||
| } | |||||
| if (info->has_surface_transparent) | if (info->has_surface_transparent) | ||||
| current_shader->has_surface_transparent = true; | current_shader->has_surface_transparent = true; | ||||
| if (info->has_surface_bssrdf) { | if (info->has_surface_bssrdf) { | ||||
| current_shader->has_surface_bssrdf = true; | current_shader->has_surface_bssrdf = true; | ||||
| current_shader->has_bssrdf_bump = true; /* can't detect yet */ | current_shader->has_bssrdf_bump = true; /* can't detect yet */ | ||||
| } | } | ||||
| current_shader->has_bump = true; /* can't detect yet */ | current_shader->has_bump = true; /* can't detect yet */ | ||||
| current_shader->has_surface_raytrace = true; /* can't detect yet */ | current_shader->has_surface_raytrace = true; /* can't detect yet */ | ||||
| ▲ Show 20 Lines • Show All 283 Lines • ▼ Show 20 Lines | foreach (ShaderNode *node, nodes) { | ||||
| if (input->link && done.find(input->link->parent) == done.end()) | if (input->link && done.find(input->link->parent) == done.end()) | ||||
| inputs_done = false; | inputs_done = false; | ||||
| if (inputs_done) { | if (inputs_done) { | ||||
| node->compile(*this); | node->compile(*this); | ||||
| done.insert(node); | done.insert(node); | ||||
| if (current_type == SHADER_TYPE_SURFACE) { | if (current_type == SHADER_TYPE_SURFACE) { | ||||
| if (node->has_surface_emission()) | |||||
| current_shader->has_surface_emission = true; | |||||
| if (node->has_surface_transparent()) | if (node->has_surface_transparent()) | ||||
| current_shader->has_surface_transparent = true; | current_shader->has_surface_transparent = true; | ||||
| if (node->get_feature() & KERNEL_FEATURE_NODE_RAYTRACE) | if (node->get_feature() & KERNEL_FEATURE_NODE_RAYTRACE) | ||||
| current_shader->has_surface_raytrace = true; | current_shader->has_surface_raytrace = true; | ||||
| if (node->has_spatial_varying()) | if (node->has_spatial_varying()) | ||||
| current_shader->has_surface_spatial_varying = true; | current_shader->has_surface_spatial_varying = true; | ||||
| if (node->has_surface_bssrdf()) { | if (node->has_surface_bssrdf()) { | ||||
| current_shader->has_surface_bssrdf = true; | current_shader->has_surface_bssrdf = true; | ||||
| ▲ Show 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | if (shader->is_modified()) { | ||||
| shader->graph->finalize(scene, | shader->graph->finalize(scene, | ||||
| has_bump, | has_bump, | ||||
| shader->has_integrator_dependency, | shader->has_integrator_dependency, | ||||
| shader->get_displacement_method() == DISPLACE_BOTH); | shader->get_displacement_method() == DISPLACE_BOTH); | ||||
| current_shader = shader; | current_shader = shader; | ||||
| shader->has_surface = false; | shader->has_surface = false; | ||||
| shader->has_surface_emission = false; | |||||
| shader->has_surface_transparent = false; | shader->has_surface_transparent = false; | ||||
| shader->has_surface_bssrdf = false; | shader->has_surface_bssrdf = false; | ||||
| shader->has_bump = has_bump; | shader->has_bump = has_bump; | ||||
| shader->has_bssrdf_bump = has_bump; | shader->has_bssrdf_bump = has_bump; | ||||
| shader->has_volume = false; | shader->has_volume = false; | ||||
| shader->has_displacement = false; | shader->has_displacement = false; | ||||
| shader->has_surface_spatial_varying = false; | shader->has_surface_spatial_varying = false; | ||||
| shader->has_volume_spatial_varying = false; | shader->has_volume_spatial_varying = false; | ||||
| Show All 26 Lines | if (shader->is_modified()) { | ||||
| /* generate displacement shader */ | /* generate displacement shader */ | ||||
| if (shader->reference_count() && graph && output->input("Displacement")->link) { | if (shader->reference_count() && graph && output->input("Displacement")->link) { | ||||
| shader->osl_displacement_ref = compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT); | shader->osl_displacement_ref = compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT); | ||||
| shader->has_displacement = true; | shader->has_displacement = true; | ||||
| } | } | ||||
| else | else | ||||
| shader->osl_displacement_ref = OSL::ShaderGroupRef(); | shader->osl_displacement_ref = OSL::ShaderGroupRef(); | ||||
| /* Estimate emission for MIS. */ | |||||
| shader->estimate_emission(); | |||||
| } | } | ||||
| /* push state to array for lookup */ | /* push state to array for lookup */ | ||||
| og->surface_state.push_back(shader->osl_surface_ref); | og->surface_state.push_back(shader->osl_surface_ref); | ||||
| og->volume_state.push_back(shader->osl_volume_ref); | og->volume_state.push_back(shader->osl_volume_ref); | ||||
| og->displacement_state.push_back(shader->osl_displacement_ref); | og->displacement_state.push_back(shader->osl_displacement_ref); | ||||
| og->bump_state.push_back(shader->osl_surface_bump_ref); | og->bump_state.push_back(shader->osl_surface_bump_ref); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 102 Lines • Show Last 20 Lines | |||||