2#include "PolygonSetToTriangleSet.h"
 
    3#include "cuda_runtime.h" 
 
    4#include <thrust/sort.h>
 
    5#include "GLSurfaceVisualModule.h"
 
    6#include "GLWireframeVisualModule.h"
 
   11    __global__ void extractPolyIndices(
 
   17        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
   18        if (tId >= input.size()) return;
 
   20        if (input[tId] == 1) {
 
   21            int index = atomicAdd(arrayIndex, 1);
 
   26    __global__ void PolygonEdgeCounting(
 
   27        DArray<uint> counter3,
 
   28        DArray<uint> counter4,
 
   29        DArray<uint> counter5,
 
   30        DArrayList<uint> polygonIndices)
 
   32        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
   33        if (tId >= polygonIndices.size()) return;
 
   35        counter3[tId] = polygonIndices[tId].size() == 3 ? 1 : 0;
 
   36        counter4[tId] = polygonIndices[tId].size() == 4 ? 1 : 0;
 
   37        counter5[tId] = polygonIndices[tId].size() >= 5 ? 1 : 0;
 
   40    __global__ void PolygonSet_CountPoly2TriangleNumber(
 
   42        DArrayList<uint> polygonIndices)
 
   44        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
   45        if (tId >= counter.size()) return;
 
   47        counter[tId] = polygonIndices[tId].size() - 2;
 
   50        template<typename Triangle>
 
   51    __global__ void Edge4_ExtractTriangleIndices(
 
   52        DArray<Triangle> triangles,
 
   53        DArrayList<uint> polygonIndices,
 
   56        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
   57        if (tId >= radix.size()) return;
 
   59        uint offset = radix[tId];
 
   61        auto& index = polygonIndices[tId];
 
   63        if (index.size() == 3)
 
   68            triangles[offset] = Triangle(v0, v1, v2);
 
   72    template<typename Triangle>
 
   73    __global__ void CopyTriangles(
 
   74        DArray<Triangle> outTriangles,
 
   75        DArrayList<uint> polygonIndices,
 
   76        DArray<uint> triIndex,
 
   77        DArrayList<uint> poly2tri
 
   80        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
   81        if (tId >= triIndex.size()) return;
 
   83        auto& index = polygonIndices[tId];
 
   84        if (index.size() == 3) 
 
   86            uint offset = triIndex[tId];
 
   87            outTriangles[offset] = Triangle(index[0], index[1], index[2]);
 
   88            poly2tri[tId][0] = offset;
 
   93    template<typename Triangle>
 
   94    __global__ void Quads2Triangles(
 
   95        DArray<Triangle> outTriangles,
 
   96        DArrayList<uint> polygonIndices,
 
   98        DArray<uint> quadIndex,
 
   99        DArrayList<uint> poly2tri,
 
  102        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  103        if (tId >= quadIndex.size()) return;
 
  105        auto& index = polygonIndices[tId];
 
  106        printf("poly list :%d\n",index.size());
 
  107        if (index.size() == 4) 
 
  109            uint id = 2 * quadIndex[tId] + offset;
 
  131            Vec3f cross1 = AB.cross(AP).normalize();
 
  132            Vec3f cross2 = BC.cross(BP).normalize();
 
  133            Vec3f cross3 = CA.cross(CP).normalize();
 
  136            float dot1 = cross1.dot(cross2);
 
  137            float dot2 = cross1.dot(cross3);
 
  138            float dot3 = cross2.dot(cross3);
 
  140            if ((dot1 >= 0 && dot2 >= 0 && dot3 >= 0) || (dot1 <= 0 && dot2 <= 0 && dot3 <= 0))
 
  142                outTriangles[id] = Triangle(v0, v1, v3);
 
  143                outTriangles[id + 1] = Triangle(v1, v2, v3);
 
  147                outTriangles[id] = Triangle(v0, v1, v2);
 
  148                outTriangles[id + 1] = Triangle(v0, v2, v3);
 
  151            poly2tri[tId][0] = id;
 
  152            poly2tri[tId][1] = id + 1;
 
  158    template<typename Triangle>
 
  159    __global__ void CopyTriangles2Triangles(
 
  160        DArray<Triangle> outTriangles,
 
  161        DArray<Triangle> inTriangles,
 
  164        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  165        if (tId >= inTriangles.size()) return;
 
  167        outTriangles[tId + offset] = inTriangles[tId];
 
  171    __global__ void CounterLarger5Edges(
 
  175        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  176        if (tId >= counter.size()) return;
 
  178        if (counter[tId] <= 2) 
 
  183    __global__ void updatepoly2triangleId_moreThan5Edge(
 
  184        DArrayList<uint> poly2tri,
 
  185        DArrayList<uint> polygonIndex,
 
  186        DArray<uint> scanResult,
 
  187        DArray<uint> edgeNum,
 
  190        int tId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  191        if (tId >= polygonIndex.size()) return;
 
  193        uint count = edgeNum[tId];
 
  194        uint start = scanResult[tId];
 
  196        if (polygonIndex[tId].size() >= 5) 
 
  198            //printf("tId- d%   start: %d   i: %d   count: %d\n", tId, start, i, count);
 
  200            for (uint i = 0; i < count; i++)
 
  202                auto& list = poly2tri[tId];
 
  203                list[i] = offset + start + i;
 
  204                printf("tId- %d , start: %d, i: %d, result: %d , listsize: %d\n",tId, start,i,poly2tri[tId][i], list.size());
 
  211    template<typename TDataType>
 
  212    void PolygonSetToTriangleSetModule<TDataType>:: convert(std::shared_ptr<PolygonSet<TDataType>> polygonset, std::shared_ptr<TriangleSet<TDataType>> triset,DArrayList<uint>& poly2tri)
 
  216        auto& polylist = polygonset->polygonIndices();
 
  218        auto lists = polylist.lists();
 
  221        DArray<uint> edge3(lists.size());
 
  222        DArray<uint> edge4(lists.size());
 
  223        DArray<uint> edge5(lists.size());
 
  225        uint polyNum = polygonset->polygonIndices().size();
 
  227        DArray<uint> poly2triCounter(polyNum);
 
  229            PolygonSet_CountPoly2TriangleNumber,
 
  231            polygonset->polygonIndices());
 
  233        poly2tri.resize(poly2triCounter);
 
  235        int tNum = thrust::reduce(thrust::device, poly2triCounter.begin(), poly2triCounter.begin() + poly2triCounter.size());
 
  239        auto& triangles = triset->getTriangles();
 
  240        triangles.resize(tNum);
 
  247            polygonset->polygonIndices()
 
  250        uint total_num3 = thrust::reduce(thrust::device, edge3.begin(), edge3.begin() + edge3.size());
 
  251        thrust::exclusive_scan(thrust::device, edge3.begin(), edge3.begin() + edge3.size(), edge3.begin());
 
  256            polygonset->polygonIndices(),
 
  261        uint total_num4 = thrust::reduce(thrust::device, edge4.begin(), edge4.begin() + edge4.size());
 
  262        thrust::exclusive_scan(thrust::device, edge4.begin(), edge4.begin() + edge4.size(), edge4.begin());
 
  270            polygonset->polygonIndices(),
 
  271            polygonset->getPoints(),
 
  277        uint total_num5 = thrust::reduce(thrust::device, edge5.begin(), edge5.begin() + edge5.size());
 
  281        c_p2t.assign(poly2triCounter);
 
  282        for (size_t i = 0; i < c_p2t.size(); i++)
 
  284            printf("poly2triCounter: %d\n", c_p2t[i]);
 
  291        DArray<uint> startId;
 
  292        startId.assign(poly2triCounter);
 
  294        printf("************\n");
 
  295        c_p2t.assign(poly2triCounter);
 
  296        for (size_t i = 0; i < c_p2t.size(); i++)
 
  298            printf("poly2triCounter: %d\n", c_p2t[i]);
 
  301        thrust::exclusive_scan(thrust::device, startId.begin(), startId.begin() + startId.size(), startId.begin());
 
  303        printf("*******SCAN*****\n");
 
  304        c_p2t.assign(startId);
 
  305        for (size_t i = 0; i < c_p2t.size(); i++)
 
  307            printf("startId: %d\n", c_p2t[i]);
 
  311            updatepoly2triangleId_moreThan5Edge,
 
  313            polygonset->polygonIndices(),
 
  316            total_num3 + total_num4
 
  322        cudaMalloc((void**)&arrayIndex, sizeof(int));
 
  323        cudaMemset(arrayIndex, 0, sizeof(int));
 
  325        DArray<uint> d_v5_faceIds(total_num5);
 
  327        cuExecute(edge5.size(),
 
  334        CArray<uint> c_v5_faceIds;
 
  335        c_v5_faceIds.assign(d_v5_faceIds);
 
  337        EarClipper<DataType3f> earClip;
 
  339        CArrayList<uint> c_polygons;
 
  340        c_polygons.assign(polylist);
 
  341        CArray<Vec3f> c_points;
 
  342        c_points.assign(polygonset->getPoints());
 
  344        int poly2triOffset = 0;
 
  345        for (size_t i = 0; i < c_v5_faceIds.size(); i++)
 
  348            auto ptIndexList = c_polygons[c_v5_faceIds[i]];
 
  349            std::vector<Vec3f> pts;
 
  350            for (size_t j = 0; j < ptIndexList.size(); j++)
 
  352                auto pt = ptIndexList[j];
 
  353                pts.push_back(c_points[pt]);
 
  356            std::vector<TopologyModule::Triangle> c_earTriangles;
 
  357            earClip.polyClip(pts, c_earTriangles);//
 
  358            if (c_earTriangles.size() != (pts.size() - 2)) 
 
  360                printf("EarClip Error!!\n");
 
  361                std::vector<TopologyModule::Triangle> c_earTest;
 
  362                earClip.polyClip(pts, c_earTest);//
 
  365            for (size_t k = 0; k < c_earTriangles.size(); k++)
 
  367                c_earTriangles[k][0] = ptIndexList[c_earTriangles[k][0]];
 
  368                c_earTriangles[k][1] = ptIndexList[c_earTriangles[k][1]];
 
  369                c_earTriangles[k][2] = ptIndexList[c_earTriangles[k][2]];
 
  374            DArray<TopologyModule::Triangle> d_earTriangles;
 
  375            d_earTriangles.assign(c_earTriangles);
 
  377            cuExecute(d_earTriangles.size(),
 
  378                CopyTriangles2Triangles,
 
  381                total_num3 + total_num4*2 + poly2triOffset
 
  383            d_earTriangles.clear();
 
  385            poly2triOffset += (ptIndexList.size() - 2);
 
  388        triset->setPoints(polygonset->getPoints());
 
  394        poly2triCounter.clear();
 
  396        d_v5_faceIds.clear();
 
  398        CArrayList<uint> c_poly2tri;
 
  399        c_poly2tri.assign(poly2tri);
 
  400        for (size_t i = 0; i < c_poly2tri.size(); i++)
 
  403            auto& list = c_poly2tri[i];
 
  404            printf("size %d: ", list.size());
 
  406            for (size_t j = 0; j < list.size(); j++)
 
  408                printf("%d - ",list[j]);
 
  414    DEFINE_CLASS(PolygonSetToTriangleSetModule);
 
  416    template<typename TDataType>
 
  417    PolygonSetToTriangleSetNode<TDataType>::PolygonSetToTriangleSetNode()
 
  419        mPolygonSetToTriangleSetMoudle = std::make_shared<PolygonSetToTriangleSetModule<DataType3f>>();
 
  420        this->inPolygonSet()->connect(mPolygonSetToTriangleSetMoudle->inPolygonSet());
 
  422        this->stateTriangleSet()->setDataPtr(std::make_shared<TriangleSet<DataType3f>>());
 
  424        this->stateTriangleSet()->promoteOuput();
 
  426        auto surfaceRender = std::make_shared<GLSurfaceVisualModule>();
 
  427        auto wireRender = std::make_shared<GLWireframeVisualModule>();
 
  428        this->stateTriangleSet()->connect(surfaceRender->inTriangleSet());
 
  429        this->stateTriangleSet()->connect(wireRender->inEdgeSet());
 
  430        this->graphicsPipeline()->pushModule(surfaceRender);
 
  431        this->graphicsPipeline()->pushModule(wireRender);
 
  434    DEFINE_CLASS(PolygonSetToTriangleSetNode);