NVIDIA Index example code nvidia_logo_transpbg.gif Up
xac_compute_app.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright 2023 NVIDIA Corporation. All rights reserved.
3 *****************************************************************************/
5
6#include "xac_compute_app.h"
9#include "xac_compute_plane.h"
10#define USE_NVINDEX_ACCESS
11#include "utility/example_shared.h"
12#include "utility/app_rendering_context.h"
13#include "utility/canvas_utility.h"
14#include "utility/example_performance_logger.h"
15#include <nv/index/icamera.h>
16#include <nv/index/iindex.h>
17#include <nv/index/iscene.h>
18#include <nv/index/isession.h>
19#include <nv/index/icolormap.h>
20#include <nv/index/iindex_debug_configuration.h>
21
22
23namespace xac_compute {
24
25
27{
28 opt_map["user_program_mode"] = "2";
29 opt_map["scene"] = "0";
30 opt_map["profile"] = "0"; // default: no profiling
31 opt_map["run_compute"] = "1";
32 opt_map["compute_plane"] = "0";
33 opt_map["compute_roi"] = "0 0 0 0 0 0"; // empty == complete
34 opt_map["export_scene"] = "0";
35 opt_map["export_directory"] = "";
36 opt_map["export_file_name"] = "";
37 opt_map["export_file_ext"] = "";
38
39 opt_map["use_cluster"] = "0"; // 1 to enable cluster, use cluster_rendering_remotehost
40 opt_map["dice::verbose"] = "3"; // log level
41 opt_map["dice::network::multicast_address"] = "224.1.3.2";
42 opt_map["roi"] = "0 0 0 0 0 0"; // input roi
43 opt_map["outfname"] = "frame_xac_compute"; // output image file base name
44 opt_map["unittest"] = "0";
45 opt_map["is_dump_comparison_image_when_failed"] = "1";
46 opt_map["is_call_from_test"] = "0";
47
48 for (int i = 0, n = get_num_scenes(); i < n; ++i) {
49 get_scene_setup(i)->add_arguments(opt_map);
50 }
51 Plane_setup plane_setup;
52 plane_setup.add_arguments(opt_map);
53}
54
55
56
57std::string get_usage(const Option_map& opt_map)
58{
59 Usage_helper usage(opt_map);
60 usage.stream() << "Option: [-h]\n Print this message\n\n";
61
62 usage.opt("scene", "n");
63 usage.line("0: sparse volume (svol)");
64 usage.line("1: tiled heightfield (hfield)");
65 usage.line("2: triangle mesh (tmesh)");
66 usage.line();
67 usage.opt("user_program_mode", "n", "Enable user programs for scene elements (0:none, 1:only render, 2:with compute method).");
68 usage.opt("load_user_program", "FILENAME", "Load user program from file.");
69 usage.opt("dump_user_program", "FILENAME", "Dump builtin user program to file.");
70 usage.opt("load_plane_user_program", "FILENAME", "Load user program for plane from file.");
71 usage.opt("dump_plane_user_program", "FILENAME", "Dump builtin user program for plane to file.");
72 usage.opt("profile", "bool", "Enable performance profiling.");
73 usage.opt("run_compute", "n", "How to perform compute 1:post-render, 2:pre-render, 3:pre+post-render.");
74 usage.opt("compute_plane", "n", "Use XAC compute plane feature.");
75 usage.opt("compute_roi", "\"float float float float float float\"", "Region of interest for compute (box min, box max).");
76 usage.opt("subcube_size", "X Y Z", "Set global subcube size (default: 510 510 510)");
77 usage.opt("subcube_border", "n", "Set global subcube border size (default: 1)");
78 usage.opt("export_scene", "bool", "Export computed scene data.");
79 usage.opt("export_directory", "DIR", "Directory for scene exports.");
80 usage.opt("export_file_name", "NAME", "Base name of export file");
81 usage.opt("export_file_ext", ".EXT", "File extension of export file, including dot.");
82 usage.line();
83 for (int i = 0, n = get_num_scenes(); i < n; ++i) {
84 get_scene_setup(i)->usage_info(usage);
85 usage.line();
86 }
87 Plane_setup plane_setup;
88 plane_setup.usage_info(usage);
89
90 usage.line();
91
92
93 usage.opt("dice::verbose", "level", "Verbosity level (3 is info.).");
94 usage.opt("use_cluster", "bool", "Enable cluster mode, use cluster_rendering_remotehost as server.");
95 usage.opt("dice::network::multicast_address", "224.1.3.2", "Multicast adddress for cluster mode.");
96 usage.opt("roi", "\"float float float float float float\"", "Bounding box of the region of interest (roi).");
97 usage.opt("outfname", "FILENAME", "Filename of the output ppm image file. When empty, no image file will be written.");
98 usage.line("A frame number and the extension (.ppm) will be added.");
99 usage.opt("verify_image_fname_<n>", "FILENAME", "When file with FILENAME exist, verify the rendering image (n: 0,1,2).");
100 usage.opt("unittest", "bool", "When true, unit test mode.");
101
102 return usage.text();
103}
104
105//----------------------------------------------------------------------
106
108 Nvindex_access& nvindex_accessor,
109 const Option_map& opt_map,
110 const xac_compute::IXac_compute_scene_setup* scene_setup)
111{
112 info_cout(std::string("NVIDIA IndeX version: ") + nvindex_accessor.get_interface()->get_version(), opt_map.get_map());
113
114 initialize_log_module(nvindex_accessor, opt_map.get_map());
115
116 // Register serializable classes
117 scene_setup->register_classes(nvindex_accessor.get_interface().get());
118
119 // check the triangle mesh serializer/deserializer
120 // Do not use remote logging
121 mi::base::Handle<mi::neuraylib::IDebug_configuration> debug_configuration(
122 nvindex_accessor.get_interface()->get_api_component<mi::neuraylib::IDebug_configuration>());
123 check_success(debug_configuration.is_valid_interface());
124 debug_configuration->set_option("check_serializer_store=1");
125
126
127 mi::base::Handle<nv::index::IIndex_debug_configuration> index_debug_cfg(
128 nvindex_accessor.get_interface()->get_api_component<nv::index::IIndex_debug_configuration>());
129 check_success(index_debug_cfg.is_valid_interface());
130 if (has_key(opt_map, "cuda_rtc_print_kernel_info")) {
131 index_debug_cfg->set_option("cuda_rtc_print_kernel_info=1");
132 }
133 if (has_key(opt_map, "cuda_rtc_load_sources_from_file")) {
134 index_debug_cfg->set_option("cuda_rtc_load_sources_from_file=1");
135 }
136 if (has_key(opt_map, "cuda_rtc_disable")) {
137 index_debug_cfg->set_option("cuda_rtc_disable=1");
138 }
139 if (nv::index::app::get_bool(opt_map["profile"]) == true) {
140 index_debug_cfg->set_option("performance_values_wait=1");
141 }
142
143 // Configure networking
144 const bool is_unittest = nv::index::app::get_bool(opt_map["unittest"]);
145 bool enable_cluster = nv::index::app::get_bool(opt_map["use_cluster"]) && !is_unittest;
146
147 mi::neuraylib::INetwork_configuration::Mode net_mode = enable_cluster ?
148 mi::neuraylib::INetwork_configuration::MODE_UDP :
149 mi::neuraylib::INetwork_configuration::MODE_OFF;
150
151 mi::base::Handle<mi::neuraylib::INetwork_configuration> inetwork_configuration(
152 nvindex_accessor.get_interface()->get_api_component<mi::neuraylib::INetwork_configuration>());
153 check_success(inetwork_configuration.is_valid_interface());
154 inetwork_configuration->set_mode(net_mode);
155
156 if (enable_cluster) {
157 info_cout("NETWORK: Enabling UDP networking mode.", opt_map.get_map());
158
159 const std::string multicast_addr(opt_map["dice::network::multicast_address"]);
160 INFO_LOG << "info: NETWORK: UDP network is configured with multicast address ["
161 << multicast_addr << "].";
162 inetwork_configuration->set_multicast_address(multicast_addr.c_str());
163
164 INFO_LOG << "info: NETWORK: no cluster interface address is set. "
165 << "If you have multiple network card on a machine, you need to set this.";
166 // const std::string cluster_if_adder("172.16.0.0/22:10001");
167 // check_success(inetwork_configuration->set_cluster_interface(cluster_if_adder.c_str() == 0);
168
169 // Define service mode to rendering and compositing (main host)
170 mi::base::Handle<nv::index::ICluster_configuration> rendering_properties_query(
171 nvindex_accessor.get_interface()->get_api_component<nv::index::ICluster_configuration>());
172 rendering_properties_query->set_service_mode("rendering_and_compositing");
173 }
174
175 // Start IndeX library && application_layer
176 nvindex_accessor.start_service();
177}
178
179
180
181//----------------------------------------------------------------------
182
183void setup_app_context(App_rendering_context& arc, Nvindex_access& nvindex_accessor)
184{
185 arc.m_database = nvindex_accessor.get_interface()->get_api_component<mi::neuraylib::IDatabase>();
186 check_success(arc.m_database.is_valid_interface());
187
188 arc.m_global_scope = arc.m_database->get_global_scope();
189 check_success(arc.m_global_scope.is_valid_interface());
190
191 // IIndex session to create a session
192 arc.m_iindex_session = nvindex_accessor.get_interface()->get_api_component<nv::index::IIndex_session>();
193 check_success(arc.m_iindex_session.is_valid_interface());
194
195 arc.m_iindex_rendering = nvindex_accessor.get_interface()->create_rendering_interface();
196 check_success(arc.m_iindex_rendering.is_valid_interface());
197
198 arc.m_icluster_configuration = nvindex_accessor.get_interface()->get_api_component<nv::index::ICluster_configuration>();
199 check_success(arc.m_icluster_configuration.is_valid_interface());
200
201 // create image canvas in application_layer
202 arc.m_image_canvas = nvindex_accessor.create_image_file_canvas();
203 check_success(arc.m_image_canvas.is_valid_interface());
204}
205
206
207//----------------------------------------------------------------------
208
209static void view_all_bbox(
210 const Vec3f& from,
211 const Vec3f& up,
212 const Bbox3f& bbox,
213 mi::neuraylib::Tag camera_tag,
214 mi::neuraylib::Tag scene_tag,
215 mi::neuraylib::IDice_transaction* dice_transaction)
216{
217 check_success(dice_transaction != 0);
218
219 if (bbox.empty())
220 {
221 WARN_LOG << "Un-initialized bounding box and not updating the camera settings.";
222 return;
223 }
224
225 {
226 mi::base::Handle<nv::index::IPerspective_camera>
227 camera(dice_transaction->edit<nv::index::IPerspective_camera>(camera_tag));
228 check_success(camera.is_valid_interface());
229
230 mi::base::Handle<const nv::index::IScene> scene(dice_transaction->access<const nv::index::IScene>(scene_tag));
231 check_success(scene.is_valid_interface());
232
233 // Compute the new camera parameters
234 const Bbox3f& global_roi_bbox = scene->get_clipped_bounding_box();
235 const Mat4f& transform_mat = scene->get_transform_matrix();
236 const Vec3f new_min(mi::math::transform_point(transform_mat, global_roi_bbox.min));
237 const Vec3f new_max(mi::math::transform_point(transform_mat, global_roi_bbox.max));
238 const Bbox3f transformed_bbox(new_min, new_max);
239 const Vec3f& center = transformed_bbox.center();
240 const mi::Float32 rad = mi::math::euclidean_distance(transformed_bbox.max, transformed_bbox.min) / 2.0f;
241
242 const mi::Float32 fov_rad_2 = static_cast<mi::Float32>(camera->get_fov_y_rad() / 2.0);
243 const mi::Float32 dist = rad / static_cast<mi::Float32>(tan(fov_rad_2));
244
245 const mi::Float32 clip_min = 0.1f * dist;
246 const mi::Float32 clip_max = 10.f * dist;
247 camera->set_clip_min(clip_min);
248 camera->set_clip_max(clip_max);
249
250 const Vec3f eyepos = -dist * from + center;
251 Vec3f viewdir = center - eyepos;
252 check_success(viewdir.normalize());
253
254 camera->set(eyepos, viewdir, up);
255
256 INFO_LOG << "view_all_box: " << eyepos << viewdir << up << " clip:" << clip_min << " " << clip_max;
257 }
258}
259
260
261//----------------------------------------------------------------------
262
264 Nvindex_access& nvindex_accessor,
265 const xac_compute::IXac_compute_scene_setup* scene_setup,
267 App_rendering_context& arc,
268 const Option_map& opt_map)
269{
270 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
271 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
272 check_success(dice_transaction.is_valid_interface());
273 mi::neuraylib::IDice_transaction* transaction = dice_transaction.get();
274
275 // Setup session information
276 arc.m_session_tag = arc.m_iindex_session->create_session(transaction);
277 check_success(arc.m_session_tag.is_valid());
278 mi::base::Handle<const nv::index::ISession> session(
279 transaction->access<const nv::index::ISession>(arc.m_session_tag));
280 check_success(session.is_valid_interface());
281
282 {
283 mi::base::Handle<nv::index::IConfig_settings> config_settings(
284 transaction->edit<nv::index::IConfig_settings>(session->get_config()));
285 check_success(config_settings.is_valid_interface());
286
287 if (opt_map.has_key("svol.brick_size") && opt_map.has_key("svol.brick_border")) {
288 nv::index::IConfig_settings::Sparse_volume_config svol_cfg =
289 config_settings->get_sparse_volume_configuration();
290 svol_cfg.brick_dimensions = nv::index::app::get_vector_from_string<mi::Uint32,3>(opt_map["svol.brick_size"]);
291 svol_cfg.brick_shared_border_size = nv::index::app::get_uint32(opt_map["svol.brick_border"]);
292 if (!config_settings->set_sparse_volume_configuration(svol_cfg)) {
293 ERROR_LOG << "Could not set sparse volume configuration.";
294 }
295 }
296
297 if (opt_map.has_key("subcube_size")) {
298 const Vec3u subcube_size = nv::index::app::get_vector_from_string<mi::Uint32,3>(opt_map["subcube_size"]); // def. 510
299 const mi::Uint32 subcube_border = opt_map.has_key("subcube_border") ?
300 nv::index::app::get_uint32(opt_map["subcube_border"]) : 1;
301
302 config_settings->set_subcube_configuration(
303 subcube_size, subcube_border,
304 false /*support_continuous_volume_translation*/,
305 false /*support_volume_rotation*/,
306 Vec3f(1.f, 1.f, 1.f) /*minimal_volume_scaling*/
307 );
308 }
309
310 // test serial render/composite
311 if (false) {
312 config_settings->set_parallel_rendering_and_compositing(false);
313 }
314 }
315
316 //----------------------------------------------------------------------
317 // Scene setup: hierarchical scene description root node,
318 // scene parameters, camera.
319 //----------------------------------------------------------------------
320 Bbox3f roi_bbox = nv::index::app::get_bbox_from_string<mi::Float32,3>(opt_map["roi"]);
321 if (roi_bbox.empty() || roi_bbox.is_point()) {
322 roi_bbox = nv::index::app::get_bbox_from_string<mi::Float32,3>(scene_setup->get_roi_string());
323 }
324
325
326 // Create scene
327 Scene_info scene_info;
328 scene_info.compute_launch_info.compute_roi = nv::index::app::get_bbox_from_string<mi::Float32,3>(opt_map["compute_roi"]);
329 scene_info.compute_launch_info.scene_roi = roi_bbox;
330
331 std::string text_filename = opt_map["load_user_program"];
332 if (!text_filename.empty()) {
333 load_text(text_filename, scene_info.rtc_program_source);
334 }
335 std::string plane_text_filename = opt_map["load_plane_user_program"];
336 if (!plane_text_filename.empty()) {
337 load_text(plane_text_filename, scene_info.plane_rtc_program_source);
338 }
339
340
341 if (nv::index::app::get_sint32(opt_map["compute_plane"]) != 0) {
342 if (!scene_setup->supports_compute_plane()) {
343 ERROR_LOG << "Scene does not support XAC compute plane feature.";
344 }
345 }
346
347 check_success(scene_setup->create_scene(nvindex_accessor, scene_info, roi_bbox, arc.m_session_tag, opt_map, transaction));
348
349 // Add compute plane group.
350 if (nv::index::app::get_sint32(opt_map["compute_plane"]) != 0) {
351 Scene_tool scene_tool(arc.m_session_tag, transaction);
352
353 // Disable the scene element to see only the plane.
354 const mi::neuraylib::Tag compute_target_tag = scene_info.compute_launch_info.scene_element_tag;
355 mi::base::Handle<nv::index::IScene_element> scene_elem(
356 scene_tool.transaction->edit<nv::index::IScene_element>(compute_target_tag));
357 if (scene_elem) {
358 scene_elem->set_enabled(false);
359 }
360
361 Plane_setup plane_setup;
362 plane_setup.add_compute_plane_group(
363 compute_target_tag,
364 scene_setup->plane_sample_func(),
365 opt_map, scene_info, scene_tool);
366 }
367
368
369 text_filename = opt_map["dump_user_program"];
370 if (!text_filename.empty()) {
371 dump_text(text_filename, scene_info.rtc_program_source);
372 }
373 plane_text_filename = opt_map["dump_plane_user_program"];
374 if (!plane_text_filename.empty()) {
375 dump_text(plane_text_filename, scene_info.plane_rtc_program_source);
376 }
377 info = scene_info.compute_launch_info;
378
379 const Vec2u buffer_resolution(1024, 1024);
380 arc.m_image_canvas->set_resolution(buffer_resolution);
381
382 // scope for scene edit
383 mi::neuraylib::Tag camera_tag = mi::neuraylib::NULL_TAG;
384 {
385 mi::base::Handle<nv::index::IScene> scene(
386 transaction->edit<nv::index::IScene>(session->get_scene()));
387 check_success(scene.is_valid_interface());
388
389 // Create and edit a camera. Data distribution is based on the camera.
390 // (Because only visible massive data are considered)
391 mi::base::Handle< nv::index::IPerspective_camera > cam(
392 scene->create_camera<nv::index::IPerspective_camera>());
393 check_success(cam.is_valid_interface());
394 mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
395
396 check_success(camera_tag.is_valid());
397 scene_setup->setup_camera(camera_tag, opt_map, transaction);
398
399 // The the colormap to demonstrate color index color mapping.
400 //mi::base::Handle<nv::index::IColormap> colormap(create_colormap(scene.get()));
401 //check_success(colormap.is_valid_interface());
402 // Store in DiCE database.
403 //const mi::neuraylib::Tag colormap_tag = transaction->store_for_reference_counting(
404 // colormap.get(), mi::neuraylib::NULL_TAG, "colormap");
405 //check_success(colormap_tag.is_valid());
406 //scene->prepend(colormap_tag, transaction);
407
408
409 // Set the region of interest.
410 check_success(roi_bbox.is_volume());
411 scene->set_clipped_bounding_box(roi_bbox);
412
413
414 // Set the scene global transformation matrix.
415 // only change the coordinate system
416 const Vec3f sc = scene_setup->get_scene_scaling();
417 const Mat4f transform_mat(
418 sc.x, 0.f, 0.f, 0.f,
419 0.f, sc.y, 0.f, 0.f,
420 0.f, 0.f, sc.z, 0.f,
421 0.f, 0.f, 0.f, 1.f
422 );
423 scene->set_transform_matrix(transform_mat);
424
425
426 // Set the current camera to the scene.
427 scene->set_camera(camera_tag);
428 }
429
430 if (false) {
431 const Vec3f from(0.0f, 0.0f, 1.0f);
432 const Vec3f up(0.0f, 1.0f, 0.0f);
433 view_all_bbox(from, up, roi_bbox, camera_tag, session->get_scene(), transaction);
434 }
435 transaction->commit();
436}
437
438//----------------------------------------------------------------------
439
441 const xac_compute::IXac_compute_scene_setup* scene_setup,
442 App_rendering_context& arc,
443 const Option_map& opt_map)
444{
445 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
446 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
447 check_success(dice_transaction.is_valid_interface());
448
449 const bool ok = scene_setup->export_scene_data(arc.m_session_tag, opt_map, dice_transaction.get());
450 if (!ok) {
451 ERROR_LOG << "Failed to export scene data.";
452 }
453 dice_transaction->commit();
454 return ok;
455}
456
457//----------------------------------------------------------------------
458
460 App_rendering_context& arc,
461 const Option_map& opt_map)
462{
463 check_success(arc.m_global_scope.is_valid_interface());
464 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
465 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
466 check_success(dice_transaction.is_valid_interface());
467 {
468 check_success(arc.m_session_tag.is_valid());
469 mi::base::Handle<const nv::index::ISession> session(
470 dice_transaction->access<nv::index::ISession const>(arc.m_session_tag));
471 check_success(session.is_valid_interface());
472
473 mi::base::Handle<nv::index::IConfig_settings> edit_config_settings(
474 dice_transaction->edit<nv::index::IConfig_settings>(session->get_config()));
475 check_success(edit_config_settings.is_valid_interface());
476
477 // performance related configuration examples.
478 const bool do_profiling = nv::index::app::get_bool(opt_map["profile"]);
479 edit_config_settings->set_monitor_performance_values(do_profiling);
480 }
481 dice_transaction->commit();
482}
483
484
485
487 const nv::index::IPerformance_values* performance_values,
488 const Option_map& opt_map,
489 const char* info)
490{
491 if (!performance_values) return;
492 if (nv::index::app::get_bool(opt_map["profile"]) == false) {
493 return;
494 }
495
496 Performance_table_logger perf_logger;
497
498 char const* const time_keys[] = {
499 // "time_rendering_horizon"
500 "time_rendering_volume",
501 // "time_rendering_volume_and_horizon"
502 // "time_intersection_lines_points",
503 "time_rendering_only",
504 "time_gpu_upload",
505 // "time_gpu_download",
506 "time_rendering",
507 "time_rendering_total_sum",
508 "time_compositing_stage",
509 // "time_image_compositing",
510 // "time_image_transfer",
511 "time_total_rendering",
512 // "time_total_compositing",
513 // "time_total_final_compositing",
514 "time_complete_frame",
515 // "time_frame_setup"
516 // "time_frame_finish"
517 // "time_avg_rendering",
518 0
519 };
520 char const* const value_keys[] = {
521 "frames_per_second",
522 // "nb_subcubes"
523 // "nb_subcubes_rendered"
524 // "size_volume_data_rendered",
525 // "size_horizon_data_rendered"
526 // "nb_horizon_triangles_rendered",
527 // "size_volume_data_upload"
528 // "size_rendering_results_download",
529 // "size_pinned_host_memory"
530 // "size_unpinned_host_memory"
531 // "size_gpu_memory",
532 // "nb_fragments",
533 // "is_using_gpu",
534 // "size_span_transfer",
535 // "size_span_transfer_compressed",
536 // "size_intermediate_image_transfer",
537 // "size_intermediate_image_transfer_compressed",
538 // "size_intermediate_image_composited",
539 // "nb_composited_leafs"
540 // "nb_considered_leafs_per_span",
541 // "nb_active_hosts",
542 // "nb_horizontal_spans"
543 // "nb_rendering_results_in_queue",
544 0,
545 };
546
547 perf_logger.append_keys(time_keys);
548 perf_logger.append_keys(value_keys);
549
550 INFO_LOG << info << " " << perf_logger.get_table(performance_values);
551}
552
553
554
556 const nv::index::IFrame_results* frame_results,
557 const Option_map& opt_map)
558{
559 if (frame_results) {
560 const mi::base::Handle<const nv::index::IPerformance_values> performance_values(
561 frame_results->get_performance_values());
562 print_performance(performance_values.get(), opt_map, "Rendering");
563 }
564}
565
566//----------------------------------------------------------------------
567
568// render a frame
569nv::index::IFrame_results* render_frame(
570 App_rendering_context& arc,
571 const std::string& output_fname)
572{
573 check_success(arc.m_iindex_rendering.is_valid_interface());
574
575 // set output filename, empty string is valid
576 arc.m_image_canvas->set_rgba_file_name(output_fname.c_str());
577
578 check_success(arc.m_session_tag.is_valid());
579
580 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
581 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
582 check_success(dice_transaction.is_valid_interface());
583
584 arc.m_iindex_session->update(arc.m_session_tag, dice_transaction.get());
585
586 mi::base::Handle<nv::index::IFrame_results> frame_results(
587 arc.m_iindex_rendering->render(
588 arc.m_session_tag,
589 arc.m_image_canvas.get(),
590 dice_transaction.get()));
591 check_success(frame_results.is_valid_interface());
592
593 dice_transaction->commit();
594
595 frame_results->retain();
596 return frame_results.get();
597}
598
599
600
601
602}//xac_compute
virtual bool create_scene(Nvindex_access &nvindex_accessor, Scene_info &scene_info, const Bbox3f &roi_bbox, mi::neuraylib::Tag session_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const =0
virtual const char * plane_sample_func() const
virtual void register_classes(nv::index::IIndex *) const
virtual void usage_info(Usage_helper &) const
virtual void add_arguments(Option_map &opt_map) const
virtual bool export_scene_data(mi::neuraylib::Tag session_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const
virtual const char * get_roi_string() const =0
virtual void setup_camera(mi::neuraylib::Tag camera_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const =0
bool has_key(const std::string &key) const
Definition: xac_compute.h:79
Map_type & get_map()
Definition: xac_compute.h:77
void add_compute_plane_group(const mi::neuraylib::Tag compute_target, const char *plane_sample_function, const Option_map &opt_map, Scene_info &scene_info, Scene_tool &scene_tool) const
void usage_info(Usage_helper &usage) const
void add_arguments(Option_map &opt_map) const
std::ostringstream & stream()
Definition: xac_compute.h:118
std::string text() const
Definition: xac_compute.h:116
void line(const char *info="")
Definition: xac_compute.h:111
void opt(const std::string &opt, const char *arg_info, const char *subline="")
Definition: xac_compute.h:94
XAC compute example scenes.
Definition: xac_compute.cpp:27
void setup_app_context(App_rendering_context &arc, Nvindex_access &nvindex_accessor)
void start_nvindex_service(Nvindex_access &nvindex_accessor, const Option_map &opt_map, const xac_compute::IXac_compute_scene_setup *scene_setup)
void dump_text(const std::string &filename, const std::string &text)
mi::math::Bbox< mi::Float32, 3 > Bbox3f
Definition: xac_compute.h:29
bool export_scene_data(const xac_compute::IXac_compute_scene_setup *scene_setup, App_rendering_context &arc, const Option_map &opt_map)
void get_default_options(Option_map &opt_map)
bool has_key(const Option_map &opt_map, const std::string &key)
Definition: xac_compute.h:85
void setup_scene(Nvindex_access &nvindex_accessor, const xac_compute::IXac_compute_scene_setup *scene_setup, Compute_launch_info &info, App_rendering_context &arc, const Option_map &opt_map)
mi::math::Vector< mi::Uint32, 3 > Vec3u
Definition: xac_compute.h:36
static void view_all_bbox(const Vec3f &from, const Vec3f &up, const Bbox3f &bbox, mi::neuraylib::Tag camera_tag, mi::neuraylib::Tag scene_tag, mi::neuraylib::IDice_transaction *dice_transaction)
std::string get_usage(const Option_map &opt_map)
nv::index::IFrame_results * render_frame(App_rendering_context &arc, const std::string &output_fname)
void load_text(const std::string &filename, std::string &text)
const IXac_compute_scene_setup * get_scene_setup(int i)
void print_performance(const nv::index::IPerformance_values *performance_values, const Option_map &opt_map, const char *info)
mi::math::Matrix< mi::Float32, 4, 4 > Mat4f
Definition: xac_compute.h:48
mi::math::Vector< mi::Float32, 3 > Vec3f
Definition: xac_compute.h:38
mi::math::Vector< mi::Uint32, 2 > Vec2u
Definition: xac_compute.h:31
void setup_performance_monitoring(App_rendering_context &arc, const Option_map &opt_map)
#define check_success(expr)
mi::neuraylib::Tag scene_element_tag
Definition: xac_compute.h:130
std::string rtc_program_source
Definition: xac_compute.h:141
std::string plane_rtc_program_source
Definition: xac_compute.h:142
Compute_launch_info compute_launch_info
Definition: xac_compute.h:140
mi::neuraylib::IDice_transaction * transaction
XAC compute example app setup.
Scene setup interface for xac compute example.
Scene setup interface for xac compute example.