10#include "utility/example_shared.h"
12#include <nv/index/icamera.h>
13#include <nv/index/iindex.h>
14#include <nv/index/ilight.h>
15#include <nv/index/imaterial.h>
16#include <nv/index/iscene.h>
17#include <nv/index/iscene_group.h>
18#include <nv/index/isession.h>
19#include <nv/index/iplane.h>
20#include <nv/index/itexture_filter_mode.h>
22#include "utility/canvas_utility.h"
24#include <nv/index/app/idata_analysis_and_processing.h>
25#include <nv/index/app/index_connect.h>
26#include <nv/index/app/string_dict.h>
27#include <nv/index/app/time_functions.h>
34 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);
78 void create_planes(nv::index::IScene* scene_edit,
79 mi::neuraylib::IDice_transaction* dice_transaction);
82 void move_planes(mi::neuraylib::IDice_transaction* dice_transaction)
const;
85 void setup_camera(nv::index::IPerspective_camera* cam)
const;
89 nv::index::IFrame_results* render_frame(
const std::string& output_fname)
const;
92 mi::neuraylib::Tag m_session_tag;
94 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
96 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
98 std::string m_outfname;
100 std::string m_verify_image_fname;
101 mi::Sint32 m_max_iter;
103 std::vector<mi::neuraylib::Tag> m_plane_tag_vec;
109 mi::Sint32 exit_code = 0;
113 m_cluster_configuration =
114 get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
118 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
122 const mi::Sint32 max_retry = 3;
123 for (mi::Sint32 retry = 0; retry < max_retry; ++retry)
125 if (m_cluster_configuration->get_number_of_hosts() == 0)
127 INFO_LOG <<
"no host joined yet, retry "
128 << (retry + 1) <<
"/" << max_retry;
129 nv::index::app::util::time::sleep(0.3f);
132 check_success(m_cluster_configuration->get_number_of_hosts() != 0);
136 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
137 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
142 m_index_session->create_session(dice_transaction.get());
145 mi::base::Handle<const nv::index::ISession> session(
146 dice_transaction->access<nv::index::ISession>(
150 mi::base::Handle< nv::index::IScene > scene_edit(
151 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
157 create_planes(scene_edit.get(), dice_transaction.get());
159 mi::base::Handle< nv::index::IPerspective_camera > cam(
160 scene_edit->create_camera<nv::index::IPerspective_camera>());
162 setup_camera(cam.get());
163 const mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
166 const mi::math::Vector<mi::Uint32, 2> buffer_resolution(512, 512);
167 m_image_file_canvas->set_resolution(buffer_resolution);
170 const mi::math::Bbox_struct<mi::Float32, 3> xyz_roi_st = {
171 { -1000.0f, -1000.0f, -1000.0f, },
172 { 1000.0f, 1000.0f, 1000.0f, },
177 mi::base::Handle< nv::index::IScene > scene(
178 dice_transaction->edit< nv::index::IScene >(session->get_scene()));
182 const mi::math::Bbox< mi::Float32, 3 > xyz_roi(xyz_roi_st);
184 scene->set_clipped_bounding_box(xyz_roi_st);
188 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
189 1.0f, 0.0f, 0.0f, 0.0f,
190 0.0f, 1.0f, 0.0f, 0.0f,
191 0.0f, 0.0f, -1.0f, 0.0f,
192 0.0f, 0.0f, 0.0f, 1.0f
194 scene->set_transform_matrix(transform_mat);
198 scene->set_camera(camera_tag);
201 dice_transaction->commit();
207 for (mi::Sint32 i = 0; i < m_max_iter; ++i)
210 const std::string fname = get_output_file_name(m_outfname, i);
211 mi::base::Handle<nv::index::IFrame_results> frame_results(render_frame(fname));
212 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
213 if (err_set->any_errors())
215 std::ostringstream os;
216 const mi::Uint32 nb_err = err_set->get_nb_errors();
217 for (mi::Uint32 e = 0; e < nb_err; ++e)
219 if (e != 0) os <<
'\n';
220 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
221 os << err->get_error_string();
224 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
231 if (!(verify_canvas_result(get_application_layer_interface(),
232 m_image_file_canvas.get(), m_verify_image_fname, get_options())))
240 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
241 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
244 move_planes(dice_transaction.get());
246 dice_transaction->commit();
256 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
257 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
261 if (nv::index::app::get_bool(sdict.get(
"is_call_from_test",
"false")))
263 sdict.insert(
"is_dump_comparison_image_when_failed",
"0");
265 sdict.insert(
"outfname",
"");
266 sdict.insert(
"dice::verbose",
"2");
267 sdict.insert(
"max_iter",
"1");
270 m_outfname = sdict.get(
"outfname");
271 m_max_iter = nv::index::app::get_sint32(sdict.get(
"max_iter"));
273 info_cout(std::string(
"running ") + com_name, sdict);
274 info_cout(
"outfname = [" + m_outfname +
275 "], max_iter = " + nv::index::app::to_string(m_max_iter) +
276 ", dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
279 if (sdict.is_defined(
"h"))
282 <<
"info: Usage: " << com_name <<
" [option]\n"
284 <<
" printout this message\n"
285 <<
" [-dice::verbose severity_level]\n"
286 <<
" verbose severity level (3 is info.). (default: " + sdict.get(
"dice::verbose")
289 <<
" [-max_iter number_of_iteration]\n"
290 <<
" set rendering loop iterations. (default: "
291 << m_max_iter <<
" frames)\n"
293 <<
" [-outfname string]\n"
294 <<
" output ppm file base name. When empty, no output.\n"
295 <<
" A frame number and extension (.ppm) will be added.\n"
296 <<
" (default: [" << m_outfname <<
"])\n"
298 <<
" [-verify_image_fname [image_fname]]\n"
299 <<
" when image_fname exist, verify the rendering image. (default: ["
300 << m_verify_image_fname <<
"])\n"
302 <<
" [-unittest bool]\n"
303 <<
" when true, unit test mode. "
304 << m_is_unittest <<
"])"
312void Dynamic_plane::create_planes(
313 nv::index::IScene* scene_edit,
314 mi::neuraylib::IDice_transaction* dice_transaction)
319 mi::base::Handle<nv::index::ITransformed_scene_group> group_node(
320 scene_edit->create_scene_group<nv::index::ITransformed_scene_group>());
326 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
327 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
329 const mi::math::Color_struct color_intensity = { 1.0f, 1.0f, 1.0f, 1.0f, };
330 headlight->set_intensity(color_intensity);
331 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(1.0f, -1.0f, -1.0f));
332 const mi::neuraylib::Tag headlight_tag = dice_transaction->store_for_reference_counting(headlight.get());
334 group_node->append(headlight_tag, dice_transaction);
337 mi::base::Handle<nv::index::IPhong_gl> phong_1(
338 scene_edit->create_attribute<nv::index::IPhong_gl>());
340 phong_1->set_ambient(mi::math::Color(1.0f, 1.0f, 1.0f));
341 phong_1->set_diffuse(mi::math::Color(0.0f));
342 phong_1->set_specular(mi::math::Color(0.0f));
344 mi::neuraylib::Tag phong_1_tag = dice_transaction->store_for_reference_counting(phong_1.get());
346 group_node->append(phong_1_tag, dice_transaction);
356 mi::math::Vector<mi::Float32, 3> plane_point(-400.f, -250.f, 0.0f);
357 mi::math::Vector<mi::Float32, 3> plane_normal(0.f, 0.f, 1.f);
358 mi::math::Vector<mi::Float32, 3> plane_up(0.f, 1.f, 0.f);
359 mi::math::Vector<mi::Float32, 2> plane_extent(800.0f, 500.0f);
361 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter(
362 scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>());
364 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
366 group_node->append(tex_filter_tag, dice_transaction);
369 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
370 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
374 mi::base::Handle<nv::index::IDistributed_compute_technique> mapping(
375 processing->get_sample_tool_set()->create_mandelbrot_2d_technique(
376 plane_extent, nv::index::IDistributed_compute_destination_buffer_2d_texture:
:FORMAT_RGBA_FLOAT32));
378 mi::neuraylib::Tag mapping_tag = dice_transaction->store_for_reference_counting(mapping.get());
380 group_node->append(mapping_tag, dice_transaction);
382 mi::base::Handle<nv::index::IPlane> plane(
383 scene_edit->create_shape<nv::index::IPlane>());
385 plane->set_point(plane_point);
386 plane->set_normal(plane_normal);
387 plane->set_up(plane_up);
388 plane->set_extent(plane_extent);
390 const mi::neuraylib::Tag plane_tag = dice_transaction->store_for_reference_counting(plane.get());
392 m_plane_tag_vec.push_back(plane_tag);
394 group_node->append(plane_tag, dice_transaction);
401 mi::math::Vector<mi::Float32, 3> plane_point(-50.0f, 50.0f, 700.0f);
402 mi::math::Vector<mi::Float32, 3> plane_normal(1.f, 1.f, 1.f);
403 mi::math::Vector<mi::Float32, 3> plane_up(-1.f, 1.f, 0.f);
404 mi::math::Vector<mi::Float32, 2> plane_extent(400.0f, 400.0f);
406 const bool enable_texture_filtering =
true;
407 const mi::Sint32 colormap_entry_id = 40;
408 mi::neuraylib::Tag colormap_tag =
409 create_colormap(colormap_entry_id, scene_edit, dice_transaction);
411 group_node->append(colormap_tag, dice_transaction);
413 mi::base::Handle<nv::index::ITexture_filter_mode> tex_filter;
415 if (enable_texture_filtering)
417 tex_filter = scene_edit->create_attribute<nv::index::ITexture_filter_mode_linear>();
421 tex_filter = scene_edit->create_attribute<nv::index::ITexture_filter_mode_nearest_neighbor>();
424 mi::neuraylib::Tag tex_filter_tag = dice_transaction->store_for_reference_counting(tex_filter.get());
426 group_node->append(tex_filter_tag, dice_transaction);
429 mi::base::Handle<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing> processing(
430 get_application_layer_interface()->get_api_component<nv::index::app::data_analysis_and_processing::IData_analysis_and_processing>());
434 mi::base::Handle<nv::index::IDistributed_compute_technique> mapping(
435 processing->get_sample_tool_set()->create_mandelbrot_2d_technique(
436 plane_extent, nv::index::IDistributed_compute_destination_buffer_2d_texture:
:FORMAT_SCALAR_UINT8));
438 mi::neuraylib::Tag mapping_tag = dice_transaction->store_for_reference_counting(mapping.get());
440 group_node->append(mapping_tag, dice_transaction);
442 mi::base::Handle<nv::index::IPlane> plane(
443 scene_edit->create_shape<nv::index::IPlane>());
445 plane->set_point(plane_point);
446 plane->set_normal(plane_normal);
447 plane->set_up(plane_up);
448 plane->set_extent(plane_extent);
450 mi::neuraylib::Tag plane_tag = dice_transaction->store_for_reference_counting(plane.get());
452 m_plane_tag_vec.push_back(plane_tag);
454 group_node->append(plane_tag, dice_transaction);
458 mi::neuraylib::Tag group_tag = dice_transaction->store_for_reference_counting(group_node.get());
460 scene_edit->append(group_tag, dice_transaction);
464void Dynamic_plane::move_planes(mi::neuraylib::IDice_transaction* dice_transaction)
const
468 for(mi::Size i = 0; i < m_plane_tag_vec.size(); ++i)
470 mi::base::Handle<nv::index::IPlane> plane(
471 dice_transaction->edit<nv::index::IPlane>(m_plane_tag_vec.at(i)));
475 mi::math::Vector<mi::Float32, 3> point = plane->get_point();
476 mi::math::Vector<mi::Float32, 3> normal = plane->get_normal();
479 point += normal * -5.f;
481 plane->set_point(point);
486void Dynamic_plane::setup_camera(nv::index::IPerspective_camera* cam)
const
491 const mi::math::Vector<mi::Float32, 3> from(100.0f, 0.0f, -1000.0f);
492 const mi::math::Vector<mi::Float32, 3> to (0.0f, 250.0f, 0.0f);
493 const mi::math::Vector<mi::Float32, 3> up (0.0f, 1.0f, 0.0f);
494 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
497 cam->set(from, viewdir, up);
498 cam->set_aperture(0.033f);
499 cam->set_aspect(1.0f);
500 cam->set_focal(0.03f);
501 cam->set_clip_min(80.0f);
502 cam->set_clip_max(5000.0f);
506nv::index::IFrame_results* Dynamic_plane::render_frame(
const std::string& output_fname)
const
511 m_image_file_canvas->set_rgba_file_name(output_fname.c_str());
515 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
516 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
519 m_index_session->update(m_session_tag, dice_transaction.get());
521 mi::base::Handle<nv::index::IFrame_results> frame_results(
522 m_index_rendering->render(
524 m_image_file_canvas.get(),
525 dice_transaction.get()));
528 dice_transaction->commit();
530 frame_results->retain();
531 return frame_results.get();
536int main(
int argc,
const char* argv[])
538 nv::index::app::String_dict sdict;
539 sdict.insert(
"dice::verbose",
"3");
540 sdict.insert(
"max_iter",
"20");
541 sdict.insert(
"outfname",
"frame_dynamic_plane");
542 sdict.insert(
"verify_image_fname",
"");
543 sdict.insert(
"unittest",
"0");
544 sdict.insert(
"is_dump_comparison_image_when_failed",
"1");
545 sdict.insert(
"is_call_from_test",
"0");
548 sdict.insert(
"dice::network::mode",
"OFF");
551 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
552 sdict.insert(
"index::service",
"rendering_and_compositing");
553 sdict.insert(
"index::cuda_debug_checks",
"false");
556 sdict.insert(
"index::app::components::application_layer::component_name_list",
557 "canvas_infrastructure image io data_analysis_and_processing");
561 dynamic_plane.initialize(argc, argv, sdict);
565 const mi::Sint32 exit_code = dynamic_plane.
launch();
566 INFO_LOG <<
"Shutting down ...";
virtual bool initialize_networking(mi::neuraylib::INetwork_configuration *network_configuration, nv::index::app::String_dict &options) CPP11_OVERRIDE
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
int main(int argc, const char *argv[])
#define check_success(expr)