1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <3d/ecs/components/graphics_state_component.h>
17 #include <core/property/property.h>
18
19 #include "ComponentTools/base_manager.h"
20 #include "ComponentTools/base_manager.inl"
21
22 #define IMPLEMENT_MANAGER
23 #include <core/property_tools/property_macros.h>
24
25 CORE_BEGIN_NAMESPACE()
26 DECLARE_PROPERTY_TYPE(RENDER_NS::StencilOp);
27 ENUM_TYPE_METADATA(RENDER_NS::StencilOp, ENUM_VALUE(CORE_STENCIL_OP_KEEP, "Keep"),
28 ENUM_VALUE(CORE_STENCIL_OP_ZERO, "Zero"), ENUM_VALUE(CORE_STENCIL_OP_REPLACE, "Replace"),
29 ENUM_VALUE(CORE_STENCIL_OP_INVERT, "Invert"),
30 ENUM_VALUE(CORE_STENCIL_OP_INCREMENT_AND_CLAMP, "Increment And Clamp"),
31 ENUM_VALUE(CORE_STENCIL_OP_DECREMENT_AND_CLAMP, "Decrement And Clamp"),
32 ENUM_VALUE(CORE_STENCIL_OP_INCREMENT_AND_WRAP, "Increment And Wrap"),
33 ENUM_VALUE(CORE_STENCIL_OP_DECREMENT_AND_WRAP, "Decrement And Wrap"))
34
35 DECLARE_PROPERTY_TYPE(RENDER_NS::CompareOp);
36 ENUM_TYPE_METADATA(RENDER_NS::CompareOp, ENUM_VALUE(CORE_COMPARE_OP_NEVER, "Never"),
37 ENUM_VALUE(CORE_COMPARE_OP_ALWAYS, "Always"), ENUM_VALUE(CORE_COMPARE_OP_EQUAL, "Equal"),
38 ENUM_VALUE(CORE_COMPARE_OP_NOT_EQUAL, "Not Equal"), ENUM_VALUE(CORE_COMPARE_OP_LESS, "Less"),
39 ENUM_VALUE(CORE_COMPARE_OP_LESS_OR_EQUAL, "Less Or Equal"), ENUM_VALUE(CORE_COMPARE_OP_GREATER, "Greater"),
40 ENUM_VALUE(CORE_COMPARE_OP_GREATER_OR_EQUAL, "Greater Or Equal"))
41
42 DECLARE_PROPERTY_TYPE(RENDER_NS::PolygonMode);
43 ENUM_TYPE_METADATA(RENDER_NS::PolygonMode, ENUM_VALUE(CORE_POLYGON_MODE_FILL, "Fill"),
44 ENUM_VALUE(CORE_POLYGON_MODE_LINE, "Line"), ENUM_VALUE(CORE_POLYGON_MODE_POINT, "Point"))
45
46 DECLARE_PROPERTY_TYPE(RENDER_NS::CullModeFlagBits);
47 ENUM_TYPE_METADATA(RENDER_NS::CullModeFlagBits, ENUM_VALUE(CORE_CULL_MODE_FRONT_BIT, "Front"),
48 ENUM_VALUE(CORE_CULL_MODE_BACK_BIT, "Back"))
49
50 DECLARE_PROPERTY_TYPE(RENDER_NS::FrontFace);
51 ENUM_TYPE_METADATA(RENDER_NS::FrontFace, ENUM_VALUE(CORE_FRONT_FACE_COUNTER_CLOCKWISE, "Counter Clockwise"),
52 ENUM_VALUE(CORE_FRONT_FACE_CLOCKWISE, "Clockwise"))
53
54 DECLARE_PROPERTY_TYPE(RENDER_NS::LogicOp);
55 ENUM_TYPE_METADATA(RENDER_NS::LogicOp, ENUM_VALUE(CORE_LOGIC_OP_NO_OP, "No op"),
56 ENUM_VALUE(CORE_LOGIC_OP_CLEAR, "Clear"), ENUM_VALUE(CORE_LOGIC_OP_COPY, "Copy"),
57 ENUM_VALUE(CORE_LOGIC_OP_EQUIVALENT, "Equivalent"), ENUM_VALUE(CORE_LOGIC_OP_INVERT, "Invert"),
58 ENUM_VALUE(CORE_LOGIC_OP_SET, "Set"), ENUM_VALUE(CORE_LOGIC_OP_COPY_INVERTED, "Copy Inverted"),
59 ENUM_VALUE(CORE_LOGIC_OP_AND, "AND"), ENUM_VALUE(CORE_LOGIC_OP_OR, "OR"), ENUM_VALUE(CORE_LOGIC_OP_XOR, "XOR"),
60 ENUM_VALUE(CORE_LOGIC_OP_NOR, "NOR"), ENUM_VALUE(CORE_LOGIC_OP_NAND, "NAND"),
61 ENUM_VALUE(CORE_LOGIC_OP_AND_REVERSE, "AND Reverse"), ENUM_VALUE(CORE_LOGIC_OP_AND_INVERTED, "AND Inverted"),
62 ENUM_VALUE(CORE_LOGIC_OP_OR_REVERSE, "OR Reverse"), ENUM_VALUE(CORE_LOGIC_OP_OR_INVERTED, "OR Inverted"))
63
64 DECLARE_PROPERTY_TYPE(RENDER_NS::PrimitiveTopology);
65 ENUM_TYPE_METADATA(RENDER_NS::PrimitiveTopology, ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_POINT_LIST, "Point List"),
66 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_LINE_LIST, "Line List"),
67 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_LINE_STRIP, "Line Strip"),
68 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, "Triangle List"),
69 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, "Triangle Strip"),
70 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, " Triangle Fan"),
71 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, "Line Strip with Adjacency"),
72 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, "Line Strip with Adjacency"),
73 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, "Triangle List with Adjacency"),
74 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY, "Triangle Strip with Adjacency"),
75 ENUM_VALUE(CORE_PRIMITIVE_TOPOLOGY_PATCH_LIST, "Patch List"))
76
77 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState::StencilOpState);
78 DATA_TYPE_METADATA(RENDER_NS::GraphicsState::StencilOpState, MEMBER_PROPERTY(failOp, "Fail Operation", 0),
79 MEMBER_PROPERTY(passOp, "Pass Operation", 0), MEMBER_PROPERTY(depthFailOp, "Depth Fail Operation", 0),
80 MEMBER_PROPERTY(compareOp, "Compare Operation", 0), MEMBER_PROPERTY(compareMask, "Compare Mask", 0),
81 MEMBER_PROPERTY(writeMask, "Write Mask", 0), MEMBER_PROPERTY(reference, "Reference", 0))
82
83 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState::RasterizationState);
84 DATA_TYPE_METADATA(RENDER_NS::GraphicsState::RasterizationState,
85 MEMBER_PROPERTY(enableDepthClamp, "Enable Depth Clamp", 0),
86 MEMBER_PROPERTY(enableDepthBias, "Enable Depth Bias", 0),
87 MEMBER_PROPERTY(enableRasterizerDiscard, "Enable Rasterizer Discard", 0),
88 MEMBER_PROPERTY(polygonMode, "Polygon Mode", 0),
89 BITFIELD_MEMBER_PROPERTY(cullModeFlags, "Cull Mode Flags", PropertyFlags::IS_BITFIELD, RENDER_NS::CullModeFlagBits),
90 MEMBER_PROPERTY(frontFace, "Front Face", 0),
91 MEMBER_PROPERTY(depthBiasConstantFactor, "Depth Bias Constant Factor", 0),
92 MEMBER_PROPERTY(depthBiasClamp, "Depth Bias Clamp", 0),
93 MEMBER_PROPERTY(depthBiasSlopeFactor, "Depth Bias Slope Factor", 0), MEMBER_PROPERTY(lineWidth, "Line Width", 0))
94
95 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState::DepthStencilState);
96 DATA_TYPE_METADATA(RENDER_NS::GraphicsState::DepthStencilState, MEMBER_PROPERTY(enableDepthTest, "Depth Test", 0),
97 MEMBER_PROPERTY(enableDepthWrite, "Depth Write", 0), MEMBER_PROPERTY(enableDepthBoundsTest, "Depth Bounds Test", 0),
98 MEMBER_PROPERTY(enableStencilTest, "Stencil Test", 0), MEMBER_PROPERTY(minDepthBounds, "Min Depth Bounds", 0),
99 MEMBER_PROPERTY(maxDepthBounds, "Max Depth Bounds", 0), MEMBER_PROPERTY(depthCompareOp, "Depth CompareOp", 0),
100 MEMBER_PROPERTY(frontStencilOpState, "Front StencilOp State", 0),
101 MEMBER_PROPERTY(backStencilOpState, "Back StencilOp State", 0))
102
103 DECLARE_PROPERTY_TYPE(RENDER_NS::ColorComponentFlagBits);
104 ENUM_TYPE_METADATA(RENDER_NS::ColorComponentFlagBits, ENUM_VALUE(CORE_COLOR_COMPONENT_R_BIT, "Red"),
105 ENUM_VALUE(CORE_COLOR_COMPONENT_G_BIT, "Green"), ENUM_VALUE(CORE_COLOR_COMPONENT_B_BIT, "Blue"),
106 ENUM_VALUE(CORE_COLOR_COMPONENT_A_BIT, "Alpha"))
107
108 DECLARE_PROPERTY_TYPE(RENDER_NS::BlendFactor);
109 ENUM_TYPE_METADATA(RENDER_NS::BlendFactor, ENUM_VALUE(CORE_BLEND_FACTOR_ZERO, "Zero"),
110 ENUM_VALUE(CORE_BLEND_FACTOR_ONE, "One"), ENUM_VALUE(CORE_BLEND_FACTOR_SRC_COLOR, "Source Color"),
111 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, "One Minus Source Color"),
112 ENUM_VALUE(CORE_BLEND_FACTOR_DST_COLOR, "Destination Color"),
113 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_DST_COLOR, "One Minus Destination Color"),
114 ENUM_VALUE(CORE_BLEND_FACTOR_SRC_ALPHA, "Source Alpha"),
115 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, "One Minus Source Alpha"),
116 ENUM_VALUE(CORE_BLEND_FACTOR_DST_ALPHA, "Destination Alpha"),
117 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_DST_ALPHA, "One Minus Destination Alpha"),
118 ENUM_VALUE(CORE_BLEND_FACTOR_CONSTANT_COLOR, "Constant Color"),
119 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR, "One Minus Constant Color"),
120 ENUM_VALUE(CORE_BLEND_FACTOR_CONSTANT_ALPHA, "Constant Alpha"),
121 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA, "One Minus Constant Alpha"),
122 ENUM_VALUE(CORE_BLEND_FACTOR_SRC_ALPHA_SATURATE, "Source Alpha Saturate"),
123 ENUM_VALUE(CORE_BLEND_FACTOR_SRC1_COLOR, "Source One Color"),
124 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, "One Minus Source One Color"),
125 ENUM_VALUE(CORE_BLEND_FACTOR_SRC1_ALPHA, "Source One Alpha"),
126 ENUM_VALUE(CORE_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, "One Minus Source One Alpha"))
127
128 DECLARE_PROPERTY_TYPE(RENDER_NS::BlendOp);
129 ENUM_TYPE_METADATA(RENDER_NS::BlendOp, ENUM_VALUE(CORE_BLEND_OP_ADD, "Add"),
130 ENUM_VALUE(CORE_BLEND_OP_SUBTRACT, "Subtract"), ENUM_VALUE(CORE_BLEND_OP_REVERSE_SUBTRACT, "Reverse Subtract"),
131 ENUM_VALUE(CORE_BLEND_OP_MIN, "Min"), ENUM_VALUE(CORE_BLEND_OP_MAX, "Max"))
132
133 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState::ColorBlendState::Attachment);
134 DATA_TYPE_METADATA(RENDER_NS::GraphicsState::ColorBlendState::Attachment,
135 MEMBER_PROPERTY(enableBlend, "Enable Blend", 0),
136 BITFIELD_MEMBER_PROPERTY(
137 colorWriteMask, "Color Write Mask", PropertyFlags::IS_BITFIELD, RENDER_NS::ColorComponentFlagBits),
138 MEMBER_PROPERTY(srcColorBlendFactor, "Source Color Blend Factor", 0),
139 MEMBER_PROPERTY(dstColorBlendFactor, "Destination Color Blend Factor", 0),
140 MEMBER_PROPERTY(colorBlendOp, "Color Blend Operation", 0),
141 MEMBER_PROPERTY(srcAlphaBlendFactor, "Source Alpha Blend Factor", 0),
142 MEMBER_PROPERTY(dstAlphaBlendFactor, "Destination Alpha Blend Factor", 0),
143 MEMBER_PROPERTY(alphaBlendOp, "Alpha Blend Operation", 0))
144
145 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState::ColorBlendState);
146 DATA_TYPE_METADATA(RENDER_NS::GraphicsState::ColorBlendState,
147 MEMBER_PROPERTY(enableLogicOp, "Enable Logic Operation", 0), MEMBER_PROPERTY(logicOp, "Logic Operatio", 0),
148 MEMBER_PROPERTY(colorBlendConstants, "Color Blend Constants (R, G, B, A)", 0),
149 MEMBER_PROPERTY(colorAttachmentCount, "Color Attachment Count", 0),
150 MEMBER_PROPERTY(colorAttachments, "Color Attachments", 0))
151
152 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState::InputAssembly);
153 DATA_TYPE_METADATA(RENDER_NS::GraphicsState::InputAssembly,
154 MEMBER_PROPERTY(enablePrimitiveRestart, "Enable Primitive Restart", 0),
155 MEMBER_PROPERTY(primitiveTopology, "Primitive Topology", 0))
156
157 DECLARE_PROPERTY_TYPE(RENDER_NS::GraphicsState);
158 DATA_TYPE_METADATA(RENDER_NS::GraphicsState, MEMBER_PROPERTY(inputAssembly, "", 0),
159 MEMBER_PROPERTY(rasterizationState, "", 0), MEMBER_PROPERTY(depthStencilState, "", 0),
160 MEMBER_PROPERTY(colorBlendState, "", 0))
161
162 DECLARE_PROPERTY_TYPE(CORE3D_NS::GraphicsStateComponent);
163 DATA_TYPE_METADATA(
164 CORE3D_NS::GraphicsStateComponent, MEMBER_PROPERTY(graphicsState, "", 0), MEMBER_PROPERTY(renderSlot, "", 0))
165
166 CORE_END_NAMESPACE()
167
168 CORE3D_BEGIN_NAMESPACE()
169 class GraphicsStateComponentManager final
170 : public CORE_NS::BaseManager<GraphicsStateComponent, IGraphicsStateComponentManager> {
171 public:
GraphicsStateComponentManager(CORE_NS::IEcs & ecs)172 explicit GraphicsStateComponentManager(CORE_NS::IEcs& ecs)
173 : CORE_NS::BaseManager<GraphicsStateComponent, IGraphicsStateComponentManager>(
174 ecs, CORE_NS::GetName<IGraphicsStateComponentManager>(), 0U)
175 {}
176
177 ~GraphicsStateComponentManager() = default;
178
PropertyCount() const179 size_t PropertyCount() const override
180 {
181 return BASE_NS::countof(CORE_NS::PropertyType::DataType<GraphicsStateComponent>::properties);
182 }
183
MetaData(size_t index) const184 const CORE_NS::Property* MetaData(size_t index) const override
185 {
186 if (index < BASE_NS::countof(CORE_NS::PropertyType::DataType<GraphicsStateComponent>::properties)) {
187 return &CORE_NS::PropertyType::DataType<GraphicsStateComponent>::properties[index];
188 }
189 return nullptr;
190 }
191
MetaData() const192 BASE_NS::array_view<const CORE_NS::Property> MetaData() const override
193 {
194 return CORE_NS::PropertyType::DataType<GraphicsStateComponent>::MetaDataFromType();
195 }
196 };
197
IGraphicsStateComponentManagerInstance(CORE_NS::IEcs & ecs)198 CORE_NS::IComponentManager* IGraphicsStateComponentManagerInstance(CORE_NS::IEcs& ecs)
199 {
200 return new GraphicsStateComponentManager(ecs);
201 }
202
IGraphicsStateComponentManagerDestroy(CORE_NS::IComponentManager * instance)203 void IGraphicsStateComponentManagerDestroy(CORE_NS::IComponentManager* instance)
204 {
205 delete static_cast<GraphicsStateComponentManager*>(instance);
206 }
207 CORE3D_END_NAMESPACE()
208