10#include "utility/example_shared.h"
12#include <nv/index/icamera.h>
13#include <nv/index/icolormap.h>
14#include <nv/index/iconfig_settings.h>
15#include <nv/index/iindex.h>
16#include <nv/index/iline_set.h>
17#include <nv/index/iscene.h>
18#include <nv/index/iscene_group.h>
19#include <nv/index/isession.h>
21#include <nv/index/app/index_connect.h>
22#include <nv/index/app/string_dict.h>
24#include "utility/app_rendering_context.h"
25#include "utility/canvas_utility.h"
32 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);
81 mi::Float32 random(mi::Float32 min, mi::Float32 max)
const;
82 mi::math::Color_struct jetmap(mi::Float32 v, mi::Float32 vmin, mi::Float32 vmax)
const;
90 const Line_test_params& params,
91 nv::index::IScene* scene_edit,
92 mi::neuraylib::IDice_transaction* dice_transaction);
97 nv::index::IPerspective_camera* cam)
const;
102 nv::index::IFrame_results* render_frame(
103 const std::string& output_fname)
const;
106 mi::neuraylib::Tag m_session_tag;
108 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
110 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
112 std::string m_outfname;
114 std::string m_verify_image_fname;
115 Line_test_params m_line_params;
121 mi::Sint32 exit_code = 0;
125 m_cluster_configuration =
126 get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
130 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
135 check_success(is_local_host_joined(m_cluster_configuration.get()));
139 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
140 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
144 m_session_tag = m_index_session->create_session(dice_transaction.get());
146 mi::base::Handle< nv::index::ISession const > session(
147 dice_transaction->access< nv::index::ISession
const >(
151 mi::base::Handle< nv::index::IScene > scene_edit(
152 dice_transaction->edit< nv::index::IScene >(session->get_scene()));
160 check_success(create_scene(m_line_params, scene_edit.get(), dice_transaction.get()));
164 mi::base::Handle< nv::index::IPerspective_camera > cam(
165 scene_edit->create_camera<nv::index::IPerspective_camera>());
167 setup_camera(cam.get());
168 const mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
171 const mi::math::Vector<mi::Uint32, 2> buffer_resolution(1024, 1024);
172 m_image_file_canvas->set_resolution(buffer_resolution);
175 const mi::math::Bbox_struct< mi::Float32, 3 > xyz_roi_st = {
176 { 0.0f, 0.0f, 0.0f, },
177 { 650.0f, 650.0f, 650.0f, },
181 const mi::math::Bbox< mi::Float32, 3 > xyz_roi(xyz_roi_st);
183 scene_edit->set_clipped_bounding_box(xyz_roi_st);
187 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
188 1.0f, 0.0f, 0.0f, 0.0f,
189 0.0f, 1.0f, 0.0f, 0.0f,
190 0.0f, 0.0f, -1.0f, 0.0f,
191 0.0f, 0.0f, 0.0f, 1.0f
194 scene_edit->set_transform_matrix(transform_mat);
196 INFO_LOG <<
"transformed: " << scene_edit->get_transform_matrix();
200 scene_edit->set_camera(camera_tag);
202 dice_transaction->commit();
208 const mi::Sint32 frame_idx = 0;
209 const std::string fname = get_output_file_name(m_outfname, frame_idx);
210 mi::base::Handle<nv::index::IFrame_results> frame_results(render_frame(fname));
211 const mi::base::Handle<nv::index::IError_set> err_set(frame_results->get_error_set());
212 if (err_set->any_errors())
214 std::ostringstream os;
215 const mi::Uint32 nb_err = err_set->get_nb_errors();
216 for (mi::Uint32 e = 0; e < nb_err; ++e)
218 if (e != 0) os <<
'\n';
219 const mi::base::Handle<nv::index::IError> err(err_set->get_error(e));
220 os << err->get_error_string();
223 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): " <<
'\n'
229 if (!(verify_canvas_result(get_application_layer_interface(),
230 m_image_file_canvas.get(), m_verify_image_fname, get_options())))
243 const std::string com_name = sdict.get(
"command:",
"<unknown_command>");
244 m_is_unittest = nv::index::app::get_bool(sdict.get(
"unittest",
"false"));
248 if (nv::index::app::get_bool(sdict.get(
"is_call_from_test",
"false")))
250 sdict.insert(
"is_dump_comparison_image_when_failed",
"0");
252 sdict.insert(
"outfname",
"");
253 sdict.insert(
"dice::verbose",
"2");
256 m_outfname = sdict.get(
"outfname");
257 m_verify_image_fname = sdict.get(
"verify_image_fname");
258 m_line_params.
num_points = nv::index::app::get_uint32(sdict.get(
"num_points"));
259 m_line_params.
line_style = nv::index::app::get_uint32(sdict.get(
"line_style"));
260 m_line_params.
caps_style = nv::index::app::get_uint32(sdict.get(
"caps_style"));
262 info_cout(std::string(
"running ") + com_name, sdict);
263 info_cout(std::string(
"outfname = [") + m_outfname +
264 "], verify_image_fname = [" + m_verify_image_fname +
265 "], dice::verbose = " + sdict.get(
"dice::verbose"), sdict);
268 if(sdict.is_defined(
"h"))
271 <<
"info: Usage: " << com_name <<
" [option]\n"
273 <<
" printout this message\n"
274 <<
" [-dice::verbose severity_level]\n"
275 <<
" verbose severity level (3 is info.). (default: " + sdict.get(
"dice::verbose")
278 <<
" [-num_points int]\n"
279 <<
" number of points used for every shape in the test."
280 <<
"(default: " << m_line_params.
num_points <<
")\n"
282 <<
" [-line_style int]\n"
283 <<
" set the line dash pattern (0-9)."
284 <<
"(default: " << m_line_params.
line_style <<
")\n"
286 <<
" [-caps_style int]\n"
287 <<
" set the cap style (0-2)."
288 <<
"(default: " << m_line_params.
caps_style <<
")\n"
290 <<
" [-outfname string]\n"
291 <<
" output ppm file base name. When empty, no output.\n"
292 <<
" A frame number and extension (.ppm) will be added.\n"
293 <<
" (default: [" << m_outfname <<
"])\n"
294 <<
" [-verify_image_fname [image_fname]]\n"
295 <<
" when image_fname exist, verify the rendering image. (default: ["
296 << m_verify_image_fname <<
"])\n"
298 <<
" [-unittest bool]\n"
299 <<
" when true, unit test mode (create smaller volume). "
300 <<
"(default: " << m_is_unittest <<
")"
308mi::Float32 Create_line_style::random(mi::Float32 min, mi::Float32 max)
const
310 mi::Float32 t = rand()/(1.f +
RAND_MAX);
312 return (min + (max - min)*t);
316mi::math::Color_struct Create_line_style::jetmap(mi::Float32 v, mi::Float32 vmin, mi::Float32 vmax)
const
318 mi::math::Color_struct c = {1.0f, 1.0f, 1.0f, 1.0f};
327 if (v < (vmin + 0.25f * dv))
330 c.g = 4.f * (v - vmin) / dv;
332 else if (v < (vmin + 0.5f * dv))
335 c.b = 1.f + 4.f * (vmin + 0.25f * dv - v) / dv;
337 else if (v < (vmin + 0.75f * dv))
339 c.r = 4.f * (v - vmin - 0.5f * dv) / dv;
344 c.g = 1.f + 4.f * (vmin + 0.75f * dv - v) / dv;
352bool Create_line_style::create_scene(
353 const Line_test_params& params,
354 nv::index::IScene* scene_edit,
355 mi::neuraylib::IDice_transaction* dice_transaction)
360 const mi::Float32 PI_f =
static_cast<mi::Float32
>(M_PI);
363 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(1.f);
364 transform_mat.translate(mi::math::Vector<mi::Float32, 3>(240.f, 300.f, 0.f));
365 mi::base::Handle<nv::index::ITransformed_scene_group> group_node(
366 scene_edit->create_scene_group<nv::index::ITransformed_scene_group>());
368 group_node->set_transform(transform_mat);
371 nv::index::ILine_set::Line_style line_style = (nv::index::ILine_set::Line_style)params.line_style;
374 nv::index::ILine_set::Cap_style cap_style = (nv::index::ILine_set::Cap_style)params.caps_style;
376 mi::Uint32 num_points = params.num_points;
377 mi::Float32 min_width = 1.5f, max_width = 10.f;
380 std::vector<mi::math::Color_struct> colors;
381 colors.resize(num_points);
382 for(mi::Uint32 i=0; i<num_points; i++)
383 colors[i] = jetmap((mi::Float32)i/(mi::Float32)(num_points-1), 0.f, 1.f);
386 mi::math::Bbox< mi::Float32, 3 > bbox;
394 mi::Uint32 num_segments = num_points-1;
395 std::vector< mi::math::Vector_struct<mi::Float32, 3> > segment_points;
396 segment_points.resize(num_segments*2);
397 std::vector<mi::Float32> widths;
398 widths.resize(num_segments);
401 for(mi::Uint32 i=0; i<num_segments; i++)
403 segment_points[2*i].x = random(bbox.min.x, bbox.max.x);
404 segment_points[2*i].y = random(bbox.min.y, bbox.max.y);
405 segment_points[2*i].z = random(bbox.min.z, bbox.max.z);
407 segment_points[2*i+1].x = random(bbox.min.x, bbox.max.x);
408 segment_points[2*i+1].y = random(bbox.min.y, bbox.max.y);
409 segment_points[2*i+1].z = random(bbox.min.z, bbox.max.z);
411 mi::Float32 t = random(0.f, 1.f);
412 widths[i] = min_width + (max_width - min_width)*t*t;
415 mi::base::Handle<nv::index::ILine_set> line_set1(scene_edit->create_shape<nv::index::ILine_set>());
419 line_set1->set_line_type(nv::index::ILine_set:
:LINE_TYPE_SEGMENTS);
422 line_set1->set_lines(&segment_points[0], num_segments*2);
425 line_set1->set_colors(&colors[0], num_segments);
428 line_set1->set_widths(&widths[0], num_segments);
431 line_set1->set_line_style(line_style);
434 line_set1->set_cap_style(cap_style);
437 const mi::neuraylib::Tag line_set1_tag = dice_transaction->store_for_reference_counting(line_set1.get());
439 group_node->append(line_set1_tag, dice_transaction);
445 std::vector< mi::math::Vector_struct<mi::Float32, 3> > points;
446 points.resize(num_points);
448 for(mi::Uint32 i=0; i<num_points; i++)
450 mi::Float32 t = (mi::Float32)i/(mi::Float32)(num_points-1);
453 points[i].x = t*300.f - 50.f;
454 points[i].y = t*t*t*t*t*t*t*300.f + 20.f;
459 std::vector<mi::Float32> widths;
460 widths.resize(num_points);
461 for(mi::Uint32 i=0; i<num_points; i++)
463 mi::Float32 t = (mi::Float32)i/(mi::Float32)(num_points-1);
464 widths[i] = min_width + (1.5f*max_width - min_width)*0.5f*(sinf(4.f*
static_cast<mi::Float32
>(PI_f)*t) + 1.f);
467 mi::base::Handle<nv::index::ILine_set> line_set2(scene_edit->create_shape<nv::index::ILine_set>());
471 line_set2->set_line_type(nv::index::ILine_set:
:LINE_TYPE_PATH);
474 line_set2->set_lines(&points[0], num_points);
477 line_set2->set_colors(&colors[0], num_points);
480 line_set2->set_widths(&widths[0], num_points);
483 line_set2->set_line_style(line_style);
486 line_set2->set_cap_style(cap_style);
489 const mi::neuraylib::Tag line_set1_tag = dice_transaction->store_for_reference_counting(line_set2.get());
491 group_node->append(line_set1_tag, dice_transaction);
497 std::vector< mi::math::Vector_struct<mi::Float32, 3> > points;
498 points.resize(num_points);
500 for(mi::Uint32 i=0; i<num_points; i++)
502 mi::Float32 t = (mi::Float32)i/(mi::Float32)num_points;
504 points[i].x = sinf(2.f * PI_f * t + PI_f/2.f)*250.f;
505 points[i].y = sinf(4.f * PI_f * t) * 150.f - 150;
506 points[i].z = sinf(2.f * PI_f * t) * 10.f;
510 std::vector<mi::Float32> widths;
511 widths.resize(num_points);
512 for(mi::Uint32 i=0; i<num_points; i++)
514 mi::Float32 t = (mi::Float32)i/(mi::Float32)(num_points-1);
515 widths[i] = min_width + (max_width - min_width)*0.5f*(sinf(2.f*PI_f*t + PI_f/2.f) + 1.f);
518 mi::base::Handle<nv::index::ILine_set> line_set3(scene_edit->create_shape<nv::index::ILine_set>());
522 line_set3->set_line_type(nv::index::ILine_set:
:LINE_TYPE_LOOP);
525 line_set3->set_lines(&points[0], num_points);
528 line_set3->set_colors(&colors[0], num_points);
531 line_set3->set_widths(&widths[0], num_points);
534 line_set3->set_line_style(line_style);
537 line_set3->set_cap_style(cap_style);
540 const mi::neuraylib::Tag line_set3_tag = dice_transaction->store_for_reference_counting(line_set3.get());
542 group_node->append(line_set3_tag, dice_transaction);
545 const mi::neuraylib::Tag group_node_tag = dice_transaction->store_for_reference_counting(group_node.get());
547 scene_edit->append(group_node_tag, dice_transaction);
553void Create_line_style::setup_camera(
554 nv::index::IPerspective_camera* cam)
const
557 mi::math::Vector< mi::Float32, 3 >
const from( 234.0f, 604.0f, 500.0f);
558 mi::math::Vector< mi::Float32, 3 >
const to ( 255.0f, 255.0f, -255.0f);
559 mi::math::Vector< mi::Float32, 3 >
const up ( 0.0f, 1.0f, 0.0f);
560 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
563 cam->set(from, viewdir, up);
564 cam->set_aperture(0.033f);
565 cam->set_aspect(1.0f);
566 cam->set_focal(0.03f);
567 cam->set_clip_min(10.0f);
568 cam->set_clip_max(5000.0f);
572nv::index::IFrame_results* Create_line_style::render_frame(
573 const std::string& output_fname)
const
578 m_image_file_canvas->set_rgba_file_name(output_fname.c_str());
582 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
583 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
586 m_index_session->update(m_session_tag, dice_transaction.get());
588 mi::base::Handle<nv::index::IFrame_results> frame_results(
589 m_index_rendering->render(
591 m_image_file_canvas.get(),
592 dice_transaction.get()));
595 dice_transaction->commit();
597 frame_results->retain();
598 return frame_results.get();
603int main(
int argc,
const char* argv[])
605 nv::index::app::String_dict sdict;
606 sdict.insert(
"dice::verbose",
"3");
607 sdict.insert(
"outfname",
"frame_create_line_styles");
608 sdict.insert(
"verify_image_fname",
"");
609 sdict.insert(
"unittest",
"0");
610 sdict.insert(
"num_points",
"12");
611 sdict.insert(
"line_style",
"0");
612 sdict.insert(
"caps_style",
"2");
613 sdict.insert(
"is_dump_comparison_image_when_failed",
"1");
614 sdict.insert(
"is_call_from_test",
"0");
617 sdict.insert(
"dice::network::mode",
"OFF");
620 sdict.insert(
"index::config::set_monitor_performance_values",
"true");
621 sdict.insert(
"index::service",
"rendering_and_compositing");
622 sdict.insert(
"index::cuda_debug_checks",
"false");
625 sdict.insert(
"index::app::components::application_layer::component_name_list",
626 "canvas_infrastructure image io");
630 create_line_style.initialize(argc, argv, sdict);
634 const mi::Sint32 exit_code = create_line_style.
launch();
635 INFO_LOG <<
"Shutting down ...";
virtual bool evaluate_options(nv::index::app::String_dict &sdict) CPP11_OVERRIDE
virtual ~Create_line_style()
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)