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/iline_set.h>
17#include <nv/index/imaterial.h>
18#include <nv/index/ipoint_set.h>
19#include <nv/index/iscene.h>
20#include <nv/index/isession.h>
22#include <nv/index/app/index_connect.h>
23#include <nv/index/app/string_dict.h>
25#include "utility/canvas_utility.h"
32 public nv::index::app::Index_connect
52 virtual bool evaluate_options(nv::index::app::String_dict& sdict) CPP11_OVERRIDE;
55 mi::neuraylib::INetwork_configuration* network_configuration,
56 nv::index::app::String_dict& options) CPP11_OVERRIDE
61 const bool is_unittest = nv::index::app::get_bool(options.get(
"unittest"));
64 info_cout(
"NETWORK: disabled networking mode.", options);
65 network_configuration->set_mode(mi::neuraylib::INetwork_configuration:
:MODE_OFF);
69 return initialize_networking_as_default_udp(network_configuration, options);
81 bool create_stylized_lines_and_points(
82 nv::index::IScene* scene_edit,
83 mi::Uint32 pick_line_style,
84 mi::Uint32 pick_point_style,
86 mi::neuraylib::IDice_transaction* dice_transaction);
90 void setup_camera(nv::index::IPerspective_camera* cam)
const;
95 nv::index::IFrame_results* render_frame(
const std::string& output_fname)
const;
98 mi::neuraylib::Tag m_session_tag;
100 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
102 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
104 std::string m_outfname;
106 std::string m_verify_image_fname;
107 mi::Uint32 m_line_style;
108 mi::Uint32 m_point_style;
115 mi::Sint32 exit_code = 0;
119 m_cluster_configuration =
120 get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
124 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
129 check_success(is_local_host_joined(m_cluster_configuration.get()));
132 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
133 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
138 m_index_session->create_session(dice_transaction.get());
140 mi::base::Handle< nv::index::ISession const > session(
141 dice_transaction->access< nv::index::ISession
const >(
145 mi::base::Handle< nv::index::IScene > scene_edit(
146 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
153 check_success(create_stylized_lines_and_points(scene_edit.get(),
154 m_line_style, m_point_style, m_transparency,
155 dice_transaction.get()));
160 mi::base::Handle< nv::index::IPerspective_camera > cam(
161 scene_edit->create_camera<nv::index::IPerspective_camera>());
163 setup_camera(cam.get());
164 const mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
167 const mi::math::Vector<mi::Uint32, 2> buffer_resolution(1025, 1024);
168 m_image_file_canvas->set_resolution(buffer_resolution);
171 mi::math::Bbox_struct< mi::Float32, 3 >
const xyz_roi_st = {
172 { 0.0f, 0.0f, 0.0f, },
173 { 500.0f, 500.0f, 500.0f, },
177 const mi::math::Bbox< mi::Float32, 3 > xyz_roi(xyz_roi_st);
179 scene_edit->set_clipped_bounding_box(xyz_roi_st);
183 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
184 1.0f, 0.0f, 0.0f, 0.0f,
185 0.0f, 1.0f, 0.0f, 0.0f,
186 0.0f, 0.0f, -1.0f, 0.0f,
187 0.0f, 0.0f, 0.0f, 1.0f
189 scene_edit->set_transform_matrix(transform_mat);
193 scene_edit->set_camera(camera_tag);
195 dice_transaction->commit();
200 const std::string fname = m_transparency ?
201 get_output_file_name(m_outfname, m_point_style) :
202 get_output_file_name(m_outfname, m_line_style);
203 mi::base::Handle<nv::index::IFrame_results> frame_results(render_frame(fname));
204 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
205 if (err_set->any_errors())
207 std::ostringstream os;
210 const mi::Uint32 nb_err = err_set->get_nb_errors();
211 for (mi::Uint32 e = 0; e < nb_err; ++e)
213 if (e != 0) os <<
'\n';
214 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
215 os << err->get_error_string();
218 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
224 if (!(verify_canvas_result(get_application_layer_interface(),
225 m_image_file_canvas.get(), m_verify_image_fname, get_options())))
238 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
239 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
243 if (nv::index::app::get_bool(sdict.get(
"is_call_from_test",
"false")))
245 sdict.insert(
"is_dump_comparison_image_when_failed",
"0");
247 sdict.insert(
"outfname",
"");
248 sdict.insert(
"dice::verbose",
"2");
251 m_outfname = sdict.get(
"outfname");
252 m_verify_image_fname = sdict.get(
"verify_image_fname");
253 m_line_style = nv::index::app::get_uint32(sdict.get(
"line_style"));
254 m_point_style = nv::index::app::get_uint32(sdict.get(
"point_style"));
255 m_transparency = nv::index::app::get_bool(sdict.get(
"transparency",
"false"));
257 info_cout(std::string(
"running ") + com_name, sdict);
258 info_cout(
"outfname = [" + m_outfname +
259 "], verify_image_fname = [" + m_verify_image_fname +
260 "], dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
263 if(sdict.is_defined(
"h"))
266 <<
"info: Usage: " << com_name <<
" [option]\n"
268 <<
" printout this message\n"
269 <<
" [-dice::verbose severity_level]\n"
270 <<
" verbose severity level (3 is info.). (default: " + sdict.get(
"dice::verbose")
273 <<
" [-outfname string]\n"
274 <<
" output ppm file base name. When empty, no output.\n"
275 <<
" A frame number and extension (.ppm) will be added.\n"
276 <<
" (default: [" << m_outfname <<
"])\n"
278 <<
" [-verify_image_fname [image_fname]]\n"
279 <<
" when image_fname exist, verify the rendering image. (default: ["
280 << m_verify_image_fname <<
"])\n"
282 <<
" [-transparency bool]\n"
283 <<
" to render transparent points. (default: ["
284 << m_transparency <<
"])\n"
286 <<
" [-line_style unsigned int]\n"
287 <<
" to choose a line style [0..8]. (default: ["
288 << m_line_style <<
"])\n"
290 <<
" [-point_style unsigned int]\n"
291 <<
" to choose a point style [0..3]. (default: ["
292 << m_point_style <<
"])\n"
294 <<
" [-unittest bool]\n"
295 <<
" when true, unit test mode (create smaller volume). "
296 <<
"(default: " << m_is_unittest <<
")"
305bool Create_stylized_point_and_lines::create_stylized_lines_and_points(
306 nv::index::IScene* scene_edit,
307 mi::Uint32 pick_line_style,
308 mi::Uint32 pick_point_style,
310 mi::neuraylib::IDice_transaction* dice_transaction)
315 mi::base::Handle<nv::index::ITransformed_scene_group> group_node(
316 scene_edit->create_scene_group<nv::index::ITransformed_scene_group>());
322 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
323 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
325 const mi::math::Color_struct color_intensity = { 1.0f, 1.0f, 1.0f, 1.0f, };
326 headlight->set_intensity(color_intensity);
327 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(1.0f, -1.0f, -1.0f));
328 const mi::neuraylib::Tag headlight_tag = dice_transaction->store_for_reference_counting(headlight.get());
330 group_node->append(headlight_tag, dice_transaction);
333 mi::base::Handle<nv::index::IPhong_gl> phong_1(scene_edit->create_attribute<nv::index::IPhong_gl>());
335 phong_1->set_ambient(mi::math::Color(0.3f, 0.3f, 0.3f, 1.0f));
336 phong_1->set_diffuse(mi::math::Color(0.4f, 0.4f, 0.4f, 1.0f));
337 phong_1->set_specular(mi::math::Color(0.4f));
338 phong_1->set_shininess(100.f);
339 const mi::neuraylib::Tag phong_1_tag = dice_transaction->store_for_reference_counting(phong_1.get());
341 group_node->append(phong_1_tag, dice_transaction);
345 const mi::Sint32 column_count = 20;
346 const mi::Sint32 point_count = 200;
347 const mi::Float32 x_mag = 25.f;
348 const mi::Float32 y_mag = 25.f;
349 const mi::Float32 z = 30.f;
350 const mi::Float32 y_offset_points = 0.f;
351 const mi::Float32 y_offset_lines = 255.f;
356 std::vector< mi::math::Vector_struct< mi::Float32, 3> > vertices;
357 std::vector< mi::math::Color_struct> colors;
358 std::vector< mi::Float32 > radii;
359 for(mi::Sint32 i = 0; i < point_count; ++i)
361 mi::math::Vector_struct< mi::Float32, 3> pos;
362 pos.x =
static_cast< mi::Float32
>(i % column_count) * x_mag;
363 pos.y =
static_cast< mi::Float32
>(i / column_count) * y_mag + y_offset_points;
365 vertices.push_back(pos);
367 mi::math::Color_struct color;
368 color.r =
static_cast<mi::Float32
>(i)/
static_cast< mi::Float32
>(point_count);
369 color.g =
static_cast<mi::Float32
>(0.1);
370 color.b = 1.f -
static_cast<mi::Float32
>(i)/
static_cast< mi::Float32
>(point_count);
371 color.a =
static_cast<mi::Float32
>(1.f);
372 colors.push_back(color);
374 mi::Float32 radius = (
static_cast<mi::Float32
>(i%(column_count))/
static_cast<mi::Float32
>(column_count)) * 18;
375 radii.push_back(
static_cast<mi::Float32
>(1+radius));
379 for(mi::Sint32 i = 0; i < point_count*2; ++i)
381 mi::math::Vector_struct< mi::Float32, 3> pos;
382 pos.x =
static_cast< mi::Float32
>(i % column_count) * x_mag;
383 pos.y =
static_cast< mi::Float32
>(i / column_count) * y_mag + y_offset_points;
385 vertices.push_back(pos);
387 mi::math::Color_struct color;
388 color.r = 1.f -
static_cast<mi::Float32
>(i)/
static_cast< mi::Float32
>(point_count);
389 color.g =
static_cast<mi::Float32
>(i)/
static_cast< mi::Float32
>(point_count);
390 color.b =
static_cast<mi::Float32
>(0.3);
391 color.a =
static_cast<mi::Float32
>(0.7f);
392 colors.push_back(color);
394 mi::Float32 radius = (
static_cast<mi::Float32
>(i%(column_count))/
static_cast<mi::Float32
>(column_count)) * 12;
395 radii.push_back(
static_cast<mi::Float32
>(14-radius));
400 nv::index::IPoint_set::Point_style available_point_styles[] =
402 nv::index::IPoint_set:
:FLAT_CIRCLE,
403 nv::index::IPoint_set:
:SHADED_CIRCLE,
404 nv::index::IPoint_set:
:FLAT_SQUARE,
405 nv::index::IPoint_set:
:FLAT_TRIANGLE
407 nv::index::IPoint_set::Point_style chosen_point_style = available_point_styles[pick_point_style];
410 mi::base::Handle<nv::index::IPoint_set> point_set(scene_edit->create_shape<nv::index::IPoint_set>());
413 point_set->set_point_style(chosen_point_style);
415 point_set->set_vertices(&vertices[0], vertices.size());
416 point_set->set_colors(&colors[0], colors.size());
417 point_set->set_radii(&radii[0], radii.size());
420 const mi::neuraylib::Tag point_set_scene_element_tag = dice_transaction->store_for_reference_counting(point_set.get());
424 group_node->append(point_set_scene_element_tag, dice_transaction);
426 INFO_LOG <<
"Added point_set (size: " << vertices.size() <<
") to the scene (tag id: " << point_set_scene_element_tag.id <<
").";
428 nv::index::ILine_set::Line_style available_line_styles[] =
430 nv::index::ILine_set:
:LINE_STYLE_SOLID,
431 nv::index::ILine_set:
:LINE_STYLE_DASHED,
432 nv::index::ILine_set:
:LINE_STYLE_DOTTED,
433 nv::index::ILine_set:
:LINE_STYLE_CENTER,
434 nv::index::ILine_set:
:LINE_STYLE_HIDDEN,
435 nv::index::ILine_set:
:LINE_STYLE_PHANTOM,
436 nv::index::ILine_set:
:LINE_STYLE_DASHDOT,
437 nv::index::ILine_set:
:LINE_STYLE_BORDER,
438 nv::index::ILine_set:
:LINE_STYLE_DIVIDE
441 nv::index::ILine_set::Line_style chosen_line_style = available_line_styles[pick_line_style];
444 const mi::Uint32 nb_lines = 10;
445 for(mi::Uint32 j=0; j<nb_lines; ++j)
447 std::vector< mi::math::Vector_struct< mi::Float32, 3> > segment_vertices;
448 std::vector< mi::math::Color_struct> color_per_segment;
449 std::vector< mi::Float32 > width_per_segment;
451 mi::math::Vector_struct< mi::Float32, 3> v0;
452 v0.x =
static_cast< mi::Float32
>(0.f);
453 v0.y =
static_cast< mi::Float32
>(j) * y_mag + y_offset_lines;
456 mi::math::Vector_struct< mi::Float32, 3> v1;
457 v1.x =
static_cast< mi::Float32
>(column_count) * x_mag;
458 v1.y =
static_cast< mi::Float32
>(j) * y_mag + y_offset_lines;
461 segment_vertices.push_back(v0);
462 segment_vertices.push_back(v1);
464 mi::math::Color_struct color;
465 color.r =
static_cast<mi::Float32
>(j)/
static_cast< mi::Float32
>(nb_lines);
466 color.g =
static_cast<mi::Float32
>(0.1);
467 color.b = 1.f -
static_cast<mi::Float32
>(j)/
static_cast< mi::Float32
>(nb_lines);
468 color.a =
static_cast<mi::Float32
>(1.f);
469 color_per_segment.push_back(color);
471 mi::Float32 width =
static_cast<mi::Float32
>(1.3*nb_lines+1-j);
472 width_per_segment.push_back(
static_cast<mi::Float32
>(width));
475 mi::base::Handle<nv::index::ILine_set> line_set(scene_edit->create_shape<nv::index::ILine_set>());
478 line_set->set_line_style(chosen_line_style);
480 line_set->set_line_type(nv::index::ILine_set:
:LINE_TYPE_SEGMENTS);
482 line_set->set_lines(&segment_vertices[0], segment_vertices.size());
483 line_set->set_colors(&color_per_segment[0], color_per_segment.size());
484 line_set->set_widths(&width_per_segment[0], width_per_segment.size());
487 const mi::neuraylib::Tag line_set_scene_element_tag = dice_transaction->store_for_reference_counting(line_set.get());
491 group_node->append(line_set_scene_element_tag, dice_transaction);
492 INFO_LOG <<
"Added line_set with line style " << pick_line_style <<
" to the scene (tag id: " << line_set_scene_element_tag.id <<
").";
495 mi::neuraylib::Tag group_node_tag = dice_transaction->store_for_reference_counting(group_node.get());
497 scene_edit->append(group_node_tag, dice_transaction);
503void Create_stylized_point_and_lines::setup_camera(nv::index::IPerspective_camera* cam)
const
508 mi::math::Vector< mi::Float32, 3 >
const from( 254.0f, 254.0f, 550.0f);
509 mi::math::Vector< mi::Float32, 3 >
const to ( 255.0f, 255.0f, -255.0f);
510 mi::math::Vector< mi::Float32, 3 >
const up ( 0.0f, 1.0f, 0.0f);
511 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
514 cam->set(from, viewdir, up);
515 cam->set_aperture(0.033f);
516 cam->set_aspect(1.0f);
517 cam->set_focal(0.03f);
518 cam->set_clip_min(10.0f);
519 cam->set_clip_max(5000.0f);
523nv::index::IFrame_results* Create_stylized_point_and_lines::render_frame(
const std::string& output_fname)
const
528 m_image_file_canvas->set_rgba_file_name(output_fname.c_str());
532 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
533 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
536 m_index_session->update(m_session_tag, dice_transaction.get());
538 mi::base::Handle<nv::index::IFrame_results> frame_results(
539 m_index_rendering->render(
541 m_image_file_canvas.get(),
542 dice_transaction.get()));
545 dice_transaction->commit();
547 frame_results->retain();
548 return frame_results.get();
553int main(
int argc,
const char* argv[])
555 const std::string com_name(argv[0]);
557 nv::index::app::String_dict sdict;
558 sdict.insert(
"dice::verbose",
"3");
559 sdict.insert(
"outfname",
"frame_create_stylized_points_and_lines");
560 sdict.insert(
"verify_image_fname",
"");
561 sdict.insert(
"line_style",
"0");
562 sdict.insert(
"point_style",
"0");
563 sdict.insert(
"transparency",
"0");
564 sdict.insert(
"unittest",
"0");
565 sdict.insert(
"is_dump_comparison_image_when_failed",
"1");
566 sdict.insert(
"is_call_from_test",
"0");
569 sdict.insert(
"dice::network::mode",
"OFF");
572 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
573 sdict.insert(
"index::service",
"rendering_and_compositing");
574 sdict.insert(
"index::cuda_debug_checks",
"false");
577 sdict.insert(
"index::app::components::application_layer::component_name_list",
578 "canvas_infrastructure image io");
582 create_stylized_point_and_lines.initialize(argc, argv, sdict);
583 check_success(create_stylized_point_and_lines.is_initialized());
586 const mi::Sint32 exit_code = create_stylized_point_and_lines.
launch();
587 INFO_LOG <<
"Shutting down ...";
virtual bool initialize_networking(mi::neuraylib::INetwork_configuration *network_configuration, nv::index::app::String_dict &options) CPP11_OVERRIDE
virtual ~Create_stylized_point_and_lines()
Create_stylized_point_and_lines()
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
int main(int argc, const char *argv[])
#define check_success(expr)