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