[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