mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-12-22 07:50:07 +00:00
Addition of Bfr interface (3 of 4): regression/bfr_evaluate
This commit is contained in:
parent
8cbc059e6b
commit
e27fe41b01
@ -26,6 +26,8 @@ add_subdirectory(common)
|
||||
|
||||
if (NOT NO_REGRESSION)
|
||||
|
||||
add_subdirectory(bfr_evaluate)
|
||||
|
||||
add_subdirectory(hbr_regression)
|
||||
|
||||
add_subdirectory(far_regression)
|
||||
|
54
regression/bfr_evaluate/CMakeLists.txt
Normal file
54
regression/bfr_evaluate/CMakeLists.txt
Normal file
@ -0,0 +1,54 @@
|
||||
#
|
||||
# Copyright 2021 Pixar
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
# with the following modification; you may not use this file except in
|
||||
# compliance with the Apache License and the following modification to it:
|
||||
# Section 6. Trademarks. is deleted and replaced with:
|
||||
#
|
||||
# 6. Trademarks. This License does not grant permission to use the trade
|
||||
# names, trademarks, service marks, or product names of the Licensor
|
||||
# and its affiliates, except as required to comply with Section 4(c) of
|
||||
# the License and to reproduce the content of the NOTICE file.
|
||||
#
|
||||
# You may obtain a copy of the Apache License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the Apache License with the above modification is
|
||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the Apache License for the specific
|
||||
# language governing permissions and limitations under the Apache License.
|
||||
#
|
||||
|
||||
include_directories("${OPENSUBDIV_INCLUDE_DIR}")
|
||||
|
||||
set(SOURCE_FILES
|
||||
main.cpp
|
||||
bfrSurfaceEvaluator.cpp
|
||||
farPatchEvaluator.cpp
|
||||
)
|
||||
|
||||
set(PLATFORM_LIBRARIES
|
||||
"${OSD_LINK_TARGET}"
|
||||
)
|
||||
|
||||
osd_add_executable(bfr_evaluate "regression"
|
||||
${SOURCE_FILES}
|
||||
$<TARGET_OBJECTS:sdc_obj>
|
||||
$<TARGET_OBJECTS:vtr_obj>
|
||||
$<TARGET_OBJECTS:far_obj>
|
||||
$<TARGET_OBJECTS:bfr_obj>
|
||||
$<TARGET_OBJECTS:regression_common_obj>
|
||||
)
|
||||
|
||||
install(TARGETS bfr_evaluate DESTINATION "${CMAKE_BINDIR_BASE}")
|
||||
|
||||
add_test(bfr_evaluate_pos ${EXECUTABLE_OUTPUT_PATH}/bfr_evaluate
|
||||
-all -silent -l 3 -pass 2 -d1)
|
||||
add_test(bfr_evaluate_uv1 ${EXECUTABLE_OUTPUT_PATH}/bfr_evaluate
|
||||
-all -silent -l 3 -pass 0 -skippos -uv -uvint 1)
|
||||
add_test(bfr_evaluate_uv5 ${EXECUTABLE_OUTPUT_PATH}/bfr_evaluate
|
||||
-all -silent -l 3 -pass 0 -skippos -uv -uvint 5)
|
||||
|
208
regression/bfr_evaluate/bfrSurfaceEvaluator.cpp
Normal file
208
regression/bfr_evaluate/bfrSurfaceEvaluator.cpp
Normal file
@ -0,0 +1,208 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include "bfrSurfaceEvaluator.h"
|
||||
|
||||
|
||||
template <typename REAL>
|
||||
BfrSurfaceEvaluator<REAL>::BfrSurfaceEvaluator(
|
||||
Far::TopologyRefiner const & baseMesh,
|
||||
Vec3Vector const & basePos,
|
||||
Vec3Vector const & baseUVs,
|
||||
FactoryOptions const & factoryOptions) :
|
||||
_baseMesh(baseMesh),
|
||||
_baseMeshPos(basePos),
|
||||
_baseMeshUVs(baseUVs),
|
||||
_factory(baseMesh, factoryOptions) {
|
||||
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
bool
|
||||
BfrSurfaceEvaluator<REAL>::FaceHasLimit(IndexType baseFace) const {
|
||||
|
||||
return _factory.FaceHasLimitSurface(baseFace);
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
void
|
||||
BfrSurfaceEvaluator<REAL>::Evaluate(IndexType baseFace,
|
||||
TessCoordVector const & tessCoords,
|
||||
EvalResults<REAL> & results) const {
|
||||
|
||||
// Allocate vectors for the properties to be evaluated:
|
||||
int numCoords = (int) tessCoords.size() / 2;
|
||||
|
||||
results.Resize(numCoords);
|
||||
|
||||
// Create the Surfaces for position and UV (optional) and assert if
|
||||
// not valid, since a limit surface is expected here. (Note we may
|
||||
// create the position surface but not actually evaluate it.)
|
||||
SurfaceType pSurface;
|
||||
SurfaceType uvSurface;
|
||||
|
||||
// Figure out how to get a command line arg here to run both
|
||||
bool initSeparate = false;
|
||||
if (initSeparate || !results.evalUV) {
|
||||
_factory.InitVertexSurface(baseFace, &pSurface);
|
||||
if (results.evalUV) {
|
||||
_factory.InitFaceVaryingSurface(baseFace, &uvSurface);
|
||||
}
|
||||
} else {
|
||||
_factory.InitSurfaces(baseFace, &pSurface, &uvSurface);
|
||||
}
|
||||
|
||||
assert(pSurface.IsValid());
|
||||
assert(uvSurface.IsValid() == results.evalUV);
|
||||
|
||||
// Evaluate directly or using stencils:
|
||||
if (results.useStencils) {
|
||||
evaluateByStencils(pSurface, uvSurface, tessCoords, results);
|
||||
} else {
|
||||
evaluateDirectly(pSurface, uvSurface, tessCoords, results);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
void
|
||||
BfrSurfaceEvaluator<REAL>::evaluateDirectly(
|
||||
SurfaceType const & pSurface, SurfaceType const & uvSurface,
|
||||
TessCoordVector const & tessCoords, EvalResults<REAL> & results) const {
|
||||
|
||||
int numCoords = (int) tessCoords.size() / 2;
|
||||
|
||||
if (results.evalPosition) {
|
||||
Vec3Vector baseFacePos(pSurface.GetNumPatchPoints());
|
||||
|
||||
REAL const * meshPoints = &_baseMeshPos[0][0];
|
||||
REAL * patchPoints = &baseFacePos[0][0];
|
||||
|
||||
pSurface.PreparePatchPoints(meshPoints, 3, patchPoints, 3);
|
||||
|
||||
REAL const * st = &tessCoords[0];
|
||||
for (int i = 0; i < numCoords; ++i, st += 2) {
|
||||
if (!results.eval1stDeriv) {
|
||||
pSurface.Evaluate(st, patchPoints, 3, &results.p[i][0]);
|
||||
} else if (!results.eval2ndDeriv) {
|
||||
pSurface.Evaluate(st, patchPoints, 3,
|
||||
&results.p[i][0], &results.du[i][0], &results.dv[i][0]);
|
||||
} else {
|
||||
pSurface.Evaluate(st, patchPoints, 3,
|
||||
&results.p[i][0], &results.du[i][0], &results.dv[i][0],
|
||||
&results.duu[i][0], &results.duv[i][0], &results.dvv[i][0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (results.evalUV) {
|
||||
Vec3Vector baseFaceUVs(uvSurface.GetNumPatchPoints());
|
||||
|
||||
REAL const * meshPoints = &_baseMeshUVs[0][0];
|
||||
REAL * patchPoints = &baseFaceUVs[0][0];
|
||||
|
||||
uvSurface.PreparePatchPoints(meshPoints, 3, patchPoints, 3);
|
||||
|
||||
REAL const * st = &tessCoords[0];
|
||||
for (int i = 0; i < numCoords; ++i, st += 2) {
|
||||
uvSurface.Evaluate(st, patchPoints, 3, &results.uv[i][0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
void
|
||||
BfrSurfaceEvaluator<REAL>::evaluateByStencils(
|
||||
SurfaceType const & pSurface, SurfaceType const & uvSurface,
|
||||
TessCoordVector const & tessCoords, EvalResults<REAL> & results) const {
|
||||
|
||||
std::vector<REAL> stencilWeights;
|
||||
|
||||
int numCoords = (int) tessCoords.size() / 2;
|
||||
|
||||
if (results.evalPosition) {
|
||||
stencilWeights.resize(6 * pSurface.GetNumControlPoints());
|
||||
|
||||
REAL * sP = &stencilWeights[0];
|
||||
REAL * sDu = sP + pSurface.GetNumControlPoints();
|
||||
REAL * sDv = sDu + pSurface.GetNumControlPoints();
|
||||
REAL * sDuu = sDv + pSurface.GetNumControlPoints();
|
||||
REAL * sDuv = sDuu + pSurface.GetNumControlPoints();
|
||||
REAL * sDvv = sDuv + pSurface.GetNumControlPoints();
|
||||
|
||||
REAL const * st = &tessCoords[0];
|
||||
for (int i = 0; i < numCoords; ++i, st += 2) {
|
||||
REAL const * meshPos = &_baseMeshPos[0][0];
|
||||
|
||||
if (!results.eval1stDeriv) {
|
||||
pSurface.EvaluateStencil(st, &sP[0]);
|
||||
} else if (!results.eval2ndDeriv) {
|
||||
pSurface.EvaluateStencil(st, &sP[0], &sDu[0], &sDv[0]);
|
||||
} else {
|
||||
pSurface.EvaluateStencil(st, &sP[0], &sDu[0], &sDv[0],
|
||||
&sDuu[0], &sDuv[0], &sDvv[0]);
|
||||
}
|
||||
|
||||
if (results.evalPosition) {
|
||||
pSurface.ApplyStencilFromMesh(&sP[0], meshPos, 3,
|
||||
&results.p[i][0]);
|
||||
}
|
||||
if (results.eval1stDeriv) {
|
||||
pSurface.ApplyStencilFromMesh(&sDu[0], meshPos, 3,
|
||||
&results.du[i][0]);
|
||||
pSurface.ApplyStencilFromMesh(&sDv[0], meshPos, 3,
|
||||
&results.dv[i][0]);
|
||||
}
|
||||
if (results.eval2ndDeriv) {
|
||||
pSurface.ApplyStencilFromMesh(&sDuu[0], meshPos, 3,
|
||||
&results.duu[i][0]);
|
||||
pSurface.ApplyStencilFromMesh(&sDuv[0], meshPos, 3,
|
||||
&results.duv[i][0]);
|
||||
pSurface.ApplyStencilFromMesh(&sDvv[0], meshPos, 3,
|
||||
&results.dvv[i][0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (results.evalUV) {
|
||||
REAL const * meshUVs = &_baseMeshUVs[0][0];
|
||||
|
||||
stencilWeights.resize(uvSurface.GetNumControlPoints());
|
||||
|
||||
REAL * sUV = &stencilWeights[0];
|
||||
|
||||
REAL const * st = &tessCoords[0];
|
||||
for (int i = 0; i < numCoords; ++i, st += 2) {
|
||||
uvSurface.EvaluateStencil(st, &sUV[0]);
|
||||
|
||||
uvSurface.ApplyStencilFromMesh(&sUV[0], meshUVs, 3,
|
||||
&results.uv[i][0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Explicit instantiation for float and double:
|
||||
//
|
||||
template class BfrSurfaceEvaluator<float>;
|
||||
template class BfrSurfaceEvaluator<double>;
|
||||
|
82
regression/bfr_evaluate/bfrSurfaceEvaluator.h
Normal file
82
regression/bfr_evaluate/bfrSurfaceEvaluator.h
Normal file
@ -0,0 +1,82 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include "./types.h"
|
||||
|
||||
#include <opensubdiv/far/topologyRefiner.h>
|
||||
|
||||
#include <opensubdiv/bfr/refinerSurfaceFactory.h>
|
||||
#include <opensubdiv/bfr/tessellation.h>
|
||||
|
||||
|
||||
using namespace OpenSubdiv;
|
||||
using namespace OpenSubdiv::OPENSUBDIV_VERSION;
|
||||
|
||||
|
||||
|
||||
template <typename REAL>
|
||||
class BfrSurfaceEvaluator {
|
||||
public:
|
||||
typedef Bfr::Surface<REAL> SurfaceType;
|
||||
|
||||
typedef Bfr::RefinerSurfaceFactory<> SurfaceFactory;
|
||||
typedef Bfr::SurfaceFactory::Options FactoryOptions;
|
||||
typedef Bfr::SurfaceFactory::Index IndexType;
|
||||
|
||||
typedef std::vector<REAL> TessCoordVector;
|
||||
|
||||
typedef std::vector< Vec3<REAL> > Vec3Vector;
|
||||
|
||||
public:
|
||||
BfrSurfaceEvaluator(Far::TopologyRefiner const & baseMesh,
|
||||
Vec3Vector const & basePos,
|
||||
Vec3Vector const & baseUVs,
|
||||
FactoryOptions const & factoryOptions);
|
||||
~BfrSurfaceEvaluator() { }
|
||||
|
||||
public:
|
||||
bool FaceHasLimit(IndexType baseFace) const;
|
||||
|
||||
void Evaluate(IndexType baseface,
|
||||
TessCoordVector const & tessCoords,
|
||||
EvalResults<REAL> & results) const;
|
||||
|
||||
private:
|
||||
void evaluateDirectly(SurfaceType const & posSurface,
|
||||
SurfaceType const & uvSurface,
|
||||
TessCoordVector const & tessCoords,
|
||||
EvalResults<REAL> & results) const;
|
||||
|
||||
void evaluateByStencils(SurfaceType const & posSurface,
|
||||
SurfaceType const & uvSurface,
|
||||
TessCoordVector const & tessCoords,
|
||||
EvalResults<REAL> & results) const;
|
||||
|
||||
private:
|
||||
Far::TopologyRefiner const & _baseMesh;
|
||||
Vec3Vector const & _baseMeshPos;
|
||||
Vec3Vector const & _baseMeshUVs;
|
||||
|
||||
SurfaceFactory _factory;
|
||||
};
|
291
regression/bfr_evaluate/farPatchEvaluator.cpp
Normal file
291
regression/bfr_evaluate/farPatchEvaluator.cpp
Normal file
@ -0,0 +1,291 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include "farPatchEvaluator.h"
|
||||
|
||||
#include <opensubdiv/far/topologyRefinerFactory.h>
|
||||
#include <opensubdiv/far/topologyDescriptor.h>
|
||||
#include <opensubdiv/far/primvarRefiner.h>
|
||||
#include <opensubdiv/far/stencilTable.h>
|
||||
|
||||
|
||||
template <typename REAL>
|
||||
FarPatchEvaluator<REAL>::FarPatchEvaluator(
|
||||
Far::TopologyRefiner const & baseMesh,
|
||||
Vec3RealVector const & basePos,
|
||||
Vec3RealVector const & baseUVs,
|
||||
BfrSurfaceOptions const & bfrSurfaceOptions) :
|
||||
_baseMesh(baseMesh),
|
||||
_baseMeshPos(basePos),
|
||||
_baseMeshUVs(baseUVs) {
|
||||
|
||||
//
|
||||
// Initialize simple members first:
|
||||
//
|
||||
_regFaceSize = Sdc::SchemeTypeTraits::GetRegularFaceSize(
|
||||
baseMesh.GetSchemeType());
|
||||
|
||||
//
|
||||
// Declare options to use in construction of PatchTable et al:
|
||||
//
|
||||
int primaryLevel = bfrSurfaceOptions.GetApproxLevelSharp();
|
||||
int secondaryLevel = bfrSurfaceOptions.GetApproxLevelSmooth();
|
||||
|
||||
Far::PatchTableFactory::Options patchOptions(primaryLevel);
|
||||
patchOptions.SetPatchPrecision<REAL>();
|
||||
patchOptions.SetFVarPatchPrecision<REAL>();
|
||||
patchOptions.useInfSharpPatch = true;
|
||||
patchOptions.generateLegacySharpCornerPatches = false;
|
||||
patchOptions.shareEndCapPatchPoints = false;
|
||||
patchOptions.endCapType =
|
||||
Far::PatchTableFactory::Options::ENDCAP_GREGORY_BASIS;
|
||||
|
||||
bool hasUVs = !baseUVs.empty();
|
||||
int fvarChannel = 0;
|
||||
|
||||
patchOptions.generateFVarTables = hasUVs;
|
||||
patchOptions.numFVarChannels = hasUVs ? 1 : 0;
|
||||
patchOptions.fvarChannelIndices = &fvarChannel;
|
||||
patchOptions.generateFVarLegacyLinearPatches = false;
|
||||
|
||||
patchOptions.generateVaryingTables = false;
|
||||
|
||||
Far::TopologyRefiner::AdaptiveOptions refineOptions =
|
||||
patchOptions.GetRefineAdaptiveOptions();
|
||||
refineOptions.isolationLevel = primaryLevel;
|
||||
refineOptions.secondaryLevel = secondaryLevel;
|
||||
|
||||
//
|
||||
// Create a TopologyRefiner (sharing the base) to adaptively refine
|
||||
// and create the associated PatchTable:
|
||||
//
|
||||
Far::TopologyRefiner *patchRefiner =
|
||||
Far::TopologyRefinerFactory<Far::TopologyDescriptor>::Create(
|
||||
baseMesh);
|
||||
|
||||
patchRefiner->RefineAdaptive(refineOptions);
|
||||
|
||||
_patchTable = Far::PatchTableFactory::Create(*patchRefiner, patchOptions);
|
||||
|
||||
_patchFaces = new Far::PtexIndices(baseMesh);
|
||||
|
||||
_patchMap = new Far::PatchMap(*_patchTable);
|
||||
|
||||
|
||||
//
|
||||
// Declare buffers/vectors for refined/patch points:
|
||||
//
|
||||
Far::TopologyLevel const & baseLevel = baseMesh.GetLevel(0);
|
||||
|
||||
int numBasePoints = baseLevel.GetNumVertices();
|
||||
int numRefinedPoints = patchRefiner->GetNumVerticesTotal() - numBasePoints;
|
||||
int numLocalPoints = _patchTable->GetNumLocalPoints();
|
||||
|
||||
_patchPos.resize(numBasePoints + numRefinedPoints + numLocalPoints);
|
||||
|
||||
std::memcpy(&_patchPos[0], &basePos[0], numBasePoints * sizeof(Vec3Real));
|
||||
|
||||
//
|
||||
// Similarly declare buffers/vectors for refined/patch UVs:
|
||||
//
|
||||
int numBaseUVs = 0;
|
||||
int numRefinedUVs = 0;
|
||||
int numLocalUVs = 0;
|
||||
|
||||
if (hasUVs) {
|
||||
numBaseUVs = baseLevel.GetNumFVarValues();
|
||||
numRefinedUVs = patchRefiner->GetNumFVarValuesTotal() - numBaseUVs;
|
||||
numLocalUVs = _patchTable->GetNumLocalPointsFaceVarying();
|
||||
|
||||
_patchUVs.resize(numBaseUVs + numRefinedUVs + numLocalUVs);
|
||||
|
||||
std::memcpy(&_patchUVs[0], &baseUVs[0], numBaseUVs * sizeof(Vec3Real));
|
||||
}
|
||||
|
||||
//
|
||||
// Compute refined and local patch points and UVs:
|
||||
//
|
||||
if (numRefinedPoints) {
|
||||
Far::PrimvarRefinerReal<REAL> primvarRefiner(*patchRefiner);
|
||||
|
||||
Vec3Real const * srcP = &_patchPos[0];
|
||||
Vec3Real * dstP = &_patchPos[numBasePoints];
|
||||
|
||||
Vec3Real const * srcUV = hasUVs ? &_patchUVs[0] : 0;
|
||||
Vec3Real * dstUV = hasUVs ? &_patchUVs[numBaseUVs] : 0;
|
||||
|
||||
for (int level = 1; level < patchRefiner->GetNumLevels(); ++level) {
|
||||
primvarRefiner.Interpolate(level, srcP, dstP);
|
||||
srcP = dstP;
|
||||
dstP += patchRefiner->GetLevel(level).GetNumVertices();
|
||||
|
||||
if (hasUVs) {
|
||||
primvarRefiner.InterpolateFaceVarying(level, srcUV, dstUV);
|
||||
srcUV = dstUV;
|
||||
dstUV += patchRefiner->GetLevel(level).GetNumFVarValues();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (numLocalPoints) {
|
||||
_patchTable->GetLocalPointStencilTable<REAL>()->UpdateValues(
|
||||
&_patchPos[0], &_patchPos[numBasePoints + numRefinedPoints]);
|
||||
}
|
||||
if (hasUVs && numLocalUVs) {
|
||||
_patchTable->GetLocalPointFaceVaryingStencilTable<REAL>()->UpdateValues(
|
||||
&_patchUVs[0], &_patchUVs[numBaseUVs + numRefinedUVs]);
|
||||
}
|
||||
|
||||
delete patchRefiner;
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
bool
|
||||
FarPatchEvaluator<REAL>::FaceHasLimit(Far::Index baseFace) const {
|
||||
|
||||
return ! _baseMesh.GetLevel(0).IsFaceHole(baseFace);
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
void
|
||||
FarPatchEvaluator<REAL>::Evaluate(Far::Index baseFace,
|
||||
TessCoordVector const & tessCoords,
|
||||
EvalResults<REAL> & results) const {
|
||||
|
||||
assert(FaceHasLimit(baseFace));
|
||||
|
||||
int numCoords = (int) tessCoords.size() / 2;
|
||||
|
||||
// Allocate vectors for the properties to be evaluated:
|
||||
results.Resize(numCoords);
|
||||
|
||||
//
|
||||
// Identify the patch face and see if it needs to be re-parameterized:
|
||||
//
|
||||
int patchFace = _patchFaces->GetFaceId(baseFace);
|
||||
|
||||
int faceSize = _baseMesh.GetLevel(0).GetFaceVertices(baseFace).size();
|
||||
|
||||
Bfr::Parameterization faceParam(_baseMesh.GetSchemeType(), faceSize);
|
||||
|
||||
bool reparameterize = faceParam.HasSubFaces();
|
||||
|
||||
//
|
||||
// Evaluate at each of the given coordinates:
|
||||
//
|
||||
REAL const * stPair = &tessCoords[0];
|
||||
for (int i = 0; i < numCoords; ++i, stPair += 2) {
|
||||
REAL st[2] = { stPair[0], stPair[1] };
|
||||
|
||||
int patchIndex = patchFace;
|
||||
if (reparameterize) {
|
||||
patchIndex += faceParam.ConvertCoordToNormalizedSubFace(st, st);
|
||||
}
|
||||
|
||||
REAL s = st[0];
|
||||
REAL t = st[1];
|
||||
|
||||
Far::PatchTable::PatchHandle const * patchHandle =
|
||||
_patchMap->FindPatch(patchIndex, s, t);
|
||||
assert(patchHandle);
|
||||
|
||||
// Evaluate position and derivatives:
|
||||
if (results.evalPosition) {
|
||||
REAL wP[20], wDu[20], wDv[20], wDuu[20], wDuv[20], wDvv[20];
|
||||
|
||||
if (!results.eval1stDeriv) {
|
||||
_patchTable->EvaluateBasis(*patchHandle, s, t, wP);
|
||||
} else if (!results.eval2ndDeriv) {
|
||||
_patchTable->EvaluateBasis(*patchHandle, s, t, wP,
|
||||
wDu, wDv);
|
||||
} else {
|
||||
_patchTable->EvaluateBasis(*patchHandle, s, t, wP,
|
||||
wDu, wDv, wDuu, wDuv, wDvv);
|
||||
}
|
||||
|
||||
Vec3Real * P = results.evalPosition ? &results.p[i] : 0;
|
||||
Vec3Real * Du = results.eval1stDeriv ? &results.du[i] : 0;
|
||||
Vec3Real * Dv = results.eval1stDeriv ? &results.dv[i] : 0;
|
||||
Vec3Real * Duu = results.eval2ndDeriv ? &results.duu[i] : 0;
|
||||
Vec3Real * Duv = results.eval2ndDeriv ? &results.duv[i] : 0;
|
||||
Vec3Real * Dvv = results.eval2ndDeriv ? &results.dvv[i] : 0;
|
||||
|
||||
Far::ConstIndexArray cvIndices =
|
||||
_patchTable->GetPatchVertices(*patchHandle);
|
||||
|
||||
P->Clear();
|
||||
if (results.eval1stDeriv) {
|
||||
Du->Clear();
|
||||
Dv->Clear();
|
||||
if (results.eval2ndDeriv) {
|
||||
Duu->Clear();
|
||||
Duv->Clear();
|
||||
Dvv->Clear();
|
||||
}
|
||||
}
|
||||
|
||||
for (int cv = 0; cv < cvIndices.size(); ++cv) {
|
||||
P->AddWithWeight(_patchPos[cvIndices[cv]], wP[cv]);
|
||||
if (results.eval1stDeriv) {
|
||||
Du->AddWithWeight(_patchPos[cvIndices[cv]], wDu[cv]);
|
||||
Dv->AddWithWeight(_patchPos[cvIndices[cv]], wDv[cv]);
|
||||
if (results.eval2ndDeriv) {
|
||||
Duu->AddWithWeight(_patchPos[cvIndices[cv]], wDuu[cv]);
|
||||
Duv->AddWithWeight(_patchPos[cvIndices[cv]], wDuv[cv]);
|
||||
Dvv->AddWithWeight(_patchPos[cvIndices[cv]], wDvv[cv]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (results.evalUV) {
|
||||
REAL wUV[20];
|
||||
_patchTable->EvaluateBasisFaceVarying(*patchHandle, s, t, wUV);
|
||||
|
||||
Vec3Real & UV = results.uv[i];
|
||||
|
||||
UV.Clear();
|
||||
|
||||
Far::ConstIndexArray cvIndices =
|
||||
_patchTable->GetPatchFVarValues(*patchHandle);
|
||||
|
||||
for (int cv = 0; cv < cvIndices.size(); ++cv) {
|
||||
UV.AddWithWeight(_patchUVs[cvIndices[cv]], wUV[cv]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename REAL>
|
||||
FarPatchEvaluator<REAL>::~FarPatchEvaluator() {
|
||||
|
||||
delete _patchTable;
|
||||
delete _patchFaces;
|
||||
delete _patchMap;
|
||||
}
|
||||
|
||||
//
|
||||
// Explicit instantiation for float and double:
|
||||
//
|
||||
template class FarPatchEvaluator<float>;
|
||||
template class FarPatchEvaluator<double>;
|
||||
|
83
regression/bfr_evaluate/farPatchEvaluator.h
Normal file
83
regression/bfr_evaluate/farPatchEvaluator.h
Normal file
@ -0,0 +1,83 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include "./types.h"
|
||||
|
||||
#include <opensubdiv/far/topologyRefiner.h>
|
||||
#include <opensubdiv/far/patchTable.h>
|
||||
#include <opensubdiv/far/patchTableFactory.h>
|
||||
#include <opensubdiv/far/patchMap.h>
|
||||
#include <opensubdiv/far/ptexIndices.h>
|
||||
|
||||
#include <opensubdiv/bfr/refinerSurfaceFactory.h>
|
||||
#include <opensubdiv/bfr/tessellation.h>
|
||||
|
||||
using namespace OpenSubdiv;
|
||||
using namespace OpenSubdiv::OPENSUBDIV_VERSION;
|
||||
|
||||
|
||||
//
|
||||
// FarPatchEvaluator bundles the Far::PatchTable and its ecosystem of
|
||||
// related class to provide an evaluation interface targeted towards
|
||||
// evaluation of the base faces of a mesh.
|
||||
//
|
||||
template <typename REAL>
|
||||
class FarPatchEvaluator {
|
||||
public:
|
||||
typedef Far::PatchTableFactory PatchFactory;
|
||||
typedef Bfr::SurfaceFactory::Options BfrSurfaceOptions;
|
||||
|
||||
typedef std::vector<REAL> TessCoordVector;
|
||||
|
||||
typedef Vec3<REAL> Vec3Real;
|
||||
typedef std::vector<Vec3Real> Vec3RealVector;
|
||||
|
||||
public:
|
||||
FarPatchEvaluator(Far::TopologyRefiner const & baseMesh,
|
||||
Vec3RealVector const & basePos,
|
||||
Vec3RealVector const & baseUVs,
|
||||
BfrSurfaceOptions const & bfrSurfaceOptions);
|
||||
~FarPatchEvaluator();
|
||||
|
||||
public:
|
||||
bool FaceHasLimit(Far::Index baseFace) const;
|
||||
|
||||
void Evaluate(Far::Index baseface,
|
||||
TessCoordVector const & tessCoords,
|
||||
EvalResults<REAL> & results) const;
|
||||
|
||||
private:
|
||||
Far::TopologyRefiner const & _baseMesh;
|
||||
Vec3RealVector const & _baseMeshPos;
|
||||
Vec3RealVector const & _baseMeshUVs;
|
||||
|
||||
Far::PatchTable * _patchTable;
|
||||
Far::PatchMap * _patchMap;
|
||||
Far::PtexIndices * _patchFaces;
|
||||
|
||||
Vec3RealVector _patchPos;
|
||||
Vec3RealVector _patchUVs;
|
||||
|
||||
int _regFaceSize;
|
||||
};
|
99
regression/bfr_evaluate/init_shapes.h
Normal file
99
regression/bfr_evaluate/init_shapes.h
Normal file
@ -0,0 +1,99 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include <regression/common/shape_utils.h>
|
||||
#include <regression/shapes/all.h>
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
static void
|
||||
initShapes(std::vector<ShapeDesc> & shapes) {
|
||||
|
||||
shapes.push_back(ShapeDesc("catmark_toroidal_tet", catmark_toroidal_tet, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube", catmark_cube, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cubes_semisharp", catmark_cubes_semisharp, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cubes_infsharp", catmark_cubes_infsharp, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid", catmark_pyramid, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid_creases0", catmark_pyramid_creases0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid_creases1", catmark_pyramid_creases1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_torus", catmark_torus, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_torus_creases0", catmark_torus_creases0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_torus_creases1", catmark_torus_creases1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_edgecorner", catmark_edgecorner, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_edgeonly", catmark_edgeonly, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_edgenone", catmark_edgenone, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_quadstrips", catmark_quadstrips, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_xord_interior", catmark_xord_interior, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_xord_boundary", catmark_xord_boundary, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_val2_interior", catmark_val2_interior, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonquads", catmark_nonquads, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_single_crease", catmark_single_crease, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_inf_crease0", catmark_inf_crease0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_inf_crease1", catmark_inf_crease1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_verts", catmark_nonman_verts, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_edges", catmark_nonman_edges, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test1", catmark_hole_test1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test2", catmark_hole_test2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test3", catmark_hole_test3, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test4", catmark_hole_test4, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_chaikin0", catmark_chaikin0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_chaikin1", catmark_chaikin1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_chaikin2", catmark_chaikin2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_smoothtris0", catmark_smoothtris0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_smoothtris1", catmark_smoothtris1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pole8", catmark_pole8, kCatmark));
|
||||
// shapes.push_back(ShapeDesc("catmark_pole64", catmark_pole64, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_quadpole64",catmark_nonman_quadpole64,kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_edge100", catmark_nonman_edge100, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_helmet", catmark_helmet, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_bishop", catmark_bishop, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pawn", catmark_pawn, kCatmark));
|
||||
// shapes.push_back(ShapeDesc("catmark_rook", catmark_rook, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_car", catmark_car, kCatmark));
|
||||
|
||||
shapes.push_back(ShapeDesc("loop_toroidal_tet", loop_toroidal_tet, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_tetrahedron", loop_tetrahedron, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cube", loop_cube, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cubes_semisharp", loop_cubes_semisharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cubes_infsharp", loop_cubes_infsharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cube_asymmetric", loop_cube_asymmetric, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_icosahedron", loop_icosahedron, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_icos_semisharp", loop_icos_semisharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_icos_infsharp", loop_icos_infsharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_triangle_edgecorner", loop_triangle_edgecorner, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_triangle_edgeonly", loop_triangle_edgeonly, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_triangle_edgenone", loop_triangle_edgenone, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_xord_interior", loop_xord_interior, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_xord_boundary", loop_xord_boundary, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_nonman_verts", loop_nonman_verts, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_nonman_edges", loop_nonman_edges, kLoop));
|
||||
// shapes.push_back(ShapeDesc("loop_pole64", loop_pole64, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_nonman_edge100", loop_nonman_edge100, kLoop));
|
||||
|
||||
shapes.push_back(ShapeDesc("bilinear_cube", bilinear_cube, kBilinear));
|
||||
shapes.push_back(ShapeDesc("bilinear_nonplanar", bilinear_nonplanar, kBilinear));
|
||||
shapes.push_back(ShapeDesc("bilinear_nonquads0", bilinear_nonquads0, kBilinear));
|
||||
shapes.push_back(ShapeDesc("bilinear_nonquads1", bilinear_nonquads1, kBilinear));
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
149
regression/bfr_evaluate/init_shapes_all.h
Normal file
149
regression/bfr_evaluate/init_shapes_all.h
Normal file
@ -0,0 +1,149 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include <regression/common/shape_utils.h>
|
||||
#include <regression/shapes/all.h>
|
||||
|
||||
static void
|
||||
initShapesAll(std::vector<ShapeDesc> & shapes) {
|
||||
|
||||
shapes.push_back(ShapeDesc("catmark_cube", catmark_cube, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_corner0", catmark_cube_corner0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_corner1", catmark_cube_corner1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_corner2", catmark_cube_corner2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_corner3", catmark_cube_corner3, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_corner4", catmark_cube_corner4, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_creases0", catmark_cube_creases0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_creases1", catmark_cube_creases1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cube_creases2", catmark_cube_creases2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cubes_infsharp", catmark_cubes_infsharp, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_cubes_semisharp", catmark_cubes_semisharp, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_chaikin0", catmark_chaikin0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_chaikin1", catmark_chaikin1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_chaikin2", catmark_chaikin2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_dart_edgecorner", catmark_dart_edgecorner, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_dart_edgeonly", catmark_dart_edgeonly, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_edgecorner", catmark_edgecorner, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_edgeonly", catmark_edgeonly, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_edgenone", catmark_edgenone, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fan", catmark_fan, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_flap", catmark_flap, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_flap2", catmark_flap2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fvar_bound0", catmark_fvar_bound0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fvar_bound1", catmark_fvar_bound1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fvar_bound2", catmark_fvar_bound2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fvar_bound3", catmark_fvar_bound3, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fvar_bound4", catmark_fvar_bound4, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_fvar_project0", catmark_fvar_project0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test0", catmark_gregory_test0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test1", catmark_gregory_test1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test2", catmark_gregory_test2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test3", catmark_gregory_test3, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test4", catmark_gregory_test4, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test5", catmark_gregory_test5, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test6", catmark_gregory_test6, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test7", catmark_gregory_test7, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_gregory_test8", catmark_gregory_test8, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_helmet", catmark_helmet, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test1", catmark_hole_test1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test2", catmark_hole_test2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test3", catmark_hole_test3, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_hole_test4", catmark_hole_test4, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_lefthanded", catmark_lefthanded, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_righthanded", catmark_righthanded, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_edges", catmark_nonman_edges, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_edge100", catmark_nonman_edge100, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_verts", catmark_nonman_verts, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_quadpole8", catmark_nonman_quadpole8, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_quadpole64", catmark_nonman_quadpole64, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_quadpole360", catmark_nonman_quadpole360, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonman_bareverts", catmark_nonman_bareverts, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_nonquads", catmark_nonquads, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pawn", catmark_pawn, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pole8", catmark_pole8, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pole64", catmark_pole64, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid_creases0", catmark_pyramid_creases0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid_creases1", catmark_pyramid_creases1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid_creases2", catmark_pyramid_creases2, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_pyramid", catmark_pyramid, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_quadstrips", catmark_quadstrips, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_single_crease", catmark_single_crease, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_inf_crease0", catmark_inf_crease0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_inf_crease1", catmark_inf_crease1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_smoothtris0", catmark_smoothtris0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_smoothtris1", catmark_smoothtris1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_tent_creases0", catmark_tent_creases0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_tent_creases1", catmark_tent_creases1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_tent", catmark_tent, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_toroidal_tet", catmark_toroidal_tet, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_torus", catmark_torus, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_torus_creases0", catmark_torus_creases0, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_torus_creases1", catmark_torus_creases1, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_val2_interior", catmark_val2_interior, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_val2_back2back", catmark_val2_back2back, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_val2_foldover", catmark_val2_foldover, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_val2_nonman", catmark_val2_nonman, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_xord_interior", catmark_xord_interior, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_xord_boundary", catmark_xord_boundary, kCatmark));
|
||||
shapes.push_back(ShapeDesc("bilinear_cube", bilinear_cube, kBilinear));
|
||||
shapes.push_back(ShapeDesc("bilinear_nonplanar", bilinear_nonplanar, kBilinear));
|
||||
shapes.push_back(ShapeDesc("bilinear_nonquads0", bilinear_nonquads0, kBilinear));
|
||||
shapes.push_back(ShapeDesc("bilinear_nonquads1", bilinear_nonquads1, kBilinear));
|
||||
shapes.push_back(ShapeDesc("loop_chaikin0", loop_chaikin0, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_chaikin1", loop_chaikin1, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cube", loop_cube, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cube_asymmetric", loop_cube_asymmetric, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cube_creases0", loop_cube_creases0, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cube_creases1", loop_cube_creases1, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cubes_infsharp", loop_cubes_infsharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_cubes_semisharp", loop_cubes_semisharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_fvar_bound0", loop_fvar_bound0, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_fvar_bound1", loop_fvar_bound1, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_fvar_bound2", loop_fvar_bound2, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_fvar_bound3", loop_fvar_bound3, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_icosahedron", loop_icosahedron, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_icos_infsharp", loop_icos_infsharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_icos_semisharp", loop_icos_semisharp, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_nonman_edges", loop_nonman_edges, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_nonman_edge100", loop_nonman_edge100, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_nonman_verts", loop_nonman_verts, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_pole8", loop_pole8, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_pole64", loop_pole64, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_saddle_edgecorner", loop_saddle_edgecorner, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_saddle_edgeonly", loop_saddle_edgeonly, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_tetrahedron", loop_tetrahedron, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_toroidal_tet", loop_toroidal_tet, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_triangle_edgecorner", loop_triangle_edgecorner, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_triangle_edgeonly", loop_triangle_edgeonly, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_xord_boundary", loop_xord_boundary, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_xord_interior", loop_xord_interior, kLoop));
|
||||
shapes.push_back(ShapeDesc("loop_val2_interior", loop_val2_interior, kLoop));
|
||||
|
||||
// More complicated shapes with longer execution times:
|
||||
shapes.push_back(ShapeDesc("catmark_car", catmark_car, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_rook", catmark_rook, kCatmark));
|
||||
shapes.push_back(ShapeDesc("catmark_bishop", catmark_bishop, kCatmark));
|
||||
// shapes.push_back(ShapeDesc("catmark_pole360", catmark_pole360, kCatmark));
|
||||
// shapes.push_back(ShapeDesc("loop_pole360", loop_pole360, kLoop));
|
||||
}
|
954
regression/bfr_evaluate/main.cpp
Normal file
954
regression/bfr_evaluate/main.cpp
Normal file
@ -0,0 +1,954 @@
|
||||
//
|
||||
// Copyright 2021 Pixar
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
||||
// with the following modification; you may not use this file except in
|
||||
// compliance with the Apache License and the following modification to it:
|
||||
// Section 6. Trademarks. is deleted and replaced with:
|
||||
//
|
||||
// 6. Trademarks. This License does not grant permission to use the trade
|
||||
// names, trademarks, service marks, or product names of the Licensor
|
||||
// and its affiliates, except as required to comply with Section 4(c) of
|
||||
// the License and to reproduce the content of the NOTICE file.
|
||||
//
|
||||
// You may obtain a copy of the Apache License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the Apache License with the above modification is
|
||||
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the Apache License for the specific
|
||||
// language governing permissions and limitations under the Apache License.
|
||||
//
|
||||
|
||||
#include "./types.h"
|
||||
#include "./bfrSurfaceEvaluator.h"
|
||||
#include "./farPatchEvaluator.h"
|
||||
|
||||
#include "../../regression/common/far_utils.h"
|
||||
|
||||
#include "init_shapes.h"
|
||||
#include "init_shapes_all.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <cassert>
|
||||
#include <cstdio>
|
||||
|
||||
using namespace OpenSubdiv;
|
||||
using namespace OpenSubdiv::OPENSUBDIV_VERSION;
|
||||
|
||||
//
|
||||
// Global set of shapes -- populated by variants of initShapes() that
|
||||
// include explicit lists:
|
||||
//
|
||||
std::vector<ShapeDesc> g_shapes;
|
||||
|
||||
|
||||
//
|
||||
// Command line arguments and their parsing:
|
||||
//
|
||||
class Args {
|
||||
public:
|
||||
// options related to testing and reporting:
|
||||
unsigned int posEvaluate : 1;
|
||||
unsigned int d1Evaluate : 1;
|
||||
unsigned int d2Evaluate : 1;
|
||||
unsigned int uvEvaluate : 1;
|
||||
unsigned int posIgnore : 1;
|
||||
unsigned int d1Ignore : 1;
|
||||
unsigned int d2Ignore : 1;
|
||||
unsigned int uvIgnore : 1;
|
||||
unsigned int printArgs : 1;
|
||||
unsigned int printProgress : 1;
|
||||
unsigned int printFaceDiffs : 1;
|
||||
unsigned int printSummary : 1;
|
||||
unsigned int printWarnings : 1;
|
||||
unsigned int ptexConvert : 1;
|
||||
|
||||
// options affecting configuration and execution:
|
||||
unsigned int evalByStencils : 1;
|
||||
unsigned int doublePrecision : 1;
|
||||
unsigned int noCacheFlag : 1;
|
||||
|
||||
// options affecting the shape of the limit surface:
|
||||
int depthSharp;
|
||||
int depthSmooth;
|
||||
int bndInterp;
|
||||
int uvInterp;
|
||||
|
||||
// options related to tessellation and comparison:
|
||||
int uniformRes;
|
||||
float relTolerance;
|
||||
float absTolerance;
|
||||
float uvTolerance;
|
||||
|
||||
// options affecting the list of shapes to be tested:
|
||||
int shapeCount;
|
||||
Scheme shapeScheme;
|
||||
bool shapesCat2Loop;
|
||||
bool shapesAll;
|
||||
|
||||
std::vector<ShapeDesc> shapes;
|
||||
|
||||
// options determining overall success/failure:
|
||||
int passCount;
|
||||
|
||||
public:
|
||||
Args(int argc, char **argv) :
|
||||
posEvaluate(true),
|
||||
d1Evaluate(false),
|
||||
d2Evaluate(false),
|
||||
uvEvaluate(false),
|
||||
posIgnore(false),
|
||||
d1Ignore(false),
|
||||
d2Ignore(false),
|
||||
uvIgnore(false),
|
||||
printArgs(true),
|
||||
printProgress(true),
|
||||
printFaceDiffs(false),
|
||||
printSummary(true),
|
||||
printWarnings(true),
|
||||
ptexConvert(false),
|
||||
evalByStencils(false),
|
||||
doublePrecision(false),
|
||||
noCacheFlag(false),
|
||||
depthSharp(-1),
|
||||
depthSmooth(-1),
|
||||
bndInterp(-1),
|
||||
uvInterp(-1),
|
||||
uniformRes(3),
|
||||
relTolerance(0.00005f),
|
||||
absTolerance(0.0f),
|
||||
uvTolerance(0.0001f),
|
||||
shapeCount(0),
|
||||
shapeScheme(kCatmark),
|
||||
shapesCat2Loop(false),
|
||||
shapesAll(false),
|
||||
shapes(),
|
||||
passCount(0) {
|
||||
|
||||
std::string fileString;
|
||||
|
||||
std::vector<std::string> shapeNames;
|
||||
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
char * arg = argv[i];
|
||||
|
||||
// Options related to input .obj files:
|
||||
if (strstr(arg, ".obj")) {
|
||||
if (readString(arg, fileString)) {
|
||||
// Use the scheme declared at the time so that multiple
|
||||
// shape/scheme pairs can be specified
|
||||
shapes.push_back(
|
||||
ShapeDesc(arg, fileString.c_str(), shapeScheme));
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"Error: Unable to open/read .obj file '%s'\n", arg);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Options affecting the limit surface shapes:
|
||||
} else if (!strcmp(arg, "-l")) {
|
||||
if (++i < argc) {
|
||||
int maxLevel = atoi(argv[i]);
|
||||
depthSharp = maxLevel;
|
||||
depthSmooth = maxLevel;
|
||||
}
|
||||
} else if (!strcmp(arg, "-lsharp")) {
|
||||
if (++i < argc) depthSharp = atoi(argv[i]);
|
||||
} else if (!strcmp(arg, "-lsmooth")) {
|
||||
if (++i < argc) depthSmooth = atoi(argv[i]);
|
||||
} else if (!strcmp(argv[i], "-bint")) {
|
||||
if (++i < argc) bndInterp = atoi(argv[i]);
|
||||
} else if (!strcmp(argv[i], "-uvint")) {
|
||||
if (++i < argc) uvInterp = atoi(argv[i]);
|
||||
|
||||
// Options affecting what gets evaluated:
|
||||
} else if (!strcmp(arg, "-res")) {
|
||||
if (++i < argc) uniformRes = atoi(argv[i]);
|
||||
} else if (!strcmp(arg, "-pos")) {
|
||||
posEvaluate = true;
|
||||
} else if (!strcmp(arg, "-nopos")) {
|
||||
posEvaluate = false;
|
||||
} else if (!strcmp(arg, "-d1")) {
|
||||
d1Evaluate = true;
|
||||
} else if (!strcmp(arg, "-nod1")) {
|
||||
d1Evaluate = false;
|
||||
} else if (!strcmp(arg, "-d2")) {
|
||||
d2Evaluate = true;
|
||||
} else if (!strcmp(arg, "-nod2")) {
|
||||
d2Evaluate = false;
|
||||
} else if (!strcmp(arg, "-uv")) {
|
||||
uvEvaluate = true;
|
||||
} else if (!strcmp(arg, "-nouv")) {
|
||||
uvEvaluate = false;
|
||||
} else if (!strcmp(arg, "-ptex")) {
|
||||
ptexConvert = true;
|
||||
} else if (!strcmp(arg, "-noptex")) {
|
||||
ptexConvert = false;
|
||||
|
||||
// Options affecting what gets compared and reported:
|
||||
} else if (!strcmp(arg, "-skippos")) {
|
||||
posIgnore = true;
|
||||
} else if (!strcmp(arg, "-skipd1")) {
|
||||
d1Ignore = true;
|
||||
} else if (!strcmp(arg, "-skipd2")) {
|
||||
d2Ignore = true;
|
||||
} else if (!strcmp(arg, "-skipuv")) {
|
||||
uvIgnore = true;
|
||||
} else if (!strcmp(arg, "-faces")) {
|
||||
printFaceDiffs = true;
|
||||
|
||||
// Options affecting comparison tolerances:
|
||||
} else if (!strcmp(argv[i], "-reltol")) {
|
||||
if (++i < argc) relTolerance = (float)atof(argv[i]);
|
||||
} else if (!strcmp(argv[i], "-abstol")) {
|
||||
if (++i < argc) absTolerance = (float)atof(argv[i]);
|
||||
} else if (!strcmp(argv[i], "-uvtol")) {
|
||||
if (++i < argc) uvTolerance = (float)atof(argv[i]);
|
||||
|
||||
// Options controlling other internal processing:
|
||||
} else if (!strcmp(arg, "-stencils")) {
|
||||
evalByStencils = true;
|
||||
} else if (!strcmp(arg, "-double")) {
|
||||
doublePrecision = true;
|
||||
} else if (!strcmp(arg, "-nocache")) {
|
||||
noCacheFlag = true;
|
||||
|
||||
// Options affecting the shapes to be included:
|
||||
} else if (!strcmp(arg, "-bilinear")) {
|
||||
shapeScheme = kBilinear;
|
||||
} else if (!strcmp(arg, "-catmark")) {
|
||||
shapeScheme = kCatmark;
|
||||
} else if (!strcmp(arg, "-loop")) {
|
||||
shapeScheme = kLoop;
|
||||
} else if (!strcmp(arg, "-cat2loop")) {
|
||||
shapesCat2Loop = true;
|
||||
} else if (!strcmp(arg, "-count")) {
|
||||
if (++i < argc) shapeCount = atoi(argv[i]);
|
||||
} else if (!strcmp(arg, "-shape")) {
|
||||
if (++i < argc) {
|
||||
shapeNames.push_back(std::string(argv[i]));
|
||||
}
|
||||
} else if (!strcmp(arg, "-all")) {
|
||||
shapesAll = true;
|
||||
|
||||
// Printing and reporting:
|
||||
} else if (!strcmp(arg, "-args")) {
|
||||
printArgs = true;
|
||||
} else if (!strcmp(arg, "-noargs")) {
|
||||
printArgs = false;
|
||||
} else if (!strcmp(arg, "-prog")) {
|
||||
printProgress = true;
|
||||
} else if (!strcmp(arg, "-noprog")) {
|
||||
printProgress = false;
|
||||
} else if (!strcmp(arg, "-sum")) {
|
||||
printSummary = true;
|
||||
} else if (!strcmp(arg, "-nosum")) {
|
||||
printSummary = false;
|
||||
} else if (!strcmp(arg, "-quiet")) {
|
||||
printWarnings = false;
|
||||
} else if (!strcmp(arg, "-silent")) {
|
||||
printArgs = false;
|
||||
printProgress = false;
|
||||
printSummary = false;
|
||||
printWarnings = false;
|
||||
|
||||
// Success/failure of the entire test:
|
||||
} else if (!strcmp(argv[i], "-pass")) {
|
||||
if (++i < argc) passCount = atoi(argv[i]);
|
||||
|
||||
// Unrecognized...
|
||||
} else {
|
||||
fprintf(stderr, "Error: Unrecognized argument '%s'\n", arg);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Validation -- possible conflicting options, values, etc.
|
||||
if (bndInterp > 2) {
|
||||
fprintf(stderr, "Warning: Ignoring bad value to -bint (%d)\n",
|
||||
bndInterp);
|
||||
bndInterp = -1;
|
||||
}
|
||||
if (uvInterp > 5) {
|
||||
fprintf(stderr, "Warning: Ignoring bad value to -uvint (%d)\n",
|
||||
uvInterp);
|
||||
uvInterp = -1;
|
||||
}
|
||||
|
||||
if (d2Evaluate) {
|
||||
if (!d1Evaluate) {
|
||||
fprintf(stderr, "Warning: 2nd deriv evaluation forces 1st.\n");
|
||||
d1Evaluate = true;
|
||||
}
|
||||
if (!posEvaluate) {
|
||||
fprintf(stderr, "Warning: 2nd deriv evaluation forces pos.\n");
|
||||
posEvaluate = true;
|
||||
}
|
||||
} else if (d1Evaluate) {
|
||||
if (!posEvaluate) {
|
||||
fprintf(stderr, "Warning: 1st deriv evaluation forces pos.\n");
|
||||
posEvaluate = true;
|
||||
}
|
||||
}
|
||||
if (!posEvaluate && !uvEvaluate) {
|
||||
fprintf(stderr, "Error: All pos and UV evaluation disabled.\n");
|
||||
exit(0);
|
||||
}
|
||||
if (posIgnore && d1Ignore && d2Ignore && uvIgnore) {
|
||||
fprintf(stderr, "Error: All pos and UV comparisons disabled.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ((depthSmooth == 0) || (depthSharp == 0)) {
|
||||
fprintf(stderr,
|
||||
"Warning: Far evaluation unstable with refinement level 0.\n");
|
||||
}
|
||||
|
||||
// Managing the list of shapes:
|
||||
assert(g_shapes.empty());
|
||||
if (!shapeNames.empty()) {
|
||||
if (shapesAll) {
|
||||
initShapesAll(g_shapes);
|
||||
} else {
|
||||
initShapes(g_shapes);
|
||||
}
|
||||
// Maybe worth building a map -- for this and more...
|
||||
for (size_t i = 0; i < shapeNames.size(); ++i) {
|
||||
std::string & shapeName = shapeNames[i];
|
||||
bool found = false;
|
||||
for (size_t j = 0; !found && (j < g_shapes.size()); ++j) {
|
||||
if (g_shapes[j].name == shapeName) {
|
||||
shapes.push_back(g_shapes[j]);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
fprintf(stderr,
|
||||
"Error: Specified shape '%s' not found.\n",
|
||||
shapeName.c_str());
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
~Args() { }
|
||||
|
||||
void
|
||||
Print() const {
|
||||
|
||||
char const * boolStrings[2] = { "false", "true" };
|
||||
char const * bIntStrings[3] = { "BOUNDARY_NONE",
|
||||
"BOUNDARY_EDGE_ONLY",
|
||||
"BOUNDARY_EDGE_AND_CORNER" };
|
||||
char const * fvIntStrings[6] = { "LINEAR_NONE",
|
||||
"LINEAR_CORNERS_ONLY",
|
||||
"LINEAR_CORNERS_PLUS1",
|
||||
"LINEAR_CORNERS_PLUS2",
|
||||
"LINEAR_BOUNDARIES",
|
||||
"LINEAR_ALL" };
|
||||
|
||||
printf("\n");
|
||||
printf("Shape options:\n");
|
||||
if (depthSharp >= 0) {
|
||||
printf(" - max level sharp = %d\n", depthSharp);
|
||||
} else {
|
||||
printf(" - max level sharp = %d (dflt)\n",
|
||||
(Bfr::SurfaceFactory::Options()).GetApproxLevelSharp());
|
||||
}
|
||||
if (depthSmooth >= 0) {
|
||||
printf(" - max level smooth = %d\n", depthSmooth);
|
||||
} else {
|
||||
printf(" - max level smooth = %d (dflt)\n",
|
||||
(Bfr::SurfaceFactory::Options()).GetApproxLevelSmooth());
|
||||
}
|
||||
if (bndInterp < 0) {
|
||||
printf(" - boundary interp = (as assigned)\n");
|
||||
} else {
|
||||
printf(" - boundary interp = %s\n", bIntStrings[bndInterp]);
|
||||
}
|
||||
if (uvEvaluate) {
|
||||
if (uvInterp < 0) {
|
||||
printf(" - UV linear interp = (as assigned)\n");
|
||||
} else {
|
||||
printf(" - UV linear interp = %s\n", fvIntStrings[uvInterp]);
|
||||
}
|
||||
}
|
||||
|
||||
printf("Evaluation options:\n");
|
||||
printf(" - tessellation res = %d\n", uniformRes);
|
||||
printf(" - position = %s\n", boolStrings[posEvaluate]);
|
||||
printf(" - 1st derivative = %s\n", boolStrings[d1Evaluate]);
|
||||
printf(" - 2nd derivative = %s\n", boolStrings[d2Evaluate]);
|
||||
printf(" - UV = %s\n", boolStrings[uvEvaluate]);
|
||||
|
||||
printf("Comparison options:\n");
|
||||
if (absTolerance > 0.0f) {
|
||||
printf(" - tolerance (abs) = %g\n", absTolerance);
|
||||
} else {
|
||||
printf(" - tolerance (rel) = %g\n", relTolerance);
|
||||
}
|
||||
if (uvEvaluate) {
|
||||
printf(" - tolerance UV = %g\n", uvTolerance);
|
||||
}
|
||||
if (posEvaluate && posIgnore) {
|
||||
printf(" - ignore pos = %s\n", boolStrings[posIgnore]);
|
||||
}
|
||||
if (d1Evaluate && d1Ignore) {
|
||||
printf(" - ignore 1st deriv = %s\n", boolStrings[d1Ignore]);
|
||||
}
|
||||
if (d2Evaluate && d2Ignore) {
|
||||
printf(" - ignore 2nd deriv = %s\n", boolStrings[d2Ignore]);
|
||||
}
|
||||
if (uvEvaluate && uvIgnore) {
|
||||
printf(" - ignore UV = %s\n", boolStrings[uvIgnore]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
private:
|
||||
Args() { }
|
||||
|
||||
bool
|
||||
readString(const char *fileName, std::string& fileString) {
|
||||
std::ifstream ifs(fileName);
|
||||
if (ifs) {
|
||||
std::stringstream ss;
|
||||
ss << ifs.rdbuf();
|
||||
ifs.close();
|
||||
|
||||
fileString = ss.str();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Create a TopologyRefiner from a Shape:
|
||||
//
|
||||
template <typename REAL>
|
||||
Far::TopologyRefiner *
|
||||
createTopologyRefiner(ShapeDesc const & shapeDesc,
|
||||
std::vector< Vec3<REAL> > & shapePos,
|
||||
std::vector< Vec3<REAL> > & shapeUVs,
|
||||
Args const & args) {
|
||||
|
||||
typedef Vec3<REAL> Vec3Real;
|
||||
|
||||
//
|
||||
// Load the Shape -- skip with a warning on failure:
|
||||
//
|
||||
Shape * shape = Shape::parseObj(shapeDesc.data.c_str(),
|
||||
shapeDesc.scheme,
|
||||
shapeDesc.isLeftHanded);
|
||||
if (shape == 0) {
|
||||
if (args.printWarnings) {
|
||||
fprintf(stderr, "Warning: Failed to parse shape '%s'\n",
|
||||
shapeDesc.name.c_str());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Verify UVs before continuing:
|
||||
if (args.uvEvaluate) {
|
||||
if (shape->uvs.empty() != shape->faceuvs.empty()) {
|
||||
if (args.printWarnings) {
|
||||
fprintf(stderr,
|
||||
"Warning: Incomplete UVs assigned to Shape '%s'\n",
|
||||
shapeDesc.name.c_str());
|
||||
}
|
||||
delete shape;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Create a TopologyRefiner and load position and UVs:
|
||||
//
|
||||
Sdc::SchemeType sdcType = GetSdcType(*shape);
|
||||
|
||||
if (args.shapesCat2Loop && (sdcType == Sdc::SCHEME_LOOP)) {
|
||||
if (args.printWarnings) {
|
||||
fprintf(stderr,
|
||||
"\t\tWarning: Applying Catmark to Loop shape '%s'\n",
|
||||
shapeDesc.name.c_str());
|
||||
}
|
||||
sdcType = Sdc::SCHEME_CATMARK;
|
||||
}
|
||||
|
||||
Sdc::Options sdcOptions = GetSdcOptions(*shape);
|
||||
if (args.bndInterp >= 0) {
|
||||
sdcOptions.SetVtxBoundaryInterpolation(
|
||||
(Sdc::Options::VtxBoundaryInterpolation) args.bndInterp);
|
||||
}
|
||||
if (args.uvInterp >= 0) {
|
||||
sdcOptions.SetFVarLinearInterpolation(
|
||||
(Sdc::Options::FVarLinearInterpolation) args.uvInterp);
|
||||
}
|
||||
|
||||
Far::TopologyRefiner * refiner =
|
||||
Far::TopologyRefinerFactory<Shape>::Create(*shape,
|
||||
Far::TopologyRefinerFactory<Shape>::Options(sdcType, sdcOptions));
|
||||
|
||||
if (refiner == 0) {
|
||||
if (args.printWarnings) {
|
||||
fprintf(stderr, "Warning: Unable to interpret Shape '%s'\n",
|
||||
shapeDesc.name.c_str());
|
||||
}
|
||||
delete shape;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int numVertices = refiner->GetNumVerticesTotal();
|
||||
shapePos.resize(numVertices);
|
||||
for (int i = 0; i < numVertices; ++i) {
|
||||
shapePos[i] = Vec3Real(shape->verts[i*3],
|
||||
shape->verts[i*3+1],
|
||||
shape->verts[i*3+2]);
|
||||
}
|
||||
|
||||
shapeUVs.resize(0);
|
||||
if (args.uvEvaluate) {
|
||||
if (refiner->GetNumFVarChannels()) {
|
||||
int numUVs = refiner->GetNumFVarValuesTotal(0);
|
||||
shapeUVs.resize(numUVs);
|
||||
for (int i = 0; i < numUVs; ++i) {
|
||||
shapeUVs[i] = Vec3Real(shape->uvs[i*2],
|
||||
shape->uvs[i*2+1],
|
||||
0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete shape;
|
||||
return refiner;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Compute the bounding box of a Vec3 vector and a relative tolerance:
|
||||
//
|
||||
template <typename REAL>
|
||||
REAL
|
||||
GetRelativeTolerance(std::vector< Vec3<REAL> > const & p, REAL fraction) {
|
||||
|
||||
Vec3<REAL> pMin = p[0];
|
||||
Vec3<REAL> pMax = p[0];
|
||||
|
||||
for (size_t i = 1; i < p.size(); ++i) {
|
||||
Vec3<REAL> const & pi = p[i];
|
||||
|
||||
pMin[0] = std::min(pMin[0], pi[0]);
|
||||
pMin[1] = std::min(pMin[1], pi[1]);
|
||||
pMin[2] = std::min(pMin[2], pi[2]);
|
||||
|
||||
pMax[0] = std::max(pMax[0], pi[0]);
|
||||
pMax[1] = std::max(pMax[1], pi[1]);
|
||||
pMax[2] = std::max(pMax[2], pi[2]);
|
||||
}
|
||||
|
||||
Vec3<REAL> pDelta = pMax - pMin;
|
||||
|
||||
REAL maxSize = std::max(std::abs(pDelta[0]), std::abs(pDelta[1]));
|
||||
maxSize = std::max(maxSize, std::abs(pDelta[2]));
|
||||
|
||||
return fraction * maxSize;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// An independent test from limit surface evaluation: comparing the
|
||||
// conversion of (u,v) coordinates for Bfr::Parameterization to Ptex
|
||||
// and back (subject to a given tolerance):
|
||||
//
|
||||
template <typename REAL>
|
||||
void
|
||||
ValidatePtexConversion(Bfr::Parameterization const & param,
|
||||
REAL const givenCoord[2], REAL tol = 0.0001f) {
|
||||
|
||||
if (!param.HasSubFaces()) return;
|
||||
|
||||
//
|
||||
// Convert the given (u,v) coordinate to Ptex and back and
|
||||
// compare the final result to the original:
|
||||
//
|
||||
REAL ptexCoord[2];
|
||||
REAL finalCoord[2];
|
||||
|
||||
int ptexFace = param.ConvertCoordToNormalizedSubFace(givenCoord, ptexCoord);
|
||||
param.ConvertNormalizedSubFaceToCoord(ptexFace, ptexCoord, finalCoord);
|
||||
|
||||
bool subFaceDiff = (ptexFace != param.GetSubFace(givenCoord));
|
||||
bool uCoordDiff = (std::abs(finalCoord[0] - givenCoord[0]) > tol);
|
||||
bool vCoordDiff = (std::abs(finalCoord[1] - givenCoord[1]) > tol);
|
||||
|
||||
if (subFaceDiff || uCoordDiff || vCoordDiff) {
|
||||
fprintf(stderr,
|
||||
"Warning: Mismatch in sub-face Parameterization conversion:\n");
|
||||
if (subFaceDiff ) {
|
||||
fprintf(stderr,
|
||||
" converted sub-face (%d) != original (%d)\n",
|
||||
ptexFace, param.GetSubFace(givenCoord));
|
||||
}
|
||||
if (uCoordDiff || vCoordDiff) {
|
||||
fprintf(stderr,
|
||||
" converted coord (%f,%f) != original (%f,%f)\n",
|
||||
finalCoord[0], finalCoord[1], givenCoord[0], givenCoord[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Compare two meshes using Bfr::Surfaces and a Far::PatchTable:
|
||||
//
|
||||
template <typename REAL>
|
||||
int
|
||||
testMesh(Far::TopologyRefiner const & mesh,
|
||||
std::string const & meshName,
|
||||
std::vector< Vec3<REAL> > const & meshPos,
|
||||
std::vector< Vec3<REAL> > const & meshUVs,
|
||||
Args const & args) {
|
||||
|
||||
//
|
||||
// Determine what to evaluate/compare based on args and mesh content
|
||||
// (remember that these are not completely independent -- position
|
||||
// evaluation will have been set if evaluating any derivatives):
|
||||
//
|
||||
bool evalPos = args.posEvaluate;
|
||||
bool evalD1 = args.d1Evaluate;
|
||||
bool evalD2 = args.d2Evaluate;
|
||||
bool evalUV = args.uvEvaluate && (meshUVs.size() > 0);
|
||||
|
||||
bool comparePos = evalPos && !args.posIgnore;
|
||||
bool compareD1 = evalD1 && !args.d1Ignore;
|
||||
bool compareD2 = evalD2 && !args.d2Ignore;
|
||||
bool compareUV = evalUV && !args.uvIgnore;
|
||||
|
||||
// If nothing to compare, return 0 failures:
|
||||
if ((comparePos + compareD1 + compareD2 + compareUV) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Declare/allocate output evaluation buffers for both Bfr and Far:
|
||||
std::vector<REAL> evalCoords;
|
||||
|
||||
EvalResults<REAL> bfrResults;
|
||||
bfrResults.evalPosition = evalPos;
|
||||
bfrResults.eval1stDeriv = evalD1;
|
||||
bfrResults.eval2ndDeriv = evalD2;
|
||||
bfrResults.evalUV = evalUV;
|
||||
bfrResults.useStencils = args.evalByStencils;
|
||||
|
||||
EvalResults<REAL> farResults;
|
||||
farResults.evalPosition = evalPos;
|
||||
farResults.eval1stDeriv = evalD1;
|
||||
farResults.eval2ndDeriv = evalD2;
|
||||
farResults.evalUV = evalUV;
|
||||
|
||||
//
|
||||
// Create evaluators for Bfr and Far -- using the same set of Bfr
|
||||
// options to ensure consistency (the Far evaluator needs to interpret
|
||||
// them appropriate to Far::PatchTable and associated refinement)
|
||||
//
|
||||
Bfr::SurfaceFactory::Options surfaceOptions;
|
||||
|
||||
// Leave approximation defaults in place unless explicitly overridden:
|
||||
if (args.depthSharp >= 0) {
|
||||
surfaceOptions.SetApproxLevelSharp(args.depthSharp);
|
||||
}
|
||||
if (args.depthSmooth >= 0) {
|
||||
surfaceOptions.SetApproxLevelSmooth(args.depthSmooth);
|
||||
}
|
||||
surfaceOptions.SetDefaultFVarID(0);
|
||||
surfaceOptions.EnableCaching(!args.noCacheFlag);
|
||||
|
||||
BfrSurfaceEvaluator<REAL> bfrEval(mesh, meshPos, meshUVs, surfaceOptions);
|
||||
FarPatchEvaluator<REAL> farEval(mesh, meshPos, meshUVs, surfaceOptions);
|
||||
|
||||
//
|
||||
// Initialize tolerances and variables to track differences:
|
||||
//
|
||||
REAL pTol = (args.absTolerance > 0.0f) ? args.absTolerance :
|
||||
GetRelativeTolerance<REAL>(meshPos, args.relTolerance);
|
||||
REAL d1Tol = pTol * 5.0f;
|
||||
REAL d2Tol = d1Tol * 5.0f;
|
||||
REAL uvTol = args.uvTolerance;
|
||||
|
||||
VectorDelta<REAL> pDelta(pTol);
|
||||
VectorDelta<REAL> duDelta(d1Tol);
|
||||
VectorDelta<REAL> dvDelta(d1Tol);
|
||||
VectorDelta<REAL> duuDelta(d2Tol);
|
||||
VectorDelta<REAL> duvDelta(d2Tol);
|
||||
VectorDelta<REAL> dvvDelta(d2Tol);
|
||||
VectorDelta<REAL> uvDelta(uvTol);
|
||||
|
||||
FaceDelta<REAL> faceDelta;
|
||||
|
||||
MeshDelta<REAL> meshDelta;
|
||||
|
||||
bool meshHasBeenLabeled = false;
|
||||
|
||||
int numFaces = mesh.GetNumFacesTotal();
|
||||
for (int faceIndex = 0; faceIndex < numFaces; ++faceIndex) {
|
||||
//
|
||||
// Make sure both match in terms of identifying a limit surface:
|
||||
//
|
||||
assert(bfrEval.FaceHasLimit(faceIndex) ==
|
||||
farEval.FaceHasLimit(faceIndex));
|
||||
|
||||
if (!farEval.FaceHasLimit(faceIndex)) continue;
|
||||
|
||||
//
|
||||
// Declare/define a Tessellation to generate a consistent set of
|
||||
// (u,v) locations to compare and evaluate:
|
||||
//
|
||||
int faceSize = mesh.GetLevel(0).GetFaceVertices(faceIndex).size();
|
||||
|
||||
Bfr::Parameterization faceParam(mesh.GetSchemeType(), faceSize);
|
||||
assert(faceParam.IsValid());
|
||||
|
||||
Bfr::Tessellation faceTess(faceParam, args.uniformRes);
|
||||
assert(faceTess.IsValid());
|
||||
|
||||
evalCoords.resize(2 * faceTess.GetNumCoords());
|
||||
faceTess.GetCoords(&evalCoords[0]);
|
||||
|
||||
//
|
||||
// Before evaluating and comparing, run the test to convert the
|
||||
// parametric coords to Ptex and back:
|
||||
//
|
||||
if (args.ptexConvert) {
|
||||
for (int i = 0; i < faceTess.GetNumCoords(); ++i) {
|
||||
ValidatePtexConversion<REAL>(faceParam, &evalCoords[2*i]);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Evaluate and capture results of comparisons between results:
|
||||
//
|
||||
bfrEval.Evaluate(faceIndex, evalCoords, bfrResults);
|
||||
farEval.Evaluate(faceIndex, evalCoords, farResults);
|
||||
|
||||
if (comparePos) {
|
||||
pDelta.Compare(bfrResults.p, farResults.p);
|
||||
}
|
||||
if (compareD1) {
|
||||
duDelta.Compare(bfrResults.du, farResults.du);
|
||||
dvDelta.Compare(bfrResults.dv, farResults.dv);
|
||||
}
|
||||
if (compareD2) {
|
||||
duuDelta.Compare(bfrResults.duu, farResults.duu);
|
||||
duvDelta.Compare(bfrResults.duv, farResults.duv);
|
||||
dvvDelta.Compare(bfrResults.dvv, farResults.dvv);
|
||||
}
|
||||
if (compareUV) {
|
||||
uvDelta.Compare(bfrResults.uv, farResults.uv);
|
||||
}
|
||||
|
||||
//
|
||||
// Note collective differences for this face and report:
|
||||
//
|
||||
faceDelta.Clear();
|
||||
faceDelta.AddPDelta(pDelta);
|
||||
faceDelta.AddDuDelta(duDelta);
|
||||
faceDelta.AddDvDelta(dvDelta);
|
||||
faceDelta.AddDuuDelta(duuDelta);
|
||||
faceDelta.AddDuvDelta(duvDelta);
|
||||
faceDelta.AddDvvDelta(dvvDelta);
|
||||
faceDelta.AddUVDelta(uvDelta);
|
||||
|
||||
if (args.printFaceDiffs && faceDelta.hasDeltas) {
|
||||
if (!meshHasBeenLabeled) {
|
||||
meshHasBeenLabeled = true;
|
||||
printf("'%s':\n", meshName.c_str());
|
||||
}
|
||||
printf("\t Face %d:\n", faceIndex);
|
||||
|
||||
if (comparePos && faceDelta.numPDeltas) {
|
||||
printf("\t\t POS:%6d diffs, max delta P = %g\n",
|
||||
faceDelta.numPDeltas, (float) faceDelta.maxPDelta);
|
||||
}
|
||||
if (compareD1 && faceDelta.numD1Deltas) {
|
||||
printf("\t\t D1:%6d diffs, max delta D1 = %g\n",
|
||||
faceDelta.numD1Deltas, (float) faceDelta.maxD1Delta);
|
||||
}
|
||||
if (compareD2 && faceDelta.numD2Deltas) {
|
||||
printf("\t\t D2:%6d diffs, max delta D2 = %g\n",
|
||||
faceDelta.numD2Deltas, (float) faceDelta.maxD2Delta);
|
||||
}
|
||||
if (compareUV && faceDelta.hasUVDeltas) {
|
||||
printf("\t\t UV:%6d diffs, max delta UV = %g\n",
|
||||
uvDelta.numDeltas, (float) uvDelta.maxDelta);
|
||||
}
|
||||
}
|
||||
|
||||
// Add the results for this face to the collective mesh delta:
|
||||
meshDelta.AddFace(faceDelta);
|
||||
}
|
||||
|
||||
//
|
||||
// Report the differences for this mesh:
|
||||
//
|
||||
if (meshDelta.numFacesWithDeltas) {
|
||||
if (args.printFaceDiffs) {
|
||||
printf("\t Total:\n");
|
||||
} else {
|
||||
printf("'%s':\n", meshName.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
if (comparePos && meshDelta.numFacesWithPDeltas) {
|
||||
printf("\t\tPOS diffs:%6d faces, max delta P = %g\n",
|
||||
meshDelta.numFacesWithPDeltas, (float) meshDelta.maxPDelta);
|
||||
}
|
||||
if (compareD1 && meshDelta.numFacesWithD1Deltas) {
|
||||
printf("\t\t D1 diffs:%6d faces, max delta D1 = %g\n",
|
||||
meshDelta.numFacesWithD1Deltas, (float) meshDelta.maxD1Delta);
|
||||
}
|
||||
if (compareD2 && meshDelta.numFacesWithD2Deltas) {
|
||||
printf("\t\t D2 diffs:%6d faces, max delta D2 = %g\n",
|
||||
meshDelta.numFacesWithD2Deltas, (float) meshDelta.maxD2Delta);
|
||||
}
|
||||
if (compareUV && meshDelta.numFacesWithUVDeltas) {
|
||||
printf("\t\t UV diffs:%6d faces, max delta UV = %g\n",
|
||||
meshDelta.numFacesWithUVDeltas, (float) meshDelta.maxUVDelta);
|
||||
}
|
||||
return meshDelta.numFacesWithDeltas;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Run the comparison for a given Shape in single or double precision:
|
||||
//
|
||||
template <typename REAL>
|
||||
int
|
||||
testShape(ShapeDesc const & shapeDesc, Args const & args) {
|
||||
|
||||
//
|
||||
// Get the TopologyRefiner, positions and UVs for the Shape, report
|
||||
// failure to generate the shape, and run the test:
|
||||
//
|
||||
std::string const & meshName = shapeDesc.name;
|
||||
|
||||
std::vector< Vec3<REAL> > basePos;
|
||||
std::vector< Vec3<REAL> > baseUV;
|
||||
|
||||
Far::TopologyRefiner * refiner =
|
||||
createTopologyRefiner<REAL>(shapeDesc, basePos, baseUV, args);
|
||||
|
||||
if (refiner == 0) {
|
||||
if (args.printWarnings) {
|
||||
fprintf(stderr,
|
||||
"Warning: Shape '%s' ignored (unable to construct refiner)\n",
|
||||
meshName.c_str());
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int nFailures = testMesh<REAL>(*refiner, meshName, basePos, baseUV, args);
|
||||
|
||||
delete refiner;
|
||||
|
||||
return nFailures;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Run comparison tests on a list of shapes using command line options:
|
||||
//
|
||||
int
|
||||
main(int argc, char **argv) {
|
||||
|
||||
Args args(argc, argv);
|
||||
|
||||
// Capture relevant command line options used here:
|
||||
if (args.printArgs) {
|
||||
args.Print();
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize the list of shapes and test each (or only the first):
|
||||
//
|
||||
// - currently the internal list can be overridden on the command
|
||||
// line (so use of wildcards is possible)
|
||||
//
|
||||
// - still exploring additional command line options, e.g. hoping
|
||||
// to specify a list of shape names from the internal list...
|
||||
//
|
||||
// So a bit more to be done here...
|
||||
//
|
||||
std::vector<ShapeDesc>& shapeList = g_shapes;
|
||||
|
||||
if (!args.shapes.empty()) {
|
||||
shapeList.swap(args.shapes);
|
||||
}
|
||||
if (shapeList.empty()) {
|
||||
if (args.shapesAll) {
|
||||
initShapesAll(shapeList);
|
||||
} else {
|
||||
initShapes(shapeList);
|
||||
}
|
||||
}
|
||||
|
||||
int shapesToTest = (int) shapeList.size();
|
||||
int shapesIgnored = 0;
|
||||
if ((args.shapeCount > 0) && (args.shapeCount < shapesToTest)) {
|
||||
shapesIgnored = shapesToTest - args.shapeCount;
|
||||
shapesToTest = args.shapeCount;
|
||||
}
|
||||
|
||||
if (args.printProgress) {
|
||||
printf("Testing %d shapes", shapesToTest);
|
||||
if (shapesIgnored) {
|
||||
printf(" (%d ignored)", shapesIgnored);
|
||||
}
|
||||
printf(":\n");
|
||||
}
|
||||
|
||||
//
|
||||
// Run the comparison test for each shape (ShapeDesc) in the
|
||||
// specified precision and report results:
|
||||
//
|
||||
int shapesFailed = 0;
|
||||
|
||||
for (int shapeIndex = 0; shapeIndex < shapesToTest; ++shapeIndex) {
|
||||
ShapeDesc & shapeDesc = shapeList[shapeIndex];
|
||||
|
||||
if (args.printProgress) {
|
||||
printf("%4d of %d: '%s'\n", 1 + shapeIndex, shapesToTest,
|
||||
shapeDesc.name.c_str());
|
||||
}
|
||||
|
||||
int nFailures = args.doublePrecision ?
|
||||
testShape<double>(shapeDesc, args) :
|
||||
testShape<float>(shapeDesc, args);
|
||||
|
||||
if (nFailures < 0) {
|
||||
// Possible error/warning...?
|
||||
++ shapesFailed;
|
||||
}
|
||||
if (nFailures > 0) {
|
||||
++ shapesFailed;
|
||||
}
|
||||
}
|
||||
|
||||
if (args.printSummary) {
|
||||
printf("\n");
|
||||
if (shapesFailed == 0) {
|
||||
printf("All tests passed for %d shapes\n", shapesToTest);
|
||||
} else {
|
||||
printf("Total failures: %d of %d shapes\n", shapesFailed,
|
||||
shapesToTest);
|
||||
}
|
||||
}
|
||||
|
||||
return (shapesFailed == args.passCount) ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
313
regression/bfr_evaluate/types.h
Normal file
313
regression/bfr_evaluate/types.h
Normal file
@ -0,0 +1,313 @@
|
||||
//
|
||||
// Copyright 2021 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.
|
||||
//
|
||||
#ifndef OPENSUBDIV3_REGRESSION_BFR_EVALUATE_TYPES_H
|
||||
#define OPENSUBDIV3_REGRESSION_BFR_EVALUATE_TYPES_H
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <cassert>
|
||||
|
||||
//
|
||||
// Simple interpolatable struct for (x,y,z) positions and normals:
|
||||
//
|
||||
template <typename REAL>
|
||||
struct Vec3 {
|
||||
Vec3<REAL>() { }
|
||||
Vec3<REAL>(REAL x, REAL y, REAL z) { p[0] = x, p[1] = y, p[2] = z; }
|
||||
|
||||
// Clear() and AddWithWeight() required for interpolation:
|
||||
void Clear( void * =0 ) { p[0] = p[1] = p[2] = 0.0f; }
|
||||
|
||||
void AddWithWeight(Vec3<REAL> const & src, REAL weight) {
|
||||
p[0] += weight * src.p[0];
|
||||
p[1] += weight * src.p[1];
|
||||
p[2] += weight * src.p[2];
|
||||
}
|
||||
|
||||
// Element access via []:
|
||||
REAL const & operator[](int i) const { return p[i]; }
|
||||
REAL & operator[](int i) { return p[i]; }
|
||||
|
||||
// Element access via []:
|
||||
REAL const * Coords() const { return p; }
|
||||
REAL * Coords() { return p; }
|
||||
|
||||
// Additional useful mathematical operations:
|
||||
Vec3<REAL> operator-(Vec3<REAL> const & x) const {
|
||||
return Vec3<REAL>(p[0] - x.p[0], p[1] - x.p[1], p[2] - x.p[2]);
|
||||
}
|
||||
Vec3<REAL> operator+(Vec3<REAL> const & x) const {
|
||||
return Vec3<REAL>(p[0] + x.p[0], p[1] + x.p[1], p[2] + x.p[2]);
|
||||
}
|
||||
Vec3<REAL> operator*(REAL s) const {
|
||||
return Vec3<REAL>(p[0] * s, p[1] * s, p[2] * s);
|
||||
}
|
||||
Vec3<REAL> Cross(Vec3<REAL> const & x) const {
|
||||
return Vec3<REAL>(p[1]*x.p[2] - p[2]*x.p[1],
|
||||
p[2]*x.p[0] - p[0]*x.p[2],
|
||||
p[0]*x.p[1] - p[1]*x.p[0]);
|
||||
}
|
||||
REAL Dot(Vec3<REAL> const & x) const {
|
||||
return p[0]*x.p[0] + p[1]*x.p[1] + p[2]*x.p[2];
|
||||
}
|
||||
REAL Length() const {
|
||||
return std::sqrt(this->Dot(*this));
|
||||
}
|
||||
|
||||
// Static method to compute normal vector:
|
||||
static
|
||||
Vec3<REAL> ComputeNormal(Vec3<REAL> const & Du, Vec3<REAL> const & Dv,
|
||||
REAL eps = 0.0f) {
|
||||
Vec3<REAL> N = Du.Cross(Dv);
|
||||
REAL lenSqrd = N.Dot(N);
|
||||
if (lenSqrd <= eps) return Vec3<REAL>(0.0f, 0.0f, 0.0f);
|
||||
return N * (1.0f / std::sqrt(lenSqrd));
|
||||
}
|
||||
|
||||
// Member variables (XYZ coordinates):
|
||||
REAL p[3];
|
||||
};
|
||||
|
||||
typedef Vec3<float> Vec3f;
|
||||
typedef Vec3<double> Vec3d;
|
||||
|
||||
|
||||
//
|
||||
// Simple struct to hold the results of a face evaluation:
|
||||
//
|
||||
template <typename REAL>
|
||||
struct EvalResults {
|
||||
EvalResults() : evalPosition(true),
|
||||
eval1stDeriv(true),
|
||||
eval2ndDeriv(false),
|
||||
evalUV(false),
|
||||
useStencils(false) { }
|
||||
|
||||
bool evalPosition;
|
||||
bool eval1stDeriv;
|
||||
bool eval2ndDeriv;
|
||||
bool evalUV;
|
||||
bool useStencils;
|
||||
|
||||
std::vector< Vec3<REAL> > p;
|
||||
std::vector< Vec3<REAL> > du;
|
||||
std::vector< Vec3<REAL> > dv;
|
||||
std::vector< Vec3<REAL> > duu;
|
||||
std::vector< Vec3<REAL> > duv;
|
||||
std::vector< Vec3<REAL> > dvv;
|
||||
|
||||
std::vector< Vec3<REAL> > uv;
|
||||
|
||||
void Resize(int size) {
|
||||
if (evalPosition) {
|
||||
p.resize(size);
|
||||
if (eval1stDeriv) {
|
||||
du.resize(size);
|
||||
dv.resize(size);
|
||||
if (eval2ndDeriv) {
|
||||
duu.resize(size);
|
||||
duv.resize(size);
|
||||
dvv.resize(size);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (evalUV) {
|
||||
uv.resize(size);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Simple struct to hold the differences between two vectors:
|
||||
//
|
||||
template <typename REAL>
|
||||
class VectorDelta {
|
||||
public:
|
||||
typedef std::vector< Vec3<REAL> > VectorVec3;
|
||||
|
||||
public:
|
||||
// Member variables:
|
||||
std::vector< Vec3<REAL> > const * vectorA;
|
||||
std::vector< Vec3<REAL> > const * vectorB;
|
||||
|
||||
int numDeltas;
|
||||
REAL maxDelta;
|
||||
REAL tolerance;
|
||||
|
||||
public:
|
||||
VectorDelta(REAL epsilon = 0.0f) :
|
||||
vectorA(0), vectorB(0),
|
||||
numDeltas(0), maxDelta(0.0f),
|
||||
tolerance(epsilon) { }
|
||||
|
||||
void
|
||||
Compare(VectorVec3 const & a, VectorVec3 const & b) {
|
||||
|
||||
assert(a.size() == b.size());
|
||||
|
||||
vectorA = &a;
|
||||
vectorB = &b;
|
||||
|
||||
numDeltas = 0;
|
||||
maxDelta = 0.0f;
|
||||
|
||||
for (size_t i = 0; i < a.size(); ++i) {
|
||||
REAL const * ai = a[i].Coords();
|
||||
REAL const * bi = b[i].Coords();
|
||||
|
||||
REAL dx = std::abs(ai[0] - bi[0]);
|
||||
REAL dy = std::abs(ai[1] - bi[1]);
|
||||
REAL dz = std::abs(ai[2] - bi[2]);
|
||||
if ((dx > tolerance) || (dy > tolerance) || (dz > tolerance)) {
|
||||
++ numDeltas;
|
||||
|
||||
if (maxDelta < dx) maxDelta = dx;
|
||||
if (maxDelta < dy) maxDelta = dy;
|
||||
if (maxDelta < dz) maxDelta = dz;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename REAL>
|
||||
class FaceDelta {
|
||||
public:
|
||||
// Member variables:
|
||||
bool hasDeltas;
|
||||
bool hasGeomDeltas;
|
||||
bool hasUVDeltas;
|
||||
|
||||
int numPDeltas;
|
||||
int numD1Deltas;
|
||||
int numD2Deltas;
|
||||
int numUVDeltas;
|
||||
|
||||
REAL maxPDelta;
|
||||
REAL maxD1Delta;
|
||||
REAL maxD2Delta;
|
||||
REAL maxUVDelta;
|
||||
|
||||
public:
|
||||
FaceDelta() { Clear(); }
|
||||
|
||||
void Clear() {
|
||||
std::memset(this, 0, sizeof(*this));
|
||||
}
|
||||
|
||||
void AddPDelta(VectorDelta<REAL> const & pDelta) {
|
||||
if (pDelta.numDeltas) {
|
||||
numPDeltas = pDelta.numDeltas;
|
||||
maxPDelta = pDelta.maxDelta;
|
||||
hasDeltas = hasGeomDeltas = true;
|
||||
}
|
||||
}
|
||||
void AddDuDelta(VectorDelta<REAL> const & duDelta) {
|
||||
if (duDelta.numDeltas) {
|
||||
numD1Deltas += duDelta.numDeltas;
|
||||
maxD1Delta = std::max(maxD1Delta, duDelta.maxDelta);
|
||||
hasDeltas = hasGeomDeltas = true;
|
||||
}
|
||||
}
|
||||
void AddDvDelta(VectorDelta<REAL> const & dvDelta) {
|
||||
if (dvDelta.numDeltas) {
|
||||
numD1Deltas += dvDelta.numDeltas;
|
||||
maxD1Delta = std::max(maxD1Delta, dvDelta.maxDelta);
|
||||
hasDeltas = hasGeomDeltas = true;
|
||||
}
|
||||
}
|
||||
void AddDuuDelta(VectorDelta<REAL> const & duuDelta) {
|
||||
if (duuDelta.numDeltas) {
|
||||
numD2Deltas += duuDelta.numDeltas;
|
||||
maxD2Delta = std::max(maxD2Delta, duuDelta.maxDelta);
|
||||
hasDeltas = hasGeomDeltas = true;
|
||||
}
|
||||
}
|
||||
void AddDuvDelta(VectorDelta<REAL> const & duvDelta) {
|
||||
if (duvDelta.numDeltas) {
|
||||
numD2Deltas += duvDelta.numDeltas;
|
||||
maxD2Delta = std::max(maxD2Delta, duvDelta.maxDelta);
|
||||
hasDeltas = hasGeomDeltas = true;
|
||||
}
|
||||
}
|
||||
void AddDvvDelta(VectorDelta<REAL> const & dvvDelta) {
|
||||
if (dvvDelta.numDeltas) {
|
||||
numD2Deltas += dvvDelta.numDeltas;
|
||||
maxD2Delta = std::max(maxD2Delta, dvvDelta.maxDelta);
|
||||
hasDeltas = hasGeomDeltas = true;
|
||||
}
|
||||
}
|
||||
void AddUVDelta(VectorDelta<REAL> const & uvDelta) {
|
||||
if (uvDelta.numDeltas) {
|
||||
numUVDeltas = uvDelta.numDeltas;
|
||||
maxUVDelta = uvDelta.maxDelta;
|
||||
hasDeltas = hasUVDeltas = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename REAL>
|
||||
class MeshDelta {
|
||||
public:
|
||||
// Member variables:
|
||||
int numFacesWithDeltas;
|
||||
int numFacesWithGeomDeltas;
|
||||
int numFacesWithUVDeltas;
|
||||
|
||||
int numFacesWithPDeltas;
|
||||
int numFacesWithD1Deltas;
|
||||
int numFacesWithD2Deltas;
|
||||
|
||||
REAL maxPDelta;
|
||||
REAL maxD1Delta;
|
||||
REAL maxD2Delta;
|
||||
REAL maxUVDelta;
|
||||
|
||||
public:
|
||||
MeshDelta() { Clear(); }
|
||||
|
||||
void Clear() {
|
||||
std::memset(this, 0, sizeof(*this));
|
||||
}
|
||||
|
||||
void AddFace(FaceDelta<REAL> const & faceDelta) {
|
||||
|
||||
numFacesWithDeltas += faceDelta.hasDeltas;
|
||||
numFacesWithGeomDeltas += faceDelta.hasGeomDeltas;
|
||||
numFacesWithUVDeltas += faceDelta.hasUVDeltas;
|
||||
|
||||
numFacesWithPDeltas += (faceDelta.numPDeltas > 0);
|
||||
numFacesWithD1Deltas += (faceDelta.numD1Deltas > 0);
|
||||
numFacesWithD2Deltas += (faceDelta.numD2Deltas > 0);
|
||||
|
||||
maxPDelta = std::max(maxPDelta, faceDelta.maxPDelta);
|
||||
maxD1Delta = std::max(maxD1Delta, faceDelta.maxD1Delta);
|
||||
maxD2Delta = std::max(maxD2Delta, faceDelta.maxD2Delta);
|
||||
maxUVDelta = std::max(maxUVDelta, faceDelta.maxUVDelta);
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* OPENSUBDIV3_REGRESSION_BFR_EVALUATE_TYPES_H */
|
@ -106,6 +106,9 @@
|
||||
#include "catmark_torus_creases0.h"
|
||||
#include "catmark_torus_creases1.h"
|
||||
#include "catmark_val2_interior.h"
|
||||
#include "catmark_val2_back2back.h"
|
||||
#include "catmark_val2_foldover.h"
|
||||
#include "catmark_val2_nonman.h"
|
||||
#include "catmark_xord_interior.h"
|
||||
#include "catmark_xord_boundary.h"
|
||||
|
||||
@ -144,5 +147,6 @@
|
||||
#include "loop_triangle_edgeonly.h"
|
||||
#include "loop_xord_boundary.h"
|
||||
#include "loop_xord_interior.h"
|
||||
#include "loop_val2_interior.h"
|
||||
|
||||
#endif // OPENSUBDIV_REGRESSION_SHAPES_ALL_H
|
||||
|
98
regression/shapes/catmark_val2_back2back.h
Normal file
98
regression/shapes/catmark_val2_back2back.h
Normal file
@ -0,0 +1,98 @@
|
||||
//
|
||||
// Copyright 2022 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.
|
||||
//
|
||||
|
||||
static const std::string catmark_val2_back2back =
|
||||
"#\n"
|
||||
"# Four shapes ordered left->right and top->bottom in the XZ plane\n"
|
||||
"#\n"
|
||||
"# Shape 1: top-left\n"
|
||||
"#\n"
|
||||
"v -0.90 0 0.10\n"
|
||||
"v -0.10 0 0.10\n"
|
||||
"v -0.50 0 0.90\n"
|
||||
"\n"
|
||||
"vt -0.90 0.10\n"
|
||||
"vt -0.10 0.10\n"
|
||||
"vt -0.50 0.90\n"
|
||||
"\n"
|
||||
"f 1/1 2/2 3/3\n"
|
||||
"f 3/3 2/2 1/1\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 2: top-right\n"
|
||||
"#\n"
|
||||
"v 0.10 0 0.10\n"
|
||||
"v 0.90 0 0.10\n"
|
||||
"v 0.90 0 0.90\n"
|
||||
"v 0.10 0 0.90\n"
|
||||
"\n"
|
||||
"vt 0.10 0.10\n"
|
||||
"vt 0.90 0.10\n"
|
||||
"vt 0.90 0.90\n"
|
||||
"vt 0.10 0.90\n"
|
||||
"\n"
|
||||
"f 4/4 5/5 6/6 7/7\n"
|
||||
"f 7/7 6/6 5/5 4/4\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 3: bottom-left\n"
|
||||
"#\n"
|
||||
"v -0.70 0 -0.90\n"
|
||||
"v -0.30 0 -0.90\n"
|
||||
"v -0.10 0 -0.50\n"
|
||||
"v -0.50 0 -0.10\n"
|
||||
"v -0.90 0 -0.50\n"
|
||||
"\n"
|
||||
"vt -0.70 -0.90\n"
|
||||
"vt -0.30 -0.90\n"
|
||||
"vt -0.10 -0.50\n"
|
||||
"vt -0.50 -0.10\n"
|
||||
"vt -0.90 -0.50\n"
|
||||
"\n"
|
||||
"f 8/8 9/9 10/10 11/11 12/12\n"
|
||||
"f 12/12 11/11 10/10 9/9 8/8\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 4: bottom-right\n"
|
||||
"#\n"
|
||||
"v 0.30 0 -0.90\n"
|
||||
"v 0.70 0 -0.90\n"
|
||||
"v 0.90 0 -0.50\n"
|
||||
"v 0.70 0 -0.10\n"
|
||||
"v 0.30 0 -0.10\n"
|
||||
"v 0.10 0 -0.50\n"
|
||||
"\n"
|
||||
"vt 0.30 -0.90\n"
|
||||
"vt 0.70 -0.90\n"
|
||||
"vt 0.90 -0.50\n"
|
||||
"vt 0.70 -0.10\n"
|
||||
"vt 0.30 -0.10\n"
|
||||
"vt 0.10 -0.50\n"
|
||||
"\n"
|
||||
"f 13/13 14/14 15/15 16/16 17/17 18/18\n"
|
||||
"f 18/18 17/17 16/16 15/15 14/14 13/13\n"
|
||||
"\n"
|
||||
"t interpolateboundary 1/0/0 1\n"
|
||||
"\n"
|
||||
;
|
207
regression/shapes/catmark_val2_foldover.h
Normal file
207
regression/shapes/catmark_val2_foldover.h
Normal file
@ -0,0 +1,207 @@
|
||||
//
|
||||
// Copyright 2022 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.
|
||||
//
|
||||
|
||||
static const std::string catmark_val2_foldover =
|
||||
"#\n"
|
||||
"# Nine shapes ordered left->right and top->bottom in the XZ plane\n"
|
||||
"#\n"
|
||||
"# Shape 1: top-left\n"
|
||||
"#\n"
|
||||
"v -1.4 0.0 0.6\n"
|
||||
"v -0.6 0.0 0.6\n"
|
||||
"v -0.6 0.0 1.4\n"
|
||||
"v -1.4 0.0 1.4\n"
|
||||
"\n"
|
||||
"vt -1.4 0.6\n"
|
||||
"vt -0.6 0.6\n"
|
||||
"vt -0.6 1.4\n"
|
||||
"vt -1.4 1.4\n"
|
||||
"\n"
|
||||
"f 1/1 2/2 3/3 4/4\n"
|
||||
"f 1/1 4/4 3/3\n"
|
||||
"f 1/1 3/3 2/2\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 2: top-middle\n"
|
||||
"#\n"
|
||||
"v -0.4 0.0 0.6\n"
|
||||
"v 0.4 0.0 0.6\n"
|
||||
"v 0.4 0.0 1.4\n"
|
||||
"v -0.4 0.0 1.4\n"
|
||||
"\n"
|
||||
"vt -0.4 0.6\n"
|
||||
"vt 0.4 0.6\n"
|
||||
"vt 0.4 1.4\n"
|
||||
"vt -0.4 1.4\n"
|
||||
"\n"
|
||||
"f 5/5 6/6 7/7 8/8\n"
|
||||
"f 5/5 8/8 7/7\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 3: top-right\n"
|
||||
"#\n"
|
||||
"v 0.8 0.0 0.6\n"
|
||||
"v 1.2 0.0 0.6\n"
|
||||
"v 1.4 0.0 1.0\n"
|
||||
"v 1.0 0.0 1.4\n"
|
||||
"v 0.6 0.0 1.0\n"
|
||||
"\n"
|
||||
"vt 0.8 0.6\n"
|
||||
"vt 1.2 0.6\n"
|
||||
"vt 1.4 1.0\n"
|
||||
"vt 1.0 1.4\n"
|
||||
"vt 0.6 1.0\n"
|
||||
"\n"
|
||||
"f 9/9 10/10 11/11 12/12 13/13\n"
|
||||
"f 12/12 11/11 10/10 9/9 \n"
|
||||
"f 12/12 9/9 13/13\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 4: center-left\n"
|
||||
"#\n"
|
||||
"v -1.2 0.0 -0.4\n"
|
||||
"v -0.8 0.0 -0.4\n"
|
||||
"v -0.6 0.0 0.0\n"
|
||||
"v -1.0 0.0 0.4\n"
|
||||
"v -1.4 0.0 0.0\n"
|
||||
"\n"
|
||||
"vt -1.2 -0.4\n"
|
||||
"vt -0.8 -0.4\n"
|
||||
"vt -0.6 0.0\n"
|
||||
"vt -1.0 0.4\n"
|
||||
"vt -1.4 0.0\n"
|
||||
"\n"
|
||||
"f 14/14 15/15 16/16 17/17 18/18\n"
|
||||
"f 17/17 16/16 15/15\n"
|
||||
"f 17/17 15/15 14/14\n"
|
||||
"f 17/17 14/14 18/18\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 5: center-middle\n"
|
||||
"#\n"
|
||||
"v -0.2 0.0 -0.4\n"
|
||||
"v 0.2 0.0 -0.4\n"
|
||||
"v 0.4 0.0 0.0\n"
|
||||
"v 0.0 0.0 0.4\n"
|
||||
"v -0.4 0.0 0.0\n"
|
||||
"\n"
|
||||
"vt -0.2 -0.4\n"
|
||||
"vt 0.2 -0.4\n"
|
||||
"vt 0.4 0.0\n"
|
||||
"vt 0.0 0.4\n"
|
||||
"vt -0.4 0.0\n"
|
||||
"\n"
|
||||
"f 19/19 20/20 21/21 22/22 23/23\n"
|
||||
"f 22/22 19/19 23/23\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 6: center-right\n"
|
||||
"#\n"
|
||||
"v 0.8 0.0 -0.4\n"
|
||||
"v 1.2 0.0 -0.4\n"
|
||||
"v 1.4 0.0 0.0\n"
|
||||
"v 1.2 0.0 0.4\n"
|
||||
"v 0.8 0.0 0.4\n"
|
||||
"v 0.6 0.0 0.0\n"
|
||||
"\n"
|
||||
"vt 0.8 -0.4\n"
|
||||
"vt 1.2 -0.4\n"
|
||||
"vt 1.4 0.0\n"
|
||||
"vt 1.2 0.4\n"
|
||||
"vt 0.8 0.4\n"
|
||||
"vt 0.6 0.0\n"
|
||||
"\n"
|
||||
"f 24/24 25/25 26/26 27/27 28/28 29/29\n"
|
||||
"f 29/29 28/28 27/27 26/26\n"
|
||||
"f 29/29 26/26 25/25 24/24\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 7: bottom-left\n"
|
||||
"#\n"
|
||||
"v -1.2 0.0 -1.4\n"
|
||||
"v -0.8 0.0 -1.4\n"
|
||||
"v -0.6 0.0 -1.0\n"
|
||||
"v -0.8 0.0 -0.6\n"
|
||||
"v -1.2 0.0 -0.6\n"
|
||||
"v -1.4 0.0 -1.0\n"
|
||||
"\n"
|
||||
"vt -1.2 -1.4\n"
|
||||
"vt -0.8 -1.4\n"
|
||||
"vt -0.6 -1.0\n"
|
||||
"vt -0.8 -0.6\n"
|
||||
"vt -1.2 -0.6\n"
|
||||
"vt -1.4 -1.0\n"
|
||||
"\n"
|
||||
"f 30/30 31/31 32/32 33/33 34/34 35/35\n"
|
||||
"f 35/35 34/34 33/33\n"
|
||||
"f 35/35 33/33 32/32\n"
|
||||
"f 35/35 32/32 31/31\n"
|
||||
"f 35/35 31/31 30/30\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 8: bottom-middle\n"
|
||||
"#\n"
|
||||
"v -0.2 0.0 -1.4\n"
|
||||
"v 0.2 0.0 -1.4\n"
|
||||
"v 0.4 0.0 -1.0\n"
|
||||
"v 0.2 0.0 -0.6\n"
|
||||
"v -0.2 0.0 -0.6\n"
|
||||
"v -0.4 0.0 -1.0\n"
|
||||
"\n"
|
||||
"vt -0.2 -1.4\n"
|
||||
"vt 0.2 -1.4\n"
|
||||
"vt 0.4 -1.0\n"
|
||||
"vt 0.2 -0.6\n"
|
||||
"vt -0.2 -0.6\n"
|
||||
"vt -0.4 -1.0\n"
|
||||
"\n"
|
||||
"f 36/36 37/37 38/38 39/39 40/40 41/41\n"
|
||||
"f 41/41 40/40 39/39\n"
|
||||
"f 41/41 37/37 36/36\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 9: bottom-right\n"
|
||||
"#\n"
|
||||
"v 0.8 0.0 -1.4\n"
|
||||
"v 1.2 0.0 -1.4\n"
|
||||
"v 1.4 0.0 -1.0\n"
|
||||
"v 1.2 0.0 -0.6\n"
|
||||
"v 0.8 0.0 -0.6\n"
|
||||
"v 0.6 0.0 -1.0\n"
|
||||
"\n"
|
||||
"vt 0.8 -1.4\n"
|
||||
"vt 1.2 -1.4\n"
|
||||
"vt 1.4 -1.0\n"
|
||||
"vt 1.2 -0.6\n"
|
||||
"vt 0.8 -0.6\n"
|
||||
"vt 0.6 -1.0\n"
|
||||
"\n"
|
||||
"f 42/42 43/43 44/44 45/45 46/46 47/47\n"
|
||||
"f 47/47 46/46 45/45\n"
|
||||
"f 47/47 45/45 44/44 43/43\n"
|
||||
"f 47/47 43/43 42/42\n"
|
||||
"\n"
|
||||
"t interpolateboundary 1/0/0 1\n"
|
||||
"\n"
|
||||
;
|
@ -46,23 +46,23 @@ static const std::string catmark_val2_interior =
|
||||
"v -1.42 0.0 1.42\n"
|
||||
"v -1.25 -0.5 1.25\n"
|
||||
"\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt -0.17 -0.5\n"
|
||||
"vt 0.17 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt 0.5 -0.17\n"
|
||||
"vt 0.5 0.17\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"vt 0.17 0.5\n"
|
||||
"vt -0.17 0.5\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt -0.5 0.17\n"
|
||||
"vt -0.5 -0.17\n"
|
||||
"vt -0.17 -0.17\n"
|
||||
"vt 0.17 -0.17\n"
|
||||
"vt 0.17 0.17\n"
|
||||
"vt -0.17 0.17\n"
|
||||
"vt 0.0 0.0 \n"
|
||||
"vt -1.75 0.75\n"
|
||||
"vt -1.42 0.75\n"
|
||||
"vt -1.08 0.75\n"
|
||||
"vt -0.75 0.75\n"
|
||||
"vt -0.75 1.08\n"
|
||||
"vt -0.75 1.42\n"
|
||||
"vt -0.75 1.75\n"
|
||||
"vt -1.08 1.75\n"
|
||||
"vt -1.42 1.75\n"
|
||||
"vt -1.75 1.75\n"
|
||||
"vt -1.75 1.42\n"
|
||||
"vt -1.75 1.08\n"
|
||||
"vt -1.42 1.08\n"
|
||||
"vt -1.08 1.08\n"
|
||||
"vt -1.08 1.42\n"
|
||||
"vt -1.42 1.42\n"
|
||||
"vt -1.25 1.25\n"
|
||||
"\n"
|
||||
"f 1/1 2/2 13/13 12/12\n"
|
||||
"f 2/2 3/3 14/14 13/13\n"
|
||||
@ -92,19 +92,19 @@ static const std::string catmark_val2_interior =
|
||||
"v 0.5 0.0 0.75\n"
|
||||
"v 0.5 0.0 1.0\n"
|
||||
"\n"
|
||||
"vt 0 0\n"
|
||||
"vt 0.25 0.25\n"
|
||||
"vt -0.25 0.25\n"
|
||||
"vt -0.25 -0.25\n"
|
||||
"vt 0.25 -0.25\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"vt -0.25 0.5\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt -0.5 0.25\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt 0.25 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt 0.5 -0.25\n"
|
||||
"vt 0.0 1.25\n"
|
||||
"vt 0.25 1.5\n"
|
||||
"vt -0.25 1.5\n"
|
||||
"vt -0.25 1.0\n"
|
||||
"vt 0.25 1.0\n"
|
||||
"vt 0.5 1.75\n"
|
||||
"vt -0.25 1.75\n"
|
||||
"vt -0.5 1.75\n"
|
||||
"vt -0.5 1.5\n"
|
||||
"vt -0.5 0.75\n"
|
||||
"vt 0.25 0.75\n"
|
||||
"vt 0.5 0.75\n"
|
||||
"vt 0.5 1.0\n"
|
||||
"\n"
|
||||
"f 18/18 19/19 20/20 21/21\n"
|
||||
"f 18/18 21/21 22/22 19/19\n"
|
||||
@ -132,19 +132,19 @@ static const std::string catmark_val2_interior =
|
||||
"v 1.75 0.0 0.75\n"
|
||||
"v 1.75 0.0 1.0 \n"
|
||||
"\n"
|
||||
"vt 0 0\n"
|
||||
"vt 0.25 0.25\n"
|
||||
"vt -0.25 0.25\n"
|
||||
"vt -0.25 -0.25\n"
|
||||
"vt 0.25 -0.25\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"vt -0.25 0.5\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt -0.5 0.25\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt 0.25 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt 0.5 -0.25\n"
|
||||
"vt 1.25 1.25\n"
|
||||
"vt 1.50 1.5 \n"
|
||||
"vt 1.0 1.5 \n"
|
||||
"vt 1.0 1.0 \n"
|
||||
"vt 1.5 1.0 \n"
|
||||
"vt 1.75 1.75\n"
|
||||
"vt 1.0 1.75\n"
|
||||
"vt 0.75 1.75\n"
|
||||
"vt 0.75 1.5 \n"
|
||||
"vt 0.75 0.75\n"
|
||||
"vt 1.5 0.75\n"
|
||||
"vt 1.75 0.75\n"
|
||||
"vt 1.75 1.0 \n"
|
||||
"\n"
|
||||
"f 31/31 32/32 33/33 34/34\n"
|
||||
"f 31/31 34/34 35/35 32/32\n"
|
||||
@ -164,74 +164,112 @@ static const std::string catmark_val2_interior =
|
||||
"# Shape 4: center-left\n"
|
||||
"#\n"
|
||||
"v -1.75 0.0 -0.5\n"
|
||||
"v -1.42 0.0 -0.5\n"
|
||||
"v -1.08 0.0 -0.5\n"
|
||||
"v -0.75 0.0 -0.5\n"
|
||||
"v -1.75 0.0 -0.17\n"
|
||||
"v -1.42 -0.5 -0.17\n"
|
||||
"v -1.08 -0.5 -0.17\n"
|
||||
"v -0.75 0.0 -0.17\n"
|
||||
"v -1.75 0.0 0.17\n"
|
||||
"v -1.08 0.0 0.17\n"
|
||||
"v -1.42 -0.5 0.17\n"
|
||||
"v -1.08 -0.5 0.17\n"
|
||||
"v -0.75 0.0 0.17\n"
|
||||
"v -1.75 0.0 0.5\n"
|
||||
"v -1.42 0.0 0.5\n"
|
||||
"v -1.08 0.0 0.5\n"
|
||||
"v -0.75 0.0 0.5\n"
|
||||
"v -1.31 -0.5 -0.06\n"
|
||||
"v -1.19 -0.5 0.06\n"
|
||||
"\n"
|
||||
"vt -1.75 -0.5\n"
|
||||
"vt -1.42 -0.5\n"
|
||||
"vt -1.08 -0.5\n"
|
||||
"vt -0.75 -0.5\n"
|
||||
"vt -1.75 -0.17\n"
|
||||
"vt -1.42 -0.17\n"
|
||||
"vt -1.08 -0.17\n"
|
||||
"vt -0.75 -0.17\n"
|
||||
"vt -1.75 0.17\n"
|
||||
"vt -1.42 0.17\n"
|
||||
"vt -1.08 0.17\n"
|
||||
"vt -0.75 0.17\n"
|
||||
"vt -1.75 0.5\n"
|
||||
"vt -1.42 0.5\n"
|
||||
"vt -1.08 0.5\n"
|
||||
"vt -0.75 0.5\n"
|
||||
"vt -1.31 -0.06\n"
|
||||
"vt -1.19 0.06\n"
|
||||
"\n"
|
||||
"f 44/44 45/45 49/49 47/47\n"
|
||||
"f 45/45 46/46 51/51 49/49\n"
|
||||
"f 44/44 47/47 49/49 48/48\n"
|
||||
"f 48/48 49/49 51/51 50/50\n"
|
||||
"f 44/44 45/45 49/49 48/48\n"
|
||||
"f 45/45 46/46 50/50 49/49\n"
|
||||
"f 46/46 47/47 51/51 50/50\n"
|
||||
"f 48/48 49/49 53/53 52/52\n"
|
||||
"f 50/50 60/60 53/53 49/49\n"
|
||||
"f 50/50 54/54 53/53 61/61\n"
|
||||
"f 50/50 61/61 53/53 60/60\n"
|
||||
"f 50/50 51/51 55/55 54/54\n"
|
||||
"f 52/52 53/53 57/57 56/56\n"
|
||||
"f 53/53 54/54 58/58 57/57\n"
|
||||
"f 54/54 55/55 59/59 58/58\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 5: center-middle\n"
|
||||
"#\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"
|
||||
"v -0.5 0.0 0.0\n"
|
||||
"v 0.0 0.0 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"
|
||||
"v -0.1 0.1 -0.1\n"
|
||||
"v -0.5 0.0 -0.5\n"
|
||||
"v 0.17 0.0 -0.5\n"
|
||||
"v 0.5 0.0 -0.5\n"
|
||||
"v -0.17 -0.5 -0.17\n"
|
||||
"v -0.5 0.0 0.17\n"
|
||||
"v 0.17 0.0 0.17\n"
|
||||
"v -0.5 0.0 0.5\n"
|
||||
"v 0.5 0.0 0.5\n"
|
||||
"\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt 0.0 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt -0.5 0.0\n"
|
||||
"vt 0.0 0.0\n"
|
||||
"vt 0.5 0.0\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt 0.0 0.5\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"vt -0.1 -0.1\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt 0.17 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt -0.17 -0.17\n"
|
||||
"vt -0.5 0.17\n"
|
||||
"vt 0.17 0.17\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"\n"
|
||||
"f 52/52 53/53 56/56 55/55\n"
|
||||
"f 53/53 54/54 57/57 56/56\n"
|
||||
"f 55/55 56/56 59/59 58/58\n"
|
||||
"f 56/56 57/57 60/60 59/59\n"
|
||||
"f 53/53 52/52 55/55 61/61\n"
|
||||
"f 62/62 63/63 67/67 65/65\n"
|
||||
"f 63/63 64/64 69/69 67/67\n"
|
||||
"f 62/62 65/65 67/67 66/66\n"
|
||||
"f 66/66 67/67 69/69 68/68\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 6: center-right\n"
|
||||
"#\n"
|
||||
"# - starts at vertex 52\n"
|
||||
"v 0.75 0.0 -0.5\n"
|
||||
"v 1.25 0.0 -0.5\n"
|
||||
"v 1.75 0.0 -0.5\n"
|
||||
"v 1.75 0.0 0.5\n"
|
||||
"v 0.75 0.0 0.0\n"
|
||||
"v 1.25 0.0 0.0\n"
|
||||
"v 1.75 0.0 0.0\n"
|
||||
"v 0.75 0.0 0.5\n"
|
||||
"v 1.25 0.0 0.5\n"
|
||||
"v 1.75 0.0 0.5\n"
|
||||
"v 0.75 -0.5 -0.5\n"
|
||||
"\n"
|
||||
"vt 0.75 -0.5\n"
|
||||
"vt 1.75 -0.5\n"
|
||||
"vt 1.75 0.5\n"
|
||||
"vt 0.75 0.5\n"
|
||||
"vt 0.75 -0.5\n"
|
||||
"vt 1.25 -0.5\n"
|
||||
"vt 1.75 -0.5\n"
|
||||
"vt 0.75 0.0\n"
|
||||
"vt 1.25 0.0\n"
|
||||
"vt 1.75 0.0\n"
|
||||
"vt 0.75 0.5\n"
|
||||
"vt 1.25 0.5\n"
|
||||
"vt 1.75 0.5\n"
|
||||
"vt 0.75 -0.5\n"
|
||||
"\n"
|
||||
"f 62/62 63/63 64/64 65/65\n"
|
||||
"f 62/62 65/65 64/64 63/63\n"
|
||||
"f 70/70 71/71 74/74 73/73\n"
|
||||
"f 71/71 72/72 75/75 74/74\n"
|
||||
"f 73/73 74/74 77/77 76/76\n"
|
||||
"f 74/74 75/75 78/78 77/77\n"
|
||||
"f 71/71 70/70 73/73 79/79\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 7: bottom-left\n"
|
||||
@ -244,16 +282,16 @@ static const std::string catmark_val2_interior =
|
||||
"v -1.25 0.0 -0.75\n"
|
||||
"v -0.75 0.0 -0.75\n"
|
||||
"\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt 0.0 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt 0.0 0.0\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt 0.0 0.5\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"vt -1.75 -1.75\n"
|
||||
"vt -1.25 -1.75\n"
|
||||
"vt -0.75 -1.75\n"
|
||||
"vt -1.25 -1.25\n"
|
||||
"vt -1.75 -0.75\n"
|
||||
"vt -1.25 -0.75\n"
|
||||
"vt -0.75 -0.75\n"
|
||||
"\n"
|
||||
"f 66/66 67/67 69/69 71/71 70/70\n"
|
||||
"f 67/67 68/68 72/72 71/71 69/69\n"
|
||||
"f 80/80 81/81 83/83 85/85 84/84\n"
|
||||
"f 81/81 82/82 86/86 85/85 83/83\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 8: bottom-middle\n"
|
||||
@ -267,17 +305,17 @@ static const std::string catmark_val2_interior =
|
||||
"v 0.0 -0.5 -0.75\n"
|
||||
"v 0.5 0.0 -0.75\n"
|
||||
"\n"
|
||||
"vt -0.5 -0.5\n"
|
||||
"vt 0.0 -0.5\n"
|
||||
"vt 0.0 -0.5\n"
|
||||
"vt 0.5 -0.5\n"
|
||||
"vt -0.5 0.5\n"
|
||||
"vt 0.0 0.5\n"
|
||||
"vt 0.0 0.5\n"
|
||||
"vt 0.5 0.5\n"
|
||||
"vt -0.5 -1.75\n"
|
||||
"vt 0.0 -1.75\n"
|
||||
"vt 0.0 -1.75\n"
|
||||
"vt 0.5 -1.75\n"
|
||||
"vt -0.5 -0.75\n"
|
||||
"vt 0.0 -0.75\n"
|
||||
"vt 0.0 -0.75\n"
|
||||
"vt 0.5 -0.75\n"
|
||||
"\n"
|
||||
"f 73/73 74/74 75/75 79/79 78/78 77/77\n"
|
||||
"f 80/80 78/78 79/79 75/75 74/74 76/76\n"
|
||||
"f 87/87 88/88 89/89 93/93 92/92 91/91\n"
|
||||
"f 94/94 92/92 93/93 89/89 88/88 90/90\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 9: bottom-right\n"
|
||||
@ -292,30 +330,32 @@ static const std::string catmark_val2_interior =
|
||||
"v 1.75 0.5 -0.75\n"
|
||||
"v 0.75 0.5 -0.75\n"
|
||||
"\n"
|
||||
"vt 0.375 0.000\n"
|
||||
"vt 0.500 0.000\n"
|
||||
"vt 0.625 0.000\n"
|
||||
"vt 0.375 0.250\n"
|
||||
"vt 0.625 0.250\n"
|
||||
"vt 0.375 0.500\n"
|
||||
"vt 0.625 0.500\n"
|
||||
"vt 0.375 0.750\n"
|
||||
"vt 0.500 0.750\n"
|
||||
"vt 0.625 0.750\n"
|
||||
"vt 0.375 1.000\n"
|
||||
"vt 0.500 1.000\n"
|
||||
"vt 0.625 1.000\n"
|
||||
"vt 0.875 0.000\n"
|
||||
"vt 0.875 0.250\n"
|
||||
"vt 0.125 0.000\n"
|
||||
"vt 0.125 0.250\n"
|
||||
"vt 1.15 -1.65\n"
|
||||
"vt 1.35 -1.65\n"
|
||||
"vt 1.15 -1.45\n"
|
||||
"vt 1.35 -1.45\n"
|
||||
"vt 1.05 -1.25\n"
|
||||
"vt 1.25 -1.25\n"
|
||||
"vt 1.45 -1.25\n"
|
||||
"vt 1.15 -1.05\n"
|
||||
"vt 1.35 -1.05\n"
|
||||
"vt 1.15 -0.85\n"
|
||||
"vt 1.35 -0.85\n"
|
||||
"vt 1.00 -1.15\n"
|
||||
"vt 0.80 -1.15\n"
|
||||
"vt 0.80 -1.35\n"
|
||||
"vt 1.00 -1.35\n"
|
||||
"vt 1.70 -1.15\n"
|
||||
"vt 1.50 -1.15\n"
|
||||
"vt 1.50 -1.35\n"
|
||||
"vt 1.70 -1.35\n"
|
||||
"\n"
|
||||
"f 84/84 81/81 82/82 83/83 85/85\n"
|
||||
"f 86/86 84/84 85/85 87/87\n"
|
||||
"f 88/88 86/86 87/87 89/89\n"
|
||||
"f 82/92 81/91 88/88 89/89 83/93\n"
|
||||
"f 83/83 89/94 87/95 85/85\n"
|
||||
"f 88/96 81/81 84/84 86/97\n"
|
||||
"f 98/98 95/101 96/100 97/99 99/97\n"
|
||||
"f 100/96 98/98 99/97 101/95\n"
|
||||
"f 102/103 100/105 101/104 103/102\n"
|
||||
"f 95/101 102/103 103/102 97/99 96/100\n"
|
||||
"f 97/106 103/107 101/108 99/109\n"
|
||||
"f 102/110 95/111 98/112 100/113\n"
|
||||
"\n"
|
||||
"t interpolateboundary 1/0/0 1\n"
|
||||
"\n"
|
||||
|
125
regression/shapes/catmark_val2_nonman.h
Normal file
125
regression/shapes/catmark_val2_nonman.h
Normal file
@ -0,0 +1,125 @@
|
||||
//
|
||||
// Copyright 2022 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.
|
||||
//
|
||||
|
||||
static const std::string catmark_val2_nonman =
|
||||
"#\n"
|
||||
"# Four shapes ordered left->right and top->bottom in the XZ plane\n"
|
||||
"#\n"
|
||||
"# Shape 1: top-left\n"
|
||||
"#\n"
|
||||
"v -0.70 0 0.30\n"
|
||||
"v -0.30 0 0.30\n"
|
||||
"v -0.30 0 0.70\n"
|
||||
"v -0.70 0 0.70\n"
|
||||
"v -0.70 0.2 0.10\n"
|
||||
"v -0.30 0.2 0.10\n"
|
||||
"v -0.70 -0.2 0.10\n"
|
||||
"v -0.30 -0.2 0.10\n"
|
||||
"\n"
|
||||
"vt -0.70 0.30\n"
|
||||
"vt -0.30 0.30\n"
|
||||
"vt -0.30 0.70\n"
|
||||
"vt -0.70 0.70\n"
|
||||
"vt -0.70 0.10\n"
|
||||
"vt -0.30 0.10\n"
|
||||
"vt -0.70 0.10\n"
|
||||
"vt -0.30 0.10\n"
|
||||
"\n"
|
||||
"f 1/1 2/2 3/3 4/4\n"
|
||||
"f 4/4 3/3 2/2 1/1\n"
|
||||
"f 1/1 2/2 6/6 5/5\n"
|
||||
"f 2/2 1/1 7/7 8/8\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 2: top-right\n"
|
||||
"#\n"
|
||||
"v 0.30 0 0.30\n"
|
||||
"v 0.70 0 0.30\n"
|
||||
"v 0.50 0 0.70\n"
|
||||
"v 0.50 0 0.70\n"
|
||||
"v 0.30 0.2 0.10\n"
|
||||
"v 0.70 0.2 0.10\n"
|
||||
"v 0.30 -0.2 0.10\n"
|
||||
"v 0.70 -0.2 0.10\n"
|
||||
"\n"
|
||||
"vt 0.30 0.30\n"
|
||||
"vt 0.70 0.30\n"
|
||||
"vt 0.50 0.70\n"
|
||||
"vt 0.50 0.70\n"
|
||||
"vt 0.30 0.10\n"
|
||||
"vt 0.70 0.10\n"
|
||||
"vt 0.30 0.10\n"
|
||||
"vt 0.70 0.10\n"
|
||||
"\n"
|
||||
"f 9/9 10/10 11/11\n"
|
||||
"f 11/11 10/10 9/9\n"
|
||||
"f 9/9 10/10 14/14 13/13\n"
|
||||
"f 10/10 9/9 15/15 16/16\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 3: bottom-left\n"
|
||||
"#\n"
|
||||
"v -0.70 0 -0.70\n"
|
||||
"v -0.30 0 -0.70\n"
|
||||
"v -0.30 0 -0.30\n"
|
||||
"v -0.70 0 -0.30\n"
|
||||
"v -0.70 -0.2 -0.90\n"
|
||||
"v -0.30 -0.2 -0.90\n"
|
||||
"\n"
|
||||
"vt -0.70 -0.70\n"
|
||||
"vt -0.30 -0.70\n"
|
||||
"vt -0.30 -0.30\n"
|
||||
"vt -0.70 -0.30\n"
|
||||
"vt -0.70 -0.90\n"
|
||||
"vt -0.30 -0.90\n"
|
||||
"\n"
|
||||
"f 17/17 18/18 19/19 20/20\n"
|
||||
"f 20/20 19/19 18/18 17/17\n"
|
||||
"f 21/21 22/22 17/17\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 4: bottom-right\n"
|
||||
"#\n"
|
||||
"v 0.30 0 -0.70\n"
|
||||
"v 0.70 0 -0.70\n"
|
||||
"v 0.70 0 -0.30\n"
|
||||
"v 0.30 0 -0.30\n"
|
||||
"v 0.30 -0.2 -0.90\n"
|
||||
"v 0.70 -0.2 -0.90\n"
|
||||
"\n"
|
||||
"vt 0.30 -0.70\n"
|
||||
"vt 0.70 -0.70\n"
|
||||
"vt 0.70 -0.30\n"
|
||||
"vt 0.30 -0.30\n"
|
||||
"vt 0.30 -0.90\n"
|
||||
"vt 0.70 -0.90\n"
|
||||
"\n"
|
||||
"f 23/23 24/24 25/25 26/26\n"
|
||||
"f 26/26 25/25 24/24 23/23\n"
|
||||
"f 27/27 28/28 23/23\n"
|
||||
"f 27/27 28/28 24/24\n"
|
||||
"\n"
|
||||
"t interpolateboundary 1/0/0 1\n"
|
||||
"\n"
|
||||
;
|
98
regression/shapes/loop_val2_interior.h
Normal file
98
regression/shapes/loop_val2_interior.h
Normal file
@ -0,0 +1,98 @@
|
||||
//
|
||||
// Copyright 2022 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.
|
||||
//
|
||||
|
||||
static const std::string loop_val2_interior =
|
||||
"#\n"
|
||||
"# Shape 1:\n"
|
||||
"#\n"
|
||||
"v -1.75 0.0 0.0\n"
|
||||
"v -0.75 0.0 0.0\n"
|
||||
"v -1.25 0.0 0.866\n"
|
||||
"v -1.75 -0.75 0.866\n"
|
||||
"v -0.75 -0.75 0.866\n"
|
||||
"v -1.75 0.75 0.866\n"
|
||||
"v -0.75 0.75 0.866\n"
|
||||
"\n"
|
||||
"vt 0.05 0.10\n"
|
||||
"vt 0.45 0.10\n"
|
||||
"vt 0.25 0.40\n"
|
||||
"vt 0.55 0.10\n"
|
||||
"vt 0.95 0.10\n"
|
||||
"vt 0.75 0.40\n"
|
||||
"vt 0.20 0.90\n"
|
||||
"vt 0.20 0.50\n"
|
||||
"vt 0.50 0.70\n"
|
||||
"vt 0.80 0.50\n"
|
||||
"vt 0.80 0.90\n"
|
||||
"\n"
|
||||
"f 1/1 2/2 3/3\n"
|
||||
"f 2/4 1/5 3/6\n"
|
||||
"f 3/9 4/7 5/8\n"
|
||||
"f 3/9 7/10 6/11\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 2:\n"
|
||||
"#\n"
|
||||
"v -0.5 0.0 0.0\n"
|
||||
"v 0.5 0.0 0.0\n"
|
||||
"v 0.0 0.0 0.866\n"
|
||||
"\n"
|
||||
"vt 1.05 0.30\n"
|
||||
"vt 1.45 0.30\n"
|
||||
"vt 1.25 0.60\n"
|
||||
"vt 1.55 0.30\n"
|
||||
"vt 1.95 0.30\n"
|
||||
"vt 1.75 0.60\n"
|
||||
"\n"
|
||||
"f 8/12 9/13 10/14\n"
|
||||
"f 9/15 8/16 10/17\n"
|
||||
"\n"
|
||||
"#\n"
|
||||
"# Shape 3:\n"
|
||||
"#\n"
|
||||
"v 0.75 0.0 0.0\n"
|
||||
"v 1.75 0.0 0.0\n"
|
||||
"v 1.25 0.0 0.866\n"
|
||||
"v 1.25 -0.75 0.0\n"
|
||||
"v 1.25 0.75 0.0\n"
|
||||
"\n"
|
||||
"vt 2.05 0.60\n"
|
||||
"vt 2.45 0.60\n"
|
||||
"vt 2.25 0.90\n"
|
||||
"vt 2.55 0.60\n"
|
||||
"vt 2.95 0.60\n"
|
||||
"vt 2.75 0.90\n"
|
||||
"vt 2.10 0.30\n"
|
||||
"vt 2.90 0.30\n"
|
||||
"vt 2.50 0.10\n"
|
||||
"vt 2.50 0.50\n"
|
||||
"\n"
|
||||
"f 11/18 12/19 13/20\n"
|
||||
"f 12/21 11/22 13/23\n"
|
||||
"f 14/24 12/26 11/27\n"
|
||||
"f 15/25 11/27 12/26\n"
|
||||
"\n"
|
||||
"t interpolateboundary 1/0/0 1\n"
|
||||
"\n"
|
||||
;
|
Loading…
Reference in New Issue
Block a user