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 "core/components_ng/render/paint_property.h" 20 #include "core/components_ng/pattern/model/model_property.h" 21 22 #include "base/geometry/animatable_float.h" 23 #include "base/geometry/vec3.h" 24 #include "foundation/graphic/graphic_3d/3d_widget_adapter/include/custom/custom_render_descriptor.h" 25 #include "foundation/graphic/graphic_3d/3d_widget_adapter/include/data_type/geometry/geometry.h" 26 #include "foundation/graphic/graphic_3d/3d_widget_adapter/include/data_type/gltf_animation.h" 27 #include "foundation/graphic/graphic_3d/3d_widget_adapter/include/data_type/light.h" 28 #include "foundation/graphic/graphic_3d/3d_widget_adapter/include/data_type/shader_input_buffer.h" 29 30 namespace OHOS::Ace::NG { 31 32 class ModelPaintProperty : public PaintProperty { DECLARE_ACE_TYPE(ModelPaintProperty,PaintProperty)33 DECLARE_ACE_TYPE(ModelPaintProperty, PaintProperty) 34 35 public: 36 ModelPaintProperty() { 37 // Initialize model lights to empty vector; 38 propModelLights_ = std::vector<RefPtr<OHOS::Render3D::SVLight>> {}; 39 propModelAnimations_ = std::vector<RefPtr<OHOS::Render3D::GLTFAnimation>> {}; 40 propModelGeometries_ = std::vector<RefPtr<OHOS::Render3D::SVGeometry>> {}; 41 propModelCustomRenders_ = std::vector<RefPtr<OHOS::Render3D::SVCustomRenderDescriptor>> {}; 42 propModelImageTexturePaths_ = std::vector<std::string> {}; 43 propModelShaderInputBuffers_ = std::vector<RefPtr<OHOS::Render3D::ShaderInputBuffer>> {}; 44 }; 45 ~ModelPaintProperty() override = default; 46 Clone()47 RefPtr<PaintProperty> Clone() const override 48 { 49 auto paintProperty = MakeRefPtr<ModelPaintProperty>(); 50 paintProperty->UpdatePaintProperty(this); 51 paintProperty->propCameraPosition_ = CloneCameraPosition(); 52 paintProperty->propCameraDistance_ = CloneCameraDistance(); 53 paintProperty->propCameraIsAngular_ = CloneCameraIsAngular(); 54 paintProperty->propCameraRotation_ = CloneCameraRotation(); 55 paintProperty->propCameraLookAt_ = CloneCameraLookAt(); 56 paintProperty->propCameraUp_ = CloneCameraUp(); 57 paintProperty->propCameraZNear_ = CloneCameraZNear(); 58 paintProperty->propCameraZFar_ = CloneCameraZFar(); 59 paintProperty->propCameraFOV_ = CloneCameraFOV(); 60 paintProperty->propModelLights_ = CloneModelLights(); 61 paintProperty->propModelAnimations_ = CloneModelAnimations(); 62 paintProperty->propModelGeometries_ = CloneModelGeometries(); 63 paintProperty->propModelCustomRenders_ = CloneModelCustomRenders(); 64 paintProperty->propShaderPath_ = CloneShaderPath(); 65 paintProperty->propModelImageTexturePaths_ = CloneModelImageTexturePaths(); 66 paintProperty->propModelShaderInputBuffers_ = CloneModelShaderInputBuffers(); 67 68 paintProperty->needsCameraSetup_ = CloneNeedsCameraSetup(); 69 paintProperty->needsLightsSetup_ = CloneNeedsLightsSetup(); 70 paintProperty->needsAnimationsSetup_ = CloneNeedsAnimationsSetup(); 71 paintProperty->needsGeometriesSetup_ = CloneNeedsGeometriesSetup(); 72 paintProperty->needsCustomRendersSetup_ = CloneNeedsCustomRendersSetup(); 73 paintProperty->needsShaderPathSetup_ = CloneNeedsShaderPathSetup(); 74 paintProperty->needsImageTexturePathsSetup_ = CloneNeedsImageTexturePathsSetup(); 75 paintProperty->needsShaderInputBuffersSetup_ = CloneNeedsShaderInputBuffersSetup(); 76 return paintProperty; 77 } 78 ResetFlagProperties()79 void ResetFlagProperties() 80 { 81 UpdateNeedsAnimationsSetup(false); 82 UpdateNeedsGeometriesSetup(false); 83 UpdateNeedsCameraSetup(false); 84 UpdateNeedsLightsSetup(false); 85 UpdateNeedsCustomRendersSetup(false); 86 UpdateNeedsShaderPathSetup(false); 87 UpdateNeedsImageTexturePathsSetup(false); 88 UpdateNeedsShaderInputBuffersSetup(false); 89 } 90 Reset()91 void Reset() override 92 { 93 PaintProperty::Reset(); 94 ResetCameraPosition(); 95 ResetCameraDistance(); 96 ResetCameraIsAngular(); 97 ResetCameraRotation(); 98 ResetCameraLookAt(); 99 ResetCameraUp(); 100 ResetCameraZNear(); 101 ResetCameraZFar(); 102 ResetCameraFOV(); 103 ResetModelLights(); 104 ResetModelSingleLight(); 105 ResetModelAnimations(); 106 ResetModelSingleAnimation(); 107 ResetModelGeometries(); 108 ResetModelSingleGeometry(); 109 ResetModelCustomRenders(); 110 ResetModelSingleCustomRender(); 111 ResetShaderPath(); 112 ResetModelImageTexturePaths(); 113 ResetModelSingleImageTexturePath(); 114 ResetModelShaderInputBuffers(); 115 ResetModelSingleShaderInputBuffer(); 116 ResetFlagProperties(); 117 } 118 ModelLightsAnimationUpdate(const std::vector<RefPtr<OHOS::Render3D::SVLight>> & lights)119 void ModelLightsAnimationUpdate(const std::vector<RefPtr<OHOS::Render3D::SVLight>>& lights) 120 { 121 propModelLights_ = lights; 122 UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER); 123 UpdateNeedsLightsSetup(true); 124 } 125 OnModelSingleLightUpdate(const RefPtr<OHOS::Render3D::SVLight> & light)126 void OnModelSingleLightUpdate(const RefPtr<OHOS::Render3D::SVLight>& light) 127 { 128 propModelLights_.value().push_back(light); 129 LOGD("MODEL_NG: propModelLights_.size() -> %zu", GetModelLightsValue().size()); 130 ResetModelSingleLight(); 131 UpdateNeedsLightsSetup(true); 132 } 133 OnModelSingleAnimationUpdate(const RefPtr<OHOS::Render3D::GLTFAnimation> & animation)134 void OnModelSingleAnimationUpdate(const RefPtr<OHOS::Render3D::GLTFAnimation>& animation) 135 { 136 propModelAnimations_.value().push_back(animation); 137 LOGD("MODEL_NG: propModelAnimations_.size() -> %zu", GetModelAnimationsValue().size()); 138 ResetModelSingleAnimation(); 139 UpdateNeedsAnimationsSetup(true); 140 } 141 OnModelSingleGeometryUpdate(const RefPtr<OHOS::Render3D::SVGeometry> & geometry)142 void OnModelSingleGeometryUpdate(const RefPtr<OHOS::Render3D::SVGeometry>& geometry) 143 { 144 propModelGeometries_.value().push_back(geometry); 145 LOGD("MODEL_NG: propModelGeometries_.size() -> %zu", GetModelGeometriesValue().size()); 146 ResetModelSingleGeometry(); 147 UpdateNeedsGeometriesSetup(true); 148 } 149 OnModelSingleCustomRenderUpdate(const RefPtr<OHOS::Render3D::SVCustomRenderDescriptor> & customRender)150 void OnModelSingleCustomRenderUpdate(const RefPtr<OHOS::Render3D::SVCustomRenderDescriptor>& customRender) 151 { 152 propModelCustomRenders_.value().push_back(customRender); 153 LOGD("MODEL_NG: propModelCustomRenders_.size() -> %zu", GetModelCustomRendersValue().size()); 154 ResetModelSingleCustomRender(); 155 UpdateNeedsCustomRendersSetup(true); 156 } 157 OnModelSingleImageTexturePathUpdate(const std::string & path)158 void OnModelSingleImageTexturePathUpdate(const std::string& path) 159 { 160 propModelImageTexturePaths_.value().push_back(path); 161 LOGD("MODEL_NG: propModelImageTexturePaths_: %zu", GetModelImageTexturePathsValue().size()); 162 ResetModelSingleImageTexturePath(); 163 UpdateNeedsImageTexturePathsSetup(true); 164 } 165 OnModelSingleShaderInputBufferUpdate(const RefPtr<OHOS::Render3D::ShaderInputBuffer> & buffer)166 void OnModelSingleShaderInputBufferUpdate(const RefPtr<OHOS::Render3D::ShaderInputBuffer>& buffer) 167 { 168 propModelShaderInputBuffers_.value().push_back(buffer); 169 LOGD("MODEL_NG: propModelShaderInputBuffers_: %zu", GetModelShaderInputBuffersValue().size()); 170 ResetModelSingleShaderInputBuffer(); 171 UpdateNeedsShaderInputBuffersSetup(true); 172 } 173 174 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 175 CameraPosition, OHOS::Ace::Vec3, Camera, PROPERTY_UPDATE_RENDER); 176 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 177 CameraDistance, OHOS::Ace::AnimatableFloat, Camera, PROPERTY_UPDATE_RENDER); 178 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 179 CameraIsAngular, bool, Camera, PROPERTY_UPDATE_RENDER); 180 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 181 CameraRotation, OHOS::Ace::Quaternion, Camera, PROPERTY_UPDATE_RENDER); 182 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 183 CameraLookAt, OHOS::Ace::Vec3, Camera, PROPERTY_UPDATE_RENDER); 184 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 185 CameraUp, OHOS::Ace::Vec3, Camera, PROPERTY_UPDATE_RENDER); 186 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 187 CameraZNear, float, Camera, PROPERTY_UPDATE_RENDER); 188 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 189 CameraZFar, float, Camera, PROPERTY_UPDATE_RENDER); 190 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 191 CameraFOV, float, Camera, PROPERTY_UPDATE_RENDER); 192 193 DEFINE_NEEDS_SETUP_FLAG_TRIGGER_PROPERTY( 194 ShaderPath, std::string, ShaderPath, PROPERTY_UPDATE_RENDER); 195 196 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 197 ModelLights, std::vector<RefPtr<OHOS::Render3D::SVLight>>, PROPERTY_UPDATE_RENDER); 198 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK( 199 ModelSingleLight, RefPtr<OHOS::Render3D::SVLight>, PROPERTY_UPDATE_RENDER); 200 201 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 202 ModelAnimations, std::vector<RefPtr<OHOS::Render3D::GLTFAnimation>>, PROPERTY_UPDATE_RENDER); 203 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK( 204 ModelSingleAnimation, RefPtr<OHOS::Render3D::GLTFAnimation>, PROPERTY_UPDATE_RENDER); 205 206 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 207 ModelGeometries, std::vector<RefPtr<OHOS::Render3D::SVGeometry>>, PROPERTY_UPDATE_RENDER); 208 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK( 209 ModelSingleGeometry, RefPtr<OHOS::Render3D::SVGeometry>, PROPERTY_UPDATE_RENDER); 210 211 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 212 ModelCustomRenders, std::vector<RefPtr<OHOS::Render3D::SVCustomRenderDescriptor>>, PROPERTY_UPDATE_RENDER); 213 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK( 214 ModelSingleCustomRender, RefPtr<OHOS::Render3D::SVCustomRenderDescriptor>, PROPERTY_UPDATE_RENDER); 215 216 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 217 ModelImageTexturePaths, std::vector<std::string>, PROPERTY_UPDATE_RENDER); 218 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK( 219 ModelSingleImageTexturePath, std::string, PROPERTY_UPDATE_RENDER); 220 221 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 222 ModelShaderInputBuffers, std::vector<RefPtr<OHOS::Render3D::ShaderInputBuffer>>, PROPERTY_UPDATE_RENDER); 223 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK( 224 ModelSingleShaderInputBuffer, RefPtr<OHOS::Render3D::ShaderInputBuffer>, PROPERTY_UPDATE_RENDER); 225 226 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Camera, false, PROPERTY_UPDATE_RENDER); 227 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Lights, false, PROPERTY_UPDATE_RENDER); 228 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Animations, false, PROPERTY_UPDATE_RENDER); 229 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(Geometries, false, PROPERTY_UPDATE_RENDER); 230 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(CustomRenders, false, PROPERTY_UPDATE_RENDER); 231 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ShaderPath, false, PROPERTY_UPDATE_RENDER); 232 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ImageTexturePaths, false, PROPERTY_UPDATE_RENDER); 233 DEFINE_NEEDS_SETUP_FLAG_PROPERTY(ShaderInputBuffers, false, PROPERTY_UPDATE_RENDER); 234 235 private: 236 ACE_DISALLOW_COPY_AND_MOVE(ModelPaintProperty); 237 }; 238 239 } // namespace OHOS::Ace::NG 240 241 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MODEL_MODEL_PAINT_PROPERTY_H 242