18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci#include "SceneResourceImpl.h"
168bf80f4bSopenharmony_ci
178bf80f4bSopenharmony_ci#include <scene_plugin/interface/intf_mesh.h>
188bf80f4bSopenharmony_ci#include <scene_plugin/interface/intf_node.h>
198bf80f4bSopenharmony_ci
208bf80f4bSopenharmony_ci#include "BaseObjectJS.h"
218bf80f4bSopenharmony_ciSceneResourceImpl::SceneResourceImpl(SceneResourceType type) : type_(type)
228bf80f4bSopenharmony_ci{
238bf80f4bSopenharmony_ci    LOG_F("SceneResourceImpl ++");
248bf80f4bSopenharmony_ci}
258bf80f4bSopenharmony_ciSceneResourceImpl::~SceneResourceImpl()
268bf80f4bSopenharmony_ci{
278bf80f4bSopenharmony_ci    LOG_F("SceneResourceImpl --");
288bf80f4bSopenharmony_ci}
298bf80f4bSopenharmony_ci
308bf80f4bSopenharmony_civoid SceneResourceImpl::RegisterEnums(NapiApi::Object exports)
318bf80f4bSopenharmony_ci{
328bf80f4bSopenharmony_ci    napi_value v;
338bf80f4bSopenharmony_ci    NapiApi::Object SceneResourceType(exports.GetEnv());
348bf80f4bSopenharmony_ci
358bf80f4bSopenharmony_ci#define DECL_ENUM(enu, x)                                     \
368bf80f4bSopenharmony_ci    {                                                         \
378bf80f4bSopenharmony_ci        napi_create_uint32(enu.GetEnv(), SceneResourceType::x, &v); \
388bf80f4bSopenharmony_ci        enu.Set(#x, v);                                 \
398bf80f4bSopenharmony_ci    }
408bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, UNKNOWN);
418bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, NODE);
428bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, ENVIRONMENT);
438bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, MATERIAL);
448bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, MESH);
458bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, ANIMATION);
468bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, SHADER);
478bf80f4bSopenharmony_ci    DECL_ENUM(SceneResourceType, IMAGE);
488bf80f4bSopenharmony_ci#undef DECL_ENUM
498bf80f4bSopenharmony_ci
508bf80f4bSopenharmony_ci    exports.Set("SceneResourceType", SceneResourceType);
518bf80f4bSopenharmony_ci}
528bf80f4bSopenharmony_ci
538bf80f4bSopenharmony_civoid SceneResourceImpl::GetPropertyDescs(BASE_NS::vector<napi_property_descriptor>& props)
548bf80f4bSopenharmony_ci{
558bf80f4bSopenharmony_ci    props.push_back(
568bf80f4bSopenharmony_ci        TROGetSetProperty<BASE_NS::string, SceneResourceImpl, &SceneResourceImpl::GetName, &SceneResourceImpl::SetName>(
578bf80f4bSopenharmony_ci            "name"));
588bf80f4bSopenharmony_ci    props.push_back(TROGetProperty<NapiApi::Object, SceneResourceImpl, &SceneResourceImpl::GetUri>("uri"));
598bf80f4bSopenharmony_ci    props.push_back(
608bf80f4bSopenharmony_ci        TROGetProperty<BASE_NS::string, SceneResourceImpl, &SceneResourceImpl::GetObjectType>("resourceType"));
618bf80f4bSopenharmony_ci    props.push_back(
628bf80f4bSopenharmony_ci        MakeTROMethod<NapiApi::FunctionContext<>, SceneResourceImpl, &SceneResourceImpl::Dispose>("destroy"));
638bf80f4bSopenharmony_ci}
648bf80f4bSopenharmony_ci
658bf80f4bSopenharmony_civoid* SceneResourceImpl::GetInstanceImpl(uint32_t id)
668bf80f4bSopenharmony_ci{
678bf80f4bSopenharmony_ci    if (id == SceneResourceImpl::ID) {
688bf80f4bSopenharmony_ci        return this;
698bf80f4bSopenharmony_ci    }
708bf80f4bSopenharmony_ci    return nullptr;
718bf80f4bSopenharmony_ci}
728bf80f4bSopenharmony_ci
738bf80f4bSopenharmony_cinapi_value SceneResourceImpl::Dispose(NapiApi::FunctionContext<>& ctx)
748bf80f4bSopenharmony_ci{
758bf80f4bSopenharmony_ci    // Dispose of the native object. (makes the js object invalid)
768bf80f4bSopenharmony_ci    if (TrueRootObject* instance = GetThisRootObject(ctx)) {
778bf80f4bSopenharmony_ci        instance->DisposeNative();
788bf80f4bSopenharmony_ci    }
798bf80f4bSopenharmony_ci    uri_.Reset();
808bf80f4bSopenharmony_ci    return ctx.GetUndefined();
818bf80f4bSopenharmony_ci}
828bf80f4bSopenharmony_ci
838bf80f4bSopenharmony_cinapi_value SceneResourceImpl::GetObjectType(NapiApi::FunctionContext<>& ctx)
848bf80f4bSopenharmony_ci{
858bf80f4bSopenharmony_ci    uint32_t type = -1; // return -1 if the resource does not exist anymore
868bf80f4bSopenharmony_ci    if (GetThisNativeObject(ctx)) {
878bf80f4bSopenharmony_ci        type = type_;
888bf80f4bSopenharmony_ci    }
898bf80f4bSopenharmony_ci    napi_value value;
908bf80f4bSopenharmony_ci    napi_status status = napi_create_uint32(ctx, type, &value);
918bf80f4bSopenharmony_ci    return value;
928bf80f4bSopenharmony_ci}
938bf80f4bSopenharmony_ci
948bf80f4bSopenharmony_cinapi_value SceneResourceImpl::GetName(NapiApi::FunctionContext<>& ctx)
958bf80f4bSopenharmony_ci{
968bf80f4bSopenharmony_ci    BASE_NS::string name;
978bf80f4bSopenharmony_ci    if (auto node = interface_pointer_cast<META_NS::INamed>(GetThisNativeObject(ctx))) {
988bf80f4bSopenharmony_ci        ExecSyncTask([node, &name]() {
998bf80f4bSopenharmony_ci            name = node->Name()->GetValue();
1008bf80f4bSopenharmony_ci            return META_NS::IAny::Ptr {};
1018bf80f4bSopenharmony_ci        });
1028bf80f4bSopenharmony_ci    }
1038bf80f4bSopenharmony_ci    napi_value value;
1048bf80f4bSopenharmony_ci    napi_status status = napi_create_string_utf8(ctx, name.c_str(), name.length(), &value);
1058bf80f4bSopenharmony_ci    return value;
1068bf80f4bSopenharmony_ci}
1078bf80f4bSopenharmony_civoid SceneResourceImpl::SetName(NapiApi::FunctionContext<BASE_NS::string>& ctx)
1088bf80f4bSopenharmony_ci{
1098bf80f4bSopenharmony_ci    if (auto node = interface_pointer_cast<META_NS::INamed>(GetThisNativeObject(ctx))) {
1108bf80f4bSopenharmony_ci        BASE_NS::string name = ctx.Arg<0>();
1118bf80f4bSopenharmony_ci        ExecSyncTask([node, name]() {
1128bf80f4bSopenharmony_ci            node->Name()->SetValue(name);
1138bf80f4bSopenharmony_ci            return META_NS::IAny::Ptr {};
1148bf80f4bSopenharmony_ci        });
1158bf80f4bSopenharmony_ci    }
1168bf80f4bSopenharmony_ci}
1178bf80f4bSopenharmony_civoid SceneResourceImpl::SetUri(const NapiApi::StrongRef& uri)
1188bf80f4bSopenharmony_ci{
1198bf80f4bSopenharmony_ci    uri_ = uri;
1208bf80f4bSopenharmony_ci}
1218bf80f4bSopenharmony_cinapi_value SceneResourceImpl::GetUri(NapiApi::FunctionContext<>& ctx)
1228bf80f4bSopenharmony_ci{
1238bf80f4bSopenharmony_ci    return uri_.GetValue();
1248bf80f4bSopenharmony_ci}