[Bf-blender-cvs] [86b20df] cycles-ptex-49: Code cleanup: simplify Ptex mesh-from-image functions

Nicholas Bishop noreply at git.blender.org
Thu Feb 12 14:16:43 CET 2015


Commit: 86b20df1dcbd10075243d1ff727de1314c6be1d5
Author: Nicholas Bishop
Date:   Wed Feb 11 20:35:25 2015 +0100
Branches: cycles-ptex-49
https://developer.blender.org/rB86b20df1dcbd10075243d1ff727de1314c6be1d5

Code cleanup: simplify Ptex mesh-from-image functions

===================================================================

M	extern/ptex/bpx_c_api.cpp

===================================================================

diff --git a/extern/ptex/bpx_c_api.cpp b/extern/ptex/bpx_c_api.cpp
index 5660e93..c1178ef 100644
--- a/extern/ptex/bpx_c_api.cpp
+++ b/extern/ptex/bpx_c_api.cpp
@@ -617,77 +617,37 @@ bool BPX_image_buf_resize(BPXImageBuf *bpx_dst, BPXImageBuf *bpx_src)
 	return ImageBufAlgo::resize(dst, src);
 }
 
-static const int QUAD_NUM_SIDES = 4;
-struct BPXPtexFaceSpec {
-	int h;
-	int w;
-	int qw[QUAD_NUM_SIDES];
-	int qh[QUAD_NUM_SIDES];
-	bool subface;
-};
-typedef std::vector<BPXPtexFaceSpec> BPXPtexFaceSpecVec;
-
 // TODO, messy code
 
-static BPXPtexFaceSpec bpx_ptex_face_spec(const ImageSpec &spec,
-										  const bool subface)
+static const int *bpx_array_attrib(const char *key, const ImageSpec &spec,
+								   int &r_len)
 {
-	BPXPtexFaceSpec result;
+	r_len = 0;
 
-	// TODO
-	result.subface = subface;
-
-	result.w = spec.width;
-	result.h = spec.height;
-	if (!result.subface) {
-		const int hw = std::max(1, result.w / 2);
-		const int hh = std::max(1, result.h / 2);
-		int i;
-		for (i = 0; i < QUAD_NUM_SIDES; i++) {
-			if (i % 2 == 0) {
-				result.qw[i] = hw;
-				result.qh[i] = hh;
-			}
-			else {
-				result.qw[i] = hh;
-				result.qh[i] = hw;
-			}
-		}
+	const ImageIOParameter *p = spec.find_attribute(key);
+	if (!p || p->type().basetype != TypeDesc::INT32) {
+		return NULL;
 	}
-	
-	return result;
-}
 
-// Return number of subimages.
-//
-// TODO(nicholasbishop): probably a more direct way to access this
-// somehow?
-static int bpx_ptex_num_subimages(const std::vector<int> &face_vert_counts)
-{
-	const size_t end = face_vert_counts.size();
-	int count = 0;
-	for (size_t i = 0; i < end; i++) {
-		const int verts_in_face = face_vert_counts[i];
-		count += (verts_in_face == 4) ? 1 : verts_in_face;
+	const int *src = static_cast<const int *>(p->data());
+	if (src) {
+		r_len = p->type().numelements();
 	}
-	return count;
+
+	return src;
 }
 
 // Reset vector as a copy of image metadata
 static bool bpx_array_attrib_copy(std::vector<int> &vec, const char *key,
 								  const ImageSpec &spec)
 {
-	const ImageIOParameter *p = spec.find_attribute(key);
-	if (!p || p->type().basetype != TypeDesc::INT32) {
-		return false;
-	}
-
-	const int *src = static_cast<const int *>(p->data());
+	int len = 0;
+	const int *src = bpx_array_attrib(key, spec, len);
 	if (!src) {
 		return false;
 	}
 
-	vec = std::vector<int>(src, src + p->type().numelements());
+	vec = std::vector<int>(src, src + len);
 	return true;
 }
 
@@ -699,11 +659,6 @@ static bool bpx_array_attrib_copy(std::vector<int> &vec, const char *key,
 //
 // Reference for Ptex standard metakeys: http://ptex.us/metakeys.html
 
-static bool bpx_ptex_face_vert_counts(std::vector<int> &vec, ImageInput &in)
-{
-	return bpx_array_attrib_copy(vec, "PtexFaceVertCounts", in.spec());
-}
-
 static bool bpx_ptex_face_vert_indices(std::vector<int> &vec, ImageInput &in)
 {
 	return bpx_array_attrib_copy(vec, "PtexFaceVertIndices", in.spec());
@@ -728,30 +683,47 @@ struct BPXMeshEdge {
 	int faces[2];
 };
 
+struct BPXPtexMeshFace {
+	int len;
+
+	// Index of the face's first vertex within the face_vert_indices
+	// vector. The same index is used for accessing layout items.
+	int vert_index;
+
+	// Index of the face's first Ptex face in the file. Quads count as
+	// one image, all other polygons have as many subfaces as
+	// vertices.
+	int subimage;
+};
+
 // Outer vector index is a vertex index. The vertex stored in the
 // BPXMeshEdge is the whichever one has a higher index.
 //
 // TODO(nicholasbishop)
 typedef std::vector<std::vector<BPXMeshEdge> > BPXMeshEdges;
 
-static bool bpx_ptex_file_mesh_edges(BPXMeshEdges &edges,
-									 const std::vector<int> &face_vert_counts,
-									 const std::vector<int> &face_vert_indices)
+struct BPXPtexMesh {
+	std::vector<BPXPtexMeshFace> faces;
+	std::vector<int> face_vert_indices;
+	BPXMeshEdges edges;
+};
+
+static bool bpx_ptex_mesh_edges_init(BPXPtexMesh &mesh)
 {
-	const int num_verts = bpx_ptex_num_verts(face_vert_indices);
-	const int num_faces = face_vert_counts.size();
+	const int num_mesh_verts = bpx_ptex_num_verts(mesh.face_vert_indices);
 
-	edges.clear();
-	edges.resize(num_verts);
+	mesh.edges.clear();
+	mesh.edges.resize(num_mesh_verts);
 
-	int vstart = 0;
+	const int num_faces = mesh.faces.size();
 	for (int face_index = 0; face_index < num_faces; face_index++) {
-		const int num_verts = face_vert_counts[face_index];
-		const int *verts = &face_vert_indices[vstart];
+		const BPXPtexMeshFace &face = mesh.faces[face_index];
+		const int num_fv = face.len;
+		const int *verts = &mesh.face_vert_indices[face.vert_index];
 
-		for (int fv = 0; fv < num_verts; fv++) {
+		for (int fv = 0; fv < num_fv; fv++) {
 			int v1 = verts[fv];
-			int v2 = verts[(fv + 1) % num_verts];
+			int v2 = verts[(fv + 1) % num_fv];
 			if (v1 > v2) {
 				std::swap(v1, v2);
 			}
@@ -759,7 +731,7 @@ static bool bpx_ptex_file_mesh_edges(BPXMeshEdges &edges,
 				return false;
 			}
 
-			std::vector<BPXMeshEdge> &vec = edges.at(v1);
+			std::vector<BPXMeshEdge> &vec = mesh.edges.at(v1);
 			bool found = false;
 			for (int k = 0; k < vec.size(); k++) {
 				BPXMeshEdge &edge = vec[k];
@@ -783,11 +755,9 @@ static bool bpx_ptex_file_mesh_edges(BPXMeshEdges &edges,
 
 			if (!found) {
 				const BPXMeshEdge e = {v2, {face_index, BPX_ADJ_NONE}};
-				edges.at(v1).push_back(e);
+				mesh.edges.at(v1).push_back(e);
 			}
 		}
-
-		vstart += num_verts;
 	}
 
 	return true;
@@ -803,15 +773,7 @@ static BPXRect bpx_rect_from_layout_item(const BPXPackedLayout::Item &item)
 	return rect;
 }
 
-// TODO(nicholasbishop): lots of terrible code here, clean this up...
-
-struct BPXPtexMesh {
-	std::vector<int> face_vert_counts;
-	std::vector<int> face_vert_indices;
-	std::vector<int> face_to_region_map;
-	BPXMeshEdges edges;
-	int num_faces;
-};
+// TODO(nicholasbishop): still some stupid code, clean this up...
 
 static const BPXMeshEdge *bpx_mesh_edge_find(const BPXPtexMesh &mesh, int v1,
 											 int v2)
@@ -845,13 +807,12 @@ static int bpx_mesh_face_find_edge(const BPXPtexMesh &mesh,
 								   const int face_index,
 								   const BPXMeshEdge &e1)
 {
-	const int nsides1 = mesh.face_vert_counts.at(face_index);
-	const int region1 = mesh.face_to_region_map.at(face_index);
+	const int region1 = mesh.faces.at(face_index).vert_index;
 
-	const int num_fv = mesh.face_vert_counts[face_index];
+	const int num_fv = mesh.faces[face_index].len;
 	for (int fv = 0; fv < num_fv; fv++) {
 		const int v1 = mesh.face_vert_indices[region1 + fv];
-		const int v2 = mesh.face_vert_indices[region1 + (fv + 1) % nsides1];
+		const int v2 = mesh.face_vert_indices[region1 + (fv + 1) % num_fv];
 		const BPXMeshEdge *e2 = bpx_mesh_edge_find(mesh, v1, v2);
 		if (&e1 == e2) {
 			return fv;
@@ -866,8 +827,8 @@ static bool bpx_ptex_adj_layout_item(int &adj_layout_item, BPXEdge &adj_edge,
 									 const int f1, const int fv1,
 									 const BPXRectSide &side1)
 {
-	const int nsides1 = mesh.face_vert_counts.at(f1);
-	const int region1 = mesh.face_to_region_map.at(f1);
+	const int nsides1 = mesh.faces.at(f1).len;
+	const int region1 = mesh.faces.at(f1).vert_index;
 
 	const int v1 = mesh.face_vert_indices[region1 + fv1];
 	const int vn = mesh.face_vert_indices[region1 + (fv1 + 1) % nsides1];
@@ -913,8 +874,8 @@ static bool bpx_ptex_adj_layout_item(int &adj_layout_item, BPXEdge &adj_edge,
 			return true;
 		}
 
-		const int nsides2 = mesh.face_vert_counts.at(f2);
-		const int region2 = mesh.face_to_region_map.at(f2);
+		const int nsides2 = mesh.faces.at(f2).len;
+		const int region2 = mesh.faces.at(f2).vert_index;
 
 		// Find same edge in other face
 		const int fv2 = bpx_mesh_face_find_edge(mesh, f2, *edge);
@@ -943,27 +904,32 @@ static bool bpx_ptex_adj_layout_item(int &adj_layout_item, BPXEdge &adj_edge,
 
 static bool bpx_ptex_mesh_init(BPXPtexMesh &mesh, ImageInput &src)
 {
-	if (!bpx_ptex_face_vert_counts(mesh.face_vert_counts, src)) {
+	int num_faces = 0;
+	const int *face_vert_counts = bpx_array_attrib("PtexFaceVertCounts",
+												   src.spec(), num_faces);
+	if (!face_vert_counts) {
 		return false;
 	}
 
-	mesh.num_faces = mesh.face_vert_counts.size();
-
 	if (!bpx_ptex_face_vert_indices(mesh.face_vert_indices, src)) {
 		return false;
 	}
 
-	if (!bpx_ptex_file_mesh_edges(mesh.edges, mesh.face_vert_counts,
-								  mesh.face_vert_indices))
-	{
-		return false;
+	mesh.faces.resize(num_faces);
+	int cur_vert = 0;
+	int cur_subimage = 0;
+	for (int i = 0; i < num_faces; i++) {
+		const int face_len = face_vert_counts[i];
+
+		mesh.faces[i].len = face_len;
+		mesh.faces[i].vert_index = cur_vert;
+		mesh.faces[i].subimage = cur_subimage;
+		cur_vert += face_len;
+		cur_subimage += (face_len == 4) ? 1 : face_len;
 	}
 
-	mesh.face_to_region_map.reserve(mesh.num_faces);
-	int cur_layout_item = 0;
-	for (int face_index = 0; face_index < mesh.num_faces; face_index++) {
-		mesh.face_to_region_map.push_back(cur_layout_item);
-		cur_layout_item += mesh.face_vert_counts[face_index];
+	if (!bpx_ptex_mesh_edges_init(mesh)) {
+		return false;
 	}
 
 	return true;
@@ -980,9 +946,11 @@ static bool bpx_ptex_filter_borders_update_from_file(ImageBuf &dst,
 
 	const BPXPackedLayout::Items &items = layout.get_items();
 
-	int cur_layout_item = 0;
-	for (int face_index = 0; face_index < mesh.num_faces; face_index++) {
-		for (int fv = 0; fv < mesh.face_vert_counts[face_index]; fv++) {
+	const int num_faces = mesh.faces.size();
+	for (int face_index = 0; face_index < num_faces; face_index++) {
+		const BPXPtexMeshFace &face = mesh.faces[face_index];
+		for (int fv = 0; fv < face.len; fv++) {
+			const int cur_layout_item = face.vert_index + fv;
 			if (cur_layout_item >= items.size()) {
 				return false;
 			}
@@ -1015,53 +983,6 @@ static bool bpx_ptex_filter_borders_update_from_file(ImageBuf &dst,
 			{
 				return false;
 			}
-
-			cur_layout_item++;
-		}
-	}
-
-	return true;
-}
-
-static bool bpx_ptex_face_vector(BPXPtexFaceSpecVec &vec, ImageInput &src)
-{
-	std::vector<int> face_vert_counts;
-	if (!bpx_ptex_face_vert_counts(face_vert_counts, src)) {
-		return false;
-	}
-
-	const int num_faces = face_vert_counts.size();
-	const int num_subimages = bpx_ptex_num_subimages(face_vert_counts);
-	vec.reser

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list