From f8db8a3faa30b71dca33ced38be16d3f93f43e8a Mon Sep 17 00:00:00 2001 From: Rémi Verschelde Date: Sun, 19 Mar 2017 00:36:26 +0100 Subject: Bring that Whole New World to the Old Continent too Applies the clang-format style to the 2.1 branch as done for master in 5dbf1809c6e3e905b94b8764e99491e608122261. --- core/math/triangle_mesh.cpp | 418 ++++++++++++++++++++------------------------ 1 file changed, 192 insertions(+), 226 deletions(-) (limited to 'core/math/triangle_mesh.cpp') diff --git a/core/math/triangle_mesh.cpp b/core/math/triangle_mesh.cpp index 125727aa7..9046396f1 100644 --- a/core/math/triangle_mesh.cpp +++ b/core/math/triangle_mesh.cpp @@ -29,81 +29,73 @@ #include "triangle_mesh.h" #include "sort.h" +int TriangleMesh::_create_bvh(BVH *p_bvh, BVH **p_bb, int p_from, int p_size, int p_depth, int &max_depth, int &max_alloc) { - -int TriangleMesh::_create_bvh(BVH*p_bvh,BVH** p_bb,int p_from,int p_size,int p_depth,int&max_depth,int&max_alloc) { - - - if (p_depth>max_depth) { - max_depth=p_depth; + if (p_depth > max_depth) { + max_depth = p_depth; } - if (p_size==1) { + if (p_size == 1) { - - return p_bb[p_from]-p_bvh; - } else if (p_size==0) { + return p_bb[p_from] - p_bvh; + } else if (p_size == 0) { return -1; } - AABB aabb; - aabb=p_bb[p_from]->aabb; - for(int i=1;iaabb; + for (int i = 1; i < p_size; i++) { - aabb.merge_with(p_bb[p_from+i]->aabb); + aabb.merge_with(p_bb[p_from + i]->aabb); } - int li=aabb.get_longest_axis_index(); + int li = aabb.get_longest_axis_index(); - switch(li) { + switch (li) { case Vector3::AXIS_X: { - SortArray sort_x; - sort_x.nth_element(0,p_size,p_size/2,&p_bb[p_from]); + SortArray sort_x; + sort_x.nth_element(0, p_size, p_size / 2, &p_bb[p_from]); //sort_x.sort(&p_bb[p_from],p_size); } break; case Vector3::AXIS_Y: { - SortArray sort_y; - sort_y.nth_element(0,p_size,p_size/2,&p_bb[p_from]); + SortArray sort_y; + sort_y.nth_element(0, p_size, p_size / 2, &p_bb[p_from]); //sort_y.sort(&p_bb[p_from],p_size); } break; case Vector3::AXIS_Z: { - SortArray sort_z; - sort_z.nth_element(0,p_size,p_size/2,&p_bb[p_from]); + SortArray sort_z; + sort_z.nth_element(0, p_size, p_size / 2, &p_bb[p_from]); //sort_z.sort(&p_bb[p_from],p_size); } break; } + int left = _create_bvh(p_bvh, p_bb, p_from, p_size / 2, p_depth + 1, max_depth, max_alloc); + int right = _create_bvh(p_bvh, p_bb, p_from + p_size / 2, p_size - p_size / 2, p_depth + 1, max_depth, max_alloc); - int left = _create_bvh(p_bvh,p_bb,p_from,p_size/2,p_depth+1,max_depth,max_alloc); - int right = _create_bvh(p_bvh,p_bb,p_from+p_size/2,p_size-p_size/2,p_depth+1,max_depth,max_alloc); - - int index=max_alloc++; + int index = max_alloc++; BVH *_new = &p_bvh[index]; - _new->aabb=aabb; - _new->center=aabb.pos+aabb.size*0.5; - _new->face_index=-1; - _new->left=left; - _new->right=right; + _new->aabb = aabb; + _new->center = aabb.pos + aabb.size * 0.5; + _new->face_index = -1; + _new->left = left; + _new->right = right; return index; - } +void TriangleMesh::create(const DVector &p_faces) { -void TriangleMesh::create(const DVector& p_faces) { + valid = false; - valid=false; - - int fc=p_faces.size(); - ERR_FAIL_COND(!fc || ((fc%3) != 0)); - fc/=3; + int fc = p_faces.size(); + ERR_FAIL_COND(!fc || ((fc % 3) != 0)); + fc /= 3; triangles.resize(fc); - bvh.resize(fc*3); //will never be larger than this (todo make better) + bvh.resize(fc * 3); //will never be larger than this (todo make better) DVector::Write bw = bvh.write(); { @@ -114,148 +106,143 @@ void TriangleMesh::create(const DVector& p_faces) { DVector::Read r = p_faces.read(); DVector::Write w = triangles.write(); - Map db; + Map db; - for(int i=0;i::Element *E=db.find(vs); + int vidx = -1; + Vector3 vs = v[j].snapped(0.0001); + Map::Element *E = db.find(vs); if (E) { - vidx=E->get(); + vidx = E->get(); } else { - vidx=db.size(); - db[vs]=vidx; + vidx = db.size(); + db[vs] = vidx; } - f.indices[j]=vidx; - if (j==0) - bw[i].aabb.pos=vs; + f.indices[j] = vidx; + if (j == 0) + bw[i].aabb.pos = vs; else bw[i].aabb.expand_to(vs); } - f.normal=Face3(r[i*3+0],r[i*3+1],r[i*3+2]).get_plane().get_normal(); + f.normal = Face3(r[i * 3 + 0], r[i * 3 + 1], r[i * 3 + 2]).get_plane().get_normal(); - bw[i].left=-1; - bw[i].right=-1; - bw[i].face_index=i; - bw[i].center=bw[i].aabb.pos+bw[i].aabb.size*0.5; + bw[i].left = -1; + bw[i].right = -1; + bw[i].face_index = i; + bw[i].center = bw[i].aabb.pos + bw[i].aabb.size * 0.5; } vertices.resize(db.size()); DVector::Write vw = vertices.write(); - for (Map::Element *E=db.front();E;E=E->next()) { - vw[E->get()]=E->key(); + for (Map::Element *E = db.front(); E; E = E->next()) { + vw[E->get()] = E->key(); } - } - DVector bwptrs; + DVector bwptrs; bwptrs.resize(fc); - DVector::Write bwp = bwptrs.write(); - for(int i=0;i::Write bwp = bwptrs.write(); + for (int i = 0; i < fc; i++) { - bwp[i]=&bw[i]; + bwp[i] = &bw[i]; } - max_depth=0; - int max_alloc=fc; - int max=_create_bvh(bw.ptr(),bwp.ptr(),0,fc,1,max_depth,max_alloc); + max_depth = 0; + int max_alloc = fc; + int max = _create_bvh(bw.ptr(), bwp.ptr(), 0, fc, 1, max_depth, max_alloc); - bw=DVector::Write(); //clearup + bw = DVector::Write(); //clearup bvh.resize(max_alloc); //resize back - valid=true; - + valid = true; } +Vector3 TriangleMesh::get_area_normal(const AABB &p_aabb) const { -Vector3 TriangleMesh::get_area_normal(const AABB& p_aabb) const { - - uint32_t* stack = (uint32_t*)alloca(sizeof(int)*max_depth); + uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth); enum { - TEST_AABB_BIT=0, - VISIT_LEFT_BIT=1, - VISIT_RIGHT_BIT=2, - VISIT_DONE_BIT=3, - VISITED_BIT_SHIFT=29, - NODE_IDX_MASK=(1<::Read trianglesr = triangles.read(); - DVector::Read verticesr=vertices.read(); - DVector::Read bvhr=bvh.read(); + DVector::Read verticesr = vertices.read(); + DVector::Read bvhr = bvh.read(); - const Triangle *triangleptr=trianglesr.ptr(); - int pos=bvh.size()-1; + const Triangle *triangleptr = trianglesr.ptr(); + int pos = bvh.size() - 1; const BVH *bvhptr = bvhr.ptr(); - stack[0]=pos; - while(true) { + stack[0] = pos; + while (true) { - uint32_t node = stack[level]&NODE_IDX_MASK; - const BVH &b = bvhptr[ node ]; - bool done=false; + uint32_t node = stack[level] & NODE_IDX_MASK; + const BVH &b = bvhptr[node]; + bool done = false; - switch(stack[level]>>VISITED_BIT_SHIFT) { + switch (stack[level] >> VISITED_BIT_SHIFT) { case TEST_AABB_BIT: { - bool valid = b.aabb.intersects(p_aabb); if (!valid) { - stack[level]=(VISIT_DONE_BIT<=0) { + if (b.face_index >= 0) { - const Triangle &s=triangleptr[ b.face_index ]; - n+=s.normal; + const Triangle &s = triangleptr[b.face_index]; + n += s.normal; n_count++; - stack[level]=(VISIT_DONE_BIT<0) - n/=n_count; + if (n_count > 0) + n /= n_count; return n; - } +bool TriangleMesh::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal) const { -bool TriangleMesh::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_point, Vector3 &r_normal) const { - - - uint32_t* stack = (uint32_t*)alloca(sizeof(int)*max_depth); + uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth); enum { - TEST_AABB_BIT=0, - VISIT_LEFT_BIT=1, - VISIT_RIGHT_BIT=2, - VISIT_DONE_BIT=3, - VISITED_BIT_SHIFT=29, - NODE_IDX_MASK=(1<::Read trianglesr = triangles.read(); - DVector::Read verticesr=vertices.read(); - DVector::Read bvhr=bvh.read(); + DVector::Read verticesr = vertices.read(); + DVector::Read bvhr = bvh.read(); - const Triangle *triangleptr=trianglesr.ptr(); - const Vector3 *vertexptr=verticesr.ptr(); - int pos=bvh.size()-1; + const Triangle *triangleptr = trianglesr.ptr(); + const Vector3 *vertexptr = verticesr.ptr(); + int pos = bvh.size() - 1; const BVH *bvhptr = bvhr.ptr(); - stack[0]=pos; - while(true) { + stack[0] = pos; + while (true) { - uint32_t node = stack[level]&NODE_IDX_MASK; - const BVH &b = bvhptr[ node ]; - bool done=false; + uint32_t node = stack[level] & NODE_IDX_MASK; + const BVH &b = bvhptr[node]; + bool done = false; - switch(stack[level]>>VISITED_BIT_SHIFT) { + switch (stack[level] >> VISITED_BIT_SHIFT) { case TEST_AABB_BIT: { - - bool valid = b.aabb.intersects_segment(p_begin,p_end); -// bool valid = b.aabb.intersects(ray_aabb); + bool valid = b.aabb.intersects_segment(p_begin, p_end); + // bool valid = b.aabb.intersects(ray_aabb); if (!valid) { - stack[level]=(VISIT_DONE_BIT<=0) { - - const Triangle &s=triangleptr[ b.face_index ]; - Face3 f3(vertexptr[ s.indices[0] ],vertexptr[ s.indices[1] ],vertexptr[ s.indices[2] ]); + if (b.face_index >= 0) { + const Triangle &s = triangleptr[b.face_index]; + Face3 f3(vertexptr[s.indices[0]], vertexptr[s.indices[1]], vertexptr[s.indices[2]]); Vector3 res; - if (f3.intersects_segment(p_begin,p_end,&res)) { - + if (f3.intersects_segment(p_begin, p_end, &res)) { float nd = n.dot(res); - if (nd0) - r_normal=-r_normal; + if (n.dot(r_normal) > 0) + r_normal = -r_normal; } return inters; } +bool TriangleMesh::intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal) const { -bool TriangleMesh::intersect_ray(const Vector3& p_begin,const Vector3& p_dir,Vector3 &r_point, Vector3 &r_normal) const { - - - uint32_t* stack = (uint32_t*)alloca(sizeof(int)*max_depth); + uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth); enum { - TEST_AABB_BIT=0, - VISIT_LEFT_BIT=1, - VISIT_RIGHT_BIT=2, - VISIT_DONE_BIT=3, - VISITED_BIT_SHIFT=29, - NODE_IDX_MASK=(1<::Read trianglesr = triangles.read(); - DVector::Read verticesr=vertices.read(); - DVector::Read bvhr=bvh.read(); + DVector::Read verticesr = vertices.read(); + DVector::Read bvhr = bvh.read(); - const Triangle *triangleptr=trianglesr.ptr(); - const Vector3 *vertexptr=verticesr.ptr(); - int pos=bvh.size()-1; + const Triangle *triangleptr = trianglesr.ptr(); + const Vector3 *vertexptr = verticesr.ptr(); + int pos = bvh.size() - 1; const BVH *bvhptr = bvhr.ptr(); - stack[0]=pos; - while(true) { + stack[0] = pos; + while (true) { - uint32_t node = stack[level]&NODE_IDX_MASK; - const BVH &b = bvhptr[ node ]; - bool done=false; + uint32_t node = stack[level] & NODE_IDX_MASK; + const BVH &b = bvhptr[node]; + bool done = false; - switch(stack[level]>>VISITED_BIT_SHIFT) { + switch (stack[level] >> VISITED_BIT_SHIFT) { case TEST_AABB_BIT: { - - bool valid = b.aabb.intersects_ray(p_begin,p_dir); + bool valid = b.aabb.intersects_ray(p_begin, p_dir); if (!valid) { - stack[level]=(VISIT_DONE_BIT<=0) { - - const Triangle &s=triangleptr[ b.face_index ]; - Face3 f3(vertexptr[ s.indices[0] ],vertexptr[ s.indices[1] ],vertexptr[ s.indices[2] ]); + if (b.face_index >= 0) { + const Triangle &s = triangleptr[b.face_index]; + Face3 f3(vertexptr[s.indices[0]], vertexptr[s.indices[1]], vertexptr[s.indices[2]]); Vector3 res; - if (f3.intersects_ray(p_begin,p_dir,&res)) { - + if (f3.intersects_ray(p_begin, p_dir, &res)) { float nd = n.dot(res); - if (nd0) - r_normal=-r_normal; + if (n.dot(r_normal) > 0) + r_normal = -r_normal; } return inters; @@ -536,13 +502,13 @@ DVector TriangleMesh::get_faces() const { int ts = triangles.size(); faces.resize(triangles.size()); - DVector::Write w=faces.write(); + DVector::Write w = faces.write(); DVector::Read r = triangles.read(); DVector::Read rv = vertices.read(); - for(int i=0;i TriangleMesh::get_faces() const { TriangleMesh::TriangleMesh() { - valid=false; - max_depth=0; + valid = false; + max_depth = 0; } -- cgit v1.2.3-70-g09d2