10#include "utility/example_shared.h"
12#include <nv/index/icamera.h>
13#include <nv/index/iconfig_settings.h>
14#include <nv/index/idistributed_data_access.h>
15#include <nv/index/idistributed_compute_technique.h>
16#include <nv/index/iheightfield_pick_result.h>
17#include <nv/index/iindex.h>
18#include <nv/index/iindex_debug_configuration.h>
19#include <nv/index/ilight.h>
20#include <nv/index/iline_set.h>
21#include <nv/index/imaterial.h>
22#include <nv/index/iscene.h>
23#include <nv/index/isession.h>
24#include <nv/index/itexture_filter_mode.h>
25#include <nv/index/iviewport.h>
28#include <nv/index/app/idata_analysis_and_processing.h>
29#include <nv/index/app/index_connect.h>
30#include <nv/index/app/string_dict.h>
32#include "utility/app_rendering_context.h"
33#include "utility/canvas_utility.h"
40 public nv::index::app::Index_connect
60 virtual bool evaluate_options(nv::index::app::String_dict& sdict) CPP11_OVERRIDE;
63 mi::neuraylib::INetwork_configuration* network_configuration,
64 nv::index::app::String_dict& options) CPP11_OVERRIDE
69 const bool is_unittest = nv::index::app::get_bool(options.get(
"unittest"));
72 info_cout(
"NETWORK: disabled networking mode.", options);
73 network_configuration->set_mode(mi::neuraylib::INetwork_configuration:
:MODE_OFF);
77 return initialize_networking_as_default_udp(network_configuration, options);
82 bool create_normal_line_set(
83 const mi::Float32* height_data,
84 const mi::math::Vector_struct<mi::Float32, 3>* normal_data,
85 const mi::math::Bbox<mi::Sint64, 2>& hf_bbox,
86 const mi::neuraylib::Tag& session_tag,
87 mi::neuraylib::IDice_transaction* dice_transaction);
89 void visualize_heightfield_normal(
90 mi::neuraylib::Tag heightfield_tag,
91 mi::neuraylib::Tag session_tag,
92 mi::neuraylib::IDice_transaction* dice_transaction);
99 const mi::neuraylib::Tag& camera_tag,
101 mi::neuraylib::IDice_transaction* dice_transaction)
const;
103 void localize_scene_element()
const;
108 nv::index::IViewport_list* filter_enabled_viewport_index_list()
const;
112 bool render_one_frame(mi::Sint32 frame_idx);
128 void create_views()
const;
133 void setup_scene(mi::neuraylib::IDice_transaction* dice_transaction);
138 bool setup_main_host();
142 void print_pick_results(
143 nv::index::IScene_pick_results* scene_pick_results)
const;
152 const mi::math::Vector<mi::Sint32, 2>& pick_location_on_canvas,
153 nv::index::IIndex_scene_query* iindex_query,
154 bool expected_is_hit)
const;
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::vector<bool> m_enable_view_idx_vec;
168 mi::neuraylib::Tag m_camera_tag;
170 mi::neuraylib::Tag m_heightfield_tag;
172 mi::neuraylib::Tag m_normal_line_tag;
174 mi::neuraylib::Tag m_phong_1_tag;
176 mi::neuraylib::Tag m_mandelbrot_map_tag;
178 mi::neuraylib::Tag m_height_value_map_tag;
180 mi::neuraylib::Tag m_hf_static_group_node_tag;
181 mi::base::Handle<nv::index::IViewport_list> m_viewport_list;
189 bool is_all_viewport_enabeld =
true;
190 for (std::vector<bool>::const_iterator bi = m_enable_view_idx_vec.begin(); bi != m_enable_view_idx_vec.end(); ++bi)
192 is_all_viewport_enabeld = is_all_viewport_enabeld && (*bi);
200 mi::Sint32 frame_idx = 0;
203 const bool is_success = render_one_frame(frame_idx);
210 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
211 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
214 visualize_heightfield_normal(m_heightfield_tag,
215 m_session_tag, dice_transaction.get());
217 dice_transaction->commit();
221 localize_scene_element();
226 const bool is_success = render_one_frame(frame_idx);
233 const mi::Sint32 nb_pick_point = 3;
234 const mi::math::Vector<mi::Sint32, 2> pick_location_on_canvas[nb_pick_point] = {
236 mi::math::Vector<mi::Sint32, 2>(120, 400),
238 mi::math::Vector<mi::Sint32, 2>( 45, 470),
240 mi::math::Vector<mi::Sint32, 2>(360, 390),
242 const bool is_hit[nb_pick_point] = {
248 mi::base::Handle<nv::index::IIndex_scene_query> iindex_query(
249 get_index_interface()->get_api_component<nv::index::IIndex_scene_query>());
251 for (mi::Sint32 i = 0; i < nb_pick_point; ++i)
253 const bool is_success =
254 pick_test_call(pick_location_on_canvas[i],
258 if (!is_all_viewport_enabeld)
260 WARN_LOG <<
"Not all viewport is enabled, the pick test may fail.";
273 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
274 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
278 sdict.insert(
"dice::verbose",
"2");
281 m_outfname = sdict.get(
"outfname");
282 m_verify_image_path_base = sdict.get(
"verify_image_path_base");
283 m_enable_view_idx_vec = get_bool_vec_from_string(sdict.get(
"enable_vidx_vec"));
285 info_cout(
"running " + com_name, sdict);
286 info_cout(
"outfname = [" + m_outfname +
287 "], verify_image_path_base = [" + m_verify_image_path_base +
288 "], dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
291 if (sdict.is_defined(
"h"))
294 <<
"info: Usage: " << com_name <<
" [option]\n"
296 <<
" print out this message\n"
297 <<
" [-dice::verbose severity_level]\n"
298 <<
" verbose severity level (3 is info). (default: " + sdict.get(
"dice::verbose")
301 <<
" [-outfname string]\n"
302 <<
" output ppm file base name. When empty, no output.\n"
303 <<
" A frame number and extension (.ppm) will be added.\n"
304 <<
" (default: [" << m_outfname <<
"])\n"
306 <<
" [-verify_image_path_base image path basename]\n"
307 <<
" when image_fname path basename exist, verify the rendering images.\n"
308 <<
" (default: [" << m_verify_image_path_base <<
"])\n"
310 <<
" [-unittest bool]\n"
311 <<
" when true, unit test mode. "
312 <<
"(default: [" << m_is_unittest <<
"])\n"
314 <<
" [-enable_vidx_vec enabled_vector]\n"
315 <<
" Specify which viewport is enabled by a bool vector.\n"
316 <<
" (default: [" << sdict.get(
"enable_vidx_vec") <<
"])"
326bool Multi_view_heightfield::create_normal_line_set(
327 const mi::Float32* height_data,
328 const mi::math::Vector_struct<mi::Float32, 3>* normal_data,
329 const mi::math::Bbox<mi::Sint64, 2>& hf_bbox,
330 const mi::neuraylib::Tag& session_tag,
331 mi::neuraylib::IDice_transaction* dice_transaction)
339 mi::base::Handle< nv::index::ISession const > session(
340 dice_transaction->access<nv::index::ISession
const>(session_tag));
343 mi::base::Handle< nv::index::IScene > scene_edit(
344 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
348 mi::base::Handle<nv::index::ITransformed_scene_group> group_node(
349 scene_edit->create_scene_group<nv::index::ITransformed_scene_group>());
355 std::vector<mi::math::Vector_struct<mi::Float32, 3> > line_seg_vec;
356 std::vector<mi::math::Color_struct> color_vec;
357 mi::math::Color_struct red_color = { 1.0f, 0.0f, 0.0f, 1.0f, };
358 std::vector<mi::Float32> width_vec;
359 mi::Float32 vis_line_len = 60.0f;
360 mi::Sint64 x_step = 16;
361 mi::Sint64 y_step = 8;
364 mi::math::Vector<mi::Sint64, 2> ij(0, 0);
365 for (ij[0] = hf_bbox.min[0]; ij[0] < hf_bbox.max[0]; ij[0] += x_step)
367 for (ij[1] = hf_bbox.min[1]; ij[1] < hf_bbox.max[1]; ij[1] += y_step)
370 mi::Sint64 idx = get_heightfield_index(ij, hf_bbox);
371 mi::math::Vector<mi::Float32, 3> org_pos(
372 static_cast<mi::Float32
>(ij[0]),
373 static_cast<mi::Float32
>(ij[1]),
374 static_cast<mi::Float32
>(height_data[idx]));
376 mi::math::Vector<mi::Float32, 3> dst_pos = org_pos +
377 vis_line_len * mi::math::Vector<mi::Float32, 3>(normal_data[idx]);
379 line_seg_vec.push_back(org_pos);
380 line_seg_vec.push_back(dst_pos);
381 color_vec.push_back(red_color);
382 width_vec.push_back(1.0f);
385 mi::math::Vector<mi::Sint64, 2> ij_x_next = ij;
387 if (ij_x_next[0] < hf_bbox.max[0])
389 mi::Sint64 idx = get_heightfield_index(ij_x_next, hf_bbox);
391 mi::math::Vector<mi::Float32, 3> org_pos(
392 static_cast<mi::Float32
>(ij_x_next[0]),
393 static_cast<mi::Float32
>(ij_x_next[1]),
394 static_cast<mi::Float32
>(height_data[idx]));
396 mi::math::Vector<mi::Float32, 3> dst_pos = org_pos +
397 vis_line_len * mi::math::Vector<mi::Float32, 3>(normal_data[idx]);
399 line_seg_vec.push_back(org_pos);
400 line_seg_vec.push_back(dst_pos);
401 color_vec.push_back(red_color);
402 width_vec.push_back(1.0f);
410 mi::base::Handle<nv::index::ILine_set> line_set(scene_edit->create_shape<nv::index::ILine_set>());
412 line_set->set_line_type(nv::index::ILine_set:
:LINE_TYPE_SEGMENTS);
414 line_set->set_lines(&(line_seg_vec[0]), line_seg_vec.size());
415 line_set->set_colors(&(color_vec[0]), color_vec.size());
416 line_set->set_widths(&(width_vec[0]), width_vec.size());
419 const mi::neuraylib::Tag line_set_tag = dice_transaction->store_for_reference_counting(line_set.get());
422 m_normal_line_tag = line_set_tag;
425 group_node->append(line_set_tag, dice_transaction);
426 INFO_LOG <<
"Added line_set (size: " << line_seg_vec.size() <<
") to the scene (tag id: "
427 << line_set_tag.id <<
").";
430 mi::neuraylib::Tag group_node_tag = dice_transaction->store_for_reference_counting(group_node.get());
432 scene_edit->append(group_node_tag, dice_transaction);
438void Multi_view_heightfield::visualize_heightfield_normal(
439 mi::neuraylib::Tag heightfield_tag,
440 mi::neuraylib::Tag session_tag,
441 mi::neuraylib::IDice_transaction* dice_transaction)
447 mi::base::Handle<const nv::index::ISession> session(
448 dice_transaction->access<nv::index::ISession>(session_tag));
451 mi::base::Handle<const nv::index::IRegular_heightfield>
heightfield(
452 dice_transaction->access<nv::index::IRegular_heightfield>(heightfield_tag));
455 const mi::math::Bbox<mi::Float32, 3> heightfield_bbox =
heightfield->get_IJK_bounding_box();
457 const mi::math::Bbox<mi::Uint32, 2> query_bbox(
458 static_cast<mi::Uint32
>(heightfield_bbox.min.x),
static_cast<mi::Uint32
>(heightfield_bbox.min.y),
459 static_cast<mi::Uint32
>(heightfield_bbox.max.x),
static_cast<mi::Uint32
>(heightfield_bbox.max.y));
462 const mi::neuraylib::Tag dist_layout_tag = session->get_distribution_layout();
465 mi::base::Handle<const nv::index::IData_distribution> distribution_layout(
466 dice_transaction->access<nv::index::IData_distribution>(dist_layout_tag));
470 mi::base::Handle<nv::index::Regular_heightfield_locality_query_mode> mode(
471 new nv::index::Regular_heightfield_locality_query_mode(heightfield_tag, query_bbox,
false));
472 mi::base::Handle<nv::index::IDistributed_data_locality> data_locality(
473 distribution_layout->get_data_locality<nv::index::IRegular_heightfield>(mode.get(), dice_transaction));
476 std::ostringstream hosts;
477 for (mi::Uint32 i = 0; i < data_locality->get_nb_cluster_nodes(); ++i)
480 hosts << data_locality->get_cluster_node(i) <<
" ";
482 INFO_LOG <<
"Height field data for the current query bbox is located on these hosts: " << hosts.str();
485 const mi::neuraylib::Tag data_access_tag = session->get_data_access_factory();
488 mi::base::Handle<const nv::index::IDistributed_data_access_factory> access_factory(
489 dice_transaction->access<nv::index::IDistributed_data_access_factory>(data_access_tag));
492 mi::base::Handle<nv::index::IRegular_heightfield_data_access> heightfield_data_access(
493 access_factory->create_regular_heightfield_data_access(heightfield_tag));
497 heightfield_data_access->access(query_bbox, dice_transaction);
499 const mi::math::Bbox<mi::Uint32, 2> effective_bbox = heightfield_data_access->get_patch_bounding_box();
503 const mi::Float32* height_data = heightfield_data_access->get_elevation_values();
504 const mi::math::Vector_struct<mi::Float32, 3>* normal_data = heightfield_data_access->get_normal_values();
505 const mi::math::Bbox<mi::Sint64, 2> hf_bbox(effective_bbox);
507 create_normal_line_set(height_data,
515void Multi_view_heightfield::setup_camera(
516 const mi::neuraylib::Tag& camera_tag,
518 mi::neuraylib::IDice_transaction* dice_transaction)
const
522 mi::base::Handle<nv::index::IPerspective_camera> cam(
523 dice_transaction->edit<nv::index::IPerspective_camera>(camera_tag));
527 const mi::math::Vector<mi::Float32, 3> from(700.0f, 700.0f, 200.0f);
528 mi::math::Vector<mi::Float32, 3> dir ( -1.125f, -1.125f, -1.0f);
529 const mi::math::Vector<mi::Float32, 3> up ( 0.0f, 0.0f, 1.0f);
532 cam->set(from, dir, up);
533 cam->set_aperture(0.033f);
534 cam->set_aspect(1.0f);
535 cam->set_focal(0.03f);
536 cam->set_clip_min(2.0f);
537 cam->set_clip_max(1000.0f);
541void Multi_view_heightfield::localize_scene_element()
const
549 const mi::Size view_idx = 1;
552 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
555 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
559 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
560 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
565 mi::Sint32 ret_localize = 1;
566 ret_localize = dice_transaction->localize(m_camera_tag,
567 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
570 mi::base::Handle<nv::index::ICamera> cam(
571 dice_transaction->edit<nv::index::ICamera>(m_camera_tag));
574 const mi::math::Vector<mi::Float32, 3> from(0.0f, 700.0f, 200.0f);
575 mi::math::Vector<mi::Float32, 3> dir (1.0f, -1.125f, -1.0f);
576 const mi::math::Vector<mi::Float32, 3> up ( 0.0f, 0.0f, 1.0f);
579 cam->set(from, dir, up);
581 dice_transaction->commit();
586 const mi::Size view_idx = 2;
589 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
593 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
597 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
598 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
603 mi::Sint32 ret_localize = 1;
604 ret_localize = dice_transaction->localize(m_normal_line_tag,
605 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
607 ret_localize = dice_transaction->localize(m_mandelbrot_map_tag,
608 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
610 ret_localize = dice_transaction->localize(m_height_value_map_tag,
611 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
614 mi::base::Handle<nv::index::ILine_set> line_set(
615 dice_transaction->edit<nv::index::ILine_set>(m_normal_line_tag));
617 line_set->set_enabled(
true);
619 mi::base::Handle<nv::index::IDistributed_compute_technique> man_map(
620 dice_transaction->edit<nv::index::IDistributed_compute_technique>(m_mandelbrot_map_tag));
621 man_map->set_enabled(
false);
623 mi::base::Handle<nv::index::IDistributed_compute_technique> hv_map(
624 dice_transaction->edit<nv::index::IDistributed_compute_technique>(m_height_value_map_tag));
625 hv_map->set_enabled(
true);
627 mi::base::Handle<nv::index::IPhong_gl> phong_1(
628 dice_transaction->edit<nv::index::IPhong_gl>(m_phong_1_tag));
632 phong_1->set_ambient(mi::math::Color(1.0f));
633 phong_1->set_diffuse(mi::math::Color(0.0f));
634 phong_1->set_specular(mi::math::Color(0.0f));
636 dice_transaction->commit();
641 const mi::Size view_idx = 3;
644 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
647 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
651 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
652 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
657 mi::Sint32 ret_localize = 1;
658 ret_localize = dice_transaction->localize(m_phong_1_tag,
659 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
661 ret_localize = dice_transaction->localize(m_mandelbrot_map_tag,
662 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
664 ret_localize = dice_transaction->localize(m_height_value_map_tag,
665 mi::neuraylib::IDice_transaction:
:LOCAL_SCOPE);
668 mi::base::Handle<nv::index::IDistributed_compute_technique> man_map(
669 dice_transaction->edit<nv::index::IDistributed_compute_technique>(m_mandelbrot_map_tag));
670 man_map->set_enabled(
true);
672 mi::base::Handle<nv::index::IDistributed_compute_technique> hv_map(
673 dice_transaction->edit<nv::index::IDistributed_compute_technique>(m_height_value_map_tag));
674 hv_map->set_enabled(
false);
676 mi::base::Handle<nv::index::IPhong_gl> phong_1(
677 dice_transaction->edit<nv::index::IPhong_gl>(m_phong_1_tag));
681 phong_1->set_ambient(mi::math::Color(1.0f));
682 phong_1->set_diffuse(mi::math::Color(0.0f));
683 phong_1->set_specular(mi::math::Color(0.0f));
685 dice_transaction->commit();
690 const mi::Size view_idx = 0;
693 mi::base::Handle<nv::index::IViewport> viewport(m_viewport_list->get(view_idx));
696 mi::base::Handle<mi::neuraylib::IScope> cur_scope(viewport->get_scope());
700 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
701 cur_scope->create_transaction<mi::neuraylib::IDice_transaction>());
706 mi::base::Handle<nv::index::ILine_set> line_set(
707 dice_transaction->edit<nv::index::ILine_set>(m_normal_line_tag));
709 line_set->set_enabled(
false);
711 dice_transaction->commit();
716nv::index::IViewport_list* Multi_view_heightfield::filter_enabled_viewport_index_list()
const
718 mi::base::Handle<nv::index::IViewport_list> new_viewport_list;
720 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
721 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
722 assert(dice_transaction.is_valid_interface());
724 assert(m_session_tag.is_valid());
725 mi::base::Handle<const nv::index::ISession> session(
726 dice_transaction->access<nv::index::ISession>(m_session_tag));
727 assert(session.is_valid_interface());
730 new_viewport_list = session->create_viewport_list();
732 dice_transaction->commit();
736 const mi::Size nb_views = m_viewport_list->size();
738 std::stringstream sstr;
739 mi::Size nb_enabled = 0;
740 for (mi::Size i = 0; i < nb_views; ++i)
742 if (m_enable_view_idx_vec[i])
745 mi::base::Handle<nv::index::IViewport> vp (m_viewport_list->get(i));
746 new_viewport_list->append(vp.get());
751 new_viewport_list->set_advisory_enabled(m_viewport_list->get_advisory_enabled());
753 if (nb_enabled == nb_views)
755 INFO_LOG <<
"All views are enabled.";
759 INFO_LOG <<
"Filtered views. Enabled: " << sstr.str();
762 new_viewport_list->retain();
763 return new_viewport_list.get();
767bool Multi_view_heightfield::render_one_frame(mi::Sint32 frame_idx)
773 std::string fname =
"";
776 fname = get_output_file_name(m_outfname, frame_idx);
781 m_image_file_canvas->set_rgba_file_name(fname.c_str());
784 m_viewport_list->set_advisory_enabled(
true);
786 mi::base::Handle<nv::index::IViewport_list> cur_viewport_list(
787 filter_enabled_viewport_index_list());
790 mi::base::Handle<nv::index::IFrame_results_list> frame_results_list(
791 m_index_rendering->render(
793 m_image_file_canvas.get(),
794 cur_viewport_list.get()));
797 if (frame_results_list->size() == 0)
799 ERROR_LOG <<
"IIndex_rendering rendering call has no results.";
804 for (mi::Size i = 0; i < frame_results_list->size(); ++i)
806 mi::base::Handle<nv::index::IFrame_results>
807 frame_results(frame_results_list->get(i));
810 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
812 if (err_set->any_errors())
814 std::ostringstream os;
816 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
817 const mi::Uint32 nb_err = err_set->get_nb_errors();
818 for (mi::Uint32 e = 0; e < nb_err; ++e)
820 if (e != 0) os <<
'\n';
821 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
822 os << err->get_error_string();
825 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
833 if (!(m_verify_image_path_base.empty()))
835 const std::string ref_img_fpath = get_output_file_name(m_verify_image_path_base, frame_idx);
836 if (!(verify_canvas_result(get_application_layer_interface(),
837 m_image_file_canvas.get(), ref_img_fpath, get_options())))
847void Multi_view_heightfield::create_views()
const
855 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
856 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
859 mi::base::Handle<const nv::index::ISession> session(
860 dice_transaction->access<nv::index::ISession>(m_session_tag));
865 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
868 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 0, 256);
869 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
871 viewport->set_position(viewport_pos);
872 viewport->set_size(viewport_size);
873 viewport->set_scope(m_global_scope.get());
875 m_viewport_list->append(viewport.get());
878 const mi::Size view_idx = 0;
879 setup_camera(m_camera_tag, view_idx, dice_transaction.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, 256);
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());
905 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
908 mi::neuraylib::IScope* parent = 0;
909 mi::Uint8 privacy_level = 1;
910 bool is_temp =
false;
911 mi::base::Handle<mi::neuraylib::IScope> local_scope(m_database->create_scope(parent, privacy_level, is_temp));
914 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 0, 0);
915 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
917 viewport->set_position(viewport_pos);
918 viewport->set_size(viewport_size);
919 viewport->set_scope(local_scope.get());
921 m_viewport_list->append(viewport.get());
926 mi::base::Handle<nv::index::IViewport> viewport(session->create_viewport());
929 mi::neuraylib::IScope* parent = 0;
930 mi::Uint8 privacy_level = 1;
931 bool is_temp =
false;
932 mi::base::Handle<mi::neuraylib::IScope> local_scope(m_database->create_scope(parent, privacy_level, is_temp));
935 const mi::math::Vector<mi::Sint32, 2> viewport_pos( 256, 0);
936 const mi::math::Vector<mi::Sint32, 2> viewport_size(256, 256);
938 viewport->set_position(viewport_pos);
939 viewport->set_size(viewport_size);
940 viewport->set_scope(local_scope.get());
942 m_viewport_list->append(viewport.get());
945 dice_transaction->commit();
950void Multi_view_heightfield::setup_scene(
951 mi::neuraylib::IDice_transaction* dice_transaction)
956 mi::base::Handle<const nv::index::ISession> session(
957 dice_transaction->access<
const nv::index::ISession>(m_session_tag));
961 mi::base::Handle<nv::index::IScene> scene_edit(
962 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
966 mi::base::Handle<nv::index::IStatic_scene_group> static_group_node(
967 scene_edit->create_scene_group<nv::index::IStatic_scene_group>());
971 const mi::math::Vector<mi::Uint32, 2> heightfield_size(500, 500);
973 nv::index::app::String_dict heightfield_opt;
974 heightfield_opt.insert(
"args::type",
"heightfield");
975 heightfield_opt.insert(
"args::importer",
"nv::index::plugin::legacy_importer.Synthetic_heightfield_generator");
976 heightfield_opt.insert(
"args::synthetic_type",
"i");
977 heightfield_opt.insert(
"args::size",
"500 500");
978 heightfield_opt.insert(
"args::range",
"0.1 1000");
979 nv::index::IDistributed_data_import_callback* importer_callback =
980 get_importer_from_application_layer(
981 get_application_layer_interface(),
982 "nv::index::plugin::legacy_importer.Synthetic_heightfield_generator",
987 const mi::Float32 rotate_k = 0.0f;
988 const mi::math::Vector<mi::Float32, 3> translate(0.0f, 0.0f, 0.0f);
989 const mi::math::Vector<mi::Float32, 3> scale(1.0f, 1.0f, 1.0f);
991 const mi::math::Vector<mi::Float32, 2> elevation_range(0.0f, 256.0f);
993 mi::base::Handle<nv::index::IRegular_heightfield> heightfield_scene_element(
994 scene_edit->create_regular_heightfield(
995 scale, rotate_k, translate,
1000 check_success(heightfield_scene_element.is_valid_interface());
1002 const mi::math::Bbox<mi::Float32, 3> heightfield_bbox = heightfield_scene_element->get_IJK_bounding_box();
1005 const std::string heightfield_name =
"synthetic heightfield";
1006 heightfield_scene_element->set_name(heightfield_name.c_str());
1009 const mi::neuraylib::Tag heightfield_tag =
1010 dice_transaction->store_for_reference_counting(heightfield_scene_element.get());
1013 m_heightfield_tag = heightfield_tag;
1018 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
1019 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
1021 const mi::math::Color color_intensity(1.0f, 1.0f, 1.0f, 1.0f);
1022 headlight->set_intensity(color_intensity);
1023 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(1.0f, -1.0f, -1.0f));
1024 const mi::neuraylib::Tag headlight_tag = dice_transaction->store_for_reference_counting(headlight.get());
1026 static_group_node->append(headlight_tag, dice_transaction);
1029 mi::base::Handle<nv::index::IPhong_gl> phong_1(scene_edit->create_attribute<nv::index::IPhong_gl>());
1033 phong_1->set_ambient(mi::math::Color(0.f, 0.3f, 0.0f, 0.3f));
1034 phong_1->set_diffuse(mi::math::Color(0.f, 0.8f, 0.2f, 0.3f));
1035 phong_1->set_specular(mi::math::Color(0.6f));
1036 phong_1->set_shininess(100.f);
1038 const mi::neuraylib::Tag phong_1_tag
1039 = dice_transaction->store_for_reference_counting(phong_1.get());
1042 m_phong_1_tag = phong_1_tag;
1044 static_group_node->append(phong_1_tag, dice_transaction);
1051 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter(
1052 scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>());
1054 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
1056 static_group_node->append(tex_filter_tag, dice_transaction);
1058 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
1059 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
1063 mi::base::Handle<nv::index::IDistributed_compute_technique> man_map(
1064 processing->get_sample_tool_set()->create_mandelbrot_2d_technique(mi::math::Vector<mi::Float32, 2>(1250.f, 680.f)));
1066 man_map->set_enabled(
false);
1069 mi::neuraylib::Tag man_map_tag = dice_transaction->store_for_reference_counting(man_map.get());
1072 m_mandelbrot_map_tag = man_map_tag;
1074 static_group_node->append(man_map_tag, dice_transaction);
1080 const mi::math::Vector<mi::Float32, 2> height_range(
1081 heightfield_bbox.min.z, heightfield_bbox.max.z);
1083 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter(
1084 scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>());
1086 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
1088 static_group_node->append(tex_filter_tag, dice_transaction);
1091 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
1092 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
1096 const mi::math::Color color0(0.f, 1.f, 0.f, 1.f);
1097 const mi::math::Color color1(1.f, 0.f, 0.f, 1.f);
1098 mi::base::Handle<nv::index::IDistributed_compute_technique> hv_map(
1099 processing->get_sample_tool_set()->create_color_encoded_elevation_technique(height_range, color0, color1));
1101 hv_map->set_enabled(
true);
1104 mi::neuraylib::Tag hv_map_tag = dice_transaction->store_for_reference_counting(hv_map.get());
1107 m_height_value_map_tag = hv_map_tag;
1109 static_group_node->append(hv_map_tag, dice_transaction);
1113 static_group_node->append(heightfield_tag, dice_transaction);
1114 mi::neuraylib::Tag static_group_node_tag =
1115 dice_transaction->store_for_reference_counting(static_group_node.get());
1118 m_hf_static_group_node_tag = static_group_node_tag;
1121 scene_edit->append(static_group_node_tag, dice_transaction);
1123 std::stringstream sstr;
1124 sstr <<
"Created an synthetic heightfield: size = "
1125 << heightfield_size <<
", tag = " << heightfield_tag.id;
1126 INFO_LOG << sstr.str();
1129 mi::base::Handle< nv::index::IPerspective_camera > cam(
1130 scene_edit->create_camera<nv::index::IPerspective_camera>());
1132 m_camera_tag = dice_transaction->store(cam.get());
1135 const mi::math::Vector<mi::Uint32,2> buffer_resolution(512, 512);
1136 m_image_file_canvas->set_resolution(buffer_resolution);
1140 const mi::math::Bbox<mi::Float32, 3> region_of_interest(
1142 static_cast< mi::Float32
>(heightfield_size.x),
1143 static_cast< mi::Float32
>(heightfield_size.y),
1144 static_cast< mi::Float32
>(heightfield_size.x)
1146 scene_edit->set_clipped_bounding_box(region_of_interest);
1149 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
1150 1.0f, 0.0f, 0.0f, 0.0f,
1151 0.0f, 1.0f, 0.0f, 0.0f,
1152 0.0f, 0.0f, -1.0f, 0.0f,
1153 0.0f, 0.0f, 0.0f, 1.0f
1156 scene_edit->set_transform_matrix(transform_mat);
1159 scene_edit->set_camera(m_camera_tag);
1163bool Multi_view_heightfield::setup_main_host()
1166 m_cluster_configuration =
1167 get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
1168 check_success(m_cluster_configuration.is_valid_interface());
1171 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
1176 check_success(is_local_host_joined(m_cluster_configuration.get()));
1179 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
1180 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
1186 m_index_session->create_session(dice_transaction.get());
1188 mi::base::Handle<const nv::index::ISession> session(
1189 dice_transaction->access<nv::index::ISession>(
1194 m_viewport_list = session->create_viewport_list();
1199 setup_scene(dice_transaction.get());
1201 dice_transaction->commit();
1204 m_image_file_canvas->set_resolution(mi::math::Vector<mi::Uint32, 2>(512, 512));
1206 INFO_LOG <<
"Initialization complete.";
1212void Multi_view_heightfield::print_pick_results(
1213 nv::index::IScene_pick_results* scene_pick_results)
const
1215 assert(scene_pick_results != 0);
1216 const mi::Uint32 nb_results = scene_pick_results->get_nb_results();
1219 INFO_LOG <<
"Number of pick results: " << nb_results <<
" on viewport: "
1220 << scene_pick_results->get_viewport_index();
1221 for (mi::Uint32 i = 0; i < nb_results; i++)
1224 const mi::base::Handle<nv::index::IScene_pick_result> result(scene_pick_results->get_result(i));
1226 std::stringstream log_out;
1227 log_out <<
"Intersection no. " << i <<
"\n"
1228 <<
"\t\t Element (tag) " << result->get_scene_element().id <<
"\n"
1229 <<
"\t\t Sub index: " << result->get_scene_element_sub_index() <<
"\n"
1230 <<
"\t\t Distance: " << result->get_distance() <<
"\n"
1231 <<
"\t\t Position (local space): " << result->get_intersection() <<
"\n"
1232 <<
"\t\t Color (evaluated): " << result->get_color() <<
"\n";
1234 const mi::base::Handle<const nv::index::IData_sample> data_sample(result->get_data_sample());
1237 const mi::base::Handle<const nv::index::IData_sample_uint8> ds_uint8(data_sample->get_interface<
const nv::index::IData_sample_uint8>());
1238 const mi::base::Handle<const nv::index::IData_sample_uint16> ds_uint16(data_sample->get_interface<
const nv::index::IData_sample_uint16>());
1239 const mi::base::Handle<const nv::index::IData_sample_float32> ds_float32(data_sample->get_interface<
const nv::index::IData_sample_float32>());
1240 const mi::base::Handle<const nv::index::IData_sample_rgba8> ds_rgba8(data_sample->get_interface<
const nv::index::IData_sample_rgba8>());
1243 log_out <<
"\t Data sample: " << mi::Uint32(ds_uint8->get_sample_value()) <<
"\n";
1247 log_out <<
"\t Data sample: " << ds_uint16->get_sample_value() <<
"\n";
1249 else if (ds_float32)
1251 log_out <<
"\t Data sample: " << ds_float32->get_sample_value() <<
"\n";
1255 log_out <<
"\t Data sample: " << ds_rgba8->get_sample_value() <<
"\n";
1259 INFO_LOG << log_out.str();
1262 if (result->get_intersection_info_class() == nv::index::IHeightfield_pick_result::IID())
1264 mi::base::Handle<const nv::index::IHeightfield_pick_result> compute_pick_result(
1265 result->get_interface<
const nv::index::IHeightfield_pick_result>());
1266 if (compute_pick_result && compute_pick_result->is_computing_enabled())
1268 INFO_LOG <<
"Specific pick results for computed heightfield texture:";
1269 INFO_LOG <<
"\t Computed color value: " << compute_pick_result->get_computed_color();
1276 INFO_LOG <<
"No pick result.";
1281bool Multi_view_heightfield::pick_test_call(
1282 const mi::math::Vector<mi::Sint32, 2>& pick_location_on_canvas,
1283 nv::index::IIndex_scene_query* iindex_query,
1284 bool expected_is_hit)
const
1286 assert(iindex_query != 0);
1287 INFO_LOG <<
"Picking at canvas position: " << pick_location_on_canvas;
1289 mi::base::Handle<nv::index::IViewport_list> cur_viewport_list(
1290 filter_enabled_viewport_index_list());
1294 mi::base::Handle<nv::index::IScene_pick_results_list> scene_pick_results_list(
1295 iindex_query->pick(pick_location_on_canvas,
1296 m_image_file_canvas.get(),
1297 cur_viewport_list.get(),
1299 assert(scene_pick_results_list.is_valid_interface());
1301 const mi::Size nb_list = scene_pick_results_list->size();
1302 mi::Size sum_results = 0;
1304 for (mi::Size i = 0; i < nb_list; ++i)
1307 mi::base::Handle<nv::index::IScene_pick_results> scene_pick_results(
1308 scene_pick_results_list->get(i));
1309 print_pick_results(scene_pick_results.get());
1310 sum_results += scene_pick_results->get_nb_results();
1313 if ((sum_results > 0) != expected_is_hit)
1315 INFO_LOG <<
"expected_is_hit: " << expected_is_hit <<
", but sum_results: " << sum_results;
1324int main(
int argc,
const char* argv[])
1326 nv::index::app::String_dict sdict;
1327 sdict.insert(
"dice::verbose",
"4");
1328 sdict.insert(
"outfname",
"frame_multi_view_heightfield");
1329 sdict.insert(
"verify_image_path_base",
"");
1330 sdict.insert(
"unittest",
"0");
1331 sdict.insert(
"enable_vidx_vec",
"1 1 1 1");
1334 sdict.insert(
"dice::network::mode",
"OFF");
1337 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
1338 sdict.insert(
"index::service",
"rendering_and_compositing");
1339 sdict.insert(
"index::cuda_debug_checks",
"false");
1342 sdict.insert(
"index::app::components::application_layer::component_name_list",
1343 "canvas_infrastructure image io data_analysis_and_processing");
1344 sdict.insert(
"index::app::plugins::base_importer::enabled",
"true");
1345 sdict.insert(
"index::app::plugins::legacy_importer::enabled",
"true");
1349 multi_view_heightfield.initialize(argc, argv, sdict);
1353 const mi::Sint32 exit_code = multi_view_heightfield.
launch();
1354 INFO_LOG <<
"Shutting down ...";
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
virtual ~Multi_view_heightfield()
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)