feat: mesh dump refactoring wip
This commit is contained in:
@ -19,82 +19,90 @@
|
|||||||
import bpy
|
import bpy
|
||||||
import bmesh
|
import bmesh
|
||||||
import mathutils
|
import mathutils
|
||||||
|
import logging
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
from .. import utils
|
from .. import utils
|
||||||
from ..libs.replication.replication.constants import DIFF_BINARY
|
from ..libs.replication.replication.constants import DIFF_BINARY
|
||||||
from .bl_datablock import BlDatablock
|
from .bl_datablock import BlDatablock
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def dump_mesh(mesh, data={}):
|
def dump_mesh(mesh, data={}):
|
||||||
import bmesh
|
import bmesh
|
||||||
|
|
||||||
mesh_data = data
|
mesh_data = data
|
||||||
mesh_buffer = bmesh.new()
|
|
||||||
|
|
||||||
# https://blog.michelanders.nl/2016/02/copying-vertices-to-numpy-arrays-in_4.html
|
# https://blog.michelanders.nl/2016/02/copying-vertices-to-numpy-arrays-in_4.html
|
||||||
mesh_buffer.from_mesh(mesh)
|
|
||||||
|
|
||||||
uv_layer = mesh_buffer.loops.layers.uv.verify()
|
# VERTICES
|
||||||
bevel_layer = mesh_buffer.verts.layers.bevel_weight.verify()
|
start = utils.current_milli_time()
|
||||||
skin_layer = mesh_buffer.verts.layers.skin.verify()
|
|
||||||
|
|
||||||
verts = {}
|
vert_count = len(mesh.vertices)
|
||||||
for vert in mesh_buffer.verts:
|
shape = (vert_count, 3)
|
||||||
v = {}
|
|
||||||
v["co"] = list(vert.co)
|
|
||||||
|
|
||||||
# vert metadata
|
verts_co = np.empty(vert_count*3, dtype=np.float64)
|
||||||
v['bevel'] = vert[bevel_layer]
|
mesh.vertices.foreach_get('co', verts_co)
|
||||||
v['normal'] = list(vert.normal)
|
# verts_co.shape = shape
|
||||||
# v['skin'] = list(vert[skin_layer])
|
mesh_data["verts_co"] = verts_co.tobytes()
|
||||||
|
|
||||||
verts[str(vert.index)] = v
|
verts_normal = np.empty(vert_count*3, dtype=np.float64)
|
||||||
|
mesh.vertices.foreach_get('normal', verts_normal)
|
||||||
|
# verts_normal.shape = shape
|
||||||
|
mesh_data["verts_normal"] = verts_normal.tobytes()
|
||||||
|
|
||||||
mesh_data["verts"] = verts
|
verts_bevel = np.empty(vert_count, dtype=np.float64)
|
||||||
|
mesh.vertices.foreach_get('bevel_weight', verts_bevel)
|
||||||
|
mesh_data["verts_bevel"] = verts_bevel.tobytes()
|
||||||
|
|
||||||
edges = {}
|
logger.error(f"verts {utils.current_milli_time()-start} ms")
|
||||||
for edge in mesh_buffer.edges:
|
|
||||||
e = {}
|
|
||||||
e["verts"] = [edge.verts[0].index, edge.verts[1].index]
|
|
||||||
|
|
||||||
# Edge metadata
|
# EDGES
|
||||||
e["smooth"] = edge.smooth
|
start = utils.current_milli_time()
|
||||||
|
edge_count = len(mesh.edges)
|
||||||
|
|
||||||
edges[edge.index] = e
|
edges_vert = np.empty(edge_count*2, dtype=np.int)
|
||||||
mesh_data["edges"] = edges
|
mesh.edges.foreach_get('vertices', edges_vert)
|
||||||
|
# edges_vert.shape = (edge_count, 2)
|
||||||
|
mesh_data["egdes_vert"] = edges_vert.tobytes()
|
||||||
|
|
||||||
faces = {}
|
logger.error(f"edges {utils.current_milli_time()-start} ms")
|
||||||
for face in mesh_buffer.faces:
|
|
||||||
f = {}
|
|
||||||
fverts = []
|
|
||||||
for vert in face.verts:
|
|
||||||
fverts.append(vert.index)
|
|
||||||
|
|
||||||
f["verts"] = fverts
|
start = utils.current_milli_time()
|
||||||
f["material_index"] = face.material_index
|
|
||||||
f["smooth"] = face.smooth
|
|
||||||
f["normal"] = list(face.normal)
|
|
||||||
f["index"] = face.index
|
|
||||||
|
|
||||||
uvs = []
|
# POLYGONS
|
||||||
# Face metadata
|
start = utils.current_milli_time()
|
||||||
for loop in face.loops:
|
poly_count = len(mesh.polygons)
|
||||||
loop_uv = loop[uv_layer]
|
|
||||||
|
|
||||||
uvs.append(list(loop_uv.uv))
|
poly_mat = np.empty(poly_count, dtype=np.int)
|
||||||
|
mesh.polygons.foreach_get("material_index", poly_mat)
|
||||||
|
mesh_data["poly_mat"] = poly_mat.tobytes()
|
||||||
|
|
||||||
f["uv"] = uvs
|
poly_loop_start = np.empty(poly_count, dtype=np.int)
|
||||||
faces[face.index] = f
|
mesh.polygons.foreach_get("loop_start", poly_loop_start)
|
||||||
|
mesh_data["poly_loop_start"] = poly_loop_start.tobytes()
|
||||||
|
|
||||||
mesh_data["faces"] = faces
|
poly_loop_total = np.empty(poly_count, dtype=np.int)
|
||||||
|
mesh.polygons.foreach_get("loop_total", poly_loop_total)
|
||||||
|
mesh_data["poly_loop_total"] = poly_loop_total.tobytes()
|
||||||
|
|
||||||
uv_layers = []
|
poly_smooth = np.empty(poly_count, dtype=np.bool)
|
||||||
for uv_layer in mesh.uv_layers:
|
mesh.polygons.foreach_get("use_smooth", poly_smooth)
|
||||||
uv_layers.append(uv_layer.name)
|
mesh_data["poly_smooth"] = poly_smooth.tobytes()
|
||||||
|
|
||||||
mesh_data["uv_layers"] = uv_layers
|
logger.error(f"polygons {utils.current_milli_time()-start} ms")
|
||||||
# return mesh_data
|
|
||||||
|
|
||||||
|
# UV
|
||||||
|
start = utils.current_milli_time()
|
||||||
|
mesh_data['uv_layers'] = {}
|
||||||
|
for layer in mesh.uv_layers:
|
||||||
|
mesh_data['uv_layers'][layer.name] = {}
|
||||||
|
|
||||||
|
uv_layer = np.empty(len(layer.data)*2, dtype=np.float64)
|
||||||
|
layer.data.foreach_get("uv", uv_layer)
|
||||||
|
|
||||||
|
mesh_data['uv_layers'][layer.name]['data'] = uv_layer.tobytes()
|
||||||
|
|
||||||
|
logger.error(f"uvs {utils.current_milli_time()-start} ms")
|
||||||
|
|
||||||
class BlMesh(BlDatablock):
|
class BlMesh(BlDatablock):
|
||||||
bl_id = "meshes"
|
bl_id = "meshes"
|
||||||
@ -174,8 +182,12 @@ class BlMesh(BlDatablock):
|
|||||||
'use_auto_smooth',
|
'use_auto_smooth',
|
||||||
'auto_smooth_angle'
|
'auto_smooth_angle'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
data = dumper.dump(pointer)
|
data = dumper.dump(pointer)
|
||||||
|
|
||||||
dump_mesh(pointer, data)
|
dump_mesh(pointer, data)
|
||||||
|
|
||||||
# Fix material index
|
# Fix material index
|
||||||
m_list = []
|
m_list = []
|
||||||
for material in pointer.materials:
|
for material in pointer.materials:
|
||||||
|
@ -22,6 +22,7 @@ import os
|
|||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
|
|
||||||
@ -176,3 +177,6 @@ def resolve_from_id(id, optionnal_type=None):
|
|||||||
|
|
||||||
def get_preferences():
|
def get_preferences():
|
||||||
return bpy.context.preferences.addons[__package__].preferences
|
return bpy.context.preferences.addons[__package__].preferences
|
||||||
|
|
||||||
|
def current_milli_time():
|
||||||
|
return int(round(time.time() * 1000))
|
Reference in New Issue
Block a user