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 SCENEPLUGINAPI_CAMERA_H
17 #define SCENEPLUGINAPI_CAMERA_H
18
19 #include <scene_plugin/api/camera_uid.h>
20 #include <scene_plugin/api/postprocess.h>
21 #include <scene_plugin/api/postprocess_uid.h>
22 #include <scene_plugin/interface/intf_camera.h>
23
24 #include <meta/api/internal/object_api.h>
SCENE_BEGIN_NAMESPACE()25 SCENE_BEGIN_NAMESPACE()
26
27 /**
28 * @brief Camera class wraps ICamera interface. It keeps the referenced object alive using strong ref.
29 * The construction of the object is asynchronous, the properties of the engine may not be available
30 * right after the object instantiation, but OnLoaded() event can be used to observe the state changes.
31 */
32 class Camera final : public META_NS::Internal::ObjectInterfaceAPI<Camera, ClassId::Camera> {
33 META_API(Camera)
34 META_API_OBJECT_CONVERTIBLE(ICamera)
35 META_API_OBJECT_CONVERTIBLE(INode)
36 META_API_CACHE_INTERFACE(ICamera, Camera)
37 META_API_CACHE_INTERFACE(INode, Node)
38
39 public:
40 // From Node
41 META_API_INTERFACE_PROPERTY_CACHED(Node, Name, BASE_NS::string)
42 META_API_INTERFACE_PROPERTY_CACHED(Node, Position, BASE_NS::Math::Vec3)
43 META_API_INTERFACE_PROPERTY_CACHED(Node, Scale, BASE_NS::Math::Vec3)
44 META_API_INTERFACE_PROPERTY_CACHED(Node, Rotation, BASE_NS::Math::Quat)
45 META_API_INTERFACE_PROPERTY_CACHED(Node, Visible, bool)
46 META_API_INTERFACE_PROPERTY_CACHED(Node, LayerMask, uint64_t)
47 META_API_INTERFACE_PROPERTY_CACHED(Node, LocalMatrix, BASE_NS::Math::Mat4X4)
48 META_API_INTERFACE_PROPERTY_CACHED(Camera, FoV, float)
49 META_API_INTERFACE_PROPERTY_CACHED(Camera, AspectRatio, float)
50 META_API_INTERFACE_PROPERTY_CACHED(Camera, NearPlane, float)
51 META_API_INTERFACE_PROPERTY_CACHED(Camera, FarPlane, float)
52 META_API_INTERFACE_PROPERTY_CACHED(Camera, XOffset, float)
53 META_API_INTERFACE_PROPERTY_CACHED(Camera, YOffset, float)
54 META_API_INTERFACE_PROPERTY_CACHED(Camera, Projection, uint8_t)
55 META_API_INTERFACE_PROPERTY_CACHED(Camera, Culling, uint8_t)
56 META_API_INTERFACE_PROPERTY_CACHED(Camera, RenderingPipeline, uint8_t)
57 META_API_INTERFACE_PROPERTY_CACHED(Camera, SceneFlags, uint32_t)
58 META_API_INTERFACE_PROPERTY_CACHED(Camera, PipelineFlags, uint32_t)
59 META_API_INTERFACE_PROPERTY_CACHED(Camera, Viewport, BASE_NS::Math::Vec4)
60 META_API_INTERFACE_PROPERTY_CACHED(Camera, Scissor, BASE_NS::Math::Vec4)
61 META_API_INTERFACE_PROPERTY_CACHED(Camera, RenderTargetSize, BASE_NS::Math::UVec2)
62 META_API_INTERFACE_PROPERTY_CACHED(Camera, ClearColor, SCENE_NS::Color)
63 META_API_INTERFACE_PROPERTY_CACHED(Camera, ClearDepth, float)
64 MAP_PROPERTY_TO_USER(Camera, PostProcess)
65
66 /**
67 * @brief Set camera to use orthographic projection with default property values
68 */
69 void SetOrthographicProjection()
70 {
71 if (Projection()->GetValue() != SCENE_NS::ICamera::SCENE_CAM_PROJECTION_ORTHOGRAPHIC) {
72 auto renderSize = RenderTargetSize()->GetValue();
73 XOffset()->SetValue(renderSize.x / 2);
74 YOffset()->SetValue(renderSize.y / 2);
75 Projection()->SetValue(SCENE_NS::ICamera::SCENE_CAM_PROJECTION_ORTHOGRAPHIC);
76 }
77 }
78
79 /**
80 * @brief Set camera to use perspective projection. This is on by default.
81 */
82 void SetPerspectiveProjection()
83 {
84 META_API_CACHED_INTERFACE(Camera)->Projection()->SetValue(SCENE_NS::ICamera::SCENE_CAM_PROJECTION_PERSPECTIVE);
85 }
86
87 /**
88 * @brief Construct Camera instance from ICamera strong pointer.
89 * @param node the object pointed by interface is kept alive
90 */
91 explicit Camera(const INode::Ptr& node)
92 {
93 Initialize(interface_pointer_cast<META_NS::IObject>(node));
94 }
95
96 /**
97 * @brief Construct Camera instance from ICamera strong pointer.
98 * @param node the object pointed by interface is kept alive
99 */
100 explicit Camera(const ICamera::Ptr& node)
101 {
102 Initialize(interface_pointer_cast<META_NS::IObject>(node));
103 }
104
105 /**
106 * @brief Gets OnLoaded event reference from INode-interface
107 * @return INode::OnLoaded
108 */
109 auto OnLoaded()
110 {
111 return META_API_CACHED_INTERFACE(Node)->OnLoaded();
112 }
113
114 /**
115 * @brief Runs a callback once the camera is loaded. If camera is already initialized, callback will not run.
116 * @param callback Code to run, if strong reference is passed, it will keep the instance alive
117 * causing engine to report memory leak on application exit.
118 * @return reference to this instance of Camera.
119 */
120 template<class Callback>
121 auto OnLoaded(Callback&& callback)
122 {
123 OnLoaded()->AddHandler(META_NS::MakeCallback<META_NS::IOnChanged>(callback));
124 return *this;
125 }
126
127 void AddMultiviewCamera(Camera camera)
128 {
129 META_API_CACHED_INTERFACE(Camera)->AddMultiviewCamera(camera);
130 }
131
132 void RemoveMultiviewCamera(Camera camera)
133 {
134 META_API_CACHED_INTERFACE(Camera)->RemoveMultiviewCamera(camera);
135 }
136 };
137
138 SCENE_END_NAMESPACE()
139
140 #endif // SCENEPLUGINAPI_CAMERA_H
141