def parse_main(s): p = 0 block_id, p = u(I, s, p) block_size, p = u(I, s, p) wallmarks_count, p = u(I, s, p) for i in range(wallmarks_count): set_count, p = u(I, s, p) shader, p = utils.parse_string_nul(s, p) texture, p = utils.parse_string_nul(s, p) for i in range(set_count): bounds, p = u(f * 4, s, p) vertex_count, p = u(I, s, p) vertices = [] uvs = [] for i in range(vertex_count): vertex, p = u(f * 3 + I + f * 2, s, p) vertices.append((vertex[0], vertex[2], vertex[1])) uvs.append((vertex[4], 1 - vertex[5])) # generate faces triangles = [] index = 0 for i in range(vertex_count // 3): triangles.append((index, index + 2, index + 1)) index += 3 import_utils.crete_mesh(vertices, triangles, None, None, uvs, texture)
def parse_mesh(data, mesh_id): position = 0 shader, position = utils.parse_string_nul(data, position) texture, position = utils.parse_string_nul(data, position) mesh_info, position = u('IffII', data, position) flags, min_scale, max_scale, vertices_count, indices_count = mesh_info vertices = [] uvs = [] for vertex_id in range(vertices_count): vertex_data, position = u('5f', data, position) position_x, position_y, position_z, uv_x, uv_y = vertex_data vertices.append((position_x, position_z, position_y)) uvs.append((uv_x, 1 - uv_y)) triangles = [] for index_id in range(indices_count // 3): triangle_data, position = u('3H', data, position) index_1, index_2, index_3 = triangle_data triangles.append((index_1, index_3, index_2)) import_utils.crete_mesh(vertices, triangles, uvs=uvs, image='details\\build_details')
def details_data_parse(details_data): position = 0 while position < len(details_data): position, block_id, block_size = utils.read_block( position, details_data) if block_id == 0x0: slots_coords = parse_header( details_data[position:position + block_size], coord_y) position += block_size import_utils.crete_mesh(slots_coords) elif block_id == 0x1: parse_meshes(details_data[position:position + block_size]) position += block_size elif block_id == 0x2: coord_y = parse_slots(details_data[position:position + block_size]) position += block_size else: print(' ! UNKNOW BLOCK ({0}) {1} BYTES'.format( hex(block_id), block_size)) position += block_size
import bpy, utils, parse_cform, import_utils, time from utils import unpack_data as u start_time = time.time() data = utils.read_bin_file('level', 'cform', 'c:\\') verts, faces, material_indices, materials = parse_cform.parse_cform(data) import_utils.crete_mesh(verts, faces, materials, material_indices) finish_time = time.time() print('total time: {:.5}s'.format(finish_time-start_time))
import time, utils, import_utils, dm_parse start_time = time.time() dm_file_path = 'c:\\' dm_file_name = 'rain' dm_file_ext = 'dm' dm_data = utils.read_bin_file(dm_file_name, dm_file_ext, dm_file_path) vertices, uvs, triangles, texture_name = dm_parse.parse_main(dm_data) import_utils.crete_mesh(vertices, triangles, uvs=uvs, image=texture_name) finish_time = time.time() print('total time: {}s'.format(finish_time - start_time))
import utils, import_utils