Skip to content

Commit b227023

Browse files
committed
Added support for scene export and improved UI
1 parent d6d37d1 commit b227023

File tree

5 files changed

+67
-48
lines changed

5 files changed

+67
-48
lines changed

README.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22

33
A Blender addon for exporting multiple FBX files targeting Unity.
44

5-
![Panel Preview](https://i.imgur.com/HMPQirc.png)
5+
![Panel Preview](https://i.imgur.com/9Hw5HR0.png)
66

77
## Capabilities
88

99
- Create a separate FBX file for every
10+
- Selected object
1011
- Object
1112
- Collection
12-
- Selected object
13+
- Active scene
1314
- Automatically export files to selected path when project is saved
1415
- Apply all transforms before export and revert after
1516
- Axes are adjusted for Unity
16-
- Output path is saved per project file
17+
- Output path is saved per scene
1718

1819
## Installation
1920

src/core.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,15 @@ def export_collections(parent_collection, folder, object_types):
4444
fbx(folder, coll.name, object_types)
4545

4646

47-
def fbx(path, name, object_types):
47+
def export_scene(scene, folder, object_types):
48+
fbx(folder, scene.name, object_types, use_selection=False)
49+
50+
51+
def fbx(path, name, object_types, use_selection=True):
4852
obj_path = os.path.join(path, name + ".fbx")
4953
bpy.ops.export_scene.fbx(
5054
filepath=obj_path,
51-
use_selection=True,
55+
use_selection=use_selection,
5256
use_space_transform=True,
5357
apply_unit_scale=True,
5458
global_scale=1,

src/operators.py

+28-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import bpy
2-
from .settings import UnityBatchExportSettings
2+
from .settings import UnityBatchExportSettings, EXPORTMODE
33
from .core import *
44

55

@@ -15,28 +15,39 @@ def execute(self, context):
1515
return {"FINISHED"}
1616

1717
self.report({"INFO"}, "Exporting...")
18-
human_type = "collection" if settings.per_collection else "object"
1918
try:
2019
abs_path = bpy.path.abspath(settings.export_path)
2120

22-
if settings.per_collection:
23-
root_coll = bpy.context.scene.collection
24-
file_count = len(root_coll.children)
25-
export_collections(
26-
settings.collection or root_coll, abs_path, settings.object_types
27-
)
28-
else:
21+
common = {"folder": abs_path, "object_types": settings.object_types}
22+
23+
if settings.export_mode == EXPORTMODE.SELECTED:
24+
file_count = len(bpy.context.selected_objects)
25+
human_type = "selected object"
26+
export_objects(bpy.context.selected_objects, **common)
27+
28+
elif settings.export_mode == EXPORTMODE.OBJECT:
2929
object_list = (
30-
bpy.context.selected_objects
31-
if settings.selected_only
32-
else (
33-
settings.collection.all_objects
34-
if settings.collection
35-
else bpy.context.scene.objects
36-
)
30+
settings.collection.all_objects
31+
if settings.collection
32+
else bpy.context.scene.objects
3733
)
3834
file_count = len(object_list)
39-
export_objects(object_list, abs_path, settings.object_types)
35+
human_type = "object"
36+
export_objects(object_list, **common)
37+
38+
elif settings.export_mode == EXPORTMODE.COLLECTION:
39+
coll = settings.collection or bpy.context.scene.collection
40+
file_count = len(coll.children)
41+
human_type = "collection"
42+
export_collections(coll, **common)
43+
44+
elif settings.export_mode == EXPORTMODE.SINGLE:
45+
file_count = 1
46+
human_type = "scene"
47+
export_scene(bpy.context.scene, **common)
48+
49+
else:
50+
self.report({"ERROR"}, "Unknown export mode: %s" % settings.export_mode)
4051

4152
except Exception as ex:
4253
self.report({"ERROR"}, "Error occured during export: %s" % ex)

src/panel.py

+6-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from bpy.types import Panel
2+
from src.settings import EXPORTMODE
23

34

45
class UnityBatchExportPanel(Panel):
@@ -15,20 +16,12 @@ def draw(self, context):
1516
# export path
1617
layout.prop(settings, "export_path")
1718

19+
layout.prop(settings, "export_mode")
20+
1821
# collection
19-
collection_field = layout.row()
20-
collection_field.prop(settings, "collection")
21-
if settings.selected_only and not settings.per_collection:
22-
collection_field.enabled = False
23-
24-
# per collection
25-
layout.prop(settings, "per_collection")
26-
27-
# selected only
28-
selected_only_field = layout.row()
29-
selected_only_field.prop(settings, "selected_only")
30-
if settings.per_collection:
31-
selected_only_field.enabled = False
22+
if settings.export_mode in [EXPORTMODE.OBJECT, EXPORTMODE.COLLECTION]:
23+
collection_field = layout.row()
24+
collection_field.prop(settings, "collection")
3225

3326
# auto export
3427
layout.prop(settings, "auto_export")

src/settings.py

+23-13
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,38 @@
1+
import bpy
12
from bpy.props import BoolProperty, StringProperty, PointerProperty, EnumProperty
23
from bpy.types import PropertyGroup, Collection
34

45

6+
class EXPORTMODE:
7+
SELECTED = "SELECTED"
8+
OBJECT = "OBJECT"
9+
COLLECTION = "COLLECTION"
10+
SINGLE = "SINGLE"
11+
12+
513
class UnityBatchExportSettings(PropertyGroup):
614
export_path: StringProperty(
715
name="Path",
816
default="",
917
description="Directory to export",
1018
subtype="DIR_PATH",
1119
)
20+
export_mode: EnumProperty(
21+
name="Mode",
22+
items=(
23+
(EXPORTMODE.SELECTED, "Selected Object", ""),
24+
(EXPORTMODE.OBJECT, "Object", ""),
25+
(EXPORTMODE.COLLECTION, "Collection", ""),
26+
(EXPORTMODE.SINGLE, "Active Scene", ""),
27+
),
28+
description="Create an FBX file for every",
29+
default="OBJECT",
30+
)
1231
collection: PointerProperty(
13-
name="Collection",
32+
name="Parent",
1433
type=Collection,
15-
description='Export from this collection only. Ignored when "Selected Objects" is enabled',
16-
)
17-
per_collection: BoolProperty(
18-
name="Per Collection",
19-
default=False,
20-
description="Create a separate file for every non-empty collection",
21-
)
22-
selected_only: BoolProperty(
23-
name="Selected Objects",
24-
default=False,
25-
description='Export selected objects only. Ignored when "Per Collection" is enabled',
34+
description="Export from this collection only",
35+
poll=lambda _, coll: bpy.context.scene.user_of_id(coll),
2636
)
2737
auto_export: BoolProperty(
2838
name="Auto Export",
@@ -45,5 +55,5 @@ class UnityBatchExportSettings(PropertyGroup):
4555
),
4656
),
4757
description="Which kind of object to export",
48-
default={"MESH"},
58+
default={"MESH", "OTHER"},
4959
)

0 commit comments

Comments
 (0)