1 2/* 3 * Copyright (C) 2024 Huawei Device Co., Ltd. 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "Vec2Proxy.h" 18 19Vec2Proxy::Vec2Proxy(napi_env env, META_NS::Property<BASE_NS::Math::Vec2> prop) : PropertyProxy(prop) 20{ 21 // Construct a "Lume::Vec2" instance 22 Create(env, "Vec2"); 23 // hook to the objects members (set custom get/set) 24 Hook("x"); 25 Hook("y"); 26 SyncGet(); 27} 28Vec2Proxy::~Vec2Proxy() {} 29void Vec2Proxy::UpdateLocalValues() 30{ 31 // executed in javascript thread (locks handled outside) 32 value = META_NS::Property<BASE_NS::Math::Vec2>(prop_)->GetValue(); 33} 34void Vec2Proxy::UpdateRemoteValues() 35{ 36 // executed in engine thread (locks handled outside) 37 META_NS::Property<BASE_NS::Math::Vec2>(prop_)->SetValue(value); 38} 39void Vec2Proxy::SetValue(const BASE_NS::Math::Vec2& v) 40{ 41 // currently executed in engine thread, hence the locks. 42 duh.Lock(); 43 if (value != v) { 44 value = v; 45 ScheduleUpdate(); 46 } 47 duh.Unlock(); 48} 49void Vec2Proxy::SetValue(NapiApi::FunctionContext<>& cb, BASE_NS::string_view memb) 50{ 51 // should be executed in the javascript thread. 52 NapiApi::FunctionContext<float> info(cb.GetEnv(), cb.GetInfo()); 53 float val = info.Arg<0>(); 54 duh.Lock(); 55 if ((memb == "x") && (val != value.x)) { 56 value.x = val; 57 ScheduleUpdate(); 58 } else if ((memb == "y") && (val != value.y)) { 59 value.y = val; 60 ScheduleUpdate(); 61 } 62 duh.Unlock(); 63} 64napi_value Vec2Proxy::GetValue(NapiApi::FunctionContext<>& cb, BASE_NS::string_view memb) 65{ 66 // should be executed in the javascript thread. 67 float res; 68 duh.Lock(); 69 if (memb == "x") { 70 res = value.x; 71 } else if (memb == "y") { 72 res = value.y; 73 } else { 74 // invalid member? 75 duh.Unlock(); 76 return {}; 77 } 78 duh.Unlock(); 79 napi_value value; 80 napi_status status = napi_create_double(cb.GetEnv(), res, &value); 81 return value; 82} 83 84bool Vec2Proxy::SetValue(NapiApi::Object obj) 85{ 86 auto x = obj.Get<float>("x"); 87 auto y = obj.Get<float>("y"); 88 if (x.IsValid() && y.IsValid()) { 89 BASE_NS::Math::Vec2 v(x, y); 90 SetValue(v); 91 return true; 92 } 93 return false; 94}