HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TextureBaker.inl
Go to the documentation of this file.
1 //
2 // Copyright Contributors to the MaterialX Project
3 // SPDX-License-Identifier: Apache-2.0
4 //
5 
8 #include <MaterialXRender/Util.h>
9 
11 #ifdef MATERIALX_BUILD_OCIO
13 #endif
14 
15 #include <MaterialXFormat/XmlIo.h>
16 
18 
19 namespace
20 {
21 
22 const string SRGB_TEXTURE = "srgb_texture";
23 const string LIN_REC709 = "lin_rec709";
24 const string SHADER_PREFIX = "SR_";
25 const string DEFAULT_UDIM_PREFIX = "_";
26 
27 } // anonymous namespace
28 
29 template <typename Renderer, typename ShaderGen>
31 {
32  if (type == "color4" || type == "vector4")
33  {
34  return toValueString(color);
35  }
36  if (type == "color3" || type == "vector3")
37  {
38  return toValueString(Vector3(color[0], color[1], color[2]));
39  }
40  if (type == "vector2")
41  {
42  return toValueString(Vector2(color[0], color[1]));
43  }
44  if (type == "float")
45  {
46  return toValueString(color[0]);
47  }
48  return EMPTY_STRING;
49 }
50 
51 template <typename Renderer, typename ShaderGen>
52 TextureBaker<Renderer, ShaderGen>::TextureBaker(unsigned int width, unsigned int height, Image::BaseType baseType, bool flipSavedImage) :
53  Renderer(width, height, baseType),
54  _distanceUnit("meter"),
55  _averageImages(false),
56  _optimizeConstants(true),
57  _bakedGraphName("NG_baked"),
58  _bakedGeomInfoName("GI_baked"),
59  _textureFilenameTemplate("$MATERIAL_$SHADINGMODEL_$INPUT$UDIMPREFIX$UDIM.$EXTENSION"),
60  _outputStream(&std::cout),
61  _hashImageNames(false),
62  _textureSpaceMin(0.0f),
63  _textureSpaceMax(1.0f),
64  _generator(ShaderGen::create()),
65  _permittedOverrides({ "$ASSET", "$MATERIAL", "$UDIMPREFIX" }),
66  _flipSavedImage(flipSavedImage),
69 {
70  if (baseType == Image::BaseType::UINT8)
71  {
72 #if MATERIALX_BUILD_OIIO
73  _extension = ImageLoader::TIFF_EXTENSION;
74 #else
75  _extension = ImageLoader::PNG_EXTENSION;
76 #endif
77  _colorSpace = SRGB_TEXTURE;
78  }
79  else
80  {
81 #if MATERIALX_BUILD_OIIO
82  _extension = ImageLoader::EXR_EXTENSION;
83 #else
84  _extension = ImageLoader::HDR_EXTENSION;
85 #endif
86  _colorSpace = LIN_REC709;
87  }
88 
89  // Initialize our base renderer.
91 
92  // Initialize our image handler.
93  Renderer::_imageHandler = Renderer::createImageHandler(StbImageLoader::create());
94 #if MATERIALX_BUILD_OIIO
95  Renderer::_imageHandler->addLoader(OiioImageLoader::create());
96 #endif
97 
98  // Create our dedicated frame capture image.
99  _frameCaptureImage = Image::create(width, height, 4, baseType);
100  _frameCaptureImage->createResourceBuffer();
101 }
102 
103 template <typename Renderer, typename ShaderGen>
104 size_t TextureBaker<Renderer, ShaderGen>::findVarInTemplate(const string& filename, const string& var, size_t start)
105 {
106  size_t i = filename.find(var, start);
107  if (var == "$UDIM" && i != string::npos)
108  {
109  size_t udimPrefix = filename.find("$UDIMPREFIX", start);
110  if (i == udimPrefix)
111  {
112  i = filename.find(var, i + 1);
113  }
114  }
115  return i;
116 }
117 
118 template <typename Renderer, typename ShaderGen>
120 {
121  string bakedImageName = _textureFilenameTemplate;
122 
123  for (auto& pair : filenameTemplateMap)
124  {
125  string replacement = (_texTemplateOverrides.count(pair.first)) ? _texTemplateOverrides[pair.first] : pair.second;
126  replacement = (filenameTemplateMap.at("$UDIM").empty() && pair.first == "$UDIMPREFIX") ? EMPTY_STRING : replacement;
127 
128  for (size_t i = 0; (i = findVarInTemplate(bakedImageName, pair.first, i)) != string::npos; i++)
129  {
130  bakedImageName.replace(i, pair.first.length(), replacement);
131  }
132  }
133 
134  if (_hashImageNames)
135  {
136  std::stringstream hashStream;
137  hashStream << std::hash<std::string>{}(bakedImageName);
138  hashStream << "." + getExtension();
139  bakedImageName = hashStream.str();
140  }
141  return _outputImagePath / bakedImageName;
142 }
143 
144 template <typename Renderer, typename ShaderGen>
146 {
147  FilePath assetPath = FilePath(shader->getActiveSourceUri());
148  assetPath.removeExtension();
149  StringMap filenameTemplateMap;
150  filenameTemplateMap["$ASSET"] = assetPath.getBaseName();
151  filenameTemplateMap["$INPUT"] = _bakedInputMap[input->getName()];
152  filenameTemplateMap["$EXTENSION"] = _extension;
153  filenameTemplateMap["$MATERIAL"] = _material->getName();
154  filenameTemplateMap["$SHADINGMODEL"] = shader->getCategory();
155  filenameTemplateMap["$UDIM"] = udim;
156  filenameTemplateMap["$UDIMPREFIX"] = DEFAULT_UDIM_PREFIX;
157  return filenameTemplateMap;
158 }
159 
160 template <typename Renderer, typename ShaderGen>
162 {
163  if (!Renderer::_imageHandler->saveImage(baked.filename, image, _flipSavedImage))
164  {
165  if (_outputStream)
166  {
167  *_outputStream << "Failed to write baked image: " << baked.filename.asString() << std::endl;
168  }
169  return false;
170  }
171 
172  if (_outputStream)
173  {
174  *_outputStream << "Wrote baked image: " << baked.filename.asString() << std::endl;
175  }
176 
177  return true;
178 }
179 
180 template <typename Renderer, typename ShaderGen>
182 {
183  _material = material;
184 
185  if (!shader)
186  {
187  return;
188  }
189 
190  std::unordered_map<OutputPtr, InputPtr> bakedOutputMap;
191  for (InputPtr input : shader->getInputs())
192  {
193  OutputPtr output = input->getConnectedOutput();
194  if (output && !bakedOutputMap.count(output))
195  {
196  bakedOutputMap[output] = input;
197  _bakedInputMap[input->getName()] = input->getName();
198 
199  // When possible, nodes with world-space outputs are applied outside of the baking process.
200  NodePtr worldSpaceNode = connectsToWorldSpaceNode(output);
201  if (worldSpaceNode)
202  {
203  output->setConnectedNode(worldSpaceNode->getConnectedNode("in"));
204  _worldSpaceNodes[input->getName()] = worldSpaceNode;
205  }
206  StringMap filenameTemplateMap = initializeFileTemplateMap(input, shader, udim);
207  bakeGraphOutput(output, context, filenameTemplateMap);
208  }
209  else if (bakedOutputMap.count(output))
210  {
211  // When the input shares the same output as a previously baked input, we use the already baked input.
212  _bakedInputMap[input->getName()] = bakedOutputMap[output]->getName();
213  }
214  }
215 
216  // Release all images used to generate this set of shader inputs.
217  Renderer::_imageHandler->clearImageCache();
218 }
219 
220 template <typename Renderer, typename ShaderGen>
221 void TextureBaker<Renderer, ShaderGen>::bakeGraphOutput(OutputPtr output, GenContext& context, const StringMap& filenameTemplateMap)
222 {
223  if (!output)
224  {
225  return;
226  }
227 
228  bool encodeSrgb = _colorSpace == SRGB_TEXTURE && output->isColorType();
229  Renderer::getFramebuffer()->setEncodeSrgb(encodeSrgb);
230 
231  ShaderPtr shader = _generator->generate("BakingShader", output, context);
232  Renderer::createProgram(shader);
233 
234  // Render and capture the requested image.
235  Renderer::renderTextureSpace(getTextureSpaceMin(), getTextureSpaceMax());
236  string texturefilepath = generateTextureFilename(filenameTemplateMap);
237  Renderer::captureImage(_frameCaptureImage);
238 
239  // Construct a baked image record.
240  BakedImage baked;
241  baked.filename = texturefilepath;
242  if (_averageImages)
243  {
244  baked.uniformColor = _frameCaptureImage->getAverageColor();
245  baked.isUniform = true;
246  }
247  else if (_frameCaptureImage->isUniformColor(&baked.uniformColor))
248  {
249  baked.isUniform = true;
250  }
251  _bakedImageMap[output].push_back(baked);
252 
253  // TODO: Write images to memory rather than to disk.
254  // Write non-uniform images to disk.
255  if (!baked.isUniform)
256  {
257  writeBakedImage(baked, _frameCaptureImage);
258  }
259 }
260 
261 template <typename Renderer, typename ShaderGen>
263 {
264  if (!shader)
265  {
266  return;
267  }
268 
269  // Check for fully uniform outputs.
270  for (auto& pair : _bakedImageMap)
271  {
272  bool outputIsUniform = true;
273  for (BakedImage& baked : pair.second)
274  {
275  if (!baked.isUniform || baked.uniformColor != pair.second[0].uniformColor)
276  {
277  outputIsUniform = false;
278  continue;
279  }
280  }
281  if (outputIsUniform)
282  {
283  BakedConstant bakedConstant;
284  bakedConstant.color = pair.second[0].uniformColor;
285  _bakedConstantMap[pair.first] = bakedConstant;
286  }
287  }
288 
289  // Check for uniform outputs at their default values.
290  NodeDefPtr shaderNodeDef = shader->getNodeDef();
291  if (shaderNodeDef)
292  {
293  for (InputPtr shaderInput : shader->getInputs())
294  {
295  OutputPtr output = shaderInput->getConnectedOutput();
296  if (output && _bakedConstantMap.count(output))
297  {
298  InputPtr input = shaderNodeDef->getInput(shaderInput->getName());
299  if (input)
300  {
301  Color4 uniformColor = _bakedConstantMap[output].color;
302  string uniformColorString = getValueStringFromColor(uniformColor, input->getType());
303  string defaultValueString = input->hasValue() ? input->getValue()->getValueString() : EMPTY_STRING;
304  if (uniformColorString == defaultValueString)
305  {
306  _bakedConstantMap[output].isDefault = true;
307  }
308  }
309  }
310  }
311  }
312 
313  // Remove baked images that have been replaced by constant values.
314  for (auto& pair : _bakedConstantMap)
315  {
316  if (pair.second.isDefault || _optimizeConstants || _averageImages)
317  {
318  _bakedImageMap.erase(pair.first);
319  }
320  }
321 }
322 
323 template <typename Renderer, typename ShaderGen>
325 {
326  if (!shader)
327  {
328  return nullptr;
329  }
330 
331  // Create document.
333  {
334  _bakedTextureDoc = createDocument();
335  }
336  if (shader->getDocument()->hasColorSpace())
337  {
338  _bakedTextureDoc->setColorSpace(shader->getDocument()->getColorSpace());
339  }
340 
341  // Create node graph and geometry info.
342  NodeGraphPtr bakedNodeGraph;
343  if (!_bakedImageMap.empty())
344  {
345  _bakedGraphName = _bakedTextureDoc->createValidChildName(_bakedGraphName);
346  bakedNodeGraph = _bakedTextureDoc->addNodeGraph(_bakedGraphName);
347  bakedNodeGraph->setColorSpace(_colorSpace);
348  }
349  _bakedGeomInfoName = _bakedTextureDoc->createValidChildName(_bakedGeomInfoName);
350  GeomInfoPtr bakedGeom = !udimSet.empty() ? _bakedTextureDoc->addGeomInfo(_bakedGeomInfoName) : nullptr;
351  if (bakedGeom)
352  {
353  bakedGeom->setGeomPropValue(UDIM_SET_PROPERTY, udimSet, "stringarray");
354  }
355 
356  // Create a shader node.
357  NodePtr bakedShader = _bakedTextureDoc->addNode(shader->getCategory(), shader->getName(), shader->getType());
358 
359  // Optionally create a material node, connecting it to the new shader node.
360  if (_material)
361  {
362  string materialName = (_texTemplateOverrides.count("$MATERIAL")) ? _texTemplateOverrides["$MATERIAL"] : _material->getName();
363  NodePtr bakedMaterial = _bakedTextureDoc->addNode(_material->getCategory(), materialName, _material->getType());
364  for (auto sourceMaterialInput : _material->getInputs())
365  {
366  const string& sourceMaterialInputName = sourceMaterialInput->getName();
367  NodePtr upstreamShader = sourceMaterialInput->getConnectedNode();
368  if (upstreamShader && (upstreamShader->getNamePath() == shader->getNamePath()))
369  {
370  InputPtr bakedMaterialInput = bakedMaterial->getInput(sourceMaterialInputName);
371  if (!bakedMaterialInput)
372  {
373  bakedMaterialInput = bakedMaterial->addInput(sourceMaterialInputName, sourceMaterialInput->getType());
374  }
375  bakedMaterialInput->setNodeName(bakedShader->getName());
376  }
377  }
378  }
379 
380  // Create and connect inputs on the new shader node.
381  for (ValueElementPtr valueElem : shader->getChildrenOfType<ValueElement>())
382  {
383  // Get the source input and its connected output.
384  InputPtr sourceInput = valueElem->asA<Input>();
385  if (!sourceInput)
386  {
387  continue;
388  }
389 
390  OutputPtr output = sourceInput->getConnectedOutput();
391 
392  // Skip uniform outputs at their default values.
393  if (output && _bakedConstantMap.count(output) && _bakedConstantMap[output].isDefault)
394  {
395  continue;
396  }
397 
398  // Find or create the baked input.
399  const string& sourceName = sourceInput->getName();
400  const string& sourceType = sourceInput->getType();
401  InputPtr bakedInput = bakedShader->getInput(sourceName);
402  if (!bakedInput)
403  {
404  bakedInput = bakedShader->addInput(sourceName, sourceType);
405  }
406 
407  // Assign image or constant data to the baked input.
408  if (output)
409  {
410  // Store a constant value for uniform outputs.
411  if (_optimizeConstants && _bakedConstantMap.count(output))
412  {
413  Color4 uniformColor = _bakedConstantMap[output].color;
414  string uniformColorString = getValueStringFromColor(uniformColor, bakedInput->getType());
415  bakedInput->setValueString(uniformColorString);
416  if (bakedInput->isColorType())
417  {
418  bakedInput->setColorSpace(_colorSpace);
419  }
420  continue;
421  }
422 
423  if (!_bakedImageMap.empty())
424  {
425  // Add the image node.
426  NodePtr bakedImage = bakedNodeGraph->addNode("image", sourceName, sourceType);
427  InputPtr input = bakedImage->addInput("file", "filename");
428  StringMap filenameTemplateMap = initializeFileTemplateMap(bakedInput, shader, udimSet.empty() ? EMPTY_STRING : UDIM_TOKEN);
429  input->setValueString(generateTextureFilename(filenameTemplateMap));
430 
431  // Reconstruct any world-space nodes that were excluded from the baking process.
432  auto worldSpacePair = _worldSpaceNodes.find(sourceInput->getName());
433  if (worldSpacePair != _worldSpaceNodes.end())
434  {
435  NodePtr origWorldSpaceNode = worldSpacePair->second;
436  if (origWorldSpaceNode)
437  {
438  NodePtr newWorldSpaceNode = bakedNodeGraph->addNode(origWorldSpaceNode->getCategory(), sourceName + "_map", sourceType);
439  newWorldSpaceNode->copyContentFrom(origWorldSpaceNode);
440  InputPtr mapInput = newWorldSpaceNode->getInput("in");
441  if (mapInput)
442  {
443  mapInput->setNodeName(bakedImage->getName());
444  }
445  bakedImage = newWorldSpaceNode;
446  }
447  }
448 
449  // Add the graph output.
450  OutputPtr bakedOutput = bakedNodeGraph->addOutput(sourceName + "_output", sourceType);
451  bakedOutput->setConnectedNode(bakedImage);
452  bakedInput->setConnectedOutput(bakedOutput);
453  }
454  }
455  else
456  {
457  bakedInput->copyContentFrom(sourceInput);
458  }
459  }
460 
461  // Generate uniform images and write to disk.
462  ImagePtr uniformImage = createUniformImage(4, 4, 4, Renderer::_baseType, Color4());
463  for (const auto& pair : _bakedImageMap)
464  {
465  for (const BakedImage& baked : pair.second)
466  {
467  if (baked.isUniform)
468  {
469  uniformImage->setUniformColor(baked.uniformColor);
470  writeBakedImage(baked, uniformImage);
471  }
472  }
473  }
474 
475  // Clear cached information after each material bake
476  _bakedImageMap.clear();
477  _bakedConstantMap.clear();
478  _worldSpaceNodes.clear();
479  _bakedInputMap.clear();
480  _material = nullptr;
481 
482  // Return the baked document on success.
483  return _bakedTextureDoc;
484 }
485 
486 template <typename Renderer, typename ShaderGen>
488  const StringVec& udimSet, string& documentName)
489 {
490  if (_outputStream)
491  {
492  *_outputStream << "Processing material: " << materialPath << std::endl;
493  }
494 
495  // Set up generator context for material
496  GenContext genContext(_generator);
498  genContext.getOptions().fileTextureVerticalFlip = true;
499  genContext.getOptions().targetDistanceUnit = _distanceUnit;
500 
502 #ifdef MATERIALX_BUILD_OCIO
503  try
504  {
505  cms = OcioColorManagementSystem::createFromBuiltinConfig(
506  "ocio://studio-config-latest",
507  genContext.getShaderGenerator().getTarget());
508  }
509  catch (const std::exception& /*e*/)
510  {
512  }
513 #else
515 #endif
516  cms->loadLibrary(doc);
517  genContext.registerSourceCodeSearchPath(searchPath);
518  _generator->setColorManagementSystem(cms);
519  _generator->registerTypeDefs(doc);
520 
521  // Compute the material tag set.
522  StringVec materialTags = udimSet;
523  if (materialTags.empty())
524  {
525  materialTags.push_back(EMPTY_STRING);
526  }
527 
528  ElementPtr elem = doc->getDescendant(materialPath);
529  if (!elem || !elem->isA<Node>())
530  {
531  return nullptr;
532  }
533  NodePtr materialNode = elem->asA<Node>();
534 
535  vector<NodePtr> shaderNodes = getShaderNodes(materialNode);
536  NodePtr shaderNode = shaderNodes.empty() ? nullptr : shaderNodes[0];
537  if (!shaderNode)
538  {
539  return nullptr;
540  }
541 
543 
544  // Iterate over material tags.
545  for (const string& tag : materialTags)
546  {
547  // Always clear any cached implementations before generation.
548  genContext.clearNodeImplementations();
549 
550  ShaderPtr hwShader = createShader("Shader", genContext, shaderNode);
551  if (!hwShader)
552  {
553  continue;
554  }
555  Renderer::_imageHandler->setSearchPath(searchPath);
556  resolver->setUdimString(tag);
557  Renderer::_imageHandler->setFilenameResolver(resolver);
558  bakeShaderInputs(materialNode, shaderNode, genContext, tag);
559 
560  // Optimize baked textures.
561  optimizeBakedTextures(shaderNode);
562  }
563 
564  // Link the baked material and textures in a MaterialX document.
565  documentName = shaderNode->getName();
566  return generateNewDocumentFromShader(shaderNode, udimSet);
567 }
568 
569 template <typename Renderer, typename ShaderGen>
571 {
572  if (_outputImagePath.isEmpty())
573  {
574  _outputImagePath = outputFilename.getParentPath();
575  if (!_outputImagePath.exists())
576  {
577  _outputImagePath.createDirectory();
578  }
579  }
580 
581  std::vector<TypedElementPtr> renderableMaterials = findRenderableElements(doc);
582 
583  // Compute the UDIM set.
584  ValuePtr udimSetValue = doc->getGeomPropValue(UDIM_SET_PROPERTY);
585  StringVec udimSet;
586  if (udimSetValue && udimSetValue->isA<StringVec>())
587  {
588  udimSet = udimSetValue->asA<StringVec>();
589  }
590 
591  // Bake all materials in documents to memory.
592  BakedDocumentVec bakedDocuments;
593  for (size_t i = 0; i < renderableMaterials.size(); i++)
594  {
595  if (_outputStream && i > 0)
596  {
597  *_outputStream << std::endl;
598  }
599 
600  const TypedElementPtr& element = renderableMaterials[i];
601  string documentName;
602  DocumentPtr bakedMaterialDoc = bakeMaterialToDoc(doc, searchPath, element->getNamePath(), udimSet, documentName);
603  if (_writeDocumentPerMaterial && bakedMaterialDoc)
604  {
605  bakedDocuments.push_back(make_pair(documentName, bakedMaterialDoc));
606  }
607  }
608 
610  {
611  // Write documents in memory to disk.
612  size_t bakeCount = bakedDocuments.size();
613  for (size_t i = 0; i < bakeCount; i++)
614  {
615  if (bakedDocuments[i].second)
616  {
617  FilePath writeFilename = outputFilename;
618 
619  // Add additional filename decorations if there are multiple documents.
620  if (bakedDocuments.size() > 1)
621  {
622  const string extension = writeFilename.getExtension();
623  writeFilename.removeExtension();
624  string filenameSeparator = writeFilename.isDirectory() ? EMPTY_STRING : "_";
625  writeFilename = FilePath(writeFilename.asString() + filenameSeparator + bakedDocuments[i].first + "." + extension);
626  }
627 
628  writeToXmlFile(bakedDocuments[i].second, writeFilename);
629  if (_outputStream)
630  {
631  *_outputStream << "Wrote baked document: " << writeFilename.asString() << std::endl;
632  }
633  }
634  }
635  }
636  else if (_bakedTextureDoc)
637  {
638  writeToXmlFile(_bakedTextureDoc, outputFilename);
639  if (_outputStream)
640  {
641  *_outputStream << "Wrote baked document: " << outputFilename.asString() << std::endl;
642  }
643  }
644 }
645 
646 template <typename Renderer, typename ShaderGen>
648 {
649  UnitTypeDefPtr distanceTypeDef = unitDefinitions ? unitDefinitions->getUnitTypeDef("distance") : nullptr;
650  UnitTypeDefPtr angleTypeDef = unitDefinitions ? unitDefinitions->getUnitTypeDef("angle") : nullptr;
651  if (!distanceTypeDef && !angleTypeDef)
652  {
653  return;
654  }
655 
656  UnitSystemPtr unitSystem = UnitSystem::create(_generator->getTarget());
657  if (!unitSystem)
658  {
659  return;
660  }
661  _generator->setUnitSystem(unitSystem);
663  registry->addUnitConverter(distanceTypeDef, LinearUnitConverter::create(distanceTypeDef));
664  registry->addUnitConverter(angleTypeDef, LinearUnitConverter::create(angleTypeDef));
665  _generator->getUnitSystem()->loadLibrary(unitDefinitions);
666  _generator->getUnitSystem()->setUnitConverterRegistry(registry);
667 }
668 
shared_ptr< Output > OutputPtr
A shared pointer to an Output.
Definition: Interface.h:36
const string DEFAULT_UDIM_PREFIX
GT_API const UT_StringHolder filename
static const string EXR_EXTENSION
Definition: ImageHandler.h:117
OutputPtr getConnectedOutput() const
Return the output, if any, to which this input is connected.
IMATH_HOSTDEVICE void getValue(S &a, S &b, S &c, S &d) const IMATH_NOEXCEPT
Return the value.
Definition: ImathColor.h:604
Definition: File.h:26
_writeDocumentPerMaterial(true)
#define MATERIALX_NAMESPACE_BEGIN
Definition: Generated.h:25
vector< string > StringVec
A vector of strings.
Definition: Library.h:61
Definition: Node.h:52
bool fileTextureVerticalFlip
Definition: GenOptions.h:118
GLuint start
Definition: glcorearb.h:475
MX_FORMAT_API void writeToXmlFile(DocumentPtr doc, const FilePath &filename, const XmlWriteOptions *writeOptions=nullptr)
void clearNodeImplementations()
Clear all cached shader node implementation.
shared_ptr< TypedElement > TypedElementPtr
A shared pointer to a TypedElement.
Definition: Element.h:36
shared_ptr< class UnitSystem > UnitSystemPtr
A shared pointer to a UnitSystem.
Definition: UnitSystem.h:26
MATERIALX_NAMESPACE_BEGIN MX_CORE_API const string EMPTY_STRING
static StringResolverPtr create()
Create a new string resolver.
Definition: Element.h:1249
static UnitConverterRegistryPtr create()
Creator.
GLenum GLenum GLsizei void * image
Definition: glad.h:5132
const string & getBaseName() const
Definition: File.h:105
static const string TIFF_EXTENSION
Definition: ImageHandler.h:127
shared_ptr< GeomInfo > GeomInfoPtr
A shared pointer to a GeomInfo.
Definition: Geom.h:38
string targetColorSpaceOverride
Definition: GenOptions.h:123
bool writeBakedImage(const BakedImage &baked, ImagePtr image)
std::vector< std::pair< std::string, DocumentPtr >> BakedDocumentVec
A vector of baked documents with their associated names.
Definition: TextureBaker.h:24
MX_GENSHADER_API vector< TypedElementPtr > findRenderableElements(ConstDocumentPtr doc)
bool isDirectory() const
Return true if the given path is a directory on the file system.
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER IMFUTIL_EXPORT void saveImage(const std::string &fileName, const Header &hdr, const Image &img, DataWindowSource dws=USE_IMAGE_DATA_WINDOW)
shared_ptr< UnitTypeDef > UnitTypeDefPtr
A shared pointer to a UnitTypeDef.
Definition: Definition.h:67
ShaderGenerator & getShaderGenerator()
Return shader generatior.
Definition: GenContext.h:36
string getValueStringFromColor(const Color4 &color, const string &type)
StringMap initializeFileTemplateMap(InputPtr input, NodePtr shader, const string &udim=EMPTY_STRING)
void bakeAllMaterials(DocumentPtr doc, const FileSearchPath &searchPath, const FilePath &outputFileName)
GLint GLsizei GLsizei height
Definition: glcorearb.h:103
static const string PNG_EXTENSION
Definition: ImageHandler.h:123
BaseType
Definition: Image.h:48
GLfloat f
Definition: glcorearb.h:1926
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
void removeExtension()
Remove the file extension, if any, from the given path.
Definition: File.h:141
MATERIALX_NAMESPACE_BEGIN MX_CORE_API vector< NodePtr > getShaderNodes(NodePtr materialNode, const string &nodeType=SURFACE_SHADER_TYPE_STRING, const string &target=EMPTY_STRING)
static LinearUnitConverterPtr create(UnitTypeDefPtr UnitDef)
Creator.
void bakeGraphOutput(OutputPtr output, GenContext &context, const StringMap &filenameTemplateMap)
Bake a texture for the given graph output.
TextureBaker(unsigned int width, unsigned int height, Image::BaseType baseType, bool flipSavedImage)
static ImagePtr create(unsigned int width, unsigned int height, unsigned int channelCount, BaseType baseType=BaseType::UINT8)
Create an empty image with the given properties.
Definition: Image.h:60
static DefaultColorManagementSystemPtr create(const string &target)
Create a new DefaultColorManagementSystem.
shared_ptr< Document > DocumentPtr
A shared pointer to a Document.
Definition: Document.h:22
string getExtension() const
Return the file extension of the given path.
Definition: File.h:127
MX_RENDER_API ImagePtr createUniformImage(unsigned int width, unsigned int height, unsigned int channelCount, Image::BaseType baseType, const Color4 &color)
Create a uniform-color image with the given properties.
void optimizeBakedTextures(NodePtr shader)
Optimize baked textures before writing.
DocumentPtr bakeMaterialToDoc(DocumentPtr doc, const FileSearchPath &searchPath, const string &materialPath, const StringVec &udimSet, std::string &documentName)
Bake material to document in memory and write baked textures to disk.
OPENVDB_API void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types. Also initializes blosc (if enabled).
Definition: logging.h:294
_flipSavedImage(flipSavedImage)
shared_ptr< Input > InputPtr
A shared pointer to an Input.
Definition: Interface.h:31
size_t findVarInTemplate(const string &filename, const string &var, size_t start=0)
virtual const string & getTarget() const
Return the name of the target this generator is for.
string asString(Format format=FormatNative) const
Return this path as a standard string with the given format.
shared_ptr< StringResolver > StringResolverPtr
A shared pointer to a StringResolver.
Definition: Element.h:66
GLuint shader
Definition: glcorearb.h:785
shared_ptr< UnitConverterRegistry > UnitConverterRegistryPtr
A shared pointer to a UnitConverterRegistry.
Definition: Unit.h:33
UT_Vector2T< Float > Vector2
Definition: APEX_Include.h:64
FilePath generateTextureFilename(const StringMap &fileTemplateMap)
MX_GENSHADER_API NodePtr connectsToWorldSpaceNode(OutputPtr output)
GLuint color
Definition: glcorearb.h:1261
GenOptions & getOptions()
Return shader generation options.
Definition: GenContext.h:42
static UnitSystemPtr create(const string &target)
Create a new UnitSystem.
DocumentPtr generateNewDocumentFromShader(NodePtr shader, const StringVec &udimSet)
std::unordered_map< string, string > StringMap
An unordered map with strings as both keys and values.
Definition: Library.h:63
MX_RENDER_API ShaderPtr createShader(const string &shaderName, GenContext &context, ElementPtr elem)
Create a shader for a given element.
GLint GLsizei width
Definition: glcorearb.h:103
shared_ptr< Shader > ShaderPtr
Shared pointer to a Shader.
Definition: Library.h:33
void bakeShaderInputs(NodePtr material, NodePtr shader, GenContext &context, const string &udim=EMPTY_STRING)
Bake textures for all graph inputs of the given shader.
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition: Element.h:31
shared_ptr< ValueElement > ValueElementPtr
A shared pointer to a ValueElement.
Definition: Element.h:41
#define MATERIALX_NAMESPACE_END
Definition: Generated.h:26
UT_Vector3T< Float > Vector3
Definition: APEX_Include.h:65
string targetDistanceUnit
Definition: GenOptions.h:128
shared_ptr< Image > ImagePtr
A shared pointer to an image.
Definition: Image.h:23
static const string HDR_EXTENSION
Definition: ImageHandler.h:119
FilePath getParentPath() const
Definition: File.h:116
MX_CORE_API const string UDIM_TOKEN
void createDirectory(bool recursive=false) const
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:30
shared_ptr< NodeGraph > NodeGraphPtr
A shared pointer to a NodeGraph.
Definition: Node.h:34
MX_CORE_API const string UDIM_SET_PROPERTY
void setupUnitSystem(DocumentPtr unitDefinitions)
Set up the unit definitions to be used in baking.
MX_CORE_API string toValueString(const T &data)
Convert the given data value to a value string.
OIIO_UTIL_API std::string extension(string_view filepath, bool include_dot=true) noexcept
shared_ptr< class DefaultColorManagementSystem > DefaultColorManagementSystemPtr
A shared pointer to a DefaultColorManagementSystem.
static StbImageLoaderPtr create()
Create a new stb image loader.
shared_ptr< Node > NodePtr
A shared pointer to a Node.
Definition: Node.h:24
void registerSourceCodeSearchPath(const FilePath &path)
Definition: GenContext.h:61
shared_ptr< NodeDef > NodeDefPtr
A shared pointer to a NodeDef.
Definition: Definition.h:32
_bakedTextureDoc(nullptr)