/******************************************************************************/ #include "stdafx.h" namespace EE{ /****************************************************************************** void MeshBase::corridor(MeshBase &mshb, Int e0, Int e1) // add 'mshb' and create en edged corridor between 'e0' (from self) and 'e1' (from 'mshb') edges { if(edge.flag() && mshb.edge.flag()) { if(this==&mshb) { if(e0==e1)return; }else { e1+=edges(); add(mshb); } VecI2 i0=edge.ind (e0), i1=edge.ind (e1); UInt f0=edge.flag(e0); edge.flag(e0)|=ETQ_LR; UInt f1=edge.flag(e1); edge.flag(e1)|=ETQ_LR; Int id0, id1, id_value, *p0, *p1; if((f0&ETQ_LR)==ETQ_L){i0.reverse(); if(edge.id()){id0=edge.id(e0).y; p0=&edge.id(e0).x;}}else if(edge.id()){id0=edge.id(e0).x; p0=&edge.id(e0).y;} if((f1&ETQ_LR)==ETQ_L){i1.reverse(); if(edge.id()){id1=edge.id(e1).y; p1=&edge.id(e1).x;}}else if(edge.id()){id1=edge.id(e1).x; p1=&edge.id(e1).y;} if(edge.ind()) { id_value=id0; *p0=id_value; *p1=id_value; } addEdge(VecI2(i0.c[0], i1.c[1])); edge.flag(edges()-1)=ETQ_R; if(edge.id())edge.id(edges()-1).set(id_value, -1); addEdge(VecI2(i1.c[0], i0.c[1])); edge.flag(edges()-1)=ETQ_R; if(edge.id())edge.id(edges()-1).set(id_value, -1); } } /******************************************************************************/ void MeshBase::split(MemPtr meshes, C Boxes &boxes, UInt flag_and)C { C Int *p; flag_and&=((VTX_ALL&~VTX_DUP)|EDGE_NRM|EDGE_FLAG|EDGE_ID|TRI_NRM|TRI_FLAG|TRI_ID|QUAD_NRM|QUAD_FLAG|QUAD_ID)&flag(); // link box->edge,tri,quad Index box_edge(boxes.num()); Index box_tri (boxes.num()); Index box_quad(boxes.num()); { Int * _box= Alloc(Max(edges(), tris(), quads())); Int *edge_box=_box; FREPA(edge){p=edge.ind(i).c; box_edge.incGroup(edge_box[i]=boxes.index(Avg(vtx.pos(p[0]), vtx.pos(p[1]) )));} box_edge.set(edge_box); Int * tri_box=_box; FREPA(tri ){p=tri .ind(i).c; box_tri .incGroup( tri_box[i]=boxes.index(Avg(vtx.pos(p[0]), vtx.pos(p[1]), vtx.pos(p[2]) )));} box_tri .set( tri_box); Int *quad_box=_box; FREPA(quad){p=quad.ind(i).c; box_quad.incGroup(quad_box[i]=boxes.index(Avg(vtx.pos(p[0]), vtx.pos(p[1]), vtx.pos(p[2]), vtx.pos(p[3]))));} box_quad.set(quad_box); Free(_box); } // create boxes meshes.clear(); Memt vtx_is; vtx_is.setNum(vtxs()); Memt vtx_remap; FREP(boxes.num()) { Int *_edge=box_edge.group[i].elm, edges=box_edge.group[i].num, *_tri =box_tri .group[i].elm, tris =box_tri .group[i].num, *_quad=box_quad.group[i].elm, quads=box_quad.group[i].num; if(edges || tris || quads) { MeshBaseIndex &mesh=meshes.New(); mesh.index=i; mesh.create(0, edges, tris, quads, flag_and); CopyList(mesh.edge.ind (), edge.ind (), MemPtr(_edge, edges)); CopyList(mesh.edge.nrm (), edge.nrm (), MemPtr(_edge, edges)); CopyList(mesh.edge.flag(), edge.flag(), MemPtr(_edge, edges)); CopyList(mesh.edge.id (), edge.id (), MemPtr(_edge, edges)); CopyList(mesh.tri.ind (), tri.ind (), MemPtr(_tri, tris)); CopyList(mesh.tri.nrm (), tri.nrm (), MemPtr(_tri, tris)); CopyList(mesh.tri.flag(), tri.flag(), MemPtr(_tri, tris)); CopyList(mesh.tri.id (), tri.id (), MemPtr(_tri, tris)); CopyList(mesh.quad.ind (), quad.ind (), MemPtr(_quad, quads)); CopyList(mesh.quad.nrm (), quad.nrm (), MemPtr(_quad, quads)); CopyList(mesh.quad.flag(), quad.flag(), MemPtr(_quad, quads)); CopyList(mesh.quad.id (), quad.id (), MemPtr(_quad, quads)); Zero(vtx_is.data(), vtx_is.elms()); REPAD(j, mesh.edge){p=mesh.edge.ind(j).c; REPD(k, 2)vtx_is[p[k]]=true;} REPAD(j, mesh.tri ){p=mesh.tri .ind(j).c; REPD(k, 3)vtx_is[p[k]]=true;} REPAD(j, mesh.quad){p=mesh.quad.ind(j).c; REPD(k, 4)vtx_is[p[k]]=true;} SetRemap(vtx_remap, vtx_is , vtxs ()); IndRemap(vtx_remap, mesh.edge.ind(), mesh.edges()); IndRemap(vtx_remap, mesh.tri .ind(), mesh.tris ()); IndRemap(vtx_remap, mesh.quad.ind(), mesh.quads()); mesh.vtx._elms=CountIs(vtx_is); mesh.include(flag_and); mesh.copyVtxs(T, vtx_is); } } } void MeshBase::split(MemPtr meshes, C VecI &cells, UInt flag_and)C { split(meshes, Boxes(Box(T), cells), flag_and); } /******************************************************************************/ void MeshBase::splitVtxs(MeshBase &dest, C MemPtr &vtx_is, UInt flag_and) { if(this!=&dest) { if(!vtx_is.elms())dest.del();else { Memt is, is2; is.setNum(vtx.elms()); Int i=0, elms=Min(is.elms(), vtx.elms()); for(; i< elms ; i++)is[i]=vtx_is[i]; for(; i vtx_remap; SetRemap(vtx_remap, is, vtxs()); IndRemap(vtx_remap, dest.edge.ind(), dest.edges()); IndRemap(vtx_remap, dest. tri.ind(), dest. tris()); IndRemap(vtx_remap, dest.quad.ind(), dest.quads()); // remove from self is2.setNum(vtx.elms()); // select vertexes that are left for(i=0; i< elms ; i++)is2[i]=!vtx_is[i]; for( ; i &edge_is, C MemPtr &tri_is, C MemPtr &quad_is, UInt flag_and) { if(this!=&dest) { if(!edge_is.elms() && !tri_is.elms() && !quad_is.elms())dest.del();else { // copy copyFace(dest, edge_is, tri_is, quad_is, flag_and); // remove from original Memt edge_nis; edge_nis.setNum(edges()); if(!edge_is)SetMem(edge_nis.data(), 1, edge_nis.elms());else{Int i=0, elms=Min(edge_is.elms(), edge_nis.elms()); for(; i tri_nis; tri_nis.setNum(tris ()); if(! tri_is)SetMem( tri_nis.data(), 1, tri_nis.elms());else{Int i=0, elms=Min( tri_is.elms(), tri_nis.elms()); for(; i quad_nis; quad_nis.setNum(quads()); if(!quad_is)SetMem(quad_nis.data(), 1, quad_nis.elms());else{Int i=0, elms=Min(quad_is.elms(), quad_nis.elms()); for(; i vtx_bone, tri_is, quad_is; vtx_bone.setNum(vtxs ()); tri_is .setNum(tris ()); quad_is .setNum(quads()); // create copy REPA(vtx )vtx_bone[i]=(matrix[i].c[0]-1==bone); REPA(tri ){is=false; p=tri .ind(i).c; REPD(j, 3)if(vtx_bone[p[j]]){is=true; break;} tri_is[i]=is;} REPA(quad){is=false; p=quad.ind(i).c; REPD(j, 4)if(vtx_bone[p[j]]){is=true; break;} quad_is[i]=is;} // split splitFaces(dest, null, tri_is, quad_is, flag_and); }else { dest.del(); } } } /******************************************************************************/ } /******************************************************************************/