feat: mesh dump refactoring wip

This commit is contained in:
Swann
2020-03-23 17:55:10 +01:00
parent 01faa94a9a
commit 90d4bb0e47
2 changed files with 67 additions and 51 deletions

View File

@ -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:

View File

@ -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))