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