Newer
Older
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
bl_info = {
"name": "Mesh Cache Tools",
"author": "Oscurart",
"version": (1, 0),
"blender": (2, 6, 4),
"location": "Tools > Mesh Cache Tools",
"description": "Tools for Management Mesh Cache Process",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": "Import-Export"}
import bpy
import sys
import os
import struct
bpy.types.Scene.muu_pc2_rotx = bpy.props.BoolProperty(default=True, name="Rotx = 90")
bpy.types.Scene.muu_pc2_world_space = bpy.props.BoolProperty(default=True, name="World Space")
bpy.types.Scene.muu_pc2_modifiers = bpy.props.BoolProperty(default=True, name="Apply Modifiers")
bpy.types.Scene.muu_pc2_subsurf = bpy.props.BoolProperty(default=True, name="Turn Off SubSurf")
bpy.types.Scene.muu_pc2_start = bpy.props.IntProperty(default=0, name="Frame Start")
bpy.types.Scene.muu_pc2_end = bpy.props.IntProperty(default=100, name="Frame End")
bpy.types.Scene.muu_pc2_group = bpy.props.StringProperty()
bpy.types.Scene.muu_pc2_folder = bpy.props.StringProperty(default="Set me Please!")
class OscEPc2ExporterPanel(bpy.types.Panel):
"""Creates a Panel in the Object properties window"""
bl_label = "Mesh Cache Tools"
bl_idname = "Mesh Cache Tools"
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
def draw(self, context):
layout = self.layout
obj = context.object
row= layout.column(align=1)
row.prop(bpy.context.scene,"muu_pc2_folder",text="Folder")
row.operator("import_shape.pc2_copy" , icon='FILESEL', text="Set Filepath")
row = layout.box().column(align=1)
row.label("EXPORTER:")
row.operator("group.linked_group_to_local", text="Linked To Local" , icon="LINKED")
row.operator("object.remove_subsurf_modifier" , text="Remove Gen Modifiers" , icon="MOD_SUBSURF")
row.operator("export_shape.pc2_selection", text="Export!" , icon="POSE_DATA")
#row.prop(bpy.context.scene,"muu_pc2_rotx", text= "RotX90")
row.prop(bpy.context.scene,"muu_pc2_world_space", text="World Space")
#row.prop(bpy.context.scene,"muu_pc2_modifiers", text="Apply Modifiers")
#row.prop(bpy.context.scene,"muu_pc2_subsurf", text="Turn Off SubSurf")
row = layout.column(align=1)
row.prop(bpy.context.scene,"muu_pc2_start", text="Frame Start")
row.prop(bpy.context.scene,"muu_pc2_end", text="Frame End")
row.prop_search(bpy.context.scene, "muu_pc2_group", bpy.data, "groups", text= "")
row = layout.box().column(align=1)
row.label("IMPORTER:")
row.operator("import_shape.pc2_selection", text="Import", icon="POSE_DATA")
def OscFuncExportPc2(self):
start = bpy.context.scene.muu_pc2_start
end = bpy.context.scene.muu_pc2_end
folderpath = bpy.context.scene.muu_pc2_folder
for ob in bpy.data.groups[bpy.context.scene.muu_pc2_group].objects[:]:
pc2list = []
if ob.type == "MESH":
with open("%s/%s.pc2" % (os.path.normpath(folderpath),ob.name), mode="wb") as file:
#encabezado
headerFormat='<12siiffi'
headerStr = struct.pack(headerFormat,
b'POINTCACHE2\0', 1, len(ob.data.vertices[:]), 0, 1.0, (end+1)-start)
file.write(headerStr)
#bakeado
obmat = ob.matrix_world
for frame in range((end+1)-start):
print("Percentage of %s bake: %s " % ( ob.name, frame/end*100))
bpy.context.scene.frame_set(frame)
me = bpy.data.meshes.new_from_object(
scene=bpy.context.scene,
object=ob,
apply_modifiers=True,
settings="RENDER",
calc_tessface=True,
calc_undeformed=False)
#rotate
if bpy.context.scene.muu_pc2_world_space:
me.transform(obmat)
me.calc_normals()
#creo archivo
for vert in me.vertices[:]:
pc2list.append((
float(vert.co[0]),
float(vert.co[1]),
float(vert.co[2])
))
#dreno mesh
bpy.data.meshes.remove(me)
print("%s Bake finished! \nAwaiting Compile file..." % (ob.name))
# write file
for i,frame in enumerate(pc2list):
#print("Percentage of %s Compiled file: %s " % ( ob.name, i*100/len(pc2list)))
file.write(struct.pack("<3f", *frame))
print("%s File Compiled Write finished!" % (ob.name))
del(pc2list)
print("Bake Finished!")
class OscPc2ExporterBatch(bpy.types.Operator):
bl_idname = "export_shape.pc2_selection"
bl_label = "Export pc2 for selected Objects"
bl_description = "Export pc2 for selected Objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
OscFuncExportPc2(self)
return {'FINISHED'}
class OscRemoveSubsurf(bpy.types.Operator):
bl_idname = "object.remove_subsurf_modifier"
bl_label = "Remove SubSurf Modifier"
bl_description = "Remove SubSurf Modifier"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
GENERATE = ['MULTIRES', 'ARRAY', 'BEVEL', 'BOOLEAN', 'BUILD', 'DECIMATE', 'MASK', 'MIRROR', 'REMESH', 'SCREW', 'SKIN', 'SOLIDIFY', 'SUBSURF', 'TRIANGULATE']
for OBJ in bpy.data.groups[bpy.context.scene.muu_pc2_group].objects[:]:
for MOD in OBJ.modifiers[:]:
if MOD.type in GENERATE:
OBJ.modifiers.remove(MOD)
return {'FINISHED'}
class OscPc2iMporterBatch(bpy.types.Operator):
bl_idname = "import_shape.pc2_selection"
bl_label = "Import pc2 for selected Objects"
bl_description = "Import pc2 for selected Objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
for OBJ in bpy.context.selected_objects[:]:
MOD=OBJ.modifiers.new("MeshCache", 'MESH_CACHE')
MOD.filepath="%s%s%s.pc2" % (bpy.context.scene.muu_pc2_folder,os.sep,OBJ.name)
MOD.cache_format = "PC2"
MOD.forward_axis = "POS_Y"
MOD.up_axis = "POS_Z"
MOD.flip_axis = set(())
return {'FINISHED'}
class OscPc2iMporterCopy(bpy.types.Operator):
bl_idname = "import_shape.pc2_copy"
bl_label = "Copy Filepath"
bl_description = "Copy Filepath"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
bpy.context.scene.muu_pc2_folder=str(bpy.data.filepath.rpartition(os.sep)[0])
return {'FINISHED'}
def OscLinkedGroupToLocal():
ACTOBJ = bpy.context.active_object
GROBJS = [ob for ob in ACTOBJ.id_data.dupli_group.objects[:] if ob.type == "MESH"]
for ob in ACTOBJ.id_data.dupli_group.objects[:]:
bpy.context.scene.objects.link(ob)
NEWGROUP = bpy.data.groups.new("%s_CLEAN" % (ACTOBJ.name))
bpy.context.scene.objects.unlink(ACTOBJ)
NEWOBJ = []
for ob in GROBJS:
NEWGROUP.objects.link(ob)
NEWOBJ.append(ob)
for ob in NEWOBJ:
if ob.type == "MESH":
if len(ob.modifiers):
for MODIFIER in ob.modifiers[:]:
if MODIFIER.type == "SUBSURF" or MODIFIER.type == "MASK":
ob.modifiers.remove(MODIFIER)
class OscGroupLinkedToLocal(bpy.types.Operator):
bl_idname = "group.linked_group_to_local"
bl_label = "Group Linked To Local"
bl_description = "Group Linked To Local"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
OscLinkedGroupToLocal()
return {'FINISHED'}
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()
import bpy