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