1 /*
2 * Copyright (c) 2024 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 "widget_adapter.h"
17
18 #include <window.h>
19
20 #include "3d_widget_adapter_log.h"
21 #include "graphics_manager.h"
22 #include "widget_trace.h"
23 #include "widget_qos.h"
24
25 namespace OHOS::Render3D {
26 #ifdef CHECK_NULL_PTR
27 #undef CHECK_NULL_PTR
28 #endif
29 #define CHECK_NULL_PTR(ptr) \
30 do { \
31 if (!(ptr)) { \
32 WIDGET_LOGE("%s engine not ready", __func__); \
33 return false; \
34 } \
35 } while (false)
36
WidgetAdapter(uint32_t key)37 WidgetAdapter::WidgetAdapter(uint32_t key) : key_(key)
38 {
39 WIDGET_LOGD("WidgetAdapter create key %d", key);
40 }
41
~WidgetAdapter()42 WidgetAdapter::~WidgetAdapter()
43 {
44 WIDGET_LOGD("WidgetAdapter destroy key %d", key_);
45 }
46
Initialize(std::unique_ptr<IEngine> engine)47 bool WidgetAdapter::Initialize(std::unique_ptr<IEngine> engine)
48 {
49 WIDGET_SCOPED_TRACE("WidgetAdapter::Initialze");
50 engine_ = std::move(engine);
51 CHECK_NULL_PTR(engine_);
52 engine_->InitializeScene(key_);
53 return true;
54 }
55
SetupCameraTransform(const OHOS::Render3D::Position & position,const OHOS::Render3D::Vec3 & lookAt,const OHOS::Render3D::Vec3 & up,const OHOS::Render3D::Quaternion & rotation)56 bool WidgetAdapter::SetupCameraTransform(
57 const OHOS::Render3D::Position& position, const OHOS::Render3D::Vec3& lookAt,
58 const OHOS::Render3D::Vec3& up, const OHOS::Render3D::Quaternion& rotation)
59 {
60 CHECK_NULL_PTR(engine_);
61 engine_->SetupCameraTransform(position, lookAt, up, rotation);
62 return true;
63 }
64
SetupCameraViewProjection(float zNear,float zFar,float fovDegrees)65 bool WidgetAdapter::SetupCameraViewProjection(float zNear, float zFar, float fovDegrees)
66 {
67 CHECK_NULL_PTR(engine_);
68 engine_->SetupCameraViewProjection(zNear, zFar, fovDegrees);
69 return true;
70 }
71
UpdateLights(const std::vector<std::shared_ptr<OHOS::Render3D::Light>> & lights)72 bool WidgetAdapter::UpdateLights(const std::vector<std::shared_ptr<OHOS::Render3D::Light>>& lights)
73 {
74 CHECK_NULL_PTR(engine_);
75 engine_->UpdateLights(lights);
76 return true;
77 }
78
OnTouchEvent(const PointerEvent & event)79 bool WidgetAdapter::OnTouchEvent(const PointerEvent& event)
80 {
81 CHECK_NULL_PTR(engine_);
82 engine_->OnTouchEvent(event);
83 return true;
84 }
85
PerformDrawFrame()86 void WidgetAdapter::PerformDrawFrame()
87 {
88 #if MULTI_ECS_UPDATE_AT_ONCE
89 engine_->DeferDraw();
90 #else
91 engine_->DrawFrame();
92 #endif
93 }
94
DrawFrame()95 bool WidgetAdapter::DrawFrame()
96 {
97 WIDGET_SCOPED_TRACE_ARGS("WidgetAdpater::DrawFrame QOS:%d", firstFrame_);
98 CHECK_NULL_PTR(engine_);
99 if (firstFrame_) {
100 Widget3DQosScoped qos("WidgetAdapter::DrawFrame");
101 firstFrame_ = false;
102 PerformDrawFrame();
103 } else {
104 PerformDrawFrame();
105 }
106 return true;
107 }
108
UpdateGeometries(const std::vector<std::shared_ptr<Geometry>> & shapes)109 bool WidgetAdapter::UpdateGeometries(const std::vector<std::shared_ptr<Geometry>>& shapes)
110 {
111 CHECK_NULL_PTR(engine_);
112 engine_->UpdateGeometries(shapes);
113 return true;
114 }
115
UpdateGLTFAnimations(const std::vector<std::shared_ptr<GLTFAnimation>> & animations)116 bool WidgetAdapter::UpdateGLTFAnimations(const std::vector<std::shared_ptr<GLTFAnimation>>&
117 animations)
118 {
119 CHECK_NULL_PTR(engine_);
120 engine_->UpdateGLTFAnimations(animations);
121 return true;
122 }
123
124
UpdateCustomRender(const std::shared_ptr<CustomRenderDescriptor> & customRenders)125 bool WidgetAdapter::UpdateCustomRender(const std::shared_ptr<CustomRenderDescriptor>&
126 customRenders)
127 {
128 CHECK_NULL_PTR(engine_);
129 engine_->UpdateCustomRender(customRenders);
130 return true;
131 }
132
UpdateShaderPath(const std::string & shaderPath)133 bool WidgetAdapter::UpdateShaderPath(const std::string& shaderPath)
134 {
135 CHECK_NULL_PTR(engine_);
136 WIDGET_LOGE("shader path %s", shaderPath.c_str());
137 engine_->UpdateShaderPath(shaderPath);
138 return true;
139 }
140
UpdateImageTexturePaths(const std::vector<std::string> & imageTextures)141 bool WidgetAdapter::UpdateImageTexturePaths(const std::vector<std::string>& imageTextures)
142 {
143 Widget3DQosScoped qos("WidgetAdapter::UpdateImageTexturePaths");
144 CHECK_NULL_PTR(engine_);
145 engine_->UpdateImageTexturePaths(imageTextures);
146 return true;
147 }
148
UpdateShaderInputBuffer(const std::shared_ptr<OHOS::Render3D::ShaderInputBuffer> & shaderInputBuffer)149 bool WidgetAdapter::UpdateShaderInputBuffer(const std::shared_ptr<OHOS::Render3D::ShaderInputBuffer>&
150 shaderInputBuffer)
151 {
152 CHECK_NULL_PTR(engine_);
153 engine_->UpdateShaderInputBuffer(shaderInputBuffer);
154 return true;
155 }
156
DeInitEngine()157 void WidgetAdapter::DeInitEngine()
158 {
159 WIDGET_SCOPED_TRACE("WidgetAdapter::DeInitEngine");
160 if (engine_ == nullptr) {
161 return;
162 }
163 engine_->DeInitEngine();
164 engine_.reset();
165 }
166
SetupCameraViewport(uint32_t width,uint32_t height)167 bool WidgetAdapter::SetupCameraViewport(uint32_t width, uint32_t height)
168 {
169 CHECK_NULL_PTR(engine_);
170 engine_->SetupCameraViewPort(width, height);
171 return true;
172 }
173
OnWindowChange(const TextureInfo & textureInfo)174 bool WidgetAdapter::OnWindowChange(const TextureInfo& textureInfo)
175 {
176 CHECK_NULL_PTR(engine_);
177 engine_->OnWindowChange(textureInfo);
178 return true;
179 }
180
LoadSceneModel(const std::string & scene)181 bool WidgetAdapter::LoadSceneModel(const std::string& scene)
182 {
183 CHECK_NULL_PTR(engine_);
184 engine_->LoadSceneModel(scene);
185 return true;
186 }
187
LoadEnvModel(const std::string & enviroment,BackgroundType type)188 bool WidgetAdapter::LoadEnvModel(const std::string& enviroment, BackgroundType type)
189 {
190 CHECK_NULL_PTR(engine_);
191 engine_->LoadEnvModel(enviroment, type);
192 return true;
193 }
194
UnloadSceneModel()195 bool WidgetAdapter::UnloadSceneModel()
196 {
197 CHECK_NULL_PTR(engine_);
198 engine_->UnloadSceneModel();
199 return true;
200 }
201
UnloadEnvModel()202 bool WidgetAdapter::UnloadEnvModel()
203 {
204 CHECK_NULL_PTR(engine_);
205 engine_->UnloadSceneModel();
206 return true;
207 }
208
NeedsRepaint()209 bool WidgetAdapter::NeedsRepaint()
210 {
211 CHECK_NULL_PTR(engine_);
212 return engine_->NeedsRepaint();
213 }
214 } // namespace OHOS::Render3D
215