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/iplane.h>
18#include <nv/index/iscene.h>
19#include <nv/index/iscene_group.h>
20#include <nv/index/isession.h>
21#include <nv/index/itexture_filter_mode.h>
23#include "utility/canvas_utility.h"
25#include <nv/index/app/idata_analysis_and_processing.h>
26#include <nv/index/app/index_connect.h>
27#include <nv/index/app/string_dict.h>
28#include <nv/index/app/time_functions.h>
35 public nv::index::app::Index_connect
42 m_supersampling(false),
43 m_is_large_translate(false)
58 virtual bool evaluate_options(nv::index::app::String_dict& sdict) CPP11_OVERRIDE;
61 mi::neuraylib::INetwork_configuration* network_configuration,
62 nv::index::app::String_dict& options) CPP11_OVERRIDE
67 const bool is_unittest = nv::index::app::get_bool(options.get(
"unittest"));
70 info_cout(
"NETWORK: disabled networking mode.", options);
71 network_configuration->set_mode(mi::neuraylib::INetwork_configuration:
:MODE_OFF);
75 return initialize_networking_as_default_udp(network_configuration, options);
81 nv::index::IScene* scene_edit,
82 mi::neuraylib::IDice_transaction* dice_transaction);
85 void setup_camera(nv::index::IPerspective_camera* cam)
const;
91 void setup_extreme_transformed_camera(nv::index::IPerspective_camera* cam)
const;
98 mi::math::Matrix<mi::Float32, 4, 4> get_extreme_transformed_matrix()
const;
104 nv::index::IFrame_results* render_frame(
const std::string& output_fname)
const;
107 mi::neuraylib::Tag m_session_tag;
109 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
111 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
113 std::string m_outfname;
115 std::string m_verify_image_fname;
116 bool m_supersampling;
117 bool m_is_large_translate;
123 mi::Sint32 exit_code = 0;
127 m_cluster_configuration =
128 get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
132 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
136 const int max_retry = 3;
137 for (
int retry = 0; retry < max_retry; ++retry)
139 if (m_cluster_configuration->get_number_of_hosts() == 0)
141 INFO_LOG <<
"no host joined yet, retry "
142 << (retry + 1) <<
"/" << max_retry;
143 nv::index::app::util::time::sleep(0.3f);
146 check_success(m_cluster_configuration->get_number_of_hosts() != 0);
150 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
151 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
155 m_session_tag = m_index_session->create_session(dice_transaction.get());
158 mi::base::Handle<const nv::index::ISession> session(dice_transaction->access<nv::index::ISession>(m_session_tag));
161 mi::base::Handle< nv::index::IScene > scene_edit(
162 dice_transaction->edit< nv::index::IScene >(session->get_scene()));
168 INFO_LOG <<
"Enable supersampling.";
170 mi::base::Handle<nv::index::IConfig_settings> config_settings(
171 dice_transaction->edit<nv::index::IConfig_settings>(session->get_config()));
174 config_settings->set_rendering_samples(8);
180 create_planes(scene_edit.get(), dice_transaction.get());
182 mi::base::Handle< nv::index::IPerspective_camera > cam(
183 scene_edit->create_camera<nv::index::IPerspective_camera>());
186 mi::math::Vector<mi::Uint32, 2> buffer_resolution;
187 if (m_is_large_translate)
189 INFO_LOG <<
"large translate test mode.";
190 setup_extreme_transformed_camera(cam.get());
191 buffer_resolution = mi::math::Vector<mi::Uint32, 2>(1602, 934);
195 setup_camera(cam.get());
196 buffer_resolution = mi::math::Vector<mi::Uint32, 2>(512, 512);
198 const mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
201 m_image_file_canvas->set_resolution(buffer_resolution);
204 const mi::math::Bbox_struct<mi::Float32, 3> xyz_roi_st = {
205 { -1000.0f, -1000.0f, -1000.0f, },
206 { 1000.0f, 1000.0f, 1000.0f, },
210 const mi::math::Bbox< mi::Float32, 3 > xyz_roi(xyz_roi_st);
212 scene_edit->set_clipped_bounding_box(xyz_roi_st);
216 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
217 1.0f, 0.0f, 0.0f, 0.0f,
218 0.0f, 1.0f, 0.0f, 0.0f,
219 0.0f, 0.0f, -1.0f, 0.0f,
220 0.0f, 0.0f, 0.0f, 1.0f
223 if(m_is_large_translate)
225 transform_mat = get_extreme_transformed_matrix();
228 scene_edit->set_transform_matrix(transform_mat);
232 scene_edit->set_camera(camera_tag);
235 dice_transaction->commit();
241 const mi::Sint32 frame_idx = 0;
242 const std::string fname = get_output_file_name(m_outfname, frame_idx);
243 mi::base::Handle<nv::index::IFrame_results> frame_results(render_frame(fname));
244 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
245 if (err_set->any_errors())
247 std::ostringstream os;
248 const mi::Uint32 nb_err = err_set->get_nb_errors();
249 for (mi::Uint32 e = 0; e < nb_err; ++e)
251 if (e != 0) os <<
'\n';
252 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
253 os << err->get_error_string();
256 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
262 if (!(verify_canvas_result(get_application_layer_interface(),
263 m_image_file_canvas.get(), m_verify_image_fname, get_options())))
276 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
277 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
281 if (nv::index::app::get_bool(sdict.get(
"is_call_from_test",
"false")))
283 sdict.insert(
"is_dump_comparison_image_when_failed",
"0");
285 sdict.insert(
"outfname",
"");
286 sdict.insert(
"dice::verbose",
"2");
290 m_outfname = sdict.get(
"outfname");
291 m_verify_image_fname = sdict.get(
"verify_image_fname");
292 m_supersampling = nv::index::app::get_bool(sdict.get(
"supersampling",
"false"));
293 m_is_large_translate = nv::index::app::get_bool(sdict.get(
"is_large_translate",
"false"));
295 info_cout(std::string(
"running ") + com_name, sdict);
296 info_cout(
"outfname = [" + sdict.get(
"outfname") +
297 "], dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
300 if (sdict.is_defined(
"h"))
303 <<
"info: Usage: " << com_name <<
" [option]\n"
305 <<
" printout this message\n"
306 <<
" [-dice::verbose severity_level]\n"
307 <<
" verbose severity level (3 is info.). (default: " + sdict.get(
"dice::verbose")
310 <<
" [-supersampling bool]\n"
311 <<
" when true then supersampling is enabled."
312 <<
"(default: " << m_supersampling <<
")\n"
314 <<
" [-is_large_translate bool]\n"
315 <<
" on/off large translation mode."
316 <<
"(default: " << m_is_large_translate <<
")\n"
318 <<
" [-outfname string]\n"
319 <<
" output ppm file base name. When empty, no output.\n"
320 <<
" A frame number and extension (.ppm) will be added.\n"
321 <<
" (default: [" << m_outfname <<
"])\n"
323 <<
" [-verify_image_fname [image_fname]]\n"
324 <<
" when image_fname exist, verify the rendering image. (default: ["
325 << m_verify_image_fname <<
"])\n"
327 <<
" [-unittest bool]\n"
328 <<
" when true, unit test mode. "
329 << m_is_unittest <<
"])"
337void Create_plane::create_planes(
338 nv::index::IScene* scene_edit,
339 mi::neuraylib::IDice_transaction* dice_transaction)
344 mi::base::Handle<nv::index::ITransformed_scene_group> group_node(
345 scene_edit->create_scene_group<nv::index::ITransformed_scene_group>());
351 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
352 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
354 const mi::math::Color_struct color_intensity = { 1.0f, 1.0f, 1.0f, 1.0f, };
355 headlight->set_intensity(color_intensity);
356 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(1.0f, -1.0f, -1.0f));
357 const mi::neuraylib::Tag headlight_tag = dice_transaction->store_for_reference_counting(headlight.get());
359 group_node->append(headlight_tag, dice_transaction);
362 mi::base::Handle<nv::index::IPhong_gl> phong_1(
363 scene_edit->create_attribute<nv::index::IPhong_gl>());
365 phong_1->set_ambient(mi::math::Color(1.0f, 1.0f, 1.0f));
366 phong_1->set_diffuse(mi::math::Color(0.0f));
367 phong_1->set_specular(mi::math::Color(0.0f));
369 mi::neuraylib::Tag phong_1_tag = dice_transaction->store_for_reference_counting(phong_1.get());
371 group_node->append(phong_1_tag, dice_transaction);
379 mi::math::Vector<mi::Float32, 3> plane_point(-400.f, -250.f, 1.0f);
380 mi::math::Vector<mi::Float32, 3> plane_normal(0.f, 0.f, 1.f);
381 mi::math::Vector<mi::Float32, 3> plane_up(0.f, 1.f, 0.f);
382 mi::math::Vector<mi::Float32, 2> plane_extent(800.0f, 500.0f);
384 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter(
385 scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>());
387 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
389 group_node->append(tex_filter_tag, dice_transaction);
392 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
393 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
397 mi::base::Handle<nv::index::IDistributed_compute_technique> mapping(
398 processing->get_sample_tool_set()->create_mandelbrot_2d_technique(
399 plane_extent, nv::index::IDistributed_compute_destination_buffer_2d_texture:
:FORMAT_RGBA_FLOAT32));
401 mi::neuraylib::Tag mapping_tag = dice_transaction->store_for_reference_counting(mapping.get());
403 group_node->append(mapping_tag, dice_transaction);
405 mi::base::Handle<nv::index::IPlane> plane(
406 scene_edit->create_shape<nv::index::IPlane>());
408 plane->set_point(plane_point);
409 plane->set_normal(plane_normal);
410 plane->set_up(plane_up);
411 plane->set_extent(plane_extent);
413 mi::neuraylib::Tag plane_tag = dice_transaction->store_for_reference_counting(plane.get());
415 group_node->append(plane_tag, dice_transaction);
422 mi::math::Vector<mi::Float32, 3> plane_point(-50.0f, 50.0f, 700.0f);
423 mi::math::Vector<mi::Float32, 3> plane_normal(1.f, 1.f, 1.f);
424 mi::math::Vector<mi::Float32, 3> plane_up(-1.f, 1.f, 0.f);
425 mi::math::Vector<mi::Float32, 2> plane_extent(400.0f, 400.0f);
427 const bool enable_texture_filtering =
true;
428 const mi::Sint32 colormap_entry_id = 40;
429 mi::neuraylib::Tag colormap_tag =
430 create_colormap(colormap_entry_id, scene_edit, dice_transaction);
432 group_node->append(colormap_tag, dice_transaction);
434 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter;
436 if (enable_texture_filtering)
438 tex_filter = scene_edit->create_attribute<nv::index::ITexture_filter_mode_linear>();
442 tex_filter = scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>();
445 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
447 group_node->append(tex_filter_tag, dice_transaction);
450 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
451 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
455 mi::base::Handle<nv::index::IDistributed_compute_technique> mapping(
456 processing->get_sample_tool_set()->create_mandelbrot_2d_technique(
457 plane_extent, nv::index::IDistributed_compute_destination_buffer_2d_texture:
:FORMAT_SCALAR_UINT8));
459 mi::neuraylib::Tag mapping_tag = dice_transaction->store_for_reference_counting(mapping.get());
461 group_node->append(mapping_tag, dice_transaction);
463 mi::base::Handle<nv::index::IPlane> plane(
464 scene_edit->create_shape<nv::index::IPlane>());
466 plane->set_point(plane_point);
467 plane->set_normal(plane_normal);
468 plane->set_up(plane_up);
469 plane->set_extent(plane_extent);
471 mi::neuraylib::Tag plane_tag = dice_transaction->store_for_reference_counting(plane.get());
473 group_node->append(plane_tag, dice_transaction);
477 mi::neuraylib::Tag group_tag = dice_transaction->store_for_reference_counting(group_node.get());
479 scene_edit->append(group_tag, dice_transaction);
484void Create_plane::setup_camera(nv::index::IPerspective_camera* cam)
const
489 const mi::math::Vector<mi::Float32, 3> from(100.0f, 0.0f, -1000.0f);
490 const mi::math::Vector<mi::Float32, 3> to (0.0f, 250.0f, 0.0f);
491 const mi::math::Vector<mi::Float32, 3> up (0.0f, 1.0f, 0.0f);
492 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
495 cam->set(from, viewdir, up);
496 cam->set_aperture(0.033f);
497 cam->set_aspect(1.0f);
498 cam->set_focal(0.03f);
499 cam->set_clip_min(80.0f);
500 cam->set_clip_max(5000.0f);
504void Create_plane::setup_extreme_transformed_camera(
505 nv::index::IPerspective_camera* cam)
const
520 mi::math::Vector< mi::Float32, 3 >
const from( 1805060.125f + 5120.0f, 9978520.0f + 0.0f, -30720.0f);
521 mi::math::Vector< mi::Float32, 3 >
const to ( 1805060.125f + 0.0f, 9978520.0f + 2560.0f, 0.0f);
522 mi::math::Vector< mi::Float32, 3 >
const up ( 0.0f, 1.0f, 0.0f);
523 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
526 cam->set(from, viewdir, up);
527 cam->set_aperture(0.033f);
528 cam->set_aspect(1.71520f);
529 cam->set_focal(0.03f);
530 cam->set_clip_min(124.485f);
531 cam->set_clip_max(17585.6f);
533 INFO_LOG <<
"Set camera extreme mode";
537mi::math::Matrix<mi::Float32, 4, 4> Create_plane::get_extreme_transformed_matrix()
const
545 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
546 20.0f, 0.0f, 0.0f, 0.0f,
547 0.0f, 20.0f, 0.0f, 0.0f,
548 0.0f, 0.0f, -20.0f, 0.0f,
549 1805060.0f, 9978520.0f, 0.0f, 1.0f
551 return transform_mat;
555nv::index::IFrame_results* Create_plane::render_frame(
const std::string& output_fname)
const
560 m_image_file_canvas->set_rgba_file_name(output_fname.c_str());
564 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
565 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
568 m_index_session->update(m_session_tag, dice_transaction.get());
570 mi::base::Handle<nv::index::IFrame_results> frame_results(
571 m_index_rendering->render(
573 m_image_file_canvas.get(),
574 dice_transaction.get()));
577 dice_transaction->commit();
579 frame_results->retain();
580 return frame_results.get();
584int main(
int argc,
const char* argv[])
586 nv::index::app::String_dict sdict;
587 sdict.insert(
"dice::verbose",
"3");
588 sdict.insert(
"outfname",
"frame_create_plane");
589 sdict.insert(
"verify_image_fname",
"");
590 sdict.insert(
"unittest",
"0");
591 sdict.insert(
"supersampling",
"0");
592 sdict.insert(
"is_large_translate",
"0");
593 sdict.insert(
"is_dump_comparison_image_when_failed",
"1");
594 sdict.insert(
"is_call_from_test",
"0");
597 sdict.insert(
"dice::network::mode",
"OFF");
600 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
601 sdict.insert(
"index::service",
"rendering_and_compositing");
602 sdict.insert(
"index::cuda_debug_checks",
"false");
605 sdict.insert(
"index::app::components::application_layer::component_name_list",
606 "canvas_infrastructure image io data_analysis_and_processing");
610 create_plane.initialize(argc, argv, sdict);
614 const mi::Sint32 exit_code = create_plane.
launch();
615 INFO_LOG <<
"Shutting down ...";
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
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)