10#include "utility/example_shared.h"
12#include <nv/index/icamera.h>
13#include <nv/index/iconfig_settings.h>
14#include <nv/index/icolormap.h>
15#include <nv/index/ifont.h>
16#include <nv/index/iindex.h>
17#include <nv/index/ilabel.h>
18#include <nv/index/ilight.h>
19#include <nv/index/imaterial.h>
20#include <nv/index/iscene.h>
21#include <nv/index/isession.h>
22#include <nv/index/isparse_volume_rendering_properties.h>
23#include <nv/index/iviewport.h>
25#include <nv/index/app/index_connect.h>
26#include <nv/index/app/string_dict.h>
28#include "utility/app_rendering_context.h"
29#include "utility/canvas_utility.h"
36 public nv::index::app::Index_connect
56 virtual bool evaluate_options(nv::index::app::String_dict& sdict) CPP11_OVERRIDE;
59 mi::neuraylib::INetwork_configuration* network_configuration,
60 nv::index::app::String_dict& options) CPP11_OVERRIDE
65 const bool is_unittest = nv::index::app::get_bool(options.get(
"unittest"));
68 info_cout(
"NETWORK: disabled networking mode.", options);
69 network_configuration->set_mode(mi::neuraylib::INetwork_configuration:
:MODE_OFF);
73 return initialize_networking_as_default_udp(network_configuration, options);
81 const mi::neuraylib::Tag& camera_tag,
82 mi::neuraylib::IDice_transaction* dice_transaction)
const;
84 void localize_scene_element();
87 nv::index::IViewport_list* filter_enabled_viewport_index_list();
91 bool render_one_frame(mi::Sint32 frame_idx);
117 mi::neuraylib::Tag create_synthetic_sparse_volume(
118 nv::index::IScene* scene,
119 const mi::math::Vector<mi::Uint32, 3>& volume_size,
120 mi::neuraylib::IDice_transaction* dice_transaction)
const;
135 mi::neuraylib::Tag create_append_label_to_group(
136 nv::index::IScene* scene_edit,
137 nv::index::ITransformed_scene_group* group_node,
138 const mi::math::Vector<mi::Float32, 3>& label_point,
139 const std::string& label_str,
140 const mi::Float32 label_height,
141 const mi::Float32 label_width,
142 const mi::math::Color_struct& fg_col,
143 const mi::math::Color_struct& bg_col,
144 mi::neuraylib::IDice_transaction* dice_transaction)
const;
150 const mi::math::Vector<mi::Uint32, 3>& volume_size,
151 mi::neuraylib::IDice_transaction* dice_transaction);
154 bool setup_main_host();
157 mi::neuraylib::Tag m_session_tag;
159 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
161 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
163 std::string m_outfname;
165 std::string m_verify_image_path_base;
166 std::string m_font_fpath;
167 std::string m_iconfile;
168 std::vector<bool> m_enable_view_idx_vec;
170 mi::neuraylib::Tag m_camera_tag;
172 mi::neuraylib::Tag m_volume_tag;
174 mi::neuraylib::Tag m_colormap_1_tag;
176 mi::neuraylib::Tag m_colormap_40_tag;
178 mi::neuraylib::Tag m_static_group_node_tag;
180 mi::neuraylib::Tag m_label_group_node_tag;
182 std::vector<mi::neuraylib::Tag> m_label_tag_vec;
183 mi::base::Handle<nv::index::IViewport_list> m_viewport_list;
198 mi::Sint32 frame_idx = 0;
202 const bool is_success = render_one_frame(frame_idx);
208 localize_scene_element();
213 const bool is_success = render_one_frame(frame_idx);
224 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
225 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
228 sdict.insert(
"dice::verbose",
"2");
230 m_outfname = sdict.get(
"outfname");
231 m_verify_image_path_base = sdict.get(
"verify_image_path_base");
232 m_enable_view_idx_vec = get_bool_vec_from_string(sdict.get(
"enable_vidx_vec"));
233 m_font_fpath = sdict.get(
"font_fpath");
234 m_iconfile = sdict.get(
"iconfile");
236 info_cout(
"running " + com_name, sdict);
237 info_cout(
"outfname = [" + m_outfname +
238 "], verify_image_path_base = [" + m_verify_image_path_base +
239 "], dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
242 if (sdict.is_defined(
"h"))
245 <<
"info: Usage: " << com_name <<
" [option]\n"
247 <<
" print out this message\n"
248 <<
" [-dice::verbose severity_level]\n"
249 <<
" verbose severity level (3 is info). (default: " + sdict.get(
"dice::verbose")
252 <<
" [-font_fpath FONT_FILE_PATH]\n"
253 <<
" font file path. (default: " << m_font_fpath <<
")\n"
255 <<
" [-outfname string]\n"
256 <<
" output ppm file base name. When empty, no output.\n"
257 <<
" A frame number and extension (.ppm) will be added.\n"
258 <<
" (default: [" << m_outfname <<
"])\n"
260 <<
" [-verify_image_path_base image path basename]\n"
261 <<
" when image_fname path basename exist, verify the rendering images.\n"
262 <<
" (default: [" << m_verify_image_path_base <<
"])\n"
264 <<
" [-unittest bool]\n"
265 <<
" when true, unit test mode. "
266 <<
"(default: [" << m_is_unittest <<
"])\n"
268 <<
" [-enable_vidx_vec enabled_vector]\n"
269 <<
" Specify which viewport is enabled by a bool vector.\n"
270 <<
" (default: [" << sdict.get(
"enable_vidx_vec") <<
"])"
279void Multi_view_volume::setup_camera(
280 const mi::neuraylib::Tag& camera_tag,
281 mi::neuraylib::IDice_transaction* dice_transaction)
const
285 mi::base::Handle<nv::index::IPerspective_camera> cam(
286 dice_transaction->edit<nv::index::IPerspective_camera>(camera_tag));
290 const mi::math::Vector<mi::Float32, 3> from(300.0f, 300.0f, 1000.0f);
291 mi::math::Vector<mi::Float32, 3> dir ( 0.0f, 0.0f, -1.0f);
292 const mi::math::Vector<mi::Float32, 3> up ( 0.0f, 1.0f, 0.0f);
295 cam->set(from, dir, up);
296 cam->set_aperture(0.033f);
297 cam->set_aspect(1.0f);
298 cam->set_focal(0.03f);
299 cam->set_clip_min(2.0f);
300 cam->set_clip_max(1000.0f);
304void Multi_view_volume::localize_scene_element()
312 const mi::Size view_idx = 1;
315 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
318 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
322 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
323 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
330 mi::Sint32 ret_localize = 1;
331 ret_localize = dice_transaction->localize(m_static_group_node_tag,
332 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
336 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
338 ret_localize = dice_transaction->localize(m_label_tag_vec[i],
339 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
344 ret_localize = dice_transaction->localize(m_colormap_1_tag,
345 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
347 ret_localize = dice_transaction->localize(m_colormap_40_tag,
348 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
352 ret_localize = dice_transaction->localize(m_camera_tag,
353 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
361 mi::base::Handle<nv::index::IStatic_scene_group> static_group_node(
362 dice_transaction->edit<nv::index::IStatic_scene_group>(
363 m_static_group_node_tag));
366 static_group_node->set_enabled(
false);
370 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
372 mi::base::Handle<nv::index::ILabel_3D> label(
373 dice_transaction->edit<nv::index::ILabel_3D>(m_label_tag_vec[i]));
377 label->set_enabled(
true);
378 label->set_text(
"View 1: right");
382 label->set_enabled(
false);
388 mi::base::Handle<nv::index::ICamera> cam(
389 dice_transaction->edit<nv::index::ICamera>(m_camera_tag));
392 const mi::math::Vector<mi::Float32, 3> from( 0.0f, 300.0f, 1000.0f);
393 mi::math::Vector<mi::Float32, 3> dir ( 0.5f, 0.0f, -1.0f);
394 const mi::math::Vector<mi::Float32, 3> up ( 0.0f, 1.0f, 0.0f);
397 cam->set(from, dir, up);
402 mi::base::Handle<nv::index::IColormap> colormap_1(
403 dice_transaction->edit<nv::index::IColormap>(m_colormap_1_tag));
404 colormap_1->set_enabled(
true);
405 mi::base::Handle<nv::index::IColormap> colormap_40(
406 dice_transaction->edit<nv::index::IColormap>(m_colormap_40_tag));
407 colormap_40->set_enabled(
false);
410 dice_transaction->commit();
415 const mi::Size view_idx = 2;
418 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
421 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
425 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
426 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
429 mi::base::Handle<const nv::index::ISession> session(
430 dice_transaction->access<nv::index::ISession>(m_session_tag));
437 mi::Sint32 ret_localize = 1;
438 ret_localize = dice_transaction->localize(session->get_scene(),
439 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
443 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
445 ret_localize = dice_transaction->localize(m_label_tag_vec[i],
446 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
451 ret_localize = dice_transaction->localize(m_colormap_1_tag,
452 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
454 ret_localize = dice_transaction->localize(m_colormap_40_tag,
455 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
459 ret_localize = dice_transaction->localize(m_camera_tag,
460 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
464 ret_localize = dice_transaction->localize(m_volume_tag,
465 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
471 mi::base::Handle<nv::index::IScene> scene(
472 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
476 mi::math::Bbox<mi::Float32, 3> roi(scene->get_clipped_bounding_box());
479 scene->set_clipped_bounding_box(roi);
483 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
485 mi::base::Handle<nv::index::ILabel_3D> label(
486 dice_transaction->edit<nv::index::ILabel_3D>(m_label_tag_vec[i]));
490 label->set_enabled(
true);
491 label->set_text(
"View 2: left");
495 label->set_enabled(
false);
501 mi::base::Handle<nv::index::ICamera> cam(
502 dice_transaction->edit<nv::index::ICamera>(m_camera_tag));
505 const mi::math::Vector<mi::Float32, 3> from(600.0f, 300.0f, 1000.0f);
506 mi::math::Vector<mi::Float32, 3> dir ( -0.5f, 0.0f, -1.0f);
507 const mi::math::Vector<mi::Float32, 3> up ( 0.0f, 1.0f, 0.0f);
510 cam->set(from, dir, up);
515 mi::base::Handle<nv::index::IColormap> colormap_1(
516 dice_transaction->edit<nv::index::IColormap>(m_colormap_1_tag));
517 colormap_1->set_enabled(
false);
518 mi::base::Handle<nv::index::IColormap> colormap_40(
519 dice_transaction->edit<nv::index::IColormap>(m_colormap_40_tag));
520 colormap_40->set_enabled(
true);
523 dice_transaction->commit();
528 const mi::Size view_idx = 3;
531 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
534 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
538 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
539 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
545 mi::Sint32 ret_localize = 1;
547 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
549 ret_localize = dice_transaction->localize(m_label_tag_vec[i],
550 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
555 ret_localize = dice_transaction->localize(m_colormap_1_tag,
556 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
558 ret_localize = dice_transaction->localize(m_colormap_40_tag,
559 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
563 ret_localize = dice_transaction->localize(m_camera_tag,
564 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
569 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
571 mi::base::Handle<nv::index::ILabel_3D> label(
572 dice_transaction->edit<nv::index::ILabel_3D>(m_label_tag_vec[i]));
576 label->set_enabled(
true);
577 label->set_text(
"View 3: Zoom");
581 label->set_enabled(
false);
587 mi::base::Handle<nv::index::ICamera> cam(
588 dice_transaction->edit<nv::index::ICamera>(m_camera_tag));
591 const mi::math::Vector<mi::Float32, 3> from(300.0f, 300.0f, 700.0f);
592 mi::math::Vector<mi::Float32, 3> dir ( 0.0f, 0.0f, -1.0f);
593 const mi::math::Vector<mi::Float32, 3> up ( 0.0f, 1.0f, 0.0f);
596 cam->set(from, dir, up);
601 mi::base::Handle<nv::index::IColormap> colormap_1(
602 dice_transaction->edit<nv::index::IColormap>(m_colormap_1_tag));
603 colormap_1->set_enabled(
true);
604 mi::base::Handle<nv::index::IColormap> colormap_40(
605 dice_transaction->edit<nv::index::IColormap>(m_colormap_40_tag));
606 colormap_40->set_enabled(
false);
610 dice_transaction->commit();
615 const mi::Size view_idx = 0;
618 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
621 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
625 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
626 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
632 for (mi::Size i = 0; i < m_label_tag_vec.size(); ++i)
634 mi::base::Handle<nv::index::ILabel_3D> label(
635 dice_transaction->edit<nv::index::ILabel_3D>(m_label_tag_vec[i]));
644 label->set_enabled(
false);
650 mi::base::Handle<nv::index::IColormap> colormap_1(
651 dice_transaction->edit<nv::index::IColormap>(m_colormap_1_tag));
652 colormap_1->set_enabled(
true);
653 mi::base::Handle<nv::index::IColormap> colormap_40(
654 dice_transaction->edit<nv::index::IColormap>(m_colormap_40_tag));
655 colormap_40->set_enabled(
false);
658 dice_transaction->commit();
663nv::index::IViewport_list* Multi_view_volume::filter_enabled_viewport_index_list()
665 mi::base::Handle<nv::index::IViewport_list> new_viewport_list;
667 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
668 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
669 assert(dice_transaction.is_valid_interface());
671 assert(m_session_tag.is_valid());
672 mi::base::Handle<const nv::index::ISession> session(
673 dice_transaction->access<nv::index::ISession>(m_session_tag));
674 assert(session.is_valid_interface());
677 new_viewport_list = session->create_viewport_list();
679 dice_transaction->commit();
683 const mi::Size nb_views = m_viewport_list->size();
685 std::stringstream sstr;
686 mi::Size nb_enabled = 0;
687 for (mi::Size i = 0; i < nb_views; ++i)
689 if (m_enable_view_idx_vec[i])
692 mi::base::Handle<nv::index::IViewport> vp (m_viewport_list->get(i));
693 new_viewport_list->append(vp.get());
698 new_viewport_list->set_advisory_enabled(m_viewport_list->get_advisory_enabled());
700 if (nb_enabled == nb_views)
702 INFO_LOG <<
"All views are enabled.";
706 INFO_LOG <<
"Filtered views. Enabled: " << sstr.str();
709 new_viewport_list->retain();
710 return new_viewport_list.get();
714bool Multi_view_volume::render_one_frame(mi::Sint32 frame_idx)
720 std::string fname =
"";
721 if (!(m_outfname.empty()))
723 fname = get_output_file_name(m_outfname, frame_idx);
728 m_image_file_canvas->set_rgba_file_name(fname.c_str());
731 m_viewport_list->set_advisory_enabled(
true);
733 mi::base::Handle<nv::index::IViewport_list> cur_viewport_list(
734 filter_enabled_viewport_index_list());
737 mi::base::Handle<nv::index::IFrame_results_list> frame_results_list(
738 m_index_rendering->render(
740 m_image_file_canvas.get(),
741 cur_viewport_list.get()));
744 if (frame_results_list->size() == 0)
746 ERROR_LOG <<
"IIndex_rendering rendering call has no results.";
751 for (mi::Size i = 0; i < frame_results_list->size(); ++i)
753 mi::base::Handle<nv::index::IFrame_results>
754 frame_results(frame_results_list->get(i));
757 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
759 if (err_set->any_errors())
761 std::ostringstream os;
763 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
764 const mi::Uint32 nb_err = err_set->get_nb_errors();
765 for (mi::Uint32 e = 0; e < nb_err; ++e)
767 if (e != 0) os <<
'\n';
768 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
769 os << err->get_error_string();
772 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
779 const mi::base::Handle<nv::index::IPerformance_values> performance_values(
780 frame_results->get_performance_values());
782 const mi::Float32 rendering_time = performance_values->get_time(
"time_total_rendering") / 1000.f;
783 const mi::Float32 compositing_time = performance_values->get_time(
"time_total_compositing") / 1000.f;
786 INFO_LOG <<
"--------------------------------------------";
787 INFO_LOG <<
" Frame: " << frame_idx <<
", Viewport: " << i;
788 INFO_LOG <<
"--------------------------------------------";
789 INFO_LOG <<
"Rendering time : " << rendering_time <<
" [sec]";
790 INFO_LOG <<
"Compositing time : " << compositing_time <<
" [sec]";
796 if (!(m_verify_image_path_base.empty()))
798 const std::string ref_img_fpath = get_output_file_name(m_verify_image_path_base, frame_idx);
799 if (!(verify_canvas_result(get_application_layer_interface(),
800 m_image_file_canvas.get(), ref_img_fpath, get_options())))
810void Multi_view_volume::create_views()
818 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(create_transaction());
821 mi::base::Handle<const nv::index::ISession> session(
822 dice_transaction->access<nv::index::ISession>(m_session_tag));
827 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
830 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 0, 256);
831 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
833 viewport->set_position(viewport_pos);
834 viewport->set_size(viewport_size);
835 viewport->set_scope(m_global_scope.get());
837 m_viewport_list->append(viewport.get());
842 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
845 mi::neuraylib::IScope* parent = 0;
846 mi::Uint8 privacy_level = 1;
847 bool is_temp =
false;
848 mi::base::Handle<mi::neuraylib::IScope> local_scope(m_database->create_scope(parent, privacy_level, is_temp));
851 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 256, 256);
852 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
854 viewport->set_position(viewport_pos);
855 viewport->set_size(viewport_size);
856 viewport->set_scope(local_scope.get());
858 m_viewport_list->append(viewport.get());
863 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
866 mi::neuraylib::IScope* parent = 0;
867 mi::Uint8 privacy_level = 1;
868 bool is_temp =
false;
869 mi::base::Handle<mi::neuraylib::IScope> local_scope(m_database->create_scope(parent, privacy_level, is_temp));
872 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 0, 0);
873 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
875 viewport->set_position(viewport_pos);
876 viewport->set_size(viewport_size);
877 viewport->set_scope(local_scope.get());
879 m_viewport_list->append(viewport.get());
884 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
887 mi::neuraylib::IScope* parent = 0;
888 mi::Uint8 privacy_level = 1;
889 bool is_temp =
false;
890 mi::base::Handle<mi::neuraylib::IScope> local_scope(m_database->create_scope(parent, privacy_level, is_temp));
893 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 256, 0);
894 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
896 viewport->set_position(viewport_pos);
897 viewport->set_size(viewport_size);
898 viewport->set_scope(local_scope.get());
900 m_viewport_list->append(viewport.get());
903 dice_transaction->commit();
907mi::neuraylib::Tag Multi_view_volume::create_synthetic_sparse_volume(
908 nv::index::IScene* scene,
909 const mi::math::Vector<mi::Uint32, 3>& volume_size,
910 mi::neuraylib::IDice_transaction* dice_transaction)
const
912 mi::math::Bbox<mi::Float32, 3> ijk_bbox;
913 ijk_bbox.min.x = 0.0f;
914 ijk_bbox.min.y = 0.0f;
915 ijk_bbox.min.z = 0.0f;
916 ijk_bbox.max.x =
static_cast<mi::Float32
>(volume_size.x);
917 ijk_bbox.max.y =
static_cast<mi::Float32
>(volume_size.y);
918 ijk_bbox.max.z =
static_cast<mi::Float32
>(volume_size.z);
921 nv::index::app::String_dict sparse_volume_opt;
922 sparse_volume_opt.insert(
"args::type",
"sparse_volume");
923 sparse_volume_opt.insert(
"args::importer",
"synthetic");
924 std::stringstream sstr;
925 sstr <<
"0 0 0 " << volume_size.x <<
" " << volume_size.y <<
" " << volume_size.z;
926 sparse_volume_opt.insert(
"args::bbox", sstr.str());
927 sparse_volume_opt.insert(
"args::voxel_format",
"uint8");
928 sparse_volume_opt.insert(
"args::synthetic_type",
"sphere_0");
929 nv::index::IDistributed_data_import_callback* importer_callback =
930 get_importer_from_application_layer(
931 get_application_layer_interface(),
932 "nv::index::plugin::base_importer.Sparse_volume_generator_synthetic",
936 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(1.0f);
937 const mi::math::Vector<mi::Float32, 3> scale(1.0f, 1.0f, 1.0f);
938 const mi::Float32 rotate_k = 0.0f;
939 const mi::math::Vector<mi::Float32, 3> translate(0.0f, 0.0f, 0.0f);
940 const bool is_rendering_enabled =
true;
942 mi::base::Handle<nv::index::ISparse_volume_scene_element>
sparse_volume(
943 scene->create_sparse_volume(ijk_bbox, transform_mat, importer_callback, dice_transaction));
947 DEBUG_LOG <<
"setup_imported_volume: "
948 <<
"size: " << volume_size.x <<
" " << volume_size.y <<
" " << volume_size.z <<
" "
949 <<
", scale: " << scale.x <<
" " << scale.y <<
" " << scale.z <<
" "
950 <<
", rotate_k: " << rotate_k
951 <<
", translate: " << translate.x <<
" " << translate.y <<
" " << translate.z <<
" "
952 <<
", is_rendering_enabled: " << is_rendering_enabled
955 const mi::neuraylib::Tag sparse_volume_tag =
956 dice_transaction->store_for_reference_counting(
sparse_volume.get());
959 INFO_LOG <<
"Creating a synthetic volume: size = [" << volume_size.x
960 <<
" " << volume_size.y <<
" " << volume_size.z <<
"], tag = " << sparse_volume_tag.id;
961 INFO_LOG <<
"This will take a while...";
963 return sparse_volume_tag;
967mi::neuraylib::Tag Multi_view_volume::create_append_label_to_group(
968 nv::index::IScene* scene_edit,
969 nv::index::ITransformed_scene_group* group_node,
970 const mi::math::Vector<mi::Float32, 3>& label_point,
971 const std::string& label_str,
972 const mi::Float32 label_height,
973 const mi::Float32 label_width,
974 const mi::math::Color_struct& fg_col,
975 const mi::math::Color_struct& bg_col,
976 mi::neuraylib::IDice_transaction* dice_transaction)
const
982 mi::base::Handle<nv::index::IFont> font(scene_edit->create_attribute<nv::index::IFont>());
985 if (font->set_file_name(m_font_fpath.c_str()))
987 INFO_LOG <<
"set the font path [" << m_font_fpath <<
"]";
991 ERROR_LOG <<
"Can not find the font path [" << m_font_fpath <<
"], "
992 <<
"the rendering result may not correct.";
994 font->set_font_resolution(64.0f);
995 const mi::neuraylib::Tag font_tag = dice_transaction->store_for_reference_counting(font.get());
996 INFO_LOG <<
"Created a font: tag: " << font_tag;
998 group_node->append(font_tag, dice_transaction);
1001 mi::neuraylib::Tag label_tag;
1003 mi::base::Handle<nv::index::ILabel_layout> label_layout(
1004 scene_edit->create_attribute<nv::index::ILabel_layout>());
1006 const mi::Float32 padding = 20.0f;
1007 label_layout->set_padding(padding);
1008 label_layout->set_color(fg_col, bg_col);
1009 const mi::neuraylib::Tag label_layout_tag =
1010 dice_transaction->store_for_reference_counting(label_layout.get());
1011 INFO_LOG <<
"Created a label_layout: tag: " << label_layout_tag;
1013 group_node->append(label_layout_tag, dice_transaction);
1015 mi::base::Handle<nv::index::ILabel_3D> label(scene_edit->create_shape<nv::index::ILabel_3D>());
1017 label->set_text(label_str.c_str());
1019 const mi::math::Vector<mi::Float32, 3> right(1.0f, 0.0f, 0.0f);
1020 const mi::math::Vector<mi::Float32, 3> up (0.0f, 1.0f, 0.0f);
1021 label->set_geometry(label_point, right, up, label_height, label_width);
1022 label_tag = dice_transaction->store_for_reference_counting(label.get());
1023 INFO_LOG <<
"Created a label: tag: " << label_tag;
1025 group_node->append(label_tag, dice_transaction);
1031void Multi_view_volume::setup_scene(
1032 const mi::math::Vector<mi::Uint32, 3>& volume_size,
1033 mi::neuraylib::IDice_transaction* dice_transaction)
1040 mi::base::Handle<const nv::index::ISession> session(
1041 dice_transaction->access<
const nv::index::ISession>(m_session_tag));
1045 mi::base::Handle<nv::index::IScene> scene_edit(
1046 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
1050 mi::base::Handle<nv::index::IStatic_scene_group> static_group_node(
1051 scene_edit->create_scene_group<nv::index::IStatic_scene_group>());
1057 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
1058 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
1060 const mi::math::Color color_intensity(1.0f, 1.0f, 1.0f, 1.0f);
1061 headlight->set_intensity(color_intensity);
1062 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(1.0f, -1.0f, -1.0f));
1064 const mi::neuraylib::Tag headlight_tag = dice_transaction->store_for_reference_counting(headlight.get());
1066 static_group_node->append(headlight_tag, dice_transaction);
1067 INFO_LOG <<
"Created a headlight: tag = " << headlight_tag.id;
1070 mi::base::Handle<nv::index::ISparse_volume_rendering_properties> sparse_render_prop(
1071 scene_edit->create_attribute<nv::index::ISparse_volume_rendering_properties>());
1072 sparse_render_prop->set_filter_mode(nv::index:
:SPARSE_VOLUME_FILTER_NEAREST);
1073 sparse_render_prop->set_sampling_distance( 1.0);
1074 sparse_render_prop->set_reference_sampling_distance( 1.0);
1075 sparse_render_prop->set_voxel_offsets( mi::math::Vector<mi::Float32, 3>(0.0f, 0.0f, 0.0f));
1076 sparse_render_prop->set_preintegrated_volume_rendering(
false);
1077 sparse_render_prop->set_lod_rendering_enabled(
false);
1078 sparse_render_prop->set_lod_pixel_threshold( 2.0);
1079 sparse_render_prop->set_debug_visualization_option( 0);
1080 const mi::neuraylib::Tag sparse_render_prop_tag
1081 = dice_transaction->store_for_reference_counting(sparse_render_prop.get());
1083 static_group_node->append(sparse_render_prop_tag, dice_transaction);
1084 INFO_LOG <<
"Created a sparse_render_prop_tag: tag = " << sparse_render_prop_tag;
1089 const mi::Sint32 colormap_entry_id = 40;
1090 const mi::neuraylib::Tag colormap_40_tag =
1091 create_colormap(colormap_entry_id, scene_edit.get(), dice_transaction);
1094 m_colormap_40_tag = colormap_40_tag;
1095 static_group_node->append(colormap_40_tag, dice_transaction);
1096 INFO_LOG <<
"Created colormap_40: " << colormap_40_tag;
1099 const mi::Sint32 colormap_entry_id = 1;
1100 const mi::neuraylib::Tag colormap_1_tag =
1101 create_colormap(colormap_entry_id, scene_edit.get(), dice_transaction);
1103 m_colormap_1_tag = colormap_1_tag;
1104 static_group_node->append(colormap_1_tag, dice_transaction);
1105 INFO_LOG <<
"Created colormap_1: " << colormap_1_tag;
1113 create_synthetic_sparse_volume(
1119 INFO_LOG << "Creating a synthetic volume: size = [" << volume_size.x
1120 << " " << volume_size.y << " " << volume_size.z << "], tag = "
1122 INFO_LOG << "This would take a while...";
1125 static_group_node->append(m_volume_tag, dice_transaction);
1128 mi::neuraylib::Tag static_group_node_tag =
1129 dice_transaction->store_for_reference_counting(static_group_node.get());
1132 m_static_group_node_tag = static_group_node_tag;
1134 scene_edit->append(static_group_node_tag, dice_transaction);
1136 std::stringstream sstr;
1137 sstr << "Created an synthetic volume: size = "
1138 << volume_size << ", tag = " << m_volume_tag.
id;
1139 INFO_LOG << sstr.str();
1145 mi::base::Handle<nv::index::ITransformed_scene_group> label_group_node(
1146 scene_edit->create_scene_group<nv::index::ITransformed_scene_group>());
1152 mi::math::Color ambient_color (1.0f, 1.0f, 1.0f, 1.0f);
1153 mi::math::Color diffuse_color (0.0f, 0.0f, 0.0f, 1.0f);
1154 mi::math::Color specular_color(0.0f, 0.0f, 0.0f, 1.0f);
1155 mi::Float32 shiness = 100.0f;
1156 mi::base::Handle<nv::index::IPhong_gl> phong_1(
1157 scene_edit->create_attribute<nv::index::IPhong_gl>());
1159 phong_1->set_ambient(ambient_color);
1160 phong_1->set_diffuse(diffuse_color);
1161 phong_1->set_specular(specular_color);
1162 phong_1->set_shininess(shiness);
1164 mi::neuraylib::Tag phong_1_tag = dice_transaction->store_for_reference_counting(phong_1.get());
1165 INFO_LOG <<
"Created phong for labels: tag: " << phong_1_tag;
1167 label_group_node->append(phong_1_tag, dice_transaction);
1170 mi::math::Color_struct fg_col; fg_col.r = 0.25f; fg_col.g = 0.95f; fg_col.b = 0.25f; fg_col.a = 1.0f;
1171 mi::math::Color_struct bg_col; bg_col.r = 0.4f; bg_col.g = 0.5f; bg_col.b = 0.4f; bg_col.a = 0.5f;
1173 m_label_tag_vec.clear();
1174 mi::math::Vector<mi::Float32, 3> label_pos (10.0f, -250.0f, 10.0f);
1175 std::string str =
"View 0";
1176 const mi::Float32 width = -1.0f;
1177 mi::neuraylib::Tag created_label =
1178 create_append_label_to_group(scene_edit.get(), label_group_node.get(), label_pos, str,
1179 100.0f, width, fg_col, bg_col, dice_transaction);
1181 m_label_tag_vec.push_back(created_label);
1183 label_pos.y += 150.0f;
1186 create_append_label_to_group(scene_edit.get(), label_group_node.get(), label_pos, str,
1187 100.0f, width, fg_col, bg_col, dice_transaction);
1189 m_label_tag_vec.push_back(created_label);
1191 label_pos.y += 150.0f;
1194 create_append_label_to_group(scene_edit.get(), label_group_node.get(), label_pos, str,
1195 100.0f, width, fg_col, bg_col, dice_transaction);
1197 m_label_tag_vec.push_back(created_label);
1199 label_pos.y += 150.0f;
1202 create_append_label_to_group(scene_edit.get(), label_group_node.get(), label_pos, str,
1203 100.0f, width, fg_col, bg_col, dice_transaction);
1205 m_label_tag_vec.push_back(created_label);
1208 const mi::neuraylib::Tag label_group_node_tag =
1209 dice_transaction->store_for_reference_counting(label_group_node.get());
1211 INFO_LOG <<
"Created a label_group: " << label_group_node_tag;
1214 scene_edit->append(label_group_node_tag, dice_transaction);
1215 m_label_group_node_tag = label_group_node_tag;
1220 const mi::math::Bbox<mi::Float32, 3> region_of_interest(
1222 static_cast<mi::Float32
>(volume_size.x),
1223 static_cast<mi::Float32
>(volume_size.y),
1224 static_cast<mi::Float32
>(volume_size.z));
1228 scene_edit->set_clipped_bounding_box(region_of_interest);
1231 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
1232 1.0f, 0.0f, 0.0f, 0.0f,
1233 0.0f, 1.0f, 0.0f, 0.0f,
1234 0.0f, 0.0f, 1.0f, 0.0f,
1235 0.0f, 0.0f, 0.0f, 1.0f
1238 scene_edit->set_transform_matrix(transform_mat);
1241 mi::base::Handle< nv::index::IPerspective_camera > cam(
1242 scene_edit->create_camera<nv::index::IPerspective_camera>());
1244 m_camera_tag = dice_transaction->store(cam.get());
1248 setup_camera(m_camera_tag, dice_transaction);
1251 scene_edit->set_camera(m_camera_tag);
1255bool Multi_view_volume::setup_main_host()
1258 m_cluster_configuration =
1259 get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
1260 check_success(m_cluster_configuration.is_valid_interface());
1263 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
1268 check_success(is_local_host_joined(m_cluster_configuration.get()));
1271 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
1272 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
1278 m_index_session->create_session(dice_transaction.get());
1280 mi::base::Handle<const nv::index::ISession> session(
1281 dice_transaction->access<nv::index::ISession>(
1286 m_viewport_list = session->create_viewport_list();
1290 mi::base::Handle<nv::index::IConfig_settings> config_settings(
1291 dice_transaction->edit<nv::index::IConfig_settings>(session->get_config()));
1293 config_settings->set_monitor_performance_values(
true);
1294 config_settings->set_automatic_span_control(
true);
1295 config_settings->set_max_spans_per_machine(8);
1300 mi::math::Vector<mi::Uint32, 3> volume_size(600, 600, 32);
1301 setup_scene(volume_size, dice_transaction.get());
1303 dice_transaction->commit();
1306 const mi::math::Vector<mi::Uint32, 2> buffer_resolution(512, 512);
1307 m_image_file_canvas->set_resolution(buffer_resolution);
1309 INFO_LOG <<
"Initialization complete.";
1316int main(
int argc,
const char* argv[])
1318 nv::index::app::String_dict sdict;
1319 sdict.insert(
"dice::verbose",
"4");
1320 sdict.insert(
"font_fpath",
"/usr/share/fonts/dejavu/DejaVuSans.ttf");
1321 sdict.insert(
"outfname",
"frame_multi_view_volume");
1322 sdict.insert(
"verify_image_path_base",
"");
1323 sdict.insert(
"unittest",
"0");
1324 sdict.insert(
"enable_vidx_vec",
"1 1 1 1");
1327 sdict.insert(
"dice::network::mode",
"OFF");
1330 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
1331 sdict.insert(
"index::service",
"rendering_and_compositing");
1332 sdict.insert(
"index::cuda_debug_checks",
"false");
1335 sdict.insert(
"index::app::components::application_layer::component_name_list",
1336 "canvas_infrastructure image io");
1337 sdict.insert(
"index::app::plugins::base_importer::enabled",
"true");
1341 multi_view_volume.initialize(argc, argv, sdict);
1345 const mi::Sint32 exit_code = multi_view_volume.
launch();
1346 INFO_LOG <<
"Shutting down ...";
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
virtual ~Multi_view_volume()
virtual bool initialize_networking(mi::neuraylib::INetwork_configuration *network_configuration, nv::index::app::String_dict &options) CPP11_OVERRIDE
int main(int argc, const char *argv[])
#define check_success(expr)