summaryrefslogtreecommitdiff
path: root/src/3d/scene_loader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/3d/scene_loader.cc')
-rw-r--r--src/3d/scene_loader.cc31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/3d/scene_loader.cc b/src/3d/scene_loader.cc
index 669fac8..286edca 100644
--- a/src/3d/scene_loader.cc
+++ b/src/3d/scene_loader.cc
@@ -1,9 +1,12 @@
#include "3d/scene_loader.h"
#include "generated/assets.h"
+#include "plane_data.h"
#include "util/asset_manager.h"
#include "util/mini_math.h"
#include <cstdio>
#include <cstring>
+#include <memory> // For std::shared_ptr
+#include <new> // For std::nothrow
#include <vector>
bool SceneLoader::LoadScene(Scene& scene, const uint8_t* data, size_t size) {
@@ -73,17 +76,31 @@ bool SceneLoader::LoadScene(Scene& scene, const uint8_t* data, size_t size) {
offset += 4;
vec3 scale(sx, sy, sz);
+ // Color components (cr, cg, cb, ca)
float cr = *reinterpret_cast<const float*>(data + offset);
offset += 4;
float cg = *reinterpret_cast<const float*>(data + offset);
offset += 4;
float cb = *reinterpret_cast<const float*>(data + offset);
offset += 4;
+ // Read ca, advance offset AFTER reading ca, then construct color
float ca = *reinterpret_cast<const float*>(data + offset);
- offset += 4;
+ offset += 4; // Offset is now after ca
vec4 color(cr, cg, cb, ca);
+ // Plane Distance (if type == PLANE)
+ float plane_distance = 0.0f;
+ if (type == ObjectType::PLANE) {
+ // Check bounds before reading plane_distance
+ if (offset + 4 > size)
+ return false;
+ plane_distance = *reinterpret_cast<const float*>(data + offset);
+ offset += 4; // Advance offset after reading plane_distance
+ }
+
// Mesh Asset Name Length
+ // The offset is now correctly positioned for name_len,
+ // either after ca (if not PLANE) or after plane_distance (if PLANE).
if (offset + 4 > size)
return false;
uint32_t name_len = *reinterpret_cast<const uint32_t*>(data + offset);
@@ -132,6 +149,18 @@ bool SceneLoader::LoadScene(Scene& scene, const uint8_t* data, size_t size) {
obj.is_static = is_static;
// user_data is nullptr by default
+ // Store plane distance in shared_user_data if it's a plane
+ if (type == ObjectType::PLANE) {
+ // Allocate PlaneData on the heap and manage with shared_ptr
+ // Use std::make_shared for exception safety and efficiency
+ obj.shared_user_data = std::make_shared<PlaneData>();
+ // Assign the plane distance
+ // Safely cast void* to PlaneData* using static_cast on the shared_ptr's
+ // get()
+ static_cast<PlaneData*>(obj.shared_user_data.get())->distance =
+ plane_distance;
+ }
+
// Add to scene
scene.add_object(obj);
}