//-***************************************************************************** // // Copyright (c) 2009-2011, // Sony Pictures Imageworks Inc. and // Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Sony Pictures Imageworks, nor // Industrial Light & Magic, nor the names of their contributors may be used // to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //-***************************************************************************** #include "ProcArgs.h" #include #include #include #include //-***************************************************************************** //INSERT YOUR OWN TOKENIZATION CODE AND STYLE HERE ProcArgs::ProcArgs( const char * paramStr ) : frame(0.0) , fps(24.0) , shutterOpen(0) , shutterClose(0) , excludeXform(false) , makeInstance(false) , subdIterations(0) , proceduralNode(0) { // TODO, grab the shutter a camera attached to AiUniverse if present typedef boost::char_separator Separator; typedef boost::tokenizer Tokenizer; std::vector tokens; std::string params( paramStr ); Tokenizer tokenizer( params, Separator(" ") ); for ( Tokenizer::iterator iter = tokenizer.begin(); iter != tokenizer.end() ; ++iter ) { if ( (*iter).empty() ) { continue; } tokens.push_back( *iter ); } for ( size_t i = 0; i < tokens.size(); ++i ) { std::string token = tokens[i]; std::transform( token.begin(), token.end(), token.begin(), ::tolower ); if ( token == "-frame" ) { ++i; if ( i < tokens.size() ) { frame = atof( tokens[i].c_str() ); } } else if ( token == "-fps" ) { ++i; if ( i < tokens.size() ) { fps = atof( tokens[i].c_str() ); } } else if ( token == "-shutteropen" ) { ++i; if ( i < tokens.size() ) { shutterOpen = atof( tokens[i].c_str() ); } } else if ( token == "-shutterclose" ) { ++i; if ( i < tokens.size() ) { shutterClose = atof( tokens[i].c_str() ); } } else if ( token == "-filename" ) { ++i; if ( i < tokens.size() ) { filename = tokens[i]; } } else if ( token == "-nameprefix" ) { ++i; if ( i < tokens.size() ) { nameprefix = tokens[i]; } } else if ( token == "-objectpath" ) { ++i; if ( i < tokens.size() ) { objectpath = tokens[i]; } } else if ( token == "-excludexform" ) { excludeXform = true; } else if ( token == "-subditerations" ) { ++i; if ( i < tokens.size() ) { subdIterations = atoi( tokens[i].c_str() ); } } else if ( token == "-makeinstance" ) { makeInstance = true; } } } void ProcArgs::usage() { std::cerr << "AlembicArnoldProcedural usage:" << std::endl; std::cerr << std::endl; std::cerr << "-filename /path/to/some/archive.abc" << std::endl; std::cerr << std::endl; std::cerr << "This is the only required argument. " "It has no default value." << std::endl; std::cerr << std::endl; std::cerr << "-frame 42" << std::endl; std::cerr << std::endl; std::cerr << "The frame number to load from within the archive. " "The default value is 0. This is combined with -fps to map " "to Alembic time units (double-precision seconds)."; std::cerr << std::endl; std::cerr << std::endl; std::cerr << "-fps 24" << std::endl; std::cerr << std::endl; std::cerr << "Combined with -frame above. The default value is 24.0."; std::cerr << std::endl; std::cerr << std::endl; std::cerr << "-shutteropen 0.0" << std::endl; std::cerr << "-shutterclose 0.5" << std::endl; std::cerr << std::endl; std::cerr << "These are frame-relative values which specify the shutter " "window. The procedural will include all samples present in " "the archive which are relevant to the shutter window. " "The default value of both is 0.0 (no motion blur)."; std::cerr << std::endl; std::cerr << std::endl; std::cerr << "-objectpath /assetroot/characters" << std::endl; std::cerr << std::endl; std::cerr << "If specified, only objects at or below the provided path " "(within the archive) will be emitted. When combined with " "-excludexform, this can also be used to load individual " "leaf locations within an externally defined hierarchy. Be " "aware that in that case, you'd need to set the \"matrix\" " "and \"inherit_xform\" parameters on the procedural node " "itself. If the path points to a single \"faceset\" object " "directly beneath a polymesh or subdivision mesh, it'll add " "a \"face_visibility\" user data array."; std::cerr << std::endl; std::cerr << std::endl; std::cerr << "-excludexform" << std::endl; std::cerr << std::endl; std::cerr << "If specified, the \"matrix\" parameter will not be set on " "the resulting primitive nodes." << std::endl; std::cerr << std::endl; std::cerr << "-subditerations 2" << std::endl; std::cerr << std::endl; std::cerr << "For AbcGeom::ISubD objects, this option specifies the " "\"subdiv_iterations\" value. It currently has no effect for " "other primitive types. The default value is 0."; std::cerr << std::endl; std::cerr << std::endl; std::cerr << "-nameprefix some_prefix__" << std::endl; std::cerr << std::endl; std::cerr << "Because node names are unique scene-wide in arnold, this " "allows you control potential name clashes when loading or " "instancing an archive (or multiple equivalently named " "archives) multiple times. The default name of each node is " "its full path within the alembic archive."; std::cerr << std::endl; std::cerr << std::endl; std::cerr << "-makeinstance" << std::endl; std::cerr << std::endl; std::cerr << "This behavior is disabled by default. If enabled, the " "procedural will attempt to identify identical primitives " "(using Alembic's per-array-property hash keys) and create " "corresponding \"ginstance\" nodes. Two primitives are " "considered equivalent if the keys of their relevant point " "position samples match along with any specified " "subdivision values. This works across multiple archives or " "invokations of the procedural. It currently does not write " "unique user data per instance but will likely do so " "automatically (when necessary) in a future release. " "The ray visibility of the source primitive will be set to " "AI_RAY_NONE and the \"ginstance\" node's will be set to " "that of the calling \"procedural\" node."; std::cerr << std::endl; }