From 8a68e4d7534c16915b4f88f7b53bc3b0e241fb84 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Sun, 8 Dec 2019 12:20:07 +0100 Subject: [PATCH 01/10] Support 8-byte bit fields --- pyffi/object_models/xml/bit_struct.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyffi/object_models/xml/bit_struct.py b/pyffi/object_models/xml/bit_struct.py index 3f39d3244..4720dbc41 100644 --- a/pyffi/object_models/xml/bit_struct.py +++ b/pyffi/object_models/xml/bit_struct.py @@ -68,6 +68,8 @@ def __init__(cls, name, bases, dct): cls._struct = 'H' elif cls._numbytes == 4: cls._struct = 'I' + elif cls._numbytes == 8: + cls._struct = 'Q' else: raise RuntimeError("unsupported bitstruct numbytes") From e5a2a8ce52faa9cef4f856b726a74af7c8395273 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 16:21:39 +0100 Subject: [PATCH 02/10] Fix ControllerLink node name handling Account for ZT2 style using target_name attribute. --- pyffi/formats/nif/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pyffi/formats/nif/__init__.py b/pyffi/formats/nif/__init__.py index 849336c1e..fe9854272 100644 --- a/pyffi/formats/nif/__init__.py +++ b/pyffi/formats/nif/__init__.py @@ -3344,12 +3344,18 @@ def get_node_name(self): >>> link.get_node_name() b'Bip01' """ - if self.node_name: + # eg. ZT2 + if self.target_name: + return self.target_name + # eg. Fallout + elif self.node_name: return self.node_name + # eg. Loki (StringPalette) else: return self._get_string(self.node_name_offset) def set_node_name(self, text): + self.target_name = text self.node_name = text self.node_name_offset = self._add_string(text) From ec59bc70ea64b2ff91d8c0bd5bf471aa3c101daf Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 16:44:03 +0100 Subject: [PATCH 03/10] Rewrite NiTriShapeData.set_triangles() without next() For py 3.7 --- pyffi/formats/nif/__init__.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pyffi/formats/nif/__init__.py b/pyffi/formats/nif/__init__.py index fe9854272..d7def0294 100644 --- a/pyffi/formats/nif/__init__.py +++ b/pyffi/formats/nif/__init__.py @@ -7011,12 +7011,9 @@ def set_triangles(self, triangles, stitchstrips = False): self.has_triangles = (n > 0) self.triangles.update_size() - # copy triangles - src = triangles.__iter__() - dst = self.triangles.__iter__() - for k in range(n): - dst_t = next(dst) - dst_t.v_1, dst_t.v_2, dst_t.v_3 = next(src) + # set triangles to triangles array + for dst_t, src_t in zip(self.triangles, triangles): + dst_t.v_1, dst_t.v_2, dst_t.v_3 = src_t def get_strips(self): return pyffi.utils.vertex_cache.stripify(self.get_triangles()) From aef05a7b46ea314cadc4c02b7ac9105c298374e8 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 16:50:37 +0100 Subject: [PATCH 04/10] Rewrite MeshChunk.get_uv_triangles() without next for py 3.7 --- pyffi/formats/cgf/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyffi/formats/cgf/__init__.py b/pyffi/formats/cgf/__init__.py index dedbb9e3a..8b5037e9d 100644 --- a/pyffi/formats/cgf/__init__.py +++ b/pyffi/formats/cgf/__init__.py @@ -1872,9 +1872,9 @@ def get_uv_triangles(self): yield uvface.t_0, uvface.t_1, uvface.t_2 elif self.indices_data: # Crysis: UV triangles coincide with triangles - it = iter(self.indices_data.indices) - while True: - yield next(it), next(it), next(it) + inds = self.indices_data.indices + for i in range(0, len(inds), 3): + yield inds[i], inds[i+1], inds[i+2] ### DEPRECATED: USE set_geometry INSTEAD ### def set_vertices_normals(self, vertices, normals): From 28da4d630af4ac754563db34ef55608768a90399 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 17:01:20 +0100 Subject: [PATCH 05/10] Update cgf format to use zip instead of iter/next For py 3.7 --- pyffi/formats/cgf/__init__.py | 37 ++++++++++------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/pyffi/formats/cgf/__init__.py b/pyffi/formats/cgf/__init__.py index 8b5037e9d..353509d36 100644 --- a/pyffi/formats/cgf/__init__.py +++ b/pyffi/formats/cgf/__init__.py @@ -2450,20 +2450,15 @@ def set_geometry(self, # Far Cry data preparation self.num_vertices = numvertices self.vertices.update_size() - selfvertices_iter = iter(self.vertices) self.num_faces = numtriangles self.faces.update_size() - selffaces_iter = iter(self.faces) if not uvslist is None: self.num_uvs = numvertices self.uvs.update_size() self.uv_faces.update_size() - selfuvs_iter = iter(self.uvs) - selfuv_faces_iter = iter(self.uv_faces) if not colorslist is None: self.has_vertex_colors = True self.vertex_colors.update_size() - selfvertex_colors_iter = iter(self.vertex_colors) # Crysis data preparation self.num_indices = numtriangles * 3 @@ -2473,14 +2468,12 @@ def set_geometry(self, self.vertices_data.bytes_per_element = 12 self.vertices_data.num_elements = numvertices self.vertices_data.vertices.update_size() - selfvertices_data_iter = iter(self.vertices_data.vertices) self.normals_data = CgfFormat.DataStreamChunk() self.normals_data.data_stream_type = CgfFormat.DataStreamType.NORMALS self.normals_data.bytes_per_element = 12 self.normals_data.num_elements = numvertices self.normals_data.normals.update_size() - selfnormals_data_iter = iter(self.normals_data.normals) self.indices_data = CgfFormat.DataStreamChunk() self.indices_data.data_stream_type = CgfFormat.DataStreamType.INDICES @@ -2495,7 +2488,6 @@ def set_geometry(self, self.uvs_data.bytes_per_element = 8 self.uvs_data.num_elements = numvertices self.uvs_data.uvs.update_size() - selfuvs_data_iter = iter(self.uvs_data.uvs) # have tangent space has_tangentspace = True else: @@ -2509,7 +2501,6 @@ def set_geometry(self, self.colors_data.bytes_per_element = 4 self.colors_data.num_elements = numvertices self.colors_data.rgba_colors.update_size() - selfcolors_data_iter = iter(self.colors_data.rgba_colors) self.num_mesh_subsets = len(verticeslist) self.mesh_subsets = CgfFormat.MeshSubsetsChunk() @@ -2546,8 +2537,7 @@ def set_geometry(self, meshsubset.center.z = center[2] # set vertex coordinates and normals for Far Cry - for vert, norm in zip(vertices, normals): - cryvert = next(selfvertices_iter) + for cryvert, vert, norm in zip(self.vertices, vertices, normals): cryvert.p.x = vert[0] cryvert.p.y = vert[1] cryvert.p.z = vert[2] @@ -2556,9 +2546,9 @@ def set_geometry(self, cryvert.n.z = norm[2] # set vertex coordinates and normals for Crysis - for vert, norm in zip(vertices, normals): - cryvert = next(selfvertices_data_iter) - crynorm = next(selfnormals_data_iter) + for cryvert, crynorm, vert, norm in zip( + self.vertices_data.vertices, self.normals_data.normals, vertices, normals): + cryvert.x = vert[0] cryvert.y = vert[1] cryvert.z = vert[2] @@ -2567,8 +2557,7 @@ def set_geometry(self, crynorm.z = norm[2] # set Far Cry face info - for triangle in triangles: - cryface = next(selffaces_iter) + for cryface, triangle in zip(self.faces, triangles): cryface.v_0 = triangle[0] + firstvertexindex cryface.v_1 = triangle[1] + firstvertexindex cryface.v_2 = triangle[2] + firstvertexindex @@ -2581,34 +2570,29 @@ def set_geometry(self, if not uvs is None: # set Far Cry uv info - for triangle in triangles: - cryuvface = next(selfuv_faces_iter) + for cryuvface, triangle in zip(self.uv_faces, triangles): cryuvface.t_0 = triangle[0] + firstvertexindex cryuvface.t_1 = triangle[1] + firstvertexindex cryuvface.t_2 = triangle[2] + firstvertexindex - for uv in uvs: - cryuv = next(selfuvs_iter) + for cryuv, uv in zip(self.uvs, uvs): cryuv.u = uv[0] cryuv.v = uv[1] # set Crysis uv info - for uv in uvs: - cryuv = next(selfuvs_data_iter) + for cryuv, uv in zip(self.uvs_data.uvs, uvs): cryuv.u = uv[0] cryuv.v = 1.0 - uv[1] # OpenGL fix if not colors is None: # set Far Cry color info - for color in colors: - crycolor = next(selfvertex_colors_iter) + for crycolor, color in zip(self.vertex_colors, colors): crycolor.r = color[0] crycolor.g = color[1] crycolor.b = color[2] # note: Far Cry does not support alpha color channel # set Crysis color info - for color in colors: - crycolor = next(selfcolors_data_iter) + for crycolor, color in zip(self.colors_data.rgba_colors, colors): crycolor.r = color[0] crycolor.g = color[1] crycolor.b = color[2] @@ -2640,7 +2624,6 @@ def update_tangent_space(self): self.tangents_data.bytes_per_element = 16 self.tangents_data.num_elements = self.num_vertices self.tangents_data.tangents.update_size() - selftangents_data_iter = iter(self.tangents_data.tangents) # set Crysis tangents info tangents, binormals, orientations = pyffi.utils.tangentspace.getTangentSpace( From dd1686227581cb575a3e529edc85fd3b15048dac Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 17:33:09 +0100 Subject: [PATCH 06/10] Update tristrip without next, add comments for py 3.7 --- pyffi/utils/tristrip.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pyffi/utils/tristrip.py b/pyffi/utils/tristrip.py index 9f16bd07f..4267e7239 100644 --- a/pyffi/utils/tristrip.py +++ b/pyffi/utils/tristrip.py @@ -58,21 +58,22 @@ def triangulate(strips): for strip in strips: if len(strip) < 3: continue # skip empty strips - i = strip.__iter__() - j = False - t1, t2 = next(i), next(i) - for k in range(2, len(strip)): - j = not j - t0, t1, t2 = t1, t2, next(i) + # flips the order of verts in every other tri + flip = False + for i in range(0, len(strip)-2): + flip = not flip + t0, t1, t2 = strip[i:i+3] + # skip degenerate tri if t0 == t1 or t1 == t2 or t2 == t0: continue - triangles.append((t0, t1, t2) if j else (t0, t2, t1)) + # append tri in correct order + triangles.append((t0, t1, t2) if flip else (t0, t2, t1)) return triangles def _generate_faces_from_triangles(triangles): - i = triangles.__iter__() - while True: - yield (next(i), next(i), next(i)) + """Creates faces (tris) from a flat list of non-overlapping triangle indices""" + for i in range(0, len(triangles), 3): + yield triangles[i], triangles[i+1], triangles[i+2] def _sort_triangle_indices(triangles): """Sorts indices of each triangle so lowest index always comes first. From 7407470e7d275c03d66508cca4f641371ad6ac74 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 17:36:27 +0100 Subject: [PATCH 07/10] Remove next calls from fraps_minaxavg.py For py 3.7 --- tests/perf/fraps_minmaxavg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/perf/fraps_minmaxavg.py b/tests/perf/fraps_minmaxavg.py index b5fea925f..a1c6c3eeb 100644 --- a/tests/perf/fraps_minmaxavg.py +++ b/tests/perf/fraps_minmaxavg.py @@ -55,8 +55,8 @@ print("parsing {0}".format(name)) with open(os.path.join(root, name), "rb") as csvfile: rows = csv.reader(csvfile) - header = next(rows) - numbers = next(rows) + header = rows[0] + numbers = rows[1] for name, num in zip(header, numbers): name = name.strip() total[root][name].append(float(num)) From cd511588c1b7810e749f62991f0624fb96635dd8 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 17:40:41 +0100 Subject: [PATCH 08/10] Update quickhull qhull3d without next For py 3.7 --- pyffi/utils/quickhull.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyffi/utils/quickhull.py b/pyffi/utils/quickhull.py index 3044bd234..8de7f9b20 100644 --- a/pyffi/utils/quickhull.py +++ b/pyffi/utils/quickhull.py @@ -347,8 +347,8 @@ def qhull3d(vertices, precision = 0.0001, verbose = False): # as long as there are triangles with outer vertices while outer_vertices: # grab a triangle and its outer vertices - tmp_iter = iter(outer_vertices.items()) - triangle, outer = next(tmp_iter) # tmp_iter trick to make 2to3 work + # trick to make 2to3 work + triangle, outer = outer_vertices.items()[0] # calculate pivot point pivot = max(outer)[1] if verbose: From cd917e202766eae48ffb46d48bcfa68e99ddf607 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 17:53:32 +0100 Subject: [PATCH 09/10] Possible fix for triangulate make list copy incase input data does not like slice notation --- pyffi/utils/tristrip.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyffi/utils/tristrip.py b/pyffi/utils/tristrip.py index 4267e7239..a8c07ceda 100644 --- a/pyffi/utils/tristrip.py +++ b/pyffi/utils/tristrip.py @@ -58,11 +58,13 @@ def triangulate(strips): for strip in strips: if len(strip) < 3: continue # skip empty strips + # make list copy incase input data does not like slice notation + strip_list = list(strip) # flips the order of verts in every other tri flip = False - for i in range(0, len(strip)-2): + for i in range(0, len(strip_list)-2): flip = not flip - t0, t1, t2 = strip[i:i+3] + t0, t1, t2 = strip_list[i:i+3] # skip degenerate tri if t0 == t1 or t1 == t2 or t2 == t0: continue # append tri in correct order From d6b13172305b832641e158b6a194c376f4c5b816 Mon Sep 17 00:00:00 2001 From: HENDRIX-ZT2 Date: Fri, 13 Dec 2019 18:11:57 +0100 Subject: [PATCH 10/10] Fix quickhull error --- pyffi/utils/quickhull.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyffi/utils/quickhull.py b/pyffi/utils/quickhull.py index 8de7f9b20..d778d9180 100644 --- a/pyffi/utils/quickhull.py +++ b/pyffi/utils/quickhull.py @@ -348,7 +348,7 @@ def qhull3d(vertices, precision = 0.0001, verbose = False): while outer_vertices: # grab a triangle and its outer vertices # trick to make 2to3 work - triangle, outer = outer_vertices.items()[0] + triangle, outer = list(outer_vertices.items())[0] # calculate pivot point pivot = max(outer)[1] if verbose: