From 5e77907e241b06da1b6ffcbd58acecfa583fd0e1 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Tue, 22 Nov 2016 20:04:56 -0800 Subject: [PATCH 01/20] Support creation of Face-Varying stencil tables Extended Far::StencilTableFactory to support the creation of stencil tables for face-varying channels. We already use stencil tables to compute local point face-varying values. These changes allow a stencil table to be created which refines face-varying primvar data for all refined points. --- opensubdiv/far/stencilTableFactory.cpp | 79 +++++++++++++++++++++----- opensubdiv/far/stencilTableFactory.h | 42 +++++++++++++- 2 files changed, 103 insertions(+), 18 deletions(-) diff --git a/opensubdiv/far/stencilTableFactory.cpp b/opensubdiv/far/stencilTableFactory.cpp index 993d4078..6fe92622 100644 --- a/opensubdiv/far/stencilTableFactory.cpp +++ b/opensubdiv/far/stencilTableFactory.cpp @@ -75,15 +75,22 @@ StencilTable const * StencilTableFactory::Create(TopologyRefiner const & refiner, Options options) { + bool interpolateVertex = options.interpolationMode==INTERPOLATE_VERTEX; + bool interpolateVarying = options.interpolationMode==INTERPOLATE_VARYING; + bool interpolateFaceVarying = options.interpolationMode==INTERPOLATE_FACE_VARYING; + + int numControlVertices = !interpolateFaceVarying + ? refiner.GetLevel(0).GetNumVertices() + : refiner.GetLevel(0).GetNumFVarValues(options.fvarChannel); + int maxlevel = std::min(int(options.maxLevel), refiner.GetMaxLevel()); if (maxlevel==0 && (! options.generateControlVerts)) { StencilTable * result = new StencilTable; - result->_numControlVertices = refiner.GetLevel(0).GetNumVertices(); + result->_numControlVertices = numControlVertices; return result; } - bool interpolateVarying = options.interpolationMode==INTERPOLATE_VARYING; - internal::StencilBuilder builder(refiner.GetLevel(0).GetNumVertices(), + internal::StencilBuilder builder(numControlVertices, /*genControlVerts*/ true, /*compactWeights*/ true); @@ -94,21 +101,25 @@ 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, numControlVertices); for (int level=1; level<=maxlevel; ++level) { - if (! interpolateVarying) { + if (interpolateVertex) { primvarRefiner.Interpolate(level, srcIndex, dstIndex); - } else { + } else if (interpolateVarying) { primvarRefiner.InterpolateVarying(level, srcIndex, dstIndex); + } else { + primvarRefiner.InterpolateFaceVarying(level, srcIndex, dstIndex, options.fvarChannel); } if (options.factorizeIntermediateLevels) { srcIndex = dstIndex; } - dstIndex = dstIndex[refiner.GetLevel(level).GetNumVertices()]; + int dstVertex = !interpolateFaceVarying + ? refiner.GetLevel(level).GetNumVertices() + : refiner.GetLevel(level).GetNumFVarValues(options.fvarChannel); + dstIndex = dstIndex[dstVertex]; if (! options.factorizeIntermediateLevels) { // All previous verts are considered as coarse verts, as a @@ -118,14 +129,14 @@ StencilTableFactory::Create(TopologyRefiner const & refiner, } } - size_t firstOffset = refiner.GetLevel(0).GetNumVertices(); + size_t firstOffset = numControlVertices; if (! options.generateIntermediateLevels) firstOffset = srcIndex.GetOffset(); // Copy stencils from the StencilBuilder into the StencilTable. // Always initialize numControlVertices (useful for torus case) StencilTable * result = - new StencilTable(refiner.GetLevel(0).GetNumVertices(), + new StencilTable(numControlVertices, builder.GetStencilOffsets(), builder.GetStencilSizes(), builder.GetStencilSources(), @@ -210,6 +221,38 @@ StencilTableFactory::AppendLocalPointStencilTable( StencilTable const * localPointStencilTable, bool factorize) { + return appendLocalPointStencilTable( + refiner, + baseStencilTable, + localPointStencilTable, + /*channel*/-1, + factorize); +} + +StencilTable const * +StencilTableFactory::AppendLocalPointStencilTableFaceVarying( + TopologyRefiner const &refiner, + StencilTable const * baseStencilTable, + StencilTable const * localPointStencilTable, + int channel, + bool factorize) { + + return appendLocalPointStencilTable( + refiner, + baseStencilTable, + localPointStencilTable, + channel, + factorize); +} + +StencilTable const * +StencilTableFactory::appendLocalPointStencilTable( + TopologyRefiner const &refiner, + StencilTable const * baseStencilTable, + StencilTable const * localPointStencilTable, + int channel, + bool factorize) { + // factorize and append. if (baseStencilTable == NULL || localPointStencilTable == NULL || @@ -218,11 +261,17 @@ StencilTableFactory::AppendLocalPointStencilTable( // baseStencilTable can be built with or without singular stencils // (single weight of 1.0f) as place-holders for coarse mesh vertices. + int nControlVerts = channel < 0 + ? refiner.GetLevel(0).GetNumVertices() + : refiner.GetLevel(0).GetNumFVarValues(channel); + int controlVertsIndexOffset = 0; int nBaseStencils = baseStencilTable->GetNumStencils(); int nBaseStencilsElements = (int)baseStencilTable->_indices.size(); { - int nverts = refiner.GetNumVerticesTotal(); + int nverts = channel < 0 + ? refiner.GetNumVerticesTotal() + : refiner.GetNumFVarValuesTotal(channel); if (nBaseStencils == nverts) { // the table contain stencils for the control vertices @@ -240,7 +289,7 @@ StencilTableFactory::AppendLocalPointStencilTable( // controlVertsIndexOffset = 0; - } else if (nBaseStencils == (nverts -refiner.GetLevel(0).GetNumVertices())) { + } else if (nBaseStencils == (nverts - nControlVerts)) { // the table does not contain stencils for the control vertices // @@ -256,7 +305,7 @@ StencilTableFactory::AppendLocalPointStencilTable( // <--------------> // controlVertsIndexOffset // - controlVertsIndexOffset = refiner.GetLevel(0).GetNumVertices(); + controlVertsIndexOffset = nControlVerts; } else { // these are not the stencils you are looking for. @@ -269,7 +318,7 @@ StencilTableFactory::AppendLocalPointStencilTable( int nLocalPointStencils = localPointStencilTable->GetNumStencils(); int nLocalPointStencilsElements = 0; - internal::StencilBuilder builder(refiner.GetLevel(0).GetNumVertices(), + internal::StencilBuilder builder(nControlVerts, /*genControlVerts*/ false, /*compactWeights*/ factorize); internal::StencilBuilder::Index origin(&builder, 0); @@ -302,7 +351,7 @@ StencilTableFactory::AppendLocalPointStencilTable( // create new stencil table StencilTable * result = new StencilTable; - result->_numControlVertices = refiner.GetLevel(0).GetNumVertices(); + result->_numControlVertices = nControlVerts; result->resize(nBaseStencils + nLocalPointStencils, nBaseStencilsElements + nLocalPointStencilsElements); diff --git a/opensubdiv/far/stencilTableFactory.h b/opensubdiv/far/stencilTableFactory.h index 3931b696..a9f21296 100644 --- a/opensubdiv/far/stencilTableFactory.h +++ b/opensubdiv/far/stencilTableFactory.h @@ -50,8 +50,9 @@ class StencilTableFactory { public: enum Mode { - INTERPOLATE_VERTEX=0, - INTERPOLATE_VARYING + INTERPOLATE_VERTEX=0, ///< vertex primvar stencils + INTERPOLATE_VARYING, ///< varying primvar stencils + INTERPOLATE_FACE_VARYING ///< face-varying primvar stencils }; struct Options { @@ -61,7 +62,8 @@ public: generateControlVerts(false), generateIntermediateLevels(true), factorizeIntermediateLevels(true), - maxLevel(10) { } + maxLevel(10), + fvarChannel(0) { } unsigned int interpolationMode : 2, ///< interpolation mode generateOffsets : 1, ///< populate optional "_offsets" field @@ -71,6 +73,8 @@ public: /// vertices or from the stencils of the /// previous level maxLevel : 4; ///< generate stencils up to 'maxLevel' + unsigned int fvarChannel; ///< face-varying channel to use + /// when generating face-varying stencils }; /// \brief Instantiates StencilTable from TopologyRefiner that have been @@ -123,10 +127,42 @@ public: StencilTable const *localPointStencilTable, bool factorize = true); + /// \brief Utility function for stencil splicing for local point + /// face-varying stencils. + /// + /// @param refiner The TopologyRefiner containing the topology + /// + /// @param baseStencilTable Input StencilTable for refined vertices + /// + /// @param localPointStencilTable + /// StencilTable for the change of basis patch points. + /// + /// @param channel face-varying channel + /// + /// @param factorize If factorize sets to true, endcap stencils will be + /// factorized with supporting vertices from baseStencil + /// table so that the endcap points can be computed + /// directly from control vertices. + /// + static StencilTable const * AppendLocalPointStencilTableFaceVarying( + TopologyRefiner const &refiner, + StencilTable const *baseStencilTable, + StencilTable const *localPointStencilTable, + int channel = 0, + bool factorize = true); + private: // Generate stencils for the coarse control-vertices (single weight = 1.0f) static void generateControlVertStencils(int numControlVerts, Stencil & dst); + + // Internal method to splice local point stencils + static StencilTable const * appendLocalPointStencilTable( + TopologyRefiner const &refiner, + StencilTable const * baseStencilTable, + StencilTable const * localPointStencilTable, + int channel, + bool factorize); }; /// \brief A specialized factory for LimitStencilTable From 0a9b1f637367c5987fa1c2e5d9f62189c2ba6204 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Tue, 22 Nov 2016 20:05:42 -0800 Subject: [PATCH 02/20] Updated glFVarViewer/glEvalLimit for FVar stencils These viewers now use stencil tables to refine all face-varying primvar values, i.e. for both refined points and local points. --- examples/glEvalLimit/glEvalLimit.cpp | 140 +++++++++++++++---------- examples/glEvalLimit/init_shapes.h | 3 + examples/glFVarViewer/glFVarViewer.cpp | 73 +++++++------ 3 files changed, 129 insertions(+), 87 deletions(-) diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 1e9c7552..36b753b3 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -227,6 +227,7 @@ public: virtual void UpdateData(const float *src, int startVertex, int numVertices) = 0; virtual void UpdateVaryingData(const float *src, int startVertex, int numVertices) = 0; virtual void UpdateFaceVaryingData(const float *src, int startVertex, int numVertices) = 0; + virtual bool HasFaceVaryingData() const = 0; virtual void Refine() = 0; virtual void EvalPatches() = 0; virtual void EvalPatchesWithDerivatives() = 0; @@ -251,37 +252,54 @@ public: EvalOutput(Far::StencilTable const *vertexStencils, Far::StencilTable const *varyingStencils, Far::StencilTable const *faceVaryingStencils, - int numCoarseVerts, int numTotalVerts, - int numCoarseFVarVerts, int numTotalFVarVerts, + int fvarChannel, int fvarWidth, int numParticles, Far::PatchTable const *patchTable, EvaluatorCache *evaluatorCache = NULL, DEVICE_CONTEXT *deviceContext = NULL) : _srcDesc( /*offset*/ 0, /*length*/ 3, /*stride*/ 3), _srcVaryingDesc(/*offset*/ 0, /*length*/ 3, /*stride*/ 3), - _srcFVarDesc( /*offset*/ 0, /*length*/ 2, /*stride*/ 2), + _srcFVarDesc( /*offset*/ 0, /*length*/ fvarWidth, /*stride*/ fvarWidth), _vertexDesc( /*offset*/ 0, /*legnth*/ 3, /*stride*/ 6), _varyingDesc( /*offset*/ 3, /*legnth*/ 3, /*stride*/ 6), - _fvarDesc( /*offset*/ 0, /*legnth*/ 2, /*stride*/ 2), + _fvarDesc( /*offset*/ 0, /*legnth*/ fvarWidth, /*stride*/ fvarWidth), _duDesc( /*offset*/ 0, /*legnth*/ 3, /*stride*/ 6), _dvDesc( /*offset*/ 3, /*legnth*/ 3, /*stride*/ 6), _deviceContext(deviceContext) { + + // total number of vertices = coarse points + refined points + local points + int numTotalVerts = vertexStencils->GetNumControlVertices() + + vertexStencils->GetNumStencils(); + _srcData = SRC_VERTEX_BUFFER::Create(3, numTotalVerts, _deviceContext); _srcVaryingData = SRC_VERTEX_BUFFER::Create(3, numTotalVerts, _deviceContext); - _srcFVarData = EVAL_VERTEX_BUFFER::Create(2, numTotalFVarVerts, _deviceContext); _vertexData = EVAL_VERTEX_BUFFER::Create(6, numParticles, _deviceContext); _derivatives = EVAL_VERTEX_BUFFER::Create(6, numParticles, _deviceContext); - _fvarData = EVAL_VERTEX_BUFFER::Create(2, numParticles, _deviceContext); _patchTable = PATCH_TABLE::Create(patchTable, _deviceContext); _patchCoords = NULL; - _numCoarseVerts = numCoarseVerts; - _numCoarseFVarVerts = numCoarseFVarVerts; + _numCoarseVerts = vertexStencils->GetNumControlVertices(); _vertexStencils = Osd::convertToCompatibleStencilTable(vertexStencils, _deviceContext); _varyingStencils = Osd::convertToCompatibleStencilTable(varyingStencils, _deviceContext); - _faceVaryingStencils = (faceVaryingStencils) - ? Osd::convertToCompatibleStencilTable(faceVaryingStencils, _deviceContext) - : NULL; + + if (faceVaryingStencils) { + _numCoarseFVarVerts = faceVaryingStencils->GetNumControlVertices(); + int numTotalFVarVerts = faceVaryingStencils->GetNumControlVertices() + + faceVaryingStencils->GetNumStencils(); + _srcFVarData = EVAL_VERTEX_BUFFER::Create(2, numTotalFVarVerts, _deviceContext); + _fvarData = EVAL_VERTEX_BUFFER::Create(fvarWidth, numParticles, _deviceContext); + _faceVaryingStencils = + Osd::convertToCompatibleStencilTable(faceVaryingStencils, _deviceContext); + _fvarChannel = fvarChannel; + _fvarWidth = fvarWidth; + } else { + _numCoarseFVarVerts = 0; + _srcFVarData = NULL; + _fvarData = NULL; + _faceVaryingStencils = NULL; + _fvarChannel = 0; + _fvarWidth = 0; + } _evaluatorCache = evaluatorCache; } ~EvalOutput() { @@ -321,6 +339,9 @@ public: virtual void UpdateFaceVaryingData(const float *src, int startVertex, int numVertices) { _srcFVarData->UpdateData(src, startVertex, numVertices, _deviceContext); } + virtual bool HasFaceVaryingData() const { + return _faceVaryingStencils != NULL; + } virtual void Refine() { Osd::BufferDescriptor dstDesc = _srcDesc; dstDesc.offset += _numCoarseVerts * _srcDesc.stride; @@ -345,10 +366,10 @@ public: evalInstance, _deviceContext); - if (_faceVaryingStencils) { - int const fvarWidth = 2; - Osd::BufferDescriptor dstFVarDesc(_numCoarseFVarVerts*fvarWidth, - fvarWidth, fvarWidth); + if (HasFaceVaryingData()) { + Osd::BufferDescriptor dstFVarDesc = _srcFVarDesc; + dstFVarDesc.offset += _numCoarseFVarVerts * _srcFVarDesc.stride; + evalInstance = OpenSubdiv::Osd::GetEvaluator( _evaluatorCache, _srcFVarDesc, dstFVarDesc, _deviceContext); @@ -404,7 +425,7 @@ public: _fvarData, _fvarDesc, _patchCoords->GetNumVertices(), _patchCoords, - _patchTable, /*fvarChannel=*/0, evalInstance, _deviceContext); + _patchTable, _fvarChannel, evalInstance, _deviceContext); } virtual void UpdatePatchCoords( std::vector const &patchCoords) { @@ -444,6 +465,9 @@ private: STENCIL_TABLE const *_varyingStencils; STENCIL_TABLE const *_faceVaryingStencils; + int _fvarChannel; + int _fvarWidth; + EvaluatorCache *_evaluatorCache; DEVICE_CONTEXT *_deviceContext; }; @@ -519,7 +543,7 @@ updateGeom() { // color if (g_drawMode == kVARYING) { g_evalOutput->EvalPatchesVarying(); - } else if (g_drawMode == kFACEVARYING) { + } else if (g_drawMode == kFACEVARYING && g_evalOutput->HasFaceVaryingData()) { g_evalOutput->EvalPatchesFaceVarying(); } @@ -579,8 +603,10 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Far::StencilTable const * vertexStencils = NULL; Far::StencilTable const * varyingStencils = NULL; Far::StencilTable const * faceVaryingStencils = NULL; - std::vector fvarData; - int nverts=0, nTotalfvarVerts=0; + + int fvarChannel = 0; + int fvarWidth = shape->GetFVarWidth(); + bool hasFVarData = !shape->uvs.empty(); { bool adaptive = (sdctype == OpenSubdiv::Sdc::SCHEME_CATMARK); @@ -590,7 +616,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { // Apply feature adaptive refinement to the mesh so that we can use the // limit evaluation API features. Far::TopologyRefiner::AdaptiveOptions options(level); - options.considerFVarChannels = true; + options.considerFVarChannels = hasFVarData; options.useInfSharpPatch = doInfSharpPatch; topologyRefiner->RefineAdaptive(options); } else { @@ -609,10 +635,16 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Far::StencilTableFactory::Create(*topologyRefiner, soptions); soptions.interpolationMode = Far::StencilTableFactory::INTERPOLATE_VARYING; - varyingStencils = Far::StencilTableFactory::Create(*topologyRefiner, soptions); + if (hasFVarData) { + soptions.interpolationMode = Far::StencilTableFactory::INTERPOLATE_FACE_VARYING; + soptions.fvarChannel = fvarChannel; + faceVaryingStencils = + Far::StencilTableFactory::Create(*topologyRefiner, soptions); + } + // Generate bi-cubic patch table for the limit surface Far::PatchTableFactory::Options poptions(level); if (g_endCap == kEndCapBSplineBasis) { @@ -623,7 +655,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Far::PatchTableFactory::Options::ENDCAP_GREGORY_BASIS); } poptions.useInfSharpPatch = doInfSharpPatch; - poptions.generateFVarTables = true; + poptions.generateFVarTables = hasFVarData; poptions.generateFVarLegacyLinearPatches = false; Far::PatchTable const * patchTable = @@ -649,28 +681,18 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { } if (Far::StencilTable const *localPointFaceVaryingStencilTable = patchTable->GetLocalPointFaceVaryingStencilTable()) { - faceVaryingStencils = localPointFaceVaryingStencilTable; + Far::StencilTable const *table = + Far::StencilTableFactory::AppendLocalPointStencilTableFaceVarying( + *topologyRefiner, + faceVaryingStencils, localPointFaceVaryingStencilTable); + delete faceVaryingStencils; + faceVaryingStencils = table; } - // total number of vertices = coarse verts + refined verts + gregory basis verts - nverts = vertexStencils->GetNumControlVertices() + - vertexStencils->GetNumStencils(); - - nTotalfvarVerts = topologyRefiner->GetNumFVarValuesTotal(0) + - patchTable->GetNumLocalPointsFaceVarying(0); - - InterpolateFVarData(*topologyRefiner, *shape, fvarData); - if (g_patchTable) delete g_patchTable; g_patchTable = patchTable; } - delete shape; - - // note that for patch eval we need coarse+refined combined buffer. - int nCoarseVertices = topologyRefiner->GetLevel(0).GetNumVertices(); - int nCoarseFVarVertices = (int)fvarData.size()/2; - // In following template instantiations, same type of vertex buffers are // used for both source and destination (first and second template // parameters), since we'd like to draw control mesh wireframe too in @@ -686,8 +708,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::CpuPatchTable, Osd::CpuEvaluator> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable); #ifdef OPENSUBDIV_HAS_OPENMP } else if (g_kernel == kOPENMP) { @@ -697,8 +718,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::CpuPatchTable, Osd::OmpEvaluator> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable); #endif #ifdef OPENSUBDIV_HAS_TBB @@ -709,8 +729,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::CpuPatchTable, Osd::TbbEvaluator> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable); #endif #ifdef OPENSUBDIV_HAS_CUDA @@ -721,8 +740,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::CudaPatchTable, Osd::CudaEvaluator> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable); #endif #ifdef OPENSUBDIV_HAS_OPENCL @@ -735,8 +753,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::CLEvaluator, CLDeviceContext> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable, &clEvaluatorCache, &g_clDeviceContext); #endif @@ -749,8 +766,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::GLPatchTable, Osd::GLXFBEvaluator> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable, &glXFBEvaluatorCache); #endif @@ -763,14 +779,18 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::GLPatchTable, Osd::GLComputeEvaluator> (vertexStencils, varyingStencils, faceVaryingStencils, - nCoarseVertices, nverts, - nCoarseFVarVertices, nTotalfvarVerts, + fvarChannel, fvarWidth, g_nParticles, g_patchTable, &glComputeEvaluatorCache); #endif } - g_evalOutput->UpdateFaceVaryingData(&fvarData[0], 0, (int)fvarData.size()/2); + if (g_evalOutput->HasFaceVaryingData()) { + g_evalOutput->UpdateFaceVaryingData( + &shape->uvs[0], 0, (int)shape->uvs.size()/shape->GetFVarWidth()); + } + + delete shape; // Create the 'uv particles' manager - this class manages the limit // location samples (ptex face index, (s,t) and updates them between frames. @@ -903,7 +923,9 @@ drawSamples() { glEnableVertexAttribArray(g_defaultProgram.attrTangentU); glEnableVertexAttribArray(g_defaultProgram.attrTangentV); glEnableVertexAttribArray(g_defaultProgram.attrPatchCoord); - glEnableVertexAttribArray(g_defaultProgram.attrFVarData); + if (g_evalOutput->HasFaceVaryingData()) { + glEnableVertexAttribArray(g_defaultProgram.attrFVarData); + } glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindVertexData()); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 6, 0); @@ -916,15 +938,19 @@ drawSamples() { glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindPatchCoords()); glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 5, (float*)12); - glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindFaceVaryingData()); - glVertexAttribPointer(5, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 2, 0); + if (g_evalOutput->HasFaceVaryingData()) { + glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindFaceVaryingData()); + glVertexAttribPointer(5, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 2, 0); + } glEnableVertexAttribArray(g_defaultProgram.attrPosition); glEnableVertexAttribArray(g_defaultProgram.attrColor); glEnableVertexAttribArray(g_defaultProgram.attrTangentU); glEnableVertexAttribArray(g_defaultProgram.attrTangentV); glEnableVertexAttribArray(g_defaultProgram.attrPatchCoord); - glEnableVertexAttribArray(g_defaultProgram.attrFVarData); + if (g_evalOutput->HasFaceVaryingData()) { + glEnableVertexAttribArray(g_defaultProgram.attrFVarData); + } glPointSize(2.0f); int nPatchCoords = (int)g_particles->GetPatchCoords().size(); diff --git a/examples/glEvalLimit/init_shapes.h b/examples/glEvalLimit/init_shapes.h index c7cb0dd1..d21e7077 100644 --- a/examples/glEvalLimit/init_shapes.h +++ b/examples/glEvalLimit/init_shapes.h @@ -47,6 +47,7 @@ static void initShapes() { g_defaultShapes.push_back( ShapeDesc("catmark_cube_corner4", catmark_cube_corner4, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_cube_creases0", catmark_cube_creases0, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_cube_creases1", catmark_cube_creases1, kCatmark ) ); + g_defaultShapes.push_back( ShapeDesc("catmark_cube_creases2", catmark_cube_creases2, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_cube", catmark_cube, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_dart_edgecorner", catmark_dart_edgecorner, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_dart_edgeonly", catmark_dart_edgeonly, kCatmark ) ); @@ -55,6 +56,8 @@ static void initShapes() { g_defaultShapes.push_back( ShapeDesc("catmark_chaikin0", catmark_chaikin0, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_chaikin1", catmark_chaikin1, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_chaikin2", catmark_chaikin2, kCatmark ) ); + g_defaultShapes.push_back( ShapeDesc("catmark_single_crease", catmark_single_crease, kCatmark ) ); + g_defaultShapes.push_back( ShapeDesc("catmark_inf_crease0", catmark_inf_crease0, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_fan", catmark_fan, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_flap", catmark_flap, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_flap2", catmark_flap2, kCatmark ) ); diff --git a/examples/glFVarViewer/glFVarViewer.cpp b/examples/glFVarViewer/glFVarViewer.cpp index d81e1b08..d067b582 100644 --- a/examples/glFVarViewer/glFVarViewer.cpp +++ b/examples/glFVarViewer/glFVarViewer.cpp @@ -156,35 +156,54 @@ struct FVarData glDeleteTextures(1, &textureParamBuffer); textureParamBuffer = 0; } - void Create(OpenSubdiv::Far::PatchTable const *patchTable, - int fvarWidth, std::vector const & fvarSrcData) { + void Create(OpenSubdiv::Far::TopologyRefiner const *refiner, + OpenSubdiv::Far::PatchTable const *patchTable, + std::vector const & fvarSrcData, + int fvarWidth, int fvarChannel = 0) { using namespace OpenSubdiv; Release(); - Far::ConstIndexArray indices = patchTable->GetFVarValues(); - const float * fvarSrcDataPtr = &fvarSrcData[0]; - Osd::CpuVertexBuffer *fvarBuffer = NULL; + Far::StencilTableFactory::Options soptions; + soptions.interpolationMode = Far::StencilTableFactory::INTERPOLATE_FACE_VARYING; + soptions.fvarChannel = fvarChannel; + soptions.generateOffsets = true; + soptions.generateIntermediateLevels = !refiner->IsUniform(); + Far::StencilTable const *fvarStencils = + Far::StencilTableFactory::Create(*refiner, soptions); - int numLocalFVarPoints = patchTable->GetNumLocalPointsFaceVarying(); - if (numLocalFVarPoints > 0) { - int numSrcFVarPoints = (int)fvarSrcData.size() / fvarWidth; - fvarBuffer = Osd::CpuVertexBuffer::Create( - fvarWidth, numSrcFVarPoints + numLocalFVarPoints); - fvarBuffer->UpdateData(&fvarSrcData[0], 0, numSrcFVarPoints); - - Osd::BufferDescriptor srcDesc(0, fvarWidth, fvarWidth); - Osd::BufferDescriptor dstDesc(numSrcFVarPoints*fvarWidth, - fvarWidth, fvarWidth); - - Osd::CpuEvaluator::EvalStencils(fvarBuffer, srcDesc, - fvarBuffer, dstDesc, - patchTable->GetLocalPointFaceVaryingStencilTable()); - - fvarSrcDataPtr = fvarBuffer->BindCpuBuffer(); + if (Far::StencilTable const *fvarStencilsWithLocalPoints = + Far::StencilTableFactory::AppendLocalPointStencilTableFaceVarying( + *refiner, + fvarStencils, + patchTable->GetLocalPointFaceVaryingStencilTable(), + fvarChannel)) { + delete fvarStencils; + fvarStencils = fvarStencilsWithLocalPoints; } + int numSrcFVarPoints = (int)fvarSrcData.size() / fvarWidth; + int numFVarPoints = numSrcFVarPoints + + fvarStencils->GetNumStencils(); + + Osd::CpuVertexBuffer *fvarBuffer = + Osd::CpuVertexBuffer::Create(fvarWidth, numFVarPoints); + fvarBuffer->UpdateData(&fvarSrcData[0], 0, numSrcFVarPoints); + + Osd::BufferDescriptor srcDesc(0, fvarWidth, fvarWidth); + Osd::BufferDescriptor dstDesc(numSrcFVarPoints*fvarWidth, + fvarWidth, fvarWidth); + + Osd::CpuEvaluator::EvalStencils(fvarBuffer, srcDesc, + fvarBuffer, dstDesc, + fvarStencils); + + Far::ConstIndexArray indices = patchTable->GetFVarValues(); + const float * fvarSrcDataPtr = !refiner->IsUniform() + ? fvarBuffer->BindCpuBuffer() + : fvarBuffer->BindCpuBuffer() + numSrcFVarPoints * fvarWidth; + // expand fvardata to per-patch array std::vector data; data.reserve(indices.size() * fvarWidth); @@ -201,9 +220,7 @@ struct FVarData glBufferData(GL_ARRAY_BUFFER, data.size()*sizeof(float), &data[0], GL_STATIC_DRAW); - if (fvarBuffer) { - delete fvarBuffer; - } + delete fvarBuffer; glGenTextures(1, &textureBuffer); glBindTexture(GL_TEXTURE_BUFFER, textureBuffer); @@ -435,13 +452,9 @@ rebuildMesh() { numVaryingElements, level, bits); - std::vector fvarData; - - InterpolateFVarData(*refiner, *shape, fvarData); - // set fvardata to texture buffer - g_fvarData.Create(g_mesh->GetFarPatchTable(), - shape->GetFVarWidth(), fvarData); + g_fvarData.Create(refiner, g_mesh->GetFarPatchTable(), + shape->uvs, shape->GetFVarWidth()); delete shape; From 796a2f40a795cf6ee642ff5741bd078a685f78d0 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 15 Dec 2016 12:33:36 -0800 Subject: [PATCH 03/20] Fixed bug with non-manifold face-varying topology causing crash: - corrected the regular patch assembly in Far::PatchTableFactory - updated regression shapes to include the problematic topology --- examples/glFVarViewer/init_shapes.h | 1 + opensubdiv/far/patchTableFactory.cpp | 14 +++++- regression/shapes/all.h | 1 + regression/shapes/catmark_fan.h | 62 +++++++++++++++---------- regression/shapes/catmark_fvar_bound4.h | 51 ++++++++++++++++++++ 5 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 regression/shapes/catmark_fvar_bound4.h diff --git a/examples/glFVarViewer/init_shapes.h b/examples/glFVarViewer/init_shapes.h index 5cb1c370..2996c699 100644 --- a/examples/glFVarViewer/init_shapes.h +++ b/examples/glFVarViewer/init_shapes.h @@ -61,6 +61,7 @@ static void initShapes() { g_defaultShapes.push_back( ShapeDesc("catmark_fvar_bound1", catmark_fvar_bound1, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_fvar_bound2", catmark_fvar_bound2, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_fvar_bound3", catmark_fvar_bound3, kCatmark ) ); + g_defaultShapes.push_back( ShapeDesc("catmark_fvar_bound4", catmark_fvar_bound4, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_fvar_project0", catmark_fvar_project0, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_gregory_test1", catmark_gregory_test1, kCatmark ) ); g_defaultShapes.push_back( ShapeDesc("catmark_gregory_test2", catmark_gregory_test2, kCatmark ) ); diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index 2058e4ff..55dcdf80 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -674,13 +674,23 @@ PatchTableFactory::BuilderContext::GetRegularPatchBoundaryMask( // patch, and so both of its neighboring corners need to be re-interpreted as // boundaries. // - // With the introduction of inf-sharp patches, this may soon change... + // With the introduction of sharp irregular patches, we are now better off + // using irregular patches where appropriate, which will simplify the following + // when this patch was already determined to be regular... // - if (fTag._nonManifold && (fvcRefiner < 0)) { + if (fTag._nonManifold) { if (vTags[0]._nonManifold) vBoundaryMask |= (1 << 0) | (vTags[0]._infSharp ? 10 : 0); if (vTags[1]._nonManifold) vBoundaryMask |= (1 << 1) | (vTags[1]._infSharp ? 5 : 0); if (vTags[2]._nonManifold) vBoundaryMask |= (1 << 2) | (vTags[2]._infSharp ? 10 : 0); if (vTags[3]._nonManifold) vBoundaryMask |= (1 << 3) | (vTags[3]._infSharp ? 5 : 0); + + // Force adjacent edges as boundaries if only one vertex in the resulting mask + // (which would be an irregular boundary for Catmark, but not Loop): + if ((vBoundaryMask == (1 << 0)) || (vBoundaryMask == (1 << 2))) { + vBoundaryMask |= 10; + } else if ((vBoundaryMask == (1 << 1)) || (vBoundaryMask == (1 << 3))) { + vBoundaryMask |= 5; + } } // Convert directly from a vertex- to edge-mask (no need to inspect edges): diff --git a/regression/shapes/all.h b/regression/shapes/all.h index a8fab5e7..813c44c9 100644 --- a/regression/shapes/all.h +++ b/regression/shapes/all.h @@ -49,6 +49,7 @@ #include "catmark_fvar_bound1.h" #include "catmark_fvar_bound2.h" #include "catmark_fvar_bound3.h" +#include "catmark_fvar_bound4.h" #include "catmark_fvar_project0.h" #include "catmark_gregory_test0.h" #include "catmark_gregory_test1.h" diff --git a/regression/shapes/catmark_fan.h b/regression/shapes/catmark_fan.h index 6b48952b..21bbdc30 100644 --- a/regression/shapes/catmark_fan.h +++ b/regression/shapes/catmark_fan.h @@ -1,5 +1,5 @@ // -// Copyright 2013 Pixar +// Copyright 2016 Dreamworks // // Licensed under the Apache License, Version 2.0 (the "Apache License") // with the following modification; you may not use this file except in @@ -25,27 +25,41 @@ static const std::string catmark_fan = "# This file uses centimeters as units for non-parametric coordinates.\n" "\n" -"v -1.000000 0.000000 -1.000000\n" -"v -1.000000 0.000000 0.000000\n" -"v 0.000000 0.000000 0.000000\n" -"v 0.000000 0.000000 -1.000000\n" -"v 1.000000 0.000000 0.000000\n" -"v 1.000000 0.000000 -1.000000\n" -"v 0.000000 1.000000 0.000000\n" -"v 0.000000 1.000000 -1.000000\n" -"vt 0.000000 0.000000\n" -"vt 1.000000 0.000000\n" -"vt 1.000000 1.000000\n" -"vt 0.000000 1.000000\n" -"vt 0.000000 0.000000\n" -"vt 1.000000 0.000000\n" -"vt 1.000000 1.000000\n" -"vt 0.000000 1.000000\n" -"vt 0.000000 0.000000\n" -"vt 1.000000 0.000000\n" -"vt 1.000000 1.000000\n" -"vt 0.000000 1.000000\n" -"f 1/1 2/2 3/3 4/4\n" -"f 4/5 3/6 5/7 6/8\n" -"f 4/9 3/10 7/11 8/12\n" +"# This file uses centimeters as units for non-parametric coordinates.\n" +"v 0.0 0 1.0\n" +"v -0.5 0 0.5\n" +"v 0.5 0 0.5\n" +"v -1.0 0 0.0\n" +"v 1.0 0 0.0\n" +"v -1.5 0 -0.5\n" +"v 1.5 0 -0.5\n" +"v -1.0 0 -1.0\n" +"v -0.5 0 -0.5\n" +"v 0.0 0 0.0\n" +"v 0.5 0 -0.5\n" +"v 1.0 0 -1.0\n" +"v -1.0 .5 -1.0\n" +"v -0.5 .5 -0.5\n" +"v 0.0 .5 0.0\n" +"v 0.5 .5 -0.5\n" +"v 1.0 .5 -1.0\n" +"v -1.0 -.5 -1.0\n" +"v -0.5 -.5 -0.5\n" +"v 0.0 -.5 0.0\n" +"v 0.5 -.5 -0.5\n" +"v 1.0 -.5 -1.0\n" +"f 1 2 10 3\n" +"f 2 4 9 10\n" +"f 4 6 8 9\n" +"f 5 3 10 11\n" +"f 7 5 11 12\n" +"f 8 9 14 13\n" +"f 9 10 15 14\n" +"f 10 11 16 15\n" +"f 11 12 17 16\n" +"f 9 8 18 19\n" +"f 10 9 19 20\n" +"f 11 10 20 21\n" +"f 12 11 21 22\n" +"t interpolateboundary 1/0/0 1\n" "\n"; diff --git a/regression/shapes/catmark_fvar_bound4.h b/regression/shapes/catmark_fvar_bound4.h new file mode 100644 index 00000000..3b7b0de5 --- /dev/null +++ b/regression/shapes/catmark_fvar_bound4.h @@ -0,0 +1,51 @@ +// +// Copyright 2016 Dreamworks +// +// 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_fvar_bound4 = +"v -0.5 0.0 -0.5\n" +"v 0.0 0.0 -0.5\n" +"v 0.5 0.0 -0.5\n" +"v -0.5 0.0 0.0\n" +"v 0.0 -0.5 0.0\n" +"v 0.5 0.0 0.0\n" +"v -0.5 0.0 0.5\n" +"v 0.0 0.0 0.5\n" +"v 0.5 0.0 0.5\n" +"vt 0.1 0.1\n" +"vt 0.5 0.0\n" +"vt 1.0 0.1\n" +"vt 0.0 0.5\n" +"vt 0.6 0.6\n" +"vt 1.0 0.4\n" +"vt 1.0 0.6\n" +"vt 0.1 1.0\n" +"vt 0.4 1.0\n" +"vt 0.6 1.0\n" +"vt 1.0 1.0\n" +"f 1/1 2/2 5/5 4/4\n" +"f 2/2 3/3 6/6 5/5\n" +"f 4/4 5/5 8/9 7/8\n" +"f 5/5 6/7 9/11 8/10\n" +"t interpolateboundary 1/0/0 1\n" +; From ff380188e69aa9b12faddf40ab8b0cb835f19160 Mon Sep 17 00:00:00 2001 From: Jeremy Cowles Date: Thu, 27 Oct 2016 14:05:19 -0700 Subject: [PATCH 04/20] WIN32 Glew fixes to CMakeLists.txt Previously, glew was forced to static linkage on windows, even when dynamic Glew libraries were linked which would result in linker errors. In this change, static glew libraries are detected by looking for the "s" suffix convention on the library (though, maybe this should be handled in the FindGlew module). --- CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e09b7520..48673213 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -530,10 +530,12 @@ else() endif() if (WIN32) - add_definitions( - # Link against the static version of GLEW. - -DGLEW_STATIC - ) + if ("${GLEW_LIBRARY}" MATCHES "glew32s(d|)") + # Link against the static version of GLEW + add_definitions( + -DGLEW_STATIC + ) + endif() if (DXSDK_FOUND AND NOT NO_DX) add_definitions( From cd6cedc1acd119fdddbeb922ef4e57c5685a5eb9 Mon Sep 17 00:00:00 2001 From: Thomas Thomassen Date: Tue, 9 Feb 2016 17:36:05 +0100 Subject: [PATCH 05/20] Added option to build using MSVC with static CRT. --- CMakeLists.txt | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48673213..b18c3337 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,11 +244,24 @@ elseif(MSVC) #/D_HAS_ITERATOR_DEBUGGING=0 ) - # Turn off a duplicate LIBCMT linker warning - set(CMAKE_EXE_LINKER_FLAGS - "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libcmt.lib") - set(CMAKE_SHARED_LINKER_FLAGS - "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:libcmt.lib") + option(MSVC_STATIC_CRT "Statically link MSVC CRT" OFF) + + if(MSVC_STATIC_CRT) + message(STATUS "Using static MSVC CRT") + # http://stackoverflow.com/a/32128977/486990 + add_compile_options( + "$<$:/MTd>" + "$<$:/MT>" + "$<$:/MT>" + "$<$:/MT>" + ) + else() + # Turn off a duplicate LIBCMT linker warning + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libcmt.lib") + set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:libcmt.lib") + endif() endif() From 0beb654f0b2d0904eee0a6272975444e60e7ba73 Mon Sep 17 00:00:00 2001 From: Mike Erwin Date: Wed, 12 Aug 2015 14:03:27 -0400 Subject: [PATCH 06/20] spelling Noticed a few typos when browsing comments. Proceeded with a "manual spell check", reading all comments and tweaking spelling, grammar, punctuation. Didn't bother with Hbr library. Comments only, no functional changes. --- CMakeLists.txt | 6 +++--- examples/glViewer/glViewer.cpp | 2 +- .../far/endCapBSplineBasisPatchFactory.cpp | 2 +- .../far/endCapBSplineBasisPatchFactory.h | 2 +- .../far/endCapGregoryBasisPatchFactory.cpp | 4 ++-- .../far/endCapGregoryBasisPatchFactory.h | 4 ++-- .../far/endCapLegacyGregoryPatchFactory.cpp | 2 +- .../far/endCapLegacyGregoryPatchFactory.h | 2 +- opensubdiv/far/patchTable.h | 2 +- opensubdiv/far/primvarRefiner.h | 16 ++++++++-------- opensubdiv/far/stencilBuilder.h | 2 +- opensubdiv/far/stencilTable.h | 10 +++++----- opensubdiv/far/stencilTableFactory.cpp | 4 ++-- opensubdiv/far/stencilTableFactory.h | 6 +++--- opensubdiv/far/topologyLevel.h | 4 ++-- opensubdiv/far/topologyRefinerFactory.h | 8 ++++---- opensubdiv/far/types.h | 2 +- opensubdiv/osd/clD3D11VertexBuffer.h | 2 +- opensubdiv/osd/clGLVertexBuffer.h | 2 +- opensubdiv/osd/clVertexBuffer.h | 2 +- opensubdiv/osd/cpuD3D11VertexBuffer.h | 2 +- opensubdiv/osd/cpuGLVertexBuffer.h | 2 +- opensubdiv/osd/cpuVertexBuffer.h | 2 +- opensubdiv/osd/cudaD3D11VertexBuffer.h | 2 +- opensubdiv/osd/cudaGLVertexBuffer.h | 2 +- opensubdiv/osd/cudaVertexBuffer.h | 2 +- opensubdiv/osd/d3d11VertexBuffer.h | 2 +- opensubdiv/osd/glVertexBuffer.h | 2 +- opensubdiv/sdc/bilinearScheme.h | 2 +- opensubdiv/sdc/catmarkScheme.h | 2 +- opensubdiv/sdc/crease.h | 6 +++--- opensubdiv/sdc/loopScheme.h | 12 ++++++------ opensubdiv/sdc/options.h | 6 +++--- opensubdiv/sdc/scheme.h | 10 +++++----- opensubdiv/sdc/types.h | 8 ++++---- opensubdiv/vtr/componentInterfaces.h | 2 +- opensubdiv/vtr/fvarLevel.cpp | 4 ++-- opensubdiv/vtr/fvarLevel.h | 2 +- opensubdiv/vtr/fvarRefinement.cpp | 4 ++-- opensubdiv/vtr/level.cpp | 16 ++++++++-------- opensubdiv/vtr/level.h | 18 +++++++++--------- opensubdiv/vtr/quadRefinement.cpp | 16 ++++++++-------- opensubdiv/vtr/refinement.cpp | 4 ++-- opensubdiv/vtr/refinement.h | 8 ++++---- opensubdiv/vtr/stackBuffer.h | 6 +++--- opensubdiv/vtr/triRefinement.cpp | 4 ++-- opensubdiv/vtr/triRefinement.h | 2 +- opensubdiv/vtr/types.h | 6 +++--- 48 files changed, 119 insertions(+), 119 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48673213..efac43de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,7 +143,7 @@ SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(OSD_COMPILER_FLAGS) -# Disable spurrious warnings in gcc builds and clang +# Disable spurious warnings in gcc builds and clang if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_ICC ) # Turn on all warnings @@ -154,7 +154,7 @@ if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_IC endif() # HBR uses the offsetof macro on a templated struct, which appears - # to spurriously set off this warning in both gccc and Clang + # to spuriously set off this warning in both gcc and Clang list(APPEND OSD_COMPILER_FLAGS -Wno-invalid-offsetof) # HBR uses unions as an optimization for its memory allocation. @@ -164,7 +164,7 @@ if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_IC list(APPEND OSD_COMPILER_FLAGS -Wno-strict-aliasing) # FAR and OSD have templated virtual function implementations that trigger - # a lot of hidden virtual function overloads (some of them spurrious). + # a lot of hidden virtual function overloads (some of them spurious). # Disable those for now in Clang. if(CMAKE_COMPILER_IS_CLANGCC) list(APPEND OSD_COMPILER_FLAGS -Wno-overloaded-virtual) diff --git a/examples/glViewer/glViewer.cpp b/examples/glViewer/glViewer.cpp index bd39e9ec..f71e8327 100644 --- a/examples/glViewer/glViewer.cpp +++ b/examples/glViewer/glViewer.cpp @@ -85,7 +85,7 @@ OpenSubdiv::Osd::GLLegacyGregoryPatchTable *g_legacyGregoryPatchTable = NULL; /* Function to get the correct shader file based on the opengl version. - The implentation varies depending if glew is available or not. In case + The implementation varies depending if glew is available or not. In case is available the capabilities are queried during execution and the correct source is returned. If glew in not available during compile time the version is determined*/ diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index 28acd8e8..db8b2be6 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -132,7 +132,7 @@ EndCapBSplineBasisPatchFactory::getPatchPointsFromGregoryBasis( // 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. + // other patches as well as try to make extra-ordinary verts watertight. int offset = (fvarChannel < 0) ? _refiner->GetNumVerticesTotal() diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.h b/opensubdiv/far/endCapBSplineBasisPatchFactory.h index 90ebb88a..c3d6ffd0 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.h +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.h @@ -45,7 +45,7 @@ class TopologyRefiner; class EndCapBSplineBasisPatchFactory { public: - /// \brief This factory accumulates vertex for bspline basis end cap + /// \brief This factory accumulates vertices for bspline basis end cap /// /// @param refiner TopologyRefiner from which to generate patches /// diff --git a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp index 2c9278bd..8464e018 100644 --- a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp @@ -190,7 +190,7 @@ EndCapGregoryBasisPatchFactory::GetPatchPoints( int aedge = aedges.FindIndexIn4Tuple(edge); assert(aedge!=Vtr::INDEX_INVALID); - // Find index of basis in the list of basis already generated + // Find index of basis in the list of bases already generated unsigned int adjLevelAndFaceIndex = LevelAndFaceIndex::create(levelIndex, adjFaceIndex); unsigned int * ptr = (unsigned int *)std::bsearch(&adjLevelAndFaceIndex, &_levelAndFaceIndices[0], @@ -212,7 +212,7 @@ EndCapGregoryBasisPatchFactory::GetPatchPoints( Index * src = &_patchPoints[adjPatchIndex*20]; for (int j=0; j<4; ++j) { // invert direction - // note that src indices have already been offsetted. + // note that src indices have already been offsetted. dest[gregoryEdgeVerts[i][3-j]] = src[gregoryEdgeVerts[aedge][j]]; } } diff --git a/opensubdiv/far/endCapGregoryBasisPatchFactory.h b/opensubdiv/far/endCapGregoryBasisPatchFactory.h index 5fb504a4..4831c4e7 100644 --- a/opensubdiv/far/endCapGregoryBasisPatchFactory.h +++ b/opensubdiv/far/endCapGregoryBasisPatchFactory.h @@ -72,7 +72,7 @@ public: /// \brief Returns end patch point indices for \a faceIndex of \a level. /// Note that end patch points are not included in the vertices in /// the topologyRefiner, they're expected to come after the end. - /// The returning indices are offsetted by refiner->GetNumVerticesTotal. + /// The returned indices are offsetted by refiner->GetNumVerticesTotal. /// /// @param level vtr refinement level /// @@ -91,7 +91,7 @@ public: private: /// Creates a basis for the vertices specified in mask on the face and - /// accumates it + /// accumulates it bool addPatchBasis(Vtr::internal::Level const & level, Index faceIndex, Vtr::internal::Level::VSpan const cornerSpans[], bool newVerticesMask[4][5], diff --git a/opensubdiv/far/endCapLegacyGregoryPatchFactory.cpp b/opensubdiv/far/endCapLegacyGregoryPatchFactory.cpp index 6deb14f1..03fc1f79 100644 --- a/opensubdiv/far/endCapLegacyGregoryPatchFactory.cpp +++ b/opensubdiv/far/endCapLegacyGregoryPatchFactory.cpp @@ -140,7 +140,7 @@ EndCapLegacyGregoryPatchFactory::Finalize( // - it allocates 2*maxvalence+1 for ALL vertices // - it initializes the one-ring for ALL vertices // We use the full size expected (not sure what else relies on that) but - // we avoiding initializing + // we avoid initializing // the vast majority of vertices that are not associated with gregory // patches -- by having previously marked those that are associated above // and skipping all others. diff --git a/opensubdiv/far/endCapLegacyGregoryPatchFactory.h b/opensubdiv/far/endCapLegacyGregoryPatchFactory.h index 966fd7e5..e3b9f354 100644 --- a/opensubdiv/far/endCapLegacyGregoryPatchFactory.h +++ b/opensubdiv/far/endCapLegacyGregoryPatchFactory.h @@ -50,7 +50,7 @@ public: /// \brief Returns end patch point indices for \a faceIndex of \a level. /// Note that legacy gregory patch points exist in the max level /// of subdivision in the topologyRefiner. - /// The returning indices are offsetted by levelVertOffset + /// The returned indices are offsetted by levelVertOffset /// /// @param level vtr refinement level /// diff --git a/opensubdiv/far/patchTable.h b/opensubdiv/far/patchTable.h index 4262c924..c4a69db8 100644 --- a/opensubdiv/far/patchTable.h +++ b/opensubdiv/far/patchTable.h @@ -42,7 +42,7 @@ namespace Far { /// \brief Container for arrays of parametric patches /// -/// PatchTable contain topology and parametric information about the patches +/// PatchTable contains topology and parametric information about the patches /// generated by the Refinement process. Patches in the table are sorted into /// arrays based on their PatchDescriptor Type. /// diff --git a/opensubdiv/far/primvarRefiner.h b/opensubdiv/far/primvarRefiner.h index 9ab0c2e2..b09b09a2 100644 --- a/opensubdiv/far/primvarRefiner.h +++ b/opensubdiv/far/primvarRefiner.h @@ -92,14 +92,14 @@ public: /// (ex. std::vector). /// Some interpolation methods however allow passing the buffers by /// reference: this allows to work transparently with arrays and - /// containers (or other scheme that overload the '[]' operator) + /// containers (or other schemes that overload the '[]' operator) ///

/// See the /// Far tutorials for code examples. /// /// \brief Apply vertex interpolation weights to a primvar buffer for a single - /// level level of refinement. + /// level of refinement. /// /// The destination buffer must allocate an array of data for all the /// refined vertices, i.e. at least refiner.GetLevel(level).GetNumVertices() @@ -113,7 +113,7 @@ public: template void Interpolate(int level, T const & src, U & dst) const; /// \brief Apply only varying interpolation weights to a primvar buffer - /// for a single level level of refinement. + /// for a single level of refinement. /// /// This method can useful if the varying primvar data does not need to be /// re-computed over time. @@ -410,7 +410,7 @@ PrimvarRefiner::InterpolateVarying(int level, T const & src, U & dst) const { Vtr::internal::Level const & parent = refinement.parent(); // - // Group values to interolate based on origin -- note that there may + // Group values to interpolate based on origin -- note that there may // be none originating from faces: // if (refinement.getNumChildVerticesFromFaces() > 0) { @@ -608,7 +608,7 @@ PrimvarRefiner::interpFromVerts(int level, T const & src, U & dst) const { // Apply the weights to the parent vertex, the vertices opposite its incident // edges, and the child vertices of its incident faces: // - // In order to improve numerical precision, its better to apply smaller weights + // In order to improve numerical precision, it's better to apply smaller weights // first, so begin with the face-weights followed by the edge-weights and the // vertex weight last. dst[cVert].Clear(); @@ -748,7 +748,7 @@ PrimvarRefiner::interpFVarFromEdges(int level, T const & src, U & dst, int chann scheme.ComputeEdgeVertexMask(eHood, eMask, pRule, cRule); } - // Apply the weights to the parent edges's vertices and (if applicable) to + // Apply the weights to the parent edge's vertices and (if applicable) to // the child vertices of its incident faces: // // Even though the face-varying topology matches the vertex topology, we need @@ -915,7 +915,7 @@ PrimvarRefiner::interpFVarFromVerts(int level, T const & src, U & dst, int chann // it matches. // // As with applying the mask to vertex data, in order to improve numerical - // precision, its better to apply smaller weights first, so begin with the + // precision, it's better to apply smaller weights first, so begin with the // face-weights followed by the edge-weights and the vertex weight last. // Vtr::Index pVertValue = pVertValues[0]; @@ -1093,7 +1093,7 @@ PrimvarRefiner::limit(T const & src, U & dstPos, U1 * dstTan1Ptr, U2 * dstTan2Pt // // Combine the weights and indices for position and tangents. As with applying - // refinment masks to vertex data, in order to improve numerical precision, its + // refinement masks to vertex data, in order to improve numerical precision, it's // better to apply smaller weights first, so begin with the face-weights followed // by the edge-weights and the vertex weight last. // diff --git a/opensubdiv/far/stencilBuilder.h b/opensubdiv/far/stencilBuilder.h index 66cba7d0..76fefe8a 100644 --- a/opensubdiv/far/stencilBuilder.h +++ b/opensubdiv/far/stencilBuilder.h @@ -53,7 +53,7 @@ public: void SetCoarseVertCount(int numVerts); - // Mapping from stencil[i] to it's starting offset in the sources[] and weights[] arrays; + // Mapping from stencil[i] to its starting offset in the sources[] and weights[] arrays; std::vector const& GetStencilOffsets() const; // The number of contributing sources and weights in stencil[i] diff --git a/opensubdiv/far/stencilTable.h b/opensubdiv/far/stencilTable.h index 3d4f19a8..9d57e097 100644 --- a/opensubdiv/far/stencilTable.h +++ b/opensubdiv/far/stencilTable.h @@ -83,7 +83,7 @@ public: return _size; } - /// \brief Returns the control vertices indices + /// \brief Returns the control vertices' indices Index const * GetVertexIndices() const { return _indices; } @@ -112,7 +112,7 @@ protected: /// \brief Table of subdivision stencils. /// -/// Stencils are the most direct methods of evaluation of locations on the limit +/// Stencils are the most direct method of evaluation of locations on the limit /// of a surface. Every point of a limit surface can be computed by linearly /// blending a collection of coarse control vertices. /// @@ -230,7 +230,7 @@ protected: int _numControlVertices; // number of control vertices - std::vector _sizes; // number of coeffiecient for each stencil + std::vector _sizes; // number of coefficients for each stencil std::vector _offsets, // offset to the start of each stencil _indices; // indices of contributing coarse vertices std::vector _weights; // stencil weight coefficients @@ -449,7 +449,7 @@ private: }; -// Update values by appling cached stencil weights to new control values +// Update values by applying cached stencil weights to new control values template void StencilTable::update(T const *controlValues, T *values, std::vector const &valueWeights, Index start, Index end) const { @@ -476,7 +476,7 @@ StencilTable::update(T const *controlValues, T *values, // Zero out the result accumulators values[i].Clear(); - // For each element in the array, add the coefs contribution + // For each element in the array, add the coef's contribution for (int j=0; j<*sizes; ++j, ++indices, ++weights) { values[i].AddWithWeight( controlValues[*indices], *weights ); } diff --git a/opensubdiv/far/stencilTableFactory.cpp b/opensubdiv/far/stencilTableFactory.cpp index 6fe92622..9bf8c622 100644 --- a/opensubdiv/far/stencilTableFactory.cpp +++ b/opensubdiv/far/stencilTableFactory.cpp @@ -274,7 +274,7 @@ StencilTableFactory::appendLocalPointStencilTable( : refiner.GetNumFVarValuesTotal(channel); if (nBaseStencils == nverts) { - // the table contain stencils for the control vertices + // the table contains stencils for the control vertices // // <----------------- nverts ------------------> // @@ -314,7 +314,7 @@ StencilTableFactory::appendLocalPointStencilTable( } } - // copy all local points stencils to proto stencils, and factorize if needed. + // copy all local point stencils to proto stencils, and factorize if needed. int nLocalPointStencils = localPointStencilTable->GetNumStencils(); int nLocalPointStencilsElements = 0; diff --git a/opensubdiv/far/stencilTableFactory.h b/opensubdiv/far/stencilTableFactory.h index a9f21296..4400a05c 100644 --- a/opensubdiv/far/stencilTableFactory.h +++ b/opensubdiv/far/stencilTableFactory.h @@ -93,9 +93,9 @@ public: /// \brief Instantiates StencilTable by concatenating an array of existing - /// stencil table. + /// stencil tables. /// - /// \note This factory checks that the stencil table point to the same set + /// \note This factory checks that the stencil tables point to the same set /// of supporting control vertices - no re-indexing is done. /// GetNumControlVertices() *must* return the same value for all input /// tables. @@ -116,7 +116,7 @@ public: /// @param localPointStencilTable /// StencilTable for the change of basis patch points. /// - /// @param factorize If factorize sets to true, endcap stencils will be + /// @param factorize If factorize set to true, endcap stencils will be /// factorized with supporting vertices from baseStencil /// table so that the endcap points can be computed /// directly from control vertices. diff --git a/opensubdiv/far/topologyLevel.h b/opensubdiv/far/topologyLevel.h index 7a19071f..013d816d 100644 --- a/opensubdiv/far/topologyLevel.h +++ b/opensubdiv/far/topologyLevel.h @@ -43,7 +43,7 @@ namespace Far { /// TopologyLevel provides an interface to data in a specific level of a topology hierarchy. /// Instances of TopologyLevel are created and owned by a TopologyRefiner, /// which will return const-references to them. Such references are only valid during the -/// lifetime of TopologyRefiner that created and returned them, and only for a given refinement, +/// lifetime of the TopologyRefiner that created and returned them, and only for a given refinement, /// i.e. if the TopologyRefiner is re-refined, any references to TopoologyLevels are invalidated. /// class TopologyLevel { @@ -167,7 +167,7 @@ public: /// unspecified. /// /// A face-varying channel is composed of a set of values that may be shared - /// by faces meeting at a common vertex. Just as there are set of vertices + /// by faces meeting at a common vertex. Just as there are sets of vertices /// that are associated with faces by index (ranging from 0 to /// num-vertices - 1), face-varying values are also referenced by index /// (ranging from 0 to num-values -1). diff --git a/opensubdiv/far/topologyRefinerFactory.h b/opensubdiv/far/topologyRefinerFactory.h index 7a7164cd..37918ccb 100644 --- a/opensubdiv/far/topologyRefinerFactory.h +++ b/opensubdiv/far/topologyRefinerFactory.h @@ -260,10 +260,10 @@ protected: /// /// These methods are used to assign edge or vertex sharpness, for tagging faces /// as holes, etc. Unlike topological assignment, only those components that - /// posses a feature of interest need be explicitly assigned. + /// possess a feature of interest need be explicitly assigned. /// /// Since topological construction is largely complete by this point, a method is - /// availble to identify an edge for sharpness assignment given a pair of vertices. + /// available to identify an edge for sharpness assignment given a pair of vertices. /// /// \brief Identify an edge to be assigned a sharpness value given a vertex pair @@ -286,7 +286,7 @@ protected: /// topology is assigned -- indices for face-varying values are assigned to the /// corners of each face just as indices for vertices were assigned. /// - /// Independent sets of face-varying data is stored in channels. The identifier + /// Independent sets of face-varying data are stored in channels. The identifier /// of each channel (an integer) is expected whenever referring to face-varying /// data in any form. /// @@ -614,7 +614,7 @@ TopologyRefinerFactory::assignComponentTopology(TopologyRefiner& /* refine // or, if the mesh is manifold, explicit assignment of these can be deferred and // all can be determined by calling: // - // void populateBaseLocalIndices(TopologyRefiner& newRefiner, ) + // void populateBaseLocalIndices(TopologyRefiner& newRefiner) // // All components are assumed to be locally manifold and ordering of components in // the above relations is expected to be counter-clockwise. diff --git a/opensubdiv/far/types.h b/opensubdiv/far/types.h index e3988a22..8a476d88 100644 --- a/opensubdiv/far/types.h +++ b/opensubdiv/far/types.h @@ -35,7 +35,7 @@ namespace OPENSUBDIV_VERSION { namespace Far { // -// Typedef's for indices that are inherited from the Vtr level -- eventually +// Typedefs for indices that are inherited from the Vtr level -- eventually // these primitive Vtr types may be declared at a lower, more public level. // typedef Vtr::Index Index; diff --git a/opensubdiv/osd/clD3D11VertexBuffer.h b/opensubdiv/osd/clD3D11VertexBuffer.h index 8363092c..3ee2c459 100644 --- a/opensubdiv/osd/clD3D11VertexBuffer.h +++ b/opensubdiv/osd/clD3D11VertexBuffer.h @@ -45,7 +45,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for OpenCL subvision and DirectX +/// \brief Concrete vertex buffer class for OpenCL subdivision and DirectX /// drawing. /// /// D3D11VertexBuffer implements CLVertexBufferInterface and diff --git a/opensubdiv/osd/clGLVertexBuffer.h b/opensubdiv/osd/clGLVertexBuffer.h index 5baaa346..92d52845 100644 --- a/opensubdiv/osd/clGLVertexBuffer.h +++ b/opensubdiv/osd/clGLVertexBuffer.h @@ -36,7 +36,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for OpenCL subvision and OpenGL drawing. +/// \brief Concrete vertex buffer class for OpenCL subdivision and OpenGL drawing. /// /// CLGLVertexBuffer implements CLVertexBufferInterface and /// GLVertexBufferInterface. diff --git a/opensubdiv/osd/clVertexBuffer.h b/opensubdiv/osd/clVertexBuffer.h index 44d17f0c..e07cc04a 100644 --- a/opensubdiv/osd/clVertexBuffer.h +++ b/opensubdiv/osd/clVertexBuffer.h @@ -34,7 +34,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for OpenCL subvision. +/// \brief Concrete vertex buffer class for OpenCL subdivision. /// /// CLVertexBuffer implements CLVertexBufferInterface. An instance of this /// buffer class can be passed to CLEvaluator diff --git a/opensubdiv/osd/cpuD3D11VertexBuffer.h b/opensubdiv/osd/cpuD3D11VertexBuffer.h index 8c6b2d19..d8a47c29 100644 --- a/opensubdiv/osd/cpuD3D11VertexBuffer.h +++ b/opensubdiv/osd/cpuD3D11VertexBuffer.h @@ -38,7 +38,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for Cpu subvision and DirectX drawing. +/// \brief Concrete vertex buffer class for Cpu subdivision and DirectX drawing. /// /// CpuD3D11VertexBuffer implements CpuVertexBufferInterface and /// D3D11VertexBufferInterface. diff --git a/opensubdiv/osd/cpuGLVertexBuffer.h b/opensubdiv/osd/cpuGLVertexBuffer.h index 50b3b168..33bff287 100644 --- a/opensubdiv/osd/cpuGLVertexBuffer.h +++ b/opensubdiv/osd/cpuGLVertexBuffer.h @@ -36,7 +36,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for cpu subvision and OpenGL drawing. +/// \brief Concrete vertex buffer class for cpu subdivision and OpenGL drawing. /// /// CpuGLVertexBuffer implements CpuVertexBufferInterface and /// GLVertexBufferInterface. diff --git a/opensubdiv/osd/cpuVertexBuffer.h b/opensubdiv/osd/cpuVertexBuffer.h index da24680a..1d1e76a1 100644 --- a/opensubdiv/osd/cpuVertexBuffer.h +++ b/opensubdiv/osd/cpuVertexBuffer.h @@ -34,7 +34,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { -/// \brief Concrete vertex buffer class for cpu subvision. +/// \brief Concrete vertex buffer class for cpu subdivision. /// /// CpuVertexBuffer implements the VertexBufferInterface. An instance /// of this buffer class can be passed to CpuEvaluator diff --git a/opensubdiv/osd/cudaD3D11VertexBuffer.h b/opensubdiv/osd/cudaD3D11VertexBuffer.h index 8559b472..b7258894 100644 --- a/opensubdiv/osd/cudaD3D11VertexBuffer.h +++ b/opensubdiv/osd/cudaD3D11VertexBuffer.h @@ -38,7 +38,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { -/// \brief Concrete vertex buffer class for cuda subvision and D3D11 drawing. +/// \brief Concrete vertex buffer class for cuda subdivision and D3D11 drawing. /// /// CudaD3D11VertexBuffer implements CudaVertexBufferInterface and /// D3D11VertexBufferInterface. diff --git a/opensubdiv/osd/cudaGLVertexBuffer.h b/opensubdiv/osd/cudaGLVertexBuffer.h index 3f623df2..a71b6269 100644 --- a/opensubdiv/osd/cudaGLVertexBuffer.h +++ b/opensubdiv/osd/cudaGLVertexBuffer.h @@ -40,7 +40,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { -/// \brief Concrete vertex buffer class for cuda subvision and OpenGL drawing. +/// \brief Concrete vertex buffer class for cuda subdivision and OpenGL drawing. /// /// CudaGLVertexBuffer implements CudaVertexBufferInterface and /// GLVertexBufferInterface. diff --git a/opensubdiv/osd/cudaVertexBuffer.h b/opensubdiv/osd/cudaVertexBuffer.h index df1d2dec..e826f061 100644 --- a/opensubdiv/osd/cudaVertexBuffer.h +++ b/opensubdiv/osd/cudaVertexBuffer.h @@ -34,7 +34,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { -/// \brief Concrete vertex buffer class for Cuda subvision. +/// \brief Concrete vertex buffer class for Cuda subdivision. /// /// CudaVertexBuffer implements CudaVertexBufferInterface. /// An instance of this buffer class can be passed to CudaEvaluator diff --git a/opensubdiv/osd/d3d11VertexBuffer.h b/opensubdiv/osd/d3d11VertexBuffer.h index 4d163433..fd890739 100644 --- a/opensubdiv/osd/d3d11VertexBuffer.h +++ b/opensubdiv/osd/d3d11VertexBuffer.h @@ -38,7 +38,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for DirectX subvision and DirectX drawing. +/// \brief Concrete vertex buffer class for DirectX subdivision and DirectX drawing. /// /// D3D11VertexBuffer implements D3D11VertexBufferInterface. An instance /// of this buffer class can be passed to D3D11ComputeEvaluator. diff --git a/opensubdiv/osd/glVertexBuffer.h b/opensubdiv/osd/glVertexBuffer.h index 900c0e19..e034223d 100644 --- a/opensubdiv/osd/glVertexBuffer.h +++ b/opensubdiv/osd/glVertexBuffer.h @@ -36,7 +36,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { /// -/// \brief Concrete vertex buffer class for GLSL subvision and OpenGL drawing. +/// \brief Concrete vertex buffer class for GLSL subdivision and OpenGL drawing. /// /// GLVertexBuffer implements GLVertexBufferInterface. An instance /// of this buffer class can be passed to OsdGLComputeEvaluator. diff --git a/opensubdiv/sdc/bilinearScheme.h b/opensubdiv/sdc/bilinearScheme.h index 4e98a221..fa9f60e9 100644 --- a/opensubdiv/sdc/bilinearScheme.h +++ b/opensubdiv/sdc/bilinearScheme.h @@ -109,7 +109,7 @@ Scheme::assignSmoothLimitMask(VERTEX const& vertex, MASK& posMa } // -// Limit masks for tangents -- these are ambibuous around all vertices. Provide +// Limit masks for tangents -- these are ambiguous around all vertices. Provide // the tangents based on the incident edges of the first face. // template <> diff --git a/opensubdiv/sdc/catmarkScheme.h b/opensubdiv/sdc/catmarkScheme.h index d18b18f0..09cdff1e 100644 --- a/opensubdiv/sdc/catmarkScheme.h +++ b/opensubdiv/sdc/catmarkScheme.h @@ -362,7 +362,7 @@ Scheme::assignCreaseLimitTangentMasks(VERTEX const& vertex, // // Second, the tangent across the interior faces: - // Note this is ambigous for an interior vertex. We currently return + // Note this is ambiguous for an interior vertex. We currently return // the tangent for the surface in the counter-clockwise span between the // leading and trailing edges that form the crease. Given the expected // computation of a surface normal as Tan1 X Tan2, this tangent should be diff --git a/opensubdiv/sdc/crease.h b/opensubdiv/sdc/crease.h index 5ab4913b..57d6189a 100644 --- a/opensubdiv/sdc/crease.h +++ b/opensubdiv/sdc/crease.h @@ -53,7 +53,7 @@ namespace Sdc { /// users will be expected to provided them -- particularly when they expect the mask queries /// to do all of the work (just determining if a vertex is smooth will require inspection of /// incident edge sharpness). -/// Mask queries will occassionally require the subdivided sharpness values around the +/// Mask queries will occasionally require the subdivided sharpness values around the /// child vertex. So users will be expected to either provide them up front when known, or to be /// gathered on demand. Any implementation of subdivision with creasing cannot avoid subdividing /// the sharpness values first, so keeping them available for re-use is a worthwhile consideration. @@ -97,7 +97,7 @@ public: //@{ /// Optional sharp features: /// Since options treat certain topological features as infinitely sharp -- boundaries - /// or (in future) nonmanifold features -- sharpness values should be adjust before use. + /// or (in future) nonmanifold features -- sharpness values should be adjusted before use. /// The following methods will adjust (by return) specific values according to the options /// applied. /// @@ -190,7 +190,7 @@ Crease::SharpenBoundaryEdge(float /* edgeSharpness */) const { // // Despite the presence of the BOUNDARY_NONE option, boundary edges are always sharpened. - // Much of the code relies on sharpess to indicate boundaries to avoid the more complex + // Much of the code relies on sharpness to indicate boundaries to avoid the more complex // topological inspection // return SHARPNESS_INFINITE; diff --git a/opensubdiv/sdc/loopScheme.h b/opensubdiv/sdc/loopScheme.h index f8e9aee7..61e90a1e 100644 --- a/opensubdiv/sdc/loopScheme.h +++ b/opensubdiv/sdc/loopScheme.h @@ -60,7 +60,7 @@ inline int Scheme::GetLocalNeighborhoodSize() { return 1; } // Protected methods to assign the two types of masks for an edge-vertex -- // Crease and Smooth. // -// The Crease case does not really need to be speciailized, though it may be +// The Crease case does not really need to be specialized, though it may be // preferable to define all explicitly here. // template <> @@ -132,7 +132,7 @@ Scheme::assignSmoothMaskForEdge(EDGE const& edge, MASK& mask) const // Protected methods to assign the three types of masks for a vertex-vertex -- // Corner, Crease and Smooth (Dart is the same as Smooth). // -// Corner and Crease do not really need to be speciailized, though it may be +// Corner and Crease do not really need to be specialized, though it may be // preferable to define all explicitly here. // template <> @@ -322,7 +322,7 @@ Scheme::assignSmoothLimitMask(VERTEX const& vertex, MASK& posMask) // scale factors. // // For uses where magnitude does not matter, this scaling should be irrelevant. -// But just as with patches, where the magnitudes of partial derivates are +// But just as with patches, where the magnitudes of partial derivatives are // consistent between similar patches, the magnitudes of limit tangents should // also be similar. // @@ -349,9 +349,9 @@ Scheme::assignSmoothLimitMask(VERTEX const& vertex, MASK& posMask) // where v5 = v0 + (v4 - v3) and v6 = v0 + v1 - v2. // // When the standard limit tangent mask is applied, the cosines of increments -// of pi/3 gives us coefficients that are mutliples of 1/2, leading to the first +// of pi/3 give us coefficients that are multiples of 1/2, leading to the first // tangent T1 = 3/2 * (v1 - v4), rather than the widely used T1 = v1 - v4. So -// this scale factor of 3/2 is applied to insure tangents along the boundaries +// this scale factor of 3/2 is applied to ensure tangents along the boundaries // are of similar magnitude as tangents in the immediate interior (which may be // parallel). // @@ -442,7 +442,7 @@ Scheme::assignCreaseLimitTangentMasks(VERTEX const& vertex, // // Second, the tangent across the interior faces: - // Note this is ambigous for an interior vertex. We currently return + // Note this is ambiguous for an interior vertex. We currently return // the tangent for the surface in the counter-clockwise span between the // leading and trailing edges that form the crease. Given the expected // computation of a surface normal as Tan1 X Tan2, this tangent should be diff --git a/opensubdiv/sdc/options.h b/opensubdiv/sdc/options.h index 909e0b40..47c95b2a 100644 --- a/opensubdiv/sdc/options.h +++ b/opensubdiv/sdc/options.h @@ -42,7 +42,7 @@ namespace Sdc { /// limit surface, including the "shape" of primitive variable data associated with /// it. /// -/// The intent is that these sets of options be defined at a high-level and +/// The intent is that these sets of options be defined at a high level and /// propagated into the lowest-level computation in support of each subdivision /// scheme. Ideally it remains a set of bit-fields (essentially an int) and so /// remains light weight and easily passed around by value. @@ -83,10 +83,10 @@ public: // Trivial get/set methods: // - /// \brief Set vertex boundary interpolation rule + /// \brief Get vertex boundary interpolation rule VtxBoundaryInterpolation GetVtxBoundaryInterpolation() const { return (VtxBoundaryInterpolation) _vtxBoundInterp; } - /// \brief Get vertex boundary interpolation rule + /// \brief Set vertex boundary interpolation rule void SetVtxBoundaryInterpolation(VtxBoundaryInterpolation b) { _vtxBoundInterp = b; } /// \brief Get face-varying interpolation rule diff --git a/opensubdiv/sdc/scheme.h b/opensubdiv/sdc/scheme.h index 39a9d630..d2ca8ce7 100644 --- a/opensubdiv/sdc/scheme.h +++ b/opensubdiv/sdc/scheme.h @@ -201,9 +201,9 @@ protected: // Internal implementation support: // // We need a local "mask" class to be declared locally within the vertex-vertex mask query - // to hold one of the two possible mask required and to combine the local mask with the mask + // to hold one of the two possible masks required and to combine the local mask with the mask // the caller provides. It has been parameterized by so that a version compatible - // with the callers mask class is created. + // with the caller's mask class is created. // template class LocalMask { @@ -366,7 +366,7 @@ Scheme::ComputeFaceVertexMask(FACE const& face, MASK& mask) const { // determine if smooth or a crease, and also to detect and apply a transition from a // crease to smooth. Using the protected methods to assign the specific masks (only // two -- smooth or crease) this implementation should serve all non-linear schemes -// (currently Catmark and Loop) and only need to be specialized it for Bilinear to +// (currently Catmark and Loop) and only needs to be specialized for Bilinear to // trivialize it to the crease case. // // The implementation here is slightly complicated by combining two scenarios into a @@ -446,7 +446,7 @@ Scheme::ComputeEdgeVertexMask(EDGE const& edge, } // - // We are now left with have the Crease-to-Smooth case -- compute the Smooth mask + // We are now left with the Crease-to-Smooth case -- compute the Smooth mask // for the child and augment it with the transitional Crease of the parent. // // A general combination of separately assigned masks here (as done in the vertex- @@ -475,7 +475,7 @@ Scheme::ComputeEdgeVertexMask(EDGE const& edge, // to determine what subdivision Rules apply to the parent and its child vertex, and also to // detect and apply a transition between two differing Rules. Using the protected methods to // assign specific masks, this implementation should serve all non-linear schemes (currently -// Catmark and Loop) and only need to be specialized for Bilinear to remove all unnecessary +// Catmark and Loop) and only needs to be specialized for Bilinear to remove all unnecessary // complexity relating to creasing, Rules, etc. // // The implementation here is slightly complicated by combining two scenarios into one -- diff --git a/opensubdiv/sdc/types.h b/opensubdiv/sdc/types.h index 6b08205d..a49913c7 100644 --- a/opensubdiv/sdc/types.h +++ b/opensubdiv/sdc/types.h @@ -32,7 +32,7 @@ namespace OPENSUBDIV_VERSION { namespace Sdc { /// -/// \brief Enumerated type for all subdivisions schemes supported by OpenSubdiv +/// \brief Enumerated type for all subdivision schemes supported by OpenSubdiv /// enum SchemeType { SCHEME_BILINEAR, @@ -42,7 +42,7 @@ enum SchemeType { /// -/// \brief Enumerated type for all face splitting scheme +/// \brief Enumerated type for all face splitting schemes /// enum Split { SPLIT_TO_QUADS, ///< Used by Catmark and Bilinear @@ -51,8 +51,8 @@ enum Split { }; /// -/// \brief Traits associated the types of all subdivision schemes -- parameterized by -/// the scheme type. All traits are also defined on the scheme itself. +/// \brief Traits associated with the types of all subdivision schemes -- parameterized by +/// the scheme type. All traits are also defined in the scheme itself. /// struct SchemeTypeTraits { diff --git a/opensubdiv/vtr/componentInterfaces.h b/opensubdiv/vtr/componentInterfaces.h index d685d9d2..01fba947 100644 --- a/opensubdiv/vtr/componentInterfaces.h +++ b/opensubdiv/vtr/componentInterfaces.h @@ -46,7 +46,7 @@ namespace internal { // // These are not used with Vtr but arguably belong with it as the details to // write these efficiently depends very much on intimate details of Vtr's -// implmentation, e.g. the use of tag bits, subdivision Rules, etc. +// implementation, e.g. the use of tag bits, subdivision Rules, etc. // diff --git a/opensubdiv/vtr/fvarLevel.cpp b/opensubdiv/vtr/fvarLevel.cpp index b753f560..3a3e304c 100644 --- a/opensubdiv/vtr/fvarLevel.cpp +++ b/opensubdiv/vtr/fvarLevel.cpp @@ -177,7 +177,7 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { // - // Its awkward and potentially inefficient to try and accomplish everything in one + // It's awkward and potentially inefficient to try and accomplish everything in one // pass over the vertices... // // Make a first pass through the vertices to identify discts edges and to determine @@ -582,7 +582,7 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { // // Values tagged as creases have their two "end values" identified relative to the incident -// faces of the vertex for compact storage and quick retrieval. This methods identifies the +// faces of the vertex for compact storage and quick retrieval. This method identifies the // values for the two ends of such a crease value: // void diff --git a/opensubdiv/vtr/fvarLevel.h b/opensubdiv/vtr/fvarLevel.h index bbafb518..a5163886 100644 --- a/opensubdiv/vtr/fvarLevel.h +++ b/opensubdiv/vtr/fvarLevel.h @@ -72,7 +72,7 @@ namespace internal { // Regarding scope and access... // Unclear at this early state, but leaning towards nesting this class within // Level, given the intimate dependency between the two. -// Everything is being declared public for now to facilitate access until its +// Everything is being declared public for now to facilitate access until it's // clearer how this functionality will be provided. // class FVarLevel { diff --git a/opensubdiv/vtr/fvarRefinement.cpp b/opensubdiv/vtr/fvarRefinement.cpp index 8c11dbd9..3819a3f9 100644 --- a/opensubdiv/vtr/fvarRefinement.cpp +++ b/opensubdiv/vtr/fvarRefinement.cpp @@ -66,7 +66,7 @@ FVarRefinement::~FVarRefinement() { // // Methods supporting the refinement of face-varying data that has previously -// been applied to the Refinment member. So these methods already have access +// been applied to the Refinement member. So these methods already have access // to fully refined child components. // @@ -188,7 +188,7 @@ FVarRefinement::populateChildValuesForEdgeVertex(Index cVert, Index pEdge) { // This turns out to be very simple. For FVar refinement to handle all cases // of non-manifold edges, when an edge is discts we generate a FVar value for // each face incident the edge. So in the uniform refinement case we will - // have as many child values as parent faces indicent the edge. But even when + // have as many child values as parent faces incident the edge. But even when // refinement is sparse, if this edge-vertex is not complete, we will still be // guaranteed that a child face exists for each parent face since one of the // edge's end vertices must be complete and therefore include all child faces. diff --git a/opensubdiv/vtr/level.cpp b/opensubdiv/vtr/level.cpp index d533e563..4a77601c 100644 --- a/opensubdiv/vtr/level.cpp +++ b/opensubdiv/vtr/level.cpp @@ -45,7 +45,7 @@ // This is intended to be a fairly simple container of topology, sharpness and // other information that is useful to retain for subdivision. It is intended to // be constructed by other friend classes, i.e. factories and class specialized to -// contruct topology based on various splitting schemes. So its interface consists +// construct topology based on various splitting schemes. So its interface consists // of simple methods for inspection, and low-level protected methods for populating // it rather than high-level modifiers. // @@ -1445,7 +1445,7 @@ Level::isSingleCreasePatch(Index face, float *sharpnessOut, int *sharpEdgeInFace // // What follows is an internal/anonymous class and protected methods to complete all -// topological relations when only the face-vertex relations is defined. +// topological relations when only the face-vertex relations are defined. // // In keeping with the original idea that Level is just data and relies on other // classes to construct it, this functionality may be warranted elsewhere, but we are @@ -1454,7 +1454,7 @@ Level::isSingleCreasePatch(Index face, float *sharpnessOut, int *sharpEdgeInFace // namespace { // - // This is an internal helper class to manage the assembly of the tological relations + // This is an internal helper class to manage the assembly of the topological relations // that do not have a predictable size, i.e. faces-per-edge, faces-per-vertex and // edges-per-vertex. Level manages these with two vectors: // @@ -1576,7 +1576,7 @@ namespace { _regIndices.resize(memberCount); return memberMax; } else { - // Assign new offsets-per-component while determining if we can trivially compressed in place: + // Assign new offsets-per-component while determining if we can trivially compress in place: bool cannotBeCompressedInPlace = false; int memberCount = _countsAndOffsets[0]; @@ -1655,7 +1655,7 @@ bool Level::completeTopologyFromFaceVertices() { // - // Its assumed (a pre-condition) that face-vertices have been fully specified and that we + // It's assumed (a pre-condition) that face-vertices have been fully specified and that we // are to construct the remaining relations: including the edge list. We may want to // support the existence of the edge list too in future: // @@ -1666,7 +1666,7 @@ Level::completeTopologyFromFaceVertices() { // May be unnecessary depending on how the vertices and faces were defined, but worth a // call to ensure all data related to verts and faces is available -- this will be a - // harmless call if all has been taken care of). + // harmless call if all has been taken care of. // // Remember to resize edges similarly after the edge list has been assembled... this->resizeVertices(vCount); @@ -1720,7 +1720,7 @@ Level::completeTopologyFromFaceVertices() { } // - // If the edge already exists, see if is non-manifold, i.e. it has already been + // If the edge already exists, see if it is non-manifold, i.e. it has already been // added to two faces, or this face has the edge in the same orientation as the // first face (indicating opposite winding orders between the two faces). // @@ -1789,7 +1789,7 @@ Level::completeTopologyFromFaceVertices() { // // At this point all incident members are associated with each component. We still // need to populate the "local indices" for each and orient manifold components in - // counter-clockwise order. First mark tag non-manifold edges and their incident + // counter-clockwise order. First tag non-manifold edges and their incident // vertices so that we can trivially skip orienting these -- though some vertices // will be determined non-manifold as a result of a failure to orient them (and // will be marked accordingly when so detected). diff --git a/opensubdiv/vtr/level.h b/opensubdiv/vtr/level.h index 7b81f29b..59b1f301 100644 --- a/opensubdiv/vtr/level.h +++ b/opensubdiv/vtr/level.h @@ -91,7 +91,7 @@ public: // // Most of these properties are passed down to child components during // refinement, but some -- notably the designation of a component as semi- - // sharp -- require re-determination as sharpnes values are reduced at each + // sharp -- require re-determination as sharpness values are reduced at each // level. // struct VTag { @@ -207,7 +207,7 @@ public: // Once have only quads (or tris), this local index need only occupy two bits // and could conceivably be packed into the same integer as the face index, but // for now, given the need to support faces of potentially high valence we'll - // us an 8- or 16-bit integer. + // use an 8- or 16-bit integer. // // Methods to access the six topological relations: ConstIndexArray getFaceVertices(Index faceIndex) const; @@ -468,7 +468,7 @@ private: // The "depth" member is clearly useful in both the topological splitting and the // stencil queries, but arguably it ties the Level to a hierarchy which counters - // the idea if it being independent. + // the idea of it being independent. int _depth; // Maxima to help clients manage sizing of data buffers. Given "max valence", @@ -527,7 +527,7 @@ private: }; // -// Access/modify the vertices indicent a given face: +// Access/modify the vertices incident a given face: // inline ConstIndexArray Level::getFaceVertices(Index faceIndex) const { @@ -557,7 +557,7 @@ Level::getFaceVertices() const { } // -// Access/modify the edges indicent a given face: +// Access/modify the edges incident a given face: // inline ConstIndexArray Level::getFaceEdges(Index faceIndex) const { @@ -571,7 +571,7 @@ Level::getFaceEdges(Index faceIndex) { } // -// Access/modify the faces indicent a given vertex: +// Access/modify the faces incident a given vertex: // inline ConstIndexArray Level::getVertexFaces(Index vertIndex) const { @@ -608,7 +608,7 @@ Level::trimVertexFaces(Index vertIndex, int count) { } // -// Access/modify the edges indicent a given vertex: +// Access/modify the edges incident a given vertex: // inline ConstIndexArray Level::getVertexEdges(Index vertIndex) const { @@ -652,7 +652,7 @@ Level::setMaxValence(int valence) { } // -// Access/modify the vertices indicent a given edge: +// Access/modify the vertices incident a given edge: // inline ConstIndexArray Level::getEdgeVertices(Index edgeIndex) const { @@ -664,7 +664,7 @@ Level::getEdgeVertices(Index edgeIndex) { } // -// Access/modify the faces indicent a given edge: +// Access/modify the faces incident a given edge: // inline ConstIndexArray Level::getEdgeFaces(Index edgeIndex) const { diff --git a/opensubdiv/vtr/quadRefinement.cpp b/opensubdiv/vtr/quadRefinement.cpp index f045d605..9e746a09 100644 --- a/opensubdiv/vtr/quadRefinement.cpp +++ b/opensubdiv/vtr/quadRefinement.cpp @@ -52,7 +52,7 @@ QuadRefinement::~QuadRefinement() { // -// Methods for construct the parent-to-child mapping +// Methods to construct the parent-to-child mapping // void QuadRefinement::allocateParentChildIndices() { @@ -125,7 +125,7 @@ void QuadRefinement::populateFaceVerticesFromParentFaces() { // - // This is pretty straight forward, but is a good example for the case of + // This is pretty straightforward, but is a good example for the case of // iterating through the parent faces rather than the child faces, as the // same topology information for the parent faces is required for each of // the child faces. @@ -195,8 +195,8 @@ void QuadRefinement::populateFaceEdgesFromParentFaces() { // - // This is fairly straight forward, but since we are dealing with edges here, we - // occassionally have to deal with the limition of them being undirected. Since + // This is fairly straightforward, but since we are dealing with edges here, we + // occasionally have to deal with the limition of them being undirected. Since // child faces from the same parent face share much in common, we iterate through // the parent faces. // @@ -288,7 +288,7 @@ void QuadRefinement::populateEdgeVerticesFromParentFaces() { // - // This is straight forward. All child edges of parent faces are assigned + // This is straightforward. All child edges of parent faces are assigned // their first vertex from the child vertex of the face -- so it is common // to all. The second vertex is the child vertex of the parent edge to // which the new child edge is perpendicular. @@ -313,7 +313,7 @@ void QuadRefinement::populateEdgeVerticesFromParentEdges() { // - // This is straight forward. All child edges of parent edges are assigned + // This is straightforward. All child edges of parent edges are assigned // their first vertex from the child vertex of the edge -- so it is common // to both. The second vertex is the child vertex of the vertex at the // end of the parent edge. @@ -391,12 +391,12 @@ void QuadRefinement::populateEdgeFacesFromParentFaces() { // - // This is straight forward topologically, but when refinement is sparse the + // This is straightforward topologically, but when refinement is sparse the // contents of the counts/offsets vector is not certain and is populated // incrementally. So there will be some resizing/trimming here. // // Topologically, the child edges from within a parent face will typically - // have two indicent child faces (only one or none if sparse). These child + // have two incident child faces (only one or none if sparse). These child // edges and faces are interleaved within the parent and easily identified. // Note that the edge-face "local indices" are also needed here and that // orientation of child faces within their parent depends on it being a quad diff --git a/opensubdiv/vtr/refinement.cpp b/opensubdiv/vtr/refinement.cpp index c27bf1a3..c223f24f 100644 --- a/opensubdiv/vtr/refinement.cpp +++ b/opensubdiv/vtr/refinement.cpp @@ -177,7 +177,7 @@ Refinement::refine(Options refineOptions) { // -// Methods for construct the parent-to-child mapping +// Methods to construct the parent-to-child mapping // void Refinement::populateParentToChildMapping() { @@ -227,7 +227,7 @@ Refinement::populateParentChildIndices() { // // Two vertex orderings are currently supported -- ordering vertices refined - // from vertices first, or those refined from faces first. Its possible this + // from vertices first, or those refined from faces first. It's possible this // may be extended to more possibilities. Once the ordering is defined here, // other than analogous initialization in FVarRefinement, the treatment of // vertices in blocks based on origin should make the rest of the code diff --git a/opensubdiv/vtr/refinement.h b/opensubdiv/vtr/refinement.h index f733a599..a55772af 100644 --- a/opensubdiv/vtr/refinement.h +++ b/opensubdiv/vtr/refinement.h @@ -52,8 +52,8 @@ class FVarRefinement; // components in the child level. // // Refinement is an abstract class and expects subclasses corresponding to the different types -// of topological splits that the supported subdivisions schemes collectively require, i.e. those -// list in Sdc::SplitType. Note the virtual requirements expected of the subclasses in the list +// of topological splits that the supported subdivision schemes collectively require, i.e. those +// listed in Sdc::SplitType. Note the virtual requirements expected of the subclasses in the list // of protected methods -- they differ mainly in the topology that is created in the child Level // and not the propagation of tags through refinement, subdivision of sharpness values or the // treatment of face-varying data. The primary subclasses are QuadRefinement and TriRefinement. @@ -182,7 +182,7 @@ public: // which could be deferred, in which case "transitional" could be a single bit. // // Child tags are part of the child-to-parent mapping, which consists of the parent - // component index for each child component, plus a tags for the child indicating more + // component index for each child component, plus a tag for the child indicating more // about its relationship to its parent, e.g. is it completely defined, what the parent // component type is, what is the index of the child within its parent, etc. // @@ -395,7 +395,7 @@ protected: std::vector _childVertexTag; // - // Tags for spase selection of components: + // Tags for sparse selection of components: // std::vector _parentFaceTag; std::vector _parentEdgeTag; diff --git a/opensubdiv/vtr/stackBuffer.h b/opensubdiv/vtr/stackBuffer.h index b228232a..2b17801d 100644 --- a/opensubdiv/vtr/stackBuffer.h +++ b/opensubdiv/vtr/stackBuffer.h @@ -33,13 +33,13 @@ namespace Vtr { namespace internal { // -// The StackBuffer class is intented solely to take the place of VLA's (Variable +// The StackBuffer class is intended solely to take the place of VLAs (Variable // Length Arrays) which most compilers support, but are not strictly standard C++. // Portability concerns forces us to make use of either alloca() or some other // mechanism to create small arrays on the stack that are typically based on the -// valence of a vertex -- small in general, but occassionally large. +// valence of a vertex -- small in general, but occasionally large. // -// Note also that since the intent of this is to replace VLA's -- not general +// Note also that since the intent of this is to replace VLAs -- not general // std::vectors -- support for std::vector functionality is intentionally limited // and STL-like naming is avoided. Like a VLA there is no incremental growth. // Support for resizing is available to reuse an instance at the beginning of a diff --git a/opensubdiv/vtr/triRefinement.cpp b/opensubdiv/vtr/triRefinement.cpp index 0a4be13f..dfcf69e8 100644 --- a/opensubdiv/vtr/triRefinement.cpp +++ b/opensubdiv/vtr/triRefinement.cpp @@ -52,7 +52,7 @@ TriRefinement::~TriRefinement() { // -// Methods for construct the parent-to-child mapping +// Methods to construct the parent-to-child mapping // void TriRefinement::allocateParentChildIndices() { @@ -161,7 +161,7 @@ TriRefinement::populateFaceVerticesFromParentFaces() { // The orientation for the 4th "interior" face is unclear -- it begins // with the child vertex of the 2nd edge of the triangle. According // to the notes with the Hbr implementation "the ordering of vertices - // here is done to preserve parameteric space as best we can." + // here is done to preserve parametric space as best we can." // if (IndexIsValid(pFaceChildren[0])) { IndexArray cFaceVerts = _child->getFaceVertices(pFaceChildren[0]); diff --git a/opensubdiv/vtr/triRefinement.h b/opensubdiv/vtr/triRefinement.h index 25d80e5c..080c257f 100644 --- a/opensubdiv/vtr/triRefinement.h +++ b/opensubdiv/vtr/triRefinement.h @@ -89,7 +89,7 @@ protected: private: // - // Unlike the quad-split, which can some vectors with the parent Level since + // Unlike the quad-split, which can share some vectors with the parent Level since // child components correspond to face-vertices, the tri-split must define its // own local vectors to identify the children for each parent component -- to // be referenced within the base class for more immediate/inline access: diff --git a/opensubdiv/vtr/types.h b/opensubdiv/vtr/types.h index 4bfab6ec..20491f20 100644 --- a/opensubdiv/vtr/types.h +++ b/opensubdiv/vtr/types.h @@ -59,17 +59,17 @@ inline bool IndexIsValid(Index index) { return (index != INDEX_INVALID); } // // Integer type and constants used to index one component within another. Ideally -// this is just 2-bits once refinement reduces faces to tris or quads -- and so +// this is just 2 bits once refinement reduces faces to tris or quads -- and so // could potentially be combined with an Index -- but we need something larger for // the N-sided face. // typedef unsigned short LocalIndex; -// Declared as "int" since its intended for more general use +// Declared as "int" since it's intended for more general use static const int VALENCE_LIMIT = ((1 << 16) - 1); // std::numeric_limits::max() // -// Collections if integer types in variable or fixed sized arrays. Note that the use +// Collections of integer types in variable or fixed sized arrays. Note that the use // of "vector" in the name indicates a class that wraps an std::vector (typically a // member variable) which is fully resizable and owns its own storage, whereas "array" // wraps a vtr::Array which uses a fixed block of pre-allocated memory. From fc19cd2604cd65825f72d635cfca2a7f800be5a0 Mon Sep 17 00:00:00 2001 From: Mike Erwin Date: Wed, 12 Aug 2015 15:36:58 -0400 Subject: [PATCH 07/20] spelling phase 2 For completeness, ran files through an automated spell checker (Visual Studio plugin) which caught several things missed while reading. --- opensubdiv/far/patchParam.h | 2 +- opensubdiv/far/patchTable.h | 2 +- opensubdiv/far/patchTableFactory.cpp | 2 +- opensubdiv/far/primvarRefiner.h | 6 +++--- opensubdiv/far/ptexIndices.cpp | 4 ++-- opensubdiv/far/topologyRefiner.cpp | 2 +- opensubdiv/far/topologyRefinerFactory.h | 10 +++++----- opensubdiv/osd/clEvaluator.h | 2 +- opensubdiv/osd/clGLVertexBuffer.h | 2 +- opensubdiv/osd/cudaD3D11VertexBuffer.h | 2 +- opensubdiv/osd/d3d11ComputeEvaluator.h | 4 ++-- opensubdiv/osd/glXFBEvaluator.h | 2 +- opensubdiv/osd/glslPatchCommon.glsl | 6 +++--- opensubdiv/osd/hlslPatchCommon.hlsl | 4 ++-- opensubdiv/sdc/loopScheme.h | 2 +- opensubdiv/sdc/options.h | 4 ++-- opensubdiv/sdc/scheme.h | 6 +++--- opensubdiv/vtr/fvarLevel.cpp | 4 ++-- opensubdiv/vtr/fvarLevel.h | 2 +- opensubdiv/vtr/level.cpp | 2 +- opensubdiv/vtr/level.h | 8 ++++---- opensubdiv/vtr/quadRefinement.cpp | 2 +- 22 files changed, 40 insertions(+), 40 deletions(-) diff --git a/opensubdiv/far/patchParam.h b/opensubdiv/far/patchParam.h index c995e12c..3ece59e9 100644 --- a/opensubdiv/far/patchParam.h +++ b/opensubdiv/far/patchParam.h @@ -173,7 +173,7 @@ struct PatchParam { /// \brief Resets everything to 0 void Clear() { field0 = field1 = 0; } - /// \brief Retuns the faceid + /// \brief Returns the faceid Index GetFaceId() const { return Index(unpack(field0,28,0)); } /// \brief Returns the log2 value of the u parameter at diff --git a/opensubdiv/far/patchTable.h b/opensubdiv/far/patchTable.h index c4a69db8..34e49281 100644 --- a/opensubdiv/far/patchTable.h +++ b/opensubdiv/far/patchTable.h @@ -397,7 +397,7 @@ public: /// \brief Evaluate basis functions for a varying value and /// derivatives at a given (u,v) parametric location of a patch. /// - /// @param handle A patch handle indentifying the sub-patch containing the + /// @param handle A patch handle identifying the sub-patch containing the /// (u,v) location /// /// @param u Patch coordinate (in base face normalized space) diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index 55dcdf80..1bb4c59d 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -1414,7 +1414,7 @@ PatchTableFactory::populateAdaptivePatches( context.GetIrregularPatchCornerSpans(patch.levelIndex, patch.faceIndex, irregCornerSpans); - // switch endcap patchtype by option + // switch endcap patch type by option switch(context.options.GetEndCapType()) { case Options::ENDCAP_GREGORY_BASIS: arrayBuilder->iptr += diff --git a/opensubdiv/far/primvarRefiner.h b/opensubdiv/far/primvarRefiner.h index b09b09a2..5b8c350d 100644 --- a/opensubdiv/far/primvarRefiner.h +++ b/opensubdiv/far/primvarRefiner.h @@ -207,7 +207,7 @@ private: private: // - // Local class to fulfil interface for in the Scheme mask queries: + // Local class to fulfill interface for in the Scheme mask queries: // class Mask { public: @@ -705,7 +705,7 @@ PrimvarRefiner::interpFVarFromEdges(int level, T const & src, U & dst, int chann Vtr::internal::FVarLevel const & childFVar = childLevel.getFVarLevel(channel); // - // Allocate and intialize (if linearly interpolated) interpolation weights for + // Allocate and initialize (if linearly interpolated) interpolation weights for // the edge mask: // float eVertWeights[2]; @@ -1108,7 +1108,7 @@ PrimvarRefiner::limit(T const & src, U & dstPos, U1 * dstTan1Ptr, U2 * dstTan2Pt // // Apply the tangent masks -- both will have the same number of weights and - // indices (one tangent may be "padded" to accomodate the other), but these + // indices (one tangent may be "padded" to accommodate the other), but these // may differ from those of the position: // if (hasTangents) { diff --git a/opensubdiv/far/ptexIndices.cpp b/opensubdiv/far/ptexIndices.cpp index fe45541a..19dfaddd 100644 --- a/opensubdiv/far/ptexIndices.cpp +++ b/opensubdiv/far/ptexIndices.cpp @@ -163,7 +163,7 @@ PtexIndices::GetAdjacency( adjEdges[2] = 1; } - { // resolve neighbor outisde the sub-face (edge 0) + { // resolve neighbor outside the sub-face (edge 0) int edge0 = fedges[quadrant]; Index adjface0 = getAdjacentFace(level, edge0, face); if (adjface0==-1) { @@ -182,7 +182,7 @@ PtexIndices::GetAdjacency( assert(adjFaces[0]!=-1); } - // resolve neighbor outisde the sub-face (edge 3) + // resolve neighbor outside the sub-face (edge 3) int edge3 = fedges[prevQuadrant]; Index adjface3 = getAdjacentFace(level, edge3, face); if (adjface3==-1) { diff --git a/opensubdiv/far/topologyRefiner.cpp b/opensubdiv/far/topologyRefiner.cpp index a0d1051f..0371c7ed 100644 --- a/opensubdiv/far/topologyRefiner.cpp +++ b/opensubdiv/far/topologyRefiner.cpp @@ -94,7 +94,7 @@ TopologyRefiner::Unrefine() { // -// Intializing and updating the component inventory: +// Initializing and updating the component inventory: // void TopologyRefiner::initializeInventory() { diff --git a/opensubdiv/far/topologyRefinerFactory.h b/opensubdiv/far/topologyRefinerFactory.h index 37918ccb..3e023cb5 100644 --- a/opensubdiv/far/topologyRefinerFactory.h +++ b/opensubdiv/far/topologyRefinerFactory.h @@ -161,7 +161,7 @@ protected: /// the vertices for that face. /// /// If a full boundary representation with all neighborhood information is not - /// available, e.g. faces and vertices are avaible but not edges, only the + /// available, e.g. faces and vertices are available but not edges, only the /// face-vertices should be specified. The remaining topological relationships /// will be constructed later in the assembly (though at greater cost than if /// specified directly). @@ -170,13 +170,13 @@ protected: /// specified in order, i.e. the number of face-vertices for each successive face. /// - /// \brief Specify the number of vertices to be accomodated + /// \brief Specify the number of vertices to be accommodated static void setNumBaseVertices(TopologyRefiner & newRefiner, int count); - /// \brief Specify the number of faces to be accomodated + /// \brief Specify the number of faces to be accommodated static void setNumBaseFaces(TopologyRefiner & newRefiner, int count); - /// \brief Specify the number of edges to be accomodated + /// \brief Specify the number of edges to be accommodated static void setNumBaseEdges(TopologyRefiner & newRefiner, int count); /// \brief Specify the number of vertices incident each face @@ -628,7 +628,7 @@ TopologyRefinerFactory::assignComponentTopology(TopologyRefiner& /* refine // void setBaseVertexNonManifold(TopologyRefiner& newRefiner, Index vertex, bool b); // // Also consider using TopologyLevel::ValidateTopology() when debugging to ensure - // that topolology has been completely and correctly specified. + // that topology has been completely and correctly specified. // return false; } diff --git a/opensubdiv/osd/clEvaluator.h b/opensubdiv/osd/clEvaluator.h index debc4650..27c0eb2b 100644 --- a/opensubdiv/osd/clEvaluator.h +++ b/opensubdiv/osd/clEvaluator.h @@ -95,7 +95,7 @@ public: /// Constructor. CLEvaluator(cl_context context, cl_command_queue queue); - /// Desctructor. + /// Destructor. ~CLEvaluator(); /// Generic creator template. diff --git a/opensubdiv/osd/clGLVertexBuffer.h b/opensubdiv/osd/clGLVertexBuffer.h index 92d52845..98f7784f 100644 --- a/opensubdiv/osd/clGLVertexBuffer.h +++ b/opensubdiv/osd/clGLVertexBuffer.h @@ -93,7 +93,7 @@ protected: /// Returns true if success. bool allocate(cl_context clContext); - /// Acqures a resource from GL. + /// Acquires a resource from GL. void map(cl_command_queue queue); /// Releases a resource to GL. diff --git a/opensubdiv/osd/cudaD3D11VertexBuffer.h b/opensubdiv/osd/cudaD3D11VertexBuffer.h index b7258894..e72e6391 100644 --- a/opensubdiv/osd/cudaD3D11VertexBuffer.h +++ b/opensubdiv/osd/cudaD3D11VertexBuffer.h @@ -85,7 +85,7 @@ protected: bool allocate(ID3D11Device *device); - // Acqures a cuda resource from DX11 + // Acquires a cuda resource from DX11 void map(); // Releases a cuda resource to DX11 diff --git a/opensubdiv/osd/d3d11ComputeEvaluator.h b/opensubdiv/osd/d3d11ComputeEvaluator.h index d699fa0c..8fd4b1dd 100644 --- a/opensubdiv/osd/d3d11ComputeEvaluator.h +++ b/opensubdiv/osd/d3d11ComputeEvaluator.h @@ -148,7 +148,7 @@ public: stencilTable, deviceContext); } else { - // Create an instace on demand (slow) + // Create an instance on demand (slow) (void)deviceContext; // unused instance = Create(srcDesc, dstDesc, BufferDescriptor(), @@ -212,7 +212,7 @@ private: ID3D11ClassLinkage * _classLinkage; ID3D11ClassInstance * _singleBufferKernel; ID3D11ClassInstance * _separateBufferKernel; - ID3D11Buffer * _uniformArgs; // uniform paramaeters for kernels + ID3D11Buffer * _uniformArgs; // uniform parameters for kernels int _workGroupSize; }; diff --git a/opensubdiv/osd/glXFBEvaluator.h b/opensubdiv/osd/glXFBEvaluator.h index 4b0a8248..c171d52e 100644 --- a/opensubdiv/osd/glXFBEvaluator.h +++ b/opensubdiv/osd/glXFBEvaluator.h @@ -328,7 +328,7 @@ public: } /// \brief dispatch eval stencils function with derivatives. - /// dispatch the GLSL XFB kernel on on GPU asynchronously. + /// dispatch the GLSL XFB kernel on GPU asynchronously. /// /// @param srcBuffer GL buffer of input primvars. /// diff --git a/opensubdiv/osd/glslPatchCommon.glsl b/opensubdiv/osd/glslPatchCommon.glsl index e10b4e18..7f186b76 100644 --- a/opensubdiv/osd/glslPatchCommon.glsl +++ b/opensubdiv/osd/glslPatchCommon.glsl @@ -304,7 +304,7 @@ uniform samplerBuffer OsdFVarDataBuffer; } // ------ extract from triangles (loop) --------- -// XXX: no interpolation supproted +// XXX: no interpolation supported #define OSD_COMPUTE_FACE_VARYING_TRI_1(result, fvarOffset, triVert) \ { \ @@ -575,7 +575,7 @@ OsdComputeBSplineBoundaryPoints(inout vec3 cpt[16], ivec3 patchParam) // (labeled vv* and ev* respectively). // // The two segments of each transition edge are labeled Lo and Hi, -// with the Lo segment occuring before the Hi segment along the +// with the Lo segment occurring before the Hi segment along the // transition edge's domain parameterization. These Lo and Hi segment // tessellation levels determine how domain evaluation coordinates // are remapped along transition edges. The Hi segment value will @@ -632,7 +632,7 @@ float OsdComputeTessLevel(vec3 p0, vec3 p1) // We restrict adaptive tessellation levels to half of the device // supported maximum because transition edges are split into two - // halfs and the sum of the two corresponding levels must not exceed + // halves and the sum of the two corresponding levels must not exceed // the device maximum. We impose this limit even for non-transition // edges because a non-transition edge must be able to match up with // one half of the transition edge of an adjacent transition patch. diff --git a/opensubdiv/osd/hlslPatchCommon.hlsl b/opensubdiv/osd/hlslPatchCommon.hlsl index b01ef898..e306f9f9 100644 --- a/opensubdiv/osd/hlslPatchCommon.hlsl +++ b/opensubdiv/osd/hlslPatchCommon.hlsl @@ -448,7 +448,7 @@ OsdComputeBSplineBoundaryPoints(inout float3 cpt[16], int3 patchParam) // (labeled vv* and ev* respectively). // // The two segments of each transition edge are labeled Lo and Hi, -// with the Lo segment occuring before the Hi segment along the +// with the Lo segment occurring before the Hi segment along the // transition edge's domain parameterization. These Lo and Hi segment // tessellation levels determine how domain evaluation coordinates // are remapped along transition edges. The Hi segment value will @@ -505,7 +505,7 @@ float OsdComputeTessLevel(float3 p0, float3 p1) // We restrict adaptive tessellation levels to half of the device // supported maximum because transition edges are split into two - // halfs and the sum of the two corresponding levels must not exceed + // halves and the sum of the two corresponding levels must not exceed // the device maximum. We impose this limit even for non-transition // edges because a non-transition edge must be able to match up with // one half of the transition edge of an adjacent transition patch. diff --git a/opensubdiv/sdc/loopScheme.h b/opensubdiv/sdc/loopScheme.h index 61e90a1e..ebb86b11 100644 --- a/opensubdiv/sdc/loopScheme.h +++ b/opensubdiv/sdc/loopScheme.h @@ -313,7 +313,7 @@ Scheme::assignSmoothLimitMask(VERTEX const& vertex, MASK& posMask) // // A note on tangent magnitudes: // -// Several formulae exist for limit tangents at a vertex to accomodate the +// Several formulae exist for limit tangents at a vertex to accommodate the // different topological configurations around the vertex. While these produce // the desired direction, there is inconsistency in the resulting magnitudes. // Ideally a regular mesh of uniformly shaped triangles with similar edge lengths diff --git a/opensubdiv/sdc/options.h b/opensubdiv/sdc/options.h index 47c95b2a..7508b69f 100644 --- a/opensubdiv/sdc/options.h +++ b/opensubdiv/sdc/options.h @@ -101,10 +101,10 @@ public: /// \brief Set edge crease rule void SetCreasingMethod(CreasingMethod c) { _creasingMethod = c; } - /// \brief Get triangle subdivsion weights rule (Catmark scheme only !) + /// \brief Get triangle subdivision weights rule (Catmark scheme only !) TriangleSubdivision GetTriangleSubdivision() const { return (TriangleSubdivision) _triangleSub; } - /// \brief Set triangle subdivsion weights rule (Catmark scheme only !) + /// \brief Set triangle subdivision weights rule (Catmark scheme only !) void SetTriangleSubdivision(TriangleSubdivision t) { _triangleSub = t; } private: diff --git a/opensubdiv/sdc/scheme.h b/opensubdiv/sdc/scheme.h index d2ca8ce7..530cf6e3 100644 --- a/opensubdiv/sdc/scheme.h +++ b/opensubdiv/sdc/scheme.h @@ -131,7 +131,7 @@ public: /// edge while T2 points inward across the limit surface. /// /// As for magnitude, no assumptions should be made of the magnitudes of the resulting - /// tanget vectors. Common formulae often factor out scale factors that contribute to + /// tangent vectors. Common formulae often factor out scale factors that contribute to /// magnitude. While some attempt has been made to make magnitudes more consistent /// between regular corners, boundaries and the interior, the same has not been done at /// irregular vertices -- at least not yet. This may be addressed in future, as having @@ -484,7 +484,7 @@ Scheme::ComputeEdgeVertexMask(EDGE const& edge, // provided though, there are cases where the parent and child sharpness values need to be // identified, so accounting for the unknown Rules too is not much of an added complication. // -// The benefit of supporting specified Rules is that they can often often be trivially +// The benefit of supporting specified Rules is that they can often be trivially // determined from context (e.g. a vertex derived from a face at a previous level will always // be smooth) rather than more generally, and at greater cost, inspecting neighboring and // they are often the same for parent and child. @@ -572,7 +572,7 @@ Scheme::ComputeVertexVertexMask(VERTEX const& vertex, } // - // Intialize a local child mask, compute the fractional weight from parent and child + // Initialize a local child mask, compute the fractional weight from parent and child // sharpness values and combine the two masks: // typedef typename MASK::Weight Weight; diff --git a/opensubdiv/vtr/fvarLevel.cpp b/opensubdiv/vtr/fvarLevel.cpp index 3a3e304c..4520efa9 100644 --- a/opensubdiv/vtr/fvarLevel.cpp +++ b/opensubdiv/vtr/fvarLevel.cpp @@ -139,7 +139,7 @@ FVarLevel::resizeValues(int valueCount) { // // Once values have been identified for each vertex and tagged, refinement propagates // the tags to child values using more simplified logic (child values inherit the -// topology of their parent) and no futher analysis is required. +// topology of their parent) and no further analysis is required. // void FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { @@ -413,7 +413,7 @@ FVarLevel::completeTopologyFromFaceValues(int regularBoundaryValence) { // // Now that we know the total number of additional sibling values (M values in addition - // to the N vertex values) allocate space to accomodate all N + M vertex values. + // to the N vertex values) allocate space to accommodate all N + M vertex values. // // Then make the second pass through the vertices to identify the values associated with // each and to inspect and tag local face-varying topology for those that don't match: diff --git a/opensubdiv/vtr/fvarLevel.h b/opensubdiv/vtr/fvarLevel.h index a5163886..d5959b40 100644 --- a/opensubdiv/vtr/fvarLevel.h +++ b/opensubdiv/vtr/fvarLevel.h @@ -66,7 +66,7 @@ namespace internal { // take up almost half the memory of this representation, so if memory does // become a concern, we do not need to store them. The only reason we do so now // is that the face-value interface for specifying base topology and inspecting -// subsequent levels is very familar to that of face-vertices for clients. So +// subsequent levels is very familiar to that of face-vertices for clients. So // having them available for such access is convenient. // // Regarding scope and access... diff --git a/opensubdiv/vtr/level.cpp b/opensubdiv/vtr/level.cpp index 4a77601c..3097027b 100644 --- a/opensubdiv/vtr/level.cpp +++ b/opensubdiv/vtr/level.cpp @@ -1463,7 +1463,7 @@ namespace { // // The "dynamic relation" allocates the latter vector of members based on a typical // number of members per component, e.g. we expect valence 4 vertices in a typical - // quad-mesh, and so an "expected" number might be 6 to accomodate a few x-ordinary + // quad-mesh, and so an "expected" number might be 6 to accommodate a few x-ordinary // vertices. The member vector is allocated with this number per component and the // counts and offsets initialized to refer to them -- but with the counts set to 0. // The count will be incremented as members are identified and entered, and if any diff --git a/opensubdiv/vtr/level.h b/opensubdiv/vtr/level.h index 59b1f301..b21b645a 100644 --- a/opensubdiv/vtr/level.h +++ b/opensubdiv/vtr/level.h @@ -59,11 +59,11 @@ class FVarLevel; // the topology (i.e. all quads or all tris if not level 0). // // This class is intended for private use within the library. There are still -// opportunities to specialize levels -- e.g. those supporing N-sided faces vs -// those are are purely quads or tris -- so we prefer to insulate it from public +// opportunities to specialize levels -- e.g. those supporting N-sided faces vs +// those that are purely quads or tris -- so we prefer to insulate it from public // access. // -// The represenation of topology here is to store six topological relationships +// The representation of topology here is to store six topological relationships // in tables of integers. Each is stored in its own array(s) so the result is // a SOA representation of the topology. The six relations are: // @@ -75,7 +75,7 @@ class FVarLevel; // - vert-edges: edges incident a vertex // // There is some redundancy here but the intent is not that this be a minimal -// represenation, the intent is that it be amenable to refinement. Classes in +// representation, the intent is that it be amenable to refinement. Classes in // the Far layer essentially store 5 of these 6 in a permuted form -- we add // the face-edges here to simplify refinement. // diff --git a/opensubdiv/vtr/quadRefinement.cpp b/opensubdiv/vtr/quadRefinement.cpp index 9e746a09..09cfaa51 100644 --- a/opensubdiv/vtr/quadRefinement.cpp +++ b/opensubdiv/vtr/quadRefinement.cpp @@ -196,7 +196,7 @@ QuadRefinement::populateFaceEdgesFromParentFaces() { // // This is fairly straightforward, but since we are dealing with edges here, we - // occasionally have to deal with the limition of them being undirected. Since + // occasionally have to deal with the limitation of them being undirected. Since // child faces from the same parent face share much in common, we iterate through // the parent faces. // From bd3113e7e3cb239b5a9a8e470e69edcc679d2b3a Mon Sep 17 00:00:00 2001 From: Mike Erwin Date: Wed, 12 Aug 2015 18:41:18 -0400 Subject: [PATCH 08/20] spelling phase 4 -- examples, tutorials, regression tests Read all comments and made corrections to files that aren't part of OpenSubdiv itself but are packaged with it. Commandline output of glPtexViewer is affected. Otherwise no functional changes. --- examples/common/clDeviceContext.cpp | 4 ++-- examples/common/cudaDeviceContext.h | 4 ++-- examples/common/d3d11PtexMipmapTexture.h | 2 +- examples/common/glPtexMipmapTexture.h | 4 ++-- examples/common/glUtils.cpp | 7 +++---- examples/common/glUtils.h | 2 +- examples/common/ptexMipmapTextureLoader.cpp | 6 +++--- examples/common/stb_image_write.h | 2 +- examples/dxPtexViewer/dxPtexViewer.cpp | 2 +- examples/dxViewer/dxviewer.cpp | 2 +- examples/farViewer/farViewer.cpp | 4 ++-- examples/glEvalLimit/glEvalLimit.cpp | 12 ++++++------ examples/glEvalLimit/particles.h | 4 ++-- examples/glFVarViewer/glFVarViewer.cpp | 4 ++-- examples/glPaintTest/glPaintTest.cpp | 8 ++++---- examples/glPtexViewer/glPtexViewer.cpp | 8 ++++---- examples/glShareTopology/glShareTopology.cpp | 6 +++--- examples/glShareTopology/sceneBase.cpp | 2 +- examples/glStencilViewer/glStencilViewer.cpp | 2 +- examples/glViewer/glViewer.cpp | 14 +++++++------- regression/common/cmp_utils.h | 2 +- regression/common/shape_utils.h | 2 +- regression/hbr_regression/CMakeLists.txt | 2 +- tutorials/far/tutorial_0/far_tutorial_0.cpp | 4 ++-- tutorials/far/tutorial_1/far_tutorial_1.cpp | 2 +- tutorials/far/tutorial_1/hbr_to_vtr.h | 4 ++-- tutorials/far/tutorial_2/far_tutorial_2.cpp | 4 ++-- tutorials/far/tutorial_3/far_tutorial_3.cpp | 6 +++--- tutorials/far/tutorial_4/far_tutorial_4.cpp | 2 +- tutorials/far/tutorial_5/far_tutorial_5.cpp | 6 +++--- tutorials/far/tutorial_7/far_tutorial_7.cpp | 10 +++++----- tutorials/hbr/tutorial_0/hbr_tutorial_0.cpp | 2 +- tutorials/hbr/tutorial_1/hbr_tutorial_1.cpp | 2 +- tutorials/hbr/tutorial_2/hbr_tutorial_2.cpp | 8 ++++---- tutorials/osd/tutorial_0/osd_tutorial_0.cpp | 2 +- 35 files changed, 78 insertions(+), 79 deletions(-) diff --git a/examples/common/clDeviceContext.cpp b/examples/common/clDeviceContext.cpp index b6c684c3..79f968a6 100644 --- a/examples/common/clDeviceContext.cpp +++ b/examples/common/clDeviceContext.cpp @@ -124,8 +124,8 @@ findExtensionSupportedDevice(cl_device_id *clDevices, std::string extString(extensions); delete[] extensions; - // parse string. This is bit deficient since the extentions - // is space separated. + // parse string. This is a bit deficient since the extensions + // string is space separated. // // The actual string would be "cl_khr_d3d11_sharing" // or "cl_nv_d3d11_sharing" diff --git a/examples/common/cudaDeviceContext.h b/examples/common/cudaDeviceContext.h index f63a2e82..1ce34f78 100644 --- a/examples/common/cudaDeviceContext.h +++ b/examples/common/cudaDeviceContext.h @@ -32,10 +32,10 @@ public: CudaDeviceContext(); ~CudaDeviceContext(); - /// Initialze cuda device from the current GL context + /// Initialize cuda device from the current GL context bool Initialize(); - /// Initialze cuda device from the ID3D11Device + /// Initialize cuda device from the ID3D11Device bool Initialize(ID3D11Device *device); /// Returns true if the cuda device has already been initialized diff --git a/examples/common/d3d11PtexMipmapTexture.h b/examples/common/d3d11PtexMipmapTexture.h index 9dce5e77..a3ff1227 100644 --- a/examples/common/d3d11PtexMipmapTexture.h +++ b/examples/common/d3d11PtexMipmapTexture.h @@ -63,7 +63,7 @@ public: private: D3D11PtexMipmapTexture(); - int _width, // widht / height / depth of the 3D texel buffer + int _width, // width / height / depth of the 3D texel buffer _height, _depth; diff --git a/examples/common/glPtexMipmapTexture.h b/examples/common/glPtexMipmapTexture.h index 95165487..da11b1f0 100644 --- a/examples/common/glPtexMipmapTexture.h +++ b/examples/common/glPtexMipmapTexture.h @@ -47,7 +47,7 @@ public: /// Returns the texels texture array. GLuint GetTexelsTexture() const { return _texels; } - /// Returns the amount of allocated memory (in byte) + /// Returns the amount of allocated memory (in bytes) size_t GetMemoryUsage() const { return _memoryUsage; } ~GLPtexMipmapTexture(); @@ -55,7 +55,7 @@ public: private: GLPtexMipmapTexture(); - GLsizei _width, // widht / height / depth of the 3D texel buffer + GLsizei _width, // width / height / depth of the 3D texel buffer _height, _depth; diff --git a/examples/common/glUtils.cpp b/examples/common/glUtils.cpp index efdb5852..cdee16be 100644 --- a/examples/common/glUtils.cpp +++ b/examples/common/glUtils.cpp @@ -260,9 +260,8 @@ GetShaderVersion(){ return shader_version; } -/* Generates the version defintion needed by the glsl shaders based on the - * opengl string -*/ +// Generates the version definition needed by the glsl shaders based on the +// opengl string std::string GetShaderVersionInclude(){ return "#version " + GetShaderVersion() + "\n"; } @@ -295,4 +294,4 @@ bool GL_ARBComputeShaderOrGL_VERSION_4_3() { #undef IS_SUPPORTED -} // namesapce GLUtils +} // namespace GLUtils diff --git a/examples/common/glUtils.h b/examples/common/glUtils.h index ba5d22e2..3b238b60 100644 --- a/examples/common/glUtils.h +++ b/examples/common/glUtils.h @@ -63,7 +63,7 @@ void WriteScreenshot(int width, int height); bool SupportsAdaptiveTessellation(); -// Helper function that parses the open gl version string, retrieving the +// Helper function that parses the opengl version string, retrieving the // major and minor version from it. void GetMajorMinorVersion(int *major, int *minor); diff --git a/examples/common/ptexMipmapTextureLoader.cpp b/examples/common/ptexMipmapTextureLoader.cpp index 1303ab00..34323e30 100644 --- a/examples/common/ptexMipmapTextureLoader.cpp +++ b/examples/common/ptexMipmapTextureLoader.cpp @@ -110,7 +110,7 @@ PtexMipmapTextureLoader::Block::guttering(PtexMipmapTextureLoader *loader, (everything else, including boundary) Since guttering pixels are placed on the border of each ptex faces, it's not possible to store more than 4 pixels - at a coner for a reasonable interpolation. + at a corner for a reasonable interpolation. In this case, we need to average all corner pixels and overwrite with an averaged value, so that every face vertex picks the same value. @@ -452,7 +452,7 @@ PtexMipmapTextureLoader::PtexMipmapTextureLoader(PtexTexture *ptex, _pageWidth(0), _pageHeight(0), _texelBuffer(NULL), _layoutBuffer(NULL), _memoryUsage(0) { - // byte per pixel + // bytes per pixel _bpp = ptex->numChannels() * Ptex::DataSize(ptex->dataType()); int numFaces = ptex->numFaces(); @@ -898,7 +898,7 @@ PtexMipmapTextureLoader::optimizePacking(int maxNumPages, h = std::max(h, (int)(*it)->height); } - // grow the pagesize to make sure the optimization will not exceed + // grow the page size to make sure the optimization will not exceed // the maximum number of pages allowed int minPageSize = 512; int maxPageSize = 4096; // XXX:should be configurable. diff --git a/examples/common/stb_image_write.h b/examples/common/stb_image_write.h index 06271014..2a47e1e7 100644 --- a/examples/common/stb_image_write.h +++ b/examples/common/stb_image_write.h @@ -19,7 +19,7 @@ ABOUT: The PNG output is not optimal; it is 20-50% larger than the file written by a decent optimizing implementation. This library is designed - for source code compactness and simplicitly, not optimal image file size + for source code compactness and simplicity, not optimal image file size or run-time performance. USAGE: diff --git a/examples/dxPtexViewer/dxPtexViewer.cpp b/examples/dxPtexViewer/dxPtexViewer.cpp index 049a05f5..452e839a 100644 --- a/examples/dxPtexViewer/dxPtexViewer.cpp +++ b/examples/dxPtexViewer/dxPtexViewer.cpp @@ -1937,7 +1937,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmd wcex.lpszClassName = szWindowClass; RegisterClass(&wcex); - // crete window + // create window RECT rect = { 0, 0, g_width, g_height }; AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); diff --git a/examples/dxViewer/dxviewer.cpp b/examples/dxViewer/dxviewer.cpp index 6f25eaa7..4ba07020 100644 --- a/examples/dxViewer/dxviewer.cpp +++ b/examples/dxViewer/dxviewer.cpp @@ -1544,7 +1544,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmd wcex.lpszClassName = szWindowClass; RegisterClass(&wcex); - // crete window + // create window RECT rect = { 0, 0, g_width, g_height }; AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); diff --git a/examples/farViewer/farViewer.cpp b/examples/farViewer/farViewer.cpp index 752255f2..18249899 100644 --- a/examples/farViewer/farViewer.cpp +++ b/examples/farViewer/farViewer.cpp @@ -1387,7 +1387,7 @@ int main(int argc, char ** argv) } glfwMakeContextCurrent(g_window); - // accommocate high DPI displays (e.g. mac retina displays) + // accommodate high DPI displays (e.g. mac retina displays) glfwGetFramebufferSize(g_window, &g_width, &g_height); glfwSetFramebufferSizeCallback(g_window, reshape); @@ -1408,7 +1408,7 @@ int main(int argc, char ** argv) exit(1); } #ifdef CORE_PROFILE - // clear GL errors which was generated during glewInit() + // clear GL errors which were generated during glewInit() glGetError(); #endif #endif diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 36b753b3..8a924ebf 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -259,11 +259,11 @@ public: : _srcDesc( /*offset*/ 0, /*length*/ 3, /*stride*/ 3), _srcVaryingDesc(/*offset*/ 0, /*length*/ 3, /*stride*/ 3), _srcFVarDesc( /*offset*/ 0, /*length*/ fvarWidth, /*stride*/ fvarWidth), - _vertexDesc( /*offset*/ 0, /*legnth*/ 3, /*stride*/ 6), - _varyingDesc( /*offset*/ 3, /*legnth*/ 3, /*stride*/ 6), - _fvarDesc( /*offset*/ 0, /*legnth*/ fvarWidth, /*stride*/ fvarWidth), - _duDesc( /*offset*/ 0, /*legnth*/ 3, /*stride*/ 6), - _dvDesc( /*offset*/ 3, /*legnth*/ 3, /*stride*/ 6), + _vertexDesc( /*offset*/ 0, /*length*/ 3, /*stride*/ 6), + _varyingDesc( /*offset*/ 3, /*length*/ 3, /*stride*/ 6), + _fvarDesc( /*offset*/ 0, /*length*/ fvarWidth, /*stride*/ fvarWidth), + _duDesc( /*offset*/ 0, /*length*/ 3, /*stride*/ 6), + _dvDesc( /*offset*/ 3, /*length*/ 3, /*stride*/ 6), _deviceContext(deviceContext) { // total number of vertices = coarse points + refined points + local points @@ -410,7 +410,7 @@ public: EVALUATOR::EvalPatchesVarying( _srcVaryingData, _srcVaryingDesc, - // varyingdata is interleved in vertexData. + // varying data is interleaved in vertexData. _vertexData, _varyingDesc, _patchCoords->GetNumVertices(), _patchCoords, diff --git a/examples/glEvalLimit/particles.h b/examples/glEvalLimit/particles.h index 887add25..b5dbf98c 100644 --- a/examples/glEvalLimit/particles.h +++ b/examples/glEvalLimit/particles.h @@ -39,7 +39,7 @@ // particle is assigned a location on the subdivision surface limit that is // composed of a unique ptex face index, with a local (s,t) parametric pair. // -// The system also generates an array of parametric velocties (ds, dt) for each +// The system also generates an array of parametric velocities (ds, dt) for each // particle. An Update() function then applies the velocities to the locations and // moves the points along the parametric space. // @@ -49,7 +49,7 @@ // bounces it, if the edge happens to be a boundary. // // Note: currently the adjacency code does not handle 'diagonal' crossings, nor -// crossings between quand and non-quad faces. +// crossings between quad and non-quad faces. // class STParticles { diff --git a/examples/glFVarViewer/glFVarViewer.cpp b/examples/glFVarViewer/glFVarViewer.cpp index d067b582..4f8ddb04 100644 --- a/examples/glFVarViewer/glFVarViewer.cpp +++ b/examples/glFVarViewer/glFVarViewer.cpp @@ -829,7 +829,7 @@ display() { glEnable(GL_DEPTH_TEST); - // make sure that the vertex buffer is interoped back as a GL resources. + // make sure that the vertex buffer is interoped back as a GL resource. GLuint vbo = g_mesh->BindVertexBuffer(); glBindVertexArray(g_vao); @@ -1263,7 +1263,7 @@ int main(int argc, char ** argv) { exit(1); } #ifdef CORE_PROFILE - // clear GL errors which was generated during glewInit() + // clear GL errors which were generated during glewInit() glGetError(); #endif #endif diff --git a/examples/glPaintTest/glPaintTest.cpp b/examples/glPaintTest/glPaintTest.cpp index 5b2ffeb8..c5688055 100644 --- a/examples/glPaintTest/glPaintTest.cpp +++ b/examples/glPaintTest/glPaintTest.cpp @@ -648,7 +648,7 @@ display() { bindTextures(effect); - // make sure that the vertex buffer is interoped back as a GL resources. + // make sure that the vertex buffer is interoped back as a GL resource. g_mesh->BindVertexBuffer(); glBindVertexArray(g_vao); @@ -694,7 +694,7 @@ display() { g_fpsTimer.Stop(); double fps = 1.0/g_fpsTimer.GetElapsed(); g_fpsTimer.Start(); - // Avereage fps over a defined number of time samples for + // Average fps over a defined number of time samples for // easier reading in the HUD g_fpsTimeSamples[g_currentFpsTimeSample++] = float(fps); if (g_currentFpsTimeSample >= NUM_FPS_TIME_SAMPLES) @@ -776,7 +776,7 @@ drawStroke(int x, int y) { glBindBufferBase(GL_UNIFORM_BUFFER, g_tessellationBinding, g_tessellationUB); - // make sure that the vertex buffer is interoped back as a GL resources. + // make sure that the vertex buffer is interoped back as a GL resource. g_mesh->BindVertexBuffer(); glBindVertexArray(g_vao); @@ -1153,7 +1153,7 @@ int main(int argc, char ** argv) { exit(1); } #ifdef CORE_PROFILE - // clear GL errors which was generated during glewInit() + // clear GL errors which were generated during glewInit() glGetError(); #endif #endif diff --git a/examples/glPtexViewer/glPtexViewer.cpp b/examples/glPtexViewer/glPtexViewer.cpp index e9e3b85a..d8950f22 100644 --- a/examples/glPtexViewer/glPtexViewer.cpp +++ b/examples/glPtexViewer/glPtexViewer.cpp @@ -1117,7 +1117,7 @@ updateConstantUniformBlock() { memcpy(g_modelViewProjection, constantData.ModelViewProjectionMatrix, 16*sizeof(float)); - // lighs + // lights Constant::Light light0 = { { 0.6f, 1.0f, 0.6f, 0.0f }, { 0.1f, 0.1f, 0.1f, 1.0f }, { 1.7f, 1.3f, 1.1f, 1.0f }, @@ -1401,7 +1401,7 @@ display() { if (g_hud.IsVisible()) { double fps = 1.0/elapsed; - // Avereage fps over a defined number of time samples for + // Average fps over a defined number of time samples for // easier reading in the HUD g_fpsTimeSamples[g_currentFpsTimeSample++] = float(fps); if (g_currentFpsTimeSample >= NUM_FPS_TIME_SAMPLES) @@ -1695,9 +1695,9 @@ void usage(const char *program) { printf(" -e : specular environment map for IBL\n"); printf(" -s : custom shader file\n"); printf(" -y : Y-up model\n"); - printf(" -m level : max mimmap level (default=10)\n"); + printf(" -m level : max mipmap level (default=10)\n"); printf(" -x : ptex target memory size\n"); - printf(" --disp : Displacment scale\n"); + printf(" --disp : Displacement scale\n"); } //------------------------------------------------------------------------------ diff --git a/examples/glShareTopology/glShareTopology.cpp b/examples/glShareTopology/glShareTopology.cpp index 7f928d03..71c90fdf 100644 --- a/examples/glShareTopology/glShareTopology.cpp +++ b/examples/glShareTopology/glShareTopology.cpp @@ -635,7 +635,7 @@ display() { glEnable(GL_DEPTH_TEST); - // make sure that the vertex buffer is interoped back as a GL resources. + // make sure that the vertex buffer is interoped back as a GL resource. g_scene->BindVertexBuffer(); glBindVertexArray(g_vao); @@ -1193,7 +1193,7 @@ int main(int argc, char ** argv) { glfwMakeContextCurrent(g_window); GLUtils::PrintGLVersion(); - // accommocate high DPI displays (e.g. mac retina displays) + // accommodate high DPI displays (e.g. mac retina displays) glfwGetFramebufferSize(g_window, &g_width, &g_height); glfwSetFramebufferSizeCallback(g_window, reshape); @@ -1212,7 +1212,7 @@ int main(int argc, char ** argv) { exit(1); } #ifdef CORE_PROFILE - // clear GL errors which was generated during glewInit() + // clear GL errors which were generated during glewInit() glGetError(); #endif #endif diff --git a/examples/glShareTopology/sceneBase.cpp b/examples/glShareTopology/sceneBase.cpp index ab87b8a5..0ba44b9f 100644 --- a/examples/glShareTopology/sceneBase.cpp +++ b/examples/glShareTopology/sceneBase.cpp @@ -169,7 +169,7 @@ SceneBase::createStencilTable(Shape const *shape, int level, bool varying, _stencilTableSize = createMeshRefiner(vertexStencils, varyingStencils, numControlVertices); - // note: refiner takes ownerships of vertexStencils/ varyingStencils, patchTable + // note: refiner takes ownership of vertexStencils, varyingStencils, patchTable delete refiner; return numControlVertices + vertexStencils->GetNumStencils(); diff --git a/examples/glStencilViewer/glStencilViewer.cpp b/examples/glStencilViewer/glStencilViewer.cpp index 90c30fc2..48a8f7d6 100644 --- a/examples/glStencilViewer/glStencilViewer.cpp +++ b/examples/glStencilViewer/glStencilViewer.cpp @@ -1130,7 +1130,7 @@ int main(int argc, char **argv) { exit(1); } #ifdef CORE_PROFILE - // clear GL errors which was generated during glewInit() + // clear GL errors which were generated during glewInit() glGetError(); #endif #endif diff --git a/examples/glViewer/glViewer.cpp b/examples/glViewer/glViewer.cpp index f71e8327..5f98ea4c 100644 --- a/examples/glViewer/glViewer.cpp +++ b/examples/glViewer/glViewer.cpp @@ -85,10 +85,10 @@ OpenSubdiv::Osd::GLLegacyGregoryPatchTable *g_legacyGregoryPatchTable = NULL; /* Function to get the correct shader file based on the opengl version. - The implementation varies depending if glew is available or not. In case + The implementation varies depending if glew is available or not. In case it is available the capabilities are queried during execution and the correct - source is returned. If glew in not available during compile time the version - is determined*/ + source is returned. If glew is not available the version is determined at + compile time */ static const char *shaderSource(){ #if ! defined(OSD_USES_GLEW) @@ -110,7 +110,7 @@ static const char *res = ; //Determine the shader file to use. Since some opengl implementations //define that an extension is available but not an implementation - //for it you cannnot trust in the glew header definitions to know that is + //for it you cannot trust in the glew header definitions to know that is //available, but you need to query it during runtime. if (GLUtils::SupportsAdaptiveTessellation()) res = gen; @@ -1084,7 +1084,7 @@ display() { inverseMatrix(g_transformData.ModelViewInverseMatrix, g_transformData.ModelViewMatrix); - // make sure that the vertex buffer is interoped back as a GL resources. + // make sure that the vertex buffer is interoped back as a GL resource. GLuint vbo = g_mesh->BindVertexBuffer(); // vertex texture update for legacy gregory drawing @@ -1709,7 +1709,7 @@ int main(int argc, char ** argv) { glfwMakeContextCurrent(g_window); GLUtils::PrintGLVersion(); - // accommocate high DPI displays (e.g. mac retina displays) + // accommodate high DPI displays (e.g. mac retina displays) glfwGetFramebufferSize(g_window, &g_width, &g_height); glfwSetFramebufferSizeCallback(g_window, reshape); @@ -1728,7 +1728,7 @@ int main(int argc, char ** argv) { exit(1); } #ifdef CORE_PROFILE - // clear GL errors which was generated during glewInit() + // clear GL errors which were generated during glewInit() glGetError(); #endif #endif diff --git a/regression/common/cmp_utils.h b/regression/common/cmp_utils.h index f467945c..716e0579 100644 --- a/regression/common/cmp_utils.h +++ b/regression/common/cmp_utils.h @@ -41,7 +41,7 @@ namespace { }; -// Copies vertex data from hmesh into hbrVertexData reordered to match +// Copies vertex data from hbrMesh into hbrVertexData reordered to match // the given refiner and subdivision level. This is used for later easy // comparison between the two. template diff --git a/regression/common/shape_utils.h b/regression/common/shape_utils.h index 800cc9cc..cd3e7a77 100644 --- a/regression/common/shape_utils.h +++ b/regression/common/shape_utils.h @@ -52,7 +52,7 @@ struct Shape { ns, // specular exponent ni, // optical density (1.0=no refraction, glass=1.5) sharpness, // reflection sharpness - tf[3], // transimission filter + tf[3], // transmission filter d; // dissolve factor (1.0 = opaque) int illum; diff --git a/regression/hbr_regression/CMakeLists.txt b/regression/hbr_regression/CMakeLists.txt index d5bf407f..1b3536f8 100644 --- a/regression/hbr_regression/CMakeLists.txt +++ b/regression/hbr_regression/CMakeLists.txt @@ -29,7 +29,7 @@ _add_possibly_cuda_executable(hbr_regression "regression" $ ) -# This is waht we "should" be using but we need to escape the backslash and cmake +# This is what we "should" be using but we need to escape the backslash and cmake # regex doesn't allow that apparently #file(TO_NATIVE_PATH "${PROJECT_SOURCE_DIR}/regression/hbr_regression/baseline/" HBR_BASELINE_DIR) diff --git a/tutorials/far/tutorial_0/far_tutorial_0.cpp b/tutorials/far/tutorial_0/far_tutorial_0.cpp index 188da0b2..5c5992c5 100644 --- a/tutorials/far/tutorial_0/far_tutorial_0.cpp +++ b/tutorials/far/tutorial_0/far_tutorial_0.cpp @@ -26,7 +26,7 @@ //------------------------------------------------------------------------------ // Tutorial description: // -// This tutorial presents in a very succint way the requisite steps to +// This tutorial presents in a very succinct way the requisite steps to // instantiate and refine a mesh with Far from simple topological data. // @@ -124,7 +124,7 @@ int main(int, char **) { int maxlevel = 2; - // Uniformly refine the topolgy up to 'maxlevel' + // Uniformly refine the topology up to 'maxlevel' refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); diff --git a/tutorials/far/tutorial_1/far_tutorial_1.cpp b/tutorials/far/tutorial_1/far_tutorial_1.cpp index a89fbd00..ba8826a7 100644 --- a/tutorials/far/tutorial_1/far_tutorial_1.cpp +++ b/tutorials/far/tutorial_1/far_tutorial_1.cpp @@ -430,7 +430,7 @@ int main(int, char **) { int maxlevel = 5; - // Uniformly refine the topolgy up to 'maxlevel' + // Uniformly refine the topology up to 'maxlevel' refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); diff --git a/tutorials/far/tutorial_1/hbr_to_vtr.h b/tutorials/far/tutorial_1/hbr_to_vtr.h index 54ea5c9c..cde98c3f 100644 --- a/tutorials/far/tutorial_1/hbr_to_vtr.h +++ b/tutorials/far/tutorial_1/hbr_to_vtr.h @@ -130,7 +130,7 @@ getSdcOptions( OpenSubdiv::HbrMesh const & mesh, OpenSubdiv::SdcOptions * opt // uniquely. To remedy the problem, the converter uses a std::map to connect // Hbr's half-edge pointers to unique indices. // -// This remapping code is provided as an example of efficient implementaiton of +// This remapping code is provided as an example of efficient implementation of // the translation from an arbitrary topo rep to Vtr. // // Even though Vtr is capable of re-generating edge and vertex relationships on @@ -178,7 +178,7 @@ public: return (int)_edgeset.size(); } - // Returns a point to the Hbr halfege of index 'idx' + // Returns a pointer to the Hbr halfege of index 'idx' OpenSubdiv::HbrHalfedge const * GetEdge(int idx) const { return _edgeids[idx]; } diff --git a/tutorials/far/tutorial_2/far_tutorial_2.cpp b/tutorials/far/tutorial_2/far_tutorial_2.cpp index 165babb4..2a688aa2 100644 --- a/tutorials/far/tutorial_2/far_tutorial_2.cpp +++ b/tutorials/far/tutorial_2/far_tutorial_2.cpp @@ -124,7 +124,7 @@ int main(int, char **) { Far::TopologyRefiner * refiner = createFarTopologyRefiner(); - // Uniformly refine the topolgy up to 'maxlevel' + // Uniformly refine the topology up to 'maxlevel' refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); // Allocate buffers for vertex primvar data. @@ -140,7 +140,7 @@ int main(int, char **) { int nTotalVerts = refiner->GetNumVerticesTotal(); int nTempVerts = nTotalVerts - nCoarseVerts - nFineVerts; - // Allocate and intialize the primvar data for the original coarse vertices: + // Allocate and initialize the primvar data for the original coarse vertices: std::vector coarsePosBuffer(nCoarseVerts); std::vector coarseClrBuffer(nCoarseVerts); diff --git a/tutorials/far/tutorial_3/far_tutorial_3.cpp b/tutorials/far/tutorial_3/far_tutorial_3.cpp index 154922ed..f7471e2f 100644 --- a/tutorials/far/tutorial_3/far_tutorial_3.cpp +++ b/tutorials/far/tutorial_3/far_tutorial_3.cpp @@ -81,11 +81,11 @@ private: //------------------------------------------------------------------------------ // Face-varying container implementation. // -// We are using a uv texture layout as a 'face-varying' primtiive variable +// We are using a uv texture layout as a 'face-varying' primitive 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 +// Similarly to our 'Vertex' container, we add a minimalistic interpolation // interface with a 'Clear()' and 'AddWithWeight()' methods. // struct FVarVertexUV { @@ -248,7 +248,7 @@ int main(int, char **) { Far::TopologyRefinerFactory::Create(desc, Far::TopologyRefinerFactory::Options(type, options)); - // Uniformly refine the topolgy up to 'maxlevel' + // Uniformly refine the topology up to 'maxlevel' // note: fullTopologyInLastLevel must be true to work with face-varying data { Far::TopologyRefiner::UniformOptions refineOptions(maxlevel); diff --git a/tutorials/far/tutorial_4/far_tutorial_4.cpp b/tutorials/far/tutorial_4/far_tutorial_4.cpp index 61792365..7d32535e 100644 --- a/tutorials/far/tutorial_4/far_tutorial_4.cpp +++ b/tutorials/far/tutorial_4/far_tutorial_4.cpp @@ -111,7 +111,7 @@ int main(int, char **) { Far::TopologyRefiner * refiner = createTopologyRefiner(); - // Uniformly refine the topolgy up to 'maxlevel'. + // Uniformly refine the topology up to 'maxlevel'. int maxlevel = 3; refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); diff --git a/tutorials/far/tutorial_5/far_tutorial_5.cpp b/tutorials/far/tutorial_5/far_tutorial_5.cpp index f47e4fb9..6c4e9d55 100644 --- a/tutorials/far/tutorial_5/far_tutorial_5.cpp +++ b/tutorials/far/tutorial_5/far_tutorial_5.cpp @@ -113,11 +113,11 @@ static Far::TopologyRefiner * createTopologyRefiner(); //------------------------------------------------------------------------------ int main(int, char **) { - // Generate some FarTopologyRefiner (see far_tutorial_0 for details). + // Generate a FarTopologyRefiner (see far_tutorial_0 for details). Far::TopologyRefiner * refiner = createTopologyRefiner(); - // Uniformly refine the topolgy up to 'maxlevel'. + // Uniformly refine the topology up to 'maxlevel'. int maxlevel = 4; refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); @@ -159,7 +159,7 @@ int main(int, char **) { // Allocate varying primvar buffer (1 stencil for each vertex) std::vector varyingBuffer(varyingStencils->GetNumStencils()); - // Use the a per-vertex array of RGB colors as 'varying' primvar data + // Use per-vertex array of RGB colors as 'varying' primvar data Vertex * varyingCVs = reinterpret_cast(g_colors); delete refiner; diff --git a/tutorials/far/tutorial_7/far_tutorial_7.cpp b/tutorials/far/tutorial_7/far_tutorial_7.cpp index 79f4f9cd..b793cc1b 100644 --- a/tutorials/far/tutorial_7/far_tutorial_7.cpp +++ b/tutorials/far/tutorial_7/far_tutorial_7.cpp @@ -28,7 +28,7 @@ // // This tutorial shows how to create and manipulate table of cascading stencils. // -// We initalize a Far::TopologyRefiner initalized with a cube and apply uniform +// We initialize a Far::TopologyRefiner with a cube and apply uniform // refinement. We then use a Far::StencilTableFactory to generate a stencil // table. We set the factory Options to not factorize intermediate levels, // thus giving a table of "cascading" stencils. @@ -122,15 +122,15 @@ static Far::TopologyRefiner * createTopologyRefiner(); //------------------------------------------------------------------------------ int main(int, char **) { - // Generate some FarTopologyRefiner (see far_tutorial_0 for details). + // Generate a FarTopologyRefiner (see far_tutorial_0 for details). Far::TopologyRefiner * refiner = createTopologyRefiner(); - // Uniformly refine the topolgy up to 'maxlevel'. + // Uniformly refine the topology up to 'maxlevel'. int maxlevel = 4; refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); // Use the FarStencilTable factory to create cascading stencil table - // note: we want stencils for the each refinement level + // note: we want stencils for each refinement level // "cascade" mode is achieved by setting "factorizeIntermediateLevels" // to false Far::StencilTableFactory::Options options; @@ -145,7 +145,7 @@ int main(int, char **) { Vertex * destVerts = &vertexBuffer[0]; - int start = 0, end = 0; // stencils batches for each level of subdivision + int start = 0, end = 0; // stencil batches for each level of subdivision for (int level=0; levelGetLevel(level+1).GetNumVertices(); diff --git a/tutorials/hbr/tutorial_0/hbr_tutorial_0.cpp b/tutorials/hbr/tutorial_0/hbr_tutorial_0.cpp index a8a85b20..e6ad47d5 100644 --- a/tutorials/hbr/tutorial_0/hbr_tutorial_0.cpp +++ b/tutorials/hbr/tutorial_0/hbr_tutorial_0.cpp @@ -26,7 +26,7 @@ //------------------------------------------------------------------------------ // Tutorial description: // -// This tutorial presents in a very succint way the requisite steps to +// This tutorial presents in a very succinct way the requisite steps to // instantiate an Hbr mesh from simple topological data. // diff --git a/tutorials/hbr/tutorial_1/hbr_tutorial_1.cpp b/tutorials/hbr/tutorial_1/hbr_tutorial_1.cpp index 69d80c99..0832e1c4 100644 --- a/tutorials/hbr/tutorial_1/hbr_tutorial_1.cpp +++ b/tutorials/hbr/tutorial_1/hbr_tutorial_1.cpp @@ -27,7 +27,7 @@ // Tutorial description: // // This tutorial shows how to safely create Hbr meshes from arbitrary topology. -// Because Hbr is a half-edge data structure, it cannot represeent non-manifold +// Because Hbr is a half-edge data structure, it cannot represent non-manifold // topology. Ensuring that the geometry used is manifold is a requirement to use // Hbr safely. This tutorial presents some simple tests to detect inappropriate // topology. diff --git a/tutorials/hbr/tutorial_2/hbr_tutorial_2.cpp b/tutorials/hbr/tutorial_2/hbr_tutorial_2.cpp index 0b68b64e..79178c6e 100644 --- a/tutorials/hbr/tutorial_2/hbr_tutorial_2.cpp +++ b/tutorials/hbr/tutorial_2/hbr_tutorial_2.cpp @@ -27,7 +27,7 @@ // Tutorial description: // // This tutorial shows how to subdivide uniformly a simple Hbr mesh. We are -// building upon previous turtorials and assuming a fully instantiated mesh: +// building upon previous tutorials and assuming a fully instantiated mesh: // we start with an HbrMesh pointer initialized from the same pyramid shape // used in hbr_tutorial_0. // @@ -45,7 +45,7 @@ //------------------------------------------------------------------------------ // -// For this tutorial, we have to flesh the Vertex class further. Note that now +// For this tutorial, we have to flesh out the Vertex class further. Note that now // the copy constructor, Clear() and AddwithWeight() methods have been // implemented to interpolate our float3 position data. // @@ -113,7 +113,7 @@ int main(int, char **) { // Total number of faces in the mesh, across all levels // - // Mote: this function iterates over the list of faces and can be slow + // Note: this function iterates over the list of faces and can be slow int nfaces = hmesh->GetNumFaces(); if (level==(maxlevel-1)) { @@ -126,7 +126,7 @@ int main(int, char **) { Hface * f = hmesh->GetFace(face); - // Mote : hole tags would have to be dealt with here. + // Note: hole tags would have to be dealt with here. f->Refine(); } diff --git a/tutorials/osd/tutorial_0/osd_tutorial_0.cpp b/tutorials/osd/tutorial_0/osd_tutorial_0.cpp index f2ed1893..ac656f59 100644 --- a/tutorials/osd/tutorial_0/osd_tutorial_0.cpp +++ b/tutorials/osd/tutorial_0/osd_tutorial_0.cpp @@ -156,7 +156,7 @@ createTopologyRefiner(int maxlevel) { Far::TopologyRefinerFactory::Create(desc, Far::TopologyRefinerFactory::Options(type, options)); - // Uniformly refine the topolgy up to 'maxlevel' + // Uniformly refine the topology up to 'maxlevel' refiner->RefineUniform(Far::TopologyRefiner::UniformOptions(maxlevel)); return refiner; From 05352272b10310d3b379d3c538ffa9e9a39a335e Mon Sep 17 00:00:00 2001 From: Thomas Thomassen Date: Mon, 15 Feb 2016 16:48:39 +0100 Subject: [PATCH 09/20] Fixed some typos in comments. --- opensubdiv/far/endCapBSplineBasisPatchFactory.cpp | 8 ++++---- opensubdiv/far/endCapBSplineBasisPatchFactory.h | 2 +- opensubdiv/far/endCapGregoryBasisPatchFactory.cpp | 2 +- opensubdiv/far/endCapGregoryBasisPatchFactory.h | 2 +- opensubdiv/far/endCapLegacyGregoryPatchFactory.h | 2 +- opensubdiv/far/patchTable.h | 4 ++-- opensubdiv/far/primvarRefiner.h | 2 +- opensubdiv/osd/cpuVertexBuffer.h | 2 +- opensubdiv/sdc/crease.h | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp index db8b2be6..1d01ac08 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.cpp @@ -298,12 +298,12 @@ EndCapBSplineBasisPatchFactory::getPatchPoints( // // 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 + // The location of the extraordinary vertex can be one of // 0-ring quad corner. // - // B-Spline control point gathering indice + // B-Spline control point gathering indices // - // [5] (4)---(15)--(14) 0 : extraoridnary vertex + // [5] (4)---(15)--(14) 0 : extraordinary vertex // | | | // | | | 1,2,3,9,10,11,12,13 : // (6)----0-----3-----13 B-Spline control points, gathered by @@ -467,7 +467,7 @@ EndCapBSplineBasisPatchFactory::getPatchPoints( X5.AddWithWeight(X7, -1.0f); X5.AddWithWeight(X15, -1.0f); - // [5] (4)---(15)--(14) 0 : extraoridnary vertex + // [5] (4)---(15)--(14) 0 : extraordinary vertex // | | | // | | | 1,2,3,9,10,11,12,13 : // (6)----0-----3-----13 B-Spline control points, gathered by diff --git a/opensubdiv/far/endCapBSplineBasisPatchFactory.h b/opensubdiv/far/endCapBSplineBasisPatchFactory.h index c3d6ffd0..61d6b424 100644 --- a/opensubdiv/far/endCapBSplineBasisPatchFactory.h +++ b/opensubdiv/far/endCapBSplineBasisPatchFactory.h @@ -66,7 +66,7 @@ public: /// \brief Returns end patch point indices for \a faceIndex of \a level. /// Note that end patch points are not included in the vertices in /// the topologyRefiner, they're expected to come after the end. - /// The returning indices are offsetted by refiner->GetNumVerticesTotal. + /// The returned indices are offset by refiner->GetNumVerticesTotal. /// /// @param level vtr refinement level /// diff --git a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp index 8464e018..c6169342 100644 --- a/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp +++ b/opensubdiv/far/endCapGregoryBasisPatchFactory.cpp @@ -212,7 +212,7 @@ EndCapGregoryBasisPatchFactory::GetPatchPoints( Index * src = &_patchPoints[adjPatchIndex*20]; for (int j=0; j<4; ++j) { // invert direction - // note that src indices have already been offsetted. + // note that src indices have already been offset. dest[gregoryEdgeVerts[i][3-j]] = src[gregoryEdgeVerts[aedge][j]]; } } diff --git a/opensubdiv/far/endCapGregoryBasisPatchFactory.h b/opensubdiv/far/endCapGregoryBasisPatchFactory.h index 4831c4e7..b5f5e72a 100644 --- a/opensubdiv/far/endCapGregoryBasisPatchFactory.h +++ b/opensubdiv/far/endCapGregoryBasisPatchFactory.h @@ -72,7 +72,7 @@ public: /// \brief Returns end patch point indices for \a faceIndex of \a level. /// Note that end patch points are not included in the vertices in /// the topologyRefiner, they're expected to come after the end. - /// The returned indices are offsetted by refiner->GetNumVerticesTotal. + /// The returned indices are offset by refiner->GetNumVerticesTotal. /// /// @param level vtr refinement level /// diff --git a/opensubdiv/far/endCapLegacyGregoryPatchFactory.h b/opensubdiv/far/endCapLegacyGregoryPatchFactory.h index e3b9f354..1c98860e 100644 --- a/opensubdiv/far/endCapLegacyGregoryPatchFactory.h +++ b/opensubdiv/far/endCapLegacyGregoryPatchFactory.h @@ -50,7 +50,7 @@ public: /// \brief Returns end patch point indices for \a faceIndex of \a level. /// Note that legacy gregory patch points exist in the max level /// of subdivision in the topologyRefiner. - /// The returned indices are offsetted by levelVertOffset + /// The returned indices are offset by levelVertOffset /// /// @param level vtr refinement level /// diff --git a/opensubdiv/far/patchTable.h b/opensubdiv/far/patchTable.h index 34e49281..c126889f 100644 --- a/opensubdiv/far/patchTable.h +++ b/opensubdiv/far/patchTable.h @@ -371,7 +371,7 @@ public: /// \brief Evaluate basis functions for position and derivatives at a /// given (u,v) parametric location of a patch. /// - /// @param handle A patch handle indentifying the sub-patch containing the + /// @param handle A patch handle identifying the sub-patch containing the /// (u,v) location /// /// @param u Patch coordinate (in base face normalized space) @@ -423,7 +423,7 @@ public: /// \brief Evaluate basis functions for a face-varying value and /// derivatives at a given (u,v) parametric location of a patch. /// - /// @param handle A patch handle indentifying the sub-patch containing the + /// @param handle A patch handle identifying the sub-patch containing the /// (u,v) location /// /// @param u Patch coordinate (in base face normalized space) diff --git a/opensubdiv/far/primvarRefiner.h b/opensubdiv/far/primvarRefiner.h index 5b8c350d..e800dc62 100644 --- a/opensubdiv/far/primvarRefiner.h +++ b/opensubdiv/far/primvarRefiner.h @@ -978,7 +978,7 @@ PrimvarRefiner::interpFVarFromVerts(int level, T const & src, U & dst, int chann float eWeight = 0.125f; // - // If semisharp we need to apply fractional weighting -- if made sharp because + // If semi-sharp we need to apply fractional weighting -- if made sharp because // of the other sibling (dependent-sharp) use the fractional weight from that // other sibling (should only occur when there are 2): // diff --git a/opensubdiv/osd/cpuVertexBuffer.h b/opensubdiv/osd/cpuVertexBuffer.h index 1d1e76a1..65496175 100644 --- a/opensubdiv/osd/cpuVertexBuffer.h +++ b/opensubdiv/osd/cpuVertexBuffer.h @@ -34,7 +34,7 @@ namespace OPENSUBDIV_VERSION { namespace Osd { -/// \brief Concrete vertex buffer class for cpu subdivision. +/// \brief Concrete vertex buffer class for CPU subdivision. /// /// CpuVertexBuffer implements the VertexBufferInterface. An instance /// of this buffer class can be passed to CpuEvaluator diff --git a/opensubdiv/sdc/crease.h b/opensubdiv/sdc/crease.h index 57d6189a..2d7fba36 100644 --- a/opensubdiv/sdc/crease.h +++ b/opensubdiv/sdc/crease.h @@ -97,7 +97,7 @@ public: //@{ /// Optional sharp features: /// Since options treat certain topological features as infinitely sharp -- boundaries - /// or (in future) nonmanifold features -- sharpness values should be adjusted before use. + /// or (in future) non-manifold features -- sharpness values should be adjusted before use. /// The following methods will adjust (by return) specific values according to the options /// applied. /// From 66e8592ac64e9aa1a406ca279781727c41b0bd28 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Wed, 25 Jan 2017 16:59:48 -0800 Subject: [PATCH 10/20] Fixed program delete in Osd::GLComputeEvaluator This fixes an inadvertant double delete of the previous GL progam when compiling a compute kernel. --- opensubdiv/osd/glComputeEvaluator.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/opensubdiv/osd/glComputeEvaluator.cpp b/opensubdiv/osd/glComputeEvaluator.cpp index 8d86ca5b..633db1c1 100644 --- a/opensubdiv/osd/glComputeEvaluator.cpp +++ b/opensubdiv/osd/glComputeEvaluator.cpp @@ -332,9 +332,6 @@ GLComputeEvaluator::_StencilKernel::Compile(BufferDescriptor const &srcDesc, "#define OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES\n" : "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_STENCILS\n"; - if (program) { - glDeleteProgram(program); - } program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, kernelDef, workGroupSize); if (program == 0) return false; @@ -377,9 +374,6 @@ GLComputeEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, "#define OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES\n" : "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_PATCHES\n"; - if (program) { - glDeleteProgram(program); - } program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, kernelDef, workGroupSize); if (program == 0) return false; From 7b2a0b239d2dcf357cb14d5dc11f81bcc30c4bff Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 27 Jan 2017 14:22:54 -0800 Subject: [PATCH 11/20] minor improvements to examples/glFVarViewer: - added detection of shapes without UVs and report fatal error - fixed command line parsing of shape file arguments and other options - added missing UVs from shapes/catmark_fan --- examples/glFVarViewer/glFVarViewer.cpp | 39 +++++++++++++----- examples/glFVarViewer/init_shapes.h | 4 ++ regression/shapes/catmark_fan.h | 56 ++++++++++++++++++++------ 3 files changed, 77 insertions(+), 22 deletions(-) diff --git a/examples/glFVarViewer/glFVarViewer.cpp b/examples/glFVarViewer/glFVarViewer.cpp index 4f8ddb04..615aba51 100644 --- a/examples/glFVarViewer/glFVarViewer.cpp +++ b/examples/glFVarViewer/glFVarViewer.cpp @@ -407,6 +407,11 @@ rebuildMesh() { Shape * shape = Shape::parseObj(shapeDesc.data.c_str(), shapeDesc.scheme); + if (!shape->HasUV()) { + printf("Error: shape %s does not contain face-varying UVs\n", shapeDesc.name.c_str()); + exit(1); + } + // create Far mesh (topology) OpenSubdiv::Sdc::SchemeType sdctype = GetSdcType(*shape); OpenSubdiv::Sdc::Options sdcoptions = GetSdcOptions(*shape); @@ -1109,7 +1114,7 @@ initHUD() { for (int i = 1; i < 11; ++i) { char level[16]; sprintf(level, "Lv. %d", i); - g_hud.AddRadioButton(3, level, i == 2, 10, 270 + i*20, callbackLevel, i, '0'+(i%10)); + g_hud.AddRadioButton(3, level, i == g_level, 10, 270 + i*20, callbackLevel, i, '0'+(i%10)); } typedef OpenSubdiv::Sdc::Options SdcOptions; @@ -1175,26 +1180,42 @@ callbackErrorGLFW(int error, const char* description) { fprintf(stderr, "GLFW Error (%d) : %s\n", error, description); } +//------------------------------------------------------------------------------ +static int +parseIntArg(const char* argString, int dfltValue = 0) { + char *argEndptr; + int argValue = strtol(argString, &argEndptr, 10); + if (*argEndptr != 0) { + printf("Warning: non-integer option parameter '%s' ignored\n", argString); + argValue = dfltValue; + } + return argValue; +} + //------------------------------------------------------------------------------ int main(int argc, char ** argv) { bool fullscreen = false; std::string str; for (int i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "-d")) - g_level = atoi(argv[++i]); - else if (!strcmp(argv[i], "-c")) - g_repeatCount = atoi(argv[++i]); - else if (!strcmp(argv[i], "-f")) + if (!strcmp(argv[i], "-d")) { + if (++i < argc) g_level = parseIntArg(argv[i], g_level); + } else if (!strcmp(argv[i], "-c")) { + if (++i < argc) g_repeatCount = parseIntArg(argv[i], g_repeatCount); + } else if (!strcmp(argv[i], "-f")) { fullscreen = true; - else { - std::ifstream ifs(argv[1]); + } else if (argv[i][0] == '-') { + printf("Warning: unrecognized option '%s' ignored\n", argv[i]); + } else { + std::ifstream ifs(argv[i]); if (ifs) { std::stringstream ss; ss << ifs.rdbuf(); ifs.close(); str = ss.str(); - g_defaultShapes.push_back(ShapeDesc(argv[1], str.c_str(), kCatmark)); + g_defaultShapes.push_back(ShapeDesc(argv[i], str.c_str(), kCatmark)); + } else { + printf("Warning: cannot open shape file '%s'\n", argv[i]); } } } diff --git a/examples/glFVarViewer/init_shapes.h b/examples/glFVarViewer/init_shapes.h index 2996c699..99679e92 100644 --- a/examples/glFVarViewer/init_shapes.h +++ b/examples/glFVarViewer/init_shapes.h @@ -40,6 +40,10 @@ static std::vector g_defaultShapes; //------------------------------------------------------------------------------ static void initShapes() { + // + // Note that any shapes added here must have UVs -- loading a shape without UVs is a fatal + // error and will result in termination when it is selected. + // 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 ) ); diff --git a/regression/shapes/catmark_fan.h b/regression/shapes/catmark_fan.h index 21bbdc30..f65d9378 100644 --- a/regression/shapes/catmark_fan.h +++ b/regression/shapes/catmark_fan.h @@ -48,18 +48,48 @@ static const std::string catmark_fan = "v 0.0 -.5 0.0\n" "v 0.5 -.5 -0.5\n" "v 1.0 -.5 -1.0\n" -"f 1 2 10 3\n" -"f 2 4 9 10\n" -"f 4 6 8 9\n" -"f 5 3 10 11\n" -"f 7 5 11 12\n" -"f 8 9 14 13\n" -"f 9 10 15 14\n" -"f 10 11 16 15\n" -"f 11 12 17 16\n" -"f 9 8 18 19\n" -"f 10 9 19 20\n" -"f 11 10 20 21\n" -"f 12 11 21 22\n" +"\n" +"vt 0.10 0.50\n" +"vt 0.10 0.40\n" +"vt 0.20 0.50\n" +"vt 0.10 0.30\n" +"vt 0.30 0.50\n" +"vt 0.10 0.20\n" +"vt 0.40 0.50\n" +"vt 0.20 0.20\n" +"vt 0.20 0.30\n" +"vt 0.20 0.40\n" +"vt 0.30 0.40\n" +"vt 0.40 0.40\n" +"vt 0.10 0.60\n" +"vt 0.20 0.60\n" +"vt 0.30 0.60\n" +"vt 0.40 0.60\n" +"vt 0.50 0.60\n" +"vt 0.10 0.70\n" +"vt 0.20 0.70\n" +"vt 0.30 0.70\n" +"vt 0.40 0.70\n" +"vt 0.50 0.70\n" +"vt 0.10 0.80\n" +"vt 0.20 0.80\n" +"vt 0.30 0.80\n" +"vt 0.40 0.80\n" +"vt 0.50 0.80\n" +"\n" +"f 1/1 2/2 10/10 3/3\n" +"f 2/2 4/4 9/9 10/10\n" +"f 4/4 6/6 8/8 9/9\n" +"f 5/5 3/3 10/10 11/11\n" +"f 7/7 5/5 11/11 12/12\n" +"f 8/18 9/19 14/24 13/23\n" +"f 9/19 10/20 15/25 14/24\n" +"f 10/20 11/21 16/26 15/25\n" +"f 11/21 12/22 17/27 16/26\n" +"f 9/19 8/18 18/13 19/14\n" +"f 10/20 9/19 19/14 20/15\n" +"f 11/21 10/20 20/15 21/16\n" +"f 12/22 11/21 21/16 22/17\n" +"\n" "t interpolateboundary 1/0/0 1\n" "\n"; From e3dd0f1798dac6e7a6c3974728a8cc04d50e7253 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 27 Jan 2017 16:22:04 -0800 Subject: [PATCH 12/20] Publicly exposed choice for smooth boundary patches at smooth corners: - added Far::PatchTableFactory::Options::generateLegacySharpCornerPatches - legacy behavior of sharp patches at smooth corners preserved by default - added corresponding option bit to Osd::MeshBits - updated examples/glViewer with option --- examples/glViewer/glViewer.cpp | 16 +++++++++++++--- opensubdiv/far/patchTableFactory.cpp | 10 ++-------- opensubdiv/far/patchTableFactory.h | 9 +++++++-- opensubdiv/osd/mesh.h | 14 ++++++++------ 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/examples/glViewer/glViewer.cpp b/examples/glViewer/glViewer.cpp index 5f98ea4c..14f6e218 100644 --- a/examples/glViewer/glViewer.cpp +++ b/examples/glViewer/glViewer.cpp @@ -162,6 +162,7 @@ enum HudCheckBox { kHUD_CB_DISPLAY_CONTROL_MESH_EDGES, kHUD_CB_FREEZE, kHUD_CB_DISPLAY_PATCH_COUNTS, kHUD_CB_ADAPTIVE, + kHUD_CB_SMOOTH_CORNER_PATCH, kHUD_CB_SINGLE_CREASE_PATCH, kHUD_CB_INF_SHARP_PATCH }; @@ -182,6 +183,7 @@ int g_fullscreen = 0, g_displayStyle = kDisplayStyleWireOnShaded, g_adaptive = 1, g_endCap = kEndCapBSplineBasis, + g_smoothCornerPatch = 0, g_singleCreasePatch = 1, g_infSharpPatch = 0, g_mbutton[3] = {0, 0, 0}, @@ -447,11 +449,13 @@ rebuildMesh() { // Adaptive refinement currently supported only for catmull-clark scheme bool doAdaptive = (g_adaptive!=0 && scheme==kCatmark); bool interleaveVarying = g_shadingMode == kShadingInterleavedVaryingColor; + bool doSmoothCornerPatch = (g_smoothCornerPatch!=0 && scheme==kCatmark); bool doSingleCreasePatch = (g_singleCreasePatch!=0 && scheme==kCatmark); bool doInfSharpPatch = (g_infSharpPatch!=0 && scheme==kCatmark); Osd::MeshBitset bits; bits.set(Osd::MeshAdaptive, doAdaptive); + bits.set(Osd::MeshUseSmoothCornerPatch, doSmoothCornerPatch); bits.set(Osd::MeshUseSingleCreasePatch, doSingleCreasePatch); bits.set(Osd::MeshUseInfSharpPatch, doInfSharpPatch); bits.set(Osd::MeshInterleaveVarying, interleaveVarying); @@ -1402,6 +1406,10 @@ callbackCheckBox(bool checked, int button) { g_adaptive = checked; rebuildMesh(); return; + case kHUD_CB_SMOOTH_CORNER_PATCH: + g_smoothCornerPatch = checked; + rebuildMesh(); + return; case kHUD_CB_SINGLE_CREASE_PATCH: g_singleCreasePatch = checked; rebuildMesh(); @@ -1541,13 +1549,15 @@ initHUD() { if (GLUtils::SupportsAdaptiveTessellation()) { g_hud.AddCheckBox("Adaptive (`)", g_adaptive!=0, 10, 190, callbackCheckBox, kHUD_CB_ADAPTIVE, '`'); + g_hud.AddCheckBox("Smooth Corner Patch (O)", g_smoothCornerPatch!=0, + 10, 210, callbackCheckBox, kHUD_CB_SMOOTH_CORNER_PATCH, 'o'); g_hud.AddCheckBox("Single Crease Patch (S)", g_singleCreasePatch!=0, - 10, 210, callbackCheckBox, kHUD_CB_SINGLE_CREASE_PATCH, 's'); + 10, 230, callbackCheckBox, kHUD_CB_SINGLE_CREASE_PATCH, 's'); g_hud.AddCheckBox("Inf Sharp Patch (I)", g_infSharpPatch!=0, - 10, 230, callbackCheckBox, kHUD_CB_INF_SHARP_PATCH, 'i'); + 10, 250, callbackCheckBox, kHUD_CB_INF_SHARP_PATCH, 'i'); int endcap_pulldown = g_hud.AddPullDown( - "End cap (E)", 10, 250, 200, callbackEndCap, 'e'); + "End cap (E)", 10, 270, 200, callbackEndCap, 'e'); g_hud.AddPullDownButton(endcap_pulldown,"None", kEndCapNone, g_endCap == kEndCapNone); diff --git a/opensubdiv/far/patchTableFactory.cpp b/opensubdiv/far/patchTableFactory.cpp index 1bb4c59d..c3931d48 100644 --- a/opensubdiv/far/patchTableFactory.cpp +++ b/opensubdiv/far/patchTableFactory.cpp @@ -312,9 +312,6 @@ public: Options const options; - // Additional options eventually to be made public in Options above: - bool options_approxSmoothCornerWithSharp; - PtexIndices const ptexIndices; // Counters accumulating each type of patch during topology traversal @@ -340,9 +337,6 @@ PatchTableFactory::BuilderContext::BuilderContext( numRegularPatches(0), numIrregularPatches(0), numIrregularBoundaryPatches(0) { - // Eventually to be passed in as Options and assigned to member... - options_approxSmoothCornerWithSharp = true; - if (options.generateFVarTables) { // If client-code does not select specific channels, default to all // the channels in the refiner. @@ -623,7 +617,7 @@ PatchTableFactory::BuilderContext::IsPatchRegular( } // Legacy option -- reinterpret an irregular smooth corner as sharp if specified: - if (!isRegular && options_approxSmoothCornerWithSharp) { + if (!isRegular && options.generateLegacySharpCornerPatches) { if (fCompVTag._xordinary && fCompVTag._boundary && !fCompVTag._nonManifold) { isRegular = IsPatchSmoothCorner(levelIndex, faceIndex, fvcRefiner); } @@ -756,7 +750,7 @@ PatchTableFactory::BuilderContext::GetIrregularPatchCornerSpans( } // Legacy option -- reinterpret an irregular smooth corner as sharp if specified: - if (!cornerSpans[i]._sharp && options_approxSmoothCornerWithSharp) { + if (!cornerSpans[i]._sharp && options.generateLegacySharpCornerPatches) { if (vTags[i]._xordinary && vTags[i]._boundary && !vTags[i]._nonManifold) { int nFaces = cornerSpans[i].isAssigned() ? cornerSpans[i]._numFaces : level.getVertexFaces(fVerts[i]).size(); diff --git a/opensubdiv/far/patchTableFactory.h b/opensubdiv/far/patchTableFactory.h index 975b9d45..515c8095 100644 --- a/opensubdiv/far/patchTableFactory.h +++ b/opensubdiv/far/patchTableFactory.h @@ -65,6 +65,7 @@ public: shareEndCapPatchPoints(true), generateFVarTables(false), generateFVarLegacyLinearPatches(true), + generateLegacySharpCornerPatches(true), numFVarChannels(-1), fvarChannelIndices(0) { } @@ -87,8 +88,12 @@ public: ///< currently only work with GregoryBasis. // face-varying - generateFVarTables : 1, ///< Generate face-varying patch tables - generateFVarLegacyLinearPatches : 1; ///< Generate all linear face-varying patches (legacy) + generateFVarTables : 1, ///< Generate face-varying patch tables + + // legacy behaviors (default to true) + generateFVarLegacyLinearPatches : 1, ///< Generate all linear face-varying patches (legacy) + generateLegacySharpCornerPatches : 1; ///< Generate sharp regular patches at smooth corners (legacy) + int numFVarChannels; ///< Number of channel indices and interpolation modes passed int const * fvarChannelIndices; ///< List containing the indices of the channels selected for the factory }; diff --git a/opensubdiv/osd/mesh.h b/opensubdiv/osd/mesh.h index 575d7964..9c68a674 100644 --- a/opensubdiv/osd/mesh.h +++ b/opensubdiv/osd/mesh.h @@ -51,12 +51,13 @@ enum MeshBits { MeshInterleaveVarying = 1, MeshFVarData = 2, MeshFVarAdaptive = 3, - MeshUseSingleCreasePatch = 4, - MeshUseInfSharpPatch = 5, - MeshEndCapBSplineBasis = 6, // exclusive - MeshEndCapGregoryBasis = 7, // exclusive - MeshEndCapLegacyGregory = 8, // exclusive - NUM_MESH_BITS = 9, + MeshUseSmoothCornerPatch = 4, + MeshUseSingleCreasePatch = 5, + MeshUseInfSharpPatch = 6, + MeshEndCapBSplineBasis = 7, // exclusive + MeshEndCapGregoryBasis = 8, // exclusive + MeshEndCapLegacyGregory = 9, // exclusive + NUM_MESH_BITS = 10, }; typedef std::bitset MeshBitset; @@ -529,6 +530,7 @@ private: Far::PatchTableFactory::Options poptions(level); poptions.generateFVarTables = bits.test(MeshFVarData); poptions.generateFVarLegacyLinearPatches = !bits.test(MeshFVarAdaptive); + poptions.generateLegacySharpCornerPatches = !bits.test(MeshUseSmoothCornerPatch); poptions.useSingleCreasePatch = bits.test(MeshUseSingleCreasePatch); poptions.useInfSharpPatch = bits.test(MeshUseInfSharpPatch); From 432b6b235f31229d7118e4139a85d641e7e58b35 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Thu, 26 Jan 2017 14:35:16 -0800 Subject: [PATCH 13/20] Updated doxygen comments for Osd Evaluator classes --- opensubdiv/osd/clEvaluator.h | 243 +++++++++++++++++++++------- opensubdiv/osd/cpuEvaluator.h | 38 ++--- opensubdiv/osd/cudaEvaluator.h | 40 ++--- opensubdiv/osd/glComputeEvaluator.h | 188 ++++++++++++++------- opensubdiv/osd/glXFBEvaluator.h | 170 +++++++++---------- opensubdiv/osd/ompEvaluator.h | 38 ++--- opensubdiv/osd/tbbEvaluator.h | 119 +++++++------- 7 files changed, 523 insertions(+), 313 deletions(-) diff --git a/opensubdiv/osd/clEvaluator.h b/opensubdiv/osd/clEvaluator.h index 27c0eb2b..a336eea6 100644 --- a/opensubdiv/osd/clEvaluator.h +++ b/opensubdiv/osd/clEvaluator.h @@ -22,8 +22,8 @@ // language governing permissions and limitations under the Apache License. // -#ifndef OPENSUBDIV_OPENSUBDIV3_OSD_CL_EVALUATOR_H -#define OPENSUBDIV_OPENSUBDIV3_OSD_CL_EVALUATOR_H +#ifndef OPENSUBDIV3_OSD_CL_EVALUATOR_H +#define OPENSUBDIV3_OSD_CL_EVALUATOR_H #include "../version.h" @@ -35,7 +35,9 @@ namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { namespace Far { + class PatchTable; class StencilTable; + class LimitStencilTable; } namespace Osd { @@ -69,13 +71,13 @@ public: ~CLStencilTable(); // interfaces needed for CLComputeKernel - cl_mem GetSizesBuffer() const { return _sizes; } - cl_mem GetOffsetsBuffer() const { return _offsets; } - cl_mem GetIndicesBuffer() const { return _indices; } - cl_mem GetWeightsBuffer() const { return _weights; } - cl_mem GetDuWeightsBuffer() const { return _duWeights; } - cl_mem GetDvWeightsBuffer() const { return _dvWeights; } - int GetNumStencils() const { return _numStencils; } + cl_mem GetSizesBuffer() const { return _sizes; } + cl_mem GetOffsetsBuffer() const { return _offsets; } + cl_mem GetIndicesBuffer() const { return _indices; } + cl_mem GetWeightsBuffer() const { return _weights; } + cl_mem GetDuWeightsBuffer() const { return _duWeights; } + cl_mem GetDvWeightsBuffer() const { return _dvWeights; } + int GetNumStencils() const { return _numStencils; } private: cl_mem _sizes; @@ -92,11 +94,6 @@ private: class CLEvaluator { public: typedef bool Instantiatable; - /// Constructor. - CLEvaluator(cl_context context, cl_command_queue queue); - - /// Destructor. - ~CLEvaluator(); /// Generic creator template. template @@ -116,19 +113,26 @@ public: BufferDescriptor const &dvDesc, cl_context clContext, cl_command_queue clCommandQueue) { - CLEvaluator *kernel = new CLEvaluator(clContext, clCommandQueue); - if (kernel->Compile(srcDesc, dstDesc, duDesc, dvDesc)) return kernel; - delete kernel; + CLEvaluator *instance = new CLEvaluator(clContext, clCommandQueue); + if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc)) + return instance; + delete instance; return NULL; } + /// Constructor. + CLEvaluator(cl_context context, cl_command_queue queue); + + /// Destructor. + ~CLEvaluator(); + /// ---------------------------------------------------------------------- /// /// Stencil evaluations with StencilTable /// /// ---------------------------------------------------------------------- - /// \brief Generic static compute function. This function has a same + /// \brief Generic static stencil function. This function has a same /// signature as other device kernels have so that it can be called /// transparently from OsdMesh template interface. /// @@ -165,7 +169,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -206,7 +210,7 @@ public: } } - /// \brief Generic static compute function. This function has a same + /// \brief Generic static stencil function. This function has a same /// signature as other device kernels have so that it can be called /// transparently from OsdMesh template interface. /// @@ -222,17 +226,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivative buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCLBuffer() method returning the /// cl_mem object for du results to be written /// - /// @param duDesc vertex buffer descriptor for the du output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCLBuffer() method returning the /// cl_mem object for dv results to be written /// - /// @param dvDesc vertex buffer descriptor for the dv output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param stencilTable stencil table to be applied. The table must have /// SSBO interfaces. @@ -255,7 +259,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -266,8 +270,8 @@ public: 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, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable, CLEvaluator const *instance, DEVICE_CONTEXT deviceContext, @@ -300,9 +304,36 @@ public: } } - /// Generic compute function. - /// Dispatch the CL compute kernel asynchronously. - /// Returns false if the kernel hasn't been compiled yet. + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCLBuffer() method returning the + /// cl_mem object for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning the + /// cl_mem object for results to be written + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// template bool EvalStencils( SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, @@ -322,9 +353,48 @@ public: numStartEvents, startEvents, endEvent); } - /// Generic compute function. - /// Dispatch the CL compute kernel asynchronously. - /// Returns false if the kernel hasn't been compiled yet. + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCLBuffer() method returning the + /// cl_mem object for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning the + /// cl_mem object for results to be written + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning the + /// cl_mem object for dv results to be written + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// template bool EvalStencils( SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, @@ -364,8 +434,54 @@ public: const cl_event* startEvents=NULL, cl_event* endEvent=NULL) const; - /// Dispatch the CL compute kernel asynchronously. + /// \brief Dispatch the CL compute kernel asynchronously. /// returns false if the kernel hasn't been compiled yet. + /// + /// @param src CL buffer of input primvar source data + /// + /// @param srcDesc vertex buffer descriptor for the srcBuffer + /// + /// @param dst CL buffer of output primvar destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param du CL buffer of output derivative wrt u + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv CL buffer of output derivative wrt v + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param sizes CL buffer of the sizes in the stencil table + /// + /// @param offsets CL buffer of the offsets in the stencil table + /// + /// @param indices CL buffer of the indices in the stencil table + /// + /// @param weights CL buffer of the weights in the stencil table + /// + /// @param duWeights CL buffer of the du weights in the stencil table + /// + /// @param dvWeights CL buffer of the dv weights in the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// bool EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, cl_mem dst, BufferDescriptor const &dstDesc, cl_mem du, BufferDescriptor const &duDesc, @@ -387,7 +503,7 @@ public: /// 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. @@ -430,7 +546,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -493,13 +609,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data /// - /// @param duDesc + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data /// - /// @param dvDesc + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// @@ -527,7 +647,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -608,7 +728,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -654,15 +774,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivatives buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCLBuffer() method returning a CL - /// buffer object of destination data of Du + /// buffer object of destination data /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivatives buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCLBuffer() method returning a CL - /// buffer object of destination data of Dv + /// buffer object of destination data /// /// @param dvDesc vertex buffer descriptor for the dvBuffer /// @@ -672,18 +792,18 @@ public: /// /// @param patchTable CLPatchTable or equivalent /// - /// @param numStartEvents the number of events in the array pointed to by - /// startEvents. + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. /// - /// @param startEvents points to an array of cl_event which will determine - /// when it is safe for the OpenCL device to begin work - /// or NULL if it can begin immediately. + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of - /// the cl_event which indicates when all work for this - /// call has completed. This cl_event has an incremented - /// reference count and should be released via - /// clReleaseEvent(). NULL if not required. + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. /// template @@ -766,7 +886,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -846,7 +966,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -920,7 +1040,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -1003,7 +1123,7 @@ public: /// when it is safe for the OpenCL device to begin work /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will recieve a copy of + /// @param endEvent pointer to a cl_event which will receive a copy of /// the cl_event which indicates when all work for this /// call has completed. This cl_event has an incremented /// reference count and should be released via @@ -1064,7 +1184,6 @@ private: cl_kernel _patchKernel; }; - } // end namespace Osd } // end namespace OPENSUBDIV_VERSION @@ -1073,4 +1192,4 @@ using namespace OPENSUBDIV_VERSION; } // end namespace OpenSubdiv -#endif // OPENSUBDIV_OPENSUBDIV3_OSD_CL_EVALUATOR_H +#endif // OPENSUBDIV3_OSD_CL_EVALUATOR_H diff --git a/opensubdiv/osd/cpuEvaluator.h b/opensubdiv/osd/cpuEvaluator.h index 0f30ae85..30d558da 100644 --- a/opensubdiv/osd/cpuEvaluator.h +++ b/opensubdiv/osd/cpuEvaluator.h @@ -26,11 +26,11 @@ #define OPENSUBDIV3_OSD_CPU_EVALUATOR_H #include "../version.h" - -#include #include "../osd/bufferDescriptor.h" #include "../osd/types.h" +#include + namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { @@ -107,7 +107,6 @@ public: /// @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 /// @@ -120,8 +119,8 @@ public: /// @param end end index of stencil table /// static bool EvalStencils( - const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, const int * sizes, const int * offsets, const int * indices, @@ -145,17 +144,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivative buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCpuBuffer() method returning a /// float pointer for write /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCpuBuffer() method returning a /// float pointer for write /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param stencilTable Far::StencilTable or equivalent /// @@ -206,15 +205,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output U-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output V-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param sizes pointer to the sizes buffer of the stencil table /// @@ -318,13 +317,13 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivatives buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCpuBuffer() method returning a /// float pointer for write /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivatives buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCpuBuffer() method returning a /// float pointer for write /// @@ -354,6 +353,7 @@ public: PATCH_TABLE *patchTable, CpuEvaluator const *instance = NULL, void * deviceContext = NULL) { + (void)instance; // unused (void)deviceContext; // unused @@ -423,15 +423,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output U-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the du buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output V-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the dv buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// diff --git a/opensubdiv/osd/cudaEvaluator.h b/opensubdiv/osd/cudaEvaluator.h index 9929432b..c2463fc7 100644 --- a/opensubdiv/osd/cudaEvaluator.h +++ b/opensubdiv/osd/cudaEvaluator.h @@ -188,17 +188,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivative buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCudaBuffer() method returning a /// float pointer for write /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCudaBuffer() method returning a /// float pointer for write /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param stencilTable stencil table to be applied. /// @@ -218,8 +218,8 @@ public: const CudaEvaluator *instance = NULL, void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused + (void)instance; // unused + (void)deviceContext; // unused return EvalStencils(srcBuffer->BindCudaBuffer(), srcDesc, dstBuffer->BindCudaBuffer(), dstDesc, @@ -249,15 +249,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output U-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output V-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param sizes pointer to the sizes buffer of the stencil table /// @@ -333,8 +333,8 @@ public: CudaEvaluator const *instance, void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused + (void)instance; // unused + (void)deviceContext; // unused return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, dstBuffer->BindCudaBuffer(), dstDesc, @@ -361,13 +361,13 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivatives buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCudaBuffer() method returning a /// float pointer for write /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivatives buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCudaBuffer() method returning a /// float pointer for write /// @@ -460,15 +460,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output U-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the du buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output V-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the dv buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// @@ -587,8 +587,8 @@ public: CudaEvaluator const *instance, void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused + (void)instance; // unused + (void)deviceContext; // unused return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, dstBuffer->BindCudaBuffer(), dstDesc, diff --git a/opensubdiv/osd/glComputeEvaluator.h b/opensubdiv/osd/glComputeEvaluator.h index f2f777dc..74895496 100644 --- a/opensubdiv/osd/glComputeEvaluator.h +++ b/opensubdiv/osd/glComputeEvaluator.h @@ -97,7 +97,8 @@ public: void * deviceContext = NULL) { (void)deviceContext; // not used GLComputeEvaluator *instance = new GLComputeEvaluator(); - if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc)) return instance; + if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc)) + return instance; delete instance; return NULL; } @@ -114,19 +115,19 @@ public: /// /// ---------------------------------------------------------------------- - /// \brief Generic static compute function. This function has a same + /// \brief Generic static stencil function. This function has a same /// signature as other device kernels have so that it can be called /// transparently from OsdMesh template interface. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// GL buffer object of source data + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// GL buffer object of destination data + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -154,7 +155,7 @@ public: dstBuffer, dstDesc, stencilTable); } else { - // Create a kernel on demand (slow) + // Create an instance on demand (slow) (void)deviceContext; // unused instance = Create(srcDesc, dstDesc, BufferDescriptor(), @@ -170,31 +171,31 @@ public: } } - /// \brief Generic static compute function. This function has a same + /// \brief Generic static stencil function. This function has a same /// signature as other device kernels have so that it can be called /// transparently from OsdMesh template interface. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// GL buffer object of source data + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// GL buffer object of destination data + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the dstBuffer /// - /// @param duBuffer Output U-derivative buffer - /// must have BindVBO() method returning a - /// GL buffer object of destination data + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer - /// must have BindVBO() method returning a - /// GL buffer object of destination data + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dvDesc vertex buffer descriptor for the dvBuffer /// @@ -226,7 +227,7 @@ public: dvBuffer, dvDesc, stencilTable); } else { - // Create a kernel on demand (slow) + // Create an instance on demand (slow) (void)deviceContext; // unused instance = Create(srcDesc, dstDesc, duDesc, dvDesc); if (instance) { @@ -242,8 +243,23 @@ public: } } - /// Dispatch the GLSL compute kernel on GPU asynchronously. - /// returns false if the kernel hasn't been compiled yet. + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// template bool EvalStencils( SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, @@ -263,8 +279,35 @@ public: /* end = */ stencilTable->GetNumStencils()); } - /// Dispatch the GLSL compute kernel on GPU asynchronously. - /// returns false if the kernel hasn't been compiled yet. + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// template bool EvalStencils( SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, @@ -286,8 +329,41 @@ public: /* end = */ stencilTable->GetNumStencils()); } - /// Dispatch the GLSL compute kernel on GPU asynchronously. + /// \brief Dispatch the GLSL compute kernel on GPU asynchronously /// returns false if the kernel hasn't been compiled yet. + /// + /// @param srcBuffer GL buffer of input primvar source data + /// + /// @param srcDesc vertex buffer descriptor for the srcBuffer + /// + /// @param dstBuffer GL buffer of output primvar destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer GL buffer of output derivative wrt u + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer GL buffer of output derivative wrt v + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param sizesBuffer GL buffer of the sizes in the stencil table + /// + /// @param offsetsBuffer GL buffer of the offsets in the stencil table + /// + /// @param indicesBuffer GL buffer of the indices in the stencil table + /// + /// @param weightsBuffer GL buffer of the weights in the stencil table + /// + /// @param duWeightsBuffer GL buffer of the du weights in the stencil table + /// + /// @param dvWeightsBuffer GL buffer of the dv weights in the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// bool EvalStencils(GLuint srcBuffer, BufferDescriptor const &srcDesc, GLuint dstBuffer, BufferDescriptor const &dstDesc, GLuint duBuffer, BufferDescriptor const &duDesc, @@ -389,13 +465,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param duDesc + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param dvDesc + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// @@ -436,7 +516,8 @@ public: } else { // Create an instance on demand (slow) (void)deviceContext; // unused - instance = Create(srcDesc, dstDesc, duDesc, dvDesc); + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc); if (instance) { bool r = instance->EvalPatches(srcBuffer, srcDesc, dstBuffer, dstDesc, @@ -456,14 +537,14 @@ public: /// in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBOBuffer() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -500,26 +581,26 @@ public: /// called in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivatives buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivatives buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dvDesc vertex buffer descriptor for the dvBuffer /// @@ -553,8 +634,8 @@ public: bool EvalPatches(GLuint srcBuffer, BufferDescriptor const &srcDesc, GLuint dstBuffer, BufferDescriptor const &dstDesc, - GLuint duBuffer, BufferDescriptor const &duDesc, - GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, GLuint patchCoordsBuffer, const PatchArrayVector &patchArrays, @@ -634,14 +715,14 @@ public: /// in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBOBuffer() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -749,14 +830,14 @@ public: /// in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBOBuffer() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -839,7 +920,6 @@ private: GLuint uniformPatchArray; GLuint uniformDuDesc; GLuint uniformDvDesc; - } _patchKernel; int _workGroupSize; diff --git a/opensubdiv/osd/glXFBEvaluator.h b/opensubdiv/osd/glXFBEvaluator.h index c171d52e..1fd438d4 100644 --- a/opensubdiv/osd/glXFBEvaluator.h +++ b/opensubdiv/osd/glXFBEvaluator.h @@ -122,14 +122,14 @@ public: /// transparently from OsdMesh template interface. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -178,28 +178,28 @@ public: /// transparently from OsdMesh template interface. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param dstDesc vertex buffer descriptor for the output buffer + /// @param dstDesc vertex buffer descriptor for the dstBuffer /// - /// @param duBuffer Output U-derivative buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param duDesc vertex buffer descriptor for the du output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param dvDesc vertex buffer descriptor for the dv output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param stencilTable stencil table to be applied. The table must have /// Texture Buffer Object interfaces. @@ -216,8 +216,8 @@ public: 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, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable, GLXFBEvaluator const *instance, void * deviceContext = NULL) { @@ -235,8 +235,8 @@ public: if (instance) { bool r = instance->EvalStencils(srcBuffer, srcDesc, dstBuffer, dstDesc, - duBuffer, duDesc, - dvBuffer, dvDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, stencilTable); delete instance; return r; @@ -245,7 +245,7 @@ public: } } - /// \brief Generic eval stencils function. + /// \brief Generic stencil function. /// /// @param srcBuffer Input primvar buffer. /// must have BindVBO() method returning a GL @@ -255,11 +255,12 @@ public: /// /// @param dstBuffer Output primvar buffer /// must have BindVBO() method returning a GL - /// buffer object for destination data + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param stencilTable stencil table to be applied. + /// @param stencilTable stencil table to be applied. The table must have + /// Texture Buffer Object interfaces. /// template bool EvalStencils( @@ -281,7 +282,7 @@ public: /* end = */ stencilTable->GetNumStencils()); } - /// \brief Generic eval stencils function with derivative evaluation. + /// \brief Generic stencil function. /// /// @param srcBuffer Input primvar buffer. /// must have BindVBO() method returning a GL @@ -291,19 +292,24 @@ public: /// /// @param dstBuffer Output primvar buffer /// must have BindVBO() method returning a GL - /// buffer object for destination data + /// buffer object of destination data /// - /// @param dstDesc vertex buffer descriptor for the output buffer + /// @param dstDesc vertex buffer descriptor for the dstBuffer /// - /// @param duBuffer GL buffer of output U-derivatives. + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer GL buffer of output V-derivatives. + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dvDesc vertex buffer descriptor for the dvBuffer /// - /// @param stencilTable stencil table to be applied. + /// @param stencilTable stencil table to be applied. The table must have + /// Texture Buffer Object interfaces. /// template bool EvalStencils( @@ -327,40 +333,40 @@ public: /* end = */ stencilTable->GetNumStencils()); } - /// \brief dispatch eval stencils function with derivatives. - /// dispatch the GLSL XFB kernel on GPU asynchronously. + /// \brief Dispatch the GLSL XFB kernel on on GPU asynchronously + /// returns false if the kernel hasn't been compiled yet. /// - /// @param srcBuffer GL buffer of input primvars. + /// @param srcBuffer GL buffer of input primvar source data /// - /// @param srcDesc vertex buffer descriptor for the srcBuffer + /// @param srcDesc vertex buffer descriptor for the srcBuffer /// - /// @param dstBuffer GL buffer of output primvars. + /// @param dstBuffer GL buffer of output primvar destination data /// - /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// @param dstDesc vertex buffer descriptor for the dstBuffer /// - /// @param duBuffer GL buffer of output U-derivatives. + /// @param duBuffer GL buffer of output derivative wrt u /// - /// @param duDesc vertex buffer descriptor for the duBuffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer GL buffer of output V-derivatives. + /// @param dvBuffer GL buffer of output derivative wrt v /// - /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// - /// @param sizesBuffer GL buffer of the sizes in the stencil table + /// @param sizesBuffer GL buffer of the sizes in the stencil table /// - /// @param offsetsBuffer GL buffer of the offsets in the stencil table + /// @param offsetsBuffer GL buffer of the offsets in the stencil table /// - /// @param indicesBuffer GL buffer of the indices in the stencil table + /// @param indicesBuffer GL buffer of the indices in the stencil table /// - /// @param weightsBuffer GL buffer of the weights in the stencil table + /// @param weightsBuffer GL buffer of the weights in the stencil table /// - /// @param duWeightsBuffer GL buffer of the du weights in the stencil table + /// @param duWeightsBuffer GL buffer of the du weights in the stencil table /// - /// @param dvWeightsBuffer GL buffer of the dv weights in the stencil table + /// @param dvWeightsBuffer GL buffer of the dv weights in the stencil table /// - /// @param start start index of stencil table + /// @param start start index of stencil table /// - /// @param end end index of stencil table + /// @param end end index of stencil table /// bool EvalStencils(GLuint srcBuffer, BufferDescriptor const &srcDesc, GLuint dstBuffer, BufferDescriptor const &dstDesc, @@ -463,13 +469,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param duDesc + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// - /// @param dvDesc + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// @@ -530,14 +540,14 @@ public: /// in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -545,7 +555,7 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// must have BindVBO() method returning an - /// array of PatchCoord struct in cuda memory. + /// array of PatchCoord struct in VBO. /// /// @param patchTable GLPatchTable or equivalent /// @@ -574,26 +584,26 @@ public: /// called in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output s-derivatives buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output t-derivatives buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dvDesc vertex buffer descriptor for the dvBuffer /// @@ -627,15 +637,14 @@ public: bool EvalPatches(GLuint srcBuffer, BufferDescriptor const &srcDesc, GLuint dstBuffer, BufferDescriptor const &dstDesc, - GLuint duBuffer, BufferDescriptor const &duDesc, - GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, GLuint patchCoordsBuffer, const PatchArrayVector &patchArrays, GLuint patchIndexBuffer, GLuint patchParamsBuffer) const; - /// /// \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. @@ -709,14 +718,14 @@ public: /// in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -724,7 +733,7 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// must have BindVBO() method returning an - /// array of PatchCoord struct in cuda memory. + /// array of PatchCoord struct in VBO. /// /// @param patchTable GLPatchTable or equivalent /// @@ -748,7 +757,6 @@ public: patchTable->GetPatchParamTextureBuffer()); } - /// /// \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. @@ -825,14 +833,14 @@ public: /// in the same way. /// /// @param srcBuffer Input primvar buffer. - /// must have BindVBO() method returning a - /// const float pointer for read + /// must have BindVBO() method returning a GL + /// buffer object of source data /// /// @param srcDesc vertex buffer descriptor for the input buffer /// /// @param dstBuffer Output primvar buffer - /// must have BindVBO() method returning a - /// float pointer for write + /// must have BindVBO() method returning a GL + /// buffer object of destination data /// /// @param dstDesc vertex buffer descriptor for the output buffer /// @@ -840,7 +848,7 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// must have BindVBO() method returning an - /// array of PatchCoord struct in cuda memory. + /// array of PatchCoord struct in VBO. /// /// @param patchTable GLPatchTable or equivalent /// diff --git a/opensubdiv/osd/ompEvaluator.h b/opensubdiv/osd/ompEvaluator.h index d582d139..6485eff4 100644 --- a/opensubdiv/osd/ompEvaluator.h +++ b/opensubdiv/osd/ompEvaluator.h @@ -26,11 +26,11 @@ #define OPENSUBDIV3_OSD_OMP_EVALUATOR_H #include "../version.h" - -#include #include "../osd/bufferDescriptor.h" #include "../osd/types.h" +#include + namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { @@ -107,7 +107,6 @@ public: /// @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 /// @@ -120,8 +119,8 @@ public: /// @param end end index of stencil table /// static bool EvalStencils( - const float *src, BufferDescriptor const &srcDesc, - float *dst, BufferDescriptor const &dstDesc, + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, const int * sizes, const int * offsets, const int * indices, @@ -145,17 +144,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivative buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCpuBuffer() method returning a /// float pointer for write /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCpuBuffer() method returning a /// float pointer for write /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param stencilTable Far::StencilTable or equivalent /// @@ -206,15 +205,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output U-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output V-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param sizes pointer to the sizes buffer of the stencil table /// @@ -318,13 +317,13 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivatives buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCpuBuffer() method returning a /// float pointer for write /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivatives buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCpuBuffer() method returning a /// float pointer for write /// @@ -354,6 +353,7 @@ public: PATCH_TABLE *patchTable, OmpEvaluator const *instance = NULL, void * deviceContext = NULL) { + (void)instance; // unused (void)deviceContext; // unused @@ -423,15 +423,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output U-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the du buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output V-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the dv buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// diff --git a/opensubdiv/osd/tbbEvaluator.h b/opensubdiv/osd/tbbEvaluator.h index 73b53318..ca4c955d 100644 --- a/opensubdiv/osd/tbbEvaluator.h +++ b/opensubdiv/osd/tbbEvaluator.h @@ -26,9 +26,8 @@ #define OPENSUBDIV3_OSD_TBB_EVALUATOR_H #include "../version.h" -#include "../osd/types.h" #include "../osd/bufferDescriptor.h" -#include "../far/patchTable.h" +#include "../osd/types.h" #include @@ -61,7 +60,7 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param stencilTable stencil table to be applied. + /// @param stencilTable Far::StencilTable or equivalent /// /// @param instance not used in the tbb kernel /// (declared as a typed pointer to prevent @@ -77,7 +76,7 @@ public: TbbEvaluator const *instance = NULL, void *deviceContext = NULL) { - (void)instance; // unused + (void)instance; // unused (void)deviceContext; // unused if (stencilTable->GetNumStencils() == 0) @@ -108,7 +107,6 @@ public: /// @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 /// @@ -123,10 +121,10 @@ public: 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, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, int start, int end); /// \brief Generic static eval stencils function with derivatives. @@ -146,19 +144,19 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output U-derivative buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCpuBuffer() method returning a /// float pointer for write /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output V-derivative buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCpuBuffer() method returning a /// float pointer for write /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// - /// @param stencilTable stencil table to be applied. + /// @param stencilTable Far::StencilTable or equivalent /// /// @param instance not used in the tbb kernel /// (declared as a typed pointer to prevent @@ -176,8 +174,8 @@ public: const TbbEvaluator *instance = NULL, void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused + (void)instance; // unused + (void)deviceContext; // unused return EvalStencils(srcBuffer->BindCpuBuffer(), srcDesc, dstBuffer->BindCpuBuffer(), dstDesc, @@ -207,18 +205,17 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output s-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the output buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output t-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the output buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @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 /// @@ -226,9 +223,9 @@ public: /// /// @param weights pointer to the weights buffer of the stencil table /// - /// @param duWeights pointer to the u-weights buffer of the stencil table + /// @param duWeights pointer to the du-weights buffer of the stencil table /// - /// @param dvWeights pointer to the v-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 /// @@ -273,7 +270,9 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// - /// @param patchTable Far::PatchTable + /// @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 /// @@ -293,10 +292,8 @@ public: (void)instance; // unused (void)deviceContext; // unused - return EvalPatches(srcBuffer->BindCpuBuffer(), - srcDesc, - dstBuffer->BindCpuBuffer(), - dstDesc, + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, numPatchCoords, (const PatchCoord*)patchCoords->BindCpuBuffer(), patchTable->GetPatchArrayBuffer(), @@ -320,13 +317,13 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param duBuffer Output s-derivatives buffer + /// @param duBuffer Output buffer derivative wrt u /// must have BindCpuBuffer() method returning a /// float pointer for write /// /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dvBuffer Output t-derivatives buffer + /// @param dvBuffer Output buffer derivative wrt v /// must have BindCpuBuffer() method returning a /// float pointer for write /// @@ -336,7 +333,9 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// - /// @param patchTable Far::PatchTable + /// @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 /// @@ -358,16 +357,20 @@ public: (void)instance; // unused (void)deviceContext; // unused - 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()); + // 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 @@ -420,15 +423,15 @@ public: /// /// @param dstDesc vertex buffer descriptor for the output buffer /// - /// @param du Output s-derivatives pointer. An offset of + /// @param du Output pointer derivative wrt u. An offset of /// duDesc will be applied internally. /// - /// @param duDesc vertex buffer descriptor for the du buffer + /// @param duDesc vertex buffer descriptor for the duBuffer /// - /// @param dv Output t-derivatives pointer. An offset of + /// @param dv Output pointer derivative wrt v. An offset of /// dvDesc will be applied internally. /// - /// @param dvDesc vertex buffer descriptor for the dv buffer + /// @param dvDesc vertex buffer descriptor for the dvBuffer /// /// @param numPatchCoords number of patchCoords. /// @@ -449,10 +452,10 @@ public: float *du, BufferDescriptor const &duDesc, float *dv, BufferDescriptor const &dvDesc, int numPatchCoords, - const PatchCoord *patchCoords, - const PatchArray *patchArrays, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, const int *patchIndexBuffer, - const PatchParam *patchParamBuffer); + PatchParam const *patchParamBuffer); /// \brief Generic limit eval function. This function has a same /// signature as other device kernels have so that it can be called @@ -474,7 +477,9 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// - /// @param patchTable Far::PatchTable + /// @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 /// @@ -494,10 +499,8 @@ public: (void)instance; // unused (void)deviceContext; // unused - return EvalPatches(srcBuffer->BindCpuBuffer(), - srcDesc, - dstBuffer->BindCpuBuffer(), - dstDesc, + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, numPatchCoords, (const PatchCoord*)patchCoords->BindCpuBuffer(), patchTable->GetVaryingPatchArrayBuffer(), @@ -525,7 +528,9 @@ public: /// /// @param patchCoords array of locations to be evaluated. /// - /// @param patchTable Far::PatchTable + /// @param patchTable CpuPatchTable or equivalent + /// XXX: currently Far::PatchTable can't be used + /// due to interface mismatch /// /// @param fvarChannel face-varying channel /// @@ -548,10 +553,8 @@ public: (void)instance; // unused (void)deviceContext; // unused - return EvalPatches(srcBuffer->BindCpuBuffer(), - srcDesc, - dstBuffer->BindCpuBuffer(), - dstDesc, + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, numPatchCoords, (const PatchCoord*)patchCoords->BindCpuBuffer(), patchTable->GetFVarPatchArrayBuffer(fvarChannel), From fe38ad8cdaa6d11ff0ef19ab976762faac0c8c68 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Thu, 26 Jan 2017 14:36:30 -0800 Subject: [PATCH 14/20] Added missing Osd Evaluator methods for deriv eval Now that Far::LimitStencilTable and Far::PatchTable support evaluation of 1st and 2nd derivatives the Osd Evaluator API for evaluating stencils and patches has been updated to match. --- opensubdiv/osd/clEvaluator.cpp | 210 +++- opensubdiv/osd/clEvaluator.h | 1465 +++++++++++++++++++++- opensubdiv/osd/clKernel.cl | 58 +- opensubdiv/osd/cpuEvaluator.cpp | 156 +++ opensubdiv/osd/cpuEvaluator.h | 655 ++++++++++ opensubdiv/osd/cpuKernel.cpp | 70 ++ opensubdiv/osd/cpuKernel.h | 19 + opensubdiv/osd/cudaEvaluator.cpp | 139 +- opensubdiv/osd/cudaEvaluator.h | 670 +++++++++- opensubdiv/osd/cudaKernel.cu | 47 +- opensubdiv/osd/d3d11ComputeEvaluator.cpp | 16 + opensubdiv/osd/d3d11ComputeEvaluator.h | 9 + opensubdiv/osd/glComputeEvaluator.cpp | 195 ++- opensubdiv/osd/glComputeEvaluator.h | 1184 ++++++++++++++++- opensubdiv/osd/glXFBEvaluator.cpp | 432 ++++++- opensubdiv/osd/glXFBEvaluator.h | 1192 +++++++++++++++++- opensubdiv/osd/glslComputeKernel.glsl | 96 +- opensubdiv/osd/glslXFBKernel.glsl | 123 +- opensubdiv/osd/ompEvaluator.cpp | 107 +- opensubdiv/osd/ompEvaluator.h | 655 ++++++++++ opensubdiv/osd/ompKernel.cpp | 93 ++ opensubdiv/osd/ompKernel.h | 19 + opensubdiv/osd/tbbEvaluator.cpp | 80 ++ opensubdiv/osd/tbbEvaluator.h | 655 ++++++++++ opensubdiv/osd/tbbKernel.cpp | 346 ++++- opensubdiv/osd/tbbKernel.h | 33 + 26 files changed, 8482 insertions(+), 242 deletions(-) diff --git a/opensubdiv/osd/clEvaluator.cpp b/opensubdiv/osd/clEvaluator.cpp index 4ee4f640..2f6c6ab9 100644 --- a/opensubdiv/osd/clEvaluator.cpp +++ b/opensubdiv/osd/clEvaluator.cpp @@ -49,6 +49,10 @@ static const char *patchBasisSource = template cl_mem createCLBuffer(std::vector const & src, cl_context clContext) { + if (src.empty()) { + return NULL; + } + cl_int errNum = 0; cl_mem devicePtr = clCreateBuffer(clContext, CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, @@ -76,9 +80,11 @@ CLStencilTable::CLStencilTable(Far::StencilTable const *stencilTable, clContext); _weights = createCLBuffer(stencilTable->GetWeights(), clContext); _duWeights = _dvWeights = NULL; + _duuWeights = _duvWeights = _dvvWeights = NULL; } else { _sizes = _offsets = _indices = _weights = NULL; _duWeights = _dvWeights = NULL; + _duuWeights = _duvWeights = _dvvWeights = NULL; } } @@ -96,9 +102,16 @@ CLStencilTable::CLStencilTable(Far::LimitStencilTable const *limitStencilTable, limitStencilTable->GetDuWeights(), clContext); _dvWeights = createCLBuffer( limitStencilTable->GetDvWeights(), clContext); + _duuWeights = createCLBuffer( + limitStencilTable->GetDuuWeights(), clContext); + _duvWeights = createCLBuffer( + limitStencilTable->GetDuvWeights(), clContext); + _dvvWeights = createCLBuffer( + limitStencilTable->GetDvvWeights(), clContext); } else { _sizes = _offsets = _indices = _weights = NULL; _duWeights = _dvWeights = NULL; + _duuWeights = _duvWeights = _dvvWeights = NULL; } } @@ -109,6 +122,9 @@ CLStencilTable::~CLStencilTable() { if (_weights) clReleaseMemObject(_weights); if (_duWeights) clReleaseMemObject(_duWeights); if (_dvWeights) clReleaseMemObject(_dvWeights); + if (_duuWeights) clReleaseMemObject(_duuWeights); + if (_duvWeights) clReleaseMemObject(_duvWeights); + if (_dvvWeights) clReleaseMemObject(_dvvWeights); } // --------------------------------------------------------------------------- @@ -130,7 +146,10 @@ bool CLEvaluator::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const & /*duDesc*/, - BufferDescriptor const & /*dvDesc*/) { + BufferDescriptor const & /*dvDesc*/, + BufferDescriptor const & /*duuDesc*/, + BufferDescriptor const & /*duvDesc*/, + BufferDescriptor const & /*dvvDesc*/) { if (srcDesc.length > dstDesc.length) { Far::Error(Far::FAR_RUNTIME_ERROR, "srcDesc length must be less than or equal to " @@ -263,6 +282,7 @@ CLEvaluator::EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, size_t globalWorkSize = (size_t)(end - start); + BufferDescriptor empty; clSetKernelArg(_stencilDerivKernel, 0, sizeof(cl_mem), &src); clSetKernelArg(_stencilDerivKernel, 1, sizeof(int), &srcDesc.offset); clSetKernelArg(_stencilDerivKernel, 2, sizeof(cl_mem), &dst); @@ -273,14 +293,26 @@ CLEvaluator::EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, clSetKernelArg(_stencilDerivKernel, 7, sizeof(cl_mem), &dv); clSetKernelArg(_stencilDerivKernel, 8, sizeof(int), &dvDesc.offset); clSetKernelArg(_stencilDerivKernel, 9, sizeof(int), &dvDesc.stride); - clSetKernelArg(_stencilDerivKernel, 10, sizeof(cl_mem), &sizes); - clSetKernelArg(_stencilDerivKernel, 11, sizeof(cl_mem), &offsets); - clSetKernelArg(_stencilDerivKernel, 12, sizeof(cl_mem), &indices); - clSetKernelArg(_stencilDerivKernel, 13, sizeof(cl_mem), &weights); - clSetKernelArg(_stencilDerivKernel, 14, sizeof(cl_mem), &duWeights); - clSetKernelArg(_stencilDerivKernel, 15, sizeof(cl_mem), &dvWeights); - clSetKernelArg(_stencilDerivKernel, 16, sizeof(int), &start); - clSetKernelArg(_stencilDerivKernel, 17, sizeof(int), &end); + clSetKernelArg(_stencilDerivKernel, 10, sizeof(cl_mem), NULL); + clSetKernelArg(_stencilDerivKernel, 11, sizeof(int), &empty.offset); + clSetKernelArg(_stencilDerivKernel, 12, sizeof(int), &empty.stride); + clSetKernelArg(_stencilDerivKernel, 13, sizeof(cl_mem), NULL); + clSetKernelArg(_stencilDerivKernel, 14, sizeof(int), &empty.offset); + clSetKernelArg(_stencilDerivKernel, 15, sizeof(int), &empty.stride); + clSetKernelArg(_stencilDerivKernel, 16, sizeof(cl_mem), NULL); + clSetKernelArg(_stencilDerivKernel, 17, sizeof(int), &empty.offset); + clSetKernelArg(_stencilDerivKernel, 18, sizeof(int), &empty.stride); + clSetKernelArg(_stencilDerivKernel, 19, sizeof(cl_mem), &sizes); + clSetKernelArg(_stencilDerivKernel, 20, sizeof(cl_mem), &offsets); + clSetKernelArg(_stencilDerivKernel, 21, sizeof(cl_mem), &indices); + clSetKernelArg(_stencilDerivKernel, 22, sizeof(cl_mem), &weights); + clSetKernelArg(_stencilDerivKernel, 23, sizeof(cl_mem), &duWeights); + clSetKernelArg(_stencilDerivKernel, 24, sizeof(cl_mem), &dvWeights); + clSetKernelArg(_stencilDerivKernel, 25, sizeof(cl_mem), NULL); + clSetKernelArg(_stencilDerivKernel, 26, sizeof(cl_mem), NULL); + clSetKernelArg(_stencilDerivKernel, 27, sizeof(cl_mem), NULL); + clSetKernelArg(_stencilDerivKernel, 28, sizeof(int), &start); + clSetKernelArg(_stencilDerivKernel, 29, sizeof(int), &end); cl_int errNum = clEnqueueNDRangeKernel( _clCommandQueue, _stencilDerivKernel, 1, NULL, @@ -292,9 +324,80 @@ CLEvaluator::EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, return false; } - if (endEvent == NULL) - { - clFinish(_clCommandQueue); + if (endEvent == NULL) { + clFinish(_clCommandQueue); + } + return true; +} + +bool +CLEvaluator::EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, + cl_mem dst, BufferDescriptor const &dstDesc, + cl_mem du, BufferDescriptor const &duDesc, + cl_mem dv, BufferDescriptor const &dvDesc, + cl_mem duu, BufferDescriptor const &duuDesc, + cl_mem duv, BufferDescriptor const &duvDesc, + cl_mem dvv, BufferDescriptor const &dvvDesc, + cl_mem sizes, + cl_mem offsets, + cl_mem indices, + cl_mem weights, + cl_mem duWeights, + cl_mem dvWeights, + cl_mem duuWeights, + cl_mem duvWeights, + cl_mem dvvWeights, + int start, int end, + unsigned int numStartEvents, + const cl_event* startEvents, + cl_event* endEvent) const { + if (end <= start) return true; + + size_t globalWorkSize = (size_t)(end - start); + + clSetKernelArg(_stencilDerivKernel, 0, sizeof(cl_mem), &src); + clSetKernelArg(_stencilDerivKernel, 1, sizeof(int), &srcDesc.offset); + clSetKernelArg(_stencilDerivKernel, 2, sizeof(cl_mem), &dst); + clSetKernelArg(_stencilDerivKernel, 3, sizeof(int), &dstDesc.offset); + clSetKernelArg(_stencilDerivKernel, 4, sizeof(cl_mem), &du); + clSetKernelArg(_stencilDerivKernel, 5, sizeof(int), &duDesc.offset); + clSetKernelArg(_stencilDerivKernel, 6, sizeof(int), &duDesc.stride); + clSetKernelArg(_stencilDerivKernel, 7, sizeof(cl_mem), &dv); + clSetKernelArg(_stencilDerivKernel, 8, sizeof(int), &dvDesc.offset); + clSetKernelArg(_stencilDerivKernel, 9, sizeof(int), &dvDesc.stride); + clSetKernelArg(_stencilDerivKernel, 10, sizeof(cl_mem), &duu); + clSetKernelArg(_stencilDerivKernel, 11, sizeof(int), &duuDesc.offset); + clSetKernelArg(_stencilDerivKernel, 12, sizeof(int), &duuDesc.stride); + clSetKernelArg(_stencilDerivKernel, 13, sizeof(cl_mem), &duv); + clSetKernelArg(_stencilDerivKernel, 14, sizeof(int), &duvDesc.offset); + clSetKernelArg(_stencilDerivKernel, 15, sizeof(int), &duvDesc.stride); + clSetKernelArg(_stencilDerivKernel, 16, sizeof(cl_mem), &dvv); + clSetKernelArg(_stencilDerivKernel, 17, sizeof(int), &dvvDesc.offset); + clSetKernelArg(_stencilDerivKernel, 18, sizeof(int), &dvvDesc.stride); + clSetKernelArg(_stencilDerivKernel, 19, sizeof(cl_mem), &sizes); + clSetKernelArg(_stencilDerivKernel, 20, sizeof(cl_mem), &offsets); + clSetKernelArg(_stencilDerivKernel, 21, sizeof(cl_mem), &indices); + clSetKernelArg(_stencilDerivKernel, 22, sizeof(cl_mem), &weights); + clSetKernelArg(_stencilDerivKernel, 23, sizeof(cl_mem), &duWeights); + clSetKernelArg(_stencilDerivKernel, 24, sizeof(cl_mem), &dvWeights); + clSetKernelArg(_stencilDerivKernel, 25, sizeof(cl_mem), &duuWeights); + clSetKernelArg(_stencilDerivKernel, 26, sizeof(cl_mem), &duvWeights); + clSetKernelArg(_stencilDerivKernel, 27, sizeof(cl_mem), &dvvWeights); + clSetKernelArg(_stencilDerivKernel, 28, sizeof(int), &start); + clSetKernelArg(_stencilDerivKernel, 29, sizeof(int), &end); + + cl_int errNum = clEnqueueNDRangeKernel( + _clCommandQueue, _stencilDerivKernel, 1, NULL, + &globalWorkSize, NULL, numStartEvents, startEvents, endEvent); + + if (errNum != CL_SUCCESS) { + Far::Error(Far::FAR_RUNTIME_ERROR, + "ApplyStencilKernel (%d) ", errNum); + return false; + } + + if (endEvent == NULL) { + clFinish(_clCommandQueue); } return true; } @@ -315,6 +418,66 @@ CLEvaluator::EvalPatches(cl_mem src, BufferDescriptor const &srcDesc, size_t globalWorkSize = (size_t)(numPatchCoords); + BufferDescriptor empty; + clSetKernelArg(_patchKernel, 0, sizeof(cl_mem), &src); + clSetKernelArg(_patchKernel, 1, sizeof(int), &srcDesc.offset); + clSetKernelArg(_patchKernel, 2, sizeof(cl_mem), &dst); + clSetKernelArg(_patchKernel, 3, sizeof(int), &dstDesc.offset); + clSetKernelArg(_patchKernel, 4, sizeof(cl_mem), &du); + clSetKernelArg(_patchKernel, 5, sizeof(int), &duDesc.offset); + clSetKernelArg(_patchKernel, 6, sizeof(int), &duDesc.stride); + clSetKernelArg(_patchKernel, 7, sizeof(cl_mem), &dv); + clSetKernelArg(_patchKernel, 8, sizeof(int), &dvDesc.offset); + clSetKernelArg(_patchKernel, 9, sizeof(int), &dvDesc.stride); + clSetKernelArg(_patchKernel, 10, sizeof(cl_mem), NULL); + clSetKernelArg(_patchKernel, 11, sizeof(int), &empty.offset); + clSetKernelArg(_patchKernel, 12, sizeof(int), &empty.stride); + clSetKernelArg(_patchKernel, 13, sizeof(cl_mem), NULL); + clSetKernelArg(_patchKernel, 14, sizeof(int), &empty.offset); + clSetKernelArg(_patchKernel, 15, sizeof(int), &empty.stride); + clSetKernelArg(_patchKernel, 16, sizeof(cl_mem), NULL); + clSetKernelArg(_patchKernel, 17, sizeof(int), &empty.offset); + clSetKernelArg(_patchKernel, 18, sizeof(int), &empty.stride); + clSetKernelArg(_patchKernel, 19, sizeof(cl_mem), &patchCoordsBuffer); + clSetKernelArg(_patchKernel, 20, sizeof(cl_mem), &patchArrayBuffer); + clSetKernelArg(_patchKernel, 21, sizeof(cl_mem), &patchIndexBuffer); + clSetKernelArg(_patchKernel, 22, sizeof(cl_mem), &patchParamBuffer); + + cl_int errNum = clEnqueueNDRangeKernel( + _clCommandQueue, _patchKernel, 1, NULL, + &globalWorkSize, NULL, numStartEvents, startEvents, endEvent); + + if (errNum != CL_SUCCESS) { + Far::Error(Far::FAR_RUNTIME_ERROR, + "ApplyPatchKernel (%d) ", errNum); + return false; + } + + if (endEvent == NULL) { + clFinish(_clCommandQueue); + } + return true; +} + +bool +CLEvaluator::EvalPatches(cl_mem src, BufferDescriptor const &srcDesc, + cl_mem dst, BufferDescriptor const &dstDesc, + cl_mem du, BufferDescriptor const &duDesc, + cl_mem dv, BufferDescriptor const &dvDesc, + cl_mem duu, BufferDescriptor const &duuDesc, + cl_mem duv, BufferDescriptor const &duvDesc, + cl_mem dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + cl_mem patchCoordsBuffer, + cl_mem patchArrayBuffer, + cl_mem patchIndexBuffer, + cl_mem patchParamBuffer, + unsigned int numStartEvents, + const cl_event* startEvents, + cl_event* endEvent) const { + + size_t globalWorkSize = (size_t)(numPatchCoords); + clSetKernelArg(_patchKernel, 0, sizeof(cl_mem), &src); clSetKernelArg(_patchKernel, 1, sizeof(int), &srcDesc.offset); clSetKernelArg(_patchKernel, 2, sizeof(cl_mem), &dst); @@ -325,10 +488,19 @@ CLEvaluator::EvalPatches(cl_mem src, BufferDescriptor const &srcDesc, clSetKernelArg(_patchKernel, 7, sizeof(cl_mem), &dv); clSetKernelArg(_patchKernel, 8, sizeof(int), &dvDesc.offset); clSetKernelArg(_patchKernel, 9, sizeof(int), &dvDesc.stride); - clSetKernelArg(_patchKernel, 10, sizeof(cl_mem), &patchCoordsBuffer); - clSetKernelArg(_patchKernel, 11, sizeof(cl_mem), &patchArrayBuffer); - clSetKernelArg(_patchKernel, 12, sizeof(cl_mem), &patchIndexBuffer); - clSetKernelArg(_patchKernel, 13, sizeof(cl_mem), &patchParamBuffer); + clSetKernelArg(_patchKernel, 10, sizeof(cl_mem), &duu); + clSetKernelArg(_patchKernel, 11, sizeof(int), &duuDesc.offset); + clSetKernelArg(_patchKernel, 12, sizeof(int), &duuDesc.stride); + clSetKernelArg(_patchKernel, 13, sizeof(cl_mem), &duv); + clSetKernelArg(_patchKernel, 14, sizeof(int), &duvDesc.offset); + clSetKernelArg(_patchKernel, 15, sizeof(int), &duvDesc.stride); + clSetKernelArg(_patchKernel, 16, sizeof(cl_mem), &dvv); + clSetKernelArg(_patchKernel, 17, sizeof(int), &dvvDesc.offset); + clSetKernelArg(_patchKernel, 18, sizeof(int), &dvvDesc.stride); + clSetKernelArg(_patchKernel, 19, sizeof(cl_mem), &patchCoordsBuffer); + clSetKernelArg(_patchKernel, 20, sizeof(cl_mem), &patchArrayBuffer); + clSetKernelArg(_patchKernel, 21, sizeof(cl_mem), &patchIndexBuffer); + clSetKernelArg(_patchKernel, 22, sizeof(cl_mem), &patchParamBuffer); cl_int errNum = clEnqueueNDRangeKernel( _clCommandQueue, _patchKernel, 1, NULL, @@ -340,15 +512,13 @@ CLEvaluator::EvalPatches(cl_mem src, BufferDescriptor const &srcDesc, return false; } - if (endEvent == NULL) - { - clFinish(_clCommandQueue); + if (endEvent == NULL) { + clFinish(_clCommandQueue); } return true; } - /* static */ void CLEvaluator::Synchronize(cl_command_queue clCommandQueue) { diff --git a/opensubdiv/osd/clEvaluator.h b/opensubdiv/osd/clEvaluator.h index a336eea6..5c565300 100644 --- a/opensubdiv/osd/clEvaluator.h +++ b/opensubdiv/osd/clEvaluator.h @@ -77,6 +77,9 @@ public: cl_mem GetWeightsBuffer() const { return _weights; } cl_mem GetDuWeightsBuffer() const { return _duWeights; } cl_mem GetDvWeightsBuffer() const { return _dvWeights; } + cl_mem GetDuuWeightsBuffer() const { return _duuWeights; } + cl_mem GetDuvWeightsBuffer() const { return _duvWeights; } + cl_mem GetDvvWeightsBuffer() const { return _dvvWeights; } int GetNumStencils() const { return _numStencils; } private: @@ -86,6 +89,9 @@ private: cl_mem _weights; cl_mem _duWeights; cl_mem _dvWeights; + cl_mem _duuWeights; + cl_mem _duvWeights; + cl_mem _dvvWeights; int _numStencils; }; @@ -120,6 +126,39 @@ public: return NULL; } + /// Generic creator template. + template + static CLEvaluator *Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + DEVICE_CONTEXT deviceContext) { + return Create(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + deviceContext->GetContext(), + deviceContext->GetCommandQueue()); + } + + static CLEvaluator * Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + cl_context clContext, + cl_command_queue clCommandQueue) { + CLEvaluator *instance = new CLEvaluator(clContext, clCommandQueue); + if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc)) + return instance; + delete instance; + return NULL; + } + /// Constructor. CLEvaluator(cl_context context, cl_command_queue queue); @@ -304,6 +343,129 @@ public: } } + /// \brief Generic static stencil function. This function has a same + /// signature as other device kernels have so that it can be called + /// transparently from OsdMesh template interface. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCLBuffer() method returning the + /// cl_mem object for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning the + /// cl_mem object for results to be written + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning the + /// cl_mem object for dv results to be written + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning the + /// cl_mem object for dv results to be written + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext client providing context class which supports + /// cL_context GetContext() + /// cl_command_queue GetCommandQueue() + /// methods. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + CLEvaluator const *instance, + DEVICE_CONTEXT deviceContext, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) { + + if (instance) { + return instance->EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + stencilTable, + numStartEvents, startEvents, endEvent); + } else { + // Create an instance on demand (slow) + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + deviceContext); + if (instance) { + bool r = instance->EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + stencilTable, + numStartEvents, startEvents, endEvent); + delete instance; + return r; + } + return false; + } + } + /// \brief Generic stencil function. /// /// @param srcBuffer Input primvar buffer. @@ -420,6 +582,100 @@ public: numStartEvents, startEvents, endEvent); } + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindCLBuffer() method returning the + /// cl_mem object for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning the + /// cl_mem object for results to be written + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning the + /// cl_mem object for dv results to be written + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning the + /// cl_mem object for du results to be written + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning the + /// cl_mem object for dv results to be written + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const { + return EvalStencils(srcBuffer->BindCLBuffer(_clCommandQueue), srcDesc, + dstBuffer->BindCLBuffer(_clCommandQueue), dstDesc, + duBuffer->BindCLBuffer(_clCommandQueue), duDesc, + dvBuffer->BindCLBuffer(_clCommandQueue), dvDesc, + duuBuffer->BindCLBuffer(_clCommandQueue), duuDesc, + duvBuffer->BindCLBuffer(_clCommandQueue), duvDesc, + dvvBuffer->BindCLBuffer(_clCommandQueue), dvvDesc, + stencilTable->GetSizesBuffer(), + stencilTable->GetOffsetsBuffer(), + stencilTable->GetIndicesBuffer(), + stencilTable->GetWeightsBuffer(), + stencilTable->GetDuWeightsBuffer(), + stencilTable->GetDvWeightsBuffer(), + stencilTable->GetDuuWeightsBuffer(), + stencilTable->GetDuvWeightsBuffer(), + stencilTable->GetDvvWeightsBuffer(), + 0, + stencilTable->GetNumStencils(), + numStartEvents, startEvents, endEvent); + } + /// Dispatch the CL compute kernel asynchronously. /// returns false if the kernel hasn't been compiled yet. bool EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, @@ -498,6 +754,94 @@ public: const cl_event* startEvents=NULL, cl_event* endEvent=NULL) const; + /// \brief Dispatch the CL compute kernel asynchronously. + /// returns false if the kernel hasn't been compiled yet. + /// + /// @param src CL buffer of input primvar source data + /// + /// @param srcDesc vertex buffer descriptor for the srcBuffer + /// + /// @param dst CL buffer of output primvar destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param du CL buffer of output derivative wrt u + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv CL buffer of output derivative wrt v + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu CL buffer of output 2nd derivative wrt u + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv CL buffer of output 2nd derivative wrt u and v + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv CL buffer of output 2nd derivative wrt v + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param sizes CL buffer of the sizes in the stencil table + /// + /// @param offsets CL buffer of the offsets in the stencil table + /// + /// @param indices CL buffer of the indices in the stencil table + /// + /// @param weights CL buffer of the weights in the stencil table + /// + /// @param duWeights CL buffer of the du weights in the stencil table + /// + /// @param dvWeights CL buffer of the dv weights in the stencil table + /// + /// @param duuWeights CL buffer of the duu weights in the stencil table + /// + /// @param duvWeights CL buffer of the duv weights in the stencil table + /// + /// @param dvvWeights CL buffer of the dvv weights in the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + bool EvalStencils(cl_mem src, BufferDescriptor const &srcDesc, + cl_mem dst, BufferDescriptor const &dstDesc, + cl_mem du, BufferDescriptor const &duDesc, + cl_mem dv, BufferDescriptor const &dvDesc, + cl_mem duu, BufferDescriptor const &duuDesc, + cl_mem duv, BufferDescriptor const &duvDesc, + cl_mem dvv, BufferDescriptor const &dvvDesc, + cl_mem sizes, + cl_mem offsets, + cl_mem indices, + cl_mem weights, + cl_mem duWeights, + cl_mem dvWeights, + cl_mem duuWeights, + cl_mem duvWeights, + cl_mem dvvWeights, + int start, + int end, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const; + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -697,6 +1041,140 @@ public: } } + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext client providing context class which supports + /// cL_context GetContext() + /// cl_command_queue GetCommandQueue() + /// methods. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + CLEvaluator const *instance, + DEVICE_CONTEXT deviceContext, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) { + + if (instance) { + return instance->EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, + numStartEvents, startEvents, endEvent); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + deviceContext); + if (instance) { + bool r = instance->EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, + numStartEvents, startEvents, endEvent); + delete instance; + return r; + } + return false; + } + } + /// \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. @@ -792,18 +1270,18 @@ public: /// /// @param patchTable CLPatchTable or equivalent /// - /// @param numStartEvents the number of events in the array pointed to by - /// startEvents. + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. /// - /// @param startEvents points to an array of cl_event which will determine - /// when it is safe for the OpenCL device to begin work - /// or NULL if it can begin immediately. + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. /// - /// @param endEvent pointer to a cl_event which will receive a copy of - /// the cl_event which indicates when all work for this - /// call has completed. This cl_event has an incremented - /// reference count and should be released via - /// clReleaseEvent(). NULL if not required. + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. /// template @@ -831,6 +1309,103 @@ public: numStartEvents, startEvents, endEvent); } + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const { + + return EvalPatches(srcBuffer->BindCLBuffer(_clCommandQueue), srcDesc, + dstBuffer->BindCLBuffer(_clCommandQueue), dstDesc, + duBuffer->BindCLBuffer(_clCommandQueue), duDesc, + dvBuffer->BindCLBuffer(_clCommandQueue), dvDesc, + duuBuffer->BindCLBuffer(_clCommandQueue), duuDesc, + duvBuffer->BindCLBuffer(_clCommandQueue), duvDesc, + dvvBuffer->BindCLBuffer(_clCommandQueue), dvvDesc, + numPatchCoords, + patchCoords->BindCLBuffer(_clCommandQueue), + patchTable->GetPatchArrayBuffer(), + patchTable->GetPatchIndexBuffer(), + patchTable->GetPatchParamBuffer(), + numStartEvents, startEvents, endEvent); + } + bool EvalPatches(cl_mem src, BufferDescriptor const &srcDesc, cl_mem dst, BufferDescriptor const &dstDesc, cl_mem du, BufferDescriptor const &duDesc, @@ -844,6 +1419,22 @@ public: const cl_event* startEvents=NULL, cl_event* endEvent=NULL) const; + bool EvalPatches(cl_mem src, BufferDescriptor const &srcDesc, + cl_mem dst, BufferDescriptor const &dstDesc, + cl_mem du, BufferDescriptor const &duDesc, + cl_mem dv, BufferDescriptor const &dvDesc, + cl_mem duu, BufferDescriptor const &duuDesc, + cl_mem duv, BufferDescriptor const &duvDesc, + cl_mem dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + cl_mem patchCoordsBuffer, + cl_mem patchArrayBuffer, + cl_mem patchIndexBuffer, + cl_mem patchParamsBuffer, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const; + /// \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. @@ -996,6 +1587,424 @@ public: numStartEvents, startEvents, endEvent); } + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext client providing context class which supports + /// cL_context GetContext() + /// cl_command_queue GetCommandQueue() + /// methods. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + static bool EvalPatchesVarying( + 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, + CLEvaluator const *instance, + DEVICE_CONTEXT deviceContext, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) { + + if (instance) { + return instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, + numStartEvents, startEvents, endEvent); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + deviceContext); + if (instance) { + bool r = instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, + numStartEvents, startEvents, endEvent); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + bool EvalPatchesVarying( + 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, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const { + + return EvalPatches(srcBuffer->BindCLBuffer(_clCommandQueue), srcDesc, + dstBuffer->BindCLBuffer(_clCommandQueue), dstDesc, + duBuffer->BindCLBuffer(_clCommandQueue), duDesc, + dvBuffer->BindCLBuffer(_clCommandQueue), dvDesc, + numPatchCoords, + patchCoords->BindCLBuffer(_clCommandQueue), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer(), + numStartEvents, startEvents, endEvent); + } + + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext client providing context class which supports + /// cL_context GetContext() + /// cl_command_queue GetCommandQueue() + /// methods. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + static bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + CLEvaluator const *instance, + DEVICE_CONTEXT deviceContext, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) { + + if (instance) { + return instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, + numStartEvents, startEvents, endEvent); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + deviceContext); + if (instance) { + bool r = instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, + numStartEvents, startEvents, endEvent); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const { + + return EvalPatches(srcBuffer->BindCLBuffer(_clCommandQueue), srcDesc, + dstBuffer->BindCLBuffer(_clCommandQueue), dstDesc, + duBuffer->BindCLBuffer(_clCommandQueue), duDesc, + dvBuffer->BindCLBuffer(_clCommandQueue), dvDesc, + duuBuffer->BindCLBuffer(_clCommandQueue), duuDesc, + duvBuffer->BindCLBuffer(_clCommandQueue), duvDesc, + dvvBuffer->BindCLBuffer(_clCommandQueue), dvvDesc, + numPatchCoords, + patchCoords->BindCLBuffer(_clCommandQueue), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer(), + numStartEvents, startEvents, endEvent); + } + /// \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. @@ -1154,6 +2163,435 @@ public: numStartEvents, startEvents, endEvent); } + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext client providing context class which supports + /// cL_context GetContext() + /// cl_command_queue GetCommandQueue() + /// methods. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + CLEvaluator const *instance, + DEVICE_CONTEXT deviceContext, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) { + + if (instance) { + return instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel, + numStartEvents, startEvents, endEvent); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, deviceContext); + if (instance) { + bool r = instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel, + numStartEvents, startEvents, endEvent); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + bool EvalPatchesFaceVarying( + 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, + int fvarChannel = 0, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const { + + return EvalPatches(srcBuffer->BindCLBuffer(_clCommandQueue), srcDesc, + dstBuffer->BindCLBuffer(_clCommandQueue), dstDesc, + duBuffer->BindCLBuffer(_clCommandQueue), duDesc, + dvBuffer->BindCLBuffer(_clCommandQueue), dvDesc, + numPatchCoords, + patchCoords->BindCLBuffer(_clCommandQueue), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel), + numStartEvents, startEvents, endEvent); + } + + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext client providing context class which supports + /// cL_context GetContext() + /// cl_command_queue GetCommandQueue() + /// methods. + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + CLEvaluator const *instance, + DEVICE_CONTEXT deviceContext, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) { + + if (instance) { + return instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel, + numStartEvents, startEvents, endEvent); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + deviceContext); + if (instance) { + bool r = instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel, + numStartEvents, startEvents, endEvent); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindCLBuffer() method returning a CL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCLBuffer() method returning a CL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCLBuffer() method returning an + /// array of PatchCoord struct. + /// + /// @param patchTable CLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param numStartEvents the number of events in the array pointed to by + /// startEvents. + /// + /// @param startEvents points to an array of cl_event which will determine + /// when it is safe for the OpenCL device to begin work + /// or NULL if it can begin immediately. + /// + /// @param endEvent pointer to a cl_event which will receive a copy of + /// the cl_event which indicates when all work for this + /// call has completed. This cl_event has an incremented + /// reference count and should be released via + /// clReleaseEvent(). NULL if not required. + /// + template + bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel = 0, + unsigned int numStartEvents=0, + const cl_event* startEvents=NULL, + cl_event* endEvent=NULL) const { + + return EvalPatches(srcBuffer->BindCLBuffer(_clCommandQueue), srcDesc, + dstBuffer->BindCLBuffer(_clCommandQueue), dstDesc, + duBuffer->BindCLBuffer(_clCommandQueue), duDesc, + dvBuffer->BindCLBuffer(_clCommandQueue), dvDesc, + duuBuffer->BindCLBuffer(_clCommandQueue), duuDesc, + duvBuffer->BindCLBuffer(_clCommandQueue), duvDesc, + dvvBuffer->BindCLBuffer(_clCommandQueue), dvvDesc, + numPatchCoords, + patchCoords->BindCLBuffer(_clCommandQueue), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel), + numStartEvents, startEvents, endEvent); + } + /// ---------------------------------------------------------------------- /// /// Other methods @@ -1164,8 +2602,11 @@ public: /// Returns false if it fails to compile the kernel. bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, - BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc); + BufferDescriptor const &duDesc = BufferDescriptor(), + BufferDescriptor const &dvDesc = BufferDescriptor(), + BufferDescriptor const &duuDesc = BufferDescriptor(), + BufferDescriptor const &duvDesc = BufferDescriptor(), + BufferDescriptor const &dvvDesc = BufferDescriptor()); /// Wait the OpenCL kernels finish. template diff --git a/opensubdiv/osd/clKernel.cl b/opensubdiv/osd/clKernel.cl index f193cbed..8464655d 100644 --- a/opensubdiv/osd/clKernel.cl +++ b/opensubdiv/osd/clKernel.cl @@ -99,12 +99,18 @@ __kernel void computeStencilsDerivatives( __global float * dst, int dstOffset, __global float * du, int duOffset, int duStride, __global float * dv, int dvOffset, int dvStride, + __global float * duu, int duuOffset, int duuStride, + __global float * duv, int duvOffset, int duvStride, + __global float * dvv, int dvvOffset, int dvvStride, __global int * sizes, __global int * offsets, __global int * indices, __global float * weights, __global float * duWeights, __global float * dvWeights, + __global float * duuWeights, + __global float * duvWeights, + __global float * dvvWeights, int batchStart, int batchEnd) { int current = get_global_id(0) + batchStart; @@ -113,10 +119,13 @@ __kernel void computeStencilsDerivatives( return; } - struct Vertex v, vdu, vdv; + struct Vertex v, vdu, vdv, vduu, vduv, vdvv; clear(&v); clear(&vdu); clear(&vdv); + clear(&vduu); + clear(&vduv); + clear(&vdvv); int size = sizes[current], offset = offsets[current]; @@ -125,6 +134,9 @@ __kernel void computeStencilsDerivatives( if (dst) dst += dstOffset; if (du) du += duOffset; if (dv) dv += dvOffset; + if (duu) duu += duuOffset; + if (duv) duv += duvOffset; + if (dvv) dvv += dvvOffset; for (int i=0; i struct BufferAdapter { BufferAdapter(T *p, int length, int stride) : @@ -264,6 +306,120 @@ CpuEvaluator::EvalPatches(const float *src, BufferDescriptor const &srcDesc, return true; } +/* static */ +bool +CpuEvaluator::EvalPatches(const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrays, + const int *patchIndexBuffer, + const PatchParam *patchParamBuffer) { + if (src) { + src += srcDesc.offset; + } else { + return false; + } + if (dst) { + if (srcDesc.length != dstDesc.length) return false; + dst += dstDesc.offset; + } + if (du) { + du += duDesc.offset; + if (srcDesc.length != duDesc.length) return false; + } + if (dv) { + dv += dvDesc.offset; + if (srcDesc.length != dvDesc.length) return false; + } + if (duu) { + duu += duuDesc.offset; + if (srcDesc.length != duuDesc.length) return false; + } + if (duv) { + duv += duvDesc.offset; + if (srcDesc.length != duvDesc.length) return false; + } + if (dvv) { + dvv += dvvDesc.offset; + if (srcDesc.length != dvvDesc.length) return false; + } + + BufferAdapter srcT(src, srcDesc.length, srcDesc.stride); + BufferAdapter dstT(dst, dstDesc.length, dstDesc.stride); + BufferAdapter duT(du, duDesc.length, duDesc.stride); + BufferAdapter dvT(dv, dvDesc.length, dvDesc.stride); + BufferAdapter duuT(duu, duuDesc.length, duuDesc.stride); + BufferAdapter duvT(duv, duvDesc.length, duvDesc.stride); + BufferAdapter dvvT(dvv, dvvDesc.length, dvvDesc.stride); + + float wP[20], wDu[20], wDv[20], wDuu[20], wDuv[20], wDvv[20]; + + for (int i = 0; i < numPatchCoords; ++i) { + PatchCoord const &coord = patchCoords[i]; + PatchArray const &array = patchArrays[coord.handle.arrayIndex]; + + Far::PatchParam const & param = + patchParamBuffer[coord.handle.patchIndex]; + int patchType = param.IsRegular() + ? Far::PatchDescriptor::REGULAR + : array.GetPatchType(); + + int numControlVertices = 0; + if (patchType == Far::PatchDescriptor::REGULAR) { + Far::internal::GetBSplineWeights(param, + coord.s, coord.t, wP, wDu, wDv, + wDuu, wDuv, wDvv); + numControlVertices = 16; + } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { + Far::internal::GetGregoryWeights(param, + coord.s, coord.t, wP, wDu, wDv, + wDuu, wDuv, wDvv); + numControlVertices = 20; + } else if (patchType == Far::PatchDescriptor::QUADS) { + Far::internal::GetBilinearWeights(param, + coord.s, coord.t, wP, wDu, wDv, + wDuu, wDuv, wDvv); + numControlVertices = 4; + } else { + assert(0); + } + + int indexStride = Far::PatchDescriptor(array.GetPatchType()).GetNumControlVertices(); + int indexBase = array.GetIndexBase() + indexStride * + (coord.handle.patchIndex - array.GetPrimitiveIdBase()); + + const int *cvs = &patchIndexBuffer[indexBase]; + + dstT.Clear(); + duT.Clear(); + dvT.Clear(); + duuT.Clear(); + duvT.Clear(); + dvvT.Clear(); + for (int j = 0; j < numControlVertices; ++j) { + dstT.AddWithWeight(srcT[cvs[j]], wP[j]); + duT.AddWithWeight (srcT[cvs[j]], wDu[j]); + dvT.AddWithWeight (srcT[cvs[j]], wDv[j]); + duuT.AddWithWeight (srcT[cvs[j]], wDuu[j]); + duvT.AddWithWeight (srcT[cvs[j]], wDuv[j]); + dvvT.AddWithWeight (srcT[cvs[j]], wDvv[j]); + } + ++dstT; + ++duT; + ++dvT; + ++duuT; + ++duvT; + ++dvvT; + } + return true; +} + } // end namespace Osd diff --git a/opensubdiv/osd/cpuEvaluator.h b/opensubdiv/osd/cpuEvaluator.h index 30d558da..0c29de5b 100644 --- a/opensubdiv/osd/cpuEvaluator.h +++ b/opensubdiv/osd/cpuEvaluator.h @@ -244,6 +244,177 @@ public: const float * dvWeights, 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 buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + const CpuEvaluator *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, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + &stencilTable->GetSizes()[0], + &stencilTable->GetOffsets()[0], + &stencilTable->GetControlIndices()[0], + &stencilTable->GetWeights()[0], + &stencilTable->GetDuWeights()[0], + &stencilTable->GetDvWeights()[0], + &stencilTable->GetDuuWeights()[0], + &stencilTable->GetDuvWeights()[0], + &stencilTable->GetDvvWeights()[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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 duuWeights pointer to the duu-weights buffer of the stencil table + /// + /// @param duvWeights pointer to the duv-weights buffer of the stencil table + /// + /// @param dvvWeights pointer to the dvv-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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + int start, int end); + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -373,6 +544,102 @@ public: 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 buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + CpuEvaluator 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, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + 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. /// @@ -457,6 +724,72 @@ public: const int *patchIndexBuffer, PatchParam const *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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, + const int *patchIndexBuffer, + PatchParam const *patchParamBuffer); + /// \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. @@ -508,6 +841,164 @@ public: patchTable->GetPatchParamBuffer()); } + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// 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 EvalPatchesVarying( + 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, + CpuEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + CpuEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + /// \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. @@ -562,6 +1053,170 @@ public: patchTable->GetFVarPatchParamBuffer(fvarChannel)); } + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// 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 fvarChannel face-varying channel + /// + /// @param instance not used in the cpu evaluator + /// + /// @param deviceContext not used in the cpu evaluator + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + CpuEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 fvarChannel face-varying channel + /// + /// @param instance not used in the cpu evaluator + /// + /// @param deviceContext not used in the cpu evaluator + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + CpuEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + /// ---------------------------------------------------------------------- /// /// Other methods diff --git a/opensubdiv/osd/cpuKernel.cpp b/opensubdiv/osd/cpuKernel.cpp index 4bd0cec5..a89d4f80 100644 --- a/opensubdiv/osd/cpuKernel.cpp +++ b/opensubdiv/osd/cpuKernel.cpp @@ -169,6 +169,76 @@ CpuEvalStencils(float const * src, BufferDescriptor const &srcDesc, } } +void +CpuEvalStencils(float const * src, BufferDescriptor const &srcDesc, + float * dst, BufferDescriptor const &dstDesc, + float * dstDu, BufferDescriptor const &dstDuDesc, + float * dstDv, BufferDescriptor const &dstDvDesc, + float * dstDuu, BufferDescriptor const &dstDuuDesc, + float * dstDuv, BufferDescriptor const &dstDuvDesc, + float * dstDvv, BufferDescriptor const &dstDvvDesc, + int const * sizes, + int const * offsets, + int const * indices, + float const * weights, + float const * duWeights, + float const * dvWeights, + float const * duuWeights, + float const * duvWeights, + float const * dvvWeights, + int start, int end) { + if (start > 0) { + sizes += start; + indices += offsets[start]; + weights += offsets[start]; + duWeights += offsets[start]; + dvWeights += offsets[start]; + duuWeights += offsets[start]; + duvWeights += offsets[start]; + dvvWeights += offsets[start]; + } + + src += srcDesc.offset; + dst += dstDesc.offset; + dstDu += dstDuDesc.offset; + dstDv += dstDvDesc.offset; + dstDuu += dstDuuDesc.offset; + dstDuv += dstDuvDesc.offset; + dstDvv += dstDvvDesc.offset; + + int nOutLength = dstDesc.length + dstDuDesc.length + dstDvDesc.length + + dstDuuDesc.length + dstDuvDesc.length + dstDvvDesc.length; + float * result = (float*)alloca(nOutLength * sizeof(float)); + float * resultDu = result + dstDesc.length; + float * resultDv = resultDu + dstDuDesc.length; + float * resultDuu = resultDv + dstDuuDesc.length; + float * resultDuv = resultDuu + dstDuvDesc.length; + float * resultDvv = resultDuv + dstDvvDesc.length; + + int nStencils = end - start; + for (int i = 0; i < nStencils; ++i, ++sizes) { + + // clear + memset(result, 0, nOutLength * sizeof(float)); + + for (int j=0; j<*sizes; ++j) { + addWithWeight(result, src, *indices, *weights++, srcDesc); + addWithWeight(resultDu, src, *indices, *duWeights++, srcDesc); + addWithWeight(resultDv, src, *indices, *dvWeights++, srcDesc); + addWithWeight(resultDuu, src, *indices, *duuWeights++, srcDesc); + addWithWeight(resultDuv, src, *indices, *duvWeights++, srcDesc); + addWithWeight(resultDvv, src, *indices, *dvvWeights++, srcDesc); + ++indices; + } + copy(dst, i, result, dstDesc); + copy(dstDu, i, resultDu, dstDuDesc); + copy(dstDv, i, resultDv, dstDvDesc); + copy(dstDuu, i, resultDuu, dstDuuDesc); + copy(dstDuv, i, resultDuu, dstDuvDesc); + copy(dstDvv, i, resultDvv, dstDvvDesc); + } +} + } // end namespace Osd } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/osd/cpuKernel.h b/opensubdiv/osd/cpuKernel.h index aa9f3e41..239f04c6 100644 --- a/opensubdiv/osd/cpuKernel.h +++ b/opensubdiv/osd/cpuKernel.h @@ -57,6 +57,25 @@ CpuEvalStencils(float const * src, BufferDescriptor const &srcDesc, float const * dvWeights, int start, int end); +void +CpuEvalStencils(float const * src, BufferDescriptor const &srcDesc, + float * dst, BufferDescriptor const &dstDesc, + float * dstDu, BufferDescriptor const &dstDuDesc, + float * dstDv, BufferDescriptor const &dstDvDesc, + float * dstDuu, BufferDescriptor const &dstDuuDesc, + float * dstDuv, BufferDescriptor const &dstDuvDesc, + float * dstDvv, BufferDescriptor const &dstDvvDesc, + int const * sizes, + int const * offsets, + int const * indices, + float const * weights, + float const * duWeights, + float const * dvWeights, + float const * duuWeights, + float const * duvWeights, + float const * dvvWeights, + int start, int end); + // // SIMD ICC optimization of the stencil kernel // diff --git a/opensubdiv/osd/cudaEvaluator.cpp b/opensubdiv/osd/cudaEvaluator.cpp index 371d8b92..57b3f915 100644 --- a/opensubdiv/osd/cudaEvaluator.cpp +++ b/opensubdiv/osd/cudaEvaluator.cpp @@ -53,9 +53,12 @@ extern "C" { const void *patchParams); void CudaEvalPatchesWithDerivatives( - const float *src, float *dst, float *du, float *dv, - int length, - int srcStride, int dstStride, int dvStride, int duStride, + const float *src, float *dst, + float *du, float *dv, + float *duu, float *duv, float *dvv, + int length, int srcStride, int dstStride, + int duStride, int dvStride, + int duuStride, int duvStride, int dvvStride, int numPatchCoords, const void *patchCoords, const void *patchArrays, @@ -71,6 +74,10 @@ namespace Osd { template void * createCudaBuffer(std::vector const & src) { + if (src.empty()) { + return NULL; + } + void * devicePtr = 0; size_t size = src.size()*sizeof(T); @@ -98,9 +105,11 @@ CudaStencilTable::CudaStencilTable(Far::StencilTable const *stencilTable) { _indices = createCudaBuffer(stencilTable->GetControlIndices()); _weights = createCudaBuffer(stencilTable->GetWeights()); _duWeights = _dvWeights = NULL; + _duuWeights = _duvWeights = _dvvWeights = NULL; } else { _sizes = _offsets = _indices = _weights = NULL; _duWeights = _dvWeights = NULL; + _duuWeights = _duvWeights = _dvvWeights = NULL; } } @@ -113,9 +122,13 @@ CudaStencilTable::CudaStencilTable(Far::LimitStencilTable const *limitStencilTab _weights = createCudaBuffer(limitStencilTable->GetWeights()); _duWeights = createCudaBuffer(limitStencilTable->GetDuWeights()); _dvWeights = createCudaBuffer(limitStencilTable->GetDvWeights()); + _duuWeights = createCudaBuffer(limitStencilTable->GetDuuWeights()); + _duvWeights = createCudaBuffer(limitStencilTable->GetDuvWeights()); + _dvvWeights = createCudaBuffer(limitStencilTable->GetDvvWeights()); } else { _sizes = _offsets = _indices = _weights = NULL; _duWeights = _dvWeights = NULL; + _duuWeights = _duvWeights = _dvvWeights = NULL; } } @@ -126,6 +139,9 @@ CudaStencilTable::~CudaStencilTable() { if (_weights) cudaFree(_weights); if (_duWeights) cudaFree(_duWeights); if (_dvWeights) cudaFree(_dvWeights); + if (_duuWeights) cudaFree(_duuWeights); + if (_duvWeights) cudaFree(_duvWeights); + if (_dvvWeights) cudaFree(_dvvWeights); } // --------------------------------------------------------------------------- @@ -197,6 +213,84 @@ CudaEvaluator::EvalStencils(const float *src, BufferDescriptor const &srcDesc, return true; } +/* static */ +bool +CudaEvaluator::EvalStencils(const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + int start, + int end) { + // PERFORMANCE: need to combine 3 launches together + if (dst) { + CudaEvalStencils(src + srcDesc.offset, + dst + dstDesc.offset, + srcDesc.length, + srcDesc.stride, + dstDesc.stride, + sizes, offsets, indices, weights, + start, end); + } + if (du) { + CudaEvalStencils(src + srcDesc.offset, + du + duDesc.offset, + srcDesc.length, + srcDesc.stride, + duDesc.stride, + sizes, offsets, indices, duWeights, + start, end); + } + if (dv) { + CudaEvalStencils(src + srcDesc.offset, + dv + dvDesc.offset, + srcDesc.length, + srcDesc.stride, + dvDesc.stride, + sizes, offsets, indices, dvWeights, + start, end); + } + if (duu) { + CudaEvalStencils(src + srcDesc.offset, + duu + duuDesc.offset, + srcDesc.length, + srcDesc.stride, + duuDesc.stride, + sizes, offsets, indices, duuWeights, + start, end); + } + if (duv) { + CudaEvalStencils(src + srcDesc.offset, + duv + duvDesc.offset, + srcDesc.length, + srcDesc.stride, + duvDesc.stride, + sizes, offsets, indices, duvWeights, + start, end); + } + if (dvv) { + CudaEvalStencils(src + srcDesc.offset, + dvv + dvvDesc.offset, + srcDesc.length, + srcDesc.stride, + dvvDesc.stride, + sizes, offsets, indices, dvvWeights, + start, end); + } + return true; +} + /* static */ bool CudaEvaluator::EvalPatches(const float *src, @@ -237,9 +331,42 @@ CudaEvaluator::EvalPatches( if (dv) dv += dvDesc.offset; CudaEvalPatchesWithDerivatives( - src, dst, du, dv, - srcDesc.length, srcDesc.stride, - dstDesc.stride, duDesc.stride, dvDesc.stride, + src, dst, du, dv, NULL, NULL, NULL, + srcDesc.length, srcDesc.stride, dstDesc.stride, + duDesc.stride, dvDesc.stride, 0, 0, 0, + numPatchCoords, patchCoords, patchArrays, patchIndices, patchParams); + return true; +} + +/* static */ +bool +CudaEvaluator::EvalPatches( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrays, + const int *patchIndices, + const PatchParam *patchParams) { + + if (src) src += srcDesc.offset; + if (dst) dst += dstDesc.offset; + if (du) du += duDesc.offset; + if (dv) dv += dvDesc.offset; + if (duu) duu += duuDesc.offset; + if (duv) duv += duvDesc.offset; + if (dvv) dvv += dvvDesc.offset; + + CudaEvalPatchesWithDerivatives( + src, dst, du, dv, duu, duv, dvv, + srcDesc.length, srcDesc.stride, dstDesc.stride, + duDesc.stride, dvDesc.stride, + duuDesc.stride, duvDesc.stride, dvvDesc.stride, numPatchCoords, patchCoords, patchArrays, patchIndices, patchParams); return true; } diff --git a/opensubdiv/osd/cudaEvaluator.h b/opensubdiv/osd/cudaEvaluator.h index c2463fc7..bc09119f 100644 --- a/opensubdiv/osd/cudaEvaluator.h +++ b/opensubdiv/osd/cudaEvaluator.h @@ -73,6 +73,9 @@ public: void *GetWeightsBuffer() const { return _weights; } void *GetDuWeightsBuffer() const { return _duWeights; } void *GetDvWeightsBuffer() const { return _dvWeights; } + void *GetDuuWeightsBuffer() const { return _duuWeights; } + void *GetDuvWeightsBuffer() const { return _duvWeights; } + void *GetDvvWeightsBuffer() const { return _dvvWeights; } int GetNumStencils() const { return _numStencils; } private: @@ -81,7 +84,10 @@ private: * _indices, * _weights, * _duWeights, - * _dvWeights; + * _dvWeights, + * _duuWeights, + * _duvWeights, + * _dvvWeights; int _numStencils; }; @@ -288,6 +294,177 @@ public: const float * dvWeights, 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 BindCudaBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. + /// + /// @param instance not used in the cuda kernel + /// (declared as a typed pointer to prevent + /// undesirable template resolution) + /// + /// @param deviceContext not used in the cuda 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + const CudaEvaluator *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalStencils(srcBuffer->BindCudaBuffer(), srcDesc, + dstBuffer->BindCudaBuffer(), dstDesc, + duBuffer->BindCudaBuffer(), duDesc, + dvBuffer->BindCudaBuffer(), dvDesc, + duuBuffer->BindCudaBuffer(), duuDesc, + duvBuffer->BindCudaBuffer(), duvDesc, + dvvBuffer->BindCudaBuffer(), dvvDesc, + (int const *)stencilTable->GetSizesBuffer(), + (int const *)stencilTable->GetOffsetsBuffer(), + (int const *)stencilTable->GetIndicesBuffer(), + (float const *)stencilTable->GetWeightsBuffer(), + (float const *)stencilTable->GetDuWeightsBuffer(), + (float const *)stencilTable->GetDvWeightsBuffer(), + (float const *)stencilTable->GetDuuWeightsBuffer(), + (float const *)stencilTable->GetDuvWeightsBuffer(), + (float const *)stencilTable->GetDvvWeightsBuffer(), + /*start = */ 0, + /*end = */ stencilTable->GetNumStencils()); + } + + /// \brief Static eval stencils function with derivatives, which takes + /// raw cuda 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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 duuWeights pointer to the duu-weights buffer of the stencil table + /// + /// @param duvWeights pointer to the duv-weights buffer of the stencil table + /// + /// @param dvvWeights pointer to the dvv-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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + int start, int end); + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -396,8 +573,8 @@ public: CudaEvaluator const *instance, void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused + (void)instance; // unused + (void)deviceContext; // unused return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, dstBuffer->BindCudaBuffer(), dstDesc, @@ -410,6 +587,95 @@ public: (const PatchParam *)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 BindCudaBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchTable CudaPatchTable or equivalent + /// + /// @param instance not used in the cuda evaluator + /// + /// @param deviceContext not used in the cuda 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + CudaEvaluator const *instance, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, + dstBuffer->BindCudaBuffer(), dstDesc, + duBuffer->BindCudaBuffer(), duDesc, + dvBuffer->BindCudaBuffer(), dvDesc, + duuBuffer->BindCudaBuffer(), duuDesc, + duvBuffer->BindCudaBuffer(), duvDesc, + dvvBuffer->BindCudaBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord *)patchCoords->BindCudaBuffer(), + (const PatchArray *)patchTable->GetPatchArrayBuffer(), + (const int *)patchTable->GetPatchIndexBuffer(), + (const PatchParam *)patchTable->GetPatchParamBuffer()); + } + /// \brief Static limit eval function. It takes an array of PatchCoord /// and evaluate limit values on given PatchTable. /// @@ -489,10 +755,76 @@ public: float *du, BufferDescriptor const &duDesc, float *dv, BufferDescriptor const &dvDesc, int numPatchCoords, - const PatchCoord *patchCoords, - const PatchArray *patchArrays, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, const int *patchIndices, - const PatchParam *patchParams); + PatchParam const *patchParams); + + /// \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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 patchIndices an array of patch indices + /// indexed by PatchCoord::vertIndex + /// + /// @param patchParams 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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, + const int *patchIndices, + PatchParam const *patchParams); /// \brief Generic limit eval function. This function has a same /// signature as other device kernels have so that it can be called @@ -533,8 +865,8 @@ public: CudaEvaluator const *instance, void * deviceContext = NULL) { - (void)instance; // unused - (void)deviceContext; // unused + (void)instance; // unused + (void)deviceContext; // unused return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, dstBuffer->BindCudaBuffer(), dstDesc, @@ -545,6 +877,164 @@ public: (const PatchParam *)patchTable->GetPatchParamBuffer()); } + /// \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 BindCudaBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCudaBuffer() 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. + /// must have BindCudaBuffer() method returning an + /// array of PatchCoord struct in cuda memory. + /// + /// @param patchTable CudaPatchTable or equivalent + /// + /// @param instance not used in the cuda evaluator + /// + /// @param deviceContext not used in the cuda evaluator + /// + template + static bool EvalPatchesVarying( + 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, + CudaEvaluator const *instance, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, + dstBuffer->BindCudaBuffer(), dstDesc, + duBuffer->BindCudaBuffer(), duDesc, + dvBuffer->BindCudaBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord *)patchCoords->BindCudaBuffer(), + (const PatchArray *)patchTable->GetVaryingPatchArrayBuffer(), + (const int *)patchTable->GetVaryingPatchIndexBuffer(), + (const PatchParam *)patchTable->GetPatchParamBuffer()); + } + + /// \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 BindCudaBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCudaBuffer() method returning an + /// array of PatchCoord struct in cuda memory. + /// + /// @param patchTable CudaPatchTable or equivalent + /// + /// @param instance not used in the cuda evaluator + /// + /// @param deviceContext not used in the cuda evaluator + /// + template + static bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + CudaEvaluator const *instance, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, + dstBuffer->BindCudaBuffer(), dstDesc, + duBuffer->BindCudaBuffer(), duDesc, + dvBuffer->BindCudaBuffer(), dvDesc, + duuBuffer->BindCudaBuffer(), duuDesc, + duvBuffer->BindCudaBuffer(), duvDesc, + dvvBuffer->BindCudaBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord *)patchCoords->BindCudaBuffer(), + (const PatchArray *)patchTable->GetVaryingPatchArrayBuffer(), + (const int *)patchTable->GetVaryingPatchIndexBuffer(), + (const PatchParam *)patchTable->GetPatchParamBuffer()); + } + /// \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. @@ -587,11 +1077,175 @@ public: CudaEvaluator const *instance, void * deviceContext = NULL) { + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, + dstBuffer->BindCudaBuffer(), dstDesc, + numPatchCoords, + (const PatchCoord *)patchCoords->BindCudaBuffer(), + (const PatchArray *)patchTable->GetFVarPatchArrayBuffer(fvarChannel), + (const int *)patchTable->GetFVarPatchIndexBuffer(fvarChannel), + (const PatchParam *)patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + + /// \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 BindCudaBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCudaBuffer() 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. + /// must have BindCudaBuffer() method returning an + /// array of PatchCoord struct in cuda memory. + /// + /// @param patchTable CudaPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance not used in the cuda evaluator + /// + /// @param deviceContext not used in the cuda evaluator + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + CudaEvaluator const *instance, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, + dstBuffer->BindCudaBuffer(), dstDesc, + duBuffer->BindCudaBuffer(), duDesc, + dvBuffer->BindCudaBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord *)patchCoords->BindCudaBuffer(), + (const PatchArray *)patchTable->GetFVarPatchArrayBuffer(fvarChannel), + (const int *)patchTable->GetFVarPatchIndexBuffer(fvarChannel), + (const PatchParam *)patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + + /// \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 BindCudaBuffer() method returning a + /// const float pointer for read + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCudaBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindCudaBuffer() method returning an + /// array of PatchCoord struct in cuda memory. + /// + /// @param patchTable CudaPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance not used in the cuda evaluator + /// + /// @param deviceContext not used in the cuda evaluator + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + CudaEvaluator const *instance, + void * deviceContext = NULL) { + (void)instance; // unused (void)deviceContext; // unused return EvalPatches(srcBuffer->BindCudaBuffer(), srcDesc, dstBuffer->BindCudaBuffer(), dstDesc, + duBuffer->BindCudaBuffer(), duDesc, + dvBuffer->BindCudaBuffer(), dvDesc, + duuBuffer->BindCudaBuffer(), duuDesc, + duvBuffer->BindCudaBuffer(), duvDesc, + dvvBuffer->BindCudaBuffer(), dvvDesc, numPatchCoords, (const PatchCoord *)patchCoords->BindCudaBuffer(), (const PatchArray *)patchTable->GetFVarPatchArrayBuffer(fvarChannel), diff --git a/opensubdiv/osd/cudaKernel.cu b/opensubdiv/osd/cudaKernel.cu index 7d5b155f..4c95db6f 100644 --- a/opensubdiv/osd/cudaKernel.cu +++ b/opensubdiv/osd/cudaKernel.cu @@ -305,8 +305,12 @@ int getNumControlVertices(int patchType) { } __global__ void -computePatches(const float *src, float *dst, float *dstDu, float *dstDv, - int length, int srcStride, int dstStride, int dstDuStride, int dstDvStride, +computePatches(const float *src, float *dst, + float *dstDu, float *dstDv, + float *dstDuu, float *dstDuv, float *dstDvv, + int length, int srcStride, int dstStride, + int dstDuStride, int dstDvStride, + int dstDuuStride, int dstDuvStride, int dstDvvStride, int numPatchCoords, const PatchCoord *patchCoords, const PatchArray *patchArrayBuffer, const int *patchIndexBuffer, @@ -376,6 +380,30 @@ computePatches(const float *src, float *dst, float *dstDu, float *dstDv, addWithWeight(d, srcVert, wDt[j], length); } } + if (dstDuu) { + float *d = dstDuu + i * dstDuuStride; + clear(d, length); + for (int j = 0; j < numControlVertices; ++j) { + const float * srcVert = src + cvs[j] * srcStride; + addWithWeight(d, srcVert, wDss[j], length); + } + } + if (dstDuv) { + float *d = dstDuv + i * dstDuvStride; + clear(d, length); + for (int j = 0; j < numControlVertices; ++j) { + const float * srcVert = src + cvs[j] * srcStride; + addWithWeight(d, srcVert, wDst[j], length); + } + } + if (dstDvv) { + float *d = dstDvv + i * dstDvvStride; + clear(d, length); + for (int j = 0; j < numControlVertices; ++j) { + const float * srcVert = src + cvs[j] * srcStride; + addWithWeight(d, srcVert, wDtt[j], length); + } + } } } @@ -447,14 +475,19 @@ void CudaEvalPatches( // PERFORMANCE: not optimized at all computePatches <<<512, 32>>>( - src, dst, NULL, NULL, length, srcStride, dstStride, 0, 0, + src, dst, NULL, NULL, NULL, NULL, NULL, + length, srcStride, dstStride, 0, 0, 0, 0, 0, numPatchCoords, patchCoords, patchArrayBuffer, patchIndexBuffer, patchParamBuffer); } void CudaEvalPatchesWithDerivatives( - const float *src, float *dst, float *dstDu, float *dstDv, - int length, int srcStride, int dstStride, int dstDuStride, int dstDvStride, + const float *src, float *dst, + float *dstDu, float *dstDv, + float *dstDuu, float *dstDuv, float *dstDvv, + int length, int srcStride, int dstStride, + int dstDuStride, int dstDvStride, + int dstDuuStride, int dstDuvStride, int dstDvvStride, int numPatchCoords, const PatchCoord *patchCoords, const PatchArray *patchArrayBuffer, const int *patchIndexBuffer, @@ -463,7 +496,9 @@ void CudaEvalPatchesWithDerivatives( // PERFORMANCE: not optimized at all computePatches <<<512, 32>>>( - src, dst, dstDu, dstDv, length, srcStride, dstStride, dstDuStride, dstDvStride, + src, dst, dstDu, dstDv, dstDuu, dstDuv, dstDvv, + length, srcStride, dstStride, + dstDuStride, dstDvStride, dstDuuStride, dstDuvStride, dstDvvStride, numPatchCoords, patchCoords, patchArrayBuffer, patchIndexBuffer, patchParamBuffer); } diff --git a/opensubdiv/osd/d3d11ComputeEvaluator.cpp b/opensubdiv/osd/d3d11ComputeEvaluator.cpp index eb1a09d1..d881ce1d 100644 --- a/opensubdiv/osd/d3d11ComputeEvaluator.cpp +++ b/opensubdiv/osd/d3d11ComputeEvaluator.cpp @@ -172,6 +172,22 @@ D3D11ComputeEvaluator::Create(BufferDescriptor const &srcDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, ID3D11DeviceContext *deviceContext) { + return Create(srcDesc, dstDesc, duDesc, dvDesc, + BufferDescriptor(), + BufferDescriptor(), + BufferDescriptor(), + deviceContext); +} + +D3D11ComputeEvaluator * +D3D11ComputeEvaluator::Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + ID3D11DeviceContext *deviceContext) { (void)deviceContext; // not used // TODO: implements derivatives diff --git a/opensubdiv/osd/d3d11ComputeEvaluator.h b/opensubdiv/osd/d3d11ComputeEvaluator.h index 8fd4b1dd..e9290fab 100644 --- a/opensubdiv/osd/d3d11ComputeEvaluator.h +++ b/opensubdiv/osd/d3d11ComputeEvaluator.h @@ -102,6 +102,15 @@ public: BufferDescriptor const &dvDesc, ID3D11DeviceContext *deviceContext); + static D3D11ComputeEvaluator * Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + ID3D11DeviceContext *deviceContext); + /// Constructor. D3D11ComputeEvaluator(); diff --git a/opensubdiv/osd/glComputeEvaluator.cpp b/opensubdiv/osd/glComputeEvaluator.cpp index 633db1c1..76633e3b 100644 --- a/opensubdiv/osd/glComputeEvaluator.cpp +++ b/opensubdiv/osd/glComputeEvaluator.cpp @@ -44,6 +44,10 @@ static const char *shaderSource = template GLuint createSSBO(std::vector const & src) { + if (src.empty()) { + return 0; + } + GLuint devicePtr = 0; glGenBuffers(1, &devicePtr); @@ -75,9 +79,11 @@ GLStencilTableSSBO::GLStencilTableSSBO( _indices = createSSBO(stencilTable->GetControlIndices()); _weights = createSSBO(stencilTable->GetWeights()); _duWeights = _dvWeights = 0; + _duuWeights = _duvWeights = _dvvWeights = 0; } else { _sizes = _offsets = _indices = _weights = 0; _duWeights = _dvWeights = 0; + _duuWeights = _duvWeights = _dvvWeights = 0; } } @@ -91,9 +97,13 @@ GLStencilTableSSBO::GLStencilTableSSBO( _weights = createSSBO(limitStencilTable->GetWeights()); _duWeights = createSSBO(limitStencilTable->GetDuWeights()); _dvWeights = createSSBO(limitStencilTable->GetDvWeights()); + _duuWeights = createSSBO(limitStencilTable->GetDuuWeights()); + _duvWeights = createSSBO(limitStencilTable->GetDuvWeights()); + _dvvWeights = createSSBO(limitStencilTable->GetDvvWeights()); } else { _sizes = _offsets = _indices = _weights = 0; _duWeights = _dvWeights = 0; + _duuWeights = _duvWeights = _dvvWeights = 0; } } @@ -104,6 +114,9 @@ GLStencilTableSSBO::~GLStencilTableSSBO() { if (_weights) glDeleteBuffers(1, &_weights); if (_duWeights) glDeleteBuffers(1, &_duWeights); if (_dvWeights) glDeleteBuffers(1, &_dvWeights); + if (_duuWeights) glDeleteBuffers(1, &_duuWeights); + if (_duvWeights) glDeleteBuffers(1, &_duvWeights); + if (_dvvWeights) glDeleteBuffers(1, &_dvvWeights); } // --------------------------------------------------------------------------- @@ -120,8 +133,11 @@ GLComputeEvaluator::~GLComputeEvaluator() { static GLuint compileKernel(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, - BufferDescriptor const & /* duDesc */, - BufferDescriptor const & /* dvDesc */, + BufferDescriptor const & duDesc, + BufferDescriptor const & dvDesc, + BufferDescriptor const & duuDesc, + BufferDescriptor const & duvDesc, + BufferDescriptor const & dvvDesc, const char *kernelDefine, int workGroupSize) { GLuint program = glCreateProgram(); @@ -139,6 +155,16 @@ compileKernel(BufferDescriptor const &srcDesc, << "#define WORK_GROUP_SIZE " << workGroupSize << "\n" << kernelDefine << "\n" << patchBasisShaderSourceDefine << "\n"; + + bool deriv1 = (duDesc.length > 0 || dvDesc.length > 0); + bool deriv2 = (duuDesc.length > 0 || duvDesc.length > 0 || dvvDesc.length > 0); + if (deriv1) { + defines << "#define OPENSUBDIV_GLSL_COMPUTE_USE_1ST_DERIVATIVES\n"; + } + if (deriv2) { + defines << "#define OPENSUBDIV_GLSL_COMPUTE_USE_2ND_DERIVATIVES\n"; + } + std::string defineStr = defines.str(); const char *shaderSources[4] = {"#version 430\n", 0, 0, 0}; @@ -175,16 +201,23 @@ bool GLComputeEvaluator::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc) { + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc) { // create a stencil kernel - if (!_stencilKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc, + if (!_stencilKernel.Compile(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, _workGroupSize)) { return false; } // create a patch kernel - if (!_patchKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc, + if (!_patchKernel.Compile(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, _workGroupSize)) { return false; } @@ -214,6 +247,40 @@ GLComputeEvaluator::EvalStencils( GLuint dvWeightsBuffer, int start, int end) const { + return EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + 0, BufferDescriptor(), + 0, BufferDescriptor(), + 0, BufferDescriptor(), + sizesBuffer, offsetsBuffer, indicesBuffer, + weightsBuffer, + duWeightsBuffer, dvWeightsBuffer, + 0, 0, 0, + start, end); +} + +bool +GLComputeEvaluator::EvalStencils( + GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + GLuint sizesBuffer, + GLuint offsetsBuffer, + GLuint indicesBuffer, + GLuint weightsBuffer, + GLuint duWeightsBuffer, + GLuint dvWeightsBuffer, + GLuint duuWeightsBuffer, + GLuint duvWeightsBuffer, + GLuint dvvWeightsBuffer, + int start, int end) const { + if (!_stencilKernel.program) return false; int count = end - start; if (count <= 0) { @@ -224,6 +291,9 @@ GLComputeEvaluator::EvalStencils( glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, dstBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, duBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, dvBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, duuBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, duvBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 12, dvvBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, sizesBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, offsetsBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 6, indicesBuffer); @@ -232,6 +302,12 @@ GLComputeEvaluator::EvalStencils( glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 8, duWeightsBuffer); if (dvWeightsBuffer) glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 9, dvWeightsBuffer); + if (duuWeightsBuffer) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 13, duuWeightsBuffer); + if (duvWeightsBuffer) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 14, duvWeightsBuffer); + if (dvvWeightsBuffer) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 15, dvvWeightsBuffer); glUseProgram(_stencilKernel.program); @@ -247,13 +323,25 @@ GLComputeEvaluator::EvalStencils( glUniform3i(_stencilKernel.uniformDvDesc, dvDesc.offset, dvDesc.length, dvDesc.stride); } + if (_stencilKernel.uniformDuuDesc > 0) { + glUniform3i(_stencilKernel.uniformDuuDesc, + duuDesc.offset, duuDesc.length, duuDesc.stride); + } + if (_stencilKernel.uniformDuvDesc > 0) { + glUniform3i(_stencilKernel.uniformDuvDesc, + duvDesc.offset, duvDesc.length, duvDesc.stride); + } + if (_stencilKernel.uniformDvvDesc > 0) { + glUniform3i(_stencilKernel.uniformDvvDesc, + dvvDesc.offset, dvvDesc.length, dvvDesc.stride); + } glDispatchCompute((count + _workGroupSize - 1) / _workGroupSize, 1, 1); glUseProgram(0); glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT); - for (int i = 0; i < 10; ++i) { + for (int i = 0; i < 16; ++i) { glBindBufferBase(GL_SHADER_STORAGE_BUFFER, i, 0); } @@ -272,12 +360,44 @@ GLComputeEvaluator::EvalPatches( GLuint patchIndexBuffer, GLuint patchParamsBuffer) const { + return EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + 0, BufferDescriptor(), + 0, BufferDescriptor(), + 0, BufferDescriptor(), + numPatchCoords, + patchCoordsBuffer, + patchArrays, + patchIndexBuffer, + patchParamsBuffer); +} + +bool +GLComputeEvaluator::EvalPatches( + GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + GLuint patchCoordsBuffer, + const PatchArrayVector &patchArrays, + GLuint patchIndexBuffer, + GLuint patchParamsBuffer) const { + if (!_patchKernel.program) return false; glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, srcBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, dstBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, duBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, dvBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, duuBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, duvBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 12, dvvBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, patchCoordsBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, patchIndexBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 6, patchParamsBuffer); @@ -288,8 +408,27 @@ GLComputeEvaluator::EvalPatches( glUniform1i(_patchKernel.uniformDstOffset, dstDesc.offset); glUniform4iv(_patchKernel.uniformPatchArray, (int)patchArrays.size(), (const GLint*)&patchArrays[0]); - glUniform3i(_patchKernel.uniformDuDesc, duDesc.offset, duDesc.length, duDesc.stride); - glUniform3i(_patchKernel.uniformDvDesc, dvDesc.offset, dvDesc.length, dvDesc.stride); + + if (_patchKernel.uniformDuDesc > 0) { + glUniform3i(_patchKernel.uniformDuDesc, + duDesc.offset, duDesc.length, duDesc.stride); + } + if (_patchKernel.uniformDvDesc > 0) { + glUniform3i(_patchKernel.uniformDvDesc, + dvDesc.offset, dvDesc.length, dvDesc.stride); + } + if (_patchKernel.uniformDuuDesc > 0) { + glUniform3i(_patchKernel.uniformDuuDesc, + duuDesc.offset, duuDesc.length, duuDesc.stride); + } + if (_patchKernel.uniformDuvDesc > 0) { + glUniform3i(_patchKernel.uniformDuvDesc, + duvDesc.offset, duvDesc.length, duvDesc.stride); + } + if (_patchKernel.uniformDvvDesc > 0) { + glUniform3i(_patchKernel.uniformDvvDesc, + dvvDesc.offset, dvvDesc.length, dvvDesc.stride); + } glDispatchCompute((numPatchCoords + _workGroupSize - 1) / _workGroupSize, 1, 1); @@ -303,6 +442,10 @@ GLComputeEvaluator::EvalPatches( glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, 0); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 6, 0); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, 0); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, 0); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 12, 0); + return true; } // --------------------------------------------------------------------------- @@ -320,20 +463,21 @@ GLComputeEvaluator::_StencilKernel::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, int workGroupSize) { // create stencil kernel if (program) { glDeleteProgram(program); } - bool derivatives = (duDesc.length > 0 || dvDesc.length > 0); - const char *kernelDef = derivatives - ? "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_STENCILS\n" - "#define OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES\n" - : "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_STENCILS\n"; + const char * kernelDefine = + "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_STENCILS\n"; - program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, kernelDef, - workGroupSize); + program = compileKernel(srcDesc, dstDesc, + duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, + kernelDefine, workGroupSize); if (program == 0) return false; // cache uniform locations (TODO: use uniform block) @@ -343,6 +487,9 @@ GLComputeEvaluator::_StencilKernel::Compile(BufferDescriptor const &srcDesc, uniformDstOffset = glGetUniformLocation(program, "dstOffset"); uniformDuDesc = glGetUniformLocation(program, "duDesc"); uniformDvDesc = glGetUniformLocation(program, "dvDesc"); + uniformDuuDesc = glGetUniformLocation(program, "duuDesc"); + uniformDuvDesc = glGetUniformLocation(program, "duvDesc"); + uniformDvvDesc = glGetUniformLocation(program, "dvvDesc"); return true; } @@ -362,20 +509,21 @@ GLComputeEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, int workGroupSize) { // create stencil kernel if (program) { glDeleteProgram(program); } - bool derivatives = (duDesc.length > 0 || dvDesc.length > 0); - const char *kernelDef = derivatives - ? "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_PATCHES\n" - "#define OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES\n" - : "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_PATCHES\n"; + const char * kernelDefine = + "#define OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_PATCHES\n"; - program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, kernelDef, - workGroupSize); + program = compileKernel(srcDesc, dstDesc, + duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, + kernelDefine, workGroupSize); if (program == 0) return false; // cache uniform locations @@ -384,6 +532,9 @@ GLComputeEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, uniformPatchArray = glGetUniformLocation(program, "patchArray"); uniformDuDesc = glGetUniformLocation(program, "duDesc"); uniformDvDesc = glGetUniformLocation(program, "dvDesc"); + uniformDuuDesc = glGetUniformLocation(program, "duuDesc"); + uniformDuvDesc = glGetUniformLocation(program, "duvDesc"); + uniformDvvDesc = glGetUniformLocation(program, "dvvDesc"); return true; } diff --git a/opensubdiv/osd/glComputeEvaluator.h b/opensubdiv/osd/glComputeEvaluator.h index 74895496..a98fe437 100644 --- a/opensubdiv/osd/glComputeEvaluator.h +++ b/opensubdiv/osd/glComputeEvaluator.h @@ -73,6 +73,9 @@ public: GLuint GetWeightsBuffer() const { return _weights; } GLuint GetDuWeightsBuffer() const { return _duWeights; } GLuint GetDvWeightsBuffer() const { return _dvWeights; } + GLuint GetDuuWeightsBuffer() const { return _duuWeights; } + GLuint GetDuvWeightsBuffer() const { return _duvWeights; } + GLuint GetDvvWeightsBuffer() const { return _dvvWeights; } int GetNumStencils() const { return _numStencils; } private: @@ -82,6 +85,9 @@ private: GLuint _weights; GLuint _duWeights; GLuint _dvWeights; + GLuint _duuWeights; + GLuint _duvWeights; + GLuint _dvvWeights; int _numStencils; }; @@ -95,9 +101,25 @@ public: BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, void * deviceContext = NULL) { + return Create(srcDesc, dstDesc, duDesc, dvDesc, + BufferDescriptor(), + BufferDescriptor(), + BufferDescriptor(), + deviceContext); + } + + static GLComputeEvaluator * Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + void * deviceContext = NULL) { (void)deviceContext; // not used GLComputeEvaluator *instance = new GLComputeEvaluator(); - if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc)) + if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc)) return instance; delete instance; return NULL; @@ -243,6 +265,106 @@ public: } } + /// \brief Generic static stencil function. This function has a same + /// signature as other device kernels have so that it can be called + /// transparently from OsdMesh template interface. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLSL 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + GLComputeEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + stencilTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + stencilTable); + delete instance; + return r; + } + return false; + } + } + /// \brief Generic stencil function. /// /// @param srcBuffer Input primvar buffer. @@ -329,6 +451,83 @@ public: /* end = */ stencilTable->GetNumStencils()); } + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// SSBO interfaces. + /// + template + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable) const { + return EvalStencils(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + stencilTable->GetSizesBuffer(), + stencilTable->GetOffsetsBuffer(), + stencilTable->GetIndicesBuffer(), + stencilTable->GetWeightsBuffer(), + stencilTable->GetDuWeightsBuffer(), + stencilTable->GetDvWeightsBuffer(), + stencilTable->GetDuuWeightsBuffer(), + stencilTable->GetDuvWeightsBuffer(), + stencilTable->GetDvvWeightsBuffer(), + /* start = */ 0, + /* end = */ stencilTable->GetNumStencils()); + } + /// \brief Dispatch the GLSL compute kernel on GPU asynchronously /// returns false if the kernel hasn't been compiled yet. /// @@ -377,6 +576,78 @@ public: int start, int end) const; + /// \brief Dispatch the GLSL compute kernel on GPU asynchronously + /// returns false if the kernel hasn't been compiled yet. + /// + /// @param srcBuffer GL buffer of input primvar source data + /// + /// @param srcDesc vertex buffer descriptor for the srcBuffer + /// + /// @param dstBuffer GL buffer of output primvar destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer GL buffer of output derivative wrt u + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer GL buffer of output derivative wrt v + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer GL buffer of output 2nd derivative wrt u + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer GL buffer of output 2nd derivative wrt u and v + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer GL buffer of output 2nd derivative wrt v + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param sizesBuffer GL buffer of the sizes in the stencil table + /// + /// @param offsetsBuffer GL buffer of the offsets in the stencil table + /// + /// @param indicesBuffer GL buffer of the indices in the stencil table + /// + /// @param weightsBuffer GL buffer of the weights in the stencil table + /// + /// @param duWeightsBuffer GL buffer of the du weights in the stencil table + /// + /// @param dvWeightsBuffer GL buffer of the dv weights in the stencil table + /// + /// @param duuWeightsBuffer GL buffer of the duu weights in the stencil table + /// + /// @param duvWeightsBuffer GL buffer of the duv weights in the stencil table + /// + /// @param dvvWeightsBuffer GL buffer of the dvv weights in the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// + bool EvalStencils(GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + GLuint sizesBuffer, + GLuint offsetsBuffer, + GLuint indicesBuffer, + GLuint weightsBuffer, + GLuint duWeightsBuffer, + GLuint dvWeightsBuffer, + GLuint duuWeightsBuffer, + GLuint duvWeightsBuffer, + GLuint dvvWeightsBuffer, + int start, + int end) const; + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -532,6 +803,117 @@ public: } } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + GLComputeEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + delete instance; + return r; + } + return false; + } + } + /// \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. @@ -632,6 +1014,86 @@ public: 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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchTable GLPatchTable or equivalent + /// + template + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetPatchArrays(), + patchTable->GetPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + bool EvalPatches(GLuint srcBuffer, BufferDescriptor const &srcDesc, GLuint dstBuffer, BufferDescriptor const &dstDesc, GLuint duBuffer, BufferDescriptor const &duDesc, @@ -642,6 +1104,19 @@ public: GLuint patchIndexBuffer, GLuint patchParamsBuffer) const; + bool EvalPatches(GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + GLuint patchCoordsBuffer, + const PatchArrayVector &patchArrays, + GLuint patchIndexBuffer, + GLuint patchParamsBuffer) const; + /// \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. @@ -754,6 +1229,344 @@ public: patchTable->GetPatchParamBuffer()); } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesVarying( + 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, + GLComputeEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc); + if (instance) { + bool r = instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + template + bool EvalPatchesVarying( + 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) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetVaryingPatchArrays(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + GLComputeEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + template + bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetVaryingPatchArrays(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + /// \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. @@ -872,6 +1685,356 @@ public: patchTable->GetFVarPatchParamBuffer(fvarChannel)); } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + GLComputeEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc); + if (instance) { + bool r = instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + template + bool EvalPatchesFaceVarying( + 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, + int fvarChannel = 0) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetFVarPatchArrays(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + GLComputeEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + template + bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel = 0) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetFVarPatchArrays(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + /// ---------------------------------------------------------------------- /// /// Other methods @@ -882,8 +2045,11 @@ public: /// calling this function. Returns false if it fails to compile the kernel. bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, - BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc); + BufferDescriptor const &duDesc = BufferDescriptor(), + BufferDescriptor const &dvDesc = BufferDescriptor(), + BufferDescriptor const &duuDesc = BufferDescriptor(), + BufferDescriptor const &duvDesc = BufferDescriptor(), + BufferDescriptor const &dvvDesc = BufferDescriptor()); /// Wait the dispatched kernel finishes. static void Synchronize(void *deviceContext); @@ -896,6 +2062,9 @@ private: BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, int workGroupSize); GLuint program; GLuint uniformStart; @@ -904,6 +2073,9 @@ private: GLuint uniformDstOffset; GLuint uniformDuDesc; GLuint uniformDvDesc; + GLuint uniformDuuDesc; + GLuint uniformDuvDesc; + GLuint uniformDvvDesc; } _stencilKernel; struct _PatchKernel { @@ -913,6 +2085,9 @@ private: BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, int workGroupSize); GLuint program; GLuint uniformSrcOffset; @@ -920,6 +2095,9 @@ private: GLuint uniformPatchArray; GLuint uniformDuDesc; GLuint uniformDvDesc; + GLuint uniformDuuDesc; + GLuint uniformDuvDesc; + GLuint uniformDvvDesc; } _patchKernel; int _workGroupSize; diff --git a/opensubdiv/osd/glXFBEvaluator.cpp b/opensubdiv/osd/glXFBEvaluator.cpp index 21cc93aa..798074c0 100644 --- a/opensubdiv/osd/glXFBEvaluator.cpp +++ b/opensubdiv/osd/glXFBEvaluator.cpp @@ -48,6 +48,10 @@ static const char *shaderSource = template GLuint createGLTextureBuffer(std::vector const & src, GLenum type) { + if (src.empty()) { + return 0; + } + GLint size = static_cast(src.size()*sizeof(T)); void const * ptr = &src.at(0); @@ -95,9 +99,11 @@ GLStencilTableTBO::GLStencilTableTBO( stencilTable->GetControlIndices(), GL_R32I); _weights = createGLTextureBuffer(stencilTable->GetWeights(), GL_R32F); _duWeights = _dvWeights = 0; + _duuWeights = _duvWeights = _dvvWeights = 0; } else { _sizes = _offsets = _indices = _weights = 0; _duWeights = _dvWeights = 0; + _duuWeights = _duvWeights = _dvvWeights = 0; } } @@ -118,9 +124,16 @@ GLStencilTableTBO::GLStencilTableTBO( limitStencilTable->GetDuWeights(), GL_R32F); _dvWeights = createGLTextureBuffer( limitStencilTable->GetDvWeights(), GL_R32F); + _duuWeights = createGLTextureBuffer( + limitStencilTable->GetDuuWeights(), GL_R32F); + _duvWeights = createGLTextureBuffer( + limitStencilTable->GetDuvWeights(), GL_R32F); + _dvvWeights = createGLTextureBuffer( + limitStencilTable->GetDvvWeights(), GL_R32F); } else { _sizes = _offsets = _indices = _weights = 0; _duWeights = _dvWeights = 0; + _duuWeights = _duvWeights = _dvvWeights = 0; } } @@ -131,11 +144,16 @@ GLStencilTableTBO::~GLStencilTableTBO() { if (_weights) glDeleteTextures(1, &_weights); if (_duWeights) glDeleteTextures(1, &_duWeights); if (_dvWeights) glDeleteTextures(1, &_dvWeights); + if (_duuWeights) glDeleteTextures(1, &_duuWeights); + if (_duvWeights) glDeleteTextures(1, &_duvWeights); + if (_dvvWeights) glDeleteTextures(1, &_dvvWeights); } // --------------------------------------------------------------------------- -GLXFBEvaluator::GLXFBEvaluator() : _srcBufferTexture(0) { +GLXFBEvaluator::GLXFBEvaluator(bool sharedDerivativeBuffers) + : _srcBufferTexture(0), + _sharedDerivativeBuffers(sharedDerivativeBuffers) { } GLXFBEvaluator::~GLXFBEvaluator() { @@ -149,7 +167,11 @@ compileKernel(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, - const char *kernelDefine) { + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + const char *kernelDefine, + bool sharedDerivativeBuffers) { GLuint program = glCreateProgram(); @@ -165,8 +187,25 @@ compileKernel(BufferDescriptor const &srcDesc, << "#define VERTEX_SHADER\n" << kernelDefine << "\n" << patchBasisShaderSourceDefine << "\n"; - std::string defineStr = defines.str(); + bool deriv1 = (duDesc.length > 0 || dvDesc.length > 0); + bool deriv2 = (duuDesc.length > 0 || duvDesc.length > 0 || dvvDesc.length > 0); + if (deriv1) { + defines << "#define OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES\n"; + if (sharedDerivativeBuffers) { + defines << + "#define OPENSUBDIV_GLSL_XFB_SHARED_1ST_DERIVATIVE_BUFFERS\n"; + } + } + if (deriv2) { + defines << "#define OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES\n"; + if (sharedDerivativeBuffers) { + defines << + "#define OPENSUBDIV_GLSL_XFB_SHARED_2ND_DERIVATIVE_BUFFERS\n"; + } + } + + std::string defineStr = defines.str(); const char *shaderSources[4] = {"#version 410\n", NULL, NULL, NULL}; @@ -204,41 +243,148 @@ compileKernel(BufferDescriptor const &srcDesc, outputs.push_back("gl_SkipComponents1"); } } - if (duDesc.length) { - // - // For derivatives, we use another buffer bindings so gl_NextBuffer - // is inserted here to switch the destination of transform feedback. - // - // Note that the destination buffers may or may not be shared between - // vertex and each derivatives. gl_NextBuffer seems still works well - // in either case. - // + // + // For derivatives, we use another buffer bindings so gl_NextBuffer + // is inserted here to switch the destination of transform feedback. + // + // Note that the destination buffers may or may not be shared between + // vertex and each derivatives. gl_NextBuffer seems still works well + // in either case. + // + // If we know that the buffers for derivatives are shared, then we + // can use fewer buffer bindings. This can be important, since most GL + // implementations will support only up to 4 transform feedback bindings. + // + if (deriv1 && sharedDerivativeBuffers) { outputs.push_back("gl_NextBuffer"); - int primvarOffset = (duDesc.offset % duDesc.stride); - for (int i = 0; i < primvarOffset; ++i) { + + int primvar1Offset = (duDesc.offset % duDesc.stride); + int primvar2Offset = (dvDesc.offset % dvDesc.stride); + + for (int i = 0; i < primvar1Offset; ++i) { outputs.push_back("gl_SkipComponents1"); } for (int i = 0; i < duDesc.length; ++i) { - snprintf(attrName, sizeof(attrName), "outDuBuffer[%d]", i); + snprintf(attrName, sizeof(attrName), "outDeriv1Buffer[%d]", i); outputs.push_back(attrName); } - for (int i = primvarOffset + duDesc.length; i < duDesc.stride; ++i) { - outputs.push_back("gl_SkipComponents1"); - } - } - if (dvDesc.length) { - outputs.push_back("gl_NextBuffer"); - int primvarOffset = (dvDesc.offset % dvDesc.stride); - for (int i = 0; i < primvarOffset; ++i) { + for (int i = primvar1Offset + duDesc.length; i < primvar2Offset; ++i) { outputs.push_back("gl_SkipComponents1"); } for (int i = 0; i < dvDesc.length; ++i) { - snprintf(attrName, sizeof(attrName), "outDvBuffer[%d]", i); + snprintf(attrName, sizeof(attrName), "outDeriv1Buffer[%d]", i+duDesc.length); outputs.push_back(attrName); } - for (int i = primvarOffset + dvDesc.length; i < dvDesc.stride; ++i) { + for (int i = primvar2Offset + dvDesc.length; i < dvDesc.stride; ++i) { outputs.push_back("gl_SkipComponents1"); } + } else { + if (duDesc.length) { + outputs.push_back("gl_NextBuffer"); + int primvarOffset = (duDesc.offset % duDesc.stride); + for (int i = 0; i < primvarOffset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < duDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDuBuffer[%d]", i); + outputs.push_back(attrName); + } + for (int i = primvarOffset + duDesc.length; i < duDesc.stride; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + } + if (dvDesc.length) { + outputs.push_back("gl_NextBuffer"); + int primvarOffset = (dvDesc.offset % dvDesc.stride); + for (int i = 0; i < primvarOffset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < dvDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDvBuffer[%d]", i); + outputs.push_back(attrName); + } + for (int i = primvarOffset + dvDesc.length; i < dvDesc.stride; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + } + } + if (deriv2 && sharedDerivativeBuffers) { + outputs.push_back("gl_NextBuffer"); + + int primvar1Offset = (duuDesc.offset % duuDesc.stride); + int primvar2Offset = (duvDesc.offset % duvDesc.stride); + int primvar3Offset = (dvvDesc.offset % dvvDesc.stride); + + for (int i = 0; i < primvar1Offset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < duuDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDeriv2Buffer[%d]", i); + outputs.push_back(attrName); + } + + for (int i = primvar1Offset + duuDesc.length; i < primvar2Offset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < duvDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDeriv2Buffer[%d]", i+duuDesc.length); + outputs.push_back(attrName); + } + + for (int i = primvar2Offset + duvDesc.length; i < primvar3Offset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < dvvDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDeriv2Buffer[%d]", i+duuDesc.length+duvDesc.length); + outputs.push_back(attrName); + } + + for (int i = primvar3Offset + dvvDesc.length; i < dvvDesc.stride; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + } else { + if (duuDesc.length) { + outputs.push_back("gl_NextBuffer"); + int primvarOffset = (duuDesc.offset % duuDesc.stride); + for (int i = 0; i < primvarOffset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < duuDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDuuBuffer[%d]", i); + outputs.push_back(attrName); + } + for (int i = primvarOffset + duuDesc.length; i < duuDesc.stride; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + } + if (duvDesc.length) { + outputs.push_back("gl_NextBuffer"); + int primvarOffset = (duvDesc.offset % duvDesc.stride); + for (int i = 0; i < primvarOffset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < duvDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDuvBuffer[%d]", i); + outputs.push_back(attrName); + } + for (int i = primvarOffset + duvDesc.length; i < duvDesc.stride; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + } + if (dvvDesc.length) { + outputs.push_back("gl_NextBuffer"); + int primvarOffset = (dvvDesc.offset % dvvDesc.stride); + for (int i = 0; i < primvarOffset; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + for (int i = 0; i < dvvDesc.length; ++i) { + snprintf(attrName, sizeof(attrName), "outDvvBuffer[%d]", i); + outputs.push_back(attrName); + } + for (int i = primvarOffset + dvvDesc.length; i < dvvDesc.stride; ++i) { + outputs.push_back("gl_SkipComponents1"); + } + } } // convert to char* array std::vector pOutputs; @@ -274,13 +420,20 @@ bool GLXFBEvaluator::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc) { + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc) { // create a stencil kernel - _stencilKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc); + _stencilKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + _sharedDerivativeBuffers); // create a patch kernel - _patchKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc); + _patchKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + _sharedDerivativeBuffers); // create a texture for input buffer if (!_srcBufferTexture) { @@ -314,12 +467,46 @@ GLXFBEvaluator::EvalStencils( GLuint dstBuffer, BufferDescriptor const &dstDesc, GLuint duBuffer, BufferDescriptor const &duDesc, GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint sizesBuffer, + GLuint offsetsBuffer, + GLuint indicesBuffer, + GLuint weightsBuffer, + GLuint duWeightsBuffer, + GLuint dvWeightsBuffer, + int start, int end) const { + + return EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + 0, BufferDescriptor(), + 0, BufferDescriptor(), + 0, BufferDescriptor(), + sizesBuffer, offsetsBuffer, indicesBuffer, + weightsBuffer, + duWeightsBuffer, dvWeightsBuffer, + 0, 0, 0, + start, end); +} + +bool +GLXFBEvaluator::EvalStencils( + GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, GLuint sizesTexture, GLuint offsetsTexture, GLuint indicesTexture, GLuint weightsTexture, GLuint duWeightsTexture, GLuint dvWeightsTexture, + GLuint duuWeightsTexture, + GLuint duvWeightsTexture, + GLuint dvvWeightsTexture, int start, int end) const { if (!_stencilKernel.program) return false; @@ -353,6 +540,14 @@ GLXFBEvaluator::EvalStencils( bindTexture(_stencilKernel.uniformDuWeightsTexture, duWeightsTexture, 5); if (_stencilKernel.uniformDvWeightsTexture >= 0 && dvWeightsTexture) bindTexture(_stencilKernel.uniformDvWeightsTexture, dvWeightsTexture, 6); + if (_stencilKernel.uniformDuWeightsTexture >= 0 && duWeightsTexture) + bindTexture(_stencilKernel.uniformDuWeightsTexture, duWeightsTexture, 5); + if (_stencilKernel.uniformDuuWeightsTexture >= 0 && duuWeightsTexture) + bindTexture(_stencilKernel.uniformDuuWeightsTexture, duuWeightsTexture, 5); + if (_stencilKernel.uniformDuvWeightsTexture >= 0 && duvWeightsTexture) + bindTexture(_stencilKernel.uniformDuvWeightsTexture, duvWeightsTexture, 6); + if (_stencilKernel.uniformDvvWeightsTexture >= 0 && dvvWeightsTexture) + bindTexture(_stencilKernel.uniformDvvWeightsTexture, dvvWeightsTexture, 6); // set batch range glUniform1i(_stencilKernel.uniformStart, start); @@ -392,6 +587,12 @@ GLXFBEvaluator::EvalStencils( (duDesc.offset - (duDesc.offset % duDesc.stride)) : 0; int dvBufferBindOffset = dvDesc.stride ? (dvDesc.offset - (dvDesc.offset % dvDesc.stride)) : 0; + int duuBufferBindOffset = duuDesc.stride ? + (duuDesc.offset - (duuDesc.offset % duuDesc.stride)) : 0; + int duvBufferBindOffset = duvDesc.stride ? + (duvDesc.offset - (duvDesc.offset % duvDesc.stride)) : 0; + int dvvBufferBindOffset = dvvDesc.stride ? + (dvvDesc.offset - (dvvDesc.offset % dvvDesc.stride)) : 0; // bind destination buffer glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, @@ -399,18 +600,53 @@ GLXFBEvaluator::EvalStencils( dstBufferBindOffset * sizeof(float), count * dstDesc.stride * sizeof(float)); - if (duDesc.length > 0) { + if ((duDesc.length > 0) && _sharedDerivativeBuffers) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 1, duBuffer, duBufferBindOffset * sizeof(float), count * duDesc.stride * sizeof(float)); + } else { + if (duDesc.length > 0) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 1, duBuffer, + duBufferBindOffset * sizeof(float), + count * duDesc.stride * sizeof(float)); + } + + if (dvDesc.length > 0) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 2, dvBuffer, + dvBufferBindOffset * sizeof(float), + count * dvDesc.stride * sizeof(float)); + } } - if (dvDesc.length > 0) { + if ((duuDesc.length > 0) && _sharedDerivativeBuffers) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, - 2, dvBuffer, - dvBufferBindOffset * sizeof(float), - count * dvDesc.stride * sizeof(float)); + 2, duuBuffer, + duuBufferBindOffset * sizeof(float), + count * duuDesc.stride * sizeof(float)); + } else { + if (duuDesc.length > 0) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 3, duuBuffer, + duuBufferBindOffset * sizeof(float), + count * duuDesc.stride * sizeof(float)); + } + + if (duvDesc.length > 0) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 4, duvBuffer, + duvBufferBindOffset * sizeof(float), + count * duvDesc.stride * sizeof(float)); + } + + if (dvvDesc.length > 0) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 5, dvvBuffer, + dvvBufferBindOffset * sizeof(float), + count * dvvDesc.stride * sizeof(float)); + } } glBeginTransformFeedback(GL_POINTS); @@ -419,7 +655,7 @@ GLXFBEvaluator::EvalStencils( glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); - for (int i = 0; i < 5; ++i) { + for (int i = 0; i < 6; ++i) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_BUFFER, 0); } @@ -448,7 +684,36 @@ GLXFBEvaluator::EvalPatches( GLuint patchIndexTexture, GLuint patchParamTexture) const { - bool derivatives = (duDesc.length > 0 || dvDesc.length > 0); + return EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + 0, BufferDescriptor(), + 0, BufferDescriptor(), + 0, BufferDescriptor(), + numPatchCoords, + patchCoordsBuffer, patchArrays, + patchIndexTexture, + patchParamTexture); +} + +bool +GLXFBEvaluator::EvalPatches( + GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + GLuint patchCoordsBuffer, + const PatchArrayVector &patchArrays, + GLuint patchIndexTexture, + GLuint patchParamTexture) const { + + bool deriv1 = (duDesc.length > 0 || dvDesc.length > 0); + bool deriv2 = (duuDesc.length > 0 || duvDesc.length > 0 || dvvDesc.length > 0); if (!_patchKernel.program) return false; @@ -493,6 +758,15 @@ GLXFBEvaluator::EvalPatches( int dvBufferBindOffset = dvDesc.stride ? (dvDesc.offset - (dvDesc.offset % dvDesc.stride)) : 0; + int duuBufferBindOffset = duuDesc.stride + ? (duuDesc.offset - (duuDesc.offset % duuDesc.stride)) + : 0; + int duvBufferBindOffset = duvDesc.stride + ? (duvDesc.offset - (duvDesc.offset % duvDesc.stride)) + : 0; + int dvvBufferBindOffset = dvvDesc.stride + ? (dvvDesc.offset - (dvvDesc.offset % dvvDesc.stride)) + : 0; // bind destination buffer glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, @@ -500,7 +774,12 @@ GLXFBEvaluator::EvalPatches( dstBufferBindOffset * sizeof(float), numPatchCoords * dstDesc.stride * sizeof(float)); - if (derivatives) { + if (deriv1 && _sharedDerivativeBuffers) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 1, duBuffer, + duBufferBindOffset * sizeof(float), + numPatchCoords * duDesc.stride * sizeof(float)); + } else if (deriv1) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 1, duBuffer, duBufferBindOffset * sizeof(float), @@ -510,7 +789,27 @@ GLXFBEvaluator::EvalPatches( 2, dvBuffer, dvBufferBindOffset * sizeof(float), numPatchCoords * dvDesc.stride * sizeof(float)); + } + if (deriv2 && _sharedDerivativeBuffers) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 2, duuBuffer, + duuBufferBindOffset * sizeof(float), + numPatchCoords * duuDesc.stride * sizeof(float)); + } else if (deriv2) { + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 3, duuBuffer, + duuBufferBindOffset * sizeof(float), + numPatchCoords * duuDesc.stride * sizeof(float)); + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 4, duvBuffer, + duvBufferBindOffset * sizeof(float), + numPatchCoords * duvDesc.stride * sizeof(float)); + + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, + 5, dvvBuffer, + dvvBufferBindOffset * sizeof(float), + numPatchCoords * dvvDesc.stride * sizeof(float)); } glBeginTransformFeedback(GL_POINTS); @@ -520,7 +819,7 @@ GLXFBEvaluator::EvalPatches( glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); // unbind textures - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < 6; ++i) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_BUFFER, 0); } @@ -536,7 +835,6 @@ GLXFBEvaluator::EvalPatches( glBindVertexArray(0); glDeleteVertexArrays(1, &vao); - return true; } @@ -554,32 +852,38 @@ bool GLXFBEvaluator::_StencilKernel::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc) { + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + bool sharedDerivativeBuffers) { // create stencil kernel if (program) { glDeleteProgram(program); } - bool derivatives = (duDesc.length > 0 || dvDesc.length > 0); - const char *kernelDef = derivatives - ? "#define OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_STENCILS\n" - "#define OPENSUBDIV_GLSL_XFB_USE_DERIVATIVES\n" - : "#define OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_STENCILS\n"; + const char * kernelDefines = + "#define OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_STENCILS\n"; - program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, kernelDef); + program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + kernelDefines, sharedDerivativeBuffers); if (program == 0) return false; // cache uniform locations (TODO: use uniform block) - uniformSrcBufferTexture = glGetUniformLocation(program, "vertexBuffer"); - uniformSrcOffset = glGetUniformLocation(program, "srcOffset"); - uniformSizesTexture = glGetUniformLocation(program, "sizes"); - uniformOffsetsTexture = glGetUniformLocation(program, "offsets"); - uniformIndicesTexture = glGetUniformLocation(program, "indices"); - uniformWeightsTexture = glGetUniformLocation(program, "weights"); - uniformDuWeightsTexture = glGetUniformLocation(program, "duWeights"); - uniformDvWeightsTexture = glGetUniformLocation(program, "dvWeights"); - uniformStart = glGetUniformLocation(program, "batchStart"); - uniformEnd = glGetUniformLocation(program, "batchEnd"); + uniformSrcBufferTexture = glGetUniformLocation(program, "vertexBuffer"); + uniformSrcOffset = glGetUniformLocation(program, "srcOffset"); + uniformSizesTexture = glGetUniformLocation(program, "sizes"); + uniformOffsetsTexture = glGetUniformLocation(program, "offsets"); + uniformIndicesTexture = glGetUniformLocation(program, "indices"); + uniformWeightsTexture = glGetUniformLocation(program, "weights"); + uniformDuWeightsTexture = glGetUniformLocation(program, "duWeights"); + uniformDvWeightsTexture = glGetUniformLocation(program, "dvWeights"); + uniformDuuWeightsTexture = glGetUniformLocation(program, "duuWeights"); + uniformDuvWeightsTexture = glGetUniformLocation(program, "duvWeights"); + uniformDvvWeightsTexture = glGetUniformLocation(program, "dvvWeights"); + uniformStart = glGetUniformLocation(program, "batchStart"); + uniformEnd = glGetUniformLocation(program, "batchEnd"); return true; } @@ -598,19 +902,22 @@ bool GLXFBEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc) { + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + bool sharedDerivativeBuffers) { // create stencil kernel if (program) { glDeleteProgram(program); } - bool derivatives = (duDesc.length > 0 || dvDesc.length > 0); - const char *kernelDef = derivatives - ? "#define OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_PATCHES\n" - "#define OPENSUBDIV_GLSL_XFB_USE_DERIVATIVES\n" - : "#define OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_PATCHES\n"; + const char * kernelDefines = + "#define OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_PATCHES\n"; - program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, kernelDef); + program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, + kernelDefines, sharedDerivativeBuffers); if (program == 0) return false; // cache uniform locations @@ -623,7 +930,6 @@ GLXFBEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, return true; } - } // end namespace Osd } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/osd/glXFBEvaluator.h b/opensubdiv/osd/glXFBEvaluator.h index 1fd438d4..4852a71f 100644 --- a/opensubdiv/osd/glXFBEvaluator.h +++ b/opensubdiv/osd/glXFBEvaluator.h @@ -75,6 +75,9 @@ public: GLuint GetWeightsTexture() const { return _weights; } GLuint GetDuWeightsTexture() const { return _duWeights; } GLuint GetDvWeightsTexture() const { return _dvWeights; } + GLuint GetDuuWeightsTexture() const { return _duuWeights; } + GLuint GetDuvWeightsTexture() const { return _duvWeights; } + GLuint GetDvvWeightsTexture() const { return _dvvWeights; } int GetNumStencils() const { return _numStencils; } private: @@ -84,6 +87,9 @@ private: GLuint _weights; GLuint _duWeights; GLuint _dvWeights; + GLuint _duuWeights; + GLuint _duvWeights; + GLuint _dvvWeights; int _numStencils; }; @@ -97,16 +103,32 @@ public: BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, void * deviceContext = NULL) { + return Create(srcDesc, dstDesc, duDesc, dvDesc, + BufferDescriptor(), + BufferDescriptor(), + BufferDescriptor(), + deviceContext); + } + + static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + void * deviceContext = NULL) { (void)deviceContext; // not used GLXFBEvaluator *instance = new GLXFBEvaluator(); - if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc)) + if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc)) return instance; delete instance; return NULL; } /// Constructor. - GLXFBEvaluator(); + GLXFBEvaluator(bool sharedDerivativeBuffers = false); /// Destructor. note that the GL context must be made current. ~GLXFBEvaluator(); @@ -245,6 +267,107 @@ public: } } + /// \brief Generic static stencil function. This function has a same + /// signature as other device kernels have so that it can be called + /// transparently from OsdMesh template interface. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// Texture Buffer Object interfaces. + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLSLTransformFeedback 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + GLXFBEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + stencilTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalStencils(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + stencilTable); + delete instance; + return r; + } + return false; + } + } + /// \brief Generic stencil function. /// /// @param srcBuffer Input primvar buffer. @@ -333,6 +456,84 @@ public: /* end = */ stencilTable->GetNumStencils()); } + /// \brief Generic stencil function. + /// + /// @param srcBuffer Input primvar buffer. + /// must have BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable stencil table to be applied. The table must have + /// Texture Buffer Object interfaces. + /// + template + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable) const { + + return EvalStencils(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + stencilTable->GetSizesTexture(), + stencilTable->GetOffsetsTexture(), + stencilTable->GetIndicesTexture(), + stencilTable->GetWeightsTexture(), + stencilTable->GetDuWeightsTexture(), + stencilTable->GetDvWeightsTexture(), + stencilTable->GetDuuWeightsTexture(), + stencilTable->GetDuvWeightsTexture(), + stencilTable->GetDvvWeightsTexture(), + /* start = */ 0, + /* end = */ stencilTable->GetNumStencils()); + } + /// \brief Dispatch the GLSL XFB kernel on on GPU asynchronously /// returns false if the kernel hasn't been compiled yet. /// @@ -381,6 +582,78 @@ public: int start, int end) const; + /// \brief Dispatch the GLSL XFB kernel on on GPU asynchronously + /// returns false if the kernel hasn't been compiled yet. + /// + /// @param srcBuffer GL buffer of input primvar source data + /// + /// @param srcDesc vertex buffer descriptor for the srcBuffer + /// + /// @param dstBuffer GL buffer of output primvar destination data + /// + /// @param dstDesc vertex buffer descriptor for the dstBuffer + /// + /// @param duBuffer GL buffer of output derivative wrt u + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer GL buffer of output derivative wrt v + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer GL buffer of output 2nd derivative wrt u + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer GL buffer of output 2nd derivative wrt u and v + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer GL buffer of output 2nd derivative wrt v + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param sizesBuffer GL buffer of the sizes in the stencil table + /// + /// @param offsetsBuffer GL buffer of the offsets in the stencil table + /// + /// @param indicesBuffer GL buffer of the indices in the stencil table + /// + /// @param weightsBuffer GL buffer of the weights in the stencil table + /// + /// @param duWeightsBuffer GL buffer of the du weights in the stencil table + /// + /// @param dvWeightsBuffer GL buffer of the dv weights in the stencil table + /// + /// @param duuWeightsBuffer GL buffer of the duu weights in the stencil table + /// + /// @param duvWeightsBuffer GL buffer of the duv weights in the stencil table + /// + /// @param dvvWeightsBuffer GL buffer of the dvv weights in the stencil table + /// + /// @param start start index of stencil table + /// + /// @param end end index of stencil table + /// + bool EvalStencils(GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + GLuint sizesBuffer, + GLuint offsetsBuffer, + GLuint indicesBuffer, + GLuint weightsBuffer, + GLuint duWeightsBuffer, + GLuint dvWeightsBuffer, + GLuint duuWeightsBuffer, + GLuint duvWeightsBuffer, + GLuint dvvWeightsBuffer, + int start, + int end) const; + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -535,6 +808,117 @@ public: } } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + GLXFBEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalPatches(srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + delete instance; + return r; + } + return false; + } + } + /// \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. @@ -635,6 +1019,86 @@ public: patchTable->GetPatchParamTextureBuffer()); } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// + /// @param patchTable GLPatchTable or equivalent + /// + template + 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetPatchArrays(), + patchTable->GetPatchIndexTextureBuffer(), + patchTable->GetPatchParamTextureBuffer()); + } + bool EvalPatches(GLuint srcBuffer, BufferDescriptor const &srcDesc, GLuint dstBuffer, BufferDescriptor const &dstDesc, GLuint duBuffer, BufferDescriptor const &duDesc, @@ -645,6 +1109,19 @@ public: GLuint patchIndexBuffer, GLuint patchParamsBuffer) const; + bool EvalPatches(GLuint srcBuffer, BufferDescriptor const &srcDesc, + GLuint dstBuffer, BufferDescriptor const &dstDesc, + GLuint duBuffer, BufferDescriptor const &duDesc, + GLuint dvBuffer, BufferDescriptor const &dvDesc, + GLuint duuBuffer, BufferDescriptor const &duuDesc, + GLuint duvBuffer, BufferDescriptor const &duvDesc, + GLuint dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + GLuint patchCoordsBuffer, + const PatchArrayVector &patchArrays, + GLuint patchIndexBuffer, + GLuint patchParamsBuffer) const; + /// \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. @@ -757,6 +1234,344 @@ public: patchTable->GetPatchParamTextureBuffer()); } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesVarying( + 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, + GLXFBEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc); + if (instance) { + bool r = instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + template + bool EvalPatchesVarying( + 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) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetVaryingPatchArrays(), + patchTable->GetVaryingPatchIndexTextureBuffer(), + patchTable->GetPatchParamTextureBuffer()); + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + GLXFBEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalPatchesVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + template + bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetVaryingPatchArrays(), + patchTable->GetVaryingPatchIndexTextureBuffer(), + patchTable->GetPatchParamTextureBuffer()); + } + /// \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. @@ -875,6 +1690,356 @@ public: patchTable->GetFVarPatchParamTextureBuffer(fvarChannel)); } + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + GLXFBEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc); + if (instance) { + bool r = instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + template + bool EvalPatchesFaceVarying( + 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, + int fvarChannel = 0) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetFVarPatchArrays(fvarChannel), + patchTable->GetFVarPatchIndexTextureBuffer(fvarChannel), + patchTable->GetFVarPatchParamTextureBuffer(fvarChannel)); + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + /// @param instance cached compiled instance. Clients are supposed to + /// pre-compile an instance of this class and provide + /// to this function. If it's null the kernel still + /// compute by instantiating on-demand kernel although + /// it may cause a performance problem. + /// + /// @param deviceContext not used in the GLXFB evaluator + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + GLXFBEvaluator const *instance, + void * deviceContext = NULL) { + + if (instance) { + return instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + } else { + // Create an instance on demand (slow) + (void)deviceContext; // unused + instance = Create(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); + if (instance) { + bool r = instance->EvalPatchesFaceVarying( + srcBuffer, srcDesc, + dstBuffer, dstDesc, + duBuffer, duDesc, + dvBuffer, dvDesc, + duuBuffer, duuDesc, + duvBuffer, duvDesc, + dvvBuffer, dvvDesc, + numPatchCoords, patchCoords, + patchTable, fvarChannel); + delete instance; + return r; + } + return false; + } + } + + /// \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 BindVBO() method returning a GL + /// buffer object of source data + /// + /// @param srcDesc vertex buffer descriptor for the input buffer + /// + /// @param dstBuffer Output primvar buffer + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dstDesc vertex buffer descriptor for the output buffer + /// + /// @param duBuffer Output buffer derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindVBO() method returning a GL + /// buffer object of destination data + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param numPatchCoords number of patchCoords. + /// + /// @param patchCoords array of locations to be evaluated. + /// must have BindVBO() method returning an + /// array of PatchCoord struct in VBO. + /// + /// @param patchTable GLPatchTable or equivalent + /// + /// @param fvarChannel face-varying channel + /// + template + bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel = 0) const { + + return EvalPatches(srcBuffer->BindVBO(), srcDesc, + dstBuffer->BindVBO(), dstDesc, + duBuffer->BindVBO(), duDesc, + dvBuffer->BindVBO(), dvDesc, + duuBuffer->BindVBO(), duuDesc, + duvBuffer->BindVBO(), duvDesc, + dvvBuffer->BindVBO(), dvvDesc, + numPatchCoords, + patchCoords->BindVBO(), + patchTable->GetFVarPatchArrays(fvarChannel), + patchTable->GetFVarPatchIndexTextureBuffer(fvarChannel), + patchTable->GetFVarPatchParamTextureBuffer(fvarChannel)); + } + /// ---------------------------------------------------------------------- /// /// Other methods @@ -885,14 +2050,18 @@ public: /// calling this function. Returns false if it fails to compile the kernel. bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, - BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc); + BufferDescriptor const &duDesc = BufferDescriptor(), + BufferDescriptor const &dvDesc = BufferDescriptor(), + BufferDescriptor const &duuDesc = BufferDescriptor(), + BufferDescriptor const &duvDesc = BufferDescriptor(), + BufferDescriptor const &dvvDesc = BufferDescriptor()); /// Wait the dispatched kernel finishes. static void Synchronize(void *kernel); private: GLuint _srcBufferTexture; + bool _sharedDerivativeBuffers; struct _StencilKernel { _StencilKernel(); @@ -900,7 +2069,11 @@ private: bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc); + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + bool sharedDerivativeBuffers); GLuint program; GLint uniformSrcBufferTexture; GLint uniformSrcOffset; // src buffer offset (in elements) @@ -911,6 +2084,9 @@ private: GLint uniformWeightsTexture; GLint uniformDuWeightsTexture; GLint uniformDvWeightsTexture; + GLint uniformDuuWeightsTexture; + GLint uniformDuvWeightsTexture; + GLint uniformDvvWeightsTexture; GLint uniformStart; // range GLint uniformEnd; } _stencilKernel; @@ -921,7 +2097,11 @@ private: bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, - BufferDescriptor const &dvDesc); + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + bool sharedDerivativeBuffers); GLuint program; GLint uniformSrcBufferTexture; GLint uniformSrcOffset; // src buffer offset (in elements) diff --git a/opensubdiv/osd/glslComputeKernel.glsl b/opensubdiv/osd/glslComputeKernel.glsl index 22f2393a..5c65a2f6 100644 --- a/opensubdiv/osd/glslComputeKernel.glsl +++ b/opensubdiv/osd/glslComputeKernel.glsl @@ -37,13 +37,22 @@ layout(binding=1) buffer dst_buffer { float dstVertexBuffer[]; }; // derivative buffers (if needed) -#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_1ST_DERIVATIVES) uniform ivec3 duDesc; uniform ivec3 dvDesc; layout(binding=2) buffer du_buffer { float duBuffer[]; }; layout(binding=3) buffer dv_buffer { float dvBuffer[]; }; #endif +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_2ND_DERIVATIVES) +uniform ivec3 duuDesc; +uniform ivec3 duvDesc; +uniform ivec3 dvvDesc; +layout(binding=10) buffer duu_buffer { float duuBuffer[]; }; +layout(binding=11) buffer duv_buffer { float duvBuffer[]; }; +layout(binding=12) buffer dvv_buffer { float dvvBuffer[]; }; +#endif + // stencil buffers #if defined(OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_STENCILS) @@ -55,11 +64,17 @@ layout(binding=5) buffer stencilOffsets { int _offsets[]; }; layout(binding=6) buffer stencilIndices { int _indices[]; }; layout(binding=7) buffer stencilWeights { float _weights[]; }; -#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_1ST_DERIVATIVES) layout(binding=8) buffer stencilDuWeights { float _duWeights[]; }; layout(binding=9) buffer stencilDvWeights { float _dvWeights[]; }; #endif +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_2ND_DERIVATIVES) +layout(binding=13) buffer stencilDuuWeights { float _duuWeights[]; }; +layout(binding=14) buffer stencilDuvWeights { float _duvWeights[]; }; +layout(binding=15) buffer stencilDvvWeights { float _dvvWeights[]; }; +#endif + #endif // patch buffers @@ -119,7 +134,7 @@ void addWithWeight(inout Vertex v, const Vertex src, float weight) { } } -#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_1ST_DERIVATIVES) void writeDu(int index, Vertex du) { int duIndex = duDesc.x + index * duDesc.z; for (int i = 0; i < LENGTH; ++i) { @@ -135,6 +150,29 @@ void writeDv(int index, Vertex dv) { } #endif +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_2ND_DERIVATIVES) +void writeDuu(int index, Vertex duu) { + int duuIndex = duuDesc.x + index * duuDesc.z; + for (int i = 0; i < LENGTH; ++i) { + duuBuffer[duuIndex + i] = duu.vertexData[i]; + } +} + +void writeDuv(int index, Vertex duv) { + int duvIndex = duvDesc.x + index * duvDesc.z; + for (int i = 0; i < LENGTH; ++i) { + duvBuffer[duvIndex + i] = duv.vertexData[i]; + } +} + +void writeDvv(int index, Vertex dvv) { + int dvvIndex = dvvDesc.x + index * dvvDesc.z; + for (int i = 0; i < LENGTH; ++i) { + dvvBuffer[dvvIndex + i] = dvv.vertexData[i]; + } +} +#endif + //------------------------------------------------------------------------------ #if defined(OPENSUBDIV_GLSL_COMPUTE_KERNEL_EVAL_STENCILS) @@ -160,7 +198,7 @@ void main() { writeVertex(current, dst); -#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_1ST_DERIVATIVES) Vertex du, dv; clear(du); clear(dv); @@ -178,6 +216,29 @@ void main() { writeDv(current, dv); } #endif +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_2ND_DERIVATIVES) + Vertex duu, duv, dvv; + clear(duu); + clear(duv); + clear(dvv); + for (int i=0; i 0) { // length + writeDuu(current, duu); + } + if (duvDesc.y > 0) { + writeDuv(current, duv); + } + if (dvvDesc.y > 0) { + writeDvv(current, dvv); + } +#endif } #endif @@ -260,6 +321,9 @@ void main() { wP[i] = wP4[i]; wDs[i] = wDs4[i]; wDt[i] = wDt4[i]; + wDss[i] = wDss4[i]; + wDst[i] = wDst4[i]; + wDtt[i] = wDtt4[i]; } } else if (patchType == 6) { float wP16[16], wDs16[16], wDt16[16], wDss16[16], wDst16[16], wDtt16[16]; @@ -269,16 +333,22 @@ void main() { wP[i] = wP16[i]; wDs[i] = wDs16[i]; wDt[i] = wDt16[i]; + wDss[i] = wDss16[i]; + wDst[i] = wDst16[i]; + wDtt[i] = wDtt16[i]; } } else if (patchType == 9) { OsdGetGregoryPatchWeights(uv.s, uv.t, dScale, wP, wDs, wDt, wDss, wDst, wDtt); numControlVertices = 20; } - Vertex dst, du, dv; + Vertex dst, du, dv, duu, duv, dvv; clear(dst); clear(du); clear(dv); + clear(duu); + clear(duv); + clear(dvv); int indexStride = getNumControlVertices(array.x); int indexBase = array.z + indexStride * (patchIndex - array.w); @@ -288,10 +358,13 @@ void main() { addWithWeight(dst, readVertex(index), wP[cv]); addWithWeight(du, readVertex(index), wDs[cv]); addWithWeight(dv, readVertex(index), wDt[cv]); + addWithWeight(duu, readVertex(index), wDss[cv]); + addWithWeight(duv, readVertex(index), wDst[cv]); + addWithWeight(dvv, readVertex(index), wDtt[cv]); } writeVertex(current, dst); -#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_1ST_DERIVATIVES) if (duDesc.y > 0) { // length writeDu(current, du); } @@ -299,6 +372,17 @@ void main() { writeDv(current, dv); } #endif +#if defined(OPENSUBDIV_GLSL_COMPUTE_USE_2ND_DERIVATIVES) + if (duuDesc.y > 0) { // length + writeDuu(current, duu); + } + if (duvDesc.y > 0) { // length + writeDuv(current, duv); + } + if (dvvDesc.y > 0) { + writeDvv(current, dvv); + } +#endif } #endif diff --git a/opensubdiv/osd/glslXFBKernel.glsl b/opensubdiv/osd/glslXFBKernel.glsl index 9e2ad8ef..a1e7c494 100644 --- a/opensubdiv/osd/glslXFBKernel.glsl +++ b/opensubdiv/osd/glslXFBKernel.glsl @@ -63,7 +63,22 @@ void writeVertex(Vertex v) { //------------------------------------------------------------------------------ -#if defined(OPENSUBDIV_GLSL_XFB_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES) && \ + defined(OPENSUBDIV_GLSL_XFB_SHARED_1ST_DERIVATIVE_BUFFERS) +out float outDeriv1Buffer[2*LENGTH]; + +void writeDu(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDeriv1Buffer[i] = v.vertexData[i]; + } +} + +void writeDv(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDeriv1Buffer[i+LENGTH] = v.vertexData[i]; + } +} +#elif defined(OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES) out float outDuBuffer[LENGTH]; out float outDvBuffer[LENGTH]; @@ -80,6 +95,51 @@ void writeDv(Vertex v) { } #endif +#if defined(OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES) && \ + defined(OPENSUBDIV_GLSL_XFB_SHARED_2ND_DERIVATIVE_BUFFERS) +out float outDeriv2Buffer[3*LENGTH]; + +void writeDuu(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDeriv2Buffer[i] = v.vertexData[i]; + } +} + +void writeDuv(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDeriv2Buffer[i+LENGTH] = v.vertexData[i]; + } +} + +void writeDvv(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDeriv2Buffer[i+2*LENGTH] = v.vertexData[i]; + } +} +#elif defined(OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES) +out float outDuuBuffer[LENGTH]; +out float outDuvBuffer[LENGTH]; +out float outDvvBuffer[LENGTH]; + +void writeDuu(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDuuBuffer[i] = v.vertexData[i]; + } +} + +void writeDuv(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDuvBuffer[i] = v.vertexData[i]; + } +} + +void writeDvv(Vertex v) { + for(int i = 0; i < LENGTH; i++) { + outDvvBuffer[i] = v.vertexData[i]; + } +} +#endif + //------------------------------------------------------------------------------ #if defined(OPENSUBDIV_GLSL_XFB_KERNEL_EVAL_STENCILS) @@ -89,11 +149,17 @@ uniform isamplerBuffer offsets; uniform isamplerBuffer indices; uniform samplerBuffer weights; -#if defined(OPENSUBDIV_GLSL_XFB_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES) uniform samplerBuffer duWeights; uniform samplerBuffer dvWeights; #endif +#if defined(OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES) +uniform samplerBuffer duuWeights; +uniform samplerBuffer duvWeights; +uniform samplerBuffer dvvWeights; +#endif + uniform int batchStart = 0; uniform int batchEnd = 0; @@ -104,10 +170,13 @@ void main() { return; } - Vertex dst, du, dv; + Vertex dst, du, dv, duu, duv, dvv; clear(dst); clear(du); clear(dv); + clear(duu); + clear(duv); + clear(dvv); int offset = texelFetch(offsets, current).x; uint size = texelFetch(sizes, current).x; @@ -117,19 +186,32 @@ void main() { float weight = texelFetch(weights, offset+stencil).x; addWithWeight(dst, readVertex( index ), weight); -#if defined(OPENSUBDIV_GLSL_XFB_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES) float duWeight = texelFetch(duWeights, offset+stencil).x; float dvWeight = texelFetch(dvWeights, offset+stencil).x; addWithWeight(du, readVertex(index), duWeight); addWithWeight(dv, readVertex(index), dvWeight); +#endif +#if defined(OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES) + float duuWeight = texelFetch(duuWeights, offset+stencil).x; + float duvWeight = texelFetch(duvWeights, offset+stencil).x; + float dvvWeight = texelFetch(dvvWeights, offset+stencil).x; + addWithWeight(duu, readVertex(index), duuWeight); + addWithWeight(duv, readVertex(index), duvWeight); + addWithWeight(dvv, readVertex(index), dvvWeight); #endif } writeVertex(dst); -#if defined(OPENSUBDIV_GLSL_XFB_USE_DERIVATIVES) +#if defined(OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES) writeDu(du); writeDv(dv); #endif +#if defined(OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES) + writeDuu(duu); + writeDuv(duv); + writeDvv(dvv); +#endif } #endif @@ -213,31 +295,43 @@ void main() { int numControlVertices = 0; if (patchType == 3) { float wP4[4], wDs4[4], wDt4[4], wDss4[4], wDst4[4], wDtt4[4]; - OsdGetBilinearPatchWeights(coord.s, coord.t, dScale, wP4, wDs4, wDt4, wDss4, wDst4, wDtt4); + OsdGetBilinearPatchWeights(coord.s, coord.t, dScale, wP4, + wDs4, wDt4, wDss4, wDst4, wDtt4); numControlVertices = 4; for (int i=0; i dstT(dst + dstDesc.stride*i, dstDesc.length, dstDesc.stride); BufferAdapter duT(du + duDesc.stride*i, duDesc.length, duDesc.stride); BufferAdapter dvT(dv + dvDesc.stride*i, dvDesc.length, dvDesc.stride); @@ -214,15 +214,15 @@ OmpEvaluator::EvalPatches( int numControlVertices = 0; if (patchType == Far::PatchDescriptor::REGULAR) { Far::internal::GetBSplineWeights(param, - coord.s, coord.t, wP, wDs, wDt); + coord.s, coord.t, wP, wDu, wDv); numControlVertices = 16; } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { Far::internal::GetGregoryWeights(param, - coord.s, coord.t, wP, wDs, wDt); + coord.s, coord.t, wP, wDu, wDv); numControlVertices = 20; } else if (patchType == Far::PatchDescriptor::QUADS) { Far::internal::GetBilinearWeights(param, - coord.s, coord.t, wP, wDs, wDt); + coord.s, coord.t, wP, wDu, wDv); numControlVertices = 4; } else { continue; @@ -239,8 +239,8 @@ OmpEvaluator::EvalPatches( dvT.Clear(); for (int j = 0; j < numControlVertices; ++j) { dstT.AddWithWeight(srcT[cvs[j]], wP[j]); - duT.AddWithWeight(srcT[cvs[j]], wDs[j]); - dvT.AddWithWeight(srcT[cvs[j]], wDt[j]); + duT.AddWithWeight(srcT[cvs[j]], wDu[j]); + dvT.AddWithWeight(srcT[cvs[j]], wDv[j]); } ++dstT; ++duT; @@ -249,6 +249,101 @@ OmpEvaluator::EvalPatches( return true; } +/* static */ +bool +OmpEvaluator::EvalPatches( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, + const int *patchIndexBuffer, + PatchParam const *patchParamBuffer) { + + src += srcDesc.offset; + if (dst) dst += dstDesc.offset; + if (du) du += duDesc.offset; + if (dv) dv += dvDesc.offset; + if (duu) duu += duuDesc.offset; + if (duv) duv += duvDesc.offset; + if (dvv) dvv += dvvDesc.offset; + + BufferAdapter srcT(src, srcDesc.length, srcDesc.stride); + +#pragma omp parallel for + for (int i = 0; i < numPatchCoords; ++i) { + float wP[20], wDu[20], wDv[20], wDuu[20], wDuv[20], wDvv[20]; + BufferAdapter dstT(dst + dstDesc.stride*i, dstDesc.length, dstDesc.stride); + BufferAdapter duT(du + duDesc.stride*i, duDesc.length, duDesc.stride); + BufferAdapter dvT(dv + dvDesc.stride*i, dvDesc.length, dvDesc.stride); + BufferAdapter duuT(duu + duuDesc.stride*i, duuDesc.length, duuDesc.stride); + BufferAdapter duvT(duv + duvDesc.stride*i, duvDesc.length, duvDesc.stride); + BufferAdapter dvvT(dvv + dvvDesc.stride*i, dvvDesc.length, dvvDesc.stride); + + PatchCoord const &coord = patchCoords[i]; + PatchArray const &array = patchArrays[coord.handle.arrayIndex]; + + Far::PatchParam const & param = + patchParamBuffer[coord.handle.patchIndex]; + int patchType = param.IsRegular() + ? Far::PatchDescriptor::REGULAR + : array.GetPatchType(); + + int numControlVertices = 0; + if (patchType == Far::PatchDescriptor::REGULAR) { + Far::internal::GetBSplineWeights(param, + coord.s, coord.t, wP, + wDu, wDv, wDuu, wDuv, wDvv); + numControlVertices = 16; + } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { + Far::internal::GetGregoryWeights(param, + coord.s, coord.t, wP, + wDu, wDv, wDuu, wDuv, wDvv); + numControlVertices = 20; + } else if (patchType == Far::PatchDescriptor::QUADS) { + Far::internal::GetBilinearWeights(param, + coord.s, coord.t, wP, + wDu, wDv, wDuu, wDuv, wDvv); + numControlVertices = 4; + } else { + continue; + } + + int indexStride = Far::PatchDescriptor(array.GetPatchType()).GetNumControlVertices(); + int indexBase = array.GetIndexBase() + indexStride * + (coord.handle.patchIndex - array.GetPrimitiveIdBase()); + + const int *cvs = &patchIndexBuffer[indexBase]; + + dstT.Clear(); + duT.Clear(); + dvT.Clear(); + duuT.Clear(); + duvT.Clear(); + dvvT.Clear(); + for (int j = 0; j < numControlVertices; ++j) { + dstT.AddWithWeight(srcT[cvs[j]], wP[j]); + duT.AddWithWeight(srcT[cvs[j]], wDu[j]); + dvT.AddWithWeight(srcT[cvs[j]], wDv[j]); + duuT.AddWithWeight(srcT[cvs[j]], wDuu[j]); + duvT.AddWithWeight(srcT[cvs[j]], wDuv[j]); + dvvT.AddWithWeight(srcT[cvs[j]], wDvv[j]); + } + ++dstT; + ++duT; + ++dvT; + ++duuT; + ++duvT; + ++dvvT; + } + return true; +} + /* static */ void diff --git a/opensubdiv/osd/ompEvaluator.h b/opensubdiv/osd/ompEvaluator.h index 6485eff4..b1d27d73 100644 --- a/opensubdiv/osd/ompEvaluator.h +++ b/opensubdiv/osd/ompEvaluator.h @@ -244,6 +244,177 @@ public: const float * dvWeights, 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 buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable Far::StencilTable or equivalent + /// + /// @param instance not used in the omp kernel + /// (declared as a typed pointer to prevent + /// undesirable template resolution) + /// + /// @param deviceContext not used in the omp 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + const OmpEvaluator *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, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + &stencilTable->GetSizes()[0], + &stencilTable->GetOffsets()[0], + &stencilTable->GetControlIndices()[0], + &stencilTable->GetWeights()[0], + &stencilTable->GetDuWeights()[0], + &stencilTable->GetDvWeights()[0], + &stencilTable->GetDuuWeights()[0], + &stencilTable->GetDuvWeights()[0], + &stencilTable->GetDvvWeights()[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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 duuWeights pointer to the duu-weights buffer of the stencil table + /// + /// @param duvWeights pointer to the duv-weights buffer of the stencil table + /// + /// @param dvvWeights pointer to the dvv-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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + int start, int end); + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -373,6 +544,102 @@ public: 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 buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 omp evaluator + /// + /// @param deviceContext not used in the omp 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + OmpEvaluator 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, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + 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. /// @@ -457,6 +724,72 @@ public: const int *patchIndexBuffer, PatchParam const *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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, + const int *patchIndexBuffer, + PatchParam const *patchParamBuffer); + /// \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. @@ -508,6 +841,164 @@ public: patchTable->GetPatchParamBuffer()); } + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// 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 omp evaluator + /// + /// @param deviceContext not used in the omp evaluator + /// + template + static bool EvalPatchesVarying( + 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, + OmpEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 omp evaluator + /// + /// @param deviceContext not used in the omp evaluator + /// + template + static bool EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + OmpEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + /// \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. @@ -562,6 +1053,170 @@ public: patchTable->GetFVarPatchParamBuffer(fvarChannel)); } + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// 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 fvarChannel face-varying channel + /// + /// @param instance not used in the omp evaluator + /// + /// @param deviceContext not used in the omp evaluator + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + OmpEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 fvarChannel face-varying channel + /// + /// @param instance not used in the omp evaluator + /// + /// @param deviceContext not used in the omp evaluator + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + OmpEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + /// ---------------------------------------------------------------------- /// /// Other methods diff --git a/opensubdiv/osd/ompKernel.cpp b/opensubdiv/osd/ompKernel.cpp index 16cc481f..3b4e9c0d 100644 --- a/opensubdiv/osd/ompKernel.cpp +++ b/opensubdiv/osd/ompKernel.cpp @@ -177,6 +177,99 @@ OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, } +void +OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, + float * dst, BufferDescriptor const &dstDesc, + float * dstDu, BufferDescriptor const &dstDuDesc, + float * dstDv, BufferDescriptor const &dstDvDesc, + float * dstDuu, BufferDescriptor const &dstDuuDesc, + float * dstDuv, BufferDescriptor const &dstDuvDesc, + float * dstDvv, BufferDescriptor const &dstDvvDesc, + int const * sizes, + int const * offsets, + int const * indices, + float const * weights, + float const * duWeights, + float const * dvWeights, + float const * duuWeights, + float const * duvWeights, + float const * dvvWeights, + int start, int end) { + start = (start > 0 ? start : 0); + + src += srcDesc.offset; + dst += dstDesc.offset; + dstDu += dstDuDesc.offset; + dstDv += dstDvDesc.offset; + dstDuu += dstDuuDesc.offset; + dstDuv += dstDuvDesc.offset; + dstDvv += dstDvvDesc.offset; + + int numThreads = omp_get_max_threads(); + int n = end - start; + + float * result = (float*)alloca(srcDesc.length * numThreads * sizeof(float)); + float * resultDu = (float*)alloca(srcDesc.length * numThreads * sizeof(float)); + float * resultDv = (float*)alloca(srcDesc.length * numThreads * sizeof(float)); + float * resultDuu = (float*)alloca(srcDesc.length * numThreads * sizeof(float)); + float * resultDuv = (float*)alloca(srcDesc.length * numThreads * sizeof(float)); + float * resultDvv = (float*)alloca(srcDesc.length * numThreads * sizeof(float)); + +#pragma omp parallel for + for (int i = 0; i < n; ++i) { + + int index = i + start; // Stencil index + + // Get thread-local pointers + int const * threadIndices = indices + offsets[index]; + float const * threadWeights = weights + offsets[index]; + float const * threadWeightsDu = duWeights + offsets[index]; + float const * threadWeightsDv = dvWeights + offsets[index]; + float const * threadWeightsDuu = duuWeights + offsets[index]; + float const * threadWeightsDuv = duvWeights + offsets[index]; + float const * threadWeightsDvv = dvvWeights + offsets[index]; + + int threadId = omp_get_thread_num(); + + float * threadResult = result + threadId*srcDesc.length; + float * threadResultDu = resultDu + threadId*srcDesc.length; + float * threadResultDv = resultDv + threadId*srcDesc.length; + float * threadResultDuu = resultDuu + threadId*srcDesc.length; + float * threadResultDuv = resultDuv + threadId*srcDesc.length; + float * threadResultDvv = resultDvv + threadId*srcDesc.length; + + clear(threadResult, dstDesc); + clear(threadResultDu, dstDuDesc); + clear(threadResultDv, dstDvDesc); + clear(threadResultDuu, dstDuuDesc); + clear(threadResultDuv, dstDuvDesc); + clear(threadResultDvv, dstDvvDesc); + + for (int j=0; j<(int)sizes[index]; ++j) { + addWithWeight(threadResult, src, + threadIndices[j], threadWeights[j], srcDesc); + addWithWeight(threadResultDu, src, + threadIndices[j], threadWeightsDu[j], srcDesc); + addWithWeight(threadResultDv, src, + threadIndices[j], threadWeightsDv[j], srcDesc); + addWithWeight(threadResultDuu, src, + threadIndices[j], threadWeightsDuu[j], srcDesc); + addWithWeight(threadResultDuv, src, + threadIndices[j], threadWeightsDuv[j], srcDesc); + addWithWeight(threadResultDvv, src, + threadIndices[j], threadWeightsDvv[j], srcDesc); + } + + copy(dst, i, threadResult, dstDesc); + copy(dstDu, i, threadResultDu, dstDuDesc); + copy(dstDv, i, threadResultDv, dstDvDesc); + copy(dstDuu, i, threadResultDuu, dstDuuDesc); + copy(dstDuv, i, threadResultDuv, dstDuvDesc); + copy(dstDvv, i, threadResultDvv, dstDvvDesc); + } + +} + } // end namespace Osd } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/osd/ompKernel.h b/opensubdiv/osd/ompKernel.h index 3eab00fa..c31c7f5d 100644 --- a/opensubdiv/osd/ompKernel.h +++ b/opensubdiv/osd/ompKernel.h @@ -56,6 +56,25 @@ OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, float const * dvWeights, int start, int end); +void +OmpEvalStencils(float const * src, BufferDescriptor const &srcDesc, + float * dst, BufferDescriptor const &dstDesc, + float * dstDu, BufferDescriptor const &dstDuDesc, + float * dstDv, BufferDescriptor const &dstDvDesc, + float * dstDuu, BufferDescriptor const &dstDuuDesc, + float * dstDuv, BufferDescriptor const &dstDuvDesc, + float * dstDvv, BufferDescriptor const &dstDvvDesc, + int const * sizes, + int const * offsets, + int const * indices, + float const * weights, + float const * duWeights, + float const * dvWeights, + float const * duuWeights, + float const * duvWeights, + float const * dvvWeights, + int start, int end); + } // end namespace Osd } // end namespace OPENSUBDIV_VERSION diff --git a/opensubdiv/osd/tbbEvaluator.cpp b/opensubdiv/osd/tbbEvaluator.cpp index f057978b..c98db9f6 100644 --- a/opensubdiv/osd/tbbEvaluator.cpp +++ b/opensubdiv/osd/tbbEvaluator.cpp @@ -75,8 +75,55 @@ TbbEvaluator::EvalStencils( dst, dstDesc, du, duDesc, dv, dvDesc, + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + sizes, offsets, indices, + weights, duWeights, dvWeights, NULL, NULL, NULL, + start, end); + + return true; +} + +/* static */ +bool +TbbEvaluator::EvalStencils( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + 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; + if (srcDesc.length != duuDesc.length) return false; + if (srcDesc.length != duvDesc.length) return false; + if (srcDesc.length != dvvDesc.length) return false; + + TbbEvalStencils(src, srcDesc, + dst, dstDesc, + du, duDesc, + dv, dvDesc, + duu, duuDesc, + duv, duvDesc, + dvv, dvvDesc, sizes, offsets, indices, weights, duWeights, dvWeights, + duuWeights, duvWeights, dvvWeights, start, end); return true; @@ -96,6 +143,9 @@ TbbEvaluator::EvalPatches( if (srcDesc.length != dstDesc.length) return false; TbbEvalPatches(src, srcDesc, dst, dstDesc, + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), NULL, BufferDescriptor(), NULL, BufferDescriptor(), numPatchCoords, patchCoords, @@ -121,6 +171,36 @@ TbbEvaluator::EvalPatches( TbbEvalPatches(src, srcDesc, dst, dstDesc, du, duDesc, dv, dvDesc, + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + numPatchCoords, patchCoords, + patchArrayBuffer, patchIndexBuffer, patchParamBuffer); + + return true; +} + +/* static */ +bool +TbbEvaluator::EvalPatches( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrayBuffer, + const int *patchIndexBuffer, + const PatchParam *patchParamBuffer) { + + if (srcDesc.length != dstDesc.length) return false; + + TbbEvalPatches(src, srcDesc, dst, dstDesc, + du, duDesc, dv, dvDesc, + duu, duuDesc, duv, duvDesc, dvv, dvvDesc, numPatchCoords, patchCoords, patchArrayBuffer, patchIndexBuffer, patchParamBuffer); diff --git a/opensubdiv/osd/tbbEvaluator.h b/opensubdiv/osd/tbbEvaluator.h index ca4c955d..6bd365bc 100644 --- a/opensubdiv/osd/tbbEvaluator.h +++ b/opensubdiv/osd/tbbEvaluator.h @@ -244,6 +244,177 @@ public: const float * dvWeights, 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 buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @param stencilTable Far::StencilTable or equivalent + /// + /// @param instance not used in the tbb kernel + /// (declared as a typed pointer to prevent + /// undesirable template resolution) + /// + /// @param deviceContext not used in the tbb 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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + STENCIL_TABLE const *stencilTable, + const TbbEvaluator *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, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + &stencilTable->GetSizes()[0], + &stencilTable->GetOffsets()[0], + &stencilTable->GetControlIndices()[0], + &stencilTable->GetWeights()[0], + &stencilTable->GetDuWeights()[0], + &stencilTable->GetDvWeights()[0], + &stencilTable->GetDuuWeights()[0], + &stencilTable->GetDuvWeights()[0], + &stencilTable->GetDvvWeights()[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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 duuWeights pointer to the duu-weights buffer of the stencil table + /// + /// @param duvWeights pointer to the duv-weights buffer of the stencil table + /// + /// @param dvvWeights pointer to the dvv-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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + int start, int end); + /// ---------------------------------------------------------------------- /// /// Limit evaluations with PatchTable @@ -373,6 +544,102 @@ public: 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 buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + TbbEvaluator 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, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + 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. /// @@ -457,6 +724,72 @@ public: const int *patchIndexBuffer, PatchParam const *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 pointer derivative wrt u. An offset of + /// duDesc will be applied internally. + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dv Output pointer derivative wrt v. An offset of + /// dvDesc will be applied internally. + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duu Output pointer 2nd derivative wrt u. An offset of + /// duuDesc will be applied internally. + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duv Output pointer 2nd derivative wrt u and v. An offset of + /// duvDesc will be applied internally. + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvv Output pointer 2nd derivative wrt v. An offset of + /// dvvDesc will be applied internally. + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PatchCoord const *patchCoords, + PatchArray const *patchArrays, + const int *patchIndexBuffer, + PatchParam const *patchParamBuffer); + /// \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. @@ -508,6 +841,164 @@ public: patchTable->GetPatchParamBuffer()); } + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// 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 EvalPatchesVarying( + 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, + TbbEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 EvalPatchesVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + TbbEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetVaryingPatchArrayBuffer(), + patchTable->GetVaryingPatchIndexBuffer(), + patchTable->GetPatchParamBuffer()); + } + /// \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. @@ -562,6 +1053,170 @@ public: patchTable->GetFVarPatchParamBuffer(fvarChannel)); } + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// 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 fvarChannel face-varying channel + /// + /// @param instance not used in the cpu evaluator + /// + /// @param deviceContext not used in the cpu evaluator + /// + template + static bool EvalPatchesFaceVarying( + 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, + int fvarChannel, + TbbEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + + /// \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 duBuffer Output buffer derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duDesc vertex buffer descriptor for the duBuffer + /// + /// @param dvBuffer Output buffer derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvDesc vertex buffer descriptor for the dvBuffer + /// + /// @param duuBuffer Output buffer 2nd derivative wrt u + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duuDesc vertex buffer descriptor for the duuBuffer + /// + /// @param duvBuffer Output buffer 2nd derivative wrt u and v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param duvDesc vertex buffer descriptor for the duvBuffer + /// + /// @param dvvBuffer Output buffer 2nd derivative wrt v + /// must have BindCpuBuffer() method returning a + /// float pointer for write + /// + /// @param dvvDesc vertex buffer descriptor for the dvvBuffer + /// + /// @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 fvarChannel face-varying channel + /// + /// @param instance not used in the cpu evaluator + /// + /// @param deviceContext not used in the cpu evaluator + /// + template + static bool EvalPatchesFaceVarying( + SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, + DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, + DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, + DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, + DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, + DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, + DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, + int numPatchCoords, + PATCHCOORD_BUFFER *patchCoords, + PATCH_TABLE *patchTable, + int fvarChannel, + TbbEvaluator const *instance = NULL, + void * deviceContext = NULL) { + + (void)instance; // unused + (void)deviceContext; // unused + + return EvalPatches(srcBuffer->BindCpuBuffer(), srcDesc, + dstBuffer->BindCpuBuffer(), dstDesc, + duBuffer->BindCpuBuffer(), duDesc, + dvBuffer->BindCpuBuffer(), dvDesc, + duuBuffer->BindCpuBuffer(), duuDesc, + duvBuffer->BindCpuBuffer(), duvDesc, + dvvBuffer->BindCpuBuffer(), dvvDesc, + numPatchCoords, + (const PatchCoord*)patchCoords->BindCpuBuffer(), + patchTable->GetFVarPatchArrayBuffer(fvarChannel), + patchTable->GetFVarPatchIndexBuffer(fvarChannel), + patchTable->GetFVarPatchParamBuffer(fvarChannel)); + } + /// ---------------------------------------------------------------------- /// /// Other methods diff --git a/opensubdiv/osd/tbbKernel.cpp b/opensubdiv/osd/tbbKernel.cpp index 2078dc85..ddd550e0 100644 --- a/opensubdiv/osd/tbbKernel.cpp +++ b/opensubdiv/osd/tbbKernel.cpp @@ -219,6 +219,78 @@ TbbEvalStencils(float const * src, BufferDescriptor const &srcDesc, tbb::blocked_range range(start, end, grain_size); tbb::parallel_for(range, kernel); } + +} + +void +TbbEvalStencils(float const * src, BufferDescriptor const &srcDesc, + float * dst, BufferDescriptor const &dstDesc, + float * du, BufferDescriptor const &duDesc, + float * dv, BufferDescriptor const &dvDesc, + float * duu, BufferDescriptor const &duuDesc, + float * duv, BufferDescriptor const &duvDesc, + float * dvv, BufferDescriptor const &dvvDesc, + int const * sizes, + int const * offsets, + int const * indices, + float const * weights, + float const * duWeights, + float const * dvWeights, + float const * duuWeights, + float const * duvWeights, + float const * dvvWeights, + int start, int end) { + + if (src) src += srcDesc.offset; + if (dst) dst += dstDesc.offset; + if (du) du += duDesc.offset; + if (dv) dv += dvDesc.offset; + if (duu) duu += duuDesc.offset; + if (duv) duv += duvDesc.offset; + if (dvv) dvv += dvvDesc.offset; + + // PERFORMANCE: need to combine 3 launches together + if (dst) { + TBBStencilKernel kernel(src, srcDesc, dst, dstDesc, + sizes, offsets, indices, weights); + tbb::blocked_range range(start, end, grain_size); + tbb::parallel_for(range, kernel); + } + + if (du) { + TBBStencilKernel kernel(src, srcDesc, du, duDesc, + sizes, offsets, indices, duWeights); + tbb::blocked_range range(start, end, grain_size); + tbb::parallel_for(range, kernel); + } + + if (dv) { + TBBStencilKernel kernel(src, srcDesc, dv, dvDesc, + sizes, offsets, indices, dvWeights); + tbb::blocked_range range(start, end, grain_size); + tbb::parallel_for(range, kernel); + } + + if (duu) { + TBBStencilKernel kernel(src, srcDesc, duu, duuDesc, + sizes, offsets, indices, duuWeights); + tbb::blocked_range range(start, end, grain_size); + tbb::parallel_for(range, kernel); + } + + if (duv) { + TBBStencilKernel kernel(src, srcDesc, duv, duvDesc, + sizes, offsets, indices, duvWeights); + tbb::blocked_range range(start, end, grain_size); + tbb::parallel_for(range, kernel); + } + + if (dvv) { + TBBStencilKernel kernel(src, srcDesc, dvv, dvvDesc, + sizes, offsets, indices, dvvWeights); + tbb::blocked_range range(start, end, grain_size); + tbb::parallel_for(range, kernel); + } } // --------------------------------------------------------------------------- @@ -257,10 +329,16 @@ class TbbEvalPatchesKernel { BufferDescriptor _dstDesc; BufferDescriptor _dstDuDesc; BufferDescriptor _dstDvDesc; + BufferDescriptor _dstDuuDesc; + BufferDescriptor _dstDuvDesc; + BufferDescriptor _dstDvvDesc; float const * _src; float * _dst; float * _dstDu; float * _dstDv; + float * _dstDuu; + float * _dstDuv; + float * _dstDvv; int _numPatchCoords; const PatchCoord *_patchCoords; const PatchArray *_patchArrayBuffer; @@ -272,6 +350,9 @@ public: float *dst, BufferDescriptor dstDesc, float *dstDu, BufferDescriptor dstDuDesc, float *dstDv, BufferDescriptor dstDvDesc, + float *dstDuu, BufferDescriptor dstDuuDesc, + float *dstDuv, BufferDescriptor dstDuvDesc, + float *dstDvv, BufferDescriptor dstDvvDesc, int numPatchCoords, const PatchCoord *patchCoords, const PatchArray *patchArrayBuffer, @@ -279,7 +360,10 @@ public: const PatchParam *patchParamBuffer) : _srcDesc(srcDesc), _dstDesc(dstDesc), _dstDuDesc(dstDuDesc), _dstDvDesc(dstDvDesc), - _src(src), _dst(dst), _dstDu(dstDu), _dstDv(dstDv), + _dstDuuDesc(dstDuuDesc), _dstDuvDesc(dstDuvDesc), _dstDvvDesc(dstDvvDesc), + _src(src), _dst(dst), + _dstDu(dstDu), _dstDv(dstDv), + _dstDuu(dstDuu), _dstDuv(dstDuv), _dstDvv(dstDvv), _numPatchCoords(numPatchCoords), _patchCoords(patchCoords), _patchArrayBuffer(patchArrayBuffer), @@ -290,13 +374,15 @@ public: void operator() (tbb::blocked_range const &r) const { if (_dstDu == NULL && _dstDv == NULL) { compute(r); + } else if (_dstDuu == NULL && _dstDuv == NULL && _dstDvv == NULL) { + computeWith1stDerivative(r); } else { - computeWithDerivative(r); + computeWith2ndDerivative(r); } } void compute(tbb::blocked_range const &r) const { - float wP[20], wDs[20], wDt[20]; + float wP[20], wDu[20], wDv[20]; BufferAdapter srcT(_src + _srcDesc.offset, _srcDesc.length, _srcDesc.stride); @@ -305,10 +391,66 @@ public: _dstDesc.length, _dstDesc.stride); - BufferAdapter dstDuT(_dstDu, + + for (int i = r.begin(); i < r.end(); ++i) { + PatchCoord const &coord = _patchCoords[i]; + PatchArray const &array = _patchArrayBuffer[coord.handle.arrayIndex]; + + Far::PatchParam const & param = + _patchParamBuffer[coord.handle.patchIndex]; + int patchType = param.IsRegular() + ? Far::PatchDescriptor::REGULAR + : array.GetPatchType(); + + int numControlVertices = 0; + if (patchType == Far::PatchDescriptor::REGULAR) { + Far::internal::GetBSplineWeights(param, + coord.s, coord.t, wP, + wDu, wDv); + numControlVertices = 16; + } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { + Far::internal::GetGregoryWeights(param, + coord.s, coord.t, wP, + wDu, wDv); + numControlVertices = 20; + } else if (patchType == Far::PatchDescriptor::QUADS) { + Far::internal::GetBilinearWeights(param, + coord.s, coord.t, wP, + wDu, wDv); + numControlVertices = 4; + } else { + assert(0); + } + + int indexStride = Far::PatchDescriptor(array.GetPatchType()).GetNumControlVertices(); + int indexBase = array.GetIndexBase() + indexStride * + (coord.handle.patchIndex - array.GetPrimitiveIdBase()); + + const int *cvs = &_patchIndexBuffer[indexBase]; + + dstT.Clear(); + for (int j = 0; j < numControlVertices; ++j) { + dstT.AddWithWeight(srcT[cvs[j]], wP[j]); + } + ++dstT; + } + } + + void computeWith1stDerivative(tbb::blocked_range const &r) const { + float wP[20], wDu[20], wDv[20]; + BufferAdapter srcT(_src + _srcDesc.offset, + _srcDesc.length, + _srcDesc.stride); + BufferAdapter dstT(_dst + _dstDesc.offset + + r.begin() * _dstDesc.stride, + _dstDesc.length, + _dstDesc.stride); + BufferAdapter dstDuT(_dstDu + _dstDuDesc.offset + + r.begin() * _dstDuDesc.stride, _dstDuDesc.length, _dstDuDesc.stride); - BufferAdapter dstDvT(_dstDv, + BufferAdapter dstDvT(_dstDv + _dstDvDesc.offset + + r.begin() * _dstDvDesc.stride, _dstDvDesc.length, _dstDvDesc.stride); @@ -325,74 +467,18 @@ public: int numControlVertices = 0; if (patchType == Far::PatchDescriptor::REGULAR) { Far::internal::GetBSplineWeights(param, - coord.s, coord.t, wP, wDs, wDt); + coord.s, coord.t, wP, + wDu, wDv); numControlVertices = 16; } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { Far::internal::GetGregoryWeights(param, - coord.s, coord.t, wP, wDs, wDt); + coord.s, coord.t, wP, + wDu, wDv); numControlVertices = 20; } else if (patchType == Far::PatchDescriptor::QUADS) { Far::internal::GetBilinearWeights(param, - coord.s, coord.t, wP, wDs, wDt); - numControlVertices = 4; - } else { - assert(0); - } - - int indexStride = Far::PatchDescriptor(array.GetPatchType()).GetNumControlVertices(); - int indexBase = array.GetIndexBase() + indexStride * - (coord.handle.patchIndex - array.GetPrimitiveIdBase()); - - const int *cvs = &_patchIndexBuffer[indexBase]; - - dstT.Clear(); - for (int j = 0; j < numControlVertices; ++j) { - dstT.AddWithWeight(srcT[cvs[j]], wP[j]); - } - ++dstT; - } - } - - void computeWithDerivative(tbb::blocked_range const &r) const { - float wP[20], wDs[20], wDt[20]; - BufferAdapter srcT(_src + _srcDesc.offset, - _srcDesc.length, - _srcDesc.stride); - BufferAdapter dstT(_dst + _dstDesc.offset - + r.begin() * _dstDesc.stride, - _dstDesc.length, - _dstDesc.stride); - BufferAdapter dstDuT(_dstDu + _dstDuDesc.offset - + r.begin() * _dstDuDesc.stride, - _dstDuDesc.length, - _dstDuDesc.stride); - BufferAdapter dstDvT(_dstDv + _dstDvDesc.offset - + r.begin() * _dstDvDesc.stride, - _dstDvDesc.length, - _dstDvDesc.stride); - - for (int i = r.begin(); i < r.end(); ++i) { - PatchCoord const &coord = _patchCoords[i]; - PatchArray const &array = _patchArrayBuffer[coord.handle.arrayIndex]; - - Far::PatchParam const & param = - _patchParamBuffer[coord.handle.patchIndex]; - int patchType = param.IsRegular() - ? Far::PatchDescriptor::REGULAR - : array.GetPatchType(); - - int numControlVertices = 0; - if (patchType == Far::PatchDescriptor::REGULAR) { - Far::internal::GetBSplineWeights(param, - coord.s, coord.t, wP, wDs, wDt); - numControlVertices = 16; - } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { - Far::internal::GetGregoryWeights(param, - coord.s, coord.t, wP, wDs, wDt); - numControlVertices = 20; - } else if (patchType == Far::PatchDescriptor::QUADS) { - Far::internal::GetBilinearWeights(param, - coord.s, coord.t, wP, wDs, wDt); + coord.s, coord.t, + wP, wDu, wDv); numControlVertices = 4; } else { assert(0); @@ -409,14 +495,103 @@ public: dstDvT.Clear(); for (int j = 0; j < numControlVertices; ++j) { dstT.AddWithWeight(srcT[cvs[j]], wP[j]); - dstDuT.AddWithWeight(srcT[cvs[j]], wDs[j]); - dstDvT.AddWithWeight(srcT[cvs[j]], wDt[j]); + dstDuT.AddWithWeight(srcT[cvs[j]], wDu[j]); + dstDvT.AddWithWeight(srcT[cvs[j]], wDv[j]); } ++dstT; ++dstDuT; ++dstDvT; } } + + void computeWith2ndDerivative(tbb::blocked_range const &r) const { + float wP[20], wDu[20], wDv[20], wDuu[20], wDuv[20], wDvv[20]; + BufferAdapter srcT(_src + _srcDesc.offset, + _srcDesc.length, + _srcDesc.stride); + BufferAdapter dstT(_dst + _dstDesc.offset + + r.begin() * _dstDesc.stride, + _dstDesc.length, + _dstDesc.stride); + BufferAdapter dstDuT(_dstDu + _dstDuDesc.offset + + r.begin() * _dstDuDesc.stride, + _dstDuDesc.length, + _dstDuDesc.stride); + BufferAdapter dstDvT(_dstDv + _dstDvDesc.offset + + r.begin() * _dstDvDesc.stride, + _dstDvDesc.length, + _dstDvDesc.stride); + BufferAdapter dstDuuT(_dstDuu + _dstDuuDesc.offset + + r.begin() * _dstDuuDesc.stride, + _dstDuuDesc.length, + _dstDuuDesc.stride); + BufferAdapter dstDuvT(_dstDuv + _dstDuvDesc.offset + + r.begin() * _dstDuvDesc.stride, + _dstDuvDesc.length, + _dstDuvDesc.stride); + BufferAdapter dstDvvT(_dstDvv + _dstDvvDesc.offset + + r.begin() * _dstDvvDesc.stride, + _dstDvvDesc.length, + _dstDvvDesc.stride); + + for (int i = r.begin(); i < r.end(); ++i) { + PatchCoord const &coord = _patchCoords[i]; + PatchArray const &array = _patchArrayBuffer[coord.handle.arrayIndex]; + + Far::PatchParam const & param = + _patchParamBuffer[coord.handle.patchIndex]; + int patchType = param.IsRegular() + ? Far::PatchDescriptor::REGULAR + : array.GetPatchType(); + + int numControlVertices = 0; + if (patchType == Far::PatchDescriptor::REGULAR) { + Far::internal::GetBSplineWeights(param, + coord.s, coord.t, wP, + wDu, wDv, wDuu, wDuv, wDvv); + numControlVertices = 16; + } else if (patchType == Far::PatchDescriptor::GREGORY_BASIS) { + Far::internal::GetGregoryWeights(param, + coord.s, coord.t, wP, + wDu, wDv, wDuu, wDuv, wDvv); + numControlVertices = 20; + } else if (patchType == Far::PatchDescriptor::QUADS) { + Far::internal::GetBilinearWeights(param, + coord.s, coord.t, wP, + wDu, wDv, wDuu, wDuv, wDvv); + numControlVertices = 4; + } else { + assert(0); + } + + int indexStride = Far::PatchDescriptor(array.GetPatchType()).GetNumControlVertices(); + int indexBase = array.GetIndexBase() + indexStride * + (coord.handle.patchIndex - array.GetPrimitiveIdBase()); + + const int *cvs = &_patchIndexBuffer[indexBase]; + + dstT.Clear(); + dstDuT.Clear(); + dstDvT.Clear(); + dstDuuT.Clear(); + dstDuvT.Clear(); + dstDvvT.Clear(); + for (int j = 0; j < numControlVertices; ++j) { + dstT.AddWithWeight(srcT[cvs[j]], wP[j]); + dstDuT.AddWithWeight(srcT[cvs[j]], wDu[j]); + dstDvT.AddWithWeight(srcT[cvs[j]], wDv[j]); + dstDuuT.AddWithWeight(srcT[cvs[j]], wDuu[j]); + dstDuvT.AddWithWeight(srcT[cvs[j]], wDuv[j]); + dstDvvT.AddWithWeight(srcT[cvs[j]], wDvv[j]); + } + ++dstT; + ++dstDuT; + ++dstDvT; + ++dstDuuT; + ++dstDuvT; + ++dstDvvT; + } + } }; @@ -433,6 +608,39 @@ TbbEvalPatches(float const *src, BufferDescriptor const &srcDesc, TbbEvalPatchesKernel kernel(src, srcDesc, dst, dstDesc, dstDu, dstDuDesc, dstDv, dstDvDesc, + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + NULL, BufferDescriptor(), + numPatchCoords, patchCoords, + patchArrayBuffer, + patchIndexBuffer, + patchParamBuffer); + + tbb::blocked_range range(0, numPatchCoords, grain_size); + tbb::parallel_for(range, kernel); + +} + + +void +TbbEvalPatches(float const *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *dstDu, BufferDescriptor const &dstDuDesc, + float *dstDv, BufferDescriptor const &dstDvDesc, + float *dstDuu, BufferDescriptor const &dstDuuDesc, + float *dstDuv, BufferDescriptor const &dstDuvDesc, + float *dstDvv, BufferDescriptor const &dstDvvDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrayBuffer, + const int *patchIndexBuffer, + const PatchParam *patchParamBuffer) { + + TbbEvalPatchesKernel kernel(src, srcDesc, dst, dstDesc, + dstDu, dstDuDesc, dstDv, dstDvDesc, + dstDuu, dstDuuDesc, + dstDuv, dstDuvDesc, + dstDvv, dstDvvDesc, numPatchCoords, patchCoords, patchArrayBuffer, patchIndexBuffer, diff --git a/opensubdiv/osd/tbbKernel.h b/opensubdiv/osd/tbbKernel.h index 37623f99..dc112b88 100644 --- a/opensubdiv/osd/tbbKernel.h +++ b/opensubdiv/osd/tbbKernel.h @@ -61,6 +61,25 @@ TbbEvalStencils(float const * src, BufferDescriptor const &srcDesc, float const * dvWeights, int start, int end); +void +TbbEvalStencils(float const * src, BufferDescriptor const &srcDesc, + float * dst, BufferDescriptor const &dstDesc, + float * dstDu, BufferDescriptor const &dstDuDesc, + float * dstDv, BufferDescriptor const &dstDvDesc, + float * dstDuu, BufferDescriptor const &dstDuuDesc, + float * dstDuv, BufferDescriptor const &dstDuvDesc, + float * dstDvv, BufferDescriptor const &dstDvvDesc, + int const * sizes, + int const * offsets, + int const * indices, + float const * weights, + float const * duWeights, + float const * dvWeights, + float const * duuWeights, + float const * duvWeights, + float const * dvvWeights, + int start, int end); + void TbbEvalPatches(float const *src, BufferDescriptor const &srcDesc, float *dst, BufferDescriptor const &dstDesc, @@ -72,6 +91,20 @@ TbbEvalPatches(float const *src, BufferDescriptor const &srcDesc, const int *patchIndexBuffer, const PatchParam *patchParamBuffer); +void +TbbEvalPatches(float const *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *dstDu, BufferDescriptor const &dstDuDesc, + float *dstDv, BufferDescriptor const &dstDvDesc, + float *dstDuu, BufferDescriptor const &dstDuuDesc, + float *dstDuv, BufferDescriptor const &dstDuvDesc, + float *dstDvv, BufferDescriptor const &dstDvvDesc, + int numPatchCoords, + const PatchCoord *patchCoords, + const PatchArray *patchArrayBuffer, + const int *patchIndexBuffer, + const PatchParam *patchParamBuffer); + } // end namespace Osd } // end namespace OPENSUBDIV_VERSION From 8d3ba7372a2f3cb6c6dc8565d4884e39624f6ed8 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Wed, 25 Jan 2017 14:03:24 -0800 Subject: [PATCH 15/20] Updated OsdMesh for 2nd partial deriv buffers --- opensubdiv/osd/mesh.h | 92 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 6 deletions(-) diff --git a/opensubdiv/osd/mesh.h b/opensubdiv/osd/mesh.h index 575d7964..39f6674b 100644 --- a/opensubdiv/osd/mesh.h +++ b/opensubdiv/osd/mesh.h @@ -175,7 +175,7 @@ convertToCompatibleStencilTable Evaluators; @@ -208,6 +227,9 @@ public: BufferDescriptor const &dstDesc, DEVICE_CONTEXT *deviceContext) { return GetEvaluator(srcDesc, dstDesc, + BufferDescriptor(), + BufferDescriptor(), + BufferDescriptor(), BufferDescriptor(), BufferDescriptor(), deviceContext); @@ -219,20 +241,43 @@ public: BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, DEVICE_CONTEXT *deviceContext) { + return GetEvaluator(srcDesc, dstDesc, + duDesc, dvDesc, + BufferDescriptor(), + BufferDescriptor(), + BufferDescriptor(), + deviceContext); + } + + template + EVALUATOR *GetEvaluator(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + DEVICE_CONTEXT *deviceContext) { for(typename Evaluators::iterator it = _evaluators.begin(); it != _evaluators.end(); ++it) { if (isEqual(srcDesc, it->srcDesc) && isEqual(dstDesc, it->dstDesc) && - isEqual(duDesc, it->duDesc) && - isEqual(dvDesc, it->dvDesc)) { + isEqual(duDesc, it->duDesc) && + isEqual(dvDesc, it->dvDesc) && + isEqual(duuDesc, it->duuDesc) && + isEqual(duvDesc, it->duvDesc) && + isEqual(dvvDesc, it->dvvDesc)) { return it->evaluator; } } EVALUATOR *e = EVALUATOR::Create(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, deviceContext); - _evaluators.push_back(Entry(srcDesc, dstDesc, duDesc, dvDesc, e)); + _evaluators.push_back(Entry(srcDesc, dstDesc, + duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc, e)); return e; } @@ -272,6 +317,25 @@ struct enable_if { }; /// @endcond // extract a kernel from cache if available +template +static EVALUATOR *GetEvaluator( + EvaluatorCacheT *cache, + BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + DEVICE_CONTEXT deviceContext, + typename enable_if::value, void>::type*t=0) { + (void)t; + if (cache == NULL) return NULL; + return cache->GetEvaluator(srcDesc, dstDesc, + duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, + deviceContext); +} + template static EVALUATOR *GetEvaluator( EvaluatorCacheT *cache, @@ -302,6 +366,22 @@ static EVALUATOR *GetEvaluator( } // fallback +template +static EVALUATOR *GetEvaluator( + EvaluatorCacheT *, + BufferDescriptor const &, + BufferDescriptor const &, + BufferDescriptor const &, + BufferDescriptor const &, + BufferDescriptor const &, + BufferDescriptor const &, + BufferDescriptor const &, + DEVICE_CONTEXT, + typename enable_if::value, void>::type*t=0) { + (void)t; + return NULL; +} + template static EVALUATOR *GetEvaluator( EvaluatorCacheT *, From 3d36a9de66734023fe13e5d77ede2934d70c4ff1 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Thu, 26 Jan 2017 14:37:08 -0800 Subject: [PATCH 16/20] Updated glEvalLimit to display curvature Added an option to display mean curvature computed by evaluating 2nd partial derivatives --- examples/glEvalLimit/glEvalLimit.cpp | 149 ++++++++++++++++++--------- 1 file changed, 103 insertions(+), 46 deletions(-) diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 8a924ebf..6f3a5652 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -121,7 +121,8 @@ enum DrawMode { kUV, kVARYING, kNORMAL, kSHADE, - kFACEVARYING }; + kFACEVARYING, + kMEAN_CURVATURE }; std::vector g_orgPositions, g_positions, @@ -192,8 +193,11 @@ struct Program { GLuint uniformDrawMode; GLuint attrPosition; GLuint attrColor; - GLuint attrTangentU; - GLuint attrTangentV; + GLuint attrDu; + GLuint attrDv; + GLuint attrDuu; + GLuint attrDuv; + GLuint attrDvv; GLuint attrPatchCoord; GLuint attrFVarData; } g_defaultProgram; @@ -221,7 +225,8 @@ public: virtual ~EvalOutputBase() {} virtual GLuint BindSourceData() const = 0; virtual GLuint BindVertexData() const = 0; - virtual GLuint BindDerivatives() const = 0; + virtual GLuint Bind1stDerivatives() const = 0; + virtual GLuint Bind2ndDerivatives() const = 0; virtual GLuint BindFaceVaryingData() const = 0; virtual GLuint BindPatchCoords() const = 0; virtual void UpdateData(const float *src, int startVertex, int numVertices) = 0; @@ -230,7 +235,8 @@ public: virtual bool HasFaceVaryingData() const = 0; virtual void Refine() = 0; virtual void EvalPatches() = 0; - virtual void EvalPatchesWithDerivatives() = 0; + virtual void EvalPatchesWith1stDerivatives() = 0; + virtual void EvalPatchesWith2ndDerivatives() = 0; virtual void EvalPatchesVarying() = 0; virtual void EvalPatchesFaceVarying() = 0; virtual void UpdatePatchCoords( @@ -264,6 +270,9 @@ public: _fvarDesc( /*offset*/ 0, /*length*/ fvarWidth, /*stride*/ fvarWidth), _duDesc( /*offset*/ 0, /*length*/ 3, /*stride*/ 6), _dvDesc( /*offset*/ 3, /*length*/ 3, /*stride*/ 6), + _duuDesc( /*offset*/ 0, /*length*/ 3, /*stride*/ 9), + _duvDesc( /*offset*/ 3, /*length*/ 3, /*stride*/ 9), + _dvvDesc( /*offset*/ 6, /*length*/ 3, /*stride*/ 9), _deviceContext(deviceContext) { // total number of vertices = coarse points + refined points + local points @@ -273,7 +282,8 @@ public: _srcData = SRC_VERTEX_BUFFER::Create(3, numTotalVerts, _deviceContext); _srcVaryingData = SRC_VERTEX_BUFFER::Create(3, numTotalVerts, _deviceContext); _vertexData = EVAL_VERTEX_BUFFER::Create(6, numParticles, _deviceContext); - _derivatives = EVAL_VERTEX_BUFFER::Create(6, numParticles, _deviceContext); + _deriv1 = EVAL_VERTEX_BUFFER::Create(6, numParticles, _deviceContext); + _deriv2 = EVAL_VERTEX_BUFFER::Create(9, numParticles, _deviceContext); _patchTable = PATCH_TABLE::Create(patchTable, _deviceContext); _patchCoords = NULL; _numCoarseVerts = vertexStencils->GetNumControlVertices(); @@ -307,7 +317,8 @@ public: delete _srcVaryingData; delete _srcFVarData; delete _vertexData; - delete _derivatives; + delete _deriv1; + delete _deriv2; delete _fvarData; delete _patchTable; delete _patchCoords; @@ -321,8 +332,11 @@ public: virtual GLuint BindVertexData() const { return _vertexData->BindVBO(); } - virtual GLuint BindDerivatives() const { - return _derivatives->BindVBO(); + virtual GLuint Bind1stDerivatives() const { + return _deriv1->BindVBO(); + } + virtual GLuint Bind2ndDerivatives() const { + return _deriv2->BindVBO(); } virtual GLuint BindFaceVaryingData() const { return _fvarData->BindVBO(); @@ -392,14 +406,31 @@ public: _patchCoords, _patchTable, evalInstance, _deviceContext); } - virtual void EvalPatchesWithDerivatives() { + virtual void EvalPatchesWith1stDerivatives() { EVALUATOR const *evalInstance = OpenSubdiv::Osd::GetEvaluator( _evaluatorCache, _srcDesc, _vertexDesc, _duDesc, _dvDesc, _deviceContext); EVALUATOR::EvalPatches( _srcData, _srcDesc, _vertexData, _vertexDesc, - _derivatives, _duDesc, - _derivatives, _dvDesc, + _deriv1, _duDesc, + _deriv1, _dvDesc, + _patchCoords->GetNumVertices(), + _patchCoords, + _patchTable, evalInstance, _deviceContext); + } + virtual void EvalPatchesWith2ndDerivatives() { + EVALUATOR const *evalInstance = OpenSubdiv::Osd::GetEvaluator( + _evaluatorCache, _srcDesc, _vertexDesc, + _duDesc, _dvDesc, _duuDesc, _duvDesc, _dvvDesc, + _deviceContext); + EVALUATOR::EvalPatches( + _srcData, _srcDesc, + _vertexData, _vertexDesc, + _deriv1, _duDesc, + _deriv1, _dvDesc, + _deriv2, _duuDesc, + _deriv2, _duvDesc, + _deriv2, _dvvDesc, _patchCoords->GetNumVertices(), _patchCoords, _patchTable, evalInstance, _deviceContext); @@ -446,7 +477,8 @@ private: SRC_VERTEX_BUFFER *_srcVaryingData; EVAL_VERTEX_BUFFER *_srcFVarData; EVAL_VERTEX_BUFFER *_vertexData; - EVAL_VERTEX_BUFFER *_derivatives; + EVAL_VERTEX_BUFFER *_deriv1; + EVAL_VERTEX_BUFFER *_deriv2; EVAL_VERTEX_BUFFER *_fvarData; EVAL_VERTEX_BUFFER *_patchCoords; PATCH_TABLE *_patchTable; @@ -458,6 +490,9 @@ private: Osd::BufferDescriptor _fvarDesc; Osd::BufferDescriptor _duDesc; Osd::BufferDescriptor _dvDesc; + Osd::BufferDescriptor _duuDesc; + Osd::BufferDescriptor _duvDesc; + Osd::BufferDescriptor _dvvDesc; int _numCoarseVerts; int _numCoarseFVarVerts; @@ -532,9 +567,12 @@ updateGeom() { g_evalOutput->UpdatePatchCoords(patchCoords); // Evaluate the positions of the samples on the limit surface - if (g_drawMode == kNORMAL || g_drawMode == kSHADE) { - // evaluate positions and derivatives - g_evalOutput->EvalPatchesWithDerivatives(); + if (g_drawMode == kMEAN_CURVATURE) { + // evaluate positions and 2nd derivatives + g_evalOutput->EvalPatchesWith2ndDerivatives(); + } else if (g_drawMode == kNORMAL || g_drawMode == kSHADE) { + // evaluate positions and 1st derivatives + g_evalOutput->EvalPatchesWith1stDerivatives(); } else { // evaluate positions g_evalOutput->EvalPatches(); @@ -823,8 +861,11 @@ linkDefaultProgram() { GLSL_VERSION_DEFINE "in vec3 position;\n" "in vec3 color;\n" - "in vec3 tangentU;\n" - "in vec3 tangentV;\n" + "in vec3 du;\n" + "in vec3 dv;\n" + "in vec3 duu;\n" + "in vec3 duv;\n" + "in vec3 dvv;\n" "in vec2 patchCoord;\n" "in vec2 fvarData;\n" "out vec4 fragColor;\n" @@ -833,7 +874,7 @@ linkDefaultProgram() { "uniform int DrawMode;\n" "void main() {\n" " vec3 normal = (ModelViewMatrix * " - " vec4(normalize(cross(tangentU, tangentV)), 0)).xyz;\n" + " vec4(normalize(cross(du, dv)), 0)).xyz;\n" " gl_Position = ProjectionMatrix * ModelViewMatrix * " " vec4(position, 1);\n" " if (DrawMode == 0) {\n" // UV @@ -846,6 +887,16 @@ linkDefaultProgram() { " // generating a checkerboard pattern\n" " int checker = int(floor(20*fvarData.r)+floor(20*fvarData.g))&1;\n" " fragColor = vec4(fvarData.rg*checker, 1-checker, 1);\n" + " } else if (DrawMode == 5) {\n" // mean curvature + " vec3 N = normalize(cross(du, dv));\n" + " float E = dot(du, du);\n" + " float F = dot(du, dv);\n" + " float G = dot(dv, dv);\n" + " float e = dot(N, duu);\n" + " float f = dot(N, duv);\n" + " float g = dot(N, dvv);\n" + " float H = 0.5 * abs(0.5 * (E*g - 2*F*f - G*e) / (E*G - F*F));\n" + " fragColor = vec4(H, H, H, 1.0);\n" " } else {\n" // varying " fragColor = vec4(color, 1);\n" " }\n" @@ -868,10 +919,13 @@ linkDefaultProgram() { glBindAttribLocation(program, 0, "position"); glBindAttribLocation(program, 1, "color"); - glBindAttribLocation(program, 2, "tangentU"); - glBindAttribLocation(program, 3, "tangentV"); - glBindAttribLocation(program, 4, "patchCoord"); - glBindAttribLocation(program, 5, "fvarData"); + glBindAttribLocation(program, 2, "du"); + glBindAttribLocation(program, 3, "dv"); + glBindAttribLocation(program, 4, "duu"); + glBindAttribLocation(program, 5, "duv"); + glBindAttribLocation(program, 6, "dvv"); + glBindAttribLocation(program, 7, "patchCoord"); + glBindAttribLocation(program, 8, "fvarData"); glBindFragDataLocation(program, 0, "color"); glLinkProgram(program); @@ -897,8 +951,11 @@ linkDefaultProgram() { glGetUniformLocation(program, "DrawMode"); g_defaultProgram.attrPosition = glGetAttribLocation(program, "position"); g_defaultProgram.attrColor = glGetAttribLocation(program, "color"); - g_defaultProgram.attrTangentU = glGetAttribLocation(program, "tangentU"); - g_defaultProgram.attrTangentV = glGetAttribLocation(program, "tangentV"); + g_defaultProgram.attrDu = glGetAttribLocation(program, "du"); + g_defaultProgram.attrDv = glGetAttribLocation(program, "dv"); + g_defaultProgram.attrDuu = glGetAttribLocation(program, "duu"); + g_defaultProgram.attrDuv = glGetAttribLocation(program, "duv"); + g_defaultProgram.attrDvv = glGetAttribLocation(program, "dvv"); g_defaultProgram.attrPatchCoord = glGetAttribLocation(program, "patchCoord"); g_defaultProgram.attrFVarData = glGetAttribLocation(program, "fvarData"); @@ -920,36 +977,32 @@ drawSamples() { glEnableVertexAttribArray(g_defaultProgram.attrPosition); glEnableVertexAttribArray(g_defaultProgram.attrColor); - glEnableVertexAttribArray(g_defaultProgram.attrTangentU); - glEnableVertexAttribArray(g_defaultProgram.attrTangentV); - glEnableVertexAttribArray(g_defaultProgram.attrPatchCoord); - if (g_evalOutput->HasFaceVaryingData()) { - glEnableVertexAttribArray(g_defaultProgram.attrFVarData); - } - glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindVertexData()); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 6, 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 6, (float*)12); - glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindDerivatives()); + glEnableVertexAttribArray(g_defaultProgram.attrDu); + glEnableVertexAttribArray(g_defaultProgram.attrDv); + glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->Bind1stDerivatives()); glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 6, 0); glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 6, (float*)12); - glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindPatchCoords()); - glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 5, (float*)12); + glEnableVertexAttribArray(g_defaultProgram.attrDuu); + glEnableVertexAttribArray(g_defaultProgram.attrDuv); + glEnableVertexAttribArray(g_defaultProgram.attrDvv); + glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->Bind2ndDerivatives()); + glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 9, 0); + glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 9, (float*)12); + glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 9, (float*)24); - if (g_evalOutput->HasFaceVaryingData()) { - glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindFaceVaryingData()); - glVertexAttribPointer(5, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 2, 0); - } - - glEnableVertexAttribArray(g_defaultProgram.attrPosition); - glEnableVertexAttribArray(g_defaultProgram.attrColor); - glEnableVertexAttribArray(g_defaultProgram.attrTangentU); - glEnableVertexAttribArray(g_defaultProgram.attrTangentV); glEnableVertexAttribArray(g_defaultProgram.attrPatchCoord); + glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindPatchCoords()); + glVertexAttribPointer(7, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 5, (float*)12); + if (g_evalOutput->HasFaceVaryingData()) { glEnableVertexAttribArray(g_defaultProgram.attrFVarData); + glBindBuffer(GL_ARRAY_BUFFER, g_evalOutput->BindFaceVaryingData()); + glVertexAttribPointer(8, 2, GL_FLOAT, GL_FALSE, sizeof (GLfloat) * 2, 0); } glPointSize(2.0f); @@ -959,8 +1012,11 @@ drawSamples() { glDisableVertexAttribArray(g_defaultProgram.attrPosition); glDisableVertexAttribArray(g_defaultProgram.attrColor); - glDisableVertexAttribArray(g_defaultProgram.attrTangentU); - glDisableVertexAttribArray(g_defaultProgram.attrTangentV); + glDisableVertexAttribArray(g_defaultProgram.attrDu); + glDisableVertexAttribArray(g_defaultProgram.attrDv); + glDisableVertexAttribArray(g_defaultProgram.attrDuu); + glDisableVertexAttribArray(g_defaultProgram.attrDuv); + glDisableVertexAttribArray(g_defaultProgram.attrDvv); glDisableVertexAttribArray(g_defaultProgram.attrPatchCoord); glDisableVertexAttribArray(g_defaultProgram.attrFVarData); @@ -1323,6 +1379,7 @@ initHUD() { g_hud.AddPullDownButton(shading_pulldown, "Normal", kNORMAL, g_drawMode==kNORMAL); g_hud.AddPullDownButton(shading_pulldown, "Shade", kSHADE, g_drawMode==kSHADE); g_hud.AddPullDownButton(shading_pulldown, "FaceVarying", kFACEVARYING, g_drawMode==kFACEVARYING); + g_hud.AddPullDownButton(shading_pulldown, "Mean Curvature", kMEAN_CURVATURE, g_drawMode==kMEAN_CURVATURE); for (int i = 1; i < 11; ++i) { char level[16]; From 63fdb39912fee4edb2887daa22cf8ea5a5289d69 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 30 Jan 2017 11:42:08 -0800 Subject: [PATCH 17/20] Improved XFB Evaluation of 1st and 2nd derivatives Most GL implementations support a maximum of 4 transform feedback buffer bindings. With the addition of 1st and 2nd derivative evaluation up to 6 bindings might be required, i.e. dst, du, dv, duu, duv, dvv. This change extends the GLXFB Evaluator interface to allow a client to specialize the evaluator when it is known that (at least) the 1st derivative and 2nd derivative outputs are interleaved together into shared buffers. When this option is used, the maximum number of transform feedback buffer bindings can be reduced to 3 instead of 6. --- opensubdiv/osd/glXFBEvaluator.cpp | 42 +++++++------- opensubdiv/osd/glXFBEvaluator.h | 94 ++++++++++++++++++++++++++----- opensubdiv/osd/glslXFBKernel.glsl | 4 +- 3 files changed, 104 insertions(+), 36 deletions(-) diff --git a/opensubdiv/osd/glXFBEvaluator.cpp b/opensubdiv/osd/glXFBEvaluator.cpp index 798074c0..223fc191 100644 --- a/opensubdiv/osd/glXFBEvaluator.cpp +++ b/opensubdiv/osd/glXFBEvaluator.cpp @@ -151,9 +151,9 @@ GLStencilTableTBO::~GLStencilTableTBO() { // --------------------------------------------------------------------------- -GLXFBEvaluator::GLXFBEvaluator(bool sharedDerivativeBuffers) +GLXFBEvaluator::GLXFBEvaluator(bool interleavedDerivativeBuffers) : _srcBufferTexture(0), - _sharedDerivativeBuffers(sharedDerivativeBuffers) { + _interleavedDerivativeBuffers(interleavedDerivativeBuffers) { } GLXFBEvaluator::~GLXFBEvaluator() { @@ -171,7 +171,7 @@ compileKernel(BufferDescriptor const &srcDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, const char *kernelDefine, - bool sharedDerivativeBuffers) { + bool interleavedDerivativeBuffers) { GLuint program = glCreateProgram(); @@ -192,16 +192,16 @@ compileKernel(BufferDescriptor const &srcDesc, bool deriv2 = (duuDesc.length > 0 || duvDesc.length > 0 || dvvDesc.length > 0); if (deriv1) { defines << "#define OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES\n"; - if (sharedDerivativeBuffers) { + if (interleavedDerivativeBuffers) { defines << - "#define OPENSUBDIV_GLSL_XFB_SHARED_1ST_DERIVATIVE_BUFFERS\n"; + "#define OPENSUBDIV_GLSL_XFB_INTERLEAVED_1ST_DERIVATIVE_BUFFERS\n"; } } if (deriv2) { defines << "#define OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES\n"; - if (sharedDerivativeBuffers) { + if (interleavedDerivativeBuffers) { defines << - "#define OPENSUBDIV_GLSL_XFB_SHARED_2ND_DERIVATIVE_BUFFERS\n"; + "#define OPENSUBDIV_GLSL_XFB_INTERLEAVED_2ND_DERIVATIVE_BUFFERS\n"; } } @@ -247,15 +247,15 @@ compileKernel(BufferDescriptor const &srcDesc, // For derivatives, we use another buffer bindings so gl_NextBuffer // is inserted here to switch the destination of transform feedback. // - // Note that the destination buffers may or may not be shared between + // Note that the destination buffers may or may not be interleaved between // vertex and each derivatives. gl_NextBuffer seems still works well // in either case. // - // If we know that the buffers for derivatives are shared, then we + // If we know that the buffers for derivatives are interleaved, then we // can use fewer buffer bindings. This can be important, since most GL // implementations will support only up to 4 transform feedback bindings. // - if (deriv1 && sharedDerivativeBuffers) { + if (deriv1 && interleavedDerivativeBuffers) { outputs.push_back("gl_NextBuffer"); int primvar1Offset = (duDesc.offset % duDesc.stride); @@ -308,7 +308,7 @@ compileKernel(BufferDescriptor const &srcDesc, } } } - if (deriv2 && sharedDerivativeBuffers) { + if (deriv2 && interleavedDerivativeBuffers) { outputs.push_back("gl_NextBuffer"); int primvar1Offset = (duuDesc.offset % duuDesc.stride); @@ -428,12 +428,12 @@ GLXFBEvaluator::Compile(BufferDescriptor const &srcDesc, // create a stencil kernel _stencilKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, - _sharedDerivativeBuffers); + _interleavedDerivativeBuffers); // create a patch kernel _patchKernel.Compile(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, - _sharedDerivativeBuffers); + _interleavedDerivativeBuffers); // create a texture for input buffer if (!_srcBufferTexture) { @@ -600,7 +600,7 @@ GLXFBEvaluator::EvalStencils( dstBufferBindOffset * sizeof(float), count * dstDesc.stride * sizeof(float)); - if ((duDesc.length > 0) && _sharedDerivativeBuffers) { + if ((duDesc.length > 0) && _interleavedDerivativeBuffers) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 1, duBuffer, duBufferBindOffset * sizeof(float), @@ -621,7 +621,7 @@ GLXFBEvaluator::EvalStencils( } } - if ((duuDesc.length > 0) && _sharedDerivativeBuffers) { + if ((duuDesc.length > 0) && _interleavedDerivativeBuffers) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 2, duuBuffer, duuBufferBindOffset * sizeof(float), @@ -774,7 +774,7 @@ GLXFBEvaluator::EvalPatches( dstBufferBindOffset * sizeof(float), numPatchCoords * dstDesc.stride * sizeof(float)); - if (deriv1 && _sharedDerivativeBuffers) { + if (deriv1 && _interleavedDerivativeBuffers) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 1, duBuffer, duBufferBindOffset * sizeof(float), @@ -790,7 +790,7 @@ GLXFBEvaluator::EvalPatches( dvBufferBindOffset * sizeof(float), numPatchCoords * dvDesc.stride * sizeof(float)); } - if (deriv2 && _sharedDerivativeBuffers) { + if (deriv2 && _interleavedDerivativeBuffers) { glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 2, duuBuffer, duuBufferBindOffset * sizeof(float), @@ -856,7 +856,7 @@ GLXFBEvaluator::_StencilKernel::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, - bool sharedDerivativeBuffers) { + bool interleavedDerivativeBuffers) { // create stencil kernel if (program) { glDeleteProgram(program); @@ -867,7 +867,7 @@ GLXFBEvaluator::_StencilKernel::Compile(BufferDescriptor const &srcDesc, program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, - kernelDefines, sharedDerivativeBuffers); + kernelDefines, interleavedDerivativeBuffers); if (program == 0) return false; // cache uniform locations (TODO: use uniform block) @@ -906,7 +906,7 @@ GLXFBEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, - bool sharedDerivativeBuffers) { + bool interleavedDerivativeBuffers) { // create stencil kernel if (program) { glDeleteProgram(program); @@ -917,7 +917,7 @@ GLXFBEvaluator::_PatchKernel::Compile(BufferDescriptor const &srcDesc, program = compileKernel(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc, - kernelDefines, sharedDerivativeBuffers); + kernelDefines, interleavedDerivativeBuffers); if (program == 0) return false; // cache uniform locations diff --git a/opensubdiv/osd/glXFBEvaluator.h b/opensubdiv/osd/glXFBEvaluator.h index 4852a71f..c94d7072 100644 --- a/opensubdiv/osd/glXFBEvaluator.h +++ b/opensubdiv/osd/glXFBEvaluator.h @@ -98,16 +98,73 @@ private: class GLXFBEvaluator { public: typedef bool Instantiatable; + + /// Generic creator template. + template + static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + DEVICE_CONTEXT deviceContext) { + bool interleavedDerivativeBuffers = deviceContext + ? deviceContext->AreInterleavedDerivativeBuffers() + : false; + return Create(srcDesc, dstDesc, duDesc, dvDesc, + interleavedDerivativeBuffers); + } + + /// Specialization to allow creation without a device context. + static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + void * deviceContext) { + (void)deviceContext; // not used + return Create(srcDesc, dstDesc, duDesc, dvDesc); + } + static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, - void * deviceContext = NULL) { + bool interleavedDerivativeBuffers = false) { + GLXFBEvaluator *instance = new GLXFBEvaluator(interleavedDerivativeBuffers); + if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc)) + return instance; + delete instance; + return NULL; + } + + /// Generic creator template. + template + static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + DEVICE_CONTEXT deviceContext) { + bool interleavedDerivativeBuffers = deviceContext + ? deviceContext->AreInterleavedDerivativeBuffers() + : false; return Create(srcDesc, dstDesc, duDesc, dvDesc, - BufferDescriptor(), - BufferDescriptor(), - BufferDescriptor(), - deviceContext); + duuDesc, duvDesc, dvvDesc, + interleavedDerivativeBuffers); + } + + /// Specialization to allow creation without a device context. + static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc, + BufferDescriptor const &dstDesc, + BufferDescriptor const &duDesc, + BufferDescriptor const &dvDesc, + BufferDescriptor const &duuDesc, + BufferDescriptor const &duvDesc, + BufferDescriptor const &dvvDesc, + void * deviceContext) { + (void)deviceContext; // not used + return Create(srcDesc, dstDesc, duDesc, dvDesc, + duuDesc, duvDesc, dvvDesc); } static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, @@ -117,9 +174,8 @@ public: BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, - void * deviceContext = NULL) { - (void)deviceContext; // not used - GLXFBEvaluator *instance = new GLXFBEvaluator(); + bool interleavedDerivativeBuffers = false) { + GLXFBEvaluator *instance = new GLXFBEvaluator(interleavedDerivativeBuffers); if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc)) return instance; @@ -127,8 +183,20 @@ public: return NULL; } - /// Constructor. - GLXFBEvaluator(bool sharedDerivativeBuffers = false); + /// \brief Constructor. + /// + /// The transform feedback evaluator can make more sparing use of + /// transform feeback buffer bindings when it is known that evaluator + /// output buffers are shared and the corresponding buffer descriptors + /// are interleaved. When \a interleavedDerivativeBuffers is true + /// then evaluation requires that either 1st derivative outputs are + /// interleaved and 2nd derivative output are interleaved separately + /// or that both 1st derivative and 2nd derivative outputs are + /// interleaved together. This reduces the maximum number of required + /// transform feedback buffer bindings to 3 instead of 6 which is + /// significant, since most transform feedback implementations support + /// a maximum of 4 bindings. + GLXFBEvaluator(bool interleavedDerivativeBuffers = false); /// Destructor. note that the GL context must be made current. ~GLXFBEvaluator(); @@ -2061,7 +2129,7 @@ public: private: GLuint _srcBufferTexture; - bool _sharedDerivativeBuffers; + bool _interleavedDerivativeBuffers; struct _StencilKernel { _StencilKernel(); @@ -2073,7 +2141,7 @@ private: BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, - bool sharedDerivativeBuffers); + bool interleavedDerivativeBuffers); GLuint program; GLint uniformSrcBufferTexture; GLint uniformSrcOffset; // src buffer offset (in elements) @@ -2101,7 +2169,7 @@ private: BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, - bool sharedDerivativeBuffers); + bool interleavedDerivativeBuffers); GLuint program; GLint uniformSrcBufferTexture; GLint uniformSrcOffset; // src buffer offset (in elements) diff --git a/opensubdiv/osd/glslXFBKernel.glsl b/opensubdiv/osd/glslXFBKernel.glsl index a1e7c494..83b23aad 100644 --- a/opensubdiv/osd/glslXFBKernel.glsl +++ b/opensubdiv/osd/glslXFBKernel.glsl @@ -64,7 +64,7 @@ void writeVertex(Vertex v) { //------------------------------------------------------------------------------ #if defined(OPENSUBDIV_GLSL_XFB_USE_1ST_DERIVATIVES) && \ - defined(OPENSUBDIV_GLSL_XFB_SHARED_1ST_DERIVATIVE_BUFFERS) + defined(OPENSUBDIV_GLSL_XFB_INTERLEAVED_1ST_DERIVATIVE_BUFFERS) out float outDeriv1Buffer[2*LENGTH]; void writeDu(Vertex v) { @@ -96,7 +96,7 @@ void writeDv(Vertex v) { #endif #if defined(OPENSUBDIV_GLSL_XFB_USE_2ND_DERIVATIVES) && \ - defined(OPENSUBDIV_GLSL_XFB_SHARED_2ND_DERIVATIVE_BUFFERS) + defined(OPENSUBDIV_GLSL_XFB_INTERLEAVED_2ND_DERIVATIVE_BUFFERS) out float outDeriv2Buffer[3*LENGTH]; void writeDuu(Vertex v) { From a95e23e980b27094cadd7da6d934ab7eda47421c Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 30 Jan 2017 11:51:44 -0800 Subject: [PATCH 18/20] Updated glEvalLimit to use shared XFB buffers --- examples/glEvalLimit/glEvalLimit.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/glEvalLimit/glEvalLimit.cpp b/examples/glEvalLimit/glEvalLimit.cpp index 6f3a5652..2786de7c 100644 --- a/examples/glEvalLimit/glEvalLimit.cpp +++ b/examples/glEvalLimit/glEvalLimit.cpp @@ -507,6 +507,15 @@ private: DEVICE_CONTEXT *_deviceContext; }; +// This example uses one shared interleaved buffer for evaluated +// 1st derivatives and a second shared interleaved buffer for +// evaluated 2nd derivatives. We use this specialized device +// context to allow the XFB evaluator to take advantage of this +// and make more efficient use of available XFB buffer bindings. +struct XFBDeviceContext { + bool AreInterleavedDerivativeBuffers() const { return true; } +} g_xfbDeviceContext; + EvalOutputBase *g_evalOutput = NULL; STParticles * g_particles=0; @@ -802,11 +811,12 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level) { Osd::GLVertexBuffer, Osd::GLStencilTableTBO, Osd::GLPatchTable, - Osd::GLXFBEvaluator> + Osd::GLXFBEvaluator, + XFBDeviceContext> (vertexStencils, varyingStencils, faceVaryingStencils, fvarChannel, fvarWidth, g_nParticles, g_patchTable, - &glXFBEvaluatorCache); + &glXFBEvaluatorCache, &g_xfbDeviceContext); #endif #ifdef OPENSUBDIV_HAS_GLSL_COMPUTE } else if (g_kernel == kGLCompute) { From a725188081a784ebd51b98deb661dff7d4c39ca4 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Mon, 30 Jan 2017 14:10:38 -0800 Subject: [PATCH 19/20] Fixed Cpu Omp and GLXFB EvalStencils w/ deriv Fixed a few bugs uncovered during testing. --- opensubdiv/osd/cpuKernel.cpp | 8 +++--- opensubdiv/osd/glXFBEvaluator.cpp | 8 +++--- opensubdiv/osd/ompEvaluator.cpp | 44 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/opensubdiv/osd/cpuKernel.cpp b/opensubdiv/osd/cpuKernel.cpp index a89d4f80..6703d38e 100644 --- a/opensubdiv/osd/cpuKernel.cpp +++ b/opensubdiv/osd/cpuKernel.cpp @@ -211,9 +211,9 @@ CpuEvalStencils(float const * src, BufferDescriptor const &srcDesc, float * result = (float*)alloca(nOutLength * sizeof(float)); float * resultDu = result + dstDesc.length; float * resultDv = resultDu + dstDuDesc.length; - float * resultDuu = resultDv + dstDuuDesc.length; - float * resultDuv = resultDuu + dstDuvDesc.length; - float * resultDvv = resultDuv + dstDvvDesc.length; + float * resultDuu = resultDv + dstDvDesc.length; + float * resultDuv = resultDuu + dstDuuDesc.length; + float * resultDvv = resultDuv + dstDuvDesc.length; int nStencils = end - start; for (int i = 0; i < nStencils; ++i, ++sizes) { @@ -234,7 +234,7 @@ CpuEvalStencils(float const * src, BufferDescriptor const &srcDesc, copy(dstDu, i, resultDu, dstDuDesc); copy(dstDv, i, resultDv, dstDvDesc); copy(dstDuu, i, resultDuu, dstDuuDesc); - copy(dstDuv, i, resultDuu, dstDuvDesc); + copy(dstDuv, i, resultDuv, dstDuvDesc); copy(dstDvv, i, resultDvv, dstDvvDesc); } } diff --git a/opensubdiv/osd/glXFBEvaluator.cpp b/opensubdiv/osd/glXFBEvaluator.cpp index 223fc191..695a4248 100644 --- a/opensubdiv/osd/glXFBEvaluator.cpp +++ b/opensubdiv/osd/glXFBEvaluator.cpp @@ -540,14 +540,12 @@ GLXFBEvaluator::EvalStencils( bindTexture(_stencilKernel.uniformDuWeightsTexture, duWeightsTexture, 5); if (_stencilKernel.uniformDvWeightsTexture >= 0 && dvWeightsTexture) bindTexture(_stencilKernel.uniformDvWeightsTexture, dvWeightsTexture, 6); - if (_stencilKernel.uniformDuWeightsTexture >= 0 && duWeightsTexture) - bindTexture(_stencilKernel.uniformDuWeightsTexture, duWeightsTexture, 5); if (_stencilKernel.uniformDuuWeightsTexture >= 0 && duuWeightsTexture) - bindTexture(_stencilKernel.uniformDuuWeightsTexture, duuWeightsTexture, 5); + bindTexture(_stencilKernel.uniformDuuWeightsTexture, duuWeightsTexture, 7); if (_stencilKernel.uniformDuvWeightsTexture >= 0 && duvWeightsTexture) - bindTexture(_stencilKernel.uniformDuvWeightsTexture, duvWeightsTexture, 6); + bindTexture(_stencilKernel.uniformDuvWeightsTexture, duvWeightsTexture, 8); if (_stencilKernel.uniformDvvWeightsTexture >= 0 && dvvWeightsTexture) - bindTexture(_stencilKernel.uniformDvvWeightsTexture, dvvWeightsTexture, 6); + bindTexture(_stencilKernel.uniformDvvWeightsTexture, dvvWeightsTexture, 9); // set batch range glUniform1i(_stencilKernel.uniformStart, start); diff --git a/opensubdiv/osd/ompEvaluator.cpp b/opensubdiv/osd/ompEvaluator.cpp index 87c74f2e..305018ca 100644 --- a/opensubdiv/osd/ompEvaluator.cpp +++ b/opensubdiv/osd/ompEvaluator.cpp @@ -84,6 +84,50 @@ OmpEvaluator::EvalStencils( return true; } +/* static */ +bool +OmpEvaluator::EvalStencils( + const float *src, BufferDescriptor const &srcDesc, + float *dst, BufferDescriptor const &dstDesc, + float *du, BufferDescriptor const &duDesc, + float *dv, BufferDescriptor const &dvDesc, + float *duu, BufferDescriptor const &duuDesc, + float *duv, BufferDescriptor const &duvDesc, + float *dvv, BufferDescriptor const &dvvDesc, + const int * sizes, + const int * offsets, + const int * indices, + const float * weights, + const float * duWeights, + const float * dvWeights, + const float * duuWeights, + const float * duvWeights, + const float * dvvWeights, + 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; + if (srcDesc.length != duuDesc.length) return false; + if (srcDesc.length != duvDesc.length) return false; + if (srcDesc.length != dvvDesc.length) return false; + + OmpEvalStencils(src, srcDesc, + dst, dstDesc, + du, duDesc, + dv, dvDesc, + duu, duuDesc, + duv, duvDesc, + dvv, dvvDesc, + sizes, offsets, indices, + weights, duWeights, dvWeights, + duuWeights, duvWeights, dvvWeights, + start, end); + + return true; +} + template struct BufferAdapter { BufferAdapter(T *p, int length, int stride) : From 62e1a628427e2c17782dd282aa437ce708dc4ac8 Mon Sep 17 00:00:00 2001 From: David G Yu Date: Tue, 31 Jan 2017 13:43:21 -0800 Subject: [PATCH 20/20] Release 3.2.0 --- documentation/CMakeLists.txt | 1 + .../far_legacy_sharp_corner_patch_false.png | Bin 0 -> 192359 bytes .../far_legacy_sharp_corner_patch_true.png | Bin 0 -> 189843 bytes .../images/osd_eval_1st_deriv_normal.png | Bin 0 -> 246150 bytes .../images/osd_eval_2nd_deriv_curvature.png | Bin 0 -> 259848 bytes documentation/nav_template.txt | 1 + documentation/release_32.rst | 127 ++++++++++++++++++ documentation/release_notes.rst | 20 ++- opensubdiv/version.h | 8 +- 9 files changed, 152 insertions(+), 5 deletions(-) create mode 100644 documentation/images/far_legacy_sharp_corner_patch_false.png create mode 100644 documentation/images/far_legacy_sharp_corner_patch_true.png create mode 100644 documentation/images/osd_eval_1st_deriv_normal.png create mode 100644 documentation/images/osd_eval_2nd_deriv_curvature.png create mode 100644 documentation/release_32.rst diff --git a/documentation/CMakeLists.txt b/documentation/CMakeLists.txt index bd4ca1ac..75b705e9 100644 --- a/documentation/CMakeLists.txt +++ b/documentation/CMakeLists.txt @@ -93,6 +93,7 @@ if (DOCUTILS_FOUND AND PYTHONINTERP_FOUND) references.rst release_30.rst release_31.rst + release_32.rst release_notes.rst release_notes_2x.rst sdc_overview.rst diff --git a/documentation/images/far_legacy_sharp_corner_patch_false.png b/documentation/images/far_legacy_sharp_corner_patch_false.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6766f0e6096150ea6d5884987abb343299d0c4 GIT binary patch literal 192359 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⁢Ij`1jh^q%74nFgc_4dH#Tqv+qJuo+1g4foAEGD4&?p{v7FECNjalbSOf>F8m$)LtBm>J*kjQ`XsS7 z*G}ayv%5}5<+mbmj&OD_9#It(*RUb00cWD_s#(j5Q>cDWe8HgEl^1I+C9G>OeN+>U zf5696W1A;Wv-Zx`fEDn`j?v^BSJL~@FHh@LS}a9C&=llxb8}?^|F|#PL0a%H zc#`byp>gjaW$Qu?BwT3Jqp8JXw&BZMWDZP;3NHxAM4shA%b555sHt;BKgBM3A#g~6 z&3rp)Y7rS<$r9q0++uNvi9ll&sH?axn+uhoIUb4#xrh}Eoaz^ zh$=GeNeYNRevVRyC&+^tG)IN3P@wCGg6V~%6BD6kn&)^+3Y4F*s%z+%#ZBxOhaj=<@|fW$ zAvmR9qCL6{Tt6pek|xNPxR@Q`{A?sw0P<~VJ{eZoU$>m_u@`IZ8{Tsar`qT8MSJD( z1PgPRf?@=aBoTbQc8N`bAj5*4Va3#D1<;2GCv``X#n_8tuc&B&-X^?n>v4#Tn;n!k z%(gl>o%N=V`X);w`id@Ftc=oe<*FgJaustemPI(D-tFhN7ex^2H)<&g2TJ2zL>e|0@KP>+avJ)eCzaF3`W~{y`wh721)&v2xYc>0?R*xN< z(!UJLlh5`40ys-8_kXfK;QEO{|Ghp;lpjQ-^<3HWZ4W66Cc4dWcZhQc5ra`OV_Pi<7w(6zzl?RkHmKnca@qeQ@G7Wh^BbJ8qoO@Q5ti_p-j_VlObYe&idEIjH7oFa#eD}Ip(mK{iZg<6@LBM(hy*3$V!iy~U}zFf4o_qb@px}Z2dRG#a7OQuIb3;@fH8aIY4yt`Qp)p#e|BI$?aIf==mX2-Pw(T@(Y`d{e z8Z>5O+qTUn>4|Oo#J1Tlzk9#?AME`+?>lQ|&8)SxMgPEf6X=M3xPhv9t6{{d3uqyMmr@O^O~&3j-Rq~%Iy z*qsSe9ln071C~Wt201qG+-dv4X?xeX%qG-2G;C`eat!sUG@T4^-ixv)^9 zA~1nq&=d>hE3ZWmvjCMA?gZ{Ekn-IMOKoWl+SV%&Qb2~>0&I%zQ@!?S%v`@rz4Scq zr_`Vv%0MN_!$CrQO@os;gi@+2C2887+bM12Cbte4>=03h^-3%@uP|cSut%pwJsAup zYM0D)4QTIW%Fj9Xf3mU{UW-HLJzQ`AX4t0J=m1lxBGN3r6BNN+Q}7hW9}Cs<=1jLY zuNJyICNu(!G~8S?>r(Rs+2AIAvKnRZ?ur?l0Yvm9ljJPqLZ`=`JB1#~HFp}jYBGyl zE&XllZrn#wD3NNkvd)QUv13B<(c?G!ExnWI1=G6e> z@Y=(44s-DZQZ+-!o3a4+3u*lT{O7b-IeuC3cr&H^k5d-s(v3c#ry&_A|BitJ_4!Mq%#% zWdYvLT*p=fiE{(?h&6!dbTE z-bMtA!p*+FQV#-|H$~XFXIK&9t#Tx?eg0A1(8=aoelLEX`w}o053ejT%7uI=4Kk4R z1J0R^ByQa+4d&15PN6)U7X0@YCNplE6Mdp@MURD(SoXOz7*?Y*I0!<0ePx$scslAD zu^C-;?&aLLLB+Kg2B#lh(6HS1w%?5zaixhFxFW1D84;!>QkzwsA|-Us7+XkU0p-_S z2LfI3p(cGi`ot}HF8Ae;JWAY$cOflWrsABb@w|%lR&$5tlXL_wT8EvR;wEneOj#45 z!EQSCf(^?tt{w2CQu}6Bv23wL-+sAwvrMJxFZFpoTKx&BjY9Dib@f?|N~EffEJ(1p zh82~6$BPDsDetu>BB_tqm_6ltR2*J({t8NQMTupXq|75`^Agu=R?Zf~R89}v(pvn; zq7%k8D3L%u7I#EPag7H^NaiR%q%0AV#BszdA03!3#Y83%u~n+8=$kAj-?#xE)Yy+g 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

9<0u@^Yv( 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±PM_81fTS;)F?jQ{Zz{!w=T`B(HLA(s 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 literal 0 HcmV?d00001 diff --git a/documentation/images/far_legacy_sharp_corner_patch_true.png b/documentation/images/far_legacy_sharp_corner_patch_true.png new file mode 100644 index 0000000000000000000000000000000000000000..c45fdab39173e802ce15f46687e4ad05b455e6a6 GIT binary patch literal 189843 zcmbSyWl$VJ*Y4uM3GNWwT^51{cXv&2Uwm;08ZXc{qT)9Nb)K|MvOzotw9pI2|4L z-$A(lI|^Jq?*Gvbe)B&F*|@@C@qp`3t5hor#}3&}T1^@NXh_0*c#8tRNAT2Ecmt?~ zQXT;SNB~V$UAeyq|NkC{h=~8srvG`4fPhfY-Vc8vAwJ&T!676hBse%2&;Br z06l=fz(8JJULS8C3JMBOPfsf=D-I40Mn*WOh7Tfz`)?mn>W&ZmVj~qJ3Bia z9UU7R8#6OA4Gj%7H8m?ME1(MC;o;HN)>Z?+N&#R2vH)&wZmzDb)qodHPEPjr_HPE? z0lokLB>*WYDL^Ygv`7a~28SM?tgPJ8(V?%eZ)9X-V`BqogEz&@0AOuxZUHI*5)u-U zl9Gu4OlfK9p6;IJre={+-BrL(Rv`c*AAnU;Qv+xONOYS+0N6+0PZs7EiUC-Xt)_rx zKxJhmpaTF%LlAE?E-5LI>M#T300gttSC&_D02u3Q>-F{ZiwjHry?vRPndRl>fFb~3 z93Y&nar65|yxCZ|NDCJiH$6Qa0)a#TFaw?!#yItZb4$}_VN9*=JuZ*v)qSuG=&{S$(_zR6st<~Z# z<8pbwE#~=hz>^qFS+omOGHYmGj#kCWC*Bt%^s} zY*=yBZ2vDIOQ60A5<((vg4N2$_%Pc-YX+6y3>}A%vK4Oa3I7I0ljFm>A+}`a#@pW~ z&mz+zhep0-A3uJa@tzaC#D9T~jt={u)Bn0OnH^#Vi{sDt>3nY&tWZ`Nka)5#b6p!~9nLry4}R zMg6Lv1wGFRnKF$0)vK@^jcAB>9)_?1sL~fce9+rp4i(pANQaFM^jjjY3bJ!$4U!<< z2GJA<BMOA1T z(qZb4sbNi-L;p7TplbQwF}p>5Bv$uLSwRxX!c{w{>dq}XJ#uguQRgaQ9e~$|uMV$1 zG@W_)HQ@`B2wNcn-@Fkf193TeLKUDTA3T*{5I47U&^5_B18z7{<-LX|A|x3Qb_D3~ z;}pKzS=V*0$+<}_+F$*ZYi!MER^NQcTf{UuH zvTgaa9DD8^bX(`z>zUSm+$aX^WZ$3q5!aQO^%5W7I5o?d0s6y05i)@QW$WrVf%ayR zQ5*fjz0!P$#l!FP)62W7dVSu>;$DjfB$?Q*HiUFuv#0W_7*>RH0m~-3RN=bG&rj|f zoSC|G9MAbdyg#3~rSE+^TR-o@4JD|M;OFDz6r?fh+<}r-f6UX`^r>^x8aJf zfcx~k{=iL#>e+W^U8wPNc{Ju$udy}Mb33PPJLpd&(_sp=-DcV~>gR*=K#;Gbl_|~L z_iZVf1P+x~gEk?^HSNx}x6{viH@(j^A=J5KFFT(qt-hP}4*gOY@AnUqO9z2LHoKrp zd4B$IdiwBRnfLo+7bP0+cb{#N+Pn-&&S$WTcka*7&P~m8J@1A(2tiyh>^h{*>;8uC z^xAp1Z6QpL>qEQIr4o0el8;9g&%ZQ6?)Ub0ZTJa#KOKfV|M9!~Ou)Y%IrLn+{R}&( z>%FviK5_CM8a!qJ{>gj(_H4Y(3I@LH^#=Kijz>7J)3TEWKjCVL4qacfVEe4z>F_u(m88`4R2#1g~c$xsQu7Uv}9S zKWPn7&_Wev5ADBAU!BvBheRc<=HGg5K3#DCI^pL(Yz+ePix_VAcw5_gfWQ5O3fo07 z`!3&{l0z~@?j&Y*_kEcZMqt0K!uj2Lg_@A+a>-VIeOsN9%D!K5h^a!=xPIX{oj88K zGMR~MC*i*jXTe3?7Scxq1M^jcr-PqE7Z*dWx6enzqoi9sD3VBatv_-_zWnGW6Ho|P zo?Zy~CH?%-f^Dmc;(%Z{OlGX(&2AtaNPiDoVv;JZkIaY&}{doFba_$B`du+(ep?F?qNA&4 z4mhUi6%g_K-S?WG+2Z~z%H@2~4(b999Gsu7mi#k$pVWgsCVIESvyywC=|Vvr@EZvk zYGgSzsj$AZ=ln z?)OO1peyH}9aIBbYxzME_v0tt7ea@@jZa10G&s2dIMw4@1m8KKu75x`9fuNt>!u$e z-58T1*B8jL5_MCMjX&y-ScXYR=SgbLTYun`smb$u=+11K?iEI={k_*+w0K`RoCq|S76-u{UpWnqmt|rOg0Gh{M!&# zpbx_9aDKbs785wx@^KedKA$6FZ8XwV8*l!drllY{xBI84P|y3u(Caez^gz*|#WUUu zmXCXG01(s3VQ~9Xkz1J7-EBv5>UnR6-JjMQXt1aFJ#jtX^Z8&vFIphj!}swtY*L*fF(}3vug)j7~`9tZ?P8pMjTNQ;vm_OCuVdT4gpEZub35R1&q6J6 zVOm`5x5o72bXo87d{9{k7;zJw%Mkb6&wU*>s-cbtG7omM#V_~tA3XV$+_Y_u>w{w7 zL{X0DX7)IXYshOrZ&C;`qsVq>vA!|o5Vr}-LDs;p9*my>aw`(N}YosG2B2D_f~%OssWT7KJC zfjceF=^x?;c6RRv?$;dGj^@c-IILhh!%hKInHnW6&Ghx2i@ivdIiRO5RMC zAGwbVv7-NSM|MUn@u(6N8FKphB6XMQOV66P(KC4cT5|O_x#pfhl0?^!!4Et4qmuW} zJ-?`t4fa9D;UP^wb`-WOENDbJexUV&k8(0oxt|}h*S8Qtu9{qMpQpb4vda_GqLH}S z2-sH}wN-ZueiCGujHZXxYS2YpNJME!Tn!0tlTnKVz>riK&Z#Rx9`@WGUQk;hA=teG zUF^4FuS-Do_C!}03TLfLs^Hl*p5g~VfFn(<=DFyY$ zPg|-j?e^7`{gpHHz;pT1r)vfjX{)l!+@sh{kV5z`aSGqTY1PC8gtQSReKFJ^hYZOj-TOjNCf%cTP>Sm6*JiOJoIk$>Py!3gP zD;b5+#3k>%d;${~av~f`3x})t#tDCypBp=>+e9Tb{0Xc=)BB7Gi6etBZUr9wuFIh| z^#{L5=DO{x_E{a;-;V${Nf@Y|uJX42nGe}``cw35^H>iST;>D0KF{I1bJ@7p5(4A8 zI_P(&=s@am%TK8D`*!{4r>*#1FZ*8YZZy0H8lXe;5ZMy5>pWl^k1f2_W2BVDglqvJ<+__L7-Xy}nI5J9Tc3mJ!==B)= zIy^&KDyH^B4!usR|usAxe~!PTEz-u`9^MjhFy0n{Clrw84W5P=eJjq zaonmG+H}?!+GGzpGjsr*^*+Bspo9niSdi$m-jI^vjy-~Rl`4S4_gGNQ3BHlB>_5Ht z=O`ffU|gW5M}u<<1}I;gCxSZ{4bXSf=Lug=GHfvH+Ul|q6TL?5u^kr@13cu^4SMrq zyHn*L{`2AkCm95-hanW6^`wVgm!Lu0fW90PyQTt8fm*N)A8OD&BXEe~p9naVbkKLa zP-XaI#y+D}c_Jb*ZhjyxEl74J4~{M8gA7cpegi&d@xV5-jG+!Jn5kj-JZ?F4`wjJf zbqF{Mvh>qzX(T?Z4D$?-wCNgvZLt3xdnwHG9EBKdex%KU3d9vtu1^XH=)F1*eyE{= zr=K-SK_{cnXY4mz#+2r9P0Fg?etkyi10Am`?@ve`e_k??*aH)3y;+iD87G&cC0w8YUT;@J- zCRB{}qV(+$A3hN&LE?mjO$p(O?t-8iJE4Pj_ep>IUSb0U|Md0(=6!_o+_zE%!A|aw z2@R@^aoB_Qk19eS>Ml2UGK&s(ZmPTR^pyG-DVjUBsNe5mt1jf^^6)?8eO_8V5BkUf zMM@qvA{X%Y?(1+l@WGDj>mczQ!Nq`=6>7X;VlhU00o(v6r`D^#3Gi<@7>C;iA&!Eg zB7oTgc#~^zznrJ(zOE+=hUg0TL+=^b=bTFYAJfxf#At8B2WeAaI56waTU7<&;S`i6!1_xMn(X~ zd-`u_qec%V7Tss`QYQxu^2E28hIp8$7wVY@C&xzsG^h%2m^h6Oyx|swnDjo~UT+ir zwRHcd%ew8(@1V11=dkM;?Sf0BzghSj_OR*=BdR<*bV z8^bnwDS^*Bm*+8`&EWJpex39jebCqO%#R4=WFK+kWFP!X9sE8c^O&Zth1=t>CS7|D zO1LO9a#T=pl6cs?YN)3Z4RHHm=lUO0Bp+;PfNkcUunlIoMKFY3AE5m~Vw13faZvPn zb5HLC8vW&Q4btI+ShVLk8-2TkAc)wc!qp5JirWKk0EaYO4z}SR%)e-N3IcEb)qBPm z4ce%^H@&e_jhy%w!GRr96BvgD5y?N<{4P>Eg(aH&soH52_7ChCV^nC+G8s@ZaF^m= zQ;i2rxae?3{5u`$ARVIN#{CDi9hyL8ShdMNjlF6@=M|ux*I@d;`u{XSv_o-Us`;9| z?)rrR)N^@3@UJu6kiC>XgqUi1NF3nM=dYjzRcO#3Bxul1__C-{l|V}L*JKC#jBJL! zf967fSDIcx(Egf51U%mV&+Pu2Vnm<;5`nKEj#G{OYwiU{a+CNT^CH_0&zo3 zx=!IHt+O3$_`lWR2S8EbLI|=VP!^ozM{gfKhdl2@3&XPd=NRFPg^!gNxrJ5;dihSj ze`YXFc;%uV+>H!^OH_*^$RY;3;Ht24?5UG55?X^P#$lQAg08B|A+g_K>Tr_aRR$s&d#$upy(xzfEvazg4; zVz`oPUpp=(A69k59;q z$_O8+NqhbyQ$_5eqCo5>a%1=d7Jyk#KFhwg>Q(AjRsfDaH2~+L+$4ggo{hDOrUtc@ zCF-U~$G9W?8A*idGHV;FZ^5d-jPPO$(wxgNERc)c2jfDDD4*%-L$SP93@}+f`;t*moH09E?bY` zRZ~+XKeJHIP{L9bHJM1oFs|fI5bZdinHV<`wQ-qmP3sFwSlhEwnf0qdSAC262K0z} z9ACMa@n2Aar1jM_rluUuXtqk?li_P35yGL;W#e{vUV4mB(n?N}*!;7%Ec#H%ty)huR{ zQ&DkfkRQxx>FfXAX_B$%jaf{B@!%HJ8v6MQk<*fkz&nsaPf)( zlQC%%cSaLt(nLW^oWAU7$}-%BGkOJ@ z2_`I6>EO4nwY&kx3t>pRRB*CzzykkdmPNPIv11@*i~nloahS#wWcdyw6kg;5cWmnBS-sDyD)0E7#UP~?VxdZNc-3Dm^c^1 za0rOHwW>?(f5k}_$|>axZS3g(S%^YH8~Wohc$Dde3438iF1#&~@zV%Y9YzL=sAaZ) z$?Dd>ESY{xTrFRevi!=Ft+UpI-N}_VPnn^P9MJj(mFbJPT7DYaq{iW`w}CY`d0~jx434$>TLka1mK7Z|}sRuG|0=rtS1!s((x5(4FU$LwBk0 z$D7vv4~8S7*hAWwnZ;Iof)^_TJ2IroVFxjKAZ#{^jDwENF7+RnypBl&60E9cSBa?N zNoR8O^8?FsepKrHB|hpk2wv}L%BazliF>>(Dix2&T{98YcdRHrBVc~9#7Yt%f zV(Qw8j!z=W>LZFE0^zPuMFV3KfVe?vcRkljlUof%0^xtq^=tiZ?B5gL0eM3& z9XY}}2?fC{?T|FCn97%5MN#R3^dbjJgPo8gx(*=Xql^dQ92t{d7wdtn4GM;+;``r^p_?jOFEB&FD$>ELqNs8>d z;#V)QvpSMf(MgkN@KFoj5|J>=W7Q?1)IQc!XTw*)9>kJm3`IJu&lm{@HP{J=k!F2q zZxW`zu`PX_7?VK>`IL(aT!i89Dtwyb75|~%++kHv*H@wB<;Yj%?-B<0&j=6-Vqpy` z)%%XV)WyDwDtWFPo8v&ka?7-M{drEdLzk;wU&a+o4hF} zo63ix&fdoKyhVbAJxzA}UhRFW<`^;E3zE1iF<53bM%sfRv3Qpr*U+I}y4qnp8$Y7n z@Ar^AvD;5le?1ZuJ0_bMm;CxV>M&9wI9rC<=vRs3w|2b>TG?vX5NGUx(vPsn5kO)T zg*%fC5xa4Tc9mXi6Bp6-(QvSWOvB2#JIj^R#wy(wesI41ukpRB_mUifsH3TUqzSld zN5&vT(DKrys@_$V5;Fr+RBp6g;Dr)gWyp2d^}_Vf#MAI1|1`jL&6zqrJjGe>HJO~y zye(9Td}^@4HMViY%viNh6;lnnrThpV6OhbrR=vTFue&ke++#Aa%!cjMS|~`44Ing4 z%OCt&y;$Ctw)x=P&xlMESDSr~?}xFnN;b$8YfoK~oqtfrbr7$!xw2E5EZ_lhY)nxy zFi~Q>fEBNYLhN#1p6`+vNCqea6zoM@aUgtX@x*auX^_+t>&(gbtu6tXnj#)AT%woy z8UzI)`9xE4zP~&$PM+B!jT(9Vdkm{J4Rkv+?L+DNwWX*`2K;{T=H=vu&b*j-!2cj$ zpjnDjt=y1N_B!-+rRA_iW%bGIkT+yoZ&3O*_E%;a(ZUF_>DF}wh-DK}S!MBFwGCEA z8P1FSe;$Fft6#T4a)#fKE9cj%PvjS#m*%3*Y{84^TjC3S$@q`wUGgn~#>(u3*Bb@x z#G|r3`J?q9TsrO?4{op(#+NHYf*2H0Qm&&1sc;G+3h-F@Tp>ib=}6#kZ5tgaxEpHoW?p( zAG5}N!%Cqlo5ISGZA*RoauREqr}9IXK?B=kJ1T<@^J^0njAlAsCQ7S z*zF9ZSoS(&)EKTL%glQcm!gZju~6)038f#3^cJ2%+5TSP1N9-bV!Y*w<}9e z!>#Esj6HNoW+%@B6@7sz@Gu~%YraRhe2>&r_`wvL9F$tUVX66B~ll1X-Xg!NaydU9Ts#t*#K}YAw< z9)AOxo|Ut2<9qWR?KD20s`nU!S{%xzO27ISIPjHN*Wc|KV=Nb9_;W@If;09w=?(Bn z@!z`BBvkbQW3|65jD^y7f;p_ci*}_r9*PPj+FuSE3Yf>WiEE0Ivj@!J&MJQ~?~lzh z%xs+T?}1bvp_uk64<}CZ7ZvjW#l?*HU4-={k3@`02<|U8eqJ*F73c*}!JO%-)W-J-*l{hs>FWuCJVz7>Vy5?xVH7>FK z@3#P=mcE2pB+k||U-jeN-jo=n5xRxsD_emCSl8%rG2^TZ7o(?e#>h^)lr2?|glxQv zX3aCaT!%VqTXem_-!I>?I`jP(n8$_T*-@e+HN*<+#J@NU^ z*+(g>@08}t?-#w|hP#;_406)97FnzaercpM6udl+D}wUUY~+CmuvaU;y9#u?fjjY@ zH_+t)9espHJZL`1ffX~_lT&Saw&>5u7HX%Pt9Kz(ODxj2#38L^PK_JqIZ{V(lEEpn z#7pP*l=+4}L#eLZZ$kiD==G_}8w=9znD%6kDX+AH)7){?Q=fdkbT2+}lpbg!`I)n~`FB?C@_7UR9rT43}720_54fPD^Qg00Qo&6b8mQtvf@Dj@RIj zTuN$pHEyn!h zMRU@0dsj0h16hWde`}@s_W$tJOvBXg(5iUF6T|P?^LEOIS3FhO5Ez505)Mvx$CqXfRpKRry+T*4IYjy4YEk_h}`+bA; zHRoul*e*d=!^%jzsK!5p%V;t-<@`i7Y_+q@ac734Z{@_zZt)OLHx0!`!bP>%SK3CV zF`myWQ1_}Z`gGi)-JV88yg8$tE?*)-#2&S`*xzg@2+c2HJqA=FYlvR^s839h#Pa6S zG?sIS2;I~QU>DHb@)v!!K{9W2c~68H-u}bto=Jd^JCr${U&V1Gml}8*&m-bQ1Wf8? z`6+T@r;wC;_3aS5Ubr$D$C-Q37y(Clw4}0~Qkb?!TQ6OuZSv!Bd|7H&8hX51__W|C z4qJ>Lenk{DSz46dQo7GBLudO6YFMP;g4cMQcOgE7Goso|Jq2Z;D%SCNGuiyt7236s zc4S#+Ed#xhhFcKpa&Dqyf=Qo}UL?!cP@O|eT~0>(hIl(P2N^w^^^Ck5bt>_D{!3`c zmcJ^%4%_j1R%i6UuSM@Yx8suiV4FT-QD~KR^(u~PyQpQ&0&x(#+a~+6sg>Vnrn!AoU3}|c$`hJAdgVXJDI)H z-KfeqG}aCLB7o>WwKFXFpljfb{_KRP287*zr$KaJwPH%IG z;N$PMms@|+MLXZ?-LTI%auQ39X~769r4K>E_reI31R)oD!v@s6QfPF!L2N>XoB^TJ zCt_pDI=OCa>@`)0&`n7TPy1X+_j?MWDmQQK(ZhzN72N<4TOS4yJFrrV&6)v1cjR&y}^W-?|mHRGaz3!r|Qa#q~ZfARqfUK^@ zZ)s?;aalR3y2feiwSb@?q#|!`r%cUXf)Ga9A=bgc)S+f4N#zw)W&T^T|kz zYNd3jQCc4AwY%6%)s|rWx}wst?l3#b?Z#RTJ3vXvH7m-CL7#PAsD~>dI!4Z9V;Fy7 zRjNR%hQ?(0r*cRgDx1g%?@*xq_uX1-fseXH)M%961V6SlXRT&?uwluCdLR;m#XBEA zUh*XA?w7_L_^;{6Y<1F8x;2L-)VFya&2iOfaw8Bln9LHw&&QFCm@<7nCh~WXss8z) zqmUP*6^J7tEdDzM0L_}4#!Y&s`&Y6=89mOm==PVjXq*8AN`c|Id~ zf^u6_+-e|@*A*u*aP}pzyvyd`C|`a!NHqQ8BKhP+(YqcK2Lb$*BBPjJ^uk+uk?1y) zf_t_v2}2njOX`QSN)42wr{e2Sb7u#-Qfd4<1jNWdpi3+(HE@cy!#6MqWi$+yYCgMOq&=1w&OYpGs4Qpp@WU`mMf@(rA`~yT$|cywydkpqOF^# zx0V{Mx-H*kR_t}1Qs3OXy_|b1g_{0n_^VADuu8`Ur&Y-7x`k`Vk_%Oa^n+ma8yA~4 zFt$MltdJ_qQ$S{` z%j+rI#s%F4Vwa6*mouzfT}$gs@%(fwNdetD>)!+VqNyU@UQM?gf$ILJc8EYHMTPZi zj%6k0?({r%rPx!lpEZ-b%+{QgX?E5PrIC>?mYOSk%28~rnd*T%?dfz@^ZAIGpG;Uz z5@ZP_j<|$b0O%V>ILjFrn}ky@P!M;+)nuYB zU$Rnz2GPa!v_z=~-9xOMLB{S_tD4Q^M9vZ*OqdghpLL4OP(OYw%xgzQTU7QP*LDei zn27|3`ojq^#RmOb^72vzOoKk!UERsTg4gZCX^GkTN3|vnhNK#AmDe0WRi5835U-VE z5zVJ~14Rs4*40<6J91sVPI9nne@uO4+`P_+o?H2LB6i!^>id{F`fl|rcs^)$*%+ek z_B#$~-hAdnPvxQ|!tL!+Lx4m0IN73r;rK_QMfL2*{Hz=Go_D>tNj8y%g%BI;Cp)eKl1 z?xyP0Z8WX+@7#1?@x9(hME)t;W5r;T(*OWUWN|h zdMTo6j+dp3H41UGpvt0o-Ju$87fbL_kox^u9GohnFv?GeCVb+MeG>l;YnTnB`a_l0 z?@%lL()S2F@ulz9qlz_osg}rYVC(GNuN9;qb81d=oljnGMHCKd(}H?HBcj3JFv$26up66Op$wuuk|2=HnqzTS%lI_UDCbj ziWv!X&_^1qL;Y=oFxqGO7B4zL&%x6#dzqXa53P01y;M|><1y7kdR@qKQgJQCxG@u7 z;4wZ^HT^xM4(zC@)FCF{@dv=}+LwmlUd-z!IBwiy&dP(`+%a1<-FiLs6+5eK#YGYZ$0Q%^L-XXz=K!7vYEKW84(Rk0rUpXD}Eps)MW$-SMZ%% zl@mD}P<+sd$3d{@qBc@VbB|`ff7wl((3yWnNN9KDx-eqY1oW%Ni#Be>kH+D~BK5)T zd>+7AXgkgJLYIs$`o(J*2H;HANry~+gx5>8F zzop~=(Q1V-x%x*72EV|E=$TgNVl)XtN@}fm8zz`b=|Q(I%}V!v{xojT?8l}gM@J^m zLmG)OUzy1~q*wD^1J?ECFmKCzn@L77(lcIk6m=oJBn}5S0@Qo0f38<%5R9aTB~$Qx z%x^@;`x>GCdh;snE_`6O`Xx;4Pa}9$GCK5lHS8|_@Y7mB9m`Y-gHo{2Ca=G|{x7Pe zig7?;1yk#5w&1Ru_;vBul!~bC7Re0WPZzH!^A`Ieu(wgW-a6dT`MosYo=N8cZkNtY z(OcSLY7O)9p{$c#wXAXQl*D<5bta|-nH6erYPjG8kzW>4xBIotL4OBE{mhhKM55Hu!_QmWHZwu;15Jr%WKy=QPLSRF8cGhcR zbrpPmm6UmFN2k6){yOCzZN3~xC9=>23YlE;LH*|Cn-?`$*}QcNjWYBXrR)E8m6tiJ zHoQ(DZrQ=51jXez$*t+8D-@QC6!xM)o5~IK`Si zx7T-H`hnj!#&Ez+F7YmQgwg;MjN`3yG$L?On)Uv^rgvu-eGV!aXr>+0l!@ljUT&~fox5~fK$C%80A9VqCY8T%uQD2kz8wTnKuH{tIu}=!|ctUJiT_&_QK=znyM#*ZU(Q!5# zPNr%5`l3A`Yn*^?_XG$1QDv(Q4uYNs-X1(Tl>T95MmC(0D{+appYAy-2BI+Tz^O=x z(Y7esdbCu6g^U%-vGN)hjRzRNl_lni&l?!0el__5e zyvv!0od|PULrq&0;dnO9m)KBE=3>ig*&6H@5K=df8SkwbDd8e|W6i_$PkU44&LSxN zMAO7?4do|JKb<&uy^1ed@Tf_t98OgI94efWf^E$4ncC9PzDgVQwV;bCJ;mD!!qNBi z?b4_mnlaPj0Fni#Mp_X!38wdzEdYo`puzY1XfCV@USyUy6EKsOD=G`t+x%>-J?jR_VLunFO1OSq>}lwY9e17m4T$&fkk`=wrEZ zG;cr|k%pRD#paj+6bvP6NDt-R)J=OmS(xHQn~D5JTA$3vGG?`QahwL?K6+uv=pSy2 zvPn=Z8};J#86kCvEMB>5s;-lcjRhi`k6-Mtqwl1>Y@S!60Tzie>AWwlv<=|Q$B9EL z9p#&vQ5;bjC2vvYNUQhC5{W;u*f2>Y{#qegDz&cBq17MX3iPGR%GF^X0ehe(HV2x= z*%}xU!9R%|BCI}&`x*cec{&J&oRNO1U&a5o9tUA!iBuH zad&kk6H;WRr8nWCTj_cj!dpVvg0S)3>zq`*UT@`pq~S+X4=5mF`jKzVBN!eI z;;Vdzq=>~~c0{^}gG^=ZOem<>2o$B!vo&Am2~ZlPybupcMAdA!p}vHjac-91eL=Md z+FIVsb2;V0L253yA;3()Y;HlK4%27^hw-50`h>m9pV2u^Xi zT~T$@%*f4o%L1N4j~D_&N@UoHBq@py7Hs|}8}u$6q+)|5k6 z<+rY>JX*1>pt5CXKk~AdTYp&M*vkEokTuKktLFzyXR*j^lmcBst+~9cF!IXC%t_$u zL1R?f2sxzyd6vWpmypOsN6`oQ=5SzMW{-8LJs8F9dokakar0&!k-E$bv(13dcr#Vg z+PeY=RJ?ZxlGzxw8h23+(HwT;=au0!fJ*b_{JnHmMZUaaXiN_XN|D$xRCf+9Nj26S*_2nTVVfzM@Kh-+}T@ zl_KcB;I3kFKc>O6+ZiihF>%uC9Lkm*ZUk9;kuRxMFcAc>$F@%q_C-3rcX;(>&J9Up z=i^LT4K^^}%P19zYDWVx;vzU!OD5fE>eyz(6c`y0yc^7$@UHEhT*rxw0`W&-CY=;L zF*_bE^`;L217KS`>xP%AN>QJ%>@Gf0F-4k-Zcdi7ZD`weBoaz6!9T`8I}i9XV08*pZfu{x}eBg)my?OlxvY;VqcxXTI&WA^~OjQ_N7-eNT+2iC$Bv0$aFEt z&xgHk9yD`l)!d`dm^wCV)32~kd#{(z$?F~^I#tyts~R#hwfkFJtK@PnN-Kr&sUOE(=Kd|049i-GK;e$W9?BcWB`<$QT>1*@x?w)5 zXq!|Fm$<5xMFjfQrag1Zw)z5NZ!zSQYD=qd2Hv7QTuLXxA}U_HYofJP9L%>@EwTEo zv0Zvyh}HJ8ibuwQ%kGm8S41v7VNA6dp0JrUVKkhY8l9d@<>y;MZw?k@N4@g=cJ1b` z#wea|KE0UR#E^A-2#igzLYk*STIW%f(c_V|&ZW0v51hd1YTr~LN76GX_z{<8O`NM1 z)#9%dU(=;M?Z7vl)XVWVBl$^oRHl$LJ>kf1;7CzW$fTx9CWAbnI_(~~h5i-G^a?Wke=#pdivIUgLU71f_Qm&3z3p}BfloF0(TK2JgJ2Wf{sID5wTfTKTaP;!R&zHx=nMsdPV6DVd zCG9YY=CR@yva!(T_p|KHvJy9q_(2t+QYMz-UV}N#7ha-aF29Z$A!R&s9@B+nf3+S_ zbsYtw9uP;7pyuRHXKJe~u_2-6&`$#uMjI*n72l%rwHwGOSy%G%-HR=Gv41IEHfEtF zV3i~nW1F`V{4(u-`B**jr|QD4;XWfUMZdv5g0&{*$UioHfHq~qDkCjVE!!)F&*GqkM!aVSEx(x#{VI;W^JRwn!PrLAO!k_#t-{x|8Du0{9UthSuaQ+dX-K)a zY1nq_c%@P+$7rX91aEap>G^2AC~AWOZ$gRO1{Ty%2@TF4P9bJ^4Gljk1DJprHEvyW z7i)P^{D@Dlz+xWYO@k8DnYx>m7pCQV&z(;a=c~Rh8fREM$%R>m{NKJ zv>q;Hf+jpM)pnY_p4o(_n{GFmjML$bsvp8rZ3T8OZUnjGM}ICpDFQe`pNYY##^Ea% zLL@anP1DI_P9DJhV5&`=lvlMSIe_?rnjVojt+>H(c{vxh(;j@4!)gl$8YgHDO_!>F zafb%0#w%iw28pFMDDHJ=(*{ZlN7K|HB;rRvoN_*2j#A2cK1M??Xm&c!{{V0zU$fYd zl^~{3^-s-8(1XGcbZIV60>>J+sv%&}OSi)uF6T2N-a_6`6DmZJfh^fooLtzf25l!C zkaNi-waE`aY!w1t<5gjC1aO2t8-vrH_j8?)C3Ep~jxni|cFd$_r_(K_VlQJAq6}Iy z#zh`n9f#lfIsE=6O|xyQ7_6u?(3rdnE)HRS1q+S&S08;1X8>(R#j`nGf(uXyBQFZV zx|YsMiNO)+Iye?S=}+(13gVQ%1pN?_gmA?3Is_UT+>V%|Qe%p|z$S4Ybm+)}iZPXH zw@ovNgv^1TqxEo{ABHRc5I+g9Ac=r69$Uk%Gzz)j7!;`=SYg|lq8=|$_s4ShG+xF zkq7O-aLj?6Xm#R{!wvfExNLy<*5e(SG)3-)rdN+^5m1OLIU&B6v#FB-Z5|{ zuEozJ#>W~<%(G3?mvRH9WAwnjVd)}k!qW=)h=MkmKqyJTPyak^bqW!mT0fy)BwoyLhb%m7mmH*APC z;z2s+s|wC@XsWc}?1#tZ`WfABo&Ud zBl@fr-HTo<&=mDbqcB_H=&@YA!WYN7IJ=a>tU2ADM&3xQ*~?IWc)Dq1nF3zNFxqXi znp0$1#YT7~2v{?KNXlfYVg~^j9S76M;B@Tyw}i#HnSt{Qq3fZif9iy$oQoUqJHIJQ z@D=lzY;L}jl5BTkTk%M#*C_bJv?p1;mH|c&Iot66@yOCCp&kC4TV}sfwjXb8ay4Tcf%e zII1n~;p_GX9`n`)2$1+vIj%(EUcWTiB3cOJb8|4IoIucF3+NJh+#vt(+AYIKtEx84?? z7XcihPiJr-P6~6Lku;f%spHVWC2(0~cG|9bNyBcZJ6THD>WwSmSK z6L2sq6jkY9qKL0`rSe6s=JG{zEs@vZ9&tBL%_Y~vTexcZZW-K>cG$-WhQvxxf*hrFvYm9>Hj-Wyo;ZUSAQ{L`i0NXPnMuO~muIwv#kpyL^YZtf7P=04`z^V} zn4N6dEk>zhToLzKD;IC4!Pw-ocF)Yxus`^UN?5U?$hlrl;q^Es_CNxRn$;up9jDYx zqs-g3Bh0u(jn6j5S;aJ=xVBWhhk$_FMSC^qZhzph>-NVMBW9@ThF2uVmWl>zGzA$a z9`jko(Ew6J4>hTm8x~LY0R4_sn>cw{Wv0pNZxnbEGOqP2gijp%mos~IE(ca8-Hzv4 z%*VBHN*6PDagsJ;E%~jt#V6)^==(1V;M|n@#oIqOru|&U0b|3GB}rCWrNGOX7-BgY zN%dQuYUpuKpn8T%#9`6cKR=rc;@P9-6mGqX%iS)YfYZke?Jb3~jj>)>>rVou z-57Y?3@vTbg^L4^6N}T)X(64)lr{h)30~Jj+cxxPmumf?g8e=(r*c{IjSMn}*AH2IeYP;-41Basj3oLrQfukZ}=+_9<;C+t!EO$aBPQ2{T8O&O`sjxtgMNqWNYw1b|} z^pLtH=9O)DaTFG&2iUZ*I086ASFcB3_T~);nB-<)o6>;ib=qb#C;MU0v|9?plxeQl zqIKk|9AvRvm#N9N8QM11>&632??6;CZBUOBMoST9%7hutf*5V7fH6~yZ`FWsiAGFN z%N0$$sT3RJiI6xo5Kk$CU*Tg)X)rP`AH>lXQGXTIFmt@&DE9ssb&bx1(8D{jQo1pX zA(fx)1aYj9w(ZbsCso`%M$PtQT62?Hy&RaiI8$17GYEY-*EHK5&l`|TJ7~)A8W{85 z%a4jr%}oiMp9vQ8(s*tmoCMPqz6_GUL+}SgvGf&!1?Lt1Dr?2pKJDq49?r_ zs;Rc(CRUnM71{Po4_AbH3bRAs=-~diwuwtNnT*#C%w!VNAQ_|Q$n*sbZC;NfO?UDs z3TRefM&tQht)VxHd}L_MD)%u`?3T;rE~q%GcWb2I9@AYC93A^@jUVf9MC$6ZMZ7)! zSh0_$GB!?8J#j;iwjM8QE6_thT`J$1=044*zz`Vg^o$H9ppr>5Xq%Y~F3jQhLb=s3 z{Lp4f4{HNF)39Zwid9Nxyrr7e_S^K*iO)g0QIq-nPuTIi9pNfn1!NtAA-?1!{)WG)JtmN3I@2+#niP{_X! zL%igR`5J;mul@F4evSGa=wE)fe+V=>wf~KwanjDAH{KZ9$&ZKL*grLj*YAfLg6PNo z<+n9tQ>_MfhzN?kkS_qsXhJfYr{(COfNSo^g2XdXnEJ+1K8~8q%CyAhv~9DO1hbQ? zVxc3GN)9}IRdzZpf52u~1gZKaF51~)&-q7Tac)Y7^Yg!bROnjk?c;GXY~=tZO(aL? z^QwMXQmVG$FqW$h7;PIH9HqLM#LK^&86O%Q9p5>%@5JkoPMmoCP12_E(XIWXsj2Zz{CMkV{|Il{|CxPLJI6;y zhsMwR3nJ)u{{RF#=5`T2Q4F>mJ#H~}=Nb%Zh;?qW#j17cm$#Kbhlf_cYrVfI2=`><#0(3(-|pfVd)=Jf;6VGl3qM$hrWso&V~kqzc8)Stah3{I3Tb% z;-h(uKb)TzaD=X{!D-K{s?o{%HkO&R;Opo(y%x(2#LaZa@XRKd8M_*ms3!ovsH}zV zC))Y|h$B$}AcQKx^x<;kW`0YU`Q5M2OaW##5e?qlI6l7XO(MmPp^b=+?fb_!4sG28 zY}vYR$16h!9H7juJ)=9f^UL;(kMG&BZ|f@voKZMJ_H5rZ^a{Uh)7GJla zAa1?6YkYj;oAhv-06kM@;1m!&zl~f^?C^9z>1`#~lZZEb!wGOP@Vp6}s#FTAHrSr3 z=^35086U{8R?jgM38PFuwEb+yP}TXiusFiuh(A~1aNhn$$(Mp4!*X`3*HduzR6FgN z$)wq917uVjCZ2Js%qV44iF%J@9IdX<*He*=WYcEz)BgOz!b0ho>r%`#w1k;m<0p1( z*}jQP%Eoq;3pf&dy@xnumqt}V!b?c-CMUgekpld_eFvwi2# zc3{HL(Dqk=9vioBgd2ce*|mu%vvK>-&h4B*2ppiut6+xkM~FQDoUNPaG62r5SMXjo z(T@;sw(c37;^=vG)6_Vfz?NMn#&-~Uw(cDN-|rqdeE7I&;M`EaHp(Vt#1mz$(NIqjUs7(cGx(nbr zQZkG<7_*!i`V?jj^jHQr%99j3#Px7RRZUYOufwwKwrwWu5MCrE%YHoFia#xgBY-1x zAqcCziJnge(^wmwTU?8=9`~J~aw!ouAu@_`GJv&*n%faCw*<-m!fVERncPWQsFskV|i zVR3Fk;5_|5#mjz8_5JU+dxn=Zum}fzO_(?=}yM;4jDL&dr#32{5ml7GrY)mGJ4W#Wa69|qhQuBq)+lCfwga(NWS6%SZ#FJPVVqXL zn;m;z|Md%bK8UcUyLmW$coN;&0&wR@$1uXCzc3GBmW&(ZDYDmTv7pKnnhWH_bLkMh z4wm8=NzdrDzyE#l`MIY0pHF{2!1=!Tb4~u>OZ)aedSMusT1nH+Dym|`cdQrpanhZl zdLeCu$L3i$kKt1Xqo=%HgKudgpD*(bef1P=Z&xnnQ{`X3zG(|54lX%y;!rvl5Bu4b zUHf+JoZ>kcxb-N6T(4~3z8!A3e~ON_ZyDb=wP*V#Ty>h7!d0zJ+xJZE8{dN0y|QO& z|Io%QbTmFXx&yg{IiRVXyCQEjHM(afM-PN+k?X-s5%Olsrq_R6PUUGoy^4if2;*}o z=kpCT1GUL3Z5+>(78Vv1!)_lr4B=CEE>=m*&827)1l%4W z5i9Dc7;Xhc{Zm~4&PF88o~?_k-CJn28xCLHF}{O%0#^?02OF|+J4Yf{=+ ze2{J`hx2#e7rKUe`z@c!N?0q9s_6lyNPgAGf~&DZL`}`okTl(Lih2ZU8n_vpC81$M zB=81D^VO_qdfyBAGp`e7cI}@Ue+AskCJ1ZZ*bkgQ=Yri(_BO_JrB6l>ahS&*h za64I}>PtAPqbdb0MukiMTW^a`(6!Xx3EoHQs-cPK|37>0_bR!0r3?Qlxk^66;Jz>?FdQ2n zivtJwhrlpIUm%yUN{P$nm|+Il9f^P_QRGI1B0_^CBM_qm5fEaRCRe3>(HD)wru$&r zgbCqvdI!Tve<8$R$o03LwbrYu-EJp2up5(&-XiJp-c_|rqV&{y*Lr@e>+v4pfR}jP zBf9>%_~_C{ggzaL52{xxMwjd?Z#UAc$w%o5XKBt9Krh&tUNA;Y!8nt6xVyaLawSi4 zaBt949&>5!Y}%Z02`wb5iKrB!zX|B!GKvuHQAcl!9&m50S>;fx>khjl`yo68eGUob z!$gON?b+|F%3`(lx!U>p&j@xt`sn2!zxgk3(h2+F&;R|S_kR7Yy9z~XVO+-G2@HR!^Ov4N_ zY0DcNZ4o@aNRnXXr9rt>T>9X3c$1*b{)PVJvNRs-uVgx0tcTm|Q3*(ti}zud2i7zR7;s_#Rb z9cd|JlJ)VAzWdzImJ;Wg0?s$T8o>G1a(f0hE^vPO zqbT$>$fhL36xYGX4>f|uS&3De!fo7e z!ez1T@84~8BAt)Q0AwB>!wh4>W-u%r!ImuVb{n}zHHzHBuZ=QX3Lr4{c*n))!u1i~ z+ksWg_YBj9UmR$Lzb;He=KJx^4YT?7?)`pSa3W|E$6-@TBB+ml`o`J%e3%5ey|bz% zc*cor-fy{0T-eNTtU<2+p>w`9MS*bUR(;$XPtVf2fA?%;#6gor$_9F;Zhh733(I0D|^nUqh4m$%boH#vD6*$6jAP{?_sVeP$ofuL5vB z_|~$X)q4M%g^kHJZJ%PE+>|R97Zp0FzU4PACwGV2bA!q1)*9h!Pb=6&|uAr~jf%%7hqKoK=Mw32mDsp;hNYMr{M2m-@ zXB%?*xl0G=qfZVncDdpseCBOdw6%+GzQ25qp4s|f0h}AP9zR&Gm`j7eInLlMSAOYY zgG5l`Q%xf&nsM2ejji2PCa)lu#bVF$RqZQQfoQCP?x*!pl1c|j13|_(c|5v;P$5vF z%|2C@o|hilEWz@+&f_~-dk`uiAx^qinof{ToxF-SjRaT1v>^;jp4vYG-hlbn+lm@~ z&69mP5Wi&LwY3*+H*~-KC>nzOC)pp?bx2>GCR_^KFC; zMN~IY?Atn!3SEU6x+ncp46a;JA~}wx%&o)yJ+48<=?WJnz(Beh@<(~g3MmGU9B`74 z)1$8KpjW`JlWL&l5qKnA*HEdm->0739|)v8{Ju))p#z>nPkl6vxxCgvXv{hNk&7IE zFG+$c9H5B_gx?$iI=Z6cjkvc=wchsJDG7q9+VKl0 zKk1;CJ=F~ZoL86A{*2Z?J$`^(UVCN7Tc^k7iPBwtxb{Bluwn9?7O?n1nMNY-oFwCtMY6 zQlvJd8?IIoLMKmT5M6$J77zuFUtY>Wt#+(XGZ}@|Da(1}eOPv{W2!L_r{@{C9s8@E zJLN!F#C2Lcq${OwLwl%_P6_vxePtZ^bh@@Noj9ZiFMFzIw_g2<0O$SXcI`JhtB*fl zOPeO*5IWj2P~}qk&I&QQOWv{~i~zT6U!KaA#eZxn*x!7)_FbaDn8c$s&6DN2`Bu39L99>6sT+IV=r3DjC?3gMu zDv56g_nLt5hKa~*AsX-x4OwtxqRmb$wsa09F6u{;A3)5g91=KR$Yd+)rpvgr%AVeI zwB7OsDWVFmr?Q8Nn9wJ1(Lr1kolyUz>am%d#AahKx8UBg^WgFFS$an6wSQUw=LP}J z=WEt5@Q_!oEevjqj4`q;rqz~IzksCD6isv|3f=sA;SwM)Bv89*DA=oe-PiKCyJ{{3AO7hDM z^vHCc-3FCG=

CHAd$*j<7)rqk3z~p7=bX0|nKH{-b2_wPi;~$*SX;5f=a%iU-tG^iJZWSkJ&P6BsfeyPGTCK*b=NqO8kRh{^tZxzLXpCzw<$ z9)cX;Ac_Urkcr+w3M6>78K?A2Ou!Z6O?P&r8r$5kqQd~8$Zu>wk5O2meZGwg z8B~>yrO-?pO@-zVL?pD*@AUt)0L}t9%laz|tUuj8sYZwp$MP-RC~W<*=TR_KGZ1Hn zr4`0;!K$fdOB)g%@c8ix3_zg_QiYR=+WRE5Mf42w?n%giOvsbY4y^bjPNo}oA_fO( zMnzRBZ2;nUx;^Tqo#aj7^~G3_TR_~{sW#r}KI_EF9s8_Z0@amLje$6Rxnj)%)i5E# z9H6i&;y8qi1NyyPG-uPapF4` zgw&418gK_9@TNdVhhV0T3#U|IS~*k`$s9Ry*s>EuWAOe6aR_G8aSmw7jh;cxjZvAj zqqdKOL_Kogm)@zF*3QfGG*gEz_1DVMTpPd}dKjG5)%!+JXgDNetL z2jk5N)!4F~NT>X?Rg#gMWtUD7*UT%n{i5Ns5uxgF_-t4_lM{AQDeZOp&V$Fxr|H?O z1#oW8`r!S`wRkenrL^KsM&z()3RhMW#y*R{ZMQ}VBR0mg?T})IwqCX{<+rc8!n$^LaoXq>MLU_Kg=*?SR-ffaAxe#_f>jLo1fXhduvlpsMC# z?W2?kv4-AfFCPxKO4WtGC znq}pfgG1dJarbH!I*vGXtS{gHVEH^PfU~T>T;TlLT0=8b*C=LKH58T3)_0lCwsPu% zw;j?aB}8L&G#>X3F2xJwCGA@AIpV?79|@1U3;O!L40LepFuxF)-LsEhJv0-rdh4 znKVUQodHT4Sf>JULd?MF(4<3*4mxiai`rQ+Mbh=Rkd=$V>^!b(Xw25uua^>M0i0$1 z#r6K<2L;cB{fH0;-}Jy4L)b?jS+*T~*-5KMjsH;0P#M4?B<_R2NauuTygP&4pC@{T z^ike+qGw1CsfrKADOEkgcrih(Kp??_O;KmI`&4&NK|W1+p!=*;D1Ml#A5y$L)^std z${}Tu!<9eOwGdme%E5!_pQK*hn?f$_nr&T5@fK|@WKb{&vDKg2HVZQV+eLJUMFdg^ z5t}MI!W%h(PVwOJ`^zWlh5*jD-dIliGucsn@VVcsyRTEmJ+q6;*j}+Dk!{nt2(SS? zsxFEgWBgY-4Oau;$_dffYOE;rSk54YhtV@=d<&HxlXz-T;n9so4ujXW=-{tR^m`IF4pkIdFl*G6ye>=*=qC z80dkjt&#Q=tp1o8z|6nUXUpTlWlMFIxvp$b|13}<>9h&Ky7xc-VA)eWll8{8z7oLs zV7XoMjqv9EsK@q+_e`roTyb!PNmP?uVQk*Ot}$H9IAH_<5pB52*r)wgQ>QYRINknKGO4pyA;>4DUMi=i=z`g9JFx z57UWb8|dl6_mMG_nqTC}6_tbMB|&wVkcb5|94{UU=O%K_;k!{Zv}^L?l4n$Q9I?wN zE8!d87FROCUxaYkwkTN%h6tG$dR)Jc(8O6jRoDJ0{i*SW{?3`~yCK@+I{BUoG#z}4x=(4;rL}SjuG@N7g z-xDHDkfmv+>>9Y~3;-PU5H${@1USQnbq~On4W1DQjYmBOXMVBC`oyr@w5(6^__A*Q zFfJOV8i(6+N4UoExkHClmW}0bS%<0Iws)+EPZ94h#X1LPOF@};TwD|tOB3e?RX86k z>-yKXnT5mK1)HP6(I-`QF*2KK2bGLVU*A5Qe=!}7pad{4)DF7+ zsnU%pJknXu0D6qx1-1ZhgeuH<6CAla0RfJu-so%+%80|#hM7|nDB^&q%!ng^BlB>h z&pKKe1BEKph7N5MZf!#~c0i$~g8_s(V)eI;*c84AwkUO-s_~=fFF7b<3BGr>KT{-EO+xZW4vJ$$^<)DA;mBSz|lk)A^tI&FoB{| zSi^u3Mx0Ej#6TR8OGth=Q<{%f#v43I#GRnx+-on_kr>9Ss}0Bja!inkmD_XLRte?t zoK8T5QB)XnC=Tn+Y+uNN(9<(L+q$y=&H^~g`b+Dz_oKCCg5LPcezl@%rNB-DF$T)- z$E4h`xy9PVbWi*!Vw(rX+(hL;53^c|`*(Lt`=e?jngCdO9ie1!qckdUfRmBLL zo8)L@86mvwI5FG$!QiiqB2{&8NCoX33#y7%T>iNxD9~D8e*4wsGqnKDvc9~+dB0q9 zU#5xSXUCqR4tF$!QOjI@CKx-CPf3?n!@4U`cGj+V<+*6F%J)10PQX2woo;WQ2#Gp! zj?V}?M8%L*`9}M{-0k6QSTN+Crur)2ASutw2T^{T&I}M|qoKgvo>1z{@QaTshhr2L zYpvMTI3U1LL6q%;uJ{(hgF~%;Y`-ZvUmPrIF62b%!3=EfS~=`E3Qt5vCf8k;?=OIJ zLjdRf*I!-M^{>Yd;JpQy@$~`<>muTaDO^E~Ux->!gq^bY3Qd5Ft3#Ve`pinvWx!#? zIqPO@*`f*8dJ}J>q7D_H zeO5e#<@&+n@wbv5R77 z3(2Rnkl7IETwBzYPa9E-v?1M(nWQm{LYk@Cwn`6OHS+2X6O8(3jr1(J(@uv@ep_`H zDIPD>o>9^rvT>iPfAN=$;=9%pl>>reMBm=8B&>q=SF6HD{*Br-8*lagq^9d#-GVaf zn75!?zv)9cj|<=|fU~SGU$1@pp`%Suq%IxV#XZkrZ1LfW*;TY~U75-pqYX;mE_G<* z^bAsP=lblfT<=wyR&4S~J0^oC1QUmp-9GbtOdst>$zsSkszJ01d!g}QeF@<30+D7f zat97@&=(r_k5Z-@<4J%ngGd$kd$O}u-W9F8pTT2`!Gm3mnM};Hx;c=7r*^Jeu-_=3 z2Pd?jWF2#Imo(X(hu?l}`BW`{v#c*$AJl7M^SQOJZH$>+%&{rPhYPdcm;uT4ds`WR zr6XMqbT@q8;^K@#eH?yy2!X|1y}mVW#s{&_mD*oh5kDiC!Ei z)lR&nVq)N-^JL3LWz#4y__h06VcdXf4E<#Zf7G~Kxh7Q9wT;1X>56jPjr^dSO`89a9;+;h2p%8j4_b#iIm0i4|E3a`I zR!R||_0M9QM-u>XkF)s!OM2}KG0$Hxc8FOOs38_WE{*pDn}ASKZe<; zAWo3BJ2f&MQtykzKOV5Nz45M1g^@FEL?pqaV)&AFM&)280ald<9RJ{X_i`jt zx$aTDNe2Vp2|-in9pr#RpN^hRLebFapx>;Nb=;fYdN}vimoe2+;Vic={pxt_+n1pI zxvMB{oPz0YaG8q0E~cw4)HDMh3_!XNvF)IXPHP=BZlVZXWt)8}gtcp}qm%$A0Nxzw zcxOk4QKM(*HtdJ4oMVu41aUwG4j6He2=hg01F~ZnZvy5lGv26|DbNK*$eH0C=GoC> z^z2A6^aOG4rA&InB#JG?IN~mfq@BZc4ZxPRiv+AHc;IvjoEfl=BY2bXi71>Vrl$$@ z@3rNFdJ`&~Z{K=tS=YVZ_@KUHWB){G5wq2w;~y=2YyUjvuXUuR&~MaDeRdKDU(UpC z7If_i;;f_m9*5UajlwDflqF0rHhKnO-fh?<-JpMRNrBfNr$;$9BGVJSR^-AVW+i^Pq8yn3hO=);xG#a?{w z*GH3Q=0}Egyk*6>ZQrRscw_loUHiKA?FDdd!g~CwA4;b;LV_f3lcMdmw?!sRSJO$` zv|+-H;o@=!)i(rP9@&WF-`dIVWrQ~wbe4m0Q`dY3#)kHc^;4{sGW#s02#zKaFW9Bi zM)qM>?J2N3+DL^W@pq%4^Xcx1wN`95csA$6Xjuj5%2*Ma5#nU`a%U}$e>|8olxd&) zens1JReXm2s|(;PfU~SG0h|YYh)%Cn#xW}wFq|pz z#g6Qh)4{My^-VLI<;+~%`skZutB3m9>F)9M%oWT=V_wGmY}Snr9^(xc8=kRK*MSq; zlCof7m#0I{zrSL@<$3v#N)IMG+J!QySh_Wyno^8=Z;+<)aA>8eOwg5YxB_BCyw^Ev zby2sEJ~#Euqn<5q;5_OoDF80cTO{J3)GK9NM^GC}s2-in2alJ})dD!n`VzodqyGtx za435MLJ#g|@b$$6T>0L|o`df}#GrjBers!mBKCit2(kH4Z&B&sa!9B zvjEPrz8r9*mJ!=J$$MdY7x}gaxxZwlNvSC03kq?MLmYGnW}>ZCVk5#st|A(LpKk#NL(lkf4e~x0E4}OTHG@3`M2q;g z_j}ej$oIbKsz#A?RihZ+`=+bP_ITjx#t+g_0i`+|T6Qe$eHI$)qkE9*N<3 zp2Ow55{*S`OxaD{M0vdse)o1X{ZY;?zCY`Vw8^ z<XSA5_CbMF2b4r~XBNi9TxxOy_ zbEk%G+VP|9{okALmWzW5pa?`d&2B-il$S73r<;yCOC<%bq;Za?Z z4^lJ*RQzN{5vsI4-knX|4*RFXL#~x3(sTePc{5ZYX&}w-?{6_?qE$QRep&b6EjE&_ z$&Ss;x#70CFd)(K5vMWMkqf~%BuHk-Ct**yT1OwezI?Qn3TL@}@q6QqH{Q6sLzjzo zE+P?ouc9zidly@i7zl-G#{#s3b-g`jTAXH#JHj&#>4NRSPU*}3{#{O|%d#BvY;Mf7 zY2K=*#Jw@soDXijv8-!ekAH22+eUn~{79o~S8&5=K>6?M ztqP=|T#)fO6$9~kRE8)98WtYes(rwg1d?eO{(%6@S|{$IK#*Yc42MdbanQ8g4C%%M zV&Z06kw=kxXvd8f)X?OIFa{J*7b|cseJ3=wfsX#9_b*WZKU5#k2Fe@@yDz7;oTPnla*F?5+l< z7|VMq%Ys%*5@*B^hlw`gPr=F#rhKwt!bBhKs0 z<54CtlZu(?15z;)`-0%AbOIQ-W0UqB-qUV&;6k=k#8WmV63wErnh65z*&Oy!P5Vqf z8+67RY^A6S+`{z_=PmT-yqtIeoCR=}^(7U~T9gYMRlt2x@cs(kS=F#rxAoFnIkhSm z;L5P-xv8wSq9|;@k(0PQ0FFqdB*umD=0th`6xa!LaKM5FFh~WY?#IC_z?#FV&@?s? zRI@DV#HkoeW?>exOFF~UPE-!FbV3kENXIO;0^mr*otTKSfvO~l^C312ILt+^ot46@ z4a@YJ_fmy0|IpEqGYIX&dI6jp0XVPTUQYY9S2&;Fk$8gGj@bBS=KV>eBvbtOLbLrE ziEt&07#iEhpiPJ>ds`LQKnLF*V%xO`rv6nb;KW0C4PZ8&A z9M2SQApDliQE=i^e8ObrmjdGKgyYB3366?@hH7^bv`2vBin)zj`?g8f1mN(oGW*8j zV|9fqzzhK=(ty$v=ARoyb}V5QcRqjo`tsSj=5_nkuLN*jUvAfUd*jxt4vQB#`VN4> z>|&^*Y>s%d;mIWeDG>TKlz|yJ{H^aY1&|R3E`VyGLx7W9iQ>&f&!AJNAjv(2jyaV# z*$<-zidS$yW@*EQnZj^b&vt1yj$OLr|6r!_CJ=)zdbq}nkHc)>HD(G^UY@84&mby? z>`Ihya`&^|nA;%kSV}k?l^!(MHyY~z_Kjw&JCV(CfwnOJn03qoGe2hWs`Kit<)eDd zAJwl2aF%tQ_08+AzZR`+9_qSAOJuWQIA2e$VcHtkQ43%8;i{h#@00?_iU;8wBN2}P zhfpA3$mj?qm?^XCy6G6j&}kGy+bMY_N%zA}bya&-bb1Nl)gf2kP%qu@Q%~GTz5D>@ zb$(2$c;oGcz4Canvre71&bnj3!_;;1J_x(IQQlpXuiGKes^|20ude^Nt%C#fk<%MsfVJh8-LVBWfO@)5M?sjg&K3gt`Z*k;WP16)j zfmv|P3h4;0R5BuV&j0-T?g^A&=l~vctbc09P6SjJ7tC=ha3WugXuz@)xk zqeG-~fr>_soP!w%P$NHd1aa$aA)PNY&TTQ&A*f!LZ`@iwTi3i^Speq-tj7;5@dbrt zUBs6bK}wDEY=IR2+%IqyMs*Y`phO%vX?%=NuGe#VP!!f-f0=s~gFqtDED%pZx;aNJ z8X;k`R@l`3YiPIY2$^Fs26qkP12}0!K(*ujQP9`ByL?*}h{v zc)WbJ7Qk877Ydxm4`RPzy+VKF{Y6HvU~;q_7A|bJQp?mu1aI+%3jhbf4t&K~jxSEX z?z&FzA(VljVeG{A=4f)0c~h4hO>n9%Q~Ga~R_Zy7DVA|ouTr?$oJt$K{U`=q>X)9F z$UWg0Vz!laC)PNLx^}5`PQd-;ZUl_co4l9Oo>JVKIphXM!Utu^5yt0Hp@+TQviQN7 z^VU@b5zWlMsIS4lZv1!woCR=}_0$T-5y~vCA@JA2u)Cm zju;q2PENbZrYOp?A)M~Z5R}O}R@Y-Xr3>KP1i*Q10i0`Ix8a5(`XL0tG4IccYo|80 zqK$)#kO#wsv(kBv>qMtHDSEerPmWj`GvKgk@lF^o9p=^SZp?VWY(6IGL64AWDns6~ z(echZr3Y6jHd9O-1mN&v1DLFzke0=IT{wjNSg0g+ia7L8u{dRwgVF^@+Ga^Wga8g2 zFDtS3;ko`vN>1dsI(u6=h0t)ge{2%EY6tygX8uLK$f;~N;w&Go>js?Hz7oK>wcM`l z#ud(5pk-^xeoylV7i|rwp*4Pij#*-^w=5E0M7COyVeiuR|GiAy5=6v zTJ3w;#cy_%GMr&>ip65n4cS|i*>LdPq|2<(i&XA1O@--l035=DmPH1lTFThjd^5+i zC`cUlNgyP*nMT?rr}W^!?323A?7o6i(sH8lc>tU%yD!Owm}6=-?AM;n3NLR5Q6~V0 z*?e=nakx_O3e&4*M$gdZCe=Y-l@Uk#%j3b5{xUa_+SI5hkP|bT z8kZ_W1>opi7K`=rQyjK<$BW%4%dVJzEN3us3G@=;G6*6DGMQM;CC}Kjj(DVpOM2LgEbE$UhC1A?U5+w|J3V`m{t=qj{Q4ZzU>Hk<6;c|HgV8Llx^Bqdw^ikPAZ7O3v>f;8q#?3aF z>udu~Mwa`M6_fGoQJk3}RdJ5B55&S$&x^qVMouuHr6BXTpc$!FYtk{P?jpuklC#&?pQ zE9#Sb#xoHs#6Yu*-(-!;V&v3=4YOH^_tV6OQLF#G;Y&vBiOpy7zUF%|EV@fHlAWE} zE&GWEO#@M)Mg2E@@wjy?QH36;LdF-8=f-KbwZ%WMV(r2%6o`A#q}qE_PJZhF4xB8& zG55ecM=~H$q;}5tv5CVmME*~ycy9Us=LI0SyYPPBcDxb3O0MMpxKoaqfqyCihqFw` zjZ)o{b-Ln7%kV&sHqQp&p)Y_Qc!f&sHgP$|{G@nnxuGpFl?Ls|4nuC|U`;%lhUjlA zV>Z<2G75TrS*xB9Dgi1nWtigt32!SBw3cHP*v@i>G>zg9Eb~5o5tp7KziL=%1N7huRfIsa(vy%$+$4!5rw*=oVfx%l2>=%1+Y&ze^XIEe%i7 z(Q4@8NXZ|1+}W!-W<42*F|(L!^<5%WqZ$0xez>XVOuf zp-kTCZ-dGird(9SsnA}bEAuW$E{kd$*`Ghz$~`V=?378bW>`@Y4 zY%v|@9}~v`kLLM8%yt_iIjFhK0f2TSuOc{HW9s{%eM&Aw97;hBdBW@se)I2+cm`rhbzd+NA8#8L? zZve~8sP)w0*LI5g$?Y8O82@5hjg~I#7!Gos6_p1Y@>L}+c zg{(hz%2Z(emzKr6wf;xmWPJjdN@1nhlh5(h&)4abT6VgzJM~i-7vgGEux@Puv0nwi z<8!E;jQ>wwZkeTM*#@nyD~?*2>r@SugK zv}pkEOn@Z$L>CkQ%+sApL%{b0sfU6BDes6GxZsRTmZVbZl?ZpUd)k$shMGST?3`DrnYOcIKVmM(rT3(8$hfy=__Yj zQK`Nk&UK*7{g6W#<>VfV){P0-Jx^wuSARu(j36DqXYwpNDK@Z@G9AAyLA@NaZpx2O zf9{1LL=PX^P;d(8TkF|XaoYe^F!Fk?El4aJ(h6D4=U-#^*t?Atv&vJVd!{C);iZ@h z#u}~!FrPhA>1JIUM`zie{2kmA4}RZd>Pb;LALg+fuUg))fB3GSew&=;K;z2f&kToujR3Y4Q8jyK=Bj zUDUYNAunfJ=hJroP*TsIULr9T7Sh&U?aQcVG7cBSuZH!rqD3x)AnoiK=MYKKWq*Fl z3wijL`T4<_Jf^~DwEP3*+1@w!2Y4^3?<70$cl`u#=OeDBxJmV9So{Me=h!xoJ8N;arYn!q zW%fNxb}8L6I2uA6{5YcK-r0o*A+w?tj|d`nv{xF7n@C$Js+6`fArQ8E+TegP`401R z?Y-SMm9f9kw;E=UfLn~L?5xP4KbOw@__r7{W?|7Z1&?y_1HBrTj9@&gb=lSdF|qmT zzW;E3pN#n_qv4dq_TTohQU2w{ zpY{!#6WCHPGBa#h@)`WAEl8VT>NtrlG|uBptNZ)Rq~$jMc9K-esX?bR={x$l#7&wb z8`)%o{bewIJN?`I@jGizv(^Hbw|CF&F=Ie16`gHTg&v==o6k(ywFr{5OdGI#rI}%5HUxhQU zBi1!wU`)`C?8l&~Ft9T)@g~weRpU+nNgPp2pIrP!ZF0&af=M6 zcFPiLC~(aANKJ)PJ9L+yWaj6kvTrvviKoF`l$7tkq~0)DGoHeGUgg7lwn`ALV}1>O zc}FZzt1;p}E&J4z8;9$Q>5L!+vSJ(OV z|Ddzd#eiZ6f*ycN;w;W~=Z`>FTY)e{Hw(}Wksxf+{M-&jfhtY-^o!goR@KNXfLFQz zrAj5F&QE8a%^#7%3LVo)f-um$Yz7V@JdQJvK9TdzR)zA;DG?vRGTc{46S*Xwg-#ez zTKj*+M>2>)u%69toEv=5M~89+tz3%Sh%)WS&fE38B^M~sZS1WlW7t61xn{%IL0cJo zsSRur>`RXXTxI-7rR+=hM{bj!QHR};Ro0YRhU&w(ra~9*PZuDTJN2#;tDJAvZ>NNwI5UBKw>++zLOaK8+21OJqj8Ke?q+PdR5dT%>DBkvX@R50)(2h5dKz z05T7w=~!``NGvL$7~HkSqP0vq0bhXGn85y@2dqHam(oB0VSUk*Dt4P6U;p%7k79Sw zlA;89R&~*pf$AA8p66T^*t7*f#Bx;JTeXH`F0X(@jQ)V7w>Fyk{WBGA*DtWoOTOH8 zNBiw1;So33={RH12+d=>CTx-z=^`yktFI0a_6hSw?Z!(>_13H37b)NHvCsFEA!Ps+ zPE*jC^NgNjYh}-jUgeikKQq@98=R(Fiy|~5=16+|dYK7xUeQTxC}c7WLImU@<9HNg z@?aT%srR1pYTarvq-s6s#L>86dJZ9V4&7hKofr?&Sry+RqlC+9R$x*cPooB-u}(mfd1kXZ{ugtWXcmt9$B+5 zBsoeBQ^ujbWUJFL8XS70R0W5IRe0kGwrnWwjhR1TcwxGuvq^|_lrzNR8A5K0-}aC7 z?;{}aF=`TAR=s$Tqel1S=CS>&zoLugwF<^Jjspgz-ohRGAzF=92UlZ1X zA?TaMK!XKrLyx&pG`VHu8*@H*UFHT!VmjH00n>_Oj`PgsT4%2}@*H_N6p~xz*%XRe z#ZMmss;viwTa`37m`Da*8uV~V;d`l0$X3gCOz*phQ;KKpPXUZZe}{{t7^GtKhAT+L z8nxB=|1NsGhJ%;IqWbol{X#VJnr5eEN^q~&5Aih-49wmNW{7+V>~y;$)7hRv3v3TG z7A|KMD&7P8lQy=wvcJZ1p+N zB+MbRUy%kgu!s%MU;;vz=)59nbp>WSaqvr0vit`4mx zY(#CU0k%GZ@TNrE)dr=OkG?=^e ze(OnzEE)UV7UtF}0(zi2X-sZSc~}g#I478?76Iwg4JvechJQU-)Grbd0fl?*yxgub zeao&q)!NkgN7u@K)Ez(~FTF&M5_NtSv=$fN95|@7G5-8_v9Kv>VL&(j(%-~lbbX#j z>JtA(hTpnR6^lIuD|>y76al+i;$fSnj_E)%9-D=*u`;aTK_0va+P*F?8V?>EU0k<8zI zUUNji+a1 zzz8>vrT#n?3?{)=?Bvo{{fhR`<}QvsAjiRX1y1xWUyJe3TT%CF!(O6skqG}Fq_U&f zP@UC+_=2!KeV8HO|JpUa_8vR(D#;9HPQiMkc0ROpsCZkha4$_67zxoc=9q;}W zyF!nz#JIK3mo0KZW}bMHH`BKMwT?p-q4h3p@*`XW&%8EHqmCScQWiOG+3ZME(PpYO z`%qh^BFYo3mFw8e?r=p&`%E#-X;t)F%zrd5c7-p5| zysRPe*O@qE6*>DaKa0U&mSrBP%fF6V4pB^2-iS2&eaDL)NkR6dpz!9g9(@Y$A497G zY;svjRYkwpw(=Ftb|ny##+~$p80!B)l)k{PM)G;x0xw0U@zbFH@R3!?Cml8mj^d>9 z^9H+PPEo<7o$Obma?~_rzL5&$hi_U&Qgu;XbLYJTjvu4Ec)?#K{SA4Pu6hue7vwMv zc9Rd5!IF7Odyj;=Z;AihSI7FH|f zb!sIQ4G=L)?%y95l=h0)FiHlK4Kb1J7WeY6SX=O64Q>s4mc1F=>y}IN&;|;LPB$5i z_3{$x4WkNyL$;QgzaTx3V~Wd$y!>OR_qEdsI2(<*Gw3cF4D-i zZUu#zi-=PSr#q*7A)b%h%kRQ>nF4pPe0cnQ%>>x;JJlQh<6N{hOv9x6B)dw#iMaiH zy`}aT>4=)+WnT4+Z^Lx;@p#?cbD22&C}@ID=JOv0xnC&)-ZKu?4O52JFF!mPvBM2C zGZpdz4_7}A!u#K=NC9}9@nWGAgn&O~Ef8htL&$KArGvF!Tbe;TH_Pha2iH-%Z2MW+ zuLzl^o!QuwQ+ePcGn^XmH~JfD`-Ww9#bly)dF?Dqtl7ThrBC?^qOO2Ye<`KEpE&U@ zvdkEoK@lA+28+OpEsK{RY@G9K&@{!~YrA0B+s@N#p0*$foj<&?pyQJ?MF@w|I)y){ zifeUo_~u5%%L?clLj=CUa(hZlu&uaDc!k4E{>)NI$}pGtEj%W1>iPEL&Rundj+@D| z<$vB#sEKn^ltr2=i7orV$j_~h^KWQp>i2l{oq#?+Jvppp^JCqe>$9a}V5@~hKLk#- zAUvNMcei$$x&K_@xhpQLLAqCgyR@Y%40_uIx$1sFG6`x)bGDA-3xws05~BLKUS6;N zUB$ZTigKEJaA#Tm{yLn1;nAQA@Ray^5#q0UIp-M-t23ACplt)sp{`>Ar;oP{y$51v zkq2l*Tf7mss~OVQ!2>MR1g9r&bes<NsC4L$2W$(#W`(bk#m+Y zVO`jYIm22ddp7qhKWuQhaakW&E3C7FOQ8ChPOXqElU{{4!!{iBo7VSktcTX%0lXh7 zP50Fuc@}-tgO&aPst&bn-%tvbpEAvQqn#aL4H_cZreCw@-*&A?=i6DMjxDrcV%BsR z0qXtsUY_R;kOID##U?Bj_8oWkblJz<4CbHyh+ipPb#*3}Fz0Ro`eqrftF@fqFRmRc>aSo7?< zu=aw2$J?5Yf;y&MtYm4`Il^P@H|X7p!1neJpi&+8 zFa?tcUI%+;TcunME;EUJnJ+n$`fQZXpg+S(fjU}an2nWxE;my87kf%90c8uX^spKt z8df2AU3!982$Zp+_9~H9h}28U18LMdVL%y)PP_{>q-1sVeuU+Zv-~t6)Z2^!7V~Y| zYr(#$?DuM0{f10`T9&f#X|(7DJB7KseytGQhfE&JQZ8+!1-?+aK;e{rd=phi2*KocL&Y!c3((^tMCu1T42!9!pLyGSn;+eTDgdM_w z{~{{OBInL~=h;ojG$d7d9Nrl*fC1A4c3)>L@3-;aRVeBJh^iGAW>PQT7TiqBxc5V@OqEX0pJb%rrhRplRCey%qhiZryV|l|H z-zkEP+OF4Tr2|Gbs-Z!qV_QE%FtFW>cEz0yGMB<@cJ%_Cx&IDx_}8w9xiB8rF@gyn zBQLvl(5KgKi8aI8&yT>bZ>9U$=Uj35y-oF#(Sw7Y(2PNEP_2>7C&&KS$GK=bqz-pm za-ODwjBxvp3dvO;MXKkIVRL+r`$cp@y4L|O1(*$ZBNMj$12&xSM8*zXjBFENQ)Fyu zAr@fJhkW^xK1NF>{sIFt%RQW1rIr2o>qwDf zhXXE}bY=AHrqP@|5X)PjvaQ{-=AR2e5%SRf8>%KFA&BLn%Tk(}^-fq06?aos12eC3cQiMcc$!O z{UN5-r`d-bO7F-k_Ywz=r?-(Nj-T= zXr^YacYS+esZL0}YF47X%9pD=%?_X`>;%ZyCG3y#`~CkfPNV^ERVL! zDAqGE-U3g+B;8HDIssDmBrBu0u6k{GG166HpHt!SQqQXe;3OrSH2O^osHP6!g0{`_ zu>)HH5p1`v{b~G}YvfaXdU%`zmk*m5X=r86YPAXJ$+WQV_>5Z%SA{TVqF4JK$hDi<2{iIN`8GAu{_DVW^PvP2RK{D+xmJXN==3pOj_c z>$y|P80oRb`EH|#-+^CzMqEQ;u-8xm(EEY@iF6T6>v^L|Dn z(giC=2|01o-12b$2HtNlwl6#kqrnw5Y7U7)D>R8CJkB2Tj8BY-5cJPGMK%u3JOhi( zI;$f|n2H8i$Qk#ep}kqX`c~c}FmmwnZ*u{H=^fxMQFhZg+cEL0h4XQ&hhJUzU;}Z1 z7m@2Tb6BmciqmihhpdT{3N8tnG%oKn8&T?*?vCjfZsU827cG{e&_)j zBPm*OWztMY75*hudUd4qKEG0UZj>DDsAkqnHM|n&@p9UEv;jc{F&gd{**$=#h(~ipCWRy_1HdBg& zth0x)KB@Fkv+OD57@n*T8aNI6|G}L{bhS66i&0G-!xz!Se=kOdj=TFya;$HLd_sPu zw50-LEQ4GpHK?-h@9JEIsgKWg$rQeXKePufN}zp*{~E@Y4ev&6gOhbN7`A%7cfFRHLa_Jzq*RMZ&{@XKP*EdT4KY45M>tM!@RD;?gXv| zFp;LM6tA$@!L zgPSmQ5=mTpm~i49pT0=X`RDUEW=a}CgogoH(#s-7wh@m5c`EbDJ`3dHDi^XW1^Nen zUg-)|B*cJ@w=h%>>c%Fvg#7fyA^ct`!$!{^Z^3KZayb!c*1jl|J8w>1htbyoEMBd{ z+E$R-Xz#Hk*3r6tKs>h8xI|Va$?LqGok%CIHQPLSI}T4T@{C;{{T9CaD*pTXiF$p- zt;Y#W+`h3({yBj_c%34io!r}uAIgpn(GQj$SLj2B$$TE)r=n13ptBeeT{_e?H`p`l zq{3C?%C_`>UI3YW79gSFXpmg>atK)AQrZUJ17Ttj7wXY_6Yly%C_GrwsL=}%=w>$@ zJ)ty$ud$Fgo4o3uXjnIz0GHf;7nzN+)%KbQF|j&&u5QEBfzlPnD=9m7*2qC6*Kj?5 zA{&d0G~%YHFmNcx1lQG(i_YuQn1eu4X4`_x+}SiL>w5`Mp80^Kb|yA+V6H#2OY=T|UogdMu)|vjOjf}cKJg<~#usKlt1Eb!q_wh2 z6@QoF8&0A9!a!L_1l_pUPn!Jc@IVQGG^gVdb_>Eit*==#-;~J!JS3(1aLR~`>n=3} zIgfsAw(XZ=kwdFsY;@31)Z&-`wPKGVtlTM-%JuEO$0DUxjx)_TTdtN$m4e=<;DpBi z8k3CU*U62{4lB}%vC5S6an(sXU_!*nr#(ZE$Wzw!{NX!$yqi&$_W9aAq(O#w5CST` z7`iJ|Pts6wx%?i5kT38_xAsYYm5ml+ir!Fc0K)TuT?vLR%f+fZdA(DkkFHJDMdH^bq@oqpx?y|%S5 z1+q8hQ^MC`RK@-;%nj>g%BOcMUUj6fu@KOCHxZ8n^#UI;`XVJm!4i=*!*4J8l^MGj zQ&dds7uQnyMOh>~Z=wkJg~Hfhw}}18i;X7NCk=bmEG_JcAZ+56XOU?wU1`2k&Uv== ze?8IzVKqhb0!@DZ`G(JOQR+g%sCZ5IbGz*h&4%f8W$_W{)kUF$BQp3|PrxIzseokT11>u8f~|6N+BqP?7#?b09qeg zT`VD@0$U3UEKkbDZ$NGxwO{yO7mL#L>Gl2nD#>|KWVQq|!y_fTobcsL%Gok=y5KJ{ zD&dP=A=7Orz*|rg!YnU;kd}WUvT;SDXr#h9pH7{dMfy0E=L*c22!k)20^7jh8slo& z?IGCb*n;t+?)Mu}HjbI0gx>bqJ73`3zXCW354U|Fboop@Ut*-pFra9!0 zZUFY|I$gFx=v2Xam8`o{f|irnNoM{cqFhv-byIYzyLOs07`x~2Mg2i=@16$yHE}Dr z+f_6na^BchcwT=E`ql^Zmrkc7Xj8C9iQ$=(k{j|J8#l}7F|xM97}T3(a~WQiYE#C# z@6Y}pL87C*-F79{e1L@D{L_fW&iVH>VUW|WmsJU#{wsa-RL5yeP)9N+952tWl`p;& z34}Sf*L&$E(nb0DYe6G=b9(oTvfRCXxozo(n=*! zGZsVcEC+Cefdjr?c`iXN2q8ZqqDLpLDhz05Rn1$(kWt7;H6%Y$h`G&ajq(0;PcX)L zkAdf4K2IQxhM51uxX13NlvJHL9ttnHNb1}gopYBL@qb6Q5#WHc{U*QT{J|B&4Vgdp0T5C|A@FkeV zY_ji2?G8EC5BwjWp`=0aSR~_+pP~I0yX-1oFk-kD0aUoN4Nz{!rFu(rBS+SltK&1> zsWWOnDfh~NAMZc6*YLWY-)ky-5btA-xhz>JleipgyUk44H-b@|F^9H|+2p7rCo`cY zwkuA*{0?t4Ugb9rX?G7SOpia0`W>F*JJVV_;s=`Y1GEYlXdYp!t);T;FmIiupdlRh zM3+l)OW07q_uFb`-y>6v3XYIW#l)-v=7VSGk-t&1FuPx^hGcv0W(?*K5g!)JcGMs? zUMs#F=h%$dFA0PWx}U;lgKk%Pt=$*|WBTUV9!}Oq+fSxgBLq`mcQ|KYAQhQ#ddq;)&O$$2{Mv|b_v3cwZsvw)O{Su+m@9|^K#A>*#iXt06S7^CBvJ2|{md=_YZyyqO817xk!0)k2Q~h#LFX_QT z*;cH=U8jTvy9F}|#enuzA2NYq=C<#dIKGD%R<#6tRZB*7M|ee5#PN{U0j>C<-M0m7xz0LUYxJ$R z7~G_L2Aor_^cqw|8-139PkQ$|`WAv3Ve0Gs%cD#6yGzF0&7Ql8kcQ;mnWmKOf1I8U zTL&1~Neva_HP`2Ci+j}yLWFt3v&euc4Df5CCasRsjFHqa8Rhff5ptdrCPVThzoLjn zujWvQm1WJP-5)2n)!msG^kdI48e$7`^JcysR4`wrF41>5@0B$%qkQVGij*VFY^$kW zSRe&z@ykydf?~kecE{Y`gGTGse>~-AC8Y>+YvgP)pDrbM6<3w8CeR79@=IY#Iu$?QS`|1&EC?xkR9CVmlC|R< zZ`akF_?EPgYgAM|-zD9%oZnu6e)J{R71>8-U2cLdSl>so`IcSu@5`%75gGKrexpi%$0!D%L<9h|FgJXR%&jI? zSUleWiSY#{b^CW#kouiJJWShmH{sR1*nCfU1Z7a(o%HKm@iIpqj*9G0~%2*x@j|MjV9 zO(%aX1$Sly4k;>{9Wh~&G9Z|c2YUkFN8C@JU3%(ALYlPwN}5g|c`>8a%7>!%>|6OB zg~f;HR`lle*8SlpqWrU3-?_=SKFAe-#2UFW*gHV}U zQ@~ADrkMk7?J<5$=gU@og3Is(>;sMM?~_cV|9#~}^uyW7#ph*}wz}*uW@1%j?&HBFo8~3`E7Rt+pFwQtp3X%#lD$mUvdz;I3&&Mro6I{9L4lIU zU3wOVyJlm?eQ6^CzEt;^S$#>v=0#Z(qRJjU+*t*ABR7%{-;@DILfcxiI5Yhfv}Xn^ zvdW)1-b4{2da@$$8(wE^86Bs7O>Rk{mz?*VP6D;SbPBxf#`EQfhH&jBhhTgcvkMz%UCSWl5StZ+@3G^1WI;sy*mRsq@OU68T;s)2Mf6JP64;n%^~nPUC6rIW0+MO()KESE>3Cw}-MHdjJM z_%iIqqIkdc7|0eazZG${0XsQWfM)|_9Yj~KB8AbrODHbQxp>0Y`@44x);ieWlKBe@ zz|?lXP%w{FWax461qoK}*wms5hli0J4Ht6ttVs@7Yqb%y9JTqhbI_GunrMYxw<{G= zVeotNj)pjOK?CJj)Z=S^*B%>!voHa|&RP4~RvRa~?(eFWu zW^!Y`c4-Z1Z@BI~8ry8rHffa;mhUN(!+7VP_T2pRI1SAeQSb|4|o2vLcz znt;xKnIdQXPF=fqWV5!&^C=Z~aTSg@jQd*dEX2yF$6X=>HbZ_W%NJ#=&!0@@Mf#D^ zS~1zqCY&(^Rk+Ss*#zYGFtoT3E%1(hR&(j1?*$C9XOZ!p;3GV?Xzpnp_tP{{ix^}L zO9t|YSrynwA032ee%O|gQyUEa>2cZ5m>Om|3>%@aga4iLbmON^2TnrUhdK;8Otp;E zLrLUt6y-45Jmqr1dcc9>BC?})7xg?1@XoVSSyC9^IGH&SU`;%sj`2t}BQRuw){9r* zW>!w2FnU-D>dpdyHBO;Jq*73z2zoTFiZ#pCxtN`v@T`@Tn5eg#tsk%8gKTJ{6Z4QlBQ-g15$e zJz3K`d0{?gY zDAE6Z@2B(I3&QR6AS^5AJi7f!m}2U=Gg@6^Sa}r4`KmaikSB{tu%e@- z?x>9yxX$kkYqOZl#M|j9ls$h=50QcUv8pi&PM~yKQ5;ZD)cTgkiV7Oy4j+cle!^LvVU!mL)!^fOXeWMu$&D8RM?$ex0>$+N8Hg z*~0vlE~}7KT^J!|NjFjlT+ujYpKRJGGZnA*j0GP8HcVjdDjw&&gu$-Ik1>82R1s{= zW4Ak%+-!j@>gdg=;$wQXL?n+tP~S8lqJcv?uC&`VWnnz9K5h9oF;M%(EXke9DBc<9 zUU|OK-l#Ae=4D@aPGG&7LFvI!v*Ze+T0Xpmh1|=>G>-ncJGHwU-^A&e_9GVYd$$aG z!?(_9P1)6w-B@8!E34Tq^?P2rPjnC^XBG*SSko7OO>|H@aaD=Zos~upP5*`V$zo3c zJ>AVXT&l#Yc7BR=of&}Bb2*9X%_=dt?F?%Nt1lSURIJ%Vxgw>DxWTWpAZy|)kQ32} zkr}PmkIO_mErsaXlXvtnmPNPk8!!NJk(mua)+-@Y8Fy{o4Jr%vRa5LZgG;VcjH6bO z54sb@`ys5ErFSFFbPYhM8;m#$UNfI-s%*|^oXJMP}dH@G0Q13BXg7XOalCU}pv-kC*+c5gJ zPd-g1pPU3Dho-iEj^Yj>N3~KJMv5-wgSW}@=4eBUHbeToGv|05XWT?XxJIC)LWh-3X|V zwB(QM8G)S#JOcJylG8J!?-UY{7`(9FX_@ul(|;6x?nUQ=Ab};UMujCIw!kWhS+dS7 zO_TLCf!A-7>kQ^QmYX`0`Ut%+{|K!WxFv>vcjpcrs3)Gb zl>>qd;5NyWo2JfId+&X5>3p95c)s%31nrY1$^RFntih%1^K>omb2B|i3VhsK9cQjZWb5*NL#ndRyC+u<6;!Fkod4dwUz4=Fyv0>icn!0rH^A1oQj%0?;%f!Yh=rEJE?~u*am=+qF3GIUD%iTa(wK=Xb#E6{DIfThvpF_ykj&6j+{hy#w2GTJJ`lK4K)Ass`4%y-dd|lj z6(n62=ho`$qM1Gycxbg}lDlNs+D#@ucbp)AhH-Ewc69E@YC>8#>aVOA6>QNxH7WCY zj{TWIjeDWWrJ7#QkKXdnMc*NskLZuv%)^fBOW@NHE>q{*B=BRH%lkPSjIDD`8sAUB z%8Mna_jdESztj7&b<_2Nbn`9wvg0u?hX3U$kIUzwcJu8(6)p2>qUA`{rE3y$Q4LN( zsIMRO>zyj>DnTo{OYTzj;=OCkN&Htyo}P3$32*Kux7{HXuMnyD9)}f*=?2sI!yT)D z715TSBFK)a4i+kI>YOg^tiAX?XcvPlo1-98_@r#wF`^}aEm1e!SP=3O#*U+{+(eBB z#diY5;{}nF!5oEvho-x7fr2CqoW>f<$B9y=1s9>i?Mm<4^lZ?XEDs+k=&1ejeKh^! zX^pGnwcQ8Q?{Wn5pCAevKLvg)fGzUIe~Bjg!8w z+7z!KQdBskV*((HRF6vF!|mr?iBjlamH@!9#ZN1KH-~d^0YA5i!U@b=amI1j}X9FC^)2L zCgtyO?u{>NtJb3I@bdI@$|kcro6v8ZemG*a?bU)lg*!e~4h0G2ahvz^5F78e>qVcZ z1EwsGi+!}t$Ad+mw^K`Qad8)l^dra2>9k_scvlu((i9J@ouLv69AR)p0KrS9r)QSR2rYfEr zRD$SZVr9WaUO`{s>G)=lDA5C?#>(_c{SZ<`_LlZ{XJ-c$$XhBT}%1=Ka3m@bPqm=KUP9kNIC`RVkH`4cZ|DuiXRi zWR2{P%|q>X+Ib$Pk5?bh-QG*k>8Q@fi^Jygu#3)nO2_KvYjj=0qDxs#vjcn%YBdTe zyciK6;YJKb$zT`_sOZzNH+9iB;tJoRUC(mNq%@&>$?^7a*1q|7)wt#8WAN)wrI9t{ z_8<1waPgun@Gvbky2n2~7|v_Ic-tAelOYA9GUjPw8BOI!bA)$K4@qjuq-vG_u4+wV z>?t$$7L;)LDHm)zVqDZY^Ef=Ea6Z_ur=HE*na$<% z3XZGyIZ-ao%qb_Kh=1{i0L$@}=h z1_I-IqePvFLykk!49Z?D;vGWSg!b*q;!)q?{9L^pVrF!c1212SE*-BK+~37~i7 zu?}iufjWFDQof)+E z$t0mHxjlVtSV1Gv&(`EXx32vC)rkfnK{Pkq~6w(J%NL zuZ>(jj3I;(aayv8s5k_Zd$H+j$*GN~s7!&<<{H4jZcs z__(lvO4>4gamqYukWZ(;voTS=&9!h4W3zmw*G+bo(FNUV>xW&<;9ZYkD;3g?Z62D@!-S!HrG zE#R z7`hg!nv}zCkv|ELnjTKUSD7QX)XLcCJ^djbeUY<_wm5>P?mSTM&@bI)%B;PPpWZ79*CL= z3Ug(jSc!dm+3GCVXYa&T=3rZcMMo(gi7w_xOG-`=J&pQf68-WRi0%(b-!1lLTS=4Y z(cZ--&8<)4GNV-fDkO=vjQ7S>;EQFZDXZg;AssNH;;>7b3QfN=Mw8oevFR&!(+nm)elxMnl=5@3>f&{24$ycdo0 z2`pC!tfvf=M35jXhlv&h>W7Va06%8lOS!r_+%DHQKS(A|*9m=y^CWBSwE$*tV&f!i zrRvbY&y^#)h1#$rya_7C>V(0CF+%)Pc`}~VoZi$lZ_$K-C)ukV~(j(Vqou(v9Ss9Z*-=I%Be`oUFBDakl`H6g$5USDcI z*nD0>fN$GOq-(CHjXp0<0a=7x-lFqf5Wa=sXdsG{NAKHmBf+ycq>3p; zC^1k1+>b5m6dewY@{NS{1N&eeba==R((Av3Tm)lpFY=vUrvvalewZFSAHd1G*ObEz z={55Elqw5kPWAh(6(Qde?Q&j~z@Ca}l)4w9K|D;qf)}|S^S=uXDl~-p&V*n=0HtOq#IkliR$VTWgs3v8O@@ND; z(A928?frx$U&drPNdEmMr1NdNl8f```To+!es`d?bMTszJXAWz5F_?^*%+Joyph5o zDB4%qULJgwTSuEFR*pG;7_v?8-~zrKMs0R_><-Ao7(uYvY&Ko10>U~yYi!03d+#kx z_&lEML_p62|K|l*q8<~eFZ_S(z4cezL9-`}yF<{y-DQx$gD1h=-FzsDBOO}i z-M6z#w_ehgVSFOayq8n-P=?b)$<{xY3R%!yQq>#+r@auCf*#n02}D^Gqx$k!Y&#q? zrN)$iR~eOOVKqQw6gct)p5FBkiZ{xLSk(@ba#(W-;}FINYAUtxrRixWF_YHifgQ1r zu}4z(T@TByl8^hU3|Jqz_s&}FYl#!#10RMvm0eqTG{Bfo0T%)k1KXW*w}s(!I1eT7 zja`3mZoiX0WB&01X?5+6N|TxtOE?^$%^UU=TmM<~y)r!N;c6TS1kcH}Ao~{ZOGp{< z#~hCmoNB$2_<5Um$1TCaAp3+-{vEv9BIZ{&|m)(ZAR19zz!r)`2mf* zc`LyURXJ>-Y-}ORJ{caH-`}SY&pY(-$tI^x;`xNh+Dy+s00kPoAjrs_e=qx_m0HI+ ze^J@B;)xTs9j@@!AC4`M?jZ6!a^8Wu9wvnTGQ5Y!@;}9forK!(eOC6ny$`tP{zK^Y za@h_Xn)uLIX%QgH9=M1HiMSGcfPNa#5$fKs&`j>>a zU32G>5=Zl5-S-HcDc95Z{$H1xfVnj*j*eo5BW^E?fA_de@mSuz{=T4|U5;qo9_Tw^ z_~HB9+7=qRceefU?ZWc5|7m#eU-lk2(}y8biL1hXim5|O%q?#e6-~=2{;a;p3&Gm_ z{_Ibi;UfKY(31UW3_9=MRb z(&Lf=>Ppi@gv69!`GUV$Nqi-f^51&dKiGf@gi>096Q>@VZDVB{?6v0XgzrEb>2js* zc@!P;Kl4BNmYmf@ZsN2^TF5YHuTsj)^p6k8#;Hu8vVEy$P8A?Pv%)Gv*I+4-L{?<^ zUR|!bbA-f%j?@)(Z50uPkc&3O7;pH z!6tuhYtKPUz&p?Ej_FYq-9#6@5|y95<`5xmk#-tz-Mxd4l`JBz%Pc;r?4Nhx6wTo0 zK?>)YJKQ6ii|<3lM%BmZNBWR9uVZkGJ@BjjezR4pqy8%j6}G(h%hl?({Vcx=&Awrq z9K4C_Frmv}ag2DseSg`!TsT=DMV>JW`5JDZk1GA{t#Q1%y}G0!3VleTP&AfMb-*4+ zSZb**#F^K&cbKKCfA|K_wqaFgU008fw#Tw% z#LpAtVPqiVvoBDQBB`6@+EW|jEmUOECy9ca*1|mvn99uIz}2;YSF@c#v5m19QN0ce zGd|_qu}+KZa)>fX!5c$5kw*-FuzadRuT?hI;myuh<-Y_YK={n**^_8aj57i3VLK+? zxEaRDS*QAzq_bZ#d3ttZ@Z`prA(o^z8Y&B+*t4E(LI%s8!v2y1XEX?@HJSJNL{?aU zaXw1M>e%|+z6kC}RZJ8v+qT0$aeUx^Ex9p=c4F1@nW0cGg5&JPeT2Q*NfLZ9$}l68 zPy63)@g(C2k&2x$%4@F`=yES4pZ>IN(G}~9G2TQW-}IF}6&czflT~FV@d#U)$4bW3 zt+r7_5^Fm*Xs$vrY=e?gEZED%A*l~!Yjos9`TD`?j#;>F`)3*=Li`l^x8q$tw%~D zP!zl4T1_IU1CBR=0ci0n*Kk+r)nX)lV`k5%?6w5d-fTTAsi_rITmcg2#_HyBuk_ht z(NbY-FPX0+@XUX#($X(gH+iJLas^@^H_v;~D`%fFy3E?f@PT{Cgr6*t^D>tQk74lt zrmB|IRJ#M;UnL_;{kTsVbxU@zUAKlu&2kloCR(*`t0+ve9_2Tcd|KZ*>-b3Xcpvre zXC246GG#QK_|tqiHY9>%&g&>_VmN7c4s0$i=Jl@$GE<^GxZerh$^g8;g<)`n*dhvY zfO9T&c|_I2Ph{U@TsO{#iJi0TxDA#i^6+p}OeMK6>aBUWe%;B5;~0H%Q4)p>HC#Ew zYVW&I6`2Yf`&(Nvk$E?rEX4vJ-F=-I3{=TL7@!ZYjxhY05oo1bJJDx;3E}pg8Cq8p z$|k(*_cH3iVo^hEwOh07rDzk)@Bi|fLTxy@(SGrlx#;XJ6^m`r zbY}9ZlZY+kNx7oQ&}qd8ys;4!Rz-{rAktv`Z$`639KuH6KE$YOkuPu3pF>f%F?}}2 zsjl{u(n9~4p&txUJ`L)CSDnHWtn;CMrGV8Rb~z@aO@l0`Fh5zlx9I{IDl?*Ac(;O9 zu;toDZ*fLtz+e6K)(*-B8!l6 zNgz#i8gk9}nc1~}a9$lcJc790of4Bo4p%NC(3fbWmu&-o?tA1_mb)ebsEviLOq=Tq zGKvyM{St?NA7$6&N8zAPy;vaCCtqs9b4mm4F1+PAsb6QuwB)wk9sIK5ID$^(D3&|p zE$z@xCX%-V16H&G)$>j`GZabz9Bhzp4bL`$?l7SLuNSC><|q|xtMyRK7FNB+u~Ti- zN|OuR7kE%`eDw_M113sEuVcr}N-5O;B&aV1ZT8NdQnliYa`)4odgMWVp6tPeaMhj? z9Z7v-M!9_?)ozGf?n%d8ITdpqdL~|D(dw~n88bN+1jBz-8#AMD&TC6QJiX(I%EaNk zl1Sz4IaM=5$+Yv{k>NGpvR6L99M29H@;18?$MT`5Hq|AnN2hDGlGpa7_i4ZVrGZF2 zPDUCzrYZix{&$xBW%KvGE%Xdz%Z{o(^ph9fh*WL@0$TSvIuKV)lv^p}u#KWVtO_+Zw7ZVHl$PN#B)&`m0|#shx{u4Q^@E za$7M8;sUB_qwGLPtBDB867*KL@+{OGYQv~19(i{8r&(G7BX`(e3MEmi-RPQ!eX}x) zug(E%;sVL@H69b9kMiL)GGfv{T4IVD_ayWGuD@(jkzI!9LqiN9Ez_g`=uXHY=AO7V zN)t7G(wc01xD1_ih7u?`A_$K4n?`>SZ=edD1riM_weBaerhdwpkTBpf>x5m1LUXmY zw%xkSOGTe;;~4nS65Xp~pkezYmIPO{IPi1Edo@bhKqrb4$u=%6n?-7|jS_-lwKTjp zWJ}Q1a5UW>aEZ6lEg|KvVm{>@R);l{HYLS2lSgtsFpc=|IaSs6xDW#~5!l4S?^SFw z+;DvPlnqfe)?Nyd2uMP`5Q)8O9IlD!{VsJ@j}ubm*fHz0eUmb8oeV2TM` z%h0p^Njn=-vw%NVnK;TFy2W(4K4=3TqAF`*y^Lp?k_Ln~q*5o{@xvd=DeQH~h5?jv zjXqZE5yVns+Pu*gX{8qHaW$(Wf)>9MxgF>5sv7+Akq3f>H?oIVJ;B?TkI|;vX^v-y z^~(6oVG{*#Q94ujZ95hQ<^DEy`TKISD{-~}NyI8svR$Uw>2DtA``n4RIor#^>&&Bj z*s6at7(2XUlaooY%@l{jiFB~Ws7&~IhC@tR;T<1i^TZS-V5H^~HfrOnaZ>zAAq_X|4Ptyw%UHT&U62v}2gg}fd=%R|$j%=VbS|Qn z(DX%=gSBER)YEe8OMq8GChHp-Va0Q6`5{N$D8(rPp(f2Kj>drT-hX;dx3^I~!EuM8 zlBM$=AB$j}bEnR8lOrQ^qFZ7WDX4Y$Ltf*u?4K#P)=E1O4^5KuJ$zE^-%u5m(qYTE zu8PD9A8T|sC4Rghm3D3@`$+7AY!J2}Z8Q<67(Je_H(Dtj^B%BtI$A6hPq;&@%qA>f zHq=Pdu2@80@57;PCpJ;24UVOU(B<)u1@1|U}~a<*Lj{< z!DSkh76C8kot}<`?-c(R+Y14aC|m@IL+|SY8fxi&)$!#WSEvezz#j|Q2APym|6vO+P;n2mt4@{B-s+o!PqZi z8QusTRl{zA!Y{4eDzK0A_Ec6>HTVehIcq_}?1#Hmmo8*sh8>g7Elhkfdi;34Ntu4C zw^jO_XJ)@dHYpY_piHseu3w7rddJHg&J|$n$C<69xiww0)^t1Py{KrL)XIt0QSW-zI9xnxY0(OS-f6+gmP18k=4D3UO}&mknsx(I~W%m5`*Osy({q+rm}Ufn>Ae za&P$59OuG>D5nnz^@&NJpLG%=Lb42Jt{4nbg;6Tj^BcB47^^Q#>EA!Fu1r%IZgyzmfS z)l|8dk^*v_a28Od>R~?i_rNo~D7<3S4G-Ffsab4b6*h%m$!72)+=UBAa587s*#^N) z-P-2Ppo0%_oY+hddj>2!^J==;PW|p5bO@qbL&4)>2Wx1!!mE|?=(ufa5FjX?o9tqu zHJX#UK%Yaz*-`pT`>1pW?XK*MaN#EZ9=44lz>w&?n2gR`lP-nlj+3Emk;EeEqGhj& zYN)aTNr_V@?EM}&BQvu}{RrDOzB&QCF47%lZE@b4#Ko0 zM{FNd7idU`$TIRs}`9T%0NeSKj=X_YFA|kDJ4fs>J8+m!;CKE^DIo zFhkENmu4H> zD*Law@~-t*8`TyjN9}afT#chlJ_>>*0V}y&zyY{T@fk_HjGV)CzFcRrDmal=M;JJ#7w4x)K_Up?6!#X zq=>h)Jqew&x%s82z8UAmX@^~ zzCS!(aRG%@+fo0xX0ydv=pI$%RkuD8&riB7u#Ys)kMIJ4%UlYFUw0@Sj#S3$H{n}F z+7%^=^Hs)JBzgf$R-l^*)$peH%E&V1)VFd1Ccy8Y^Jrw8P2c!%SbU#;lI2hPh-b2w zmR}jMBfAy*hnDJgSl-GTSYpHik^G&_$}M7`bv<9tS1iW`EG;5Wm_Z^E#e?RDH7sec6N_k@WD?a~ z&9}W5wi$+r=@Z;}tIL!%87f+6AFQdW1OVUn=tw0^(OR)!sU(v{{RYx-BJArC@B$Wx zx}Zgj^zSe+n@-N;wm$N;N7WrZj~%~*U=A(62KV~~MqvH&jN5|xpl^|?4CRd`#Nz1QUHJM}K_dHZg^q4& zYISkdas_YWB-Mf5vS<>sZ((>Vf3{^M@A8EgvDILF<)=1I%LzTD@OxFE%(zqcIa4{A zInHnTNQjB*TqLLa#=OBnXA^c{Ln4OMr||q^V=FbWLP$B{6BF+n$wSMQ-B8gv7B9+b1pd|Qg{G60BG@uQE*CUYxQ>2q1@S*F zb0O`Zx3PPp@?!mmKetw_^}riHY{C4t;yBsHONU?G_@ZD$U1f~?%tnL>8N!+q50B$YhvYwU>~<6Mf>wO&tfNyay{l|i=#NuxuRiU+=F zL@@C33O|u-D83QM!{5|;4cn*u5@vB?PCmYy^%F}8P+bIH50S1CYt3mGdNm^D1qmtK zr_AKO@z#1|UOA5Wc&XzfH7k9C8cHuSo>%F8?WLsXg> zQ&Zx|>DbDmWB<0QfwgZbeAaC1cte+DT?*yANw2N# zvXoTC*O%Ndc@!tUUPBsni)tN*i4cW{uI~;{GOv{55T#Re3)z&BpFH|co z;9ExqEdjbp#EDMMdafBy5>z7=)L1xTTS-Imq`tw`v-%t_V+b`I zX8Ifi`%j^7&h00S?WbPq?L@qG5KtIR(>t*Cv&g}M;c?1-@FeHTEez22`y%JvNsAZK z`k)Uz#C~Ty0#Az*Z5jRBPaBH2;}kU+5DPN-bot53z8y4$%9xl+n$dbpbWySLUJ7UK z_|7z>5tqrbMbb$!hxPaeXhc>q*NV;%NVK`T_cwXSdycYa=Ny2b%%YqOq6CShGHus! zaYE`lsLd78l$vSpx+W%b#>1WhE8mASYO%5V-g>w4)yx=5bA3Fs@o^;uT2MmEKyfod zN~2Rdx!)V_c;Ke8K!Km8OIcK1<#t3P%tguRetv1vOwulf-8je-%lZ>h3L;|imAMG@ zfhEz0rKz%r;{EqMvU`1!uIYNr5VAtb=3E9)i+1SQ{1(yV=yc^q;l9UPRgMi#eQ7bk zE*vzlN3uY@-E^YSZrV+P;-b!NnpZ5Sn#PaXgbMfYX>!KeC!OOWd(b)0E*@J;xwvZ+ zi+|d|#B3&DI1}vE!8`S#D~H^0gi!n%AcQt*qo{~j%k@r1Xzg?xCbEwtkO-Z2I8#C#kk@5O}B`&#*a95>>5FGd%AxX49B zm%&WK_fs###H2o*%T}v>$T)2~jKrPfyEefCb4;jWDXPP5j*&V7Sj?m}k*)SmKwb{8 zV6#ZEIxv&fc2Kw$si9RUZc1=<%v+6huZ>0E1UYml29--b-Hn+Adsu_pT?t@eo#7HJcgGnx zwkdKO`;2Q}-JrKfhho2DphTytbTcW}E00xBf6!R%d-M!!IJM@?1=Pn$o$n3~w5;*~ z9q+fjAf*=3L-GA0xnpOe+3nl3!L|AtGKdL^Nh@4=OiP$Gzs>E#YKF0x$xGwOtRa`x zbR-1yBVP9Ytby>}Yl>aE+Jk!k6j%P~)?`0ErE%HKG&Qvp87Rw&T5UL4s??`bn# zsG^qbC|lR8)y|%Ho&ncTGWM-d^0F&Ku@elICs*ALmCYafO?pJ)T|f-{dW(D2g+|vuP)xyGf|Q#>`O(wTiXOrgnY8oLdVKzCqrf6CI^%|A_Je z6j^iH4o@mqFEMsf7?FnF5$0WwOxg>QliIvljX^D!5U98JIB_c|4V^NkREX&-ZFCZz z`fanj)KRcHF`&E1y=(Y+g$VqS$Nm12>YxI9 zP?-Vet44me?39%i1x>D?a&ia^s|(!#bXy@2WZPp=q#@-HRw%n`!fZ8!K zy8|NCu!UjRhk^8UE*$gf!@-gfPzPjJ{fv zQGPArMfkxM&DUD3SvOMRRGN)K4RYy^w`g})NbYO@M%E!JFxfHVFwI{UCqv+{Yi1^Zu>5+%?nRp8813svpOC z#p7f?NCOlIaX1nSSw%NF>2O1p-zah>+VK-MmKu5Vc0~|fveww*q^A^5=ckI{x+;_L z%fdUO4i_(^{;9Kx->ZLL|C-ylcJggG#1CvzCoOZ4UGPm+p~GAxG_$mpq8g$zd~D=0 zTu-Fnv^}V&~{YUbc$syg5h*$Y|%-2lubBfj9Xn zkZ}a2Y|pKdr4NEQs^QryGd~EN9_NYwTT^Z#FrQ|eWu z*$bp_+{)K;KbMUoWiX@w3pQq1m@9X9C{EAV>kCI@kgW1AopaRJM%hppLPnnmd7rW@ zBppLmVT&xXHCv`UCfjPZO~wa|<*nz6Rf))gUa-*nNq}z!`(7>hHAu# zDRsss!bXhf&a2BQ?y-y>w1;AM^@pM6ivkqsQbS4yoC}|E!MUZC+1hFw!OQ0sy`}8y z1qW?!BHgz!gDr+~J96}U>}a{c>7df~s2)b$5eKgE$^VW8;9v+x1HB_@1oNol;N)bL zNer?mceae$=62+-u9XMAnH?ENZm6dxQY~Ho==}qY4J5TeAObP(xP>f!`vR~gy|G#C zgOq|p0TU$U*2Qx=cMSTK(GCA5JfIu20;8CNQdwMlGG%VOzON5%51iS+!jiC9KWB4P zm*?K=*Jea!2Dn9R>UF8=ic2;zKZ$Pmm~~i|ju|JG#QdC_(!*PeSID`>ixMJg)x@ui z<974cvM~xWnllJe4w5iU5|RsjP9=T7v{Xg1sU75bYrbmsLKfozA+ec_S^(-OLJq!o z>I5~9IJHIdMU#36Ls0TYLmS8$^(z7v)br(}-uxG@GK1}LF;!ZpD*!;5y=q-qP#I!a zn6zRsjr$o=_)zj`nMjLvDb*v*W|e8J7NcX}v37zClLav+n};_R%6Wznp$gp#$j#<0nt6HAMut zOHtUwy*AOpM`F(UBNz->d@mV+G1w7t3@?-r(bwHk(quML6yq&@=dfGe40EHlBhZXU z>02P*0448H>i&~$qV3HZW~K{5d5-_;TWycwuFsj>_@-Pk`Su+YC*bV9dCuEUQSXa6 z3k$V=gj1(P+?>R$qy-wfACwFPXbzW^W@CjdPGRZHM?SPf&S z%vqIG_SOHSROvB7sh#4B(&fl&q_gtIATdzx9&Cy0oWWIP-3p9zSAeZJqVfo%W-^P6 zbz?+7pa^g!VR{WfyiXX*GPsOYfsXa|w_D>j*3Pj8P}|LO3(AEr z9@Q=Oa|KFf1OlGk6-}B-OfHJI(cRvc+|I(-ekvSA^2$!BU(|;&9a4M0v#ohY@We(P z)p8Q^+wq%lcWl}gPp?)_Fc{u>*84bU-fS>tImKkIZSZ)mPzrZ(5v(Xzt>I+CSY_E@ z!BiL%;-C)lbk#r0UgEcq@5`*5=J(hm4^6;i)2ySihH1DzQCjtR6H(x|!5iG!5(6cs zETq=RCZpysP3E-Ak9JnSmAv`YWS9*kiw6SW$BQcgp)#J?>OB;qGw`5db-jtf0M!#g>W5!YU^gz)7pk>x%uclnVp_v z7lJnGdV8ODL$#bOlT!Ybzxcp8N;{{f8bYWP{nIEgwojh+2DLC1E5)-Y63k~&Pn##$ z2YD-{o~X3Ix<@?YQZ8;-H_~69?M0lyNG=sMO?6X0?fVtky4dpUb1oS~QVxvLF+6d@icoi zx_jk0e)*3Dh=hWy<815`77jaAB6IN<`3xMWR;(V*RL--fnOClkJAiZTj30Z)LJ>St zIALyLhBudoVGymbFPeJwneW#!n6EEi&zZj>(BS4--xb$zO?k%agF2-#*_fF_R5eEI zptmx&7i4}zYsEplBR~cDKgMbO_8ZPcsmqQ?M|MB<>7{2HgT9%K3HK4u7!x5$^gBgc zN7+O8(JK^n@yF&}ZbFY)Kr_ixAeRl9C1JZ9^m{#V{oL5lT4s#iU&W_#P)2+826JkZ z4%lTl{Wrf{w`dcwa0<#<#S>uVV+y65$j8j(TuI+RNsQlMcW~_Yfo_^v&u%P#6B`u$ zlr~l$45!mY%C^zlt)lC)f0olwz(IDgR-V=>bLkP1)3&QR*7}6hs04K+%ddI$p=a8Q&GlK6HAYT(v4iI+WY<PEiTPvPv#)mTpWH(5S^T>9CGILww8tsC*pTKvS%T#wJynn%b( zKBo3A9PZpUNKIm0U(?R_Xo90{lzNJ(y@j|b{?DI3zApHF!@M=Fr035yLkJtyL%vE* zQc$ER23QInlygF{iwj(PeHo=1>TWSB;WBzHx z|G-%#JiL!ne5zUd3I4BR@H>AJ}diHV&L;6c&UCry9WkR>ni^aZ_}z1Clb7!{@Dq0+8;VdjggwVOR&{bMJ1H^Yv*n) z@_>&_nMe5Ntt3aXrfdSZ^=bLp_{-vbGWGcLX2Vo|&}(Qo2Om6-=>GXFah_d_nB3R@ z2_*1I<6MlmD>lbEcX--=9arBp#F}Vrl&)K`g&v_gp`M z0vUjuck$KqE|83o94Dnx@4GvDQu&0s#R-nB${3)Q0t8FT|-`5$?6%ltcn1wEU#a-Zu2HNyhQoN|pD?giA&leU}lW7n)A{D%} z>1nY$q*HaFJqK?T7I{Ra<3JN#m`be2yT^@pXd33JQ;muk#^a@UEp zW!@V9)ybvWT#VBwVOe>$V`P~W^isV!REbAwH)h{L-8ttS4ZqnQr?a<0|eMW-VYnZA{ zqq-2;tB7&K>-k_@(P>7n5&|;@MBpB1QC?{#!v?RPRwu-~rniNyil@{7x(l6@{4yNT zqB<}|Vo82UGGhxQ7oQv6IVM#yQ5~)C%c015x7MuN@}sMzD5%=afmY|Zs4`r9{~cA; z)!4|ZlVFlP5={@`cd6>ir=8vz39gE15cW3&qsljrYA%#+3p?+3IkhhjM1KP{d)4P( zh*jX-jl?T~9LtnE9z<4*htmWkbZJt%!^Sy;yd*VB9y|hTPimgpb9oZImiVnng zwX9+?_gI`E!fT34$)^{y2V+4YX?nzB6i^+NUP5i&I=MFn`O|v&rr?nrM)v;5g6(b4Q*KJMi8(%U*2c&CXFi=O@MQdXsR*4WtqA`A3|;DjQ{8Ftx^jgw1ix zxKsn^){qa%Ua&O@(S3sUuzw;H!A0v*9v+7Fp2PE+d@|Mh``5t!_aA_s+@rrY+$N$p z>s?uTrGNtyr! z1s6$j&?jF6P|kp%(l8y{CzqA1`I9VWg;Dh^G^f1ffq5_AV`NzPI(z3Ksn=+Vo!>)s z|CEouR>p@hT{=`|h_6WoSYZW-Q>$&QJ2U)*MF@S(*`NU2`E;@1mS5{biOD&Q3rB%T zhp9ol#?o|XB|oP4$l3{qV;`8myvw^f9;#`0<64G3zAIfd3oqnyW~mXF@jL_hG@3qt zC!)kRGjI&T5P~5xnBeJ{ft!m1eZynD31HE!f= zPR9#Z1KMu5+)>dJf%h6KlQ4ZlHSc$YU3|PPT)NlE6%FtqKk;X5g^~@MfW&&Q_RYTH z(XIi1bZ_zNXc+UT%+uk%OF=a%+Q|wN%3q~kpfbZEUl81Gpk5%nxtb-A@dyFB+e~ki zuk9;`A9X0Vg!XdtCsq5MnvtH9O-*-xSQ)5{Yg7Nb*>mH5=!FbmG)>3@`h>H+AOAu^ ztT#0gKZ9fC1HW;5Du)WD@d1V`$Xr>mpKBac2FVr}5g~uC@#4Z`FrZjV6;qftb2I%o zNT%+u^sT&}U!mFoj?zrSwjnYpJ?ITgv$4K?iK}mAOZ|#*UZCCvivWSimHx0KV8N~q z!quTu@bT|exS)Wbe%p_}hr`#`coATfPG(0HOLJT|b`}!zb#Ewu8=j-suh=45M39e0 zyTaVTE(V89DJ^aq1wZloFz5+^eyS-pWzfAlwi zo4Gz&tg&3n(P%3;@GbOd4MbZkK2h_h!5aH!S^YYPRGQ3VE-*$OFJr&i{zsafDI7$N z9`UTH-@!`kh<~ckBC_KRHRFci(`@7LGcj^?-*GW*7;4f*rk1T(OUV*!Vk12Hk&cjv zF#TX^BJB1!*WRfpG^gLNrWl2qm7W5u7g@G?r>qUpPgv(KO!|I_AO;o~h!jKM&ei70 zXwj#o$7|lf>cLP%-q-bUkCUp#-koe{Ey=Gl;`MV`0lrG_8XL-V zYXQtEj>aH^;#j?3qc{5$lYRCjm$wWvys)*b+>Np&UM~YN*47}ga-@EaRmJ>zeQ4fy~pp3MrX5}J{@^O^RzSs9A31ofK z0fPhx(-TMfls&H%=aL)tUL?gLDCfa*!|!Dn+}G#?a(^X76?e?cL^;wVu?!r0lJrP^ zb$TSn+p9aq;~%n{6Mj^Lg>_5@sS|<#7pivB_RJ*V+!fZTD6N*u4s*_DV!u|BOeD2> z(*E_*gyTV==fw~4{1$KToOI5%aTVg1xyPLQ)y83<)6K9Kb_30fuicPap5Zg^@}H@- z)wS8-`5$s!uKSm10%>_MZhnY@`7@V6YZkqUEO1{1{4HRqSZ&J%0)B66nSA(XGE0*V zHlAK)3dQoznyY;`PMYmLPtDQH-h*899SsDKvwC-e;{s8%vY{Q3dV+k9XaG||(OE(d zvpEjb&Pu3ieJIB1OSR6%r2R+;Zo*P1?kAFFZyQy~r<+3`t-b#!^?oLyPqZ*}Y+9w0 z5yeKmC1F%<=Pe+|dLw(}Dyw5)#j=nhdSuVSYuHUm z`AaHo;z05fJNXP3s{h$9rD54zQ8vulkdlxa8H;I>!fIPlQPI~m*Wn82mz(MSnHZw8 zmZZN)a-$8u+`e%3j2KXWsq25)MOWsL`tH|N%9iIs)i8}tXcQ_2MtY;BmJ0)m>~4aD zQs2M=+)LaEvOEqIOarf)->624x*Jp0ppU2@XCaQze&h#IIy&V{@$!pneHVlPG+?H> zSk51$O*w*SQPw5XjbkSo^CmzPrbGU}he#yDlEmFKg8q*8KaGTVoKL@J-1d+Xjl#+o zmQVIM$jHKvO^sWRd#@sh!IWi}JfN4tOtLRjObslTVEvWXpWl~tLidd3wU+j$AH8%r z5Y=+f!+b5oxuoamqH{yI9H#4qgdx*0x^N;_PJ;J_qEZ!CRH(6k zaVmSWJ|spF*_S1va5VN^jhsbn7ZXr^CF*r7-%na;A~n0g_?Ys$=M4-;eO&ELj+}N3 zMtNW>G*?q_`jaq%$&2o}A$Jk&52%0#K*chaik$scr&&eHd+W*KewJdAyJLa-KTmO> z3Z2ZlqU)61-lvu?YrRijfvq`AS7pu{Ihuz=kLH*s zf1GBjrzT;D;B_3J`Qk?2TKTh-Sm!rp1I!USfZG-@rvh3rJ7ytaj|asn8>hD|KWl(DB9`0n?2K;~J9 z)Vf9o|!+)H|=t1@Tmub*()>SBn4Vm=Km=d{G-9+WG{x0c}&HA z)#H59v99m$Ta}lm8RjE6YT?$RNp!j?bn9hUpaksfZ+Sk)TeKJ9h9Znt{J)~Kex4~r ziz}rtRW8|!=sQf;Y(qL@c*XBoVMUr}b?VjHhQ;9^BoZ)wfE~VIQ7``YKiL= z|366>i~k`5D~j z!+U!%Nst-I-#=2he?cWRuFpo_!-UQK4vBaV{{{M&b!MhO_-6djR?z)AeQM{B*>oLH zC?fLlY!UONq2Tw+q&};y#NRGqvFE41caPMXk~hWMmx?C}Nz}n-j;4Rseq5X-RsQ{( z-+Kj}`P<;}_vNN8R|s}wuF`9s=O8OjIBvridoNwHTqPgmcHz30^!P(^i}3FYw0oU| ztNZUxX+q%RM-R`Z{u0d0Tqrw5`b4H=*TY;~$EN{>1&*6{d_KZ0;(n8v(+9pC0D%z` zJbpSymfPpsSO2~wweJ-9wwZ_R;j{`C#*Z9nyU->;Sudt;Fl11&!2J^(2i zGihZVUstOq<<;ptoFsJMJ6ua0EEfcVRiSrZgt=s>#vT;;&dDjf4&RAa#~rjm6i%po z+BXC3w$Y!b8jL+;sG8KpQZ58*f&9aaTZ2)y|bUYQcGzY9TM?& z^kUkyt2^N7WqEn2rsig)&S-0s?&nsA`_---eD)2=_K)uYj;H*i%ggDCtz1sVL(ntB z3!_e7dkS3j{o8XdjrNY9{r(FR2C%0|ZX}8Yk&Ej-uh^mzcU+hTfTC+sM?4>g-9$K1 zi#o)gX-Pr<@5D)&nh)K)Kue{ryT~G`-C8YcqSQjm(0cYpWt&!%&{jpJ)HW5RCiOe7 zk;)B|aj&bo`w9#vKfd!XXmlc`%FsDG2efpFi_%)()yXdUJG{kj2_3l~?&go@Wc*ti zHY2-9z#6N_0E+(qU57h z@gL7UG~+FpNO{gY%F`DF;9iS%Wd6SLzRy25w}|5sVyE&xF|S;lSoKHkpd0^s^5TTQDPUoedI*gxRyXb~5XlV=BrgMiOB^HL z1x3_i?ve(fR?tNw_6lpDhSf)czN!o+_eyOYmC>LX7m*Q2U1Ho7gu_T@`5*JcYVlFZ zr`D`16%o4Inm~hXsi?3$b?&9z<`fi)`y4Qk0ZBgd^((I-qaOR{wubO!a&K(O#~W>S zfdAZz&b$2V_I+)HH3gMN8dixg?()PvF}&^ba@0y|9RaNEhA@qJT>FLu@O|vRUnYh} z^=k^s(W-SJbp4J88qBTXgqx1*xE|L+HhEz zn-eDSJ`x(YPl^%C6N2{d!f3#?#ZXx01%CXx4QYrG<5r$LlP$4gx> z62EDxMdn41#(4Ho?A)Sl;ep9>5yW{k{dvFkh}4>(Q6Fb@0B4b18Nf(xUs2`J@Ox=@ zdFY~PaOfdu0g5w;m2qF}y@b!e<_Q&IHT>0x?J3d9TNu&0*1bD-?;~7(uL0ZJf=vR5Xp@N}bbtc69ssM+-xtx{ZwrSh8P6u%FM~16}r1tWwfchHnQ(_$LqNWqR^xVdB1hc=b(M>R;PAa zyrLI8siayOW@0Lc$jt)beT|8Mw)W-V`RkvG_vJF}a+!=LEe3df#oS_nyuAGspEF}B zes!qY^EjAu*t85wMn?VDQFmjwoO>fJl#C&Y0VjtUfwo+ZC?Z-WDhvd}G~=rmEjO9o z=+s|u(C}4=B#_51jKoy!FHT9mbE7%*ikkK?l}s55ac^|d@F4ZJGaSpZWg@%cfmR^t zX*_?)L&67l{xCJI8~zM0nRMB+=93Z6(J^OO(rn#e2-8J;&iXyNRiWUL*1>1!(m7XU z*LZZ#MCg3!o*I+bZzm$6flKbSLIq%~l`=lqX9V*vWckanNb+NhSHCw}|2E3`i3{^I zTGt@87zh3;)1UNh@CzpHHbFd_o2s+3s#Cl(L!)76nA%bcef%fCAd?x5CTOC#hp;x-95OwmN(DuKkt{!H1dbs1oDoYUc7FOC~1ZaCi#>a zrx33WwFZeFa$Y`lYE^uUMbR2n0%25nfS>N_)20!;j68UFe(gJMUN-tqHeS80L_>sd zoIxnzN5*8Ot_4Dl{M$s1(gV*TV@1E2(g2OKs(-c31)-NoOCN1ip6_Ehauc*X#>oxb zAT#z}JIO!pPh7t6qgwaYv2QS7tzmxk$jxDVH;TBba?a}aFq$3_YLDN`L-9~dSh>Nj zi&0aMo76W}ok~O5qMeGAh>U%K5a5TdYJ>f1H>EIX}3LFwx# zkQyIt+~x`HfPWSh#%{k#i<7_Mw;3;O2@~4%1i7b|k6-~qE}3&UT#T_?+ST%?bjHBt z)IsBA0-3}2Wyu?*Joc--A|<2g*D^uPxUv-2MMIZ}R!L*n4sOlPe(T2^+^#Y^pSQ_@ zw#cr6_mzus9QwY-+0GmJ7RP{R#39S^kjK6(_a6gBFO4vKt`N8W`GOSO3ej3~+ooZO%CMmi+e1D#kr`+J;octgEIu7)~GrO|W@Gskg) zcWxVQUe&rkTe`8U$;n;VaDGVUe#hEfQusNw)ohr4fU4>Ol*E7h@ueC0VA9WmAe~Bg zQpKq1yqTM7ab&=i-%*&e0}_6ru*jA62+1BKM1j4EJckC{lotbga~TFwnK#1^1s z?B4}LP(KidK|Uc4teg%%cnR*XVSAvR!Se20W$1#(>e=CLT)}jF}-i zF9M6%M~MZOtfCt6A?fd#4`h-C^#&CPp-%nxg~EXhU($iHeN;rr%HUKZSC)NE`ru49 z;-z%~N<}F<(n=<&$ftXQ?JR`Kri)ivkr7)5O1}P63XynfXfEW1+EGWvh2i8MvWl)) zs#z0j>8>Rj_w&MCO4RV<=&r*mLoeOCcIw1J&IbZ#7Z>c}EIJj-r?Q3zD);rbyj$=( z_rE_Yx71nCx+Z{H5NAsYLr>%_hs#=PWLMe{>8Hemu&tqn%C%SlGL_d_-52b)6t{45#x z9V#Aj7cGUFh$!aevNRH3tCg(Kq3}Wm z9^~00K+8{R)9k0vAZgRoJk|O7hwxfup>Nsn}-{_ZCon+h&(C z**Tl|u}`LBHmjY5XG_uHp{#rB0A8{#ixQ2Enq|!5Q_O|%J4YfnJAw=S#q{2b9~k@o z9HsE8bm*J@h`0+wQaQ)gbn2oj&K}ifwrNd9Z1AAaXev_$Nt7}Ka~*jV6Om*>&>r!e zjZqO1MuWmhTGj?gX~K??V6?gIK4#yT&1rW%zKMKUhP&En=+XI;{;ZNQ%P-&MXu}sJ z7h$6){@{$W>gW_}%<`wAzQK}%c$Osg1Vhh+jpzK-MDWFYYExed$VQoF1kki&YXO!{ zHrg4K=Cn^-X@xa253N>D>T1K)_s}TOYXq=QZ6+4Qum6_FSPAt|NL{I`wXLO3 z8x{NqPqeR;otx2Xj2R_4AluUv#TQT{tpoV?q%Hz0hlmA4G=&s>P{=}am1ZwGD((&^ zj|inZi2cMtj4b_!FXmyhB>h0)062}9otyeLL{2fA5Gk9KJ)2TY_5}-s`WA4n=G3Do znrQ~?8{19hbGPklzM^Q%t}^NfK8N{yIL0>Ec{nLrVGqY$z0|2x%iftC!GTz%!)Etc z=i1ALHYQ8Fb@`N>VhbseMrWM1M`o{a43xG|5cCDLkq$vbq#YvGcb2?hGaw=py|Ro|x3+)C>t-pF35Q)-YrqWEZehbqI^tf-4feT{S#0R>kvYm+sh$@wo;K6_Od{6G)7^U(y@%4PN zsjn5v{8U>OXXBR2ZWcJea_5#Q<3CS09fT5Vu_V-OA;&vPKZpHt^1O^SQCHiUTY#Lg z^ewWN zhgtAGlUDbW zSe2;SADP7QB>gFo9k$6YufUos*YvoP&{qRdqDrR8_A{G8k#EbK%jv(pTh{QQ(1!rRf`$qfLX&*uby3#@ig2g7iq?_D^7&MZ-@5)6e2#gq9& zf0)Mxtt_G1>I@Q*u;2*Wh%=2r*U^3#(N7RA5Lk+hSP(4r3q=q-!bbdbeqMs>uGOQy zL7hiP4ewSDYu&y6k|zoJb}O5*0jfX4EqIW!3I4XdfZ=X35NUJP47iUw;YIIr!vstA zxy5MF;LvI#Gh6K* z=fiTV>%#?1e(SgJ0r5-49|SMYQjh210brdn+>Klda>n1|I1F}cWDbK8soXZ(45lEP zBO3UMR8W-!bYdZt_)$-eFFdr^{G%0=pO)D%70Ib84K#;&SU-Ay%X=k`JB*F5jY~3n} z!rr+Bc!O@kY};o3Q?{g20&haqht}%{9jwvh)Y(OJ zr+EFa`S3>@s+pD^uR6n9wwqqIsb&J5`QZFg)3O_vDF+z^dl)j9u}h_(D&^4hG2;&V z%Lts|b_|RJuMzMwr&6CV{)b9vInk?PThV;~Ba9XyyQa+VVR>(u%+FLIhurzaHhD-+ z>tdFSO3eh+-hC1PXB%rv~+-Vuhx4m*2 zJooJQ*dTuV&*n}~M>PHF{N7r`^cV9ypH`Kml>>%ddD)7Yx~K%IBgp4+R`78PqQSu$H*(6i>-SuPiIvTU03;r%ffWk{euG)n5rv8JdFr zby;sw^GrcSkyJvein@&7=Mz(R_PAcKX_zS=YI4ufuhWNyZsp|as1%It{8TSD&Yjzt zd$zyctO*GgF=3Il*PMBSW8l6Tc&#HWx@pH}RS3M|{)!vTgkg^>&0FgU#M0l3Ux@4V z0v3AIM|}NT`#|>b@;kLPy|bdRm$i_f3I`q2Uu*S~WkuI9OyPa!C=8>==XS)jb*A*& zJ0_o88LwuxwqF~h6uy6s^2zkrTeS~!tnD}8y^HUozgHa}B{+({^RFsYid;~r!iq|3Jln%&9r_um^C0{EM^;ZK^Jkll#-pPJV%`_`>AR9QLK35>0mA7 zY3%WCpu^PZ@*~?%mek;DPXJg$;YoH@ zQU#?8yNCvSYQHJk(F|#FxR4eWbCM~4m6Pr`nTS9R`pYnmJl{RdJ- z$nY|iz=iIui~cHK>fz0w%mKm`>&e4?5`n?X(PaWtGcVRb>(rlb1)8m%Nw8 z=c8J`I`^-EM0dD?%3Jj)0X&eIz9AW{xsL}9sY8cWMd}jfmqh-^ZVF_$HWEtQxT+gJ zRSX%}-(F8T3NxK!+g|X(l0Nz2BrT0GVXOm@T91Cc&RjS8dZmkY{fRFn>Wjrsbc(zD`@j-pWq6Tco66tm zKlf~iIQX(9B@_=!oe;3I|pe!}6Re>s?Q(eygyIEwWtJW+7KQGe^ngE(= z*Y9NDitfhZ>p=-!mUYN%?zRfOd#M#gv@W$hbgs^qgcM$|t->tuTeDL|z)WW-Zh1C8 zg#rtX#Fokv7gNsNn)^ys&uQ$aW?7kz@l7R*`$rwCZP_Mk=o6}`MYoE8J9@ocNlC*j zhI>}=1%3$yB|MnLU1wKp2W)`0# z%goZ0q)`NA=*>?1(NnWj{@2gQ32lkDTIE| zWt$gwblGIu6?f$!$uFzC233phv$0l&ygx1|1{{Gb;GyMxbhtxg`-@;uV$nOlDpD8i z=+*-h{4O_4m!%a;)Z3ro7VN%F7E}DruRYNf9Wg7H%pC~&)X?MBs<>&Ivhhb65cjdf zRZA_usjSdYmj$U1(@8w|n;wh(Ivqw=UQD$n4Zbwh;;?#RjxLKMwtXAAh4!tvm$&XtODvG(XYPDDQF;Po}BZdM-FM-?oYR=*0K^UYQid2q?o-D@UE}IH1L%nP}{c1!ntgMaqvh z1GTu1iDEN@6x)v`?b|~vRzu+yw>31sy!xpy%3^=V*c3YNmOrK2$g;=#b`TjTEzX>h zyd@6#{bx;bD^C@$obmlf%QVjS=inao#5Gq7?hB1!bz=B<2qMY6$NR0xHpWk$qVB#? zmOnNBrth3PHajM<*jykVFRT1piXjj}W0Qs*#>5K*l#9b?X};lNJi2@-_GiG)8~R#Y zSih?SyN|BUHfbLVkg|EW&kG4zY&6voP|uno;j5E2J!-#q>p<)9c6XjHCynW1KC_c7^1?rxlFIX$9o-1WUx<)Dmx z>z(sgBos$lAVu(2QGnmN_& z16GnELb{JO?b~G;0+njC4|=at-u*$QjMioOfLv`U(TA)pF*T8W!VcUkzJxE)gh?X0i$8Y+M;HZM%2d<~R~c)T z$7}61b-jyvaN8-H>}oEVJe{*`+4&PPQJRx$I5Jj65%2m%>v-&u#N^q`ONQqey#;e;Ami@p?WLd>%h*&`)S9Nrzq4S#PZIl! z%!BLY-rfE{ zvbkD;Pb3Y2o>Yo^04qW{Es(6AZPqXklETcJ+^$0^xUi_~Gv47cNr*j{LgYTz+uzu> zw3eXvhz--kVvb;2Ed9}khPx|Wcff_h@N z9rr!r&~o~@yt{c&-r>G&bZ^!z(kHGo)3i%!w4?in6J8y_M9CZ-K#5~KzqR7^lRLcY zjZN#&B`_r`Wxxd~pGoCCw>2+__5Hw}(Vn_ZNAkWghYM&Ob;Y^iL_rkQ<3ji`IHkhC{!!(LDE}Lc=>|`cq2y zuzD91pW2>Qr`YC#83&68D}NA|8<^1Wstu*`Tl|l4H|z^-TXYoZ;&#z5wMCUkYJ;wP z4m*%vUbgnjEHNL&tfDj18ZOdAwH~*lE|U>on3olGT<=;kKr(M!w8%Bb&EGX;(?300 zFXzAggV3~5JQzFO?3<}~TlFI@nYMusb*wZLntD^GYoqCqq29mOc4+ba2rtn;uiHN` z$?gAug3mab?BrT3!)HDXg)?Jh6-A~<-AiZy0!zQ(MckrFuy?r%;`b=d_>74|M>Fsz zZX+ff$JqI+Jx2UEZMNKOy0hirUAhX!)2_b5r`7ygT6ppF$}ms@6lQkh<3*vk?xIL` zMX^Ww*KUslzMw|+s#%Nia!WN{{00`GSsJV zlwu0&or$28BFCB4s|%Txs$%$W&q0vewgTk)4~$@gZ4Iwe|G?VA$M&B6S8gZnJ#od( zGQC8%Pw_)rAVl7nZJ{{q5P2C@35|cwL{_) z?`p-g3VuV73&jPFFjyTIG!FB*=zGQURvnSp1-R*q80AxSd^qVcV@iLYFdJ7`t0X^z zm%wXl6({%pNI$+1%~WT#QCEQKH$F{7jR?YIIp%jnnhkHeooMEc_h+4I-#bvvvaJ!p zSJm1@f$$aU+Wm_VTc3t#ua-0Ii~0?|)qW4ilC#9B=%5I@jtl(-+Z_Lv3*Egv$3n@) zyF)3SWD>UqxyOzq{_MVW+Rc1wo@I(dfxr>)*aIl%ER5MiQ}8I*Q5gdZ>!21L*f~KO8I2!^vOIAf<5z z`-?^7ZgVlnw~-8+2?xAzBJwnFKxnSyvlXfE=kaM$y{{P8d$_%bne2T8CmePl+4)lO zH^gcsjef7NYqI*5?B^4vhf~oOMUY{xV_UdkhzO`%@uxEb z%d#R6tNn`d0@epN-e_6ni=bmk6O6z&{Qq76l912mK2HgSTlmZg{6F4q4~P|QJRNqt zY*Rm+^HgW|ER=?no3$)xXn7}qlwByFc4wZXXIL2HSV5FknmeH~VOyHyI-xe&${CIz zlTnTjX=kbWb!y48Ir>V(lD@-Q1>@+hIXw2BT~zDDR;-m$iKtbP3asNQiCuocVUuUtN-v})KaY0q~-(P2#T@oHWGzRQ&jadksMJm+3RJg89f zlG!S1*0N%nxlNH+;Qffg^Y^tjJU?Xf%rF%ftiAD6lu1zEz~QJ0FtgqhOf#>aGm?^Hrq{NHTBS&``GTDH}Bx3I(Kjr-6Wbs zC2gM{HHb&hf^hp@rgF-^<@P%WRFcnXn0H~_q%qw zY1{mu)WE1+$^VWvoT-o3rHE--N>kum__Q5{ol4fbf(&=PSh-kS;{6*`cik~McJyuRv4u_<_O>tbmhM;1jEKgJbjmo?av`2Kery2XAR^kQGD|yD@jlH?NIuuj?{*vvcHh#V7*z?rvIo5^dDklCnBjm) zei=TKFgbLu1>O=9LayRk5~O(9S2xxA`|LgE)Nf`V_6%s7EUQNCdajg^SBaN zp(RHHl;*;nv(Wm!r(iuqSXL|8V@9b^YQvstPm^?n$7^iUQ^aB z`-4Sz^~J^&QQCZP0coK>_ntTVOPaAZAlYv6R2QHZKY214rf$?Joe0z~HnHcY{D^WF z$NRx8wNZxa)v@fsW{V2o^^_V>83+~62r1oQdNI9rm&%(Wz>;u(M|;M(I$F0}FWR)x zsttN+iDl+c3Y^M)km3(5o-SF+DRJn_Tns61?J5XYF?of`WJk9= z0}`bx39>Y(VxMeL&o$Vh19+Z`mQB;JtvOK@X6X952>Mav@574ZlsO11vB_UvrKm?) zIQS8Py0yX(CHVzcTT31ROun;)ZJMhe|Iy9q#i?`O|D$-Dkc*<$YkQDbe&5&z&GJEH z!9(ch=?;@O`o~Pmh?^?-2&n;3*HRN=lx|iCqQ(+T{dHu~scu5HX5%MUpPWJ2fnDeM z?Z>y$Z{F1YT9vF)t|-ZIc%rDuJU_DI6Hm@uR&lnb@8&&EXa+EI6+hVGGOlp@=rTpm zIF2FWhr<{s^z`e#EB{2?pyDB+~UL+&=Bhv&hfFlkNp#^l!r*`J^u9SNG5 z=^ueV!ja-ajzIHvY<^m1_E_*xF5F=)tK0$$y!>;Oi?WmmOn7LN)brnI9L49qJ?dQf z;%vkh8n&QmlVSH(9&_k_X?%&IxZ-y?uoNvmuDqEdt`Im~Z`tGfk6v7P+C>_7Q)rKy zxH4EO3N|u@c#c!?zx=*OomQ;wrpJZtQA(hlxK@+tWm}<)y5j@%pO{$i^U09)>E%cP ziL>E#yhXIZ+L+PHYrTV8CO0IpQ=6Uj< z6R|!r>t}D{VFw*f@2i``76QjxuuRM20^UdkbDmOfG8r-Zpw*~vjeig?(|cC7_e043 z-Uq{4B0w_qx}V)gEuY$?zpC4hFyv2%`(tC!;mLNzVv3;=E7QtF(UqBI1vDu#<8wHH zk}joPiT)W8E_V89joS@_r6e>`sFM92l5@w=N6S$#%=(aB(t~Jtx~WoH0W1>5mf{?o=Y2y^?>?U zyKm$x-wo9ZFrYWGgcpswIZ9HDyB+bZfGY-QUh(qV?XJiZRue(15= zJu1vFfkBNnUk${YdJmar@U1R)(p`*Ld4EZ9Di;0RZT!c_b+plJ_bTk+C17Vam{><@ zC|0)ad$U&Ru-w+GM>kVLw41F?$paz`#~;%Vpe545yd_y+8mf>8$>sfwdPS3S`OLYg zv~Sn5)H788c*CU~k*@T)o_qmE(0!h8d#l?Km;vwfU`lWg#l%FXM{=U+=(3Edal9-= z%Q(|u)l$V0i;SG+l9NHPmam;zfc+Zg;^J@w{o!Y&GYT!=B+%nDAEHI9u#Y#Uxce&O zS3(J8EwGVgF{Nu{R=b@*yvtog<_L&KE%c6(U8U~4;bv>c&yft6LH@T9w_YVYC_t0MDi zW@&7KSz^G566n%YMQa7T3Zf~N(PqB(WcVBbFR+ju;T_o{REi?f6sTU~D-yzM+2Qm_)8yM)_O>$@QpH@80> zakQ*0(~Q4*1-b@m1f!~GM`s2|3rr(It^_Eb1Rqaii%wEpR0n&Yk55zTeY!WRd)Lvm z`1KiGTmP2df7h?z9y-z36Rd%ftBGQLgC9`lBKmcM)cP>tMp6n0nS;+0gYdp-P_?H= z%ght14m#l|q<#!YnnW=~d~wchZKP%1hpAU`+-qq-Crcm*s>`D7G8*zVaxZyafxWcE()c``WCL}ex{4ge=!No~D zQ(ua%3N|m)tUPS&3(l$CYjzj9#+k#UgXkJR9yBU?7YvOhuB;Kxqb9Qq0nSbJXFkck znEMv75Oimrs*&>7zx+@xAFDe`)D0#BbCQQH1&*l7S!_kCP)IA~3(9-9KEBpXoeH)v z{@ecJ9!~tT=V-z$6oystEED^Y`yUn=K8yK1f6PHXBQzXyxFiIwU9vTM zfA5d|vy8J+B#gk2ZQ%>L5gy(c&bIYz?(%mY+-Z)4WyQTuPd#Qh+k8eg#;Y^#Dnm}T zEMT}bH-}}S{y)F_D3{)wRQlgPNvPmP9K+I7+kUYoYhdujoW(hH_{x*-AzGAOMUm#c z(wIX@+lGHLz(AQQtN!qDV%)i9mRiNR%Kl?NE+k<@Kkw1aRTSWOs#z8{g#PK?Soo%@ zaymq$O}ivw9(GU9ca}3<`N2iStlO57GMY=t6N~L3myOj3giy2`fwUs z3x{?c(>g9UpR$M8pJTtu^OZh`{cD4K8e$tF}SC}L~K6Jc0``q{P z`-k_ZQx}n04858-ID7@>Ga%*XM=!RjROnK27QWJY7rqqVw$9_Xffjp8&6^#)dAleQ zT&33F%2Vjmp>g7aBPN$fmtCbPImX>j+-Y@@o-me$(^yl<7EtR(z^2`qA zxSsCYrdDCHtYx9i_7nzRy5-|w3}q>NzYx*m`(RphCtZ=t^4W3LnWIX1jN&7RRZOfn zv3Czdjvlfo7YuW&5zMiSm))X+bD9qp0Q3O2DPnak0r75JcfNv!DnB3#JgVO|Fy!OI zyx|jj`_}KNru^2zejnRP)!r5jWB~0hJb4Iw$UB}d<~VFXQ#3If8<4J>^^3Yg7Z3iD z=xoR5lnTQ=`%DH<<8C9#)Ggbe>KOo5G}c*0Y(Pj=pi+8CI^E4B@|| z5Rb+O-{4=|-K(s&J#u^hvfTQK0dpxcXFvg2PaOe*_=QMIj!Q#iw3Zttw-3i`OHGR6 zAzMQlIguL3w@^t_)clP&QHFc%4^@w^HML-`$VfvGS6n1u7$OuN6%{7>9Rtq0Df@5= zemI(i)^>Q?Bjg+&_{OPiy zDT~qGT8T^&HF{p2=3Gxfp~TYL`OEYn9<7bmX_bE~OX3{<{<)0hq>$`>mZ*n(OZwOJ zvVO+8SMPI;uZXsz*!-v8(0{d>s6BtvhH_Z;H$uBrXwrj~J??&a|w8riU-vZPTd~0RinYG3{ecD~WUu8fw3`e&ejfYg2 zsRTKeatJEdjFP*!_PmvaiHiZ08!}C9wTy}evsmFGT8hL~hMFpF)MT}04V#*2mEe8AM+1c-Ci)&>R*2Op^%6_yzcgGr8h(6@n2lu=jjK1^HEV!xx9T$*;9>Vk6&4wU z)vb2%iPdd99U=0((Tg3E)o06c#lM_M!@PJ60$SAO(Zko#XNP~}k{m1Svz^Sd()Rs2 z9+w7~!ShMB84h(R-OpLQbu4bmTtM_a#dj2)X}0c>4~xtVNZOCWN|dZQTL?9BvC2F7 zhyKiWsw?5I$g^xMMs`<+WW z3DfW_0V0@4o;2*W>i>AGm5Ll-cUfektkA|iIsp9F^>vKAlz|VD^sxFp#?U)$_yZwZ)>utJ07Q&K)Td51?9mJTRqXpu2b_^ORvFuSM?ZchxMAw z_(oY8k3RD@zkoIiAgBc2@YBU_wTfJ+10xgmQkJm+bSs6AOrEy#BvCy%(`9qdI5{O? zX0C1St=n1x|6!Qvq@NfPQXsyY7PlTH!xbLsh-P}0JIGpKooyn_nRHrKUs6H@iRt6` z?*4KeYOqF!EUYV7Oc_`ie|mF`hA}K|fzLP)`tzxf7+f51%#E+yXJHM+uJD7N)FH0t zGH7Hmg=YLGM*YwsZtm9ly1D@|d48b_1SRjVb{g?7@?evU&X8%cYz*mpYUy3hg1Un*a zQEy1Hr+cK`5%NP`O?S93V^cH6ly8OWKX5tJ3_A~UOydnfY-neJria#V;n4j*Q?Th{ z0cEP62RedUFZLaem#62S9}5?&M#j#2C?4GG=c7DEoU8m2tlnF!YATH{HDB@5_ny1^0bYHCp$@yp!GTnNslEA zUtNjtb-B19aerp{yZ*Kl2yO|pb9`9k6_v(Z8(ghY3Ogd08e zK0kTvU7v)25Wt%}Hq!J2=RfHWfu=V(jt;R%IuBet3MNiO4!9=a0e->@GzH~|MMhmJ zj;{Bpfup2+Oxv_UA?bY_rXTCb$ft6PMcJ~=rXy%;KRbrsTAEESm#JX!T;;qb7Y?Ym zc-p1NFHjz%=6FDIEVGYBq%5>ru&;(Xuc9n8OqGZQGc>iF*25hH@}{QM=8f8)5Abh~ zxRWJpURf}_9d~K)U&KPHWRC9otO3}Pc!sfIl)AoE6i_wbj_M?0W_sW@*Gi#6(D!jq zCSlaigOfjT-{kJJhrcIFV$&9TSx_JcpC!!;4!6Glt@&N2q+5Yp(PDEgU`GxVQLUMx z^NE)M1Rw`*tI!$`*fP~9y- z(=DcWv*VUG1w_i7QxbdS$m9wjN7*<`LQ-HjG1^T_a3YLhD9U{* z(`dI_>wMhG+gUm)>xSRxPSY%TGU5#!K?iI@lxzDvV_vl^QM#&SAG zD08%1qI&`x2D!R?N`$`W{y6i`{I@9biEHBWJtyB0ekf44!)B1H5*ob*C5jMM154~S z95341n5#TApuStZBKwe*43JBp=cjVI!0jJtnA&fqqs3tV7X#LB(9NS;x%-^hW~oPMfvS@l#O_Mti#z2sl7)m+vD`f@E?#QIgSrSx0fm~_N((uUy2O)R$| z%ou%K0Zl7!XjtM9;wW1xg2~<@v{LW5K5D@bR9VR$Vkb^77ZBb<;Td` zbjAslcbz!P&T+Iw)AbEI2rM{J8jc`vY@>k_9+)o1E@qXp3|3G zQ(;Hr4w*A_XbJ!g78$NQN`#j3jw1wGAFEL2oWeu9vco+leD$CYF0w1)+ZEN2_;VB1 zoYN(j)u7ASXW%5MQdQ=o2qrK0$h8@sQHXICwdO{%bA9w`^UScK?%Crp2>)&6o%V#Mw086}tI8qo#yO_upTha{RW!PaNnlw}2Xyxe^@^@U&M*dU>7%ArRFi2T76x<6{Y zq!3_E%30;2)}2yRCCC4kf?AYGD*myI16vO;{>@OdC2!;=L!eGSRZvBRM>$1uI}H7O zylliR4|<^|BB4Ru?Ftm;E}_GdP>IycGkXC+R#HWu9HW}+ z{KFbO$Cm=4ZH#B`Pa|AMfAO;n26VpSxUtELviHN{2a2pWtidiRE*?Q5D>7YN{hu(# zq}P&$o>}g>Zj18;qS``B5cYl!vODUKfh&W|kM5`cV-_4oHewI^cm&;pX*PKNGqzqG9VoVEF z;$gd&-xD^~8yAKCgXitLyr{1k+-4dPJq19@Xi17vk`j;M{o_68?rj8RQ6`}@kDcG; z8SkP75^+J=I`xm}bHz)IA6+YyB?<+0=DuJC;=1r=|DoQ*RU|m-E54pWVup&$j9q9WyPQET(`VJ z^^et$|Mc6tRez`Ss!Jy}jwH%@XKi1J;KaHPJiS#T#-(+-i@K#{zSuFNORuFhe+R$v zO^m@(fDI`pv|oz!G~y38d(*miPH4Q65p}xz z&O|o&C(M^_y-YNrq5Cc5(D{uCBWjEBdozT~RrXD<1H7GMp{=cF*OfIR{@m!IbL`lH zyIOfpi7sA;zyA0UtI9biPQN_1mEu#EYE8hi;dWY5gYGI0yTMy)!2w^=FNyC_h04@7 z(U!(l*H&fWiD}unr?IW6mQ}=~w|eWXkM3I_ z1q*hC;+l0zO02B?VvrUNh0PR$n>(7;d^}6PN4;B5IMlVTkmnKcvHATlgF_B3l7O=D zTK!9Vwi75)aOe@}yw{T6h&w`6^OwG7@cK47(~& z$WGB(eDtY+zj&?vR^wKt|GyXDB-2cXA+%V=c0Ww}fKWa{z1@Kmj?~0~BCmHmp2mhD zbWJaUUhjo4jrvlslcZtaLD{CoQaT%cHGM&Vt$j&A%OM%geUn>@tISzj$wIr}T`HUl`9F&=t)cK}`f`Hip-p z@9{KQ8A*1v>OkSmB`>~y01p`zt*;(Rrgs;AxFCQ|!Y^gE2Tbv>OcP_ZNK_{2I>CQ< z8Q)ptPfXw8k#MT`Sdde2g%zUhqrlnio4%yLBo_vxnWDL^1p3{GGyv03DQQhTrqV|W zvOtLz8T=foqW0Eg)l5CTvHRwTk@rc8&L?9hZmeXxfj^XtCtcZAHk16)1{kNk*A@J6 zdH)Sy)zu9Ipfx#NV12CC?AAh7pie=i0HCO$$QF;_{YT#F<=BY5UmW-5vEbZ1nr#%d znxL&|hBWM!5Yu9e+%X9b%#KDQ`xvpN`y5Tut@~p294V}${TC#=}QVEY^Xlcz|;_4R9n>cbSKj# zKs(9b9^rIY0KsDCX=GHyX=L9fcM8zDvUW>+E6-JHe4tOn7x6ro4w`Mm2pBakq+5#^ zZVBp9K{)V`IsVf%71@X%@CxvR(?sr60nhx1wy6NU{~>rn`oe~tn0}vvBch)9ALom2aUC(;Rf-;}bACgESuQJf?<2B} zB|xyjf?IHAa7}P`x8OEdaCaxc-Q9x(clY4#65QRse($YY_5Gt7=&9Kpdd@y;J!@kq z*#0969{=eusfiH?l+Cw+{2ev5x?%^ZXUY+gYa41XuNYN;Mn@n7GeJ8W80 zBSaY77+s1x@W2tuY8S8)V3HVV&)kC{7&R)#z(w+1UxW{M;>hBPKCJlBGfHH5X7D|9 zg9V9jJwLTj(ZtiE2;Yihg?v5_Z0gWEfUJqXkyb;f5t~Xm;;-=|CJ}$6`-9NL?@Ks- z=O@BJq@EGcLZ1FJ5oaj{U+Kub^cg^&1^)Y#X*N!`4&HOOgs9E0bLAA2C0WmO$o+a; zrj?ue7fYm&aF?EcLTPzo)dJ%0svlzl zDRvE)`6yN}?*B38h)MFopWw_=-&=4*izuBSj9Xtj!2fj0t%gzaYv|DY(~P4|>MAK6 z(mz4!VZ;1dz%wyuKgqR_p_b8xSkS-C?v^yw(`JAXOA?Ths=*&MF=#glb^0}W3j2bX zhNiy)owQFb_*@yTfiPTVl!%%x#APD1X2J~x;6p_{Ky=%H@K+Uu=)i#b_yR6z0DCaG zlk?oUW7B9a;F|VE)uh*Ku`gn^O~3*LMQ=mD;6hbLmB<@}f<=K|F=0FT=isWDgKu77 zmJ}dY3bR#@o1M=A3i+nFH+>Z9rOG|s_mak6k7gB6?+bX(=litQqB+@2D?~}0M?W)7 zQ&1`4j|EHHq8h7)tIj_xjov4VEczJUianzf{2jA=K6%3lySuZTAcuAOEKROG9AVX# z%1e!kB_<~r|7jgTr7hhKpSIpHl3vKf)4Q+f>7KVYJ78lckOn5JGzvz|#?WEon}4+E z6}dn@2sOaYycTgHejGJS2>}&#&S+Gg4otU-H)YHtB8W!4OO#o!e0c0EGg=7`?+ne; zA{d|0Khzf;=zWKjC;pTdk=4z!3{mBN_4PXYz^Ilm8oKf{a z&_pTYw1t6BBH%uF3!+8hS*0G%am)u%5B&As9oLhq0d%B5siLVZZzwYk4*CU8;XtRi z6T!4`Kk+HO3I^A*;V(3?9yGF@^i*dS14Pn}l;wY>$n0f?A@MkWXd)9Jki)E#|KlHv(xjMKZFAW2^zpKnZ|KUth7>98(I1$LGL20jy9hkdl;$E67twoXe%s}t zR{leW?|D|gC}BtmWJ)CV7;y#n;#=Y$JCSUl5sUviH5;}I4W*CC4+2Ad#LL!t88Xt`_))?Dh8}ZTTr-lvbtn%z6z9 z?GO6HC#U4xja(6PV;1saw#vB5o+n`Vi1irPTnh5?7G~9vNTo-W}) zR;q+E$`gkH>Au3ej^oa11@PC?=lnv%=M5K5a0>HoAJx(eUYODs_F>qxcSjj%iUh~-y2cF@(!SJPMM!~#JYN+K7jk8wGgsHiAxMO|d_))J zw|`fseU;7n1Ma|t-R`cBeZaCjmoVhBLA}L(2q~QS9!ttq1b~rushNqS;gcXlDDl?xe1G@~>;_+OAZP6><#CknTT>Go$ zw3)nm42jg0CTZ-PU{Q4bsNPrKRSYvBN$ktg0~ZtGQ`2ve0q%Txpwqe_ zw6*mp7IW0%5>|LjI4N>sPLEW^(EG}>Q)oS658@I0_ZhmKoV+A`vpCHnu?EB;_utt( z%YsgNzq=)M@^pc6vvA?J7(DXIWi*~puWE8R{BmWAIBlg@-0VNtd>eLR?nI+RA zvHsdlH(Xmy1I8{n3(abjOno%n*r!_8YreT|Bh}BZPx-WSxKDLS=2ii1Pa2q5vw@#* zc84lJS^PVZFZs}o7Pz^N`K-DUbGE@RjKgg+^4+%z)a`!To~P>TlfFjbm%3}W6FKnJ z?gCXhiaW&7a#fjE_bA96Ws@_CeDq0~+k`iuiFF03(JgC^WkY}Js3`my=_mdjDZ1JP zMXAx6&wpW6swWpu#N{y~rbsF**HdJBaakr%Wy-`Dn3A28&msrXr3>f_R}F${84riI z$oLUSe7PfC2kx!;v{7(?F-cb|#FXTEPMAeB(=?;?J}X>`Z?wN{j2=tYOf2Za{yU~Z zexCg6&^Ge>f~(bLi@MV8N+^7CzJ;-RH}1k#+~e>uZ5!jm*>6wnQ@kBN-UQuGU;*2- zcfynbTm~Zp2~4ELae|-kvPRrAf);PlQdm9|wxZ{SpKd40ORtXFhYaqbvy6m^F8*aZ zp$s*Fx6Y%q`AO3@kGk*S_WU>k&6|@7(~?53{Z6=NXo_yXzrg0P`8Y|OI@eq>{7`3u z9uWWejOm{@(!j$OOP29U_rdITALsG=vgW;pLcU!mH|~&c#>X(_oRx0R?>@25I7W)^ zt{-x@^F16^edKYOrt9Jh`|HXvCrVDz?{6ydZuU6X5|fJ5$tkf1Kn-E66o1$YE&%e* zv@^s!JjtX{i|C3hV|A=_)I+54YUM+@rOUS&9yT;8wsiLcTj=OP%i@da^E4g@NIZ+e zB!?n9p160wk@Cila$h2CWpZC)wVPWB1e*9MMB*7yAeGj?RC`UJ0p)|A4$-n?wHc~W zhE_w8!pA$ex(PJYx7EJc4srk5{WSjbS;bK`c;3o>qGmSOxM=NSL9(%Q&^fS-?Q-qg z_)nl~CLOgcexMV_sE?n#o*NLYSebMH|Bf*;C=p;|7#;)4`Lxjau&3@_J}0v{<8aK? zTdmdbxFgAxNK7qPxFYUl9c)=s^~%nX&^&mqQPCPDTN=Xr>N(ZfTv&CO>iza3EJvl9 zskXJXa&rpQZej^BPpPyU=K znz))?GRALckl~v0Jk8zfva@Br<#FpPx_Asm{|cUk7fN^rTghqsqU(vjj4`bGi{g{|m$pk)`cTd&K<%fhTo!lKdYWsCcB8VVfNAm{OBABds^M3uCWveiFm+7nFChvu*`5gN#1kesIHL5sCVaQWEMGd*qza^Miz|=hs$sT?sF$9|Q2gW}*1^XCr zZ&_A{_t=2nr#LYx?gliI8YOhXI<&W;{q8hdQobI&sKOrQ`RK>KKCm zR93pXpnEztkcA9aJJWzC@-GU(ufd`YCXlTAm=p20+x0c5_f63oyW?mSUJnQeq1{)| zF2&3P2A3LBEK>VvNu)&ora)usF8;O)u~9utYxw(P`Zxx_tjCGaVR~}Xxw{0?A`UHV z);etn>H~SAvmhl~v^Pr!7B{~;TKUiJ%2=FnJfbJ6?5YHw4ly|{YCX9K`9v}+p1$9duKxG8PMN+gPBAb~VZ2WHnACy>id6`bkb6*;;AJfVLQy1{ z)H^=csEAqqOqXC{0bQ`LfUb#bpD6|mufxx&G_FIp4Zh&=VC0~S@CGIBm3{``+v*kP zz=B-$cYtULi!Q!b5U^=}J$#>-{;^s?jwCp^=Mq5LNJu*Fl^xB~5<4=QZI+!bVH*6= zcX@yCp0}AQCp5)!#Vgc>Vv8%h@DMS}dkF8i87{v)%A$XJqNDI@HuZKZQ2R;~TVA3j zF&{Ne<+O(-6(rN71!ZEmdf>d>>)c~o81-Ci4CKTuF9qsW6=bS^$o&mQ=RQEvj681k zgQ?N*CP2HHlZ$aP(y}5py{nEAaZuHiw+u-~^3PMN^~zv3U?B{iHvSY#B5E^${8i}v z6`Y+^rlwXaG>8HL@jq&^SIJ%vHy2$c2Is;~geY`B+H1^Fd8nHYj3bsVh`qX=%pQ~sR-Tq z2l?y*`(}HPilPBfy;xt8JP}PG2#wE8>Ffe|DrTPko1xFM(DoRF*`&m{Aj8a^qnyXi zl!lEfI#khlX@9a5Q&{iECXygd42pk!HSR~yw0rMnu4CrsSE5oYgK}CfLWZ;w#owkU zty+H3+o<_U!p1-t;=>J9{T^*r)1f|>Wi=YZEl89UV;kWdX)Ib)(MjcJakD=U44yTO z4EKuFFf5+rKZrAr#OKOV_P@#uF!5XAC_g;kMQe>Ezr|lC8|$$ctHOL`Q49L@;b|=Q zsv8$0CVL2ShwyE3vf+zdIiRnLgqZIJ!Gbeo1})Kz^{M9;{$ox>JMTe5S^jWCNOe_HU`nh#gTvZZg=5my0m5_QCeCGp$;F1V|MM3$Qyd#vpLx6R({P5tkT zVkAsMAPUt1@6)BbIxRYaBX`nTKN7*M8+nIn``ucDEH*G(Az3sLibMTrau?Jp=da^GNVd;?rOAPZ^ zoo~s7ob_xrV8VA*v*fA?XJ2m+CV~IYd!54QFRHL&`~$HcdlC>LQ)mH34lV?QWE~2a zedO9@xhJ_;GC5C3{*j>!d|p3#0a}`LuYx)07UCwvcxI~cbbqXNT=`SD9zO*FKB^AV z@>6Ov*Qf*58Moq3I?TG8la--p70S`ZP43kCr}rh9LuRDn_w^oZ+Zd*oVSMTi>JvM) zB0UMubYQ1zKH-~i_ss11xq3#h_e`1K;j+edA_5EG z6o$!qxsb>4-CMR?gQqU-fw>B0kMn-%U|ODnsae$8!)e9(9sfT@+~_WjkaI0{Hn|t zl3~hhT(uKAV14(s7%zuf%sGjD$;hAQVBP!G0XO@Lx%fJ7d-Mlec<5GQ&_m z-|$WB)}(w)fcJ|`v*|Al)yjVR!|KfB^vA=1^}UrOh{XuX#<4= z-n(T#S;=V7{t)tvEq-lZi*`GPGdU^(Gm8P3gOxGjjK*=Ylc9tHEiDAhYGt$heo8Yr ze1s=FXGlVVLPn$i4iI0NyHSZHW4eX{W}2VR6=Y%v@TQGVy>I++$4xUf^YE;%^!n#F z=k||o9;=--r%t&rHE%yO{fQE!c1as6T;6+|TqT*iB%N_wCKUh&?1!)L4|`n9P1_~d z!Ml~&R@(Ki2j`m8EUW0fbHLrU$vcZR(^_ME#k^U$8CWm9tJ$|LI=Kn4tN+rf zdNvCc@bWXJZbxy1T2C*CX)|l^o>+XkM2>&==P1~oU8YS(mFov#2rGi(Q$yG1Q$qrg0QWPqDkg45s=LR6Not>6K-t&Y0DKkh<;!q|<%qJx()5WxmP_cVJ=<=}#y=pB z>8O`IE?qn8o56Wk9*kvMuJmZLETXrEZxwma>N%h_Mi*aUvADiP6^~NepV^*=RNMkB zNT7NRz`XuRz;uu1ra~k#{$@PhF#Yv?HL`r(N2QfK;%g8l1oTan$cScxoT6Ag-cG1z zgI`%WL)R@vnhCZbn`DW96ykDKzLxT#5TOe*1LFhc`R;|m4eA3S**p;G$IZ4*U5zLe9zC_mECm~YX5n3 zo##+HFb!s$j>I?!Y08A5-63j9xyE88-dxyJY`?%j05YwFuWwgrUIU)~zTMl|KsuhM z=M+0+bF%I;_xlZh@jznNwM8x28K*sjkrQN-%kQkz=M7w@9D=exSOGA(UD8g@1r=|6Yx$|m`64YTf($oI_>Pt5%?d}4U+ zU|b{71-dncW~Un#)>o1W8_6&FA)m7lb%BtmvtRpjWt*N$16l1Ww4{sqrQJFVRTJG& zkE6?ww#lH9gSO+?`}P*aEZ0n2!#|qfqG@}4Em;1d9$74bweg(4jqYyT`k6EIMe2C- zs^fJ%ZeVjhPDay7drGD%%s2`ARGw?lx|$W=exp10E4ol>+~1u|FSFids>XA2UrRyv z&kpH_Sh=82H?s!ani$Yi%6Ry?%X4n6~^3<9O32!1^sH#8ur4c9Bd7 z))j8XN+9#-(tL!A>9_u+ZOTzU25fP95#%l(c+?n50yc}+aScvHZff9W&)h3Mbu91U zG&~uK1<^~|hr0w8ZHHtNrxsQ)mZZJt&k7u)&KoG%qZ7UDNf)biD#)=~fzk^^`p|eV zG z0{uxyRw3wHMzaD&LC90zAGv0h;~)opDVJ?`;??i=T>g%%pGkaEv?hP@mPm>muu^K$ zbkSu|K|lj z8<^8k#WAl$1;klvKui4@V9-IDgN`P~DvdBE7{~>@5YR$CEp95xnZw^lAu!GY%eQ-= zg*kv${)Gi4I1$V#V@FKYV9Ybbb;l3BDzx~fAcwyIXj_WD$y!+A(=d;*ZIf@$G4Yas z88#Q0$ezp)6j~}3bQ>}&5~fHW*&1+wGkNUd?zO0)H&!)Ku#evY`=svUCP+Umky?A< ztIUpPsYtOcd=wC-fHCP-L>GdT1L}lw?7~#=$#7?HvIu_7#zCXe%ihdhCj-^{2Hf!f zVaQvLA2El>2nyNM(M}k|vr0m_93D&IC|0CVIkRf&#f6)I2EqWz>W!&mg| zK+>hZ>fruYKOl5z2SO=+_z@6U>7ZD91e3z~JR*tV{xzL|$ST5pgNL_k0NDZe0}F5q zZoh)tX-1wWiV1Szo0DsS^B7{oQkOGYf5pWH#_-#0z^2^f3F0yqd_UW~_^x~MegeD! zPQtBMDpgIK3{@`c=DTLVSI9ZUCF@Iw(&4nM-*xa_?XV?VgyC}Z@N#S7qaua#uk~N` z&Ell)Xz~+ubRZ~9$u{SnmQ%QnqS#e18uqgULWrv4$%ln!>27kB75(A&+K;&}EvNjb z1+^lbznSfTLp2UsLnQYjEg0e@ibti@A&A`3vgYuFuml+Us^m+)?S@l?VN=G<2;4d7 zDn$lE{_Tc$t(i<^tb_eKv-tSYnGPSCe<2y?q^lcCeR;;gkEY-Yn6DqQ%b&(49xw&q z(hxMHs7^`TOf+n4e_0Mu}qf zRYm{}Yd&el5pAL{(^w{qE@zvO>>v$Lvs!haiSUv2hQodot||Yyl9!07hyDC}emc;O z-KJ&{V%7!3^E^$hhI0AGr$stDomYDH=<7KTQ)o^C(Vsb_@ii5J>|PhBAs{na3SF4^ zUn_VETK@~%0#+Os?^^$KG^8f_HH7|*b+z`tPh*w)gWk3Oy>SC+t=lvvhbgYi6T&e(#`Z+06B{L{xVWWwc5(y2n@_=%T(qO}5x(UQOT)Q_76 zipeK;3y=Ya!pD18d*}LhYdOJh1iE`#cc8L;i3wI2{EEEo^HWs${Kbp!H;?{BhFxoC zuFtH)n~~9Zu@13UcDs<>uJ#@}rJD@^DC5eHcI~&Ou%N%UtcNmcwZZlWD z9t(fxV`DXG9>OWdz|V)nP`&f4;0x+)tZNZb#{5+(q^{OdNJ5Y01hR*NMuugg}ww)ilh(~?*KHoXT@#_sPjGGT`nrq zEVXrvLu>#nZ1I5kdmWWKNviEnwF=a=_g{iT`VMW@W7^>4vkD=;L$0lOihv@xJ8DCX zB}XCHdr>(1fsP8#dsqRCCI3)l*!nU}^P2aR^wu7HH74J}@?(UxXn6&570P47JO0fp zzf>Mhs%>IE+J>mjy7>kf&E=V~P!drg%vf-IKjaF$1Ez`MrnENFzA*7|!yxv>S?BF2 zRVl@Lv3yf0ri*SZ%TTwPa@0xS9-x6tC4-6ri~cS+j(#0kWc5Xr|Km&%2@uZJg9Izm znJVI#i~>YX{Tafr@mtUmhXdG9x%6DU)Rj@SWPC@Tjzd25{32He$DWG*xS@MV2eNN* zi_;oBac}1i!B=I1ZO$O`+B#Lbl(N|`dYIs*q^YDaL+~|QBBTbd;h(#?+a$}^`8GcJ z5JneKJ0=G~l{a}kp9+C*!O!o&6CTg+TxBCFi777IMNch&FxH-Z+;y2`BnNgI%u@5_ z6b>|xN7Kteqoz%|CfRu_<}+`ZN?R(l9a95*sxWJsv8zvlUD215-zAx^{mJ!R-d~d4 zX;gl)bEB*>2byv~{9{wq`m>r((851(Gc^fyAM32SB>6#5=2JdLh)N^~kKQj~=qCF>7qF7BcF=rMwqGGN@nbNY(HBgf5hhw?FUY+l4T_lez7!>K>iL z9LxKTl?st~AI;xWI(<4qd`XO3D37Fi$$6JLZ$BPBT4H_7w5*TB%eYD>;AhFu&gsjl zgpsc48PfJRJSVl_s^lN}ec1NVmtn9xg{7`HK8#vHyFa7YzL&V(ch9?b$e&C_o;QJQ zDmYu5kfVrBzvXpqdR~ux>u83b!}#ISW$3D+YIpjCJmGEA&hbUfkbP=?+LUa*Ym;|J z`_0%v5aoKzItGl*De9HM;pJxJ4l#Gri49q&T9?ypBDneWi1=$COfhkjru?#d7K=1p z=;Jc$zggNOzx}MbfVS!@H(=O|oT=J% zO>;O9=5sdyt~>K!>&Vw79G&HZRnl3M!Q~Azyw$G{XK@W0FLRo(kMf9SfG}Z!if$2= zjXLeWy+@Jo%{5U)%kCb|*E!{jqNOtBAmCqB+?x?KI0a38zYwp=R(nvif zTa0EcUOl!@5^-5dGAyKPFVG4=KTTc~5lMG68h-ba9fmd8`7rY9^MBiVaOeeWa8FW= zL#&Q|$Z}}aCNtw};|g}z5$^7J$k-bN9Ma}d^+C(C4x~ip;Un6gSuREP8$-*6Z7dW;t7=e~cy;20=A;NFvcEdTrjch_Dk_9zMP zILqI<-u)na)SZ7XI{0vIO~Kk6$ZjxC3R2_DA!}e{NBidlBCG{MBi8!aD<#wVgf{T}v(bPkDW~4XVSgvr1g}_br#IJ9kP6=j8j~ zVG#psf+G=$Z&is@0aPRIto;j0kwN_E3Uh~cPHRr z_KaC)jnpCXjMJ~U6ICX%9*-AiyAOQwEI*OybQQ}IS7k$Y;Myd`su7Y=i?OCDC+sEo z1_sK)9QlUBC_h$rA1K1A*8kgvD@{APMJ_DPi4eQJdZa?hjx0h8)iyAq{D$CVoR0H)c@H6?=E#8RUL?b7fyiV`MO zS-TSY{?0We%}V}(q~n{!!&zo%xsHR~Bq5HGM^nkc?YvAUL2D(YQd>>>Bh8GB$weeO z8@{mp;9&vIfbS?aWK9xXE~`gV_VpP8tJ+cRv9#JtA1o0|F%yvdf)~hyjjQmXP%?A7 z)ipXsG==cq@VhBx)bBlyawn`J8m_7PRT9RHzQN z(K@kNI0`;df0ev~zcLW|-S~I{L-W*y8^01BkSg}@$jc%ntwM%aCoPa|XAi&aNA-UE ztqwCv`!>hk(uORgUxBm`GpeEqMCh?OxnSR4ju~ZTb(>SeDxW&^CSTO4HpK$k=H#y| zVY-2{bdtRJHwgiLq$LI;N*B0;DQ!r9Prda#D~X503Mlo97phJKRTdAz4^2^JIX@%< z^@tDjc8pw}90D^T{e)5;UgppARmC%B&GqSJTf{6OmPq7cndE${J) zO3EhXcg>6E8T#Ek~38RorPE=CqBzLI3INvR&(3@tUBbd0>) zp2*~1URmN1gg^u*>_~`%UhnW^ypk%nZ_xQkrKBx>o;u>Hwy4;M!Dfa(R?dEr z9FLKPt&Bd@#UpUZZ7`^J{rNm;q*@epi-$e*G05tcmJTB~lV1rWA(VKC1loM}UH=hr z0A5;u^PJO0T0f$NJTtVa?;?$Sek;+73FFT{dEJO@*9H3sfx5FM^ruWB@GQI+lkK`= z%L=ZjegtL_>mQv67vlLX2W%Vth=J?+##Be0h?Zk3`~SWRTwkq^*NNz1YHt5DpzZXO z*!>Cb&8QB|Mpmm7Carg8EzSEli#AA+)7Zu=e2Z-#zXKTf>nTN6~?&^AZ| zmb2ioqy3O4Bz%)n-sUT`eNdDln*rY%)9$ueB1B@ z`&od76#q>_1n5fT1Ss}zW48tywIh9WZJvQ76t3646{F_>x{wQb-Us?%u2*#8e!&g? z#rr$rtZckUAKR0iTE2$3vzm(u+3oyO-OKM*drNhnLJnW*p%z}J;wr$H z`>7pfH85ubx~>~D$WU5rneU70!&hK;<0HO_DUcTqVuDBEvViqoEglz(VO0_6Crz) zzjNuQRRd;>fcKo-oU?W$qglSkSnT`qr6#h7<$jB{6jj)~8B>vPXAfE`1c<6DXyW3C8t%-Y#Yh)Vg{ZQ|MJCr7i1w3G3`R zXIBy7&DpUOQ=^t(V>6afpm+K6D1FKYA$Rq1O2e!j?T{5eN8^M@K}tsavIudIl9)?oU1v?37{szLP>_{*;%Ygs=_{BNJ+!Y;R z+=gsCQZP8IU(6L7cK|3=>!NdK+MqOBD}m$tR>{=scdZuYu5o_FgfZ`1ABg9st$NZ1 zRlP8y!WePsFnZF8A@ZGR_XUQo*v$I+@5dRmH_+&t`0IIbHo7k_Ft6J%bSVn1z>p|hqwN@dg$L%M z!9-#Cl3ocp`4Pe)IF~cV_98u%kd$jumxDujC9`ltR>{;8z93Kz1#9^z+FyssU+{Dy z31>ri_>ualDy8Y(&dFMEnhG#ZsZhSr z?(9%cqc)}nArw998T*PqkoZs^lm4(OG#QtV^3$4gZL>9wEm%)HT*rB`7kC|5zaW>T z5tdc46vkeXDyEA1n0jTG=>yMmHGk3QIS`SOadH3M1HP_6bIn|@Gta%L)yvPncD1$4 zPT%v=BF3M>fQBOC6Jw6U1M}nj-W%UvSU=J0 zwYTF171AZcj!5RpPP}X6UAF%Is8@_14n9(>@6zj0Y*Dcn>J`G{CjK6kzES){ zf}>_jgUxejD{ThScXR;(*N)o|OtNvz>S6_nq0!oefPk@8LC|i8;!~mBh&r>Wmf7u* zlum=Z?e?~2Mm?3@+G3}wtk+w0 z(hYx}Cc=eJtzwKOtB8=&ol1_4{IvU-=wS~2z)961^6B6l_(+*%bRaUC2SPf-T0$C~ER z<~LxHzf@*?$m5ozyqTME9VW3mxQHh)>&h9OMC|~~9m#>k8c}7@L z&h9tnJYgO*LF9qXUMb_GySyzkd++@5aid@lOtYgf*?k^L+`O1)dv)vE4PLOxON%fW z9X+t1;=FFO*A=}*;2{R0WxmJ>+Y4}kd9}M{aT^!B+daH9G5sc=>-mVXCSlJT2|{*d zS_Q0fhe2zn)=Bb*#Y`735tkTr@@?K4YoTW`Ra-arw~Q|bJh;=sZOm0FFxz_#&AwV4 zI86xCN$r}k;qP(_4*gs5;-UG@Eh;x?4O)jbxtZ|jec-&b*ZLV21FWaw-U{?sWBP^e z#kNk&g$uH|-Rl=+Ce{O^Cp;kO zD<)K{(OAw^`MH0(d2qe-HqRZ;NCJx;)8g12b)$~3ZiM?-^=jxf-QVwp z0NqLyualLWUpdz2F9za{?XP=#fWPHDTtQwJ%`EwAKQIr-+q&G=Z_u_iEkq|_9_2F; zS(2&_sLHl_D^=R%t%lT&5f3qm-YfPt$k z`rt`cjq=3tMnx%$?)sN%cOQKd6FOYdN=0ZfQ6c1W2iuRH6_ytTcXQESyni(@XJHJm z;=(W!d4FG9v|e24GaeA-w~OMIaD-|8IFYihT-F{jTKKjM_Va;BgJ;J#4rZ-{;vZOuQo%*GS4l=A~bf}-@xZ-KF;{N*% z0o4>lni96i$r|+5+32mygq5!T*mFmLG9J^?={CQjJYrBllduVcy0tnaRS+9MB5E!% z;&!W30VO{w)W!^z9SGp!rYx6@OF3VAI_r2_UVr6!@S%cAvfGlp9#04c1Z+$kKGj}~ zpKNl0V9(-R8qA6zHy0Wex?gOWXSOecmbm;HicMtGRllK3QMJpXj5j*LJ2fsb({**Z z%V-p@)R9}`pbftKU0gI58*`SD=gp?pExiX>IFsYShQUEZtOht(HuC6UdECP=~)3AJI$J&JwKWm1%p5H zxi1jc$@Rdyqlv$*7WL=SH~Is(H5iMF>I zhNS0(G&-5L1JbvHw^!+_*sAn?nqAg%6Cv#{%nJ4f2(`lD%68F5Pk7bsVGOvCa$!!u^JqRGn(#roq@5dsa%C93f8<6Z4VOSA%YW$#?ntIleA@Hotp|RU*ZQz@y-VlSeG={2oNu?7?hAf%3pkGMSaPAq?~hssL?Bip61N5R(u|n*DHpy+A}e%hGpbo=5xf<2fvCU%aSffKs|e zcsTr>5syushA!T)VeXDXHu4kYGM;Ql?I+ zdbKMe-E+6%K6zN4ej)o6EUc&3wSkV8Mh8OWh*Y2F9@EdH&#OpfWu)c74O|^B$kCn_ zcXg!VeI;P|LwgkvB-yZU@r!=1Tb47cK-1D9k1rVVrXkx^Bin4PQEB=` z(yA-yH_Mm`Aux0vaee*{b)7ydv<}#-pHCcJO$K9&NWM5Z;Cau6<4|8}8+x-DN}URu#?; zhpMh=^)pk_RI9LMszkW4GBoK`LG`-e%qp-(X4!(mmuiZBS)v%vb;hQuzBM2nuG<@y zwyTl^%yFL0TUM^W&Y8@Rap- zHB?ELZcYt9o2dNJPva7jl+Cux>*9iEkCk#!{_Na@@_AY%rXP9ZGBl|hcoA+W zmItuwO?Cig2H}R>Bj;j%iO-uw_nB#^ z1;3*&;G&3dW0KN6i@`ABZj|J@l5olxz;u~P)P4l*PGB4g*}=~ydMFTBg&=3lAMG!C zD{NZQsQ`e|PZ5g33PQ*>WIi=TrZFCDd>F4p1NWU0?u{eDbfMxj`DON-rJeT!|IJ+N z>jJ)J2gCuPYn6aoNtf*PvPOSVR<@Xn6!|9JuSTn6TpEOm`f zHJLiif*s!m&dOeZ*@CD~MPt3S>j+?8(sIOrva}Wkw@!|(vpYt?S8I6OkWcKz5GXB3 zysrsjacWnLKK;6D*yPEnOwX=NKkW%?m10`!maAgAZ)8S8(y>Ap2P)B>o$YJ9raSRl zGN>?g%nZa!s$BGm97|GsJ~%TBgHyzyL?wGy*M8vlJKG)-uJ`@GL8#z!pW&j=urQNn zpaTrHLJV$*5b_i!oM@Os@gY~+jlAH)^v4cKGDt5w3+St#7#Scp`)&XM&i*|?O5+!B z(by9({ynm69CE}gWGLmpY@g~aEa|Tca6C~dW!*rZFGdt-D3lmJAPl`{tx+-G5bZK- z6GkxfMnwpDC`mQu6W#uI=NOrX8G?hPi2#&%h~}d|Cu=d_g#NiT32{`7ws#_|?K+-) zKknmmbtVUWorlH-+=o@~!ljZQld8@9#(ujo`MtMNTg0V6y5C$gC-^cg_-c6PCdOo` zCK!55vJ0m8l~7Nx$ucQ+RSTgX=VCGyvftn^gU9em2v47}@8L+(_44AhrB5Kp;^_Et zM*Fi%kU2{ym*{-!hZ$E~Ooug>fJvi)t}jh-eUE$a$A=jBd@yWap@f|$R>k--31f$` zx8?7D;vZDVaMD{q@z$MF$hg3W7%c7cf|4m0v4nPk#Yp>bw&RsYi>%X)T=r%#kLGM-l z3!w+7>vG`g-^Pz1&6Cc@FjxdE&|e}2ti2*3C||eyENGhmMB`IqoF3`(Um5L3h_ymA zMT(IzaY8idw@S@HI0M`Ek=RQ@5-(O=ny(r6y!HGsJ_~HmtjbIl8?E2?i;KU4J(1pv zt_i(tlZv?2`|v=9T|R3Rxz(XQe2f=N|3@ZRaJ_#Ay?-BG%TLrJIo|(6mr3uCh*!$Y z)Dj_JpH0eiX8XNjO5xIvu;EBICMVa$^dZ!P%SvH796xh|oS(M&^z$EV$hai~ZZLD` zc%Ds$$;XP=QnOO?X@33u>MyE`A<#@VaEs3y+J>XMVm@pbUsy&P%YaB8zlHMzCn8fR zUO;~%P##m6)Yc6U(wnpb#tQ!1cc>HDa|OT{9cii{CEcF9f%k=VuoNidHl4>D{UrKJ z*9tMr4U02 zPKZtqvv^afC@uN4-#r|>(GSrx)64Oet4$A98G(TewspIQgbq)@L#hZ~HGS59`#lV8 zLE<;iR-f>3+nW1CG^)}N2m6)+q->h$~qH4HO?c7IwG zb7VP(@D^byQtI#1{r*L0~YV?&kN>q zesC((vhZT$fCVx}Ym*d1*~EYM9mHm9;c z`8@bE_3-CM&?&-zv?ZytzDQe@j!@an`;(s=)M2!8QtuGVWMgPUEP29vMV*uw57VzK z!$c(Vj-srr$F5|l1xUq<*CW5Z^uKUwClDQTBYGH?*n89;@Gm^%~VQCCR=X-UTkG{Yoi!y;;@e%)D-KZDnyex@d~T+!t-g zo1r(1V|>-?FzGikauMF9*+!f$r`u-blsmh1kMeh1IX=9AGV+U+19ic>x< z8}OMne*Tn`{{LwD>aZxj_iegakdCD#rE`}~k?xWPNflVSI|LD=kw&^p5Trp^8l<~c zI;0zX$Ituy{l^Tmb6tDp?3{BycRXLRw|}zhlwgP>D*zM#E&IuK?N0hwvX(JG#8gnVNgKr5@@nbdxy^;w;xI!Frd=0sOYuQ__|q1v z_8(27hxdIC9PFWy%toQ%zTDXqqmQSr_zjHQVhtj>ABPTM!?bjUXI`EUpG*daUh7M` z@V+lfj2mZ1e9`eCnyaU1%v^}+7OO4@UHsWOCBI<4R z-ls4sE@RPZ57pyR=I1}`vou~s#+?}(@)e=6!6x#*M%KU^PVwAr3yhqch>M{)M@guJ zgBY&&49W_ND8p1{Gw;|^7FuN6wHChx7+|y`cRReobcRh=Ycm%YAhfI8Cp(ZV77LzU zJzg|q(QkECZe0qgVDamG;}4k?Jua2i+HNDTkBd$|&$+xyo8_Fbi4;qNh&K8bY| zG_p&5Q?(wgh0pQdQPPa(K;I8~%X~T@$lizf^F5%b9(>#KZs*VOxj1|qcPixP-@)>M zG&WNs-XQ16kuzZV;bhq0f%r!1sTytPQ;?4rp=X(m8W)~esdyG{4K0l`jU_%yl`Sam zn@FdxG>vw27!#x^ByhD#lXo6EzH{E%%E0Cb5uLy5U4ekUFHm28Ji~w@$!InWA~z%R zLj2-V)=yqzh{Fp-^7yF@e#)`E=SVwXGgNk2?6?emDG)GWFS1`kSI)G_r=m%mG)p2f zGa*z;O}i24z1C(&lHo?L!R=#}?q z?Hs-D?PuMCki#hzvYlqLu)@ma3A6CQP%JXb3&_rpS~e~t6V%^fbejUsyxR4Y<;ce@ zXS5T#JDtd5H2K8OtTR;t$1S037Z*INDL-gj=ky6Vx9sDc;BNCdIrOTiNO$YN@zPXw zA-Y}1VOQV0@%D1l+Z(M*OdW9K^x6Aq)^{)2D7hJmExAajH#l??bOB>cdG5w<$oIFriq5Eg)Kw-+EL$~K`&HgUCCJxgNG84?HxR~&+ zvII>~z>obz;^)QS=~U-JcFe}2*Tw72mo1?ILy3a}eBo;|<)moBLyh%cmV?$cBk4+t zHw-g%4V}tLHkTnH6E(I;AC|rMz)LY z&z6MNuh_{bYuaa#lYh`T;KYz94!)FQ!{p^V5T$4)w;sx0%ee@5EhQ_Eh2AVO;VWFM zdHa=x7C5U@#K{Jhzr22>>GLD4%pq{-#hkjMc;7XDm&Ty?B2urj@Mzvs>Cwh$cd#>5`roU?wsaiC6o z)Z@#!4$n}PDzLfZ7e4^?h6@>NWe^kv4+-$Pr=k92whgbS@5!i87VS5$aY?Gos27ay(Q31xSTO8nwBad$z6Kun`F>DZKG?kZ*@wi<;7<^X zwFsb}5JTZ4EovDYFg|_@=+V=vLFE8lh+=I`P`9`Hcgr{fjZuGU{OS|Bdu#)C|9@Y` z3IXmudFSbx04mJCpVH)FEXD19e|yggR1&0{X!d~bAD9oeSaztitR8wx_CUK=!Cx;5 zH~iOlmv+I^%Ip`l73n}z5)eMr|CYa6Qe}G!#y|U9L3W_2*MxN5Qyvx@GTjZ3*|g)$ zD?NHPju{mwsmlET;ppn68}#tqjsy!wBK=u)IqDa!m?w)d1t z1F_~NG(DrUalUaC+fS0`Sz_zG-3lrR<(B?h18|w`JWPGWCHmmt*OdZpj?iL4=sGuM zc_gwk{bJ(aEK?o{TO4Ag14&%S3(7`gg-Oo|px0f?P%(DUwJ80TbUR3J)$j=?YPp6D z@|y=}uzJI8RrVp*>VP-S4*wT50kCn`sPiz4|Hwz#-c<-$|F1$2;W|LMRtHMjWa~cl zF02_EP&QAg)y0yR;AeriG13>(|Cfh`5K_4-5!WR?x6i8TRZ1WXE&y6=&HDXd(5M=l zcZ*fG_FJxK;h?bVLq_Dr{(X+V(;noFQ1rd;GtL}G3W-4@Xo}Mk%3~&e&fM(V)|etS z-pj7W)|v9hJua*wL0%FqVollh%y0;ofN`QiDS+3a*ODTO)1M+X@K88%<(b2YPLmcbalJyOn8Qzhm3SQH)Wjje;CX+1)Ksxp~+Mlu~NVGvc z0&G=;Jg!V!DqoOrKL1*P7X? z*FTg_O9{-Uj{&08F7&z~?4Sl+bqEeA z&?9)S0;Pn{OUp8a#YN(kYI1Dl5duGIdI0H zs!NJ|@29F(MD*xw0JjqTn{S z2&b8sV9s&gI=?*+L%iY*xz<)T4UIc_sS*%vCVa^<5;09DL;IA)p6&{o%iGIaqUoS&3dZJA)I=GNbVz&28dT%mh78}b@h_Ga@o>>+>r|oeXv9n$5$*gZk5|t6 zIa_}um%92!HcW4=fGU+EeEMBapo3@qlz+Eh`J?w2?uJbRYwo=AwUqA!S~m1=+%scC zT=E-(P6tcem#Krf%W3!V`O}dnGtCHohfiRXMq1kJ$vldj;?;V+*08QZHRI63F2dpc zf*m7}{|#3+OX+mGNHpDJ&7;7(H~#*}aYhCjd(mguO2Is0x$@nUOPi47B8oF8R=lE+MMeaqyFR&@U@j9bA`#UaATlT# zwoZvv&|?r@&%hB!d?q7t2q2Wr0C4np;EVPL)xXH1vkN(|!L02uG97hh9uu*=E+m7D ze~*iovC%)jO)2pfV5itH{>s+YfM-1v`^~nM zr}64M>lcTdWVk&B8ZLeIa}l1pV4U*ObY8foH9y8z8_d^MSmn%A zwHtPd@dbn^J#R|l=l1z&ouuHdmW}c7qTurF#M9%~>WVj{)7~<6XV@wch*Z{oX%aLv zeK2weBRw}BR^eP`eH+#Hav*5!%(jQyZ~55u0ZNt$fh^G-|}DIh=!lvrJkOQJ~wH!j?ZM+5|25Y?RV;jz3`453Cyx!jE96J zQa1YaU@C{7VeTVSAcaL&sWsw?X=~KpZ+=z}(g4*s@m#?g8zeGE2arEF>>Wb;B`GY5 zuC6VO!h9QKIKmkA-{GO@@PGR$PhL;+nzbF76|W$ZjWsxN>aI}Nw2QHT+_2L}9!fIz zYh&jl%2x0eZ$YM3X1Qf)R(?pi7N=|#Y6-I#dz97b6P23uetf#CCY4SlM_-w6`E$u& zGag z22$ne?;j}@(OmlkO?}%m0e$PysUkz)nv&}5vjM)T&sc97sVnfH9^Uq3+eF$~0pdYAb}+SA0h9&0;q*;qS88;D9jx%HlY^su*tHo$0dZ1$d_QK*xJ&AFr+M4ss4dF1 zM)rihy$9*A_jl1}KWL;@_t6&OlXfe&pTRU+Smxt(9A>&+msYx{yqgHQvJ+Z1?vxq;s zkloX%vSW6aS>94u8UMgo!`W(2S^g3(cocVy-EktDaLfr!h?~iAx!TgOL4_=fnE-k| z{h2(ed_H&R*WgL1flNU8G_eq#C1P+p0?tfucljh{UK4^Cu7HcXuoqv{hj`Wwo3QWxGu~VEk2LAWI zW*ExwlG|K(eSMlVK+^MyeecKXCaEoorgw$+@MpzFsy+A7Ecz(D=5tbF-b+$aa@BUC z(_YuqD0Wa6vM3%!aZERnOd0AMOapvi9{ak`v-BTdzR@XnNb+tVmrlMr5KY(4{KdIG z*aCXVl~i7|8G2xG*Z1V%KyzhN>vkXj#YvXi!yek0(s;V)=Qn@|A;*pgnWCc)Bo;u2 zCK@&4GYfG3K0yQ(_aci!8=yngbwlFib-v$TC8AgFY~&4*?T zQtFr%F2Ks;{Ujc5C*eqtDz&I9+7JVhCakhxgq_?fwsGV);&6<;y!|WzZ;J;q`YPM1 zE?(+J8c2IIk`}}-%;yLJp@Aly;w@%3{(_+_lwZ+;^hn|hW>^l`^P*$2xDnu z<&(cY_xvupK7gDHGi#@zK|43bhO}c>dwPly+Q;^H>b>e^=*!O#0~E)C#nW0tT{7dR z@7e<3@3y^#J1P)9<6DQ-;7;8?%L~!*ola&Wwg^~*kE=%~y+c{CjI*ZE-AvRs=TPz~ z_kkDe2MWqvF)zs#Ft;X%hZt5oiyzdGlFO@g78R6qKul`T^;V&+i7N>uXdz9qoSqJ7 z*leTOW9_nw@w#JaraWRH?vF-QQ8VpQ*yTJF4iOn?F21_4;L^kL^Dy#en2XUOZ4r65 zf934O0M23AdpB#1&mYQFYWE$EyC&ka2YX2^p3|~0>b=F=VvJCx4D!klXnn96Q65sB z)bZm$Hzlj?x8|n}6qKyZ9A0Uhx8Q=ukG`wyW1ZoCAvAt+K=Z~`=h)Q+4iFJUzB!+fYPLeB|9X!R5{FnT<^m3ZLfaOIXi{R4K;3gWjPD%U8Zzgv?xT`W) z`%A`lxygA}rUX2v+r$fsq*Bzv@uISYV|U(isQdi2ORAq@1nE*5CY~_c^ShE*W?bIeX&m(CDg}b2M0XwqEVVMBVt%_KF=*IXZHFDTD$llY=N` zq23>Dt>E9#K`hX$=2d)OSeZi*ca?B&ig|q}hqTtr%5L?Sc(?yfcf!S?T(z(XI-$7!lP1eRf>7#zyXwaoVsMLJpl5+CnpbsbD_0JaV;_(@P2*slOfUT^j=Pa*Zh-9iH3 zNjJbtnl-G?2I#%i#}ncFXYLNo3yBAkj5!6s=no`7lGC*tpsE7E`ziz;QZ$sXDZKz> z1@rTb0$JyMIo5B=3}IcY_VIIq0OL=p0|I{J(PHIZ9X?H=U+WSHHn2ZwC+_4keFM@T zvMhe5uXA)!679&Vp&OhtFw3}jM1Z76wt=7}ia7k0eh!Wz2&)(CsA!AJ{^-)_*v7m5 z9BUU;S%==4IaU*VH?59VdPng<4}QtAhCT1rXf8fw=W=cQFjAb4!Q3XV8nS@W4pOK2 z1@n+4@~l*&Qer9v7sHIlelqYxPp3m7)S!Yn#b7GXQ1`E`6C8cWvQ$JUVr$h#lQ5F# z-&oP%fNnqffG@)hIVcGZiZLk2H<6!*kYWP;wG4{-BV3V6>Rj|7>cEV){#Tc`p@rP)#@2A!@PGtui-p5oG%B5XWl0@DY1%;QvP^s;+Y}a zccIpC20456NBy9RB*9gMrrErUMs8T z*+-z|_#QaY&-xbT`s(cv!y+yE6UG*=@|4!Iaa_Nm|I-5eK7jlHC$Dp!wxWkJJ?i{J zaCz%kdBL2dr@+CaR0N`sg$?2>UfEizncG|tv(AgF1p ztbR`ZF74=>E(j_P8)R}k*o9<6AE4*|5y142dU{x_4i6~@5TS;rtn~+%9R#`kM}5-w z`8Z_#1L)ddK%@8Ic5~iI+#Nzgn)56C%y^tQ9r_DuhRrPd>psZa0+Ws*fjqEBUVnEHXw{KJrgwPzb`7mP^!TJd`WSJfvI?Ji3=6T_NCZWrYEkz{8d(MmvumWpv*e!b-KMwDr zbTTUc&gbeBTOR%@qYfs9>wxO8+rXiGQ;w^-++9~gi!{_&dGbAx)SDGw1ME11yOQKk zfIAN@2xG3yFt{npPdHQln@r_(9*B(wrzP;Sxs(O$N>vsRoZ?q5-lXBUj9fvD_K4sYQf2=(Ad+9zP_AlQ}o?7#Nr+}ha{pxDq4nZcK+LqUbrwNy5USP-+M;tMx zKW|t!sZWfWMkTGzMCqbpM3epmvUiT=W&te?9Z)fANaD+Z#}1pXjcUH(76#P}ovLVk zsk;Iv4Fy+F_(8RtPh?g0LwMFRa5qtTI`6)cV+F4cY)yQqu*53rku$4fyq}I2zwVZn z&K)~aLH#&`AenF!BV-<8P{Rr%VkrrSuty1^p8)%yU7g+2VN=iyM--a@G`ZdT?=iKC z>BbGZCK5#Xh8=R9%w+a2Pdv2VMJ~Q|OWqKBtN;ehwfu%Wo^oqQ9-pt|^10%SSOvhn z{~(!tDo!&;5*$}2Ez^)goQ-zO)CnpLGS+5`up9X*GV#RKtmk-qhVvhv4#=B!@xem_ z%@^A2ea}*HWXe=k-SlWf3qDtDLio{&Ugg?n8F82(P9QG-7X0k?^>1 zlf^oHT`yd+SHKuTmhiK{>rfJ7!@M+6g(k;@U}KbMykul3(gtio<(i;4?x+jvp^#QE z8N`euh5j%(Vz>D27+?{fVo8)e)a3D$TpR&G0=Ve5EI(!1LvJCrqVFO3`-!)SQ(kzH z_KW-s+cJ!|Ewy{3)k8LsMK#J2Uh2n9y?|Z5{4~^{nIrAX)@e-2Nb@$HyiX50zP!)q zJLQXhn=L`7l=_S2@A@u-+22KyX42-zU@Iyq#s{8TWTpWOR(u=f9MvOTOeQlEu7fvS zd^sc7RAr>CBGt4tLFsBDRayi5FY zyej9e=r+2}P!0}nHad((-9nMi)O-x>$TiMD$z*u9)bM>+B%9D)(UP7phN8;#M_PSo ztP>T%ocfTAU}1o%N2su@`usPz_pSbp5S)9;BxZ=?x;jH=*{#di*){B zr$gKIm^Oe|rv6;_WJ=kU^+i+D{fXFl=}18LiYZ3W#ji&cB>G!Yf3aplmwPv%PB{bG=(>?^aVa^|O3qz@cnJl%`?Xq~ zJscd&5Ng&78O^rn)9eswp7P`(jiJy{j{`%~9i8E%Oi3P%>OUcN-Xo@DALU^P{@;fq z#o)2AMafh`x|wd?t=hb{-(7cTKftpIxiR|Gedv~?zZ6YD8pg>L&g~6t&U2aOfrimD zRww$Ued;9}6cV7!61PC`@R)|04>%`B67XmWn*BmFzAnA~9QfdUwxsEi~@(U>Y zMrv^o{^J)cHOrO};N|HkrprP)9rv$Zk4DW1? za=)m~v14D2zq=`eA*M&ja;WAK3Ef_y419UQJ{G-T7Y}e1f4hh?8IfyYJO&QEewB;! zI@j@aF6~~yuK;D4_46fH;TfL(e2oRx%d%kejQL^LR3UW%(B%{&Y%a8+5Pi&CpO@hR z%T}(&ODsNKgD@0eV zH#qm_&M3iX^{&j?4xy`S?0<+!X=~`>c&fRZM5Y(*?!PYlbfhS4{Lw193>6oLei`NN zxce+3*>@3;>Bw7wFUm#v>F&|&v}0&a@nFVNv};b@0jRkxj+QQdR{Eizmwm^qZRQ_tj|iqrqQ;MWD_6xOESWi# zmIKvY=Dhq$@aFbCAK!T0TGioiA`+3-z1#C4lvf~5Ye;_;D}1zNbqzn8x+%RaJ=wZf zzo9Ys1iqS`Fx(i?Moi)P-RTa35HSN(fCoktwO8*$+|YGG&FoP^Gt zdw}ZR!GGUh3Q4F!4J{Up{`m{XEII0I9!fgYtJm`Sz~YqwTOB)OXWMa8{HrcYr(bNU z^>pSyga5fe?6mg2OxmI{j9bZO!mZ6Mid^@zn?EFH<^4OIS9dhw`iF-mCMF|Jf7A(c z9fgN^h6D!0^@-eXX2_e-_pe{h%{{WcFMavB0aM(|z5NH9-o_+$e%YW^&unX-=oc## z6BsIxCHWtp`kjb_oI5Hr_d@suhY6}5oi^(KUWf6nA4!&M(?-bT(TI~hk>C5yAk$) z{>q$R8Djm`ai<}YvsKsz%$%eoZIH3_C?Uz&%S$98sZ zyB`(UB%P*WarF;AH8P$a%}W)?esE&^F#KhJuhQbf=+Ce>Be!9_wDSs8@?B&UXn$ZX zTSl_jpcf$Sw-at7Z^EYB+S(;LT7R@^;!=F02{P@U#6T+T;LeS$qqg1oy$>3)b-AnH zDHZldVaWX{kUZwE7g-!Lrt#J)b=) zC(QMOCu5z@WWOfPJQun21e2hoXo)E)B$WJuX+b1dOkE z#FDGt=PcF#X-SGRzNp>!?)(cE_@lBIOfR6@Twc4SQNQUu+GA#LR~}pKqQ?jU*u)at*kfo0meGu_|4(`@LR@ogM%jb}3DFqzaS#jI4S^^Ao%*Q^bsHE|1k5~bf%lagql7LW)(J9I9o+L>buw6Ay zwtpeS;$i9^?!GHGbiw*i9}wzfSvFEOtX7F~_pu#N#R6(fv0F1*R#x-L1BO1C+&mY( zc>hpT9>2H^vX#*oR7n{IXg4bxVz31eawB*9^hw2Z-ps@^0n2poUq79r(y@duI1zC~ zghML z0EwXG}Lq-H3M(8_`I^8uJQWJF| zl;<)@gb}PtAHZFhBY=)II7W_>^ja_EG@c!k1k8`O^gP_ykc0muB$O8b_`L`=2nt=B z;8>+BkrYvfjIi??@vsK0X=Ac!aw27jX0p|m!N$uMu0VzN5<HY&Xqi4!QpR92%I>xfrkn|6IdK~H`nmQzmX*je=>02BM_MSkFIs*mq+4Z`QV9Wb; zqmS>{beCGLK7b>X^T>wHH(vcEVf(P2GN8>jo`mjkN#HLKUBHk<1Mt&l>jmKB<{z8ibQ0Kmg14# z9fu8IA(`buwV(Ra-f>4xb8|T66 zfKdnZiA@SmFs4#uI!rNd`s?fRm+V!LiE6R{Mg~Hen4w8yp6sFxTiOK-7u2trC4%LW z-xQgfn7?1D1^n=STx}h`FW$sayt9y&aSuiVn)nGAIui8Uf6Y&r^dTNQ4c!~b{7h>e zFEAP^ERkiab(16bG5@gNeHHD^KA(z$53$i+MW`I*2Ice79yR+gV>Eg84;S6R>jO8# zKE!dbY>|ZDQ*_^R{eXxtpg;K(XX&*9dt5H43xL^tlmv1b^|W@WI7`-m$tBe@T#lMy zp1+Q6heG*S6ECM?w55MyI5QLi67UI;O9xEq;&l4NK8JP$+lo zqR`wfq3SF3wz=C2Y{h!^bA91O(LylZwQ;C&SrOgsVn6GlRL4c^^~s?76L=1fsB4ZU-THc zP(X6vdaT6%ZyulPm^H9Gko0JcX!vNm#c!85&LZTwD052=<+=VP3=UVwuq&FS`Hi*n z*bZj`s}PAIz<{#`^c?W=H0T2Lji=mAoSihOw)F>qW{vaBM~Qrdyt$Xdq&IR)-h3{a z|DaEJdpfXvtdD8MDT}R1S-boDT+w@?Ewu9H)_enxwWHn5&wH{^rM!Z#Of>*e-PWnb z9y~8vL|eZ@!6kTRF^bZ>@F^^v=6bgdQSU9f{oii){U69UG}fhdVWX z7(Ls}{nwiK6zzh^UJq2tD62-_E3D*1ZcJr!MKJL%)wW~#zqn&Ki@5_E;mB+ZpJvpzUuDUc+0g)qRWm~QnD4V11Y8xeyUy?z{N1_69Gv1T5 zX@nCS%j(aMlo=gdsX*lJjC)-p`|^{zwrnE%Uz}dX+r7Q=R*nkpe;p=Uu2(>g0Kuno zm9XraSs3y@zZ&vd%F*5Su>ni7*s@hGYQRx^|c<&2&XgG-R_o&uny`TFS$GLd? zYS!raIhPe==5-0N=%Q#O{=!fLlWOlmN3#S&%EDSp_WM5tIc)7ANYzQA_aFHPKa*gt z4G->5D*_wC3I@%r$E5ud!uqHv4!zRIkX-xA-u8(t&LV+E)1H;F!i$NH{4H#0yqQhJ zOZFlbijT3MOL4<`?k{_!AgFQx|u_bSwS6Gk1vI=_Im0s-4 zd^td;adWb(zIRK}AL9CQ0MKTLVz;)G6nL33^Ny$dw*x7PZ`;t$?3OXU9okrxH1c!r zhiF}Qsto22uXeFs?c2Co90TKdc`!LK@ zdV}sfDr1FC5F76$cB?k@s1wtG9>s6}==UTZ{t_`d2D1{0hYKeRz&G?-Wf)9c zWBL}%vc40{IV$*Ov9^LC4Z0r@&=f`20@;YUe?-H~L0Ad*o?A8lq%t7KXUV*qI|@XC zjr`iZ>zH2e7;f-eiWyPRnZW>8Pb|K1bqf&2K|&B35)=w;5gL{f%;b?&C!WY-4%ZC0 z;gR}1`V}jbF;b)%BwfjSI=KWt$F0qb&|r(Qhn0n%ALmL6W~s5F4|DtRnRC1HjW!BV z!Y(=tBZkT@r<)rFY(^J25D%~9q!80azrViFQ*GtzcNOgKYId>>sV9GYN)6;YF;er% z7}>kSW^6JKRtqd5k8(zQ)J-1#EI>+=|oq7+gzwCH^?EJylx4=tyo^oG#*-%^cu zzMLUUGeTc1+Q(`S14!BAFki#7BGjS-Y*RU|3n<~VAO9ATh^Z_zI88Be=Kf=JmYTIZ z0XwLuQm6jTS<>hVhZVZJY0T{@I__~>=kah|ts{S3jkb z)?4ZPTes4Eu?J)Om2`URph|1EW9q|mv3+XI*??f}J{I%gn+Pa@3#GihSi7-82xe}OyN|3dF%R6xS=ci}%xm;W^e}F7)V4)kh2qkz z(HB|x9FXL`WDnW0J-;HWug33bPWrGf`#F}(QL)$<5!r2zQ0n#_*r?^q0G^QR$+ zdN=qRsvp`g{bwOJy(kp1l)pg~IMnMxvdZ&CsKq?S=f9I#vGC%YjM(v=K-;qAUWZZZ z7Dv}BaMSbGgvSZuJ$gQ|$u4?;wYm;2;5w%O#8He7YBl~N9sl!B3xFd;7WIK z2djUQXur0U)8S@cC8c5G_2CzQtNLvGVd@vn#yxs~!c32O zM@i!N7FbnoN=}bDQM+$F7&SPE7kjo>2OM2qbVl3t+n=d`kuzFamW&!{f@O3m9g#tn zmoyxpSR%)cvs*>h?_!nwQ3g@VotoU^+?L1%Xxmp;ztMh;z;2tC-w2-n-oN^NLZ~Wc zkKa}p8TEL2bG%7(2tOU>PZiEvb55S!MUvAgefFF+Poxw_a=oKK>$NlepKx6iE;%-` z1+#<;O_=Xb8OgsZ5U?xnNm|g|^LdeGicPQ^kaAdcJl+ph8Lp3rm+E=u= z@+$laWx41Lwn#hyFUyl+PhCPeJ>i{)3eeJ>%MLk?wjVSbLSuyY~j<^ie7yCrp)XSmzmHU z>r4A(G~sirhs`S-5X?otY^>?^^*WLLPMkQrmY8_RG7}B+A@G1I?y$;@nnV+ujTM;= za*y(ybxx0&m08XG#fqj_fuyg`$w&mPD-9mU7}_({{RWP+Vik5!^76ASmtIodSI}B6 zN)lG-a6OHHNv*PP>MY%vR~1GZpV8xuI8N4pcxYNn67V#&@azPnK{t;uT)0+|0v+=b zW1THN6MsONXubweG1uH+&NOR+c#pl}k~V{<44ePCrnjU+!vduU{`aX)3R1Mo$O()% z;hF_R4&JANzmfei3|&zO%RVif%~Py@>~94Mg6PzD`42TzT%mJsp%ZU@?y`6$=cei6r`BfErY{MatiG zCC@D{XY%_&Ana$iX_0$lq4DriAFcB_%h3Twab^6=$IVApXYQbg-p|P0TD#YB-OqB6 z(V{Mq(RY49_E7;W2;lGK%TPoigbn*4_Jc4MLkK6S1e55e$1#}yOL^+T8lbK3SFonb zfcXd~Dewu<0X_%TIY5Mu{LjDJNf%cj`S~CYC3>i~JIo35`HMb>YgSIyqp1B-dE4CmM5^{Og`QBUn7saBH8>Q@sR#|YB|Si*qaqG@B4OH?o>WteSXI3vdRjcBY;jQ& z7_S9jYJjFx928RkpUH@xz@Yl8gfmvN=6!(a@Aqfa{Jo@g3NlBQE{k{02m6$TSj`4g z-b4so6a0!(9gG^&(#U-j&wQTU+rgP?<}P zB4ZzYdhA1zY{5*T20QMe!^^%WAy`VgbmL;jM#Z^yO2$yPX!_MHuS@${XP`arBCu!< zD>Vjmex8ifzR&-FL0_cCT zQN?O0r-(;2u$d7w0Bqg}Wf!y4aRhbelNQ=eJKb*3KK=_4V&nOY7Sj9^&UHS9bBxU5 zvs*MDq?yDLw+X1Ic7`lvFiBPcNr~I)9vECBFN)1rg+QQEecog|@{rMoq&1DE!(i)+~S1(5U5$a?5rOkd2Y!@)A|+ zAC^zn{+u-pXX}OyGbb!w%p<viwx9@@9kc+eoI{#p-b9f!BU|(Y%qpKx<-P~K1H5I zn+_qNRh%9>?c7krJBdbX=BN&`>HLPW6!87h7+`*fx)7{NB7k@DIaU-T*l?^_*z0N{ z4hO5^#GL>2zwG;Tg3_mj?Nk(^$Dvo@z~N~0r-Yn&^%g0dQkvDZz}%m(*Mj|VqIyVn zi=paDg5;xrP%do>TZcP<;Q##Emp@u4|Dn>5?o^v~@v-1Qa!`q9g=fz-vRqyN&v#Tw zb^Z9_pxf0%1IQqmvEDMOz%miFDwlq`!1%iGTZ~rMHYFiOgelycQ@=JGoA<4o=azR= z|HSaP0d}U@)upj5C(CiVe)EJ4T)CW7I2&=y3Rk0~`_@zE@`80XO}1+D*?|gI(grz# zua~rG!P{;B5|m3J@-}sk!tS9PpOaK7_n#g5*oU(}2>MsEJsnv}(Le%_Qgay!dEPd+ zr@Ur3q_B(W&3(@d_|TpjV(zy6{x*evmPPBG+_>3po`SCW=0LvUq_3>V({_)j@7@Bn z6StYL3dMXiU^4Yha6pmrF$~4wx||&n9omd2A5eJpmVSoL4cin7!aamBBxMC?{Hk3| zNm$K_hdCNwEZy$on&P8U?hSZp_3kV8pc-BU?9x{JCFr+ZmNsgg6qlD&Cp)L5<7MWpkI&=#XH=452JfDH zBhGUl^loQcJ9RmTwW!R-vFH7MJ*NH65QZBol0o6l~aj>Fc%H z9SSfMP%0Gg={fWtY#9Y)x&dLuo7J(;3Pu;0sS^%_GX|GxyaPHH#2pf`cZe8KuQ%#m zBf!D{DJ-}#$qo^-1fOS!9$FlrMhhC^qYe@Ulz-7~Eq&`JhmHn)-%zdChuzOuBQnM^ zqxE+LTUjgKj!v3gz4cYvEYRRkFnJbMFIpJGzm@0dlUPYxn>5pH-*zYfX2{}fXte!; zQ75@QZTq>hF_rd9&FCd!&jIl0^?p;&rN!(~ir3g$5ctx#7v#T;q^=aNJIi_BS80>u z`|{x1*?0KS+*@%f5!wJ7?`3z%`^Bm8)w>*W1cgXY%!{nQcVSLts}Du`Uv^qEcN7(~ ztYsZJOH=Iu88k}BrXEF*?}!`p`FOji266*d-BnH6@s7LDE9t(;OSx## z!@Hy_2{czNIy@6*OQF~r)5OWL%!a_S`~oS(!vP&e#9NICf4RDW114?|H)%m7Pf%4jw8!HC+QQ-~^kgUIPMzumgO ztF*Ttmx7$h{W*NHOfw0#e5Qxu%z0uDYWfLW>>td77DIuq15Zy#ApdxSFlD#WBPW{| zL2(?!MhUJM;;I+|>ndDb`x`#t5^%5+a!di5T`Rl&Ht0Z2e6@`&?K!w5ow(QcWIPJ z)U5hIHz})v9HKAOgW^2dmvf31TRM&*bpuSze`PhxUw=wOC6tTzb4QGk@|Hplr7-&T z%CPrb^O7gi5@*tQAapnvIu&m&`ND06_|S6d2l(V27lque*l~A6yjRv}=1Mph3_Up% zC5?6xG^#ATkF1HI3{)AWer@Yu5w7nN+^q5~&?xg8+(M9+S)%2%s4lg?sVEbM901qbYee=y^T9mY-osQ8B+^e7xF z(N@Lm@GHusA#kapJ+wa~lAhb56dh7(9LxkS}ZaR2*H`wSD7GaBVEO1eeAw zxVu}>5E2@9cX#(dqX7bh0Kv79;1=B7U4nd-XZ-JfQlqIc`eajGd#|!#e1pCx?nn0DPjOVt6;Y4-*gAign_SP|wC3GKr9niT znQ-zq+T~!F5lj*oc=&{D3#$75<#|sqV{fx}dTWKE$OGe{BWF^1K9q4m?&wk;k>jxS*lGUeb8L090Blstcw6@e4DaOedEHE`Y?3wSaAhR0Hf9y1F+)lO#+;Q~ zHPEM$F1~rJAVbd^AQ}klhS6+{#ec;(DmV>9MT^!k8uwY^U8htZ+s)eXy1QSPrN{@F zrO|^`Njd7Y_ft1~zPJusVP&`v18GrrbEZnMdr?K$<6Hrleh z^DQ$r$t%D*9jI=pR90#AO}+|pe*k>?uh+O^wO8Z1nHJ^+TvO`)V^$1m;=EHgwpq`x9u2D`5&qODbVrVP>KSy?hWdk^Bq!k6-zR zO}9Jq6ge-Z>_aFrW{CDHMd1{w;hQ4=qRsMmgh854FK6S+uA$zL~w2LgrjHT=yo9rN1@L0sv}|pYur@6O(VsJWe!H>F(14IMf`kuY~cE7 za~f;LTPKzKCCARpRj~D!-Pgua%Fa)7aHA#7Ah3BlJd0fY<2UA^!#{Yvd-M_?(Z|2r zA!gbJ-o&hD7Rv;V2XP5w5c6@6B2Sg~TgQCeVB$B`EOTg1f9;y#X;Yj&%V7ZkhFU~Jl$%!NQxV2hlKFuj zhkt??Oe@p{nUP4Cj?g?Cc^z48ZRd9{J?aQhG*j4T@gTRFd*4?GJd-$VhW5PdVed{3 zNPWz)HdL)>aDK+R(a`a*8T_OVar=%fOJbBg(8Dfm2d|)$oI@bvDCHiuplm~(voP_k zV|C5vaR8F$!^awh$E28r;!Y5x0D*BPF%hi4ksfCPgemK&K$+)~t z$KDs3OATQ)pg0{>a4Mt^KP$w|c0Nte6+|VF5<|+CYWR)SA6OdF=n{YBf*EpQ*eDdU zWoX@)Cu@bC&qpR8XO8n^U)Ho?zfY4Z2AhqrTG)JfTm%6%ejke|^1sDFO|%!REtD@$!k35tT4&%AYWR$$ z>?*@zQMo937nN8|kSO+A3=kSvxr#nE?%Vb^!%<9haiMR$Bjx*jZ1ENyu?lmy zmnK+GgYE z%I{5gn5ZrYmE3x`NW^Phk)gjO_qSn>S|fQ|NB8#)YLqvym`0=lu8>Cizfa*m#d<%W z!N+Vlki@1~aH57w8dsM0D;9^#ZeRZ%VyEZemcyL0znd2j*e5a8mp7X)DKE;N3zy_X zk*xoP*WhnRY%2Qq36|jhu^VmwrNZWS8U81{aMrqkxhTHVz#N<3XK8)eZ5woR=3OeV zQB4isc;-~#kYUF88K%TW$fBC?#@gH%{tI4lqX{j?M`2U(I$+OHmlBK>`zDF(F}uyv=T*naOcW!s8RdcgQ8k@v}r4f)@5o z5KwaJcCMeOA2CoU^N2Slo(fcwuq_(CBP4e=UUK}sScNg6C*V-9Hvc6ti)FTEC0ue5 zld!7a$04-`s@UpeW_db=rP%E(pMoV_D#c}B(o5vsAPZ*piZAec8RB3EAL0+t_^3=* z@jT$6F{X?k?^l(Y{*F2y$z08}y4*3z^5tCh8r1BLw#}2iZ95I@`ZM!MCRaq#*4Jc! zOO2DmE0_y-8z(aEbNM9??ZuD)CTeorjj}-K6phbO=^EtiQ%OMd+o!id^R!Q)&|wLQ z!q+4b$&pX)bkv;1TX?h;jSOhm|18za{ajCDo-TLQ>rczHxxt2A<~qCJhfqDvL|$}T z?i@xrKsx(}htLGM1C9WVYKZnkP&MCf+)2|XKFL9%9he;-ViDUVKQ|k#?wzCc^(Z(Y zW=r)Ky&#u>knxK^zgEZ`BD$g*7G>3wg^z2LoP=sAh|Eg#kuo&KEnEuUSXUg$lIOMurW?BFXm zIT&hf>xWR8`7p;q zp0rTgNQs}heOA50hrq?tZ@FqtC_N?9fkdRERrkR6nE`#Qv*T}-=*vkSfEEvWT@?`` zts+!*ZBPgIf!;-{L|{1azRWga5mbiUANlA!E@gAYU}iI>}jgY6hP{P6sER z*eObr1Eo|3rm+h=w0OXRg#g&bh$MC()pG+pdt{Z zJ8Bc1LHi1cbG?vZ(t=B@EX5_L>9O;^U@5@gq)r&umzSqPyFp=GII2OBQF^>#H>*xn zjYof@Yb&WC$;Wqvbo|P*L2&fEPl%Ue;=PTZclrcA?Q^jH%sOQPc#FbTq!?C&-}A7D z@Z30%)xy43x%p^V4)NSJY8fcflYG4`Rq?{LGmUH$n{<6{bGUi7UViZ6n;lmg5I&`< z^*g@_7<<5fsO^kf_r0!qx;kwQc-V#DW}fYoPf=91Y8|Cbb25anCwL6dTwexVym9aw z`2(-a2XI^gMf0=y}om!Jinkp%RpI^yCy+42O)73s9ExsPOGsPOl1qcbWY9(iG|(cr$V|bXYBx<(ImN$dzXz0<+tZ9CtcN zNmzZBdHs{R{(i=6@jQ^FJTyq{-Er>MG9qp5gS}!N+E+E0%6xOaLK}BVSsC)2{)QIM z8;+09(-&>AM$Gd$q!$9*_!A&{GcSk@{k2}{rAWR!VFAq|es(R|+i$Ro_$Cgtc^$vD`U9T!4n>aQl`V&>6LS zs@D^RP4;&B|MY+{WM77D%GtU-FWL@W{}4uzG=I zd;2ePElo0bu`+TO0pT=x09)EnSA)IRC?z*C?ave0L@x zvKvHcR;%2=O(~f8MY)rhMG&EOrmsA2foX%~&|#Q-Uzye5LF_hYXKVh}aI9GidaxG8 zqEgYSpsidH0w+&9mm**(>^R^^Azy1-C;;>dN6qVjovu1*)7^p?8~5(dtHyD%4SP1vTQOE~Rca3Pg`hvI z&+EVaKyuqYjXs9$ToyiEe(9NV_Px8#thC^t;g59~Iix>?5>Ynv*~&E9ISCz4NEfFT zb3nBc>*L+cUGZwA!iAde$S%NSUj`e29!Z-FOcaMX{!6N63{eR!;OtA?w7N+~hJvLi zL}1eB271xcB&AEqUQcb0V{)CxR26u+f!iOlju>p^y=3|4`??-J^IMEOoJh_Y&Y!GN zkVe!)<~_wWWA_?RoUcJ#h(_o4SGXV9BY148dj3ew4O0$Iy3iHOZpqU1jP6h-EO3Q6 zQfdHUL0c|CPWJTTrmg1f-BOg> zNA^2%(vR$Vjto^fBf_dKE#ekOyUv|yNxRPD*)67A_plQmd_6GLQ-ay&psPvY36>5_ zCDM->QcYZ$5tEUE!ka3HmJCWpvv3 z_Z27rEM`ZJa@=*ajEJ*@x-O6@Uc9y=$k@FB4iHUF^fKiO8yp@D{~J<$K6^ zxFP$B53|ua6Cwd(JhyBIWu5k*+67d2RlQT}^vV$BTCfWsc82IM&Wcn28?Hc*g zP8Eh}JtzYu<#FAa>O;a^E5d^RXXDg6umQ!gppmj*;`#(jNFg&+-~#+5Q{8a}P&pSe z|3TRBXNiws?&8z5S!3aX&Vj_$U&|pc+Z?9oHxsEv^ z%Qqnwe+|fm-Gw>6a8q^D_yZMf*`;A# z2v~0aF~cT8grz57t%gCO5I~!XscUc`}L=SdQ#kgBKs_Ipc%Pu`zmNl7eV9_|hY1}0HAMPoj!^;Ss_%sMG-Ei&M@Qw^#}oGSHP=s@26Z#U)=ni* zvsQl%zxM{oYlO}g*Z6Gl7&)x>_t(?Qo~psU&;Mt{W(FVv=lBW#?tlR_)rX2qTk3Sh zgE%Tbu)ikg2X;d!Q0YHb&Hw@d0G*cKBZ@sBejxzkp87Y{6F~^U-@l{n-cS?i*095s z?WP$A`Z<8XyW1(Qc=diFVv8P_T?3wQ^C$fND7VlmsWL7X9o{ix!ou6%IziK!OP2o% zC!aQ;_S98vNwVPbB4cO!s-j;FLAU&I)19URF6l$U3>X68Xk~tW+78ap^OC#Ch*!@B+^36@~Y?}NiyIVYe5_y=YzhT%9yfZ~(WCWINq zE-ESKZD1);%}%OE8hd@6Yjk0SE@X~a6P;iA!&9{mv4rD)pY4c0Wh#Gr>4n@L^I2ES zPH~Vy=TmoD&+pbGy?syVnwm*e+3V{;;VBUXQ!esy#=Behqy4XEYr8byOD`0pjd9_B znt(w~+<%zw0uK_~d^jXIPh_hK3CBP8a?ya4sDrKuYgrFz>j@hN5StH+#;aQTqpb7V z^dqE4KQK#451GXV)3RcQ7Na)(4^xc@OkfE>^WXz4@>hAMOz2y{95L_>9LNvx!Mp(q z{By9Ajy8S>KxRW|g0&Im7Tnx#bG%}Wk%hLa(F9V61CzI((6`7n@lfogUy>(9yAx%A_Z_05%)K!CEn47BVn+ zcW!>VZ2_d)?_^KwX1|8T@z_uH9FbrDM@%jmTv`d`O;v0(9PeNnwQ1zYZ_F3fOAvoX zdpUDKrTbh`Rm-e&`S&cJPOT6);8|O9k(xdbq{@h5T|HWBRDZ-4l=R=@Z5uiX9I`eU z%>R4+*F*eq2MKnRK@q2k!*OOO0dds~{ivjgIMa7;Er(Fe{aY<)9Wm5a-G^?9+=;As z^PV(5n3%r1=$6C~2Y{$YLBA?v-hqp-n#%yiGa;-~?8GYzpxXVTvB~{YpgROgK-zlL zn7floP;o$a;Db1DoTL-)Kh$>-*7;Y{4;AW8ZOckXsR#|)+9eEWCAsjR%^9aUgxd~LS7f~Y7Rd<$mNEY(pmoRw)X@M* z39Yw38+@|~Jv?vgj2?E@V&fyy4XL(0r6&q7M%?C)w z^RSEzH*?xpKe&RhIX3I*e|&p68GDNii`dV`zP17-+ZE^!&jW}? zc0dRApTC4D{_*{7XcgWyI_#fm93AN7md&+Sz(zz60Ly?H09!*v{SkoirBUqWA*`T& z)MTg!9%yD!QnydqAuz?;RB%_^n6T0qrvcI>k;Yvxw|cJ06ys*4GVsFne(FN^?0gv) z3}ARYQ6b7r5bIhcX3Ag@QK0P9aY}Rbq^}9>9v8xEo za!3%cNsI}~rlJoav-nHOyCCG0f>r%med{{;sM$b801@V0w3ghkh2~m7v%FNlMsUiP zKISypDCAUCW{aqdQ(FPEiR>`qclzrSfuWIlX*;LZ?ZR2EjKn@hFpm`_e`WtW9p{u( znP>I^q(8VcRPL_wj7Ey;y(5CZj|2HNRgvM#@b=k_4>i~fu2H`{5)HjU6VFQP^t(Le z-~hMws6Awd%dyuzqZzF!{{5}`{xs6tMr}>e7Bk^o>!t186G7~fZ&bAbOY_+zM4Pd( z#&Pl_2^KjhNL=h)MoZi1DDjn(qLPyvZE`Me7A4(k+#?oDr&<|(>(j@ zAZeYgGjIMWbuHMb#dUo5&3zdSTbgEWY?nrmO=X6>UCpqi+qUWIew2d5^YXRl`?#eZ z9UYO<*ea?kV52i&%~k6#6BI=f6;veRN87-p@6B7iNR7j7TA{R-wXb&=(qL;`8DRgh&L$3uK)=VLU=To|Or_I>(`9?+= z87o6g0ofN{_8(m23@Ybm7psQ9QtIIh@hq$^EtY3wsO$Y?&p6!K8hPhwtU8?1P3f6i z^lP`Fld^J+9^>$%9V4v#PpRR+gn`iVR??>VkWg4!kQQ2Rf%Kmq%FW!q=@M=F2;Gi{ z5ysB8_4lz7U2hU3=Cot*ImFgR1JAGvzM_oDjU$MC%FejB`KX*A$HFC=ueT+#8C87& zMClBncs3Iw2vcKMg~b|bPsme?^NBt!?~#rF8lbgtFd2xeuwd98buG0?34dyJr~k>| zI1pH`OlH7S7G>hUnmb@6vQDN~X+FeyyX{eT#Kju*U+1m&w`8>QoH|Pzwa%>Qox4LP zqXFSM#j83e)=OQ8|D5CLcmyk=%_-Zi^KrdKKwN}V!hasR_XOgq>+MkhS@xE#e(zq} zC!W|u5JnC5k=KM1hZa?QF_;$s4q}XY&IfV94L_Qk1W3!%ZQ<;98SP5Y%fDQP=)F3aNf|LrZpUFKWZG+#KW=<`+M7vKcrMkCHnSkH8S zn~)Idq+56Ov@F6yd-=4^RvX}#I<+;oz`Gf1bh#`BR{C=pO&C&k^8PTeV3&3-tD-<{ zoXtzphgWg`q58E`CYGm|!!;rC%*cv0 z<+sj>+}Ak@aoeJchkKd#YY9teS1JU#Z(euu%npLYELX85?%?yCWQ$#&{WkeWl^yjMBA}~p@4^T0o+_Q|FD2nFCgs}w1`a| z(t@dR2w}tjP|W47TJ)FXRnv^FKWaBw;{r5ta4*>k#cmcCFpsm0?L_$5h@@v2VMKhWh7%Z;MZl;a&q|V#EH?>1 zM_Uy)H;MZ+LsS=L@@xgBz*SPFS@*iw4)Iuf2zy-zS~6_&>58|Y)})W$ikr0SGUa}1 z+bAd0!jz31D~z|iY>gc&-2Lh@X?*CGV}`_fd2iB(BMm73-JY}5x@!jFySaL2mbyzD zC@}wUwNqS^)ny)^d8b!2g^XrqImO*w-_Kkh6@)uf%$0JrL+uAj+o0&j49YwsKQAHj%)6$?pVzQ|a_S^j{kFhh zL{Y}cE8_RH2PQ}aawn7;>P7Hbx{z`(;utNOb2d36^Q^%;_by@y0e6c?eTsrWNjamm zo*~AwHsJ`uu^Jj!iOPtFx#!M=r;4hMpN(9Z=FM+D>9I^6&YCxIJ{7T)7mO`p-bN*Ei>0oJzL z_kwr~aVVlKV5$9&a@!R(G-N51#ynA4v3nRnWB8b2`EV+{#<#6$97S2N{O19E$G1IQ z;OCyMmP}V3Bb*a~2dee=*}ySdsMr}%We>d>WRweI+)%m1ryH`Tz~1AhH{MsTPVdMW zL1)C_e6wx1%n^++znR>McDKyG_ob(?nYn3St2R*6^|+@m<7J71B;PRJwPBw_1ORZm0M6};=~@x-3B^9ix_)D5~^o=i?1*~^ys z!pwEZpML@mterrpe=8n~l5ZopicrBIIBpZCTgjm&hSoC*6MrKq^IF0V{{}dqTMSEn z9PCH-5ImlrWsf3=_$IQ=bUa7%_^BRN`2Nm4CwQ?b?Dryv8Ji>l4XP?BA_@{;Tb3nj z@uL3bP4gmY-fkB-Q1uA%WltgKIPp&c=E2xj@$|B4(5DvT4Jk(9n6;<#F_118t}}xG zCD+#jyN*go+Ykc`mi zhPohPlXCFi)BwzAmnf?_s|2ZzpCm{te`+`;;ijhsWZQjU7QtrNs=9WT1d3uq6!8LT z{Aq>ZR1zShNQ2S5T+mK(Sy|=@2ryzW$w?K25=*;gQ;NAQ2NsNN{Jy7nPcH9NeiugY z4;`)!|D!u58fe8ZV<+L1fVJ_Zfj>g36;P+hEeOw3RDyf^;J#upAe zkcaZGCrBjRSuH1sa}j_j16aZ0TNmAC9i$1?v)ro+Qs23ro}X9no9bue4HRep5+^W? z5RWU$RLYwt^N?IvdCBdg=^eze@bm*enZoRJ})pM)3iuD zWi%x;%Xy_$JvE|q3pz`B%_N8zVuONxQIMh=CMgCVtzSJS+P^A}zoQojQ3{l|s6&_} zoj@0QSXoQSskaZR#;vg`dv zU&H))bQr9FioHj=pT;vqI2C7=4)_4T$qm$=o*=lC{>vn*i2ah?8{>SFnb$3{-AQSP zT{(0JOkhl=eW%*491-kuhAS;ZM?Ag$bB5#+M8~P7x1RV4n&AQ(iw>lB=xqm-ur%VH zoLD28xQ`fd2gE>L3@$(6hDx$A=^0nskatKh?G`Yd-4pS@-*v2I#Q-(hS!+yPDzlC> z7$lZh)2!HFb0qjQ+)gng3O~fHXtH|$Z%-ly1&hIsTjrGs2^iTDN;bm-{ zp1gApmSTDHGux7tDG|%{*qLnjL|$RcnLT5L`5EVG8Og%b8r?bta zyA91$PC_J%-IHt9qc9G8K#Q}GddoDbEb&5L_R*X!AHIPbxYTn4-|ZxYX-VjY_i2?o z4(N3Lm~Swpir~eFEW=qw-(+?e%28hnxKc8XF&OHcAAIGbLy&$gLzSYu8n4I|e;4lx zk;qPw6Y;+Hme#WQ&X1v}RZ3?~i$tg-?UdDeVb?Y9 zC28JjG0T*OdY7!Rw*rwnLXpp(%lFyS4@bv z6cd_8I8boJ%I75h-n4cT$=Di8*a*wmQZIa0C~cqka0$s0g{@;uvkGOygOHbV( zER#@5b)5G+=FJlfzg&p)UicHlg($elzL!$OC{>7{M4_%F^gvpM5OO+##4S-*4=#331_z~uwzX<$CA7z#2WTJSOT4|Wa20NR zIcsQTpSh|&J|Oi*|MA_xdiph4Qj0;yLh(r@MUC`hydk+Y9`~wi+#YLQ-(#fXW4rrT zv=SjMjjX<)gi;Y3Id17^icfwszE;c8B!u&x`LI1eX4?LmgF1%d@+$W{9-*_cI2VDZ z6kSGEx|FC!Pvco{SHa>&-5-RXjZ|se6X_%ru<;*j^sRPp75$S?>^yBzu!Sk{=((u zlQtYerPYO|aW~w2rF8@JVR!EM54gys<&wOxTJQJxP9mY zE1(<)5y?AkP7J*lSggv;l-t$hl%+np7(j>3?PyyHmmKPnuRk9{* zy;hoOtPk#L%~I`kj#sPm*R%ldzfh~c0rAI!RZ|VT`sAd?l~5LHaD!jeNg%w+iCXTd zYR^P>YH=~o@LwPMF#NaulK6B!@soDS`CD2r7tC)u&bCQ?%)F&g<$YdX?Lm#^iML@G z@A4`0$98^` zm^>| zW(e|N&L?zvWg(F2iNnv2lw3FeRatb@12+DGH}*g5ibQeb<;e_}rX-Djqyj5dLj3Nd z9$c{T$8p`IHzK^h@}b&Q%HJveJ%K_k_XG@TR7MQYa~QQV`Q;hp^>7i z#zN5drG_jYikp)2$@qKA1%#B=W-~ms+(bxH?{Hq1JIgs%fI`lgKij!$86&t<-RJwE zOG2!W`S8YmEYK4eSiKd9!BoUu2#m(3FTP;S-;#!MD_{$VU^X=TXNZ8&GO;mA*rekyB>o zw3r(8lvTl4YKxY&FVR5p%AL9(%5UnFP?me4&62heP)8|9UM*}!?sII!Cs$F*<6j7i zgRL1b%zf;*McB7`Gv?rhd++6DEM5zP(H+!^u3ig{!rNW{ygMnf13WND=hp! zAMBo`Vu%boyTBe~U7j}#6eR<}7R9=tfe?Lsw-i-rDuLf`LK=zV+*`v*@t`htHCuSC zM_<1Tv&~hOvz=_lECg#3-Aw)2SE28yQjC6F?(#9IbmJi5MzK?T@*&>wV|d@K`5Tuc zw#agpk=-4&^6Q~R{ae=Vh2s5K4wNB6UC?QX#P|g+1tnl&ywpqk9!OzJiWOw<)zIJ- zs!D%;un+0mo*dd8noKfe^DBG#`!FKz|0HB|px{xP6zK(Ro&Vk}Jw!FQ$Esp-lT-ff z;KEl~@0rX-O7D4>HE+JsUpTF;=24~jm(Of{X~mKA)vrUnxTDH7y#ZlwktF&3>`jIl z0woVeF``MGPOk$B?CTkyJB8V^UYm7!iAw*x3y0WG-`sh$ZframOFC44`8-dDy51qz zr-jl~>)DH33^vz(g?Tij9nXu8J@7o70<8fTvz7AKDgPHXrkHfsDB#&#(Jv%=*GoFf zR()H$)K6Yvz(VxNSfZ>$8*LT>)@IRYb?ov+5^DbxM|>x9c+E~UUN>zd%B*8%JYPuP zFz0wTUh7CCp`WTbO6IqcYOr&D>Df5Rj;*kfit0Q))8lm$bNIeEE9Egg)rT@8qq!VJ ziVRrdb#SV}Eb62IU~08!P&Jbff@z#Oi+1h=Ni|>0ln(vcd4+r|MMAHs(m(|$KC}ap6N!VuZ`T) zg>QSN9J;zMDc{%~$BS>z$Q=i7KAMPm1^l7UH<&NbB7eZfghT3>f%hNYioFBG^RaF2 zt9#e{4TbpdKX&0A zi*)qUOL(teGnYQHUO>3H>5WVe&^_&!n-X*UhR5kZs^)1)QNTVe*`2iqyIc|Q2)m*| z$JS*>ifIJTk5n`w=PlMCPk&s1tDdVNKcUI1z9x5V{^~9{yNOY8t*QsWz%IIw6x(g- z|FGUThW8GL-hcW&D7?Znr7?OaRjl2Y-K_hx+h(%K%GF3nYlpt3K`y*AcqXT!H36K_ zgck4`)kpAeLA1OwslCVpnf05g9Jgpw#*0i;W?#%yB3lm?uQOPM5Y$-=yK?F39+2xQ zwpCAEV<#`(h`^A3$B7FHiL!Ab*0+7rw#64PSZ5z_uv8{^yw0KWzYuTsFb~5|lrS^n z*~PCJF5rak(RoldYGzT#;VPK`GslZNM)o2auoQvxAvlqEV001oK9(+|#(A}WspLSC z(BES@m`W|6YalDQb@fs1yXM{rY}yyq$ko@9U^cG+0=(0QIgHc7wpR6EVNlIZ6Pt>` z>i1a#R_nB2AQ}D3fs}vr1Tqk(hVT6uq@~sV?>%fAc7^0 zhKDRx{du{}z%UwmL~P#z?^C#_av)=vxH)U}`;bZHKV(Up>MvX@@$WSQ|FzVNtvgDr zBB>*wagY7m_GmOH(PMw`>n)Nh9nsaCb1d}Qc)a2hdejnaC&C0Zz>R`v1vvVq^0F7q zJKhA;(QGBDwq8g`w%Dw>feC~t-+DKTkp90R_b^;_?@u2PAxiE*55QYfV?x0L5#Uhu zYM7S;Dg%|y<{n8n;KNh@n*l6JlvgZt>;yF*F$E93t^XKjgd!NUpo6hT|-!xyS1aIO4XgH8Wo* z?mWq8Y?pWkn7u1?s?eg zY(=Ri_Aeai!{ly?a7+4?R2aOCdYx5gX7GQ$w`&I&td+7~ZI$`{7b3^Gk+O`|3`{KY zw>UlH1;H<&U!r*CKPVVM z#5&WGDE7bXvF2Mz$xP=ir$)8ZQ5dP3U|nEV z?5|i~!KiYR8YZHo4Pb_j~!-taTXPw2zMCno_YgLQ`i<@8c>1{gh zbL#D&$2-)hueV=*t@M0V5^|8$a>5{Q#ch21ioMnj{HEC@p{l>tkd_+wk5rBxnwH2$ z=@jt^Y^#*!$e`d9AboTW!R(8)l2;bX&>jD9Q%c-tYVyJcU(O;;^+WQSH^?ie0e&}h z9^Ud8nIO-2+}n8jajstugD%SPpjhA1Kd!u+g~N%hByZ=6BkYikhemhQu=T*pMSX09 z{x$zN=odhabt=Nv+Bw&?wWqNkaPMm;%xfq(;KX*e`5TEjR!<;2YCIb!M6&NGHP*+B zRN%4)u$Alsg4UwVM6o0w>pd)b%My&9p&!bRqZej}z){CWdM8Gr7fc%?2&EQlzin`U z`wB>mxXKV=jDRy-i#Xf|gedo`(#2T`}60`{ZaE$Iso)mJqX5@h9c#*sQr(lQo7%yDWBJEZa0y&pXr z*z`6P=Ow}VNZXZd{~+k{U04tuQqtP;yyzk|mM2&ASgO8NULfI(0}mgro0h8J9Mk4K z5H=S^3mCa^Iw}7xBaIRiHuN#pPv-{$ZB4ZPz3q6#|7ih`G(q9T>ne%sIR7HWDBmKn z*)DI9p`-(N_N8m@o#tW1{Vf*ritT3fe@Wa9tXsICxsgKDNH?ekJp@_On&-uVHowX8$9zxzTbFQ%soTwdG1ec8G^`HwPX z2v|7^1H?OaMvoilySL;uzivK{sn-VF&P&&XNPhHMafwZe+!jPGz-BCWWXKR40B4UJ zRBoS>aOYdl@+a_E+J;HTF&NlXth0ynJg7Ud*;Le5l$yPLI-VgD;G)s%pI0phJD-$@ z8Ff^stv$Y1{xACpQw~iW36cr~p*Ua;@OfMBI~mVL1oo3sOo<5e8;VD7ovY zQ7;Za6X!sc0s7zLZkZxv+ou;hE{EGfK}R!(j~i3Bis#Q*MP8nv^DM-+>3g9rcnM~2 z$(sdQYyYN}_`p7Yq}Qa5UYyPmQZtnv6N8bM@w_D@t+iyo_XBS6N2eb0Zpu(N23T=d zmW`S`z67!{1N>^D_wL{CfkK8M!9uRDxT4Vf{B86i>q9g)I^tr_5dZtpH!cqie>En; zB^vO!{sdET{tnew@Ff)H&`n;I?Awo8D)}J16&{OXE<(GT8Y2JJxoZ{Qar*n4KI9a6 zlJx)3W#6Bp1dKxlc)VIK2b;%5*>h#O;un4!+#}eC(fp)H@b3I=fGBj>5&^^4BE3VN zIlHEct-52!hRTa^S?ALvHmPj9oyie2CrE*B5v}c@h5m!1HHzxex8yJufeEk0frO1iX#;zQ5=@Ii(ycH_I4{>O>NRD&A#= zA$r@2>4C7{Fz3*-Xq8;*d2m$ko0JvqAtW7`C0YGa3?Nje!n<==4zcn%i9cZ-u4C1tPsQ>3 zJT1;29>9ZrOK+XJ1wVet8t7GB8QOjEGlF1Tv9K`1mpuC#k$?ie+MtPc7(i#YDY{!J8y2clw$ z71-!NpW{9>lMo|*aAleRN5yYR56)_E5UVCPk6VPLn9sm?S!}tUpQx?5ZY@bGQeUij zbe!UH5)u-wIbfP&tntRQw4_mR;X7@cAx;*hY@fDcGi_@G60^lTdARnT4WACvk4Bqe z6hcR7PIoz6R9-xXjO(#|#*VwxH-oG%TTWXi=zC?a^idt+>Y$D+hF7IV-~}qhALyNE zfJ|U3f7%wdZeJHgUAs_rb=H**NjBwO$<1S9Us5Qie9(fv`T&aB7hUh`2VtoDN5pYkMW!|^8>bZ|CXEbFUnT&a5=MM zsbJ-`)u4MjDQjBdn&}+rT?I6oQmsUpD!}Mw%z^YQ^V5@ZdsZms9ZN;2$XR(o#?$S( z&v5g@ezRG-%=7g3Y5}LPs|(@IVf4NB@y^7qOYmPCoYYEmCLIS1rbdVf>+Jy^hC~J4 z%IAJPrTKpI#6jdnRk*sqG{tv*Z{j6ysn$MOe{7S_i1x%<)0-;hMFoW@cK@fHVdNRj z8V8&H(rYfR^1;JpE#T#3=k{|3L76W=_V)GwsEUtPX34XFm^mh8_ULc90QnnxE2b;Y z5fy&W3Fu2Wv$*R6T^5Lz%gxjCN5~h6L%#(D&7T)Vnprq;@hOQNP$lIBxaRwV+;|8; z(ep^$h)plu=xhG3Y#sM<^g)`QVljF!Hdna_AtWZj_>36yTzK8B zeIRew&4sy|dsjqn6GLd*>Ps^Wmoy+H_#ae35QbCMLBGNk@@|TJyX<`#@(R5!2OT+1 zwvY-@{MRydxCS&V&R8A^4e2lVknrB=Ub>*oksL+O2~-lSv(O*Ip%a)SqALpFUAF=p z-47mEihQGiftoMx{ed`?f(3$_;rSeIprJ)HF%N#|t63f?cj{Ef&V~Y-cva;)wSz#3 z=Jj;oBKN@$etEb>jvFDWEmkfR8f?TjKGVeBB!&w_jRmL#6D{eg_uPAt^6ISdPZ~Qg3yhitxUTq4#nx>kE{%BaJNY2(y+thY4)2?b%N@Rn( z-2%edTf=F|Rv&o7-!jc=(voCY-SCE`UZxRIaJ|VY2%g@REhws>0m@X}szYXgOSt+U zFJY=!rt3RZ?_#Ww=UF5IkmmnVpY|^ZhbxwR9dc|Sf| zKV-7EzZ{(jYg=T5xT&zaM#~A%G)8^RwS>OihIJ!5RdegNkLe6W#E*l?puUr7XKOhH z>vrmZ1^yclC4T!4)uzvcVg*QuKJ<_Fg6{xJ2kvl?0n7iR>8+!p`rGbdLO^OjN{}I? zrE}=|BHi8H2t#+rAR-~%-7O*^J#;E9A~ke($9ue=_xA@2Sc{o8>zd)5&)(M#C&}pO z*7^OnsWHfCEWQ#!G5VDl2nIb^j;lq*5E-srIK;bQBNPxE{No9d01=7D8^sU*vb6!r z!3Y0T*SeRW*IN0j35l706$^kKT>4QnCtdbjvle*#j`5dOpI>B;@3AJRmVKY+eFA(; z!C$j4%$ud%2y`9aAeEfxR2W#Ru`IBI>P~aXbNIegPee&Bq2rQE=TO}(rjUry_p*Q( z#FL9jN>QdnMPx8h2xvr5Nzs`v({aNUTw3VSiMI(Fpg^-MD~PebLNge?Jn+|wyXDVT zeQnPN3LKGxl{LtvunOLRGnKS0ocq!ts@L)YT=bT4L~wAm!@R#>!9y!U%?%t`xnW(d z0BV@jd-Oj+2`jSQ%%a-5fWZdD0j%&3lQ(D;L!$ZX0c^SX#&&@z9xZ8+wY?YiLmcX=v09DpAPMO8|Wr~wXA7M@u_qMZg7 zT0JCU{g{<;JyYlgD?n)8IZn-Lb*bjuFV1LmO6QNr{eq<;7A8WFeCB-E_dUmqaIw zWUfz0Fv-!9vgVq6KKrj#~Smh^qcFO|hnd0H}+%6S*2{ z0c6TpacR3=MA^PU?7=)e8TWTvlX>EX66+yvO8Tz(uR8d3KYfyCDTt%Cw;1>#%aS1QnDqK{SM9JnvTrg zkV^1igm;LRf@?<>u-%sqz3S@Su^KAwK9GH#n=RbBxw=Aep9Qe#CU<$PUnHUmA;cd0 zJ=rhtinuVNzM6~?xV67L)ToBER2R(rl8I5quyM$yi^J-P0v~qHe6?lt_4)RZEaW&4 zGD!>)uoDoRk_pTOiqMD|fu;owkfRnMf^x7sT_heJia{~5$_T0)Dp6x0IKKm4BhP%gO+SSs5){bD8F7?lf9vG_JH*p?45u>qU~UnBUP&SbnlOc zLwJX_KRJGgX4juu%RowqYw8Zsj@03#*!@0@ObJKfalGiDIi!YW()9~%)0fB{dv1?j zmPWE=)`XFAWv#X7%E5+Lq;cW=cwOOCmtbAU3kBdF!T!a7Fm=RHyB)m&NLCO_s>}IW z5$Cv6G^or+c{)t-dGdm;SdGQPSKnooa(ED>@P)1Mxu*Vf+B_mk_lCLa)#=Wu-uI-D z&R&fQ(_hG;9}@w~Kna9Pyip5Dp{CzY10(6fh|e-#ZD$@2cYw>7aZ z-k>O^mWb_%Oy_cLuROUTLGFa>BpN@BCY7^As`j)>!iR(5)zELOC8b|kAJa?gO_4|I z=}>+P@ZnI!*TEqLx(+pn*sQ1qcB5IX4sT7`tXW5f2th?X%{Zs4dmKxaf)V{uKIaP0 z&#~mh^DPr*p!SA$*{0@-myyXl-=_4eFk;|V;UOAqrQn5NrQtn$-LFD2G~wn6`+Yr} zq^ixHFp3-4>!FS5R2-ayB=l63wZPj)C-cxLMaS#yrZ;?Wt>Z~kE}Tl;J!wT8ZMc(@ z@lp!Mjoghzh`?WPnF-@0SLElZz*#Rc0jw))+0^jpBP%upCIxwj*5ey;UtsBqlznCAGAh>gswT+J>uRX2cp{%f?_3ND> zBo_VURC;lJykLuwGdOrC3;5;3p2Gin1lL^dG>=%##1Gu+08=W-qk^ndUIXXMJp`T| z?|V#4H#tEykP$L!84KHMCheNe%xVwrpeLir97F6aCaUSm%|4zDoxB0~ad} zNc>y2;-k(g$u(B3*CA$mPE8uDpj{cIJ_Y}1cIt(=dvD^TLxID2jPBHndJ2BG8A3ct zDf)NCa`IG0KXXvsK+WZ9Z5Q2}-(&Q?8|rLd#8s4`eg%$)!_+H@Cl4iXQKOaEuQ%iY zswN9jv;i{yAd@!BB&#XGLrK9~mmTo1_V8j*iIhZS=2={Lb(>^H3RvfxQ)QF+z8T)u zWEORnBqNTOCQFHpw^|w@XMRhgI;rt}zyA`j8l`aVzAGqH2;TfX6!h33A(P_x;8eWA zk*a+=c25;*Wa8bzCo-P0i zs*3pdrikQq(x0*fVR7v`it=(rIa?(k7u~d5KLmIdB(l3fx%^Azf6X)t^4<1|h{gXiU^~3KajfjcjetUU_znfOU5t^zGez zwO{jUGGS8+&Gfb~8vdP8&+R+f1Sp=|hyig|#PV#ZPu z#S-Uc+(2ZGRQgeVA#7N)b1|$63TlSTtdYE1=@O9bX*e{l^Keqh`bsziPIvsFLFsGe zOJCh9^b_$rX3-FWptN0D?TDOz%f}TOQh?2mN_kHGRyb2d=?>EI!>j*H5J9k4e{UAB zM=9{`l`l_@0_!^$YBy?`oS=vA4`_~D^EW+O@qgOTwLUC>E_~*amtS{z=C3GmFoY60 zFzRP01fdZ*-91i8`d>c~9{;Xh1Y++s9Zk>srUeU3`!ez|CG{?L zH;oqxl3Ec4*=ipsV&oh4$}u_9+u*f+xYk??=4BfZ1HSvGpV2w^Q}&-)F2T9wBW{%T^;5;eUzbZKYeA56X>@$`A1m{6zM9>gds_u zKVcZ>+0miSAXSZ$yK+X>$Ou^6w~7$Th66kmxryez@}J4|OYkm~-(n7bKfC#?Wc6(T zs8t!Xnrv|SyGH>{1Kw#l|FL(7{n8iV^2#_`Wdf}+A_>Yhe=vib_vgRxss^#le zFJlj4*V5e1FC!lBTEuP8JD*%9@<#EVZUEWTz564E$#aLpr<3v^%ylYG6^b(&o5kP< z7N$rYE2U4}oR|{i$+Nr(;ePee-QfTQgW6}|^>{H^lkN^F; z58`+jEW03)itE`O;obXRpzLhd5`ZZaR45`5))Pn~Y~UypQ9Dq>>KGy(@5NxS+4^Q; z9T}k$a%`~MeQb4@8mPm5lEX-QfDg#8u-y>Se}NHNZli=%a`0D#IeIF~b6kV$Z62&P z$8ISg5bP7B_dXuAlXpZhH@`D5DwA}ra&?wvA&AtivWSv1l(v3E5Z^=?PZ!>n3q7Q(7gegphNp>@ znb_2*XgT==TH+Uu`RdW@@S&|EWXF0mr+Rtt0MjV%#cXQDxPJ|c34ar{&rN9$#HQ^P zN2-T8<1i*AULsK7^+MOyV;X4t{u_x#<4@u8n=64RR-A1r3(e`HWdHB{DReFHNI|}p z=SX*f)n$(uBjP~NbuTTciW`bM_*ee=h}l1Gzw7>3iXDTNaQrZWW}Bg{y*d?QKCy%~ zeae;jK;6IKigYH)W8)==F|B8mQP4ROj=c=lXxjZ%Qg>2NLM$O#F$H9ZoxvRCK5&!U7Ax z*$@jkQrs`g<%2`WA zZg3;7nz2M-k>V)EhmrksMN&A1l(OJKFk z1mRWT)46aa?dbIm4-5B0oENONKYK-<2S44MZ%;}{oeULg;hLnis5|g`Fjh5gLm*0c zg8CFWd;k$799|0U79LARwN3bveW9rhg$FOz#{nNVx_eM>!xe zTnZD=F^D6EG!oYn!t&RF36*gH6?0+r>*cO%WoiVZY7+mF^7UEPfd$*n6Z19XWn4Mc zS1l2cFy}w8zQYrjMX3X>2PLfoH3de*4O)HwCP|DjSRso3LNIu|1hQ+ zbO})y6m9a$AGwF7*zXNA`hqCU2Rg0oif&)a%i!zPUlNr#R`yCq<{#C3cQsYauL<^=laX zWr%b|vO$m8Zwd)*^-BBvKq3|uA0=6lf}LLz6AWeUk}ds-ii=#Rsu57^Fs>&=Zm5IOsisv-6K3goo;@6IfMSLIRj z$dw-A7yNqE=MqABo4j0AxlKS`E zG%-@r*B$C%2v@Ei~VUzazyf;FKU_#lZHSD&g4jFL|QC>yCt0qN2y z35NVgCn`g`rz{262gd+5r@Al&X@i$0{qp(=J#@RF99A933g>|MeYGSb4{NRxn-so` zqS4_cN(Wy(cljlQVb*F#4 zoG~D;szVX1Z+ShLKoTcpF!$D_;a}!<*%9AQ@zE(^L-CC*XU*{|SwB`o)=BSd1hO3V zvi{0drrG|3?sFUKi|z?}+rXNgcH-vEiu=3%j9Rh|=5x)?=m!3;n+!sQE+v6BjIP}e zT60EOnelP^!hZ3swY#k573~fhjam*GrbborMa+TPHj@X#GXDQHY5~z$8eqkNcRF)= z(+|lxKP8e^9Qb8iL~L}R?@R~Jc24`kflG^sqm62OS7O-tJ)U^(GwN^@Nnu5u(4@0&-dyoHwE{MF;@l_IqnOWV?aGa9yEki`Qp^&mvo=s3=22w7F1B0y=+?R4x1n@>~9>EhO^QQB@gF zTz9YNySASQEn<8@E1uCphxOI!^Eb**)?T;Rw8V|FrmMIc?@H5TMYgo!y-RI0O?Wgu z)(9d}W3Ml=PBT*e3xWAJC`9G@d%xvsDqmg6Rc{Em2$&bm&C$v93wYx`P^L4sbxm%k zW3hi`a}cu&B;)bT#49Z;Ilb|<5=kge7o)s3oVYpqCrAyyT{~V;>bZRsO~5UO;L+1D z4euGvgv>7lYLH0qcm~5y+9!9nYJ8sCj1SIpboq=m6eKCUPIb7HAq+y8)A+5R?>UQ) zO$J{jc$6xK5Ne&8nV*U+#s$j!;c-xg{ zFqg1R3P=9!uEdn$>_**>yh5cD$`Pdkw}eiI#KvMG;Yp(@A!k%174@pn41e&34dXW> z!7HP|A?mB6>aIEi!2vF{VM$H60d!}!MRH-ef3`Bnh7r^4#)3RneJUkRWTB@b;_*59 zufhlMmJqfT5o6@G82pp6)r}QnvLMRfTNr}tKJm0K)Ul1$g@HTp#OBQJZp_zpl&?0( z|JChNQDX$9YR+dXF%%9C7l}tZD~7_YO?twL!NJ)dzYxr}0gph~V&5Rur>b(|dOLad zxs#JNbOMw>jjFhaZ!;tnbn>sN8ZFcde}?bA$MhCuTR`SpJWw=A|GOfvnA~Dgm9vtj zP{&aFBOs!L;3QK|Xx3Ta=#?tQHBTq+*Bk+&PfNXx+uJMa@;FP8$L1qcNE!+{>{t3O zoKDF%6(9H{axL}doS+k~ugOm(T(d_nsyLoI^^sVxxM#41v&vfRrHZ&taAemQ(fTM; z(~??GehpWVg~;*XJAht=Yz*FBxQLJGLM^=d24wqm2&7aA$NTh4xT1#2-&4Zexr((37Pr{5Rh{>BU=g10m9weh4JM$5_&L5_H>pIN&6 zYr)}diGXP7?zAxHw2za>8fAQcz+D-QaQ*VkjBtJFBIyYEP*&+d_k+#YnZLD&&AxKx ztyw#xVYlA-I8nCv*z@V2N0wnRHDTDa&5TOv8eNqzfrdveVz1cXKT9`UAufC0sV@7a zd8A$~KZ3f{7hn$l=nEVvLTCd6E0YGO<+WomtdWLiw|};;@nGGvXmB^0lJcnT8joRc zuZg7-a-3(Do9qnFJdS<*u%1{cIHbfc0MN)X`RIF3*!$nb>UX4PbKSF~4$dIR0&At8X(G@*Y_X;TsKl+M%1|JAz-fbLXdD+*At zT!i?|9!HGETWuk6j?*I3KxCA8j)6^ROJ@EJFY44Y1$DzW1{(6MC3wPa$R zMwuBeslVQz2^6==td*@xN0f$5m=kDYTT(_%WpyTftu@Isu&8A)EN8qg7O2f)ysRPz z+PoV8eqFc2&^F~ahpDH$^6G#n( zzX(6uNGYSt)u4YrOIS=Ixjj-qW|y{@g>QSF-2@%Qb3 z)0QvDtF5#y<87%LXh>tY=9_HIG~KLw;NB^>E?P!`Be3NB__vfP&Y-MeTkl^BTCYav zbCk=klx3!xe`@iHiJ79~O`sF*d7QlfclCN20sTxx-IKAxc#h|?hqaCH;2I*YC@^TY z!(?{AwEsa@Z1B#QkO{3|5Z4$(b2?dCn8I5f)W(+1K4G{zQcy&TpFv$?s^+r((ge-W z#~59}SPhrZ#oUK^5BDaX*;+IjKurSv#f-%Q`P}yhHNXEkc5peBJ&s%2RT;8t?heh! zTchssgZyQ35%SlC58o8|Hq#VWSfk{Oq{4V2kTZMFnC&72KmN-p9sNYpTZJ?(qU5$~ z!%ik9O5tL$x&kC_{oE`o0ODTuQDiYykfg{&#xy>zhn!BnL(|&hc`LSJ;`H~JzP|^c zI=XMRV`U%4wB@&i&NN>gHl1TBMn=6k!wg%QRArqFcUAHbFajF8?X)gz%S5|KcV}AC zh%sV=*MU65w}INgPMSv-%`O~JP(aTR+aq%$So6K{=Fh0s=IN*m!BGpuyn{hGl3C>x8%LrEDd@ z#YpOewz2@bbY!4=?w=%_gxm1;jU^u~2lnFukg5L+|n?*>= zCf>mLKw)qubja-s;t=3Hh%T|{M`omA2K3`&+BAyvM#NvWsv(d#09pam#sAg7ow^2b zy#yh2fF3s;d_S2SKHfMN0yLO<>@D`h{qy-};F9~?HA&ZR^g(}JN>HMuRSl#7FgJ;5E>8tX3>G6zn1-!F}&(wXiG0txfJ_D zQ0jC4<*|v7ZtIBAL)ygNW5#ut+C5m35?p>18yf>Sf_zU>VwfJwR;82XqGbfoBwqmF zQ$W05h95^8%*7PFgZnbh16b3)6p!2?Za&lhegcptC|R9AnjJf2YC5c6?HhVeA$kFL zwOXeQoZl77jL`zI9SL3Jsu)GSRw;(mWE|Cpzjoc&7ziz`ta{K2G|$#m>WLiSjNT`| ziF;fNT=^*T-l1c5FAW1H@1HreDuL$(=TSyX8Rfb3)9 z*jg919MVbptiJti7=ntgbXBMe;2gvsIqw^N&<)l{cXs#p5AF)$Yu#|qYMY`^xH4Si z@D>clo=l@htM8o5MNB?*wn}}<*pVmr8Y}4{wZ`@RBm8Ms-dtpWCo_jp!8K$&HuuX* z$x=J>M1oc+S+py}f7|UvUx-00aRw+pdal*RS!+y4C34UNw-YYK5~9J;!Qvrp`U@YM zG{UB2fO3i_YVU3U;QUj7R0vZ@5lXMBby+8$ZGZqg%@~Sx5bNDeKssQDif(Y4_)Q}_ z!lr`S;uFz}<4=Bl8Z^4Zi9Q_jKGS@;FxOxmKz2X%K=khunP5GpdMh;D-FBjhDSfUP zR8m$gpaAuAOSviqlsDT?NIm-0{RLR0g0`*pt#nqBnxH^jg;}Fy_<`pqZZE-a)&&F{ z+Pc=w{7QJ!Je{~4b1^&@mrXkNYPiy}b5^JZA#UlBzdu=IJ&4geh{3Y%es?T#stdY2 zZX(4+t@Y{FIMu(lad~$BNwM?5)uz5Z&_0-J+49bIlItIy7rS>DbF$%0L(SrZ ze3Tx}S)zUO84l+2^GIKkXTZbETvUpovehJLEo`+)et_f!J>QFuUB(|@iwAX7y%o+P zxn{Wq5xnX=0as}Zk4yUThX`7F3Tz{1C|6I6>P_tf^`P+v0dtHi5dtW(1rFM`FHnG zJ}L|vBuS{fgTJ0%Zc?W^#Ty{Zd1dP9d-xyWPj`*2X!Xkv7#1 z->uoX!i?3yQ8m00no9;jCOGI79+g+?ZIdG?vz!MqDqVJ3%q|@a4MT7B~+s z9FN^&uFTu3>tlef4^<(pQKi!l90m*_`wTEP?l3_!v5o**HNdo4n8=2_^>a6C<;94e#fsHv^3oM-rCnOa_TDh@gD8@ zAp*K8sfWK?T z>9m=6#Jmx~-o9py3A-T+O70Q#Hc7j$c^@9tFM#^myd@1k==s4-&(>r{dwI zoFVLWH#@E&ob86CW4f4u?H(@UoV6a5WnX2;r0`n6`@8gI*G|Pp+*P;L>NWbgyF!?M zpjW^YWrO;jODkBeFks1e6WGiVx(QzJu)_@IHh%{BEXeSw)vajHpc3@{vh(H@p>!>@ zr}`$QmW1&&SFB+y#gO0-1GcfD-V*Tm#MjTgw`+ayQGK6DUPqRmy8&O2T+O{2wf*S% zuPJqhPjIlUOW8$!gntkD-tg0t*w0v6iUd4_4)^zmFuq2lGJRlh(m|C|V(6NzE-o%k zLH<1vMGW9U?47lgQInmiX{eCPFl^esG7qmbwA+x(hm&Hbs>OEoj+@Ps>^Nhzg(hfD zf}Q7@1bWT5dbj5+Xf+gHOJFbe?WVZqR^JE8zGU28mKc$c)^LgZXRm>K&0u7-`pltfgPh>@FGez zPA1jJA7VAFRd>CiX9Qv#RK1gvb+EIi@+x_=^=+>7ziCey?+?pdN0eKF)`8v&Pt~x9 z@TQC*?s-X%hgTvpovi`J4KIIJnNjrHoV?oz%g;tQenR5F`5JP59(+HEp)9Yqvhe%& zGDr1c)pIu_=CMXpZ7E@bG#h&eVwXoNI`L$KtXe)7W0(*xUD;*&^cblMkzA5HQCA+> zfs*$UTv9=q)6n z_j0G}>9H_4;Q3U>n)-vh<)mtfy}*@}^J3FMDi!@wZPxh%6RP)Tv?Xy2lSGrs3CNiz zPd(MQmX=}urBuf8Zep~=qh-3Y)&Z<)BW#~Ne+1gnwWp`^dJ~F0`jsKOz@b5E+lm9s zvAG>>>GoB&f0*(l71T84FSI1BGWWZ|logH*lo?Ow`cFdPO6c*crLPq8*JzZvp)j0d zUi1`>Cq!8Ax99!OY5zgG+UuX!X7jRRKK{UCOV|7T^U#}$^7GSTtu2Cr+v;>op~*qFXPb^)t^Vii z`yN5(%+Vf4MjdyzhgggmW~gjWI8M9u@M#7`LK@Zt+^v@EllsW%#qY#T!A0E^ zck=Zr?y6dP=)0?8Q3l({xGU|=rH^#s_8i1FWebXtft+kYGhf}#Q+u|UAb5lvDQlC; z%U=c%Jn`*X&;Xm3Hzpmj5$>Vli)rs6uW!{%f2&=Y>dgDYHC+X>zcCM^yMOSjpIf9) zgFBfg?fC#%=o3dLyspk(Pu=9t_DM8@}(-HQEtq>Y(6--H-IPKp8A1uGdZ z0odvo7YY3-4m^A>ydaZw>ON5r>rwN|B-Ru2SN;Tv=yt8*>(TB*UANxb6%I4`S!0Vo zC{_UuSjg%)KftR@Mn<5<#XDbinEJrx&waKwu)~5mh6ebn_NHV^CKtHZXJ-t z1sXy=etyL}*gV7QetX53>>hA?rwlb-+n0=LjP32>Q#+yg!L+Ae8uF_*s3If_j&IrC zB{f<$6+X_e;d)qiNOaAg_KS65WCO+O(fDTa_z#B=Z9VF4{ctCX+M6uedTa|#C+u!& z+tofuJ}-$W@yqA0&?}yFr#KWzTz&F|Nr_&oRdTWIf&IKt{}+RQBztKhX?CD`Ke3^& zF2bf32nJjUcdJlJ8ir$0=g>8QiMo8O!&>WuC_&1vi!w=%!XH%cj)!t3cKeOzxOfSJ5AyW1aHy_zC zuFTHdp8 zU8X(106#XVUBHEzBWkm~0^VwQd&mz_h++BL2B)R zFTCTU=1~1}Uj#K#Hu*u*fw&necro9O zsWE*J=ut-#8>^Xm;@^!GXvi|RF8kJsOybI~oJfiB=1eWVQ725RJ4H4=)wC}rh5^j4 zAb*T~Q#n*65vXnTp}V=&X#^>|L#rFY?_2Rx*SaAMYt3HzT2-(X|K*3<=sX(ew_pWj zh#zbSlNI;c;1e!=Gy7w&#fR=U#s;CkzGM0lN4qY7(OleV!T9A_jo^^ z8-qRxkz)PuEgd!YY6I;vkM*b*#m*dh{#g`{GzKkhs#Ur2DVegs&i66kYpmjLa>l5$ zh|t2DrVZ}%o+ZRsnzZgNrn7V#O0E$=;p_L5o@v4_iLGC$Qf&)Uu}umY(}UOn&3J# zo=afblbGcACdO@8DZJm6J8Jn{^o-UKPADCHm}Bus_qxmC>b$f>4$s= z3nL?j8Z?Wt(`yA&pO_i(QF=ZY1LsFs`ybkHzDu$NGM{z`w|kYKAnG(9*OSO#2Zs-5 zUq%3w(+cCG80ko28kSGb%n5IbB_rVNi>mrl-V&v00(RKt;e^asbgJvl*qT|+|Fks= zQoJv#&aaIhW3iWk6R#Pas9qhLzFBK`mwXOa>^hx@B^0sUZ(REV5CW6lf)|bKFel)y zqC1hl*fv@q?obu^OK3{IQ?#nU5nQ=6IcoI(v;ZRoZ=xnfe{FVS!H?kl8DJa6{LP+v zO)X^kRiVvSQo-_yzm+{fA zYADgM?vGndqw4`J41wI*Z49_eZ?@@JxfP` zWrWM_TGbhHKM~Tz_2ok(phx)a+X&-pwpH!+>zE-ggHFeju5S+^U3x7U z$fIGgm456jd3t~A%L5D=-koHJX^}0P_qNvO9VpUeV?Uza!d=d#Xp+^RVn=C$=Qd9e z?63#FW1=xUy|Q|P{U%$YPqpv!HGi>(4;Lbjt z(h@E_L1o(YxO;6VOfG|UpxHP+!Jn;1++gDF@95G+Cs`!HV}(9Q%H9ugKts1wR#zYQ zwqEgl*i6Hv4nDYTz0(rxw0X-i?~d(*aOobb?Id&AJKeTdDzsny63;A0zTXun>R@wZ$>>=o3MR~*Oqyc?<0i? zTTVw*Ajd{KR71@{H?b7zMKoH`NpJKx?DLh^zA1}(-rBZ-6C^;OvqQ#1dcDgro1))q z@TXYm-+%Bb;Bh+}1*J)FIREwU$MVrNq$;q^d6VU-9vJ7(hY9mzTv_Z#uBN^a-MzQ$ zAJiJhh22>be;5AI#?M6WfrVWYy_&e3)3_1%wDf-uh9hlQ<+ zx%T52ft=#@#6%9R^gbDldI^dMPH+C4@DRjr`&(BL`D%I?4*!h_>5x^tU4)Ab*1sd5 z;Vxpw@DkjJ{}Gs3ry~nvWQ2J2%rpsGJT@4VGWV{ru&`JpcoO`fIN8C>*cN2~^Cq2h zz92a#Zx-u(Sk~U5drn^Wa9-)SybY!@4pYu-(nv!2Jo{Dt0H>VCB=5OnCWN#@2EwlLR zfbzE7oPV1~3+CcgK4^?G|9EqhVu%9sGWJ7%Z61QT<>qVtHZ%Sf5p|cHf@9>2Ew=3o zwWY)*Xw9&qRDMB}hMFWH$isRcwWK68**(p3k{vaO0%Jh*%WT*%*b63-lj0Sk2UAKL zZy5P_kmM5j?5{IsH=D=+BZW8l@HQ47|4#L+(=X=QTsu{Zth%f$g(B(Imdy@`=$<;Ar{r zf{nj0W${NwTyI(4&p$3xU z9d~IteT~9`aF4gs=eWY^E?@k6fQuoJ-?>i$KX-t+A9yoDg^%)AZT-M}0d=faa__}}U(Avp6GfcfH+fc)vfV&4AynqVIa$`u!u0km%Ojsb= zqa~$cm#$KVR0O^aVss;|+7w@PmDzHJU&B5rb#l&iRvIl1HEiis0Sp&aIoY+y3* zXBFX$5svLzax*4d0ycnbe7k1usfIYJgZ3{G=c5Abcc(q#L8UrO62$mqA{Kvooy8Dt z>9gNP*Q(W7>Wo1hxn6>-l0kOL6J5K~4mSF|6jW9uLdd9{!*x>YLL^$7zc)h+tSY0B zs~{$p-c9~K^$K?gV-XvS-nB|}8Hisha{oAmRmMAqpw_!nPa=wyF8?&Utt-BM$f~2y z@m8IJ z)UBikj`ha*zR!Qvgpjui1nvJ3FzH5(>u7Hv2(M@qM0 z?l?OJ(OmSXq?NE)v_%Qdj*C;}M;dX|S0EPuKE;$s>27Y{3OPkN6PBc%Jb-H@J>`4tMbLySNj z-@OFEGw&BSB}z2Y9dH2WY?QqvU+j9;1ABJaxh8dXtU*Q%t^@>MxnaZ$TR|==HT{PX zuKP8=&PQp!v6}l{Ze5p$(*ZUw{tz;-{nm)`4A}Jj-xdGn^b+T#PARPJ$>XO{`hJ1_ z6e;t%{{m1OcKx#e%k1SuIDz_S^X2=m?sb;$&83X#3qHKZ6-MW(CKLL}VyMhA?Q(1Q za25H8N0kqMRlxD`xtIyLU26&$Y#S4@BdOj_R%A1hN^CeE&ViemIrmEkJ?vON@iUEv zJY-DRx6y-=k=_O=6ik>n8vzJD{qaTGTce0h2Xx@6m~MfmiU@AgrAfFV{l*_%hqZd( zM%`=vOhoW+vS|uJGy?{Eu@Uem=CGoZpJUy>6(gZE*`NF!pU$+iq02giaej`PG>UbM zxN5ibC-Mqu(rg@^l};2m5T5?c5NnQ^O{62|HQa?5bso$Xy7w{AKHid@7jiafz;VIF zYgd!~L2n;p(0Ge`i+m%O=4^b*<=)#R=!{bSqYKKY8sFHVxXBO2#<9SDfuGp!+jljp z_4!yN+Ejl#?@=RUwNb5ek;IVTGBbdjKQC z#RDQ%PE29OmgOMk0)C`H)ThN@mHa&X@6Lh_Tp$?I7#!2Cr4LE50f@CDW}J5ZJi zvUo?x>KEZEAvC6~wo$UaRo*?*S&0uYDoBh2lD)50lO;es_Gk67T0@|H;*n7H z;gRlPMVXU%!U=a($d55dAKr#r2+l91F)Mfygi<*04yZM@(W`(F*ys0`W zQmUmv7RgA`)(u{oi!?rXZpCFVu-o=};?I z={az3ft9<5|n`kJ1ZJf;>@BJwGm8eXNt>y2}l&{29eQ& zrtMm3EwXk*k-sSMnjOUXHbFf`$INPOz?g*P2VEUXit$$f8v~G8K>SjJ3qhS7p#6Uk z*WsCn#Be5Je2|90Vzc^Y%k)s5MTd(iE^{WZkvC&NgYD8m1Y*N_^OgBMr z$U;0R<4V6ftyQ)X1rEt_LtRWGV}k4ZDSVUg2y*+61xVQZ%CmR-WkUi9VGSmTvQ;;U z#vS$+Fddn1hj=wb_uR#lWaqP$4|jOuo!5^m+24=atnS++I`DSyL&7nvj-bs-i;S%F zGjBqTC$YANVO%%PyI#565n+X(csFYb=R@wPW9>HFJ4KKok?X?5{imtp<_b8n# zXBy^U!TMpv8N;^$-V^ESuA$AFPzJ6gc|796ZV$EKDE$aVA(^*GF*+pwy zx*L=j8l}622I+3;mad_@OHz?Wy1Nl12ZmC*ksLs}K{~weckjCYv0&CL)|vC3Is4ha z=h=Sb2EGN)+HsKA<2x>2qmBZ}4uZnK#wtl&rddJ9FbZ>(3*mbrmZ*a9U87N z$;z{LKc10w>1^eP-{r`9-0P!VCTM#g;F09SPeka$SnYLToWcEmdoaB(kab_jb~U-m zbz#A<;!%spfG$t+#66h-ux)}?YoMtyZcZHvM+_3~8e)cYeXmkr@owR4p!3MR@QHzI zyK-Sq74IfY>p6q9kZ8x0RMYi$OdlhBSWlXhJQ2wH^DVa+JE)=j4T5g`wv% z&yq}Yb@c(=9(iI!qQ~px^7{6R+tlyS1nF_EidV$W6MKUHPJQGZ8<-Q0%H1-NOjL&z zQCpM`+Ko%gUSxa@!3&Qx>t}z4wii54{erzf*zYN@5l*|$SK7?jHeYSeQG{{mR?LY3 zLUY-h(XeD&R2=72!Xpyspucq_0rF{MeU&w;kQruaj>aA8MDl<{DSCN!Duq)L=2&`k zz>EaS-sM)l)<#eCcca)0Otnx38hpgtCFN35#?~c}wa%{Fpf%@w`>FziIv19@2~Pgl zwxYSiKb_T?7iLzKcm0AwK3fWZ;NYoi-}E!bf2kcsIVC%DIQx|8XS1fQ+eNjhgzfIBhllgyfvq( z9f&e9l5F(Ft#11;7SOX@jWgz^SMoz%?(0LIk8V%bU)0UB!JbqS0!Q1!l%gZa-h8Xk zuZA>3Y*ovRTl>Ovk`B4O30n#TOSmDTXn57f0cKql2=W9IVs3<`g|=>o=U^O5?&muT znq4M(bQnfCu3nKw3^C&=S$ib0QP|=oqM{;IjK%2dX3YXr692|clxZ2dFWpllzJ$oN zNp85JDy-P~?Sx^gpWqd-E<+fI7s0H@W{`S3)cxrlPowrcV zSQ7O_I&OMH>!zmy!cYA6_0lCN{lRPd#7H)Jn=@8$A5fqh$7FYYKL2|t?2a`KCUyzj zIV|@9R&<}9A-ngnZNoz>wr^v4h$TZ90=$#9YHYU3W% zSX&i@e->~Zn=c1(*i0QJ0&D8-2h_Hi(ro_8A*GI$NF4e*M~0@Yp2rwrpTi}y=J71r z9)Nnv2A{p$YMu4#uh-?x6-nPam{b4LdNt-)j)ZeN5hG$B6o&qHT;?}cdake;m$*mY z75v&?2ubfY_|y@`Tc3D6o;nG=eny==2lWo`K+E)XZtZ zRE5HA3jqo#%7j0a@w@sL@9_e)pwwcd(rVKe5dUoEY{c2rIkA>P6vPG^WAR`_7uNQ_ zT8|h*abHIZhZe@>X@7vcee~3ErsgkYc|cjmG8o{|R+_ zN8s&V-5aznS|t*8RH`kgrx~IPdo`QensuMhLl8?Gv(@cjvnMH{7KAz zppS2U5>5Mhk&2qV*Lb&l5*p+uZU*gkAH};r@T3}LU8}4%BU6=*_Jz0wpZ){lWMyIH z9?yy}`x5R0zA0)>b+P+P!-w_F;NmgLkDKhzYnfMqazXuLdQ}`$w!K;}mxiuN>`G;q6tiAv+ATJbSnPkZJ5ejOph(2Hz?mHdzu3Zee!w=Mzq%<)H(dD12B+p>* z!*a%Ov)Z6@zZX5-Rpz-G3WUXS-K#!FmqfQQ&LVWcpa+cr3ck+Piq4{7kTO;u=gz&M{j~e(Egwqo^*1Z zYQnkShbF&Cnyu*jq6R`KgU;_+_{#Skk)P&;mAl2%3ni^qh314AqYcF81^NjIy7Qbz zL$`U)(_dVW-$m3)22Eq~Wtb&QY9h7tq56m|Zx`{ym*it`^^4=XUnq|LF}W|5P@&s?FEjUGr&Is}jAAdFss@ zYG>rn_A67^4AVd=!|E{*@~+7v)GM^2JmpP9_p<(%|8xMv~|%u z9Y$S@8#TmiD}C49l0qdp@p`z(Y;*6cE~xHil%oIYaMls7OytXoMg530D{SS=H9j)C z(m~YPLRbHOqAr86YdA;S^#;{d(P+1zbTjc1@pO#QbS?GdAX<>@e7)x2&fj(6GDrAq zeAiuyKLLDDP43W6!g{9<_p&veJ`d#|?szBn%&;9WSSGcu14$zpXU-9KrR6b68K(qcJ(vA3&*T>El3~JBS_Kg#R@s zAT~_lh*|40WKf*(>rJ;co3D%f63*Lfwz6j36IO=$=UeG~7ZWPU&*V`A7gSxz99Ugl zW5=?X%+D+4@A5U(tpC1yUs>fiaN*=uTZn7Lmm1~sjz8_btgSfY-LIX!SYMglKtAtk z*;o5jzQSYsC)e|P;63EexBkVAAdFsRsgEieXN6^+t!#D!U!nOQfxgegEYF* zfx543hY&V55Kl?vBmwt5XzmRK+jxY!=hNwQ;BaGLaq<(V6G@p$W zjZ1sKdF0wNuu(>%@P37h)r#>(!%W+?qRp*hLF4Y0kJ2bwu)e~q2LpYVEr2H%HSg## zqHSSlxC~?J(wGpC6Rv>!BRE@i4gZz zJ^B6>r+Op|73C5Lr^myHsis3u%3$ob0OR9kF-<8CBAQ3WYhv2qTYv*L3K_IplHA?uQs7G z4!WHn{q(MZ1=Nb@tmHHY!Oss?d_qq*c!F+7q&8Uq{X(&za(>s-vM7^n;Np^=&dCk~ zN5B&Nzv~*a3S`;P&=cnq7g!M8+xYEF`_K$?f5nCTtvYSa!PqF2Wb>0fR#b=zhK`l&nVa!n^tTMz zgj34^cmYO|FKx_?qJR5p^HT^WDPYRUDQs>m$cKvf8oan%& z-4CZ5`f1gG{8**-xV#gpn>_%o&UBFGKs)t%HB?APcB5;pRBm35&Pevx{wFz3N5$*1 zzh3UT%>DM%*a4Y~X_IXMu(#{qT&R7n(3psx_9O!R-z2qI{A{^?ro!Wu|MpEj{U?kew4ARyxAclyX2O7R`Ri8v7aQ-jmB4{$$& z;OLrU^J!^Q7Q??SUDUP7U)&O+SGY<-Fkg!`nQKR;n1scKU~YDqBek(I z-Vx9%;ISR}I%8D)2Y`?|=8N;YU|c&7~9}5w50!-eO-)LoR{|ZVozT z0*t$WZ(AdWx&vgx&+{JoXNJn+fEeWE_Krpt1zPEzBPsXeLQH*r(TkLKAb?}SFRs*9uL{Xr58VoCf-EL?qhXxB8D!#xzJvr>aC z!az6XcHZpIeF;&(&w}MFl~ufT|06(5^n}!^dvC&*jX=ha-1!;-(+pocPNk|@AmH}b z?b>-QOUl+U(*xg1-1kp?NrLv*-6wL2;zOzkREn?xEiAn)bT8aNxd>%YxpluG@c&r= z6tqS6xR>IHqqvOy2uF1N*Jip+p@MwI1Ui}f5l3T%og|MbgM|TGY`AL_w2$RuZu-*@ z3DcbE7%bnncKgz|dS4;IH$yRRo_v3?bJL_*>`<2YzNZ{JZT8}V8Hh~ERT|c>?BH=S zdxQ1U4$&a$$zXW`lnU>Cl;`c)2vLkI+u@jJqB-oF4p__y6;_Jl;Q@03=OH~_OogmC z8D)ZJ1dOGoPV%I=GZomroFudpAjV7*8&Io8ziW2>%svf;MOG}2) z(&r?DTv2Jyxrw_&3$Ka!k5A5=LaaK3l;YyuT+KbGJDwDQi(8d>3`J^9u-=?wDjXtH z$ykL|^A}fJM>)KjYkJQ}Xi#X;MuVt99G09;lBBISikZta1@X$DW6f!&V{Mtk+Oc`( zG9WBftnD)!y|64>ID$ED4qu@gAB9pbI)Ch;s7oh#M`l1fLUfOU8i@CIyhIIkeTqi` zC#G}mJiyHOFWy69emBt3`As*NX=FJ!;#QT;*U9#W0$09TMQIJTJcA(NfY&)f-TYhX z-+8AWuW-vgPr5 zsutVfAf3mGQvG0WaDSKz!2~(C+Gd50`4F>YA0iJfHm`<8IjL=}ficW_&fTJOX_c*p z`R~iiZUkL=q+lBrwDRuP^2ym92(B{D?dFC{TpZF!~>6_2$Kx8bY+wAR+Q+LZ_AQ{Pt_vQyo)*rH&x z)8VTGDcTWIV!D&n&~LHV-T#mSxtuY&bWNedKp)bNO5#yU59&!x)uh+C;3z@%UEN-F zmQtLcr~*L-8_xlAnp!+qzj_m*byTGnev9y6Jx93z<&(mN;@RdwA3}>-U!fo=Pu7kD zgXVga>VBP}r)He{x5@QQW2cOk;8go%`5}bt|(U zmGVLT(a1<%WC}0~_)o1aE&b-KVP4Q2t$R*;uI;Yxz5lw!2wXcs=D1#k z##cMsn{W3Z{N|(hPBv6$m0(p5dW#c4xYOg?h=i*GPRV?Zbn}BI!N3^hVZn9lr%7Pq z`4tm*FzTr_T+ zx?=U~-r;D9dP)nR)EL|uTfDwKJ*0q)){c!2xbwcKLuZ>IVSJ{l{rB*2Y6r!rT(7BD z5l5tdVu)J1vKoDe-bgxldARc!9*Wg8s$$l_Q*|1V*U_?7FZI*f?54D9WJLI;j;11f zF$2XNKI<1@PX{ydwZOmgP+D0yiSXj)#5Z=3R!{0ByLppr5}!luOGB+YN5GD zk#?LTE(ZA6q-(!JXy-2sDe=CxP(=Kokd|IvZI~ZOsqX!^iN<-;sIQe3NAw$auJXMo zNgu$J3wE{&1b`N< zU@ig3RA|^6NA5UfTM>1*&HGgOEqDbt2m)VhS1r(}qSltbwu3$dta<&!qny744dBj5 zQW<*U2fV1nU7jjB+h>q6ewP0@0#*Qzj)13Pey9LtN3mR%>e9I8XvIlx?hKMFZ-f6b zt2on^!NM}`6K_p>wvlgi6iN1HB{xR-Fu{f|mSSoksQGL~3_?03S?yHA5quM)%CuzN zjA%bOp>Kq2CEBuJ*evid{C@XY_SNF*G=j0BA02`*pgbcOYZf52zq6J{gD|(R^F?=Y z$ipo-M*Nxvk1FPi%fHqAP2xgGCb#bI`a=t%Jam#~$E5Nh2~_ZGqU@H!e9 zqKjhc#^@ii8Vtx@SH4#_Sii9ij%GtjpwBA9?0G5Qka#~0 zaq~dgfsKI2cL}JBPu|>6IZ=^>*(jCn+IYyb=MiI7?y=4-cjECO1s1>5+fc&4^)E*U z;Dv;sZFAY~k*g`!E|tHu7ot+E#N&L0RrQu~N4h2=O;*oIMW+0jL+4gNoK-4bwK|K! z15@vR(!7rTIyO}zx-h&22Y>lAJ<@uw|D;043^g)nFUDJ@wd8|KI}P(ky2160ZKF}W zu2l_W65O4rK=DV~_WbxsS#EIRT&t@{$hom8o!opWFxmZ1j!te<3&ibEp?mE&uib^^aP@LCLoS-FKt4^%L{GF9yN zyGk@OKHh#VmjN@iA2jzi3H)I|C-|+fyx%80@+qSt!KF1iwGo$EPK>5;gk^YAfg^u&E-RutH?!!oJ2?mnH(QR^ci@@ffT>E8-)#sBC6T=}3IrijiM^^BUV^`;s z$~2-R-nWBbdHFcI4+YPip#eWvC}fwneiuHh?=FZly;{UHYS@0-H)Hk2MLavSZlekx zTe639<372UV)Xc^{Nn#UPl$k9{hpDDHI!h2T_U=6JBhqG-yyjzL#&v zr*k|CBe0A~cP<;Qro6Mc2@HqegMic7{sYZ?iyU+=BVS`m>r zrskV9%E$`d?M#=otzRPVKw4By*O(jww1*>tprWKLWWtxtD7M!xo8+1A=WuT2&l`;z z^~=y8E}skWy$bPtoPG}gl0&nKB?$k8Z0tW69~@oLJT(1sc!2WHZo~I#o<7H{D?YM# z9acoJZW0xE)g?3OspnI88+8{=>u?-K{LN4=@)}gOo(Dc@yQLJV*;@TsEdGKegx5hPHSk7 zNKB(0EHm31-bJtCDS$o6z6(roNGuGHo_^lcCz4KxFh#KeU9xaRg=WN&0+HkU-%2)z z48ZdPQ-TKo_x&#tMvvMx?sFy06x%QA6_;07#4I51wc@w+ZLQSFC6W#VjGaj%xCi)q zfSm8fg@UWQ_`(mECl!qvR2*(UcqyqRvWCZW8#wFDiF@kg0RvMG#qWcSlChh{7LfS= zI34$awRIfnm#{f%ocIhpjGzb^4Z$ZV=)vN*WavIO*@ey!jv(2=?sICuLR( zch0>w`ITr+Jy%Buk}DQbI^JuUDJqN#prrXE#@kXu1hhy&1%gOr=a9s*A8Us2Fanv>UI(hQ3*M(20<8VtT<4HqH6=NZGoY zEtj|9YaDzL7(tXYJ}a@SdY|-QWwmioVsL@g9CUCR zbwgU5c5qtCPECUqTmGua986Z)e)wkOeN`~?=is7%m_GkOBPoq*)K3kq3XV8X4|HP!}G-Ggj92^$>vnZg7h>btIAP$Yt{ zVYWFhp?foaYch*w5}OMf(-6gpY6QfHpB&U&iurdnLsvK*#h%cKp9f({H`^w5gJ5TU z^1^^ac>9KU^6CwFd8u^bSjswr4dZRc38U~0F@rb_A&3$bxUj);dc~!^>e#gF+uJgh zz1{!bqf47G4R>iM)-^qTT=n|0|K%nr`?KV~w&sfh&}X+>5&_go+;Xxf zZ^lX9dXalDf>!Xa^)L=KEg2mMcBRn^E*8trde4W^)O-Ee7+LV4Z@&@YLwA10DrvO& ziOl7ckTCm(z2exVSVb{~5*a;d6G8!PfV6XlYTGMNX-+Fadr!>9JSP^I_1@9&J22Ey zGb}#1v_V{i(5N1k z7{vC__XCwt8!VRi=Aaa$c8KE|1`3r=zdl@78os{TbvrNnuVurZ1Vf&^vSZk(M28;r zD$z0}g<#LMkJmcsY1>XnM^PHf}f*gIJ}tiOxE&#FxTp?X8{b4HBHmPloLW2PArlzv0e! zx2?Ocapm3h-~jnb;1iVwxX%}VH}X5p(Q&f0;o0(DU!Y&wlMN}#%efts7`NYX?9Yf>3s0`}T!bz<&+t8Iw!z`e^PX0+dDNfKk@_i`!8rRPX97D}SJ(RweF6jMF9Xk2Zji5a2^V0lPg+jJj_fER6QfJ5b-bz;VlfF<2DN^%V{p6KkK-4bm4KTpZ3fjb$;Uf;oG@4K zM09C6l=sT!qVJu}ZVkV(DwlK(rSnP1^SBj}4+Hk+2#dLM%LOATa_}Z-mIXQ&Yjwu} znWNypn6WQd*H0Hx0J^2Ck6Q1?Lw$R`fZ@0UjRTz!=^+n$5brFL z$5~(2B(W%#`t>+8W6p3jp(oA|yR+7|w~H%aaEwt5>9)6HKmV3h5q$On3I7YJsz5N- zAoDkm*FD=TT&nGGKtCW_^DJcKm6oP&Qprt7%K!V5DEP}6Rnb`rTK=FYpCiD*)MmB6 z^#tMvjt)%diLtfH?CaZp8Och5Kcbdfxz2#7(=dyKK3L%iQ=}`GjuW=`&&xEo&O5mr zA8*TDkYoJ&5DHoF{_efd^RlbFoV<_Rh|m$hn^|T$RTWWJ5_f1&OyVtR?X-xd$*N|; zhyyjS9!Rz(_vU&2{m2>N8hr7WwNrR#7;wKQa!dG>zeMHT~eqWf1-N z1lT;V+8NK~_~zTd9Gq}BgXfs12wqCQKh%b^k}hS9cRKSIWWIA1;vTjJzOerQgR8rc ze;2$$-q9fRy2%`zpIViwe+G!r$clB^K2UInfv_Eyi8YT}2QQ}dU{lAwEpcUNvW))2 zl#bqnMaz{L#|xm-*^Xp*|VaB~JVP(bi|^ZRx)SXTO=K zZ}EX9*CI)Q_NX7u)1f$vw}%b@sR};zZ}3?5p!4|e zRD06HKj&9I)XIySO*ZtAas+j29xKkfTEPRb^{&dpXZer0ux`7nqKA8^6}juTTM@sR z9Y4B^30nETNOpu#91f|3wRLI0*(JR07Mjlg0}PUeA0_l6BLce7h8=2UR{Dh-oL#8Ts7{j{W_BRED%E%kDgd>Zle94DCe+fo z<&NJ+^D+Co&}>VuQe<<&mRJHC>JW4CuD;t(0c>77;2xEh{rE`QqWhlH&%(Mn5>t|R z3#xd3voM`)nSb96BGwiBg>P zH67B;2sbJ)V!Cu3S{E}v3H|zJh?cl@P-;+-5Whr6G?P+h<@xz)&rMh(FjO)$|UsFLEg)oWk0NxY1 zvo`suTpVFum~@}=Apeqda!Nj^R*cM2U3=(73X>h%L*>dq=QaM zn&?0X@K?FEkE`yj`RR8pGNh@-@g_S!k}c8+um>yioT#;;f4?uN3@M1WkBM&&d;@Fm z3edB+39As=G%(tm5L>lV6SVCF^crF@eSGceesi*O78~zrHeZt_Y!+sy%?`<2#M187 zRlqb7w&&51t{G>&x~5=ei|9J#DW3Q!>+K$A^_;e7XzxG_AU>H`AxuxYkItderZBjQ z)zrqhkf4j)Jb!0u9R0%0@1w&3c>vca=m4%Uc( zldmOVlxo9+=p>L(ztY*C^s`ouT4Z2?Ms{9ZlpecFvNyGZ9)L$*59q9hV2Ag87f1!V zE~BgpypAG9rMbm84Fa!5LwEHF#xY6xEtWU;B|x?d4DWOIvMKQoh^72$LO=K14oQ*w zUJSS)5l;94XwP<91t!_^cR_Zv+IEZIE{Og3B5KYs^5N+@?Z1D0ADZr>G0-q%x^!qN zXdRI*6Mq71J`G!q)N`W2B-98SO#(?VhG1O-QfZ`-3iZOWbH+C#fy#1VL(;K`j5|_{ zmi18jCESD>GB9O-l~@hE`H~Tb9yzATK*rE7l|~Fe0A^0n64Ba)b4#_EW8l|wz47&! z@8_c2RvUlLy#24mY#gX-!KUP*Lyq;I8JTmF%W=wBYPVvobo1wF{{ylq8k~Y#X+FAh ziUS33%m)|DFwZ@nTo$-XQm>bCpjB4%bD)hWzvGea7aHD~GI>rm|8mI%M!$#WhxB$e z%kwoW(h5=ph>(q6s3{VMwwGgXk7XBSk&L|{q0o%;v&xswtS`T4Hvf1^+-9)D#yd*w zG=HDZFm^gWr_tN#@LiLYxiz)zEBY^Uqwf#8iEAV3&wSj%iM>6>{e?aV--3Uo&-12c+vKemO`00P#`%Xa zgpkY?tA)}?qS`EHu@*M>6(HflKPYZZb4tKPJ3<3;*AOxjh13k#k3-Cyc*c*NTuvjh zT}vCv_=g*U#xNxtv}yrQv3!Me$%R0=$SZD2v8BlFyxpN2pC6gu-_IZ~qU|DEf#wR% z?sYl6whLA-O~BQd^WVmJBB0KdJ88Kk-mRj+PxG^aW(!E@@-K%hsNBB`UPZzJBO>Wv zn9cDQ-sFe1;j0Csk{a+pPOHC?A(H|J=AY`VF!Wx>kIrD*kM`C!UplA^LLn2Bp8}Q9 zkx6Ax>0|+Ge7R+4NBv(GskHZtSphlK{=OzMZqVSz0v3 zyMRjk^&jW?_nfAh{RYFEQ4|99-%ymmv{yF#|F#Jy)`gEZj@{MwFnS3eOhzWZB+gm( z_tj9A5jEL-Zv`Be0wuK7lqR@N1;UkK`}i!Da=;~L%U-NyK+@N~ZA0RI_Dq>HsCYqF zWRQLVRBtza@hkcdDB{5vCnyKMFu0}kgV8AK3fH0&HS@3K<;aN3)>f^}PEKyNxOGJQ z$*(04HjAAu=HuxlE4@anne8(vcn$Wh$)AqgspKc;Kam zPWPno?9^ti_n|^c-vg^$WFO17Bp=J6%4uQBeewDfz*g-T{HZsn+Y8=q5W*CIwp*bE z>HaBw-~T=0Y7=NA31RH$PK3ql^7u4bn{>rVi^LEB~6_4hp)xT7_90JB% zD-1>@r-Fw<`FXs~qcuakTAcg&>+A1-zH=szh6!6fz!=Ld3l1qI>~A~2_zVAP!|UWb zsrm1$`(`ZJs%ID==g}2ze^~J<(o&U2RqprHTn)$44BZd?c-Wy7x5$=XM5o4(4NB4iucL#*+PZ?F3YJae? zlX8cCTa~Bh&@=mrc^sz-&0)Unz(Pd4F8nazyf0l_*q9O>lhhijUILc|s&@IH z%JduEi^A8WrA|Iw;4Nj3ez1*LOH2K)cz(cTLEQ^h5B@ESvGqkMDe~SE%f=mLhH(#k{BMT zDQs~e;(t1LCb)Bw{MsJl`yY|Rj+l`8Q@!lSB&_cz@`FQSw;2micFD%M32~WUeU4)V z9}q9hEj!wh4P|dFyk@9~m}>u2)Tecz$=emXGTujI@dq7$CJRVQ8!`Wk6L@Jg+4GZHc2kw`l25ny_c@3&QBy zQe#V>muZw&XYV9&Nc)`iVA>y-1{mF0uBj}FE>yl}oN4yUY-?cgozxkbH zUls82ZPNTmMIcDyo^-Ddt?1GoS*Ry$$z;SEvA$K~?VxE|y(S7l3RL_4l6ch&N>V~g zR~F_6FikH23F%7JhS!31n7O`!Z-7lGQCC1tnNk~v+qq)bnRSopX_mv=IA^Y1oW-7M$gLsepcN_jO zBRLMm0)GZ>5jVJnsBtS1^gAPiPWua~KWOOuF{4C{m|r*~$WH_;3C`2DxOUXy_{?aC z1yYqUqEPEryf!f57)c62G_|-}qP&u4?RmXlWno^}UYj?Kh^Jp*RO`Ff&uCi$+qr+g zYQ)Le0;N%@|hR&CY3rkBD+*9EnQZrX&i2O*{L0d*wfjk&MWq63OY#zUy zWR{mVAiw{5(E4~11MfO4I*_`+H>4ugt+lDiDkd*?kfPo@)~A@ZHbAu+@2F$QcWV;H zS3_ui`~=CH21QsQlx4SW?Jn%%f-B-m(FQ3KK)N2|s2GXd4Tx<)Kov-J8Yb5xI3Z+u z=r@br5_BQ@2AT(5s*}MnVlPGXAz$*IIM-&iHM0MGP55|`Z}x73sb8_n<3!Sf6FiBl z<2~sn5@mskt8^F@pwL-hs5#Wb$Aq@|W1(7Vw={l|k27YkZ_WK&qQTTp;$SYW={C>J zp)~88(4v2uTY4CxBf_HK>lfrM-4GItJw1ue^S8Puq16^P!|EmDE^{I7qAA&#Hz_v= z5+n31r^+K_YIm)GklzzUN2qYrC^M+}oPq;*0*GnC!ft zCF=y8|4B%hZ)}k&k80X&hh}f{w>k+MvL3rq^M4ye)35PsF=2WyK{dv2ghB(-**#9f z^o8i&J$&PIORpOnJ@onMnz=4ndsQf5PDqA-;rclux;$M=h|^vQf~aGVRH!-r{dDk5 zJm|KRa6-((0&_8XPZE2Q#PRFI@bbB+IwM*8HMXcNU(t{6A&e1r1>-yL+Sf?!+PF(^ z@|wHcmB)6{bS~+M1M7e>=srU~aK@oeW1;cqS2;#?@or*P9D;BUamRlGtYmk-T=5`~bqm1m;%K_ZmPN9lune{#VVqGQtM2J&cs{-3`!oK91-Sy^eo9Q;ytV>X|1 z5it{K-{7Yt>QMoUVWJqwPglVoZM~9wwyjh(eeta5x7z4_x_UKKrrN_If^j^M_{8KU z_GnENYm0%#W9Vs_NYc9X;oZ#ObTUWmBEGLbM<9>7A!7X`QAiDGjD{CymY`>#+PlWG zQ~w-&-V0A?;*PIZuKuhR*tdg)hE>Wn%Iul-5}u z(Pc|&i}9*4Y0?c9@SAV{7@`v&mS9v-=-U&*!Fx-I4kvu~Hye@%6g%iKV%p`^Tj5$d zechZ5_DCfSG6HB^O0`OrD#0Ue!LUtXYEOE_Ih)Rz+bJlnhalxZggT$KS-UeL05X{Gk%o;UzAc9CFPQGI9)UGL|jFJ!7QT)NQb4Sr^?HY7W^k*hYNwx z_ANQgelYOxZJ9GJA#CD4}#%y%@q6Z z?t5;O+DC44Fr=^5d)LaTY?{&kW{`;agSLCV_9c zacg5fxlMf;>zUX_DS(L z;U1`(EShgP&c?eTObJK2lu~%fP*a(6Oh>+RkE*5%b7S~3`?XE>UVn$RFVgkV>aVnv zB#VV|k4ZsB7jmB|?)~Ky3ewSZIan`0Uyk?cnKtn^j_EdmyLDVy!?w$2>%cZGpHks5DJ$91Wa#T^FH!wp z5rc7e(WXD8v1((!xHT=Pe9!tfvh#(pU-NvM?1WhA74Xd#@+vlxX5*epJuhy27k6N_ zreOE3;s*>9h!rXk;(-1nabbG%U3s+RmGN(l`iP3@cj$@n@{bUOYf^R|B3=h`nJ|Be zN`BpL5*6v|Z~V-RT+;(r#-o)T$!0h#rXMTqyTl<~KKVV5AqblgJ*_RwjV~EW*gzQB zaXy{L92t23`3r<^b^3+5s__?}{PZwjy-twk|1bhRE)_1ft168z)36^K*VG_Naqgbs z|Iky{NC!N3%X*F1aZlQAsJM~z&De(ZUkrdGM{0Rg0yAAwM>7&bpv?{J?NU=@Ml+KB zSRfV-N@)&UMM7SDuh#On%eYA_5jPe1u?76;H_QXZs-pj1IaP-%pUQ03aJ@R~aCPVy${?hVkQ9WAtY^Y%{*EbZ^{HrM9EFmbTMo zTdg9l@A7%wL?K-to6}=I3ej=}RkzFzuiw2`VUAw{I6BcBlD7sUXvjnE=SO!bWWkhcsFkDxmJ&$#Nwla@p}**H zs$%a6K>xY5vD%9%w~Xgv<(My7;Jtu$0sz9Anv4%sOF$Xsk!HiHU23qnmTAW@-JO?J zq-OTUt4JvB30o2jBxwK}uZl0rb;@5hCBe56ZuUv)lUs!yCfRURfoJBS`OxoWt?=S{ z%vziQAYP8nY#xyG|3Rj=A0(cD47B5{aF|_P^lvetoqM@utL0^;L8IO{h;L7!2je}L zlOWLs`sS0Josj5$I4dPqg&Ik?TKB+CLkpi_wisw)4mA7WX$JNZt=*(SN!8DtwpBRU zF_^eTemYG&aE}v7pKVov%ZLJ3!w^XCGi^n~gpw?s{q}!lB(`!${W}^ZMh9P@G27*t}8FGj<$g0{RvyrY&&Fbm*}K3Z^_PeLuuKq8!B$^HV)7s;z|0 zm|IS4_Qk}2FT=KaB*;V-cbDl#J!_uNHa>&}uu7OcX}2@O0{EAeQGNr9g*a5HK=Q*9 z1Y__Z=D~F>)aDj3pqSE=HD%$jF@tjELDrvQ^pYVDM_XB1I<$a9WsvB!9atd~7!lV+ zK<#ptH+RXuMS*fK8gqr_EFfFq^`(qR$d<8|T2QotERIjy++)8Oh;-$TQctodIVdvM zNR%N~a+^8DWj1(jHoYSJ&};sL?3jdwHGV-=Qdx`$DM$B2UKtfJ`X=xDVSSaM)J^KM zj3WiS4e6Iqf_P^rhsJ1I5TQQ>(aT@E-S?DJ@1vndOgl5VV2s2j^xDNp~% zU(i9d!w#Z2l4I&HnJ-P&b8)$OITO20-oz* z#ec*ycdC)D#H*XL6;TX*Uqx zNShh^w_)$=jZe@ z0QlX!Nce6B%{Dl4aNLE>3jE4hSv!SUX}zKPgQpgwBUha6d-BrwJ^cN&ZJwbehud#r zrQUjCPmQDezIr_ujoHF*4RAKEh@04_#1eP${n<%0h8p~ zb<~%_-<=3!bb)gXxL9u%K5$0-W5qzsKYio!j`C`p)O7!n|3r}#^#+j&YZY&X1;);) z;_=Ygw~?VnkJwDIR!@ZN^@EHPo8oEJ6REZ0qi@IED#V0Oe}P(sXD!}TAG?PtYy-G-2a$}&D$o|aBse{< zsj1}`Y!kTU^7KUVA70!?cg&J6(n^sllHXXQ^SS#EkjO)8#F!&e5by8B^w9?w zo^v-}aZ$A+cO*>i^vA@q#+O5$H)DZFU(LyrcsJ@jHaGSDho-NLYNPAI#i6*n6(|y1 z3c;bcG+2TbrxbU0*8(l>?(R_BDemr}6oQuGR&L(!-us7;tjVl(CUfRIw$E1MzE^nq z{pyYS=5TBOe1IP^k*spl{N;G8fkzR~g>kxhR7whGlEdENDX;_2liMj45?r&cNg%EVYWtQe_??!Z$sR`$(bd`c(mJEBY?o z=C**h>&Fd3mFX@eK>n{?e)SX5PPTUls3t&pApf?&ocY3*(z>M66?%aa0+QWt}&M&>s)h)SqSIaB= z1uDYt@QeZiI?Ri8-gS%IR{HT<-dY@6-Vbk8mi34$apxpT2+q4cK56aD)SLeHb;+R$ zQ4P2~Q@`8b*%9|v;_o&Kc8$OP)y8=$0Q!arAnEwhn3t^2U`V!gKW-XH3bv^z(iU15 zFI^$HOHcW#PaDlzsAso4eB&7zL&}?!%^|`Fx6nmB*%VqVKa5gEt$CA)&Gv2q zjeeRh+e2&SvVR>B!s8p;))>oSx2lU?19W2UjB^E;1WhA(yELx4dOxkxk=Rq$h0rF< zaeXZe;td$H_-5-BfAU+|W-RxsPXOOK_s0?SMp4*I=+oW5!xO3-_WhlUohA0LR`#m& z^c~OwfU!rZmF-fvu*6A@Z+2P*18_9M;1XR;UDV;9y zW?>^hc7BUToI95Gh~bx(x!cczSDJ?r-pAYG<`}OK_KkiP#GP7E0Vqy<> zBh=F*p4W)kVYy!%t!`;ue$$+ovf20Rqf>Xqm-|a+VrrMq$L`Kksy8B{>p=jq;}H7; zVL&7S^?1^FFdAUr!rev+46{=~9n#wz=bH7Kvt5gW@Yy4n0aV5`4)~F1`yW>ZTYIf!UI5g;_9!ZUjgKjr=F_Se*S!53 z>hhO6@A=75GJx=dZG~B!WjB_QQuRWgL&UZ2Vmubft>lQe zDP5GDY;UL`EDK#~K4l-Ib%l5Yu>Z?{d(I21+%8M^BZLJ1bc5~X3RoeYScl$#KIDn(FTlZ8|D}AiejCM$PtCCN;vGnE2}xS zp_#D})#`a;vFS0pwtbW}M7G&ibscZP&=Ft=#>J*yR2yUSp^K&?lO!iqknS~hlhOz9 zi(3~fh@+x`5=7%HJ`=|BI75T$)TZ}Kq)sXsl0uFu&0dr~xj~%kn9L34m?I##-@5>9 zx(6n~t`fVmiI{Xp{$QSh!(`n-DRkqApis8r0Qy(96b3$YkA$_ibZDs5zdnvQO@aHq z7s|D<)7g+=XbTt19!M1_HJIYJ;0fr_5EqKJ?>-IYN$6{$$@>jIBP;!&73_QVbl6IXtxv!l;45WA%`k)HY;qxGA&XX zy(*^H7IsZy)MZyZ++3MmqCZ|QdtYyb)X<#T2l_{vSqV_6?h8?}dMorxJyC|{e6Q}W`K?`Vr-YsXbRAsyJ<9^-sn>A^A~ ztmi~w|ELlL@f{Vbf?kF-<~21$tSic^5-4reC5K_oiWi~}R=H8g{vrB0kiX5f0O)nm zrYm;YQDIexgmg_6099WnCGWbZ+NHkl0kiKd32`Of&;58Ez8E3;WSbcEm_@wBi_y;* ztu#r_hUNX610$Ny&xcp25^8oZq7jkERR3fgJ)%he%R7gWl;cQDF zkn&|u4ZR$5rnY8Fe`mcDttCEWnpD`9i);T#QY;4gJ)l0ROG-;&g|w}oT;AW|c9~MS z?)+JyKAN5FhJEca$%a>Q@*yBl-KH$*QvOZHKPjpAv{fvgv$UHZ{~ZXaDY_GB1MPT% z`U)aU=QSI0gPXyt7m7em=1PUtCcr8gR<ZQ_o6#F-uut}U!(~F0 zj3Dno8GI(Is|=s>`YUAd*Qds~L6YN#q^*$${jdJ*|C`w*OCtu_9pR9GBD`co+nQca%9j;gP>j zMSJSe85f({1Y7I&P;yR5Z}$BzM`s#F-=Du%4!s_-$J=u%*@G~T*@(941&3z-EJYR_ z4UfV5qLn8m-Stp|6wh@^rYd_CVGw?Xk62;;%Zj2# zxBRjEel{p)L@}Gyw!#XPG^!S$qz_;MHP2wF%Ki75mpGuKlGVDx>cJ-1)o7Q8R`V(6 zC56GauQ^_uurR9feajpedZhkrLhKYK^oy2pRAZQUZP$7i!P!P!Fkh40_Pv6g>x$^W zm7AEHLJD##gHYC}fcitZc9l@UNqt*hP)!zyV8heHYJfFvNk5d+BwaE%w)6l(PF~5= zlszo*>+JOXF~X;=mUd;90|QJ6`avWPQ_1PS1I7|}IaVB*cG&(q+}A8|m}0nDMzb`d zN#VEk)Y0-!af%jK=fD23sDa&ONT#>S?JPWK5HV~jI-uzLWkPb2@6~78@6}S`t}Ce= zP96_>lk|mW!u` zbTzZVKlW&m3!_lzT7*vKPsk|MKl=zd#^28E7T}7HayrP@7N`>CP|Mfs<4!9_yeS(t zvqk;WoKz8qo8gN={fTWaOe349!|7XiMWAo_)+Zx_QO>MTj>!UDRNHg|+u7H)Vu_*L zYy`%m(H}`?w^U=l@(sox4*D&N&r;N#iQEm*C4hG23Vix5NuEhI?{CJENa@&jfo7~r z?)|n(AP+f7)E=;O){Pc&;O@_%$;R(SIFqgpoNa`hDGZ>LxKeeUl-dzF*7x|Fkj7%X zt^H&BWVcyJIBY-IfV8(#X_!Vp7oSAMH}uc0$kr4r^dv+=jyoCc?8o8eL8J4uVWQid zrrgzjGpRzwg=Su%@0oPPOxY1pFQMR@;!Z7b`07GZDx{1FOn6Xuif!Y5>lC0--4Oc0 z61^F9v(FP_MtHDriLG%C%&c`1R1HWntExz;*WgJh{C?a$eMazxNk3BIy}(z*s4z6} zd!Bp|hN39#%X^HcL_FU&gA)a)d^L->wTH)S4m)GSC-bgf`+}X1u=2n3Jq($sw{(RM z{0R>o-nv0ePw%O3jYn=>_PAT_BT4Y9wtRHHZFPl7>nsV%u)K+H*mALMstzE)qcq>~ z?Eb`tc2Xn%xAtzuSB=(D;^Ei!OTcQUU`9PXAeTeP4`!&Prme)J!rLO1d_6w&{d&q} zV=NM;??A%)gwg^8T#);RfQtIqvgB=zngvpfQm<=^MB%nrwB%e!dB7msB#h{5Cj1aa zac=*PB(*ZUXL6QN&>4}NTb{{#yHGGJxLD`wwcFs>iD!``oaA_2m^aUdm$%jKjG*Ft z8r*(kC`dva1Mjz3Z7k^!)4F%mz91$-_%1A})F$Ud!OeS-gLa2&Sy~)Y*QTC1hExeX z6VY?D{Q7xb+0a+m;&_TgTi7DAC8gd!@-7h{Xmf+IGzrZdz|IY+>fL|Ey4AJ#DX z-V{(~6rT=!_=W|v0yuK>tnOWyPX_l(vNh4~g<*(K3JuPNqx{G&_RaNW3%=U8qjl_h z$@=}4U;b?Y#F4>8zhxgcV{NG)wMp2fQT_PQUc-S_Fd@OGJmbR>OXuimnSNWW+j6qL z60v9w<6scx9;E&A|IY%HWYmjPw(Oopr`dKV8Q}^9mnjx?XHr=21b?4!3&NA|5*ugs zm2!PH`37%QM|#`Z{}&gxQ2UNlsBx|PbEa9tFilW?dtyL#NlEzGR(POFDf`@1qQS>e z({#_Fi`J(sf9}I73adf3O0=-}# zWyrrHEj^}4dJhYpizVM328WCNgTzW&k&<6U9c9p zrTcf7cRqWpbh(dk8#LFlms)A2yH?*)l8=DZ@npA?;SXR@H1DoJEqhgpiIcpspnjnreD z2$3GTG<4k_`rYN`8YCNN6BJfdrq}*YR;|ft5RuToSHN)_rTEH+P59dwQC4X51S;er#>8UV&})N7H<@?OnRR zFue7KSWbX~*_LP<)t`I1E*_3)|6SPZP ztlMvROxSR=>)77vRO4}|ANbKPQ{ZB~b{E!T%^B~q;Vd-kQbq1~QhDtnCl4xdeWhS7HqxvPMLvn@1kQ`G%m7ZHpl47{~0IM#EA$9TZ9;N=p&{c!= zBIHb}FxOQZysT!;nezCqfW<~QE`0{};LH=`Z762UQ9jaKTe(;hcGZCvoV#)`O1%sj z7UvcuHB8xA>ZlYeJ{)HLO^9@ulR$TMcRlSWZ%3pBmYe8tNU?UV<6b1{e~N>e@?-#On_!Ow??M>HcUlyjT~g6owH0-$FGVq;s-ti)IT z2zU)#!F9T6?(7b*B`~DIZEV9;U!za;w31HQDj_g%3X?n3_l@%bk_u#F1E-@nK`zo4=z2HvcP{F?`8xkK2F&%w~Qejm94sAGS@WSDqUK# zqzn+FC}0MMcC7`^Sfn7|5+uQOExYq?z>Ggc71ohp+|592;%eu!V$4#?+JBm&89Q`4 zg$??6wV_T^%6g#g*2!A9RP)fnJ`Bt6#9?ae_r@ zNfXDEYoVl=KlG8VQdLuF zqKhgr(_n~ahHykvc{v#gt&Kw{@fKK`9)}a+2J02Var#*ayG>?vo>u_r7 zOsFt7={~P{33fAnE-PfR?|YP=N94NfNjfYwM*xX&byQYloVGrWG)-8uOQ|>pT>kZ^ zi6u)DoN@fgkfk0VB8aRAH(`$`(I|KM`G*0-Igt5rU247mHbhD zm=cEX$_%%sVubQoUjJ@)vt$dQPzxp>$1Es;o54)#2)p&U!G6Y*Znyrt3k&+wQZPko zS)`N7`UPF=a%>%nBLUJoa#a@Sx73)0g3AO5E(Y~HfBhSr+o!iqx-&ulV^fj3()yLG zPd!pTn~E&L$k%&+A~mY$I{eu?Q{wP zv@~gQFMs2kWnTTUMY%-4zuHrDzd(5-VavJQPXXM3*X#Q(er)Q-zIsZnN5yA?p2SWR z+O@a(eVd}?I5qp+)cW0U#I>qL?s)V8nvmBSXC*)}f#cssct>RB)yFX(Q zNBAE?4HLr1PRAgAmO3e$U7J=V`y$FOPD9ksOeQNu{Q>C(Rf%dfX#CFwwxfH|^1Lul5$sa?(L21tXHAE@me@FQ~Ca zt3r4p4~eH)WCT!kktc|T2w`L~jv_U}^nVNH@4txXfNVAr;(iqCLK2OZ$C#tCzPDnk z!4iGMv|=PD?2&C_CTL-4r^x+OJW|=j7ax$FHHT%kvwPO&M-95o(B*^Q5q56}p!+$OXE_)wO&K9NU2Xf4Ap#lHrJRXRD2Sa3*YQTs z+w|wvaI!L1Vr!lA~5aH-yZ;pI2HB z>Hw_%g_CnpLQD6l8T(NgN|~t zKAHqM61!Zah7wlB$KF!3F7Y5*ed<}8Kqy}0g3(RA=-$0eNpq{&a`Lg#gYT(DCbt^Y zr;)B_7{M##^MDe-3$#6<6nM+NY{$(NY{H*qXxQ6=6M4AGs`vt|KPZZ7^8coCw?MQ) zr!BPPc(1fc;pX}<)!A>H-{Jk&8M*HVI~sR>30yI-s`x~}dcReCREC!1XEZ+nYMexu zug9`0otWjcCn{py^!)XwvKiI@#KdQ~>X`o_4S(*(05v2OJ{UsMjX;l|FRL_R4VWio z#7@ltfOE7gC_0fdroICteF&>C4^vrR67_s%fNGWKaLV+%;4V+CfOQ42vzYjHRUQ5Z zl>Vk#OzR3bvtoXSa$Kn#oNGava(xW+xPvS0H)^yOZ75kIa^dJ;*_%b8E&cuz)hgi* zCD1k-zVf976kNF6Aq;&utYKc2HJzAJZla)^q$Y94Q>%H02A>$C;S_LU zrCo{{rAf998HbaAQbM1nXq1jevsd29K~_>6S_bF7cfTo3(QMPJSA|Tlb_ceh$BzSl z=LfcL*B>bb5FBIzFGYSJe9@_(i){5wO~n+61p7pEP0J-|CsNyjhat6)E7vp6kVwHR<`(&n8t~-d; z#fnujV%Vmdt(>~yuT%DvNE`P)q~e;ZtZc)uPW1PFp_RTN-hBrpn96xPCZ!_|u%kMB zc5>avUd0z$yVd7jm`tkyqYd;$WnrkS(agj9svx75NKvf#FwUCuz9A%7KCkeEg@JEIuxA{toyK8EB6I(yXXDF{pBooqRLQXI{tK z#a=u-g`$_tknla)(8?(Nrhq0bZrW(XlqiAzCbErGgFn%2Cl)jk2M6j@4dc>?hw98# zbRHIpY#l=!1uB!$r0=sU-PXpr=)H(lmRH)^z=lofTX31(i8zk5p5NP4n%U*7CN$aA z@o87voJU=Stu7O!?GipEC7$8QjqiW}gb84gnWuOZ&8%Fy#ODcl1-Uw8*D-=XWn}9( z6av(0YGqoTI5y%Bfa8O9h{D0c4*_EZ_Bdxr<`*$@7H-(m!u$s6g9yyIh!cnR@}KU` zS3rOtmo5XZ(Baq%F0*;gHjNtE<@4CJW;&OlQjq$~+`UQS$=@lar(>KbSe;(tiaIx8 z7|fjCpB`qkj&%5m1XQCZ`aua?k++qfBzbZPcDBN!Q*j*$)-gMWg*qh+;33ipyu4P~Cq=F@c??79Jzca+7J!4|;vT$r>c+Y1Hi@GZnS&a{v6 zh}ZWC>x4HA26#U0dV2m`vFI12q@lh2P(Zx8?4Dl^>p#V4Q5-+jdQ+@iB(qk)yJ@a3 z*D?>^n?$!N>1PlE^@z!z);U~i-G*^Q!QA1zu2r)XWWhJbW5;~OV8laQ_%(31r;?}O z=H$4rx1+B9fVT^+Ii&@2PsGOBc4Aq0M>e_S(?!}>r|Jkb+McYn)Rb`lyBB^o(>{6m zRh+E)cYA7s3=^1@A|by`C4$_+ft_72x{{*otNZ&zT4;qU4EAsH`m%nKE!4#!TV=x7 z&2>Md3&fL+%``@*eU+_g^=n+-r=)NpM_RhfH*wqZ@p|sVHcjd;BJ?;@dgC(5Y4-!U z`9b-2s-B0Xhi*Q!&ET!zf19nFsy!mtSI;6TV?47${L?q+BWa0l?q5W@2})VG-#Kmj z9yW|@cqtD<%Y8WEf3y`02CG?Zek#oeltE4|-LJ}rmm&0-Hp}1NiDncrp3!RcW>m%v zRf{cQ;*{S)YGj7ig7x7hjv@sEZh2|>AvtBBMdPEQn)YjTduO=jW%xm;dwt7>5h}a! zaAr$rO-T!m-H}$x%siCxA%1}s^JsK!{DbG^G64ANZ13k>?`GV9=J-_zyakh&>qSo6 z&JRWBi+@{Q*bHlqC|pLvQV74imAc~PX=XkyxbyAcZX%X>!i7cSgKG;v=#S4mw9Uxe zR(SW}9S*ZmmpehMVoKb^I&|mrk^9I(s@$F1OtlLyfU?oA*D*@`ADik`U5^-je)V@W4o zn777H`Kiz)$dyU>XUtG`4@QX@35#~Fa)Oc%*bTy4#xn~io=7jmwiWrW%wy1UV0%|R z5OX@2VLC`ieS|<5IaZV?9K|2yb1~Up(5EoX%f2Oay-Q8KlgdS9eK&Y7m}9r_rs$)} z=f-8o0gHEr4VpiY6nI$SqzUIA*2o2gM#QgdkbQL_p5pulF8e{qYDPf`YRpm4R!y5_%A_fc{`Wwqbe?=*l^D<+(FS6Z}F(mwetEfaqKl9O}=& z0Ph=2tV9(gGzZt>>vs}nerQNS1m~-=aR*~z*;EN#=t(iO?%5t@AE>Q12nhzniFbFN*EU?CODu;3&Vjy;n` zpUOyR#5&zSl-9kfP6JkK;{ogAPV`SJcKz_C7HbHnddN+ehQpaR2Ay!HtF0&U1?btM zn!0iMYwPIGKheAMZdZa(I0FH_Zd5 zCLJo+RIwS7M~lIY&(-Y>Wlm+=&*tFP@PgX8g+=LxA1I8iQfomnPP1ZuZ##Q185dV@ zNtYW}6J%aQV}Qob8*#V44=?wOxd9I3z*9*%D68GB%x+XJVi4S+M8Rdxo4f{;CjIxe z5tTp3&-feMV@pqhJ8beIMCc_rP@Qmn00@0oJ&?C7>F=BWzQlxaQicz#&O_RbQpXHp z#NdT{Y-;l=mptM;^H1_VvYY0>95=|f=^^+WCWMcDvyZ@e@vR7)D=S|Hdxw^44N)P* zV`n3dpOp0~V(L>;yD{=N+zb4NUg> znp8}ObY93GvG<;_f{-W5-V;WI3QZ=~+UB=8dVf#Bv7!yA&+Kk#XvJjF!CDi~{@K!; zRbov7_ae`6#L|5Z2hb1{p36G^sAN(`XsEpNL6e+)tO(W!O^4-|WNJ00qY^yzAUG?k zysx9DR4pTd|0mZ0Sk~0&K*BwtD5r-~$|5RwA)|bUzp`-XJ!>ha)@n5V8Vo5X#=|O< zB9pZsVno%DjUu{ZrE!O(#}7rrZ~iTFF8F%o^K>&x<)l2!qLhEN{8-_m@mvP?B7M+w zHDQCL+RpEsX>w@()GPVxZkpe_83ct+6l;7>#>=oQi{wYN2Gb{GEB4PlmZN{Q7Cgz> zXFRA?$>5`1|SdIodSBrqQO%@NXz$N8G}$ zX|{@?C=@7;D!U$gY?=2`43cm@5g z7>HLx^g&2HDYQFS}dLA^c^y3QpGF? z|2!8-TVhfd3CL#B*k2Bu^X7-ClT1rsl*`u`owWmz`jG_~sYvmrHrlL3p32(--3%>R z%4}}3#07@eHNpvWzzEd2MTmWR0|g^kYlfE*V-8w|P0h($t6Qav)dsV^Uu~;OY*!PS z*k6FL8=mKOFL!BmuW5i-vf|98;^jx? zDk1MiAIv)^LG3gpN>noS6^;jOxPGg*}zqbQcH#cUdy5DW3ZPW=wz#>bYOnr8~$4WzlnD5Yuwl)pezPf%cB5QZz z>ozG>Yr#EqF*R?T!xF1p98k&jp#plD98mdYf(~V3N+hPtW=i|8eT{*I zq7UEt9qyfP&dK7uf(P!f|9Y)nurj7^rswQw((rCHRKi!dJmJ=hjuq7hEw|bzY3w)y z9tNQii}-Lymfeh6^wqH@_>GLmCA?ojyv_{VXy6JRAfk**8wj9oNqjt#?CH8&4(z^p zJV`?a`fK$Jg|On2OlgTiHe_BcIxbSNaT57cwri&~Y#=goi^=O_Li0E+Nd;P&puDQZ zOo%AtuqvlgzQZ|zXn*@qsZM!ep532+iLFGtoTF-5#|H8QpBNj1{c)KnlN*52dl9YB zk5t(l4M?3oClBfIjI-H6HXnKQr&OZ+BMC8<`?s@+`ks^%FM z<M=^m`G`Q|lBG(&1wu2)gtW+jy0wWQ>;Y4qewC{W_VVVMtp%*I`-md`mI1l6VHc^kiiRa;(zFs=-UPeBnOjp6B zeIDuK9D+RB5;!oI%(asQ6vs8EO#IN<1dR`KXG!L+HdL) zHd@*vTgFy)SbDyg5JXV#6D-$0eq+F;$u&0kXLTc0Qw+9u)r+BuYC{1wShUQgM8Ch3 ze?Nuiq^uBG1{D;=(eWQsK`Djl3{#NwO9DglnBupGPHTD%&XXmS+)|Vqrmr26I zkZm|@H+t%g&0h%{*^6swfqWCJuHiN+0`1#wtf6L0bTmtmf=wEKRI0ljPT!7vF2bRU z9c?!ymj_wD5a%%#&|xc4{b?2vtT?)sm}!q~@pn!MUO4_}9%gJuIERe1(8EiQ&)gs{ zt3r~3d^65e8m?(=ylK9h?c2l@0Qq(fde9t(1~866S&w>oE&sYF6+@(6z`1s2USWCn zYLGJdduNfaf2dRoe+NnV_d%3r=@B;z^AC?b_aI}HNCI4eGa1PS~{)H~n*MClKT^)SgNc1L>xU&qK zt@eoECy%>sf>f=1i*X7s62*K;_^7I9)mZsV03=@DtpV=)Aa_N>mDQ)0LRtJ=kxddw z@@37-Z)TFDxNH*Nr)6TU@aTd!h2-fK2Cg*)RPo?QzZv|$1fBOw%_tQHHNN@z7dT~E zhO7CqtZ?|7tXq%@XhDAWW~@eaj<}Vk$rn3wd^YkskithAEWB$%r7ir898B=#o%AqK z^|)ed?Xpv34)a&`;ntjK=cL4X*z)m&1)KxLncvBe`E6AdvjwKg?}iv5JQlETbmbhMNVm7~Gw1G3EJ4JF6qD zN?YlCrt>*ntdCMDGkMC5Y(5$|d(Q$uN5TCY@sSqpm^Fi;RkQH1CkjU4gmVAW;{98~ zw=f*>mM&8)=pr^<45eZASAk=?m~82Mk|o?W6N%G1K;NrVyWkI*|s2{E-XY}4!M{-!_Y74r*;A(e}>EvnlaLE)`wxx)_;PXu7QX)%E4(9zTYN|?GF?iieX}NWYW+N1w0gLGrm=wSUz{$= zBlsU{m}Z~iH_c;c_zD0K^OHWDZggKp$<>9+hl!&5Z53K*!c-l5-8U&N3&g&P*e@w` z=K?bGf8bN5tu>n>j;AB9*8OO0=tN=Ju`vzr!A9SpTFFniFXGfy*z$#>3Dy}eW3q5X zXvWYxFY_Zf6*iLpHT@t4D?6&bseBN!Dp{<^@$!#O$W zHm`~33@tAC039N6f(}s$9vA;JLjWDct;M-oBlSf`YG*b)XlKIDz%Ovjv_r;sjNPok zVqGy*u6056Jv9dFog}^?B)b``nB5MKBm{_uq{et5%Y|l`=MR^KGxI)C*zLR> zj513&Ai|)|&cRK3#ur;jU2dF}`Wm5i%nknB)TvzmqZo^A-*e=pb6vgiWN5$oOOXFe zu-)CG_1QlhWCyp$As#GGoF*s6tv5A4CjvN{8NTe0$z_-Gf0pC=z-CX1`=7W2l~qy+ z2SkoDar>aHCX&7opYqz?IhIvz^O+M7(u3CsL^r~Nkgogx%Kj(p$Wo*BvBd;nhG`1elB<@Le+xGC@6d3pY_co^0>=9^ zToTs$31A)KEbd_u_|Y#fMuh>Nm{KfjwDBOgQ;#<%H3U*C90<@;oHzLx-r@lh7<^PFMZGiw(WO36 zkaZwoPy2r#(i=|HG;=S}>u@cJf)$p;JmQeIk9Jhr z3?)Pb08%}M1CzxFpijLy$uc-abG1hl?G!PVxzomyy z{vf5tfanFGE1X`+Qc-JA@HLY0sDH0M;PQpJvxm-Zo`nfHP;+-Bq2r&dgK56eYw|T_ z862>w_EPz^2wMdS#-8hRbASF}d}9Q@7b)%O2JSePAg)*cfFbAP_GZIz#3h_T>k=%% zWh7GLEI7z^u7Nm0ccVykm4h=2v~8EZQN3R_i6JbsY#$B!s7f@ZN%tONh)j$B^u(6z z*?7Yo)2}5enh#NnMm;KLOo~JbPQ_3o`+7sra}9=U_=Z;^InF6#m`> zUv$rW+zhq3(@Smrq?MfGuA`L?SJ)Hcu0L^&a^ndtoJZuHoSclzCe3_|gnj1k7LXKA zPd@yD@`yV6H$-~Ps~7Zf#n`yJd+8}p;&JdXLD~kB7MZ25(<{3(v>u@PYQf$SQD?bKT@gFL;%ns*3sjL z^1cMl2*6F(ul^#6*)uVnbirlZM`Vq$bp1+;>xhlNJ^SFpUfRO}0|{n^|5Oh0S`EEL z3OqvRG8T&9GS*q*Kc71_W{bZ{VQ?3Zk~ zY54kg!naP-(6vQ(a47hrIordA&m7U^24W50VvObdH@O+h*;(6Si;6ROcOS-@1%F0= z&CH*b?0V@xD^=iCSs){AlO+!&QtM-PH=jW0^`M(^StpLrIGeXWzw=GB5{MQU*H~>e zJ}pZsK4w$IR8^9`vkW6Cn_I%lS4uw@RE{@tcc%hLJ1|>4@phZowl^wL0h5})8+~`H z<5X#~>RL>FXZ!aYPA;+%9xlDLhO$I6KpLXTXFGOrN5oW5j;qYfDQu)f7DUKe-|)O6 z=mbb6#GoX6>1#?nOd^qdBUpmwx(5hirqI(cKxEFGh8a9NG~(rbM=;r+e>EGle_9a4$+pHzfRj=Z}!Xnb}89te?e&YO@gZhAPkb-7J|5|Or;qMNo!BgZ6@z62cDrygGIJ~DT z8t>=HH>Ft_KeDVUt*lR(0YC4lt-X#^{;n*t!~~Y-LD@3AqNbp%#H>-N<20iT#U%qW zb{;AHGN+Xpxyysnj7fgY{U0it;fT!YdErAvdZn-IfqI54w6N-b9?6I#zxY@O01@}N z>=!W&s6>yNBwWjS9?2rBlONdbNK`Mm(hF|e7z%yQ}WN6>=>Erd!VMZho+bnohZocl9HBxQtg1kUQz!$ZL% zlH!zWYO%F|2-q14Qss*4a{3{d!jBYuk+`CHW%6YB9h&bBd5BhKf$HvNvrC}t)(0Ga zo9rxjjVMv$NDf&8u8L=W*!?zvTq?EJl%)JEkH+KVCmJ^PJ5bOY>~0`ZBn0;p^7rw# zZvp5Yr{JOfHS(wo)vDZw(b=58!TntzhQ8Ki_RDf ziU_+_OepXeOCJG~i3nrCF^E9+Tb~~iw4R$}4_h=2M}h#ZzYhb8+y*jii;Ge*jcHrJ zUs2|L{_^AY%_$z)Fd;Yz5Po%A)Xac|q1Zi}!+SNxJP?xuPi(XIe3FeM0vK|PXiIRu z^21^M`QA@KtXv|cSFE@?m^CL!x=kWyyY5I(5_T-P)VfJ}R2@^fJzh{#5zcrPpGg^N z&jIU#EH7~Qi|CDv90kvEvCHon$Ns_V2_Xr;{lPoqrhIRwa3YddHaYz6BaOZ{Wa2iE zKDd>jH5*H-m?o#Tl%vl$R;ZwDVnROI18z5Av<_`RVoX7Xm&x>xz}ih*2i=x63w%`( zNB+zeqU)G6#yEFdwI9Kbqu+5~|Lf|8VDB{y1gD-cMKUuL>sCTs6u6{vXtF8sAGm`w(__?H~X~0Uj zx}VRwY^ky>b5zK7YG2ZJXt(Wt1f4EGF}We#+ie%<;XQR-&EuJ|&_! z4bnmVNhcKM>OhMD&<6nB(n4*;-0C7C&#Ox`hpfT(v*NV2zK_|Ri6`iZxwLqjjS_A` zxV7fi++xul3kQF8JM!^rvEE(%cYrM{1zxiZbxNi<-x9Sv=qyn$Z%SWHy&(`h^K(=|Avt6>$naAP$tM&FF+J&G zfdtVaQayE&I?ou*&gYCa|0NL^=S^>3;2*T1$S88uj3iG>C70H`-Lkyxgqw@)zILiQ zALJjj$z8>tJXK&+e%%!9BI3V&ynoatBjp(3E+iQxN_xrog9#I*D;QP?X5xOj@8Af& z6E_5$xXrv@Fc;~j^g?|ht0ns<$F|xvQCDnq7!i$M| zEBxZSPF%!=hLcR$)1HA%v5we2XPn+{HlxJz6#;u5n0kja_;Z8nWUA&c=<>1Q@eo@C z6x-W_*4=YI-#ZxCbBh@E0qgIr*Nnep}3K_#%a%{pt5qZyfh=qN-7L^HpkIK%r5zt zzCT2=%QI&iUgNI?+iOc(5aQ=`uoQFWckK}`TlDhs8Efkk-tm0jTj_N(wZgLFV0!*~+$m#Cr(ET#BH^ zs40CB2cRuY;C<($uwsvEdCKCG+yXWITnMpTr;7AJF7o8c!HCL@=}G@&vj+yH`s?JsVJ+QbPl`Z;U1+(Jy1Z*_wI>r}dBP>+!(((WxcaE9e8^S4`ao(9 z>*8I@TTG2+g?D9QJ}R%POVMibBAcg;VbVjqT{|{RT$e!_3=n+EDjD<>+`pu>Ow|)5 z53D!c#8p1GL(9jrQ1TfgXcFgy%&3|I?>ZG$O`S?>w0y<}jZpoyg~Nv0!mNdJ&0*4L zUKY3>Hbe=(kr2aGR^%(x*(pQ6q2zs;^i+igp0ME%zl7k{?7(TQB9{Z zMF+9*G!P{}QX#8{eTqw&;4+VF#EGN|o+=;?4XsNC!&^ zN~ngI<$XfEZ6yD8ZMNgVTJ*ZJGbyu%lO^Z7be#}0AR$lq(d52`e?x6s#8?1G!$1Bq z+Dr)yXv*jDOTE!T9QhwS((do_+dm8~o?$LJT%QLrzc2MaXh>fBX{O`{9;rCmHARMS zb$`Lg>gU+57yo=Psho3Kn=e>nOV&zr)>K8RXWiuQMw(t*@^4t)oZoZimiSX%+1!Y= zuu_fs+bE>Lu|86foj$=-z9?E#lk_^KWY6VxlLmOCaZock>~VPjsiWbs31+~3@6_us zhoR)f2Vz=okjU4~qFfsy+qHDw;iZ)n9UhA8tBDia*sm6W8s2&2B{)Oj(~DWZDqPM| zIf22=VniEaP*xAmSp4~vVgY@HWrGUe>3;sJ=e}wVb&R&ex0f8Te)K>Qk)(+P{SM_= zb{bQKXAd>pSRDkZY38!}>hrji<^5OiE*IDt7{%X9-v=xgrkRwn*(HYxx?!}z7({Xf zi>(Au0)36}DgUqwI1Khxr*pNK9|%!3g>@mzr4H`&kfBm&E4`|j{jUD%%C@JCblb0S zK9kGqwfcX#*W!4RqJ zAlTI3Pf@WO@y=Xs&@);hc=c2zF2Z7Op132C8V zMR8ya<}h2}rkfs`&_Ms?+>W=qMZ}eP?1M?z*gKnXw@+;fN#m%X_gbcz;_szaGI7;h z_*EzKJ)aAYcQb7#x}7x<*)7Kjf&m-LwgQr0M1|YZuS#bcOYgm!|J3h zv@%kVIQbb$*l(N_gWV@|O~}{-j0j&Nic?b}?@~`UNCNpmtmSBdx6q(=B@~jas-@ijm_7WABLQV33 zQ%CICw~Ht_477)@wTcdEbjn{A<-g|zAE6h`<+w{}dU8IOd0q>mb7)%JIJNxc@>wQcZDTA9b`vDw`sWQ(vl zUq%WFxUq%9!ah>vyKc;8Jg(K*G$2@%{DXCzH3k~ywBPO)Z~F@)dq1$QYodar0uOby zg0!prCPqRrh@%N!yP?~+tC7x1pzFRoi*T- zy|F0oON!-fI7hIB9irrif972rUK`%Ui(p{}w{{B>E~K}@TEcIh7hhsRG=92c6wgSK zanQi7H_hN;?=9f7-T}C%x@>ahA$i5Bsdez3V5D$~Tx|wXHH5J_3=2AnK<2|0>wO1j z_~VAX9+om&31FUN4mnKJR{f2>ni6f}ef_uvVQa$nBvm!uG2GAipU^9X(J%f;a!~Cr(lh5`nYPx;@r&m(f3&99$3DF#_M9D{t zsiuTuQ^l5jl#J|qq40GpKi9X6k7O#S-D66vlyll*1B7arm06cWnWcf%$Ka1foYtEeQ@IY;3dTA4`~815pzJtqg* zCPO&u=3gpSd`)sQ#5*t*FS*PubiXZGu=)tBz5eiJ(xH=f_h6pDZjQ2-=J!W0L6cBI z$gp~(qF?nW{gI4&1Wi2kNjt#`svd)I-MTRDpp`ml(*4c&s?ND5NyZ&6i}V{^7FXOE zOvR=5GJP)LC;%7?BKsRv@UqRdqC<*PURTo?ciWh*BEGFqKb}&o;OlKo+@1=G?`4K_ z5Ki6l?*Lzfg|9}-JGx;uHYC&&XGT;pO=O4Rd=7XgY&Rxl(reyMR~k_*2)2yvfDT*G zb#R4X;;oEzgt<`H4Se33Fxxh52*|}p1Gv&Ouo^r;EZ#P-*MsioqFoanxF^HvTNTzu z>|%J0ZMfJ^-8 zTF-OH`c>40RiuTWPNU?6esZ1YYE)?eA1Xv#cef?)KenT=#YDIt3 zKuY4&$=9IkpH4FTCJ-Y?aS5mGVG6Jb{{AsPOMn+1x=bziB*n{ca;DE`s<53XBjL^o zg@x4el|y|@SD+jwMfXPOCu!soKTMzS=JbHXI$`2gkXh=jAxtj}7X$h|&f+U+iass@ z$5646QaU&{H%;hl8vsFo%=VOdQlB(G15@PEc5|8v!^S%0Gjwk}AS0iWb~oDgWN_<} t(nd{{v;Vg+`p-Hj>_2OPCrOdZq{NgL`{Rf8XHekx%|X8d^#BrNW(cRA;L zzwg|-|J<$Gs#j*7?tZ$bXQt;3Q8vRy%WG_J%VcO`Z)D2kZVPV(|M3gCgA9$WO`XY&OwBFr1SpSMIw;94O#~=4 zIOSO6Kq96VmXe;1rYfHDs>Yty#ylpJLV~aP-Fe{vwx-U8>W+XIhnW^jak`&c1 zRt`oMR$dk!UKUpJ|NJNgUz77Ynwaq_i;Dk882nCv(!$vp#LLX==H|xa#?EB#XwJ;a z!^6YO!p6+T#t3i0=;UGNZ0OEt=S1}k@ox-KQzv6bOOUgry&d^8rlFC&i?aYFCG)co z=Kn~6o5%c*eej!q7&5hk)8YuXpIoY(7tS4``4_n_06 zc6N5Qwzd`)7B)6ER#sNl*4CDmmb|>Y=H}*~KYym9qcb%%H8C-flamt_6_u2fG%_-h zmX=mfP*7J_S5i_kG&I!F(NR@Z)z;S5*Vq60^{cL~u7QDpii(P!o}Pw=hL)BV2?+@? zF|oY7JP-)v=jVs}Q$|MS%a<=wQc~R9+_JK=e0+R@f`S490zyJUoSd9oTwIEZiYzQF znwpv%92~5ytm5M05)u;Z?Ci?Q%4}?G%*@P8OiYZ7j0_A6A|fJUVq(I=!c3ef#$P`}c%|1b=^jYHI4(*w~1Oh?JC+fPjF& zz`%@*jLgi;prD}K+}z;c;Ly;}{QUfynwrVUNf-=PTwEL7PG;u0hw9mzEb67Ah+%!C-J(TU%9CRdaK5 zR#sL{PEK82U0z<^<;7)VV`E`q;p)mNCMG7q`}eamvwt`Lc6N5o&&>}G4)*u=clY!R z4-b!yjvgEwK0ZF)>#E+jef%^eJi4?!*;Ct-9S55qPAF{sDlMeI!&VyM%FHeS(vkI# z%ad-GLl|elC7>5zpw_bqWFma$Yp$LV?nO$=6XR;ZETjtPM-Yr{{n(*kkjwVxmfR$*?d0Z8m2dM=&0Q-d_uNwMI1hn2 z61(KjxUDe@?D;OlMX5xo%A}tDrd$>*hdJS;7Xbic0-djsuaFk!=8W8Ys4WxhCbqWg zmzQ0SHau3|3U+FEL*0${t}G|N1yS=-wckHI5rl~~yaaT*RHJaghi1S_z&9w|8bo9O zpbG);jhPV`0RV7ERhWRjHUI!8H>ZIw?*M>p$OQ_9jT<0~ca{cN*@OU?{Q#^?M*wKd zgT)NQZQBt5jcYyxBU;X7jxSq~zx76rrr;7wq61>ngK5mi100=Rt?p(b0NShZw9~DL z!9(Tf`#b=|B8sMFzcUo{kInva<&d~g4N%t3L&FcOv+yH+Sp)veY zh#IZ=_`CD1`=w##k@@tS{9UjD0>D5I|7j=vVNFno7heW4jSTB<<7wbJ>rk+G1K`#O z-fDmujWpfE0hd<532A2^d@G#*lHb-w=SP~pI+im5@pnhGnr;GSmaw^xL;#)W&{ne5 zH|j9q!KPt&r_vR$Kr0U)x4Aje?TgM4)vTIHr|eB#i&&?>T}|7^X60Pw=$1^t#2a1! z6v?T}f0Pl1?gCMO{KbWKG_shp(d_dSX5xykEBM|%v6%staZGN?NxoF?E*L8E) z(&z;M7&sUlzx1BLywz)1@x2p^a4MpJ^lC!A{O!N1yVfeMROp zxA7TG=clQuM+>wWxAKa4^WXReLVlwoi{^LJ2AJkYvv0h|#mX%r(l4^AZd!a+s31?3 zwnF=*M54~e<%=*9`VMyoCK9mB`POC=SHqI;YW>_G=lVfa*}#*wi?_ASU25>g+>GBn z(X^0Vy4O$JsKciMgNK9F$KA|JiEQBP_~l&W$NC3KjgmX*Hr{5xy;K7-C;xfErzlo; z|JQ{b#+UVdN3OKZZjX@2)vxw8W`6fwmq*J&Pe@)3CB`d#Ixtd)%f{|YC&AY32Gn+K zqr1bFhvbUUXP-M2L3OjZPbU4>yXFNyab3(7$fh@ow%H7!w!X-6fOrIFM7694TwGz?ik~cLBMXg+XYYW z_{K{Rf3gi2pJA%@+Y30A`t3cI>6iY>yx=`aTa{2CnT!<5xfd!^x(}bleO=Crs(y90Z=Y~&ySQM)o_WvZ zxj$~uJd}B7%u(-mwDQ1ufiKOmP%q@WXW;Fs`miw9xC3H%#JV%LXS=YEOWk-Pi8zSz zlOXd;zB@4woo2SO_BzUKjS>18T};+5_+#vT3$9w_kR8AZblCK;m!bxic?GNXJS($L zN0r~d)&)gpwp!TllfeScVs_6o>jZ8U3OsZ1V3|3KR{?uQe&>NPA!cUL4_lbyB!N|W zxx1TQe&=8BvMm;)eQc3kF~oB-yXAEXW9a7$9E2MZ6$ItpO`%N2`)+&E)_^t+FkC}dsN14`6L!|;Qg() z@H_Yy@Sfy;LHaN24hSQ}2DGQC)g~c?WvGTrtIp)hMVCX`Da?u~`*7ix|uunDxx?*hwiHpDU;kJliERk5)@A zcfU)SJee6D?#1Yvk}u57_WN;TGSYl;bT7kD9PORqQ08;h`{(6=erB|o(9Oa6!|wIg znOjDY?&DpmJ1B#n(4d#+l8j6|cfdf<(|ad@`QgywToz>p(wDs5+z>+4gm9&y!RT4eWJ3ta4XbWm|r2>v^mbfD8E z0Oo8j|5qFxf*Dggf>hw*3({`rXI^Z#^##?B=+}2#*u!1jP^q_R)NGC3TzmQ41Y1Uk60Lc-Y=$(HR4BAw9?E))z7@!S za9_`b2Tu%Wo#Uk0d?bmHPSbbh<4K6-cET=Jf-cqYxdNj>t_Z1M3t8g9`Lg<^ zE0r)(!r};ePd^P^A%Ql3C-Ezw;pKeCce!1w{jIFZSfSx@Pa>I8L2C1O=&0X_>|Q-e z(fP^$N{E+mw95wc=wl{v9=J;8ZP#pj5>{XqIC;7?uHZ{Vw8Z+JEJSw1`*AU$E39J8 zX4Q9n!!5?omE+Q0CbN?9VWX&=AzG-C5KMC<9wTsPcix){E!2=bu#Tt`!|$lbH$9pX ztmF3kez3~j$eAx+ij~kMtI(?qd3KT%J@Y$odvWgGi&0Kh!s#3avh|G}~KAoF~9@MDL0a zPq)YIu`I(vJ@f6L-%y7JOpL65K&+q{TaAo@6g)eM3R&m6kiWcpD#S>bvZt>1lVEr} z7};NKXk+x9-4(cJ;zHp&K*GX=T(!HcyoZ&p>q>zjgwSERLV4KM;gQcqD6)BAjXh{p z7gUda$mcTON&{9&vCaI+#~@heLk6EDI(}SFb_J5j-uDbM)B5uGc&{s15%~&S?`*aV ztfZ2xiLRzyAOD^k$n1+&xR=>OhEHzZEGI{cf~oG@w<{8i1A-auSG|7T?<0J9Pv*zV zcGK%f(yssh_QL7N6kupSkKrStG7hXV#;J)A_FH!b@G#8jf_~NWgfL9xn5Qj;@zE3#fs+%_JI%&CxrgJq-pqPG!4o^1*O&9? zU!T^5YjDn80y&Y5$4PB%y`mVi#>E5P;n`Fl02KS+NJAF?iXXSG<3bY1H26u+%f$p1NGq;bMllR4L3Z=dcwkPm}yEWr(IQ>(gDG z7Y9?g3dz7T&F-u4t9>2*D;Ma{Of!|MN!A_6hUIccMgsF_q51l^>i+NTuDP#!aWg)5 z(ZrU^3$9sS&h|Qc(8rf8^_ZmdZtf@1<2|-267aPa=W>0S%i>!X`vYLL?Z@`Xdba}7 z^i+?h2HVBx{YBSnXtqcw#*y`MwxIZ4biIi2;uWd-5y)WA@ZwZt7rkL*#q~0i>O^8e z&>ea#c)_ErWsCJktIg=Hvr&e7U1WZ8Bb~1z z&iYE=t8&5Y+Zqp?;)=}IkinHD&pmEGZ;PX)o};v%3vP!ExMc3>Uh`8>C@z1&quYKO zDXwcBdwvrQP`BFsaajUE$g9&mUyzvIZfr%N|kWK=geA9oj0!D+xsXXx< zNba>NbZQL6k=)_0+)|xr=p2Mbp?0OBLk8Eu0=-RBA0c7^PM+VKc2TDH0p?uXZmT3m zBV`Tu*OF-Re$tU=@L^MDl}8VJ-F-5@*Iy$7 zUq70UVe+V(`(j-&49%LUBz95H?!G^cL*FUd+zC0M=t|cX9pZ^z?AG`k;YD48Z0F z`ng;^)b#Oq*m%3XgXx%)6gK}Z0!Fk$OFP&r7Wl2dITa9skKnCi+HdIq

eU+Xl-I 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

q$ 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

Y*Zas20KEN_ zMLHP7(Xw9pa4ior12Un>Lm2*mZaNKqZsOgLvIN6ff;jI%H~K8WqP|i$Fa<=<;HRAl zm*7OaE@{pLi9YcQ6SBME8F8y_LKegO@Z9c9TO=P~<6x%1l}Ttf?S!Ul0)Z964OKNL&nQ%j24@d^iT zm^ttM>_g#@5FiolSZBB6!=BM6C_G;U)*}6vGE-q_1K$SvK^0{H>f)vPk)G=)ZRS* zkN5e(dtg2wX{<*mJ?wp`N4)IDMW@| zM|*2~1}_FFUV^AQSRWc1qd-^J{IEg34{iM?yB8cTyZ!K>*FM*YU7zX+SvHZ|TY)pe zK*EiyK*FwtA%yw8C#P2-54hiXZFqjT&qaNpUwWf>gAwPp=xlmJfP#pYZ-WxJK$;WP zzZoqqI!!7L?h&C(`2Es+=_^kh?BSNQ51W${cFxg%+a$X=>e__9vq4bN-+8;QFMVCT zP@oLm6W=@`6ybf$>O$=s-8k#d=)dQIWadhqg>>UBE3=@>%cHCRI+GR?>`hc-;y%U0 zi4i4}pbx6Y*B{s`m~4wx$HU1z%a6WgdD&Ol|EL~^8}n&X>a5j=l+eRl=+yENoqU6H zNQ6F!K1)1b0PMS=_FFBgH7^t2jappNyD$QHNi4nf=J3m-XO-Krt5qPOENN>bp)5*K zY5y|zuiVT#{-J!}Tg-bVmMNFmDppqgxr@vH3u`R$O#uY4KO*&P8v#*GN?wPx3gov-iqUI;IK z%^FlA#UQno!;r{)Uq;Y*X#pT~#7%#W3^jrLI4``l<;F5Aa8%0X!^Lj#6PP{{WxzSG;wG@FszXh3zT+n<}k&!JD~d_ylX5~W4;A+du4JHIw0+IL^U->dZ-{$jKH zV-iFPFMI;iwglz*-t&kYE&z~b_zT}}ZB9f%eH|z9cSgi3xtpu)t{PA89h2w;JTybySYJ;}@P>>q;LNCUO72(Unz`1#sfJUgHPn;4& z(O0q)ODT~`9KP}L4S3gcXQoM^Ls=;ukG8K4>vG+gVRSAz99-%eYUgc4|;(@ zg@FsehlI;Q`u)MK;=out9S?s{U-FE8Uf|OZlvn)dJJELCDVaLsNBwOBkbS+-i)eDV zJ`dVo0#uPfBs;E=o8qZsNu+-!5`ArcYVW6^hILpw`{Z!#3#c#Ve`J*3A|$ScMd3ZU zKoM-%*2$GOJZ`@r7OHp%_5GEj{s$Ea`A-~}nZ(t&9TGufQT{G-wPwWK!-_Si3v?#9 zd3znrvuJaF*tiyO&hzVV85N15`1O7Nr?qc>YFEvpYhPsI21#Anff?O7XZLp$HQ+dQ zzV9CqfTTlc7UhQVCJ=t#K}iy5x2cW;>oEals0nldi`wUN?7DBs{wl|XSw+*s`ZvZp z3--^42S#h(zl7n0cnj16qPf#>z>K`fh(NmAf(n zV-qyTaX>WwX#epyYj8UP7@MfQ;sqjsgd>?t4kuKX;OibWz=qAy0|88Kpe`v|s(N6? z>MCf@U&r{)crynJmKHdG<+UEw>HCmXd$L+j2uMoxI(+yoFflP+Ub7nQvDX1w2>_8i zys5Yi9LVrqmk^+Z)CL5S{v|99tfn^DMhZB=xfm@FY<$0;ulBwO!IThVCN<#$mD+40 zhhI#*1_2a~5faz;Te-m4Yl>KpiiwG%zP4rrr^JyPHxSEK#}edqa)JtAD*n^46VeD$ z6MBr75li(06I38 zBh@%ip8sKvK6Q!FWzb*gy4n?^=;bf&;_@T@;f(L^5!21vUL7nop)L=o?_pbM{=;_u z(R>T_U+a!;8r`J+TzVv~#3PKQaCXX-*K#&||H&j}|9GC`UPB)SmZNX8;Dp5Oj8Iqg+0iq* zv*-bRwO%BL0Z>Cv23Ux8{E0DWTMno$3qp1)B|3L?HpK}cJZ8iYH(2iVb^PFi^WC<~ z-y-XKmoF(y3gPgNmp%)nJRZY9M>aU0?X*MNP_!!sdC+$_GFBH(agYWN(?Hye{oH!> zxzTsd#EBu1+~{`4Z#Lh6T3n6LkvW#rVu}sBFCWlfRe8S?`UyBm_D|65pydPJ^gwkk z4BR-RF$Ay>gaq>U3npZ6K-CBd-|NsumrWADE3L(^M|sb7$dRhd!Jxdh4yZ59KekY= zeLeR&^T&t0m&|zrP%O8jM&A0Ler!4wgv%rcS>DT?u>SYr_zLCUk^Tbzdr>u466x_w zn?p3zumu|_`s+JrmO8AV@^764EDs|%*2e=9Y&AQHuf@&!tHnAZW;iJ&DOOJArd;7Cn#J%W$N<_Zd?PQLA(AS%u zd}U^|9jw@pMrStYp2Hp*GGWqbkWT)mlgud!G;zuOYu7C5e_PD>5N7n!j-tQx5o<@% z6!6dB#-9k!mKJ0M)pBC_KVH#5wuO<u<(y9-4EWmiU?q3Nj82>Awrj7`KU#P)tUa(tn;={3X=j`WOn*(o&TF zTL6_R0aAd2`~M0cs@y^b>kIdPS+$IHTsXxb!ik2Y#I;QFfWbyt*tSF+lnvbW1EQFHgKwVPwjShvY5v&8)$uV)%^3(XCWxxSB6#9YMMRb z@g*tnOJewxy&xRyy5dy$x#-+LUv^Z$&@Qh3MY$%V-bp1m(GLsPrQ!`q2s?!n^@@iE1 zl9Y>=ayQi>zxE5;K^nMFWc)$$ks>g$cdvkr)xuH)nYr)?9k(MFh-O0M^{;N`1I@~n zmGHV~saH_8DbXi4`9+$729{DmdYxj~{2WwOKQCYj`h?``R+9>ol};5#(Os9eq?{!k zvii@UPlo$*ulJ!MsO!5r0lQ=Gk_`ue?OPg&qh_<@2Oj5v>%HMDf7+=GRFIKA2KWZS z56v}C71$_4@0pIl>v8uDvd?-)38gO7cRJ{RIK{c$%XZM3L7K z=rSxGl&0JIZ^KVt7TxW}oyL4SnO}l`q)R8^hSBdr7=$=0JD`k_h!0Hr@kRE!#+h6Y zQ1@2m3mN)wC4p(u$CkAGY+}>=DeLh8{#&c;1*h~RUYEK0=wZBamtTM$D zhk2@|M=ff5?!$#xZWL5a=VHE34&|)&awJf>Xn!X|roi_XU(c!TN*Iq#aAbZqe-_ji z)pgMkKQF}*C5Gp6^ji2wm)a^H#@Bp55A%PJ&Ovso}~^|=1$mad8_F-czhg8O)-P+lNKD;5bkvK}uTk8d~4 z<4e;B+ML~i*PVYayeC+1&dOR`&aDh_6VcG=ozYQ!|9UQ+vHlWm<-m zb2o^iBSAeO9lddw7`Q&CzUS_uL6`G;n(!9=#KatR+hZ8lUd#ZBrbPfh|1pm0dm3st zx4P6StT^wAeQo^_Z3$sX+i(Q(3FX(TGu1AR%WV9CaK!$If_;M?hC@uuMU_oKRL)`D zIdyD_ReYm(E`x;4ug9LZcNVS%@Zr$$jBLY~>4mhUIfXSuHm7vII;OnW}P$tsm zJ-=ZPYByfNUR8nl2+u|gh!Zt$hP;-P)k)&uqG(nw(keGW-VUrJ3_+neU7eSp9x2ye z|9~&;?g&}O?A1~0^r0UenYSdn z&TW6#X=yPd-p$oWP)W?TUD-F)9&TyAQ?Dr<{@nDQKQQXL4xiP7R6|=R1%;VC-Ug>g zgT=LidkXp#S!_Ym5)l#A#=8pUEhj#p({bWbQyxsKKDOI+a?5Q40V&FSsW;=+eu56r zGe>oYfpTKKQl;wAmX0cq&72BLM$Vo)2_S_Q`u9#t&a0WrGapYceJ_ouy74v|T0>KY z+9Rewd4D^r{`8~b(iui}?7JE%>Ddy+^8w_|Rt!Z{Y4oE2-#=uUewjy+RSRh@VVCOe-!P zwgH;2uER!7s>@7i(-&S}@g%9Dy}t>Wf_?4{97f7d$DVUa=;CL(Vq;j0-W-HGDi0lM z?FqItroYHg8*fm{Wd~a&juz|rJJS$z$|Ebbh^>=j*7LdUek=hCM?XmPv(>0)EgS-- z`7iW3nd>$m0!2$HE0$M81EHJL+_}(jr~X;8xD9-H=d?+40paGa2SR8DN!K2r8DTuY z_0wcK%{+oI!k_QzWgfn`(pd@({;4ku^e{EAR@UB3NH8ka9ES>2w)YeW=_L15!yWtf zh#VA_=e0N|*w`1!YUYx~3{t&gRB@09y$tOXccX(465-ZlZdF3E9A$J1%S`#Wz1u_9 zH{*JC&SwFwN_`jIGv4;NXSU8LR>y)i43%A8?;Fw0X>lD7^%?Q$+N zU$TB$3nwt)MpH_t71bE;REVULj$((wBgiD{B#;~lP;#s4ch1LuM@){Bzk!};dBvJX z@g2pz9G^y%#MW_H>eeqWmh*mji$y*jDm%-I7VRqEeK$8d@ z4S9=P+abg_+vWPJKI5TwWPY5l!q4@qZs)8;xn2*PeBRVgOfGF294GxUAz(mx+4b(= z%gA06nGQ*%JVawyaszuL^DADJS7e*(m-HfH3M|g)J7FMu2f>F9#W7jgFDGHAa^A4Z z1<;p7(h?7iTxG95pPA#OcgF99xvSK+uGtH<1eHj&Yc)theK=4oT4RDM`}Z>6-p_>? zT!^GM#Pc+7wbX8!7p#(dA-8oB2G~r7N92jvxAMN9LZpoc?qHaMC56NhHL2y<8%PZjkFKTGig1L;U|Pb0&AyzzWP%{OF1 zK}xFFTs{<{Q8$rE4I{v^Y~B(z8Jx~lNe>h7i~G5}%R1pO%(Y}Zl;$;KSk2?oC_0jv zz{N#D$vKY%H5K(kM>wxnnmj7KpgS<=2BEW-BlA@SV!`KI?e4x({#r`wweQoO@>eB2 zmb&C?a-({sybERh&W%QKB$f1o?B4I#k!#*~UChLOy%||CBmaY!cZyHb52;_j27O2A zQ}9`?E}^59;zPEVo{{GZgPR*0;pxkp_sL?U-g+2??}e!4W%Znjmr8`Guo@{ER}uV1 zoGooRv5$-IiJ6>qh{#w`3j5Bs*DaZy7!QRRIZcp7DArHbFk7nxbq)Ic@Qvyd+X?P5 zCwr{UMSJ9P`(wqNGL`&_=ca*!CqYGFJFkre)cPr#ML zj{X=Xl=Z zH|`g)vhoSfYcnzf{Y~7y{Zb--?dWN}QSzm7$i9ihn}|S8Ud{4pzmAtq^P#(z7bSd6 z<~mWgt}ftY6tPRj0q{mC&`z7k8+O18Klh%&*c2kMQsARGrokiK5sAmE5#)#qW9}|} znj;1m3G%d29Eq7ba!lFMu-a&e2q=BIW}0rtvE2TAQz6!UlQ-O`|KP{$IFW;c%NvU) zJk&*@h!5z+BD3e&a**q=(AO4XeY6~|((cPfsfisULYwldkhdGQ@mN{$vugc0rRwyx zP9?bZ3gD+UrF}~&XqCj^mY>5IiPf`;-uoC+yY-*nH}hjH8Z$TY3R;FSV5) zWi8XpT0zeWW3^Zu7rkB1FKL3U&LwaXR@fghDmZ<(-zh0MIn(Q!u0rR|8*mpTu$hrBn~}6aEx)ikO{Op;N)l$! zF23>k&A}#Q199$|(d$WRZEnuiedkgKLDuRdrlKETuyO1|pk+FCc22VG3Vqb?p7=;e9j`ldqaVQ#9%`QT;Vsq(0x3Gl!Rjrv%=?*jp z{RE2}nxEoumKqjp2f45>k=;aqqLD+JU$!_2Hio<~uA-7>BRB>`r#X`(rf|r^$tp9C za-W^7J*hMZRCgdUEY;hCH*gmBz@j?q#dR@7EtrxUs7k<9i=B0*KDfK#~#r=dQE6c2h-G!hE*pJ_Y;L{H2a& zUSuLkE~dWUygTW5*#r$&%H$n>4$zX``I!YXmsmRU-Z@nZa|YB#h#FPZ>W`61>8}@X zRZa^=&E6xpnnqdDiZyLHN#0(Q@EQ8ZA>(63mK>Vh~1Fbra=YqbWL)A(6m^hFAT3WUOjSN`Ny0A`Fyy_t9&$w~fju8%L{s|IlSuO0+@g7e`cOtV~vk&!> z9h`CF+)hr5Zsz6|vY=NfI}tq`{wo28#0)RP7P;hQyXNc9G%DrDA>12jfsupgo@nZe zMy>FQx0rUev9Y{8bg-g0y%9&oDvGv#8Lfz(LSv`+5d}Ym9Fv`TzGl@uo}(d7pW&rU zUCCK%osr#vWuX<+DivFL@`$kFAT!j#p%;K=ykeL@oqGdF5w(9Y;lvKev z6=OKzxV1PO)+E$vlrQwyhQ9GT-+wrZlavQNa<#Wgro=B+kn6(2?U zYO{#&8@KtH_;1bs{-)l+ICO)LhaKs}O%f1*?R6r)JE@S<+U;kiV|=z5B|*qaQ2*SJG07c}+$MEi+LX ziTSDv+y5=mRNWzCdr>EcaLt?A- zOHR&b3C}Am?A4{Ut6&{lW*1Lk3H*HKw2xI=6CXDXzo`)UD$9J--kEOXR@m<}{F;V^ zG$NUKHu1OojzS?K`t2()$oVt zhujn*I~xV5zf4wpzu_B+r}_0g4(u^%S{x)twF~24J~RDfuvFUfHt)O<#X`tJhi?0Y zh%JjVJIdQ=ZT6fM`=(?f6T^hU1g|eENxCLEY|N*ypr`cCWpIW@>M8r;vT#&Gj+Qb}7x2DJ<7~Iqlaju@K(-HLpoq zaFiV~GVrqcxe!f5jSv~;h!zEw>E41hgXc5U*oR*QBpA3~X$e%k27jldC6lRknBiTI zZ_~NA28z89b2K6EVfYOP$0ep_Obqy4t4HRd*%(|bT431>k2K7aD?wBVj;T@@v7e3N zkK9va5%jWIwZd(ykJ!H-8k0!!8(;carB%sC82#{4osg?lgyk&!#8AEgGYnVoeO)HSt)OLpf)=!0M9f;a@JT z<~*yba`QxKxLNUa+HzVB6^==Kw!^dIwL&EJSQ2C`l9Go9ur4Pf4ar#mj+%Yo0>7p?fMTj1ixXphl-GHG7lyk2ikHCN;WX1k=w zsRQ}#3bkou-veik8g>X#vaFNkEb3CD<0osrJnvAgY>qCcH;#57?*EKYR8^_1wYWH3 z(X=SXY*XqmyVxCStyM9Qt*lr01vqUay*Ca`jei?2E|TE#b5`NPJKdS0zOWA070)gl z@!_sUq^iYr3Lo?Q<9ChUea<%E*-?S%!?983bBs0oXpRw1fh^cr9d!Y`E#|CIEMb82 zIE{ldb$npHTCW2JThN@zi^8>#Cy!_%6K>VF;w;i(n4ae8fFy>#B_q~m0;}aXiNxL`esb9bAZ512WK?y*!v51m zB@4Y;<^1qW5f`K8@@C_LW`p>s_?be713X=~vVFF)FN>UlRj3%a3YcM>SSQrNkt`uB zg->j+KBsG`S>vhb+CIC~EBx9d$VtWFp0)$~J*X}!XbCcnH^*j>ZRk&q0~Qvr<|^5E z>N)6QRwQwAz!&8l1rF~z?a|~_^>p=xg=`wb1{28QJvT)3r5B1%Rx>SfoM%P0edmdt zbPQrU7QXlReRT_w9U%j_W=Kw_HCp(r)h7je35Sx(^e;{Z@((5_X=j+ZPIIIwnE-!| zSt~|h%ImnQvRUZzlXRe(C?{`Jv!M+$;-FFQacdflHf`A~7}rn*zWKmh>}Rst4X{xiG{kkSY{M=bNK-m>U|OHXd65_vy}A9GNih|Gr0 zTFa=g9}_dRN-wLrHNjGzZh5<1?)#-;K`{hDcnq!`9;t-BHgvv8K z_3jsRyvjH8?DRA^d$Pqhmp5Rckg|$|Tz5^HqMl|3cRjf;yoOmnmrdxfj~!k`EuMc< z*>Qa)(%{EfZH-T{C-}Lnc{+yScW%x!j_K5@te}4JoKCf;eT_J7$PI9&dSzD9gjlZ$8l?hP>$M9!FZV*BXTh4Y3vr>l|MTH0K zl!Zj6zR$eFrI!8C#B#9Z$uMnQ0t_qZud7q&gjhYt9i&cMxVn1jpq%lBY9Wbi5Hzc* zcjnd^Z;M^lT(MgD{Ri@0AJf68xxDkEjRbbe0-mb5cZ!Bip@sp%{1ke_T)i&H+1t!K zNw>}FPw&$3f`ScGfQsMZARcg9{fmWxUi!4D4}w@YqU7yl>gN6rB2j9fKY}ZT!MWVf zky0j8BgVE`FQPxSKOCq$-<-*5mRoRYE}Z6Y=T+U%X~UyhpT*g0*nY$sG77ShFFHnS zmq4-|g*#OBW{n2C7Sh5NocH&KM+A!md&tOHaglrc&#a9t0h>efzf?D6%5-ef#4jvA z7WFi#l=G)NEPQ38aD%*Huy9lb?fZOHFx3h2gpU9UlojbUBPOk|dyI}E_=#h!j9jW^ zO(X2K;jM=ab35Jb9i5JZN300@z8YgE{@Gy-D!#(yp*j)$fsz{dR1=Zg@t%gFVT6T% zW^7t9Ib(70ETv7I5psj@k!tmaL*9LI@X02t}c#lmHRj&p{PhnL}NtuDE?dF%ZEkFP60RcU|7D@}| zrcrTzW5(A_F|x#lw{Y7L4~1r#qahcAcWbLj{d`%ulBlz$q1Xg=CeFgD3aJNNP5&%H zPCsnR@eHp`2iuQ1rRC<0W86HQcC;3ILCo=aR!UkkuBMo{ltdM;{1!dtD;8flDpBf?5-k0UndgFokR8NbZd?l_LTbOOM za&{LX*(GF<%KyTYw4XB`uOPJj{L}9xt@AOW=Je-kx}}M>Wn&f#H;&>mMI>0tLk2{z z`Lef+Y0}^FreRr;N4wi07o2<8Z?77{Bu+grDNlyy_k$$gCIvxl}@D% zCp5b}-K)n)%ebW2W|m#nrrAn0FgDJXxz8_lVRq55(XJtPMJ`&Fq1?HVcr;b9sw$3| ztq=?PlB0|uMY)<{w2FOs3EohmN=5ht+4}qLUi8*|sr4xHu$H^=D;~~S&oe$5uRS&)FgWT?ba6uRXFSBtFs*1C|_r1!ud>19yS}t=zD#a zH1pY&T=QY%v^=P5^9cv~DkP2r2lG&s#* z>P(YfroB%?XLK2;BFD~u>2XM3y^@}7StMFdN%gvpb6byNfq|oEs_aFhfDspCx{9SP zNeaAI54TZ$*2cAIU;BJtUbuFxg=gAYzLD1nue|yF!MAv=lsDjt?&+#RU^YUFKux(Z z-Ib;KtvPDouTU%f2EZ~AMH)qi_sQk)KK0TxckJn)iSe(B7b7)s<75=JK8->wROyW= z3O7DLis1&Z3XMz$xz4}>K|(`a+4Eve9f(#vtJQQy(*}Qf8o?FzU_+eg#AmV;t<@BZ z7qo-l=ie#x7;pY4N|*{Pj$ha&5pSH#;})OaO51PLSggufwqI69RDEfAE%T0_QiRm0 zQz%ObEQaR#aS9juBwsgb*tq?m_>XC=cWbLzv0V6^BX#mZ-PEfTdZw3D!_6H%>k$TK z_D5M7rv`06e|P#aA8`g3A!hNUfhnqyg`*8#^sP+y#d3`)ejPVZ0#$kE~NkD`N?vf!$d(c!AZf$oUB&RY1K)y5?U?p+bz+0A3I;BsCk1$ukYO= z#+H=)3*2bvP`r(>85Mz4U|NGFmFtfJ)>uZav^3v6)wEeOrp6LEb(`wX{cR+&U$Xi( ztey84z87sGrhOJja%G zst3o%(z(jsaP)#nW@pC*w2^BSwxltYpLx=(qghkK_qkkLrYC5%t-*bx)bUs!e;m%# z?|q2f34N3YQ7!+Zp<++`i|i z^HR^iA_0_;oB)4E|ay+aVX5AY?9-lCVy_Y{b>ppOU9U z(sb!zYkOBGv9xV5MVjhd!bFdOJ7tS5*XP9+h!6R1N42A6oYpQ-rJ*>(?P?o3&x_7Hk^|sDp zjD&Br9ZRKj=3Hi)El(Q4N|JhMN%D%!F>OX)ahhOirh~Z~Ca70tuX0rT>7~->$Skjm zm-9F**U9>s)gU;eq!n9)BTXfeqXU%k%HZ$vh?6>F3SM%whFDQAX>u{jinrhM$ET)} zpG?{Rvn1T?=2WvPA-d45_=zUlR5F=FqwvPuKy9&^TlJ-lS#bj98*?6u(_#vTc$3Oj zC-njcJ8%aO{bwIv%J|Do4OEu_f;R&i4bHx2tLH6Vu5N#R4tWh2%$ahxC?zXY{1bNoiW>qWr z;}|`?*sBki)9R`NB0_sJfgtIm$*RdRmmDhYKP_*nc@`v7TJ?uN^H(1pOMc0uG&-qq z0?(Wra;%Rlyk&meuHN*zmMomb2|^|cGD9fj@G%lB0eZB=In7? zn_1M%iYu|JJow>P%qY1239d6-YSDY^^DD`HVe$92+x?DF+8@pvi!`v_R z%z?RS;dHYZWxXb=@TTbMvIT=lqio69yqBi0V<&J7KP`kGuFU5Z^nZ=$(Kj-hD~xJm zsBKq`9x=CSGkl3`zSgWzvVrZLWJgAi{-9E)#Y2i#IvU?JhW2BqMLV3Rxmx?hxw6{N z&zKl}D_%ZW(fA?#t#o%w+pZLbN#?;Y)SVl;XlLu#Gfh3HR(!@$&BX6d#}fFX2D>y; zfPAKBnjMKo^=xyJO>X^+j7qty z--WsxEva=hf8ssS+Ekj3QEk^1YBuOl&4T|(D%UB@ye%g9lJbgIyt$+Vgz8c}Hga^t zC|pd_LX3fHfc%%mWG^)e8wafs@#R^`1~I!F8~JI4+r{`VFXWlB{C?qH#|s?T3@net zAGD0)-__6roOlA*5?wz7X1i_s5~!~l^+MD5uRYJzhodv5kGV0 z=A*Ql>@%qsrj8x8Z>1J8G!d-=KAm(YlT&8mjNDJNstCMd9OLHJjfp1gOG9rJu9>N= z_u?muu^~^}9;l~r@%Lu$Y|h!&u>HKZ9T)c-t$ZaRr|J`xnC)C?s<4t4^E-ckM_iqF zg+^u~w7;(`8!!luN`%0V?H$ua1dsPK;ykl{`|}&Hm$tl)thr7QN=>&e@b(cd);^%P z;LQFl+jg}i$4)7qE%#D{=wOZ}iz3j_FhKA-$G%1o#cO9TVIHFA))bt2`Q@s7lqnHp zn`c&XxQfad4w}ZpqR9*Ko>c=~o5s3b0`%HgT$SyhWo zu7gU;Lbm@O0CGT$zcFF>rhXeiUq`3sTh`Xrt#e^Y423P`GaDR4F9V--cow^TSX*0e7%8YoVH=SQ%ZR&{80k+r zP_@ob-BeJkD3QsqY!iA%9!!gyP=%#cj^%W>GHsoOTe}^-{Uei;{W;kt+mWenM+c6^ z<5BAjaX2hTm221xdtoJxWX`5eh1F;{r6Qa){xTusFkEX!5t5L}l;V?PowPka$CaL$ zBiC-sE^U@7m7Gj#@3yXgNxxRPrnX^g{|K2~HEdLkC~&V)tIaZW>}r*CVNyh?&#oyx zP@%}?FxIoquEo+Ayuwg4qRg(WSS{bALwB(&Gn)Es(wvTdr+qhtilZEGQ}hS~2VC{~ zS7xoq%BURf$jr8Q@JK}TLl5F8J2!;EENVoVxLb_Q;q;W*gh_LXF{!*> ziLv55ONlh-s=KP!;%wGFjn~rLnc7_cW?@sBO{u5NErscXGTUr6neEEL>NWLEnRt4~ zx;neWRv<|!@aE;=^kj85Q6}S1nl)+F8=O@heF|pVSJR#in+*g9++J@uyy8&hhTci% zDwJueXdmuR$2$sSY1!&^8q4~oF}mEbcWvcxb7tv|-L4#~gssfeYB|&G4R&xdX45E) zoZL~ATd=Loisl{a+2!5ieaSmAJXS^MGf(ltS&s&bD3$*7Tvo~Dssh@;iK*#v18%7d zyj5nx^QD0lE3+y?kIFEN6Wb^LWzuWS5|fOl;uWk13E3d*) zWg4enAvLl3HCdTe?Pk4FzpceYXDK#ZS&s4om)GsW{k44sA)}qReD<2ONw{wv80#S9MH|jSV|x)LUoYjtjmutWiOj(=bj(nP>e$)_gE3aWUF8MYFLY z6n$$|2_wGVGuO&kyZ8Z)i-Q|?p26kGpgJgRdP~b%q^N0UN};oD%Ni}ZX}x8vI@Qad zJyeEevKu9`q)O@5)-~y!+e{J~$uw!{O&iSxHRe{=2A3A6(^HW&Q%z}QdPYT8J}xui z9BDVNDlF8C55qCIndqglF~?dCwi^fzxUDgV%t)pdZ)odp?cM*g=^;O~!U*Zm+yTsnTG@L>_IvToe5I55Xz5vc!>fC1H{0 z*ow;CB<K>aM-jACyR(m2*-C?B=QYdJKR z)!C!zw3)NK6+K{2+$V>!sB3OtiZT%#n_-*TOmQ-ONr?&1Hdk8u^D|joPYv(P8tGYs zXsI4*b^Y*gduvNRhG!d;dV)2jcW%Kg`XhA>sgwEoT7)p;GHL0?_KK!Xa|+WoS$aU6 ztC`c93!SyAvobSrC8k8NbOhySPV8Jd2GRL!28Wj5;Ij%-rbs3yx93uC$%jYw5391X zHn;6nF)OR&*7bWjGD@7eg~hLAsH?q-m7TSinRK}eaxEnV1{r2zon>`doYo}1DD@c2 za(Xi+!j(!~iHrY=_dUmK#Sh)DkSOFbRnWyW2P7-XVQK<6HPpIj+Swl64T-= zF4bq7D{=@_o0Z8*GBBB0l7^EqbKgvk1`FSn}acI9gy zFDF%3mhY-GRx4>XPpv50u34KVH5ZqwRT)y1ORCf4$r-Iu%i$=8Cr(brv=SvN-aT$~ z;d-(}rE@slYLY0;FI146+})hhVPd!UaBa1_4te{%Bg2(gCG%?dv=BX&a$;h(ug{NB zNFYU@F43=Ap(Hespq8RgtBumKv_4TYoKc!&m<-k9RFf^2)iRY?h4m{-OS6;=g4t<& zZAbSS9L>ni%<3Q0BO6Sa;!sX2(d*N)_Oj&m+@``6xU``--GJrqFwxyvvX<@r)+~mR zWvA8WtZuHA>P>Z7sd;7i=4MAKzL{KGTU3>6s9v2l)|rBvb-gqP!GYj_TO^Z6J4c#U zRMNY5xSAX4B=+p4x{RXwv3^??TI*8OG><7#yAExvs4kFfDRbvb%C+(GYqs3O`!rcw6rA6*soj$jSEuoDn6Jc=X6d6=bxkay$yNh$(?h=PP!&7Rp z=9r5+TWX8dC0$ijy;WXse}Dg`k=m@xv?B*s`}kNib~rvHgyoJ?$LV-qwEb;i+JUAs zq?XkmKlTP8&dtOLoD#FR>{=~XT3L%|sPe3)|DU}#?M@@j^Rzz^Yiz{M62THc5D*IX zSZwxvM@UF$-{l1fNog6oaJ9QlIbE5w)#L1GW!mMkv+R#G$aS8X^UOTc({G-sI-UGp zNHT;W?$GbPbp7KT9o3+%7(zI6INWz3Pj4)!qHrux>4Nd~plA&3{uK|BwtHKFL2ARl z)nJFVO&EjqMooE;64q&kGpuhKK^`WIRwp8VdNoOF2*DPYvW#TQK@umD z8fSnJoLp3B0h~qt<9R|xm?Pbulr&GkSI7v&K4n)-yuG{@zcNk z5++RH*sm`o;%=B?^VB%_2OK98s>IflYDPLW0HM5cI# zB7{K}Vj-OG#Cs6|Yij2!gGs%&?zcZ>=)En29|7vyRH78pLr7zFVgJek- z<(~RyT4VtGn|erNS@qI(ifwFnH*E~f${ZB#bc@uYLkr+6@*fQ<@!Hf*G$W(kL)Q(B zupv#_dTbXm(Sw+@Z9jT^=_6w^BD}Q8rebWmIlGSuYDFJ$sx-jyYoQ8NBF|Ii?n^3QMHC#ByT>#YC z54gr)Js#L!i9JfYy^~O8=a%L-kH%wFWSMx>mUz03-KKr+Ia#Pmu@Yct-NDl~sUAiK zW4EV-(2ExR{Q*ZsnMM8%BeIEUrjR0B54LtpLn$;%Uh1*i^O!Jwkld(km1GrqLhnri z-dTnT=8s#b$cv#Zn{}&ID{0kWKtq6RE29={5tMJlDuI|o;2edJYG+t`${vqNK~J_6 zPAawn6Vs%Shi_ENn%!G)S1Q}i#Gt!-vcB}-jyIF(crzKldZM6z`c6&$+k3Ca`So8v zlHET-Dii$h#$gem@Q0596epvq8CGeA;n=9mNC7Wp=|w$sONH_`1tX7#>=>gFgo;R} z%_AJ_HX+OHD#Ty5!p#F%-cm${A>8##8sFQ~b&KXmyW3(rK&Q5qUga-)6T%r?VR~(# zeduCXj)8i$mn=zbEJH3g!7xb6lU)YYs?Cwqcw8MM_+8b`~1J{*lFH>Hd)ufy8(*2b~WYk#ASO>cqGWx*B?jCQ%LPx4Vcutx~rB9g) zX`JyD2;W8nu&0W$H`J;n%88(jZKwr}V>Hg+(!$n)+^|soK(HDM+z{u_DjW1i@L>$m86Q}JU!=qE8lM5tVH^PMKR1-^Mobluf#-> zL&E7oiHrv=emUq&1k(Df#W{>gM_3_-JWzbMOB2$W&EyPek6L zSR&>hhAsRn!gGiE-~Crqxg!LjFR7)QbhC-g zgA&Fn3X=-YfAX_=(UKK{*0LAS8krK2NXe4bFC}F@EJn*whbQS!GMsQ!kmr@6!9W`0a2nBR6hiWls;~r1Mo5^DVOS%fEBC2N2_nmI0!^U6mFpXD zcsa(IdCroM0ESM^2PcLdmTX}BeAnqL19;BgNW~vVRxI;bi9`A>Kok+qnR6m626VTs z1Ww~pV^`~TBj=lJ>_;CjLyIacfV0T|G1`TFGHEx?`>VIN0XE~VPBN&?!?edYYvZtv zZWXdlTM~s1)zS`R+wrV9s_ULkzqjx7G22B?wL#;MuRmMN!w8Ur{&xHN5z@Zr*$g+wgui&=a z{44S9S1l4_S>z#}Wr(^xG+l!j1;rxwOu1sYq9f$FEJ5v?L|-`@xV&{BelLkJ99}$E zK_-TO$R7`{{XqZR4$p%KE#@{^a5& z&fgz!NSs^b?<=^$cl$JSd9$^BBJLG~(7i|XHJjsje6#bk6u#%_r)S|(jK`YE8$2E{<&2jrUN%+_N9|tGlEKP$GUCXVe2#3n zkoAxe&)k$WCYKNN`j!6LVMl9k9Pi!nX7X@%@<>_sDGdBUjMD(Dz#sngi;I>N<3A@o zsT?ZoJbj%||4OX9biGoX?Q3e73CM<+!`CfIkz}|~Pzotefc6LMNzv!ivU#sB7|Im_J`Rj(P}6E( z+uwh1a`Iq1bv~I)j#kIhy*V?G#JfK>NGWR3;7{*=3Pm(dGE1>{?^KEQ(czCD6H)*3 z*Yt>_d7dP(Xc&%Kt0Z11p*&+@!RW28G2tlYU?QWY!IsXlrI3usFU1I;?w0Q-hqfC4 z!YGos%-T{d2$jsn&Ay2O1%3{!b(v>Jvt!-*0GB0>NLA;`r*JHPccqA;jjOR3g<7bp zTMwDcyy(rEd@CaH=%ggZ`mp`B&kBo1Er7GgzY~GnuujG+)9KW85kVxNHrw4r&|Q<5 zuBCo*cnj0*!k%M`)hYU4Ne}Oo}AwK&7+;Ao5%a> zG6OTXS-@08;OR!70gezl9_I>Q{^4JY@%j0NLIRh3{t3GjSdJ%YG!)mBO1wy)1`q_6 zIN0XWFW*Q+{5Z)=Ln%K0AU{+vQKfkSGIL3WSjmELA!kUtQ~Yh!$eShJA`@CYE^>m> z*8~A(Z)O}NQXoOOt=dgY8!M;*p*aR2XK>nzPi9cQa;4+r1aj;0OmCJW8K2k8_ACHj zw=96O0L~)+j^AJeGwp1xE8DA9go2odap2xoL1R~zA!4$8X)Pj&ny)m==?KvOG(*^q zMIeq!Svu#p_semA(^}AoL?DD|UMY%|ZM6cRWYf7;hUBxEVyU4CYIeTId5sebUJF0x zM%oeg+w6r*rO>RWil-YJO5*;#$K%=L=J8r+>BvBK=Ax0{-~8hz{!f51KSSTgKY#F= z(T3yQ`ws|tcgiZm@iK=Qr1|(FG8!DM2#Cb?EhxPOawo!7M5A zG6^Ax`PUelIN))9(s_M+lu;~XVRltAIa?{TIhJ2`!8siNn7_Mk(O zFoa;r4k4Vab~BQQTO!tQ(5aHPsNE9h@OU~+7C13cP~~jU;w@VNwrqDxrOoZ4zZaLBOi^?|1wr6aSplenDIxRDOH0Q+pC{}y6?DnrL#Zit1hy;TrUD(CO z#2guH)sQ+Vs^0r5HtT@WvqANeo)1sdjbk{T7ER#p3P_R??b=VljBxSLeT@?=rJktB zcv`?Q*l^*>=vx-3 z;P!C5neeBKWoJ&sknrhE@w}YdT|4R-vgwFpd-d4Pk_ES;94qcyaI0TLkZM6D%l5LT zV^uJ?(DGmilWchGQ6{9txJWcSCx_Qg`htPDPYbe1I-E|*zTMrr%RTO|O~y+bx0A

@a7+X&w6-3WSD@3W#dT_GsQlB42R$UqiAO};ESGTI1%DGp2xiofkWXt zD}e+^zNj3OkC#lSyiL;L5Y~j(0L{;5D%W-~Am!W=BcZS}qnFH>NkaC={k|9!r8-YP zcq(6x?0GX;j6TZhQ8S+Kd8+Yk#I&(T;evqhv+@Ot$?o!j9p)u={^A1U>FtdplEx@o zmJy@UY`VBfKFhB_^D_~-MYaBSp|k~Xe!DU3Rh-j3+insfoUXmCYL3&!rPB2F{AUMFHXN@9estQCsUbrk9(x;0e0gg%8_jR8`AgJVg7+_1y@@#QB{RNm)aT5F zkpLb~HJC&i<&)7esWC(>T4F-ydQ(gFM_hM1OJG1` zR$pbXm@G;{4nr5jSpa8||2Yya$V}1P{xM_|S4E_iz_W_P1p<^ut>)MfYn=;iKF0P5*xVK_9E+MT?^nW@;`+m#aCOkQmOLjQJT4J8@UwhDo{Ht{dlYo-b88|&l+2OVANhQ;dFj* zFnF|V+e#t@cdlTbi$}JflVNu=owgI^xC&(2rKA{%L`jrsIN3;;!^EU)3767IiKdfb zznYE5t(h80vTDlK-gd3`4tC}9!TxMEd3?IRvG=$+7YT9kEb!ioX zl8s;gB)|U{E`9l0D9wdNBKhZf?wdq#nkeyv)mvTGnLwDu2~qD_9l6~wP%4NFFG7Z1 zThFL6DM==n)gLaeom{aBW)dYdS3);QgAUNosmh5a^X-wui&ykLZfWy-y280{Yp~!Vs=u0waymHy=^#Gmpg?YXO`^ z{@=JE@LA0Ks7&#x@XpR?GPN!b?2|x(csM?0=wy0n@L-!CoIl{gN@9G?q4lbX^D+NikUU;z%Ko3Fu*;#}|XbG9HR&BC;cHPdRK#JP|6=IwhT| zrYc@*HB<7f>}_sTcJDoX)IS(c#!vU$gBGPH5B$NocL9RZ`1OZa>4%SjH$T07?~ZdH zHAM6!7z+fjclVv08Bqyw6)zEB{uYb;y#R+sq(%Pb z;Q+(=Z0lySB|xwsQQk-Uw~r>Nx49|h8rM9Jx`~^hkLBGJ?C9PVms1c=NXL0H_uP&~ ztPo-3k#h}#V%}nfGlasCnpY^L0@;$-2ucN7C@GTHT8vO=1hH7lj&wO4q5~=xjwt1F zx)t;6w|ax6wZqes@#Ed~+3e)unsX8@w+Kfx#?#;za|rzke0ZZIy&pdO{OObL#~=6@ zinE|u)&xmXU%gU!hUUMmLbT8VZy^xOe_IS^MqS79{~(ce3{I3wF{$C2bN*7s)wK~T;TSpKQ|ZgKo>20nV(wKC zyGiZdCSHcdovWNjkMSbrWX!Jh5;v$kanDels3@XI;28kE?%n{zsGI^84g3ENLN9>x zTMQ2~y{EA)d3$=Tj;o#odICn*HHUH7lsDHSs8=Ae zd&#SU9dtY7swd;{!jX<7$FXddFSN2@d&8c|Mc{CWh?ELJy3x=CMo=AEIv?O1QMwYQ z5`3tXW%CD1x%lqUz1iW;WIVgSlF{O)H=a-LfA_jk z`t{fP=g*D1Gbdj@Qw4EO4PHb zUWiU6i~%HyYjZ==?eFU)fn)&uk=>Xvf zU8s2)=DIYu;>rwcE1qG_Mn!ovWM^%@s-++kj4kZb0J=djoSZHP#D?8o@MLXvkF7v^ zT9#&lvaGb%9=V%^!$;?X)$Z;1QMZ}Pxi0}x=L<+EBE7-V-+kG^K9Q0E^|5-b^6^g= zHuC;`@Zv)ICN(re83c}(1h&j#Bo4MO!QPc#>+`4#r@AfKDD@c}V*o>BCUc5(v&#|b>d|JbP@mcBB)%xw0yvBO zH4LP~C%fa_&0cactDY1?&Z*yCx!#`k-WBSAIi5ASCbM?Z=gsYvbIVaM64I z3uFKQAOJ~3K~(%>ss6k;6EmGdFV0Dvs10a6r<}))5QxdFN!2(2pb4{i+3Fuxl_LRr zut@+5$L>%ww*)<}g2jBv zn=DzQ9)BbvMLCSi#=M!XUriO2oO>_3VM8j9Hu6WOqrgAE2}mLz0lyeYi2*^HAY}A8f&;w7agsm@DH_V8B%Ik_vkPN|lIEg< z`DQi~0|1OU>&CRI)ILX_Xc8x(sCkedjUN+%%tf{>vXVdXOutpr zo#d~G5yx%f)_f-q=mt zOmU=vXK^~@}ndA)qN`zT@`Pxc?)OdcN{ru|4+Dmq3& zIL%@|zDHn=`02YZTf*-QY7F@EhtT}pX#R&!4H2X1$jA3F;w{D!0vd@UtiWd^5e86E z!8!v_mV~+X;Ksar4g;9OMR%w#WE;?$Ccq;=W{o3w&WQ_D61X5IaG=SI>6fRaCtzGc zHBG>ANfacpPd~90SJxdA$4gNVYLgqE0f#%H9w5iNJT75IjMqpWC1?%Bn>HgWj9nx9 ztqPbz34q4gGh9Opb%EeDtf=CPuKlke*adKYW4z%+Wt$x|#w*QgJLGJEJC1jlDl@XWh=+#Qk=A1A$kj z1yhFJzKuzfvg;`Eu%wOM?%DR>LAx0-Ze{n1{-W0*!o6|HwzuBi_LcZh2xWOO5Swps z!a)o90-3TV5P=g2mc==5DIW1TVt!Wi*&LuR;K|_D4a+EM^%S>uSB?(%clICLOztgj zEVaV!Lrw>0`|gDKQWJk2+K^9w`WgQU1tf?UWfqIQ`Iz^9{v7}=J~%Qiv;zXCh^Wc=Ff^|+r7q_;}AelNZuX~kl4XV1DSM;m|2IdM3yxws-otc zs}sYK*WY(ijuf>Q9YT_(YLfNG+WND6wXS7vw$`wEO?SE3O^of3XsUIMPWwDg2qRJP z{w_h_+V1VQb{Siy!g6pVS}z92WHOhsDXR|$#%S5o#1nGC5|IPFJQ()D zD27ud78A^Kjp>ye;c$|WL<&@5J_{N^8u?T@;|MiK&R69ut&|Y9#rvB7yg{u`?mc=u zKA4P`%9Z|_JGPe1$681!!My#c@#QZcfUjQ-AAaC`zkY3S0S=3O`1A&*Anx1QW2$oJ zF=#Rlm%K)4Imu&pYeGbGuJQ~+wYGLQ#>|NTBKE2Yl+aw+o&dA^>@%$?!&d^|}|?cP?K)Nf7B35`?5%Qc!3AJYoaG_9tw9#!l<(+6qPVBpYx2GsY~EW?60k|lmSIJ zXM2oYTuUN*maAhD?4P)8ZHQ+eKqws?UuY_{c{?U`^MMU>N3U(%WSZA=JWgD~oQM(cL5v*78d!N z1cr5~X^OZXz35C|amrcgJ8NR`viK zf}CZ`WNqv=QUs~Jcv9tamCKP-X?8YMN;leFSymx}2Hn%VSwzgn#`0tZKm`#up@+9( zs{91SBpMY22{AEmJu6M_4DV>p)cPqWf%1J^PbH2J^TqDLONa+k-Vto`dTkI?NL5&! z84!)Axai#f(m`ecoZm3%(;_d87a|JG!Zt$zgv|SzFN0zgglGeU4@htEVR9ZD!Y=rKW)-d*0dID zFjOQK3B>_R(Wl`;Dia7c^Gqzc=PInb>)Y+#@d;*|-E6gY!p8@>3;%}MzczcEvPh`< z`qLlYe|q!$-9P-(XCjIG@I$;2`uHXE?bJoofQs?=@8jQCf(8RpBi@OdjcScY5k#B= z$2>m*$U6MC42z5S+;cDhKylDUx@Vzu_61HbrdmF>`^r6ycv{>lV)TJV#*E4=Ne@>C zqpIUIDyiHPk7K#77X*EKyQ*9S#(Dgudu@apA#ruK@qNm5kxO02)-z+*#gkEgQ-_SY z`+0@1`^q-R>^<-jCIQn6SLwPf>ShTh!{Ce7Er9b|4gb>N3O_O0&#!19wl9?>w{jsUOQ*1llx1x zjeUD&s~{G&;p;?@;51Z@eR%UJN&o)yn}A2eP>6o>F={sR-wcP=|6Z^CKZb)znn(v> z3B^Q;psBfn@Fo*Ke**NL@0I;1hOy|}dvI6ESnG&(%}nF=tYLWoOST>3dhN&ZZRIsA zZ!H%MJWpJ#t&ac}y}&ml_MuF@e#NmvRH9&RXyP~aZi0m_j)^vWFjJP}&_>no_uNcV z&%yMbboYDh3`(cgn$L<|yFoBn>n3Bz1+yu7#dg0#LGn|XSk!I-oZo7UnOi%z;_=r{ z`-j*A_wmue9t7WXFE0?Z;`U9q8&i8(vmvK_*H!DmI+5I?{r~`yG+EPYqX`UhB!e z+4YdRas6n?{eS5ldHir;`2@-K3iWiNb0rGERFu%1gvpGY>aM=n?+pdUq_qHn($;8PCWs}gfgR9*w#-ownJ-OiUOPT3 zJlq|Oz6aJhgf^KpR(aYsd3u=ns=Kk4g!BwM38n4qkXN|18D=lw9SN2Zh3|w^t>$qHeyEfH^Ir`$-bE>xefP+Df9LWCu z&Sogl3SeS^#aCB-@hz`2Dcj^&rOhi`HqK@}BnU-fqCbjz6I#$~Q2?$Opk+)dv!m zj~^3M;raUn8RF47a3~K?3r0xg?`9leoEk z&5@?FZL>|M;K+iD;{EM`17M5%Uyp#kt=@2lny-AlzIx+$L7!>M^V!Jk9X|lWetyaO zF@Cj)iG5f4v0q$k$1Np8)w8^}98GD#Zjt>yzGn$lO=1eL*z5}KXJLyb zV=Mxt^L|@cM>-1OEN;Y;eo|?%Ody_6Gg*1C-aby1GRH^z`?K*;ufORk<@0-osX*!h z<7qH)9R2?1mw%Mse~^Cnvhwkb{mq+5Jvo-@xM5mbG3N@fqQ^st_KVXf6@1kgc}02pSEP&hJ)Rgw1U8HTW3 zwS)2b<#wN=I9epw9&mBfz0x45&An|oU+Mb&GvJA~qFAM-tpK7%R9Lj{e*{4pu?-sPjpOHq6^-zpjFNasvPdV_miYvtH4xL5hJgkL&nJoB}K zVS5}%TX~B+4pt>gDH#oGA;)}9p=8Gjr&yV2%7RB4VNkVF;i5vfTB0RPYOFV4OIsn< zZVPAK;dL}J%X@=62M=eD$75$`&)I7pROAX`N*XL42;PMT?;uwx$qDTpZq1!ijZ$aKI>0mU#JT%9IsJ7Xho;yqFTgl#jjh784s_=igG0)-fth;1#Eo*66^v0rdx zM+K{?(B+E4nOPDcoM|!CqJRtF{FdB?AdJoC_k+_kFvR2g)6~!yDlWCQw>qiT_;IJp zpayAAj4zEJWD11YUiuz6Val!NrtPDs(XyS*``yWg1Bp~q^|{BG95B@NDik3n?cSg& zSfW9qU{_5I8&aa#bl4u?*>EFPbT%BtY%AwXL5&9ijcjP0FSIzb0%{B;Dw`THd7WGk87nUW@1wIz-8JFiV(!<(H%|aDe@f1?YHBRz=ebZ z^{Iw2l{kQ6{BX$MT_sc?MFhkl<{{9%G5LegB*veRFoqdZ%X_M^H@@N?6I+9!fa?BG z>=^)dBYj{;P>R9y!{$?e$)6ea#$!Hg1D@n_+O+$e7oxr@3osP{S#)p#oZnDzS{!zp zSLWRtAa^@_yIMw0Pn!JkdgMH#b*DGWdmy;_!1e?*+kDRrqkM2^V@&dC3kcG_fWLO8 z*`wZo%C>Ely3x!=63#g0U5=e;EjN7$G(5Oj4#sT}mIbK86imQ(CXSxzr^*eSx!D;e}u&O)nQ440Y`+pDeK$8Dk9;})~2VA zj#*wn1w>a(UE>6mTti=BkGPS9NZWY?H*C2g_xwXbKA;Ige471ZIi)|ay++YzA`Xbe zj{il`S3AtIIB_P5iw-V;^Bc-&_o4pzNHYjeY|~jcfBlSzo!ky<`_H4D@cH!E4#m{S z)P70T*91rKxF~lVuGF>9#t*ff1OX%Nf!U}F*e{e!sBAGeeN04_c#8G5Vlr*E$7Cg% zwTB|11Oqs%L0lJ4DuI^9+sX}xlF_Wr;A)`a9^^}%{pIHR`0*N&dQd3jH=Ctcw0z&K zFE@q^gTF+SckiO}?X8%TIlQ7poXYV{`7O^=MT?*`Ch~BkRb3OP|Wi> zTu^0GD|d#V$r=NQojpXp)D!TDlBV|uW*|^G^u7JJ~#I!j7y-QT$UrS=!r%wO1J>dZzU)UCdbK4 zXj;Ad>u+Gbd$M`vEcz!aOZ&S0X|){lgeH&A$5Fj|95I#y4{U2T-?}4_7}ZOGM=Ms3 z)9s*|Rvc{3`8Lzhqlw}F2r*M6+z542z z^S%MY4K4eXKDY8(n$4~0`X~P^7Qg4GXmDgUA*h0xg`3LjetRgKxm$0GsSA4{dukQy zlCZ28!B%eUD{UJgbM{dYTinF?n*xUe(MA4m1;jFkWKmk`S8e)pzm!xd!^ zQO@#mZ~GaBLA<85bqI%}7%}SFE@KZy#no%=(cQz28+i6|2+$(A5Ilk8&BLq-y5FDrSyh$-3B zgrK+RLAA6i3?PXT7H(_yz5TU~VtxJa;h;BOTG>6xRXak)mr5mc4@rY%6(^%2{G8wu zAO37eQb;h7tE+GGd&?)=*I5%ChY9W z`?xejb6rATwIk>mN<49TJP*Mxi(h;4L?5uXn%Kp1Gndm4GmgQL8GsyVd(rQU%TEx2 zfGON`Kd+}4+#8@WJc6T4M1#sJ^=EL}bKn@_W&*(%JzN0iHxbczjj0CmUZm|$v+)N!lJvy=vg=EOTSI%IbrYo&gXFfgQE1AJj z%G;<`e27PrJE>~QCJu!ZE0w}YB_7fWOekkD2SFrew`b^}#~a87Y~67EVW!<(cf@z= z+4FmQ+m9dgPaKvg+FwrY`i9*kZZ=7hWj^%4SUmaRJ*Q_w?>}InH{V4toL9g5?gPx< z85%2!?|*&~{^dD&w{PKO1O~kc2&NC@(Og+Df`Due96n>MjI|}shb0Wf@H4E)i9G5Y zr%bYBFyR6(&8N5JEzZOoub9tFkTpj^K>w&&%7fkLRiUUKIc;Z#PWN(76vSeBX07x# zL_##0hSk*{@iwo=0KFb2v;&n8v(>P@hzv6=f|{Qnq0W4vw9e4YH}X&B?gUGF=Sx-K zfk&qg5ZCn87KRIpmdQ<+sVCK)ZmNc?8zKQ7o0LbZy`rdRMrjV&G zGQJ7p>C4^C*XguD$k|JKMO!>)MVl#g>9n(5I$N!E4#xK$uNQY~q+T?j zE6h$Ne*>C)4FgI_MwBzY6O{bdFRJwUjUWHZP{Y~bKV6C{!%--P7|K6C`@`3`_#FAR zX9X02yh#WrSmCeY0Lc4-5oal*!ORJ`gxyhq5rz=A#=Ler5@QdbVK^i#_o%DW=FnW} zB55CN(sQUpfk4g*&ZgCuz#Pp+;+55ALMc%`)SkRXoEH>6#LQ3BXGp72pXN=FSDP{bJG0;{>DW-&(DvI|t*GTzp*;A)To>=@IFUiyL{$(4vqF z;QZ%~zU%&Da0wG`)}R0K>hUz$IgpsMj^l! z>|E4Ba`8$xCA}`Lgu1&Add;o%rRHq^!M*-+J=We@t$TAdvKQQeOnW{P%Hd}s%m4nJ z9XFDnzx#yB&;CO3^Sym0`9J?4aug~5>FbAg@qc@F_Ux~~ncIp$l|`H;a8xwR9S7lU z5>!p;C65FUW{-8gvrQQ%3^N@DKv7zy_c!O`7_QTy1j3-h`0RMP`oct>YiAyh$@Hq% zMp14Y0g;RN7JSATUk}y+X(ux(WpvC6lD0iB<*u_He@TxKOeI$`t46a{yDH@_{Qf(J z;9|mP!kfz`7-I4^j{(6jkpT5L%I~@a(3oECQm&4P@_E2J_gZ8Dod2Z3sL`;s;%+6b z5N*;@)^4WV0i7G~WIRyam+cxW@j|(T+*e|=Bp~)8mzNeBio>80r_hz%{FWmhSAs#k zgu;Ye^HU{{%^$RR<2-yRcLQ+LGasU8sNi8rpruo=grZT=D?xL|iB~fXKOM_99li$L zed>3Myd1F(E z`5=XH!>@c;Fn#&)i{!c4st{6m$fLI>(=DFlwk)@5DoIu(cqN%ZP+z_UxfL z9EYnZ9arTjM3-x1`oi3lzFiXpLD(uOI=m=@YuMG&(xs@QSQDY&TYWj~ja{Z|gERN~ zc=c*~%ua02i8g4x>4vVsZhly$%@k7ZRfo?bH`YMZV|$WH-RTU>ZsS8!@DN7zhzm8) zoRQu@OcXjF%-lRheGjF&_bF_ZF+&KmxRvv_0S*u0i~Ro`nCrccD|{!@^2Bcm?>Q#B#Vg1FN87qhj$SK@qT$zr^M)+H_F`#2+sQP zLumLV>c>n-LLFWU-xh`nFk%d(%`{5kdUyK8-J^3SLIo@@aa}4AMl%uu3p^}kBmzfx zsGcrW_5b6tbTCNwa;0+x6K9x68FGzFOcYN+qP}n zwr$;f@3Zbt=sxRI7k2M*HMhl5Q2a2qxSLOB18Sv6qkcp5f4x|Sb^_j|0_$6>O?=>A z>M~j9cDDx0PVMPxGQB`;P+CV_F6=bi;xtRQ?w0@9Fo{7kCCb|EMI|&J zcI84%r3?8f07;d{j;XSm+AUUoq%1b=lvQYxQ<(aW{(bZV9%edSbbl)V1pz{5 z_1@jLAK)-;$E-B~A{*x+Sis#I4l5A@u)nBJS`P#$6%_AxJmSBN8wP_21BQte z6+`ddwaEOS-$RLZ(6gj~0~KD&3_tMJrg3`R*BNdbrKT!1E`1z!$)oG##mW<7Z{ zOV69IX()pE_RF6eJrd%|a^25xuSF;zMLacW)ul71O9O%G7bp#dD~l7250FvMV2BXLlF|g?5R+rZ(MS?T>hYu#oT$37+=Zl3 ziv`RIWA+(h*L5bsu9Js8oSpSM7+ZKtcdkgx*=?Q4YJb(M^=QAlQDz!Rc7Gmbd^}SOknn$& z-jDiIKB}0~{O|e1y>C%psPT6;T;*BJ1|AF@m)zHA_x=#OTLOC|5lqUYV~OFg1^E9! z0k)1p+3zr!wr3U(69(`CO4ctH1AJV~?v{>t)$_cB@r>sK|8p=R)TqK+Ecn#^Xgx&3 zXc6>%M25dLNX=ml%FiGZ&$i`;o%m+`KnetR zV)g>3YO)lfuWsM1P*eMlv#1v<)H>Q*@!tbOn5T$fKUH zFc{jF-~BkcCtDX{OknDm#1aGUD?*TMA|xFtLY1>!7leh`phbjP8?lkG%-L(=_AE2m z^IjDycKYD_j~Q&YSR5<8Z{#2{24C9)g9n-<2jELzMISH?uFJoBY!~1M)R^5G`LbYJ z*sgN=Y5ihuvaPZ@Iv!%youM0RIe_f^#3hx8kCZ5gx<}dFk02<5E7q)0%#(Gs#>f+p zZcYlcs|ijVB-t`Xi@ao9hV)tv15~Ui`DbpXS&`{e@M$02ug;`jhrF*=-7GR!tDf&k zp>OV(^Jif!d=1io1^sjQe%`V!P9mR7q~AOE2h>QT8ft!y=$C4IP`>hMB5?d3GJ}xS z!DO%KBR4Iq*MZTRA>kx;A?C^YHD*r-0>jAMo=0Uq z)GvE47{Hjtz`4W%d;NfCm{%W2kL3VIX4izPX3XVW_e6H|QY}2Rou(*Sl>SY5IHsbUCOT$gMC3^2*yx ziYb;9JFG*zF(v6XmdE34B>`y)@G$F`&j(4epihwu^i?yJEzPBYlAAkWqu3slPOvZ8b@spuDDA8|G z2msUPK!xJhGHc4*Cgo`1Xu1T_-)wRN4|3YDT$kxe${~%C1We}@y2$1|e*A70$xKc& zs0)U}Q~1s^6oR*pmgRY9wQ-^BSfM19Rnpuq0dRc-`qAULyV~|$R7=8!c6#;F(Ex|s zfm?mHM7n_*zeL# z1AYbZ`%a%9phw+Tc#X+9G|u4OaIFX64`1KuoipbrnpvtO4zpWgGA_+j&}XF}JJ3;glb4-|>d6Z{A@qeH+6w*q5P{fDsRDN2nJCg3 zv1QDdAp<$~&*qdtW6tYmSyj)=)n0ANbemf}Ux#Kp>`rY1M;{^vU%@48J`B#;Rk2!A z!|B;!AoY@fF3ozKyr1-Z-gND8I`U6cpl~8Q{WbkFK9J&kpRq^Mix9}+Ms9I$$%Hj2 zmlzRJgKzU#c@(`%f31s51<6TLfO@R@AV51pj4=LMI)+rCP49ysSUCgONi$4LagV37#rp6Md2gM zm!eCN1xU@B>6+XACDZ6Pms335XO}jrFE-m2%f(0RqHfkZ31^V`c%_cZ+s&}_A<&%^ zu)IQH1B)&`-<#n+Uw!c--b44Dkf;L6A_xzVB-AI&l?3*cw)VZBH43bt&~B%nwQ_(s zq^Hvz>fGr9?b_0mln9>JCp>GA zG`5UO@~XleVDg~Fk2}|#S3OE;HK0#%V4|TdSi>XSJt_c3kRIvBmZ^nX_sqyYxyhw! z*~s!2kU!z0rQEn1tR+oxU2r+%d5V*z&nPm#uyH8dHWyPnw6MayR#DC1dgdLz%A(`* z1)H*&<$-$&2I2{z_!WJe&z$hdgYL0+2{LvPG5Acxv8VYLRGYOgV#>wtVI~$bV-jx` zVM^;RQPbTu!UVHW3t~8qHdX+L7}&uwr>w)`lPv9n&f^QaqCg#;W`x2khqDo?&fdGM3o0nDZB}x`*_; z4rbL4?#I>|foqRLUOVo;%f)s#6k2A-GO>Z5<91TqSdaa2vL8j3@=Thw=@PAtRz=sZ z+4Zrv^qFT*-lUiHNe7Oa6aU6rn>HwEUFV|T=jCn~6Snuc7aiKG7(kBCi;Fg7H7TGd znK)mzNprP$^pGtjoV8_n)daFDkbyqy0By=HnV&8NlrBCP1R-)t�Lyqkg{QKjJ(e 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

L_rQ=6Nseam0JKe!&< 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 literal 0 HcmV?d00001 diff --git a/documentation/nav_template.txt b/documentation/nav_template.txt index 5671de54..f7f76f13 100644 --- a/documentation/nav_template.txt +++ b/documentation/nav_template.txt @@ -96,6 +96,7 @@

  • Releases
      +
    • Release 3.2
    • Release 3.1
    • Release 3.0
      • diff --git a/documentation/release_32.rst b/documentation/release_32.rst new file mode 100644 index 00000000..15316635 --- /dev/null +++ b/documentation/release_32.rst @@ -0,0 +1,127 @@ +.. + Copyright 2017 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. + + +Overview of Release 3.2 +======================= + +.. contents:: + :local: + :backlinks: none + +New Features +------------ + +Face-Varying Stencil Evaluation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Face-Varying primvar values may now be refined using stencil tables. + +The stencil table for a face-varying channel is created by specifying the desired fvarChannel and setting +the Far::StencilTableFactory::Option interpolationMode to INTERPOLATE_FACE_VARYING when creating the stencil table. + +1st and 2nd Derivative Evaluation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Osd Evaluator API has been extended to support 1st derivative and 2nd partial derivative evaluation for stencils and patches. + ++----------------------------------------------------+------------------------------------------------------+ +| .. image:: images/osd_eval_1st_deriv_normal.png | .. image:: images/osd_eval_2nd_deriv_curvature.png | +| :align: center | :align: center | +| :width: 75% | :width: 75% | +| :target: images/osd_eval_1st_deriv_normal.png | :target: images/osd_eval_2nd_deriv_curvature.png | +| | | +| 1st Derivative Surface Normal | 2nd Derivative Surface Curvature | ++----------------------------------------------------+------------------------------------------------------+ + +On the left is an example of computing a surface normal at each point using the evaluated 1st derivatives, +while on the right is an example of computing surface curvature at each point using the evaluated 2nd partial derivatives. + +Smooth Corner Patch +~~~~~~~~~~~~~~~~~~~ + +An option has been added to disable the legacy behavior of generating a sharp-corner patch at a smooth corner. +Corners which are actually sharp will continue to generate sharp-corner patches. + +The differences between the two methods is most apparent at low-levels of feature isolation. + +This feature is controlled by the generateLegacySharpCornerPatches option added to Far::PatchTableFactory::Options. + ++------------------------------------------------------------+-------------------------------------------------------------+ +| .. image:: images/far_legacy_sharp_corner_patch_true.png | .. image:: images/far_legacy_sharp_corner_patch_false.png | +| :align: center | :align: center | +| :width: 75% | :width: 75% | +| :target: images/far_legacy_sharp_corner_patch_true.png | :target: images/far_legacy_sharp_corner_patch_false.png | +| | | +| Sharp Corner Patch (legacy behavior) | Smooth Corner Patch | ++------------------------------------------------------------+-------------------------------------------------------------+ + +On the left is the legacy behavior of generating sharp corner patches at smooth corners. +The image on the right shows the correct smooth corner patches generated when this legacy behavior is disabled. + +API Additions +------------- + +See associated `Doxygen `__ for full details. + +Osd::CpuEvaluator, GLComputeEvaluator, etc +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - Create() + - EvalStencils() + - EvalPatches() + - EvalPatchesVarying() + - EvalPatchesFaceVarying() + +Osd::Mesh +~~~~~~~~~ + - Create() + +Osd::MeshBits +~~~~~~~~~~~~~ + - member MeshUseSmoothCornerPatch + +Far::PatchTableFactory::Options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - member generateLegacySharpCornerPatches + +Far::StencilTableFactory +~~~~~~~~~~~~~~~~~~~~~~~~ + - enumeration Mode::INTERPOLATE_FACE_VARYING + - AppendLocalPointStencilTableFaceVarying() + +Far::StencilTableFactory::Options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - member fvarChannel + +Other Changes +------------- + +Improvements +~~~~~~~~~~~~ + - Corrected numerous spelling errors in doxygen comments + - Updated glFVarViewer with improved error detection and command line parsing + - Added option to build using MSVC with static CRT + +Bug Fixes +~~~~~~~~~ + - Fixed a double delete of GL program in Osd::GLComputeEvaluator diff --git a/documentation/release_notes.rst b/documentation/release_notes.rst index d850d67a..76247205 100644 --- a/documentation/release_notes.rst +++ b/documentation/release_notes.rst @@ -22,7 +22,7 @@ language governing permissions and limitations under the Apache License. -3.0 - 3.1 Release Notes +3.0 - 3.2 Release Notes ----------------------- .. contents:: @@ -31,6 +31,24 @@ ---- +Release 3.2.0 +============= + +Release 3.2.0 is a minor release containing API additions and bug fixes + +**New Features** + - Extended Far::StencilTableFactory to support face-varying + - Extended Osd Evaluator classes to support evaluation of 1st and 2nd derivatives + - Added an option to disable generation of legacy sharp corner patches + +**Changes** + - Corrected numerous spelling errors in doxygen comments + - Updated glFVarViewer with improved error detection and command line parsing + - Added option to build using MSVC with static CRT + +**Bug Fixes** + - Fixed a double delete of GL program in Osd::GLComputeEvaluator + Release 3.1.1 ============= diff --git a/opensubdiv/version.h b/opensubdiv/version.h index 45185504..26ba1a76 100644 --- a/opensubdiv/version.h +++ b/opensubdiv/version.h @@ -25,13 +25,13 @@ #ifndef OPENSUBDIV3_VERSION_H #define OPENSUBDIV3_VERSION_H -#define OPENSUBDIV_VERSION v3_1_1 +#define OPENSUBDIV_VERSION v3_2_0 -#define OPENSUBDIV_VERSION_NUMBER 30101 +#define OPENSUBDIV_VERSION_NUMBER 30200 #define OPENSUBDIV_VERSION_MAJOR 3 -#define OPENSUBDIV_VERSION_MINOR 1 -#define OPENSUBDIV_VERSION_PATCH 1 +#define OPENSUBDIV_VERSION_MINOR 2 +#define OPENSUBDIV_VERSION_PATCH 0 namespace OpenSubdiv { namespace OPENSUBDIV_VERSION {