Skip to content

Commit 869277e

Browse files
committed
0_2_0
Added per project json files.
1 parent e1b5476 commit 869277e

3 files changed

Lines changed: 144 additions & 14 deletions

File tree

README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Bridge/Pipeline/Workflow export for Unreal Engine.
99
- One click FBX Export to UE
1010
- Option to Create Icon (Useful for toolbar items/etc)
1111
- Option to Copy Textures Folder
12+
- Option to override preferences (Useful for per project setup)
1213

1314
# Roadmap
1415

@@ -40,6 +41,40 @@ Should work in any version that supports FBX import.
4041

4142
\* The children/sub folders will be created automatically based on the blender file location in your folder hierarchy. (E.g. "C:\Users\kye\Documents\Assets\DigiKrafting\Content\Meshes\Logo\Logo.blend" will create "C:\Users\kye\Documents\Unreal Projects\DigiKrafting\Content\Meshes\Logo\Logo.fbx")
4243

44+
# Override Preferences
45+
46+
Create a text file named blender_addon_ue.json in your source project folder, mesh folder or both for preferences for different model types, the addon will search recursively back to the root folder of your drive for any "blender_addon_ue.json", so don't create it in "c:\blender_addon_ue.json" or "/blender_addon_ue.json".
47+
48+
### blender_addon_ue.json
49+
50+
~~~
51+
{
52+
"option_ue_src": "C:\\Users\\kye\\Documents\\Assets\\DigiKrafting\\Content\\",
53+
"option_ue_dst": "C:\\Users\\kye\\Documents\\Unreal Projects\\DKS_Importer_Project\\Content\\",
54+
"option_create_icon": true,
55+
"option_override_camera": true,
56+
"option_icon_resolution_x":64,
57+
"option_icon_resolution_y":64,
58+
"option_camera_location":{"x":11,"y":12,"z":13},
59+
"option_camera_rotation":{"x":21,"y":22,"z":23},
60+
"option_copy_textures": true
61+
}
62+
~~~
63+
64+
\* Preferences that are ommitted will default to the addon preferences.
65+
66+
For example you could have:
67+
68+
~~~
69+
{
70+
"option_ue_src": "C:\\Users\\kye\\Documents\\Assets\\DigiKrafting\\Content\\",
71+
"option_ue_dst": "C:\\Users\\kye\\Documents\\Unreal Projects\\DKS_Importer_Project\\Content\\",
72+
"option_copy_textures": false
73+
}
74+
~~~
75+
76+
\* For a project based setup be sure to set at least "option_ue_src" and "option_ue_dst".
77+
4378
# Installation
4479

4580
Download either the tar.gz or zip from [https://github.com/DigiKrafting/blender_addon_ue/releases/latest](https://github.com/DigiKrafting/blender_addon_ue/releases/latest)

__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"name": "DKS UE",
2121
"description": "Export to UE",
2222
"author": "DigiKrafting.Studio",
23-
"version": (0, 1, 0),
23+
"version": (0, 2, 0),
2424
"blender": (2, 80, 0),
2525
"location": "Info Toolbar, File -> Export",
2626
"wiki_url": "https://github.com/DigiKrafting/blender_addon_ue/wiki",
@@ -81,6 +81,10 @@ class dks_ue_addon_prefs(bpy.types.AddonPreferences):
8181
name="Display Type",
8282
default='Buttons',
8383
)
84+
option_textures_folder : bpy.props.StringProperty(
85+
name="Textures Folder Name",
86+
default="Textures",
87+
)
8488
def draw(self, context):
8589

8690
layout = self.layout
@@ -90,6 +94,9 @@ def draw(self, context):
9094
box.prop(self, 'option_ue_src')
9195
box.prop(self, 'option_ue_dst')
9296
box=layout.box()
97+
box.prop(self, 'option_textures_folder')
98+
box.label(text='Sub folder relative to the saved .blend file. * Do NOT include any "\\".',icon='INFO')
99+
box=layout.box()
93100
box.prop(self, 'option_create_icon')
94101
box.prop(self, 'option_icon_resolution_x')
95102
box.prop(self, 'option_icon_resolution_y')

dks_ue.py

Lines changed: 101 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@
2222
from os import system, path, makedirs, sep
2323
import os, sys
2424
import distutils.dir_util
25+
import json
26+
from pathlib import Path as pathlib_path
27+
28+
_preferences={};
2529

2630
def dks_ue_get_export_path():
2731

32+
global _preferences
33+
2834
_file_name = bpy.context.blend_data.filepath
2935
_file_path = _file_name[0:len(_file_name)-len(bpy.path.basename(_file_name))]
30-
_file_sub = _file_path[len(bpy.context.preferences.addons["blender_addon_ue"].preferences.option_ue_src):]
31-
_export_path = bpy.context.preferences.addons["blender_addon_ue"].preferences.option_ue_dst+_file_sub
36+
_file_sub = _file_path[len(_preferences["option_ue_src"]):]
37+
_export_path = _preferences["option_ue_dst"]+_file_sub
3238

3339
if not path.exists(_export_path):
3440
makedirs(_export_path)
@@ -49,22 +55,23 @@ def dks_ue_filename(self, context):
4955

5056
def screenshot(self, context):
5157

58+
global _preferences
59+
5260
_object_name = bpy.path.basename(bpy.context.blend_data.filepath).replace('.blend','')
5361
_object_file = dks_ue_get_export_path() + _object_name + '_Icon.png'
54-
55-
if bpy.context.preferences.addons[__package__].preferences.option_override_camera:
5662

57-
bpy.context.scene.camera.location = bpy.context.preferences.addons[__package__].preferences.option_camera_location
58-
bpy.context.scene.camera.rotation_euler = bpy.context.preferences.addons[__package__].preferences.option_camera_rotation
63+
if _preferences["option_override_camera"]:
5964

65+
bpy.context.scene.camera.location = _preferences["option_camera_location"]
66+
bpy.context.scene.camera.rotation_euler = _preferences["option_camera_rotation"]
6067

6168
bpy.ops.render.render(use_viewport=True)
6269

6370
bpy.data.scenes["Scene"].render.filepath = _object_file
6471
bpy.context.scene.render.image_settings.file_format='PNG'
6572
bpy.context.scene.render.filepath = _object_file
66-
bpy.context.scene.render.resolution_x = bpy.context.preferences.addons[__package__].preferences.option_icon_resolution_x
67-
bpy.context.scene.render.resolution_y = bpy.context.preferences.addons[__package__].preferences.option_icon_resolution_y
73+
bpy.context.scene.render.resolution_x = _preferences["option_icon_resolution_x"]
74+
bpy.context.scene.render.resolution_y = _preferences["option_icon_resolution_y"]
6875
bpy.context.scene.render.resolution_percentage = 100
6976

7077
bpy.context.scene.cycles.film_transparent = True
@@ -81,22 +88,103 @@ def dks_ue_fbx_export(self, context):
8188

8289
return _export_file
8390

91+
def dks_ue_folder_crawl(directory):
92+
93+
found=""
94+
95+
path_check=os.path.join(directory, "blender_addon_ue.json")
96+
97+
if path.exists(path_check):
98+
found=path_check
99+
else:
100+
path_parent=pathlib_path(directory).parent
101+
if path_parent!=directory:
102+
found=dks_ue_folder_crawl(path_parent)
103+
104+
return found
105+
#
106+
84107
class dks_ue_export(bpy.types.Operator):
85108

86109
bl_idname = "dks_ue.export"
87110
bl_label = "UE"
88111
bl_description = "Export to UE"
89112

90113
def execute(self, context):
91-
92-
if bpy.context.preferences.addons[__package__].preferences.option_create_icon:
114+
115+
global _preferences
116+
117+
_file_name = bpy.context.blend_data.filepath
118+
_file_path = _file_name[0:len(_file_name)-len(bpy.path.basename(_file_name))]
119+
120+
_file_json=dks_ue_folder_crawl(_file_path)
121+
122+
print("_file_json:",_file_json)
123+
124+
if _file_json!="":
125+
126+
try:
127+
with open(_file_json) as _file_json_data:
128+
_preferences = json.load(_file_json_data)
129+
except Exception as e:
130+
print("blender_addon_ue.json is invalid: ",str(e.reason))
131+
return {'FINISHED'}
132+
133+
if "option_ue_src" not in _preferences:
134+
_preferences["option_ue_src"]=bpy.context.preferences.addons[__package__].preferences.option_ue_src
135+
136+
if "option_ue_dst" not in _preferences:
137+
_preferences["option_ue_dst"]=bpy.context.preferences.addons[__package__].preferences.option_ue_dst
138+
139+
if "option_create_icon" not in _preferences:
140+
_preferences["option_create_icon"]=bpy.context.preferences.addons[__package__].preferences.option_create_icon
141+
142+
if "option_override_camera" not in _preferences:
143+
_preferences["option_override_camera"]=bpy.context.preferences.addons[__package__].preferences.option_override_camera
144+
145+
if "option_icon_resolution_x" not in _preferences:
146+
_preferences["option_icon_resolution_x"]=bpy.context.preferences.addons[__package__].preferences.option_icon_resolution_x
147+
148+
if "option_icon_resolution_y" not in _preferences:
149+
_preferences["option_icon_resolution_y"]=bpy.context.preferences.addons[__package__].preferences.option_icon_resolution_y
150+
151+
if "option_camera_location" in _preferences:
152+
_preferences["option_camera_location"]=(_preferences["option_camera_location"]["x"],_preferences["option_camera_location"]["y"],_preferences["option_camera_location"]["z"])
153+
else:
154+
_preferences["option_camera_location"] = bpy.context.preferences.addons[__package__].preferences.option_camera_location
155+
156+
if "option_camera_rotation" in _preferences:
157+
_preferences["option_camera_rotation"]=(math.radians(_preferences["option_camera_rotation"]["x"]),math.radians(_preferences["option_camera_rotation"]["y"]),math.radians(_preferences["option_camera_rotation"]["z"]))
158+
else:
159+
_preferences["option_camera_rotation"] = (math.radians(bpy.context.preferences.addons[__package__].preferences.option_camera_rotation[0]),math.radians(bpy.context.preferences.addons[__package__].preferences.option_camera_rotation[1]),math.radians(bpy.context.preferences.addons[__package__].preferences.option_camera_rotation[2]))
160+
161+
if "option_create_icon" not in _preferences:
162+
_preferences["option_create_icon"]=bpy.context.preferences.addons[__package__].preferences.option_create_icon
163+
164+
if "option_textures_folder" not in _preferences:
165+
_preferences["option_textures_folder"]=bpy.context.preferences.addons[__package__].preferences.option_textures_folder
166+
167+
else:
168+
169+
_preferences["option_ue_src"]=bpy.context.preferences.addons[__package__].preferences.option_ue_src
170+
_preferences["option_ue_dst"]=bpy.context.preferences.addons[__package__].preferences.option_ue_dst
171+
_preferences["option_create_icon"]=bpy.context.preferences.addons[__package__].preferences.option_create_icon
172+
_preferences["option_override_camera"]=bpy.context.preferences.addons[__package__].preferences.option_override_camera
173+
_preferences["option_icon_resolution_x"]=bpy.context.preferences.addons[__package__].preferences.option_icon_resolution_x
174+
_preferences["option_icon_resolution_y"]=bpy.context.preferences.addons[__package__].preferences.option_icon_resolution_y
175+
_preferences["option_camera_location"] = bpy.context.preferences.addons[__package__].preferences.option_camera_location
176+
_preferences["option_camera_rotation"] = (math.radians(bpy.context.preferences.addons[__package__].preferences.option_camera_rotation[0]),math.radians(bpy.context.preferences.addons[__package__].preferences.option_camera_rotation[1]),math.radians(bpy.context.preferences.addons[__package__].preferences.option_camera_rotation[2]))
177+
_preferences["option_copy_textures"]=bpy.context.preferences.addons[__package__].preferences.option_copy_textures
178+
_preferences["option_textures_folder"]=bpy.context.preferences.addons[__package__].preferences.option_textures_folder
179+
180+
if _preferences["option_create_icon"]:
93181

94182
screenshot(self, context)
95183

96-
if bpy.context.preferences.addons[__package__].preferences.option_copy_textures:
184+
if _preferences["option_copy_textures"]:
97185

98-
_path_textures_from = bpy.path.abspath('//') + "Textures" + sep
99-
_path_textures_to = dks_ue_get_export_path() + "Textures" + sep
186+
_path_textures_from = bpy.path.abspath('//') + _preferences["option_textures_folder"] + sep
187+
_path_textures_to = dks_ue_get_export_path() + _preferences["option_textures_folder"] + sep
100188

101189
if path.exists(_path_textures_from):
102190
distutils.dir_util.copy_tree(_path_textures_from, _path_textures_to)

0 commit comments

Comments
 (0)