103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
import bpy
|
|
import bmesh
|
|
from mathutils import Vector, Matrix
|
|
from bpy_extras import mesh_utils
|
|
from .utils import bound_box_center, contour_loops, get_object_color
|
|
|
|
|
|
def get_picker_datas(objects, canvas, rig):
|
|
picker_datas = []
|
|
gamma = 1 / 2.2
|
|
|
|
if canvas.type =='CURVE':
|
|
canvas_points = canvas.data.splines[0].points
|
|
else:
|
|
canvas_points = canvas.data.vertices
|
|
|
|
canvas_coords = [canvas.matrix_world@Vector((p.co)) for p in canvas_points]
|
|
|
|
canvas_x = [p[0] for p in canvas_coords]
|
|
canvas_y = [p[1] for p in canvas_coords]
|
|
|
|
canvas_center = sum(canvas_coords, Vector()) / len(canvas_coords)
|
|
canvas_scale_fac = 1024 / (max(canvas_y) - min(canvas_y))# Reference height for the canvas
|
|
|
|
objects.append(canvas)
|
|
|
|
dg = bpy.context.evaluated_depsgraph_get()
|
|
|
|
#sorted by their z axes
|
|
for ob in sorted(objects, key=lambda x: bound_box_center(x)[2]):
|
|
|
|
|
|
print('Storing shape', ob.name)
|
|
mesh = bpy.data.meshes.new_from_object(ob.evaluated_get(dg))
|
|
|
|
bm = bmesh.new()
|
|
bm.from_mesh(mesh)
|
|
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.002)
|
|
bmesh.ops.dissolve_limit(bm, angle_limit=0.001745, verts=bm.verts, edges=bm.edges)
|
|
|
|
bmesh.ops.connect_verts_concave(bm, faces=bm.faces)
|
|
bmesh.ops.triangulate(bm, faces=bm.faces)
|
|
|
|
#bm_loops = contour_loops(bm)
|
|
#loops = [[l.index for l in loop] for loop in bm_loops]
|
|
loops = []
|
|
|
|
edges = [[v.index for v in e.verts] for e in bm.edges if len(e.link_faces)<=1]
|
|
|
|
bm.to_mesh(mesh)
|
|
mesh.update()
|
|
bm.clear()
|
|
|
|
points = []
|
|
#edges = []
|
|
polygons = []
|
|
|
|
for p in mesh.vertices:
|
|
point = ob.matrix_world@Vector((p.co))
|
|
point = (point - canvas_center) * canvas_scale_fac
|
|
points.append([round(point[0]), round(point[1])])
|
|
|
|
for f in mesh.polygons:
|
|
polygons.append([v for v in f.vertices])
|
|
|
|
#for e in mesh.edges:
|
|
#
|
|
# edges.append([v for v in e.vertices])
|
|
|
|
color = get_object_color(ob)
|
|
if color:
|
|
color = [round(pow(c, gamma), 4) for c in color]
|
|
else:
|
|
color = [0.5, 0.5, 0.5]
|
|
|
|
shape = {
|
|
'tooltip': ob.rig_picker.name,
|
|
'points': points,
|
|
'polygons': polygons,
|
|
'edges': edges,
|
|
'loops': loops,
|
|
'color': color,
|
|
'type': 'CANVAS' if ob == canvas else ob.rig_picker.shape_type
|
|
}
|
|
|
|
if shape['type'] =='OPERATOR':
|
|
shape['operator'] = ob.rig_picker.operator
|
|
#if ob.rig_picker.arguments:
|
|
#shape['arguments'] = ob.rig_picker.arguments
|
|
#if ob.rig_picker.shortcut:
|
|
shape['shortcut'] = ob.rig_picker.shortcut
|
|
|
|
elif shape['type'] =='BONE':
|
|
shape['bone'] = ob.rig_picker.name
|
|
|
|
picker_datas.append(shape)
|
|
|
|
|
|
print(picker_datas)
|
|
|
|
return picker_datas
|
|
#rig.data.rig_picker['shapes'] = picker_datas
|