Exemplo n.º 1
0
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 );

}
Exemplo n.º 2
0
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));
} 
Exemplo n.º 3
0
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 );

}
Exemplo n.º 4
0
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);
    }
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}