void BlenderSession::render() { /* get buffer parameters */ SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background); BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height); int w = buffer_params.width, h = buffer_params.height; /* create render result */ RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, 0, 0, w, h); PointerRNA rrptr; RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr); b_rr = BL::RenderResult(rrptr); BL::RenderSettings r = b_scene.render(); BL::RenderResult::layers_iterator b_iter; BL::RenderLayers b_rr_layers(r.ptr); int active = 0; /* render each layer */ for(b_rr.layers.begin(b_iter); b_iter != b_rr.layers.end(); ++b_iter, ++active) { /* single layer render */ if(r.use_single_layer()) active = b_rr_layers.active_index(); /* set layer */ b_rlay = *b_iter; /* add passes */ vector<Pass> passes; Pass::add(PASS_COMBINED, passes); if(session_params.device.advanced_shading) { BL::RenderLayer::passes_iterator b_pass_iter; for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != b_rlay.passes.end(); ++b_pass_iter) { BL::RenderPass b_pass(*b_pass_iter); PassType pass_type = get_pass_type(b_pass); if(pass_type != PASS_NONE) Pass::add(pass_type, passes); } } buffer_params.passes = passes; scene->film->passes = passes; scene->film->tag_update(scene); /* update session */ session->reset(buffer_params, session_params.samples); /* update scene */ sync->sync_data(b_v3d, active); /* render */ session->start(); session->wait(); if(session->progress.get_cancel()) break; /* write result */ write_render_result(); } /* delete render result */ RE_engine_end_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data); }