Material metadata is null


#1

I’m working on an editor which overlays the scene that would allow someone to edit standard materials using Blender material values. It uses metadata to hold the Blender values. I have made changes to the Blender exporter to include the metadata in the ‘output.babylon’ file. However, that data was unavailble in babylon.js.

I tweaked a local copy of ‘babylon.3.3.0.max.js’ to get everything to work. I point my tweaks to the appropriate babylon.ts files.

Babylon.js/src/Materials/material.ts

I see that the 'metadata' property has been  added to 'material.ts' since version 3.3.0. However it is null in the scene.

I think by changing <line 123> from this:

/**
 * Gets or sets user defined metadata
 */
public metadata: any = null;

to this:

/**
 * Gets or sets user defined metadata
 */
@serialize()
public metadata: any = null;

would make it work.


#2

first, serialize is for creating a file. You are loading. find a parse arterial function or similar. make changes there.

There is also an exporter for Blender 2.80. You probably want to edit that one. see EEVEE topic. Typing on mobile


#3

I guess @denhorn is right actually. The @serialize is used by both the parse and the serialize function so this change can work

@denhorn: Fancy doing a PR?


#4

I originally got metadata added to material by doing the following:

babylonFileLoader.ts line 88

var loadAssetContainer = function (scene, data, rootUrl, onError, addToScene) {
	...
	
        // Materials
        if (parsedData.materials !== undefined && parsedData.materials !== null) {
            for (index = 0, cache = parsedData.materials.length; index < cache; index++) {
                var parsedMaterial = parsedData.materials[index];
                var mat = BABYLON.Material.Parse(parsedMaterial, scene, rootUrl);
				//!!! added next line <approx.line 77838 in babylon.3.3.0.js>
				mat.metadata = parsedMaterial.metadata;
                container.materials.push(mat);
                log += (index === 0 ? "\n\tMaterials:" : "");
                log += "\n\t\t" + mat.toString(fullDetails);
            }
        }

It worked, but it didn’t seem to be the best solution. I found that parsing was failing in decorators.ts getMergedStore. By adding @serialize () to material metadata seemed to be a better solution. I would consider doing a pull request, but I am currently not set up to do that.


#5

Anybody else in the community fancy doing the PR ?

I am proposing as it is a simple one and could be a good one for new contributors :slight_smile: