18bf80f4bSopenharmony_ci 28bf80f4bSopenharmony_ci/* 38bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 48bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 58bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 68bf80f4bSopenharmony_ci * You may obtain a copy of the License at 78bf80f4bSopenharmony_ci * 88bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 98bf80f4bSopenharmony_ci * 108bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 118bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 128bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 148bf80f4bSopenharmony_ci * limitations under the License. 158bf80f4bSopenharmony_ci */ 168bf80f4bSopenharmony_ci 178bf80f4bSopenharmony_ci#include "Vec2Proxy.h" 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ciVec2Proxy::Vec2Proxy(napi_env env, META_NS::Property<BASE_NS::Math::Vec2> prop) : PropertyProxy(prop) 208bf80f4bSopenharmony_ci{ 218bf80f4bSopenharmony_ci // Construct a "Lume::Vec2" instance 228bf80f4bSopenharmony_ci Create(env, "Vec2"); 238bf80f4bSopenharmony_ci // hook to the objects members (set custom get/set) 248bf80f4bSopenharmony_ci Hook("x"); 258bf80f4bSopenharmony_ci Hook("y"); 268bf80f4bSopenharmony_ci SyncGet(); 278bf80f4bSopenharmony_ci} 288bf80f4bSopenharmony_ciVec2Proxy::~Vec2Proxy() {} 298bf80f4bSopenharmony_civoid Vec2Proxy::UpdateLocalValues() 308bf80f4bSopenharmony_ci{ 318bf80f4bSopenharmony_ci // executed in javascript thread (locks handled outside) 328bf80f4bSopenharmony_ci value = META_NS::Property<BASE_NS::Math::Vec2>(prop_)->GetValue(); 338bf80f4bSopenharmony_ci} 348bf80f4bSopenharmony_civoid Vec2Proxy::UpdateRemoteValues() 358bf80f4bSopenharmony_ci{ 368bf80f4bSopenharmony_ci // executed in engine thread (locks handled outside) 378bf80f4bSopenharmony_ci META_NS::Property<BASE_NS::Math::Vec2>(prop_)->SetValue(value); 388bf80f4bSopenharmony_ci} 398bf80f4bSopenharmony_civoid Vec2Proxy::SetValue(const BASE_NS::Math::Vec2& v) 408bf80f4bSopenharmony_ci{ 418bf80f4bSopenharmony_ci // currently executed in engine thread, hence the locks. 428bf80f4bSopenharmony_ci duh.Lock(); 438bf80f4bSopenharmony_ci if (value != v) { 448bf80f4bSopenharmony_ci value = v; 458bf80f4bSopenharmony_ci ScheduleUpdate(); 468bf80f4bSopenharmony_ci } 478bf80f4bSopenharmony_ci duh.Unlock(); 488bf80f4bSopenharmony_ci} 498bf80f4bSopenharmony_civoid Vec2Proxy::SetValue(NapiApi::FunctionContext<>& cb, BASE_NS::string_view memb) 508bf80f4bSopenharmony_ci{ 518bf80f4bSopenharmony_ci // should be executed in the javascript thread. 528bf80f4bSopenharmony_ci NapiApi::FunctionContext<float> info(cb.GetEnv(), cb.GetInfo()); 538bf80f4bSopenharmony_ci float val = info.Arg<0>(); 548bf80f4bSopenharmony_ci duh.Lock(); 558bf80f4bSopenharmony_ci if ((memb == "x") && (val != value.x)) { 568bf80f4bSopenharmony_ci value.x = val; 578bf80f4bSopenharmony_ci ScheduleUpdate(); 588bf80f4bSopenharmony_ci } else if ((memb == "y") && (val != value.y)) { 598bf80f4bSopenharmony_ci value.y = val; 608bf80f4bSopenharmony_ci ScheduleUpdate(); 618bf80f4bSopenharmony_ci } 628bf80f4bSopenharmony_ci duh.Unlock(); 638bf80f4bSopenharmony_ci} 648bf80f4bSopenharmony_cinapi_value Vec2Proxy::GetValue(NapiApi::FunctionContext<>& cb, BASE_NS::string_view memb) 658bf80f4bSopenharmony_ci{ 668bf80f4bSopenharmony_ci // should be executed in the javascript thread. 678bf80f4bSopenharmony_ci float res; 688bf80f4bSopenharmony_ci duh.Lock(); 698bf80f4bSopenharmony_ci if (memb == "x") { 708bf80f4bSopenharmony_ci res = value.x; 718bf80f4bSopenharmony_ci } else if (memb == "y") { 728bf80f4bSopenharmony_ci res = value.y; 738bf80f4bSopenharmony_ci } else { 748bf80f4bSopenharmony_ci // invalid member? 758bf80f4bSopenharmony_ci duh.Unlock(); 768bf80f4bSopenharmony_ci return {}; 778bf80f4bSopenharmony_ci } 788bf80f4bSopenharmony_ci duh.Unlock(); 798bf80f4bSopenharmony_ci napi_value value; 808bf80f4bSopenharmony_ci napi_status status = napi_create_double(cb.GetEnv(), res, &value); 818bf80f4bSopenharmony_ci return value; 828bf80f4bSopenharmony_ci} 838bf80f4bSopenharmony_ci 848bf80f4bSopenharmony_cibool Vec2Proxy::SetValue(NapiApi::Object obj) 858bf80f4bSopenharmony_ci{ 868bf80f4bSopenharmony_ci auto x = obj.Get<float>("x"); 878bf80f4bSopenharmony_ci auto y = obj.Get<float>("y"); 888bf80f4bSopenharmony_ci if (x.IsValid() && y.IsValid()) { 898bf80f4bSopenharmony_ci BASE_NS::Math::Vec2 v(x, y); 908bf80f4bSopenharmony_ci SetValue(v); 918bf80f4bSopenharmony_ci return true; 928bf80f4bSopenharmony_ci } 938bf80f4bSopenharmony_ci return false; 948bf80f4bSopenharmony_ci}