VTK  9.0.1
OSPRayBackend.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <ospray/ospray.h>
4 
5 #include "../Backend.h"
6 
7 #include <cstring>
8 #include <sstream>
9 #include <stdexcept>
10 #include <stdlib.h>
11 #include <vector>
12 
13 namespace RTW
14 {
15 
16  OSPFrameBufferFormat convert(RTWFrameBufferFormat format)
17  {
18  switch (format)
19  {
20  case RTW_FB_RGBA8:
21  return OSP_FB_RGBA8;
22  case RTW_FB_RGBA32F:
23  return OSP_FB_RGBA32F;
24  default:
25  return OSP_FB_NONE;
26  }
27  }
28 
30  {
31  switch (format)
32  {
33  case RTW_TEXTURE_RGBA8:
34  return OSP_TEXTURE_RGBA8;
35  case RTW_TEXTURE_SRGBA:
36  return OSP_TEXTURE_SRGBA;
38  return OSP_TEXTURE_RGBA32F;
39  case RTW_TEXTURE_RGB8:
40  return OSP_TEXTURE_RGB8;
41  case RTW_TEXTURE_SRGB:
42  return OSP_TEXTURE_SRGB;
43  case RTW_TEXTURE_RGB32F:
44  return OSP_TEXTURE_RGB32F;
45  case RTW_TEXTURE_R8:
46  return OSP_TEXTURE_R8;
47  case RTW_TEXTURE_R32F:
48  return OSP_TEXTURE_R32F;
49  case RTW_TEXTURE_L8:
50  return OSP_TEXTURE_L8;
51  case RTW_TEXTURE_RA8:
52  return OSP_TEXTURE_RA8;
53  case RTW_TEXTURE_LA8:
54  return OSP_TEXTURE_LA8;
56  default:
57  return OSP_TEXTURE_FORMAT_INVALID;
58  }
59  }
60 
61 
62 
63 
64  /*
65  * Simple pass-through backend for OSPRay.
66  */
67  class OSPRayBackend : public Backend
68  {
69  public:
70  RTWError Init() override
71  {
72  RTWError ret = static_cast<RTWError>(ospInit(nullptr, nullptr));
73  return ret;
74  }
75 
76  void Shutdown() override
77  {
78  ospShutdown();
79  }
80 
81  bool IsSupported(RTWFeature feature) const override
82  {
83  switch (feature)
84  {
86  return false;
87  case RTW_OPENGL_INTEROP:
88  return false;
90  return false;
91  case RTW_INSTANCING:
92  return true;
93  case RTW_DENOISER:
94  return false; // OpenImageDenoise is an external lib outside of the backend
96  return true;
97  }
98  return false;
99  }
100 
101  RTWData NewData(size_t numElements, RTWDataType dataType, const void *source, const uint32_t dataCreationFlags) override
102  {
103  return reinterpret_cast<RTWData>(ospNewData(numElements, static_cast<OSPDataType>(dataType), source, dataCreationFlags));
104  }
105 
106  RTWGeometry NewGeometry(const char *type) override
107  {
108  return reinterpret_cast<RTWGeometry>(ospNewGeometry(type));
109  }
110 
111  RTWTexture NewTexture(const char* type) override
112  {
113  return reinterpret_cast<RTWTexture>(ospNewTexture(type));
114  }
115 
116  RTWLight NewLight3(const char *light_type) override
117  {
118  return reinterpret_cast<RTWLight>(ospNewLight3(light_type));
119  }
120 
121  RTWMaterial NewMaterial2(const char *renderer_type, const char *material_type) override
122  {
123  return reinterpret_cast<RTWMaterial>(ospNewMaterial2(renderer_type, material_type));
124  }
125 
126  RTWVolume NewVolume(const char *type) override
127  {
128  return reinterpret_cast<RTWVolume>(ospNewVolume(type));
129  }
130 
132  {
133  return reinterpret_cast<RTWTransferFunction>(ospNewTransferFunction(type));
134  }
135 
136  RTWRenderer NewRenderer(const char *type) override
137  {
138  return reinterpret_cast<RTWRenderer>(ospNewRenderer(type));
139  }
140 
141  RTWCamera NewCamera(const char *type) override
142  {
143  return reinterpret_cast<RTWCamera>(ospNewCamera(type));
144  }
145 
146  RTWModel NewModel() override
147  {
148  return reinterpret_cast<RTWModel>(ospNewModel());
149  }
150 
151  RTWGeometry NewInstance(RTWModel modelToInstantiate, const rtw::affine3f &transform) override
152  {
153  osp::affine3f xfm;
154  memcpy(&xfm, &transform, sizeof(osp::affine3f));
155  return reinterpret_cast<RTWGeometry>(ospNewInstance(reinterpret_cast<OSPModel>(modelToInstantiate), xfm));
156  }
157 
158  RTWFrameBuffer NewFrameBuffer(const rtw::vec2i &size, const RTWFrameBufferFormat format, const uint32_t frameBufferChannels) override
159  {
160  return reinterpret_cast<RTWFrameBuffer>(ospNewFrameBuffer(osp::vec2i{ size.x, size.y }, convert(format), frameBufferChannels));
161  }
162 
163  void Release(RTWObject object) override
164  {
165  ospRelease(reinterpret_cast<OSPObject>(object));
166  }
167 
168  void AddGeometry(RTWModel model, RTWGeometry geometry) override
169  {
170  ospAddGeometry(reinterpret_cast<OSPModel>(model), reinterpret_cast<OSPGeometry>(geometry));
171  }
172 
173  void AddVolume(RTWModel model, RTWVolume volume) override
174  {
175  ospAddVolume(reinterpret_cast<OSPModel>(model), reinterpret_cast<OSPVolume>(volume));
176  }
177 
178  void SetString(RTWObject object, const char *id, const char *s) override
179  {
180  ospSetString(reinterpret_cast<OSPObject>(object), id, s);
181  }
182 
183  void SetObject(RTWObject object, const char *id, RTWObject other) override
184  {
185  ospSetObject(reinterpret_cast<OSPObject>(object), id, reinterpret_cast<OSPObject>(other));
186  }
187 
188  void SetData(RTWObject object, const char *id, RTWData data) override
189  {
190  ospSetData(reinterpret_cast<OSPObject>(object), id, reinterpret_cast<OSPData>(data));
191  }
192 
193  void SetMaterial(RTWGeometry geometry, RTWMaterial material) override
194  {
195  ospSetMaterial(reinterpret_cast<OSPGeometry>(geometry), reinterpret_cast<OSPMaterial>(material));
196  }
197 
198  void Set1i(RTWObject object, const char *id, int32_t x) override
199  {
200  ospSet1i(reinterpret_cast<OSPObject>(object), id, x);
201  }
202 
203  void Set1f(RTWObject object, const char *id, float x) override
204  {
205  ospSet1f(reinterpret_cast<OSPObject>(object), id, x);
206  }
207 
208  void Set2f(RTWObject object, const char *id, float x, float y) override
209  {
210  ospSet2f(reinterpret_cast<OSPObject>(object), id, x, y);
211  }
212 
213  void Set2i(RTWObject object, const char *id, int x, int y) override
214  {
215  ospSet2i(reinterpret_cast<OSPObject>(object), id, x, y);
216  }
217 
218  void Set3i(RTWObject object, const char *id, int x, int y, int z) override
219  {
220  ospSet3i(reinterpret_cast<OSPObject>(object), id, x, y, z);
221  }
222 
223  void Set3f(RTWObject object, const char *id, float x, float y, float z) override
224  {
225  ospSet3f(reinterpret_cast<OSPObject>(object), id, x, y, z);
226  }
227 
228  void Set4f(RTWObject object, const char *id, float x, float y, float z, float w) override
229  {
230  ospSet4f(reinterpret_cast<OSPObject>(object), id, x, y, z, w);
231  }
232 
233  void RemoveParam(RTWObject object, const char *id) override
234  {
235  ospRemoveParam(reinterpret_cast<OSPObject>(object), id);
236  }
237 
238  RTWError SetRegion(RTWVolume volume, void *source, const rtw::vec3i &regionCoords, const rtw::vec3i &regionSize) override
239  {
240  return static_cast<RTWError>(ospSetRegion(reinterpret_cast<OSPVolume>(volume), source,
241  osp::vec3i{ regionCoords.x, regionCoords.y, regionCoords.z },
242  osp::vec3i{ regionSize.x, regionSize.y, regionSize.z }));
243  }
244 
245  void Commit(RTWObject object) override
246  {
247  ospCommit(reinterpret_cast<OSPObject>(object));
248  }
249 
250  float RenderFrame(RTWFrameBuffer frameBuffer, RTWRenderer renderer, const uint32_t frameBufferChannels) override
251  {
252  return ospRenderFrame(reinterpret_cast<OSPFrameBuffer>(frameBuffer), reinterpret_cast<OSPRenderer>(renderer), frameBufferChannels);
253  }
254 
255  void FrameBufferClear(RTWFrameBuffer frameBuffer, const uint32_t frameBufferChannels) override
256  {
257  ospFrameBufferClear(reinterpret_cast<OSPFrameBuffer>(frameBuffer), frameBufferChannels);
258  }
259 
260  const void* MapFrameBuffer(RTWFrameBuffer frameBuffer, const RTWFrameBufferChannel channel) override
261  {
262  return ospMapFrameBuffer(reinterpret_cast<OSPFrameBuffer>(frameBuffer), static_cast<OSPFrameBufferChannel>(channel));
263  }
264 
265  void UnmapFrameBuffer(const void *mapped, RTWFrameBuffer frameBuffer) override
266  {
267  ospUnmapFrameBuffer(mapped, reinterpret_cast<OSPFrameBuffer>(frameBuffer));
268  }
269 
270  void SetDepthNormalizationGL(RTWFrameBuffer /*frameBuffer*/, float /*clipMin*/, float /*clipMax*/) override
271  {
272  // not supported
273  }
274 
275  int GetColorTextureGL(RTWFrameBuffer /*frameBuffer*/) override
276  {
277  // not supported
278  return 0;
279  }
280 
281  int GetDepthTextureGL(RTWFrameBuffer /*frameBuffer*/) override
282  {
283  // not supported
284  return 0;
285  }
286  };
287 }
struct RTWHandle * RTWObject
Definition: Types.h:90
#define ospNewData
Definition: RTWrapper.h:87
#define ospAddGeometry
Definition: RTWrapper.h:104
void SetDepthNormalizationGL(RTWFrameBuffer, float, float) override
int y
Definition: Types.h:82
#define ospSet2i
Definition: RTWrapper.h:69
void SetString(RTWObject object, const char *id, const char *s) override
#define OSP_TEXTURE_RGBA32F
Definition: RTWrapper.h:53
RTWVolume NewVolume(const char *type) override
#define OSPTextureFormat
Definition: RTWrapper.h:22
#define ospSet2f
Definition: RTWrapper.h:71
#define ospSetObject
Definition: RTWrapper.h:78
int z
Definition: Types.h:82
void Set3i(RTWObject object, const char *id, int x, int y, int z) override
#define OSP_TEXTURE_RGB8
Definition: RTWrapper.h:55
#define OSP_TEXTURE_RGB32F
Definition: RTWrapper.h:52
#define ospRenderFrame
Definition: RTWrapper.h:100
bool IsSupported(RTWFeature feature) const override
Definition: OSPRayBackend.h:81
#define ospCommit
Definition: RTWrapper.h:84
void AddGeometry(RTWModel model, RTWGeometry geometry) override
#define ospSet3f
Definition: RTWrapper.h:73
void Set2f(RTWObject object, const char *id, float x, float y) override
struct RTWHandle * RTWModel
Definition: Types.h:90
int GetColorTextureGL(RTWFrameBuffer) override
#define ospNewGeometry
Definition: RTWrapper.h:94
RTWError Init() override
Definition: OSPRayBackend.h:70
void UnmapFrameBuffer(const void *mapped, RTWFrameBuffer frameBuffer) override
struct RTWHandle * RTWRenderer
Definition: Types.h:90
RTWRenderer NewRenderer(const char *type) override
#define ospSetData
Definition: RTWrapper.h:77
#define ospSetRegion
Definition: RTWrapper.h:80
RTWError SetRegion(RTWVolume volume, void *source, const rtw::vec3i &regionCoords, const rtw::vec3i &regionSize) override
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph *>::edge_descriptor e, vtkGraph *)
RTWFrameBuffer NewFrameBuffer(const rtw::vec2i &size, const RTWFrameBufferFormat format, const uint32_t frameBufferChannels) override
#define ospRelease
Definition: RTWrapper.h:85
#define ospMapFrameBuffer
Definition: RTWrapper.h:101
RTWGeometry NewInstance(RTWModel modelToInstantiate, const rtw::affine3f &transform) override
struct RTWHandle * RTWCamera
Definition: Types.h:90
RTWFrameBufferChannel
Definition: Types.h:22
RTWCamera NewCamera(const char *type) override
#define ospSet4f
Definition: RTWrapper.h:75
RTWMaterial NewMaterial2(const char *renderer_type, const char *material_type) override
void SetMaterial(RTWGeometry geometry, RTWMaterial material) override
#define ospNewVolume
Definition: RTWrapper.h:93
#define ospSet1f
Definition: RTWrapper.h:66
struct RTWHandle * RTWGeometry
Definition: Types.h:90
#define ospNewModel
Definition: RTWrapper.h:95
void SetObject(RTWObject object, const char *id, RTWObject other) override
RTWTransferFunction NewTransferFunction(const char *type) override
void Release(RTWObject object) override
RTWFrameBufferFormat
Definition: Types.h:16
void AddVolume(RTWModel model, RTWVolume volume) override
struct RTWHandle * RTWData
Definition: Types.h:90
void Set3f(RTWObject object, const char *id, float x, float y, float z) override
void Set4f(RTWObject object, const char *id, float x, float y, float z, float w) override
#define ospFrameBufferClear
Definition: RTWrapper.h:99
#define ospNewInstance
Definition: RTWrapper.h:96
RTWTextureFormat
Definition: Types.h:37
RTWFeature
Definition: Types.h:107
void Set1i(RTWObject object, const char *id, int32_t x) override
#define OSP_TEXTURE_R8
Definition: RTWrapper.h:54
int x
Definition: Types.h:82
RTWModel NewModel() override
#define ospAddVolume
Definition: RTWrapper.h:105
#define OSP_TEXTURE_R32F
Definition: RTWrapper.h:51
#define ospSet1i
Definition: RTWrapper.h:68
#define ospSet3i
Definition: RTWrapper.h:70
float RenderFrame(RTWFrameBuffer frameBuffer, RTWRenderer renderer, const uint32_t frameBufferChannels) override
#define ospSetString
Definition: RTWrapper.h:76
void SetData(RTWObject object, const char *id, RTWData data) override
#define ospSetMaterial
Definition: RTWrapper.h:79
void Commit(RTWObject object) override
const void * MapFrameBuffer(RTWFrameBuffer frameBuffer, const RTWFrameBufferChannel channel) override
struct RTWHandle * RTWFrameBuffer
Definition: Types.h:90
#define ospRemoveParam
Definition: RTWrapper.h:82
int GetDepthTextureGL(RTWFrameBuffer) override
RTWDataType
Definition: Types.h:59
RTWLight NewLight3(const char *light_type) override
Definition: Backend.h:5
#define ospNewTexture
Definition: RTWrapper.h:90
struct RTWHandle * RTWTransferFunction
Definition: Types.h:90
struct RTWHandle * RTWMaterial
Definition: Types.h:90
#define ospNewTransferFunction
Definition: RTWrapper.h:92
void RemoveParam(RTWObject object, const char *id) override
void Shutdown() override
Definition: OSPRayBackend.h:76
#define ospNewCamera
Definition: RTWrapper.h:88
#define ospUnmapFrameBuffer
Definition: RTWrapper.h:102
struct RTWHandle * RTWTexture
Definition: Types.h:90
#define OSP_FB_RGBA32F
Definition: RTWrapper.h:58
RTWData NewData(size_t numElements, RTWDataType dataType, const void *source, const uint32_t dataCreationFlags) override
#define OSP_FB_RGBA8
Definition: RTWrapper.h:59
OSPFrameBufferFormat convert(RTWFrameBufferFormat format)
Definition: OSPRayBackend.h:16
RTWTexture NewTexture(const char *type) override
void FrameBufferClear(RTWFrameBuffer frameBuffer, const uint32_t frameBufferChannels) override
#define ospNewRenderer
Definition: RTWrapper.h:98
#define OSP_TEXTURE_RGBA8
Definition: RTWrapper.h:56
#define ospNewFrameBuffer
Definition: RTWrapper.h:97
struct RTWHandle * RTWVolume
Definition: Types.h:90
struct RTWHandle * RTWLight
Definition: Types.h:90
void Set2i(RTWObject object, const char *id, int x, int y) override
#define ospNewLight3
Definition: RTWrapper.h:89
RTWGeometry NewGeometry(const char *type) override
RTWError
Definition: Types.h:6
void Set1f(RTWObject object, const char *id, float x) override
#define ospNewMaterial2
Definition: RTWrapper.h:91