@@ -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
131189def _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
139199def _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