NVIDIA Index example code nvidia_logo_transpbg.gif Up
ray_sampling_trianglemesh.h
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright 2023 NVIDIA Corporation. All rights reserved.
3 *****************************************************************************/
10#ifndef EXAMPLES_RAY_SAMPLING_TRIANGLEMESH_H
11#define EXAMPLES_RAY_SAMPLING_TRIANGLEMESH_H
12
13#include "ray_sampling_scenes.h"
14#include <nv/index/itriangle_mesh_scene_element.h>
15#include <nv/index/ilight.h>
16#include <nv/index/imaterial.h>
17
18
19namespace trianglemesh {
20
21static const char* program_begin =
22";NV_IDX_XAC_VERSION_1_0 \n"
23" \n"
24"class Surface_sample_program \n"
25"{ \n"
26" NV_IDX_SURFACE_SAMPLE_PROGRAM \n"
27" \n"
28"public: \n"
29" int counter; \n"
30" \n"
31" NV_IDX_DEVICE_INLINE_MEMBER void initialize() \n"
32" { \n"
33" counter = 0; \n"
34" } \n"
35" \n"
36;
37
38static const char* program_end =
39"}; \n"
40;
41
42static const char* color_program =
43" NV_IDX_DEVICE_INLINE_MEMBER int execute( \n"
44" const Sample_info_self& sample_info, \n"
45" Sample_output& sample_output) \n"
46" { \n"
47" const float4& sample_color = sample_info.sample_color; \n"
48" sample_output.set_color(sample_color); \n"
49" return NV_IDX_PROG_OK; \n"
50" } \n"
51;
52
53static const char* inquire_program =
54" // The user program used for picking. \n"
55" NV_IDX_DEVICE_INLINE_MEMBER int inquire( \n"
56" const Sample_info_self& sample_info, \n"
57" Query_results& query_results) \n"
58" { \n"
59" // sample_info.ray_t is automatically written \n"
60" // color is automatically written \n"
61" \n"
62" // we could invalidate current sample to skip/ignore it \n"
63" //query_results.invalidate_sample(); \n"
64" \n"
65" // write some attribute value of current sample \n"
66" const float v = //state.self.sample<float>( \n"
67" sample_info.scene_position.x; \n"
68" query_results.write_value<float>(0u /*user_value_idx*/, v); \n"
69" \n"
70" counter += 1; \n"
71" if (counter & 1) { \n"
72" // write every other counter as user value \n"
73" query_results.write_value<int>(1u /*user_value_idx*/, counter); \n"
74" } \n"
75" \n"
76" const float3 normal = sample_info.sample_normal; \n"
77" query_results.write_value<float3>(2u /*user_value_idx*/, normal); \n"
78" \n"
79" return NV_IDX_PROG_OK; \n"
80" \n"
81" // we can stop sampling: \n"
82" //return NV_IDX_PROG_TERMINATE_PROGRAM_INSTANCE; \n"
83" } \n"
84;
85
86
87//----------------------------------------------------------------------
88
90{
91public:
92 const char* name() const { return "Trianglemesh"; }
93
94 void register_classes(nv::index::IIndex* index_interface) const
95 {
96 // empty
97 }
98
99
100 void add_arguments(std::map<std::string, std::string>& opt_map) const
101 {
102 opt_map["tmesh.file"] = "../create_trianglemesh/jacket.bin"; // input triangle mesh file name
103// opt_map["tmesh.roi"] = "368.38 727.758 482.661 630.081 995.543 590.383"; // input roi
104 }
105
106
107 void usage_info(std::ostream& os, const char* indent, std::map<std::string, std::string>& opt_map) const
108 {
109 os << indent << "[-tmesh.file string]\n"
110 << indent << " name of the triangle mesh file (in .bin-format).\n"
111 << indent << " (default: [" << opt_map["tmesh.file"] << "])\n"
112 //<< indent << "[-tmesh.roi \"float float float float float float\"]\n"
113 //<< indent << " the bounding box representing the region of interest (roi).\n"
114 //<< indent << " (default: [" << opt_map["tmesh.roi"] << "])\n"
115 ;
116 }
117
118
119 const char* get_roi_string() const
120 {
121 return "368.38 727.758 482.661 630.081 995.543 590.383";
122 }
123
124
125 //void adjust_configuration(
126 // nv::index::IConfig_settings* config_settings,
127 // std::map<std::string, std::string>& opt_map) const {}
128
129
131 nv::index::app::IApplication_layer* app_layer,
132 Scene_info& scene_info,
133 const mi::math::Bbox< mi::Float32, 3>& roi_bbox,
134 const mi::neuraylib::Tag& session_tag,
135 std::map<std::string, std::string>& opt_map,
136 mi::neuraylib::IDice_transaction* transaction) const
137 {
138 const std::string mesh_file = opt_map["tmesh.file"];
139 check_success(session_tag.is_valid());
140 check_success(transaction != 0);
141
142 mi::base::Handle< nv::index::ISession const > session(
143 transaction->access<nv::index::ISession const>(session_tag));
144 check_success(session.is_valid_interface());
145
146 // Get the scene (root)
147 mi::base::Handle< nv::index::IScene > scene_edit(
148 transaction->edit<nv::index::IScene>(session->get_scene()));
149 check_success(scene_edit.is_valid_interface());
150
151 {
152 // Set the default light source
153 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
154 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
155 check_success(headlight.is_valid_interface());
156 headlight->set_direction(mi::math::Vector<mi::Float32, 3>(0.5f, 0.f, -1.f));
157 const mi::neuraylib::Tag headlight_tag = transaction->store(headlight.get());
158 check_success(headlight_tag.is_valid());
159 scene_edit->append(headlight_tag, transaction);
160
161 // Set the default material
162 mi::base::Handle<nv::index::IPhong_gl> phong_1(scene_edit->create_attribute<nv::index::IPhong_gl>());
163 check_success(phong_1.is_valid_interface());
164 phong_1->set_ambient(mi::math::Color(0.1f, 0.1f, 0.1f, 1.0f));
165 phong_1->set_diffuse(mi::math::Color(0.45f, 0.3f, 0.3f, 1.0f));
166 phong_1->set_specular(mi::math::Color(0.4f, 0.4f, 0.75f, 1.0f));
167 const mi::Float32 opacity = 1.f;
168 phong_1->set_opacity(opacity);
169 phong_1->set_shininess(85);
170 const mi::neuraylib::Tag phong_1_tag = transaction->store(phong_1.get());
171 check_success(phong_1_tag.is_valid());
172 scene_edit->append(phong_1_tag, transaction);
173 }
174
175 // Create a static scene group
176 mi::base::Handle<nv::index::IStatic_scene_group> static_group(
177 scene_edit->create_scene_group<nv::index::IStatic_scene_group>());
178 check_success(static_group.is_valid_interface());
179
180 // Append the surface sample program
181 const int user_prg = nv::index::app::get_sint32(opt_map["user_program_mode"]);
182 if (user_prg) {
183 mi::base::Handle<nv::index::ISurface_sample_program> surface_sample_program(
184 scene_edit->create_attribute<nv::index::ISurface_sample_program>());
185 check_success(surface_sample_program.is_valid_interface());
186
187 std::string program_src = scene_info.rtc_program_source;
188 if (program_src.empty()) {
189 program_src = program_begin;
190 program_src.append(color_program);
191 if (user_prg > 1) {
192 program_src.append(inquire_program);
193 }
194 program_src.append(program_end);
195 scene_info.rtc_program_source = program_src;
196 }
197 surface_sample_program->set_program_source(program_src.c_str());
198
199 const mi::neuraylib::Tag surface_program_tag =
200 transaction->store_for_reference_counting(surface_sample_program.get());
201 check_success(surface_program_tag.is_valid());
202 static_group->append(surface_program_tag, transaction);
203 }
204
205 {
206 // triangle mesh creation parameter
207 std::map<std::string, std::string> triangle_mesh_opt;
208 triangle_mesh_opt["type"] = "triangle_mesh";
209 triangle_mesh_opt["importer"] = "nv::index::plugin::base_importer.Triangle_mesh_importer";
210 triangle_mesh_opt["input_file"] = mesh_file;
211 triangle_mesh_opt["bbox"] = get_roi_string();
212 nv::index::IDistributed_data_import_callback* importer_callback =
213 get_importer_from_application_layer(
214 app_layer,
215 "nv::index::plugin::base_importer.Triangle_mesh_importer",
216 triangle_mesh_opt);
217
218
219 // Create the triangle mesh scene element
220 mi::base::Handle<nv::index::ITriangle_mesh_scene_element> mesh(
221 scene_edit->create_triangle_mesh(roi_bbox, importer_callback, transaction));
222 check_success(mesh != 0);
223
224 // scene element properties
225 mesh->set_enabled(true);
226
227 // storing the mesh in the data (base) store
228 mi::neuraylib::Tag mesh_tag = transaction->store_for_reference_counting(
229 mesh.get(), mi::neuraylib::NULL_TAG, "mesh");
230 check_success(mesh_tag.is_valid());
231
232
233 // append mesh to the static scene group
234 static_group->append(mesh_tag, transaction);
235 }
236 mi::neuraylib::Tag static_group_tag = transaction->store(static_group.get());
237 check_success(static_group_tag.is_valid());
238
239 // append the static scene group to the hierachical scene description.
240 scene_edit->append(static_group_tag, transaction);
241
242 return true;
243 }
244
245
246 // setup camera to see this example scene
247 //
248 // \param[in] camera_tag camera tag
249 // \param[in] transaction dice transaction
251 const mi::neuraylib::Tag& camera_tag,
252 mi::neuraylib::IDice_transaction* transaction) const
253 {
254 mi::base::Handle<nv::index::IPerspective_camera> cam(
255 transaction->edit<nv::index::IPerspective_camera>(camera_tag));
256 check_success(cam.is_valid_interface());
257
258 const mi::math::Vector< mi::Float32, 3 > from(500.f, 861.f, -890.f);
259 mi::math::Vector< mi::Float32, 3 > viewdir(0.f, 0.f, 1.f);
260 const mi::math::Vector< mi::Float32, 3 > up(0.f, 1.f, 0.f);
261 viewdir.normalize();
262
263 cam->set(from, viewdir, up);
264 cam->set_aperture(0.033f);
265 cam->set_aspect(1.0f);
266 cam->set_focal(0.03f);
267 cam->set_clip_min(10.0f);
268 cam->set_clip_max(5000.0f);
269 }
270
271};
272
273}
274
275#endif
void usage_info(std::ostream &os, const char *indent, std::map< std::string, std::string > &opt_map) const
bool create_scene(nv::index::app::IApplication_layer *app_layer, Scene_info &scene_info, const mi::math::Bbox< mi::Float32, 3 > &roi_bbox, const mi::neuraylib::Tag &session_tag, std::map< std::string, std::string > &opt_map, mi::neuraylib::IDice_transaction *transaction) const
void register_classes(nv::index::IIndex *index_interface) const
void setup_camera(const mi::neuraylib::Tag &camera_tag, mi::neuraylib::IDice_transaction *transaction) const
void add_arguments(std::map< std::string, std::string > &opt_map) const
static const char * program_end
static const char * inquire_program
static const char * color_program
static const char * program_begin
Scene setup interface for ray sampling example.
#define check_success(expr)