NVIDIA Index example code nvidia_logo_transpbg.gif Up
xac_compute_trianglemesh.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright 2023 NVIDIA Corporation. All rights reserved.
3 *****************************************************************************/
4
6#include <nv/index/itriangle_mesh_scene_element.h>
7#include <nv/index/ilight.h>
8#include <nv/index/imaterial.h>
9#include <nv/index/irendering_kernel_programs.h>
10
11namespace xac_compute {
12namespace trianglemesh {
13
14static const char* program_begin =
15";NV_IDX_XAC_VERSION_1_0 \n"
16" \n"
17"class Surface_sample_program \n"
18"{ \n"
19" NV_IDX_SURFACE_SAMPLE_PROGRAM \n"
20" \n"
21"public: \n"
22" NV_IDX_DEVICE_INLINE_MEMBER void initialize() \n"
23" { \n"
24" } \n"
25" \n"
26" NV_IDX_DEVICE_INLINE_MEMBER float checker(const float3& pos) const \n"
27" { \n"
28" int box = 20; \n"
29" int a = (int(pos.x) / box & 1); \n"
30" int b = (int(pos.y) / box & 1); \n"
31" return (a ^ b) ? 1.f : 0.f; \n"
32" } \n"
33;
34
35static const char* program_end =
36"}; \n"
37;
38
39static const char* color_program =
40" NV_IDX_DEVICE_INLINE_MEMBER int execute( \n"
41" const Sample_info_self& sample_info, \n"
42" Sample_output& sample_output) \n"
43" { \n"
44" sample_output.set_color(make_float4( \n"
45" sample_info.texture_coordinates.x, \n"
46" sample_info.texture_coordinates.y, \n"
47" checker(sample_info.scene_position), \n"
48" 1.f)); \n"
49" \n"
50" //sample_output.set_color(sample_info.sample_color); \n"
51" return NV_IDX_PROG_OK; \n"
52" } \n"
53;
54
55static const char* compute_program =
56" // The user program for compute. \n"
57" NV_IDX_DEVICE_INLINE_MEMBER \n"
58" int compute( \n"
59" const Data_point_info_self& data_point_info, \n"
60" Data_point_output& data_output) \n"
61" { \n"
62" const auto& surf = state.self; \n"
63" unsigned attr_idx = surf.Attr_vertex_texture_coordinate; \n"
64" float2 v = surf.get_attribute<float2>(attr_idx, data_point_info); \n"
65" \n"
66" // Modify value v. \n"
67" v.x = 1.f - v.x; \n"
68" v.y = 1.f - v.y; \n"
69" \n"
70" float3 pos = data_point_info.get_position(); \n"
71" v *= checker(pos); \n"
72" \n"
73" data_output.write_value(attr_idx, v); \n"
74" \n"
75" return NV_IDX_PROG_OK; \n"
76" } \n"
77;
78
79//----------------------------------------------------------------------
80
81
82void Trianglemesh_setup::register_classes(nv::index::IIndex* index_interface) const
83{
84 // empty
85}
86
87
89{
90 opt_map["tmesh.file"] = "../create_trianglemesh/jacket.bin"; // input triangle mesh file name
91// opt_map["tmesh.roi"] = "368.38 727.758 482.661 630.081 995.543 590.383"; // input roi
92}
93
94
96{
97 usage.opt("tmesh.file", "FILENAME", "Filename of the triangle mesh (.bin-format).");
98}
99
100
102{
103 return "368.38 727.758 482.661 630.081 995.543 590.383";
104}
105
106
108 Nvindex_access& nvindex_accessor,
109 Scene_info& scene_info,
110 const Bbox3f& roi_bbox,
111 mi::neuraylib::Tag session_tag,
112 const Option_map& opt_map,
113 mi::neuraylib::IDice_transaction* transaction) const
114{
115 const std::string mesh_file = opt_map["tmesh.file"];
116 check_success(session_tag.is_valid());
117 check_success(transaction != 0);
118
119 mi::base::Handle< nv::index::ISession const > session(
120 transaction->access<nv::index::ISession const>(session_tag));
121 check_success(session.is_valid_interface());
122
123 // Get the scene (root)
124 mi::base::Handle< nv::index::IScene > scene_edit(
125 transaction->edit<nv::index::IScene>(session->get_scene()));
126 check_success(scene_edit.is_valid_interface());
127
128 {
129 // Set the default light source
130 mi::base::Handle<nv::index::IDirectional_headlight> headlight(
131 scene_edit->create_attribute<nv::index::IDirectional_headlight>());
132 check_success(headlight.is_valid_interface());
133 headlight->set_direction(Vec3f(0.5f, 0.f, -1.f));
134 const mi::neuraylib::Tag headlight_tag = transaction->store(headlight.get());
135 check_success(headlight_tag.is_valid());
136 scene_edit->append(headlight_tag, transaction);
137
138 // Set the default material
139 mi::base::Handle<nv::index::IPhong_gl> phong_1(scene_edit->create_attribute<nv::index::IPhong_gl>());
140 check_success(phong_1.is_valid_interface());
141 phong_1->set_ambient(mi::math::Color(0.1f, 0.1f, 0.1f, 1.0f));
142 phong_1->set_diffuse(mi::math::Color(0.45f, 0.3f, 0.3f, 1.0f));
143 phong_1->set_specular(mi::math::Color(0.4f, 0.4f, 0.75f, 1.0f));
144 const mi::Float32 opacity = 1.f;
145 phong_1->set_opacity(opacity);
146 phong_1->set_shininess(85);
147 const mi::neuraylib::Tag phong_1_tag = transaction->store(phong_1.get());
148 check_success(phong_1_tag.is_valid());
149 scene_edit->append(phong_1_tag, transaction);
150 }
151
152 // Create a static scene group
153 mi::base::Handle<nv::index::IStatic_scene_group> static_group(
154 scene_edit->create_scene_group<nv::index::IStatic_scene_group>());
155 check_success(static_group.is_valid_interface());
156
157 // Append the surface sample program
158 const int user_prg = nv::index::app::get_sint32(opt_map["user_program_mode"]);
159 if (user_prg) {
160 mi::base::Handle<nv::index::ISurface_sample_program> surface_sample_program(
161 scene_edit->create_attribute<nv::index::ISurface_sample_program>());
162 check_success(surface_sample_program.is_valid_interface());
163
164 std::string program_src = scene_info.rtc_program_source;
165 if (program_src.empty()) {
166 program_src = program_begin;
167 program_src.append(color_program);
168 if (user_prg > 1) {
169 program_src.append(compute_program);
170 }
171 program_src.append(program_end);
172 scene_info.rtc_program_source = program_src;
173 }
174 surface_sample_program->set_program_source(program_src.c_str());
175
176 const mi::neuraylib::Tag surface_program_tag =
177 transaction->store_for_reference_counting(surface_sample_program.get());
178 check_success(surface_program_tag.is_valid());
179 static_group->append(surface_program_tag, transaction);
180 scene_info.compute_launch_info.compute_program_tag = surface_program_tag;
181 }
182
183 {
184 // triangle mesh creation parameter
185 std::map<std::string, std::string> triangle_mesh_opt;
186 triangle_mesh_opt["type"] = "triangle_mesh";
187 triangle_mesh_opt["importer"] = "nv::index::plugin::base_importer.Triangle_mesh_importer";
188 triangle_mesh_opt["input_file"] = mesh_file;
189 triangle_mesh_opt["bbox"] = get_roi_string();
190 nv::index::IDistributed_data_import_callback* importer_callback =
191 get_importer_from_application_layer(
192 nvindex_accessor.get_application_layer_interface(),
193 "nv::index::plugin::base_importer.Triangle_mesh_importer",
194 triangle_mesh_opt);
195
196 // Create the triangle mesh scene element
197 mi::base::Handle<nv::index::ITriangle_mesh_scene_element> mesh(
198 scene_edit->create_triangle_mesh(roi_bbox, importer_callback, transaction));
199 check_success(mesh != 0);
200
201 // scene element properties
202 mesh->set_enabled(true);
203
204 // storing the mesh in the data (base) store
205 mi::neuraylib::Tag mesh_tag = transaction->store_for_reference_counting(
206 mesh.get(), mi::neuraylib::NULL_TAG, "mesh");
207 check_success(mesh_tag.is_valid());
208
209
210 // append mesh to the static scene group
211 static_group->append(mesh_tag, transaction);
212 scene_info.compute_launch_info.scene_element_tag = mesh_tag;
213 }
214 mi::neuraylib::Tag static_group_tag = transaction->store(static_group.get());
215 check_success(static_group_tag.is_valid());
216
217 // append the static scene group to the hierachical scene description.
218 scene_edit->append(static_group_tag, transaction);
219
220 return true;
221}
222
223
225 mi::neuraylib::Tag camera_tag,
226 const Option_map& opt_map,
227 mi::neuraylib::IDice_transaction* transaction) const
228{
229 mi::base::Handle<nv::index::IPerspective_camera> cam(
230 transaction->edit<nv::index::IPerspective_camera>(camera_tag));
231 check_success(cam.is_valid_interface());
232
233 const mi::math::Vector< mi::Float32, 3 > from(500.f, 850.f, 800.f);
234 mi::math::Vector< mi::Float32, 3 > viewdir(0.f, 0.f, -1.f);
235 const mi::math::Vector< mi::Float32, 3 > up(0.f, 1.f, 0.f);
236 viewdir.normalize();
237
238 cam->set(from, viewdir, up);
239 cam->set_aperture(0.033f);
240 cam->set_aspect(1.0f);
241 cam->set_focal(0.03f);
242 cam->set_clip_min(10.0f);
243 cam->set_clip_max(5000.0f);
244}
245
246}}
247
void opt(const std::string &opt, const char *arg_info, const char *subline="")
Definition: xac_compute.h:94
void setup_camera(mi::neuraylib::Tag camera_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const
bool create_scene(Nvindex_access &nvindex_accessor, Scene_info &scene_info, const Bbox3f &roi_bbox, mi::neuraylib::Tag session_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const
void register_classes(nv::index::IIndex *index_interface) const
XAC compute example scenes.
Definition: xac_compute.cpp:27
mi::math::Bbox< mi::Float32, 3 > Bbox3f
Definition: xac_compute.h:29
mi::math::Vector< mi::Float32, 3 > Vec3f
Definition: xac_compute.h:38
#define check_success(expr)
mi::neuraylib::Tag scene_element_tag
Definition: xac_compute.h:130
mi::neuraylib::Tag compute_program_tag
Definition: xac_compute.h:129
std::string rtc_program_source
Definition: xac_compute.h:141
Compute_launch_info compute_launch_info
Definition: xac_compute.h:140