From 3c9facd85c96c71e94738fa487aee204c3d1b961 Mon Sep 17 00:00:00 2001 From: jcowles Date: Tue, 23 Jun 2015 13:17:45 -0700 Subject: [PATCH 01/59] Replaced Geri's game image with Inside Out --- documentation/images/insideout.png | Bin 0 -> 627761 bytes documentation/intro.rst | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 documentation/images/insideout.png diff --git a/documentation/images/insideout.png b/documentation/images/insideout.png new file mode 100644 index 0000000000000000000000000000000000000000..1beee99f86b58e75bc86bab334de8e0fe1807cf0 GIT binary patch literal 627761 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 z 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 z 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
;`8><_iDuLV&a2O-k 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%0AZp+DH&ByDh4g5F%OWynK4>)@YSD$2V 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 PCwn;WiHJ%d+#J_!QZ8Y+ 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 Date: Thu, 25 Jun 2015 22:12:38 -0700 Subject: [PATCH 02/59] Remove all unused references to AddVaryingWithWeight Far no longer supports this method, so the existing functions were pure noise. Hbr, however still requires it, so there are still a couple instances of it in the hbr tutorial files. --- examples/farViewer/farViewer.cpp | 2 -- examples/mayaPolySmooth/mayaPolySmooth.cpp | 4 +--- tutorials/far/tutorial_0/far_tutorial_0.cpp | 2 -- tutorials/far/tutorial_1/far_tutorial_1.cpp | 2 -- tutorials/far/tutorial_4/far_tutorial_4.cpp | 2 -- tutorials/far/tutorial_6/far_tutorial_6.cpp | 2 -- tutorials/far/tutorial_7/far_tutorial_7.cpp | 2 -- 7 files changed, 1 insertion(+), 15 deletions(-) diff --git a/examples/farViewer/farViewer.cpp b/examples/farViewer/farViewer.cpp index 31c6e357..5afb3c79 100644 --- a/examples/farViewer/farViewer.cpp +++ b/examples/farViewer/farViewer.cpp @@ -188,8 +188,6 @@ struct Vertex { _pos[2]+=weight*src._pos[2]; } - void AddVaryingWithWeight(Vertex const & , float) { } - void Clear( void * =0 ) { _pos[0]=_pos[1]=_pos[2]=0.0f; } void SetPosition(float x, float y, float z) { _pos[0]=x; _pos[1]=y; _pos[2]=z; } diff --git a/examples/mayaPolySmooth/mayaPolySmooth.cpp b/examples/mayaPolySmooth/mayaPolySmooth.cpp index 1249df95..b3e0f530 100644 --- a/examples/mayaPolySmooth/mayaPolySmooth.cpp +++ b/examples/mayaPolySmooth/mayaPolySmooth.cpp @@ -568,8 +568,6 @@ struct Vertex { position[2]+=weight*src.position[2]; } - void AddVaryingWithWeight(Vertex const &, float) { } - float position[3]; }; @@ -1237,4 +1235,4 @@ MStatus uninitializePlugin( MObject obj) { MCHECKERR(returnStatus, "deregisterNode"); return returnStatus; -} \ No newline at end of file +} diff --git a/tutorials/far/tutorial_0/far_tutorial_0.cpp b/tutorials/far/tutorial_0/far_tutorial_0.cpp index 0ed7ede9..188da0b2 100644 --- a/tutorials/far/tutorial_0/far_tutorial_0.cpp +++ b/tutorials/far/tutorial_0/far_tutorial_0.cpp @@ -59,8 +59,6 @@ struct Vertex { _position[2]+=weight*src._position[2]; } - void AddVaryingWithWeight(Vertex const &, float) { } - // Public interface ------------------------------------ void SetPosition(float x, float y, float z) { _position[0]=x; diff --git a/tutorials/far/tutorial_1/far_tutorial_1.cpp b/tutorials/far/tutorial_1/far_tutorial_1.cpp index 13c76c35..b6ad9614 100644 --- a/tutorials/far/tutorial_1/far_tutorial_1.cpp +++ b/tutorials/far/tutorial_1/far_tutorial_1.cpp @@ -403,8 +403,6 @@ struct Vertex { _position[2]+=weight*src._position[2]; } - void AddVaryingWithWeight(Vertex const &, float) { } - // Public interface ------------------------------------ void SetPosition(float x, float y, float z) { _position[0]=x; diff --git a/tutorials/far/tutorial_4/far_tutorial_4.cpp b/tutorials/far/tutorial_4/far_tutorial_4.cpp index 30c07677..61792365 100644 --- a/tutorials/far/tutorial_4/far_tutorial_4.cpp +++ b/tutorials/far/tutorial_4/far_tutorial_4.cpp @@ -61,8 +61,6 @@ struct Vertex { _position[2]+=weight*src._position[2]; } - void AddVaryingWithWeight(Vertex const &, float) { } - // Public interface ------------------------------------ void SetPosition(float x, float y, float z) { _position[0]=x; diff --git a/tutorials/far/tutorial_6/far_tutorial_6.cpp b/tutorials/far/tutorial_6/far_tutorial_6.cpp index 88811028..07c50f7c 100644 --- a/tutorials/far/tutorial_6/far_tutorial_6.cpp +++ b/tutorials/far/tutorial_6/far_tutorial_6.cpp @@ -96,8 +96,6 @@ struct Vertex { point[2] += weight * src.point[2]; } - void AddVaryingWithWeight(Vertex const &, float) { } - float point[3]; }; diff --git a/tutorials/far/tutorial_7/far_tutorial_7.cpp b/tutorials/far/tutorial_7/far_tutorial_7.cpp index 01df0d24..79f4f9cd 100644 --- a/tutorials/far/tutorial_7/far_tutorial_7.cpp +++ b/tutorials/far/tutorial_7/far_tutorial_7.cpp @@ -72,8 +72,6 @@ struct Vertex { _position[2]+=weight*src._position[2]; } - void AddVaryingWithWeight(Vertex const &, float) { } - // Public interface ------------------------------------ void SetPosition(float x, float y, float z) { _position[0]=x; From 8dd7563060f1729cec12bd916982431d51d06d08 Mon Sep 17 00:00:00 2001 From: Jeremy Cowles Date: Thu, 25 Jun 2015 22:24:56 -0700 Subject: [PATCH 03/59] Some minor compiler warning fixes In one case, we were comparing int and unsigned int. In primvarRefiner, some values were safely uninitialized, but older compilers (GCC 4.1) were complaining. --- opensubdiv/far/primvarRefiner.h | 7 ++++++- opensubdiv/far/topologyRefiner.cpp | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/opensubdiv/far/primvarRefiner.h b/opensubdiv/far/primvarRefiner.h index c720660e..0cf336db 100644 --- a/opensubdiv/far/primvarRefiner.h +++ b/opensubdiv/far/primvarRefiner.h @@ -214,7 +214,12 @@ private: typedef float Weight; // Also part of the expected interface public: - Mask(Weight* v, Weight* e, Weight* f) : _vertWeights(v), _edgeWeights(e), _faceWeights(f) { } + Mask(Weight* v, Weight* e, Weight* f) : + _vertWeights(v), _edgeWeights(e), _faceWeights(f), + _vertCount(0), _edgeCount(0), _faceCount(0), + _faceWeightsForFaceCenters(false) + { } + ~Mask() { } public: // Generic interface expected of : diff --git a/opensubdiv/far/topologyRefiner.cpp b/opensubdiv/far/topologyRefiner.cpp index 137158b9..90e8481a 100644 --- a/opensubdiv/far/topologyRefiner.cpp +++ b/opensubdiv/far/topologyRefiner.cpp @@ -220,7 +220,7 @@ TopologyRefiner::RefineUniform(UniformOptions options) { for (int i = 1; i <= (int)options.refinementLevel; ++i) { refineOptions._minimalTopology = - options.fullTopologyInLastLevel ? false : (i == options.refinementLevel); + options.fullTopologyInLastLevel ? false : (i == (int)options.refinementLevel); Vtr::internal::Level& parentLevel = getLevel(i-1); Vtr::internal::Level& childLevel = *(new Vtr::internal::Level); From 8a74831b2e90c2d94c6871eeae860ec23574a8d4 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 5 Jul 2015 10:43:00 -0600 Subject: [PATCH 04/59] Fix out of range access issues when a non-connected vertex occurs at the end of mesh's vertex list or mesh has face varying data. --- opensubdiv/vtr/fvarLevel.cpp | 2 ++ opensubdiv/vtr/level.h | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/opensubdiv/vtr/fvarLevel.cpp b/opensubdiv/vtr/fvarLevel.cpp index 3fd6272b..28a4854f 100644 --- a/opensubdiv/vtr/fvarLevel.cpp +++ b/opensubdiv/vtr/fvarLevel.cpp @@ -411,6 +411,8 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { ConstIndexArray vFaces = _level.getVertexFaces(vIndex); ConstLocalIndexArray vInFace = _level.getVertexFaceLocalIndices(vIndex); + if ( vFaces.empty() || vInFace.empty() ) + continue; // // First step is to assign the values associated with the faces by retrieving them // from the faces. If the face-varying topology around this vertex matches the vertex diff --git a/opensubdiv/vtr/level.h b/opensubdiv/vtr/level.h index fc28f09e..5119e29f 100644 --- a/opensubdiv/vtr/level.h +++ b/opensubdiv/vtr/level.h @@ -521,23 +521,23 @@ Level::getFaceEdges(Index faceIndex) { // inline ConstIndexArray Level::getVertexFaces(Index vertIndex) const { - return ConstIndexArray(&_vertFaceIndices[_vertFaceCountsAndOffsets[vertIndex*2+1]], + return ConstIndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1], _vertFaceCountsAndOffsets[vertIndex*2]); } inline IndexArray Level::getVertexFaces(Index vertIndex) { - return IndexArray(&_vertFaceIndices[_vertFaceCountsAndOffsets[vertIndex*2+1]], + return IndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1], _vertFaceCountsAndOffsets[vertIndex*2]); } inline ConstLocalIndexArray Level::getVertexFaceLocalIndices(Index vertIndex) const { - return ConstLocalIndexArray(&_vertFaceLocalIndices[_vertFaceCountsAndOffsets[vertIndex*2+1]], + return ConstLocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1], _vertFaceCountsAndOffsets[vertIndex*2]); } inline LocalIndexArray Level::getVertexFaceLocalIndices(Index vertIndex) { - return LocalIndexArray(&_vertFaceLocalIndices[_vertFaceCountsAndOffsets[vertIndex*2+1]], + return LocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1], _vertFaceCountsAndOffsets[vertIndex*2]); } @@ -558,23 +558,23 @@ Level::trimVertexFaces(Index vertIndex, int count) { // inline ConstIndexArray Level::getVertexEdges(Index vertIndex) const { - return ConstIndexArray(&_vertEdgeIndices[_vertEdgeCountsAndOffsets[vertIndex*2+1]], + return ConstIndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1], _vertEdgeCountsAndOffsets[vertIndex*2]); } inline IndexArray Level::getVertexEdges(Index vertIndex) { - return IndexArray(&_vertEdgeIndices[_vertEdgeCountsAndOffsets[vertIndex*2+1]], + return IndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1], _vertEdgeCountsAndOffsets[vertIndex*2]); } inline ConstLocalIndexArray Level::getVertexEdgeLocalIndices(Index vertIndex) const { - return ConstLocalIndexArray(&_vertEdgeLocalIndices[_vertEdgeCountsAndOffsets[vertIndex*2+1]], + return ConstLocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1], _vertEdgeCountsAndOffsets[vertIndex*2]); } inline LocalIndexArray Level::getVertexEdgeLocalIndices(Index vertIndex) { - return LocalIndexArray(&_vertEdgeLocalIndices[_vertEdgeCountsAndOffsets[vertIndex*2+1]], + return LocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1], _vertEdgeCountsAndOffsets[vertIndex*2]); } From d317cbc86b53047bcd9373e838945da75b80639f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 5 Jul 2015 11:22:38 -0600 Subject: [PATCH 05/59] Fix offsets in OmpEvalStencils when start is non-zero. --- opensubdiv/osd/ompKernel.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/opensubdiv/osd/ompKernel.cpp b/opensubdiv/osd/ompKernel.cpp index 5220e985..05deed5c 100644 --- a/opensubdiv/osd/ompKernel.cpp +++ b/opensubdiv/osd/ompKernel.cpp @@ -80,11 +80,8 @@ OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, int const * indices, float const * weights, int start, int end) { - if (start > 0) { - sizes += start; - indices += offsets[start]; - weights += offsets[start]; - } + start = (start > 0 ? start : 0); + src += srcDesc.offset; dst += dstDesc.offset; @@ -96,7 +93,7 @@ OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, #pragma omp parallel for for (int i = 0; i < n; ++i) { - int index = i + (start > 0 ? start : 0); // Stencil index + int index = i + start; // Stencil index // Get thread-local pointers int const * threadIndices = indices + offsets[index]; @@ -129,13 +126,7 @@ OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, float const * duWeights, float const * dvWeights, int start, int end) { - if (start > 0) { - sizes += start; - indices += offsets[start]; - weights += offsets[start]; - duWeights += offsets[start]; - dvWeights += offsets[start]; - } + start = (start > 0 ? start : 0); src += srcDesc.offset; dst += dstDesc.offset; @@ -152,7 +143,7 @@ OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, #pragma omp parallel for for (int i = 0; i < n; ++i) { - int index = i + (start > 0 ? start : 0); // Stencil index + int index = i + start; // Stencil index // Get thread-local pointers int const * threadIndices = indices + offsets[index]; From cee60e93e2cd98ec4eac35d332f164412c2364e7 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Jul 2015 16:51:08 +0200 Subject: [PATCH 06/59] Fix typo in Far tutorial, GetFaceEdges() actually get face index, not edge index --- tutorials/far/tutorial_1/far_tutorial_1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/far/tutorial_1/far_tutorial_1.cpp b/tutorials/far/tutorial_1/far_tutorial_1.cpp index b6ad9614..a89fbd00 100644 --- a/tutorials/far/tutorial_1/far_tutorial_1.cpp +++ b/tutorials/far/tutorial_1/far_tutorial_1.cpp @@ -186,7 +186,7 @@ public: int const * GetFaceVerts(int face) const { return g_faceverts+getCompOffset(g_facenverts, face); } - int const * GetFaceEdges(int edge) const { return g_faceedges+getCompOffset(g_facenverts, edge); } + int const * GetFaceEdges(int face) const { return g_faceedges+getCompOffset(g_facenverts, face); } // From 89b698e519e5246380e714f1a2f408fd2a16b732 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 12 Jul 2015 16:03:09 -0600 Subject: [PATCH 07/59] Fix offsets in TbbEvalStencils when start is non-zero. --- opensubdiv/osd/tbbKernel.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/opensubdiv/osd/tbbKernel.cpp b/opensubdiv/osd/tbbKernel.cpp index ff5c2034..6dab3a0a 100644 --- a/opensubdiv/osd/tbbKernel.cpp +++ b/opensubdiv/osd/tbbKernel.cpp @@ -169,11 +169,6 @@ TbbEvalStencils(float const * src, BufferDescriptor const &srcDesc, float const * weights, int start, int end) { - if (start > 0) { - sizes += start; - indices += offsets[start]; - weights += offsets[start]; - } src += srcDesc.offset; dst += dstDesc.offset; @@ -197,13 +192,6 @@ TbbEvalStencils(float const * src, BufferDescriptor const &srcDesc, float const * duWeights, float const * dvWeights, int start, int end) { - if (start > 0) { - sizes += start; - indices += offsets[start]; - weights += offsets[start]; - duWeights += offsets[start]; - dvWeights += offsets[start]; - } if (src) src += srcDesc.offset; if (dst) dst += dstDesc.offset; From 50e2623b91088e8c5d8e9e2ed0619955fce3f61b Mon Sep 17 00:00:00 2001 From: barfowl Date: Sun, 12 Jul 2015 18:30:26 -0700 Subject: [PATCH 08/59] Fixed initialization of unconnected vertices in FVar channels - correctly initialize FVar tag and source entry for unconnected verts - added regression/shape with unconnected vertices and fvar data - fixed edge-face vector access when unconnected edges are last --- opensubdiv/vtr/fvarLevel.cpp | 12 +-- opensubdiv/vtr/level.h | 18 ++-- regression/shapes/catmark_nonman_bareverts.h | 91 ++++++++++++++++++++ 3 files changed, 109 insertions(+), 12 deletions(-) create mode 100644 regression/shapes/catmark_nonman_bareverts.h diff --git a/opensubdiv/vtr/fvarLevel.cpp b/opensubdiv/vtr/fvarLevel.cpp index 28a4854f..38d52843 100644 --- a/opensubdiv/vtr/fvarLevel.cpp +++ b/opensubdiv/vtr/fvarLevel.cpp @@ -249,7 +249,7 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { eTag._linear = (ETag::ETagSize) _hasLinearBoundaries; } } - } else { + } else if (vFaces.size() > 0) { // // Unfortunately for non-manifold cases we can't make as much use of the // retrieved face-values as there is no correlation between the incident @@ -308,7 +308,7 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { // boundary vertices that have not already been tagged. // if (vIsBoundary && !vertexMismatch[vIndex]) { - if (_hasLinearBoundaries) { + if (_hasLinearBoundaries && (vFaces.size() > 0)) { vertexMismatch[vIndex] = true; if (vIsManifold) { @@ -411,8 +411,6 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { ConstIndexArray vFaces = _level.getVertexFaces(vIndex); ConstLocalIndexArray vInFace = _level.getVertexFaceLocalIndices(vIndex); - if ( vFaces.empty() || vInFace.empty() ) - continue; // // First step is to assign the values associated with the faces by retrieving them // from the faces. If the face-varying topology around this vertex matches the vertex @@ -421,7 +419,11 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { // IndexArray vValues = getVertexValues(vIndex); - vValues[0] = _faceVertValues[_level.getOffsetOfFaceVertices(vFaces[0]) + vInFace[0]]; + if (vFaces.size() > 0) { + vValues[0] = _faceVertValues[_level.getOffsetOfFaceVertices(vFaces[0]) + vInFace[0]]; + } else { + vValues[0] = 0; + } if (!vertexMismatch[vIndex]) { continue; } diff --git a/opensubdiv/vtr/level.h b/opensubdiv/vtr/level.h index 5119e29f..2d3169e1 100644 --- a/opensubdiv/vtr/level.h +++ b/opensubdiv/vtr/level.h @@ -614,23 +614,27 @@ Level::getEdgeVertices(Index edgeIndex) { // inline ConstIndexArray Level::getEdgeFaces(Index edgeIndex) const { - return ConstIndexArray(&_edgeFaceIndices[_edgeFaceCountsAndOffsets[edgeIndex*2+1]], - _edgeFaceCountsAndOffsets[edgeIndex*2]); + return ConstIndexArray(&_edgeFaceIndices[0] + + _edgeFaceCountsAndOffsets[edgeIndex*2+1], + _edgeFaceCountsAndOffsets[edgeIndex*2]); } inline IndexArray Level::getEdgeFaces(Index edgeIndex) { - return IndexArray(&_edgeFaceIndices[_edgeFaceCountsAndOffsets[edgeIndex*2+1]], - _edgeFaceCountsAndOffsets[edgeIndex*2]); + return IndexArray(&_edgeFaceIndices[0] + + _edgeFaceCountsAndOffsets[edgeIndex*2+1], + _edgeFaceCountsAndOffsets[edgeIndex*2]); } inline ConstLocalIndexArray Level::getEdgeFaceLocalIndices(Index edgeIndex) const { - return ConstLocalIndexArray(&_edgeFaceLocalIndices[_edgeFaceCountsAndOffsets[edgeIndex*2+1]], - _edgeFaceCountsAndOffsets[edgeIndex*2]); + return ConstLocalIndexArray(&_edgeFaceLocalIndices[0] + + _edgeFaceCountsAndOffsets[edgeIndex*2+1], + _edgeFaceCountsAndOffsets[edgeIndex*2]); } inline LocalIndexArray Level::getEdgeFaceLocalIndices(Index edgeIndex) { - return LocalIndexArray(&_edgeFaceLocalIndices[_edgeFaceCountsAndOffsets[edgeIndex*2+1]], + return LocalIndexArray(&_edgeFaceLocalIndices[0] + + _edgeFaceCountsAndOffsets[edgeIndex*2+1], _edgeFaceCountsAndOffsets[edgeIndex*2]); } diff --git a/regression/shapes/catmark_nonman_bareverts.h b/regression/shapes/catmark_nonman_bareverts.h new file mode 100644 index 00000000..28c5d036 --- /dev/null +++ b/regression/shapes/catmark_nonman_bareverts.h @@ -0,0 +1,91 @@ +// +// Copyright 2015 DreamWorks Animation LLC. +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + +static const std::string catmark_nonman_bareverts = +"# 4x4 grid of quads -- 25 vertices:\n" +"v 0.00 0.00 0.00\n" +"v 0.25 0.00 0.00\n" +"v 0.50 0.00 0.00\n" +"v 0.75 0.00 0.00\n" +"v 1.00 0.00 0.00\n" +"v 0.00 0.25 0.00\n" +"v 0.25 0.25 0.20\n" +"v 0.50 0.25 0.20\n" +"v 0.75 0.25 0.20\n" +"v 1.00 0.25 0.00\n" +"v 0.00 0.50 0.00\n" +"v 0.25 0.50 0.20\n" +"v 0.50 0.50 0.30\n" +"v 0.75 0.50 0.20\n" +"v 1.00 0.50 0.00\n" +"v 0.00 0.75 0.00\n" +"v 0.25 0.75 0.20\n" +"v 0.50 0.75 0.20\n" +"v 0.75 0.75 0.20\n" +"v 1.00 0.75 0.00\n" +"v 0.00 1.00 0.00\n" +"v 0.25 1.00 0.00\n" +"v 0.50 1.00 0.00\n" +"v 0.75 1.00 0.00\n" +"v 1.00 1.00 0.00\n" +"vt 0.00 0.00\n" +"vt 0.25 0.00\n" +"vt 0.50 0.00\n" +"vt 0.75 0.00\n" +"vt 1.00 0.00\n" +"vt 0.00 0.20\n" +"vt 0.25 0.20\n" +"vt 0.50 0.10\n" +"vt 0.75 0.20\n" +"vt 1.00 0.20\n" +"vt 0.00 0.40\n" +"vt 0.25 0.40\n" +"vt 0.50 0.20\n" +"vt 0.75 0.40\n" +"vt 1.00 0.40\n" +"vt 0.00 0.60\n" +"vt 0.25 0.60\n" +"vt 0.50 0.40\n" +"vt 0.75 0.60\n" +"vt 1.00 0.60\n" +"vt 0.00 0.80\n" +"vt 0.25 0.80\n" +"vt 0.50 0.65\n" +"vt 0.75 0.80\n" +"vt 1.00 0.80\n" +"vt 0.00 1.00\n" +"vt 0.25 1.00\n" +"vt 0.40 1.00\n" +"vt 0.75 1.00\n" +"vt 1.00 1.00\n" +"vt 0.60 1.00\n" +"f 6/6 7/7 12/12 11/11\n" +"f 7/7 8/8 13/13 12/12\n" +"f 8/8 9/9 14/14 13/13\n" +"f 9/9 10/10 15/15 14/14\n" +"f 11/16 12/17 17/22 16/21\n" +"f 12/17 13/18 18/23 17/22\n" +"f 13/18 14/19 19/24 18/23\n" +"f 14/19 15/20 20/25 19/24\n" +; From 87a7fd831caa83868f806de1c337769f542d51f2 Mon Sep 17 00:00:00 2001 From: George ElKoura Date: Mon, 13 Jul 2015 18:13:54 -0700 Subject: [PATCH 09/59] Added references section to the documentation - Added new references section for folks wishing to learn more about subdivision. - Fixed a reference in the intro. - Fixed a minor typo in the nav bar. --- documentation/CMakeLists.txt | 1 + documentation/intro.rst | 2 +- documentation/nav_template.txt | 3 +- documentation/references.rst | 118 +++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 documentation/references.rst diff --git a/documentation/CMakeLists.txt b/documentation/CMakeLists.txt index 4078f4b0..5064fac4 100644 --- a/documentation/CMakeLists.txt +++ b/documentation/CMakeLists.txt @@ -92,6 +92,7 @@ if (DOCUTILS_FOUND AND PYTHONINTERP_FOUND) osd_overview.rst osd_shader_interface.rst porting.rst + references.rst release_notes.rst release_notes_2x.rst roadmap.rst diff --git a/documentation/intro.rst b/documentation/intro.rst index 4290d0c7..217b5590 100644 --- a/documentation/intro.rst +++ b/documentation/intro.rst @@ -94,7 +94,7 @@ between Pixar and Microsoft. | | *Analytic Displacement Mapping using Hardware Tessellation* | Matthias Niessner, Charles Loop - | ACM Transactions on Graphics, To appear 2013 + | ACM Transactions on Graphics, Vol. 32 No. 3 Article 26 June 2013 | ``_ ---- diff --git a/documentation/nav_template.txt b/documentation/nav_template.txt index 16aeaeab..1507fc59 100644 --- a/documentation/nav_template.txt +++ b/documentation/nav_template.txt @@ -40,6 +40,7 @@

  • Building OpenSubdiv
  • Code Examples
  • Roadmap
  • +
  • References
  • Release 3.0
  • @@ -101,7 +102,7 @@
  • Videos

    -
  • Release Notes +
  • Release Notes
  • Doxygen
  • diff --git a/documentation/references.rst b/documentation/references.rst new file mode 100644 index 00000000..ab435f26 --- /dev/null +++ b/documentation/references.rst @@ -0,0 +1,118 @@ +.. + Copyright 2015 Pixar + + Licensed under the Apache License, Version 2.0 (the "Apache License") + with the following modification; you may not use this file except in + compliance with the Apache License and the following modification to it: + Section 6. Trademarks. is deleted and replaced with: + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor + and its affiliates, except as required to comply with Section 4(c) of + the License and to reproduce the content of the NOTICE file. + + You may obtain a copy of the Apache License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the Apache License with the above modification is + distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the Apache License for the specific + language governing permissions and limitations under the Apache License. + + +References +---------- + + +.. contents:: + :local: + :backlinks: none + +---- + +References +========== + + + | *Analytic Displacement Mapping using Hardware Tessellation* + | Matthias Niessner, Charles Loop + | ACM Transactions on Graphics, Vol. 32 No. 3 Article 26 June 2013 + | ``_ + | ``_ + | + | *Feature Adaptive GPU Rendering of Catmull-Clark Subdivision Surfaces* + | Matthias Niessner, Charles Loop, Mark Meyer, and Tony DeRose + | ACM Transactions on Graphics, Vol. 31 No. 1 Article 6 January 2012 + | ``_ + | ``_ + | + | *Efficient Evaluation of Semi-Smooth Creases in Catmull-Clark Subdivision Surfaces* + | Matthias Niessner, Charles Loop, and Guenter Greiner. + | Eurographics Proceedings, Cagliari, 2012 + | ``_ + | ``_ + | + | *Approximating Subdivision Surfaces with Gregory Patches for Hardware Tessellation* + | Charles Loop, Scott Schaefer, Tianyun Ni, Ignacio Castano + | SIGGRAPH Asia Conference Proceedings 2009 + | ``_ + | ``_ + | + | GPU Smoothing of Quad Meshes + | T. L. Ni, Y. Yeo, A. Myles, V. Goel and J. Peters + | Proc. IEEE SMI 2008 + | ``_ + | ``_ + | + | *Fast Parallel Construction of Smooth Surfaces from Meshes with Tri/Quad/Pent Facets* + | A. Myles and T. Ni and J. Peters + | Eurographics Symposium on Geometry Processing 2008 + | ``_ + | ``_ + | + | *Approximating Catmull-Clark Subdivision Surfaces with Bicubic Patches* + | Charles Loop + | ACM Transactions on Graphics, Vol. 27 No. 1 Article 8 March 2008 + | ``_ + | ``_ + | + | *Rapid Evaluation of Catmull-Clark Subdivision Surfaces* + | Jeffrey Bolz and Peter Schroder + | Web3D Proceedings 2002 + | ``_ + | ``_ + | + | *Piecewise Smooth Subdivision Surfaces with Normal Control* + | Henning Biermann, Adi Levin and Denis Zorin + | SIGGRAPH 2000 Conference Proceedings + | ``_ + | ``_ + | + | *Subdivision for Modeling and Animation* + | Denis Zorin, Peter Schroder + | Course Notes of SIGGRAPH 1999 + | ``_ + | + | *Exact Evaluation of Catmull-Clark Subdivision Surfaces at Arbitrary Parameter Values* + | Jos Stam + | SIGGRAPH 98 Conference Proceedings, Annual Conference Series, July 1998 + | ``_ + | ``_ + | + | *Subdivision Surfaces in Character Animation* + | Tony DeRose, Michael Kass, Tien Truong + | Proceedings of SIGGRAPH 1998 + | ``_ + | ``_ + | + | *Efficient, Fair Interpolation Using Catmull-Clark Surfaces* + | Mark Halstead, Michael Kass, Tony DeRose + | SIGGRAPH 93 Conference Proceedings + | ``_ + | ``_ + | + | *Recursively generated B-spline surfaces on arbitrary topological meshes* + | Catmull, E.; Clark, J. Computer-Aided Design 10 (6) (1978) + | ``_ From 87dc09e7699e953b0dd666b1ac52caaea1590a02 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 15 Jul 2015 23:55:14 -0600 Subject: [PATCH 10/59] Fix cmake projects to not require GLFW when NO_OPENGL provided and not build gpu lib if not needed. --- CMakeLists.txt | 30 ++++++++++--- examples/common/CMakeLists.txt | 2 + opensubdiv/CMakeLists.txt | 82 ++++++++++++++++++---------------- opensubdiv/osd/CMakeLists.txt | 16 ++++--- 4 files changed, 79 insertions(+), 51 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a4ebb179..93b72b30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -314,6 +314,8 @@ option(NO_DX "Disable DirectX support") option(NO_TESTS "Disable all tests") option(NO_GLTESTS "Disable GL tests") +set(OSD_GPU FALSE) + # Check for dependencies if(NOT NO_OMP) find_package(OpenMP) @@ -338,7 +340,7 @@ endif() if(NOT NO_CUDA) find_package(CUDA 4.0) endif() -if(NOT ANDROID AND NOT IOS) +if(NOT NO_OPENGL AND NOT ANDROID AND NOT IOS) find_package(GLFW 3.0.0) endif() if(NOT NO_PTEX) @@ -406,6 +408,10 @@ else() endif() endif() +if( OPENGL_FOUND AND NOT NO_OPENGL) + set(OSD_GPU TRUE) +endif() + if(GLFW_FOUND AND (GLFW_VERSION VERSION_EQUAL 3.0 OR GLFW_VERSION VERSION_GREATER 3.0)) add_definitions( -DGLFW_VERSION_3 ) endif() @@ -449,6 +455,7 @@ if(OPENGLES_FOUND) add_definitions( -DOPENSUBDIV_HAS_OPENGLES ) + set(OSD_GPU TRUE) endif() if(OPENCL_FOUND) @@ -486,6 +493,7 @@ if(OPENCL_FOUND) ) endif() endif() + set(OSD_GPU TRUE) else() if (NOT NO_OPENCL) message(WARNING @@ -499,6 +507,7 @@ if(CUDA_FOUND) add_definitions( -DOPENSUBDIV_HAS_CUDA ) + set(OSD_GPU TRUE) else() if (NOT NO_CUDA) message(WARNING @@ -540,21 +549,23 @@ if (NOT NO_MAYA) endif() # Link examples & regressions dynamically against Osd -set( OSD_LINK_TARGET osd_dynamic_cpu osd_dynamic_gpu ) +if( OSD_GPU ) + set( OSD_LINK_TARGET osd_dynamic_cpu osd_dynamic_gpu ) +else() + set( OSD_LINK_TARGET osd_dynamic_cpu ) +endif() if (WIN32) add_definitions( # Link against the static version of GLEW. -DGLEW_STATIC ) - # Link examples & regressions statically against Osd for - # Windows until all the kinks can be worked out. - set( OSD_LINK_TARGET osd_static_cpu osd_static_gpu ) if (DXSDK_FOUND AND NOT NO_DX) add_definitions( -DOPENSUBDIV_HAS_DX11SDK ) + set(OSD_GPU TRUE) elseif(NOT NO_DX) message(WARNING "DirectX11 SDK was not found. " @@ -565,6 +576,15 @@ if (WIN32) "environment variable." ) endif() + + # Link examples & regressions statically against Osd for + # Windows until all the kinks can be worked out. + if( OSD_GPU ) + set( OSD_LINK_TARGET osd_static_cpu osd_static_gpu ) + else() + set( OSD_LINK_TARGET osd_static_cpu ) + endif() + endif() diff --git a/examples/common/CMakeLists.txt b/examples/common/CMakeLists.txt index 3c3c6a68..6b68b868 100644 --- a/examples/common/CMakeLists.txt +++ b/examples/common/CMakeLists.txt @@ -158,10 +158,12 @@ include_directories( set(INC_FILES ) +if(OPENGL_FOUND OR DXSDK_FOUND) _stringify("${EXAMPLES_COMMON_SHADER_FILES}" INC_FILES) source_group("Shaders" FILES ${EXAMPLES_COMMON_SHADER_FILES}) source_group("Inc" FILES ${INC_FILES}) +endif() add_library(examples_common_obj OBJECT diff --git a/opensubdiv/CMakeLists.txt b/opensubdiv/CMakeLists.txt index 4b3cec84..d67d339a 100644 --- a/opensubdiv/CMakeLists.txt +++ b/opensubdiv/CMakeLists.txt @@ -153,21 +153,23 @@ if (NOT NO_LIB) install( TARGETS osd_static_cpu DESTINATION "${CMAKE_LIBDIR_BASE}" ) - # this macro uses FindCUDA.cmake to compile .cu kernel files - # the target then adds the other obj dependencies and include files - _add_possibly_cuda_library(osd_static_gpu - STATIC - version.cpp - $ - ${CUDA_KERNEL_FILES} - ) - set_target_properties(osd_static_gpu PROPERTIES OUTPUT_NAME osdGPU CLEAN_DIRECT_OUTPUT 1) + if( OSD_GPU ) + # this macro uses FindCUDA.cmake to compile .cu kernel files + # the target then adds the other obj dependencies and include files + _add_possibly_cuda_library(osd_static_gpu + STATIC + version.cpp + $ + ${CUDA_KERNEL_FILES} + ) + set_target_properties(osd_static_gpu PROPERTIES OUTPUT_NAME osdGPU CLEAN_DIRECT_OUTPUT 1) - target_link_libraries(osd_static_gpu - ${PLATFORM_CPU_LIBRARIES} ${PLATFORM_GPU_LIBRARIES} - ) + target_link_libraries(osd_static_gpu + ${PLATFORM_CPU_LIBRARIES} ${PLATFORM_GPU_LIBRARIES} + ) - install( TARGETS osd_static_gpu DESTINATION "${CMAKE_LIBDIR_BASE}" ) + install( TARGETS osd_static_gpu DESTINATION "${CMAKE_LIBDIR_BASE}" ) + endif() # Build dynamic libs ---------------------------------- @@ -207,35 +209,37 @@ if (NOT NO_LIB) install( TARGETS osd_dynamic_cpu LIBRARY DESTINATION "${CMAKE_LIBDIR_BASE}" ) #--------------------------------------------------- - _add_possibly_cuda_library(osd_dynamic_gpu - SHARED - version.cpp - $ - ${CUDA_KERNEL_FILES} - ) + if( OSD_GPU ) + _add_possibly_cuda_library(osd_dynamic_gpu + SHARED + version.cpp + $ + ${CUDA_KERNEL_FILES} + ) - if (NOT ANDROID) - set_target_properties(osd_dynamic_gpu - PROPERTIES - OUTPUT_NAME osdGPU - CLEAN_DIRECT_OUTPUT 1 - SOVERSION ${OSD_SONAME} - ) - else() - set_target_properties(osd_dynamic_gpu - PROPERTIES - OUTPUT_NAME osdGPU - CLEAN_DIRECT_OUTPUT 1 - ) + if (NOT ANDROID) + set_target_properties(osd_dynamic_gpu + PROPERTIES + OUTPUT_NAME osdGPU + CLEAN_DIRECT_OUTPUT 1 + SOVERSION ${OSD_SONAME} + ) + else() + set_target_properties(osd_dynamic_gpu + PROPERTIES + OUTPUT_NAME osdGPU + CLEAN_DIRECT_OUTPUT 1 + ) + endif() + + target_link_libraries(osd_dynamic_gpu + osd_dynamic_cpu + ${PLATFORM_CPU_LIBRARIES} ${PLATFORM_GPU_LIBRARIES} + ) + + install( TARGETS osd_dynamic_gpu LIBRARY DESTINATION "${CMAKE_LIBDIR_BASE}" ) endif() - target_link_libraries(osd_dynamic_gpu - osd_dynamic_cpu - ${PLATFORM_CPU_LIBRARIES} ${PLATFORM_GPU_LIBRARIES} - ) - - install( TARGETS osd_dynamic_gpu LIBRARY DESTINATION "${CMAKE_LIBDIR_BASE}" ) - endif() endif() diff --git a/opensubdiv/osd/CMakeLists.txt b/opensubdiv/osd/CMakeLists.txt index f457dddd..38b4178a 100755 --- a/opensubdiv/osd/CMakeLists.txt +++ b/opensubdiv/osd/CMakeLists.txt @@ -317,13 +317,15 @@ add_library(osd_cpu_obj ${PUBLIC_HEADER_FILES} ) -add_library(osd_gpu_obj - OBJECT - ${GPU_SOURCE_FILES} - ${PRIVATE_HEADER_FILES} - ${PUBLIC_HEADER_FILES} - ${INC_FILES} -) +if( GPU_SOURCE_FILES ) + add_library(osd_gpu_obj + OBJECT + ${GPU_SOURCE_FILES} + ${PRIVATE_HEADER_FILES} + ${PUBLIC_HEADER_FILES} + ${INC_FILES} + ) +endif() _add_doxy_headers( "${DOXY_HEADER_FILES}" ) From 59382abeaa14a10fb237006addb1d96128199e79 Mon Sep 17 00:00:00 2001 From: Sheng Fu Date: Wed, 8 Jul 2015 17:08:18 -0700 Subject: [PATCH 11/59] Fix Intel compiler warning --- opensubdiv/far/endCapBSplineBasisPatchFactory.cpp | 2 ++ opensubdiv/far/endCapGregoryBasisPatchFactory.cpp | 8 ++++---- opensubdiv/far/endCapLegacyGregoryPatchFactory.cpp | 6 +++--- opensubdiv/far/patchTableFactory.cpp | 5 ++++- opensubdiv/far/stencilBuilder.cpp | 2 ++ opensubdiv/far/stencilTable.h | 2 ++ opensubdiv/far/stencilTableFactory.cpp | 2 ++ opensubdiv/osd/types.h | 8 ++++---- opensubdiv/vtr/level.cpp | 2 ++ 9 files changed, 25 insertions(+), 12 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index e90414c3..0804c166 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -32,6 +32,8 @@ #include #include +#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable + namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { diff --git a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp index dab51902..a884350a 100644 --- a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp @@ -133,11 +133,11 @@ EndCapGregoryBasisPatchFactory::GetPatchPoints( { // Gather adjacent faces ConstIndexArray adjfaces = level->getEdgeFaces(edge); - for (int i=0; iresize(numTotalGregoryPatches*4); @@ -120,11 +120,11 @@ EndCapLegacyGregoryPatchFactory::Finalize( PatchTable::QuadOffsetsTable::value_type *p = &((*quadOffsetsTable)[0]); for (size_t i = 0; i < numGregoryPatches; ++i) { - getQuadOffsets(level, _gregoryFaceIndices[i], p); + getQuadOffsets(maxLevel, _gregoryFaceIndices[i], p); p += 4; } for (size_t i = 0; i < numGregoryBoundaryPatches; ++i) { - getQuadOffsets(level, _gregoryBoundaryFaceIndices[i], p); + getQuadOffsets(maxLevel, _gregoryBoundaryFaceIndices[i], p); p += 4; } } diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index c506f961..084ad81a 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -39,6 +39,9 @@ namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { +#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable +#pragma warning disable 177 // getNumArrays is never referenced + namespace { // // A convenience container for the different types of feature adaptive patches @@ -1163,7 +1166,7 @@ PatchTableFactory::populateAdaptivePatches( permutation = permuteCorner[bIndex]; level->gatherQuadRegularCornerPatchPoints(faceIndex, patchVerts, bIndex); } else { - assert(patchTag._boundaryCount >=0 && patchTag._boundaryCount <= 2); + assert(patchTag._boundaryCount >0 && patchTag._boundaryCount <= 2); } offsetAndPermuteIndices(patchVerts, 16, levelVertOffset, permutation, iptrs.R); diff --git a/opensubdiv/far/stencilBuilder.cpp b/opensubdiv/far/stencilBuilder.cpp index 80c5263c..fb65882e 100644 --- a/opensubdiv/far/stencilBuilder.cpp +++ b/opensubdiv/far/stencilBuilder.cpp @@ -25,6 +25,8 @@ #include "../far/stencilBuilder.h" #include "../far/topologyRefiner.h" +#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable + namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { diff --git a/opensubdiv/far/stencilTable.h b/opensubdiv/far/stencilTable.h index 5b32e484..087391c6 100644 --- a/opensubdiv/far/stencilTable.h +++ b/opensubdiv/far/stencilTable.h @@ -133,6 +133,8 @@ class StencilTable { public: + virtual ~StencilTable() {}; + /// \brief Returns the number of stencils in the table int GetNumStencils() const { return (int)_sizes.size(); diff --git a/opensubdiv/far/stencilTableFactory.cpp b/opensubdiv/far/stencilTableFactory.cpp index d332209d..2822b24c 100644 --- a/opensubdiv/far/stencilTableFactory.cpp +++ b/opensubdiv/far/stencilTableFactory.cpp @@ -40,6 +40,8 @@ namespace OPENSUBDIV_VERSION { namespace Far { +#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable + //------------------------------------------------------------------------------ void diff --git a/opensubdiv/osd/types.h b/opensubdiv/osd/types.h index 8729b352..203d7860 100644 --- a/opensubdiv/osd/types.h +++ b/opensubdiv/osd/types.h @@ -63,10 +63,10 @@ struct PatchCoord { struct PatchArray { // 4-ints struct. - PatchArray(Far::PatchDescriptor desc, int numPatches, - int indexBase, int primitiveIdBase) : - desc(desc), numPatches(numPatches), indexBase(indexBase), - primitiveIdBase(primitiveIdBase) {} + PatchArray(Far::PatchDescriptor desc_in, int numPatches_in, + int indexBase_in, int primitiveIdBase_in) : + desc(desc_in), numPatches(numPatches_in), indexBase(indexBase_in), + primitiveIdBase(primitiveIdBase_in) {} Far::PatchDescriptor const &GetDescriptor() const { return desc; diff --git a/opensubdiv/vtr/level.cpp b/opensubdiv/vtr/level.cpp index b5d41ac5..a15973c1 100644 --- a/opensubdiv/vtr/level.cpp +++ b/opensubdiv/vtr/level.cpp @@ -36,6 +36,8 @@ #include #include +#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable + #ifdef _MSC_VER #define snprintf _snprintf #endif From fe20023989aedf3b1c945d4b8331a1d760b214c6 Mon Sep 17 00:00:00 2001 From: Sheng Fu Date: Fri, 10 Jul 2015 16:42:32 -0700 Subject: [PATCH 12/59] minimize the scope of disabled warnings --- opensubdiv/far/endCapBSplineBasisPatchFactory.cpp | 14 ++++++++------ opensubdiv/far/patchTable.h | 2 +- opensubdiv/far/patchTableFactory.cpp | 7 ++++--- opensubdiv/far/stencilBuilder.cpp | 13 ++++++++----- opensubdiv/far/stencilTableFactory.cpp | 7 ++++--- opensubdiv/far/topologyRefiner.h | 2 +- opensubdiv/vtr/level.cpp | 7 ++++--- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index 0804c166..c11d5cba 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -32,8 +32,6 @@ #include #include -#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable - namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { @@ -88,6 +86,9 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( bezierCP.push_back(basis.Ep[2]); bezierCP.push_back(basis.P[2]); +#pragma warning (push) +#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable + // Apply basis conversion from bezier to b-spline float Q[4][4] = {{ 6, -7, 2, 0}, { 0, 2, -1, 0}, @@ -96,8 +97,8 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( std::vector H(16); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { - for (int k = 0; k < 4; ++k) { - if (Q[i][k] != 0) H[i*4+j] += bezierCP[j+k*4] * Q[i][k]; + for (int k = 0; k < 4; ++k) { + if (Q[i][k] != 0.0f) H[i*4+j] += bezierCP[j+k*4] * Q[i][k]; } } } @@ -105,12 +106,13 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( for (int j = 0; j < 4; ++j) { GregoryBasis::Point p; for (int k = 0; k < 4; ++k) { - if (Q[j][k] != 0) p += H[i*4+k] * Q[j][k]; + if (Q[j][k] != 0.0f) p += H[i*4+k] * Q[j][k]; } _vertexStencils.push_back(p); } } - +#pragma warning (pop) + int varyingIndices[] = { 0, 0, 1, 1, 0, 0, 1, 1, 3, 3, 2, 2, diff --git a/opensubdiv/far/patchTable.h b/opensubdiv/far/patchTable.h index 5bb32475..39aa5302 100644 --- a/opensubdiv/far/patchTable.h +++ b/opensubdiv/far/patchTable.h @@ -416,7 +416,7 @@ PatchTable::ComputeLocalPointValues(T const *src, T *dst) const { if (_localPointStencils) { _localPointStencils->UpdateValues(src, dst); } -}; +} } // end namespace Far diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index 084ad81a..975c1aff 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -39,9 +39,6 @@ namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { -#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable -#pragma warning disable 177 // getNumArrays is never referenced - namespace { // // A convenience container for the different types of feature adaptive patches @@ -513,12 +510,16 @@ PatchTableFactory::computePatchParam( inline int assignSharpnessIndex(float sharpness, std::vector & sharpnessValues) { +#pragma warning (push) +#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable // linear search for (int i=0; i<(int)sharpnessValues.size(); ++i) { if (sharpnessValues[i] == sharpness) { return i; } } +#pragma warning (pop) + sharpnessValues.push_back(sharpness); return (int)sharpnessValues.size()-1; } diff --git a/opensubdiv/far/stencilBuilder.cpp b/opensubdiv/far/stencilBuilder.cpp index fb65882e..4073fcfe 100644 --- a/opensubdiv/far/stencilBuilder.cpp +++ b/opensubdiv/far/stencilBuilder.cpp @@ -24,9 +24,7 @@ #include "../far/stencilBuilder.h" #include "../far/topologyRefiner.h" - -#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable - + namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { @@ -365,11 +363,14 @@ StencilBuilder::GetStencilDvWeights() const { return _weightTable->GetDvWeights(); } +#pragma warning (push) +#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable + void StencilBuilder::Index::AddWithWeight(Index const & src, float weight) { // Ignore no-op weights. - if (weight == 0) + if (weight == 0.0f) return; _owner->_weightTable->AddWithWeight(src._index, _index, weight, _owner->_weightTable->GetScalarAccumulator()); @@ -397,7 +398,7 @@ StencilBuilder::Index::AddWithWeight(Stencil const& src, float weight) float wgt = weight * w; _owner->_weightTable->AddWithWeight(srcIndex, _index, wgt, _owner->_weightTable->GetScalarAccumulator()); - } + } } void @@ -426,6 +427,8 @@ StencilBuilder::Index::AddWithWeight(Stencil const& src, } } +#pragma warning (pop) + } // end namespace internal } // end namespace Far } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/far/stencilTableFactory.cpp b/opensubdiv/far/stencilTableFactory.cpp index 2822b24c..ed4ef883 100644 --- a/opensubdiv/far/stencilTableFactory.cpp +++ b/opensubdiv/far/stencilTableFactory.cpp @@ -40,8 +40,6 @@ namespace OPENSUBDIV_VERSION { namespace Far { -#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable - //------------------------------------------------------------------------------ void @@ -260,7 +258,10 @@ StencilTableFactory::AppendLocalPointStencilTable( for (int j = 0; j < src.GetSize(); ++j) { Index index = src.GetVertexIndices()[j]; float weight = src.GetWeights()[j]; - if (weight == 0.0) continue; +#pragma warning (push) +#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable + if (weight == 0.0f) continue; +#pragma warning (pop) if (factorize) { dst.AddWithWeight( diff --git a/opensubdiv/far/topologyRefiner.h b/opensubdiv/far/topologyRefiner.h index 36f1e76c..7676a52e 100644 --- a/opensubdiv/far/topologyRefiner.h +++ b/opensubdiv/far/topologyRefiner.h @@ -232,7 +232,7 @@ private: std::vector _levels; std::vector _refinements; - std::vector _farLevels;; + std::vector _farLevels; }; diff --git a/opensubdiv/vtr/level.cpp b/opensubdiv/vtr/level.cpp index a15973c1..25b06c1c 100644 --- a/opensubdiv/vtr/level.cpp +++ b/opensubdiv/vtr/level.cpp @@ -35,9 +35,7 @@ #include #include #include - -#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable - + #ifdef _MSC_VER #define snprintf _snprintf #endif @@ -1298,10 +1296,13 @@ Level::isSingleCreasePatch(Index face, float *sharpnessOut, int *rotationOut) co } } // sharpnesses have to be [0, x, 0, x] or [x, 0, x, 0] +#pragma warning (push) +#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable if (sharpnesses[0] != sharpnesses[2] or sharpnesses[1] != sharpnesses[3]) { return false; } +#pragma warning (pop) } // check the edges around v[2], v[3] for (int i = 2; i < 4; ++i) { From 51a9da3bf0e69fd9cfca8e81ad6570b6f0d2e9da Mon Sep 17 00:00:00 2001 From: Sheng Fu Date: Fri, 10 Jul 2015 16:54:12 -0700 Subject: [PATCH 13/59] fix ICC compile warning --- opensubdiv/far/patchTableFactory.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index 975c1aff..d512c5a0 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -40,6 +40,9 @@ namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { namespace { + +#pragma warning disable 177 //function getNumPatchArrays was declared but never referenced + // // A convenience container for the different types of feature adaptive patches // From a095ebf1f034f1caee46b5d89365d97c72fc6ab0 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 19 Jul 2015 18:06:54 +0200 Subject: [PATCH 14/59] Fix linking error when using GCC and including osd/mesh.h from several places Te issue here is that some of the functions were not considered templated anymore because all their template arguments were specified, which made it so compiler was creating implementation for them in every file from where the header was included. This causes errors during linking related on the same symbol implemented in several places. Marking those functions as inlined solves the problem and should not cause any bad side effects because they're small enough and likely being inlined by an optimizer anyway. --- opensubdiv/osd/mesh.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/opensubdiv/osd/mesh.h b/opensubdiv/osd/mesh.h index 9862957f..090575ba 100644 --- a/opensubdiv/osd/mesh.h +++ b/opensubdiv/osd/mesh.h @@ -124,7 +124,7 @@ convertToCompatibleStencilTable( } template <> -Far::StencilTable const * +inline Far::StencilTable const * convertToCompatibleStencilTable( Far::StencilTable const *table, void * /*context*/) { // no need for conversion @@ -134,7 +134,7 @@ convertToCompatibleStencilTable( } template <> -Far::LimitStencilTable const * +inline Far::LimitStencilTable const * convertToCompatibleStencilTable( Far::LimitStencilTable const *table, void * /*context*/) { // no need for conversion @@ -144,7 +144,7 @@ convertToCompatibleStencilTable -Far::StencilTable const * +inline Far::StencilTable const * convertToCompatibleStencilTable( Far::StencilTable const *table, ID3D11DeviceContext * /*context*/) { // no need for conversion From 2f694727c3c7551cc5a0c8c878687de6ae57c9c4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 19 Jul 2015 18:10:09 +0200 Subject: [PATCH 15/59] Remove workaround for duplicated symbols with MSVC This workaround actually caused linking errors related on missing symbols and removing the workaround does not cause any duplicated symbols with MSVC 2013. --- opensubdiv/far/topologyRefinerFactory.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/opensubdiv/far/topologyRefinerFactory.h b/opensubdiv/far/topologyRefinerFactory.h index 38e9491e..195ff501 100644 --- a/opensubdiv/far/topologyRefinerFactory.h +++ b/opensubdiv/far/topologyRefinerFactory.h @@ -539,10 +539,6 @@ TopologyRefinerFactory::getBaseFaceFVarValues(TopologyRefiner & newRefiner } - -// XXXX manuelk MSVC specializes these templated functions which creates duplicated symbols -#ifndef _MSC_VER - template bool TopologyRefinerFactory::resizeComponentTopology(TopologyRefiner& /* refiner */, MESH const& /* mesh */) { @@ -680,8 +676,6 @@ TopologyRefinerFactory::reportInvalidTopology( // } -#endif - } // end namespace Far } // end namespace OPENSUBDIV_VERSION From d3f8725e79025345298fc8d54f4cd2195ab6a1dc Mon Sep 17 00:00:00 2001 From: Sheng Fu Date: Mon, 20 Jul 2015 14:12:11 -0700 Subject: [PATCH 16/59] Add ISPC limit surface evaluation --- CMakeLists.txt | 11 + cmake/FindISPC.cmake | 94 +++ examples/glEvalLimit/glEvalLimit.cpp | 36 +- examples/glEvalLimit/particles.cpp | 52 +- examples/glEvalLimit/particles.h | 11 +- opensubdiv/CMakeLists.txt | 26 +- opensubdiv/far/patchParam.h | 23 + opensubdiv/far/patchTable.h | 6 + opensubdiv/osd/CMakeLists.txt | 18 +- opensubdiv/osd/ispcEvalLimitKernel.ispc | 880 ++++++++++++++++++++++++ opensubdiv/osd/ispcEvalLimitKernel.isph | 55 ++ opensubdiv/osd/ispcEvaluator.cpp | 289 ++++++++ opensubdiv/osd/ispcEvaluator.h | 482 +++++++++++++ 13 files changed, 1953 insertions(+), 30 deletions(-) create mode 100644 cmake/FindISPC.cmake create mode 100644 opensubdiv/osd/ispcEvalLimitKernel.ispc create mode 100644 opensubdiv/osd/ispcEvalLimitKernel.isph create mode 100644 opensubdiv/osd/ispcEvaluator.cpp create mode 100644 opensubdiv/osd/ispcEvaluator.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a4ebb179..ab9fcb5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,6 +197,8 @@ if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_IC endif() endforeach() + + list(APPEND OSD_COMPILER_FLAGS -std=c++11) endif() elseif(MSVC) @@ -321,6 +323,9 @@ endif() if(NOT NO_TBB) find_package(TBB 4.0) endif() +if(NOT NO_ISPC) + find_package(ISPC 1.6) +endif() if (NOT NO_OPENGL) find_package(OpenGL) endif() @@ -539,6 +544,12 @@ if (NOT NO_MAYA) endif() endif() +if(ISPC_FOUND) + add_definitions( + -DOPENSUBDIV_HAS_ISPC + ) +endif() + # Link examples & regressions dynamically against Osd set( OSD_LINK_TARGET osd_dynamic_cpu osd_dynamic_gpu ) diff --git a/cmake/FindISPC.cmake b/cmake/FindISPC.cmake new file mode 100644 index 00000000..c57f2189 --- /dev/null +++ b/cmake/FindISPC.cmake @@ -0,0 +1,94 @@ +# +# Copyright 2013 Pixar +# +# Licensed under the Apache License, Version 2.0 (the "Apache License") +# with the following modification; you may not use this file except in +# compliance with the Apache License and the following modification to it: +# Section 6. Trademarks. is deleted and replaced with: +# +# 6. Trademarks. This License does not grant permission to use the trade +# names, trademarks, service marks, or product names of the Licensor +# and its affiliates, except as required to comply with Section 4(c) of +# the License and to reproduce the content of the NOTICE file. +# +# You may obtain a copy of the Apache License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the Apache License with the above modification is +# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the Apache License for the specific +# language governing permissions and limitations under the Apache License. +# + +# - Try to find Intel's ISPC +# Once done this will define +# +# ISPC_FOUND - System has ISPC +# ISPC_DIR - The ISPC directory + +# Obtain ISPC directory +if (WIN32) + #NOT IMPLEMENTED +elseif (APPLE) + #NOT IMPLEMENTED +else () + find_path(ISPC_DIR + NAMES + ispc + PATHS + ${ISPC_LOCATION} + NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH + DOC "The directory where ISPC reside") +endif () + +if (ISPC_DIR) + execute_process(COMMAND ${ISPC_DIR}/ispc --version OUTPUT_VARIABLE ISPC_VERSION) + string(REGEX MATCH "[0-9].[0-9].[0-9]" ISPC_VERSION ${ISPC_VERSION}) +endif () + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(ISPC + REQUIRED_VARS + ISPC_DIR + VERSION_VAR + ISPC_VERSION +) + +mark_as_advanced( ISPC_DIR ) + +MACRO (ispc_compile) + + SET(ISPC_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/osd_ispc_obj.dir) + + SET(ISPC_OBJECTS "") + + FOREACH(src ${ARGN}) + + GET_FILENAME_COMPONENT(fname ${src} NAME_WE) + + SET(results "${ISPC_TARGET_DIR}/${fname}.dev.o") + + ADD_CUSTOM_COMMAND( + OUTPUT ${results} ${ISPC_TARGET_DIR}/${fname}_ispc.h + COMMAND ${ISPC_DIR}/ispc + --pic + -O1 + --wno-perf + --woff + -h ${ISPC_TARGET_DIR}/${fname}_ispc.h + -MMM ${ISPC_TARGET_DIR}/${fname}.dev.idep + -o ${ISPC_TARGET_DIR}/${fname}.dev.o + ${CMAKE_CURRENT_SOURCE_DIR}/${src} + \; + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src} + ) + + SET(ISPC_OBJECTS ${ISPC_OBJECTS} ${results}) + + ENDFOREACH() + +ENDMACRO() + diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 98ff3d1b..82dfdb50 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -34,6 +34,10 @@ GLFWmonitor* g_primary=0; #include #include +#ifdef OPENSUBDIV_HAS_ISPC + #include +#endif + #ifdef OPENSUBDIV_HAS_TBB #include #endif @@ -104,7 +108,8 @@ enum KernelType { kCPU = 0, kCUDA = 3, kCL = 4, kGLXFB = 5, - kGLCompute = 6 }; + kGLCompute = 6, + kISPC = 7 }; enum EndCap { kEndCapBSplineBasis, kEndCapGregoryBasis }; @@ -169,10 +174,10 @@ float g_currentTime = 0; Stopwatch g_fpsTimer; //------------------------------------------------------------------------------ -int g_nParticles = 65536; +int g_nParticles = 655360; bool g_randomStart = true;//false; -bool g_animParticles = true; +bool g_animParticles = false; GLuint g_samplesVAO=0; @@ -439,7 +444,9 @@ updateGeom() { assert(g_particles); float elapsed = g_currentTime - g_prevTime; - g_particles->Update(elapsed); + if(elapsed != 0.0f) { + g_particles->Update(elapsed); + } g_prevTime = g_currentTime; std::vector const &patchCoords @@ -464,7 +471,7 @@ updateGeom() { } s.Stop(); - + g_evalTime = float(s.GetElapsed()); } @@ -648,8 +655,20 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { (vertexStencils, varyingStencils, nCoarseVertices, nverts, g_nParticles, g_patchTable, &glComputeEvaluatorCache); + + } #endif - } +#if defined(OPENSUBDIV_HAS_ISPC) && defined(OPENSUBDIV_HAS_TBB) + else if(g_kernel == kISPC) { + g_evalOutput = new EvalOutput + (vertexStencils, varyingStencils, + nCoarseVertices, nverts, g_nParticles, g_patchTable); + } +#endif // Create the 'uv particles' manager - this class manages the limit // location samples (ptex face index, (s,t) and updates them between frames. @@ -875,7 +894,7 @@ display() { } if (g_endCap != kEndCapBSplineBasis && - (g_kernel != kCPU && g_kernel != kOPENMP && g_kernel != kTBB)) { + (g_kernel != kCPU && g_kernel != kOPENMP && g_kernel != kTBB && g_kernel != kISPC)) { static char msg[] = "ERROR: This kernel only supports BSpline basis patches."; g_hud.DrawString(g_width/4, g_height/4+20, 1, 0, 0, msg); @@ -1129,6 +1148,9 @@ initHUD() { #ifdef OPENSUBDIV_HAS_TBB g_hud.AddPullDownButton(compute_pulldown, "TBB", kTBB); #endif +#if defined(OPENSUBDIV_HAS_ISPC) && defined(OPENSUBDIV_HAS_TBB) + g_hud.AddPullDownButton(compute_pulldown, "ISPC", kISPC); +#endif #ifdef OPENSUBDIV_HAS_CUDA g_hud.AddPullDownButton(compute_pulldown, "CUDA", kCUDA); #endif diff --git a/examples/glEvalLimit/particles.cpp b/examples/glEvalLimit/particles.cpp index a07b9572..add4049b 100644 --- a/examples/glEvalLimit/particles.cpp +++ b/examples/glEvalLimit/particles.cpp @@ -32,17 +32,17 @@ #ifdef OPENSUBDIV_HAS_TBB #include #include -tbb::atomic g_tbbCounter; + class TbbUpdateKernel { public: TbbUpdateKernel(float speed, STParticles::Position *positions, float *velocities, std::vector const &adjacency, - OpenSubdiv::Osd::PatchCoord *patchCoords, + PatchHandleMap *patchHandleMap, OpenSubdiv::Far::PatchMap const *patchMap) : _speed(speed), _positions(positions), _velocities(velocities), - _adjacency(adjacency), _patchCoords(patchCoords), _patchMap(patchMap) { + _adjacency(adjacency), _patchHandleMap(patchHandleMap), _patchMap(patchMap) { } void operator () (tbb::blocked_range const &r) const { @@ -76,9 +76,13 @@ public: OpenSubdiv::Far::PatchTable::PatchHandle const *handle = _patchMap->FindPatch(p->ptexIndex, p->s, p->t); if (handle) { - int index = g_tbbCounter.fetch_and_add(1); - _patchCoords[index] = - OpenSubdiv::Osd::PatchCoord(*handle, p->s, p->t); + PatchHandleMap::accessor a; + if( !_patchHandleMap->find(a, handle)) { + _patchHandleMap->insert(a, handle); + } + std::vector &st = a->second; + st.push_back(p->s); + st.push_back(p->t); } } } @@ -87,7 +91,7 @@ private: STParticles::Position *_positions; float *_velocities; std::vector const &_adjacency; - OpenSubdiv::Osd::PatchCoord *_patchCoords; + PatchHandleMap *_patchHandleMap; OpenSubdiv::Far::PatchMap const *_patchMap; }; #endif @@ -276,18 +280,36 @@ STParticles::Update(float deltaTime) { if (deltaTime == 0) return; float speed = GetSpeed() * std::max(0.001f, std::min(deltaTime, 0.5f)); - _patchCoords.clear(); - // XXX: this process should be parallelized. #ifdef OPENSUBDIV_HAS_TBB - - _patchCoords.resize((int)GetNumParticles()); + _patchHandleMap.clear(); + TbbUpdateKernel kernel(speed, &_positions[0], &_velocities[0], - _adjacency, &_patchCoords[0], _patchMap);; - g_tbbCounter = 0; + _adjacency, &_patchHandleMap, _patchMap);; tbb::blocked_range range(0, GetNumParticles(), 256); tbb::parallel_for(range, kernel); - _patchCoords.resize(g_tbbCounter); + + + int nCoord = 0; + for(PatchHandleMap::iterator i = _patchHandleMap.begin(); + i != _patchHandleMap.end(); + i ++) { + nCoord += (i->second.size() / 2); + } + + _patchCoords.resize(nCoord); + + int index = 0; + for(PatchHandleMap::iterator i = _patchHandleMap.begin(); + i != _patchHandleMap.end(); + i ++) { + for(int j = 0; j < i->second.size(); j += 2) { + _patchCoords[index].handle = *(i->first); + _patchCoords[index].s = i->second[j]; + _patchCoords[index].t = i->second[j+1]; + index ++; + } + } #else Position * p = &_positions[0]; float * dp = &_velocities[0]; @@ -323,7 +345,7 @@ STParticles::Update(float deltaTime) { OpenSubdiv::Osd::PatchCoord(*handle, p->s, p->t)); } } -#endif +#endif } // Dump adjacency info diff --git a/examples/glEvalLimit/particles.h b/examples/glEvalLimit/particles.h index 887add25..ff4fa940 100644 --- a/examples/glEvalLimit/particles.h +++ b/examples/glEvalLimit/particles.h @@ -30,6 +30,11 @@ #include #include +#ifdef OPENSUBDIV_HAS_TBB +#include +typedef tbb::concurrent_hash_map< OpenSubdiv::Far::PatchTable::PatchHandle const*, std::vector > PatchHandleMap; +#endif + // // In order to emphasize the dynamic nature of the EvalLimit API, where the // locations can be arbitrarily updated before each evaluation, the glEvalLimit @@ -142,7 +147,7 @@ public: return _velocities; } - std::vector GetPatchCoords() const { + std::vector const &GetPatchCoords() const { return _patchCoords; } @@ -159,6 +164,10 @@ private: std::vector _positions; std::vector _velocities; + +#ifdef OPENSUBDIV_HAS_TBB + PatchHandleMap _patchHandleMap; +#endif std::vector _patchCoords; diff --git a/opensubdiv/CMakeLists.txt b/opensubdiv/CMakeLists.txt index 4b3cec84..06d2f31a 100644 --- a/opensubdiv/CMakeLists.txt +++ b/opensubdiv/CMakeLists.txt @@ -147,9 +147,16 @@ if (NOT NO_LIB) ) set_target_properties(osd_static_cpu PROPERTIES OUTPUT_NAME osdCPU CLEAN_DIRECT_OUTPUT 1) - target_link_libraries(osd_static_cpu - ${PLATFORM_CPU_LIBRARIES} - ) + if( ISPC_FOUND) + target_link_libraries(osd_static_cpu + osd_ispc_obj + ${PLATFORM_CPU_LIBRARIES} + ) + else() + target_link_libraries(osd_static_cpu + ${PLATFORM_CPU_LIBRARIES} + ) + endif() install( TARGETS osd_static_cpu DESTINATION "${CMAKE_LIBDIR_BASE}" ) @@ -200,9 +207,16 @@ if (NOT NO_LIB) ) endif() - target_link_libraries(osd_dynamic_cpu - ${PLATFORM_CPU_LIBRARIES} - ) + if ( ISPC_FOUND) + target_link_libraries(osd_dynamic_cpu + osd_ispc_obj + ${PLATFORM_CPU_LIBRARIES} + ) + else() + target_link_libraries(osd_dynamic_cpu + ${PLATFORM_CPU_LIBRARIES} + ) + endif() install( TARGETS osd_dynamic_cpu LIBRARY DESTINATION "${CMAKE_LIBDIR_BASE}" ) diff --git a/opensubdiv/far/patchParam.h b/opensubdiv/far/patchParam.h index c5f0243f..6c65258f 100644 --- a/opensubdiv/far/patchParam.h +++ b/opensubdiv/far/patchParam.h @@ -116,6 +116,15 @@ struct PatchParam { /// void Normalize( float & u, float & v ) const; + /// This function is the reverse operation of function Normalize() + /// The (u,v) pair is converted from patch sub-parametric space to control + /// face parametric space. + /// + /// @param u u parameter + /// @param v v parameter + /// + void Denormalize( float & u, float & v) const; + unsigned int field0:32; unsigned int field1:32; }; @@ -161,6 +170,20 @@ PatchParam::Normalize( float & u, float & v ) const { v = (v - pv) / frac; } +inline void +PatchParam::Denormalize( float & u, float & v ) const { + + float frac = GetParamFraction(); + + // top left corner + float pu = (float)GetU()*frac; + float pv = (float)GetV()*frac; + + // normalize u,v coordinates + u = u * frac + pu; + v = v * frac + pv; +} + } // end namespace Far } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/far/patchTable.h b/opensubdiv/far/patchTable.h index 39aa5302..351a901f 100644 --- a/opensubdiv/far/patchTable.h +++ b/opensubdiv/far/patchTable.h @@ -68,6 +68,12 @@ public: Index arrayIndex, // Array index of the patch patchIndex, // Absolute Index of the patch vertIndex; // Relative offset to the first CV of the patch in array + + bool isEqual(const PatchHandle &other) { + return other.arrayIndex == arrayIndex && + other.patchIndex == patchIndex && + other.vertIndex == vertIndex; + } }; public: diff --git a/opensubdiv/osd/CMakeLists.txt b/opensubdiv/osd/CMakeLists.txt index f457dddd..43268451 100755 --- a/opensubdiv/osd/CMakeLists.txt +++ b/opensubdiv/osd/CMakeLists.txt @@ -26,6 +26,7 @@ #------------------------------------------------------------------------------- # source & headers + set(CPU_SOURCE_FILES cpuEvaluator.cpp cpuKernel.cpp @@ -33,8 +34,12 @@ set(CPU_SOURCE_FILES cpuVertexBuffer.cpp ) -set(GPU_SOURCE_FILES ) +if( ISPC_FOUND) + list(APPEND CPU_SOURCE_FILES ispcEvaluator.cpp) +endif() +set(GPU_SOURCE_FILES ) +set(ISPC_SOURCE_FILES ) set(INC_FILES ) set(PRIVATE_HEADER_FILES @@ -296,6 +301,17 @@ if( CUDA_FOUND ) endif() endif() +if( ISPC_FOUND) + list(APPEND ISPC_SOURCE_FILES + ispcEvalLimitKernel.ispc + ) + + # Compile ISPC code to objs + ispc_compile(${ISPC_SOURCE_FILES}) + ADD_LIBRARY(osd_ispc_obj STATIC ${ISPC_OBJECTS}) + SET_TARGET_PROPERTIES(osd_ispc_obj PROPERTIES LINKER_LANGUAGE C) +endif() + list(APPEND DOXY_HEADER_FILES ${CUDA_PUBLIC_HEADERS}) #------------------------------------------------------------------------------- diff --git a/opensubdiv/osd/ispcEvalLimitKernel.ispc b/opensubdiv/osd/ispcEvalLimitKernel.ispc new file mode 100644 index 00000000..3af62889 --- /dev/null +++ b/opensubdiv/osd/ispcEvalLimitKernel.ispc @@ -0,0 +1,880 @@ +// +// Copyright 2013 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + + +#define MAX_CHANNEL 4 + +struct BufferDescriptor { + int offset; // offset to desired element data + int length; // number or length of the data + int stride; // stride to the next element +}; + +struct Point { + float x; + float y; + float z; +}; + +inline struct Point operator+(struct Point a, struct Point b) { + struct Point result; + result.x = a.x + b.x; + result.y = a.y + b.y; + result.z = a.z + b.z; + + return result; +} + +inline uniform struct Point operator+(uniform struct Point a, uniform struct Point b) { + uniform struct Point result; + result.x = a.x + b.x; + result.y = a.y + b.y; + result.z = a.z + b.z; + + return result; +} + +inline struct Point operator-(struct Point a, struct Point b) { + struct Point result; + result.x = a.x - b.x; + result.y = a.y - b.y; + result.z = a.z - b.z; + + return result; +} + +inline uniform struct Point operator-(uniform struct Point a, uniform struct Point b) { + uniform struct Point result; + result.x = a.x - b.x; + result.y = a.y - b.y; + result.z = a.z - b.z; + + return result; +} + +inline struct Point operator*(struct Point a, float b) { + struct Point result; + result.x = a.x * b; + result.y = a.y * b; + result.z = a.z * b; + + return result; +} + +inline uniform struct Point operator*(uniform struct Point a, uniform float b) { + uniform struct Point result; + result.x = a.x * b; + result.y = a.y * b; + result.z = a.z * b; + + return result; +} + +inline struct Point operator*(float b, struct Point a) { + struct Point result; + result.x = b * a.x; + result.y = b * a.y; + result.z = b * a.z; + + return result; +} + +inline uniform struct Point operator*(uniform float b, uniform struct Point a) { + uniform struct Point result; + result.x = b * a.x; + result.y = b * a.y; + result.z = b * a.z; + + return result; +} + +inline struct Point operator/(struct Point a, float b) { + struct Point result; + result.x = a.x / b; + result.y = a.y / b; + result.z = a.z / b; + + return result; +} + +inline uniform struct Point operator/(uniform struct Point a, uniform float b) { + uniform struct Point result; + result.x = a.x / b; + result.y = a.y / b; + result.z = a.z / b; + + return result; +} + +inline void cross(struct Point &a, struct Point &b, struct Point &c) +{ + c.x = a.y*b.z - a.z*b.y; + c.y = a.z*b.x - a.x*b.z; + c.z = a.x*b.y - a.y*b.x; +} + +inline uniform bool +nonQuadRoot(uniform unsigned int bitField) +{ + return (bitField >> 3) & 0x1; +} + +inline uniform unsigned int getU(uniform unsigned int bitField) +{ + return (uniform unsigned int)((bitField >> 22) & 0x3ff); +} + +inline uniform unsigned int getV(uniform unsigned int bitField) +{ + return (uniform unsigned int)((bitField >> 12) & 0x3ff); +} + +inline uniform unsigned int getBoundary(uniform unsigned int bitField) +{ + return (uniform unsigned int)((bitField >> 8) & 0xf); +} + +inline uniform unsigned int getDepth(uniform unsigned int bitField) +{ + return (uniform unsigned int)(bitField & 0xf); +} + +inline uniform float +getParamFraction(uniform unsigned int bitField){ + if (nonQuadRoot(bitField)) { + return 1.0f / (1 << (getDepth(bitField)-1)); + } else { + return 1.0f / (1 << getDepth(bitField)); + } +} + +inline void +adjustBoundaryWeights(uniform unsigned int bitField, + float sWeights[4], + float tWeights[4]) { + + uniform int boundary = getBoundary(bitField); + + if (boundary & 1) { + tWeights[2] -= tWeights[0]; + tWeights[1] += 2*tWeights[0]; + tWeights[0] = 0; + } + if (boundary & 2) { + sWeights[1] -= sWeights[3]; + sWeights[2] += 2*sWeights[3]; + sWeights[3] = 0; + } + if (boundary & 4) { + tWeights[1] -= tWeights[3]; + tWeights[2] += 2*tWeights[3]; + tWeights[3] = 0; + } + if (boundary & 8) { + sWeights[2] -= sWeights[0]; + sWeights[1] += 2*sWeights[0]; + sWeights[0] = 0; + } +} + +inline void +getBSplineWeights(float t, float point[4], float deriv[4]) { + // The four uniform cubic B-Spline basis functions evaluated at t: + float const one6th = 1.0f / 6.0f; + + float t2 = t * t; + float t3 = t * t2; + + point[0] = one6th * (1.0f - 3.0f*(t - t2) - t3); + point[1] = one6th * (4.0f - 6.0f*t2 + 3.0f*t3); + point[2] = one6th * (1.0f + 3.0f*(t + t2 - t3)); + point[3] = one6th * ( t3); + + // Derivatives of the above four basis functions at t: + deriv[0] = -0.5f*t2 + t - 0.5f; + deriv[1] = 1.5f*t2 - 2.0f*t; + deriv[2] = -1.5f*t2 + t + 0.5f; + deriv[3] = 0.5f*t2; +} + +inline void +getBezierWeights(float t, float point[4], float deriv[4]) { + // The four uniform cubic Bezier basis functions (in terms of t and its + // complement tC) evaluated at t: + float t2 = t*t; + float tC = 1.0f - t; + float tC2 = tC * tC; + + point[0] = tC2 * tC; + point[1] = tC2 * t * 3.0f; + point[2] = t2 * tC * 3.0f; + point[3] = t2 * t; + + // Derivatives of the above four basis functions at t: + deriv[0] = -3.0f * tC2; + deriv[1] = 9.0f * t2 - 12.0f * t + 3.0f; + deriv[2] = -9.0f * t2 + 6.0f * t; + deriv[3] = 3.0f * t2; +} + +inline void +getBSplineWeightsNoDerivative(float t, float point[4]) { + // The four uniform cubic B-Spline basis functions evaluated at t: + float const one6th = 1.0f / 6.0f; + + float t2 = t * t; + float t3 = t * t2; + + point[0] = one6th * (1.0f - 3.0f*(t - t2) - t3); + point[1] = one6th * (4.0f - 6.0f*t2 + 3.0f*t3); + point[2] = one6th * (1.0f + 3.0f*(t + t2 - t3)); + point[3] = one6th * ( t3); +} + +inline void +getBezierWeightsNoDerivative(float t, float point[4]) { + // The four uniform cubic Bezier basis functions (in terms of t and its + // complement tC) evaluated at t: + float t2 = t*t; + float tC = 1.0f - t; + float tC2 = tC * tC; + + point[0] = tC2 * tC; + point[1] = tC2 * t * 3.0f; + point[2] = t2 * tC * 3.0f; + point[3] = t2 * t; +} + +export void +evalBilinear(uniform unsigned int bitField, + uniform int nPoint, + uniform const float * uniform u, + uniform const float * uniform v, + uniform const int * uniform vertexIndices, + uniform const BufferDescriptor &inDesc, + uniform const float * uniform inQ, + uniform const BufferDescriptor &outDesc, + uniform float *uniform outQ, + uniform const BufferDescriptor &duDesc, + uniform float *uniform outDQU, + uniform const BufferDescriptor &dvDesc, + uniform float *uniform outDQV) +{ + uniform int nChannel = inDesc.length / 3; + assert(nChannel < MAX_CHANNEL); + + uniform Point controlVertices[MAX_CHANNEL*4]; + for(uniform int i=0; i<4; i++) { + uniform unsigned int id = vertexIndices[i]; + uniform const float * uniform pVertex = inQ + inDesc.offset + id * inDesc.stride; + for(uniform int c=0; c + + + +#ifdef __cplusplus +namespace ispc { /* namespace */ +#endif // __cplusplus +#ifndef __ISPC_STRUCT_BufferDescriptor__ +#define __ISPC_STRUCT_BufferDescriptor__ +struct BufferDescriptor { + int32_t offset; + int32_t length; + int32_t stride; +}; +#endif + + +/////////////////////////////////////////////////////////////////////////// +// Functions exported from ispc code +/////////////////////////////////////////////////////////////////////////// +#if defined(__cplusplus) && !defined(__ISPC_NO_EXTERN_C) +extern "C" { +#endif // __cplusplus + extern void evalBSpline(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ, const struct BufferDescriptor &duDesc, float * outDQU, const struct BufferDescriptor &dvDesc, float * outDQV); + + extern void evalBilinear(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ, const struct BufferDescriptor &duDesc, float * outDQU, const struct BufferDescriptor &dvDesc, float * outDQV); + + extern void evalGregory(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ, const struct BufferDescriptor &duDesc, float * outDQU, const struct BufferDescriptor &dvDesc, float * outDQV); + + extern void evalBSplineNoDerivative(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ); + + extern void evalBilinearNoDerivative(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ); + + extern void evalGregoryNoDerivative(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ); + + extern void getSIMDWidth(int32_t &simdWidth); +#if defined(__cplusplus) && !defined(__ISPC_NO_EXTERN_C) +} /* end extern C */ +#endif // __cplusplus + + +#ifdef __cplusplus +} /* namespace */ +#endif // __cplusplus + +#endif // ISPC_ISPCEVALLIMITKERNEL_ISPH diff --git a/opensubdiv/osd/ispcEvaluator.cpp b/opensubdiv/osd/ispcEvaluator.cpp new file mode 100644 index 00000000..a9b98d9b --- /dev/null +++ b/opensubdiv/osd/ispcEvaluator.cpp @@ -0,0 +1,289 @@ +// +// Copyright 2015 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + +#include "ispcEvaluator.h" +#include "cpuKernel.h" +#include "../far/patchBasis.h" +#include "ispcEvalLimitKernel.isph" + +#include +#include + +namespace OpenSubdiv { +namespace OPENSUBDIV_VERSION { + +namespace Osd { + +#define grain_size 512 + +/* static */ +bool +IspcEvaluator::EvalStencils(const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + int start, int end) { + + if (end <= start) return true; + if (srcDesc.length != dstDesc.length) return false; + + // XXX: we can probably expand cpuKernel.cpp to here. + CpuEvalStencils(src, srcDesc, dst, dstDesc, + sizes, offsets, indices, weights, start, end); + + return true; +} + +/* static */ +bool +IspcEvaluator::EvalStencils(const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + int start, int end) { + if (end <= start) return true; + if (srcDesc.length != dstDesc.length) return false; + if (srcDesc.length != duDesc.length) return false; + if (srcDesc.length != dvDesc.length) return false; + + CpuEvalStencils(src, srcDesc, + dst, dstDesc, + du, duDesc, + dv, dvDesc, + sizes, offsets, indices, + weights, duWeights, dvWeights, + start, end); + + return true; +} + +template +struct BufferAdapter { + BufferAdapter(T *p, int length, int stride) : + _p(p), _length(length), _stride(stride) { } + void Clear() { + for (int i = 0; i < _length; ++i) _p[i] = 0; + } + void AddWithWeight(T const *src, float w) { + if (_p) { + for (int i = 0; i < _length; ++i) { + _p[i] += src[i] * w; + } + } + } + const T *operator[] (int index) const { + return _p + _stride * index; + } + BufferAdapter & operator ++() { + if (_p) { + _p += _stride; + } + return *this; + } + + T *_p; + int _length; + int _stride; +}; + +/* static */ +bool +IspcEvaluator::EvalPatches(const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrays, + const int *patchIndexBuffer, + const PatchParam *patchParamBuffer) { + if (srcDesc.length != dstDesc.length) return false; + + // Copy BufferDescriptor to ispc version + // Since memory alignment in ISPC may be different from C++, + // we use the assignment for each field instead of the assignment for + // the whole struct + ispc::BufferDescriptor ispcSrcDesc; + ispcSrcDesc.offset = srcDesc.offset; + ispcSrcDesc.length = srcDesc.length; + ispcSrcDesc.stride = srcDesc.stride; + + tbb::blocked_range range = tbb::blocked_range(0, numPatchCoords, grain_size); + tbb::parallel_for(range, [&](const tbb::blocked_range &r) + { + uint i = r.begin(); + + ispc::BufferDescriptor ispcDstDesc, ispcDuDesc, ispcDvDesc; + ispcDstDesc.offset = dstDesc.offset + dstDesc.offset + i * dstDesc.stride; + ispcDstDesc.length = dstDesc.length; + ispcDstDesc.stride = dstDesc.stride; + + while (i < r.end()) { + // the patch coordinates are sorted by patch handle + // the following code searches the coordinates that + // belongs to the same patch so that they can be evalauated + // with ISPC + int nCoord = 1; + Far::PatchTable::PatchHandle handle = patchCoords[i].handle; + while(i + nCoord < r.end() && + handle.isEqual(patchCoords[i + nCoord].handle) ) + nCoord ++; + + PatchArray const &array = patchArrays[handle.arrayIndex]; + int patchType = array.GetPatchType(); + Far::PatchParam const & param = patchParamBuffer[handle.patchIndex]; + + unsigned int bitField = param.field1; + + const int *cvs = &patchIndexBuffer[array.indexBase + handle.vertIndex]; + + __declspec( align(64) ) float u[nCoord]; + __declspec( align(64) ) float v[nCoord]; + + for(int n=0; n range = tbb::blocked_range(0, numPatchCoords, grain_size); + tbb::parallel_for(range, [&](const tbb::blocked_range &r) + { + uint i = r.begin(); + + ispc::BufferDescriptor ispcDstDesc, ispcDuDesc, ispcDvDesc; + ispcDstDesc.offset = dstDesc.offset + dstDesc.offset + i * dstDesc.stride; + ispcDstDesc.length = dstDesc.length; + ispcDstDesc.stride = dstDesc.stride; + + ispcDuDesc.offset = duDesc.offset + i * duDesc.stride; + ispcDuDesc.length = duDesc.length; + ispcDuDesc.stride = duDesc.stride; + + ispcDvDesc.offset = dvDesc.offset + i * dvDesc.stride; + ispcDvDesc.length = dvDesc.length; + ispcDvDesc.stride = dvDesc.stride; + while (i < r.end()) { + // the patch coordinates are sorted by patch handle + // the following code searches the coordinates that + // belongs to the same patch so that they can be evalauated + // with ISPC + int nCoord = 1; + Far::PatchTable::PatchHandle handle = patchCoords[i].handle; + while(i + nCoord < r.end() && + handle.isEqual(patchCoords[i + nCoord].handle) ) + nCoord ++; + + PatchArray const &array = patchArrays[handle.arrayIndex]; + int patchType = array.GetPatchType(); + Far::PatchParam const & param = patchParamBuffer[handle.patchIndex]; + + unsigned int bitField = param.field1; + + const int *cvs = &patchIndexBuffer[array.indexBase + handle.vertIndex]; + + __declspec( align(64) ) float u[nCoord]; + __declspec( align(64) ) float v[nCoord]; + + for(int n=0; n +#include +#include "../osd/bufferDescriptor.h" +#include "../osd/types.h" + +namespace OpenSubdiv { +namespace OPENSUBDIV_VERSION { + +namespace Osd { + +class IspcEvaluator { +public: + /// ---------------------------------------------------------------------- + /// + /// Stencil evaluations with StencilTable + /// + /// ---------------------------------------------------------------------- + + /// \brief Generic static eval stencils function. This function has a same + /// signature as other device kernels have so that it can be called + /// in the same way from OsdMesh template interface. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCpuBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param stencilTable Far::StencilTable or equivalent + /// + /// @param instance not used in the cpu kernel + /// (declared as a typed pointer to prevent + /// undesirable template resolution) + /// + /// @param deviceContext not used in the cpu kernel + /// + template + static bool EvalStencils( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + STENCIL_TABLE const *stencilTable, + const IspcEvaluator *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + if (stencilTable->GetNumStencils() == 0) + return false; + + return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + &stencilTable->GetSizes()[0], + &stencilTable->GetOffsets()[0], + &stencilTable->GetControlIndices()[0], + &stencilTable->GetWeights()[0], + /*start = */ 0, + /*end = */ stencilTable->GetNumStencils()); + } + + /// \brief Static eval stencils function which takes raw CPU pointers for + /// input and output. + /// + /// @param src Input primvar pointer. An offset of srcDesc + /// will be applied internally (i.e. the pointer + /// should not include the offset) + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dst Output primvar pointer. An offset of dstDesc + /// will be applied internally. + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param sizes pointer to the sizes buffer of the stencil table + /// to apply for the range [start, end) + /// + /// @param offsets pointer to the offsets buffer of the stencil table + /// + /// @param indices pointer to the indices buffer of the stencil table + /// + /// @param weights pointer to the weights buffer of the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// + static bool EvalStencils( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + int start, int end); + + /// \brief Generic static eval stencils function with derivatives. + /// This function has a same signature as other device kernels + /// have so that it can be called in the same way from OsdMesh + /// template interface. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCpuBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output U-derivative buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the output buffer + /// + /// @param dvBuffer Output V-derivative buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the output buffer + /// + /// @param stencilTable Far::StencilTable or equivalent + /// + /// @param instance not used in the cpu kernel + /// (declared as a typed pointer to prevent + /// undesirable template resolution) + /// + /// @param deviceContext not used in the cpu kernel + /// + template + static bool EvalStencils( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + STENCIL_TABLE const *stencilTable, + const IspcEvaluator *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + &stencilTable->GetSizes()[0], + &stencilTable->GetOffsets()[0], + &stencilTable->GetControlIndices()[0], + &stencilTable->GetWeights()[0], + &stencilTable->GetDuWeights()[0], + &stencilTable->GetDvWeights()[0], + /*start = */ 0, + /*end = */ stencilTable->GetNumStencils()); + } + + /// \brief Static eval stencils function with derivatives, which takes + /// raw CPU pointers for input and output. + /// + /// @param src Input primvar pointer. An offset of srcDesc + /// will be applied internally (i.e. the pointer + /// should not include the offset) + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dst Output primvar pointer. An offset of dstDesc + /// will be applied internally. + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param du Output U-derivatives pointer. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the output buffer + /// + /// @param dv Output V-derivatives pointer. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the output buffer + /// + /// @param sizes pointer to the sizes buffer of the stencil table + /// + /// @param offsets pointer to the offsets buffer of the stencil table + /// + /// @param indices pointer to the indices buffer of the stencil table + /// + /// @param weights pointer to the weights buffer of the stencil table + /// + /// @param duWeights pointer to the du-weights buffer of the stencil table + /// + /// @param dvWeights pointer to the dv-weights buffer of the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// + static bool EvalStencils( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + int start, int end); + + /// ---------------------------------------------------------------------- + /// + /// Limit evaluations with PatchTable + /// + /// ---------------------------------------------------------------------- + + /// \brief Generic limit eval function. This function has a same + /// signature as other device kernels have so that it can be called + /// in the same way. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCpuBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchTable CpuPatchTable or equivalent + /// XXX: currently Far::PatchTable can't be used + /// due to interface mismatch + /// + /// @param instance not used in the cpu evaluator + /// + /// @param deviceContext not used in the cpu evaluator + /// + template + static bool EvalPatches( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + IspcEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetPatchArrayBuffer(), + patchTable->GetPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + + /// \brief Generic limit eval function with derivatives. This function has + /// a same signature as other device kernels have so that it can be + /// called in the same way. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCpuBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output U-derivatives buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output V-derivatives buffer + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchTable CpuPatchTable or equivalent + /// XXX: currently Far::PatchTable can't be used + /// due to interface mismatch + /// + /// @param instance not used in the cpu evaluator + /// + /// @param deviceContext not used in the cpu evaluator + /// + template + static bool EvalPatches( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + IspcEvaluator const *instance = NULL, + void * deviceContext = NULL) { + (void)instance; // unused + (void)deviceContext; // unused + + // XXX: PatchCoords is somewhat abusing vertex primvar buffer interop. + // ideally all buffer classes should have templated by datatype + // so that downcast isn't needed there. + // (e.g. Osd::CpuBuffer ) + // + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetPatchArrayBuffer(), + patchTable->GetPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + + /// \brief Static limit eval function. It takes an array of PatchCoord + /// and evaluate limit values on given PatchTable. + /// + /// @param src Input primvar pointer. An offset of srcDesc + /// will be applied internally (i.e. the pointer + /// should not include the offset) + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dst Output primvar pointer. An offset of dstDesc + /// will be applied internally. + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchArrays an array of Osd::PatchArray struct + /// indexed by PatchCoord::arrayIndex + /// + /// @param patchIndexBuffer an array of patch indices + /// indexed by PatchCoord::vertIndex + /// + /// @param patchParamBuffer an array of Osd::PatchParam struct + /// indexed by PatchCoord::patchIndex + /// + static bool EvalPatches( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrays, + const int *patchIndexBuffer, + const PatchParam *patchParamBuffer); + + /// \brief Static limit eval function. It takes an array of PatchCoord + /// and evaluate limit values on given PatchTable. + /// + /// @param src Input primvar pointer. An offset of srcDesc + /// will be applied internally (i.e. the pointer + /// should not include the offset) + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dst Output primvar pointer. An offset of dstDesc + /// will be applied internally. + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param du Output U-derivatives pointer. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the du buffer + /// + /// @param dv Output V-derivatives pointer. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dv buffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchArrays an array of Osd::PatchArray struct + /// indexed by PatchCoord::arrayIndex + /// + /// @param patchIndexBuffer an array of patch indices + /// indexed by PatchCoord::vertIndex + /// + /// @param patchParamBuffer an array of Osd::PatchParam struct + /// indexed by PatchCoord::patchIndex + /// + static bool EvalPatches( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + int numPatchCoords, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, + const int *patchIndexBuffer, + PatchParam const *patchParamBuffer); + + /// ---------------------------------------------------------------------- + /// + /// Other methods + /// + /// ---------------------------------------------------------------------- + + /// \brief synchronize all asynchronous computation invoked on this device. + static void Synchronize(void * /*deviceContext = NULL*/) { + // nothing. + } +}; + + +} // end namespace Osd + +} // end namespace OPENSUBDIV_VERSION +using namespace OPENSUBDIV_VERSION; + +} // end namespace OpenSubdiv + + +#endif // OPENSUBDIV3_OSD_CPU_EVALUATOR_H From 8a8771c97d1cbeeaaf67e2bb8602d857ea28567b Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Mon, 20 Jul 2015 17:13:51 -0700 Subject: [PATCH 17/59] Revert "Add ISPC limit surface evaluation" --- CMakeLists.txt | 11 - cmake/FindISPC.cmake | 94 --- examples/glEvalLimit/glEvalLimit.cpp | 36 +- examples/glEvalLimit/particles.cpp | 52 +- examples/glEvalLimit/particles.h | 11 +- opensubdiv/CMakeLists.txt | 26 +- opensubdiv/far/patchParam.h | 23 - opensubdiv/far/patchTable.h | 6 - opensubdiv/osd/CMakeLists.txt | 18 +- opensubdiv/osd/ispcEvalLimitKernel.ispc | 880 ------------------------ opensubdiv/osd/ispcEvalLimitKernel.isph | 55 -- opensubdiv/osd/ispcEvaluator.cpp | 289 -------- opensubdiv/osd/ispcEvaluator.h | 482 ------------- 13 files changed, 30 insertions(+), 1953 deletions(-) delete mode 100644 cmake/FindISPC.cmake delete mode 100644 opensubdiv/osd/ispcEvalLimitKernel.ispc delete mode 100644 opensubdiv/osd/ispcEvalLimitKernel.isph delete mode 100644 opensubdiv/osd/ispcEvaluator.cpp delete mode 100644 opensubdiv/osd/ispcEvaluator.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ab9fcb5f..a4ebb179 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,8 +197,6 @@ if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_IC endif() endforeach() - - list(APPEND OSD_COMPILER_FLAGS -std=c++11) endif() elseif(MSVC) @@ -323,9 +321,6 @@ endif() if(NOT NO_TBB) find_package(TBB 4.0) endif() -if(NOT NO_ISPC) - find_package(ISPC 1.6) -endif() if (NOT NO_OPENGL) find_package(OpenGL) endif() @@ -544,12 +539,6 @@ if (NOT NO_MAYA) endif() endif() -if(ISPC_FOUND) - add_definitions( - -DOPENSUBDIV_HAS_ISPC - ) -endif() - # Link examples & regressions dynamically against Osd set( OSD_LINK_TARGET osd_dynamic_cpu osd_dynamic_gpu ) diff --git a/cmake/FindISPC.cmake b/cmake/FindISPC.cmake deleted file mode 100644 index c57f2189..00000000 --- a/cmake/FindISPC.cmake +++ /dev/null @@ -1,94 +0,0 @@ -# -# Copyright 2013 Pixar -# -# Licensed under the Apache License, Version 2.0 (the "Apache License") -# with the following modification; you may not use this file except in -# compliance with the Apache License and the following modification to it: -# Section 6. Trademarks. is deleted and replaced with: -# -# 6. Trademarks. This License does not grant permission to use the trade -# names, trademarks, service marks, or product names of the Licensor -# and its affiliates, except as required to comply with Section 4(c) of -# the License and to reproduce the content of the NOTICE file. -# -# You may obtain a copy of the Apache License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the Apache License with the above modification is -# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the Apache License for the specific -# language governing permissions and limitations under the Apache License. -# - -# - Try to find Intel's ISPC -# Once done this will define -# -# ISPC_FOUND - System has ISPC -# ISPC_DIR - The ISPC directory - -# Obtain ISPC directory -if (WIN32) - #NOT IMPLEMENTED -elseif (APPLE) - #NOT IMPLEMENTED -else () - find_path(ISPC_DIR - NAMES - ispc - PATHS - ${ISPC_LOCATION} - NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH - DOC "The directory where ISPC reside") -endif () - -if (ISPC_DIR) - execute_process(COMMAND ${ISPC_DIR}/ispc --version OUTPUT_VARIABLE ISPC_VERSION) - string(REGEX MATCH "[0-9].[0-9].[0-9]" ISPC_VERSION ${ISPC_VERSION}) -endif () - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(ISPC - REQUIRED_VARS - ISPC_DIR - VERSION_VAR - ISPC_VERSION -) - -mark_as_advanced( ISPC_DIR ) - -MACRO (ispc_compile) - - SET(ISPC_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/osd_ispc_obj.dir) - - SET(ISPC_OBJECTS "") - - FOREACH(src ${ARGN}) - - GET_FILENAME_COMPONENT(fname ${src} NAME_WE) - - SET(results "${ISPC_TARGET_DIR}/${fname}.dev.o") - - ADD_CUSTOM_COMMAND( - OUTPUT ${results} ${ISPC_TARGET_DIR}/${fname}_ispc.h - COMMAND ${ISPC_DIR}/ispc - --pic - -O1 - --wno-perf - --woff - -h ${ISPC_TARGET_DIR}/${fname}_ispc.h - -MMM ${ISPC_TARGET_DIR}/${fname}.dev.idep - -o ${ISPC_TARGET_DIR}/${fname}.dev.o - ${CMAKE_CURRENT_SOURCE_DIR}/${src} - \; - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src} - ) - - SET(ISPC_OBJECTS ${ISPC_OBJECTS} ${results}) - - ENDFOREACH() - -ENDMACRO() - diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 82dfdb50..98ff3d1b 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -34,10 +34,6 @@ GLFWmonitor* g_primary=0; #include #include -#ifdef OPENSUBDIV_HAS_ISPC - #include -#endif - #ifdef OPENSUBDIV_HAS_TBB #include #endif @@ -108,8 +104,7 @@ enum KernelType { kCPU = 0, kCUDA = 3, kCL = 4, kGLXFB = 5, - kGLCompute = 6, - kISPC = 7 }; + kGLCompute = 6 }; enum EndCap { kEndCapBSplineBasis, kEndCapGregoryBasis }; @@ -174,10 +169,10 @@ float g_currentTime = 0; Stopwatch g_fpsTimer; //------------------------------------------------------------------------------ -int g_nParticles = 655360; +int g_nParticles = 65536; bool g_randomStart = true;//false; -bool g_animParticles = false; +bool g_animParticles = true; GLuint g_samplesVAO=0; @@ -444,9 +439,7 @@ updateGeom() { assert(g_particles); float elapsed = g_currentTime - g_prevTime; - if(elapsed != 0.0f) { - g_particles->Update(elapsed); - } + g_particles->Update(elapsed); g_prevTime = g_currentTime; std::vector const &patchCoords @@ -471,7 +464,7 @@ updateGeom() { } s.Stop(); - + g_evalTime = float(s.GetElapsed()); } @@ -655,20 +648,8 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { (vertexStencils, varyingStencils, nCoarseVertices, nverts, g_nParticles, g_patchTable, &glComputeEvaluatorCache); - - } #endif -#if defined(OPENSUBDIV_HAS_ISPC) && defined(OPENSUBDIV_HAS_TBB) - else if(g_kernel == kISPC) { - g_evalOutput = new EvalOutput - (vertexStencils, varyingStencils, - nCoarseVertices, nverts, g_nParticles, g_patchTable); - } -#endif + } // Create the 'uv particles' manager - this class manages the limit // location samples (ptex face index, (s,t) and updates them between frames. @@ -894,7 +875,7 @@ display() { } if (g_endCap != kEndCapBSplineBasis && - (g_kernel != kCPU && g_kernel != kOPENMP && g_kernel != kTBB && g_kernel != kISPC)) { + (g_kernel != kCPU && g_kernel != kOPENMP && g_kernel != kTBB)) { static char msg[] = "ERROR: This kernel only supports BSpline basis patches."; g_hud.DrawString(g_width/4, g_height/4+20, 1, 0, 0, msg); @@ -1148,9 +1129,6 @@ initHUD() { #ifdef OPENSUBDIV_HAS_TBB g_hud.AddPullDownButton(compute_pulldown, "TBB", kTBB); #endif -#if defined(OPENSUBDIV_HAS_ISPC) && defined(OPENSUBDIV_HAS_TBB) - g_hud.AddPullDownButton(compute_pulldown, "ISPC", kISPC); -#endif #ifdef OPENSUBDIV_HAS_CUDA g_hud.AddPullDownButton(compute_pulldown, "CUDA", kCUDA); #endif diff --git a/examples/glEvalLimit/particles.cpp b/examples/glEvalLimit/particles.cpp index add4049b..a07b9572 100644 --- a/examples/glEvalLimit/particles.cpp +++ b/examples/glEvalLimit/particles.cpp @@ -32,17 +32,17 @@ #ifdef OPENSUBDIV_HAS_TBB #include #include - +tbb::atomic g_tbbCounter; class TbbUpdateKernel { public: TbbUpdateKernel(float speed, STParticles::Position *positions, float *velocities, std::vector const &adjacency, - PatchHandleMap *patchHandleMap, + OpenSubdiv::Osd::PatchCoord *patchCoords, OpenSubdiv::Far::PatchMap const *patchMap) : _speed(speed), _positions(positions), _velocities(velocities), - _adjacency(adjacency), _patchHandleMap(patchHandleMap), _patchMap(patchMap) { + _adjacency(adjacency), _patchCoords(patchCoords), _patchMap(patchMap) { } void operator () (tbb::blocked_range const &r) const { @@ -76,13 +76,9 @@ public: OpenSubdiv::Far::PatchTable::PatchHandle const *handle = _patchMap->FindPatch(p->ptexIndex, p->s, p->t); if (handle) { - PatchHandleMap::accessor a; - if( !_patchHandleMap->find(a, handle)) { - _patchHandleMap->insert(a, handle); - } - std::vector &st = a->second; - st.push_back(p->s); - st.push_back(p->t); + int index = g_tbbCounter.fetch_and_add(1); + _patchCoords[index] = + OpenSubdiv::Osd::PatchCoord(*handle, p->s, p->t); } } } @@ -91,7 +87,7 @@ private: STParticles::Position *_positions; float *_velocities; std::vector const &_adjacency; - PatchHandleMap *_patchHandleMap; + OpenSubdiv::Osd::PatchCoord *_patchCoords; OpenSubdiv::Far::PatchMap const *_patchMap; }; #endif @@ -280,36 +276,18 @@ STParticles::Update(float deltaTime) { if (deltaTime == 0) return; float speed = GetSpeed() * std::max(0.001f, std::min(deltaTime, 0.5f)); + _patchCoords.clear(); + // XXX: this process should be parallelized. #ifdef OPENSUBDIV_HAS_TBB - _patchHandleMap.clear(); - + + _patchCoords.resize((int)GetNumParticles()); TbbUpdateKernel kernel(speed, &_positions[0], &_velocities[0], - _adjacency, &_patchHandleMap, _patchMap);; + _adjacency, &_patchCoords[0], _patchMap);; + g_tbbCounter = 0; tbb::blocked_range range(0, GetNumParticles(), 256); tbb::parallel_for(range, kernel); - - - int nCoord = 0; - for(PatchHandleMap::iterator i = _patchHandleMap.begin(); - i != _patchHandleMap.end(); - i ++) { - nCoord += (i->second.size() / 2); - } - - _patchCoords.resize(nCoord); - - int index = 0; - for(PatchHandleMap::iterator i = _patchHandleMap.begin(); - i != _patchHandleMap.end(); - i ++) { - for(int j = 0; j < i->second.size(); j += 2) { - _patchCoords[index].handle = *(i->first); - _patchCoords[index].s = i->second[j]; - _patchCoords[index].t = i->second[j+1]; - index ++; - } - } + _patchCoords.resize(g_tbbCounter); #else Position * p = &_positions[0]; float * dp = &_velocities[0]; @@ -345,7 +323,7 @@ STParticles::Update(float deltaTime) { OpenSubdiv::Osd::PatchCoord(*handle, p->s, p->t)); } } -#endif +#endif } // Dump adjacency info diff --git a/examples/glEvalLimit/particles.h b/examples/glEvalLimit/particles.h index ff4fa940..887add25 100644 --- a/examples/glEvalLimit/particles.h +++ b/examples/glEvalLimit/particles.h @@ -30,11 +30,6 @@ #include #include -#ifdef OPENSUBDIV_HAS_TBB -#include -typedef tbb::concurrent_hash_map< OpenSubdiv::Far::PatchTable::PatchHandle const*, std::vector > PatchHandleMap; -#endif - // // In order to emphasize the dynamic nature of the EvalLimit API, where the // locations can be arbitrarily updated before each evaluation, the glEvalLimit @@ -147,7 +142,7 @@ public: return _velocities; } - std::vector const &GetPatchCoords() const { + std::vector GetPatchCoords() const { return _patchCoords; } @@ -164,10 +159,6 @@ private: std::vector _positions; std::vector _velocities; - -#ifdef OPENSUBDIV_HAS_TBB - PatchHandleMap _patchHandleMap; -#endif std::vector _patchCoords; diff --git a/opensubdiv/CMakeLists.txt b/opensubdiv/CMakeLists.txt index 06d2f31a..4b3cec84 100644 --- a/opensubdiv/CMakeLists.txt +++ b/opensubdiv/CMakeLists.txt @@ -147,16 +147,9 @@ if (NOT NO_LIB) ) set_target_properties(osd_static_cpu PROPERTIES OUTPUT_NAME osdCPU CLEAN_DIRECT_OUTPUT 1) - if( ISPC_FOUND) - target_link_libraries(osd_static_cpu - osd_ispc_obj - ${PLATFORM_CPU_LIBRARIES} - ) - else() - target_link_libraries(osd_static_cpu - ${PLATFORM_CPU_LIBRARIES} - ) - endif() + target_link_libraries(osd_static_cpu + ${PLATFORM_CPU_LIBRARIES} + ) install( TARGETS osd_static_cpu DESTINATION "${CMAKE_LIBDIR_BASE}" ) @@ -207,16 +200,9 @@ if (NOT NO_LIB) ) endif() - if ( ISPC_FOUND) - target_link_libraries(osd_dynamic_cpu - osd_ispc_obj - ${PLATFORM_CPU_LIBRARIES} - ) - else() - target_link_libraries(osd_dynamic_cpu - ${PLATFORM_CPU_LIBRARIES} - ) - endif() + target_link_libraries(osd_dynamic_cpu + ${PLATFORM_CPU_LIBRARIES} + ) install( TARGETS osd_dynamic_cpu LIBRARY DESTINATION "${CMAKE_LIBDIR_BASE}" ) diff --git a/opensubdiv/far/patchParam.h b/opensubdiv/far/patchParam.h index 6c65258f..c5f0243f 100644 --- a/opensubdiv/far/patchParam.h +++ b/opensubdiv/far/patchParam.h @@ -116,15 +116,6 @@ struct PatchParam { /// void Normalize( float & u, float & v ) const; - /// This function is the reverse operation of function Normalize() - /// The (u,v) pair is converted from patch sub-parametric space to control - /// face parametric space. - /// - /// @param u u parameter - /// @param v v parameter - /// - void Denormalize( float & u, float & v) const; - unsigned int field0:32; unsigned int field1:32; }; @@ -170,20 +161,6 @@ PatchParam::Normalize( float & u, float & v ) const { v = (v - pv) / frac; } -inline void -PatchParam::Denormalize( float & u, float & v ) const { - - float frac = GetParamFraction(); - - // top left corner - float pu = (float)GetU()*frac; - float pv = (float)GetV()*frac; - - // normalize u,v coordinates - u = u * frac + pu; - v = v * frac + pv; -} - } // end namespace Far } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/far/patchTable.h b/opensubdiv/far/patchTable.h index 351a901f..39aa5302 100644 --- a/opensubdiv/far/patchTable.h +++ b/opensubdiv/far/patchTable.h @@ -68,12 +68,6 @@ public: Index arrayIndex, // Array index of the patch patchIndex, // Absolute Index of the patch vertIndex; // Relative offset to the first CV of the patch in array - - bool isEqual(const PatchHandle &other) { - return other.arrayIndex == arrayIndex && - other.patchIndex == patchIndex && - other.vertIndex == vertIndex; - } }; public: diff --git a/opensubdiv/osd/CMakeLists.txt b/opensubdiv/osd/CMakeLists.txt index 43268451..f457dddd 100755 --- a/opensubdiv/osd/CMakeLists.txt +++ b/opensubdiv/osd/CMakeLists.txt @@ -26,7 +26,6 @@ #------------------------------------------------------------------------------- # source & headers - set(CPU_SOURCE_FILES cpuEvaluator.cpp cpuKernel.cpp @@ -34,12 +33,8 @@ set(CPU_SOURCE_FILES cpuVertexBuffer.cpp ) -if( ISPC_FOUND) - list(APPEND CPU_SOURCE_FILES ispcEvaluator.cpp) -endif() - set(GPU_SOURCE_FILES ) -set(ISPC_SOURCE_FILES ) + set(INC_FILES ) set(PRIVATE_HEADER_FILES @@ -301,17 +296,6 @@ if( CUDA_FOUND ) endif() endif() -if( ISPC_FOUND) - list(APPEND ISPC_SOURCE_FILES - ispcEvalLimitKernel.ispc - ) - - # Compile ISPC code to objs - ispc_compile(${ISPC_SOURCE_FILES}) - ADD_LIBRARY(osd_ispc_obj STATIC ${ISPC_OBJECTS}) - SET_TARGET_PROPERTIES(osd_ispc_obj PROPERTIES LINKER_LANGUAGE C) -endif() - list(APPEND DOXY_HEADER_FILES ${CUDA_PUBLIC_HEADERS}) #------------------------------------------------------------------------------- diff --git a/opensubdiv/osd/ispcEvalLimitKernel.ispc b/opensubdiv/osd/ispcEvalLimitKernel.ispc deleted file mode 100644 index 3af62889..00000000 --- a/opensubdiv/osd/ispcEvalLimitKernel.ispc +++ /dev/null @@ -1,880 +0,0 @@ -// -// Copyright 2013 Pixar -// -// Licensed under the Apache License, Version 2.0 (the "Apache License") -// with the following modification; you may not use this file except in -// compliance with the Apache License and the following modification to it: -// Section 6. Trademarks. is deleted and replaced with: -// -// 6. Trademarks. This License does not grant permission to use the trade -// names, trademarks, service marks, or product names of the Licensor -// and its affiliates, except as required to comply with Section 4(c) of -// the License and to reproduce the content of the NOTICE file. -// -// You may obtain a copy of the Apache License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the Apache License with the above modification is -// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the Apache License for the specific -// language governing permissions and limitations under the Apache License. -// - - -#define MAX_CHANNEL 4 - -struct BufferDescriptor { - int offset; // offset to desired element data - int length; // number or length of the data - int stride; // stride to the next element -}; - -struct Point { - float x; - float y; - float z; -}; - -inline struct Point operator+(struct Point a, struct Point b) { - struct Point result; - result.x = a.x + b.x; - result.y = a.y + b.y; - result.z = a.z + b.z; - - return result; -} - -inline uniform struct Point operator+(uniform struct Point a, uniform struct Point b) { - uniform struct Point result; - result.x = a.x + b.x; - result.y = a.y + b.y; - result.z = a.z + b.z; - - return result; -} - -inline struct Point operator-(struct Point a, struct Point b) { - struct Point result; - result.x = a.x - b.x; - result.y = a.y - b.y; - result.z = a.z - b.z; - - return result; -} - -inline uniform struct Point operator-(uniform struct Point a, uniform struct Point b) { - uniform struct Point result; - result.x = a.x - b.x; - result.y = a.y - b.y; - result.z = a.z - b.z; - - return result; -} - -inline struct Point operator*(struct Point a, float b) { - struct Point result; - result.x = a.x * b; - result.y = a.y * b; - result.z = a.z * b; - - return result; -} - -inline uniform struct Point operator*(uniform struct Point a, uniform float b) { - uniform struct Point result; - result.x = a.x * b; - result.y = a.y * b; - result.z = a.z * b; - - return result; -} - -inline struct Point operator*(float b, struct Point a) { - struct Point result; - result.x = b * a.x; - result.y = b * a.y; - result.z = b * a.z; - - return result; -} - -inline uniform struct Point operator*(uniform float b, uniform struct Point a) { - uniform struct Point result; - result.x = b * a.x; - result.y = b * a.y; - result.z = b * a.z; - - return result; -} - -inline struct Point operator/(struct Point a, float b) { - struct Point result; - result.x = a.x / b; - result.y = a.y / b; - result.z = a.z / b; - - return result; -} - -inline uniform struct Point operator/(uniform struct Point a, uniform float b) { - uniform struct Point result; - result.x = a.x / b; - result.y = a.y / b; - result.z = a.z / b; - - return result; -} - -inline void cross(struct Point &a, struct Point &b, struct Point &c) -{ - c.x = a.y*b.z - a.z*b.y; - c.y = a.z*b.x - a.x*b.z; - c.z = a.x*b.y - a.y*b.x; -} - -inline uniform bool -nonQuadRoot(uniform unsigned int bitField) -{ - return (bitField >> 3) & 0x1; -} - -inline uniform unsigned int getU(uniform unsigned int bitField) -{ - return (uniform unsigned int)((bitField >> 22) & 0x3ff); -} - -inline uniform unsigned int getV(uniform unsigned int bitField) -{ - return (uniform unsigned int)((bitField >> 12) & 0x3ff); -} - -inline uniform unsigned int getBoundary(uniform unsigned int bitField) -{ - return (uniform unsigned int)((bitField >> 8) & 0xf); -} - -inline uniform unsigned int getDepth(uniform unsigned int bitField) -{ - return (uniform unsigned int)(bitField & 0xf); -} - -inline uniform float -getParamFraction(uniform unsigned int bitField){ - if (nonQuadRoot(bitField)) { - return 1.0f / (1 << (getDepth(bitField)-1)); - } else { - return 1.0f / (1 << getDepth(bitField)); - } -} - -inline void -adjustBoundaryWeights(uniform unsigned int bitField, - float sWeights[4], - float tWeights[4]) { - - uniform int boundary = getBoundary(bitField); - - if (boundary & 1) { - tWeights[2] -= tWeights[0]; - tWeights[1] += 2*tWeights[0]; - tWeights[0] = 0; - } - if (boundary & 2) { - sWeights[1] -= sWeights[3]; - sWeights[2] += 2*sWeights[3]; - sWeights[3] = 0; - } - if (boundary & 4) { - tWeights[1] -= tWeights[3]; - tWeights[2] += 2*tWeights[3]; - tWeights[3] = 0; - } - if (boundary & 8) { - sWeights[2] -= sWeights[0]; - sWeights[1] += 2*sWeights[0]; - sWeights[0] = 0; - } -} - -inline void -getBSplineWeights(float t, float point[4], float deriv[4]) { - // The four uniform cubic B-Spline basis functions evaluated at t: - float const one6th = 1.0f / 6.0f; - - float t2 = t * t; - float t3 = t * t2; - - point[0] = one6th * (1.0f - 3.0f*(t - t2) - t3); - point[1] = one6th * (4.0f - 6.0f*t2 + 3.0f*t3); - point[2] = one6th * (1.0f + 3.0f*(t + t2 - t3)); - point[3] = one6th * ( t3); - - // Derivatives of the above four basis functions at t: - deriv[0] = -0.5f*t2 + t - 0.5f; - deriv[1] = 1.5f*t2 - 2.0f*t; - deriv[2] = -1.5f*t2 + t + 0.5f; - deriv[3] = 0.5f*t2; -} - -inline void -getBezierWeights(float t, float point[4], float deriv[4]) { - // The four uniform cubic Bezier basis functions (in terms of t and its - // complement tC) evaluated at t: - float t2 = t*t; - float tC = 1.0f - t; - float tC2 = tC * tC; - - point[0] = tC2 * tC; - point[1] = tC2 * t * 3.0f; - point[2] = t2 * tC * 3.0f; - point[3] = t2 * t; - - // Derivatives of the above four basis functions at t: - deriv[0] = -3.0f * tC2; - deriv[1] = 9.0f * t2 - 12.0f * t + 3.0f; - deriv[2] = -9.0f * t2 + 6.0f * t; - deriv[3] = 3.0f * t2; -} - -inline void -getBSplineWeightsNoDerivative(float t, float point[4]) { - // The four uniform cubic B-Spline basis functions evaluated at t: - float const one6th = 1.0f / 6.0f; - - float t2 = t * t; - float t3 = t * t2; - - point[0] = one6th * (1.0f - 3.0f*(t - t2) - t3); - point[1] = one6th * (4.0f - 6.0f*t2 + 3.0f*t3); - point[2] = one6th * (1.0f + 3.0f*(t + t2 - t3)); - point[3] = one6th * ( t3); -} - -inline void -getBezierWeightsNoDerivative(float t, float point[4]) { - // The four uniform cubic Bezier basis functions (in terms of t and its - // complement tC) evaluated at t: - float t2 = t*t; - float tC = 1.0f - t; - float tC2 = tC * tC; - - point[0] = tC2 * tC; - point[1] = tC2 * t * 3.0f; - point[2] = t2 * tC * 3.0f; - point[3] = t2 * t; -} - -export void -evalBilinear(uniform unsigned int bitField, - uniform int nPoint, - uniform const float * uniform u, - uniform const float * uniform v, - uniform const int * uniform vertexIndices, - uniform const BufferDescriptor &inDesc, - uniform const float * uniform inQ, - uniform const BufferDescriptor &outDesc, - uniform float *uniform outQ, - uniform const BufferDescriptor &duDesc, - uniform float *uniform outDQU, - uniform const BufferDescriptor &dvDesc, - uniform float *uniform outDQV) -{ - uniform int nChannel = inDesc.length / 3; - assert(nChannel < MAX_CHANNEL); - - uniform Point controlVertices[MAX_CHANNEL*4]; - for(uniform int i=0; i<4; i++) { - uniform unsigned int id = vertexIndices[i]; - uniform const float * uniform pVertex = inQ + inDesc.offset + id * inDesc.stride; - for(uniform int c=0; c - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus -#ifndef __ISPC_STRUCT_BufferDescriptor__ -#define __ISPC_STRUCT_BufferDescriptor__ -struct BufferDescriptor { - int32_t offset; - int32_t length; - int32_t stride; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && !defined(__ISPC_NO_EXTERN_C) -extern "C" { -#endif // __cplusplus - extern void evalBSpline(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ, const struct BufferDescriptor &duDesc, float * outDQU, const struct BufferDescriptor &dvDesc, float * outDQV); - - extern void evalBilinear(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ, const struct BufferDescriptor &duDesc, float * outDQU, const struct BufferDescriptor &dvDesc, float * outDQV); - - extern void evalGregory(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ, const struct BufferDescriptor &duDesc, float * outDQU, const struct BufferDescriptor &dvDesc, float * outDQV); - - extern void evalBSplineNoDerivative(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ); - - extern void evalBilinearNoDerivative(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ); - - extern void evalGregoryNoDerivative(int32_t bitField, int32_t nPoint, const float * u, const float * v, const int32_t * vertexIndices, const struct BufferDescriptor &inDesc, const float * inQ, const struct BufferDescriptor &outDesc, float * outQ); - - extern void getSIMDWidth(int32_t &simdWidth); -#if defined(__cplusplus) && !defined(__ISPC_NO_EXTERN_C) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus - -#endif // ISPC_ISPCEVALLIMITKERNEL_ISPH diff --git a/opensubdiv/osd/ispcEvaluator.cpp b/opensubdiv/osd/ispcEvaluator.cpp deleted file mode 100644 index a9b98d9b..00000000 --- a/opensubdiv/osd/ispcEvaluator.cpp +++ /dev/null @@ -1,289 +0,0 @@ -// -// Copyright 2015 Pixar -// -// Licensed under the Apache License, Version 2.0 (the "Apache License") -// with the following modification; you may not use this file except in -// compliance with the Apache License and the following modification to it: -// Section 6. Trademarks. is deleted and replaced with: -// -// 6. Trademarks. This License does not grant permission to use the trade -// names, trademarks, service marks, or product names of the Licensor -// and its affiliates, except as required to comply with Section 4(c) of -// the License and to reproduce the content of the NOTICE file. -// -// You may obtain a copy of the Apache License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the Apache License with the above modification is -// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the Apache License for the specific -// language governing permissions and limitations under the Apache License. -// - -#include "ispcEvaluator.h" -#include "cpuKernel.h" -#include "../far/patchBasis.h" -#include "ispcEvalLimitKernel.isph" - -#include -#include - -namespace OpenSubdiv { -namespace OPENSUBDIV_VERSION { - -namespace Osd { - -#define grain_size 512 - -/* static */ -bool -IspcEvaluator::EvalStencils(const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - const int * sizes, - const int * offsets, - const int * indices, - const float * weights, - int start, int end) { - - if (end <= start) return true; - if (srcDesc.length != dstDesc.length) return false; - - // XXX: we can probably expand cpuKernel.cpp to here. - CpuEvalStencils(src, srcDesc, dst, dstDesc, - sizes, offsets, indices, weights, start, end); - - return true; -} - -/* static */ -bool -IspcEvaluator::EvalStencils(const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - float *du, BufferDescriptor const &duDesc, - float *dv, BufferDescriptor const &dvDesc, - const int * sizes, - const int * offsets, - const int * indices, - const float * weights, - const float * duWeights, - const float * dvWeights, - int start, int end) { - if (end <= start) return true; - if (srcDesc.length != dstDesc.length) return false; - if (srcDesc.length != duDesc.length) return false; - if (srcDesc.length != dvDesc.length) return false; - - CpuEvalStencils(src, srcDesc, - dst, dstDesc, - du, duDesc, - dv, dvDesc, - sizes, offsets, indices, - weights, duWeights, dvWeights, - start, end); - - return true; -} - -template -struct BufferAdapter { - BufferAdapter(T *p, int length, int stride) : - _p(p), _length(length), _stride(stride) { } - void Clear() { - for (int i = 0; i < _length; ++i) _p[i] = 0; - } - void AddWithWeight(T const *src, float w) { - if (_p) { - for (int i = 0; i < _length; ++i) { - _p[i] += src[i] * w; - } - } - } - const T *operator[] (int index) const { - return _p + _stride * index; - } - BufferAdapter & operator ++() { - if (_p) { - _p += _stride; - } - return *this; - } - - T *_p; - int _length; - int _stride; -}; - -/* static */ -bool -IspcEvaluator::EvalPatches(const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - int numPatchCoords, - const PatchCoord *patchCoords, - const PatchArray *patchArrays, - const int *patchIndexBuffer, - const PatchParam *patchParamBuffer) { - if (srcDesc.length != dstDesc.length) return false; - - // Copy BufferDescriptor to ispc version - // Since memory alignment in ISPC may be different from C++, - // we use the assignment for each field instead of the assignment for - // the whole struct - ispc::BufferDescriptor ispcSrcDesc; - ispcSrcDesc.offset = srcDesc.offset; - ispcSrcDesc.length = srcDesc.length; - ispcSrcDesc.stride = srcDesc.stride; - - tbb::blocked_range range = tbb::blocked_range(0, numPatchCoords, grain_size); - tbb::parallel_for(range, [&](const tbb::blocked_range &r) - { - uint i = r.begin(); - - ispc::BufferDescriptor ispcDstDesc, ispcDuDesc, ispcDvDesc; - ispcDstDesc.offset = dstDesc.offset + dstDesc.offset + i * dstDesc.stride; - ispcDstDesc.length = dstDesc.length; - ispcDstDesc.stride = dstDesc.stride; - - while (i < r.end()) { - // the patch coordinates are sorted by patch handle - // the following code searches the coordinates that - // belongs to the same patch so that they can be evalauated - // with ISPC - int nCoord = 1; - Far::PatchTable::PatchHandle handle = patchCoords[i].handle; - while(i + nCoord < r.end() && - handle.isEqual(patchCoords[i + nCoord].handle) ) - nCoord ++; - - PatchArray const &array = patchArrays[handle.arrayIndex]; - int patchType = array.GetPatchType(); - Far::PatchParam const & param = patchParamBuffer[handle.patchIndex]; - - unsigned int bitField = param.field1; - - const int *cvs = &patchIndexBuffer[array.indexBase + handle.vertIndex]; - - __declspec( align(64) ) float u[nCoord]; - __declspec( align(64) ) float v[nCoord]; - - for(int n=0; n range = tbb::blocked_range(0, numPatchCoords, grain_size); - tbb::parallel_for(range, [&](const tbb::blocked_range &r) - { - uint i = r.begin(); - - ispc::BufferDescriptor ispcDstDesc, ispcDuDesc, ispcDvDesc; - ispcDstDesc.offset = dstDesc.offset + dstDesc.offset + i * dstDesc.stride; - ispcDstDesc.length = dstDesc.length; - ispcDstDesc.stride = dstDesc.stride; - - ispcDuDesc.offset = duDesc.offset + i * duDesc.stride; - ispcDuDesc.length = duDesc.length; - ispcDuDesc.stride = duDesc.stride; - - ispcDvDesc.offset = dvDesc.offset + i * dvDesc.stride; - ispcDvDesc.length = dvDesc.length; - ispcDvDesc.stride = dvDesc.stride; - while (i < r.end()) { - // the patch coordinates are sorted by patch handle - // the following code searches the coordinates that - // belongs to the same patch so that they can be evalauated - // with ISPC - int nCoord = 1; - Far::PatchTable::PatchHandle handle = patchCoords[i].handle; - while(i + nCoord < r.end() && - handle.isEqual(patchCoords[i + nCoord].handle) ) - nCoord ++; - - PatchArray const &array = patchArrays[handle.arrayIndex]; - int patchType = array.GetPatchType(); - Far::PatchParam const & param = patchParamBuffer[handle.patchIndex]; - - unsigned int bitField = param.field1; - - const int *cvs = &patchIndexBuffer[array.indexBase + handle.vertIndex]; - - __declspec( align(64) ) float u[nCoord]; - __declspec( align(64) ) float v[nCoord]; - - for(int n=0; n -#include -#include "../osd/bufferDescriptor.h" -#include "../osd/types.h" - -namespace OpenSubdiv { -namespace OPENSUBDIV_VERSION { - -namespace Osd { - -class IspcEvaluator { -public: - /// ---------------------------------------------------------------------- - /// - /// Stencil evaluations with StencilTable - /// - /// ---------------------------------------------------------------------- - - /// \brief Generic static eval stencils function. This function has a same - /// signature as other device kernels have so that it can be called - /// in the same way from OsdMesh template interface. - /// - /// @param srcBuffer Input primvar buffer. - /// must have BindCpuBuffer() method returning a - /// const float pointer for read - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dstBuffer Output primvar buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param stencilTable Far::StencilTable or equivalent - /// - /// @param instance not used in the cpu kernel - /// (declared as a typed pointer to prevent - /// undesirable template resolution) - /// - /// @param deviceContext not used in the cpu kernel - /// - template - static bool EvalStencils( - SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, - DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, - STENCIL_TABLE const *stencilTable, - const IspcEvaluator *instance = NULL, - void * deviceContext = NULL) { - - (void)instance; // unused - (void)deviceContext; // unused - - if (stencilTable->GetNumStencils() == 0) - return false; - - return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, - dstBuffer->BindCpuBuffer(), dstDesc, - &stencilTable->GetSizes()[0], - &stencilTable->GetOffsets()[0], - &stencilTable->GetControlIndices()[0], - &stencilTable->GetWeights()[0], - /*start = */ 0, - /*end = */ stencilTable->GetNumStencils()); - } - - /// \brief Static eval stencils function which takes raw CPU pointers for - /// input and output. - /// - /// @param src Input primvar pointer. An offset of srcDesc - /// will be applied internally (i.e. the pointer - /// should not include the offset) - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dst Output primvar pointer. An offset of dstDesc - /// will be applied internally. - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param sizes pointer to the sizes buffer of the stencil table - /// to apply for the range [start, end) - /// - /// @param offsets pointer to the offsets buffer of the stencil table - /// - /// @param indices pointer to the indices buffer of the stencil table - /// - /// @param weights pointer to the weights buffer of the stencil table - /// - /// @param start start index of stencil table - /// - /// @param end end index of stencil table - /// - static bool EvalStencils( - const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - const int * sizes, - const int * offsets, - const int * indices, - const float * weights, - int start, int end); - - /// \brief Generic static eval stencils function with derivatives. - /// This function has a same signature as other device kernels - /// have so that it can be called in the same way from OsdMesh - /// template interface. - /// - /// @param srcBuffer Input primvar buffer. - /// must have BindCpuBuffer() method returning a - /// const float pointer for read - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dstBuffer Output primvar buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param duBuffer Output U-derivative buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param duDesc vertex buffer descriptor for the output buffer - /// - /// @param dvBuffer Output V-derivative buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param dvDesc vertex buffer descriptor for the output buffer - /// - /// @param stencilTable Far::StencilTable or equivalent - /// - /// @param instance not used in the cpu kernel - /// (declared as a typed pointer to prevent - /// undesirable template resolution) - /// - /// @param deviceContext not used in the cpu kernel - /// - template - static bool EvalStencils( - SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, - DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, - DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, - DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, - STENCIL_TABLE const *stencilTable, - const IspcEvaluator *instance = NULL, - void * deviceContext = NULL) { - - (void)instance; // unused - (void)deviceContext; // unused - - return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, - dstBuffer->BindCpuBuffer(), dstDesc, - duBuffer->BindCpuBuffer(), duDesc, - dvBuffer->BindCpuBuffer(), dvDesc, - &stencilTable->GetSizes()[0], - &stencilTable->GetOffsets()[0], - &stencilTable->GetControlIndices()[0], - &stencilTable->GetWeights()[0], - &stencilTable->GetDuWeights()[0], - &stencilTable->GetDvWeights()[0], - /*start = */ 0, - /*end = */ stencilTable->GetNumStencils()); - } - - /// \brief Static eval stencils function with derivatives, which takes - /// raw CPU pointers for input and output. - /// - /// @param src Input primvar pointer. An offset of srcDesc - /// will be applied internally (i.e. the pointer - /// should not include the offset) - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dst Output primvar pointer. An offset of dstDesc - /// will be applied internally. - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param du Output U-derivatives pointer. An offset of - /// duDesc will be applied internally. - /// - /// @param duDesc vertex buffer descriptor for the output buffer - /// - /// @param dv Output V-derivatives pointer. An offset of - /// dvDesc will be applied internally. - /// - /// @param dvDesc vertex buffer descriptor for the output buffer - /// - /// @param sizes pointer to the sizes buffer of the stencil table - /// - /// @param offsets pointer to the offsets buffer of the stencil table - /// - /// @param indices pointer to the indices buffer of the stencil table - /// - /// @param weights pointer to the weights buffer of the stencil table - /// - /// @param duWeights pointer to the du-weights buffer of the stencil table - /// - /// @param dvWeights pointer to the dv-weights buffer of the stencil table - /// - /// @param start start index of stencil table - /// - /// @param end end index of stencil table - /// - static bool EvalStencils( - const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - float *du, BufferDescriptor const &duDesc, - float *dv, BufferDescriptor const &dvDesc, - const int * sizes, - const int * offsets, - const int * indices, - const float * weights, - const float * duWeights, - const float * dvWeights, - int start, int end); - - /// ---------------------------------------------------------------------- - /// - /// Limit evaluations with PatchTable - /// - /// ---------------------------------------------------------------------- - - /// \brief Generic limit eval function. This function has a same - /// signature as other device kernels have so that it can be called - /// in the same way. - /// - /// @param srcBuffer Input primvar buffer. - /// must have BindCpuBuffer() method returning a - /// const float pointer for read - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dstBuffer Output primvar buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param numPatchCoords number of patchCoords. - /// - /// @param patchCoords array of locations to be evaluated. - /// - /// @param patchTable CpuPatchTable or equivalent - /// XXX: currently Far::PatchTable can't be used - /// due to interface mismatch - /// - /// @param instance not used in the cpu evaluator - /// - /// @param deviceContext not used in the cpu evaluator - /// - template - static bool EvalPatches( - SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, - DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, - int numPatchCoords, - PATCHCOORD_BUFFER *patchCoords, - PATCH_TABLE *patchTable, - IspcEvaluator const *instance = NULL, - void * deviceContext = NULL) { - - (void)instance; // unused - (void)deviceContext; // unused - - return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, - dstBuffer->BindCpuBuffer(), dstDesc, - numPatchCoords, - (const PatchCoord*)patchCoords->BindCpuBuffer(), - patchTable->GetPatchArrayBuffer(), - patchTable->GetPatchIndexBuffer(), - patchTable->GetPatchParamBuffer()); - } - - /// \brief Generic limit eval function with derivatives. This function has - /// a same signature as other device kernels have so that it can be - /// called in the same way. - /// - /// @param srcBuffer Input primvar buffer. - /// must have BindCpuBuffer() method returning a - /// const float pointer for read - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dstBuffer Output primvar buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param duBuffer Output U-derivatives buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param duDesc vertex buffer descriptor for the duBuffer - /// - /// @param dvBuffer Output V-derivatives buffer - /// must have BindCpuBuffer() method returning a - /// float pointer for write - /// - /// @param dvDesc vertex buffer descriptor for the dvBuffer - /// - /// @param numPatchCoords number of patchCoords. - /// - /// @param patchCoords array of locations to be evaluated. - /// - /// @param patchTable CpuPatchTable or equivalent - /// XXX: currently Far::PatchTable can't be used - /// due to interface mismatch - /// - /// @param instance not used in the cpu evaluator - /// - /// @param deviceContext not used in the cpu evaluator - /// - template - static bool EvalPatches( - SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, - DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, - DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, - DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, - int numPatchCoords, - PATCHCOORD_BUFFER *patchCoords, - PATCH_TABLE *patchTable, - IspcEvaluator const *instance = NULL, - void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused - - // XXX: PatchCoords is somewhat abusing vertex primvar buffer interop. - // ideally all buffer classes should have templated by datatype - // so that downcast isn't needed there. - // (e.g. Osd::CpuBuffer ) - // - return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, - dstBuffer->BindCpuBuffer(), dstDesc, - duBuffer->BindCpuBuffer(), duDesc, - dvBuffer->BindCpuBuffer(), dvDesc, - numPatchCoords, - (const PatchCoord*)patchCoords->BindCpuBuffer(), - patchTable->GetPatchArrayBuffer(), - patchTable->GetPatchIndexBuffer(), - patchTable->GetPatchParamBuffer()); - } - - /// \brief Static limit eval function. It takes an array of PatchCoord - /// and evaluate limit values on given PatchTable. - /// - /// @param src Input primvar pointer. An offset of srcDesc - /// will be applied internally (i.e. the pointer - /// should not include the offset) - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dst Output primvar pointer. An offset of dstDesc - /// will be applied internally. - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param numPatchCoords number of patchCoords. - /// - /// @param patchCoords array of locations to be evaluated. - /// - /// @param patchArrays an array of Osd::PatchArray struct - /// indexed by PatchCoord::arrayIndex - /// - /// @param patchIndexBuffer an array of patch indices - /// indexed by PatchCoord::vertIndex - /// - /// @param patchParamBuffer an array of Osd::PatchParam struct - /// indexed by PatchCoord::patchIndex - /// - static bool EvalPatches( - const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - int numPatchCoords, - const PatchCoord *patchCoords, - const PatchArray *patchArrays, - const int *patchIndexBuffer, - const PatchParam *patchParamBuffer); - - /// \brief Static limit eval function. It takes an array of PatchCoord - /// and evaluate limit values on given PatchTable. - /// - /// @param src Input primvar pointer. An offset of srcDesc - /// will be applied internally (i.e. the pointer - /// should not include the offset) - /// - /// @param srcDesc vertex buffer descriptor for the input buffer - /// - /// @param dst Output primvar pointer. An offset of dstDesc - /// will be applied internally. - /// - /// @param dstDesc vertex buffer descriptor for the output buffer - /// - /// @param du Output U-derivatives pointer. An offset of - /// duDesc will be applied internally. - /// - /// @param duDesc vertex buffer descriptor for the du buffer - /// - /// @param dv Output V-derivatives pointer. An offset of - /// dvDesc will be applied internally. - /// - /// @param dvDesc vertex buffer descriptor for the dv buffer - /// - /// @param numPatchCoords number of patchCoords. - /// - /// @param patchCoords array of locations to be evaluated. - /// - /// @param patchArrays an array of Osd::PatchArray struct - /// indexed by PatchCoord::arrayIndex - /// - /// @param patchIndexBuffer an array of patch indices - /// indexed by PatchCoord::vertIndex - /// - /// @param patchParamBuffer an array of Osd::PatchParam struct - /// indexed by PatchCoord::patchIndex - /// - static bool EvalPatches( - const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, - float *du, BufferDescriptor const &duDesc, - float *dv, BufferDescriptor const &dvDesc, - int numPatchCoords, - PatchCoord const *patchCoords, - PatchArray const *patchArrays, - const int *patchIndexBuffer, - PatchParam const *patchParamBuffer); - - /// ---------------------------------------------------------------------- - /// - /// Other methods - /// - /// ---------------------------------------------------------------------- - - /// \brief synchronize all asynchronous computation invoked on this device. - static void Synchronize(void * /*deviceContext = NULL*/) { - // nothing. - } -}; - - -} // end namespace Osd - -} // end namespace OPENSUBDIV_VERSION -using namespace OPENSUBDIV_VERSION; - -} // end namespace OpenSubdiv - - -#endif // OPENSUBDIV3_OSD_CPU_EVALUATOR_H From ad6b1f9117131365c496317cd7053e7948eafcd4 Mon Sep 17 00:00:00 2001 From: barfowl Date: Mon, 20 Jul 2015 17:56:00 -0700 Subject: [PATCH 18/59] Eliminate or encapsulate ICC pragmas: - eliminated need for disabling warning 177 in far/patchTableFactory.cpp - encapsulated all floating point equality tests (1572) in local functions - bracketed all ICC specific warning pragmas with #ifdef __INTEL_COMPILER - avoided GCC's stricter shadowing warning in vtr/array.h --- .../far/endCapBSplineBasisPatchFactory.cpp | 19 ++++--- opensubdiv/far/patchTableFactory.cpp | 50 +++++++++---------- opensubdiv/far/stencilBuilder.cpp | 29 +++++++---- opensubdiv/far/stencilTableFactory.cpp | 18 +++++-- opensubdiv/vtr/array.h | 6 +-- opensubdiv/vtr/level.cpp | 18 ++++--- 6 files changed, 86 insertions(+), 54 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index c11d5cba..72103194 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -37,6 +37,17 @@ namespace OPENSUBDIV_VERSION { namespace Far { +namespace { +#ifdef __INTEL_COMPILER +#pragma warning (push) +#pragma warning disable 1572 +#endif + inline bool isWeightNonZero(float w) { return (w != 0.0f); } +#ifdef __INTEL_COMPILER +#pragma warning (pop) +#endif +} + EndCapBSplineBasisPatchFactory::EndCapBSplineBasisPatchFactory( TopologyRefiner const & refiner) : _refiner(&refiner), _numVertices(0), _numPatches(0) { @@ -86,9 +97,6 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( bezierCP.push_back(basis.Ep[2]); bezierCP.push_back(basis.P[2]); -#pragma warning (push) -#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable - // Apply basis conversion from bezier to b-spline float Q[4][4] = {{ 6, -7, 2, 0}, { 0, 2, -1, 0}, @@ -98,7 +106,7 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { for (int k = 0; k < 4; ++k) { - if (Q[i][k] != 0.0f) H[i*4+j] += bezierCP[j+k*4] * Q[i][k]; + if (isWeightNonZero(Q[i][k])) H[i*4+j] += bezierCP[j+k*4] * Q[i][k]; } } } @@ -106,12 +114,11 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( for (int j = 0; j < 4; ++j) { GregoryBasis::Point p; for (int k = 0; k < 4; ++k) { - if (Q[j][k] != 0.0f) p += H[i*4+k] * Q[j][k]; + if (isWeightNonZero(Q[j][k])) p += H[i*4+k] * Q[j][k]; } _vertexStencils.push_back(p); } } -#pragma warning (pop) int varyingIndices[] = { 0, 0, 1, 1, 0, 0, 1, 1, diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index d512c5a0..cd2b4f5f 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -41,15 +41,14 @@ namespace OPENSUBDIV_VERSION { namespace { -#pragma warning disable 177 //function getNumPatchArrays was declared but never referenced - // -// A convenience container for the different types of feature adaptive patches +// A convenience container for the different types of feature adaptive patches. +// Each instance associates a value of the template parameter type with each +// patch type. // template struct PatchTypes { - TYPE R, // regular patch G, // gregory patch GB, // gregory boundary patch @@ -57,7 +56,6 @@ struct PatchTypes { PatchTypes() { std::memset(this, 0, sizeof(PatchTypes)); } - // Returns the number of patches based on the patch type in the descriptor TYPE & getValue( Far::PatchDescriptor desc ) { switch (desc.GetType()) { case Far::PatchDescriptor::REGULAR : return R; @@ -69,17 +67,6 @@ struct PatchTypes { // can't be reached (suppress compiler warning) return R; } - - // Counts the number of arrays required to store each type of patch used - // in the primitive - int getNumPatchArrays() const { - int result=0; - if (R) ++result; - if (G) ++result; - if (GB) ++result; - if (GP) ++result; - return result; - } }; typedef PatchTypes PatchCVPointers; @@ -88,6 +75,17 @@ typedef PatchTypes SharpnessIndexPointers; typedef PatchTypes PatchFVarOffsets; typedef PatchTypes PatchFVarPointers; +// Helpers for compiler warnings and floating point equality tests +#ifdef __INTEL_COMPILER +#pragma warning (push) +#pragma warning disable 1572 +#endif + +inline bool isSharpnessEqual(float s1, float s2) { return (s1 == s2); } + +#ifdef __INTEL_COMPILER +#pragma warning (pop) +#endif } // namespace anon @@ -254,8 +252,8 @@ public: } // Compare cursor positions - bool operator != (int pos) { - return _currentChannel < pos; + bool operator != (int posArg) { + return _currentChannel < posArg; } // Return FVar channel index in the TopologyRefiner list @@ -513,16 +511,12 @@ PatchTableFactory::computePatchParam( inline int assignSharpnessIndex(float sharpness, std::vector & sharpnessValues) { -#pragma warning (push) -#pragma warning disable 1572 // floating-point equality and inequality comparisons are unreliable // linear search for (int i=0; i<(int)sharpnessValues.size(); ++i) { - if (sharpnessValues[i] == sharpness) { + if (isSharpnessEqual(sharpnessValues[i], sharpness)) { return i; } } -#pragma warning (pop) - sharpnessValues.push_back(sharpness); return (int)sharpnessValues.size()-1; } @@ -722,7 +716,13 @@ PatchTableFactory::createAdaptive(TopologyRefiner const & refiner, Options optio context.table = new PatchTable(maxValence); // Populate the patch array descriptors - context.table->reservePatchArrays(context.patchInventory.getNumPatchArrays()); + int numPatchArrays = 0; + if (context.patchInventory.R > 0) ++numPatchArrays; + if (context.patchInventory.G > 0) ++numPatchArrays; + if (context.patchInventory.GB > 0) ++numPatchArrays; + if (context.patchInventory.GP > 0) ++numPatchArrays; + + context.table->reservePatchArrays(numPatchArrays); // Sort through the inventory and push back non-empty patch arrays ConstPatchDescriptorArray const & descs = @@ -1170,7 +1170,7 @@ PatchTableFactory::populateAdaptivePatches( permutation = permuteCorner[bIndex]; level->gatherQuadRegularCornerPatchPoints(faceIndex, patchVerts, bIndex); } else { - assert(patchTag._boundaryCount >0 && patchTag._boundaryCount <= 2); + assert(patchTag._boundaryCount <= 2); } offsetAndPermuteIndices(patchVerts, 16, levelVertOffset, permutation, iptrs.R); diff --git a/opensubdiv/far/stencilBuilder.cpp b/opensubdiv/far/stencilBuilder.cpp index 4073fcfe..6597aa31 100644 --- a/opensubdiv/far/stencilBuilder.cpp +++ b/opensubdiv/far/stencilBuilder.cpp @@ -31,6 +31,19 @@ namespace OPENSUBDIV_VERSION { namespace Far { namespace internal { +namespace { +#ifdef __INTEL_COMPILER +#pragma warning (push) +#pragma warning disable 1572 +#endif + + inline bool isWeightZero(float w) { return (w == 0.0f); } + +#ifdef __INTEL_COMPILER +#pragma warning (pop) +#endif +} + struct PointDerivWeight { float p; float du; @@ -363,15 +376,13 @@ StencilBuilder::GetStencilDvWeights() const { return _weightTable->GetDvWeights(); } -#pragma warning (push) -#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable - void StencilBuilder::Index::AddWithWeight(Index const & src, float weight) { // Ignore no-op weights. - if (weight == 0.0f) + if (isWeightZero(weight)) { return; + } _owner->_weightTable->AddWithWeight(src._index, _index, weight, _owner->_weightTable->GetScalarAccumulator()); } @@ -379,7 +390,7 @@ StencilBuilder::Index::AddWithWeight(Index const & src, float weight) void StencilBuilder::Index::AddWithWeight(Stencil const& src, float weight) { - if(weight == 0.0f) { + if (isWeightZero(weight)) { return; } @@ -389,7 +400,7 @@ StencilBuilder::Index::AddWithWeight(Stencil const& src, float weight) for (int i = 0; i < srcSize; ++i) { float w = srcWeights[i]; - if (w == 0.0f) { + if (isWeightZero(w)) { continue; } @@ -405,7 +416,7 @@ void StencilBuilder::Index::AddWithWeight(Stencil const& src, float weight, float du, float dv) { - if(weight == 0.0f and du == 0.0f and dv == 0.0f) { + if (isWeightZero(weight) and isWeightZero(du) and isWeightZero(dv)) { return; } @@ -415,7 +426,7 @@ StencilBuilder::Index::AddWithWeight(Stencil const& src, for (int i = 0; i < srcSize; ++i) { float w = srcWeights[i]; - if (w == 0.0f) { + if (isWeightZero(w)) { continue; } @@ -427,8 +438,6 @@ StencilBuilder::Index::AddWithWeight(Stencil const& src, } } -#pragma warning (pop) - } // end namespace internal } // end namespace Far } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/far/stencilTableFactory.cpp b/opensubdiv/far/stencilTableFactory.cpp index ed4ef883..ddab09da 100644 --- a/opensubdiv/far/stencilTableFactory.cpp +++ b/opensubdiv/far/stencilTableFactory.cpp @@ -40,6 +40,19 @@ namespace OPENSUBDIV_VERSION { namespace Far { +namespace { +#ifdef __INTEL_COMPILER +#pragma warning (push) +#pragma warning disable 1572 +#endif + + inline bool isWeightZero(float w) { return (w == 0.0f); } + +#ifdef __INTEL_COMPILER +#pragma warning (pop) +#endif +} + //------------------------------------------------------------------------------ void @@ -258,10 +271,7 @@ StencilTableFactory::AppendLocalPointStencilTable( for (int j = 0; j < src.GetSize(); ++j) { Index index = src.GetVertexIndices()[j]; float weight = src.GetWeights()[j]; -#pragma warning (push) -#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable - if (weight == 0.0f) continue; -#pragma warning (pop) + if (isWeightZero(weight)) continue; if (factorize) { dst.AddWithWeight( diff --git a/opensubdiv/vtr/array.h b/opensubdiv/vtr/array.h index 24c93129..19ecf5a3 100644 --- a/opensubdiv/vtr/array.h +++ b/opensubdiv/vtr/array.h @@ -66,8 +66,8 @@ public: ConstArray() : _begin(0), _size(0) { } - ConstArray(value_type const * ptr, size_type size) : - _begin(ptr), _size(size) { } + ConstArray(value_type const * ptr, size_type sizeArg) : + _begin(ptr), _size(sizeArg) { } size_type size() const { return _size; } @@ -117,7 +117,7 @@ public: Array() : ConstArray() { } - Array(value_type * ptr, size_type size) : ConstArray(ptr, size) { } + Array(value_type * ptr, size_type sizeArg) : ConstArray(ptr, sizeArg) { } public: diff --git a/opensubdiv/vtr/level.cpp b/opensubdiv/vtr/level.cpp index 25b06c1c..7b768e35 100644 --- a/opensubdiv/vtr/level.cpp +++ b/opensubdiv/vtr/level.cpp @@ -35,7 +35,7 @@ #include #include #include - + #ifdef _MSC_VER #define snprintf _snprintf #endif @@ -380,6 +380,15 @@ namespace { } return 0; } + +#ifdef __INTEL_COMPILER +#pragma warning (push) +#pragma warning disable 1572 +#endif + inline bool isSharpnessEqual(float s1, float s2) { return (s1 == s2); } +#ifdef __INTEL_COMPILER +#pragma warning (pop) +#endif } void @@ -1296,13 +1305,10 @@ Level::isSingleCreasePatch(Index face, float *sharpnessOut, int *rotationOut) co } } // sharpnesses have to be [0, x, 0, x] or [x, 0, x, 0] -#pragma warning (push) -#pragma warning disable 1572 //floating-point equality and inequality comparisons are unreliable - if (sharpnesses[0] != sharpnesses[2] or - sharpnesses[1] != sharpnesses[3]) { + if (isSharpnessEqual(sharpnesses[0], sharpnesses[2]) or + isSharpnessEqual(sharpnesses[1], sharpnesses[3])) { return false; } -#pragma warning (pop) } // check the edges around v[2], v[3] for (int i = 2; i < 4; ++i) { From 55565cca84991ea982a79dae9a68c159fc88a1af Mon Sep 17 00:00:00 2001 From: Jeremy Cowles Date: Wed, 22 Jul 2015 23:36:46 -0700 Subject: [PATCH 19/59] Respect factorizeIntermediateLevels option Previously, this flag was being ignored during stencil table construction. Fixes issue #694 --- opensubdiv/far/stencilBuilder.cpp | 10 ++++++++++ opensubdiv/far/stencilBuilder.h | 2 ++ opensubdiv/far/stencilTableFactory.cpp | 26 ++++++++++++++++++-------- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/opensubdiv/far/stencilBuilder.cpp b/opensubdiv/far/stencilBuilder.cpp index 6597aa31..dca6d8fe 100644 --- a/opensubdiv/far/stencilBuilder.cpp +++ b/opensubdiv/far/stencilBuilder.cpp @@ -215,6 +215,10 @@ public: std::vector const& GetDvWeights() const { return _dvWeights; } + void SetCoarseVertCount(int numVerts) { + _coarseVertCount = numVerts; + } + private: // Merge a vertex weight into the stencil table, if there is an existing @@ -346,6 +350,12 @@ StencilBuilder::GetNumVertsInStencil(size_t stencilIndex) const return (int)_weightTable->GetSizes()[stencilIndex]; } +void +StencilBuilder::SetCoarseVertCount(int numVerts) +{ + _weightTable->SetCoarseVertCount(numVerts); +} + std::vector const& StencilBuilder::GetStencilOffsets() const { return _weightTable->GetOffsets(); diff --git a/opensubdiv/far/stencilBuilder.h b/opensubdiv/far/stencilBuilder.h index 40766d0d..ebb9a803 100644 --- a/opensubdiv/far/stencilBuilder.h +++ b/opensubdiv/far/stencilBuilder.h @@ -51,6 +51,8 @@ public: int GetNumVertsInStencil(size_t stencilIndex) const; + void SetCoarseVertCount(int numVerts); + // Mapping from stencil[i] to it's starting offset in the sources[] and weights[] arrays; std::vector const& GetStencilOffsets() const; diff --git a/opensubdiv/far/stencilTableFactory.cpp b/opensubdiv/far/stencilTableFactory.cpp index ddab09da..58f19a45 100644 --- a/opensubdiv/far/stencilTableFactory.cpp +++ b/opensubdiv/far/stencilTableFactory.cpp @@ -94,8 +94,9 @@ StencilTableFactory::Create(TopologyRefiner const & refiner, PrimvarRefiner primvarRefiner(refiner); internal::StencilBuilder::Index srcIndex(&builder, 0); - internal::StencilBuilder::Index dstIndex(&builder, - refiner.GetLevel(0).GetNumVertices()); + internal::StencilBuilder::Index dstIndex(&builder, + refiner.GetLevel(0).GetNumVertices()); + for (int level=1; level<=maxlevel; ++level) { if (not interpolateVarying) { primvarRefiner.Interpolate(level, srcIndex, dstIndex); @@ -103,17 +104,26 @@ StencilTableFactory::Create(TopologyRefiner const & refiner, primvarRefiner.InterpolateVarying(level, srcIndex, dstIndex); } - srcIndex = dstIndex; - dstIndex = dstIndex[refiner.GetLevel(level).GetNumVertices()]; - } + if (options.factorizeIntermediateLevels) { + srcIndex = dstIndex; + } + dstIndex = dstIndex[refiner.GetLevel(level).GetNumVertices()]; + + if (not options.factorizeIntermediateLevels) { + // All previous verts are considered as coarse verts, as a + // result, we don't update the srcIndex and update the coarse + // vertex count. + builder.SetCoarseVertCount(dstIndex.GetOffset()); + } + } size_t firstOffset = refiner.GetLevel(0).GetNumVertices(); if (not options.generateIntermediateLevels) firstOffset = srcIndex.GetOffset(); - // Copy stencils from the pool allocator into the tables - // always initialize numControlVertices (useful for torus case) + // Copy stencils from the StencilBuilder into the StencilTable. + // Always initialize numControlVertices (useful for torus case) StencilTable * result = new StencilTable(refiner.GetLevel(0).GetNumVertices(), builder.GetStencilOffsets(), @@ -254,7 +264,7 @@ StencilTableFactory::AppendLocalPointStencilTable( } } - // copy all local points stencils to proto stencils, and factoriz if needed. + // copy all local points stencils to proto stencils, and factorize if needed. int nLocalPointStencils = localPointStencilTable->GetNumStencils(); int nLocalPointStencilsElements = 0; From def029a273cd993dc749df2c854b77daed6e64c4 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Wed, 29 Jul 2015 14:21:54 -0700 Subject: [PATCH 20/59] glEvalLimit example: add bilinear shape into test cases --- examples/glEvalLimit/glEvalLimit.cpp | 17 ++++++++++++----- examples/glEvalLimit/init_shapes.h | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 98ff3d1b..b31cc6bf 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -502,18 +502,25 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Far::StencilTable const * vertexStencils = NULL; Far::StencilTable const * varyingStencils = NULL; int nverts=0; + { - // Apply feature adaptive refinement to the mesh so that we can use the - // limit evaluation API features. - Far::TopologyRefiner::AdaptiveOptions options(level); - topologyRefiner->RefineAdaptive(options); + bool adaptive = (sdctype == OpenSubdiv::Sdc::SCHEME_CATMARK); + if (adaptive) { + // Apply feature adaptive refinement to the mesh so that we can use the + // limit evaluation API features. + Far::TopologyRefiner::AdaptiveOptions options(level); + topologyRefiner->RefineAdaptive(options); + } else { + Far::TopologyRefiner::UniformOptions options(level); + topologyRefiner->RefineUniform(options); + } // Generate stencil table to update the bi-cubic patches control // vertices after they have been re-posed (both for vertex & varying // interpolation) Far::StencilTableFactory::Options soptions; soptions.generateOffsets=true; - soptions.generateIntermediateLevels=true; + soptions.generateIntermediateLevels=adaptive; vertexStencils = Far::StencilTableFactory::Create(*topologyRefiner, soptions); diff --git a/examples/glEvalLimit/init_shapes.h b/examples/glEvalLimit/init_shapes.h index 7b72fd59..689604e2 100644 --- a/examples/glEvalLimit/init_shapes.h +++ b/examples/glEvalLimit/init_shapes.h @@ -40,8 +40,6 @@ static std::vector g_defaultShapes; //------------------------------------------------------------------------------ static void initShapes() { -// g_defaultShapes.push_back( ShapeDesc("bilinear_cube", bilinear_cube, kBilinear) ); - g_defaultShapes.push_back( ShapeDesc("catmark_cube_corner0", catmark_cube_corner0, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_cube_corner1", catmark_cube_corner1, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_cube_corner2", catmark_cube_corner2, kCatmark ) ); @@ -87,5 +85,7 @@ static void initShapes() { g_defaultShapes.push_back( ShapeDesc("catmark_helmet", catmark_helmet, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_pawn", catmark_pawn, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_rook", catmark_rook, kCatmark ) ); + + g_defaultShapes.push_back( ShapeDesc("bilinear_cube", bilinear_cube, kBilinear) ); } //------------------------------------------------------------------------------ From 168139d4caf9e620e98ddfe3d88badc3a97efcbe Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Wed, 29 Jul 2015 14:42:03 -0700 Subject: [PATCH 21/59] Fix bug when PatchTableFactory::Options.generateAllLevels is set generateAllLevels flags is used when we want to have uniform refined patch array containing all levels together. There's an index offsetting bug when this flag is enabled. --- opensubdiv/far/patchTableFactory.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index cd2b4f5f..32203d94 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -545,9 +545,12 @@ PatchTableFactory::createUniform(TopologyRefiner const & refiner, Options option options.triangulateQuads &= (refiner.GetSchemeType()==Sdc::SCHEME_BILINEAR or refiner.GetSchemeType()==Sdc::SCHEME_CATMARK); + // level=0 may contain n-gons, which are not supported in PatchTable. + // even if generateAllLevels = true, we start from level 1. + int maxvalence = refiner.GetMaxValence(), maxlevel = refiner.GetMaxLevel(), - firstlevel = options.generateAllLevels ? 0 : maxlevel, + firstlevel = options.generateAllLevels ? 1 : maxlevel, nlevels = maxlevel-firstlevel+1; PtexIndices ptexIndices(refiner); @@ -591,9 +594,7 @@ PatchTableFactory::createUniform(TopologyRefiner const & refiner, Options option if (options.triangulateQuads) npatches *= 2; - if (level>=firstlevel) { - table->pushPatchArray(desc, npatches, &voffset, &poffset, 0); - } + table->pushPatchArray(desc, npatches, &voffset, &poffset, 0); } // Allocate various tables @@ -615,8 +616,8 @@ PatchTableFactory::createUniform(TopologyRefiner const & refiner, Options option PatchParam * pptr = &table->_paramTable[0]; Index ** fptr = 0; - Index levelVertOffset = options.generateAllLevels ? - 0 : refiner.GetLevel(0).GetNumVertices(); + // we always skip level=0 vertices (control cages) + Index levelVertOffset = refiner.GetLevel(0).GetNumVertices(); Index * levelFVarVertOffsets = 0; if (generateFVarPatches) { From ccfcca9abf6ec8a2e35a5d49f2b44f8479b02eb0 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Wed, 29 Jul 2015 17:21:26 -0700 Subject: [PATCH 22/59] Retains boundary faces of bilinear scheme mesh with VTX_BOUNDARY_NONE We mark boundary faces as holes only if the vertex boundary interpolation is none and the subdivision scheme has local neighborhood. --- opensubdiv/far/topologyRefinerFactory.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/opensubdiv/far/topologyRefinerFactory.cpp b/opensubdiv/far/topologyRefinerFactory.cpp index 921e5fac..ffc03ee7 100644 --- a/opensubdiv/far/topologyRefinerFactory.cpp +++ b/opensubdiv/far/topologyRefinerFactory.cpp @@ -23,6 +23,7 @@ // #include "../far/topologyRefinerFactory.h" #include "../far/topologyRefiner.h" +#include "../sdc/types.h" #include "../vtr/level.h" #include @@ -161,7 +162,8 @@ TopologyRefinerFactoryBase::prepareComponentTagsAndSharpness(TopologyRefiner& re Sdc::Options options = refiner.GetSchemeOptions(); Sdc::Crease creasing(options); - bool makeBoundaryFacesHoles = (options.GetVtxBoundaryInterpolation() == Sdc::Options::VTX_BOUNDARY_NONE); + bool makeBoundaryFacesHoles = (options.GetVtxBoundaryInterpolation() == Sdc::Options::VTX_BOUNDARY_NONE + && Sdc::SchemeTypeTraits::GetLocalNeighborhoodSize(refiner.GetSchemeType()) > 0); bool sharpenCornerVerts = (options.GetVtxBoundaryInterpolation() == Sdc::Options::VTX_BOUNDARY_EDGE_AND_CORNER); bool sharpenNonManFeatures = true; //(options.GetNonManifoldInterpolation() == Sdc::Options::NON_MANIFOLD_SHARP); From db3fe9a8e80531d6ab680e3b88f45d7f240f51a9 Mon Sep 17 00:00:00 2001 From: barfowl Date: Wed, 29 Jul 2015 18:46:18 -0700 Subject: [PATCH 23/59] Reduced warnings resulting from GCC's -Wshadow option - eliminated warnings from core libraries and regression code --- opensubdiv/osd/cpuPatchTable.cpp | 4 +- opensubdiv/osd/mesh.h | 28 ++++++------ opensubdiv/osd/types.h | 10 ++-- opensubdiv/vtr/quadRefinement.cpp | 73 +++++++++++++----------------- opensubdiv/vtr/refinement.cpp | 10 ++-- opensubdiv/vtr/triRefinement.cpp | 4 +- regression/common/cmp_utils.h | 12 ++--- regression/common/shape_utils.cpp | 4 +- regression/osd_regression/main.cpp | 12 ++--- 9 files changed, 74 insertions(+), 83 deletions(-) diff --git a/opensubdiv/osd/cpuPatchTable.cpp b/opensubdiv/osd/cpuPatchTable.cpp index 626cf028..468334b4 100644 --- a/opensubdiv/osd/cpuPatchTable.cpp +++ b/opensubdiv/osd/cpuPatchTable.cpp @@ -79,8 +79,8 @@ CpuPatchTable::CpuPatchTable(const Far::PatchTable *farPatchTable) { farPatchTable->GetPatchParamTable(); std::vector const &sharpnessIndexTable = farPatchTable->GetSharpnessIndexTable(); - int numPatches = farPatchTable->GetNumPatches(j); - for (int k = 0; k < numPatches; ++k) { + int numPatchesJ = farPatchTable->GetNumPatches(j); + for (int k = 0; k < numPatchesJ; ++k) { float sharpness = 0.0; int patchIndex = (int)_patchParamBuffer.size(); if (patchIndex < (int)sharpnessIndexTable.size()) { diff --git a/opensubdiv/osd/mesh.h b/opensubdiv/osd/mesh.h index 9862957f..515b65aa 100644 --- a/opensubdiv/osd/mesh.h +++ b/opensubdiv/osd/mesh.h @@ -173,12 +173,12 @@ public: // XXX: FIXME, linear search struct Entry { - Entry(BufferDescriptor const &srcDesc, - BufferDescriptor const &dstDesc, - BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc, - EVALUATOR *e) : srcDesc(srcDesc), dstDesc(dstDesc), - duDesc(duDesc), dvDesc(dvDesc), evaluator(e) {} + Entry(BufferDescriptor const &srcDescArg, + BufferDescriptor const &dstDescArg, + BufferDescriptor const &duDescArg, + BufferDescriptor const &dvDescArg, + EVALUATOR *evalArg) : srcDesc(srcDescArg), dstDesc(dstDescArg), + duDesc(duDescArg), dvDesc(dvDescArg), evaluator(evalArg) {} BufferDescriptor srcDesc, dstDesc, duDesc, dvDesc; EVALUATOR *evaluator; }; @@ -420,24 +420,24 @@ public: instance, _deviceContext); if (_varyingDesc.length > 0) { - BufferDescriptor srcDesc = _varyingDesc; - BufferDescriptor dstDesc(srcDesc); - dstDesc.offset += numControlVertices * dstDesc.stride; + BufferDescriptor vSrcDesc = _varyingDesc; + BufferDescriptor vDstDesc(vSrcDesc); + vDstDesc.offset += numControlVertices * vDstDesc.stride; instance = GetEvaluator( - _evaluatorCache, srcDesc, dstDesc, + _evaluatorCache, vSrcDesc, vDstDesc, _deviceContext); if (_varyingBuffer) { // non-interleaved - Evaluator::EvalStencils(_varyingBuffer, srcDesc, - _varyingBuffer, dstDesc, + Evaluator::EvalStencils(_varyingBuffer, vSrcDesc, + _varyingBuffer, vDstDesc, _varyingStencilTable, instance, _deviceContext); } else { // interleaved - Evaluator::EvalStencils(_vertexBuffer, srcDesc, - _vertexBuffer, dstDesc, + Evaluator::EvalStencils(_vertexBuffer, vSrcDesc, + _vertexBuffer, vDstDesc, _varyingStencilTable, instance, _deviceContext); } diff --git a/opensubdiv/osd/types.h b/opensubdiv/osd/types.h index 203d7860..14488d60 100644 --- a/opensubdiv/osd/types.h +++ b/opensubdiv/osd/types.h @@ -42,14 +42,14 @@ struct PatchCoord { /// \brief Constructor /// - /// @param handle patch handle + /// @param handleArg patch handle /// - /// @param s parametric location on the patch + /// @param sArg parametric location on the patch /// - /// @param t parametric location on the patch + /// @param tArg parametric location on the patch /// - PatchCoord(Far::PatchTable::PatchHandle handle, float s, float t) : - handle(handle), s(s), t(t) { } + PatchCoord(Far::PatchTable::PatchHandle handleArg, float sArg, float tArg) : + handle(handleArg), s(sArg), t(tArg) { } PatchCoord() : s(0), t(0) { handle.arrayIndex = 0; diff --git a/opensubdiv/vtr/quadRefinement.cpp b/opensubdiv/vtr/quadRefinement.cpp index 8fdfb58d..f045d605 100644 --- a/opensubdiv/vtr/quadRefinement.cpp +++ b/opensubdiv/vtr/quadRefinement.cpp @@ -40,8 +40,8 @@ namespace internal { // // Simple constructor, destructor and basic initializers: // -QuadRefinement::QuadRefinement(Level const & parent, Level & child, Sdc::Options const & options) : - Refinement(parent, child, options) { +QuadRefinement::QuadRefinement(Level const & parentArg, Level & childArg, Sdc::Options const & optionsArg) : + Refinement(parentArg, childArg, optionsArg) { _splitType = Sdc::SPLIT_TO_QUADS; _regFaceSize = 4; @@ -344,9 +344,6 @@ QuadRefinement::populateEdgeVerticesFromParentEdges() { void QuadRefinement::populateEdgeFaceRelation() { - const Level& parent = *_parent; - Level& child = *_child; - // // Notes on allocating/initializing the edge-face counts/offsets vector: // @@ -367,27 +364,27 @@ QuadRefinement::populateEdgeFaceRelation() { // - could at least make a quick traversal of components and use the above // two points to get much closer estimate than what is used for uniform // - int childEdgeFaceIndexSizeEstimate = (int)parent._faceVertIndices.size() * 2 + - (int)parent._edgeFaceIndices.size() * 2; + int childEdgeFaceIndexSizeEstimate = (int)_parent->_faceVertIndices.size() * 2 + + (int)_parent->_edgeFaceIndices.size() * 2; - child._edgeFaceCountsAndOffsets.resize(child.getNumEdges() * 2); - child._edgeFaceIndices.resize( childEdgeFaceIndexSizeEstimate); - child._edgeFaceLocalIndices.resize(childEdgeFaceIndexSizeEstimate); + _child->_edgeFaceCountsAndOffsets.resize(_child->getNumEdges() * 2); + _child->_edgeFaceIndices.resize( childEdgeFaceIndexSizeEstimate); + _child->_edgeFaceLocalIndices.resize(childEdgeFaceIndexSizeEstimate); // Update _maxEdgeFaces from the parent level before calling the // populateEdgeFacesFromParent methods below, as these may further // update _maxEdgeFaces. - child._maxEdgeFaces = parent._maxEdgeFaces; + _child->_maxEdgeFaces = _parent->_maxEdgeFaces; populateEdgeFacesFromParentFaces(); populateEdgeFacesFromParentEdges(); // Revise the over-allocated estimate based on what is used (as indicated in the // count/offset for the last vertex) and trim the index vector accordingly: - childEdgeFaceIndexSizeEstimate = child.getNumEdgeFaces(child.getNumEdges()-1) + - child.getOffsetOfEdgeFaces(child.getNumEdges()-1); - child._edgeFaceIndices.resize( childEdgeFaceIndexSizeEstimate); - child._edgeFaceLocalIndices.resize(childEdgeFaceIndexSizeEstimate); + childEdgeFaceIndexSizeEstimate = _child->getNumEdgeFaces(_child->getNumEdges()-1) + + _child->getOffsetOfEdgeFaces(_child->getNumEdges()-1); + _child->_edgeFaceIndices.resize( childEdgeFaceIndexSizeEstimate); + _child->_edgeFaceLocalIndices.resize(childEdgeFaceIndexSizeEstimate); } void @@ -516,9 +513,6 @@ QuadRefinement::populateEdgeFacesFromParentEdges() { void QuadRefinement::populateVertexFaceRelation() { - const Level& parent = *_parent; - Level& child = *_child; - // // Notes on allocating/initializing the vertex-face counts/offsets vector: // @@ -537,13 +531,13 @@ QuadRefinement::populateVertexFaceRelation() { // - where the 1 or 2 is number of child edges of parent edge // - same as parent vert for verts from parent verts (catmark) // - int childVertFaceIndexSizeEstimate = (int)parent._faceVertIndices.size() - + (int)parent._edgeFaceIndices.size() * 2 - + (int)parent._vertFaceIndices.size(); + int childVertFaceIndexSizeEstimate = (int)_parent->_faceVertIndices.size() + + (int)_parent->_edgeFaceIndices.size() * 2 + + (int)_parent->_vertFaceIndices.size(); - child._vertFaceCountsAndOffsets.resize(child.getNumVertices() * 2); - child._vertFaceIndices.resize( childVertFaceIndexSizeEstimate); - child._vertFaceLocalIndices.resize( childVertFaceIndexSizeEstimate); + _child->_vertFaceCountsAndOffsets.resize(_child->getNumVertices() * 2); + _child->_vertFaceIndices.resize( childVertFaceIndexSizeEstimate); + _child->_vertFaceLocalIndices.resize( childVertFaceIndexSizeEstimate); if (getFirstChildVertexFromVertices() == 0) { populateVertexFacesFromParentVertices(); @@ -557,10 +551,10 @@ QuadRefinement::populateVertexFaceRelation() { // Revise the over-allocated estimate based on what is used (as indicated in the // count/offset for the last vertex) and trim the index vectors accordingly: - childVertFaceIndexSizeEstimate = child.getNumVertexFaces(child.getNumVertices()-1) + - child.getOffsetOfVertexFaces(child.getNumVertices()-1); - child._vertFaceIndices.resize( childVertFaceIndexSizeEstimate); - child._vertFaceLocalIndices.resize(childVertFaceIndexSizeEstimate); + childVertFaceIndexSizeEstimate = _child->getNumVertexFaces(_child->getNumVertices()-1) + + _child->getOffsetOfVertexFaces(_child->getNumVertices()-1); + _child->_vertFaceIndices.resize( childVertFaceIndexSizeEstimate); + _child->_vertFaceLocalIndices.resize(childVertFaceIndexSizeEstimate); } void @@ -702,9 +696,6 @@ QuadRefinement::populateVertexFacesFromParentVertices() { void QuadRefinement::populateVertexEdgeRelation() { - const Level& parent = *_parent; - Level& child = *_child; - // // Notes on allocating/initializing the vertex-edge counts/offsets vector: // @@ -727,13 +718,13 @@ QuadRefinement::populateVertexEdgeRelation() { // - any end vertex will require all N child faces (catmark) // - same as parent vert for verts from parent verts (catmark) // - int childVertEdgeIndexSizeEstimate = (int)parent._faceVertIndices.size() - + (int)parent._edgeFaceIndices.size() + parent.getNumEdges() * 2 - + (int)parent._vertEdgeIndices.size(); + int childVertEdgeIndexSizeEstimate = (int)_parent->_faceVertIndices.size() + + (int)_parent->_edgeFaceIndices.size() + _parent->getNumEdges() * 2 + + (int)_parent->_vertEdgeIndices.size(); - child._vertEdgeCountsAndOffsets.resize(child.getNumVertices() * 2); - child._vertEdgeIndices.resize( childVertEdgeIndexSizeEstimate); - child._vertEdgeLocalIndices.resize( childVertEdgeIndexSizeEstimate); + _child->_vertEdgeCountsAndOffsets.resize(_child->getNumVertices() * 2); + _child->_vertEdgeIndices.resize( childVertEdgeIndexSizeEstimate); + _child->_vertEdgeLocalIndices.resize( childVertEdgeIndexSizeEstimate); if (getFirstChildVertexFromVertices() == 0) { populateVertexEdgesFromParentVertices(); @@ -747,10 +738,10 @@ QuadRefinement::populateVertexEdgeRelation() { // Revise the over-allocated estimate based on what is used (as indicated in the // count/offset for the last vertex) and trim the index vectors accordingly: - childVertEdgeIndexSizeEstimate = child.getNumVertexEdges(child.getNumVertices()-1) + - child.getOffsetOfVertexEdges(child.getNumVertices()-1); - child._vertEdgeIndices.resize( childVertEdgeIndexSizeEstimate); - child._vertEdgeLocalIndices.resize(childVertEdgeIndexSizeEstimate); + childVertEdgeIndexSizeEstimate = _child->getNumVertexEdges(_child->getNumVertices()-1) + + _child->getOffsetOfVertexEdges(_child->getNumVertices()-1); + _child->_vertEdgeIndices.resize( childVertEdgeIndexSizeEstimate); + _child->_vertEdgeLocalIndices.resize(childVertEdgeIndexSizeEstimate); } void diff --git a/opensubdiv/vtr/refinement.cpp b/opensubdiv/vtr/refinement.cpp index 16d3267d..49c0fab4 100644 --- a/opensubdiv/vtr/refinement.cpp +++ b/opensubdiv/vtr/refinement.cpp @@ -45,9 +45,9 @@ namespace internal { // // Simple constructor, destructor and basic initializers: // -Refinement::Refinement(Level const & parent, Level & child, Sdc::Options const& options) : - _parent(&parent), - _child(&child), +Refinement::Refinement(Level const & parentArg, Level & childArg, Sdc::Options const& options) : + _parent(&parentArg), + _child(&childArg), _options(options), _regFaceSize(-1), _uniform(false), @@ -65,8 +65,8 @@ Refinement::Refinement(Level const & parent, Level & child, Sdc::Options const& _firstChildVertFromEdge(0), _firstChildVertFromVert(0) { - assert((child.getDepth() == 0) && (child.getNumVertices() == 0)); - child._depth = 1 + parent.getDepth(); + assert((childArg.getDepth() == 0) && (childArg.getNumVertices() == 0)); + childArg._depth = 1 + parentArg.getDepth(); } Refinement::~Refinement() { diff --git a/opensubdiv/vtr/triRefinement.cpp b/opensubdiv/vtr/triRefinement.cpp index 9a579da4..0a4be13f 100644 --- a/opensubdiv/vtr/triRefinement.cpp +++ b/opensubdiv/vtr/triRefinement.cpp @@ -40,8 +40,8 @@ namespace internal { // // Simple constructor, destructor and basic initializers: // -TriRefinement::TriRefinement(Level const & parent, Level & child, Sdc::Options const & options) : - Refinement(parent, child, options) { +TriRefinement::TriRefinement(Level const & parentArg, Level & childArg, Sdc::Options const & optionsArg) : + Refinement(parentArg, childArg, optionsArg) { _splitType = Sdc::SPLIT_TO_TRIS; _regFaceSize = 3; diff --git a/regression/common/cmp_utils.h b/regression/common/cmp_utils.h index 923b67a2..9a3d63c4 100644 --- a/regression/common/cmp_utils.h +++ b/regression/common/cmp_utils.h @@ -47,8 +47,8 @@ namespace { template void GetReorderedHbrVertexData( - const OpenSubdiv::Far::TopologyRefiner &refiner, - const OpenSubdiv::HbrMesh &hmesh, + const OpenSubdiv::Far::TopologyRefiner &farRefiner, + const OpenSubdiv::HbrMesh &hbrMesh, std::vector *hbrVertexData, std::vector *hbrVertexOnBoundaryData = NULL) { @@ -178,14 +178,14 @@ GetReorderedHbrVertexData( } }; - Mapper mapper(refiner, hmesh); + Mapper mapper(farRefiner, hbrMesh); - int nverts = hmesh.GetNumVertices(); - assert( nverts==refiner.GetNumVerticesTotal() ); + int nverts = hbrMesh.GetNumVertices(); + assert( nverts==farRefiner.GetNumVerticesTotal() ); hbrVertexData->resize(nverts); - for (int level=0, ofs=0; level<(refiner.GetMaxLevel()+1); ++level) { + for (int level=0, ofs=0; level<(farRefiner.GetMaxLevel()+1); ++level) { typename Mapper::LevelMap & map = mapper.maps[level]; for (int i=0; i<(int)map.verts.size(); ++i) { diff --git a/regression/common/shape_utils.cpp b/regression/common/shape_utils.cpp index 6f58c493..89ed0ecd 100644 --- a/regression/common/shape_utils.cpp +++ b/regression/common/shape_utils.cpp @@ -129,8 +129,8 @@ Shape * Shape::parseObj(char const * shapestr, Scheme shapescheme, std::stringstream ss; ss << ifs.rdbuf(); ifs.close(); - std::string str = ss.str(); - s->parseMtllib(str.c_str()); + std::string tmpStr = ss.str(); + s->parseMtllib(tmpStr.c_str()); s->mtllib = buf; } } break; diff --git a/regression/osd_regression/main.cpp b/regression/osd_regression/main.cpp index ff49ca79..e30f0334 100644 --- a/regression/osd_regression/main.cpp +++ b/regression/osd_regression/main.cpp @@ -585,13 +585,13 @@ usage(char ** argv) { static void parseArgs(int argc, char ** argv) { - for (int i=1; i Date: Wed, 29 Jul 2015 19:38:05 -0700 Subject: [PATCH 24/59] Replaced topology initialization assertions with errors: - TopologyRefinerFactory now issues errors for its minimum requirements --- opensubdiv/far/topologyRefinerFactory.cpp | 27 +++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/opensubdiv/far/topologyRefinerFactory.cpp b/opensubdiv/far/topologyRefinerFactory.cpp index 921e5fac..7cace098 100644 --- a/opensubdiv/far/topologyRefinerFactory.cpp +++ b/opensubdiv/far/topologyRefinerFactory.cpp @@ -55,7 +55,19 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi int vCount = baseLevel.getNumVertices(); int fCount = baseLevel.getNumFaces(); - assert((vCount > 0) && (fCount > 0)); + if (vCount == 0) { + char msg[1024]; + snprintf(msg, 1024, "Invalid topology detected : mesh contains no vertices."); + Warning(msg); + return false; + } + if (fCount == 0) { + char msg[1024]; + snprintf(msg, 1024, + "Invalid topology detected : meshes without faces not yet supported."); + Warning(msg); + return false; + } // Make sure no face was defined that would lead to a valence overflow -- the max // valence has been initialized with the maximum number of face-vertices: @@ -71,6 +83,12 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi int fVertCount = baseLevel.getNumFaceVertices(fCount - 1) + baseLevel.getOffsetOfFaceVertices(fCount - 1); + if (fVertCount == 0) { + char msg[1024]; + snprintf(msg, 1024, "Invalid topology detected : mesh contains no face-vertices."); + Warning(msg); + return false; + } if ((refiner.GetSchemeType() == Sdc::SCHEME_LOOP) && (fVertCount != (3 * fCount))) { char msg[1024]; snprintf(msg, 1024, @@ -79,7 +97,6 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi return false; } baseLevel.resizeFaceVertices(fVertCount); - assert(baseLevel.getNumFaceVerticesTotal() > 0); // // If edges were sized, all other topological relations must be sized with it, in @@ -278,6 +295,12 @@ TopologyRefinerFactoryBase::prepareFaceVaryingChannels(TopologyRefiner& refiner) int regBoundaryValence = regVertexValence / 2; for (int channel=0; channel Date: Thu, 30 Jul 2015 10:24:25 -0700 Subject: [PATCH 25/59] cmakefile: degrade the gcc version error to warning. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a4ebb179..749b4762 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ set(CMAKE_MODULE_PATH # OpenSubdiv trips bugs in some older gcc versions if (CMAKE_COMPILER_IS_GNUCC) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) - message(FATAL_ERROR "g++ 4.8 or newer required") + message(WARNING "g++ 4.8 or newer recommended") endif() endif() From 0f9819d50387ed8c31b7aa71300c1d85f5ca961d Mon Sep 17 00:00:00 2001 From: barfowl Date: Thu, 30 Jul 2015 15:05:49 -0700 Subject: [PATCH 26/59] Changed use of Warning() to Error() in Far::TopologyRefinerFactory --- opensubdiv/far/topologyRefinerFactory.cpp | 34 ++++++++--------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/opensubdiv/far/topologyRefinerFactory.cpp b/opensubdiv/far/topologyRefinerFactory.cpp index 7cace098..dcb1d14c 100644 --- a/opensubdiv/far/topologyRefinerFactory.cpp +++ b/opensubdiv/far/topologyRefinerFactory.cpp @@ -56,16 +56,13 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi int fCount = baseLevel.getNumFaces(); if (vCount == 0) { - char msg[1024]; - snprintf(msg, 1024, "Invalid topology detected : mesh contains no vertices."); - Warning(msg); + Error(FAR_RUNTIME_ERROR, + "Invalid topology detected : mesh contains no vertices."); return false; } if (fCount == 0) { - char msg[1024]; - snprintf(msg, 1024, + Error(FAR_RUNTIME_ERROR, "Invalid topology detected : meshes without faces not yet supported."); - Warning(msg); return false; } @@ -76,7 +73,7 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi snprintf(msg, 1024, "Invalid topology specified : face with %d vertices > %d max.", baseLevel.getMaxValence(), Vtr::VALENCE_LIMIT); - Warning(msg); + Error(FAR_RUNTIME_ERROR, msg); return false; } @@ -84,16 +81,13 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi baseLevel.getOffsetOfFaceVertices(fCount - 1); if (fVertCount == 0) { - char msg[1024]; - snprintf(msg, 1024, "Invalid topology detected : mesh contains no face-vertices."); - Warning(msg); + Error(FAR_RUNTIME_ERROR, + "Invalid topology detected : mesh contains no face-vertices."); return false; } if ((refiner.GetSchemeType() == Sdc::SCHEME_LOOP) && (fVertCount != (3 * fCount))) { - char msg[1024]; - snprintf(msg, 1024, + Error(FAR_RUNTIME_ERROR, "Invalid topology specified : non-triangular faces not supported by Loop scheme."); - Warning(msg); return false; } baseLevel.resizeFaceVertices(fVertCount); @@ -135,26 +129,22 @@ TopologyRefinerFactoryBase::prepareComponentTopologyAssignment(TopologyRefiner& snprintf(msg, 1024, "Invalid topology detected : vertex with valence %d > %d max.", baseLevel.getMaxValence(), Vtr::VALENCE_LIMIT); - Warning(msg); + Error(FAR_RUNTIME_ERROR, msg); return false; } } else { if (baseLevel.getMaxValence() == 0) { - char msg[1024]; - snprintf(msg, 1024, "Invalid topology detected : maximum valence not assigned."); - Warning(msg); + Error(FAR_RUNTIME_ERROR, + "Invalid topology detected : maximum valence not assigned."); return false; } } if (fullValidation) { if (not baseLevel.validateTopology(callback, callbackData)) { - char msg[1024]; - snprintf(msg, 1024, - completeMissingTopology ? + Error(FAR_RUNTIME_ERROR, completeMissingTopology ? "Invalid topology detected as completed from partial specification." : "Invalid topology detected as fully specified."); - Warning(msg); return false; } } @@ -298,7 +288,7 @@ TopologyRefinerFactoryBase::prepareFaceVaryingChannels(TopologyRefiner& refiner) if (baseLevel.getNumFVarValues(channel) == 0) { char msg[1024]; snprintf(msg, 1024, "Invalid face-varying channel : channel %d has no values.", channel); - Warning(msg); + Error(FAR_RUNTIME_ERROR, msg); return false; } baseLevel.completeFVarChannelTopology(channel, regBoundaryValence); From 376e9dd3ebd4d96f711e2e9e5ffb7ee697879f8d Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Thu, 30 Jul 2015 15:53:08 -0700 Subject: [PATCH 27/59] glViewer,dxViewer: disable catmark_pole360 --- examples/dxViewer/init_shapes.h | 1 - examples/glViewer/init_shapes.h | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/dxViewer/init_shapes.h b/examples/dxViewer/init_shapes.h index 288832e3..dc80d707 100644 --- a/examples/dxViewer/init_shapes.h +++ b/examples/dxViewer/init_shapes.h @@ -79,7 +79,6 @@ static void initShapes() { g_defaultShapes.push_back(ShapeDesc("catmark_righthanded", catmark_righthanded, kCatmark)); g_defaultShapes.push_back(ShapeDesc("catmark_pole8", catmark_pole8, kCatmark)); g_defaultShapes.push_back(ShapeDesc("catmark_pole64", catmark_pole64, kCatmark)); - g_defaultShapes.push_back(ShapeDesc("catmark_pole360", catmark_pole360, kCatmark)); g_defaultShapes.push_back(ShapeDesc("catmark_nonman_quadpole8", catmark_nonman_quadpole8, kCatmark)); g_defaultShapes.push_back(ShapeDesc("catmark_nonman_quadpole64", catmark_nonman_quadpole64, kCatmark)); g_defaultShapes.push_back(ShapeDesc("catmark_nonman_quadpole360", catmark_nonman_quadpole360, kCatmark)); diff --git a/examples/glViewer/init_shapes.h b/examples/glViewer/init_shapes.h index 355934d1..d1d4cc3c 100644 --- a/examples/glViewer/init_shapes.h +++ b/examples/glViewer/init_shapes.h @@ -80,7 +80,6 @@ static void initShapes() { g_defaultShapes.push_back( ShapeDesc("catmark_righthanded", catmark_righthanded, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_pole8", catmark_pole8, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_pole64", catmark_pole64, kCatmark ) ); - g_defaultShapes.push_back( ShapeDesc("catmark_pole360", catmark_pole360, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_nonman_quadpole8", catmark_nonman_quadpole8, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_nonman_quadpole64", catmark_nonman_quadpole64, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_nonman_quadpole360", catmark_nonman_quadpole360, kCatmark ) ); From 38253191497bb4e63460956fe152715acd0b7fb7 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Thu, 30 Jul 2015 15:53:33 -0700 Subject: [PATCH 28/59] example viewer hud: disable depth test --- examples/common/glHud.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/common/glHud.cpp b/examples/common/glHud.cpp index faada3ac..e4d69a40 100644 --- a/examples/common/glHud.cpp +++ b/examples/common/glHud.cpp @@ -277,6 +277,7 @@ GLhud::Flush() { ortho(proj, 0, 0, float(GetWidth()), float(GetHeight())); glUniformMatrix4fv(_mvpMatrix, 1, GL_FALSE, proj); + glDisable(GL_DEPTH_TEST); { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _fontTexture); @@ -289,6 +290,7 @@ GLhud::Flush() { glBindTexture(GL_TEXTURE_2D, 0); } + glEnable(GL_DEPTH_TEST); return true; } From ae89b0bb19de3ac55a181aed9d8383783d3a29fb Mon Sep 17 00:00:00 2001 From: barfowl Date: Thu, 30 Jul 2015 17:31:06 -0700 Subject: [PATCH 29/59] Added existing shapes missing from regression/shapes/all.h --- regression/shapes/all.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regression/shapes/all.h b/regression/shapes/all.h index a09db9c0..722b94a3 100644 --- a/regression/shapes/all.h +++ b/regression/shapes/all.h @@ -70,9 +70,11 @@ #include "catmark_nonman_quadpole8.h" #include "catmark_nonman_quadpole64.h" #include "catmark_nonman_quadpole360.h" +#include "catmark_nonman_bareverts.h" #include "catmark_pawn.h" #include "catmark_pyramid_creases0.h" #include "catmark_pyramid_creases1.h" +#include "catmark_pyramid_creases2.h" #include "catmark_pyramid.h" #include "catmark_rook.h" #include "catmark_single_crease.h" @@ -82,11 +84,13 @@ #include "catmark_square_hedit1.h" #include "catmark_square_hedit2.h" #include "catmark_square_hedit3.h" +#include "catmark_square_hedit4.h" #include "catmark_tent_creases0.h" #include "catmark_tent_creases1.h" #include "catmark_tent.h" #include "catmark_torus.h" #include "catmark_torus_creases0.h" +#include "catmark_torus_creases1.h" #include "bilinear_cube.h" From 2d16bfa5fc2c544acbb52b9020e29d6ada8736bf Mon Sep 17 00:00:00 2001 From: David G Yu Date: Thu, 30 Jul 2015 17:41:36 -0700 Subject: [PATCH 30/59] Fixed an incorrect comment in far/patchParam.h --- opensubdiv/far/patchParam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensubdiv/far/patchParam.h b/opensubdiv/far/patchParam.h index c5f0243f..1186b009 100644 --- a/opensubdiv/far/patchParam.h +++ b/opensubdiv/far/patchParam.h @@ -53,7 +53,7 @@ namespace Far { /// -----------|:----:|------------------------------------------------------ /// level | 4 | the subdivision level of the patch /// nonquad | 1 | whether the patch is the child of a non-quad face -/// unused | 3 | transition edge mask encoding +/// unused | 3 | unused /// boundary | 4 | boundary edge mask encoding /// v | 10 | log2 value of u parameter at first patch corner /// u | 10 | log2 value of v parameter at first patch corner From a094281541cc595262a51a63a87e79985baeb1c1 Mon Sep 17 00:00:00 2001 From: barfowl Date: Fri, 31 Jul 2015 12:47:49 -0700 Subject: [PATCH 31/59] Minor content and formatting changes to Far error strings - made Far error strings consistent, including clearer source of error - minor formatting changes to the default error callback --- opensubdiv/far/error.cpp | 61 ++++++++++------------- opensubdiv/far/error.h | 34 +++++++------ opensubdiv/far/primvarRefiner.h | 9 ++-- opensubdiv/far/ptexIndices.cpp | 6 +-- opensubdiv/far/topologyRefiner.cpp | 10 ++-- opensubdiv/far/topologyRefinerFactory.cpp | 41 ++++++++------- opensubdiv/far/topologyRefinerFactory.h | 6 ++- 7 files changed, 86 insertions(+), 81 deletions(-) diff --git a/opensubdiv/far/error.cpp b/opensubdiv/far/error.cpp index dccf89c3..de81c093 100644 --- a/opensubdiv/far/error.cpp +++ b/opensubdiv/far/error.cpp @@ -33,38 +33,44 @@ namespace OPENSUBDIV_VERSION { namespace Far { +// +// Statics for the publicly assignable callbacks and the methods to +// assign them (disable static assignment warnings when doing so): +// static ErrorCallbackFunc errorFunc = 0; - -static char const * errors[] = { - "FAR_NO_ERROR", - "FAR_FATAL_ERROR", - "FAR_INTERNAL_CODING_ERROR", - "FAR_CODING_ERROR", - "FAR_RUNTIME_ERROR" -}; - -void SetErrorCallback(ErrorCallbackFunc func) { +static WarningCallbackFunc warningFunc = 0; #ifdef __INTEL_COMPILER #pragma warning disable 1711 #endif + +void SetErrorCallback(ErrorCallbackFunc func) { errorFunc = func; +} + +void SetWarningCallback(WarningCallbackFunc func) { + warningFunc = func; +} + #ifdef __INTEL_COMPILER #pragma warning enable 1711 #endif -} -void Error(ErrorType err) { - - if (errorFunc) { - errorFunc(err, NULL); - } else { - fprintf(stderr, "Error : %s\n",errors[err]); - } -} +// +// The default error and warning callbacks eventually belong in the +// internal namespace: +// void Error(ErrorType err, const char *format, ...) { + static char const * errorTypeLabel[] = { + "No Error", + "Fatal Error", + "Coding Error (internal)", + "Coding Error", + "Error" + }; + assert(err!=FAR_NO_ERROR); char message[10240]; @@ -76,23 +82,10 @@ void Error(ErrorType err, const char *format, ...) { if (errorFunc) { errorFunc(err, message); } else { - printf("Error %s : %s\n",errors[err], message); + printf("%s: %s\n", errorTypeLabel[err], message); } } -static WarningCallbackFunc warningFunc = 0; - -void SetWarningCallback(WarningCallbackFunc func) { - -#ifdef __INTEL_COMPILER -#pragma warning disable 1711 -#endif - warningFunc = func; -#ifdef __INTEL_COMPILER -#pragma warning enable 1711 -#endif -} - void Warning(const char *format, ...) { char message[10240]; @@ -104,7 +97,7 @@ void Warning(const char *format, ...) { if (warningFunc) { warningFunc(message); } else { - fprintf(stdout, "Warning : %s\n", message); + fprintf(stdout, "Warning: %s\n", message); } } diff --git a/opensubdiv/far/error.h b/opensubdiv/far/error.h index ffd5274a..c2d31fb4 100644 --- a/opensubdiv/far/error.h +++ b/opensubdiv/far/error.h @@ -40,6 +40,8 @@ typedef enum { FAR_RUNTIME_ERROR ///< Issue a generic runtime error, but continue execution. } ErrorType; + +/// \brief The error callback function type (default is "printf") typedef void (*ErrorCallbackFunc)(ErrorType err, const char *message); /// \brief Sets the error callback function (default is "printf") @@ -50,22 +52,8 @@ typedef void (*ErrorCallbackFunc)(ErrorType err, const char *message); /// void SetErrorCallback(ErrorCallbackFunc func); -/// \brief Sends an OSD error -/// -/// @param err the error type -/// -void Error(ErrorType err); -/// \brief Sends an OSD error with a message -/// -/// @param err the error type -/// -/// @param format the format of the message (followed by arguments) -/// -void Error(ErrorType err, const char *format, ...); - - -/// \brief Sets the warning callback function (default is "printf") +/// \brief The warning callback function type (default is "printf") typedef void (*WarningCallbackFunc)(const char *message); /// \brief Sets the warning callback function (default is "printf") @@ -76,7 +64,21 @@ typedef void (*WarningCallbackFunc)(const char *message); /// void SetWarningCallback(WarningCallbackFunc func); -/// \brief Sends an OSD warning message + +// +// The following are intended for internal use only (and will eventually +// be moved within namespace internal) +// + +/// \brief Sends an OSD error with a message (internal use only) +/// +/// @param err the error type +/// +/// @param format the format of the message (followed by arguments) +/// +void Error(ErrorType err, const char *format, ...); + +/// \brief Sends an OSD warning message (internal use only) /// /// @param format the format of the message (followed by arguments) /// diff --git a/opensubdiv/far/primvarRefiner.h b/opensubdiv/far/primvarRefiner.h index 0cf336db..cf5dcc8c 100644 --- a/opensubdiv/far/primvarRefiner.h +++ b/opensubdiv/far/primvarRefiner.h @@ -317,7 +317,8 @@ PrimvarRefiner::Limit(T const & src, U & dst) const { if (_refiner.getLevel(_refiner.GetMaxLevel()).getNumVertexEdgesTotal() == 0) { Error(FAR_RUNTIME_ERROR, - "Cannot compute limit points -- last level of refinement does not include full topology."); + "Failure in PrimvarRefiner::Limit() -- " + "last level of refinement does not include full topology."); return; } @@ -340,7 +341,8 @@ PrimvarRefiner::Limit(T const & src, U & dstPos, U1 & dstTan1, U2 & dstTan2) con if (_refiner.getLevel(_refiner.GetMaxLevel()).getNumVertexEdgesTotal() == 0) { Error(FAR_RUNTIME_ERROR, - "Cannot compute limit points -- last level of refinement does not include full topology."); + "Failure in PrimvarRefiner::Limit() -- " + "last level of refinement does not include full topology."); return; } @@ -363,7 +365,8 @@ PrimvarRefiner::LimitFaceVarying(T const & src, U & dst, int channel) const { if (_refiner.getLevel(_refiner.GetMaxLevel()).getNumVertexEdgesTotal() == 0) { Error(FAR_RUNTIME_ERROR, - "Cannot compute limit points -- last level of refinement does not include full topology."); + "Failure in PrimvarRefiner::LimitFaceVarying() -- " + "last level of refinement does not include full topology."); return; } diff --git a/opensubdiv/far/ptexIndices.cpp b/opensubdiv/far/ptexIndices.cpp index a2359486..54a5b59a 100644 --- a/opensubdiv/far/ptexIndices.cpp +++ b/opensubdiv/far/ptexIndices.cpp @@ -94,9 +94,9 @@ PtexIndices::GetAdjacency( if (Sdc::SchemeTypeTraits::GetRegularFaceSize( refiner.GetSchemeType()) != 4) { - Far::Error(FAR_CODING_ERROR, - "PtexIndices::GetAdjacency() is currently only implemented for " - "quad schemes."); + Far::Error(FAR_RUNTIME_ERROR, + "Failure in PtexIndices::GetAdjacency() -- " + "currently only implemented for quad schemes."); return; } diff --git a/opensubdiv/far/topologyRefiner.cpp b/opensubdiv/far/topologyRefiner.cpp index 90e8481a..28364d02 100644 --- a/opensubdiv/far/topologyRefiner.cpp +++ b/opensubdiv/far/topologyRefiner.cpp @@ -192,12 +192,12 @@ TopologyRefiner::RefineUniform(UniformOptions options) { if (_levels[0]->getNumVertices() == 0) { Error(FAR_RUNTIME_ERROR, - "Cannot apply uniform refinement -- base level appears to be uninitialized."); + "Failure in TopologyRefiner::RefineUniform() -- base level is uninitialized."); return; } if (_refinements.size()) { Error(FAR_RUNTIME_ERROR, - "Cannot apply uniform refinement -- previous refinements already applied."); + "Failure in TopologyRefiner::RefineUniform() -- previous refinements already applied."); return; } @@ -245,17 +245,17 @@ TopologyRefiner::RefineAdaptive(AdaptiveOptions options) { if (_levels[0]->getNumVertices() == 0) { Error(FAR_RUNTIME_ERROR, - "Cannot apply adaptive refinement -- base level appears to be uninitialized."); + "Failure in TopologyRefiner::RefineAdaptive() -- base level is uninitialized."); return; } if (_refinements.size()) { Error(FAR_RUNTIME_ERROR, - "Cannot apply adaptive refinement -- previous refinements already applied."); + "Failure in TopologyRefiner::RefineAdaptive() -- previous refinements already applied."); return; } if (_subdivType != Sdc::SCHEME_CATMARK) { Error(FAR_RUNTIME_ERROR, - "Cannot apply adaptive refinement -- currently only supported for scheme Catmark."); + "Failure in TopologyRefiner::RefineAdaptive() -- currently only supported for Catmark scheme."); return; } diff --git a/opensubdiv/far/topologyRefinerFactory.cpp b/opensubdiv/far/topologyRefinerFactory.cpp index 752e63b8..a8837ed1 100644 --- a/opensubdiv/far/topologyRefinerFactory.cpp +++ b/opensubdiv/far/topologyRefinerFactory.cpp @@ -57,13 +57,13 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi int fCount = baseLevel.getNumFaces(); if (vCount == 0) { - Error(FAR_RUNTIME_ERROR, - "Invalid topology detected : mesh contains no vertices."); + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "mesh contains no vertices."); return false; } if (fCount == 0) { - Error(FAR_RUNTIME_ERROR, - "Invalid topology detected : meshes without faces not yet supported."); + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "meshes without faces not yet supported."); return false; } @@ -71,8 +71,8 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi // valence has been initialized with the maximum number of face-vertices: if (baseLevel.getMaxValence() > Vtr::VALENCE_LIMIT) { char msg[1024]; - snprintf(msg, 1024, - "Invalid topology specified : face with %d vertices > %d max.", + snprintf(msg, 1024, "Failure in TopologyRefinerFactory<>::Create() -- " + "face with %d vertices > %d max.", baseLevel.getMaxValence(), Vtr::VALENCE_LIMIT); Error(FAR_RUNTIME_ERROR, msg); return false; @@ -82,13 +82,13 @@ TopologyRefinerFactoryBase::prepareComponentTopologySizing(TopologyRefiner& refi baseLevel.getOffsetOfFaceVertices(fCount - 1); if (fVertCount == 0) { - Error(FAR_RUNTIME_ERROR, - "Invalid topology detected : mesh contains no face-vertices."); + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "mesh contains no face-vertices."); return false; } if ((refiner.GetSchemeType() == Sdc::SCHEME_LOOP) && (fVertCount != (3 * fCount))) { - Error(FAR_RUNTIME_ERROR, - "Invalid topology specified : non-triangular faces not supported by Loop scheme."); + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "non-triangular faces not supported by Loop scheme."); return false; } baseLevel.resizeFaceVertices(fVertCount); @@ -127,25 +127,29 @@ TopologyRefinerFactoryBase::prepareComponentTopologyAssignment(TopologyRefiner& if (completeMissingTopology) { if (not baseLevel.completeTopologyFromFaceVertices()) { char msg[1024]; - snprintf(msg, 1024, - "Invalid topology detected : vertex with valence %d > %d max.", + snprintf(msg, 1024, "Failure in TopologyRefinerFactory<>::Create() -- " + "vertex with valence %d > %d max.", baseLevel.getMaxValence(), Vtr::VALENCE_LIMIT); Error(FAR_RUNTIME_ERROR, msg); return false; } } else { if (baseLevel.getMaxValence() == 0) { - Error(FAR_RUNTIME_ERROR, - "Invalid topology detected : maximum valence not assigned."); + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "maximum valence not assigned."); return false; } } if (fullValidation) { if (not baseLevel.validateTopology(callback, callbackData)) { - Error(FAR_RUNTIME_ERROR, completeMissingTopology ? - "Invalid topology detected as completed from partial specification." : - "Invalid topology detected as fully specified."); + if (completeMissingTopology) { + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "invalid topology detected from partial specification."); + } else { + Error(FAR_RUNTIME_ERROR, "Failure in TopologyRefinerFactory<>::Create() -- " + "invalid topology detected as fully specified."); + } return false; } } @@ -289,7 +293,8 @@ TopologyRefinerFactoryBase::prepareFaceVaryingChannels(TopologyRefiner& refiner) for (int channel=0; channel::Create() -- " + "face-varying channel %d has no values.", channel); Error(FAR_RUNTIME_ERROR, msg); return false; } diff --git a/opensubdiv/far/topologyRefinerFactory.h b/opensubdiv/far/topologyRefinerFactory.h index 38e9491e..6a0dedbb 100644 --- a/opensubdiv/far/topologyRefinerFactory.h +++ b/opensubdiv/far/topologyRefinerFactory.h @@ -547,7 +547,8 @@ template bool TopologyRefinerFactory::resizeComponentTopology(TopologyRefiner& /* refiner */, MESH const& /* mesh */) { - Error(FAR_RUNTIME_ERROR, "Missing specialization for TopologyRefinerFactory::resizeComponentTopology()"); + Error(FAR_RUNTIME_ERROR, + "Failure in TopologyRefinerFactory<>::resizeComponentTopology() -- no specialization provided."); // // Sizing the topology tables: @@ -587,7 +588,8 @@ template bool TopologyRefinerFactory::assignComponentTopology(TopologyRefiner& /* refiner */, MESH const& /* mesh */) { - Error(FAR_RUNTIME_ERROR, "Missing specialization for TopologyRefinerFactory::assignComponentTopology()"); + Error(FAR_RUNTIME_ERROR, + "Failure in TopologyRefinerFactory<>::assignComponentTopology() -- no specialization provided."); // // Assigning the topology tables: From 69017538ee6a05f65e6997a83b6baa38180a8305 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 3 Aug 2015 10:40:54 -0700 Subject: [PATCH 32/59] Fixed author attribution for Loop 2008 AAC paper --- documentation/references.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/references.rst b/documentation/references.rst index ab435f26..07e8d675 100644 --- a/documentation/references.rst +++ b/documentation/references.rst @@ -73,7 +73,7 @@ References | ``_ | | *Approximating Catmull-Clark Subdivision Surfaces with Bicubic Patches* - | Charles Loop + | Charles Loop, Scott Schaefer | ACM Transactions on Graphics, Vol. 27 No. 1 Article 8 March 2008 | ``_ | ``_ From 282c4620971be6ade01f909dc805efbaf04b33c0 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 3 Aug 2015 11:31:24 -0700 Subject: [PATCH 33/59] Disabled Fractional Spacing toggles from viewers Fractional tessellation is not currently supported by the core tessellation shaders. This will be fixed in a future release. --- examples/dxPtexViewer/dxPtexViewer.cpp | 4 +-- examples/dxViewer/dxviewer.cpp | 43 ++++++++++++++++---------- examples/glPtexViewer/glPtexViewer.cpp | 4 +-- examples/glViewer/glViewer.cpp | 6 ++-- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/examples/dxPtexViewer/dxPtexViewer.cpp b/examples/dxPtexViewer/dxPtexViewer.cpp index 66dd80ca..177b3a3a 100644 --- a/examples/dxPtexViewer/dxPtexViewer.cpp +++ b/examples/dxPtexViewer/dxPtexViewer.cpp @@ -1403,8 +1403,8 @@ initHUD() { 450, 10, callbackCheckBox, HUD_CB_ANIMATE_VERTICES, 'm'); g_hud->AddCheckBox("Screen space LOD (V)", g_screenSpaceTess, 450, 30, callbackCheckBox, HUD_CB_VIEW_LOD, 'v'); - g_hud->AddCheckBox("Fractional spacing (T)", g_fractionalSpacing, - 450, 50, callbackCheckBox, HUD_CB_FRACTIONAL_SPACING, 't'); + //g_hud->AddCheckBox("Fractional spacing (T)", g_fractionalSpacing, + // 450, 50, callbackCheckBox, HUD_CB_FRACTIONAL_SPACING, 't'); g_hud->AddCheckBox("Frustum Patch Culling (B)", g_patchCull, 450, 70, callbackCheckBox, HUD_CB_PATCH_CULL, 'b'); g_hud->AddCheckBox("Freeze (spc)", g_freeze, diff --git a/examples/dxViewer/dxviewer.cpp b/examples/dxViewer/dxviewer.cpp index 905ac81a..7c78619b 100644 --- a/examples/dxViewer/dxviewer.cpp +++ b/examples/dxViewer/dxviewer.cpp @@ -128,12 +128,10 @@ int g_freeze = 0, g_adaptive = 1, g_endCap = kEndCapBSplineBasis, g_singleCreasePatch = 1, - g_drawPatchCVs = 0, g_drawNormals = 0, g_mbutton[3] = {0, 0, 0}; -int g_displayPatchColor = 1, - g_screenSpaceTess = 1, +int g_screenSpaceTess = 1, g_fractionalSpacing = 1, g_patchCull = 1, g_displayPatchCounts = 0; @@ -1130,12 +1128,6 @@ callbackCheckBox(bool checked, int button) { case kHUD_CB_ANIMATE_VERTICES: g_moveScale = checked; break; - case kHUD_CB_DISPLAY_PATCH_COLOR: - g_displayPatchColor = checked; - break; - case kHUD_CB_DISPLAY_PATCH_CVs: - g_drawPatchCVs = checked; - break; case kHUD_CB_VIEW_LOD: g_screenSpaceTess = checked; break; @@ -1204,13 +1196,32 @@ initHUD() { kShadingNormal, g_shadingMode == kShadingNormal); - g_hud->AddCheckBox("Patch CVs (L)", false, 10, 50, callbackCheckBox, kHUD_CB_DISPLAY_PATCH_CVs, 'L'); - g_hud->AddCheckBox("Patch Color (P)", true, 10, 70, callbackCheckBox, kHUD_CB_DISPLAY_PATCH_COLOR, 'P'); - g_hud->AddCheckBox("Animate vertices (M)", g_moveScale != 0, 10, 110, callbackCheckBox, kHUD_CB_ANIMATE_VERTICES, 'M'); - g_hud->AddCheckBox("Freeze (spc)", false, 10, 130, callbackCheckBox, kHUD_CB_FREEZE, ' '); - g_hud->AddCheckBox("Screen space LOD (V)", g_screenSpaceTess != 0, 10, 150, callbackCheckBox, kHUD_CB_VIEW_LOD, 'V'); - g_hud->AddCheckBox("Fractional spacing (T)", g_fractionalSpacing != 0, 10, 170, callbackCheckBox, kHUD_CB_FRACTIONAL_SPACING, 'T'); - g_hud->AddCheckBox("Frustum Patch Culling (B)", g_patchCull != 0, 10, 190, callbackCheckBox, kHUD_CB_PATCH_CULL, 'B'); + int y = 10; + g_hud->AddCheckBox("Control edges (H)", + g_controlMeshDisplay->GetEdgesDisplay(), + 10, y, callbackCheckBox, + kHUD_CB_DISPLAY_CONTROL_MESH_EDGES, 'H'); + y += 20; + g_hud->AddCheckBox("Control vertices (J)", + g_controlMeshDisplay->GetVerticesDisplay(), + 10, y, callbackCheckBox, + kHUD_CB_DISPLAY_CONTROL_MESH_VERTS, 'J'); + y += 20; + g_hud->AddCheckBox("Animate vertices (M)", g_moveScale != 0, + 10, y, callbackCheckBox, kHUD_CB_ANIMATE_VERTICES, 'M'); + y += 20; + g_hud->AddCheckBox("Screen space LOD (V)", g_screenSpaceTess != 0, + 10, y, callbackCheckBox, kHUD_CB_VIEW_LOD, 'V'); + y += 20; + //g_hud->AddCheckBox("Fractional spacing (T)", g_fractionalSpacing != 0, + // 10, y, callbackCheckBox, kHUD_CB_FRACTIONAL_SPACING, 'T'); + //y += 20; + g_hud->AddCheckBox("Frustum Patch Culling (B)", g_patchCull != 0, + 10, y, callbackCheckBox, kHUD_CB_PATCH_CULL, 'B'); + y += 20; + g_hud->AddCheckBox("Freeze (spc)", g_freeze != 0, + 10, y, callbackCheckBox, kHUD_CB_FREEZE, ' '); + y += 20; g_hud->AddCheckBox("Adaptive (`)", true, 10, 230, callbackAdaptive, 0, '`'); g_hud->AddCheckBox("Single Crease Patch (S)", g_singleCreasePatch!=0, 10, 250, callbackSingleCreasePatch, 0, 'S'); diff --git a/examples/glPtexViewer/glPtexViewer.cpp b/examples/glPtexViewer/glPtexViewer.cpp index c4ba3380..7b142c22 100644 --- a/examples/glPtexViewer/glPtexViewer.cpp +++ b/examples/glPtexViewer/glPtexViewer.cpp @@ -1879,8 +1879,8 @@ int main(int argc, char ** argv) { 10, 30, callbackCheckBox, HUD_CB_ANIMATE_VERTICES, 'm'); g_hud.AddCheckBox("Screen space LOD (V)", g_screenSpaceTess, 10, 50, callbackCheckBox, HUD_CB_VIEW_LOD, 'v'); - g_hud.AddCheckBox("Fractional spacing (T)", g_fractionalSpacing, - 10, 70, callbackCheckBox, HUD_CB_FRACTIONAL_SPACING, 't'); + //g_hud.AddCheckBox("Fractional spacing (T)", g_fractionalSpacing, + // 10, 70, callbackCheckBox, HUD_CB_FRACTIONAL_SPACING, 't'); g_hud.AddCheckBox("Frustum Patch Culling (B)", g_patchCull, 10, 90, callbackCheckBox, HUD_CB_PATCH_CULL, 'b'); g_hud.AddCheckBox("Bloom (Y)", g_bloom, diff --git a/examples/glViewer/glViewer.cpp b/examples/glViewer/glViewer.cpp index 5b91bedc..64459114 100644 --- a/examples/glViewer/glViewer.cpp +++ b/examples/glViewer/glViewer.cpp @@ -1461,9 +1461,9 @@ initHUD() { g_hud.AddCheckBox("Screen space LOD (V)", g_screenSpaceTess != 0, 10, y, callbackCheckBox, kHUD_CB_VIEW_LOD, 'v'); y += 20; - g_hud.AddCheckBox("Fractional spacing (T)", g_fractionalSpacing != 0, - 10, y, callbackCheckBox, kHUD_CB_FRACTIONAL_SPACING, 't'); - y += 20; + //g_hud.AddCheckBox("Fractional spacing (T)", g_fractionalSpacing != 0, + // 10, y, callbackCheckBox, kHUD_CB_FRACTIONAL_SPACING, 't'); + //y += 20; g_hud.AddCheckBox("Frustum Patch Culling (B)", g_patchCull != 0, 10, y, callbackCheckBox, kHUD_CB_PATCH_CULL, 'b'); y += 20; From d879907d9f89eaa6113825bc85e7c65d44704870 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 3 Aug 2015 13:32:06 -0700 Subject: [PATCH 34/59] Updated release notes for 3.0.1 --- documentation/release_notes.rst | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index b05fe7ce..1a681cc1 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -31,6 +31,32 @@ ---- +Release 3.0.1 +============= + +Release 3.0.1 is a minor release focused on stability and correctness. + +**Changes** + - Added a references section to the documentation, please see `References `__ + +**Bug Fixes** + - Removed references to AddVaryingWithWeight from examples and tutorials + - Fixed several compiler warnings (e.g. signed vs unsigned comparisons) + - Fixed handling of unconnected vertices to avoid out of bounds data access + - Added more regression test shapes + - Fixed non-zero starting offsets for TbbEvalStencils and OmpEvalStencils + - Fixed compiler warnings in the core libraries reported by GCC's -Wshadow + - Eased GCC version restriction, earlier requirement for version 4.8 or newer is no longer needed + - Improved compatibility with ICC + - Fixed Far::StencilTableFactory::Options::factorizeIntermediateLevels + - Fixed Far::PatchTablesFactory::Options::generateAllLevels + - Fixed the behavior of VTX_BOUNDARY_NONE for meshes with bilinear scheme + - Replaced topology initialization assertions with errors + - Improved descriptive content and formatting of Far error messages + - Disabled depth buffering when drawing the UI in the example viewers + - Disabled the fractional tessellation spacing option in example viewers + since this mode is currently not supported + Release 3.0.0 ============= From fc79fd9e9de6e61cd8f9f5172d466867f5c77cf0 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 3 Aug 2015 14:36:12 -0700 Subject: [PATCH 35/59] Re-categorized some items in release notes Some of these items are better considered as minor, pro-active changes rather than bug fixes. --- documentation/release_notes.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index 1a681cc1..50a995c6 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -38,21 +38,21 @@ Release 3.0.1 is a minor release focused on stability and correctness. **Changes** - Added a references section to the documentation, please see `References `__ + - Removed references to AddVaryingWithWeight from examples and tutorials + - Added more regression test shapes + - Addressed general compiler warnings (e.g. signed vs unsigned comparisons) + - Addressed compiler warnings in the core libraries reported by GCC's -Wshadow + - Eased GCC version restriction, earlier requirement for version 4.8 or newer is no longer needed + - Replaced topology initialization assertions with errors + - Improved compatibility with ICC + - Improved descriptive content and formatting of Far error messages **Bug Fixes** - - Removed references to AddVaryingWithWeight from examples and tutorials - - Fixed several compiler warnings (e.g. signed vs unsigned comparisons) - Fixed handling of unconnected vertices to avoid out of bounds data access - - Added more regression test shapes - Fixed non-zero starting offsets for TbbEvalStencils and OmpEvalStencils - - Fixed compiler warnings in the core libraries reported by GCC's -Wshadow - - Eased GCC version restriction, earlier requirement for version 4.8 or newer is no longer needed - - Improved compatibility with ICC - Fixed Far::StencilTableFactory::Options::factorizeIntermediateLevels - Fixed Far::PatchTablesFactory::Options::generateAllLevels - Fixed the behavior of VTX_BOUNDARY_NONE for meshes with bilinear scheme - - Replaced topology initialization assertions with errors - - Improved descriptive content and formatting of Far error messages - Disabled depth buffering when drawing the UI in the example viewers - Disabled the fractional tessellation spacing option in example viewers since this mode is currently not supported From aa720922223f9804a44810fe93534abf22f52744 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Tue, 4 Aug 2015 14:19:35 -0700 Subject: [PATCH 36/59] Updated release notes --- documentation/release_notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index 50a995c6..1aca4be4 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -46,6 +46,7 @@ Release 3.0.1 is a minor release focused on stability and correctness. - Replaced topology initialization assertions with errors - Improved compatibility with ICC - Improved descriptive content and formatting of Far error messages + - Improved build when configured to include no GPU specific code **Bug Fixes** - Fixed handling of unconnected vertices to avoid out of bounds data access @@ -53,6 +54,7 @@ Release 3.0.1 is a minor release focused on stability and correctness. - Fixed Far::StencilTableFactory::Options::factorizeIntermediateLevels - Fixed Far::PatchTablesFactory::Options::generateAllLevels - Fixed the behavior of VTX_BOUNDARY_NONE for meshes with bilinear scheme + - Fixed some template method specializations which produced duplicate definitions - Disabled depth buffering when drawing the UI in the example viewers - Disabled the fractional tessellation spacing option in example viewers since this mode is currently not supported From 869c006b707884bad7a857d7c8941c7c363ee62f Mon Sep 17 00:00:00 2001 From: David G Yu Date: Tue, 4 Aug 2015 14:50:31 -0700 Subject: [PATCH 37/59] Release 3.0.1 --- opensubdiv/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensubdiv/version.h b/opensubdiv/version.h index 4788bb94..c04e83ec 100644 --- a/opensubdiv/version.h +++ b/opensubdiv/version.h @@ -25,7 +25,7 @@ #ifndef OPENSUBDIV3_VERSION_H #define OPENSUBDIV3_VERSION_H -#define OPENSUBDIV_VERSION v3_0_0 +#define OPENSUBDIV_VERSION v3_0_1 namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { From b1ab8e3f8b266e1d4aead30c1212530751d81e82 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Tue, 4 Aug 2015 17:30:24 -0700 Subject: [PATCH 38/59] Fixed single crease patch classification This fixes a regression in the function used to identify single crease patches. This also updates the patch color values used by the glImaging regression test to match the colors used in other example viewers so that patch types can be more easily identified during automated testing. --- examples/glImaging/glImaging.cpp | 2 + examples/glImaging/shader.glsl | 86 +++++++++++++++++++++++++++++++- opensubdiv/vtr/level.cpp | 4 +- 3 files changed, 89 insertions(+), 3 deletions(-) diff --git a/examples/glImaging/glImaging.cpp b/examples/glImaging/glImaging.cpp index 44782126..35da9e4a 100644 --- a/examples/glImaging/glImaging.cpp +++ b/examples/glImaging/glImaging.cpp @@ -115,6 +115,8 @@ public: ss << "#define OSD_ENABLE_PATCH_CULL\n"; ss << "#define GEOMETRY_OUT_LINE\n"; + ss << "#define OSD_PATCH_ENABLE_SINGLE_CREASE\n"; + // include osd PatchCommon ss << Osd::GLSLPatchShaderSource::GetCommonShaderSource(); std::string common = ss.str(); diff --git a/examples/glImaging/shader.glsl b/examples/glImaging/shader.glsl index 13718ccd..0cd1e598 100644 --- a/examples/glImaging/shader.glsl +++ b/examples/glImaging/shader.glsl @@ -280,6 +280,90 @@ out vec4 outColor; uniform vec4 diffuseColor = vec4(1); uniform vec4 ambientColor = vec4(1); +vec4 +getAdaptivePatchColor(ivec3 patchParam) +{ + const vec4 patchColors[7*6] = vec4[7*6]( + vec4(1.0f, 1.0f, 1.0f, 1.0f), // regular + vec4(0.0f, 1.0f, 1.0f, 1.0f), // regular pattern 0 + vec4(0.0f, 0.5f, 1.0f, 1.0f), // regular pattern 1 + vec4(0.0f, 0.5f, 0.5f, 1.0f), // regular pattern 2 + vec4(0.5f, 0.0f, 1.0f, 1.0f), // regular pattern 3 + vec4(1.0f, 0.5f, 1.0f, 1.0f), // regular pattern 4 + + vec4(1.0f, 0.5f, 0.5f, 1.0f), // single crease + vec4(1.0f, 0.70f, 0.6f, 1.0f), // single crease pattern 0 + vec4(1.0f, 0.65f, 0.6f, 1.0f), // single crease pattern 1 + vec4(1.0f, 0.60f, 0.6f, 1.0f), // single crease pattern 2 + vec4(1.0f, 0.55f, 0.6f, 1.0f), // single crease pattern 3 + vec4(1.0f, 0.50f, 0.6f, 1.0f), // single crease pattern 4 + + vec4(0.8f, 0.0f, 0.0f, 1.0f), // boundary + vec4(0.0f, 0.0f, 0.75f, 1.0f), // boundary pattern 0 + vec4(0.0f, 0.2f, 0.75f, 1.0f), // boundary pattern 1 + vec4(0.0f, 0.4f, 0.75f, 1.0f), // boundary pattern 2 + vec4(0.0f, 0.6f, 0.75f, 1.0f), // boundary pattern 3 + vec4(0.0f, 0.8f, 0.75f, 1.0f), // boundary pattern 4 + + vec4(0.0f, 1.0f, 0.0f, 1.0f), // corner + vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 0 + vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 1 + vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 2 + vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 3 + vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 4 + + vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory + vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory + vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory + vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory + vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory + vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory + + vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary + vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary + vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary + vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary + vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary + vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary + + vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis + vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis + vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis + vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis + vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis + vec4(1.0f, 0.7f, 0.3f, 1.0f) // gregory basis + ); + + int patchType = 0; + + int edgeCount = bitCount(OsdGetPatchBoundaryMask(patchParam)); + if (edgeCount == 1) { + patchType = 2; // BOUNDARY + } + if (edgeCount == 2) { + patchType = 3; // CORNER + } + +#if defined OSD_PATCH_ENABLE_SINGLE_CREASE + // check this after boundary/corner since single crease patch also has edgeCount. + float sharpness = OsdGetPatchSharpness(patchParam); + if (sharpness > 0) { + patchType = 1; + } +#elif defined OSD_PATCH_GREGORY + patchType = 4; +#elif defined OSD_PATCH_GREGORY_BOUNDARY + patchType = 5; +#elif defined OSD_PATCH_GREGORY_BASIS + patchType = 6; +#endif + + int pattern = bitCount(OsdGetPatchTransitionMask(patchParam)); + + return patchColors[6*patchType + pattern]; +} + + vec4 edgeColor(vec4 Cfill, vec4 edgeDistance) { @@ -316,7 +400,7 @@ main() #if defined(DISPLAY_MODE_VARYING) vec4 color = vec4(inpt.color, 1); #else - vec4 color = diffuseColor; + vec4 color = getAdaptivePatchColor(OsdGetPatchParam(OsdGetPatchIndex(gl_PrimitiveID))); #endif vec4 Cf = color * d; diff --git a/opensubdiv/vtr/level.cpp b/opensubdiv/vtr/level.cpp index 7b768e35..dab954d9 100644 --- a/opensubdiv/vtr/level.cpp +++ b/opensubdiv/vtr/level.cpp @@ -1305,8 +1305,8 @@ Level::isSingleCreasePatch(Index face, float *sharpnessOut, int *rotationOut) co } } // sharpnesses have to be [0, x, 0, x] or [x, 0, x, 0] - if (isSharpnessEqual(sharpnesses[0], sharpnesses[2]) or - isSharpnessEqual(sharpnesses[1], sharpnesses[3])) { + if (!isSharpnessEqual(sharpnesses[0], sharpnesses[2]) or + !isSharpnessEqual(sharpnesses[1], sharpnesses[3])) { return false; } } From b3a243221621c33259c50eb76d4d9c90e7a1858f Mon Sep 17 00:00:00 2001 From: David G Yu Date: Wed, 5 Aug 2015 12:41:50 -0700 Subject: [PATCH 39/59] Updated release notes --- documentation/release_notes.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index 1aca4be4..291558d6 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -31,6 +31,14 @@ ---- +Release 3.0.2 +============= + +Release 3.0.2 is a minor release for a specific fix. + +**Bug Fixes** + - Fixed drawing of single crease patches + Release 3.0.1 ============= From 6c437ae077e249485674332a9e9a84e31e1bada2 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Wed, 5 Aug 2015 18:21:20 -0700 Subject: [PATCH 40/59] Release 3.0.2 --- opensubdiv/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensubdiv/version.h b/opensubdiv/version.h index c04e83ec..f3e14bda 100644 --- a/opensubdiv/version.h +++ b/opensubdiv/version.h @@ -25,7 +25,7 @@ #ifndef OPENSUBDIV3_VERSION_H #define OPENSUBDIV3_VERSION_H -#define OPENSUBDIV_VERSION v3_0_1 +#define OPENSUBDIV_VERSION v3_0_2 namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { From 585858c1e45089a00ee4c6d2967da1cf486ae1f5 Mon Sep 17 00:00:00 2001 From: Mike Erwin Date: Fri, 7 Aug 2015 17:45:41 -0400 Subject: [PATCH 41/59] use WIN32_LEAN_AND_MEAN properly Misspelled W32_LEAN_AND_MEAN in osd/opengl.h had no effect on windows.h. Also added to example code wherever windows.h is included. --- examples/common/clDeviceContext.cpp | 1 + examples/common/cudaDeviceContext.cpp | 1 + opensubdiv/osd/opengl.h | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/common/clDeviceContext.cpp b/examples/common/clDeviceContext.cpp index 5cbd016b..2b0f6936 100644 --- a/examples/common/clDeviceContext.cpp +++ b/examples/common/clDeviceContext.cpp @@ -27,6 +27,7 @@ #include "clDeviceContext.h" #if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN #include #elif defined(__APPLE__) #include diff --git a/examples/common/cudaDeviceContext.cpp b/examples/common/cudaDeviceContext.cpp index ee0be938..c71f89d7 100644 --- a/examples/common/cudaDeviceContext.cpp +++ b/examples/common/cudaDeviceContext.cpp @@ -25,6 +25,7 @@ #include "cudaDeviceContext.h" #if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN #include #elif defined(__APPLE__) #include diff --git a/opensubdiv/osd/opengl.h b/opensubdiv/osd/opengl.h index 16693c6b..c9b73bde 100644 --- a/opensubdiv/osd/opengl.h +++ b/opensubdiv/osd/opengl.h @@ -40,7 +40,7 @@ #include #else #if defined(_WIN32) - #define W32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN #include #endif #if defined(OSD_USES_GLEW) From effe6a2ed60f9fedd081e0086cd0359b4bf8c65b Mon Sep 17 00:00:00 2001 From: George ElKoura Date: Mon, 24 Aug 2015 13:29:52 -0700 Subject: [PATCH 42/59] Fixed small bug in glFVarViewer for Loop. - Make sure to pass in the LOOP define to the shader when dealing with Loop surfaces. --- documentation/release_notes.rst | 6 ++++++ examples/glFVarViewer/glFVarViewer.cpp | 3 +++ 2 files changed, 9 insertions(+) diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index 291558d6..c0b65994 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -31,6 +31,12 @@ ---- +Release 3.0.3 +============= + +**Bug Fixes** + - Fixed bug in display of Loop surfaces in glFVarViewer. + Release 3.0.2 ============= diff --git a/examples/glFVarViewer/glFVarViewer.cpp b/examples/glFVarViewer/glFVarViewer.cpp index 1d01cc6f..4ea9e78e 100644 --- a/examples/glFVarViewer/glFVarViewer.cpp +++ b/examples/glFVarViewer/glFVarViewer.cpp @@ -501,6 +501,9 @@ public: if (type == Far::PatchDescriptor::QUADS) { ss << "#define PRIM_QUAD\n"; + } else if (type == Far::PatchDescriptor::TRIANGLES) { + ss << "#define PRIM_TRI\n"; + ss << "#define LOOP\n"; } else { ss << "#define PRIM_TRI\n"; } From b25c0dd7773f7d508cbada6e837c9560ef9a0726 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 10 Sep 2015 20:00:42 +0500 Subject: [PATCH 43/59] Fix GLSL program being deleted twice in GLSL Compute controller GLSL programs used by stencil and patch kernels were freed from both GLSL Compute Evaluator and from kernel classes themselves. --- opensubdiv/osd/glComputeEvaluator.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/opensubdiv/osd/glComputeEvaluator.cpp b/opensubdiv/osd/glComputeEvaluator.cpp index eb3c4ca2..ace3acbc 100644 --- a/opensubdiv/osd/glComputeEvaluator.cpp +++ b/opensubdiv/osd/glComputeEvaluator.cpp @@ -114,12 +114,6 @@ GLComputeEvaluator::GLComputeEvaluator() : _workGroupSize(64) { } GLComputeEvaluator::~GLComputeEvaluator() { - if (_stencilKernel.program) { - glDeleteProgram(_stencilKernel.program); - } - if (_patchKernel.program) { - glDeleteProgram(_patchKernel.program); - } } static GLuint From c1da218b54bde106ef999180b61aa706d9ddccde Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Thu, 10 Sep 2015 14:21:45 -0700 Subject: [PATCH 44/59] add a far performance test --- regression/CMakeLists.txt | 2 + regression/far_perf/CMakeLists.txt | 49 +++++++++ regression/far_perf/far_perf.cpp | 171 +++++++++++++++++++++++++++++ regression/far_perf/init_shapes.h | 48 ++++++++ 4 files changed, 270 insertions(+) create mode 100644 regression/far_perf/CMakeLists.txt create mode 100644 regression/far_perf/far_perf.cpp create mode 100644 regression/far_perf/init_shapes.h diff --git a/regression/CMakeLists.txt b/regression/CMakeLists.txt index 26149b87..0c1fb9d5 100644 --- a/regression/CMakeLists.txt +++ b/regression/CMakeLists.txt @@ -30,6 +30,8 @@ if (NOT NO_REGRESSION) add_subdirectory(far_regression) + add_subdirectory(far_perf) + if(OPENGL_FOUND AND (GLEW_FOUND OR APPLE) AND GLFW_FOUND) add_subdirectory(osd_regression) else() diff --git a/regression/far_perf/CMakeLists.txt b/regression/far_perf/CMakeLists.txt new file mode 100644 index 00000000..521192fc --- /dev/null +++ b/regression/far_perf/CMakeLists.txt @@ -0,0 +1,49 @@ +# +# Copyright 2015 Pixar +# +# Licensed under the Apache License, Version 2.0 (the "Apache License") +# with the following modification; you may not use this file except in +# compliance with the Apache License and the following modification to it: +# Section 6. Trademarks. is deleted and replaced with: +# +# 6. Trademarks. This License does not grant permission to use the trade +# names, trademarks, service marks, or product names of the Licensor +# and its affiliates, except as required to comply with Section 4(c) of +# the License and to reproduce the content of the NOTICE file. +# +# You may obtain a copy of the Apache License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the Apache License with the above modification is +# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the Apache License for the specific +# language governing permissions and limitations under the Apache License. +# + +include_directories( + "${OPENSUBDIV_INCLUDE_DIR}/" + "${PROJECT_SOURCE_DIR}/" +) + +set(SOURCE_FILES + far_perf.cpp +) + +set(PLATFORM_LIBRARIES + "${OSD_LINK_TARGET}" +) + +_add_executable(far_perf + ${SOURCE_FILES} + $ + $ + $ + $ +) + +install(TARGETS far_perf DESTINATION "${CMAKE_BINDIR_BASE}") + +add_test(far_perf ${EXECUTABLE_OUTPUT_PATH}/far_regression) + diff --git a/regression/far_perf/far_perf.cpp b/regression/far_perf/far_perf.cpp new file mode 100644 index 00000000..2371fe0a --- /dev/null +++ b/regression/far_perf/far_perf.cpp @@ -0,0 +1,171 @@ +// +// Copyright 2015 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + +#include +#include +#include +#include + +#include +#include +#include +#include "../../regression/common/far_utils.h" +// XXX: revisit the directory structure for examples/tests +#include "../../examples/common/stopwatch.h" + +#include "init_shapes.h" + +//------------------------------------------------------------------------------ +static void +doPerf(const Shape *shape, int maxlevel, int endCapType) +{ + using namespace OpenSubdiv; + + Sdc::SchemeType type = OpenSubdiv::Sdc::SCHEME_CATMARK; + + Sdc::Options sdcOptions; + sdcOptions.SetVtxBoundaryInterpolation(Sdc::Options::VTX_BOUNDARY_EDGE_ONLY); + + Stopwatch s; + + // ---------------------------------------------------------------------- + // Instantiate a FarTopologyRefiner from the descriptor and refine + s.Start(); + Far::TopologyRefiner * refiner = Far::TopologyRefinerFactory::Create( + *shape, Far::TopologyRefinerFactory::Options(type, sdcOptions)); + { + Far::TopologyRefiner::AdaptiveOptions options(maxlevel); + refiner->RefineAdaptive(options); + } + + s.Stop(); + double timeRefine = s.GetElapsed(); + + // ---------------------------------------------------------------------- + // Create stencil table + s.Start(); + Far::StencilTable const * vertexStencils = NULL; + { + Far::StencilTableFactory::Options options; + vertexStencils = Far::StencilTableFactory::Create(*refiner, options); + } + s.Stop(); + double timeCreateStencil = s.GetElapsed(); + + // ---------------------------------------------------------------------- + // Create patch table + s.Start(); + Far::PatchTable const * patchTable = NULL; + { + Far::PatchTableFactory::Options poptions(maxlevel); + poptions.SetEndCapType((Far::PatchTableFactory::Options::EndCapType)endCapType); + patchTable = Far::PatchTableFactory::Create(*refiner, poptions); + } + + s.Stop(); + double timeCreatePatch = s.GetElapsed(); + + // ---------------------------------------------------------------------- + // append local points to stencils + s.Start(); + { + if (Far::StencilTable const *vertexStencilsWithLocalPoints = + Far::StencilTableFactory::AppendLocalPointStencilTable( + *refiner, vertexStencils, + patchTable->GetLocalPointStencilTable())) { + delete vertexStencils; + vertexStencils = vertexStencilsWithLocalPoints; + } + } + s.Stop(); + double timeAppendStencil = s.GetElapsed(); + + // --------------------------------------------------------------------- + double timeTotal = s.GetTotalElapsed(); + + printf("TopologyRefiner::Refine %f %5.2f%%\n", + timeRefine, timeRefine/timeTotal*100); + printf("StencilTableFactory::Create %f %5.2f%%\n", + timeCreateStencil, timeCreateStencil/timeTotal*100); + printf("PatchTableFactory::Create %f %5.2f%%\n", + timeCreatePatch, timeCreatePatch/timeTotal*100); + printf("StencilTableFactory::Append %f %5.2f%%\n", + timeAppendStencil, timeAppendStencil/timeTotal*100); + printf("Total %f\n", timeTotal); +} + +//------------------------------------------------------------------------------ +int main(int argc, char **argv) +{ + using namespace OpenSubdiv; + + int maxlevel = 8; + std::string str; + int endCapType = Far::PatchTableFactory::Options::ENDCAP_GREGORY_BASIS; + + for (int i = 1; i < argc; ++i) { + if (strstr(argv[i], ".obj")) { + std::ifstream ifs(argv[i]); + if (ifs) { + std::stringstream ss; + ss << ifs.rdbuf(); + ifs.close(); + str = ss.str(); + g_shapes.push_back(ShapeDesc(argv[i], str.c_str(), kCatmark)); + } + } + else if (!strcmp(argv[i], "-l")) { + maxlevel = atoi(argv[++i]); + } + else if (!strcmp(argv[i], "-e")) { + const char *type = argv[++i]; + if (!strcmp(type, "bspline")) { + endCapType = Far::PatchTableFactory::Options::ENDCAP_BSPLINE_BASIS; + } else if (!strcmp(type, "gregory")) { + endCapType = Far::PatchTableFactory::Options::ENDCAP_GREGORY_BASIS; + } else { + printf("Unknown endcap type %s\n", type); + return 1; + } + } + } + + if (g_shapes.empty()) { + initShapes(); + } + + for (int i = 0; i < (int)g_shapes.size(); ++i) { + Shape const * shape = Shape::parseObj( + g_shapes[i].data.c_str(), + g_shapes[i].scheme, + g_shapes[i].isLeftHanded); + + for (int lv = 1; lv <= maxlevel; ++lv) { + printf("---- %s, level %d ----\n", g_shapes[i].name.c_str(), lv); + doPerf(shape, lv, endCapType); + } + } +} + +//------------------------------------------------------------------------------ diff --git a/regression/far_perf/init_shapes.h b/regression/far_perf/init_shapes.h new file mode 100644 index 00000000..40d37225 --- /dev/null +++ b/regression/far_perf/init_shapes.h @@ -0,0 +1,48 @@ +// +// Copyright 2013 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + +#include "../common/shape_utils.h" + +struct ShapeDesc { + + ShapeDesc(char const * iname, std::string const & idata, Scheme ischeme, + bool iisLeftHanded=false) : + name(iname), data(idata), scheme(ischeme), isLeftHanded(iisLeftHanded) { } + + std::string name, + data; + Scheme scheme; + bool isLeftHanded; +}; + +static std::vector g_shapes; + +#include "../shapes/all.h" + +//------------------------------------------------------------------------------ +static void initShapes() { + g_shapes.push_back( ShapeDesc("catmark_car", catmark_car, kCatmark ) ); + g_shapes.push_back( ShapeDesc("catmark_pole64", catmark_pole64, kCatmark ) ); +} +//------------------------------------------------------------------------------ From 0e91dcd177b20f95b6e02c35552385ef99140dce Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Fri, 11 Sep 2015 14:26:51 -0700 Subject: [PATCH 45/59] Optimize gregory basis endcap generation. - replace std::vector with vtr::StackBuffer in GregoryBasis::Point - remote getQuadOffsets call from ProtoBasis - rewrite some inefficient code in the endcap generation. Note that this is a temporary remedy for the performance issue in 3.0. We'll fix it again in the later release. --- .../far/endCapBSplineBasisPatchFactory.cpp | 61 +++--- .../far/endCapGregoryBasisPatchFactory.cpp | 9 + opensubdiv/far/gregoryBasis.cpp | 184 ++++++++---------- opensubdiv/far/gregoryBasis.h | 85 ++++---- 4 files changed, 184 insertions(+), 155 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index 72103194..95a66e33 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -51,6 +51,18 @@ namespace { EndCapBSplineBasisPatchFactory::EndCapBSplineBasisPatchFactory( TopologyRefiner const & refiner) : _refiner(&refiner), _numVertices(0), _numPatches(0) { + + // Sanity check: the mesh must be adaptively refined + assert(not refiner.IsUniform()); + + // Reserve the patch point stencils. Ideally topology refiner + // would have an API to return how many endcap patches will be required. + // Instead we conservatively estimate by the number of patches at the + // finest level. + int numMaxLevelFaces = refiner.GetLevel(refiner.GetMaxLevel()).GetNumFaces(); + + _vertexStencils.reserve(numMaxLevelFaces*20); + _varyingStencils.reserve(numMaxLevelFaces*20); } ConstIndexArray @@ -74,45 +86,50 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( // // Reorder gregory basis stencils into regular bezier GregoryBasis::ProtoBasis basis(*level, faceIndex, levelVertOffset, -1); - std::vector bezierCP; - bezierCP.reserve(16); - bezierCP.push_back(basis.P[0]); - bezierCP.push_back(basis.Ep[0]); - bezierCP.push_back(basis.Em[1]); - bezierCP.push_back(basis.P[1]); + GregoryBasis::Point const *bezierCP[16]; - bezierCP.push_back(basis.Em[0]); - bezierCP.push_back(basis.Fp[0]); // arbitrary - bezierCP.push_back(basis.Fp[1]); // arbitrary - bezierCP.push_back(basis.Ep[1]); + bezierCP[0] = &basis.P[0]; + bezierCP[1] = &basis.Ep[0]; + bezierCP[2] = &basis.Em[1]; + bezierCP[3] = &basis.P[1]; - bezierCP.push_back(basis.Ep[3]); - bezierCP.push_back(basis.Fp[3]); // arbitrary - bezierCP.push_back(basis.Fp[2]); // arbitrary - bezierCP.push_back(basis.Em[2]); + bezierCP[4] = &basis.Em[0]; + bezierCP[5] = &basis.Fp[0]; // arbitrary + bezierCP[6] = &basis.Fp[1]; // arbitrary + bezierCP[7] = &basis.Ep[1]; - bezierCP.push_back(basis.P[3]); - bezierCP.push_back(basis.Em[3]); - bezierCP.push_back(basis.Ep[2]); - bezierCP.push_back(basis.P[2]); + bezierCP[8] = &basis.Ep[3]; + bezierCP[9] = &basis.Fp[3]; // arbitrary + bezierCP[10] = &basis.Fp[2]; // arbitrary + bezierCP[11] = &basis.Em[2]; + + bezierCP[12] = &basis.P[3]; + bezierCP[13] = &basis.Em[3]; + bezierCP[14] = &basis.Ep[2]; + bezierCP[15] = &basis.P[2]; + + // all stencils should have the same capacity. + int stencilCapacity = basis.P[0].GetCapacity(); // Apply basis conversion from bezier to b-spline float Q[4][4] = {{ 6, -7, 2, 0}, { 0, 2, -1, 0}, { 0, -1, 2, 0}, { 0, 2, -7, 6} }; - std::vector H(16); + Vtr::internal::StackBuffer H(16); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { - for (int k = 0; k < 4; ++k) { - if (isWeightNonZero(Q[i][k])) H[i*4+j] += bezierCP[j+k*4] * Q[i][k]; + H[i*4+j].Clear(stencilCapacity); + for (int k = 0; k < 4; ++k) { + if (isWeightNonZero(Q[i][k])) + H[i*4+j] += (*bezierCP[j+k*4]) * Q[i][k]; } } } for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { - GregoryBasis::Point p; + GregoryBasis::Point p(stencilCapacity); for (int k = 0; k < 4; ++k) { if (isWeightNonZero(Q[j][k])) p += H[i*4+k] * Q[j][k]; } diff --git a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp index a884350a..1cae6856 100644 --- a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp @@ -47,6 +47,15 @@ EndCapGregoryBasisPatchFactory::EndCapGregoryBasisPatchFactory( // Sanity check: the mesh must be adaptively refined assert(not refiner.IsUniform()); + + // Reserve the patch point stencils. Ideally topology refiner + // would have an API to return how many endcap patches will be required. + // Instead we conservatively estimate by the number of patches at the + // finest level. + int numMaxLevelFaces = refiner.GetLevel(refiner.GetMaxLevel()).GetNumFaces(); + + _vertexStencils.reserve(numMaxLevelFaces*20); + _varyingStencils.reserve(numMaxLevelFaces*20); } // diff --git a/opensubdiv/far/gregoryBasis.cpp b/opensubdiv/far/gregoryBasis.cpp index 6ba50fc3..0527d7be 100644 --- a/opensubdiv/far/gregoryBasis.cpp +++ b/opensubdiv/far/gregoryBasis.cpp @@ -36,57 +36,6 @@ namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { namespace Far { -// Builds a table of local indices pairs for each vertex of the patch. -// -// o -// N0 | -// | .... -// | .... : Gregory patch -// o ------ o ------ o .... -// N1 V | .... M3 -// | ....... -// | ....... -// o ....... -// N2 -// -// [...] [N2 - N3] [...] -// -// Each value pair is composed of 2 index values in range [0-4[ pointing -// to the 2 neighbor vertices of the vertex 'V' belonging to the Gregory patch. -// Neighbor ordering is valence CCW and must match the winding of the 1-ring -// vertices. -// -static void -getQuadOffsets(Vtr::internal::Level const & level, Vtr::Index fIndex, - Vtr::Index offsets[], int fvarChannel=-1) { - - Far::ConstIndexArray fPoints = (fvarChannel<0) ? - level.getFaceVertices(fIndex) : - level.getFaceFVarValues(fIndex, fvarChannel); - assert(fPoints.size()==4); - - for (int i = 0; i < 4; ++i) { - - Vtr::Index vIndex = fPoints[i]; - Vtr::ConstIndexArray vFaces = level.getVertexFaces(vIndex), - vEdges = level.getVertexEdges(vIndex); - - int thisFaceInVFaces = -1; - for (int j = 0; j < vFaces.size(); ++j) { - if (fIndex == vFaces[j]) { - thisFaceInVFaces = j; - break; - } - } - assert(thisFaceInVFaces != -1); - - // we have to use the number of incident edges to modulo the local index - // because there could be 2 consecutive edges in the face belonging to - // the Gregory patch. - offsets[i*2+0] = thisFaceInVFaces; - offsets[i*2+1] = (thisFaceInVFaces + 1)%vEdges.size(); - } -} int GregoryBasis::ProtoBasis::GetNumElements() const { @@ -153,6 +102,8 @@ GregoryBasis::ProtoBasis::ProtoBasis( Vtr::internal::Level const & level, Index faceIndex, int levelVertOffset, int fvarChannel) { + // XXX: This function is subject to refactor in 3.1 + Vtr::ConstIndexArray facePoints = (fvarChannel<0) ? level.getFaceVertices(faceIndex) : level.getFaceFVarValues(faceIndex, fvarChannel); @@ -162,27 +113,50 @@ GregoryBasis::ProtoBasis::ProtoBasis( valences[4], zerothNeighbors[4]; - Vtr::internal::StackBuffer manifoldRing((maxvalence+2)*2); + Point e0[4], e1[4], org[4]; + + // XXX: a temporary hack for the performance issue + // ensure Point has a capacity for the neighborhood of + // 2 extraordinary verts + 2 regular verts + // worse case: n-valence verts at a corner of n-gon. + int stencilCapacity = + 4/*0-ring*/ + 2*(2*(maxvalence-2)/*1-ring around extraordinaries*/ + + 2/*1-ring around regulars, excluding shared ones*/); + + for (int i = 0; i < 4; ++i) { + P[i].Clear(stencilCapacity); + e0[i].Clear(stencilCapacity); + e1[i].Clear(stencilCapacity); + } + + Vtr::internal::StackBuffer manifoldRings[4]; + manifoldRings[0].SetSize(maxvalence*2); + manifoldRings[1].SetSize(maxvalence*2); + manifoldRings[2].SetSize(maxvalence*2); + manifoldRings[3].SetSize(maxvalence*2); Vtr::internal::StackBuffer f(maxvalence); Vtr::internal::StackBuffer r(maxvalence*4); - Point e0[4], e1[4], org[4]; + + // the first phase for (int vid=0; vid<4; ++vid) { - org[vid] = facePoints[vid]; + org[vid] = Point(facePoints[vid], 1.0f, stencilCapacity); + Point const &pos = org[vid]; + // save for varying stencils - V[vid] = facePoints[vid]; + V[vid] = Point(facePoints[vid], 1.0f, stencilCapacity); int ringSize = level.gatherQuadRegularRingAroundVertex( - facePoints[vid], manifoldRing, fvarChannel); + facePoints[vid], manifoldRings[vid], fvarChannel); int valence; if (ringSize & 1) { // boundary vertex - manifoldRing[ringSize] = manifoldRing[ringSize-1]; + manifoldRings[vid][ringSize] = manifoldRings[vid][ringSize-1]; ++ringSize; valence = -ringSize/2; } else { @@ -196,18 +170,16 @@ GregoryBasis::ProtoBasis::ProtoBasis( zerothNeighbor=0, ibefore=0; - Point pos(facePoints[vid]); - for (int i=0; i level.getVertexFaces(idx_neighbor).size()); @@ -232,17 +204,24 @@ GregoryBasis::ProtoBasis::ProtoBasis( } } - Point neighbor(idx_neighbor), - diagonal(idx_diagonal), - neighbor_p(idx_neighbor_p), - neighbor_m(idx_neighbor_m), - diagonal_m(idx_diagonal_m); + float d = float(ivalence)+5.0f; + f[i].Clear(4); + f[i].AddWithWeight(facePoints[vid], float(ivalence)/d); + f[i].AddWithWeight(idx_neighbor_p, 2.0f/d); + f[i].AddWithWeight(idx_neighbor, 2.0f/d); + f[i].AddWithWeight(idx_diagonal, 1.0f/d); - f[i] = (pos*float(ivalence) + (neighbor_p+neighbor)*2.0f + diagonal) / (float(ivalence)+5.0f); + if (i == 0) + P[vid] = f[i]; + else + P[vid] += f[i]; - P[vid] += f[i]; - - r[vid*maxvalence+i] = (neighbor_p-neighbor_m)/3.0f + (diagonal-diagonal_m)/6.0f; + int rid = vid * maxvalence + i; + r[rid].Clear(4); + r[rid].AddWithWeight(idx_neighbor_p, 1.0f/3.0f); + r[rid].AddWithWeight(idx_neighbor_m, -1.0f/3.0f); + r[rid].AddWithWeight(idx_diagonal, 1.0f/6.0f); + r[rid].AddWithWeight(idx_diagonal_m, -1.0f/6.0f); } P[vid] /= float(ivalence); @@ -265,8 +244,8 @@ GregoryBasis::ProtoBasis::ProtoBasis( if (valence<0) { - Point b0(boundaryEdgeNeighbors[0]), - b1(boundaryEdgeNeighbors[1]); + Point b0(boundaryEdgeNeighbors[0], 1.0f, stencilCapacity), + b1(boundaryEdgeNeighbors[1], 1.0f, stencilCapacity); if (ivalence>2) { P[vid] = (b0 + b1 + pos*4.0f)/6.0f; @@ -280,7 +259,7 @@ GregoryBasis::ProtoBasis::ProtoBasis( float alpha_0k = -((1.0f+2.0f*c)*sqrtf(1.0f+c))/((3.0f*k+c)*sqrtf(1.0f-c)); float beta_0 = s/(3.0f*k + c); - Point diagonal(manifoldRing[2*zerothNeighbor + 1]); + Point diagonal(manifoldRings[vid][2*zerothNeighbor + 1], 1.0f, stencilCapacity); e0[vid] = (b0 - b1)/6.0f; e1[vid] = pos*gamma + diagonal*beta_0 + (b0 + b1)*alpha_0k; @@ -292,11 +271,11 @@ GregoryBasis::ProtoBasis::ProtoBasis( float alpha = (4.0f*sinf((float(M_PI) * float(x))/k))/(3.0f*k+c), beta = (sinf((float(M_PI) * float(x))/k) + sinf((float(M_PI) * float(x+1))/k))/(3.0f*k+c); - Index idx_neighbor = manifoldRing[2*curri + 0], - idx_diagonal = manifoldRing[2*curri + 1]; + Index idx_neighbor = manifoldRings[vid][2*curri + 0], + idx_diagonal = manifoldRings[vid][2*curri + 1]; - Point p_neighbor(idx_neighbor), - p_diagonal(idx_diagonal); + Point p_neighbor(idx_neighbor, 1.0f, stencilCapacity), + p_diagonal(idx_diagonal, 1.0f, stencilCapacity); e1[vid] += p_neighbor*alpha + p_diagonal*beta; } @@ -304,25 +283,40 @@ GregoryBasis::ProtoBasis::ProtoBasis( } } - Index quadOffsets[8]; - getQuadOffsets(level, faceIndex, quadOffsets, fvarChannel); + // the second phase for (int vid=0; vid<4; ++vid) { - int n = abs(valences[vid]), - ivalence = n; + int n = abs(valences[vid]); + int ivalence = n; int ip = (vid+1)%4, im = (vid+3)%4, np = abs(valences[ip]), nm = abs(valences[im]); - Index start = quadOffsets[vid*2+0], - prev = quadOffsets[vid*2+1], - start_m = quadOffsets[im*2], - prev_p = quadOffsets[ip*2+1]; + Index start = -1, prev = -1, start_m = -1, prev_p = -1; + for (int i = 0; i < n; ++i) { + if (manifoldRings[vid][i*2] == facePoints[ip]) + start = i; + if (manifoldRings[vid][i*2] == facePoints[im]) + prev = i; + } + for (int i = 0; i < np; ++i) { + if (manifoldRings[ip][i*2] == facePoints[vid]) { + prev_p = i; + break; + } + } + for (int i = 0; i < nm; ++i) { + if (manifoldRings[im][i*2] == facePoints[vid]) { + start_m = i; + break; + } + } + assert(start != -1 && prev != -1 && start_m != -1 && prev_p != -1); - Point Em_ip, Ep_im; + Point Em_ip(stencilCapacity), Ep_im(stencilCapacity); if (valences[ip]<-2) { Index j = (np + prev_p - zerothNeighbors[ip]) % np; @@ -360,7 +354,6 @@ GregoryBasis::ProtoBasis::ProtoBasis( Em[vid] = P[vid] + e0[vid]*csf(n-3, 2*prev ) + e1[vid]*csf(n-3, 2*prev + 1); Fp[vid] = (P[vid]*csf(np-3,2) + Ep[vid]*s1 + Em_ip*s2 + rp[start])/3.0f; Fm[vid] = (P[vid]*csf(nm-3,2) + Em[vid]*s3 + Ep_im*s2 - rp[prev])/3.0f; - } else if (valences[vid] < -2) { Index jp = (ivalence + start - zerothNeighbors[vid]) % ivalence, @@ -429,16 +422,7 @@ GregoryBasis::CreateStencilTable(PointsVector const &stencils) { float * weights = &stencilTable->_weights[0]; for (int i = 0; i < nStencils; ++i) { - GregoryBasis::Point const &src = stencils[i]; - - int size = src.GetSize(); - memcpy(indices, src.GetIndices(), size*sizeof(Index)); - memcpy(weights, src.GetWeights(), size*sizeof(float)); - *sizes = size; - - indices += size; - weights += size; - ++sizes; + stencils[i].Copy(&sizes, &indices, &weights); } stencilTable->generateOffsets(); diff --git a/opensubdiv/far/gregoryBasis.h b/opensubdiv/far/gregoryBasis.h index deff764c..1b3cf04d 100644 --- a/opensubdiv/far/gregoryBasis.h +++ b/opensubdiv/far/gregoryBasis.h @@ -26,6 +26,7 @@ #define OPENSUBDIV3_FAR_GREGORY_BASIS_H #include "../vtr/level.h" +#include "../vtr/stackBuffer.h" #include "../far/types.h" #include "../far/stencilTable.h" #include @@ -79,22 +80,21 @@ public: // class Point { public: - static const int RESERVED_ENTRY_SIZE = 64; + static const int RESERVED_STENCIL_SIZE = 64; - Point() : _size(0) { - _indices.reserve(RESERVED_ENTRY_SIZE); - _weights.reserve(RESERVED_ENTRY_SIZE); + Point(int stencilCapacity=RESERVED_STENCIL_SIZE) : _size(0) { + _stencils.SetSize(stencilCapacity); } - Point(Vtr::Index idx, float weight = 1.0f) { - _indices.reserve(RESERVED_ENTRY_SIZE); - _weights.reserve(RESERVED_ENTRY_SIZE); + Point(Vtr::Index idx, float weight, int stencilCapacity) { + _stencils.SetSize(stencilCapacity); _size = 1; - _indices.push_back(idx); - _weights.push_back(weight); + _stencils[0].index = idx; + _stencils[0].weight = weight; } Point(Point const & other) { + _stencils.SetSize(other._stencils.GetSize()); *this = other; } @@ -102,40 +102,51 @@ public: return _size; } - Vtr::Index const * GetIndices() const { - return &_indices[0]; + int GetCapacity() const { + return _stencils.GetSize(); } - float const * GetWeights() const { - return &_weights[0]; + void Clear(int capacity) { + _size = 0; + if ((int)_stencils.GetSize() < capacity) { + _stencils.SetSize(capacity); + } + } + + void AddWithWeight(Vtr::Index idx, float weight) { + int loc = findIndex(idx); + _stencils[loc].weight += weight; } Point & operator = (Point const & other) { + Clear(other.GetCapacity()); _size = other._size; - _indices = other._indices; - _weights = other._weights; + assert(_size <= (int)_stencils.GetSize()); + for (int i = 0; i < _size; ++i) { + _stencils[i] = other._stencils[i]; + } return *this; } Point & operator += (Point const & other) { - for (int i=0; i _indices; - std::vector _weights; + + struct Stencil { + Vtr::Index index; + float weight; + }; + + Vtr::internal::StackBuffer _stencils; }; // From 5e96a9ba31f1b22a260dfac520c503750197b113 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Tue, 15 Sep 2015 09:11:41 -0700 Subject: [PATCH 46/59] GregoryBasis optimization. Replace arithmetic operators which uses a temporary object. --- .../far/endCapBSplineBasisPatchFactory.cpp | 11 +- opensubdiv/far/gregoryBasis.cpp | 163 ++++++++++++------ opensubdiv/far/gregoryBasis.h | 78 ++------- 3 files changed, 133 insertions(+), 119 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index 95a66e33..41f8ebe0 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -122,8 +122,9 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( for (int j = 0; j < 4; ++j) { H[i*4+j].Clear(stencilCapacity); for (int k = 0; k < 4; ++k) { - if (isWeightNonZero(Q[i][k])) - H[i*4+j] += (*bezierCP[j+k*4]) * Q[i][k]; + if (isWeightNonZero(Q[i][k])) { + H[i*4+j].AddWithWeight(*bezierCP[j+k*4], Q[i][k]); + } } } } @@ -131,12 +132,14 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( for (int j = 0; j < 4; ++j) { GregoryBasis::Point p(stencilCapacity); for (int k = 0; k < 4; ++k) { - if (isWeightNonZero(Q[j][k])) p += H[i*4+k] * Q[j][k]; + if (isWeightNonZero(Q[j][k])) { + p.AddWithWeight(H[i*4+k], Q[j][k]); + } } _vertexStencils.push_back(p); } } - + int varyingIndices[] = { 0, 0, 1, 1, 0, 0, 1, 1, 3, 3, 2, 2, diff --git a/opensubdiv/far/gregoryBasis.cpp b/opensubdiv/far/gregoryBasis.cpp index 0527d7be..a80dbfc5 100644 --- a/opensubdiv/far/gregoryBasis.cpp +++ b/opensubdiv/far/gregoryBasis.cpp @@ -113,41 +113,36 @@ GregoryBasis::ProtoBasis::ProtoBasis( valences[4], zerothNeighbors[4]; - Point e0[4], e1[4], org[4]; - // XXX: a temporary hack for the performance issue // ensure Point has a capacity for the neighborhood of // 2 extraordinary verts + 2 regular verts // worse case: n-valence verts at a corner of n-gon. int stencilCapacity = 4/*0-ring*/ + 2*(2*(maxvalence-2)/*1-ring around extraordinaries*/ - + 2/*1-ring around regulars, excluding shared ones*/); + + 2/*1-ring around regulars, excluding shared ones*/); + Point e0[4], e1[4]; for (int i = 0; i < 4; ++i) { P[i].Clear(stencilCapacity); e0[i].Clear(stencilCapacity); e1[i].Clear(stencilCapacity); + V[i].Clear(1); } - Vtr::internal::StackBuffer manifoldRings[4]; + Vtr::internal::StackBuffer manifoldRings[4]; manifoldRings[0].SetSize(maxvalence*2); manifoldRings[1].SetSize(maxvalence*2); manifoldRings[2].SetSize(maxvalence*2); manifoldRings[3].SetSize(maxvalence*2); - Vtr::internal::StackBuffer f(maxvalence); - Vtr::internal::StackBuffer r(maxvalence*4); - + Vtr::internal::StackBuffer f(maxvalence); + Vtr::internal::StackBuffer r(maxvalence*4); // the first phase for (int vid=0; vid<4; ++vid) { - - org[vid] = Point(facePoints[vid], 1.0f, stencilCapacity); - Point const &pos = org[vid]; - // save for varying stencils - V[vid] = Point(facePoints[vid], 1.0f, stencilCapacity); + V[vid].AddWithWeight(facePoints[vid], 1.0f); int ringSize = level.gatherQuadRegularRingAroundVertex( @@ -182,7 +177,7 @@ GregoryBasis::ProtoBasis::ProtoBasis( idx_diagonal_m = (manifoldRings[vid][2*im + 1]); bool boundaryNeighbor = (level.getVertexEdges(idx_neighbor).size() > - level.getVertexFaces(idx_neighbor).size()); + level.getVertexFaces(idx_neighbor).size()); if (fvarChannel>=0) { // XXXX manuelk need logic to check for boundary in fvar @@ -210,11 +205,7 @@ GregoryBasis::ProtoBasis::ProtoBasis( f[i].AddWithWeight(idx_neighbor_p, 2.0f/d); f[i].AddWithWeight(idx_neighbor, 2.0f/d); f[i].AddWithWeight(idx_diagonal, 1.0f/d); - - if (i == 0) - P[vid] = f[i]; - else - P[vid] += f[i]; + P[vid].AddWithWeight(f[i], 1.0f/float(ivalence)); int rid = vid * maxvalence + i; r[rid].Clear(4); @@ -224,8 +215,6 @@ GregoryBasis::ProtoBasis::ProtoBasis( r[rid].AddWithWeight(idx_diagonal_m, -1.0f/6.0f); } - P[vid] /= float(ivalence); - zerothNeighbors[vid] = zerothNeighbor; if (currentNeighbor == 1) { boundaryEdgeNeighbors[1] = boundaryEdgeNeighbors[0]; @@ -233,24 +222,27 @@ GregoryBasis::ProtoBasis::ProtoBasis( for (int i=0; i2) { - P[vid] = (b0 + b1 + pos*4.0f)/6.0f; + P[vid].AddWithWeight(boundaryEdgeNeighbors[0], 1.0f/6.0f); + P[vid].AddWithWeight(boundaryEdgeNeighbors[1], 1.0f/6.0f); + P[vid].AddWithWeight(facePoints[vid], 4.0f/6.0f); } else { - P[vid] = pos; + P[vid].AddWithWeight(facePoints[vid], 1.0f); } float k = float(float(ivalence) - 1.0f); //k is the number of faces float c = cosf(float(M_PI)/k); @@ -259,10 +251,17 @@ GregoryBasis::ProtoBasis::ProtoBasis( float alpha_0k = -((1.0f+2.0f*c)*sqrtf(1.0f+c))/((3.0f*k+c)*sqrtf(1.0f-c)); float beta_0 = s/(3.0f*k + c); - Point diagonal(manifoldRings[vid][2*zerothNeighbor + 1], 1.0f, stencilCapacity); + int idx_diagonal = manifoldRings[vid][2*zerothNeighbor + 1]; - e0[vid] = (b0 - b1)/6.0f; - e1[vid] = pos*gamma + diagonal*beta_0 + (b0 + b1)*alpha_0k; + e0[vid].Clear(stencilCapacity); + e0[vid].AddWithWeight(boundaryEdgeNeighbors[0], 1.0f/6.0f); + e0[vid].AddWithWeight(boundaryEdgeNeighbors[1], -1.0f/6.0f); + + e1[vid].Clear(stencilCapacity); + e1[vid].AddWithWeight(facePoints[vid], gamma); + e1[vid].AddWithWeight(idx_diagonal, beta_0); + e1[vid].AddWithWeight(boundaryEdgeNeighbors[0], alpha_0k); + e1[vid].AddWithWeight(boundaryEdgeNeighbors[1], alpha_0k); for (int x=1; x Date: Tue, 15 Sep 2015 20:14:04 -0700 Subject: [PATCH 47/59] BSpline endcap optimization. --- .../far/endCapBSplineBasisPatchFactory.cpp | 361 +++++++++++++++++- .../far/endCapBSplineBasisPatchFactory.h | 16 + 2 files changed, 370 insertions(+), 7 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index 41f8ebe0..e66f4575 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -67,10 +67,45 @@ EndCapBSplineBasisPatchFactory::EndCapBSplineBasisPatchFactory( ConstIndexArray EndCapBSplineBasisPatchFactory::GetPatchPoints( - Vtr::internal::Level const * level, Index faceIndex, - PatchTableFactory::PatchFaceTag const * /*levelPatchTags*/, + Vtr::internal::Level const * level, Index thisFace, + PatchTableFactory::PatchFaceTag const *levelPatchTags, int levelVertOffset) { + Vtr::ConstIndexArray facePoints = level->getFaceVertices(thisFace); + PatchTableFactory::PatchFaceTag patchTag = levelPatchTags[thisFace]; + // if it's boundary, fallback to use GregoryBasis + if (patchTag._boundaryCount > 0) { + return getPatchPointsFromGregoryBasis( + level, thisFace, facePoints, levelVertOffset); + } + + // there's a short-cut when the face contains only 1 extraordinary vertex. + // (we can achieve this by isolating 2 levels) + // look for the extraordinary vertex + int irregular = -1; + for (int i = 0; i < 4; ++i) { + int valence = level->getVertexFaces(facePoints[i]).size(); + if (valence != 4) { + if (irregular != -1) { + // more than one extraoridinary vertices. + // fallback to use GregoryBasis + return getPatchPointsFromGregoryBasis( + level, thisFace, facePoints, levelVertOffset); + } + irregular = i; + } + } + + // faster B-spline endcap generation + return getPatchPoints(level, thisFace, irregular, facePoints, + levelVertOffset); +} + +ConstIndexArray +EndCapBSplineBasisPatchFactory::getPatchPointsFromGregoryBasis( + Vtr::internal::Level const * level, Index thisFace, + ConstIndexArray facePoints, int levelVertOffset) { + // XXX: For now, always create new 16 indices for each patch. // we'll optimize later to share all regular control points with // other patches as well as to try to make extra ordinary verts watertight. @@ -80,13 +115,11 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( _patchPoints.push_back(_numVertices + offset); ++_numVertices; } - + GregoryBasis::ProtoBasis basis(*level, thisFace, levelVertOffset, -1); // XXX: temporary hack. we should traverse topology and find existing // vertices if available // // Reorder gregory basis stencils into regular bezier - GregoryBasis::ProtoBasis basis(*level, faceIndex, levelVertOffset, -1); - GregoryBasis::Point const *bezierCP[16]; bezierCP[0] = &basis.P[0]; @@ -139,15 +172,329 @@ EndCapBSplineBasisPatchFactory::GetPatchPoints( _vertexStencils.push_back(p); } } - int varyingIndices[] = { 0, 0, 1, 1, 0, 0, 1, 1, 3, 3, 2, 2, 3, 3, 2, 2,}; for (int i = 0; i < 16; ++i) { - _varyingStencils.push_back(basis.V[varyingIndices[i]]); + GregoryBasis::Point p(1); + p.AddWithWeight(facePoints[varyingIndices[i]] + levelVertOffset, 1.0f); + _varyingStencils.push_back(p); } + + ++_numPatches; + return ConstIndexArray(&_patchPoints[(_numPatches-1)*16], 16); +} + +void +EndCapBSplineBasisPatchFactory::computeLimitStencils( + Vtr::internal::Level const *level, + ConstIndexArray facePoints, int vid, + GregoryBasis::Point *P, GregoryBasis::Point *Ep, GregoryBasis::Point *Em) +{ + int maxvalence = level->getMaxValence(); + + Vtr::internal::StackBuffer manifoldRing; + manifoldRing.SetSize(maxvalence*2); + + int ringSize = + level->gatherQuadRegularRingAroundVertex( + facePoints[vid], manifoldRing, /*fvarChannel*/-1); + + // note: this function has not yet supported boundary. + assert((ringSize & 1) == 0); + int valence = ringSize/2; + int stencilCapacity = ringSize + 1; + + Index start = -1, prev = -1; + { + int ip = (vid+1)%4, im = (vid+3)%4; + for (int i = 0; i < valence; ++i) { + if (manifoldRing[i*2] == facePoints[ip]) + start = i; + if (manifoldRing[i*2] == facePoints[im]) + prev = i; + } + } + assert(start > -1 && prev > -1); + + GregoryBasis::Point e0, e1; + e0.Clear(stencilCapacity); + e1.Clear(stencilCapacity); + + float t = 2.0f * float(M_PI) / float(valence); + float ef = 1.0f / (valence * (cosf(t) + 5.0f + + sqrtf((cosf(t) + 9) * (cosf(t) + 1)))/16.0f); + + for (int i = 0; i < valence; ++i) { + Index ip = (i+1)%valence; + Index idx_neighbor = (manifoldRing[2*i + 0]), + idx_diagonal = (manifoldRing[2*i + 1]), + idx_neighbor_p = (manifoldRing[2*ip + 0]); + + float d = float(valence)+5.0f; + + GregoryBasis::Point f(4); + f.AddWithWeight(facePoints[vid], float(valence)/d); + f.AddWithWeight(idx_neighbor_p, 2.0f/d); + f.AddWithWeight(idx_neighbor, 2.0f/d); + f.AddWithWeight(idx_diagonal, 1.0f/d); + + P->AddWithWeight(f, 1.0f/float(valence)); + + float c0 = 0.5*cosf((float(2*M_PI) * float(i)/float(valence))) + + 0.5*cosf((float(2*M_PI) * float(ip)/float(valence))); + float c1 = 0.5*sinf((float(2*M_PI) * float(i)/float(valence))) + + 0.5*sinf((float(2*M_PI) * float(ip)/float(valence))); + e0.AddWithWeight(f, c0*ef); + e1.AddWithWeight(f, c1*ef); + } + + *Ep = *P; + Ep->AddWithWeight(e0, cosf((float(2*M_PI) * float(start)/float(valence)))); + Ep->AddWithWeight(e1, sinf((float(2*M_PI) * float(start)/float(valence)))); + + *Em = *P; + Em->AddWithWeight(e0, cosf((float(2*M_PI) * float(prev)/float(valence)))); + Em->AddWithWeight(e1, sinf((float(2*M_PI) * float(prev)/float(valence)))); +} + +ConstIndexArray +EndCapBSplineBasisPatchFactory::getPatchPoints( + Vtr::internal::Level const *level, Index thisFace, + Index extraOrdinaryIndex, ConstIndexArray facePoints, + int levelVertOffset) { + + // Fast B-spline endcap construction. + // + // This function assumes the patch is not on boundary + // and it contains only 1 extraordinary vertex. + // The location of the extraoridnary vertex can be one of + // 0-ring quad corner. + // + // B-Spline control point gathering indice + // + // [5] (4)---(15)--(14) 0 : extraoridnary vertex + // | | | + // | | | 1,2,3,9,10,11,12,13 : + // (6)----0-----3-----13 B-Spline control points, gathered by + // | | | | traversing topology + // | | | | + // (7)----1-----2-----12 (5) : + // | | | | Fitted patch point (from limit position) + // | | | | + // (8)----9-----10----11 (4),(6),(7),(8),(14),(15) : + // Fitted patch points + // (from limit tangents and bezier CP) + // + static int const rotation[4][16] = { + /*= 0 ring =*/ /* ================ 1 ring ================== */ + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ,14, 15}, + { 1, 2, 3, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4, 5, 6}, + { 2, 3, 0, 1, 10, 11, 12, 13, 14, 15, 4, 5, 6, 7, 8, 9}, + { 3, 0, 1, 2, 13, 14, 15, 4, 5, 6, 7, 8, 9, 10, 11, 12}}; + + int maxvalence = level->getMaxValence(); + int stencilCapacity = 2*maxvalence + 16; + GregoryBasis::Point P(stencilCapacity), Em(stencilCapacity), Ep(stencilCapacity); + + computeLimitStencils(level, facePoints, extraOrdinaryIndex, &P, &Em, &Ep); + P.OffsetIndices(levelVertOffset); + Em.OffsetIndices(levelVertOffset); + Ep.OffsetIndices(levelVertOffset); + + // returning patch indices (a mix of cage vertices and patch points) + int patchPoints[16]; + + // first, we traverse the topology to gather 15 vertices. This process is + // similar to Vtr::Level::gatherQuadRegularInteriorPatchPoints + int pointIndex = 0; + int vid = extraOrdinaryIndex; + + // 0-ring + patchPoints[pointIndex++] = facePoints[0] + levelVertOffset; + patchPoints[pointIndex++] = facePoints[1] + levelVertOffset; + patchPoints[pointIndex++] = facePoints[2] + levelVertOffset; + patchPoints[pointIndex++] = facePoints[3] + levelVertOffset; + + // 1-ring + ConstIndexArray thisFaceVerts = level->getFaceVertices(thisFace); + for (int i = 0; i < 4; ++i) { + Index v = thisFaceVerts[i]; + ConstIndexArray vFaces = level->getVertexFaces(v); + ConstLocalIndexArray vInFaces = level->getVertexFaceLocalIndices(v); + + if (i != vid) { + // regular corner + int thisFaceInVFaces = vFaces.FindIndexIn4Tuple(thisFace); + + int intFaceInVFaces = (thisFaceInVFaces + 2) & 0x3; + Index intFace = vFaces[intFaceInVFaces]; + int vInIntFace = vInFaces[intFaceInVFaces]; + ConstIndexArray facePoints = level->getFaceVertices(intFace); + + patchPoints[pointIndex++] = + facePoints[(vInIntFace + 1)&3] + levelVertOffset; + patchPoints[pointIndex++] = + facePoints[(vInIntFace + 2)&3] + levelVertOffset; + patchPoints[pointIndex++] = + facePoints[(vInIntFace + 3)&3] + levelVertOffset; + } else { + // irregular corner + int thisFaceInVFaces = vFaces.FindIndex(thisFace); + int valence = vFaces.size(); + { + // first + int intFaceInVFaces = (thisFaceInVFaces + 1) % valence; + Index intFace = vFaces[intFaceInVFaces]; + int vInIntFace = vInFaces[intFaceInVFaces]; + ConstIndexArray facePoints = level->getFaceVertices(intFace); + patchPoints[pointIndex++] = + facePoints[(vInIntFace+3)&3] + levelVertOffset; + } + { + // middle: (n-vertices) needs a limit stencil. skip for now + pointIndex++; + } + { + // end + int intFaceInVFaces = (thisFaceInVFaces + (valence-1)) %valence; + Index intFace = vFaces[intFaceInVFaces]; + int vInIntFace = vInFaces[intFaceInVFaces]; + ConstIndexArray facePoints = level->getFaceVertices(intFace); + patchPoints[pointIndex++] = + facePoints[(vInIntFace+1)&3] + levelVertOffset; + + } + } + } + + // stencils for patch points + GregoryBasis::Point X5(stencilCapacity), + X6(stencilCapacity), + X7(stencilCapacity), + X8(stencilCapacity), + X4(stencilCapacity), + X15(stencilCapacity), + X14(stencilCapacity); + + // limit tangent : Em + // X6 = 1/3 * ( 36Em - 16P0 - 8P1 - 2P2 - 4P3 - P6 - 2P7) + // X7 = 1/3 * (-18Em + 8P0 + 4P1 + P2 + 2P3 + 2P6 + 4P7) + // X8 = X6 + (P8-P6) + X6.AddWithWeight(Em, 36.0f/3.0f); + X6.AddWithWeight(patchPoints[rotation[vid][0]], -16.0f/3.0f); + X6.AddWithWeight(patchPoints[rotation[vid][1]], -8.0f/3.0f); + X6.AddWithWeight(patchPoints[rotation[vid][2]], -2.0f/3.0f); + X6.AddWithWeight(patchPoints[rotation[vid][3]], -4.0f/3.0f); + X6.AddWithWeight(patchPoints[rotation[vid][6]], -1.0f/3.0f); + X6.AddWithWeight(patchPoints[rotation[vid][7]], -2.0f/3.0f); + + X7.AddWithWeight(Em, -18.0f/3.0f); + X7.AddWithWeight(patchPoints[rotation[vid][0]], 8.0f/3.0f); + X7.AddWithWeight(patchPoints[rotation[vid][1]], 4.0f/3.0f); + X7.AddWithWeight(patchPoints[rotation[vid][2]], 1.0f/3.0f); + X7.AddWithWeight(patchPoints[rotation[vid][3]], 2.0f/3.0f); + X7.AddWithWeight(patchPoints[rotation[vid][6]], 2.0f/3.0f); + X7.AddWithWeight(patchPoints[rotation[vid][7]], 4.0f/3.0f); + + X8 = X6; + X8.AddWithWeight(patchPoints[rotation[vid][8]], 1.0f); + X8.AddWithWeight(patchPoints[rotation[vid][6]], -1.0f); + + // limit tangent : Ep + // X4 = 1/3 * ( 36EP - 16P0 - 4P1 - 2P15 - 2P2 - 8P3 - P4) + // X15 = 1/3 * (-18EP + 8P0 + 2P1 + 4P15 + P2 + 4P3 + 2P4) + // X14 = X4 + (P14 - P4) + X4.AddWithWeight(Ep, 36.0f/3.0f); + X4.AddWithWeight(patchPoints[rotation[vid][0]], -16.0f/3.0f); + X4.AddWithWeight(patchPoints[rotation[vid][1]], -4.0f/3.0f); + X4.AddWithWeight(patchPoints[rotation[vid][2]], -2.0f/3.0f); + X4.AddWithWeight(patchPoints[rotation[vid][3]], -8.0f/3.0f); + X4.AddWithWeight(patchPoints[rotation[vid][4]], -1.0f/3.0f); + X4.AddWithWeight(patchPoints[rotation[vid][15]], -2.0f/3.0f); + + X15.AddWithWeight(Ep, -18.0f/3.0f); + X15.AddWithWeight(patchPoints[rotation[vid][0]], 8.0f/3.0f); + X15.AddWithWeight(patchPoints[rotation[vid][1]], 2.0f/3.0f); + X15.AddWithWeight(patchPoints[rotation[vid][2]], 1.0f/3.0f); + X15.AddWithWeight(patchPoints[rotation[vid][3]], 4.0f/3.0f); + X15.AddWithWeight(patchPoints[rotation[vid][4]], 2.0f/3.0f); + X15.AddWithWeight(patchPoints[rotation[vid][15]], 4.0f/3.0f); + + X14 = X4; + X14.AddWithWeight(patchPoints[rotation[vid][14]], 1.0f); + X14.AddWithWeight(patchPoints[rotation[vid][4]], -1.0f); + + // limit corner (16th free vert) + // X5 = 36LP - 16P0 - 4(P1 + P3 + P4 + P6) - (P2 + P7 + P15) + X5.AddWithWeight(P, 36.0f); + X5.AddWithWeight(patchPoints[rotation[vid][0]], -16.0f); + X5.AddWithWeight(patchPoints[rotation[vid][1]], -4.0f); + X5.AddWithWeight(patchPoints[rotation[vid][3]], -4.0f); + X5.AddWithWeight(X4, -4.0f); + X5.AddWithWeight(X6, -4.0f); + X5.AddWithWeight(patchPoints[rotation[vid][2]], -1.0f); + X5.AddWithWeight(X7, -1.0f); + X5.AddWithWeight(X15, -1.0f); + + // [5] (4)---(15)--(14) 0 : extraoridnary vertex + // | | | + // | | | 1,2,3,9,10,11,12,13 : + // (6)----0-----3-----13 B-Spline control points, gathered by + // | | | | traversing topology + // | | | | + // (7)----1-----2-----12 (5) : + // | | | | Fitted patch point (from limit position) + // | | | | + // (8)----9-----10----11 (4),(6),(7),(8),(14),(15) : + // + // patch point stencils will be stored in this order + // (Em) 6, 7, 8, (Ep) 4, 15, 14, (P) 5 + + int offset = _refiner->GetNumVerticesTotal(); + + GregoryBasis::Point V0, V1, V3; + V0.AddWithWeight(facePoints[vid] + levelVertOffset, 1.0f); + V1.AddWithWeight(facePoints[(vid+1)&3] + levelVertOffset, 1.0f); + V3.AddWithWeight(facePoints[(vid+3)&3] + levelVertOffset, 1.0f); + + // push back to stencils; + patchPoints[3* vid + 6] = (_numVertices++) + offset; + _vertexStencils.push_back(X6); + _varyingStencils.push_back(V0); + + patchPoints[3*((vid+1)%4) + 4] = (_numVertices++) + offset; + _vertexStencils.push_back(X7); + _varyingStencils.push_back(V1); + + patchPoints[3*((vid+1)%4) + 5] = (_numVertices++) + offset; + _vertexStencils.push_back(X8); + _varyingStencils.push_back(V1); + + patchPoints[3* vid + 4] = (_numVertices++) + offset; + _vertexStencils.push_back(X4); + _varyingStencils.push_back(V0); + + patchPoints[3*((vid+3)%4) + 6] = (_numVertices++) + offset; + _vertexStencils.push_back(X15); + _varyingStencils.push_back(V3); + + patchPoints[3*((vid+3)%4) + 5] = (_numVertices++) + offset; + _vertexStencils.push_back(X14); + _varyingStencils.push_back(V3); + + patchPoints[3*vid + 5] = (_numVertices++) + offset; + _vertexStencils.push_back(X5); + _varyingStencils.push_back(V0); + + // reorder into UV row-column + static int const permuteRegular[16] = + { 5, 6, 7, 8, 4, 0, 1, 9, 15, 3, 2, 10, 14, 13, 12, 11 }; + for (int i = 0; i < 16; ++i) { + _patchPoints.push_back(patchPoints[permuteRegular[i]]); + } ++_numPatches; return ConstIndexArray(&_patchPoints[(_numPatches-1)*16], 16); } diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.h b/opensubdiv/far/endCapBSplineBasisPatchFactory.h index 9f54a190..28c27160 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.h +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.h @@ -91,6 +91,22 @@ public: } private: + ConstIndexArray getPatchPointsFromGregoryBasis( + Vtr::internal::Level const * level, Index thisFace, + ConstIndexArray facePoints, + int levelVertOffset); + + ConstIndexArray getPatchPoints( + Vtr::internal::Level const *level, Index thisFace, + Index extraOrdinaryIndex, ConstIndexArray facePoints, + int levelVertOffset); + + void computeLimitStencils( + Vtr::internal::Level const *level, + ConstIndexArray facePoints, int vid, + GregoryBasis::Point *P, GregoryBasis::Point *Ep, GregoryBasis::Point *Em); + + TopologyRefiner const *_refiner; GregoryBasis::PointsVector _vertexStencils; GregoryBasis::PointsVector _varyingStencils; From 97c5e1f23d14c70edda432ebe8ab9695ab3f0a73 Mon Sep 17 00:00:00 2001 From: Pol Date: Wed, 16 Sep 2015 15:50:55 -0700 Subject: [PATCH 48/59] Added "tutorial_8" that shows how to calculate smooth normals for uniform subdivision. --- tutorials/far/CMakeLists.txt | 1 + tutorials/far/tutorial_8/CMakeLists.txt | 37 ++ tutorials/far/tutorial_8/far_tutorial_8.cpp | 406 ++++++++++++++++++++ 3 files changed, 444 insertions(+) create mode 100644 tutorials/far/tutorial_8/CMakeLists.txt create mode 100644 tutorials/far/tutorial_8/far_tutorial_8.cpp diff --git a/tutorials/far/CMakeLists.txt b/tutorials/far/CMakeLists.txt index 02f685d4..0d30c983 100644 --- a/tutorials/far/CMakeLists.txt +++ b/tutorials/far/CMakeLists.txt @@ -31,6 +31,7 @@ set(TUTORIALS tutorial_5 tutorial_6 tutorial_7 + tutorial_8 ) foreach(tutorial ${TUTORIALS}) diff --git a/tutorials/far/tutorial_8/CMakeLists.txt b/tutorials/far/tutorial_8/CMakeLists.txt new file mode 100644 index 00000000..c52f1622 --- /dev/null +++ b/tutorials/far/tutorial_8/CMakeLists.txt @@ -0,0 +1,37 @@ +# +# Copyright 2013 Pixar +# +# Licensed under the Apache License, Version 2.0 (the "Apache License") +# with the following modification; you may not use this file except in +# compliance with the Apache License and the following modification to it: +# Section 6. Trademarks. is deleted and replaced with: +# +# 6. Trademarks. This License does not grant permission to use the trade +# names, trademarks, service marks, or product names of the Licensor +# and its affiliates, except as required to comply with Section 4(c) of +# the License and to reproduce the content of the NOTICE file. +# +# You may obtain a copy of the Apache License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the Apache License with the above modification is +# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the Apache License for the specific +# language governing permissions and limitations under the Apache License. +# + +set(SOURCE_FILES + far_tutorial_8.cpp +) + +_add_executable(far_tutorial_8 + ${SOURCE_FILES} + $ + $ + $ +) + +install(TARGETS far_tutorial_8 DESTINATION "${CMAKE_BINDIR_BASE}/tutorials") + diff --git a/tutorials/far/tutorial_8/far_tutorial_8.cpp b/tutorials/far/tutorial_8/far_tutorial_8.cpp new file mode 100644 index 00000000..deb1be1a --- /dev/null +++ b/tutorials/far/tutorial_8/far_tutorial_8.cpp @@ -0,0 +1,406 @@ +// +// Copyright 2013 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + + +//------------------------------------------------------------------------------ +// Tutorial description: +// +// Building on tutorial 0, this example shows how to instantiate a simple mesh, +// refine it uniformly and then interpolate both 'vertex' and 'face-varying' +// primvar data. +// The resulting interpolated data is output as an 'obj' file, with the +// 'face-varying' data recorded in the uv texture layout. +// + +#include +#include + +#include + +//------------------------------------------------------------------------------ +// Face-varying implementation. +// +// +struct Vertex { + + // Minimal required interface ---------------------- + Vertex() { + Clear(); + } + + Vertex(Vertex const & src) { + position[0] = src.position[0]; + position[1] = src.position[1]; + position[2] = src.position[2]; + } + + void Clear() { + position[0]=position[1]=position[2]=0.0f; + } + + void AddWithWeight(Vertex const & src, float weight) { + position[0]+=weight*src.position[0]; + position[1]+=weight*src.position[1]; + position[2]+=weight*src.position[2]; + } + + // Public interface ------------------------------------ + void SetPosition(float x, float y, float z) { + position[0]=x; + position[1]=y; + position[2]=z; + } + + const float * GetPosition() const { + return position; + } + + float position[3]; +}; + +//------------------------------------------------------------------------------ +// Face-varying container implementation. +// +// We are using a uv texture layout as a 'face-varying' primtiive variable +// attribute. Because face-varying data is specified 'per-face-per-vertex', +// we cannot use the same container that we use for 'vertex' or 'varying' +// data. We specify a new container, which only carries (u,v) coordinates. +// Similarly to our 'Vertex' container, we add a minimaliztic interpolation +// interface with a 'Clear()' and 'AddWithWeight()' methods. +// +struct FVarVertexUV { + + // Minimal required interface ---------------------- + void Clear() { + u=v=0.0f; + } + + void AddWithWeight(FVarVertexUV const & src, float weight) { + u += weight * src.u; + v += weight * src.v; + } + + // Basic 'uv' layout channel + float u,v; +}; + +struct FVarVertexColor { + + // Minimal required interface ---------------------- + void Clear() { + r=g=b=a=0.0f; + } + + void AddWithWeight(FVarVertexColor const & src, float weight) { + r += weight * src.r; + g += weight * src.g; + b += weight * src.b; + a += weight * src.a; + } + + // Basic 'color' layout channel + float r,g,b,a; +}; + +//------------------------------------------------------------------------------ +// Cube geometry from catmark_cube.h + + +// 'vertex' primitive variable data & topology +static float g_verts[8][3] = {{ -0.5f, -0.5f, 0.5f }, + { 0.5f, -0.5f, 0.5f }, + { -0.5f, 0.5f, 0.5f }, + { 0.5f, 0.5f, 0.5f }, + { -0.5f, 0.5f, -0.5f }, + { 0.5f, 0.5f, -0.5f }, + { -0.5f, -0.5f, -0.5f }, + { 0.5f, -0.5f, -0.5f }}; +static int g_nverts = 8, + g_nfaces = 6; + +static int g_vertsperface[6] = { 4, 4, 4, 4, 4, 4 }; + +static int g_vertIndices[24] = { 0, 1, 3, 2, + 2, 3, 5, 4, + 4, 5, 7, 6, + 6, 7, 1, 0, + 1, 7, 5, 3, + 6, 0, 2, 4 }; + +// 'face-varying' primitive variable data & topology for UVs +static float g_uvs[14][2] = {{ 0.375, 0.00 }, + { 0.625, 0.00 }, + { 0.375, 0.25 }, + { 0.625, 0.25 }, + { 0.375, 0.50 }, + { 0.625, 0.50 }, + { 0.375, 0.75 }, + { 0.625, 0.75 }, + { 0.375, 1.00 }, + { 0.625, 1.00 }, + { 0.875, 0.00 }, + { 0.875, 0.25 }, + { 0.125, 0.00 }, + { 0.125, 0.25 }}; + +static int g_nuvs = 14; + +static int g_uvIndices[24] = { 0, 1, 3, 2, + 2, 3, 5, 4, + 4, 5, 7, 6, + 6, 7, 9, 8, + 1, 10, 11, 3, + 12, 0, 2, 13 }; + +// 'face-varying' primitive variable data & topology for color +static float g_colors[24][4] = {{1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0, 1.0}}; + +static int g_ncolors = 24; + +static int g_colorIndices[24] = { 0, 3, 9, 6, + 7, 10, 15, 12, + 13, 16, 21, 18, + 19, 22, 4, 1, + 5, 23, 17, 11, + 20, 2, 8, 14 }; + +using namespace OpenSubdiv; + +inline void +normalize(float *n) { + float rn = 1.0f/sqrtf(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]); + n[0] *= rn; + n[1] *= rn; + n[2] *= rn; +} + +inline void +cross(float *n, const float *p0, const float *p1, const float *p2) { + float a[3] = { p1[0]-p0[0], p1[1]-p0[1], p1[2]-p0[2] }; + float b[3] = { p2[0]-p0[0], p2[1]-p0[1], p2[2]-p0[2] }; + + n[0] = a[1]*b[2]-a[2]*b[1]; + n[1] = a[2]*b[0]-a[0]*b[2]; + n[2] = a[0]*b[1]-a[1]*b[0]; +} + +//------------------------------------------------------------------------------ +int main(int, char **) { + + int maxlevel = 2; + + typedef Far::TopologyDescriptor Descriptor; + + Sdc::SchemeType type = OpenSubdiv::Sdc::SCHEME_CATMARK; + + Sdc::Options options; + options.SetVtxBoundaryInterpolation(Sdc::Options::VTX_BOUNDARY_EDGE_ONLY); + options.SetFVarLinearInterpolation(Sdc::Options::FVAR_LINEAR_NONE); + + // Populate a topology descriptor with our raw data + Descriptor desc; + desc.numVertices = g_nverts; + desc.numFaces = g_nfaces; + desc.numVertsPerFace = g_vertsperface; + desc.vertIndicesPerFace = g_vertIndices; + + const int numChannels = 2; + const int channelUV = 0; + const int channelColor = 1; + + // Create a face-varying channel descriptor + Descriptor::FVarChannel channels[numChannels]; + channels[channelUV].numValues = g_nuvs; + channels[channelUV].valueIndices = g_uvIndices; + channels[channelColor].numValues = g_ncolors; + channels[channelColor].valueIndices = g_colorIndices; + + // Add the channel topology to the main descriptor + desc.numFVarChannels = numChannels; + desc.fvarChannels = channels; + + // Instantiate a FarTopologyRefiner from the descriptor + Far::TopologyRefiner * refiner = + Far::TopologyRefinerFactory::Create(desc, + Far::TopologyRefinerFactory::Options(type, options)); + + // Uniformly refine the topolgy up to 'maxlevel' + // note: fullTopologyInLastLevel must be true to work with face-varying data + { + Far::TopologyRefiner::UniformOptions refineOptions(maxlevel); + refineOptions.fullTopologyInLastLevel = true; + refiner->RefineUniform(refineOptions); + } + + // Allocate and initialize the 'vertex' primvar data (see tutorial 2 for + // more details). + std::vector vbuffer(refiner->GetNumVerticesTotal()); + Vertex * verts = &vbuffer[0]; + for (int i=0; i fvBufferUV(refiner->GetNumFVarValuesTotal(channelUV)); + FVarVertexUV * fvVertsUV = &fvBufferUV[0]; + for (int i=0; i fvBufferColor(refiner->GetNumFVarValuesTotal(channelColor)); + FVarVertexColor * fvVertsColor = &fvBufferColor[0]; + for (int i=0; iGetLevel(level-1).GetNumVertices(); + FVarVertexUV * dstFVarUV = srcFVarUV + refiner->GetLevel(level-1).GetNumFVarValues(channelUV); + FVarVertexColor * dstFVarColor = srcFVarColor + refiner->GetLevel(level-1).GetNumFVarValues(channelColor); + + primvarRefiner.Interpolate(level, srcVert, dstVert); + primvarRefiner.InterpolateFaceVarying(level, srcFVarUV, dstFVarUV, channelUV); + primvarRefiner.InterpolateFaceVarying(level, srcFVarColor, dstFVarColor, channelColor); + + srcVert = dstVert; + srcFVarUV = dstFVarUV; + srcFVarColor = dstFVarColor; + } + + // Since the vertices are now interpolated, we can calculate smooth normals. + // In this example we will only calculate smooth normals for the last level + // of subdivision + Far::TopologyLevel const & refLastLevel = refiner->GetLevel(maxlevel); + int nverts = refLastLevel.GetNumVertices(); + int nfaces = refLastLevel.GetNumFaces(); + int firstOfLastVerts = refiner->GetNumVerticesTotal() - nverts; + + std::vector normals(nverts); + for (int f = 0; f < nfaces; f++) { + + Far::ConstIndexArray faceVertices = refLastLevel.GetFaceVertices(f); + + // We will use the first three verts to calculate a normal + const float * v0 = verts[ firstOfLastVerts + faceVertices[0] ].GetPosition(); + const float * v1 = verts[ firstOfLastVerts + faceVertices[1] ].GetPosition(); + const float * v2 = verts[ firstOfLastVerts + faceVertices[2] ].GetPosition(); + + // Calculate the cross product between the vectors formed by v1-v0 and + // v2-v0, and then normalize the result + float normalCalculated [] = {0.0,0.0,0.0}; + cross(&normalCalculated[0], v0, v1, v2); + normalize(&normalCalculated[0]); + + // Accumulate that normal on all verts that are part of that face + for(int vInFace = 0; vInFace < faceVertices.size() ; vInFace++ ) { + + int vertexIndex = faceVertices[vInFace]; + normals[vertexIndex].position[0] += normalCalculated[0]; + normals[vertexIndex].position[1] += normalCalculated[1]; + normals[vertexIndex].position[2] += normalCalculated[2]; + } + } + + // Finally we just need to normalize the accumulated normals + for (int i = 0; i < nverts; ++i) { + + normalize(&normals[i].position[0]); + } + + { // Output OBJ of the highest level refined ----------- + + // Print vertex positions + for (int vert = 0; vert < nverts; ++vert) { + float const * pos = verts[firstOfLastVerts + vert].GetPosition(); + printf("v %f %f %f\n", pos[0], pos[1], pos[2]); + } + + // Print vertex normals + for (int i = 0; i < nverts; ++i) { + float const * pos = normals[i].GetPosition(); + printf("vn %f %f %f\n", pos[0], pos[1], pos[2]); + } + + // Print uvs + int nuvs = refLastLevel.GetNumFVarValues(channelUV); + int firstOfLastUvs = refiner->GetNumFVarValuesTotal(channelUV) - nuvs; + for (int fvvert = 0; fvvert < nuvs; ++fvvert) { + FVarVertexUV const & uv = fvVertsUV[firstOfLastUvs + fvvert]; + printf("vt %f %f\n", uv.u, uv.v); + } + + // Print faces + for (int face = 0; face < nfaces; ++face) { + + Far::ConstIndexArray fverts = refLastLevel.GetFaceVertices(face); + Far::ConstIndexArray fuvs = refLastLevel.GetFaceFVarValues(face, channelUV); + + // all refined Catmark faces should be quads + assert(fverts.size()==4 and fuvs.size()==4); + + printf("f "); + for (int vert=0; vert Date: Thu, 17 Sep 2015 13:45:52 -0700 Subject: [PATCH 49/59] Adding two more methods to the smooth normals tutorial, the first one using the 4 vertices to generate two vectors to use in the cross product, the second one using the normals in the limit. --- tutorials/far/tutorial_8/far_tutorial_8.cpp | 196 +++++++++++++++----- 1 file changed, 146 insertions(+), 50 deletions(-) diff --git a/tutorials/far/tutorial_8/far_tutorial_8.cpp b/tutorials/far/tutorial_8/far_tutorial_8.cpp index deb1be1a..95fcaa23 100644 --- a/tutorials/far/tutorial_8/far_tutorial_8.cpp +++ b/tutorials/far/tutorial_8/far_tutorial_8.cpp @@ -38,6 +38,28 @@ #include +//------------------------------------------------------------------------------ +// Math helpers. +// +// + +// Returns the normalized version of the input vector +inline void +normalize(float *n) { + float rn = 1.0f/sqrtf(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]); + n[0] *= rn; + n[1] *= rn; + n[2] *= rn; +} + +// Returns the cross product of \p v1 and \p v2. +void cross(float const *v1, float const *v2, float* vOut) +{ + vOut[0] = v1[1] * v2[2] - v1[2] * v2[1]; + vOut[1] = v1[2] * v2[0] - v1[0] * v2[2]; + vOut[2] = v1[0] * v2[1] - v1[1] * v2[0]; +} + //------------------------------------------------------------------------------ // Face-varying implementation. // @@ -126,7 +148,6 @@ struct FVarVertexColor { //------------------------------------------------------------------------------ // Cube geometry from catmark_cube.h - // 'vertex' primitive variable data & topology static float g_verts[8][3] = {{ -0.5f, -0.5f, 0.5f }, { 0.5f, -0.5f, 0.5f }, @@ -210,33 +231,53 @@ static int g_colorIndices[24] = { 0, 3, 9, 6, using namespace OpenSubdiv; -inline void -normalize(float *n) { - float rn = 1.0f/sqrtf(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]); - n[0] *= rn; - n[1] *= rn; - n[2] *= rn; -} - -inline void -cross(float *n, const float *p0, const float *p1, const float *p2) { - float a[3] = { p1[0]-p0[0], p1[1]-p0[1], p1[2]-p0[2] }; - float b[3] = { p2[0]-p0[0], p2[1]-p0[1], p2[2]-p0[2] }; - - n[0] = a[1]*b[2]-a[2]*b[1]; - n[1] = a[2]*b[0]-a[0]*b[2]; - n[2] = a[0]*b[1]-a[1]*b[0]; -} +// Currently, this tutorial supports 3 methods to calculate +// approximated smooth normals: +// CrossTriangle : Calculates smooth normals (accumulating per vertex) using +// 3 verts to generate 2 vectors. +// CrossQuad : Calculates smooth normals (accumulating per vertex) but +// but this time instead of taking into account only 3 verts +// it creates to vectors out of the 4 verts. +// Limit : Calculates the normals at the limit and applies them +// to the last level of subdivision requested. +enum NormalMethod +{ + CrossTriangle, + CrossQuad, + Limit +}; //------------------------------------------------------------------------------ -int main(int, char **) { +int main(int argc, char ** argv) { - int maxlevel = 2; + const int maxlevel = 2; + enum NormalMethod normalMethod = CrossTriangle; + + // Parsing command line parameters to see if the user wants to use a + // specific method to calculate normals. + for (int i = 1; i < argc; ++i) { + if (strstr(argv[i], "-limit")) { + normalMethod = Limit; + } + else if (!strcmp(argv[i], "-crossquad")) { + normalMethod = CrossQuad; + } + else if (!strcmp(argv[i], "-crosstriangle")) { + normalMethod = CrossTriangle; + } + else { + printf("Parameters : \n"); + printf(" -crosstriangle : use the cross product of vectors\n"); + printf(" generated from 3 verts (default).\n"); + printf(" -crossquad : use the cross product of vectors\n"); + printf(" generated from 4 verts.\n"); + printf(" -limit : use normals calculated from the limit.\n"); + return 0; + } + } typedef Far::TopologyDescriptor Descriptor; - Sdc::SchemeType type = OpenSubdiv::Sdc::SCHEME_CATMARK; - Sdc::Options options; options.SetVtxBoundaryInterpolation(Sdc::Options::VTX_BOUNDARY_EDGE_ONLY); options.SetFVarLinearInterpolation(Sdc::Options::FVAR_LINEAR_NONE); @@ -247,12 +288,11 @@ int main(int, char **) { desc.numFaces = g_nfaces; desc.numVertsPerFace = g_vertsperface; desc.vertIndicesPerFace = g_vertIndices; - + + // Create a face-varying channel descriptor const int numChannels = 2; const int channelUV = 0; const int channelColor = 1; - - // Create a face-varying channel descriptor Descriptor::FVarChannel channels[numChannels]; channels[channelUV].numValues = g_nuvs; channels[channelUV].valueIndices = g_uvIndices; @@ -325,42 +365,99 @@ int main(int, char **) { // Since the vertices are now interpolated, we can calculate smooth normals. // In this example we will only calculate smooth normals for the last level - // of subdivision + // of subdivision. Also, we will only take into account 3 verts of the face, + // so this is an approximation. Far::TopologyLevel const & refLastLevel = refiner->GetLevel(maxlevel); int nverts = refLastLevel.GetNumVertices(); int nfaces = refLastLevel.GetNumFaces(); int firstOfLastVerts = refiner->GetNumVerticesTotal() - nverts; std::vector normals(nverts); - for (int f = 0; f < nfaces; f++) { - Far::ConstIndexArray faceVertices = refLastLevel.GetFaceVertices(f); + if(normalMethod == Limit) { - // We will use the first three verts to calculate a normal - const float * v0 = verts[ firstOfLastVerts + faceVertices[0] ].GetPosition(); - const float * v1 = verts[ firstOfLastVerts + faceVertices[1] ].GetPosition(); - const float * v2 = verts[ firstOfLastVerts + faceVertices[2] ].GetPosition(); + // Limit position, derivatives and normals + std::vector fineLimitPos(nverts); + std::vector fineDu(nverts); + std::vector fineDv(nverts); - // Calculate the cross product between the vectors formed by v1-v0 and - // v2-v0, and then normalize the result - float normalCalculated [] = {0.0,0.0,0.0}; - cross(&normalCalculated[0], v0, v1, v2); - normalize(&normalCalculated[0]); + primvarRefiner.Limit(&verts[firstOfLastVerts], fineLimitPos, fineDu, fineDv); + + for (int vert = 0; vert < nverts; ++vert) { + float const * du = fineDu[vert].GetPosition(); + float const * dv = fineDv[vert].GetPosition(); + + float norm[3]; + cross(du, dv, norm); + normals[vert].SetPosition(norm[0], norm[1], norm[2]); + } - // Accumulate that normal on all verts that are part of that face - for(int vInFace = 0; vInFace < faceVertices.size() ; vInFace++ ) { + } else if (normalMethod == CrossQuad) { - int vertexIndex = faceVertices[vInFace]; - normals[vertexIndex].position[0] += normalCalculated[0]; - normals[vertexIndex].position[1] += normalCalculated[1]; - normals[vertexIndex].position[2] += normalCalculated[2]; + // Accumulate normals calculated using the cross product of the two + // vectors generated by the 4 verts that form a quad. + for (int f = 0; f < nfaces; f++) { + Far::ConstIndexArray faceVertices = refLastLevel.GetFaceVertices(f); + + // We will use the first three verts to calculate a normal + const float * v0 = verts[ firstOfLastVerts + faceVertices[0] ].GetPosition(); + const float * v1 = verts[ firstOfLastVerts + faceVertices[1] ].GetPosition(); + const float * v2 = verts[ firstOfLastVerts + faceVertices[2] ].GetPosition(); + const float * v3 = verts[ firstOfLastVerts + faceVertices[3] ].GetPosition(); + + // Calculate the cross product between the vectors formed by v1-v0 and + // v2-v0, and then normalize the result + float normalCalculated [] = {0.0,0.0,0.0}; + float a[3] = { v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2] }; + float b[3] = { v3[0]-v1[0], v3[1]-v1[1], v3[2]-v1[2] }; + cross(a, b, normalCalculated); + normalize(normalCalculated); + + // Accumulate that normal on all verts that are part of that face + for(int vInFace = 0; vInFace < faceVertices.size() ; vInFace++ ) { + + int vertexIndex = faceVertices[vInFace]; + normals[vertexIndex].position[0] += normalCalculated[0]; + normals[vertexIndex].position[1] += normalCalculated[1]; + normals[vertexIndex].position[2] += normalCalculated[2]; + } + } + + } else if (normalMethod == CrossTriangle) { + + // Accumulate normals calculated using the cross product of the + // two vectors generated by 3 verts. + for (int f = 0; f < nfaces; f++) { + Far::ConstIndexArray faceVertices = refLastLevel.GetFaceVertices(f); + + // We will use the first three verts to calculate a normal + const float * v0 = verts[ firstOfLastVerts + faceVertices[0] ].GetPosition(); + const float * v1 = verts[ firstOfLastVerts + faceVertices[1] ].GetPosition(); + const float * v2 = verts[ firstOfLastVerts + faceVertices[2] ].GetPosition(); + + // Calculate the cross product between the vectors formed by v1-v0 and + // v2-v0, and then normalize the result + float normalCalculated [] = {0.0,0.0,0.0}; + float a[3] = { v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2] }; + float b[3] = { v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2] }; + cross(a, b, normalCalculated); + normalize(normalCalculated); + + // Accumulate that normal on all verts that are part of that face + for(int vInFace = 0; vInFace < faceVertices.size() ; vInFace++ ) { + + int vertexIndex = faceVertices[vInFace]; + normals[vertexIndex].position[0] += normalCalculated[0]; + normals[vertexIndex].position[1] += normalCalculated[1]; + normals[vertexIndex].position[2] += normalCalculated[2]; + } } } - - // Finally we just need to normalize the accumulated normals - for (int i = 0; i < nverts; ++i) { - normalize(&normals[i].position[0]); + // Finally we just need to normalize the accumulated normals + for (int vert = 0; vert < nverts; ++vert) { + + normalize(&normals[vert].position[0]); } { // Output OBJ of the highest level refined ----------- @@ -372,8 +469,8 @@ int main(int, char **) { } // Print vertex normals - for (int i = 0; i < nverts; ++i) { - float const * pos = normals[i].GetPosition(); + for (int vert = 0; vert < nverts; ++vert) { + float const * pos = normals[vert].GetPosition(); printf("vn %f %f %f\n", pos[0], pos[1], pos[2]); } @@ -387,7 +484,6 @@ int main(int, char **) { // Print faces for (int face = 0; face < nfaces; ++face) { - Far::ConstIndexArray fverts = refLastLevel.GetFaceVertices(face); Far::ConstIndexArray fuvs = refLastLevel.GetFaceFVarValues(face, channelUV); From 67e86104f66cae450c2ed7371d9f3a84466e290e Mon Sep 17 00:00:00 2001 From: Pol Date: Thu, 17 Sep 2015 13:55:08 -0700 Subject: [PATCH 50/59] Minor fixes in the code, mostly spacing --- tutorials/far/tutorial_8/far_tutorial_8.cpp | 27 ++++++++------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/tutorials/far/tutorial_8/far_tutorial_8.cpp b/tutorials/far/tutorial_8/far_tutorial_8.cpp index 95fcaa23..6a8c5175 100644 --- a/tutorials/far/tutorial_8/far_tutorial_8.cpp +++ b/tutorials/far/tutorial_8/far_tutorial_8.cpp @@ -256,16 +256,14 @@ int main(int argc, char ** argv) { // Parsing command line parameters to see if the user wants to use a // specific method to calculate normals. for (int i = 1; i < argc; ++i) { + if (strstr(argv[i], "-limit")) { normalMethod = Limit; - } - else if (!strcmp(argv[i], "-crossquad")) { + } else if (!strcmp(argv[i], "-crossquad")) { normalMethod = CrossQuad; - } - else if (!strcmp(argv[i], "-crosstriangle")) { + } else if (!strcmp(argv[i], "-crosstriangle")) { normalMethod = CrossTriangle; - } - else { + } else { printf("Parameters : \n"); printf(" -crosstriangle : use the cross product of vectors\n"); printf(" generated from 3 verts (default).\n"); @@ -290,8 +288,8 @@ int main(int argc, char ** argv) { desc.vertIndicesPerFace = g_vertIndices; // Create a face-varying channel descriptor - const int numChannels = 2; - const int channelUV = 0; + const int numChannels = 2; + const int channelUV = 0; const int channelColor = 1; Descriptor::FVarChannel channels[numChannels]; channels[channelUV].numValues = g_nuvs; @@ -344,9 +342,8 @@ int main(int argc, char ** argv) { // Interpolate both vertex and face-varying primvar data Far::PrimvarRefiner primvarRefiner(*refiner); - - Vertex * srcVert = verts; - FVarVertexUV * srcFVarUV = fvVertsUV; + Vertex * srcVert = verts; + FVarVertexUV * srcFVarUV = fvVertsUV; FVarVertexColor * srcFVarColor = fvVertsColor; for (int level = 1; level <= maxlevel; ++level) { @@ -374,8 +371,7 @@ int main(int argc, char ** argv) { std::vector normals(nverts); - if(normalMethod == Limit) { - + if (normalMethod == Limit) { // Limit position, derivatives and normals std::vector fineLimitPos(nverts); std::vector fineDu(nverts); @@ -393,7 +389,6 @@ int main(int argc, char ** argv) { } } else if (normalMethod == CrossQuad) { - // Accumulate normals calculated using the cross product of the two // vectors generated by the 4 verts that form a quad. for (int f = 0; f < nfaces; f++) { @@ -424,7 +419,6 @@ int main(int argc, char ** argv) { } } else if (normalMethod == CrossTriangle) { - // Accumulate normals calculated using the cross product of the // two vectors generated by 3 verts. for (int f = 0; f < nfaces; f++) { @@ -456,12 +450,11 @@ int main(int argc, char ** argv) { // Finally we just need to normalize the accumulated normals for (int vert = 0; vert < nverts; ++vert) { - normalize(&normals[vert].position[0]); } { // Output OBJ of the highest level refined ----------- - + // Print vertex positions for (int vert = 0; vert < nverts; ++vert) { float const * pos = verts[firstOfLastVerts + vert].GetPosition(); From 37bce3be14d5966c02a4ecb0fcb3707fd581b973 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Thu, 17 Sep 2015 15:14:54 -0700 Subject: [PATCH 51/59] Fix the reserve size for BSpline patch (16, not 20) --- opensubdiv/far/endCapBSplineBasisPatchFactory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index e66f4575..42ddd1a7 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -61,8 +61,8 @@ EndCapBSplineBasisPatchFactory::EndCapBSplineBasisPatchFactory( // finest level. int numMaxLevelFaces = refiner.GetLevel(refiner.GetMaxLevel()).GetNumFaces(); - _vertexStencils.reserve(numMaxLevelFaces*20); - _varyingStencils.reserve(numMaxLevelFaces*20); + _vertexStencils.reserve(numMaxLevelFaces*16); + _varyingStencils.reserve(numMaxLevelFaces*16); } ConstIndexArray From fe7a4decc5e560c0ce086d43d4850f4762c67737 Mon Sep 17 00:00:00 2001 From: Pol Date: Thu, 17 Sep 2015 15:29:00 -0700 Subject: [PATCH 52/59] Added section at the beginning that explains each method, how it works and how it approximates smooth normals. --- tutorials/far/tutorial_8/far_tutorial_8.cpp | 96 ++++++++++++++------- 1 file changed, 64 insertions(+), 32 deletions(-) diff --git a/tutorials/far/tutorial_8/far_tutorial_8.cpp b/tutorials/far/tutorial_8/far_tutorial_8.cpp index 6a8c5175..6f80c76e 100644 --- a/tutorials/far/tutorial_8/far_tutorial_8.cpp +++ b/tutorials/far/tutorial_8/far_tutorial_8.cpp @@ -26,11 +26,37 @@ //------------------------------------------------------------------------------ // Tutorial description: // -// Building on tutorial 0, this example shows how to instantiate a simple mesh, -// refine it uniformly and then interpolate both 'vertex' and 'face-varying' -// primvar data. -// The resulting interpolated data is output as an 'obj' file, with the -// 'face-varying' data recorded in the uv texture layout. +// NOTE: The following approaches are approximations to compute smooth normals, +// for highest fidelity patches should be used for positions and normals, +// which form the true limit surface. +// +// Building on tutorial 3, this example shows how to instantiate a simple mesh, +// refine it uniformly, interpolate both 'vertex' and 'face-varying' +// primvar data, and finally calculate approximated smooth normals. +// The resulting interpolated data is output in 'obj' format. +// +// Currently, this tutorial supports 3 methods to approximate smooth normals: +// +// CrossTriangle : Calculates smooth normals (accumulating per vertex) using +// 3 verts to generate 2 vectors. This approximation has +// trouble when working with quads (which can be non-planar) +// since it only takes into account half of each face. +// +// CrossQuad : Calculates smooth normals (accumulating per vertex) +// but this time, instead of taking into account only 3 verts +// it creates 2 vectors crossing the quad. +// This approximation builds upon CrossTriangle but takes +// into account the 4 verts of the face. +// +// Limit : Calculates the normals at the limit for each vert +// at the last level of subdivision. +// These are the true limit normals, however, in this example +// they are used with verts that are not at the limit. +// This can lead to new visual artifacts since the normals +// and the positions don't match. Additionally, this approach +// requires extra computation to calculate the limit normals. +// For this reason, we strongly suggest using +// limit positions with limit normals. // #include @@ -231,16 +257,8 @@ static int g_colorIndices[24] = { 0, 3, 9, 6, using namespace OpenSubdiv; -// Currently, this tutorial supports 3 methods to calculate -// approximated smooth normals: -// CrossTriangle : Calculates smooth normals (accumulating per vertex) using -// 3 verts to generate 2 vectors. -// CrossQuad : Calculates smooth normals (accumulating per vertex) but -// but this time instead of taking into account only 3 verts -// it creates to vectors out of the 4 verts. -// Limit : Calculates the normals at the limit and applies them -// to the last level of subdivision requested. -enum NormalMethod +// Approximation methods for smooth normal computations +enum NormalApproximation { CrossTriangle, CrossQuad, @@ -251,18 +269,18 @@ enum NormalMethod int main(int argc, char ** argv) { const int maxlevel = 2; - enum NormalMethod normalMethod = CrossTriangle; + enum NormalApproximation normalApproximation = CrossTriangle; // Parsing command line parameters to see if the user wants to use a - // specific method to calculate normals. + // specific method to calculate normals for (int i = 1; i < argc; ++i) { if (strstr(argv[i], "-limit")) { - normalMethod = Limit; + normalApproximation = Limit; } else if (!strcmp(argv[i], "-crossquad")) { - normalMethod = CrossQuad; + normalApproximation = CrossQuad; } else if (!strcmp(argv[i], "-crosstriangle")) { - normalMethod = CrossTriangle; + normalApproximation = CrossTriangle; } else { printf("Parameters : \n"); printf(" -crosstriangle : use the cross product of vectors\n"); @@ -360,10 +378,7 @@ int main(int argc, char ** argv) { srcFVarColor = dstFVarColor; } - // Since the vertices are now interpolated, we can calculate smooth normals. - // In this example we will only calculate smooth normals for the last level - // of subdivision. Also, we will only take into account 3 verts of the face, - // so this is an approximation. + // Approximate normals Far::TopologyLevel const & refLastLevel = refiner->GetLevel(maxlevel); int nverts = refLastLevel.GetNumVertices(); int nfaces = refLastLevel.GetNumFaces(); @@ -371,8 +386,16 @@ int main(int argc, char ** argv) { std::vector normals(nverts); - if (normalMethod == Limit) { - // Limit position, derivatives and normals + // Different ways to approximate smooth normals + // + // For details check the description at the beginning of the file + if (normalApproximation == Limit) { + + // Approximation using the normal at the limit with verts that are + // not at the limit + // + // For details check the description at the beginning of the file + std::vector fineLimitPos(nverts); std::vector fineDu(nverts); std::vector fineDv(nverts); @@ -388,9 +411,14 @@ int main(int argc, char ** argv) { normals[vert].SetPosition(norm[0], norm[1], norm[2]); } - } else if (normalMethod == CrossQuad) { - // Accumulate normals calculated using the cross product of the two - // vectors generated by the 4 verts that form a quad. + } else if (normalApproximation == CrossQuad) { + + // Approximate smooth normals by accumulating normal vectors computed as + // the cross product of two vectors generated by the 4 verts that + // form each quad + // + // For details check the description at the beginning of the file + for (int f = 0; f < nfaces; f++) { Far::ConstIndexArray faceVertices = refLastLevel.GetFaceVertices(f); @@ -418,9 +446,13 @@ int main(int argc, char ** argv) { } } - } else if (normalMethod == CrossTriangle) { - // Accumulate normals calculated using the cross product of the - // two vectors generated by 3 verts. + } else if (normalApproximation == CrossTriangle) { + + // Approximate smooth normals by accumulating normal vectors computed as + // the cross product of two vectors generated by 3 verts of the quad + // + // For details check the description at the beginning of the file + for (int f = 0; f < nfaces; f++) { Far::ConstIndexArray faceVertices = refLastLevel.GetFaceVertices(f); From 4be4b25cc945e26f081e6ac9908878ab78fe4bc9 Mon Sep 17 00:00:00 2001 From: Anshu Arya Date: Mon, 21 Sep 2015 08:58:28 -0700 Subject: [PATCH 53/59] Set layout to std430 for GLSL Compute kernel Fixes corrupted mesh issues with GLSL Compute on AMD platforms. --- opensubdiv/osd/glslComputeKernel.glsl | 1 + 1 file changed, 1 insertion(+) diff --git a/opensubdiv/osd/glslComputeKernel.glsl b/opensubdiv/osd/glslComputeKernel.glsl index 1ee45761..451d46d3 100644 --- a/opensubdiv/osd/glslComputeKernel.glsl +++ b/opensubdiv/osd/glslComputeKernel.glsl @@ -26,6 +26,7 @@ layout(local_size_x=WORK_GROUP_SIZE, local_size_y=1, local_size_z=1) in; +layout(std430) buffer; // source and destination buffers From 007a2e88856c87783508cda56c906cce229698c2 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Mon, 21 Sep 2015 14:33:11 -0700 Subject: [PATCH 54/59] Removing debug code that mistakenly slipped into glPatchTable.cpp. Also use GL_ARRAY_BUFFER for the binding point of updating indices instead of GL_ELEMENT_ARRAY_BUFFER --- opensubdiv/osd/glPatchTable.cpp | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/opensubdiv/osd/glPatchTable.cpp b/opensubdiv/osd/glPatchTable.cpp index 72a57dd0..fba630f2 100644 --- a/opensubdiv/osd/glPatchTable.cpp +++ b/opensubdiv/osd/glPatchTable.cpp @@ -70,12 +70,11 @@ GLPatchTable::allocate(Far::PatchTable const *farPatchTable) { patchTable.GetPatchArrayBuffer() + numPatchArrays); // copy index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _patchIndexBuffer); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, + glBindBuffer(GL_ARRAY_BUFFER, _patchIndexBuffer); + glBufferData(GL_ARRAY_BUFFER, indexSize * sizeof(GLint), patchTable.GetPatchIndexBuffer(), GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // copy patchparam buffer glBindBuffer(GL_ARRAY_BUFFER, _patchParamBuffer); @@ -89,17 +88,8 @@ GLPatchTable::allocate(Far::PatchTable const *farPatchTable) { glGenTextures(1, &_patchIndexTexture); glGenTextures(1, &_patchParamTexture); - GLuint buffer; - glGenBuffers(1, &buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - glBufferData(GL_ARRAY_BUFFER, - indexSize * sizeof(GLint), - patchTable.GetPatchIndexBuffer(), - GL_STATIC_DRAW); - glBindTexture(GL_TEXTURE_BUFFER, _patchIndexTexture); -// glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, _patchIndexBuffer); - glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, buffer); + glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, _patchIndexBuffer); glBindTexture(GL_TEXTURE_BUFFER, _patchParamTexture); glTexBuffer(GL_TEXTURE_BUFFER, GL_RGB32I, _patchParamBuffer); From 0aea00a2e8b8e43b39264c6d347b73113b1b12fe Mon Sep 17 00:00:00 2001 From: barfowl Date: Tue, 22 Sep 2015 17:26:09 -0700 Subject: [PATCH 55/59] Improved patch approximations around non-manifold features - use regular corner patches around non-manifold verts that were sharpened --- opensubdiv/far/patchTableFactory.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index 32203d94..8d64e6f8 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -898,7 +898,10 @@ PatchTableFactory::identifyAdaptivePatches(AdaptiveContext & context) { } // Identify boundaries for both regular and xordinary patches -- non-manifold - // edges and vertices are interpreted as boundaries for regular patches + // (infinitely sharp) edges and vertices are currently interpreted as boundaries + // for regular patches, though an irregular patch or extrapolated boundary patch + // is really necessary in future for some non-manifold cases. + // if (hasBoundaryVertex or hasNonManifoldVertex) { Vtr::ConstIndexArray fEdges = level->getFaceEdges(faceIndex); @@ -911,6 +914,27 @@ PatchTableFactory::identifyAdaptivePatches(AdaptiveContext & context) { ((level->getEdgeTag(fEdges[1])._nonManifold) << 1) | ((level->getEdgeTag(fEdges[2])._nonManifold) << 2) | ((level->getEdgeTag(fEdges[3])._nonManifold) << 3); + + // Other than non-manifold edges, non-manifold vertices that were made + // sharp should also trigger new "boundary" edges for the sharp corner + // patches introduced in these cases. + // + if (level->getVertexTag(fVerts[0])._nonManifold && + level->getVertexTag(fVerts[0])._infSharp) { + nonManEdgeMask |= (1 << 0) | (1 << 3); + } + if (level->getVertexTag(fVerts[1])._nonManifold && + level->getVertexTag(fVerts[1])._infSharp) { + nonManEdgeMask |= (1 << 1) | (1 << 0); + } + if (level->getVertexTag(fVerts[2])._nonManifold && + level->getVertexTag(fVerts[2])._infSharp) { + nonManEdgeMask |= (1 << 2) | (1 << 1); + } + if (level->getVertexTag(fVerts[3])._nonManifold && + level->getVertexTag(fVerts[3])._infSharp) { + nonManEdgeMask |= (1 << 3) | (1 << 2); + } boundaryEdgeMask |= nonManEdgeMask; } From f5810bac97d33c5020f1e1a95891386013b98139 Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Wed, 30 Sep 2015 11:20:03 -0700 Subject: [PATCH 56/59] Fix windows build --- examples/common/stopwatch.h | 6 +++--- opensubdiv/far/endCapBSplineBasisPatchFactory.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/common/stopwatch.h b/examples/common/stopwatch.h index 32d0b153..c39dc258 100644 --- a/examples/common/stopwatch.h +++ b/examples/common/stopwatch.h @@ -25,12 +25,12 @@ #ifndef STOPWATCH_H #define STOPWATCH_H -#if not (_WIN32 or _WIN64) +#if (_WIN32 or _WIN64) + #include +#else #include #include #include -#else - #endif class Stopwatch { diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index 42ddd1a7..31f72243 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -243,10 +243,10 @@ EndCapBSplineBasisPatchFactory::computeLimitStencils( P->AddWithWeight(f, 1.0f/float(valence)); - float c0 = 0.5*cosf((float(2*M_PI) * float(i)/float(valence))) - + 0.5*cosf((float(2*M_PI) * float(ip)/float(valence))); - float c1 = 0.5*sinf((float(2*M_PI) * float(i)/float(valence))) - + 0.5*sinf((float(2*M_PI) * float(ip)/float(valence))); + float c0 = 0.5f*cosf((float(2*M_PI) * float(i)/float(valence))) + + 0.5f*cosf((float(2*M_PI) * float(ip)/float(valence))); + float c1 = 0.5f*sinf((float(2*M_PI) * float(i)/float(valence))) + + 0.5f*sinf((float(2*M_PI) * float(ip)/float(valence))); e0.AddWithWeight(f, c0*ef); e1.AddWithWeight(f, c1*ef); } From 287441118e54e723275504fecc94edfdc97d52b8 Mon Sep 17 00:00:00 2001 From: "David G. Yu" Date: Wed, 30 Sep 2015 13:15:42 -0700 Subject: [PATCH 57/59] Fixed double to float conversion warnings --- opensubdiv/sdc/loopScheme.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/opensubdiv/sdc/loopScheme.h b/opensubdiv/sdc/loopScheme.h index ecc16c19..f8e9aee7 100644 --- a/opensubdiv/sdc/loopScheme.h +++ b/opensubdiv/sdc/loopScheme.h @@ -489,8 +489,8 @@ Scheme::assignCreaseLimitTangentMasks(VERTEX const& vertex, double theta = M_PI / (interiorEdgeCount + 1); - Weight cWeight = -3.0f * std::sin(theta); - Weight eWeightCoeff = -3.0f * (2.0f * std::cos(theta) - 2.0f); + Weight cWeight = -3.0f * (Weight) std::sin(theta); + Weight eWeightCoeff = -3.0f * (2.0f * (Weight) std::cos(theta) - 2.0f); tan2Mask.VertexWeight(0) = 0.0f; @@ -498,7 +498,7 @@ Scheme::assignCreaseLimitTangentMasks(VERTEX const& vertex, tan2Mask.EdgeWeight(creaseEnds[1]) = cWeight; for (int i = 1; i <= interiorEdgeCount; ++i) { - tan2Mask.EdgeWeight(creaseEnds[0] + i) = eWeightCoeff * std::sin(i * theta); + tan2Mask.EdgeWeight(creaseEnds[0] + i) = eWeightCoeff * (Weight) std::sin(i * theta); } } else if (interiorEdgeCount == 1) { // See notes above regarding scale factor of 3.0: @@ -566,8 +566,8 @@ Scheme::assignSmoothLimitTangentMasks(VERTEX const& vertex, Weight alpha = (Weight) (2.0f * M_PI / valence); for (int i = 0; i < valence; ++i) { double alphaI = alpha * i; - tan1Mask.EdgeWeight(i) = std::cos(alphaI); - tan2Mask.EdgeWeight(i) = std::sin(alphaI); + tan1Mask.EdgeWeight(i) = (Weight) std::cos(alphaI); + tan2Mask.EdgeWeight(i) = (Weight) std::sin(alphaI); } } } From 6bbf0f78cef43c39a2d802bac2cdb4e7efe102d4 Mon Sep 17 00:00:00 2001 From: "David G. Yu" Date: Wed, 30 Sep 2015 13:26:35 -0700 Subject: [PATCH 58/59] Fixed out of bounds mem access for OMP and TBB --- opensubdiv/osd/ompEvaluator.h | 3 +++ opensubdiv/osd/tbbEvaluator.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/opensubdiv/osd/ompEvaluator.h b/opensubdiv/osd/ompEvaluator.h index 9000f326..625dd8b1 100644 --- a/opensubdiv/osd/ompEvaluator.h +++ b/opensubdiv/osd/ompEvaluator.h @@ -79,6 +79,9 @@ public: (void)instance; // unused (void)deviceContext; // unused + if (stencilTable->GetNumStencils() == 0) + return false; + return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, dstBuffer->BindCpuBuffer(), dstDesc, &stencilTable->GetSizes()[0], diff --git a/opensubdiv/osd/tbbEvaluator.h b/opensubdiv/osd/tbbEvaluator.h index 4c8d1d14..e2e0ffff 100644 --- a/opensubdiv/osd/tbbEvaluator.h +++ b/opensubdiv/osd/tbbEvaluator.h @@ -80,6 +80,9 @@ public: (void)instance; // unused (void)deviceContext; // unused + if (stencilTable->GetNumStencils() == 0) + return false; + return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, dstBuffer->BindCpuBuffer(), dstDesc, &stencilTable->GetSizes()[0], From 9f0e49edc696a5dbd38b7395c9c2be693456318f Mon Sep 17 00:00:00 2001 From: jcowles Date: Mon, 5 Oct 2015 16:27:09 -0700 Subject: [PATCH 59/59] Release 3.0.3 --- documentation/release_notes.rst | 17 ++++++++++++++++- opensubdiv/version.h | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index c0b65994..901d975f 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -34,8 +34,23 @@ Release 3.0.3 ============= +Release 3.0.3 is a minor stability release which includes important performance +and bug fixes. + +**New Features** + - Smooth normal generation tutorial, far_tutorial_8 + +**Changes** + - Major performance improvement in PatchTable construction + - Improved patch approximations for non-manifold features + **Bug Fixes** - - Fixed bug in display of Loop surfaces in glFVarViewer. + - Fixed double delete in GLSL Compute controller + - Fixed buffer layout for GLSL Compute kernel + - Fixed GL buffer leak in Osd::GLPatchTable + - Fixed out-of-bounds data access for TBB and OMP stencil evaluation + - Fixed WIN32_LEAN_AND_MEAN typo + - Fixed Loop-related shader issues glFVarViewer Release 3.0.2 ============= diff --git a/opensubdiv/version.h b/opensubdiv/version.h index f3e14bda..644414a0 100644 --- a/opensubdiv/version.h +++ b/opensubdiv/version.h @@ -25,7 +25,7 @@ #ifndef OPENSUBDIV3_VERSION_H #define OPENSUBDIV3_VERSION_H -#define OPENSUBDIV_VERSION v3_0_2 +#define OPENSUBDIV_VERSION v3_0_3 namespace OpenSubdiv { namespace OPENSUBDIV_VERSION {