// // Copyright 2013 Pixar // // Licensed under the Apache License, Version 2.0 (the "Apache License") // with the following modification; you may not use this file except in // compliance with the Apache License and the following modification to it: // Section 6. Trademarks. is deleted and replaced with: // // 6. Trademarks. This License does not grant permission to use the trade // names, trademarks, service marks, or product names of the Licensor // and its affiliates, except as required to comply with Section 4(c) of // the License and to reproduce the content of the NOTICE file. // // You may obtain a copy of the Apache License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the Apache License with the above modification is // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the Apache License for the specific // language governing permissions and limitations under the Apache License. // #include #include #include #include "../../regression/common/hbr_utils.h" // // Generates a baseline data set for the hbr_regression tool // //------------------------------------------------------------------------------ // Vertex class implementation struct xyzVV { xyzVV() { } xyzVV( int /*i*/ ) { } xyzVV( float x, float y, float z ) { _pos[0]=x; _pos[1]=y; _pos[2]=z; } xyzVV( const xyzVV & src ) { _pos[0]=src._pos[0]; _pos[1]=src._pos[1]; _pos[2]=src._pos[2]; } ~xyzVV( ) { } void AddWithWeight(const xyzVV& src, float weight, void * =0 ) { _pos[0]+=weight*src._pos[0]; _pos[1]+=weight*src._pos[1]; _pos[2]+=weight*src._pos[2]; } void AddVaryingWithWeight(const xyzVV& , float, void * =0 ) { } void Clear( void * =0 ) { _pos[0]=_pos[1]=_pos[2]=0.0f; } void SetPosition(float x, float y, float z) { _pos[0]=x; _pos[1]=y; _pos[2]=z; } void ApplyVertexEdit(const OpenSubdiv::HbrVertexEdit & edit) { const float *src = edit.GetEdit(); switch(edit.GetOperation()) { case OpenSubdiv::HbrHierarchicalEdit::Set: _pos[0] = src[0]; _pos[1] = src[1]; _pos[2] = src[2]; break; case OpenSubdiv::HbrHierarchicalEdit::Add: _pos[0] += src[0]; _pos[1] += src[1]; _pos[2] += src[2]; break; case OpenSubdiv::HbrHierarchicalEdit::Subtract: _pos[0] -= src[0]; _pos[1] -= src[1]; _pos[2] -= src[2]; break; } } void ApplyMovingVertexEdit(const OpenSubdiv::HbrMovingVertexEdit &) { } const float * GetPos() const { return _pos; } private: float _pos[3]; }; //------------------------------------------------------------------------------ class xyzFV; typedef OpenSubdiv::HbrMesh xyzmesh; typedef OpenSubdiv::HbrFace xyzface; typedef OpenSubdiv::HbrVertex xyzvertex; typedef OpenSubdiv::HbrHalfedge xyzhalfedge; typedef OpenSubdiv::HbrFaceOperator xyzFaceOperator; typedef OpenSubdiv::HbrVertexOperator xyzVertexOperator; #include "./init_shapes.h" //------------------------------------------------------------------------------ static void generate( char const * shapeStr, char const * name, int levels, Scheme scheme=kCatmark ) { assert(shapeStr); xyzmesh * mesh = simpleHbr(shapeStr, scheme, 0); //int nvf = 4; //if ( typeid(*(mesh->GetSubdivision())) == // typeid( OpenSubdiv::HbrLoopSubdivision) ) // nvf = 3; int firstface=0, lastface=mesh->GetNumFaces(), firstvert=0, lastvert=mesh->GetNumVertices(); for (int l=0; lGetFace(i); f->Refine(); } firstface = lastface; lastface = mesh->GetNumFaces(); //nfaces = lastface - firstface; firstvert = lastvert; lastvert = mesh->GetNumVertices(); //nverts = lastvert - firstvert; //fprintf(handle, "static char const * %s = \n", fname.str().c_str()); fprintf(handle, "# This file uses centimeters as units for non-parametric coordinates.\n"); for (int i=firstvert; iGetVertex(i)->GetData().GetPos(); fprintf(handle, "v %.*g %.*g %.*g\n", 9, pos[0], 9, pos[1], 9, pos[2]); } fprintf(handle, "s off\n"); for (int i=firstface; iGetFace(i); fprintf(handle, "f "); for (int j=0; jGetNumVertices();) { int vert = f->GetVertex(j)->GetID()-firstvert; fprintf(handle, "%d", vert+1); if (++jGetNumVertices()) fprintf(handle, " "); } fprintf(handle, "\n"); } fprintf(handle, "\n"); fclose(handle); } delete mesh; } //------------------------------------------------------------------------------ static void usage(char const * appname) { printf("Usage : %s [-shape -scheme ] [file.obj]\n", appname); printf(" Valid shapes :\n"); for (int i=0; i<(int)g_shapes.size(); ++i) printf(" %d : %s\n", i, g_shapes[i].name.c_str()); printf(" %ld : all shapes\n", (long int)g_shapes.size()); } int g_shapeindex=-1; std::string g_objfile; Scheme g_scheme=kCatmark; //------------------------------------------------------------------------------ static void parseArgs(int argc, char ** argv) { if (argc==1) usage(argv[0]); for (int i=1; i(int)g_shapes.size()) { printf("-shape : index must be within [%ld %ld]\n", 0L, (long int)g_shapes.size()); exit(0); } } else if (not strcmp(argv[i],"-scheme")) { const char * scheme = NULL; if (i<(argc-1)) scheme = argv[++i]; if (not strcmp(scheme,"bilinear")) g_scheme = kBilinear; else if (not strcmp(scheme,"catmark")) g_scheme = kCatmark; else if (not strcmp(scheme,"loop")) g_scheme = kLoop; else { printf("-scheme : must be one of (\"bilinear\", \"catmark\", \"loop\")\n"); exit(0); } } else { if (i<(argc=1)) g_objfile = argv[++i]; else usage(argv[0]); } } } //------------------------------------------------------------------------------ int main(int argc, char ** argv) { int levels=5; initShapes(); parseArgs(argc, argv); if ( g_objfile.size() ) { FILE * handle = fopen( g_objfile.c_str(), "rt" ); if (not handle) { printf("Could not open \"%s\" - aborting.\n", g_objfile.c_str()); exit(0); } fseek( handle, 0, SEEK_END ); size_t size = ftell(handle); fseek( handle, 0, SEEK_SET ); char * shapeStr = new char[size]; if ( fread( shapeStr, size, 1, handle)!=1 ) { printf("Error reading \"%s\" - aborting.\n", g_objfile.c_str()); exit(0); } fclose(handle); generate( shapeStr, g_objfile.c_str(), levels, g_scheme ); delete [] shapeStr; } else if (g_shapeindex>=0) { if (g_shapeindex==(int)g_shapes.size()) { for (int i=0; i<(int)g_shapes.size(); ++i) generate( g_shapes[i].data.c_str(), g_shapes[i].name.c_str(), levels, g_shapes[i].scheme); } else generate( g_shapes[g_shapeindex].data.c_str(), g_shapes[g_shapeindex].name.c_str(), levels, g_shapes[g_shapeindex].scheme); } }