From c8cc72b0be47f1dac7c63af7b96e9d0a7376566c Mon Sep 17 00:00:00 2001 From: wuyize Date: Thu, 17 Nov 2022 21:25:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E7=BA=BF=E7=9A=84?= =?UTF-8?q?=E7=BB=98=E5=88=B6=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ArchitectureColoredPainting.vcxproj | 2 + ...rchitectureColoredPainting.vcxproj.filters | 6 + .../Shaders/painting.comp | 151 +++++++-- .../src/Renderer/Model.cpp | 296 +++++++++--------- .../src/Renderer/Painting/Element.cpp | 1 + .../src/Renderer/Painting/Element.h | 18 ++ .../src/Renderer/Painting/Painting.cpp | 56 ++++ .../src/Renderer/Painting/Painting.h | 36 ++- .../src/Renderer/Painting/PaintingHelper.cpp | 12 +- .../src/Renderer/Painting/ShortCutTree.cpp | 2 +- 10 files changed, 406 insertions(+), 174 deletions(-) create mode 100644 ArchitectureColoredPainting/src/Renderer/Painting/Element.cpp create mode 100644 ArchitectureColoredPainting/src/Renderer/Painting/Element.h diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj index 899e3c1..bfce5ff 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj @@ -108,6 +108,7 @@ + @@ -149,6 +150,7 @@ + diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters index 1deb188..be03bfa 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters @@ -123,6 +123,9 @@ Source Files\Renderer\Painting + + Source Files\Renderer\Painting + @@ -260,6 +263,9 @@ Header Files\Renderer\Painting + + Header Files\Renderer\Painting + diff --git a/ArchitectureColoredPainting/Shaders/painting.comp b/ArchitectureColoredPainting/Shaders/painting.comp index 5fb4ae9..e3f7cdf 100644 --- a/ArchitectureColoredPainting/Shaders/painting.comp +++ b/ArchitectureColoredPainting/Shaders/painting.comp @@ -251,6 +251,42 @@ int cubic_bezier_int_test(vec2 uv, vec2 p0, vec2 p1, vec2 p2, vec2 p3) return n_ints; } +bool cubic_bezier_sign_test(vec2 uv, vec2 p0, vec2 p1, vec2 p2, vec2 p3) +{ + float cu = (-p0.y + 3. * p1.y - 3. * p2.y + p3.y); + float qu = (3. * p0.y - 6. * p1.y + 3. * p2.y); + float li = (-3. * p0.y + 3. * p1.y); + float co = p0.y - uv.y; + + vec3 roots = vec3(1e38); + int n_roots = solve_cubic(vec3(co/cu,li/cu,qu/cu),roots); + + int n_ints = 0; + + for(int i=0;i<3;i++){ + if(i < n_roots){ + //if(roots[i] >= 0. && roots[i] <= 1.){ + float x_pos = -p0.x + 3. * p1.x - 3. * p2.x + p3.x; + x_pos = x_pos * roots[i] + 3. * p0.x - 6. * p1.x + 3. * p2.x; + x_pos = x_pos * roots[i] + -3. * p0.x + 3. * p1.x; + x_pos = x_pos * roots[i] + p0.x; + + if(x_pos < uv.x){ + n_ints++; + } + //} + } + } + + return n_ints%2==0; + // if(n_ints==0 || n_ints==2 || n_ints==4){ + // return 1; + // } + // else{ + // return 0; + // } +} + const float eps = .000005; const int halley_iterations = 8; //lagrange positive real root upper bound @@ -743,7 +779,7 @@ bool drawElement(uint elementIndex, vec2 localUV, out vec3 color, out vec2 metal // for(int i = 0; i<200;i++) if (elementData[styleIndex] == 0.) //面 { - uint contourIndex = leftChild - 0x80000000; + uint contourIndex = linesOffset + leftChild - 0x80000000; uint num_its = 0; @@ -802,29 +838,69 @@ bool drawElement(uint elementIndex, vec2 localUV, out vec3 color, out vec2 metal else if (elementData[styleIndex] == 1) //线 { float strokeWidth = elementData[styleIndex+1]; - uint lineIndex = leftChild - 0x80000000; - uint p0Index = elementIndexs[linesOffset + 4 * lineIndex]; - uint p1Index = elementIndexs[linesOffset + 4 * lineIndex + 1]; - uint p2Index = elementIndexs[linesOffset + 4 * lineIndex + 2]; - uint p3Index = elementIndexs[linesOffset + 4 * lineIndex + 3]; + uint contourIndex = linesOffset + leftChild - 0x80000000; + float d = 1e38; + uint signTmp=0; + uint lineCountTmp=0; + uint lastPIndex = -1; + uint lineCount = elementIndexs[contourIndex]; + + for ( uint contourIterator = contourIndex + 1;contourIterator < contourIndex + 1 + lineCount; contourIterator++) + { + uint lineIndex = elementIndexs[contourIterator]; + bool reverse = false; + if(lineIndex>=0x80000000) + { + reverse = true; + lineIndex -= 0x80000000; + } + uint pLocation = linesOffset + 4 * lineIndex; + uvec4 pxIndex = uvec4(pointsOffset)+2*uvec4(elementIndexs[pLocation], elementIndexs[pLocation+1], elementIndexs[pLocation+2], elementIndexs[pLocation+3]); + uvec4 pyIndex = uvec4(1)+pxIndex; - vec2 p0 = vec2(elementData[pointsOffset + 2 * p0Index], - elementData[pointsOffset + 2 * p0Index + 1]); - vec2 p1 = vec2(elementData[pointsOffset + 2 * p1Index], - elementData[pointsOffset + 2 * p1Index + 1]); - vec2 p2 = vec2(elementData[pointsOffset + 2 * p2Index], - elementData[pointsOffset + 2 * p2Index + 1]); - vec2 p3 = vec2(elementData[pointsOffset + 2 * p3Index], - elementData[pointsOffset + 2 * p3Index + 1]); + mat4x2 p = mat4x2(elementData[pxIndex[0]], elementData[pyIndex[0]], + elementData[pxIndex[1]], elementData[pyIndex[1]], + elementData[pxIndex[2]],elementData[pyIndex[2]], + elementData[pxIndex[3]], elementData[pyIndex[3]]); + + if(lastPIndex!=pxIndex[0]) + { + float lineType = elementData[styleIndex+4]; + if(d<=0.001) + { + hitElement = true; + elementColor = vec4(0,0,0,1); + } + else if(d<=strokeWidth && signTmp==lineCountTmp) + { + hitElement = true; + elementColor = vec4(1); + if(elementData[styleIndex+3]==0) + { + elementColor = vec4(elementData[styleIndex+7],elementData[styleIndex+8],elementData[styleIndex+9],1); + metallicRoughness = vec2(elementData[styleIndex+10],elementData[styleIndex+11]); + } + } + d = 1e38; + signTmp=0; + lineCountTmp = 0; + } + lastPIndex = pxIndex[3]; + lineCountTmp++; + float lineType = elementData[styleIndex+4]; + d = min(d, cubic_bezier_dis(localUV, p[0], p[1], p[2], p[3], elementData[styleIndex+2]==0)); + if(lineType==2 || cubic_bezier_sign_test(localUV, p[0], p[1], p[2], p[3])==(reverse? lineType==0: lineType==1)) + ++signTmp; + + } float lineType = elementData[styleIndex+4]; - /*if(cubic_bezier_dis(localUV, p0, p1, p2, p3, true)<=0.001) + if(d<=0.001) { hitElement = true; - elementColor = vec4(1); + elementColor = vec4(0,0,0,1); } - else */if(cubic_bezier_dis(localUV, p0, p1, p2, p3, elementData[styleIndex+2]==0)<=strokeWidth - &&(lineType==2 ||cubic_bezier_int_test(localUV, p0, p1, p2, p3)==lineType)) + else if(d<=strokeWidth && signTmp==lineCountTmp) { hitElement = true; elementColor = vec4(1); @@ -834,6 +910,45 @@ bool drawElement(uint elementIndex, vec2 localUV, out vec3 color, out vec2 metal metallicRoughness = vec2(elementData[styleIndex+10],elementData[styleIndex+11]); } } + + // float strokeWidth = elementData[styleIndex+1]; + // uint lineIndex = leftChild - 0x80000000; + // uint p0Index = elementIndexs[linesOffset + 4 * lineIndex]; + // uint p1Index = elementIndexs[linesOffset + 4 * lineIndex + 1]; + // uint p2Index = elementIndexs[linesOffset + 4 * lineIndex + 2]; + // uint p3Index = elementIndexs[linesOffset + 4 * lineIndex + 3]; + + // vec2 p0 = vec2(elementData[pointsOffset + 2 * p0Index], + // elementData[pointsOffset + 2 * p0Index + 1]); + // vec2 p1 = vec2(elementData[pointsOffset + 2 * p1Index], + // elementData[pointsOffset + 2 * p1Index + 1]); + // vec2 p2 = vec2(elementData[pointsOffset + 2 * p2Index], + // elementData[pointsOffset + 2 * p2Index + 1]); + // vec2 p3 = vec2(elementData[pointsOffset + 2 * p3Index], + // elementData[pointsOffset + 2 * p3Index + 1]); + + // // if(p0.y==p3.y) + // // { + // // p2.y-=0.0000001; + // // p3.y-=0.0000001; + // // } + // float lineType = elementData[styleIndex+4]; + // if(cubic_bezier_dis(localUV, p0, p1, p2, p3, true)<=0.001) + // { + // hitElement = true; + // elementColor = vec4(0,0,0,1); + // } + // else if(cubic_bezier_dis(localUV, p0, p1, p2, p3, elementData[styleIndex+2]==0)<=strokeWidth + // &&(lineType==2 || cubic_bezier_sign_test(localUV, p0, p1, p2, p3)==(lineType==1))) + // { + // hitElement = true; + // elementColor = vec4(1); + // if(elementData[styleIndex+3]==0) + // { + // elementColor = vec4(elementData[styleIndex+7],elementData[styleIndex+8],elementData[styleIndex+9],1); + // metallicRoughness = vec2(elementData[styleIndex+10],elementData[styleIndex+11]); + // } + // } } elementBvhIndex = elementBvhLength; diff --git a/ArchitectureColoredPainting/src/Renderer/Model.cpp b/ArchitectureColoredPainting/src/Renderer/Model.cpp index 382354b..d4f2640 100644 --- a/ArchitectureColoredPainting/src/Renderer/Model.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Model.cpp @@ -206,172 +206,178 @@ Drawable* Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 mod // {{-0.5,0.3}, {-0.420466,0.379534}, {-0.736743,0.6}, {-0.624264,0.6}}, // {{-0.624264,0.6}, {-0.511785,0.6}, {-0.579534,0.979534}, {-0.5,0.9}} //}; - vector> lineSet = SvgParser("M377,459.61a11.26,11.26,0,0,1,11.27-11.27H696.12a11.27,11.27,0,0,0,11-8.62A359.84,359.84,0,0,0,708,280.56a11.26,11.26,0,0,0-11-8.73H388.27A11.26,11.26,0,0,1,377,260.57h0a11.26,11.26,0,0,1,11.27-11.26H683.71A11.32,11.32,0,0,0,694.28,234C649.8,113.69,542.57,23.85,412.3,4.12a11.22,11.22,0,0,0-12.76,11.17v158.9a11.26,11.26,0,0,0,11.26,11.27H583.12a11.32,11.32,0,0,0,9.26-17.75c-31.67-46.59-78.51-75.2-109.11-90.07a11.25,11.25,0,0,0-16.13,10.17V115.2a11.24,11.24,0,0,0,6.22,10.07l7.51,3.76a11.28,11.28,0,0,1,5,15.12h0a11.27,11.27,0,0,1-15.11,5l-20-10a11.27,11.27,0,0,1-6.22-10.07V54a11.27,11.27,0,0,1,14.62-10.75c5.11,1.59,125.66,40.35,172.24,149A11.27,11.27,0,0,1,621.11,208H388.27A11.26,11.26,0,0,1,377,196.73V11.36A11.32,11.32,0,0,0,365.89.08C363.34,0,360.79,0,358.22,0s-5.11,0-7.66.08a11.32,11.32,0,0,0-11.11,11.28V196.74A11.26,11.26,0,0,1,328.18,208H95.35A11.27,11.27,0,0,1,85,192.3c46.57-108.67,167.12-147.42,172.23-149A11.26,11.26,0,0,1,271.86,54v75.11a11.25,11.25,0,0,1-6.23,10.07l-20,10a11.27,11.27,0,0,1-15.11-5h0a11.26,11.26,0,0,1,5-15.11l7.52-3.76a11.27,11.27,0,0,0,6.22-10.07V87.82a11.25,11.25,0,0,0-16.14-10.16c-30.6,14.87-77.45,43.48-109.1,90.07a11.3,11.3,0,0,0,9.25,17.74H305.66a11.26,11.26,0,0,0,11.27-11.26V15.31A11.22,11.22,0,0,0,304.17,4.14C173.88,23.86,66.66,113.71,22.17,234a11.32,11.32,0,0,0,10.56,15.29H328.18a11.26,11.26,0,0,1,11.27,11.26v0a11.26,11.26,0,0,1-11.27,11.26H19.52a11.26,11.26,0,0,0-11,8.72,359.84,359.84,0,0,0,.83,159.16,11.26,11.26,0,0,0,11,8.61H328.18a11.26,11.26,0,0,1,11.27,11.27h0a11.26,11.26,0,0,1-11.27,11.26h-294a11.32,11.32,0,0,0-10.53,15.4C69,604.65,175.3,692.78,304.16,712.3a11.21,11.21,0,0,0,12.76-11.16V542.22A11.26,11.26,0,0,0,305.66,531h-166c-9.53,0-14.89,11.22-8.69,18.47,34.09,39.77,74.45,65.66,101.77,80.18a11.25,11.25,0,0,0,16.53-10V591a11.26,11.26,0,0,1,11.26-11.26h0A11.26,11.26,0,0,1,271.85,591v63.85A11.27,11.27,0,0,1,256.8,665.5c-4.45-1.59-109.58-40-171-139.9a11.27,11.27,0,0,1,9.59-17.17H328.18a11.26,11.26,0,0,1,11.27,11.26V705.08a11.32,11.32,0,0,0,11.11,11.28q3.82.07,7.66.08c2.57,0,5.12,0,7.67-.08A11.32,11.32,0,0,0,377,705.08V519.69a11.25,11.25,0,0,1,11.27-11.26H621.1a11.26,11.26,0,0,1,9.59,17.16c-61.46,99.87-166.59,138.3-171,139.9a11.27,11.27,0,0,1-15-10.61V591a11.26,11.26,0,0,1,11.26-11.26h0A11.26,11.26,0,0,1,467.14,591v28.6a11.25,11.25,0,0,0,16.53,10c27.33-14.53,67.68-40.42,101.77-80.19,6.2-7.23.85-18.46-8.69-18.46h-166a11.26,11.26,0,0,0-11.26,11.26V701.12a11.21,11.21,0,0,0,12.76,11.17c128.86-19.51,235.14-107.66,280.48-226a11.33,11.33,0,0,0-10.53-15.41h-294A11.25,11.25,0,0,1,377,459.61ZM35.27,399.53V316.9a11.26,11.26,0,0,1,11.27-11.26H669.92a11.25,11.25,0,0,1,11.26,11.26v82.63a11.25,11.25,0,0,1-11.26,11.26H46.54a11.27,11.27,0,0,1-11.27-11.26Z", 716.45, 716.44).parse(); + /*vector> lineSet = SvgParser("M377,459.61a11.26,11.26,0,0,1,11.27-11.27H696.12a11.27,11.27,0,0,0,11-8.62A359.84,359.84,0,0,0,708,280.56a11.26,11.26,0,0,0-11-8.73H388.27A11.26,11.26,0,0,1,377,260.57h0a11.26,11.26,0,0,1,11.27-11.26H683.71A11.32,11.32,0,0,0,694.28,234C649.8,113.69,542.57,23.85,412.3,4.12a11.22,11.22,0,0,0-12.76,11.17v158.9a11.26,11.26,0,0,0,11.26,11.27H583.12a11.32,11.32,0,0,0,9.26-17.75c-31.67-46.59-78.51-75.2-109.11-90.07a11.25,11.25,0,0,0-16.13,10.17V115.2a11.24,11.24,0,0,0,6.22,10.07l7.51,3.76a11.28,11.28,0,0,1,5,15.12h0a11.27,11.27,0,0,1-15.11,5l-20-10a11.27,11.27,0,0,1-6.22-10.07V54a11.27,11.27,0,0,1,14.62-10.75c5.11,1.59,125.66,40.35,172.24,149A11.27,11.27,0,0,1,621.11,208H388.27A11.26,11.26,0,0,1,377,196.73V11.36A11.32,11.32,0,0,0,365.89.08C363.34,0,360.79,0,358.22,0s-5.11,0-7.66.08a11.32,11.32,0,0,0-11.11,11.28V196.74A11.26,11.26,0,0,1,328.18,208H95.35A11.27,11.27,0,0,1,85,192.3c46.57-108.67,167.12-147.42,172.23-149A11.26,11.26,0,0,1,271.86,54v75.11a11.25,11.25,0,0,1-6.23,10.07l-20,10a11.27,11.27,0,0,1-15.11-5h0a11.26,11.26,0,0,1,5-15.11l7.52-3.76a11.27,11.27,0,0,0,6.22-10.07V87.82a11.25,11.25,0,0,0-16.14-10.16c-30.6,14.87-77.45,43.48-109.1,90.07a11.3,11.3,0,0,0,9.25,17.74H305.66a11.26,11.26,0,0,0,11.27-11.26V15.31A11.22,11.22,0,0,0,304.17,4.14C173.88,23.86,66.66,113.71,22.17,234a11.32,11.32,0,0,0,10.56,15.29H328.18a11.26,11.26,0,0,1,11.27,11.26v0a11.26,11.26,0,0,1-11.27,11.26H19.52a11.26,11.26,0,0,0-11,8.72,359.84,359.84,0,0,0,.83,159.16,11.26,11.26,0,0,0,11,8.61H328.18a11.26,11.26,0,0,1,11.27,11.27h0a11.26,11.26,0,0,1-11.27,11.26h-294a11.32,11.32,0,0,0-10.53,15.4C69,604.65,175.3,692.78,304.16,712.3a11.21,11.21,0,0,0,12.76-11.16V542.22A11.26,11.26,0,0,0,305.66,531h-166c-9.53,0-14.89,11.22-8.69,18.47,34.09,39.77,74.45,65.66,101.77,80.18a11.25,11.25,0,0,0,16.53-10V591a11.26,11.26,0,0,1,11.26-11.26h0A11.26,11.26,0,0,1,271.85,591v63.85A11.27,11.27,0,0,1,256.8,665.5c-4.45-1.59-109.58-40-171-139.9a11.27,11.27,0,0,1,9.59-17.17H328.18a11.26,11.26,0,0,1,11.27,11.26V705.08a11.32,11.32,0,0,0,11.11,11.28q3.82.07,7.66.08c2.57,0,5.12,0,7.67-.08A11.32,11.32,0,0,0,377,705.08V519.69a11.25,11.25,0,0,1,11.27-11.26H621.1a11.26,11.26,0,0,1,9.59,17.16c-61.46,99.87-166.59,138.3-171,139.9a11.27,11.27,0,0,1-15-10.61V591a11.26,11.26,0,0,1,11.26-11.26h0A11.26,11.26,0,0,1,467.14,591v28.6a11.25,11.25,0,0,0,16.53,10c27.33-14.53,67.68-40.42,101.77-80.19,6.2-7.23.85-18.46-8.69-18.46h-166a11.26,11.26,0,0,0-11.26,11.26V701.12a11.21,11.21,0,0,0,12.76,11.17c128.86-19.51,235.14-107.66,280.48-226a11.33,11.33,0,0,0-10.53-15.41h-294A11.25,11.25,0,0,1,377,459.61ZM35.27,399.53V316.9a11.26,11.26,0,0,1,11.27-11.26H669.92a11.25,11.25,0,0,1,11.26,11.26v82.63a11.25,11.25,0,0,1-11.26,11.26H46.54a11.27,11.27,0,0,1-11.27-11.26Z", 716.45, 716.44).parse(); qDebug() << lineSet.size(); for (vector& line : lineSet) { for (Point& p : line) p.show(); std::cout << std::endl; - } - - - //vector> lineSet = { {Point{-1,-1}, Point{1,-1}},{Point{1,-1}, Point{1,1}}, {Point{1,1}, Point{-1,1}},{Point{-1,1}, Point{-1,-1}} }; - //vector> lineSet = { {Point{-1,-1}, Point{1,-1}},{Point{1,-1}, Point{1,1}}, {Point{1,1}, Point{-1,1}},{Point{-1,1}, Point{-1,-1}} }; - ShortCutTree shortCutTree(20); - shortCutTree.buildShortCutTree(lineSet); - vector pointVector; - vector lineVector; - vector bvhTreeData = shortCutTree.getPointLineAndBvhTree(pointVector, lineVector); - qDebug() << "----------------------------------------------"; - qDebug() << "element0CellNum: " << bvhTreeData.size(); - //qDebug() << pointVector; - //qDebug() << lineVector; - /*for (BvhTreeData data : bvhTreeData) - { - data.show(); }*/ - BvhTree element0Bvh; - element0Bvh.buildBvhTree(bvhTreeData.data(), bvhTreeData.size()); - std::vector element0Children; - std::vector element0Bounds; - element0Bvh.getBvhArray(element0Children, element0Bounds); - //qDebug() << element0Children; - //qDebug() << element0Bounds; - - //std::vector bvhChildren = { - // //root - // 1,2, - // 3,4, 5,6, - // encodeChild(0),0, encodeChild(0),GLuint(30. / 360 * 65536 + 1 * 65536) /*右儿子用来表示旋转角度和zIndex*/, encodeChild(0),0, encodeChild(0),0 - //}; - //std::vector bvhBounds = { - // //root - // QVector4D(-1,-1,1,1), - // QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9), - // QVector4D(-0.8,-0.8,-0.2,-0.1), QVector4D(-0.7,0.2,-0.2,0.7), QVector4D(0.2,-0.8,0.8,-0.1), QVector4D(0.2,0.1,0.8,0.8), - //}; - std::vector bvhChildren; - std::vector bvhBounds; - rootBvhTree.getBvhArray(bvhChildren, bvhBounds); - //qDebug() << bvhChildren; - bvhChildren.insert(bvhChildren.end(), element0Children.begin(), element0Children.end()); - bvhBounds.insert(bvhBounds.end(), element0Bounds.begin(), element0Bounds.end()); - std::vector elementOffset = { - //element0 - rootBvhTree.getBvhNodeNum(), //elementBvhRoot - (GLuint)element0Bounds.size(), //elementBvhLength - 0, //pointsOffset - 0, //linesOffset - }; - std::vector elementIndex = lineVector; - std::vector elementData = { - //fillStyle - //fill - 0, - //fillType - 0, //单色 - //fillColorMetallicRoughness - 240/255.,220/255.,160/255., 0.996,0.18, - }; - elementData.insert(elementData.begin(), pointVector.begin(), pointVector.end()); - //qDebug() << elementIndex; - //qDebug() << elementData; + //ShortCutTree shortCutTree(20); + //shortCutTree.buildShortCutTree(lineSet); + //vector pointVector; + //vector lineVector; + //vector bvhTreeData = shortCutTree.getPointLineAndBvhTree(pointVector, lineVector); + //for (auto& data : bvhTreeData) + // data.rightSon = 0; + //qDebug() << "----------------------------------------------"; + //qDebug() << "element0CellNum: " << bvhTreeData.size(); + ////qDebug() << pointVector; + ////qDebug() << lineVector; + ///*for (BvhTreeData data : bvhTreeData) + //{ + // data.show(); + //}*/ + //BvhTree element0Bvh; + //element0Bvh.buildBvhTree(bvhTreeData.data(), bvhTreeData.size()); + //std::vector element0Children; + //std::vector element0Bounds; + //element0Bvh.getBvhArray(element0Children, element0Bounds); + ////qDebug() << element0Children; + ////qDebug() << element0Bounds; + ////std::vector bvhChildren = { + //// //root + //// 1,2, + //// 3,4, 5,6, + //// encodeChild(0),0, encodeChild(0),GLuint(30. / 360 * 65536 + 1 * 65536) /*右儿子用来表示旋转角度和zIndex*/, encodeChild(0),0, encodeChild(0),0 + ////}; + ////std::vector bvhBounds = { + //// //root + //// QVector4D(-1,-1,1,1), + //// QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9), + //// QVector4D(-0.8,-0.8,-0.2,-0.1), QVector4D(-0.7,0.2,-0.2,0.7), QVector4D(0.2,-0.8,0.8,-0.1), QVector4D(0.2,0.1,0.8,0.8), + ////}; + //std::vector bvhChildren; + //std::vector bvhBounds; + //rootBvhTree.getBvhArray(bvhChildren, bvhBounds); + // + ////qDebug() << bvhChildren; + //bvhChildren.insert(bvhChildren.end(), element0Children.begin(), element0Children.end()); + //bvhBounds.insert(bvhBounds.end(), element0Bounds.begin(), element0Bounds.end()); - //std::vector bvhChildren0 = { - // //root - // 1,2, - // 3,4, 5,6, - // encodeChild(0),0, encodeChild(0),GLuint(30. / 360 * 65536 + 1 * 65536) /*右儿子用来表示旋转角度和zIndex*/, encodeChild(1),0, encodeChild(0),0, - // //elememt0 - // 1,2, - // encodeChild(20)/*contour索引,由于contour不定长,这里需要给到contour在elementIndex中位置*/,14/*style索引,在elementData中位置*/, encodeChild(24), 14, - // //elememt1 - // encodeChild(0)/*line索引,element中第几条*/, 27 - - //}; - //std::vector bvhBounds0 = { - // //root - // QVector4D(-1,-1,1,1), - // QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9), - // QVector4D(-0.8,-0.8,-0.2,-0.1), QVector4D(-0.7,0.2,-0.2,0.7), QVector4D(0.2,-0.8,0.8,-0.1), QVector4D(0.2,0.1,0.8,0.8), - // //elememt0 - // QVector4D(-1,-1,1,1), - // QVector4D(-1,-1,-0.2,1), QVector4D(-0.2,-1,1,1), - // //elememt1 - // QVector4D(-1,-1,1,1) - //}; - //std::vector elementOffset0 = { - // //element0 - // 7, //elementBvhRoot - // 3, //elementBvhLength - // 0, //pointsOffset - // 0, //linesOffset - // //element1 - // 10, //elementBvhRoot - // 1, //elementBvhLength - // 21, //pointsOffset - // 28, //linesOffset - //}; - - //std::vector elementIndex0 = { - // //element0 - // //lines, 全部当作三阶贝塞尔, 每条线四个点索引 - // 0,1,1,2, - // 0,0,3,3, - // 3,4,4,5, - // 2,2,5,5, - // 5,5,6,6, - // //contours, 第一个元素为线数,后面为轮廓线索引 - // 3, 1,2,4, - // 3, 0,2,3, - // //element1 - // //lines - // 0,1,1,2 - //}; - - //std::vector elementData0 = { - // //element0 - // //points - // -0.2,1, -0.2,-0.2, 1,-0.2, -1,1, -1,-1, 1,-1, 1,1, + + //std::vector elementIndex = lineVector; + //std::vector elementData = { // //fillStyle // //fill // 0, // //fillType // 0, //单色 // //fillColorMetallicRoughness - // 1,1,0, 0,0.8, - - // //element1 - // //points - // 0,0.8, 1,0, 0,-0.8, - // //strokeStyle - // //stroke - // 1, - // //strokeWidth - // 0.02, - // //strokeEndType - // 0, //圆角 - // //strokeFillType - // 0, //单色 - // //线类型 - // 1, //左侧 - // //线外描边宽度 - // 0, - // //线外描边方式 - // 0, //单色 - // //strokeFillColorMetallicRoughness - // 1,0,1, 0,0.8 + // 240/255.,220/255.,160/255., 0.996,0.18, //}; + //std::vector elementOffset = { + // //element0 + // rootBvhTree.getBvhNodeNum(), //elementBvhRoot + // (GLuint)element0Bounds.size(), //elementBvhLength + // (GLuint)elementData.size(), //pointsOffset + // 0, //linesOffset + //}; + //elementData.insert(elementData.end(), pointVector.begin(), pointVector.end()); + ////qDebug() << elementIndex; + ////qDebug() << elementData; + + + std::vector bvhChildren0 = { + //root + 1,2, + 3,4, 5,6, + encodeChild(0),0, encodeChild(0),GLuint(30. / 360 * 65536 + 1 * 65536) /*右儿子用来表示旋转角度和zIndex*/, encodeChild(1),0, encodeChild(0),0, + //elememt0 + 1,2, + encodeChild(20)/*contour索引,由于contour不定长,这里需要给到contour在elementIndex中位置*/,14/*style索引,在elementData中位置*/, encodeChild(24), 14, + //elememt1 + encodeChild(12)/*contour索引*/, 35 + + }; + std::vector bvhBounds0 = { + //root + QVector4D(-1,-1,1,1), + QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9), + QVector4D(-0.8,-0.8,-0.2,-0.1), QVector4D(-0.7,0.2,-0.2,0.7), QVector4D(0.2,-0.8,0.8,-0.1), QVector4D(0.2,0.1,0.8,0.8), + //elememt0 + QVector4D(-1,-1,1,1), + QVector4D(-1,-1,-0.2,1), QVector4D(-0.2,-1,1,1), + //elememt1 + QVector4D(-1,-1,1,1) + }; + std::vector elementOffset0 = { + //element0 + 7, //elementBvhRoot + 3, //elementBvhLength + 0, //pointsOffset + 0, //linesOffset + //element1 + 10, //elementBvhRoot + 1, //elementBvhLength + 21, //pointsOffset + 28, //linesOffset + }; + + std::vector elementIndex0 = { + //element0 + //lines, 全部当作三阶贝塞尔, 每条线四个点索引 + 0,1,1,2, + 0,0,3,3, + 3,4,4,5, + 2,2,5,5, + 5,5,6,6, + //contours, 第一个元素为线数,后面为轮廓线索引 + 3, 1,2,4, + 3, 0,2,3, + //element1 + //lines + 0,0,1,1, + 1,2,3,4, + 5,5,6,6, + //contours + 3, 0+ 0x80000000 ,1,2 + }; + + std::vector elementData0 = { + //element0 + //points + -0.2,1, -0.2,-0.2, 1,-0.2, -1,1, -1,-1, 1,-1, 1,1, + //fillStyle + //fill + 0, + //fillType + 0, //单色 + //fillColorMetallicRoughness + 1,1,0, 0,0.8, + + //element1 + //points + -0.5,-0.5, -0.5,0.5, 0.2,0.5, 0.5,0.2, 0.5,-0.5, -0.8,-0.5, -0.8,0.5, + //strokeStyle + //stroke + 1, + //strokeWidth + 0.02, + //strokeEndType + 0, //圆角 + //strokeFillType + 0, //单色 + //线类型 + 1, //左侧 + //线外描边宽度 + 0, + //线外描边方式 + 0, //单色 + //strokeFillColorMetallicRoughness + 1,0,1, 0,0.8 + }; //m_mesh->paintingIndex = paintingHelper->addPainting(bounds.size(), std::vector(children.begin()+2, children.end()), bounds, // elementOffset, elementIndex, elementData); - m_mesh->paintingIndex = paintingHelper->addPainting(rootBvhTree.getBvhNodeNum(), bvhChildren, bvhBounds, - elementOffset, elementIndex, elementData); - + //m_mesh->paintingIndex = paintingHelper->addPainting(rootBvhTree.getBvhNodeNum(), bvhChildren, bvhBounds, + // elementOffset, elementIndex, elementData); + m_mesh->paintingIndex = paintingHelper->addPainting(7, bvhChildren0, bvhBounds0, + elementOffset0, elementIndex0, elementData0); m_mesh->setupMesh(); return m_mesh; } diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/Element.cpp b/ArchitectureColoredPainting/src/Renderer/Painting/Element.cpp new file mode 100644 index 0000000..b716fa7 --- /dev/null +++ b/ArchitectureColoredPainting/src/Renderer/Painting/Element.cpp @@ -0,0 +1 @@ +#include "Element.h" diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/Element.h b/ArchitectureColoredPainting/src/Renderer/Painting/Element.h new file mode 100644 index 0000000..ac8361a --- /dev/null +++ b/ArchitectureColoredPainting/src/Renderer/Painting/Element.h @@ -0,0 +1,18 @@ +#pragma once +#include +#include +#include "Line.h" + +namespace Renderer +{ + class Element + { + public: + std::vector bvhChildren; + std::vector bvhBound; + std::vector elementIndex; + std::vector points; + + Element(std::vector> lines); + }; +} \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/Painting.cpp b/ArchitectureColoredPainting/src/Renderer/Painting/Painting.cpp index 01caf4a..55cf5f6 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/Painting.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Painting/Painting.cpp @@ -1,8 +1,64 @@ #include "Painting.h" +#include "../../SvgParser.h" +#include "ShortCutTree.h" using namespace Renderer; Painting::Painting() { + Contour contour = SvgParser("M377,459.61a11.26,11.26,0,0,1,11.27-11.27H696.12a11.27,11.27,0,0,0,11-8.62A359.84,359.84,0,0,0,708,280.56a11.26,11.26,0,0,0-11-8.73H388.27A11.26,11.26,0,0,1,377,260.57h0a11.26,11.26,0,0,1,11.27-11.26H683.71A11.32,11.32,0,0,0,694.28,234C649.8,113.69,542.57,23.85,412.3,4.12a11.22,11.22,0,0,0-12.76,11.17v158.9a11.26,11.26,0,0,0,11.26,11.27H583.12a11.32,11.32,0,0,0,9.26-17.75c-31.67-46.59-78.51-75.2-109.11-90.07a11.25,11.25,0,0,0-16.13,10.17V115.2a11.24,11.24,0,0,0,6.22,10.07l7.51,3.76a11.28,11.28,0,0,1,5,15.12h0a11.27,11.27,0,0,1-15.11,5l-20-10a11.27,11.27,0,0,1-6.22-10.07V54a11.27,11.27,0,0,1,14.62-10.75c5.11,1.59,125.66,40.35,172.24,149A11.27,11.27,0,0,1,621.11,208H388.27A11.26,11.26,0,0,1,377,196.73V11.36A11.32,11.32,0,0,0,365.89.08C363.34,0,360.79,0,358.22,0s-5.11,0-7.66.08a11.32,11.32,0,0,0-11.11,11.28V196.74A11.26,11.26,0,0,1,328.18,208H95.35A11.27,11.27,0,0,1,85,192.3c46.57-108.67,167.12-147.42,172.23-149A11.26,11.26,0,0,1,271.86,54v75.11a11.25,11.25,0,0,1-6.23,10.07l-20,10a11.27,11.27,0,0,1-15.11-5h0a11.26,11.26,0,0,1,5-15.11l7.52-3.76a11.27,11.27,0,0,0,6.22-10.07V87.82a11.25,11.25,0,0,0-16.14-10.16c-30.6,14.87-77.45,43.48-109.1,90.07a11.3,11.3,0,0,0,9.25,17.74H305.66a11.26,11.26,0,0,0,11.27-11.26V15.31A11.22,11.22,0,0,0,304.17,4.14C173.88,23.86,66.66,113.71,22.17,234a11.32,11.32,0,0,0,10.56,15.29H328.18a11.26,11.26,0,0,1,11.27,11.26v0a11.26,11.26,0,0,1-11.27,11.26H19.52a11.26,11.26,0,0,0-11,8.72,359.84,359.84,0,0,0,.83,159.16,11.26,11.26,0,0,0,11,8.61H328.18a11.26,11.26,0,0,1,11.27,11.27h0a11.26,11.26,0,0,1-11.27,11.26h-294a11.32,11.32,0,0,0-10.53,15.4C69,604.65,175.3,692.78,304.16,712.3a11.21,11.21,0,0,0,12.76-11.16V542.22A11.26,11.26,0,0,0,305.66,531h-166c-9.53,0-14.89,11.22-8.69,18.47,34.09,39.77,74.45,65.66,101.77,80.18a11.25,11.25,0,0,0,16.53-10V591a11.26,11.26,0,0,1,11.26-11.26h0A11.26,11.26,0,0,1,271.85,591v63.85A11.27,11.27,0,0,1,256.8,665.5c-4.45-1.59-109.58-40-171-139.9a11.27,11.27,0,0,1,9.59-17.17H328.18a11.26,11.26,0,0,1,11.27,11.26V705.08a11.32,11.32,0,0,0,11.11,11.28q3.82.07,7.66.08c2.57,0,5.12,0,7.67-.08A11.32,11.32,0,0,0,377,705.08V519.69a11.25,11.25,0,0,1,11.27-11.26H621.1a11.26,11.26,0,0,1,9.59,17.16c-61.46,99.87-166.59,138.3-171,139.9a11.27,11.27,0,0,1-15-10.61V591a11.26,11.26,0,0,1,11.26-11.26h0A11.26,11.26,0,0,1,467.14,591v28.6a11.25,11.25,0,0,0,16.53,10c27.33-14.53,67.68-40.42,101.77-80.19,6.2-7.23.85-18.46-8.69-18.46h-166a11.26,11.26,0,0,0-11.26,11.26V701.12a11.21,11.21,0,0,0,12.76,11.17c128.86-19.51,235.14-107.66,280.48-226a11.33,11.33,0,0,0-10.53-15.41h-294A11.25,11.25,0,0,1,377,459.61ZM35.27,399.53V316.9a11.26,11.26,0,0,1,11.27-11.26H669.92a11.25,11.25,0,0,1,11.26,11.26v82.63a11.25,11.25,0,0,1-11.26,11.26H46.54a11.27,11.27,0,0,1-11.27-11.26Z", 716.45, 716.44).parse(); + std::shared_ptr contourPtr = std::make_shared(contour); + contourPool.insert({ contourPtr, {nullptr, nullptr} }); + + + std::vector style = { + //fillStyle + //fill + 0, + //fillType + 0, //单色 + //fillColorMetallicRoughness + 240 / 255.,220 / 255.,160 / 255., 0.996,0.18, + }; + + Element element{ contourPtr, style, QVector4D(-0.8,-0.8,-0.2,-0.1), 0, 0 }; + elements.push_back(element); + if (style[0] == 0 && contourPool[contourPtr].first == nullptr) + { + ShortCutTree shortCutTree(20); + shortCutTree.buildShortCutTree(*contourPtr); + ElementBuffer elementBuffer; + elementBuffer.bvhLeaves = shortCutTree.getPointLineAndBvhTree(elementBuffer.pointBuffer, elementBuffer.lineBuffer); + contourPool[contourPtr].first = std::make_shared(elementBuffer); + } } +GLuint encodeZIndexRotation(GLuint zIndex, float rotation) +{ + return GLuint(rotation / 360 * 0x10000 + zIndex * 0x10000); +} +//void Painting::addElement(Contour contour, std::vector style, QVector4D bound, float rotation, int zIndex) +//{ +// BvhTreeData(bound, 0, encodeZIndexRotation(zIndex, rotation)); +// +// std::shared_ptr element = nullptr; +// auto iterator = elementMap.find(lines); +// if (iterator != elementMap.end()) +// element = iterator->second; +// else +// { +// element = std::make_shared(lines); +// elementMap.insert({ lines, element }); +// } +// +//} + +void Painting::generateBuffers() +{ + //std::unordered_map < std::shared_ptr, int> + for (auto& iter : contourPool) + { + elementData.insert(elementData.end(), iter.second.first->pointBuffer.begin(), iter.second.first->pointBuffer.end()); + + } +} diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/Painting.h b/ArchitectureColoredPainting/src/Renderer/Painting/Painting.h index a8127cf..53b3a5c 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/Painting.h +++ b/ArchitectureColoredPainting/src/Renderer/Painting/Painting.h @@ -2,21 +2,49 @@ #include #include #include "Line.h" +#include "BvhTree.h" +//#include "Element.h" -namespace Renderer +namespace Renderer { + using Contour = std::vector>; + + struct Element + { + std::shared_ptr contour; + std::vector style; + QVector4D bound; + float rotation; + int zIndex; + }; + + struct ElementBuffer + { + std::vector pointBuffer; + std::vector lineBuffer; + std::vector bvhLeaves; + }; + class Painting { - std::vector paintingOffsets; + public: std::vector bvhChildren; std::vector bvhBound; std::vector elementOffset; std::vector elementIndex; std::vector elementData; int paintingId = 0; - public: + Painting(); - + //void addElement(Contour contour, std::vector style, QVector4D bound, float rotation, int zIndex); + void generateBuffers(); + private: + std::vector bvhLeaves; + std::unordered_map< std::shared_ptr, std::pair, std::shared_ptr>> contourPool; + //std::vector> contourPool; + std::vector elements; + //std::unordered_map>, std::shared_ptr> elementMap; + }; } diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/PaintingHelper.cpp b/ArchitectureColoredPainting/src/Renderer/Painting/PaintingHelper.cpp index adb7951..38053be 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/PaintingHelper.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Painting/PaintingHelper.cpp @@ -24,34 +24,34 @@ void PaintingHelper::allocateBuffers() { glFunc->glGenBuffers(1, &paintingOffsetsSSBO); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, paintingOffsetsSSBO); - glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, paintingOffsets.size() * sizeof(GLuint), paintingOffsets.data(), GL_DYNAMIC_DRAW); + glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, paintingOffsets.size() * sizeof(GLuint), paintingOffsets.data(), GL_STATIC_READ); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glFunc->glGenBuffers(1, &bvhSSBO); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, bvhSSBO); - glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, bvhChildren.size() * sizeof(GLuint), bvhChildren.data(), GL_DYNAMIC_DRAW); + glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, bvhChildren.size() * sizeof(GLuint), bvhChildren.data(), GL_STATIC_READ); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glFunc->glGenBuffers(1, &bvhBoundSSBO); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, bvhBoundSSBO); - glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, bvhBound.size() * sizeof(QVector4D), bvhBound.data(), GL_DYNAMIC_DRAW); + glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, bvhBound.size() * sizeof(QVector4D), bvhBound.data(), GL_STATIC_READ); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glFunc->glGenBuffers(1, &elementOffsetSSBO); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, elementOffsetSSBO); - glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, elementOffset.size() * sizeof(GLuint), elementOffset.data(), GL_DYNAMIC_DRAW); + glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, elementOffset.size() * sizeof(GLuint), elementOffset.data(), GL_STATIC_READ); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glFunc->glGenBuffers(1, &elementIndexSSBO); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, elementIndexSSBO); - glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, elementIndex.size() * sizeof(GLuint), elementIndex.data(), GL_DYNAMIC_DRAW); + glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, elementIndex.size() * sizeof(GLuint), elementIndex.data(), GL_STATIC_READ); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glFunc->glGenBuffers(1, &elementDataSSBO); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, elementDataSSBO); - glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, elementData.size() * sizeof(GLfloat), elementData.data(), GL_DYNAMIC_DRAW); + glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, elementData.size() * sizeof(GLfloat), elementData.data(), GL_STATIC_READ); glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); } diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/ShortCutTree.cpp b/ArchitectureColoredPainting/src/Renderer/Painting/ShortCutTree.cpp index 19651e2..8a1069b 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/ShortCutTree.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Painting/ShortCutTree.cpp @@ -294,7 +294,7 @@ vector ShortCutTree::getPointLineAndBvhTree(vector& resPoint for (auto& nowTreeNode : restOfTreeNodes) { BvhTreeData oneData; oneData.leftSon = resLines.size(); - oneData.rightSon = resPoints.size(); + //oneData.rightSon = rightSon; oneData.bound = nowTreeNode.bound; std::cout << nowTreeNode.lineSet.size() << ' '; resLines.push_back(nowTreeNode.lineSet.size());