Added line paths.

This commit is contained in:
Holden Green
2018-07-04 21:21:56 -07:00
parent 7a88cddefc
commit 3edca81a75

View File

@@ -236,9 +236,14 @@ typedef struct {
std::vector<tag_t> tags; // SubD tag
} mesh_t;
typedef struct {
std::vector<int> indices; // pairs of indices for lines
} path_t;
typedef struct {
std::string name;
mesh_t mesh;
path_t path;
} shape_t;
// Vertex attributes
@@ -401,6 +406,11 @@ struct face_t {
face_t() : smoothing_group_id(0) {}
};
struct line_t {
int idx0;
int idx1;
};
struct tag_sizes {
tag_sizes() : num_ints(0), num_reals(0), num_strings(0) {}
int num_ints;
@@ -1015,15 +1025,17 @@ static int pnpoly(int nvert, T *vertx, T *verty, T testx,
}
// TODO(syoyo): refactor function.
static bool exportFaceGroupToShape(shape_t *shape,
static bool exportGroupsToShape(shape_t *shape,
const std::vector<face_t> &faceGroup,
const std::vector<int> &lineGroup,
const std::vector<tag_t> &tags,
const int material_id,
const std::string &name, bool triangulate,
const std::vector<real_t> &v) {
if (faceGroup.empty()) {
return false;
}
if (!faceGroup.empty()) {
// Flatten vertices and indices
for (size_t i = 0; i < faceGroup.size(); i++) {
@@ -1031,10 +1043,11 @@ static bool exportFaceGroupToShape(shape_t *shape,
size_t npolys = face.vertex_indices.size();
/*
if (npolys < 3) {
// Face must have 3+ vertices.
continue;
}
}*/
vertex_index_t i0 = face.vertex_indices[0];
vertex_index_t i1(-1);
@@ -1254,6 +1267,12 @@ static bool exportFaceGroupToShape(shape_t *shape,
shape->name = name;
shape->mesh.tags = tags;
}
if(!lineGroup.empty()){
shape->path.indices = std::move(lineGroup);
}
return true;
}
@@ -1765,6 +1784,7 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
std::vector<real_t> vc;
std::vector<tag_t> tags;
std::vector<face_t> faceGroup;
std::vector<int> lineGroup;
std::string name;
// material
@@ -1842,6 +1862,32 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
continue;
}
// line
if (token[0] == 'l' && IS_SPACE((token[1]))){
token += 2;
line_t line_cache;
bool end_line_bit = 0;
while(!IS_NEW_LINE(token[0])){
//get index from string
int idx;
fixIndex(parseInt(&token), 0, &idx);
// move to next space or end of string (\0 / \n)
token += strcspn(token, " \t\r")+1;
if(!end_line_bit){
line_cache.idx0 = idx;
} else {
line_cache.idx1 = idx;
lineGroup.push_back(line_cache.idx0);
lineGroup.push_back(line_cache.idx1);
line_cache = line_t();
}
end_line_bit = !end_line_bit;
}
continue;
}
// face
if (token[0] == 'f' && IS_SPACE((token[1]))) {
token += 2;
@@ -1892,7 +1938,7 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
// Create per-face material. Thus we don't add `shape` to `shapes` at
// this time.
// just clear `faceGroup` after `exportFaceGroupToShape()` call.
exportFaceGroupToShape(&shape, faceGroup, tags, material, name,
exportGroupsToShape(&shape, faceGroup, lineGroup, tags, material, name,
triangulate, v);
faceGroup.clear();
material = newMaterialId;
@@ -1947,7 +1993,7 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
// group name
if (token[0] == 'g' && IS_SPACE((token[1]))) {
// flush previous face group.
bool ret = exportFaceGroupToShape(&shape, faceGroup, tags, material, name,
bool ret = exportGroupsToShape(&shape, faceGroup, lineGroup, tags, material, name,
triangulate, v);
(void)ret; // return value not used.
@@ -1984,7 +2030,7 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
// object name
if (token[0] == 'o' && IS_SPACE((token[1]))) {
// flush previous face group.
bool ret = exportFaceGroupToShape(&shape, faceGroup, tags, material, name,
bool ret = exportGroupsToShape(&shape, faceGroup, lineGroup, tags, material, name,
triangulate, v);
if (ret) {
shapes->push_back(shape);
@@ -2092,7 +2138,7 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
// Ignore unknown command.
}
bool ret = exportFaceGroupToShape(&shape, faceGroup, tags, material, name,
bool ret = exportGroupsToShape(&shape, faceGroup, lineGroup, tags, material, name,
triangulate, v);
// exportFaceGroupToShape return false when `usemtl` is called in the last
// line.
@@ -2103,6 +2149,12 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
}
faceGroup.clear(); // for safety
for(int i=0;i<lineGroup.size();i++){
//printf("facegroup indices size: %i\n", faceGroup[i].vertex_indices.size());
printf("linegroup[%i]: %i\n", i, lineGroup[i]);
}
if (err) {
(*err) += errss.str();
}