@@ -733,6 +733,7 @@ void VKFW::Tools::Loaders::load_PNG(Core::Texture* const texture,
733733 texture->set_image_cache (imgCache, {static_cast <unsigned int >(w), static_cast <unsigned int >(h), 1 }, 4 );
734734 // Set automatically teh optimal format for each type.
735735 // User can override it after, I he need some other more specific format ...
736+ texture->set_file_route (fileName);
736737 switch (textureFormat)
737738 {
738739 case TEXTURE_FORMAT_SRGB:
@@ -765,6 +766,8 @@ void VKFW::Tools::Loaders::load_HDRi(Core::TextureHDR* const texture, const std:
765766 {
766767 texture->set_image_cache (HDRcache, {static_cast <unsigned int >(w), static_cast <unsigned int >(h), 1 }, 4 );
767768 texture->set_format (SRGBA_32F);
769+ texture->set_file_route (fileName);
770+
768771 } else
769772 {
770773#ifndef NDEBUG
@@ -795,6 +798,8 @@ void VKFW::Tools::Loaders::load_3D_texture(Core::ITexture* const texture,
795798 4 );
796799 // Set automatically the optimal format for each type.
797800 // User can override it after, I he need some other more specific format ...
801+ texture->set_file_route (fileName);
802+
798803 switch (textureFormat)
799804 {
800805 case TEXTURE_FORMAT_SRGB:
@@ -852,6 +857,39 @@ VKFW::Core::Transform VKFW::Tools::Loaders::SceneLoader::load_transform(tinyxml2
852857 return transform;
853858}
854859
860+ void VKFW::Tools::Loaders::SceneLoader::save_transform (const Core::Transform& transform,
861+ tinyxml2::XMLElement* parentElement) {
862+ tinyxml2::XMLDocument* doc = parentElement->GetDocument ();
863+
864+ if (!doc)
865+ return ;
866+
867+ tinyxml2::XMLElement* transformElement = doc->NewElement (" Transform" );
868+
869+ // Save position
870+ tinyxml2::XMLElement* positionElement = doc->NewElement (" translate" );
871+ positionElement->SetAttribute (" x" , transform.position .x );
872+ positionElement->SetAttribute (" y" , transform.position .y );
873+ positionElement->SetAttribute (" z" , transform.position .z );
874+ transformElement->InsertEndChild (positionElement);
875+
876+ // Save rotation
877+ tinyxml2::XMLElement* rotationElement = doc->NewElement (" rotate" );
878+ rotationElement->SetAttribute (" x" , math::degrees (transform.rotation .x ));
879+ rotationElement->SetAttribute (" y" , math::degrees (transform.rotation .y ));
880+ rotationElement->SetAttribute (" z" , math::degrees (transform.rotation .z ));
881+ transformElement->InsertEndChild (rotationElement);
882+
883+ // Save scale
884+ tinyxml2::XMLElement* scaleElement = doc->NewElement (" scale" );
885+ scaleElement->SetAttribute (" x" , transform.scale .x );
886+ scaleElement->SetAttribute (" y" , transform.scale .y );
887+ scaleElement->SetAttribute (" z" , transform.scale .z );
888+ transformElement->InsertEndChild (scaleElement);
889+
890+ // Attach the transform element to the parent
891+ parentElement->InsertEndChild (transformElement);
892+ }
855893void VKFW::Tools::Loaders::SceneLoader::load_children (tinyxml2::XMLElement* element,
856894 Core::Object3D* const parent,
857895 std::string resourcesPath) {
@@ -1257,3 +1295,71 @@ void VKFW::Tools::Loaders::SceneLoader::load_scene(Core::Scene* const scene, con
12571295 scene->set_ambient_intensity (0 .0f );
12581296 }
12591297}
1298+
1299+ void VKFW::Tools::Loaders::SceneLoader::save_scene (Core::Scene* const scene, const std::string fileName) {
1300+ if (!scene)
1301+ {
1302+ throw VKFW_Exception (" Scene is null pointer" );
1303+ }
1304+
1305+ tinyxml2::XMLDocument doc;
1306+ tinyxml2::XMLElement* sceneElement = doc.NewElement (" Scene" );
1307+
1308+ doc.InsertFirstChild (sceneElement);
1309+
1310+ tinyxml2::XMLElement* resourcesElement = doc.NewElement (" Resources" );
1311+ resourcesElement->SetAttribute (" path" , " " );
1312+ sceneElement->InsertEndChild (resourcesElement);
1313+
1314+ // Save camera
1315+ Core::Camera* camera = scene->get_active_camera ();
1316+ if (camera)
1317+ {
1318+ tinyxml2::XMLElement* cameraElement = doc.NewElement (" Camera" );
1319+
1320+ Core::Transform transform = camera->get_transform ();
1321+ save_transform (transform, cameraElement);
1322+ cameraElement->SetAttribute (" far" , camera->get_far ());
1323+ cameraElement->SetAttribute (" near" , camera->get_near ());
1324+ cameraElement->SetAttribute (" fov" , camera->get_field_of_view ());
1325+
1326+ sceneElement->InsertEndChild (cameraElement);
1327+ }
1328+
1329+ // // Recursively save children
1330+ // tinyxml2::XMLElement* childrenElement = doc.NewElement("Children");
1331+ // save_children(scene->get_root(), childrenElement, doc, resourcesPath); // Assume get_root() gets the root object
1332+ // sceneElement->InsertEndChild(childrenElement);
1333+
1334+ // Save environment settings
1335+ tinyxml2::XMLElement* environmentElement = doc.NewElement (" Enviroment" );
1336+ Vec3 ambientColor = scene->get_ambient_color ();
1337+ float ambientIntensity = scene->get_ambient_intensity ();
1338+
1339+ if (scene->get_skybox ())
1340+ {
1341+ environmentElement->SetAttribute (" type" , " skybox" );
1342+
1343+ tinyxml2::XMLElement* filenameElement = doc.NewElement (" Filename" );
1344+ filenameElement->SetAttribute (" value" , scene->get_skybox ()->get_enviroment_map ()->get_file_route ().c_str ());
1345+ environmentElement->InsertEndChild (filenameElement);
1346+ } else
1347+ {
1348+ environmentElement->SetAttribute (" type" , " constant" );
1349+
1350+ tinyxml2::XMLElement* colorElement = doc.NewElement (" color" );
1351+ colorElement->SetAttribute (" r" , ambientColor.r );
1352+ colorElement->SetAttribute (" g" , ambientColor.g );
1353+ colorElement->SetAttribute (" b" , ambientColor.b );
1354+ environmentElement->InsertEndChild (colorElement);
1355+ }
1356+
1357+ tinyxml2::XMLElement* intensityElement = doc.NewElement (" intensity" );
1358+ intensityElement->SetAttribute (" value" , ambientIntensity);
1359+ environmentElement->InsertEndChild (intensityElement);
1360+
1361+ sceneElement->InsertEndChild (environmentElement);
1362+
1363+ // Save the XML to file
1364+ doc.SaveFile (fileName.c_str ());
1365+ }
0 commit comments