def display_mesh_data(vmesh): for attrib in vmesh.vertattrib: usage = modmesh.D3DDECLUSAGE(attrib.usage).name offset = int(attrib.offset / vmesh.vertformat) vartype = modmesh.D3DDECLTYPE(attrib.vartype).name vlen = len(modmesh.D3DDECLTYPE(attrib.vartype)) print('\n### {} {} ###'.format(usage, vartype)) for i in range(vmesh.vertnum): vstart = offset + i * int(vmesh.vertstride / vmesh.vertformat) data = vmesh.vertices[vstart:vstart + vlen] print('[{}] [{}] {},'.format(i, vstart, tuple(data))) print('\n### INDICES ###\n') face_vid = 0 for id_vertex in vmesh.index: face_vid += 1 vstart = id_vertex * int(vmesh.vertstride / vmesh.vertformat) vdata = vmesh.vertices[vstart:vstart + 3] print('[{}] {},'.format(id_vertex, tuple(vdata))) if face_vid == 3: face_vid = 0 print('')
def print_vertex_data(vmesh, vid, vattribute): for attrib_id, attrib in enumerate(vmesh.vertattrib): usage = modmesh.D3DDECLUSAGE(attrib.usage).name offset = int(attrib.offset / vmesh.vertformat) vartype = modmesh.D3DDECLTYPE(attrib.vartype).name vlen = len(modmesh.D3DDECLTYPE(attrib.vartype)) if usage == vattribute: vstart = offset + vid * int(vmesh.vertstride / vmesh.vertformat) vdata = vmesh.vertices[vstart:vstart + vlen] print('[{}]{} = {}'.format(vid, vattribute, vdata))
def remove_attribute(vmesh, attrib_to_remove): print('start size vmesh.vertices = {}'.format(len(vmesh.vertices))) vsize = int(vmesh.vertstride / vmesh.vertformat) offset_attrib = 0 attrib_id_to_remove = 0 total_data_removed = 0 for attrib_id, attrib in enumerate(vmesh.vertattrib): usage = modmesh.D3DDECLUSAGE(attrib.usage).name offset = int(attrib.offset / vmesh.vertformat) vartype = modmesh.D3DDECLTYPE(attrib.vartype).name vlen = len(modmesh.D3DDECLTYPE(attrib.vartype)) if usage == attrib_to_remove: print('REMOVING DATA for {}'.format(usage)) offset_attrib = vlen * vmesh.vertformat attrib_id_to_remove = attrib_id for vertid in range(vmesh.vertnum - 1, -1, -1): vstart = offset + vertid * vsize total_data_removed += vlen print( 'removing [{}]{}:{} from vertices, {} removed total, current len = {}' .format(vertid, vstart, vstart + vlen, total_data_removed, len(vmesh.vertices))) del vmesh.vertices[vstart:vstart + vlen] if offset_attrib != 0 and offset != 0: new_attrib_offset = attrib.offset - offset_attrib print('MOVING {} offset from {} to {} by {} bytes'.format( usage, attrib.offset, new_attrib_offset, offset_attrib)) attrib.offset = new_attrib_offset # remove attribute from table if attrib_id_to_remove != 0: # fix vertstride reduce_stride_by = len( modmesh.D3DDECLTYPE(vmesh.vertattrib[attrib_id_to_remove].vartype) ) * vmesh.vertformat print('REDUCING STRIDE from {} to {} by {} bytes'.format( vmesh.vertstride, vmesh.vertstride - reduce_stride_by, reduce_stride_by)) vmesh.vertstride = vmesh.vertstride - reduce_stride_by del vmesh.vertattrib[attrib_id_to_remove] # fix attrib table len vmesh.vertattribnum = len(vmesh.vertattrib) print('vmesh.vertattribnum = {}'.format(vmesh.vertattribnum)) print('new vertices array len = {} after {} removed'.format( len(vmesh.vertices), total_data_removed))
def edit_vertex(vmesh, vid, vattribute, vdata): for attrib_id, attrib in enumerate(vmesh.vertattrib): usage = modmesh.D3DDECLUSAGE(attrib.usage).name offset = int(attrib.offset / vmesh.vertformat) vartype = modmesh.D3DDECLTYPE(attrib.vartype).name vlen = len(modmesh.D3DDECLTYPE(attrib.vartype)) if usage == vattribute: print('SETTING DATA for v[{}] {}'.format(vid, vattribute)) for vertid in range(vmesh.vertnum - 1, -1, -1): vstart = offset + vertid * \ int(vmesh.vertstride / vmesh.vertformat) if vertid == vid: for i, data in enumerate(vdata): vmesh.vertices[vstart + i] = data
def _create_vertstride(self): self.vertstride = sum([ len(modmesh.D3DDECLTYPE(attrib.vartype)) * self.vertformat for attrib in self.vertattrib ])