summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2024-04-06 02:34:19 +0200
committerAki <please@ignore.pl>2024-04-06 02:34:19 +0200
commitfbe5f352ff0f238266bc690a0b750674f80b1f02 (patch)
tree4ec2758cc6513014b6e3ef80b2d6c01da7337c7b
parenteffc8802a77375437b676ac4534789e819731671 (diff)
downloadstarshatter-fbe5f352ff0f238266bc690a0b750674f80b1f02.zip
starshatter-fbe5f352ff0f238266bc690a0b750674f80b1f02.tar.gz
starshatter-fbe5f352ff0f238266bc690a0b750674f80b1f02.tar.bz2
Added obj2mag and mag2obj utilities
-rw-r--r--Magic2/MagicDoc.cpp153
-rw-r--r--MagicEx/CMakeLists.txt25
-rw-r--r--MagicEx/include/MagicLoad.h (renamed from MagicEx/MagicLoad.h)11
-rw-r--r--MagicEx/include/MagicLoad.inl.h32
-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.cpp27
-rw-r--r--MagicEx/src/obj2mag.cpp27
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());
+}