NVIDIA Index example code nvidia_logo_transpbg.gif Up
xac_compute_scene_tool.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright 2023 NVIDIA Corporation. All rights reserved.
3 *****************************************************************************/
4
6#include <nv/index/irendering_kernel_programs.h>
7
8namespace xac_compute {
9
10
12 mi::neuraylib::Tag session_tag_,
13 mi::neuraylib::IDice_transaction* transaction_)
14 : transaction(transaction_)
15{
17
18 // Access the session instance from the database.
19 session = transaction->access<const nv::index::ISession>(session_tag_);
20 check_success(session.is_valid_interface());
21
22 // Access (edit mode) the scene instance from the database.
23 scene = transaction->edit<nv::index::IScene>(session->get_scene());
24 check_success(scene.is_valid_interface());
25}
26
27
28
29mi::neuraylib::Tag Scene_tool::add_new_group(bool transformed_group /*= false*/)
30{
31 mi::base::Handle<nv::index::IScene_group> group;
32 if (transformed_group) {
33 group = scene->create_scene_group<nv::index::ITransformed_scene_group>();
34 }
35 else {
36 group = scene->create_scene_group<nv::index::IStatic_scene_group>();
37 }
38 mi::neuraylib::Tag group_tag = transaction->store_for_reference_counting(group.get());
39 check_success(group_tag.is_valid());
40 // append the static scene group to the hierarchical scene description.
41 scene->append(group_tag, transaction);
42 set_group(group_tag);
43 return group_tag;
44}
45
46
47void Scene_tool::set_group(mi::neuraylib::Tag group_)
48{
49 if (group_.is_valid()) {
50 current_group = transaction->edit<nv::index::IScene_group>(group_);
51 }
52 else {
53 current_group.reset();
54 }
55}
56
57
58// factory to create concrete XAC program type
59template<class T>
60inline mi::base::Handle<nv::index::IRendering_kernel_program>
62{
63 mi::base::Handle<T> program;
64 scene_tool.create_attribute(program);
65 mi::base::Handle<nv::index::IRendering_kernel_program> rprog;
66 if (program) {
67 rprog = program-> template get_interface<nv::index::IRendering_kernel_program>();
68 }
69 return rprog;
70}
71
72
73// nv::index::IVolume_sample_program or nv::index::ISurface_sample_program
74std::pair<mi::neuraylib::Tag, std::string>
76 Sample_program_kind prg_kind,
77 int user_prg,
78 const std::string& user_text,
79 const Program_source& prg_text,
80 Scene_tool& scene_tool,
81 const char* extra_pgr_methods)
82
83{
84 if (user_prg == 0) {
85 return std::pair<mi::neuraylib::Tag, std::string>();
86 }
87
88 // IRendering_kernel_program
89 mi::base::Handle<nv::index::IRendering_kernel_program> sampling_program;
90 switch (prg_kind) {
92 sampling_program = create_kernel_program<nv::index::ISurface_sample_program>(scene_tool);
93 break;
94 }
96 sampling_program = create_kernel_program<nv::index::IVolume_sample_program>(scene_tool);
97 break;
98 }
99 default: return std::make_pair(mi::neuraylib::NULL_TAG, std::string());
100 }
101
102 std::string program_src = user_text;
103 if (program_src.empty()) {
104 program_src = prg_text.program_begin;
105 if (extra_pgr_methods) program_src.append(extra_pgr_methods);
106 program_src.append(prg_text.color_program);
107 if (user_prg > 1) {
108 program_src.append(prg_text.compute_program);
109 }
110 program_src.append(prg_text.program_end);
111 }
112 sampling_program->set_program_source(program_src.c_str());
113
114 const mi::neuraylib::Tag prog_tag = scene_tool.store_and_add_to_group(sampling_program);
115
116 return std::make_pair(prog_tag, program_src);
117}
118
119
120}//xac_compute
121
XAC compute example scenes.
Definition: xac_compute.cpp:27
std::pair< mi::neuraylib::Tag, std::string > add_user_program(Sample_program_kind prg_kind, int user_prg, const std::string &user_text, const Program_source &prg_text, Scene_tool &scene_tool, const char *extra_pgr_methods)
mi::base::Handle< nv::index::IRendering_kernel_program > create_kernel_program(Scene_tool &scene_tool)
#define check_success(expr)
mi::base::Handle< nv::index::IScene_group > current_group
mi::base::Handle< nv::index::IScene > scene
void set_group(mi::neuraylib::Tag group_)
mi::neuraylib::Tag add_new_group(bool transformed_group=false)
Scene_tool(mi::neuraylib::Tag session_tag_, mi::neuraylib::IDice_transaction *transaction_)
mi::base::Handle< const nv::index::ISession > session
mi::neuraylib::IDice_transaction * transaction
mi::neuraylib::Tag store_and_add_to_group(const mi::base::Handle<T> &element)
void create_attribute(mi::base::Handle<T> &element)
Scene setup interface for xac compute example.