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