PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
component_node_readers.h
1#pragma once
2
3#include "pixelbullet/scene/components/animation_state_component.h"
4#include "pixelbullet/scene/components/audio_listener_component.h"
5#include "pixelbullet/scene/components/audio_source_component.h"
6#include "pixelbullet/scene/components/camera_component.h"
7#include "pixelbullet/scene/components/collider_component.h"
8#include "pixelbullet/scene/components/directional_light_component.h"
9#include "pixelbullet/scene/components/material_uv_transform_component.h"
10#include "pixelbullet/scene/components/mesh_renderer.h"
11#include "pixelbullet/scene/components/morph_mesh_renderer.h"
12#include "pixelbullet/scene/components/morph_weights_animation_component.h"
13#include "pixelbullet/scene/components/morph_weights_component.h"
14#include "pixelbullet/scene/components/name.h"
15#include "pixelbullet/scene/components/point_light_component.h"
16#include "pixelbullet/scene/components/prefab_instance_component.h"
17#include "pixelbullet/scene/components/prefab_transform_overrides_component.h"
18#include "pixelbullet/scene/components/rigid_body_component.h"
19#include "pixelbullet/scene/components/skeleton_animation_component.h"
20#include "pixelbullet/scene/components/skinned_mesh_renderer.h"
21#include "pixelbullet/scene/components/skinned_morph_mesh_renderer.h"
22#include "pixelbullet/scene/components/spot_light_component.h"
23#include "pixelbullet/scene/components/sprite_renderer.h"
24#include "pixelbullet/scene/components/transform.h"
25#include "pixelbullet/scene/components/transform_animation_component.h"
26#include "pixelbullet/scene/components/transform_parent_component.h"
27#include "pixelbullet/serialization/node_reader.h"
28
29#include <algorithm>
30#include <utility>
31
32namespace pixelbullet
33{
34[[nodiscard]] inline bool TryReadNode(const Node& node, AnimationStateComponent& component, serialization::NodeReader& reader)
35{
36 component = AnimationStateComponent{};
37 bool ok = true;
38 ok &= serialization::TryReadOptionalProperty(node, "enabled", component.enabled, reader);
39 ok &= serialization::TryReadOptionalProperty(node, "activeClip", component.active_clip, reader);
40 return ok;
41}
42
43[[nodiscard]] inline bool TryReadNode(const Node& node, AudioListenerComponent& component, serialization::NodeReader& reader)
44{
45 component = AudioListenerComponent{};
46 return serialization::TryReadOptionalProperty(node, "enabled", component.enabled, reader);
47}
48
49[[nodiscard]] inline bool TryReadNode(const Node& node, AudioSourceComponent& component, serialization::NodeReader& reader)
50{
51 component = AudioSourceComponent{};
52 bool ok = true;
53 ok &= serialization::TryReadOptionalProperty(node, "enabled", component.enabled, reader);
54 ok &= serialization::TryReadOptionalProperty(node, "clip", component.clip, reader);
55 ok &= serialization::TryReadOptionalProperty(node, "autoplay", component.autoplay, reader);
56 ok &= serialization::TryReadOptionalProperty(node, "loop", component.loop, reader);
57 ok &= serialization::TryReadOptionalProperty(node, "volume", component.volume, reader);
58 ok &= serialization::TryReadOptionalProperty(node, "spatial", component.spatial_settings.enabled, reader);
59 ok &= serialization::TryReadOptionalProperty(node, "minDistance", component.spatial_settings.min_distance, reader);
60 ok &= serialization::TryReadOptionalProperty(node, "maxDistance", component.spatial_settings.max_distance, reader);
61 ok &= serialization::TryReadOptionalProperty(node, "loadMode", component.load_mode, reader);
62 return ok;
63}
64
65[[nodiscard]] inline bool TryReadNode(const Node& node, CameraProjectionMode& value, serialization::NodeReader& reader)
66{
67 std::string serialized;
68 if (!serialization::TryReadNode(node, serialized, reader))
69 {
70 return false;
71 }
72 value = serialized == "Orthographic" ? CameraProjectionMode::Orthographic : CameraProjectionMode::Perspective;
73 return true;
74}
75
76[[nodiscard]] inline bool TryReadNode(const Node& node, CameraComponent& camera, serialization::NodeReader& reader)
77{
78 camera = CameraComponent{};
79 bool ok = true;
80 ok &= serialization::TryReadRequiredProperty(node, "primary", camera.primary, reader);
81 ok &= serialization::TryReadRequiredProperty(node, "fieldOfViewDegrees", camera.field_of_view_degrees, reader);
82 ok &= serialization::TryReadRequiredProperty(node, "nearPlane", camera.near_plane, reader);
83 ok &= serialization::TryReadRequiredProperty(node, "farPlane", camera.far_plane, reader);
84 ok &= serialization::TryReadOptionalProperty(node, "projectionMode", camera.projection_mode, reader);
85 ok &= serialization::TryReadOptionalProperty(node, "orthographicXMag", camera.orthographic_x_mag, reader);
86 ok &= serialization::TryReadOptionalProperty(node, "orthographicYMag", camera.orthographic_y_mag, reader);
87 return ok;
88}
89
90[[nodiscard]] inline bool TryReadNode(const Node& node, ColliderComponent& component, serialization::NodeReader& reader)
91{
92 component = ColliderComponent{};
93 bool ok = true;
94 ok &= serialization::TryReadOptionalProperty(node, "enabled", component.enabled, reader);
95 ok &= serialization::TryReadOptionalProperty(node, "shape", component.shape, reader);
96 ok &= serialization::TryReadOptionalProperty(node, "boxHalfExtents", component.box_half_extents, reader);
97 ok &= serialization::TryReadOptionalProperty(node, "sphereRadius", component.sphere_radius, reader);
98 ok &= serialization::TryReadOptionalProperty(node, "capsuleRadius", component.capsule_radius, reader);
99 ok &= serialization::TryReadOptionalProperty(node, "capsuleHalfHeight", component.capsule_half_height, reader);
100 ok &= serialization::TryReadOptionalProperty(node, "center", component.center, reader);
101 ok &= serialization::TryReadOptionalProperty(node, "friction", component.friction, reader);
102 ok &= serialization::TryReadOptionalProperty(node, "restitution", component.restitution, reader);
103 ok &= serialization::TryReadOptionalProperty(node, "isTrigger", component.is_trigger, reader);
104 return ok;
105}
106
107[[nodiscard]] inline bool TryReadNode(const Node& node, DirectionalLightComponent& light, serialization::NodeReader& reader)
108{
110 bool ok = true;
111 ok &= serialization::TryReadRequiredProperty(node, "enabled", light.enabled, reader);
112 ok &= serialization::TryReadRequiredProperty(node, "color", light.color, reader);
113 ok &= serialization::TryReadRequiredProperty(node, "intensity", light.intensity, reader);
114 ok &= serialization::TryReadOptionalProperty(node, "shadowEnabled", light.shadow_enabled, reader);
115 ok &= serialization::TryReadOptionalProperty(node, "shadowStrength", light.shadow_strength, reader);
116 ok &= serialization::TryReadOptionalProperty(node, "shadowBias", light.shadow_bias, reader);
117 ok &= serialization::TryReadOptionalProperty(node, "shadowNormalBias", light.shadow_normal_bias, reader);
118 ok &= serialization::TryReadOptionalProperty(node, "shadowDistance", light.shadow_distance, reader);
119 return ok;
120}
121
122[[nodiscard]] inline bool TryReadNode(const Node& node, MaterialUvTransformComponent& component, serialization::NodeReader& reader)
123{
124 component = MaterialUvTransformComponent{};
125 return serialization::TryReadOptionalProperty(node, "transform", component.transform, reader);
126}
127
128[[nodiscard]] inline bool TryReadNode(const Node& node, MeshRenderer& mesh_renderer, serialization::NodeReader& reader)
129{
130 mesh_renderer = MeshRenderer{};
131 bool ok = true;
132 ok &= serialization::TryReadRequiredProperty(node, "mesh", mesh_renderer.mesh, reader);
133 ok &= serialization::TryReadRequiredProperty(node, "material", mesh_renderer.material, reader);
134 ok &= serialization::TryReadRequiredProperty(node, "visible", mesh_renderer.visible, reader);
135 return ok;
136}
137
138[[nodiscard]] inline bool TryReadNode(const Node& node, MorphMeshRenderer& renderer, serialization::NodeReader& reader)
139{
140 renderer = MorphMeshRenderer{};
141 bool ok = true;
142 ok &= serialization::TryReadRequiredProperty(node, "mesh", renderer.mesh, reader);
143 ok &= serialization::TryReadRequiredProperty(node, "material", renderer.material, reader);
144 ok &= serialization::TryReadOptionalProperty(node, "weightsSource", renderer.weights_source, reader);
145 ok &= serialization::TryReadRequiredProperty(node, "visible", renderer.visible, reader);
146 return ok;
147}
148
149[[nodiscard]] inline bool TryReadNode(const Node& node, MorphWeightsKeyframe& keyframe, serialization::NodeReader& reader)
150{
151 keyframe = MorphWeightsKeyframe{};
152 bool ok = true;
153 ok &= serialization::TryReadRequiredProperty(node, "timeSeconds", keyframe.time_seconds, reader);
154 ok &= serialization::TryReadOptionalProperty(node, "weights", keyframe.weights, reader);
155 keyframe.time_seconds = std::max(keyframe.time_seconds, 0.0f);
156 return ok;
157}
158
159[[nodiscard]] inline bool TryReadNode(const Node& node, MorphWeightsAnimationClip& clip, serialization::NodeReader& reader)
160{
162 bool ok = true;
163 ok &= serialization::TryReadOptionalProperty(node, "name", clip.name, reader);
164 ok &= serialization::TryReadOptionalProperty(node, "keys", clip.keys, reader);
165 NormalizeMorphWeightsAnimationClip(clip);
166 return ok;
167}
168
169[[nodiscard]] inline bool TryReadNode(const Node& node, MorphWeightsAnimationComponent& component, serialization::NodeReader& reader)
170{
171 component = MorphWeightsAnimationComponent{};
172 bool ok = true;
173 if (node.has_property("clips"))
174 {
175 ok &= serialization::TryReadOptionalProperty(node, "clips", component.clips, reader);
176 }
177 else
178 {
180 clip.name = "Default";
181 ok &= serialization::TryReadOptionalProperty(node, "keys", clip.keys, reader);
182 bool legacy_enabled = true;
183 ok &= serialization::TryReadOptionalProperty(node, "enabled", legacy_enabled, reader);
184 NormalizeMorphWeightsAnimationClip(clip);
185 if (!clip.keys.empty() || node.has_property("enabled"))
186 {
187 component.clips.push_back(std::move(clip));
188 }
189 }
190 NormalizeMorphWeightsAnimationComponent(component);
191 return ok;
192}
193
194[[nodiscard]] inline bool TryReadNode(const Node& node, MorphWeightsComponent& component, serialization::NodeReader& reader)
195{
196 component = MorphWeightsComponent{};
197 return serialization::TryReadOptionalProperty(node, "weights", component.weights, reader);
198}
199
200[[nodiscard]] inline bool TryReadNode(const Node& node, Name& name, serialization::NodeReader& reader)
201{
202 name = Name{};
203 return serialization::TryReadRequiredProperty(node, "value", name.value, reader);
204}
205
206[[nodiscard]] inline bool TryReadNode(const Node& node, PointLightComponent& light, serialization::NodeReader& reader)
207{
208 light = PointLightComponent{};
209 bool ok = true;
210 ok &= serialization::TryReadRequiredProperty(node, "enabled", light.enabled, reader);
211 ok &= serialization::TryReadRequiredProperty(node, "color", light.color, reader);
212 ok &= serialization::TryReadRequiredProperty(node, "intensity", light.intensity, reader);
213 ok &= serialization::TryReadRequiredProperty(node, "range", light.range, reader);
214 return ok;
215}
216
217[[nodiscard]] inline bool TryReadNode(const Node& node, PrefabInstanceComponent& component, serialization::NodeReader& reader)
218{
219 component = PrefabInstanceComponent{};
220 return serialization::TryReadRequiredProperty(node, "prefabPath", component.prefab_path, reader);
221}
222
223[[nodiscard]] inline bool TryReadNode(const Node& node, PrefabTransformOverrideEntry& entry, serialization::NodeReader& reader)
224{
226 bool ok = true;
227 ok &= serialization::TryReadOptionalProperty(node, "entity", entry.prefab_entity, reader);
228 ok &= serialization::TryReadOptionalProperty(node, "transform", entry.transform, reader);
229 return ok;
230}
231
232[[nodiscard]] inline bool TryReadNode(const Node& node, PrefabTransformOverridesComponent& component, serialization::NodeReader& reader)
233{
235 const bool ok = serialization::TryReadOptionalProperty(node, "transformOverrides", component.transform_overrides, reader);
236 NormalizePrefabTransformOverrideEntries(component.transform_overrides);
237 return ok;
238}
239
240[[nodiscard]] inline bool TryReadNode(const Node& node, RigidBodyComponent& component, serialization::NodeReader& reader)
241{
242 component = RigidBodyComponent{};
243 bool ok = true;
244 ok &= serialization::TryReadOptionalProperty(node, "enabled", component.enabled, reader);
245 ok &= serialization::TryReadOptionalProperty(node, "motionType", component.motion_type, reader);
246 ok &= serialization::TryReadOptionalProperty(node, "mass", component.mass, reader);
247 ok &= serialization::TryReadOptionalProperty(node, "linearDamping", component.linear_damping, reader);
248 ok &= serialization::TryReadOptionalProperty(node, "angularDamping", component.angular_damping, reader);
249 ok &= serialization::TryReadOptionalProperty(node, "gravityScale", component.gravity_scale, reader);
250 return ok;
251}
252
253[[nodiscard]] inline bool TryReadNode(const Node& node, SkeletonAnimationClipBinding& clip, serialization::NodeReader& reader)
254{
256 bool ok = true;
257 ok &= serialization::TryReadOptionalProperty(node, "name", clip.name, reader);
258 ok &= serialization::TryReadRequiredProperty(node, "clipAsset", clip.clip_asset, reader);
259 return ok;
260}
261
262[[nodiscard]] inline bool TryReadNode(const Node& node, SkeletonAnimationComponent& component, serialization::NodeReader& reader)
263{
264 component = SkeletonAnimationComponent{};
265 bool ok = true;
266 ok &= serialization::TryReadRequiredProperty(node, "skeletonAsset", component.skeleton_asset, reader);
267 ok &= serialization::TryReadOptionalProperty(node, "jointEntities", component.joint_entities, reader);
268 ok &= serialization::TryReadOptionalProperty(node, "clips", component.clips, reader);
269 bool legacy_enabled = true;
270 ok &= serialization::TryReadOptionalProperty(node, "enabled", legacy_enabled, reader);
271 NormalizeSkeletonAnimationComponent(component);
272 return ok;
273}
274
275[[nodiscard]] inline bool TryReadNode(const Node& node, SkinnedMeshRenderer& renderer, serialization::NodeReader& reader)
276{
277 renderer = SkinnedMeshRenderer{};
278 bool ok = true;
279 ok &= serialization::TryReadRequiredProperty(node, "mesh", renderer.mesh, reader);
280 ok &= serialization::TryReadRequiredProperty(node, "material", renderer.material, reader);
281 ok &= serialization::TryReadOptionalProperty(node, "joints", renderer.joints, reader);
282 ok &= serialization::TryReadRequiredProperty(node, "visible", renderer.visible, reader);
283 return ok;
284}
285
286[[nodiscard]] inline bool TryReadNode(const Node& node, SkinnedMorphMeshRenderer& renderer, serialization::NodeReader& reader)
287{
288 renderer = SkinnedMorphMeshRenderer{};
289 bool ok = true;
290 ok &= serialization::TryReadRequiredProperty(node, "mesh", renderer.mesh, reader);
291 ok &= serialization::TryReadRequiredProperty(node, "material", renderer.material, reader);
292 ok &= serialization::TryReadOptionalProperty(node, "joints", renderer.joints, reader);
293 ok &= serialization::TryReadOptionalProperty(node, "weightsSource", renderer.weights_source, reader);
294 ok &= serialization::TryReadRequiredProperty(node, "visible", renderer.visible, reader);
295 return ok;
296}
297
298[[nodiscard]] inline bool TryReadNode(const Node& node, SpotLightComponent& light, serialization::NodeReader& reader)
299{
300 light = SpotLightComponent{};
301 bool ok = true;
302 ok &= serialization::TryReadRequiredProperty(node, "enabled", light.enabled, reader);
303 ok &= serialization::TryReadRequiredProperty(node, "color", light.color, reader);
304 ok &= serialization::TryReadRequiredProperty(node, "intensity", light.intensity, reader);
305 ok &= serialization::TryReadRequiredProperty(node, "range", light.range, reader);
306 ok &= serialization::TryReadOptionalProperty(node, "innerConeAngleDegrees", light.inner_cone_angle_degrees, reader);
307 ok &= serialization::TryReadOptionalProperty(node, "outerConeAngleDegrees", light.outer_cone_angle_degrees, reader);
308 return ok;
309}
310
311[[nodiscard]] inline bool TryReadNode(const Node& node, SpriteRenderer& sprite, serialization::NodeReader& reader)
312{
313 sprite = SpriteRenderer{};
314 bool ok = true;
315 ok &= serialization::TryReadRequiredProperty(node, "texture", sprite.texture, reader);
316 ok &= serialization::TryReadRequiredProperty(node, "tint", sprite.tint, reader);
317 ok &= serialization::TryReadRequiredProperty(node, "uvScale", sprite.uv_scale, reader);
318 ok &= serialization::TryReadRequiredProperty(node, "uvOffset", sprite.uv_offset, reader);
319 ok &= serialization::TryReadRequiredProperty(node, "visible", sprite.visible, reader);
320 return ok;
321}
322
323[[nodiscard]] inline bool TryReadNode(const Node& node, Transform& transform, serialization::NodeReader& reader)
324{
325 transform = Transform{};
326 bool ok = true;
327 ok &= serialization::TryReadRequiredProperty(node, "position", transform.position, reader);
328 ok &= serialization::TryReadRequiredProperty(node, "rotation", transform.rotation, reader);
329 ok &= serialization::TryReadRequiredProperty(node, "scale", transform.scale, reader);
330 return ok;
331}
332
333[[nodiscard]] inline bool TryReadNode(const Node& node, TransformKeyframe& keyframe, serialization::NodeReader& reader)
334{
335 keyframe = TransformKeyframe{};
336 bool ok = true;
337 ok &= serialization::TryReadRequiredProperty(node, "timeSeconds", keyframe.time_seconds, reader);
338 ok &= serialization::TryReadRequiredProperty(node, "position", keyframe.transform.position, reader);
339 ok &= serialization::TryReadRequiredProperty(node, "rotation", keyframe.transform.rotation, reader);
340 ok &= serialization::TryReadRequiredProperty(node, "scale", keyframe.transform.scale, reader);
341 keyframe.time_seconds = std::max(keyframe.time_seconds, 0.0f);
342 return ok;
343}
344
345[[nodiscard]] inline bool TryReadNode(const Node& node, TransformAnimationClip& clip, serialization::NodeReader& reader)
346{
347 clip = TransformAnimationClip{};
348 bool ok = true;
349 ok &= serialization::TryReadOptionalProperty(node, "name", clip.name, reader);
350 ok &= serialization::TryReadOptionalProperty(node, "keys", clip.keys, reader);
351 NormalizeTransformAnimationClip(clip);
352 return ok;
353}
354
355[[nodiscard]] inline bool TryReadNode(const Node& node, TransformAnimationComponent& component, serialization::NodeReader& reader)
356{
357 component = TransformAnimationComponent{};
358 bool ok = true;
359 if (node.has_property("clips"))
360 {
361 ok &= serialization::TryReadOptionalProperty(node, "clips", component.clips, reader);
362 }
363 else
364 {
366 clip.name = "Default";
367 ok &= serialization::TryReadOptionalProperty(node, "keys", clip.keys, reader);
368 bool legacy_enabled = true;
369 ok &= serialization::TryReadOptionalProperty(node, "enabled", legacy_enabled, reader);
370 NormalizeTransformAnimationClip(clip);
371 if (!clip.keys.empty() || node.has_property("enabled"))
372 {
373 component.clips.push_back(std::move(clip));
374 }
375 }
376 NormalizeTransformAnimationComponent(component);
377 return ok;
378}
379
380[[nodiscard]] inline bool TryReadNode(const Node& node, TransformParentComponent& component, serialization::NodeReader& reader)
381{
382 component = TransformParentComponent{};
383 return serialization::TryReadRequiredProperty(node, "parent", component.parent, reader);
384}
385} // namespace pixelbullet
Represents a hierarchical node capable of storing various data types and supporting YAML serializatio...
Definition node.h:49
Definition node_reader.h:48
Definition animation_state_component.h:10
Definition audio_listener_component.h:8
Definition audio_source_component.h:13
Definition camera_component.h:43
Definition collider_component.h:11
Definition directional_light_component.h:8
Definition material_uv_transform_component.h:8
Definition mesh_renderer.h:10
Definition morph_mesh_renderer.h:11
Definition morph_weights_animation_component.h:64
Definition morph_weights_animation_component.h:100
Definition morph_weights_component.h:10
Definition morph_weights_animation_component.h:16
Definition name.h:11
Definition point_light_component.h:8
Definition prefab_instance_component.h:10
Definition prefab_transform_overrides_component.h:21
Definition prefab_transform_overrides_component.h:82
Definition rigid_body_component.h:10
Definition skeleton_animation_component.h:17
Definition skeleton_animation_component.h:33
Definition skinned_mesh_renderer.h:13
Definition skinned_morph_mesh_renderer.h:13
Definition spot_light_component.h:8
Definition sprite_renderer.h:12
Definition transform_animation_component.h:65
Definition transform_animation_component.h:91
Definition transform_animation_component.h:16
Definition transform_parent_component.h:8
Definition transform.h:14