Merge pull request #418 from asluk/dev

osd3 support for lefthanded meshes
This commit is contained in:
Jeremy Cowles 2015-04-16 16:59:05 -07:00
commit 6efe3e0bce
11 changed files with 7445 additions and 16 deletions

View File

@ -119,7 +119,7 @@ ObjAnim::Create(std::vector<char const *> objFiles, bool axis) {
fflush(stdout);
std::string str = ss.str();
shape = Shape::parseObj(str.c_str(), kCatmark, axis);
shape = Shape::parseObj(str.c_str(), kCatmark, false, axis);
if (i==0) {

View File

@ -486,7 +486,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
if (doAnim) {
shape = g_objAnim->GetShape();
} else {
shape = Shape::parseObj(shapeDesc.data.c_str(), shapeDesc.scheme);
shape = Shape::parseObj(shapeDesc.data.c_str(), shapeDesc.scheme, shapeDesc.isLeftHanded);
}
// create Vtr mesh (topology)

View File

@ -26,12 +26,14 @@
struct ShapeDesc {
ShapeDesc(char const * iname, std::string const & idata, Scheme ischeme) :
name(iname), data(idata), scheme(ischeme) { }
ShapeDesc(char const * iname, std::string const & idata, Scheme ischeme,
bool iIsLeftHanded=false) :
name(iname), data(idata), scheme(ischeme), isLeftHanded(iIsLeftHanded) { }
std::string name,
data;
Scheme scheme;
bool isLeftHanded;
};
static std::vector<ShapeDesc> g_defaultShapes;
@ -73,6 +75,8 @@ static std::vector<ShapeDesc> g_defaultShapes;
#include <shapes/catmark_hole_test2.h>
#include <shapes/catmark_hole_test3.h>
#include <shapes/catmark_hole_test4.h>
#include <shapes/catmark_lefthanded.h>
#include <shapes/catmark_righthanded.h>
#include <shapes/catmark_pawn.h>
#include <shapes/catmark_pyramid_creases0.h>
#include <shapes/catmark_pyramid_creases1.h>
@ -139,6 +143,8 @@ static void initShapes() {
g_defaultShapes.push_back( ShapeDesc("catmark_hole_test2", catmark_hole_test2, kCatmark ) );
g_defaultShapes.push_back( ShapeDesc("catmark_hole_test3", catmark_hole_test3, kCatmark ) );
g_defaultShapes.push_back( ShapeDesc("catmark_hole_test4", catmark_hole_test4, kCatmark ) );
g_defaultShapes.push_back( ShapeDesc("catmark_lefthanded", catmark_lefthanded, kCatmark, true /*isLeftHanded*/ ) );
g_defaultShapes.push_back( ShapeDesc("catmark_righthanded", catmark_righthanded, kCatmark ) );
g_defaultShapes.push_back( ShapeDesc("catmark_pyramid_creases0", catmark_pyramid_creases0, kCatmark ) );
g_defaultShapes.push_back( ShapeDesc("catmark_pyramid_creases1", catmark_pyramid_creases1, kCatmark ) );
g_defaultShapes.push_back( ShapeDesc("catmark_pyramid", catmark_pyramid, kCatmark ) );

View File

@ -296,9 +296,16 @@ TopologyRefinerFactory<TopologyRefinerFactoryBase::TopologyDescriptor>::assignCo
IndexArray dstFaceVerts = refiner.setBaseFaceVertices(face);
for (int vert=0; vert<dstFaceVerts.size(); ++vert) {
if (desc.isLeftHanded) {
for (int vert=dstFaceVerts.size()-1; vert >=0; --vert) {
dstFaceVerts[vert] = desc.vertIndicesPerFace[idx++];
dstFaceVerts[vert] = desc.vertIndicesPerFace[idx++];
}
} else {
for (int vert=0; vert<dstFaceVerts.size(); ++vert) {
dstFaceVerts[vert] = desc.vertIndicesPerFace[idx++];
}
}
}
return true;
@ -373,9 +380,16 @@ TopologyRefinerFactory<TopologyRefinerFactoryBase::TopologyDescriptor>::assignFa
IndexArray dstFaceValues = refiner.setBaseFVarFaceValues(face, channel);
for (int vert=0; vert<dstFaceValues.size(); ++vert) {
dstFaceValues[vert] = channelIndices[idx++];
if (desc.isLeftHanded) {
for (int vert=dstFaceValues.size(); vert >= 0; --vert) {
dstFaceValues[vert] = channelIndices[idx++];
}
} else {
for (int vert=0; vert<dstFaceValues.size(); ++vert) {
dstFaceValues[vert] = channelIndices[idx++];
}
}
}
}

View File

@ -74,6 +74,8 @@ public:
int numHoles;
Index const * holeIndices;
bool isLeftHanded;
// Face-varying data channel -- value indices correspond to vertex indices,
// i.e. one for every vertex of every face:
//

View File

@ -61,11 +61,13 @@ Shape::~Shape() {
}
//------------------------------------------------------------------------------
Shape * Shape::parseObj(char const * shapestr, Scheme shapescheme, int axis, bool parsemtl) {
Shape * Shape::parseObj(char const * shapestr, Scheme shapescheme,
bool isLeftHanded, int axis, bool parsemtl) {
Shape * s = new Shape;
s->scheme = shapescheme;
s->isLeftHanded = isLeftHanded;
char * str=const_cast<char *>(shapestr), line[256], buf[256], usemtl=-1;
bool done = false;

View File

@ -71,7 +71,7 @@ struct Shape {
};
static Shape * parseObj(char const * Shapestr, Scheme schme,
int axis=1, bool parsemtl=false);
bool isLeftHanded=false, int axis=1, bool parsemtl=false);
void parseMtllib(char const * stream);
@ -100,6 +100,7 @@ struct Shape {
std::vector<int> facenormals;
std::vector<tag *> tags;
Scheme scheme;
bool isLeftHanded;
char FindMaterial(char const * name) {
for (int i=0; i<(int)mtls.size(); ++i) {

View File

@ -211,8 +211,14 @@ TopologyRefinerFactory<Shape>::assignComponentTopology(
Far::IndexArray dstFaceVerts = refiner.setBaseFaceVertices(i);
//IndexArray dstFaceEdges = refiner.setBaseFaceEdges(i);
for (int j=0; j<dstFaceVerts.size(); ++j) {
dstFaceVerts[j] = shape.faceverts[ofs++];
if (shape.isLeftHanded) {
for (int j=dstFaceVerts.size()-1; j>=0; --j) {
dstFaceVerts[j] = shape.faceverts[ofs++];
}
} else {
for (int j=0; j<dstFaceVerts.size(); ++j) {
dstFaceVerts[j] = shape.faceverts[ofs++];
}
}
}
}
@ -236,8 +242,14 @@ TopologyRefinerFactory<Shape>::assignFaceVaryingTopology(
Far::IndexArray dstFaceUVs =
refiner.setBaseFVarFaceValues(i, channel);
for (int j=0; j<dstFaceUVs.size(); ++j) {
dstFaceUVs[j] = shape.faceuvs[ofs++];
if (shape.isLeftHanded) {
for (int j=dstFaceUVs.size()-1; j >= 0; --j) {
dstFaceUVs[j] = shape.faceuvs[ofs++];
}
} else {
for (int j=0; j<dstFaceUVs.size(); ++j) {
dstFaceUVs[j] = shape.faceuvs[ofs++];
}
}
}
}

View File

@ -129,7 +129,7 @@ static Shape * readShape( char const * fname, Scheme scheme ) {
shapeStr[size]='\0';
return Shape::parseObj( shapeStr, scheme, 1 );
return Shape::parseObj( shapeStr, scheme, false /*isLeftHanded*/, 1 );
}
#define STR(x) x

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff