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 #include "render_data_store_default_camera.h"
17 
18 #include <cinttypes>
19 #include <cstddef>
20 
21 #include <3d/render/default_material_constants.h>
22 #include <3d/render/intf_render_data_store_default_camera.h>
23 #include <base/containers/array_view.h>
24 #include <base/containers/fixed_string.h>
25 
26 CORE3D_BEGIN_NAMESPACE()
27 using namespace BASE_NS;
28 
RenderDataStoreDefaultCamera(const string_view name)29 RenderDataStoreDefaultCamera::RenderDataStoreDefaultCamera(const string_view name) : name_(name) {}
30 
PostRender()31 void RenderDataStoreDefaultCamera::PostRender()
32 {
33     Clear();
34 }
35 
Clear()36 void RenderDataStoreDefaultCamera::Clear()
37 {
38     cameras_.clear();
39     environments_.clear();
40 }
41 
AddCamera(const RenderCamera & camera)42 void RenderDataStoreDefaultCamera::AddCamera(const RenderCamera& camera)
43 {
44     if (const uint32_t arrIdx = static_cast<uint32_t>(cameras_.size());
45         arrIdx < DefaultMaterialCameraConstants::MAX_CAMERA_COUNT) {
46 #if (CORE3D_VALIDATION_ENABLED == 1)
47         if ((camera.id != RenderSceneDataConstants::INVALID_ID) || (!camera.name.empty())) {
48             for (const auto& cam : cameras_) {
49                 if ((camera.id == cam.id) || ((!camera.name.empty()) && (camera.name == cam.name))) {
50                     CORE_LOG_ONCE_W(to_string(camera.id) + camera.name,
51                         "CORE_VALIDATION: non unique camera id: %" PRIu64 " or name: %s", camera.id,
52                         camera.name.c_str());
53                 }
54             }
55         }
56 #endif
57         cameras_.push_back(camera);
58     } else {
59 #if (CORE3D_VALIDATION_ENABLED == 1)
60         CORE_LOG_ONCE_W("drop_camera_count_full", "CORE3D_VALIDATION: camera dropped (max count: %u)",
61             DefaultMaterialCameraConstants::MAX_CAMERA_COUNT);
62 #endif
63     }
64 }
65 
AddEnvironment(const RenderCamera::Environment & environment)66 void RenderDataStoreDefaultCamera::AddEnvironment(const RenderCamera::Environment& environment)
67 {
68 #if (CORE3D_VALIDATION_ENABLED == 1)
69     if (environment.id != RenderSceneDataConstants::INVALID_ID) {
70         for (const auto& env : environments_) {
71             if (environment.id == env.id) {
72                 CORE_LOG_ONCE_W("rdsdc_add_env" + to_string(environment.id),
73                     "CORE_VALIDATION: non unique camera id: %" PRIu64, env.id);
74             }
75         }
76     }
77 #endif
78     // NOTE: there's only per camera environment limit at the moment, no environment limit for scene
79     environments_.push_back(environment);
80 }
81 
GetCameras() const82 array_view<const RenderCamera> RenderDataStoreDefaultCamera::GetCameras() const
83 {
84     return array_view<const RenderCamera>(cameras_.data(), cameras_.size());
85 }
86 
GetCamera(const string_view name) const87 RenderCamera RenderDataStoreDefaultCamera::GetCamera(const string_view name) const
88 {
89     for (const auto& cam : cameras_) {
90         if (cam.name == name) {
91             return cam;
92         }
93     }
94     return {};
95 }
96 
GetCamera(const uint64_t id) const97 RenderCamera RenderDataStoreDefaultCamera::GetCamera(const uint64_t id) const
98 {
99     for (const auto& cam : cameras_) {
100         if (cam.id == id) {
101             return cam;
102         }
103     }
104     return {};
105 }
106 
GetCameraIndex(const string_view name) const107 uint32_t RenderDataStoreDefaultCamera::GetCameraIndex(const string_view name) const
108 {
109     for (uint32_t idx = 0; idx < static_cast<uint32_t>(cameras_.size()); ++idx) {
110         if (cameras_[idx].name == name) {
111             return idx;
112         }
113     }
114     return ~0u;
115 }
116 
GetCameraIndex(const uint64_t id) const117 uint32_t RenderDataStoreDefaultCamera::GetCameraIndex(const uint64_t id) const
118 {
119     for (uint32_t idx = 0; idx < static_cast<uint32_t>(cameras_.size()); ++idx) {
120         if (cameras_[idx].id == id) {
121             return idx;
122         }
123     }
124     return ~0u;
125 }
126 
GetCameraCount() const127 uint32_t RenderDataStoreDefaultCamera::GetCameraCount() const
128 {
129     return static_cast<uint32_t>(cameras_.size());
130 }
131 
GetEnvironments() const132 array_view<const RenderCamera::Environment> RenderDataStoreDefaultCamera::GetEnvironments() const
133 {
134     return environments_;
135 }
136 
GetEnvironment(const uint64_t id) const137 RenderCamera::Environment RenderDataStoreDefaultCamera::GetEnvironment(const uint64_t id) const
138 {
139     for (const auto& envRef : environments_) {
140         if (envRef.id == id) {
141             return envRef;
142         }
143     }
144     return {};
145 }
146 
GetEnvironmentCount() const147 uint32_t RenderDataStoreDefaultCamera::GetEnvironmentCount() const
148 {
149     return static_cast<uint32_t>(environments_.size());
150 }
151 
Create(RENDER_NS::IRenderContext &,char const * name)152 RENDER_NS::IRenderDataStore* RenderDataStoreDefaultCamera::Create(RENDER_NS::IRenderContext&, char const* name)
153 {
154     // device not used
155     return new RenderDataStoreDefaultCamera(name);
156 }
157 
Destroy(IRenderDataStore * instance)158 void RenderDataStoreDefaultCamera::Destroy(IRenderDataStore* instance)
159 {
160     delete static_cast<RenderDataStoreDefaultCamera*>(instance);
161 }
162 CORE3D_END_NAMESPACE()
163