/* static */ void FsLazyWindowApplication::YsShellToVtxNom(std::vector <float> &vtx,std::vector <float> &nom,std::vector <float> &col,const YsShellExt &shl) { vtx.clear(); nom.clear(); col.clear(); for(auto plHd : shl.AllPolygon()) { auto plVtHd=shl.GetPolygonVertex(plHd); if(3<=plVtHd.GetN()) { auto plNom=shl.GetNormal(plHd); for(auto vtHd : plVtHd) { auto vtPos=shl.GetVertexPosition(vtHd); vtx.push_back(vtPos.xf()); vtx.push_back(vtPos.yf()); vtx.push_back(vtPos.zf()); nom.push_back(plNom.xf()); nom.push_back(plNom.yf()); nom.push_back(plNom.zf()); col.push_back(0); col.push_back(0); col.push_back(1); col.push_back(0.5); } } } }
YsShell::PolygonHandle FsLazyWindowApplication::PickedTriangle(int mx,int my) const { YsVec3 o,v; drawEnv.TransformScreenCoordTo3DLine(o,v,mx,my); YsShell::PolygonHandle picked=nullptr; double pickedDist=0.0; for(auto plHd : shl.AllPolygon()) { auto plVtHd=shl.GetPolygonVertex(plHd); const YsVec3 tri[3]= { shl.GetVertexPosition(plVtHd[0]), shl.GetVertexPosition(plVtHd[1]), shl.GetVertexPosition(plVtHd[2]), }; YsPlane pln; pln.MakePlaneFromTriangle(tri[0],tri[1],tri[2]); YsVec3 itsc; if(YSOK==pln.GetIntersection(itsc,o,v)) { auto side=YsCheckInsideTriangle3(itsc,tri); if(YSINSIDE==side || YSBOUNDARY==side) { auto dist=(itsc-o)*v; // Gives distance if(0.0<dist && (picked==nullptr || dist<pickedDist)) { picked=plHd; pickedDist=dist; } } } } return picked; }