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