NVIDIA Index example code nvidia_logo_transpbg.gif Up
render_frame.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright 2023 NVIDIA Corporation. All rights reserved.
3 *****************************************************************************/
7
8#include <mi/dice.h>
9
10// Include code shared by all examples.
11#include "utility/example_shared.h"
12
13#include <nv/index/iindex.h>
14#include <nv/index/isession.h>
15#include <nv/index/iscene.h>
16#include <nv/index/icamera.h>
17
18#include <iostream>
19#include <sstream>
20
21#include <nv/index/app/application_layer_common_utility.h>
22#include <nv/index/app/forwarding_logger.h>
23#include <nv/index/app/index_connect.h>
24#include <nv/index/app/string_dict.h>
25#include <nv/index/app/time_functions.h>
26
27//----------------------------------------------------------------------
29 public nv::index::app::Index_connect
30{
31public:
33 :
34 Index_connect(),
35 m_test_set_roi(true)
36 {
37 // INFO_LOG << "DEBUG: Render_frame() ctor";
38 }
39
40 virtual ~Render_frame()
41 {
42 // Note: Index_connect::~Index_connect() will be called after here.
43 // INFO_LOG << "DEBUG: ~Render_frame() dtor";
44 }
45
46 // launch application
47 mi::Sint32 launch();
48
49protected:
50 virtual bool evaluate_options(nv::index::app::String_dict& sdict) CPP11_OVERRIDE;
51 // override
53 mi::neuraylib::INetwork_configuration* network_configuration,
54 nv::index::app::String_dict& options) CPP11_OVERRIDE
55 {
56 check_success(network_configuration != 0);
57
58 check_success(options.is_defined("unittest"));
59 const bool is_unittest = nv::index::app::get_bool(options.get("unittest"));
60 if (is_unittest)
61 {
62 info_cout("NETWORK: disabled networking mode.", options);
63 network_configuration->set_mode(mi::neuraylib::INetwork_configuration::MODE_OFF);
64 return true;
65 }
66
67 return initialize_networking_as_default_udp(network_configuration, options);
68 }
69
70private:
71 // Setup camera to see this example scene
72 // \param[in] cam a camera
73 void setup_camera(nv::index::IPerspective_camera* cam) const;
74 // set up a scene for this example.
75 // - Set region of interest to the scene
76 // - Set default transformation matrix to the scene
77 // - Set the current active camera to the scene
78 void setup_render_frame_scene(
79 nv::index::IScene* scene_edit,
80 const mi::math::Bbox_struct< mi::Float32, 3 >& xyz_roi_st,
81 const mi::neuraylib::Tag& camera_tag,
82 mi::neuraylib::IDice_transaction* dice_transaction) const;
83
84 // This session tag
85 mi::neuraylib::Tag m_session_tag;
86 // NVIDIA IndeX cluster configuration
87 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
88 // Application layer image file canvas (a render target)
89 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
90 // Create_icons options
91 std::string m_outfname;
92 bool m_is_unittest;
93 bool m_test_set_roi;
94};
95
96//----------------------------------------------------------------------
98{
99 mi::Sint32 exit_code = 0;
100 {
101 m_cluster_configuration = get_index_interface()->get_api_component<nv::index::ICluster_configuration>();
102 check_success(m_cluster_configuration.is_valid_interface());
103
104 // create image canvas in application_layer
105 m_image_file_canvas = create_image_file_canvas(get_application_layer_interface());
106 check_success(m_image_file_canvas.is_valid_interface());
107
108 // Verifying that local host has joined
109 // This may fail when there is a license problem.
110 check_success(is_local_host_joined(m_cluster_configuration.get()));
111
112 // Setup scene
113 {
114 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
115 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
116 check_success(dice_transaction.is_valid_interface());
117 {
118 // Setup session information
119 m_session_tag = m_index_session->create_session(dice_transaction.get());
120 check_success(m_session_tag.is_valid());
121 mi::base::Handle< nv::index::ISession const > session(
122 dice_transaction->access< nv::index::ISession const >(
123 m_session_tag));
124 check_success(session.is_valid_interface());
125
126 mi::base::Handle< nv::index::IScene > scene_edit(
127 dice_transaction->edit<nv::index::IScene>(session->get_scene()));
128 check_success(scene_edit.is_valid_interface());
129
130 //----------------------------------------------------------------------
131 // Scene setup: Put nothing in the scene in this example
132 //----------------------------------------------------------------------
133
134 // Create and edit a camera. Data distribution is based on
135 // the camera. (Because only visible massive data are
136 // considered)
137 mi::base::Handle< nv::index::IPerspective_camera > cam(
138 scene_edit->create_camera<nv::index::IPerspective_camera>());
139 check_success(cam.is_valid_interface());
140 setup_camera(cam.get());
141 const mi::neuraylib::Tag camera_tag = dice_transaction->store(cam.get());
142 check_success(camera_tag.is_valid());
143
144 const mi::math::Vector<mi::Uint32, 2> buffer_resolution(512, 512);
145 m_image_file_canvas->set_resolution(buffer_resolution);
146
147 // Set up the scene
148 if(m_test_set_roi)
149 {
150 mi::math::Bbox_struct< mi::Float32, 3 > const xyz_roi_st = {
151 { 0.0f, 0.0f, 0.0f, },
152 { 1.0f, 1.0f, 1.0f, },
153 };
154 setup_render_frame_scene(scene_edit.get(), xyz_roi_st, camera_tag,
155 dice_transaction.get());
156 }
157 else
158 {
159 ERROR_LOG << "The following error message about an invalid region of interest is expected";
160 // test case: not valid ROI set
161 mi::math::Bbox_struct< mi::Float32, 3 > const zero_xyz_roi_st = {
162 { 0.0f, 0.0f, 0.0f, },
163 { 0.0f, 0.0f, 0.0f, },
164 };
165 setup_render_frame_scene(scene_edit.get(), zero_xyz_roi_st, camera_tag,
166 dice_transaction.get());
167 }
168 }
169 dice_transaction->commit();
170 }
171
172 // Rendering call
173 {
174 // Set up the canvas according to the camera setup. It is
175 // still valid if output_fname.empty() == true (no output
176 // file)
177 const mi::Sint32 frame_idx = 0;
178 const std::string output_fname = get_output_file_name(m_outfname, frame_idx);
179 m_image_file_canvas->set_rgba_file_name(output_fname.c_str());
180
181 mi::base::Handle<mi::neuraylib::IDice_transaction> dice_transaction(
182 m_global_scope->create_transaction<mi::neuraylib::IDice_transaction>());
183 check_success(dice_transaction.is_valid_interface());
184
185 m_index_session->update(m_session_tag, dice_transaction.get());
186
187 mi::base::Handle<nv::index::IFrame_results> frame_results(
188 m_index_rendering->render(
189 m_session_tag,
190 m_image_file_canvas.get(),
191 dice_transaction.get()));
192 check_success(frame_results.is_valid_interface());
193
194 dice_transaction->commit();
195 }
196 }
197 return exit_code;
198}
199
200//----------------------------------------------------------------------
201bool Render_frame::evaluate_options(nv::index::app::String_dict& sdict)
202{
203 const std::string com_name = sdict.get("command:", "<unknown_command>");
204 m_is_unittest = nv::index::app::get_bool(sdict.get("unittest", "false"));
205
206 if (m_is_unittest)
207 {
208 if (nv::index::app::get_bool(sdict.get("is_call_from_test", "false")))
209 {
210 sdict.insert("is_dump_comparison_image_when_failed", "0");
211 }
212 sdict.insert("outfname", ""); // turn off file output in the unit test mode
213 sdict.insert("dice::verbose", "2");
214 }
215
216 m_outfname = sdict.get("outfname", "");
217 m_test_set_roi = nv::index::app::get_bool(sdict.get("test_set_roi", "false"));
218
219 info_cout(std::string("running ") + com_name, sdict);
220 info_cout(std::string("outfname = [") + m_outfname +
221 "], dice::verbose = " + sdict.get("dice::verbose"), sdict);
222
223 // print help and exit if -h
224 if(sdict.is_defined("h"))
225 {
226 std::cout
227 << "Usage: " << com_name << " [option]\n"
228 << "Option: [-h]\n"
229 << " printout this message\n"
230 << " [-dice::verbose severity_level]\n"
231 << " verbose severity level (3 is info.). (default: " + sdict.get("dice::verbose")
232 << ")\n"
233 << " [-outfname string]\n"
234 << " output ppm file base name. When empty, no output.\n"
235 << " A frame number and extension (.ppm) will be added.\n"
236 << " (default: [" << m_outfname << "])\n"
237 << " [-test_set_roi bool]\n"
238 << " when false, no ROI set.\n"
239 << " (default: [" << m_test_set_roi << "])\n"
240 << std::endl;
241 exit(1);
242 }
243 return true;
244}
245
246//----------------------------------------------------------------------
247void Render_frame::setup_camera(nv::index::IPerspective_camera* cam) const
248{
249 check_success(cam != 0);
250
251 // Set the camera parameters to see the whole scene
252 mi::math::Vector< mi::Float32, 3 > const from(-3.67f, 24.35f, -40.85f);
253 mi::math::Vector< mi::Float32, 3 > const to ( 9.5, 9.5, -9.5);
254 mi::math::Vector< mi::Float32, 3 > const up ( 0.0f, 1.0f, 0.0f);
255 mi::math::Vector<mi::Float32, 3> viewdir = to - from;
256 viewdir.normalize();
257
258 cam->set(from, viewdir, up);
259 cam->set_aperture(0.033f);
260 cam->set_aspect(1.0f);
261 cam->set_focal(0.03f);
262 cam->set_clip_min(2.0f);
263 cam->set_clip_max(420.0f);
264}
265
266//----------------------------------------------------------------------
267void Render_frame::setup_render_frame_scene(
268 nv::index::IScene* scene_edit,
269 const mi::math::Bbox_struct< mi::Float32, 3 >& xyz_roi_st,
270 const mi::neuraylib::Tag& camera_tag,
271 mi::neuraylib::IDice_transaction* dice_transaction) const
272{
273 check_success(dice_transaction != 0);
274
275 // set the region of interest
276 const mi::math::Bbox< mi::Float32, 3 > xyz_roi(xyz_roi_st);
277 if(xyz_roi.is_volume())
278 {
279 scene_edit->set_clipped_bounding_box(xyz_roi_st);
280 }
281 else
282 {
283 INFO_LOG << "ROI has no volume, not set the ROI.";
284 }
285
286 // Set the scene transformation matrix.
287 // only change the coordinate system
288 mi::math::Matrix<mi::Float32, 4, 4> transform_mat(
289 1.0f, 0.0f, 0.0f, 0.0f,
290 0.0f, 1.0f, 0.0f, 0.0f,
291 0.0f, 0.0f, -1.0f, 0.0f,
292 0.0f, 0.0f, 0.0f, 1.0f
293 );
294 scene_edit->set_transform_matrix(transform_mat);
295
296 // Set the current camera to the scene.
297 check_success(camera_tag.is_valid());
298 scene_edit->set_camera(camera_tag);
299}
300
301//----------------------------------------------------------------------
302// This examples shows how to use render call.
303int main(int argc, const char* argv[])
304{
305 nv::index::app::String_dict sdict;
306 sdict.insert("dice::verbose", "3"); // log level
307 sdict.insert("outfname", "frame_render_frame"); // output file base name
308 sdict.insert("unittest", "0"); // default mode
309 sdict.insert("test_set_roi", "1"); // ROI set/no-set test
310 sdict.insert("is_dump_comparison_image_when_failed", "1"); // default: dump images when failed.
311 sdict.insert("is_call_from_test", "0"); // default: not call from make check.
312
313 // DiCE settings
314 sdict.insert("dice::network::mode", "OFF");
315
316 // IndeX settings
317 sdict.insert("index::config::set_monitor_performance_values", "true");
318 sdict.insert("index::service", "rendering_and_compositing");
319 sdict.insert("index::cuda_debug_checks", "false");
320
321 // Application_layer settings
322 sdict.insert("index::app::components::application_layer::component_name_list",
323 "canvas_infrastructure image io");
324
325 // Initialize application
327 render_frame.initialize(argc, argv, sdict);
328 check_success(render_frame.is_initialized());
329
330 // launch the application. creating the scene and rendering.
331 const mi::Sint32 exit_code = render_frame.launch();
332 INFO_LOG << "Shutting down ...";
333
334 return exit_code;
335}
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
virtual ~Render_frame()
mi::Sint32 launch()
nv::index::IFrame_results * render_frame(App_rendering_context &arc, const std::string &output_fname)
int main(int argc, const char *argv[])
#define check_success(expr)