void TriangleMesh::ReadFromPerl(SV* vertices, SV* facets) { stl.stats.type = inmemory; // count facets and allocate memory AV* facets_av = (AV*)SvRV(facets); stl.stats.number_of_facets = av_len(facets_av)+1; stl.stats.original_num_facets = stl.stats.number_of_facets; stl_allocate(&stl); // read geometry AV* vertices_av = (AV*)SvRV(vertices); for (unsigned int i = 0; i < stl.stats.number_of_facets; i++) { AV* facet_av = (AV*)SvRV(*av_fetch(facets_av, i, 0)); stl_facet facet; facet.normal.x = 0; facet.normal.y = 0; facet.normal.z = 0; for (unsigned int v = 0; v <= 2; v++) { AV* vertex_av = (AV*)SvRV(*av_fetch(vertices_av, SvIV(*av_fetch(facet_av, v, 0)), 0)); facet.vertex[v].x = SvNV(*av_fetch(vertex_av, 0, 0)); facet.vertex[v].y = SvNV(*av_fetch(vertex_av, 1, 0)); facet.vertex[v].z = SvNV(*av_fetch(vertex_av, 2, 0)); } facet.extra[0] = 0; facet.extra[1] = 0; stl.facet_start[i] = facet; } stl_get_size(&(this->stl)); }
void stl_open(stl_file *stl, char *file) { stl_initialize(stl); stl_count_facets(stl, file); stl_allocate(stl); stl_read(stl, 0, 1); if (!stl->error) fclose(stl->fp); }
TriangleMeshPtrs TriangleMesh::split() const { TriangleMeshPtrs meshes; std::set<int> seen_facets; // we need neighbors if (!this->repaired) CONFESS("split() requires repair()"); // loop while we have remaining facets while (1) { // get the first facet std::queue<int> facet_queue; std::deque<int> facets; for (int facet_idx = 0; facet_idx < this->stl.stats.number_of_facets; facet_idx++) { if (seen_facets.find(facet_idx) == seen_facets.end()) { // if facet was not seen put it into queue and start searching facet_queue.push(facet_idx); break; } } if (facet_queue.empty()) break; while (!facet_queue.empty()) { int facet_idx = facet_queue.front(); facet_queue.pop(); if (seen_facets.find(facet_idx) != seen_facets.end()) continue; facets.push_back(facet_idx); for (int j = 0; j <= 2; j++) { facet_queue.push(this->stl.neighbors_start[facet_idx].neighbor[j]); } seen_facets.insert(facet_idx); } TriangleMesh* mesh = new TriangleMesh; meshes.push_back(mesh); mesh->stl.stats.type = inmemory; mesh->stl.stats.number_of_facets = facets.size(); mesh->stl.stats.original_num_facets = mesh->stl.stats.number_of_facets; stl_allocate(&mesh->stl); for (std::deque<int>::const_iterator facet = facets.begin(); facet != facets.end(); facet++) { mesh->stl.facet_start[facet - facets.begin()] = this->stl.facet_start[*facet]; } } return meshes; }