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>
28 opt_map[
"user_program_mode"] =
"2";
29 opt_map[
"scene"] =
"0";
30 opt_map[
"profile"] =
"0";
31 opt_map[
"run_compute"] =
"1";
32 opt_map[
"compute_plane"] =
"0";
33 opt_map[
"compute_roi"] =
"0 0 0 0 0 0";
34 opt_map[
"export_scene"] =
"0";
35 opt_map[
"export_directory"] =
"";
36 opt_map[
"export_file_name"] =
"";
37 opt_map[
"export_file_ext"] =
"";
39 opt_map[
"use_cluster"] =
"0";
40 opt_map[
"dice::verbose"] =
"3";
41 opt_map[
"dice::network::multicast_address"] =
"224.1.3.2";
42 opt_map[
"roi"] =
"0 0 0 0 0 0";
43 opt_map[
"outfname"] =
"frame_xac_compute";
44 opt_map[
"unittest"] =
"0";
45 opt_map[
"is_dump_comparison_image_when_failed"] =
"1";
46 opt_map[
"is_call_from_test"] =
"0";
60 usage.
stream() <<
"Option: [-h]\n Print this message\n\n";
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)");
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.");
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.");
108 Nvindex_access& nvindex_accessor,
112 info_cout(std::string(
"NVIDIA IndeX version: ") + nvindex_accessor.get_interface()->get_version(), opt_map.
get_map());
114 initialize_log_module(nvindex_accessor, opt_map.
get_map());
121 mi::base::Handle<mi::neuraylib::IDebug_configuration> debug_configuration(
122 nvindex_accessor.get_interface()->get_api_component<mi::neuraylib::IDebug_configuration>());
124 debug_configuration->set_option(
"check_serializer_store=1");
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>());
130 if (
has_key(opt_map,
"cuda_rtc_print_kernel_info")) {
131 index_debug_cfg->set_option(
"cuda_rtc_print_kernel_info=1");
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");
136 if (
has_key(opt_map,
"cuda_rtc_disable")) {
137 index_debug_cfg->set_option(
"cuda_rtc_disable=1");
139 if (nv::index::app::get_bool(opt_map[
"profile"]) ==
true) {
140 index_debug_cfg->set_option(
"performance_values_wait=1");
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;
147 mi::neuraylib::INetwork_configuration::Mode net_mode = enable_cluster ?
148 mi::neuraylib::INetwork_configuration:
:MODE_UDP :
149 mi::neuraylib::INetwork_configuration:
:MODE_OFF;
151 mi::base::Handle<mi::neuraylib::INetwork_configuration> inetwork_configuration(
152 nvindex_accessor.get_interface()->get_api_component<mi::neuraylib::INetwork_configuration>());
154 inetwork_configuration->set_mode(net_mode);
156 if (enable_cluster) {
157 info_cout(
"NETWORK: Enabling UDP networking mode.", opt_map.
get_map());
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());
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.";
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");
176 nvindex_accessor.start_service();
185 arc.m_database = nvindex_accessor.get_interface()->get_api_component<mi::neuraylib::IDatabase>();
188 arc.m_global_scope = arc.m_database->get_global_scope();
192 arc.m_iindex_session = nvindex_accessor.get_interface()->get_api_component<nv::index::IIndex_session>();
195 arc.m_iindex_rendering = nvindex_accessor.get_interface()->create_rendering_interface();
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());
202 arc.m_image_canvas = nvindex_accessor.create_image_file_canvas();
213 mi::neuraylib::Tag camera_tag,
214 mi::neuraylib::Tag scene_tag,
215 mi::neuraylib::IDice_transaction* dice_transaction)
221 WARN_LOG <<
"Un-initialized bounding box and not updating the camera settings.";
226 mi::base::Handle<nv::index::IPerspective_camera>
227 camera(dice_transaction->edit<nv::index::IPerspective_camera>(camera_tag));
230 mi::base::Handle<const nv::index::IScene> scene(dice_transaction->access<
const nv::index::IScene>(scene_tag));
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;
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));
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);
250 const Vec3f eyepos = -dist * from + center;
251 Vec3f viewdir = center - eyepos;
254 camera->set(eyepos, viewdir, up);
256 INFO_LOG <<
"view_all_box: " << eyepos << viewdir << up <<
" clip:" << clip_min <<
" " << clip_max;
264 Nvindex_access& nvindex_accessor,
267 App_rendering_context& arc,
270 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
271 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
273 mi::neuraylib::IDice_transaction* transaction = dice_transaction.get();
276 arc.m_session_tag = arc.m_iindex_session->create_session(transaction);
278 mi::base::Handle<const nv::index::ISession> session(
279 transaction->access<
const nv::index::ISession>(arc.m_session_tag));
283 mi::base::Handle<nv::index::IConfig_settings> config_settings(
284 transaction->edit<nv::index::IConfig_settings>(session->get_config()));
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.";
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"]);
299 const mi::Uint32 subcube_border = opt_map.
has_key(
"subcube_border") ?
300 nv::index::app::get_uint32(opt_map[
"subcube_border"]) : 1;
302 config_settings->set_subcube_configuration(
303 subcube_size, subcube_border,
312 config_settings->set_parallel_rendering_and_compositing(
false);
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());
331 std::string text_filename = opt_map[
"load_user_program"];
332 if (!text_filename.empty()) {
335 std::string plane_text_filename = opt_map[
"load_plane_user_program"];
336 if (!plane_text_filename.empty()) {
341 if (nv::index::app::get_sint32(opt_map[
"compute_plane"]) != 0) {
343 ERROR_LOG <<
"Scene does not support XAC compute plane feature.";
347 check_success(scene_setup->
create_scene(nvindex_accessor, scene_info, roi_bbox, arc.m_session_tag, opt_map, transaction));
350 if (nv::index::app::get_sint32(opt_map[
"compute_plane"]) != 0) {
351 Scene_tool scene_tool(arc.m_session_tag, transaction);
355 mi::base::Handle<nv::index::IScene_element> scene_elem(
356 scene_tool.
transaction->edit<nv::index::IScene_element>(compute_target_tag));
358 scene_elem->set_enabled(
false);
365 opt_map, scene_info, scene_tool);
369 text_filename = opt_map[
"dump_user_program"];
370 if (!text_filename.empty()) {
373 plane_text_filename = opt_map[
"dump_plane_user_program"];
374 if (!plane_text_filename.empty()) {
379 const Vec2u buffer_resolution(1024, 1024);
380 arc.m_image_canvas->set_resolution(buffer_resolution);
383 mi::neuraylib::Tag camera_tag = mi::neuraylib:
:NULL_TAG;
385 mi::base::Handle<nv::index::IScene> scene(
386 transaction->edit<nv::index::IScene>(session->get_scene()));
391 mi::base::Handle< nv::index::IPerspective_camera > cam(
392 scene->create_camera<nv::index::IPerspective_camera>());
394 mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
397 scene_setup->
setup_camera(camera_tag, opt_map, transaction);
411 scene->set_clipped_bounding_box(roi_bbox);
417 const Mat4f transform_mat(
423 scene->set_transform_matrix(transform_mat);
427 scene->set_camera(camera_tag);
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);
435 transaction->commit();
442 App_rendering_context& arc,
445 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
446 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
449 const bool ok = scene_setup->
export_scene_data(arc.m_session_tag, opt_map, dice_transaction.get());
451 ERROR_LOG <<
"Failed to export scene data.";
453 dice_transaction->commit();
460 App_rendering_context& arc,
464 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
465 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
469 mi::base::Handle<const nv::index::ISession> session(
470 dice_transaction->access<nv::index::ISession
const>(arc.m_session_tag));
473 mi::base::Handle<nv::index::IConfig_settings> edit_config_settings(
474 dice_transaction->edit<nv::index::IConfig_settings>(session->get_config()));
478 const bool do_profiling = nv::index::app::get_bool(opt_map[
"profile"]);
479 edit_config_settings->set_monitor_performance_values(do_profiling);
481 dice_transaction->commit();
487 const nv::index::IPerformance_values* performance_values,
491 if (!performance_values)
return;
492 if (nv::index::app::get_bool(opt_map[
"profile"]) ==
false) {
496 Performance_table_logger perf_logger;
498 char const*
const time_keys[] = {
500 "time_rendering_volume",
503 "time_rendering_only",
507 "time_rendering_total_sum",
508 "time_compositing_stage",
511 "time_total_rendering",
514 "time_complete_frame",
520 char const*
const value_keys[] = {
547 perf_logger.append_keys(time_keys);
548 perf_logger.append_keys(value_keys);
550 INFO_LOG << info <<
" " << perf_logger.get_table(performance_values);
556 const nv::index::IFrame_results* frame_results,
560 const mi::base::Handle<const nv::index::IPerformance_values> performance_values(
561 frame_results->get_performance_values());
570 App_rendering_context& arc,
571 const std::string& output_fname)
576 arc.m_image_canvas->set_rgba_file_name(output_fname.c_str());
580 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
581 arc.m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
584 arc.m_iindex_session->update(arc.m_session_tag, dice_transaction.get());
586 mi::base::Handle<nv::index::IFrame_results> frame_results(
587 arc.m_iindex_rendering->render(
589 arc.m_image_canvas.get(),
590 dice_transaction.get()));
593 dice_transaction->commit();
595 frame_results->retain();
596 return frame_results.get();
virtual bool supports_compute_plane() const
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 Vec3f get_scene_scaling() 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
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()
void line(const char *info="")
void opt(const std::string &opt, const char *arg_info, const char *subline="")
XAC compute example scenes.
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
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)
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
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
mi::math::Vector< mi::Float32, 3 > Vec3f
mi::math::Vector< mi::Uint32, 2 > Vec2u
void setup_performance_monitoring(App_rendering_context &arc, const Option_map &opt_map)
#define check_success(expr)
mi::neuraylib::Tag scene_element_tag
std::string rtc_program_source
std::string plane_rtc_program_source
Compute_launch_info compute_launch_info
XAC compute example app setup.
Scene setup interface for xac compute example.