Skip to content

Commit 9e35d51

Browse files
committed
refactor scene selection import
1 parent b5ee118 commit 9e35d51

File tree

1 file changed

+96
-36
lines changed
  • io_scene_xray/formats/scene

1 file changed

+96
-36
lines changed

io_scene_xray/formats/scene/imp.py

Lines changed: 96 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ def _read_objects_count(objects_count_chunk):
4343
return objects_count
4444

4545

46-
def _read_object_body(data, imported_objects, import_context):
47-
chunked_reader = rw.read.ChunkedReader(data)
48-
46+
def _read_object_body_version(chunked_reader):
4947
# get scene object version
5048
ver_chunk = chunked_reader.get_chunk(fmt.Chunks.SCENEOBJ_CHUNK_VERSION)
5149
packed_reader = rw.read.PackedReader(ver_chunk)
@@ -58,22 +56,40 @@ def _read_object_body(data, imported_objects, import_context):
5856
log.props(version=ver)
5957
)
6058

61-
# read object data
59+
return ver
60+
61+
62+
def _read_object_body_data(chunked_reader, ver):
63+
object_path = None
64+
position = None
65+
rotation = None
66+
scale = None
67+
6268
for chunk_id, chunk_data in chunked_reader:
63-
packed_reader = rw.read.PackedReader(chunk_data)
6469

70+
# reference
6571
if chunk_id == fmt.Chunks.SCENEOBJ_CHUNK_REFERENCE:
72+
packed_reader = rw.read.PackedReader(chunk_data)
73+
6674
if ver == fmt.SCENEOBJ_VERSION_SOC:
6775
version = packed_reader.uint32()
6876
reserved = packed_reader.uint32()
77+
6978
object_path = packed_reader.gets()
7079

80+
# transforms
7181
elif chunk_id == fmt.Chunks.CUSTOMOBJECT_CHUNK_TRANSFORM:
82+
packed_reader = rw.read.PackedReader(chunk_data)
83+
7284
position = packed_reader.getf('<3f')
7385
rotation = packed_reader.getf('<3f')
7486
scale = packed_reader.getf('<3f')
7587

76-
# get file path
88+
return object_path, position, rotation, scale
89+
90+
91+
def _get_file_path(object_path):
92+
import_path = None
7793
objs_folders = utils.ie.get_pref_paths('objects_folder')
7894

7995
for objs_folder in objs_folders:
@@ -87,62 +103,106 @@ def _read_object_body(data, imported_objects, import_context):
87103
if os.path.exists(import_path):
88104
break
89105

90-
# get imported object
91-
imp_obj = imported_objects.get(object_path)
106+
return import_path
92107

93-
# create/import object
94-
if imp_obj:
95108

96-
# copy root
97-
new_root = imp_obj.copy()
109+
def _copy_object(imp_obj, position, rotation, scale):
110+
# copy root
111+
new_root = imp_obj.copy()
112+
utils.stats.created_obj()
113+
utils.version.link_object(new_root)
114+
115+
# copy meshes
116+
for child_obj in imp_obj.children:
117+
new_mesh = child_obj.copy()
98118
utils.stats.created_obj()
99-
utils.version.link_object(new_root)
119+
utils.version.link_object(new_mesh)
120+
new_mesh.parent = new_root
121+
new_mesh.xray.isroot = False
122+
123+
# set root-object transforms
124+
_set_obj_transforms(new_root, position, rotation, scale)
125+
126+
127+
def _import_object(
128+
import_context,
129+
import_path,
130+
object_path,
131+
imported_objects,
132+
position,
133+
rotation,
134+
scale
135+
):
100136

101-
# copy meshes
102-
for child_obj in imp_obj.children:
103-
new_mesh = child_obj.copy()
104-
utils.stats.created_obj()
105-
utils.version.link_object(new_mesh)
106-
new_mesh.parent = new_root
107-
new_mesh.xray.isroot = False
137+
if os.path.exists(import_path):
138+
# import file
139+
imp_obj = obj.imp.main.import_file(import_path, import_context)
140+
utils.ie.set_export_path(imp_obj, '', object_path)
141+
imported_objects[object_path] = imp_obj
108142

109-
# set root-object transforms
110-
_set_obj_transforms(new_root, position, rotation, scale)
143+
# set transforms
144+
_set_obj_transforms(imp_obj, position, rotation, scale)
111145

112146
else:
147+
log.warn(
148+
text.warn.scene_no_file,
149+
file=object_path + '.object',
150+
path=import_path
151+
)
113152

114-
if os.path.exists(import_path):
115-
# import file
116-
imp_obj = obj.imp.main.import_file(import_path, import_context)
117-
utils.ie.set_export_path(imp_obj, '', object_path)
118-
imported_objects[object_path] = imp_obj
119153

120-
# set transforms
121-
_set_obj_transforms(imp_obj, position, rotation, scale)
154+
def _read_object_body(data, imported_objects, import_context):
155+
chunked_reader = rw.read.ChunkedReader(data)
156+
157+
# read version
158+
ver = _read_object_body_version(chunked_reader)
159+
160+
# read object data
161+
object_path, position, rotation, scale = _read_object_body_data(
162+
chunked_reader,
163+
ver
164+
)
165+
166+
# get file path
167+
import_path = _get_file_path(object_path)
168+
169+
# get imported object
170+
imp_obj = imported_objects.get(object_path)
122171

123-
else:
124-
log.warn(
125-
text.warn.scene_no_file,
126-
file=object_path + '.object',
127-
path=import_path
128-
)
172+
if imp_obj:
173+
# copy object
174+
_copy_object(imp_obj, position, rotation, scale)
175+
176+
else:
177+
# import object
178+
_import_object(
179+
import_context,
180+
import_path,
181+
object_path,
182+
imported_objects,
183+
position,
184+
rotation,
185+
scale
186+
)
129187

130188

131189
def _read_scene_object(data, imported_objects, import_context):
132190
chunked_reader = rw.read.ChunkedReader(data)
133191

134192
for chunk_id, chunk_data in chunked_reader:
193+
135194
if chunk_id == fmt.Chunks.CHUNK_OBJECT_BODY:
136195
_read_object_body(chunk_data, imported_objects, import_context)
196+
break
137197

138198

139199
def _read_scene_objects(scene_objects_chunk, objects_count, import_context):
140200
if not scene_objects_chunk:
141201
raise log.AppError(text.error.scene_scn_objs)
142202

203+
imported_objects = {}
143204
chunked_reader = rw.read.ChunkedReader(scene_objects_chunk)
144205

145-
imported_objects = {}
146206
for chunk_id, chunk_data in chunked_reader:
147207
_read_scene_object(chunk_data, imported_objects, import_context)
148208

0 commit comments

Comments
 (0)