Blue Brain BioExplorer
OptiXContext.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2024, EPFL/Blue Brain Project
3  *
4  * The Blue Brain BioExplorer is a tool for scientists to extract and analyse
5  * scientific data from visualization
6  *
7  * This file is part of Blue Brain BioExplorer <https://github.com/BlueBrain/BioExplorer>
8  *
9  * This library is free software; you can redistribute it and/or modify it under
10  * the terms of the GNU Lesser General Public License version 3.0 as published
11  * by the Free Software Foundation.
12  *
13  * This library is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #pragma once
24 
25 #include "OptiXProperties.h"
26 #include "OptiXTypes.h"
27 #include "OptiXUtils.h"
28 
30 
31 #include <optixu/optixpp_namespace.h>
32 
33 #include <mutex>
34 #include <unordered_map>
35 
36 namespace core
37 {
38 namespace engine
39 {
40 namespace optix
41 {
42 // Scene
43 static const char* CONTEXT_SCENE_TOP_OBJECT = "top_object";
44 static const char* CONTEXT_SCENE_TOP_SHADOWER = "top_shadower";
45 
46 // Renderer
47 static const char* CONTEXT_RENDERER_JITTER = "jitter4";
48 static const char* CONTEXT_RENDERER_FRAME = "frame";
49 static const char* CONTEXT_RENDERER_RADIANCE_RAY_TYPE = "radianceRayType";
50 static const char* CONTEXT_RENDERER_SHADOW_RAY_TYPE = "shadowRayType";
51 static const char* CONTEXT_RENDERER_SCENE_EPSILON = "sceneEpsilon";
52 static const char* CONTEXT_RENDERER_AMBIENT_LIGHT_COLOR = "ambientLightColor";
53 static const char* CONTEXT_RENDERER_BACKGROUND_COLOR = "bgColor";
54 static const char* CONTEXT_RENDERER_SAMPLES_PER_PIXEL = "samples_per_pixel";
55 
56 // Camera
57 static const char* CONTEXT_CAMERA_EYE = "eye";
58 static const char* CONTEXT_CAMERA_ORIENTATION = "orientation";
59 static const char* CONTEXT_CAMERA_DIR = "dir";
60 static const char* CONTEXT_CAMERA_U = "U";
61 static const char* CONTEXT_CAMERA_V = "V";
62 static const char* CONTEXT_CAMERA_W = "W";
63 static const char* CONTEXT_CAMERA_APERTURE_RADIUS = CAMERA_PROPERTY_APERTURE_RADIUS.name.c_str();
64 static const char* CONTEXT_CAMERA_FOCAL_DISTANCE = CAMERA_PROPERTY_FOCAL_DISTANCE.name.c_str();
65 static const char* CONTEXT_CAMERA_FIELD_OF_VIEW = CAMERA_PROPERTY_FIELD_OF_VIEW.name.c_str();
66 static const char* CONTEXT_CAMERA_ASPECT = CAMERA_PROPERTY_ASPECT_RATIO.name.c_str();
67 static const char* CONTEXT_CAMERA_OFFSET = "offset";
68 
69 // Exception
70 static const char* CONTEXT_EXCEPTION_BAD_COLOR = "bad_color";
71 
72 // Perspective
73 static const char* CUDA_FUNC_PERSPECTIVE_CAMERA = "perspectiveCamera";
74 static const char* CONTEXT_CAMERA_STEREO = CAMERA_PROPERTY_STEREO.name.c_str();
75 static const char* CONTEXT_CAMERA_IPD = CAMERA_PROPERTY_INTERPUPILLARY_DISTANCE.name.c_str();
76 static const char* CONTEXT_CAMERA_IPD_OFFSET = "ipd_offset";
77 
78 // Orthographic
79 static const char* CUDA_FUNC_ORTHOGRAPHIC_CAMERA = "orthographicCamera";
80 static const char* CONTEXT_CAMERA_HEIGHT = CAMERA_PROPERTY_HEIGHT.name.c_str();
81 
82 // Clipping planes
83 static const char* CONTEXT_ENABLE_CLIPPING_PLANES = CAMERA_PROPERTY_ENABLE_CLIPPING_PLANES.name.c_str();
84 static const char* CONTEXT_CLIPPING_PLANES = "clippingPlanes";
85 static const char* CONTEXT_NB_CLIPPING_PLANES = "nbClippingPlanes";
86 
87 // Lights
88 static const char* CONTEXT_LIGHTS = RENDERER_PROPERTY_LIGHTS;
89 
90 // Environment
91 static const char* CONTEXT_USE_ENVIRONMENT_MAP = "use_envmap";
92 
93 // Geometry
94 static const char* CONTEXT_SPHERE_SIZE = "sphere_size";
95 static const char* CONTEXT_CYLINDER_SIZE = "cylinder_size";
96 static const char* CONTEXT_CONE_SIZE = "cone_size";
97 static const char* CONTEXT_SDF_GEOMETRY_SIZE = "sdf_geometry_size";
98 static const char* CONTEXT_VOLUME_SIZE = "volume_size";
99 static const char* CONTEXT_FIELD_SIZE = "field_size";
100 
101 // Material
102 static const char* CONTEXT_MATERIAL_KA = "Ka";
103 static const char* CONTEXT_MATERIAL_KD = "Kd";
104 static const char* CONTEXT_MATERIAL_KS = "Ks";
105 static const char* CONTEXT_MATERIAL_KR = "Kr";
106 static const char* CONTEXT_MATERIAL_KO = "Ko";
107 static const char* CONTEXT_MATERIAL_GLOSSINESS = "glossiness";
108 static const char* CONTEXT_MATERIAL_REFRACTION_INDEX = "refraction_index";
109 static const char* CONTEXT_MATERIAL_SPECULAR_EXPONENT = "phong_exp";
110 static const char* CONTEXT_MATERIAL_SHADING_MODE = "shading_mode";
111 static const char* CONTEXT_MATERIAL_USER_PARAMETER = "user_parameter";
112 static const char* CONTEXT_MATERIAL_CAST_USER_DATA = "cast_user_data";
113 static const char* CONTEXT_MATERIAL_CLIPPING_MODE = "clipping_mode";
114 static const char* CONTEXT_MATERIAL_VALUE_RANGE = "value_range";
115 static const char* CONTEXT_MATERIAL_RADIANCE_LODS = "radianceLODs";
116 
117 // Frame buffer
118 static const char* CONTEXT_STAGE_TONE_MAPPER = "TonemapperSimple";
119 static const char* CONTEXT_STAGE_DENOISER = "DLDenoiser";
120 static const char* CONTEXT_INPUT_BUFFER = "input_buffer";
121 static const char* CONTEXT_OUTPUT_BUFFER = "output_buffer";
122 static const char* CONTEXT_DEPTH_BUFFER = "depth_buffer";
123 static const char* CONTEXT_INPUT_ALBEDO_BUFFER = "input_albedo_buffer";
124 static const char* CONTEXT_INPUT_NORMAL_BUFFER = "input_normal_buffer";
125 static const char* CONTEXT_TONE_MAPPER_EXPOSURE = "exposure";
126 static const char* CONTEXT_TONE_MAPPER_GAMMA = "gamma";
127 static const char* CONTEXT_DENOISE_BLEND = "blend";
128 static const char* CONTEXT_ACCUMULATION_BUFFER = "accum_buffer";
129 static const char* CONTEXT_DENOISED_BUFFER = "denoised_buffer";
130 static const char* CONTEXT_TONEMAPPED_BUFFER = "tonemapped_buffer";
131 static const char* CONTEXT_FRAME_NUMBER = "frame_number";
132 
133 // Volume parameters
134 static const char* CONTEXT_VOLUME_GRADIENT_SHADING_ENABLED = "volumeGradientShadingEnabled";
135 static const char* CONTEXT_VOLUME_GRADIENT_OFFSET = "volumeGradientOffset";
136 static const char* CONTEXT_VOLUME_ADAPTIVE_MAX_SAMPLING_RATE = "volumeAdaptiveMaxSamplingRate";
137 static const char* CONTEXT_VOLUME_ADAPTIVE_SAMPLING = "volumeAdaptiveSampling";
138 static const char* CONTEXT_VOLUME_SINGLE_SHADE = "volumeSingleShade";
139 static const char* CONTEXT_VOLUME_PRE_INTEGRATION = "volumePreIntegration";
140 static const char* CONTEXT_VOLUME_SAMPLING_RATE = "volumeSamplingRate";
141 static const char* CONTEXT_VOLUME_SPECULAR_COLOR = "volumeSpecularColor";
142 static const char* CONTEXT_VOLUME_CLIPPING_BOX_LOWER = "volumeClippingBoxLower";
143 static const char* CONTEXT_VOLUME_CLIPPING_BOX_UPPER = "volumeClippingBoxUpper";
144 static const char* CONTEXT_VOLUME_USER_PARAMETERS = "volumeUserParameters";
145 
146 // Fields parameters
147 static const char* CONTEXT_FIELD_GRADIENT_SHADING_ENABLED = "fieldGradientShadingEnabled";
148 static const char* CONTEXT_FIELD_GRADIENT_OFFSET = "fieldGradientOffset";
149 static const char* CONTEXT_FIELD_SAMPLING_RATE = "fieldSamplingRate";
150 static const char* CONTEXT_FIELD_CUTOFF = "fieldCutoff";
151 static const char* CONTEXT_FIELD_DISTANCE = "fieldDistance";
152 static const char* CONTEXT_FIELD_EPSILON = "fieldEpsilon";
153 static const char* CONTEXT_FIELD_ACCUMULATION_STEPS = "fieldAccumulationSteps";
154 static const char* CONTEXT_FIELD_USE_OCTREE = "fieldUseOctree";
155 
156 // Geometry parameters
157 static const char* CONTEXT_GEOMETRY_SDF_EPSILON = "geometrySdfEpsilon";
158 static const char* CONTEXT_GEOMETRY_SDF_NB_MARCH_ITERATIONS = "geometrySdfNbMarchIterations";
159 static const char* CONTEXT_GEOMETRY_SDF_BLEND_FACTOR = "geometrySdfBlendFactor";
160 static const char* CONTEXT_GEOMETRY_SDF_BLEND_LERP_FACTOR = "geometrySdfBlendLerpFactor";
161 static const char* CONTEXT_GEOMETRY_SDF_OMEGA = "geometrySdfOmega";
162 static const char* CONTEXT_GEOMETRY_SDF_DISTANCE = "geometrySdfDistance";
163 
164 // User data
165 static const char* CONTEXT_USER_DATA = RENDERER_PROPERTY_USER_DATA;
166 
168 {
169  sphere,
170  cone,
171  cylinder,
172  triangleMesh,
173  volume,
174  streamline,
175  sdfGeometry,
176  field,
177 };
178 
180 {
182  {
187  }
188 
189  ::optix::Program any_hit{nullptr};
190  ::optix::Program closest_hit{nullptr};
191  ::optix::Program closest_hit_textured{nullptr};
192  ::optix::Program exception_program{nullptr};
193 };
194 
195 using OptiXShaderProgramPtr = std::shared_ptr<OptixShaderProgram>;
196 
198 {
199 public:
200  ~OptiXContext();
201  static OptiXContext& get();
202 
203  ::optix::Context getOptixContext() { return _optixContext; }
204  // Camera
205  void addCamera(const std::string& name, OptiXCameraProgramPtr program);
206  OptiXCameraProgramPtr getCamera(const std::string& name);
207  void setCamera(const std::string& name);
208 
209  // Geometry
210  ::optix::Geometry createGeometry(const OptixGeometryType type);
211  ::optix::GeometryGroup createGeometryGroup(const bool compact);
212  ::optix::Group createGroup();
213  ::optix::Material createMaterial();
214 
215  // Textures
216  ::optix::TextureSampler createTextureSampler(Texture2DPtr texture);
217 
218  // Others
219  void addRenderer(const std::string& name, OptiXShaderProgramPtr program);
220  OptiXShaderProgramPtr getRenderer(const std::string& name);
221 
222  std::unique_lock<std::mutex> getScopeLock() { return std::unique_lock<std::mutex>(_mutex); }
223 
224 private:
225  OptiXContext();
226 
227  void _initialize();
228  void _printSystemInformation() const;
229 
230  static std::unique_ptr<OptiXContext> _context;
231 
232  ::optix::Context _optixContext{nullptr};
233 
234  std::map<std::string, OptiXShaderProgramPtr> _rendererPrograms;
235  std::map<std::string, OptiXCameraProgramPtr> _cameraPrograms;
236 
237  std::map<OptixGeometryType, ::optix::Program> _optixBoundsPrograms;
238  std::map<OptixGeometryType, ::optix::Program> _optixIntersectionPrograms;
239 
240  std::unordered_map<void*, ::optix::TextureSampler> _optixTextureSamplers;
241  std::mutex _mutex;
242 };
243 } // namespace optix
244 } // namespace engine
245 } // namespace core
#define RT_DESTROY(__object)
Definition: OptiXUtils.h:38
OptiXCameraProgramPtr getCamera(const std::string &name)
void addCamera(const std::string &name, OptiXCameraProgramPtr program)
OptiXShaderProgramPtr getRenderer(const std::string &name)
::optix::GeometryGroup createGeometryGroup(const bool compact)
static OptiXContext & get()
::optix::Material createMaterial()
::optix::Geometry createGeometry(const OptixGeometryType type)
void addRenderer(const std::string &name, OptiXShaderProgramPtr program)
::optix::Context getOptixContext()
Definition: OptiXContext.h:203
std::unique_lock< std::mutex > getScopeLock()
Definition: OptiXContext.h:222
::optix::TextureSampler createTextureSampler(Texture2DPtr texture)
void setCamera(const std::string &name)
std::shared_ptr< OptiXCameraProgram > OptiXCameraProgramPtr
Definition: OptiXTypes.h:38
std::shared_ptr< OptixShaderProgram > OptiXShaderProgramPtr
Definition: OptiXContext.h:195
std::shared_ptr< Texture2D > Texture2DPtr
Definition: Types.h:159