{{ public:projects:ly_substance_ng:ly_logo.jpg?700 }}
====== SubstanceNG Gem ======
===== Project description =====
* SubstanceNG is a re-implementation og the Substance Gem provided by default for Lumberyard.
* I initiated this project when we realized while working on Lumberyard game that the default Substance Gem had serious limitations: mainly, it seemed to be used an old version of the substance engine, and thus, could not be used to load substance archives generated from Substance Designer 6 for instance (some simple substances could still work, but not the one using the new substance engine 6 features (?)).
* So I started with some investigation on the available Susbtance plugins for the major engines, and in this process, found the [[https://www.allegorithmic.com/buy/download|Susbtance plugin for Unreal Engine 4]]. I downloaded this plugin, and analyzed the sources which were using a completely different API to access the substance engine. Turned out this version was using the substance engine 6.
* Thus I started with a copy of the Substance Gem sources, and updated them progressively to incorporate this latest version of the Substance engine, and get ride of the all version in parallel.
* The new substance gem also come with some minor improvements:
* Support for emissive outputs from substance archives.
* Support for Lumberyard material reloading when input parameters are changed and saved on a given substance.
* Yet, for the moment, many of the flow graph nodes available in the legacy Substance Gem are not available yet in this Susbtance NG gem. To be added later ;-).
===== Skills & Techs =====
* **Lumberyard**
* **C++**
===== Sources =====
* The sources for this project are available on [[https://github.com/roche-emmanuel/LYSubstanceNG|github]].
===== Images =====
{{public:projects:ly_substance_ng:initial_import_results.png?nolink|}}
Initial import results
{{public:projects:ly_substance_ng:with_input_controls.png?nolink|}}
Handling of input parameters
{{public:projects:ly_substance_ng:substance_lava_material_on_capsule.png?nolink|}}
Application of substance material on mesh
===== Implementation notes =====
* Generating gem uuid from: https://guidgenerator.com/online-guid-generator.aspx
* It seems the gem is not rebuild when changed, need to call instead: lmbr_waf build_win_x64_vs2015_profile -p gems
* Could successfully change the plugin window name to "Substance NG Editor"
* Also, note that the **Substance Editor** menu tool bar button is not working with this new plugin.
* Need to figure out how to link to an external library when building a gem: **OK** updated our gem wscript file with: libpath = [bld.Path('Gems/SubstanceNG/Code/Libs/Win64')],
lib = ['pfxlinkercommon','algcompression','tinyxml','substance_linker_static', 'substance_sse2_blend_static','substance_framework'],
# could also add: 'substance_d3d11pc_blend_static' as engine ?
* Checking if package can be created: **OK** (got invalid package as expected!)
* Now trying to pass real data for package creation: **OK**
* We should use **SystemFile** to read the content of a file.
* We needto provide a full path for our file to be able to find/open it.
* Now reading the content of the sbsar:
* Retrieving graphs: **OK**
* Retrieving the outputs: **OK**
* Write the smtl file:
* Got an error when updating the EBus interface for **virtual bool CreateProceduralMaterial(const char* basePath, const char* sbsarPath, const char* smtlPath) = 0;** => It seems we still reference the Subtance includes: **OK** fixed.
* Now we are at the next error: **Failed to create substance material**, and with that we have the error message: **ProceduralMaterial: Error loading substance (materials/substances/lava.sbsar) for material (materials/substances/lava.smtl)**
* So, the next step is the call to **GetMaterialFromPath**: note that this method should return NULL if the material file doesn't exist yet.
* **ERROR**: We have the problem that the gem is trying to retrieve the Input at index 0 whereas we declared 0 inputs: **fixed** (=> stupid error)
* Need to fill a **STextureLoadData** for our substance texture files: **OK**
* We still have a problem with the error message: **[Error] Unsupported substance pixel format: 28** 28 in binary is: 00011100
* 00 (from right side) => RAW compression
* 11 => Substance_PF_RGBx|Substance_PF_RGB
* 1 => 16b channels
* **OK**: we now have support for proper import of sbsar files.
* Add support for emissive texture in materials: **OK**
* Not sure how to have Lumberyard find the emittance texture...
* Where on earth do we specify that *.smtl files should be read as substance materials ?!
* Could be this is not directly referenced: instead, the reference is done with the .mtl file created in the process (?)
* Found that the .mtl file is create from **QProceduralMaterialEditorMainWindow::CreateMaterial()**
* Checking if we can add support for emissive texture there: **OK**
* **Note**: maybe ambient occlusion can be activated with the **EFTT_OCCLUSION** slot ?
* Write the texture files when saving material with new name: **OK**
* Avoid duplicating material when saving procedural mat:
* **ERROR**: Could not link **CMaterial::Reload()** function...
* When writing susbtance smtl files we should also write the input values: **OK**
* Question on project licensing asked to amazon: https://gamedev.amazon.com/forums/questions/18854/new-substance-ng-gem.html
===== TODOs =====
* Clean the Gem removing all references on the previous version of the Substance API
* Add supprot for channel orders