1 //
2 // Copyright 2016 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 #include "pxr/imaging/hd/renderPassState.h"
25
26 #include "pxr/imaging/hd/camera.h"
27 #include "pxr/imaging/hd/changeTracker.h"
28 #include "pxr/imaging/hd/debugCodes.h"
29 #include "pxr/imaging/hd/tokens.h"
30
31 #include "pxr/base/gf/camera.h"
32 #include "pxr/base/gf/frustum.h"
33 #include "pxr/base/tf/stringUtils.h"
34
35 PXR_NAMESPACE_OPEN_SCOPE
36
HdRenderPassState()37 HdRenderPassState::HdRenderPassState()
38 : _camera(nullptr)
39 , _viewport(0, 0, 1, 1)
40 , _overrideWindowPolicy{false, CameraUtilFit}
41 , _cullMatrix(1)
42 , _worldToViewMatrix(1)
43 , _projectionMatrix(1)
44
45 , _overrideColor(0.0f, 0.0f, 0.0f, 0.0f)
46 , _wireframeColor(0.0f, 0.0f, 0.0f, 0.0f)
47 , _pointColor(0.0f, 0.0f, 0.0f, 1.0f)
48 , _pointSize(3.0)
49 , _lightingEnabled(true)
50 , _clippingEnabled(true)
51
52 , _maskColor(1.0f, 0.0f, 0.0f, 1.0f)
53 , _indicatorColor(0.0f, 1.0f, 0.0f, 1.0f)
54 , _pointSelectedSize(3.0)
55
56 , _alphaThreshold(0.5f)
57 , _tessLevel(32.0)
58 , _drawRange(0.9, -1.0)
59
60 , _depthBiasUseDefault(true)
61 , _depthBiasEnabled(false)
62 , _depthBiasConstantFactor(0.0f)
63 , _depthBiasSlopeFactor(1.0f)
64 , _depthFunc(HdCmpFuncLEqual)
65 , _depthMaskEnabled(true)
66 , _depthTestEnabled(true)
67 , _cullStyle(HdCullStyleNothing)
68 , _stencilFunc(HdCmpFuncAlways)
69 , _stencilRef(0)
70 , _stencilMask(~0)
71 , _stencilFailOp(HdStencilOpKeep)
72 , _stencilZFailOp(HdStencilOpKeep)
73 , _stencilZPassOp(HdStencilOpKeep)
74 , _stencilEnabled(false)
75 , _lineWidth(1.0f)
76 , _blendColorOp(HdBlendOpAdd)
77 , _blendColorSrcFactor(HdBlendFactorOne)
78 , _blendColorDstFactor(HdBlendFactorZero)
79 , _blendAlphaOp(HdBlendOpAdd)
80 , _blendAlphaSrcFactor(HdBlendFactorOne)
81 , _blendAlphaDstFactor(HdBlendFactorZero)
82 , _blendConstantColor(0.0f, 0.0f, 0.0f, 0.0f)
83 , _blendEnabled(false)
84 , _alphaToCoverageEnabled(false)
85 , _colorMaskUseDefault(true)
86 , _useMultiSampleAov(true)
87
88 {
89 }
90
91 HdRenderPassState::~HdRenderPassState() = default;
92
93 /* virtual */
94 void
Prepare(HdResourceRegistrySharedPtr const & resourceRegistry)95 HdRenderPassState::Prepare(HdResourceRegistrySharedPtr const &resourceRegistry)
96 {
97 if(!TfDebug::IsEnabled(HD_FREEZE_CULL_FRUSTUM)) {
98 _cullMatrix = GetWorldToViewMatrix() * GetProjectionMatrix();
99 }
100 }
101
102 void
SetCameraAndViewport(HdCamera const * camera,GfVec4d const & viewport)103 HdRenderPassState::SetCameraAndViewport(HdCamera const *camera,
104 GfVec4d const &viewport)
105 {
106 if (!camera) {
107 TF_CODING_ERROR("Received null camera\n");
108 }
109 _camera = camera;
110 _viewport = GfVec4f((float)viewport[0], (float)viewport[1],
111 (float)viewport[2], (float)viewport[3]);
112
113 // Invalidate framing so that it isn't used by GetProjectionMatrix().
114 _framing = CameraUtilFraming();
115 }
116
117 void
SetCameraAndFraming(HdCamera const * camera,const CameraUtilFraming & framing,const std::pair<bool,CameraUtilConformWindowPolicy> & overrideWindowPolicy)118 HdRenderPassState::SetCameraAndFraming(
119 HdCamera const *camera,
120 const CameraUtilFraming &framing,
121 const std::pair<bool, CameraUtilConformWindowPolicy> &overrideWindowPolicy)
122 {
123 if (!camera) {
124 TF_CODING_ERROR("Received null camera\n");
125 }
126 _camera = camera;
127 _framing = framing;
128 _overrideWindowPolicy = overrideWindowPolicy;
129 }
130
131 GfMatrix4d
GetWorldToViewMatrix() const132 HdRenderPassState::GetWorldToViewMatrix() const
133 {
134 if (!_camera) {
135 return _worldToViewMatrix;
136 }
137
138 return _camera->GetViewMatrix();
139 }
140
141 CameraUtilConformWindowPolicy
GetWindowPolicy() const142 HdRenderPassState::GetWindowPolicy() const
143 {
144 if (_overrideWindowPolicy.first) {
145 return _overrideWindowPolicy.second;
146 }
147 if (_camera) {
148 return _camera->GetWindowPolicy();
149 }
150
151 return CameraUtilFit;
152 }
153
154 GfMatrix4d
GetProjectionMatrix() const155 HdRenderPassState::GetProjectionMatrix() const
156 {
157 if (!_camera) {
158 return _projectionMatrix;
159 }
160
161 if (_framing.IsValid()) {
162 return
163 _framing.ApplyToProjectionMatrix(
164 _camera->GetProjectionMatrix(),
165 GetWindowPolicy());
166 }
167
168 CameraUtilConformWindowPolicy const policy = _camera->GetWindowPolicy();
169 const double aspect =
170 (_viewport[3] != 0.0 ? _viewport[2] / _viewport[3] : 1.0);
171
172 // Adjust the camera frustum based on the window policy.
173 return CameraUtilConformedWindow(
174 _camera->GetProjectionMatrix(), policy, aspect);
175 }
176
177 HdRenderPassState::ClipPlanesVector const &
GetClipPlanes() const178 HdRenderPassState::GetClipPlanes() const
179 {
180 if (!_clippingEnabled) {
181 const static HdRenderPassState::ClipPlanesVector empty;
182 return empty;
183 }
184
185 if (!_camera) {
186 return _clipPlanes;
187 }
188 return _camera->GetClipPlanes();
189 }
190
191 void
SetOverrideColor(GfVec4f const & color)192 HdRenderPassState::SetOverrideColor(GfVec4f const &color)
193 {
194 _overrideColor = color;
195 }
196
197 void
SetWireframeColor(GfVec4f const & color)198 HdRenderPassState::SetWireframeColor(GfVec4f const &color)
199 {
200 _wireframeColor = color;
201 }
202
203 void
SetMaskColor(GfVec4f const & color)204 HdRenderPassState::SetMaskColor(GfVec4f const &color)
205 {
206 _maskColor = color;
207 }
208
209 void
SetIndicatorColor(GfVec4f const & color)210 HdRenderPassState::SetIndicatorColor(GfVec4f const &color)
211 {
212 _indicatorColor = color;
213 }
214
215 void
SetPointColor(GfVec4f const & color)216 HdRenderPassState::SetPointColor(GfVec4f const &color)
217 {
218 _pointColor = color;
219 }
220
221 void
SetPointSize(float size)222 HdRenderPassState::SetPointSize(float size)
223 {
224 _pointSize = size;
225 }
226
227 void
SetPointSelectedSize(float size)228 HdRenderPassState::SetPointSelectedSize(float size)
229 {
230 _pointSelectedSize = size;
231 }
232
233 void
SetCullStyle(HdCullStyle cullStyle)234 HdRenderPassState::SetCullStyle(HdCullStyle cullStyle)
235 {
236 _cullStyle = cullStyle;
237 }
238
239 void
SetAlphaThreshold(float alphaThreshold)240 HdRenderPassState::SetAlphaThreshold(float alphaThreshold)
241 {
242 _alphaThreshold = alphaThreshold;
243 }
244
245 void
SetTessLevel(float tessLevel)246 HdRenderPassState::SetTessLevel(float tessLevel)
247 {
248 _tessLevel = tessLevel;
249 }
250
251 void
SetDrawingRange(GfVec2f const & drawRange)252 HdRenderPassState::SetDrawingRange(GfVec2f const &drawRange)
253 {
254 _drawRange = drawRange;
255 }
256
257 void
SetLightingEnabled(bool enabled)258 HdRenderPassState::SetLightingEnabled(bool enabled)
259 {
260 _lightingEnabled = enabled;
261 }
262
263 void
SetClippingEnabled(bool enabled)264 HdRenderPassState::SetClippingEnabled(bool enabled)
265 {
266 _clippingEnabled = enabled;
267 }
268
269 void
SetAovBindings(HdRenderPassAovBindingVector const & aovBindings)270 HdRenderPassState::SetAovBindings(
271 HdRenderPassAovBindingVector const& aovBindings)
272 {
273 _aovBindings= aovBindings;
274 }
275
276 HdRenderPassAovBindingVector const&
GetAovBindings() const277 HdRenderPassState::GetAovBindings() const
278 {
279 return _aovBindings;
280 }
281
282 void
SetAovInputBindings(HdRenderPassAovBindingVector const & aovBindings)283 HdRenderPassState::SetAovInputBindings(
284 HdRenderPassAovBindingVector const& aovBindings)
285 {
286 _aovInputBindings= aovBindings;
287 }
288
289 HdRenderPassAovBindingVector const&
GetAovInputBindings() const290 HdRenderPassState::GetAovInputBindings() const
291 {
292 return _aovInputBindings;
293 }
294
295 void
SetUseAovMultiSample(bool state)296 HdRenderPassState::SetUseAovMultiSample(bool state)
297 {
298 _useMultiSampleAov = state;
299 }
300
301 bool
GetUseAovMultiSample() const302 HdRenderPassState::GetUseAovMultiSample() const
303 {
304 return _useMultiSampleAov;
305 }
306
307 void
SetDepthBiasUseDefault(bool useDefault)308 HdRenderPassState::SetDepthBiasUseDefault(bool useDefault)
309 {
310 _depthBiasUseDefault = useDefault;
311 }
312
313 void
SetDepthBiasEnabled(bool enable)314 HdRenderPassState::SetDepthBiasEnabled(bool enable)
315 {
316 _depthBiasEnabled = enable;
317 }
318
319 void
SetDepthBias(float constantFactor,float slopeFactor)320 HdRenderPassState::SetDepthBias(float constantFactor, float slopeFactor)
321 {
322 _depthBiasConstantFactor = constantFactor;
323 _depthBiasSlopeFactor = slopeFactor;
324 }
325
326 void
SetDepthFunc(HdCompareFunction depthFunc)327 HdRenderPassState::SetDepthFunc(HdCompareFunction depthFunc)
328 {
329 _depthFunc = depthFunc;
330 }
331
332 void
SetEnableDepthMask(bool state)333 HdRenderPassState::SetEnableDepthMask(bool state)
334 {
335 _depthMaskEnabled = state;
336 }
337
338 bool
GetEnableDepthMask()339 HdRenderPassState::GetEnableDepthMask()
340 {
341 return _depthMaskEnabled;
342 }
343
344 void
SetEnableDepthTest(bool enabled)345 HdRenderPassState::SetEnableDepthTest(bool enabled)
346 {
347 _depthTestEnabled = enabled;
348 }
349
350 bool
GetEnableDepthTest() const351 HdRenderPassState::GetEnableDepthTest() const
352 {
353 return _depthTestEnabled;
354 }
355
356 void
SetStencil(HdCompareFunction func,int ref,int mask,HdStencilOp fail,HdStencilOp zfail,HdStencilOp zpass)357 HdRenderPassState::SetStencil(HdCompareFunction func,
358 int ref, int mask,
359 HdStencilOp fail, HdStencilOp zfail, HdStencilOp zpass)
360 {
361 _stencilFunc = func;
362 _stencilRef = ref;
363 _stencilMask = mask;
364 _stencilFailOp = fail;
365 _stencilZFailOp = zfail;
366 _stencilZPassOp = zpass;
367 }
368
369 void
SetStencilEnabled(bool enabled)370 HdRenderPassState::SetStencilEnabled(bool enabled)
371 {
372 _stencilEnabled = enabled;
373 }
374
375 bool
GetStencilEnabled() const376 HdRenderPassState::GetStencilEnabled() const
377 {
378 return _stencilEnabled;
379 }
380
381 void
SetLineWidth(float width)382 HdRenderPassState::SetLineWidth(float width)
383 {
384 _lineWidth = width;
385 }
386
387 void
SetBlend(HdBlendOp colorOp,HdBlendFactor colorSrcFactor,HdBlendFactor colorDstFactor,HdBlendOp alphaOp,HdBlendFactor alphaSrcFactor,HdBlendFactor alphaDstFactor)388 HdRenderPassState::SetBlend(HdBlendOp colorOp,
389 HdBlendFactor colorSrcFactor,
390 HdBlendFactor colorDstFactor,
391 HdBlendOp alphaOp,
392 HdBlendFactor alphaSrcFactor,
393 HdBlendFactor alphaDstFactor)
394 {
395 _blendColorOp = colorOp;
396 _blendColorSrcFactor = colorSrcFactor;
397 _blendColorDstFactor = colorDstFactor;
398 _blendAlphaOp = alphaOp;
399 _blendAlphaSrcFactor = alphaSrcFactor;
400 _blendAlphaDstFactor = alphaDstFactor;
401 }
402
403 void
SetBlendConstantColor(GfVec4f const & color)404 HdRenderPassState::SetBlendConstantColor(GfVec4f const & color)
405 {
406 _blendConstantColor = color;
407 }
408
409 void
SetBlendEnabled(bool enabled)410 HdRenderPassState::SetBlendEnabled(bool enabled)
411 {
412 _blendEnabled = enabled;
413 }
414
415 void
SetAlphaToCoverageEnabled(bool enabled)416 HdRenderPassState::SetAlphaToCoverageEnabled(bool enabled)
417 {
418 _alphaToCoverageEnabled = enabled;
419 }
420
421 void
SetColorMaskUseDefault(bool useDefault)422 HdRenderPassState::SetColorMaskUseDefault(bool useDefault)
423 {
424 _colorMaskUseDefault = useDefault;
425 }
426
427 void
SetColorMasks(std::vector<HdRenderPassState::ColorMask> const & masks)428 HdRenderPassState::SetColorMasks(
429 std::vector<HdRenderPassState::ColorMask> const& masks)
430 {
431 _colorMasks = masks;
432 }
433
434 PXR_NAMESPACE_CLOSE_SCOPE
435
436