• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef GEOMETRY_DEFINITION_CUSTOM_JS_H
17 #define GEOMETRY_DEFINITION_CUSTOM_JS_H
18 
19 #include <napi_api.h>
20 #include <scene/interface/intf_create_mesh.h>
21 
22 #include <base/math/vector.h>
23 
24 #include "geometry_definition/GeometryDefinition.h"
25 
26 namespace GeometryDefinition {
27 
28 class CustomJS : public GeometryDefinition {
29 public:
30     enum PrimitiveTopology {
31         TRIANGLE_LIST = 0,
32         TRIANGLE_STRIP = 1,
33     };
34 
35     ~CustomJS() override = default;
36     static GeometryDefinition* FromJs(NapiApi::Object jsDefinition);
37     virtual SCENE_NS::IMesh::Ptr CreateMesh(
38         const SCENE_NS::ICreateMesh::Ptr& creator, const SCENE_NS::MeshConfig& config) const override;
39 
40     static void Init(napi_env env, napi_value exports);
41     static void RegisterEnums(NapiApi::Object exports);
42 
43 private:
44     explicit CustomJS();
45 
46     // Note: This converts to the internal type. The underlying integer values don't match.
47     SCENE_NS::PrimitiveTopology GetTopology() const;
48 
49     bool SetTopology(NapiApi::Object& jsDefinition);
50     PrimitiveTopology topology_ { PrimitiveTopology::TRIANGLE_LIST };
51     BASE_NS::vector<BASE_NS::Math::Vec3> vertices_;
52     BASE_NS::vector<uint32_t> indices_;
53     BASE_NS::vector<BASE_NS::Math::Vec3> normals_;
54     BASE_NS::vector<BASE_NS::Math::Vec2> uvs_;
55     BASE_NS::vector<BASE_NS::Color> colors_;
56 
57     template<typename ItemType>
58     static bool ArrayToNative(
59         NapiApi::Object& obj, const BASE_NS::string& arrayName, BASE_NS::vector<ItemType>& target);
60     template<typename ItemType>
61     static ItemType ToNative(napi_env env, napi_value jsItem, bool& conversionOk);
62 };
63 
64 } // namespace GeometryDefinition
65 
66 #endif
67