void skelpath::drawNurbs() { //draw sharp control point, control points and nurbs int bid = branchIdofTemplatetoDraw ; // draw sharp control point std::vector<Point2f> sharpcvpoint ; for( int i=0; i<NurbsCVPixels.size(); ++i){ for( int j=0; j<NurbsCVPixels[i].size(); ++j ) if( NurbsCVPixelsSharpLable[i][j] ) sharpcvpoint.push_back( NurbsCVPixels[i][j] ) ; } GlobalFun::draw2dPointsOnScreen( sharpcvpoint, double3(0.0, 0.0, 0.0 ), 10 ); // draw control points for( int i=0; i<NurbsCVPixels.size(); ++i){ GlobalFun::draw2dPointsOnScreen( NurbsCVPixels[i], double3(1.0, 0.0, 0.0 ), 10 ); GlobalFun::draw2dCurveOnScreen( NurbsCVPixels[i], double3(0.0, 0.0, 0.0 ), 1, false ); } // draw nurbs for( int i=0; i<disNurbsssPixels.size(); ++i) GlobalFun::draw2dCurveOnScreen( disNurbsssPixels[i], double3(0.0, 1.0, 1.0 ), 4 ); }
void DrawAlignedGrid(ShaderState &wss, const View& view, float size, float z) { const double2 roundedCam = double2(round(view.position, size)); const double2 roundedSize = double2(round(0.5f * view.getWorldSize(z), size) + float2(size)); ShaderUColor::instance().DrawGrid(wss, size, double3(roundedCam - roundedSize, z), double3(roundedCam + roundedSize, z)); }
void skelpath::drawTemplates() { //draw templates using the member variable "temPixels" for( int i=0; i<temPixels.size(); ++i) GlobalFun::draw2dPointsOnScreen( temPixels[i], double3(0.5, 0.5, 1.0), 4 ); }
void BSPOctree::SplitSpaceByXYZ(const Box3& bbox, Box3 childBoxes[]) { vec3<float> minOffset, maxOffset; const double factor = pow(2.0, 11); double3 step = double3( staticFilter(bbox.Diagonal().x* 0.5, factor) , staticFilter(bbox.Diagonal().y*0.5, factor) , staticFilter(bbox.Diagonal().z*0.5, factor)); for (int i = 0; i < 8 ; i++) { maxOffset.z = i & 1 ? 0 : -step.z; maxOffset.y = i & 2 ? 0 : -step.y; maxOffset.x = i & 4 ? 0 : -step.x; minOffset.z = i & 1 ? step.z : 0; minOffset.y = i & 2 ? step.y : 0; minOffset.x = i & 4 ? step.x : 0; childBoxes[i].Set(bbox.Min() + minOffset, bbox.Max()+ maxOffset); } }
void BSPOctree::PerformBoolean(PolygonPtrList& mesh1, PolygonPtrList& mesh2, const Box3& bbox, OctTreeNode** node) { FixedPlane bounds[] = {FixedPlane(double3(1,0,0),-bbox.Min().x) , FixedPlane(double3(-1,0,0),bbox.Max().x) , FixedPlane(double3(0,1,0),-bbox.Min().y) , FixedPlane(double3(0,-1,0),bbox.Max().y) , FixedPlane(double3(0,0,1),-bbox.Min().z) , FixedPlane(double3(0,0,-1),bbox.Max().z)}; FixedPlaneMesh myMesh1, myMesh2; FixedPlanePolygon poly; std::list<FixedPlanePolygon*> polyPool; // for containment test, jxd OctLeafNode* pLeaf = new OctLeafNode; pLeaf->bbox = bbox; // end for (auto index: mesh1) { MeshData *data = &(mMesh1[index]); /// convert simple mesh into plane based mesh if (!data->bSplitted) { data->bSplitted = true; data->OrigPolygon = FixedPlanePolygon(data->Position[0], data->Position[1], data->Position[2]); FixedPlanePolygon *root = new FixedPlanePolygon(data->OrigPolygon); data->Fragments.push_back(root); } // get the inside polygons: myMesh1 poly = data->OrigPolygon; bool bNeedInsert = true; for (int i = 0; i < 6; i++) { poly.ClipByPlaneNoFront(bounds[i]); if (poly.Size() == 0) { bNeedInsert = false; break; } } if (bNeedInsert) myMesh1.AddPolygon(poly); poly.Clear(); } if (myMesh1.PrimitiveCount() == 0) { pLeaf->type = eCritical; FillOctreeLeafNode(mesh1, mesh2, pLeaf); *node = pLeaf; return; } for (auto index: mesh2) { /// convert simple mesh into plane based mesh MeshData *data = &(mMesh2[index]); if (!data->bSplitted) { data->bSplitted = true; data->OrigPolygon = FixedPlanePolygon(data->Position[0], data->Position[1], data->Position[2]); FixedPlanePolygon *root = new FixedPlanePolygon(data->OrigPolygon); data->Fragments.push_back(root); } // get the inside polygons: myMesh2 poly = data->OrigPolygon; bool bNeedInsert = true; for (int i = 0; i < 6; i++) { poly.ClipByPlaneNoFront(bounds[i]); if (poly.Size() == 0) { bNeedInsert = false; break; } } if (bNeedInsert) myMesh2.AddPolygon(poly); poly.Clear(); } if (myMesh2.PrimitiveCount() == 0) { pLeaf->type = eCritical; FillOctreeLeafNode(mesh1, mesh2, pLeaf); *node = pLeaf; return; } FixedBSPTree *tree1, *tree2; tree1 = myMesh1.ToBSPTree(); tree1->FormSubHyperPlane(bbox); tree2 = myMesh2.ToBSPTree(); tree2->FormSubHyperPlane(bbox); auto op = mOperation; if (mOperation == FixedBSPTree::OP_DIFFERENCE) { op = FixedBSPTree::OP_INTERSECT; } FixedBSPTree *mergeTree = tree1->Merge(tree2, op); delete tree1; delete tree2; mergeTree->GetPolygons(mPlanePolygon); delete mergeTree; pLeaf->type = eIntered; FillOctreeLeafNode(mesh1, mesh2, pLeaf); *node = pLeaf; }
BaseMesh* BSPOctree::CollectPolygons(BaseMesh* mesh1, BaseMesh* mesh2) { FixedPlaneMesh* pMesh = new FixedPlaneMesh; std::vector<PolygonObj*> polyBuffer; for (auto &itr3: mPlanePolygon) pMesh->AddPolygon(itr3); // collect carved mesh // get all non-intersect nodes std::vector<OctLeafNode*> leaves; GetLeafNodes(mpRoot, leaves, eNormal | eCritical); size_t t = leaves.size(); wchar_t ch[32]; wsprintf(ch, L"leaves: %u\n", t); OutputDebugString(ch); size_t a, b, c; a = b = c = 0; for (auto pLeaf: leaves) { if (pLeaf->polygons.empty()) continue; BaseMesh* belong = pLeaf->polygons[0]->mpMesh; BaseMesh* compareTarget = (belong == mesh1)?mesh2:mesh1; int isCellInMesh = -1; assert(pLeaf->type != eIntered); if (pLeaf->type == eNormal) isCellInMesh = false; else {a++;isCellInMesh = (pmrInside == PointInPolyhedron(pLeaf->bbox.Center(), compareTarget));} if (!NeedInserted(isCellInMesh, (mesh1 == compareTarget)?MINUEND:SUBTRAHEND)) continue; auto &bbox = pLeaf->bbox; FixedPlane bounds[] = {FixedPlane(double3(1,0,0),-bbox.Min().x) , FixedPlane(double3(-1,0,0),bbox.Max().x) , FixedPlane(double3(0,1,0),-bbox.Min().y) , FixedPlane(double3(0,-1,0),bbox.Max().y) , FixedPlane(double3(0,0,1),-bbox.Min().z) , FixedPlane(double3(0,0,-1),bbox.Max().z)}; for (auto poly: pLeaf->polygons) { if (poly->mpSharedData->meObjType != eIntered) polyBuffer.push_back(poly); else { b++; auto orig = poly->pMeshData->OrigPolygon; bool bNeedInsert = true; for (int i = 0; i < 6; i++) { orig.ClipByPlaneNoFront(bounds[i]); if (orig.Size() == 0) { bNeedInsert = false; break; } } if (bNeedInsert) pMesh->AddPolygon(orig); } } } wsprintf(ch, L"in&out: %u, clip: %u\n", a, b); OutputDebugString(ch); GSOutputTimeLog(L"end leaves traverse: "); BaseMesh* result = pMesh->ToBaseMesh(); delete pMesh; std::hash_map<IndexPair, bool, IndexPairCompare> sharedObjMap; for (auto poly: polyBuffer) poly->AddPolygon(*result, sharedObjMap, eIntered); return result; }