-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexport_pac.py
More file actions
62 lines (49 loc) · 2.19 KB
/
export_pac.py
File metadata and controls
62 lines (49 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from . import export_pmo
from . import export_skel
from .export_pmo import warning
from .containers import TMH, PAC, ColorLimitError
from .model import P3RD_MODEL, FU_MODEL
from struct import pack
import bpy
class NoSkeletonError(Exception):
...
def export(context, filepath: str, version: str, target: str = 'scene', prepare_pmo: str = "none", cleanup_vg: bool = False, p3rd_helmet: bool = False, face_flags: tuple[bool] | None = None, hairflags: int | None = None, phys_id: int | None = None, app_modifiers: bool = False, hard_tristripification: bool = False, do_fix_vg: bool = False):
try:
skeletons = [obj for obj in bpy.data.objects if obj.type == "EMPTY" and not obj.parent]
if len(skeletons) == 0:
raise NoSkeletonError()
pac = PAC()
ver = P3RD_MODEL if version == "1.2" else FU_MODEL
pmo, textures = export_pmo.export(ver, target, prepare_pmo, cleanup_vg, get_textures=True, apply_modifiers=app_modifiers, hard_tristripification=hard_tristripification, do_fix_vg=do_fix_vg)
if isinstance(pmo, int):
return {'CANCELLED'}
f = pac.add()
pmo.save(f)
f = pac.add()
skeleton = skeletons[0]
if skeleton.type == "EMPTY":
bones = export_skel.bonesFromEmpties(skeleton)
elif skeleton.type == "ARMATURE":
export_skel.bonesFromArmature(skeleton)
else:
return {'CANCELLED'}
if ver == P3RD_MODEL:
export_skel.export_p3rd_skel(bones, f)
elif ver == FU_MODEL:
export_skel.export_fu_skel(bones, f)
f = pac.add()
tmh = TMH()
for texture in textures:
tmh.loadImg(texture)
tmh.buildTMH(f)
if p3rd_helmet:
f = pac.add()
f.write(pack("<2HI", sum([2**p for p, v in enumerate(face_flags) if v]), hairflags, phys_id))
pac.save(filepath)
return {'FINISHED'}
except ColorLimitError:
warning(["Color count over 256."], "Error")
return {'CANCELLED'}
except NoSkeletonError:
warning(["Scene doesn't contain a valid skeleton."], "Error")
return {'CANCELLED'}