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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MODEL_MODEL_PAINT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MODEL_MODEL_PAINT_PROPERTY_H
18 
19 #include "custom/custom_render_descriptor.h"
20 #include "custom/shader_input_buffer.h"
21 #include "data_type/geometry/geometry.h"
22 #include "data_type/gltf_animation.h"
23 
24 #include "base/geometry/animatable_float.h"
25 #include "base/geometry/vec3.h"
26 #include "core/components_ng/pattern/model/model_light.h"
27 #include "core/components_ng/pattern/model/model_position.h"
28 #include "core/components_ng/pattern/model/model_property.h"
29 #include "core/components_ng/render/paint_property.h"
30 
31 namespace OHOS::Ace::NG {
32 
33 class ModelPaintProperty : public PaintProperty {
DECLARE_ACE_TYPE(ModelPaintProperty,PaintProperty)34     DECLARE_ACE_TYPE(ModelPaintProperty, PaintProperty)
35 
36 public:
37     ModelPaintProperty()
38     {
39         // Initialize model lights to empty vector;
40         propModelLights_ = std::vector<RefPtr<ModelLight>> {};
41         propModelAnimations_ = std::vector<std::shared_ptr<Render3D::GLTFAnimation>> {};
42         propModelGeometries_ = std::vector<std::shared_ptr<Render3D::Geometry>> {};
43         propModelImageTexturePaths_ = std::vector<std::string> {};
44         propShaderPath_ = std::string {};
45         propModelShaderInputBuffer_ = nullptr;
46         propModelCustomRender_ = nullptr;
47         propModelSource_ = std::string {};
48         propModelBackground_ = std::string{};
49     };
50 
51     ~ModelPaintProperty() override = default;
52 
Clone()53     RefPtr<PaintProperty> Clone() const override
54     {
55         auto paintProperty = MakeRefPtr<ModelPaintProperty>();
56         paintProperty->UpdatePaintProperty(this);
57         paintProperty->propCameraDistance_ = CloneCameraDistance();
58         paintProperty->propCameraIsAngular_ = CloneCameraIsAngular();
59         paintProperty->propCameraRotation_ = CloneCameraRotation();
60         paintProperty->propCameraLookAt_ = CloneCameraLookAt();
61         paintProperty->propCameraUp_ = CloneCameraUp();
62         paintProperty->propCameraZNear_ = CloneCameraZNear();
63         paintProperty->propCameraZFar_ = CloneCameraZFar();
64         paintProperty->propCameraFOV_ = CloneCameraFOV();
65         paintProperty->propModelLights_ = CloneModelLights();
66         paintProperty->propModelAnimations_ = CloneModelAnimations();
67         paintProperty->propModelGeometries_ = CloneModelGeometries();
68         paintProperty->propModelCustomRender_ = CloneModelCustomRender();
69         paintProperty->propShaderPath_ = CloneShaderPath();
70         paintProperty->propModelImageTexturePaths_ = CloneModelImageTexturePaths();
71         paintProperty->propModelShaderInputBuffer_ = CloneModelShaderInputBuffer();
72         paintProperty->propModelSource_ = CloneModelSource();
73         paintProperty->propModelBackground_ = CloneModelBackground();
74         paintProperty->propModelCameraMove_ = CloneModelCameraMove();
75         paintProperty->propRenderHeight_ = CloneRenderHeight();
76         paintProperty->propRenderWidth_ = CloneRenderWidth();
77         paintProperty->propRenderFrameRate_ = CloneRenderFrameRate();
78 
79         paintProperty->needsCameraSetup_ = CloneNeedsCameraSetup();
80         paintProperty->needsLightsSetup_ = CloneNeedsLightsSetup();
81         paintProperty->needsAnimationsSetup_ = CloneNeedsAnimationsSetup();
82         paintProperty->needsGeometriesSetup_ = CloneNeedsGeometriesSetup();
83         paintProperty->needsCustomRenderSetup_ = CloneNeedsCustomRenderSetup();
84         paintProperty->needsShaderPathSetup_ = CloneNeedsShaderPathSetup();
85         paintProperty->needsImageTexturePathsSetup_ = CloneNeedsImageTexturePathsSetup();
86         paintProperty->needsShaderInputBufferSetup_ = CloneNeedsShaderInputBufferSetup();
87         paintProperty->needsModelSourceSetup_ = CloneNeedsModelSourceSetup();
88         paintProperty->needsModelBackgroundSetup_ = CloneNeedsModelBackgroundSetup();
89         paintProperty->needsModelCameraMoveSetup_ = CloneNeedsModelCameraMoveSetup();
90 
91         return paintProperty;
92     }
93 
ResetFlagProperties()94     void ResetFlagProperties()
95     {
96         UpdateNeedsAnimationsSetup(false);
97         UpdateNeedsGeometriesSetup(false);
98         UpdateNeedsCameraSetup(false);
99         UpdateNeedsLightsSetup(false);
100         UpdateNeedsCustomRenderSetup(false);
101         UpdateNeedsShaderPathSetup(false);
102         UpdateNeedsImageTexturePathsSetup(false);
103         UpdateNeedsShaderInputBufferSetup(false);
104         UpdateNeedsModelSourceSetup(false);
105         UpdateNeedsModelBackgroundSetup(false);
106         UpdateNeedsModelCameraMoveSetup(false);
107     }
108 
Reset()109     void Reset() override
110     {
111         PaintProperty::Reset();
112         ResetCameraDistance();
113         ResetCameraIsAngular();
114         ResetCameraRotation();
115         ResetCameraLookAt();
116         ResetCameraUp();
117         ResetCameraZNear();
118         ResetCameraZFar();
119         ResetCameraFOV();
120         ResetModelLights();
121         ResetModelSingleLight();
122         ResetModelAnimations();
123         ResetModelSingleAnimation();
124         ResetModelGeometries();
125         ResetModelSingleGeometry();
126         ResetModelCustomRender();
127         ResetShaderPath();
128         ResetModelImageTexturePaths();
129         ResetModelSingleImageTexturePath();
130         ResetModelShaderInputBuffer();
131         ResetModelSource();
132         ResetModelBackground();
133         ResetModelCameraMove();
134         ResetRenderHeight();
135         ResetRenderWidth();
136         ResetRenderFrameRate();
137         ResetFlagProperties();
138     }
139 
ModelLightsAnimationUpdate(const std::vector<RefPtr<ModelLight>> & lights)140     void ModelLightsAnimationUpdate(const std::vector<RefPtr<ModelLight>>& lights)
141     {
142         propModelLights_ = lights;
143         UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
144         UpdateNeedsLightsSetup(true);
145     }
146 
OnModelSingleLightUpdate(const RefPtr<ModelLight> & light)147     void OnModelSingleLightUpdate(const RefPtr<ModelLight>& light)
148     {
149         propModelLights_.value().push_back(light);
150         ResetModelSingleLight();
151         UpdateNeedsLightsSetup(true);
152     }
153 
OnModelSingleAnimationUpdate(const std::shared_ptr<Render3D::GLTFAnimation> & animation)154     void OnModelSingleAnimationUpdate(const std::shared_ptr<Render3D::GLTFAnimation>& animation)
155     {
156         propModelAnimations_.value().push_back(animation);
157         ResetModelSingleAnimation();
158         UpdateNeedsAnimationsSetup(true);
159     }
160 
OnModelSingleGeometryUpdate(const std::shared_ptr<Render3D::Geometry> & geometry)161     void OnModelSingleGeometryUpdate(const std::shared_ptr<Render3D::Geometry>& geometry)
162     {
163         propModelGeometries_.value().push_back(geometry);
164         ResetModelSingleGeometry();
165         UpdateNeedsGeometriesSetup(true);
166     }
167 
OnModelSingleImageTexturePathUpdate(const std::string & path)168     void OnModelSingleImageTexturePathUpdate(const std::string& path)
169     {
170         propModelImageTexturePaths_.value().push_back(path);
171         ResetModelSingleImageTexturePath();
172         UpdateNeedsImageTexturePathsSetup(true);
173     }
174 
175     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
176         CameraDistance, AnimatableFloat, Camera, PROPERTY_UPDATE_RENDER);
177     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
178         CameraIsAngular, bool, Camera, PROPERTY_UPDATE_RENDER);
179     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
180         CameraRotation, Quaternion, Camera, PROPERTY_UPDATE_RENDER);
181     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
182         CameraLookAt, Vec3, Camera, PROPERTY_UPDATE_RENDER);
183     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
184         CameraUp, Vec3, Camera, PROPERTY_UPDATE_RENDER);
185     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
186         CameraZNear, float, Camera, PROPERTY_UPDATE_RENDER);
187     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
188         CameraZFar, float, Camera, PROPERTY_UPDATE_RENDER);
189     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
190         CameraFOV, float, Camera, PROPERTY_UPDATE_RENDER);
191 
192     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
193         ModelBackground, std::string, ModelBackground, PROPERTY_UPDATE_RENDER);
194     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
195         ModelTransparent, bool, ModelBackground, PROPERTY_UPDATE_RENDER);
196     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(ModelSource, std::string, ModelSource, PROPERTY_UPDATE_RENDER);
197     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
198         ShaderPath, std::string, ShaderPath, PROPERTY_UPDATE_RENDER);
199     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(RenderWidth, float, RenderWidth, PROPERTY_UPDATE_RENDER);
200     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(RenderHeight, float, RenderHeight, PROPERTY_UPDATE_RENDER);
201     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(RenderFrameRate, float, RenderFrameRate, PROPERTY_UPDATE_RENDER);
202     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
203         ModelCustomRender, std::shared_ptr<Render3D::CustomRenderDescriptor>, CustomRender,
204         PROPERTY_UPDATE_RENDER);
205     DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY(
206         ModelShaderInputBuffer, std::shared_ptr<Render3D::ShaderInputBuffer>, ShaderInputBuffer,
207         PROPERTY_UPDATE_RENDER);
208     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(
209         ModelLights, std::vector<RefPtr<ModelLight>>, PROPERTY_UPDATE_RENDER);
210     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(
211         ModelSingleLight, RefPtr<ModelLight>, PROPERTY_UPDATE_RENDER);
212 
213     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(
214         ModelAnimations, std::vector<std::shared_ptr<Render3D::GLTFAnimation>>, PROPERTY_UPDATE_RENDER);
215     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(
216         ModelSingleAnimation, std::shared_ptr<Render3D::GLTFAnimation>, PROPERTY_UPDATE_RENDER);
217 
218     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(
219         ModelGeometries, std::vector<std::shared_ptr<Render3D::Geometry>>, PROPERTY_UPDATE_RENDER);
220     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(
221         ModelSingleGeometry, std::shared_ptr<Render3D::Geometry>, PROPERTY_UPDATE_RENDER);
222 
223     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(
224         ModelImageTexturePaths, std::vector<std::string>, PROPERTY_UPDATE_RENDER);
225     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(
226         ModelSingleImageTexturePath, std::string, PROPERTY_UPDATE_RENDER);
227     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ModelCameraMove, bool, PROPERTY_UPDATE_RENDER);
228 
229     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Camera, false, PROPERTY_UPDATE_RENDER);
230     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Lights, false, PROPERTY_UPDATE_RENDER);
231     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Animations, false, PROPERTY_UPDATE_RENDER);
232     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Geometries, false, PROPERTY_UPDATE_RENDER);
233     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(CustomRender, false, PROPERTY_UPDATE_RENDER);
234     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ShaderPath, false, PROPERTY_UPDATE_RENDER);
235     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ImageTexturePaths, false, PROPERTY_UPDATE_RENDER);
236     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ShaderInputBuffer, false, PROPERTY_UPDATE_RENDER);
237     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ModelSource, false, PROPERTY_UPDATE_RENDER);
238     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(RenderWidth, false, PROPERTY_UPDATE_RENDER);
239     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(RenderHeight, false, PROPERTY_UPDATE_RENDER);
240     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(RenderFrameRate, false, PROPERTY_UPDATE_RENDER);
241     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ModelBackground, false, PROPERTY_UPDATE_RENDER);
242     DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ModelCameraMove, false, PROPERTY_UPDATE_RENDER);
243 
244 private:
245     ACE_DISALLOW_COPY_AND_MOVE(ModelPaintProperty);
246 };
247 
248 } // namespace OHOS::Ace::NG
249 
250 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MODEL_MODEL_PAINT_PROPERTY_H
251