2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "dali-scene3d/public-api/loader/renderer-state.h"
18 #include "dali-scene3d/public-api/loader/utils.h"
28 // NOTE: values for BlendFactor aren't contiguous, hence we need a mapping.
29 const Dali::BlendFactor::Type kBlendFactors[] = {
30 Dali::BlendFactor::ZERO,
31 Dali::BlendFactor::ONE,
32 Dali::BlendFactor::SRC_COLOR,
33 Dali::BlendFactor::ONE_MINUS_SRC_COLOR,
34 Dali::BlendFactor::SRC_ALPHA,
35 Dali::BlendFactor::ONE_MINUS_SRC_ALPHA,
36 Dali::BlendFactor::DST_ALPHA,
37 Dali::BlendFactor::ONE_MINUS_DST_ALPHA,
38 Dali::BlendFactor::DST_COLOR,
39 Dali::BlendFactor::ONE_MINUS_DST_COLOR,
40 Dali::BlendFactor::SRC_ALPHA_SATURATE,
41 Dali::BlendFactor::CONSTANT_COLOR,
42 Dali::BlendFactor::ONE_MINUS_CONSTANT_COLOR,
43 Dali::BlendFactor::CONSTANT_ALPHA,
44 Dali::BlendFactor::ONE_MINUS_CONSTANT_ALPHA,
48 namespace RendererState
50 #define RENDERER_SET_PROPERTY(name, value) renderer.SetProperty(Renderer::Property::name, (value))
52 void Apply(Type rendererState, Renderer& renderer)
54 RENDERER_SET_PROPERTY(DEPTH_WRITE_MODE, MaskMatch(rendererState, DEPTH_WRITE) ? DepthWriteMode::ON : DepthWriteMode::OFF);
55 RENDERER_SET_PROPERTY(DEPTH_TEST_MODE, MaskMatch(rendererState, DEPTH_TEST) ? DepthTestMode::ON : DepthTestMode::OFF);
57 RENDERER_SET_PROPERTY(BLEND_MODE, MaskMatch(rendererState, ALPHA_BLEND) ? BlendMode::ON : BlendMode::OFF);
59 const bool cullBack = MaskMatch(rendererState, CULL_BACK);
60 RENDERER_SET_PROPERTY(FACE_CULLING_MODE, MaskMatch(rendererState, CULL_FRONT) ? (cullBack ? FaceCullingMode::FRONT_AND_BACK : FaceCullingMode::FRONT) : (cullBack ? FaceCullingMode::BACK : FaceCullingMode::NONE));
62 if(auto depthFunc = (rendererState & DEPTH_FUNCTION_MASK) >> DEPTH_FUNCTION_SHIFT)
64 RENDERER_SET_PROPERTY(DEPTH_FUNCTION, static_cast<DepthFunction::Type>(depthFunc - 1));
67 if(auto blendFactors = (rendererState & BLEND_FACTOR_MASK) >> BLEND_FACTOR_BASE_SHIFT)
69 if(auto srcRgb = (blendFactors & BLEND_FACTOR_ITEM_MASK))
71 RENDERER_SET_PROPERTY(BLEND_FACTOR_SRC_RGB, kBlendFactors[static_cast<BlendFactor::Type>(srcRgb - 1)]);
74 blendFactors >>= BLEND_FACTOR_ITEM_BITS;
75 if(auto dstRgb = (blendFactors & BLEND_FACTOR_ITEM_MASK))
77 RENDERER_SET_PROPERTY(BLEND_FACTOR_DEST_RGB, kBlendFactors[static_cast<BlendFactor::Type>(dstRgb - 1)]);
80 blendFactors >>= BLEND_FACTOR_ITEM_BITS;
81 if(auto srcAlpha = (blendFactors & BLEND_FACTOR_ITEM_MASK))
83 RENDERER_SET_PROPERTY(BLEND_FACTOR_SRC_ALPHA, kBlendFactors[static_cast<BlendFactor::Type>(srcAlpha - 1)]);
86 blendFactors >>= BLEND_FACTOR_ITEM_BITS;
87 if(auto dstAlpha = (blendFactors & BLEND_FACTOR_ITEM_MASK))
89 RENDERER_SET_PROPERTY(BLEND_FACTOR_DEST_ALPHA, kBlendFactors[static_cast<BlendFactor::Type>(dstAlpha - 1)]);
93 if(auto bufferMode = (rendererState & BUFFER_MODE_MASK) >> BUFFER_MODE_SHIFT)
95 RENDERER_SET_PROPERTY(RENDER_MODE, static_cast<RenderMode::Type>(bufferMode - 1));
99 } // namespace RendererState
101 } // namespace Loader
102 } // namespace Scene3D