static void getargs (int argc, const char *argv[]) { static bool help = false; OIIO::ArgParse ap; ap.options ("Usage: testshade [options] shader...", "%*", add_shader, "", "--help", &help, "Print help message", "-v", &verbose, "Verbose messages", "--debug", &debug, "Lots of debugging info", "--debug2", &debug2, "Even more debugging info", "--stats", &stats, "Print run statistics", "-g %d %d", &xres, &yres, "Make an X x Y grid of shading points", "-o %L %L", &outputvars, &outputfiles, "Output (variable, filename)", "-od %s", &dataformatname, "Set the output data format to one of: " "uint8, half, float", "--layer %s", &layername, "Set next layer name", "--fparam %L %L", &fparams, &fparams, "Add a float param (args: name value)", "--iparam %L %L", &iparams, &iparams, "Add an integer param (args: name value)", "--vparam %L %L %L %L", &vparams, &vparams, &vparams, &vparams, "Add a vector or color param (args: name x y z)", "--sparam %L %L", &sparams, &sparams, "Add a string param (args: name value)", "--connect %L %L %L %L", &connections, &connections, &connections, &connections, "Connect fromlayer fromoutput tolayer toinput", "--raytype %s", &raytype, "Set the raytype", "--iters %d", &iters, "Number of iterations", "-O0", &O0, "Do no runtime shader optimization", "-O1", &O1, "Do a little runtime shader optimization", "-O2", &O2, "Do lots of runtime shader optimization", "--center", &pixelcenters, "Shade at output pixel 'centers' rather than corners", "--debugnan", &debugnan, "Turn on 'debugnan' mode", "--options %s", &extraoptions, "Set extra OSL options", // "-v", &verbose, "Verbose output", NULL); if (ap.parse(argc, argv) < 0 || shadernames.empty()) { std::cerr << ap.geterror() << std::endl; ap.usage (); exit (EXIT_FAILURE); } if (help) { std::cout << "testshade -- Test Open Shading Language\n" "(c) Copyright 2009-2010 Sony Pictures Imageworks Inc. All Rights Reserved.\n"; ap.usage (); exit (EXIT_SUCCESS); } if (debug || verbose) errhandler.verbosity (ErrorHandler::VERBOSE); }
int main (int argc, const char *argv[]) { // Create a new shading system. Timer timer; SimpleRenderer rend; shadingsys = ShadingSystem::create (&rend, NULL, &errhandler); shadingsys->attribute("lockgeom", 1); shadingsys->ShaderGroupBegin (); getargs (argc, argv); if (debug || verbose) errhandler.verbosity (ErrorHandler::VERBOSE); for (size_t i = 0; i < connections.size(); i += 4) { if (i+3 < connections.size()) { std::cout << "Connect " << connections[i] << "." << connections[i+1] << " to " << connections[i+2] << "." << connections[i+3] << "\n"; shadingsys->ConnectShaders (connections[i].c_str(), connections[i+1].c_str(), connections[i+2].c_str(), connections[i+3].c_str()); } } shadingsys->ShaderGroupEnd (); // getargs called 'add_shader' for each shader mentioned on the command // line. So now we should have a valid shading state. ShadingAttribStateRef shaderstate = shadingsys->state (); // Set up shader globals and a little test grid of points to shade. ShaderGlobals shaderglobals; memset(&shaderglobals, 0, sizeof(ShaderGlobals)); // Make a shader space that is translated one unit in x and rotated // 45deg about the z axis. OSL::Matrix44 Mshad; Mshad.translate (OSL::Vec3 (1.0, 0.0, 0.0)); Mshad.rotate (OSL::Vec3 (0.0, 0.0, M_PI_4)); // std::cout << "shader-to-common matrix: " << Mshad << "\n"; OSL::TransformationPtr Mshadptr (&Mshad); shaderglobals.shader2common = Mshadptr; // Make an object space that is translated one unit in y and rotated // 90deg about the z axis. OSL::Matrix44 Mobj; Mobj.translate (OSL::Vec3 (0.0, 1.0, 0.0)); Mobj.rotate (OSL::Vec3 (0.0, 0.0, M_PI_2)); // std::cout << "object-to-common matrix: " << Mobj << "\n"; OSL::TransformationPtr Mobjptr (&Mobj); shaderglobals.object2common = Mobjptr; // Make a 'myspace that is non-uniformly scaled OSL::Matrix44 Mmyspace; Mmyspace.scale (OSL::Vec3 (1.0, 2.0, 1.0)); // std::cout << "myspace-to-common matrix: " << Mmyspace << "\n"; rend.name_transform ("myspace", Mmyspace); shaderglobals.dudx = 1.0f / xres; shaderglobals.dvdy = 1.0f / yres; shaderglobals.raytype = ((ShadingSystemImpl *)shadingsys)->raytype_bit (ustring(raytype)); double setuptime = timer (); double runtime = 0; std::vector<float> pixel; if (outputfiles.size() != 0) std::cout << "\n"; // grab this once since we will be shading several points ShadingSystemImpl *ssi = (ShadingSystemImpl *)shadingsys; void* thread_info = ssi->create_thread_info(); for (int iter = 0; iter < iters; ++iter) { for (int y = 0, n = 0; y < yres; ++y) { for (int x = 0; x < xres; ++x, ++n) { shaderglobals.u = (xres == 1) ? 0.5f : (float) x / (xres - 1); shaderglobals.v = (yres == 1) ? 0.5f : (float) y / (yres - 1); shaderglobals.P = Vec3 (shaderglobals.u, shaderglobals.v, 1.0f); shaderglobals.dPdx = Vec3 (shaderglobals.dudx, shaderglobals.dudy, 0.0f); shaderglobals.dPdy = Vec3 (shaderglobals.dvdx, shaderglobals.dvdy, 0.0f); shaderglobals.N = Vec3 (0, 0, 1); shaderglobals.Ng = Vec3 (0, 0, 1); shaderglobals.dPdu = Vec3 (1.0f, 0.0f, 0.0f); shaderglobals.dPdv = Vec3 (0.0f, 1.0f, 0.0f); shaderglobals.surfacearea = 1; // Request a shading context, bind it, execute the shaders. // FIXME -- this will eventually be replaced with a public // ShadingSystem call that encapsulates it. ShadingContext *ctx = ssi->get_context (thread_info); timer.reset (); timer.start (); // run shader for this point ctx->execute (ShadUseSurface, *shaderstate, shaderglobals); runtime += timer (); if (iter == (iters - 1)) { // extract any output vars into images (on last iteration only) for (size_t i = 0; i < outputfiles.size(); ++i) { Symbol *sym = ctx->symbol (ShadUseSurface, ustring(outputvars[i])); if (! sym) { if (n == 0) { std::cout << "Output " << outputvars[i] << " not found, skipping.\n"; outputimgs.push_back(0); // invalid image } continue; } if (n == 0) std::cout << "Output " << outputvars[i] << " to " << outputfiles[i]<< "\n"; TypeDesc t = sym->typespec().simpletype(); TypeDesc tbase = TypeDesc ((TypeDesc::BASETYPE)t.basetype); TypeDesc outtypebase = tbase; if (dataformatname == "uint8") outtypebase = TypeDesc::UINT8; else if (dataformatname == "half") outtypebase = TypeDesc::HALF; else if (dataformatname == "float") outtypebase = TypeDesc::FLOAT; int nchans = t.numelements() * t.aggregate; pixel.resize (nchans); if (n == 0) { OIIO::ImageSpec spec (xres, yres, nchans, outtypebase); OIIO::ImageBuf* img = new OIIO::ImageBuf(outputfiles[i], spec); #if OPENIMAGEIO_VERSION >= 900 /* 0.9.0 */ OIIO::ImageBufAlgo::zero (*img); #else img->zero (); #endif outputimgs.push_back(img); } OIIO::convert_types (tbase, ctx->symbol_data (*sym, 0), TypeDesc::FLOAT, &pixel[0], nchans); outputimgs[i]->setpixel (x, y, &pixel[0]); } } ssi->release_context (ctx, thread_info); } } } ssi->destroy_thread_info(thread_info); if (outputfiles.size() == 0) std::cout << "\n"; // write any images to disk for (size_t i = 0; i < outputimgs.size(); ++i) { if (outputimgs[i]) { outputimgs[i]->save(); delete outputimgs[i]; } } if (debug || stats) { std::cout << "\n"; std::cout << "Setup: " << Strutil::timeintervalformat (setuptime,2) << "\n"; std::cout << "Run : " << Strutil::timeintervalformat (runtime,2) << "\n"; std::cout << "\n"; std::cout << shadingsys->getstats (5) << "\n"; } ShadingSystem::destroy (shadingsys); return EXIT_SUCCESS; }
static void getargs (int argc, const char *argv[]) { static bool help = false; OIIO::ArgParse ap; ap.options ("Usage: testshade [options] shader...", "%*", add_shader, "", "--help", &help, "Print help message", "-v", &verbose, "Verbose messages", "-t %d", &num_threads, "Render using N threads (default: auto-detect)", "--debug", &debug, "Lots of debugging info", "--debug2", &debug2, "Even more debugging info", "--runstats", &runstats, "Print run statistics", "--stats", &runstats, "", // DEPRECATED 1.7 "--profile %@", &set_profile, NULL, "Print profile information", "--path %s", &shaderpath, "Specify oso search path", "-g %d %d", &xres, &yres, "Make an X x Y grid of shading points", "-res %d %d", &xres, &yres, "", // synonym for -g "--options %s", &extraoptions, "Set extra OSL options", "-o %L %L", &outputvars, &outputfiles, "Output (variable, filename)", "-d %s", &dataformatname, "Set the output data format to one of: " "uint8, half, float", "-od %s", &dataformatname, "", // old name "--print", &print_outputs, "Print values of all -o outputs to console instead of saving images", "--groupname %s", &groupname, "Set shader group name", "--layer %s", &layername, "Set next layer name", "--param %@ %s %s", &action_param, NULL, NULL, "Add a parameter (args: name value) (options: type=%s, lockgeom=%d)", "--connect %L %L %L %L", &connections, &connections, &connections, &connections, "Connect fromlayer fromoutput tolayer toinput", "--reparam %@ %s %s %s", &action_reparam, NULL, NULL, NULL, "Change a parameter (args: layername paramname value) (options: type=%s)", "--group %@ %s", &action_groupspec, &groupspec, "Specify a full group command", "--archivegroup %s", &archivegroup, "Archive the group to a given filename", "--raytype %s", &raytype, "Set the raytype", "--raytype_opt", &raytype_opt, "Specify ray type mask for optimization", "--iters %d", &iters, "Number of iterations", "-O0", &O0, "Do no runtime shader optimization", "-O1", &O1, "Do a little runtime shader optimization", "-O2", &O2, "Do lots of runtime shader optimization", "--entry %L", &entrylayers, "Add layer to the list of entry points", "--entryoutput %L", &entryoutputs, "Add output symbol to the list of entry points", "--center", &pixelcenters, "Shade at output pixel 'centers' rather than corners", "--debugnan", &debugnan, "Turn on 'debug_nan' mode", "--debuguninit", &debug_uninit, "Turn on 'debug_uninit' mode", "--groupoutputs", &use_group_outputs, "Specify group outputs, not global outputs", "--oslquery", &do_oslquery, "Test OSLQuery at runtime", "--inbuffer", &inbuffer, "Compile osl source from and to buffer", "--shadeimage", &use_shade_image, "Use shade_image utility", "--noshadeimage %!", &use_shade_image, "Don't use shade_image utility", "--expr %@ %s", &specify_expr, NULL, "Specify an OSL expression to evaluate", "--offsetuv %f %f", &uoffset, &voffset, "Offset s & t texture coordinates (default: 0 0)", "--offsetst %f %f", &uoffset, &voffset, "", // old name "--scaleuv %f %f", &uscale, &vscale, "Scale s & t texture lookups (default: 1, 1)", "--scalest %f %f", &uscale, &vscale, "", // old name "--userdata_isconnected", &userdata_isconnected, "Consider lockgeom=0 to be isconnected()", "-v", &verbose, "Verbose output", NULL); if (ap.parse(argc, argv) < 0 || (shadernames.empty() && groupspec.empty())) { std::cerr << ap.geterror() << std::endl; ap.usage (); exit (EXIT_FAILURE); } if (help) { std::cout << "testshade -- Test Open Shading Language\n" OSL_COPYRIGHT_STRING "\n"; ap.usage (); exit (EXIT_SUCCESS); } if (debug || verbose) errhandler.verbosity (ErrorHandler::VERBOSE); raytype_bit = shadingsys->raytype_bit (ustring (raytype)); }
static void getargs (int argc, const char *argv[]) { static bool help = false; OIIO::ArgParse ap; ap.options ("Usage: testshade [options] shader...", "%*", add_shader, "", "--help", &help, "Print help message", "-v", &verbose, "Verbose messages", "-t %d", &num_threads, "Render using N threads (default: auto-detect)", "--debug", &debug, "Lots of debugging info", "--debug2", &debug2, "Even more debugging info", "--stats", &stats, "Print run statistics", "--profile", &profile, "Print profile information", "-g %d %d", &xres, &yres, "Make an X x Y grid of shading points", "-o %L %L", &outputvars, &outputfiles, "Output (variable, filename)", "-od %s", &dataformatname, "Set the output data format to one of: " "uint8, half, float", "--groupname %s", &groupname, "Set shader group name", "--layer %s", &layername, "Set next layer name", "--param %@ %s %s", &action_param, NULL, NULL, "Add a parameter (args: name value) (options: type=%s, lockgeom=%d)", "--connect %L %L %L %L", &connections, &connections, &connections, &connections, "Connect fromlayer fromoutput tolayer toinput", "--reparam %@ %s %s %s", &action_reparam, NULL, NULL, NULL, "Change a parameter (args: layername paramname value) (options: type=%s)", "--group %@ %s", &action_groupspec, &groupspec, "Specify a full group command", "--archivegroup %s", &archivegroup, "Archive the group to a given filename", "--raytype %s", &raytype, "Set the raytype", "--iters %d", &iters, "Number of iterations", "-O0", &O0, "Do no runtime shader optimization", "-O1", &O1, "Do a little runtime shader optimization", "-O2", &O2, "Do lots of runtime shader optimization", "--center", &pixelcenters, "Shade at output pixel 'centers' rather than corners", "--debugnan", &debugnan, "Turn on 'debug_nan' mode", "--debuguninit", &debug_uninit, "Turn on 'debug_uninit' mode", "--options %s", &extraoptions, "Set extra OSL options", "--groupoutputs", &use_group_outputs, "Specify group outputs, not global outputs", "--oslquery", &do_oslquery, "Test OSLQuery at runtime", "--inbuffer", &inbuffer, "Compile osl source from and to buffer", // "-v", &verbose, "Verbose output", NULL); if (ap.parse(argc, argv) < 0 || (shadernames.empty() && groupspec.empty())) { std::cerr << ap.geterror() << std::endl; ap.usage (); exit (EXIT_FAILURE); } if (help) { std::cout << "testshade -- Test Open Shading Language\n" "(c) Copyright 2009-2010 Sony Pictures Imageworks Inc. All Rights Reserved.\n"; ap.usage (); exit (EXIT_SUCCESS); } if (debug || verbose) errhandler.verbosity (ErrorHandler::VERBOSE); raytype_bit = shadingsys->raytype_bit (ustring (raytype)); }