<div dir="ltr">Hi,<br><br>I&#39;m creating a Cycles exporter, got 1 problem &quot;pretty much a confusion issue&quot;, about the background and sample as light.<br><br>so here are the focused functions:<br><br><div>void BlenderSync::sync_world(bool update_all)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Background *background = scene-&gt;background;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Background prevbackground = *background;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>BL::World b_world = b_scene.world();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(world_recalc || update_all || b_world.ptr.data != world_map) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Shader *shader = scene-&gt;shaders[scene-&gt;default_background];</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>ShaderGraph *graph = new ShaderGraph();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>/* create nodes */</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(b_world &amp;&amp; b_world.use_nodes() &amp;&amp; b_world.node_tree()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>BL::ShaderNodeTree b_ntree(b_world.node_tree());</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>add_nodes(scene, b_engine, b_data, b_scene, graph, b_ntree);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>/* volume */</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>PointerRNA cworld = RNA_pointer_get(&amp;b_world.ptr, &quot;cycles&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>shader-&gt;heterogeneous_volume = !get_boolean(cworld, &quot;homogeneous_volume&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>shader-&gt;volume_sampling_method = (VolumeSampling)RNA_enum_get(&amp;cworld, &quot;volume_sampling&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>shader-&gt;volume_interpolation_method = (VolumeInterpolation)RNA_enum_get(&amp;cworld, &quot;volume_interpolation&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>else if(b_world) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>ShaderNode *closure, *out;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>closure = graph-&gt;add(new BackgroundNode());</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>closure-&gt;input(&quot;Color&quot;)-&gt;value = get_float3(b_world.horizon_color());</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>out = graph-&gt;output();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>graph-&gt;connect(closure-&gt;output(&quot;Background&quot;), out-&gt;input(&quot;Surface&quot;));</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(b_world) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>/* AO */</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>BL::WorldLighting b_light = b_world.light_settings();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if(b_light.use_ambient_occlusion())</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>background-&gt;ao_factor = b_light.ao_factor();</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>else</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>background-&gt;ao_factor = 0.0f;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>background-&gt;ao_distance = b_light.distance();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>/* visibility */</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>PointerRNA cvisibility = RNA_pointer_get(&amp;b_world.ptr, &quot;cycles_visibility&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>uint visibility = 0;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>visibility |= get_boolean(cvisibility, &quot;camera&quot;)? PATH_RAY_CAMERA: 0;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>visibility |= get_boolean(cvisibility, &quot;diffuse&quot;)? PATH_RAY_DIFFUSE: 0;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>visibility |= get_boolean(cvisibility, &quot;glossy&quot;)? PATH_RAY_GLOSSY: 0;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>visibility |= get_boolean(cvisibility, &quot;transmission&quot;)? PATH_RAY_TRANSMIT: 0;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>visibility |= get_boolean(cvisibility, &quot;scatter&quot;)? PATH_RAY_VOLUME_SCATTER: 0;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>background-&gt;visibility = visibility;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>shader-&gt;set_graph(graph);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>shader-&gt;tag_update(scene);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>background-&gt;tag_update(scene);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>PointerRNA cscene = RNA_pointer_get(&amp;b_scene.ptr, &quot;cycles&quot;);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>/* when doing preview render check for BI&#39;s transparency settings,</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> * this is so because bledner&#39;s preview render routines are not able</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> * to tweak all cycles&#39;s settings depending on different circumstances</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> */</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(b_engine.is_preview() == false)</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>background-&gt;transparent = get_boolean(cscene, &quot;film_transparent&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>else</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>background-&gt;transparent = b_scene.render().alpha_mode() == BL::RenderSettings::alpha_mode_TRANSPARENT;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>background-&gt;use = render_layer.use_background;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(background-&gt;modified(prevbackground))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>background-&gt;tag_update(scene);</div><div>}<br><br>and<br><br><div>void BlenderSync::sync_background_light(bool use_portal)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>BL::World b_world = b_scene.world();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(b_world) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>PointerRNA cscene = RNA_pointer_get(&amp;b_scene.ptr, &quot;cycles&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>PointerRNA cworld = RNA_pointer_get(&amp;b_world.ptr, &quot;cycles&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>bool sample_as_light = get_boolean(cworld, &quot;sample_as_light&quot;);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(sample_as_light || use_portal) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>/* test if we need to sync */</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>Light *light;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>ObjectKey key(b_world, 0, b_world);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if(light_map.sync(&amp;light, b_world, b_world, key) ||</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>world_recalc ||</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>b_world.ptr.data != world_map)</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light-&gt;type = LIGHT_BACKGROUND;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light-&gt;map_resolution  = get_int(cworld, &quot;sample_map_resolution&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light-&gt;shader = scene-&gt;default_background;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light-&gt;use_mis = sample_as_light;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light-&gt;max_bounces = get_int(cworld, &quot;max_bounces&quot;);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>int samples = get_int(cworld, &quot;samples&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if(get_boolean(cscene, &quot;use_square_samples&quot;))</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>light-&gt;samples = samples * samples;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>else</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>light-&gt;samples = samples;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light-&gt;tag_update(scene);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>light_map.set_recalc(b_world);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>world_map = b_world.ptr.data;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>world_recalc = false;</div><div>}<br><br><br>the confusing part:<br>if it is background &quot;no mis&quot; , then I can give all parameters &quot;like AO, visibility, ...&quot;<br>if it is with mis &quot;sample as light&quot;, then I will add a new light with the same shader graph as the background?? &quot;what will happen to the background here? it is kinda using 2 things for the same purpose, as the background which contain all world data like AO,... will emit to the scene using a shader graph, and another light will emit to the scene using the same shader graph&quot;<br><br>any clarifications will be appreciated.<br><br>cheers,<br>Mohamed Sakr</div></div></div>