diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c18dd8d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+__pycache__/
diff --git a/addon/bitsquid/__init__.py b/addon/bitsquid/__init__.py
new file mode 100644
index 0000000..4a96ce0
--- /dev/null
+++ b/addon/bitsquid/__init__.py
@@ -0,0 +1,150 @@
+# Bitsquid Blender Tools
+# Copyright (C) 2021 Lucas Schwiderski
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+
+bl_info = {
+ "name": "Bitsquid Engine",
+ "author": "Lucas Schwiderski",
+ "version": (0, 0, 1),
+ "blender": (2, 90, 0),
+ "location": "File > Import-Export",
+ "description": "Import-Export Bitsquid related files",
+ "category": "Import-Export",
+}
+
+# Reload sub modules if they are already loaded
+if "bpy" in locals():
+ import importlib
+ importlib.reload(unit_export)
+ importlib.reload(unit)
+
+import bpy
+from bpy.types import (
+ Panel,
+ Operator,
+ PropertyGroup,
+)
+from bpy.props import (
+ StringProperty,
+ EnumProperty,
+ PointerProperty,
+)
+from bpy_extras.io_utils import (
+ ExportHelper,
+ orientation_helper,
+ path_reference_mode,
+ axis_conversion,
+)
+from bitsquid.unit import export as unit_export
+
+
+class BitsquidSettings(PropertyGroup):
+ project_root: StringProperty(
+ name="Project Root",
+ description="The project directory considered as root path for all Bitsquid related operations.",
+ default="//",
+ subtype='DIR_PATH',
+ )
+
+
+class SCENE_PT_bitsquid(Panel):
+ bl_label = "Bitsquid"
+ bl_space_type = "PROPERTIES"
+ bl_region_type = "WINDOW"
+ bl_context = "scene"
+ # bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = False
+ layout.use_property_decorate = False
+
+ bitsquid = context.scene.bitsquid
+ layout.prop(bitsquid, "project_root", text="Project Root")
+
+
+class BitsquidObjectSettings(PropertyGroup):
+ unit_filepath: StringProperty(
+ name="Unit File Path",
+ description="The directory to store the .unit file in. Needs to be within the project root.",
+ default="//",
+ subtype='DIR_PATH',
+ )
+
+
+class OBJECT_OT_bitsquid_export(Operator):
+ """Export this object into a Bitsquid Unit file"""
+ bl_idname = "object.bitsquid_export_unit"
+ bl_label = "Export .unit"
+ bl_options = {'REGISTER'}
+
+ filepath: StringProperty(subtype='DIR_PATH')
+
+ @classmethod
+ def poll(cls, context):
+ return bpy.data.is_saved and context.active_object is not None
+
+ def execute(self, context):
+ print("Export .unit")
+ return unit_export.save(self, context, context.object.bitsquid.unit_filepath)
+
+
+class OBJECT_PT_bitsquid(Panel):
+ bl_label = "Bitsquid"
+ bl_space_type = "PROPERTIES"
+ bl_region_type = "WINDOW"
+ bl_context = "object"
+ # bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = False
+ layout.use_property_decorate = False
+
+ bitsquid = context.object.bitsquid
+ layout.prop(bitsquid, "unit_filepath", text="Unit File Path")
+ layout.operator("object.bitsquid_export_unit", text="Export .unit")
+
+
+# Register
+classes = [
+ BitsquidSettings,
+ SCENE_PT_bitsquid,
+ BitsquidObjectSettings,
+ OBJECT_PT_bitsquid,
+ OBJECT_OT_bitsquid_export,
+]
+
+
+def register():
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
+
+ bpy.types.Scene.bitsquid = PointerProperty(type=BitsquidSettings)
+ bpy.types.Object.bitsquid = PointerProperty(type=BitsquidObjectSettings)
+
+
+def unregister():
+ del bpy.types.Scene.bitsquid
+
+ from bpy.utils import unregister_class
+ for cls in reversed(classes):
+ unregister_class(cls)
+
+
+if __name__ == "__main__":
+ register()
diff --git a/addon/bitsquid/unit/__init__.py b/addon/bitsquid/unit/__init__.py
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/addon/bitsquid/unit/__init__.py
@@ -0,0 +1 @@
+
diff --git a/addon/bitsquid/unit/export.py b/addon/bitsquid/unit/export.py
new file mode 100644
index 0000000..fb4829b
--- /dev/null
+++ b/addon/bitsquid/unit/export.py
@@ -0,0 +1,24 @@
+# Bitsquid Blender Tools
+# Copyright (C) 2021 Lucas Schwiderski
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+import bpy
+
+
+def save(self, context, unit_filepath):
+ filepath = bpy.path.abspath(unit_filepath)
+ self.report({'INFO'}, "Saving unit to " + filepath)
+
+ return {'FINISHED'}