10#include "utility/example_shared.h"
12#include <nv/index/icamera.h>
13#include <nv/index/iconfig_settings.h>
14#include <nv/index/iindex.h>
15#include <nv/index/ilight.h>
16#include <nv/index/imaterial.h>
17#include <nv/index/iscene.h>
18#include <nv/index/isession.h>
19#include <nv/index/itexture_filter_mode.h>
22#include <nv/index/app/idata_analysis_and_processing.h>
23#include <nv/index/app/index_connect.h>
24#include <nv/index/app/string_dict.h>
26#include "utility/canvas_utility.h"
33 public nv::index::app::Index_connect
53 virtual bool evaluate_options(nv::index::app::String_dict& sdict) CPP11_OVERRIDE;
56 mi::neuraylib::INetwork_configuration* network_configuration,
57 nv::index::app::String_dict& options) CPP11_OVERRIDE
62 const bool is_unittest = nv::index::app::get_bool(options.get(
"unittest"));
65 info_cout(
"NETWORK: disabled networking mode.", options);
66 network_configuration->set_mode(mi::neuraylib::INetwork_configuration:
:MODE_OFF);
70 return initialize_networking_as_default_udp(network_configuration, options);
76 void setup_camera(nv::index::IPerspective_camera* cam)
const;
84 void setup_extreme_transformed_camera(nv::index::IPerspective_camera* cam)
const;
91 mi::math::Matrix<mi::Float32, 4, 4> get_extreme_transformed_matrix()
const;
97 nv::index::IFrame_results* render_frame(
const std::string& output_fname)
const;
100 mi::neuraylib::Tag m_session_tag;
102 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
104 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
106 std::string m_outfname;
108 std::string m_verify_image_fname;
111 bool m_supersampling;
112 std::string m_texture;
114 bool m_is_large_translate;
120 mi::Sint32 exit_code = 0;
122 m_cluster_configuration = get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
126 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
130 check_success(is_local_host_joined(m_cluster_configuration.get()));
134 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
135 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
139 m_session_tag = m_index_session->create_session(dice_transaction.get());
144 mi::base::Handle<const nv::index::ISession> the_session(
145 dice_transaction->access<
const nv::index::ISession>(m_session_tag));
148 mi::base::Handle<nv::index::IConfig_settings> config_settings(
149 dice_transaction->edit<nv::index::IConfig_settings>(the_session->get_config()));
155 INFO_LOG <<
"Enable supersampling.";
156 config_settings->set_rendering_samples(8);
163 mi::base::Handle<const nv::index::ISession> session(
164 dice_transaction->access<
const nv::index::ISession>(m_session_tag));
168 mi::base::Handle<nv::index::IScene> scene_edit(
169 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
173 mi::base::Handle<nv::index::IStatic_scene_group> static_group_node(
174 scene_edit->create_scene_group<nv::index::IStatic_scene_group>());
178 const mi::math::Vector<mi::Uint32, 2> heightfield_size(500, 500);
180 nv::index::app::String_dict heightfield_opt;
181 heightfield_opt.insert(
"args::type",
"heightfield");
182 heightfield_opt.insert(
"args::importer",
"nv::index::plugin::legacy_importer.Synthetic_heightfield_generator");
183 heightfield_opt.insert(
"args::synthetic_type",
"i");
184 heightfield_opt.insert(
"args::size",
"500 500");
185 heightfield_opt.insert(
"args::range",
"0.1 1000");
186 nv::index::IDistributed_data_import_callback* importer_callback =
187 get_importer_from_application_layer(
188 get_application_layer_interface(),
189 "nv::index::plugin::legacy_importer.Synthetic_heightfield_generator",
193 const mi::Float32 rotate_k = 0.0f;
194 const mi::math::Vector<mi::Float32, 3> translate(0.0f, 0.0f, 0.0f);
195 const mi::math::Vector<mi::Float32, 3> scale(1.0f, 1.0f, 1.0f);
196 const mi::math::Vector<mi::Float32, 2> elevation_range(50.0f, 256.0f);
198 mi::base::Handle<nv::index::IRegular_heightfield> heightfield_scene_element(
199 scene_edit->create_regular_heightfield(
200 scale, rotate_k, translate,
204 dice_transaction.get()));
205 check_success(heightfield_scene_element.is_valid_interface());
207 const mi::math::Bbox<mi::Float32, 3> heightfield_bbox = heightfield_scene_element->get_IJK_bounding_box();
210 const std::string heightfield_name =
"synthetic heightfield";
211 heightfield_scene_element->set_name(heightfield_name.c_str());
218 std::vector<mi::math::Vector<mi::Float32, 3> > seed_line;
219 seed_line.push_back(mi::math::Vector<mi::Float32, 3>(400.f, 100.f, 100.f));
220 seed_line.push_back(mi::math::Vector<mi::Float32, 3>(500.f, 100.f, 200.f));
222 heightfield_scene_element->add_seed_line(&seed_line[0], seed_line.size());
227 std::vector<mi::math::Vector<mi::Float32, 3> > seed_points;
228 for (
int i = 0; i < 100; ++i)
230 seed_points.push_back(mi::math::Vector<mi::Float32, 3>(
231 360.0f,
static_cast<mi::Float32
>(i) * 10.0f, 100.0f));
234 heightfield_scene_element->add_seed_points(&seed_points[0], seed_points.size());
242 mi::base::Handle<nv::index::IHeightfield_geometry_settings> point_settings(
243 scene_edit->create_attribute<nv::index::IHeightfield_geometry_settings>());
246 point_settings->set_type_mask(nv::index::IHeightfield_geometry_settings:
:TYPE_SEED_POINTS);
248 point_settings->set_color_mode(nv::index::IHeightfield_geometry_settings:
:MODE_FIXED);
250 point_settings->set_color(mi::math::Color(0.f, 0.f, 1.f));
252 point_settings->set_visible(
true);
254 const mi::neuraylib::Tag point_settings_tag
255 = dice_transaction->store_for_reference_counting(point_settings.get());
257 static_group_node->append(point_settings_tag, dice_transaction.get());
262 mi::base::Handle<nv::index::IHeightfield_geometry_settings> line_settings(
263 scene_edit->create_attribute<nv::index::IHeightfield_geometry_settings>());
266 line_settings->set_type_mask(nv::index::IHeightfield_geometry_settings:
:TYPE_SEED_LINES);
268 line_settings->set_color_mode(nv::index::IHeightfield_geometry_settings:
:MODE_FIXED);
270 line_settings->set_color(mi::math::Color(1.f, 0.f, 0.f));
272 line_settings->set_visible(
true);
274 const mi::neuraylib::Tag line_settings_tag
275 = dice_transaction->store_for_reference_counting(line_settings.get());
277 static_group_node->append(line_settings_tag, dice_transaction.get());
282 const mi::neuraylib::Tag heightfield_tag =
283 dice_transaction->store_for_reference_counting(heightfield_scene_element.get());
289 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
290 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
292 const mi::math::Color color_intensity(1.0f, 1.0f, 1.0f, 1.0f);
293 headlight->set_intensity(color_intensity);
294 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(1.0f, -1.0f, -1.0f));
295 const mi::neuraylib::Tag headlight_tag = dice_transaction->store_for_reference_counting(headlight.get());
297 static_group_node->append(headlight_tag, dice_transaction.get());
300 mi::base::Handle<nv::index::IPhong_gl> phong_1(scene_edit->create_attribute<nv::index::IPhong_gl>());
306 phong_1->set_ambient(mi::math::Color(1.f));
307 phong_1->set_diffuse(mi::math::Color(0.f));
308 phong_1->set_specular(mi::math::Color(0.f));
313 phong_1->set_ambient(mi::math::Color(0.f, 0.3f, 0.0f, 0.3f));
314 phong_1->set_diffuse(mi::math::Color(0.f, 0.8f, 0.2f, 0.3f));
315 phong_1->set_specular(mi::math::Color(0.6f));
316 phong_1->set_shininess(100.f);
319 const mi::neuraylib::Tag phong_1_tag
320 = dice_transaction->store_for_reference_counting(phong_1.get());
322 static_group_node->append(phong_1_tag, dice_transaction.get());
329 if (m_texture ==
"mandelbrot")
331 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter(
332 scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>());
334 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
336 static_group_node->append(tex_filter_tag, dice_transaction.get());
339 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
340 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
344 mi::base::Handle<nv::index::IDistributed_compute_technique> mapping(
345 processing->get_sample_tool_set()->create_mandelbrot_2d_technique(mi::math::Vector<mi::Float32, 2>(1250.f, 680.f)));
348 mi::neuraylib::Tag mapping_tag = dice_transaction->store_for_reference_counting(mapping.get());
350 static_group_node->append(mapping_tag, dice_transaction.get());
353 else if (m_texture ==
"height_color")
356 const mi::math::Vector<mi::Float32, 2> height_range(
357 heightfield_bbox.min.z, heightfield_bbox.max.z);
359 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter(
360 scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>());
362 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
364 static_group_node->append(tex_filter_tag, dice_transaction.get());
367 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
368 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
372 const mi::math::Color color0(0.f, 1.f, 0.f, 1.f);
373 const mi::math::Color color1(1.f, 0.f, 0.f, 1.f);
374 mi::base::Handle<nv::index::IDistributed_compute_technique> mapping(
375 processing->get_sample_tool_set()->create_color_encoded_elevation_technique(height_range, color0, color1));
379 mi::neuraylib::Tag mapping_tag = dice_transaction->store_for_reference_counting(mapping.get());
380 static_group_node->append(mapping_tag, dice_transaction.get());
384 ERROR_LOG <<
"Unknown texture mode '" << m_texture <<
"'";
390 static_group_node->append(heightfield_tag, dice_transaction.get());
391 mi::neuraylib::Tag static_group_node_tag =
392 dice_transaction->store_for_reference_counting(static_group_node.get());
396 scene_edit->append(static_group_node_tag, dice_transaction.get());
398 std::stringstream sstr;
399 sstr <<
"Created a synthetic heightfield: size = "
400 << heightfield_size <<
", tag = " << heightfield_tag.id;
401 INFO_LOG << sstr.str();
404 mi::base::Handle< nv::index::IPerspective_camera > cam(
405 scene_edit->create_camera<nv::index::IPerspective_camera>());
408 mi::math::Vector<mi::Uint32,2> buffer_resolution;
409 if (m_is_large_translate)
411 INFO_LOG <<
"large translate test mode.";
412 setup_extreme_transformed_camera(cam.get());
413 buffer_resolution = mi::math::Vector<mi::Uint32,2>(1602, 934);
417 setup_camera(cam.get());
418 buffer_resolution = mi::math::Vector<mi::Uint32,2>(512, 512);
420 const mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
422 m_image_file_canvas->set_resolution(buffer_resolution);
426 const mi::math::Bbox<mi::Float32, 3> region_of_interest(
428 static_cast< mi::Float32
>(heightfield_size.x),
429 static_cast< mi::Float32
>(heightfield_size.y),
430 static_cast< mi::Float32
>(heightfield_size.x)
432 scene_edit->set_clipped_bounding_box(region_of_interest);
435 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
436 1.0f, 0.0f, 0.0f, 0.0f,
437 0.0f, 1.0f, 0.0f, 0.0f,
438 0.0f, 0.0f, -1.0f, 0.0f,
439 0.0f, 0.0f, 0.0f, 1.0f
442 if (m_is_large_translate)
444 transform_mat = get_extreme_transformed_matrix();
447 scene_edit->set_transform_matrix(transform_mat);
450 scene_edit->set_camera(camera_tag);
453 dice_transaction->commit();
459 const mi::Sint32 frame_idx = 0;
460 const std::string fname = get_output_file_name(m_outfname, frame_idx);
464 const std::string depth_file_name = m_outfname +
"_depth_buffer";
465 m_image_file_canvas->set_depth_file_name(get_output_file_name(depth_file_name, frame_idx).c_str());
468 mi::base::Handle<nv::index::IFrame_results> frame_results(render_frame(fname));
469 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
470 if (err_set->any_errors())
472 std::ostringstream os;
473 const mi::Uint32 nb_err = err_set->get_nb_errors();
474 for (mi::Uint32 e = 0; e < nb_err; ++e)
476 if (e != 0) os <<
'\n';
477 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
478 os << err->get_error_string();
481 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
492 if (!verify_canvas_result(get_application_layer_interface(),
493 m_image_file_canvas.get(), m_verify_image_fname, get_options()))
507 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
508 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
512 if (nv::index::app::get_bool(sdict.get(
"is_call_from_test",
"false")))
514 sdict.insert(
"is_dump_comparison_image_when_failed",
"0");
516 sdict.insert(
"outfname",
"");
517 sdict.insert(
"dice::verbose",
"2");
520 m_outfname = sdict.get(
"outfname");
521 m_verify_image_fname = sdict.get(
"verify_image_fname");
522 m_seeds = nv::index::app::get_bool(sdict.get(
"seeds",
"false"));
523 m_depth_buffer = nv::index::app::get_bool(sdict.get(
"depth_buffer",
"false"));
524 m_supersampling = nv::index::app::get_bool(sdict.get(
"supersampling",
"false"));
525 m_texture = sdict.get(
"texture");
526 m_use_texture = m_texture !=
"none";
527 m_is_large_translate = nv::index::app::get_bool(sdict.get(
"is_large_translate",
"false"));
529 info_cout(
"running " + com_name, sdict);
530 info_cout(
"outfname = [" + m_outfname +
531 "], verify_image_fname = [" + m_verify_image_fname +
532 "], dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
535 if (sdict.is_defined(
"h"))
538 <<
"info: Usage: " << com_name <<
" [option]\n"
540 <<
" print out this message\n"
541 <<
" [-dice::verbose severity_level]\n"
542 <<
" verbose severity level (3 is info). (default: " + sdict.get(
"dice::verbose")
545 <<
" [-seeds bool]\n"
546 <<
" render with additional 'seed' points and lines. (default: " + m_seeds
549 <<
" [-depth_buffer bool]\n"
550 <<
" render depth buffer and store depth buffer as image (ppm). (default: " + m_depth_buffer
553 <<
" [-supersampling bool]\n"
554 <<
" when true then supersampling is enabled."
555 <<
"(default: " << m_supersampling <<
")\n"
557 <<
" [-texture mode]\n"
558 <<
" map a computed texture onto the heightfield.\n"
559 <<
" Available modes: none, mandelbrot, height_color\n"
560 <<
" (default: " << m_texture <<
")\n"
562 <<
" [-is_large_translate bool]\n"
563 <<
" on/off large translation mode."
564 <<
"(default: " << m_is_large_translate <<
")\n"
566 <<
" [-outfname string]\n"
567 <<
" output ppm file base name. When empty, no output.\n"
568 <<
" A frame number and extension (.ppm) will be added.\n"
569 <<
" (default: [" << m_outfname <<
"])\n"
571 <<
" [-verify_image_fname image_fname]\n"
572 <<
" when image_fname exist, verify the rendering image.\n"
573 <<
" (default: [" << m_verify_image_fname <<
"])\n"
575 <<
" [-unittest bool]\n"
576 <<
" when true, unit test mode. "
577 <<
"(default: [" << m_is_unittest <<
"])"
586void Create_synthetic_heightfield::setup_camera(nv::index::IPerspective_camera* cam)
const
591 const mi::math::Vector<mi::Float32, 3> from(700, 700, 200);
592 const mi::math::Vector<mi::Float32, 3> to ( 250.f, 250.f, -200.f);
593 const mi::math::Vector<mi::Float32, 3> up ( 0.f, 0.f, 1.0f);
594 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
597 cam->set(from, viewdir, up);
598 cam->set_aperture(0.033f);
599 cam->set_aspect(1.0f);
600 cam->set_focal(0.03f);
601 cam->set_clip_min(2.0f);
602 cam->set_clip_max(1000.0f);
606void Create_synthetic_heightfield::setup_extreme_transformed_camera(nv::index::IPerspective_camera* cam)
const
624 mi::math::Vector< mi::Float32, 3 >
const from( 1805060.125f + 20480.0f, 9978520.0f + 20480.0f, 2048.0f);
625 mi::math::Vector< mi::Float32, 3 >
const to ( 1805060.125f + 5120.0f, 9978520.0f + 5120.0f, -1024.0f);
626 mi::math::Vector< mi::Float32, 3 >
const up ( 0.0f, 0.0f, 1.0f);
627 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
630 cam->set(from, viewdir, up);
631 cam->set_aperture(0.033f);
632 cam->set_aspect(1.71520f);
633 cam->set_focal(0.03f);
634 cam->set_clip_min(124.485f);
635 cam->set_clip_max(17585.6f);
637 INFO_LOG <<
"Set camera extreme mode";
641mi::math::Matrix<mi::Float32, 4, 4> Create_synthetic_heightfield::get_extreme_transformed_matrix()
const
648 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
649 20.0f, 0.0f, 0.0f, 0.0f,
650 0.0f, 20.0, 0.0f, 0.0f,
651 0.0f, 0.0f, -20.0f, 0.0f,
652 1805060.0f, 9978520.0f, 0.0f, 1.0f
655 return transform_mat;
659nv::index::IFrame_results* Create_synthetic_heightfield::render_frame(
const std::string& output_fname)
const
664 m_image_file_canvas->set_rgba_file_name(output_fname.c_str());
668 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
669 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
672 m_index_session->update(m_session_tag, dice_transaction.get());
674 mi::base::Handle<nv::index::IFrame_results> frame_results(
675 m_index_rendering->render(
677 m_image_file_canvas.get(),
678 dice_transaction.get()));
681 dice_transaction->commit();
683 frame_results->retain();
684 return frame_results.get();
689int main(
int argc,
const char* argv[])
691 nv::index::app::String_dict sdict;
692 sdict.insert(
"dice::verbose",
"3");
693 sdict.insert(
"seeds",
"0");
694 sdict.insert(
"depth_buffer",
"0");
695 sdict.insert(
"outfname",
"frame_create_synthetic_heightfield");
696 sdict.insert(
"verify_image_fname",
"");
697 sdict.insert(
"unittest",
"0");
698 sdict.insert(
"supersampling",
"0");
699 sdict.insert(
"texture",
"none");
700 sdict.insert(
"is_large_translate",
"0");
701 sdict.insert(
"is_dump_comparison_image_when_failed",
"1");
702 sdict.insert(
"is_call_from_test",
"0");
705 sdict.insert(
"dice::network::mode",
"OFF");
708 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
709 sdict.insert(
"index::service",
"rendering_and_compositing");
710 sdict.insert(
"index::cuda_debug_checks",
"false");
713 sdict.insert(
"index::app::components::application_layer::component_name_list",
714 "canvas_infrastructure image io data_analysis_and_processing");
715 sdict.insert(
"index::app::plugins::base_importer::enabled",
"true");
716 sdict.insert(
"index::app::plugins::legacy_importer::enabled",
"true");
720 create_synthetic_heightfield.initialize(argc, argv, sdict);
721 check_success(create_synthetic_heightfield.is_initialized());
724 const mi::Sint32 exit_code = create_synthetic_heightfield.
launch();
725 INFO_LOG <<
"Shutting down ...";
virtual bool initialize_networking(mi::neuraylib::INetwork_configuration *network_configuration, nv::index::app::String_dict &options) CPP11_OVERRIDE
virtual ~Create_synthetic_heightfield()
Create_synthetic_heightfield()
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
int main(int argc, const char *argv[])
#define check_success(expr)