* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "widget_adapter.h"
#include <window.h>
#include "3d_widget_adapter_log.h"
#include "graphics_manager.h"
#include "widget_trace.h"
#include "widget_qos.h"
namespace OHOS::Render3D {
#ifdef CHECK_NULL_PTR
#undef CHECK_NULL_PTR
#endif
#define CHECK_NULL_PTR(ptr) \
do { \
if (!(ptr)) { \
WIDGET_LOGE("%s engine not ready", __func__); \
return false; \
} \
} while (false)
WidgetAdapter::WidgetAdapter(uint32_t key) : key_(key)
{
WIDGET_LOGD("WidgetAdapter create key %d", key);
}
WidgetAdapter::~WidgetAdapter()
{
WIDGET_LOGD("WidgetAdapter destroy key %d", key_);
}
bool WidgetAdapter::Initialize(std::unique_ptr<IEngine> engine)
{
WIDGET_SCOPED_TRACE("WidgetAdapter::Initialze");
engine_ = std::move(engine);
CHECK_NULL_PTR(engine_);
engine_->InitializeScene(key_);
return true;
}
bool WidgetAdapter::SetupCameraTransform(
const OHOS::Render3D::Position& position, const OHOS::Render3D::Vec3& lookAt,
const OHOS::Render3D::Vec3& up, const OHOS::Render3D::Quaternion& rotation)
{
CHECK_NULL_PTR(engine_);
engine_->SetupCameraTransform(position, lookAt, up, rotation);
return true;
}
bool WidgetAdapter::SetupCameraViewProjection(float zNear, float zFar, float fovDegrees)
{
CHECK_NULL_PTR(engine_);
engine_->SetupCameraViewProjection(zNear, zFar, fovDegrees);
return true;
}
bool WidgetAdapter::UpdateLights(const std::vector<std::shared_ptr<OHOS::Render3D::Light>>& lights)
{
CHECK_NULL_PTR(engine_);
engine_->UpdateLights(lights);
return true;
}
bool WidgetAdapter::OnTouchEvent(const PointerEvent& event)
{
CHECK_NULL_PTR(engine_);
engine_->OnTouchEvent(event);
return true;
}
void WidgetAdapter::PerformDrawFrame()
{
#if MULTI_ECS_UPDATE_AT_ONCE
engine_->DeferDraw();
#else
engine_->DrawFrame();
#endif
}
bool WidgetAdapter::DrawFrame()
{
WIDGET_SCOPED_TRACE_ARGS("WidgetAdpater::DrawFrame QOS:%d", firstFrame_);
CHECK_NULL_PTR(engine_);
if (firstFrame_) {
firstFrame_ = false;
PerformDrawFrame();
} else {
PerformDrawFrame();
}
return true;
}
bool WidgetAdapter::UpdateGeometries(const std::vector<std::shared_ptr<Geometry>>& shapes)
{
CHECK_NULL_PTR(engine_);
engine_->UpdateGeometries(shapes);
return true;
}
bool WidgetAdapter::UpdateGLTFAnimations(const std::vector<std::shared_ptr<GLTFAnimation>>&
animations)
{
CHECK_NULL_PTR(engine_);
engine_->UpdateGLTFAnimations(animations);
return true;
}
bool WidgetAdapter::UpdateCustomRender(const std::shared_ptr<CustomRenderDescriptor>&
customRenders)
{
CHECK_NULL_PTR(engine_);
engine_->UpdateCustomRender(customRenders);
return true;
}
bool WidgetAdapter::UpdateShaderPath(const std::string& shaderPath)
{
CHECK_NULL_PTR(engine_);
WIDGET_LOGE("shader path %s", shaderPath.c_str());
engine_->UpdateShaderPath(shaderPath);
return true;
}
bool WidgetAdapter::UpdateImageTexturePaths(const std::vector<std::string>& imageTextures)
{
CHECK_NULL_PTR(engine_);
engine_->UpdateImageTexturePaths(imageTextures);
return true;
}
bool WidgetAdapter::UpdateShaderInputBuffer(const std::shared_ptr<OHOS::Render3D::ShaderInputBuffer>&
shaderInputBuffer)
{
CHECK_NULL_PTR(engine_);
engine_->UpdateShaderInputBuffer(shaderInputBuffer);
return true;
}
void WidgetAdapter::DeInitEngine()
{
WIDGET_SCOPED_TRACE("WidgetAdapter::DeInitEngine");
if (engine_ == nullptr) {
return;
}
engine_->DeInitEngine();
engine_.reset();
}
bool WidgetAdapter::SetupCameraViewport(uint32_t width, uint32_t height)
{
CHECK_NULL_PTR(engine_);
engine_->SetupCameraViewPort(width, height);
return true;
}
bool WidgetAdapter::OnWindowChange(const TextureInfo& textureInfo)
{
CHECK_NULL_PTR(engine_);
engine_->OnWindowChange(textureInfo);
return true;
}
bool WidgetAdapter::LoadSceneModel(const std::string& scene)
{
CHECK_NULL_PTR(engine_);
engine_->LoadSceneModel(scene);
return true;
}
bool WidgetAdapter::LoadEnvModel(const std::string& enviroment, BackgroundType type)
{
CHECK_NULL_PTR(engine_);
engine_->LoadEnvModel(enviroment, type);
return true;
}
bool WidgetAdapter::UnloadSceneModel()
{
CHECK_NULL_PTR(engine_);
engine_->UnloadSceneModel();
return true;
}
bool WidgetAdapter::UnloadEnvModel()
{
CHECK_NULL_PTR(engine_);
engine_->UnloadSceneModel();
return true;
}
bool WidgetAdapter::NeedsRepaint()
{
CHECK_NULL_PTR(engine_);
return engine_->NeedsRepaint();
}
}