RenderManAPI  24.0
Riley_future.h
Go to the documentation of this file.
1 /*
2 # ------------------------------------------------------------------------------
3 #
4 # Copyright (c) 2020 Pixar. All rights reserved.
5 #
6 # The information in this file (the "Software") is provided for the exclusive
7 # use of the software licensees of Pixar ("Licensees"). Licensees have the
8 # right to incorporate the Software into other products for use by other
9 # authorized software licensees of Pixar, without fee. Except as expressly
10 # permitted herein, the Software may not be disclosed to third parties, copied
11 # or duplicated in any form, in whole or in part, without the prior written
12 # permission of Pixar.
13 #
14 # The copyright notices in the Software and this entire statement, including the
15 # above license grant, this restriction and the following disclaimer, must be
16 # included in all copies of the Software, in whole or in part, and all permitted
17 # derivative works of the Software, unless such copies or derivative works are
18 # solely in the form of machine-executable object code generated by a source
19 # language processor.
20 #
21 # PIXAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
22 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL PIXAR BE
23 # LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
25 # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
26 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. IN NO CASE WILL
27 # PIXAR'S TOTAL LIABILITY FOR ALL DAMAGES ARISING OUT OF OR IN CONNECTION WITH
28 # THE USE OR PERFORMANCE OF THIS SOFTWARE EXCEED $50.
29 #
30 # Pixar
31 # 1200 Park Ave
32 # Emeryville CA 94608
33 #
34 # ------------------------------------------------------------------------------
35 */
36 
37 #ifndef Riley_future_h
38 #define Riley_future_h
39 
40 // This header contains temporary helpers to facilitate transition for Riley API changes.
41 #include "Riley.h"
42 
43 #include <map>
44 #include <mutex>
45 #include <set>
46 #include <vector>
47 
49 
50 // FIXME: The following structure shouldn't be part of the Riley API anymore, but a good amout of
51 // files need to be touched to fix this, so this will be done in a future change.
52 
55 struct RenderView
56 {
60 };
61 
63 
64 // This class contains code to be used by Joy and Woe, managing the manipulation of RenderViews.
66 {
67 public:
68  // FIXME: not ideally named, because a RenderViewDescription type already exists in libriley.
69  struct RenderView
70  {
71  riley::UserId userId;
72  riley::RenderTargetId renderTargetId;
73  riley::IntegratorId integratorId;
74  riley::CameraId cameraId;
75  };
76 
77  std::vector<riley::RenderView> GetRenderViews(riley::RenderViewList const& renderViews) const;
78 
79  riley::RenderViewId createRenderView( //
80  riley::UserId userId, riley::RenderTargetId renderTargetId,
81  riley::IntegratorId integratorId, riley::CameraId cameraId);
82 
84  riley::RenderViewId renderViewId, riley::RenderTargetId const* renderTargetId,
85  riley::IntegratorId const* integratorId, riley::CameraId const* cameraId);
86 
87  riley::RenderViewResult deleteRenderView(riley::RenderViewId renderViewId);
88 
89 private:
90  bool updateRenderView( //
91  RenderView* renderView, riley::UserId const* userId,
92  riley::RenderTargetId const* renderTargetId, riley::IntegratorId const* integratorId,
93  riley::CameraId const* cameraId);
94 
95  bool isValid(riley::RenderViewId id)
96  {
97  return id != riley::RenderViewId::InvalidId() &&
98  m_renderViews.find(id) != m_renderViews.end();
99  }
100 
101  riley::RenderViewId getNextRenderViewId()
102  {
103  size_t newId = m_renderViews.size();
104 
105  riley::RenderViewId id = riley::RenderViewId::InvalidId();
106  if (m_freeRenderViewIds.empty())
107  {
108  id = static_cast<riley::RenderViewId>(newId);
109  }
110  else
111  {
112  auto it = m_freeRenderViewIds.begin();
113  id = *it;
114  m_freeRenderViewIds.erase(it);
115  }
116  return id;
117  }
118 
119  void deleteId(riley::RenderViewId id)
120  {
121  m_renderViews.erase(id);
122  m_freeRenderViewIds.insert(id);
123  }
124 
125  std::mutex m_renderViewsMutex; // protects access to the 2 following containers.
126  std::map<riley::RenderViewId, RenderView> m_renderViews;
127  std::set<riley::RenderViewId> m_freeRenderViewIds;
128 };
129 
130 inline bool RenderViewHelper::updateRenderView( //
131  RenderView* renderView, riley::UserId const* userId,
132  riley::RenderTargetId const* renderTargetId, riley::IntegratorId const* integratorId,
133  riley::CameraId const* cameraId)
134 {
135  assert(renderView);
136  bool isDirty = false;
137 
138  if (userId)
139  {
140  renderView->userId = *userId;
141  isDirty = true;
142  }
143 
144  if (renderTargetId)
145  {
146  renderView->renderTargetId = *renderTargetId;
147  isDirty = true;
148  }
149 
150  if (integratorId)
151  {
152  renderView->integratorId = *integratorId;
153  isDirty = true;
154  }
155 
156  if (cameraId)
157  {
158  renderView->cameraId = *cameraId;
159  isDirty = true;
160  }
161 
162  return isDirty;
163 }
164 
165 inline riley::RenderViewId RenderViewHelper::createRenderView( //
166  riley::UserId userId, riley::RenderTargetId renderTargetId, riley::IntegratorId integratorId,
167  riley::CameraId cameraId)
168 {
169  riley::RenderViewId renderViewId = riley::RenderViewId::InvalidId();
170  {
171  std::lock_guard<std::mutex> lock(m_renderViewsMutex);
172  renderViewId = getNextRenderViewId();
173  }
174 
175  RenderView renderView;
176  updateRenderView(&renderView, &userId, &renderTargetId, &integratorId, &cameraId);
177 
178  {
179  std::lock_guard<std::mutex> lock(m_renderViewsMutex);
180  m_renderViews[renderViewId] = renderView;
181  }
182 
183  return renderViewId;
184 }
185 
187  riley::RenderViewId renderViewId, riley::RenderTargetId const* renderTargetId,
188  riley::IntegratorId const* integratorId, riley::CameraId const* cameraId)
189 {
190  RenderView renderView;
191  {
192  std::lock_guard<std::mutex> lock(m_renderViewsMutex);
193  if (!isValid(renderViewId))
194  {
195  return riley::RenderViewResult::k_Error;
196  }
197  renderView = m_renderViews[renderViewId];
198  }
199 
200  updateRenderView(&renderView, nullptr, renderTargetId, integratorId, cameraId);
201 
202  {
203  std::lock_guard<std::mutex> lock(m_renderViewsMutex);
204  m_renderViews[renderViewId] = renderView;
205  }
206 
207  return riley::RenderViewResult::k_Success;
208 }
209 
210 inline riley::RenderViewResult RenderViewHelper::deleteRenderView(riley::RenderViewId renderViewId)
211 {
212  {
213  std::lock_guard<std::mutex> lock(m_renderViewsMutex);
214  if (!isValid(renderViewId))
215  {
216  return riley::RenderViewResult::k_Error;
217  }
218  deleteId(renderViewId);
219  }
220 
221  return riley::RenderViewResult::k_Success;
222 }
223 
224 inline std::vector<riley::RenderView> RenderViewHelper::GetRenderViews(
225  riley::RenderViewList const& renderViews) const
226 {
227  std::vector<riley::RenderView> renderViewsVector;
228 
229  for (uint32_t i = 0; i < renderViews.count; i++)
230  {
231  auto const it = m_renderViews.find(renderViews.ids[i]);
232  assert(it != m_renderViews.end());
233 
234  riley::RenderView const renderView = //
235  {it->second.renderTargetId, it->second.integratorId, it->second.cameraId};
236  renderViewsVector.push_back(renderView);
237  }
238 
239  return renderViewsVector;
240 }
241 
242 #endif // Riley_future_h
riley::RenderTargetId renderTargetId
Definition: Riley_future.h:72
riley::CameraId cameraId
Definition: Riley_future.h:74
riley::IntegratorId integratorId
Definition: Riley_future.h:73
Definition: RileyIds.h:205
Definition: RileyIds.h:45
Definition: RileyIds.h:305
riley::RenderViewId createRenderView(riley::UserId userId, riley::RenderTargetId renderTargetId, riley::IntegratorId integratorId, riley::CameraId cameraId)
Definition: Riley_future.h:165
riley::RenderViewResult deleteRenderView(riley::RenderViewId renderViewId)
Definition: Riley_future.h:210
riley::UserId userId
Definition: Riley_future.h:71
#define RILEY_NAMESPACE_ENTER
If RILEY_REQUIRE_VERSION_NAME is undefined, symbols from the version namespace are promoted to the to...
Definition: Riley_version.h:81
CameraId cameraId
Definition: Riley_future.h:59
std::vector< riley::RenderView > GetRenderViews(riley::RenderViewList const &renderViews) const
Definition: Riley_future.h:224
riley::RenderViewResult modifyRenderView(riley::RenderViewId renderViewId, riley::RenderTargetId const *renderTargetId, riley::IntegratorId const *integratorId, riley::CameraId const *cameraId)
Definition: Riley_future.h:186
Definition: Riley_future.h:65
#define RILEY_NAMESPACE_HEADER_EXIT
Definition: Riley_version.h:91
RenderViewResult
Definition: Riley.h:96
IntegratorId integratorId
Definition: Riley_future.h:58
Definition: Riley_future.h:69
Describes a view of the scene to render.
Definition: Riley_future.h:55
RenderTargetId renderTargetId
Definition: Riley_future.h:57