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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to