/*
* 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 "LightJS.h"
#include
#include
#include
#include
#include
#include
using namespace NapiApi;
BaseLight::BaseLight(LightType lt) : NodeImpl(NodeImpl::NodeType::LIGHT), lightType_(lt) {}
void BaseLight::RegisterEnums(NapiApi::Object exports)
{
napi_value v;
NapiApi::Object LightType(exports.GetEnv());
#define DECL_ENUM(enu, x) \
{ \
napi_create_uint32(enu.GetEnv(), BaseLight::LightType::x, (&v)); \
enu.Set((#x), (v)); \
}
DECL_ENUM(LightType, DIRECTIONAL);
DECL_ENUM(LightType, POINT);
DECL_ENUM(LightType, SPOT);
#undef DECL_ENUM
exports.Set("LightType", LightType);
}
void BaseLight::Create(napi_env e, napi_callback_info i)
{
NapiApi::FunctionContext fromJs(e, i);
if (!fromJs) {
// no arguments. so internal create.
// expecting caller to finish initialization
return;
}
// java script call.. with arguments
NapiApi::Object scene = fromJs.Arg<0>();
if (!GetNativeMeta(scene_.GetObject())) {
CORE_LOG_F("INVALID SCENE!");
}
scene_ = { scene };
auto scn = GetNativeMeta(scene);
if (scn == nullptr) {
// hmm..
CORE_LOG_F("Invalid scene for LightJS!");
return;
}
// collect parameters
NapiApi::Value name;
NapiApi::Value path;
NapiApi::Object args = fromJs.Arg<1>();
if (auto prm = args.Get("name")) {
name = NapiApi::Value(e, prm);
}
if (auto prm = args.Get("path")) {
path = NapiApi::Value(e, prm);
}
BASE_NS::string nodePath;
if (path) {
// create using path
nodePath = path.valueOrDefault("");
} else if (name) {
// use the name as path (creates under root)
nodePath = name.valueOrDefault("");
} else {
// no name or path defined should this just fail?
}
// Create actual camera object.
SCENE_NS::ILight::Ptr node;
ExecSyncTask([scn, nodePath, &node]() {
node = scn->CreateNode(nodePath, true);
return META_NS::IAny::Ptr {};
});
TrueRootObject* instance = GetThisRootObject(fromJs);
instance->SetNativeObject(interface_pointer_cast(node), false);
node.reset();
NapiApi::Object meJs(e, fromJs.This());
StoreJsObj(instance->GetNativeObject(), meJs);
if (name) {
// set the name of the object. if we were given one
meJs.Set("name", name);
}
}
BaseLight::~BaseLight() {}
void BaseLight::Init(const char* class_name, napi_env env, napi_value exports,
BASE_NS::vector& np, napi_callback ctor)
{
NodeImpl::GetPropertyDescs(np);
np.push_back(TROGetProperty("lightType"));
np.push_back(TROGetSetProperty