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 
12 #include <MaterialXFormat/XmlIo.h>
13 
15 
16 namespace {
17 
18 const string SRGB_TEXTURE = "srgb_texture";
19 const string LIN_REC709 = "lin_rec709";
20 const string BAKED_POSTFIX = "_baked";
21 const string SHADER_PREFIX = "SR_";
22 const string DEFAULT_UDIM_PREFIX = "_";
23 
24 } // anonymous namespace
25 
26 template<typename Renderer, typename ShaderGen>
28 {
29  if (type == "color4" || type == "vector4")
30  {
31  return toValueString(color);
32  }
33  if (type == "color3" || type == "vector3")
34  {
35  return toValueString(Vector3(color[0], color[1], color[2]));
36  }
37  if (type == "vector2")
38  {
39  return toValueString(Vector2(color[0], color[1]));
40  }
41  if (type == "float")
42  {
43  return toValueString(color[0]);
44  }
45  return EMPTY_STRING;
46 }
47 
48 template<typename Renderer, typename ShaderGen>
49 TextureBaker<Renderer, ShaderGen>::TextureBaker(unsigned int width, unsigned int height, Image::BaseType baseType, bool flipSavedImage) :
50  Renderer(width, height, baseType),
51  _distanceUnit("meter"),
52  _averageImages(false),
53  _optimizeConstants(true),
54  _bakedGraphName("NG_baked"),
55  _bakedGeomInfoName("GI_baked"),
56  _textureFilenameTemplate("$MATERIAL_$SHADINGMODEL_$INPUT$UDIMPREFIX$UDIM.$EXTENSION"),
57  _outputStream(&std::cout),
58  _hashImageNames(false),
59  _textureSpaceMin(0.0f),
60  _textureSpaceMax(1.0f),
61  _generator(ShaderGen::create()),
62  _permittedOverrides({ "$ASSET", "$MATERIAL", "$UDIMPREFIX" }),
63  _flipSavedImage(flipSavedImage),
66 {
67  if (baseType == Image::BaseType::UINT8)
68  {
69 #if MATERIALX_BUILD_OIIO
70  _extension = ImageLoader::TIFF_EXTENSION;
71 #else
72  _extension = ImageLoader::PNG_EXTENSION;
73 #endif
74  _colorSpace = SRGB_TEXTURE;
75  }
76  else
77  {
78 #if MATERIALX_BUILD_OIIO
79  _extension = ImageLoader::EXR_EXTENSION;
80 #else
81  _extension = ImageLoader::HDR_EXTENSION;
82 #endif
83  _colorSpace = LIN_REC709;
84  }
85 
86  // Initialize our base renderer.
88 
89  // Initialize our image handler.
90  Renderer::_imageHandler = Renderer::createImageHandler(StbImageLoader::create());
91 #if MATERIALX_BUILD_OIIO
92  Renderer::_imageHandler->addLoader(OiioImageLoader::create());
93 #endif
94 
95  // Create our dedicated frame capture image.
96  _frameCaptureImage = Image::create(width, height, 4, baseType);
97  _frameCaptureImage->createResourceBuffer();
98 }
99 
100 template<typename Renderer, typename ShaderGen>
101 size_t TextureBaker<Renderer, ShaderGen>::findVarInTemplate(const string& filename, const string& var, size_t start)
102 {
103  size_t i = filename.find(var, start);
104  if (var == "$UDIM" && i != string::npos)
105  {
106  size_t udimPrefix = filename.find("$UDIMPREFIX", start);
107  if (i == udimPrefix)
108  {
109  i = filename.find(var, i + 1);
110  }
111  }
112  return i;
113 }
114 
115 template<typename Renderer, typename ShaderGen>
117 {
118  string bakedImageName = _textureFilenameTemplate;
119 
120  for (auto& pair : filenameTemplateMap)
121  {
122  string replacement = (_texTemplateOverrides.count(pair.first)) ?
123  _texTemplateOverrides[pair.first] : pair.second;
124  replacement = (filenameTemplateMap.at("$UDIM").empty() && pair.first == "$UDIMPREFIX") ?
125  EMPTY_STRING : replacement;
126 
127  for (size_t i = 0; (i = findVarInTemplate(bakedImageName, pair.first, i)) != string::npos; i++)
128  {
129  bakedImageName.replace(i, pair.first.length(), replacement);
130  }
131  }
132 
133  if (_hashImageNames)
134  {
135  std::stringstream hashStream;
136  hashStream << std::hash<std::string>{}(bakedImageName);
137  hashStream << "." + getExtension();
138  bakedImageName = hashStream.str();
139  }
140  return _outputImagePath / bakedImageName;
141 }
142 
143 template<typename Renderer, typename ShaderGen>
145 {
146  FilePath assetPath = FilePath(shader->getActiveSourceUri());
147  assetPath.removeExtension();
148  StringMap filenameTemplateMap;
149  filenameTemplateMap["$ASSET"] = assetPath.getBaseName();
150  filenameTemplateMap["$INPUT"] = _bakedInputMap[input->getName()];
151  filenameTemplateMap["$EXTENSION"] = _extension;
152  filenameTemplateMap["$MATERIAL"] = _material->getName();
153  filenameTemplateMap["$SHADINGMODEL"] = shader->getCategory();
154  filenameTemplateMap["$UDIM"] = udim;
155  filenameTemplateMap["$UDIMPREFIX"] = DEFAULT_UDIM_PREFIX;
156  return filenameTemplateMap;
157 }
158 
159 template<typename Renderer, typename ShaderGen>
161 {
162  if (!Renderer::_imageHandler->saveImage(baked.filename, image, _flipSavedImage))
163  {
164  if (_outputStream)
165  {
166  *_outputStream << "Failed to write baked image: " << baked.filename.asString() << std::endl;
167  }
168  return false;
169  }
170 
171  if (_outputStream)
172  {
173  *_outputStream << "Wrote baked image: " << baked.filename.asString() << std::endl;
174  }
175 
176  return true;
177 }
178 
179 template<typename Renderer, typename ShaderGen>
181 {
182  _material = material;
183 
184  if (!shader)
185  {
186  return;
187  }
188 
189  std::unordered_map<OutputPtr, InputPtr> bakedOutputMap;
190  for (InputPtr input : shader->getInputs())
191  {
192  OutputPtr output = input->getConnectedOutput();
193  if (output && !bakedOutputMap.count(output))
194  {
195  bakedOutputMap[output] = input;
196  _bakedInputMap[input->getName()] = input->getName();
197 
198  // When possible, nodes with world-space outputs are applied outside of the baking process.
199  NodePtr worldSpaceNode = connectsToWorldSpaceNode(output);
200  if (worldSpaceNode)
201  {
202  output->setConnectedNode(worldSpaceNode->getConnectedNode("in"));
203  _worldSpaceNodes[input->getName()] = worldSpaceNode;
204  }
205  StringMap filenameTemplateMap = initializeFileTemplateMap(input, shader, udim);
206  bakeGraphOutput(output, context, filenameTemplateMap);
207  }
208  else if (bakedOutputMap.count(output))
209  {
210  // When the input shares the same output as a previously baked input, we use the already baked input.
211  _bakedInputMap[input->getName()] = bakedOutputMap[output]->getName();
212  }
213  }
214 
215  // Release all images used to generate this set of shader inputs.
216  Renderer::_imageHandler->clearImageCache();
217 }
218 
219 template<typename Renderer, typename ShaderGen>
220 void TextureBaker<Renderer, ShaderGen>::bakeGraphOutput(OutputPtr output, GenContext& context, const StringMap& filenameTemplateMap)
221 {
222  if (!output)
223  {
224  return;
225  }
226 
227  bool encodeSrgb = _colorSpace == SRGB_TEXTURE &&
228  (output->getType() == "color3" || output->getType() == "color4");
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() + BAKED_POSTFIX, 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 + BAKED_POSTFIX, _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->getType() == "color3" || bakedInput->getType() == "color4")
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 + BAKED_POSTFIX, 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 + BAKED_POSTFIX + "_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  cms->loadLibrary(doc);
503  genContext.registerSourceCodeSearchPath(searchPath);
505 
506  // Compute the material tag set.
507  StringVec materialTags = udimSet;
508  if (materialTags.empty())
509  {
510  materialTags.push_back(EMPTY_STRING);
511  }
512 
513  ElementPtr elem = doc->getDescendant(materialPath);
514  if (!elem || !elem->isA<Node>())
515  {
516  return nullptr;
517  }
518  NodePtr materialNode = elem->asA<Node>();
519 
520  vector<NodePtr> shaderNodes = getShaderNodes(materialNode);
521  NodePtr shaderNode = shaderNodes.empty() ? nullptr : shaderNodes[0];
522  if (!shaderNode)
523  {
524  return nullptr;
525  }
526 
528 
529  // Iterate over material tags.
530  for (const string& tag : materialTags)
531  {
532  // Always clear any cached implementations before generation.
533  genContext.clearNodeImplementations();
534 
535  ShaderPtr hwShader = createShader("Shader", genContext, shaderNode);
536  if (!hwShader)
537  {
538  continue;
539  }
540  Renderer::_imageHandler->setSearchPath(searchPath);
541  resolver->setUdimString(tag);
542  Renderer::_imageHandler->setFilenameResolver(resolver);
543  bakeShaderInputs(materialNode, shaderNode, genContext, tag);
544 
545  // Optimize baked textures.
546  optimizeBakedTextures(shaderNode);
547  }
548 
549  // Link the baked material and textures in a MaterialX document.
550  documentName = shaderNode->getName();
551  return generateNewDocumentFromShader(shaderNode, udimSet);
552 }
553 
554 template<typename Renderer, typename ShaderGen>
556 {
557  if (_outputImagePath.isEmpty())
558  {
559  _outputImagePath = outputFilename.getParentPath();
560  if (!_outputImagePath.exists())
561  {
562  _outputImagePath.createDirectory();
563  }
564  }
565 
566  std::vector<TypedElementPtr> renderableMaterials = findRenderableElements(doc);
567 
568  // Compute the UDIM set.
569  ValuePtr udimSetValue = doc->getGeomPropValue(UDIM_SET_PROPERTY);
570  StringVec udimSet;
571  if (udimSetValue && udimSetValue->isA<StringVec>())
572  {
573  udimSet = udimSetValue->asA<StringVec>();
574  }
575 
576  // Bake all materials in documents to memory.
577  BakedDocumentVec bakedDocuments;
578  for (size_t i = 0; i < renderableMaterials.size(); i++)
579  {
580  if (_outputStream && i > 0)
581  {
582  *_outputStream << std::endl;
583  }
584 
585  const TypedElementPtr& element = renderableMaterials[i];
586  string documentName;
587  DocumentPtr bakedMaterialDoc = bakeMaterialToDoc(doc, searchPath, element->getNamePath(), udimSet, documentName);
588  if (_writeDocumentPerMaterial && bakedMaterialDoc)
589  {
590  bakedDocuments.push_back(make_pair(documentName, bakedMaterialDoc));
591  }
592  }
593 
595  {
596  // Write documents in memory to disk.
597  size_t bakeCount = bakedDocuments.size();
598  for (size_t i = 0; i < bakeCount; i++)
599  {
600  if (bakedDocuments[i].second)
601  {
602  FilePath writeFilename = outputFilename;
603 
604  // Add additional filename decorations if there are multiple documents.
605  if (bakedDocuments.size() > 1)
606  {
607  const string extension = writeFilename.getExtension();
608  writeFilename.removeExtension();
609  string filenameSeparator = writeFilename.isDirectory()? EMPTY_STRING : "_";
610  writeFilename = FilePath(writeFilename.asString() + filenameSeparator + bakedDocuments[i].first + "." + extension);
611  }
612 
613  writeToXmlFile(bakedDocuments[i].second, writeFilename);
614  if (_outputStream)
615  {
616  *_outputStream << "Wrote baked document: " << writeFilename.asString() << std::endl;
617  }
618  }
619  }
620 }
621  else if (_bakedTextureDoc)
622  {
623  writeToXmlFile(_bakedTextureDoc, outputFilename);
624  if (_outputStream)
625  {
626  *_outputStream << "Wrote baked document: " << outputFilename.asString() << std::endl;
627  }
628  }
629 }
630 
631 template<typename Renderer, typename ShaderGen>
633 {
634  UnitTypeDefPtr distanceTypeDef = unitDefinitions ? unitDefinitions->getUnitTypeDef("distance") : nullptr;
635  UnitTypeDefPtr angleTypeDef = unitDefinitions ? unitDefinitions->getUnitTypeDef("angle") : nullptr;
636  if (!distanceTypeDef && !angleTypeDef)
637  {
638  return;
639  }
640 
641  UnitSystemPtr unitSystem = UnitSystem::create(_generator->getTarget());
642  if (!unitSystem)
643  {
644  return;
645  }
646  _generator->setUnitSystem(unitSystem);
648  registry->addUnitConverter(distanceTypeDef, LinearUnitConverter::create(distanceTypeDef));
649  registry->addUnitConverter(angleTypeDef, LinearUnitConverter::create(angleTypeDef));
650  _generator->getUnitSystem()->loadLibrary(unitDefinitions);
651  _generator->getUnitSystem()->setUnitConverterRegistry(registry);
652 }
653 
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
IMATH_HOSTDEVICE void getValue(S &a, S &b, S &c, S &d) const IMATH_NOEXCEPT
Return the value.
Definition: ImathColor.h:544
Definition: File.h:26
_writeDocumentPerMaterial(true)
void setColorManagementSystem(ColorManagementSystemPtr colorManagementSystem)
Sets the color management system.
#define MATERIALX_NAMESPACE_BEGIN
Definition: Generated.h:25
vector< string > StringVec
A vector of strings.
Definition: Library.h:57
Definition: Node.h:52
bool fileTextureVerticalFlip
Definition: GenOptions.h:110
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:1209
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:115
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.
void createDirectory() const
Create a directory on the file system at the given path.
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:37
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
void removeExtension()
Remove the file extension, if any, from the given path.
Definition: File.h:141
virtual OutputPtr getConnectedOutput() const
Return the output, if any, to which this input is connected.
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:58
static DefaultColorManagementSystemPtr create(const string &target)
Create a new DefaultColorManagementSystem.
shared_ptr< Document > DocumentPtr
A shared pointer to a Document.
Definition: Document.h:22
Definition: Types.h:285
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
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:43
static UnitSystemPtr create(const string &target)
Create a new UnitSystem.
Definition: Types.h:305
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:59
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:34
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
string targetDistanceUnit
Definition: GenOptions.h:120
static OiioImageLoaderPtr create()
Create a new OpenImageIO image loader.
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
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:29
type
Definition: core.h:1059
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:56
shared_ptr< NodeDef > NodeDefPtr
A shared pointer to a NodeDef.
Definition: Definition.h:32
_bakedTextureDoc(nullptr)