diff options
author | Aki <please@ignore.pl> | 2024-04-06 02:34:19 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2024-04-06 02:34:19 +0200 |
commit | fbe5f352ff0f238266bc690a0b750674f80b1f02 (patch) | |
tree | 4ec2758cc6513014b6e3ef80b2d6c01da7337c7b | |
parent | effc8802a77375437b676ac4534789e819731671 (diff) | |
download | starshatter-fbe5f352ff0f238266bc690a0b750674f80b1f02.zip starshatter-fbe5f352ff0f238266bc690a0b750674f80b1f02.tar.gz starshatter-fbe5f352ff0f238266bc690a0b750674f80b1f02.tar.bz2 |
Added obj2mag and mag2obj utilities
-rw-r--r-- | Magic2/MagicDoc.cpp | 153 | ||||
-rw-r--r-- | MagicEx/CMakeLists.txt | 25 | ||||
-rw-r--r-- | MagicEx/include/MagicLoad.h (renamed from MagicEx/MagicLoad.h) | 11 | ||||
-rw-r--r-- | MagicEx/include/MagicLoad.inl.h | 32 | ||||
-rw-r--r-- | MagicEx/include/ModelFile3DS.h (renamed from MagicEx/ModelFile3DS.h) | 2 | ||||
-rw-r--r-- | MagicEx/include/ModelFileMAG.h (renamed from MagicEx/ModelFileMAG.h) | 2 | ||||
-rw-r--r-- | MagicEx/include/ModelFileOBJ.h (renamed from MagicEx/ModelFileOBJ.h) | 2 | ||||
-rw-r--r-- | MagicEx/src/MagicLoad.cpp (renamed from MagicEx/MagicLoad.cpp) | 14 | ||||
-rw-r--r-- | MagicEx/src/ModelFile3DS.cpp (renamed from MagicEx/ModelFile3DS.cpp) | 8 | ||||
-rw-r--r-- | MagicEx/src/ModelFileMAG.cpp (renamed from MagicEx/ModelFileMAG.cpp) | 6 | ||||
-rw-r--r-- | MagicEx/src/ModelFileOBJ.cpp (renamed from MagicEx/ModelFileOBJ.cpp) | 6 | ||||
-rw-r--r-- | MagicEx/src/mag2obj.cpp | 27 | ||||
-rw-r--r-- | MagicEx/src/obj2mag.cpp | 27 |
13 files changed, 151 insertions, 164 deletions
diff --git a/Magic2/MagicDoc.cpp b/Magic2/MagicDoc.cpp index 55ecd8d..c57d922 100644 --- a/Magic2/MagicDoc.cpp +++ b/Magic2/MagicDoc.cpp @@ -15,6 +15,7 @@ #include "Magic.h" #include "MagicDoc.h" +#include "MagicLoad.h" #include "ModelFileMAG.h" #include "ModelFileOBJ.h" #include "ModelFile3DS.h" @@ -22,12 +23,8 @@ #include "Selector.h" #include "Editor.h" #include "Command.h" - -#include "Bitmap.h" -#include "Color.h" #include "D3DXImage.h" #include "Geometry.h" -#include "Pcx.h" #include "Polygon.h" #include "Solid.h" @@ -236,146 +233,30 @@ BOOL MagicDoc::OnOpenDocument(LPCTSTR path_name) return TRUE; } + bool MagicDoc::ImportFile(LPCTSTR path_name) { if (strstr(path_name, ".obj") || strstr(path_name, ".OBJ")) { - ModelFileOBJ obj_file(path_name); - - if (solid->GetModel()) { - Solid* s = new Solid; - - if (s->Load(&obj_file)) { - // todo: insert command here - Model* orig = solid->GetModel(); - Model* imported = s->GetModel(); - - orig->GetMaterials().append(imported->GetMaterials()); - orig->GetSurfaces().append(imported->GetSurfaces()); - orig->OptimizeMaterials(); - - imported->GetMaterials().clear(); - imported->GetSurfaces().clear(); - - SetModifiedFlag(FALSE); - UpdateAllViews(NULL); - delete s; - return true; - } - - delete s; - } - else { - if (solid->Load(&obj_file)) { - SetModifiedFlag(FALSE); - UpdateAllViews(NULL); - return true; - } - } - - return false; + if (!ImportInto<ModelFileOBJ>(path_name, solid)) + return false; + SetModifiedFlag(FALSE); + UpdateAllViews(NULL); + return true; } - if (strstr(path_name, ".3ds") || strstr(path_name, ".3DS")) { - ModelFile3DS model_file(path_name); - - if (solid->GetModel()) { - Solid* s = new Solid; - - if (s->Load(&model_file)) { - // todo: insert command here - Model* orig = solid->GetModel(); - Model* imported = s->GetModel(); - - orig->GetMaterials().append(imported->GetMaterials()); - orig->GetSurfaces().append(imported->GetSurfaces()); - orig->OptimizeMaterials(); - - imported->GetMaterials().clear(); - imported->GetSurfaces().clear(); - - SetModifiedFlag(FALSE); - UpdateAllViews(NULL); - delete s; - return true; - } - - delete s; - } - else { - if (solid->Load(&model_file)) { - SetModifiedFlag(FALSE); - UpdateAllViews(NULL); - return true; - } - } - - return false; - } - - FILE* fp = fopen(path_name, "rb"); - if (!fp) { - ::MessageBox(0, "Import Failed: could not open file", "ERROR", MB_OK); - return false; - } - - int version = 1; - char file_id[5]; - fread(file_id, 4, 1, fp); - file_id[4] = '\0'; - fclose(fp); - - if (strncmp(file_id, "MAG", 3)) { - ::MessageBox(0, "Open Failed: Invalid file type", "ERROR", MB_OK); - return false; - } - - switch (file_id[3]) { - case '6': version = 6; break; - case '5': version = 5; break; - default: version = 0; break; + if (!ImportInto<ModelFile3DS>(path_name, solid)) + return false; + SetModifiedFlag(FALSE); + UpdateAllViews(NULL); + return true; } - - if (version < 5 || version > 6) { - ::MessageBox(0, "Open Failed: Unsupported version", "ERROR", MB_OK); + if (!ImportInto<ModelFile3DS>(path_name, solid)) return false; - } - - ModelFileMAG mag_file(path_name); - - if (solid->GetModel()) { - Solid* s = new Solid; - if (s->Load(&mag_file)) { - // todo: insert command here - Model* orig = solid->GetModel(); - Model* imported = s->GetModel(); - - orig->GetMaterials().append(imported->GetMaterials()); - orig->GetSurfaces().append(imported->GetSurfaces()); - orig->OptimizeMaterials(); - - imported->GetMaterials().clear(); - imported->GetSurfaces().clear(); - - SetModifiedFlag(FALSE); - UpdateAllViews(NULL); - delete s; - return true; - } - - delete s; - } - else { - InitCommandStack(); - - if (solid->Load(&mag_file)) { - SetModifiedFlag(FALSE); - UpdateAllViews(NULL); - return true; - } - } - - return false; + InitCommandStack(); + SetModifiedFlag(FALSE); + UpdateAllViews(NULL); + return true; } bool diff --git a/MagicEx/CMakeLists.txt b/MagicEx/CMakeLists.txt index 9c8038a..5c552fc 100644 --- a/MagicEx/CMakeLists.txt +++ b/MagicEx/CMakeLists.txt @@ -1,9 +1,24 @@ project(MagicEx) add_library( ${PROJECT_NAME} STATIC - MagicLoad.cpp - ModelFile3DS.cpp - ModelFileMAG.cpp - ModelFileOBJ.cpp) -target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + src/MagicLoad.cpp + src/ModelFile3DS.cpp + src/ModelFileMAG.cpp + src/ModelFileOBJ.cpp) +target_include_directories(${PROJECT_NAME} PUBLIC include/) target_link_libraries(${PROJECT_NAME} PUBLIC StarsEx PRIVATE l3ds) + + +add_executable(${PROJECT_NAME}_obj2mag src/obj2mag.cpp) +target_link_libraries(${PROJECT_NAME}_obj2mag PRIVATE ${PROJECT_NAME}) +set_target_properties(${PROJECT_NAME}_obj2mag PROPERTIES OUTPUT_NAME obj2mag) + + +add_executable(${PROJECT_NAME}_mag2obj src/mag2obj.cpp) +target_link_libraries(${PROJECT_NAME}_mag2obj PRIVATE ${PROJECT_NAME}) +set_target_properties(${PROJECT_NAME}_mag2obj PROPERTIES OUTPUT_NAME mag2obj) + + +install( + TARGETS ${PROJECT_NAME}_obj2mag ${PROJECT_NAME}_mag2obj RUNTIME + COMPONENT Tools DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/MagicEx/MagicLoad.h b/MagicEx/include/MagicLoad.h index 27b6380..f447945 100644 --- a/MagicEx/MagicLoad.h +++ b/MagicEx/include/MagicLoad.h @@ -1,18 +1,23 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. - - AUTHOR: John DiCamillo */ #pragma once #include <windows.h> +#include <filesystem> + #include <Bitmap.h> +#include <Solid.h> int LoadBuffer(const char* filename, BYTE*& buf, bool null_terminate=false); int LoadTexture(const char* name, Bitmap*& bmp, int type=0); int LoadAlpha(const char* name, Bitmap& bitmap, int type=0); +template <typename ModelLoader> bool ImportInto(const std::filesystem::path& pathname, Solid* target); + + +#include "MagicLoad.inl.h" diff --git a/MagicEx/include/MagicLoad.inl.h b/MagicEx/include/MagicLoad.inl.h new file mode 100644 index 0000000..e32ba60 --- /dev/null +++ b/MagicEx/include/MagicLoad.inl.h @@ -0,0 +1,32 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. +*/ + +#include <memory> + +#include <Solid.h> + + +template <typename ModelLoader> +bool +ImportInto(const char* pathname, Solid* target) +{ + ModelLoader loader {pathname}; + if (auto* original = target->GetModel()) { + auto solid = std::make_unique<Solid>(); + if (!solid->Load(&loader)) + return false; + auto* imported = solid->GetModel(); + original->GetMaterials().append(imported->GetMaterials()); + original->GetSurfaces().append(imported->GetSurfaces()); + original->OptimizeMaterials(); + imported->GetMaterials().clear(); + imported->GetSurfaces().clear(); + return true; + } + return target->Load(&loader); +} + + diff --git a/MagicEx/ModelFile3DS.h b/MagicEx/include/ModelFile3DS.h index 3cac828..e539d17 100644 --- a/MagicEx/ModelFile3DS.h +++ b/MagicEx/include/ModelFile3DS.h @@ -1,5 +1,5 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. diff --git a/MagicEx/ModelFileMAG.h b/MagicEx/include/ModelFileMAG.h index 27466ae..e11d81c 100644 --- a/MagicEx/ModelFileMAG.h +++ b/MagicEx/include/ModelFileMAG.h @@ -1,5 +1,5 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. diff --git a/MagicEx/ModelFileOBJ.h b/MagicEx/include/ModelFileOBJ.h index dcffc7d..3d9089c 100644 --- a/MagicEx/ModelFileOBJ.h +++ b/MagicEx/include/ModelFileOBJ.h @@ -1,5 +1,5 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. diff --git a/MagicEx/MagicLoad.cpp b/MagicEx/src/MagicLoad.cpp index 2b13a93..6687f8b 100644 --- a/MagicEx/MagicLoad.cpp +++ b/MagicEx/src/MagicLoad.cpp @@ -1,18 +1,18 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. AUTHOR: John DiCamillo */ -#include "MagicLoad.h" +#include <MagicLoad.h> -#include "Bitmap.h" -#include "Color.h" -#include "D3DXImage.h" -#include "Geometry.h" -#include "Pcx.h" +#include <Bitmap.h> +#include <Color.h> +#include <D3DXImage.h> +#include <Geometry.h> +#include <Pcx.h> int LoadBuffer(const char* filename, BYTE*& buf, bool null_terminate) diff --git a/MagicEx/ModelFile3DS.cpp b/MagicEx/src/ModelFile3DS.cpp index 4c4a157..aca54de 100644 --- a/MagicEx/ModelFile3DS.cpp +++ b/MagicEx/src/ModelFile3DS.cpp @@ -1,5 +1,5 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. @@ -11,15 +11,15 @@ File loader for 3DStudio MAX 3DS format models */ -#include "ModelFile3DS.h" +#include <ModelFile3DS.h> #include <Bitmap.h> +#include <l3ds.h> #include <List.h> #include <Polygon.h> #include <Text.h> -#include "MagicLoad.h" -#include "l3ds.h" +#include <MagicLoad.h> // +--------------------------------------------------------------------+ diff --git a/MagicEx/ModelFileMAG.cpp b/MagicEx/src/ModelFileMAG.cpp index fe076ed..72e6b5b 100644 --- a/MagicEx/ModelFileMAG.cpp +++ b/MagicEx/src/ModelFileMAG.cpp @@ -1,5 +1,5 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. @@ -11,13 +11,13 @@ File loader for MAG format models */ -#include "ModelFileMAG.h" +#include <ModelFileMAG.h> #include <Bitmap.h> #include <List.h> #include <Polygon.h> -#include "MagicLoad.h" +#include <MagicLoad.h> // +--------------------------------------------------------------------+ diff --git a/MagicEx/ModelFileOBJ.cpp b/MagicEx/src/ModelFileOBJ.cpp index c682bff..9ab7e69 100644 --- a/MagicEx/ModelFileOBJ.cpp +++ b/MagicEx/src/ModelFileOBJ.cpp @@ -1,5 +1,5 @@ /* Starshatter: The Open Source Project - Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. @@ -11,14 +11,14 @@ File loader for Wavefront/OBJ format models */ -#include "ModelFileOBJ.h" +#include <ModelFileOBJ.h> #include <Bitmap.h> #include <Polygon.h> #include <List.h> #include <Text.h> -#include "MagicLoad.h" +#include <MagicLoad.h> // +--------------------------------------------------------------------+ diff --git a/MagicEx/src/mag2obj.cpp b/MagicEx/src/mag2obj.cpp new file mode 100644 index 0000000..a8ba386 --- /dev/null +++ b/MagicEx/src/mag2obj.cpp @@ -0,0 +1,27 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. +*/ + +#include <memory> + +#include <Solid.h> + +#include <MagicLoad.h> +#include <ModelFileMAG.h> +#include <ModelFileOBJ.h> + + +int +main(int argc, char* argv[]) +{ + if (argc < 2) + return 1; + std::string pathname {argv[1]}; + auto solid = std::make_unique<Solid>(); + if (!ImportInto<ModelFileMAG>(pathname.c_str(), solid.get())) + return 1; + ModelFileOBJ exporter {(pathname + ".obj").c_str()}; + exporter.Save(solid->GetModel()); +} diff --git a/MagicEx/src/obj2mag.cpp b/MagicEx/src/obj2mag.cpp new file mode 100644 index 0000000..c9d22e0 --- /dev/null +++ b/MagicEx/src/obj2mag.cpp @@ -0,0 +1,27 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. +*/ + +#include <memory> + +#include <Solid.h> + +#include <MagicLoad.h> +#include <ModelFileMAG.h> +#include <ModelFileOBJ.h> + + +int +main(int argc, char* argv[]) +{ + if (argc < 2) + return 1; + std::string pathname {argv[1]}; + auto solid = std::make_unique<Solid>(); + if (!ImportInto<ModelFileOBJ>(pathname.c_str(), solid.get())) + return 1; + ModelFileMAG exporter {(pathname + ".mag").c_str()}; + exporter.Save(solid->GetModel()); +} |