Notifications
Clear all

[Closed] How to get all the parameters of a material?

Hello,

I am trying to output materials from 3dsmax and noticed that it is not easy.

First of all, if I execute maxscript command

showProperties $Box001.material

and Standard material is assigned to Box001 object, I will receive a list of ALL parameters of Standard material. How can I get the same list using 3dsmax SDK?

OK, there is Animatable, IParamBlock and IParamBlock2 classes but list of parameters received with these classes is not full. To output parameters I used following code:


void LogParamBlockProp(IParamBlock *pblock, int shift)
{
	LogOutput("This is a ParamBlock with parameters:", shift);
	LogOutput("{", shift);

	int numParam = pblock->NumParams();
	for(int i=0;i<numParam;i++)
	{
		const char* type;
		switch(pblock->GetParameterType(i))
		{
			case TYPE_FLOAT:
				type = "type_float";
				break;
			case TYPE_INT:
				type = "type_int";
				break;
			case TYPE_BOOL:
				type = "type_bool";
				break;
			case TYPE_POINT3:
				type = "type_point3";
				break;
			case TYPE_RGBA:
				type = "type_rgba";
				break;
			default:
				type = "Unknown";
				break;
		}

		{
			char buffer[STRING_BUFFER_SIZE];
			sprintf_s(
					buffer,
					"Parameter %d: %s",
					i,
					type);
			LogOutput(buffer, shift+1);
		}

	}
	LogOutput("}", shift);
}

void LogParamBlockProp(IParamBlock2 *pblock, int shift)
{
	ParamBlockDesc2 *desc = pblock->GetDesc();

	LogOutput("This is a IParamBlock2 with parameters:", shift);
	LogOutput("{", shift);

	int numParam = desc->Count();
	for(int i=0;i<numParam;i++)
	{
		const char* type;
		switch(desc->paramdefs[i].type)
		{
			case TYPE_FLOAT:
				type = "type_float";
				break;
			case TYPE_WORLD:
				type = "type_world";
				break;
			case TYPE_INT:
				type = "type_int";
				break;
			case TYPE_BOOL:
				type = "type_bool";
				break;
			case TYPE_POINT3:
				type = "type_point3";
				break;
			case TYPE_COLOR:
				type = "type_color";
				break;
			case TYPE_RGBA:
				type = "type_rgba";
				break;
			case TYPE_PCNT_FRAC:
				type = "type_pcnt_frac";
				break;
			case TYPE_BITMAP:
				type = "type_bitmap";
				break;
			case TYPE_FRGBA:
				type = "type_frgba";
				break;
			case TYPE_TEXMAP:
				type = "type_texmap";
				break;
			default:
				type = "Unknown";
				break;
		}

		{
			char buffer[STRING_BUFFER_SIZE];
			sprintf_s(
					buffer,
					"Parameter %d: %s %s",
					desc->paramdefs[i].ID,
					desc->paramdefs[i].int_name,
					type);
			LogOutput(buffer, shift+1);
		}


	}
	LogOutput("}", shift);
}

void LogObjectProp(Animatable *sub, int shift) 
{
	if( sub->IsSubClassOf(PARAMBLOCK2CLASSID) )
	{
		LogParamBlockProp((IParamBlock2 *)sub, shift);
	}

	if( sub->IsSubClassOf(PARAMBLOCKCLASSID) )
	{
		LogParamBlockProp((IParamBlock *)sub, shift);
	}

	int numSubs = sub->NumSubs();

	if(numSubs == 0)
	{
		return;
	}

	{
		char buffer[STRING_BUFFER_SIZE];
		sprintf_s(
				buffer,
				"This Animatable contains %d subanimatabless:",
				numSubs );
		LogOutput(buffer, shift);
	}

	LogOutput("{", shift);

	Animatable *subsub;

	for(int i=0;i<numSubs;i++)
	{
		{
			char buffer[STRING_BUFFER_SIZE];
			sprintf_s(
					buffer,
					"%d) Name: %s",
					i,
					sub->SubAnimName(i) );
			LogOutput(buffer, shift+1);
		}

		subsub = sub->SubAnim(i);
		if(subsub)
		{
			showObjectProp(subsub, shift+1);
		}
	}

	LogOutput("}", shift);
}

This code produces following output:


Standard material "Material #25" handleID:5042
This Animatable contains 5 subanimatabless:
{
	0) Name: Maps
	This Animatable contains 48 subanimatabless:
	{
		0) Name: Ambient Color Amount
		1) Name: Ambient Color: None
		2) Name: Diffuse Color Amount
		3) Name: Diffuse Color: None
		4) Name: Specular Color Amount
		5) Name: Specular Color: None
		6) Name: Specular Level Amount
		7) Name: Specular Level: None
		8) Name: Glossiness Amount
		9) Name: Glossiness: None
		10) Name: Self-Illumination Amount
		11) Name: Self-Illumination: None
		12) Name: Opacity Amount
		13) Name: Opacity: None
		14) Name: Filter Color Amount
		15) Name: Filter Color: None
		16) Name: Bump Amount
		17) Name: Bump: None
		18) Name: Reflection Amount
		19) Name: Reflection: None
		20) Name: Refraction Amount
		21) Name: Refraction: None
		22) Name: Displacement Amount
		23) Name: Displacement: None
		24) Name:  Amount
		25) Name: : None
		26) Name: RGB Level Amount
		27) Name: : None
		28) Name: RGB Offset Amount
		29) Name: : None
		30) Name: RGB Level Amount
		31) Name: : None
		32) Name: RGB Level Amount
		33) Name: : None
		34) Name: RGB Level Amount
		35) Name: : None
		36) Name: RGB Offset Amount
		37) Name: : None
		38) Name: RGB Level Amount
		39) Name: : None
		40) Name: RGB Offset Amount
		41) Name: : None
		42) Name:  Amount
		43) Name: : None
		44) Name:  Amount
		45) Name: : None
		46) Name:  Amount
		47) Name: : None
	}
	1) Name: Shader Basic Parameters
	This Animatable contains 1 subanimatabless:
	{
		0) Name: Parameters
		This is a IParamBlock2 with parameters:
		{
			Parameter 0: ambient type_rgba
			Parameter 1: diffuse type_rgba
			Parameter 2: specular type_rgba
			Parameter 3: adTextureLock type_bool
			Parameter 4: adLock type_bool
			Parameter 5: dsLock type_bool
			Parameter 6: useSelfIllumColor type_bool
			Parameter 7: selfIllumAmount type_pcnt_frac
			Parameter 8: selfIllumColor type_rgba
			Parameter 9: specularLevel type_pcnt_frac
			Parameter 10: glossiness type_pcnt_frac
			Parameter 11: soften type_float
		}
		This Animatable contains 8 subanimatabless:
		{
			0) Name: Ambient Color
			1) Name: Diffuse Color
			2) Name: Specular Color
			3) Name: Self-Illumination
			4) Name: Self-Illum Color
			5) Name: Specular Level
			6) Name: Glossiness
			7) Name: Soften
		}
	}
	2) Name: Extended Parameters
	This is a IParamBlock2 with parameters:
	{
		Parameter 0: opacityType type_int
		Parameter 1: opacity type_pcnt_frac
		Parameter 2: filterColor type_rgba
		Parameter 3: filterMap type_texmap
		Parameter 4: opacityFallOffType type_int
		Parameter 5: opacityFallOff type_pcnt_frac
		Parameter 6: ior type_float
		Parameter 7: wireSize type_float
		Parameter 8: wireUnits type_int
		Parameter 9: applyReflectionDimming type_bool
		Parameter 10: dimLevel type_float
		Parameter 11: reflectionLevel type_float
	}
	This Animatable contains 7 subanimatabless:
	{
		0) Name: Opacity
		1) Name: Filter Color
		2) Name: Falloff
		3) Name: Index of Refraction
		4) Name: Wire Size
		5) Name: Dim Level
		6) Name: Reflection Level
	}
	3) Name: SuperSampling
	This is a IParamBlock2 with parameters:
	{
		Parameter 0: sampler type_int
		Parameter 1: samplerQuality type_float
		Parameter 2: samplerEnable type_bool
		Parameter 4: samplerAdaptThreshold type_float
		Parameter 3: samplerAdaptOn type_bool
		Parameter 6: subSampleTextureOn type_bool
		Parameter 5: samplerAdvancedOptions type_bool
		Parameter 7: samplerByName Unknown
		Parameter 8: UserParam0 type_float
		Parameter 9: UserParam1 type_float
		Parameter 10: samplerUseGlobal type_bool
	}
	This Animatable contains 2 subanimatabless:
	{
		0) Name: Sampler Quality
		1) Name: Sampler Enable
	}
	4) Name: Dynamics Properties
	This is a IParamBlock2 with parameters:
	{
		Parameter 0: bounce type_float
		Parameter 1: staticFriction type_float
		Parameter 2: slidingFriction type_float
	}
	This Animatable contains 3 subanimatabless:
	{
		0) Name: Bounce Coefficient
		1) Name: Static Friction
		2) Name: Sliding Friction
	}
}

but showProperties produced output with other parameters and number of parameters in this case much biggest than with Animatable, IParamBlock and IParamBlock2 way:


  .shaderType (Shader_Type) : integer
  .wire : boolean
  .twoSided (Two_sided) : boolean
  .faceMap (Face_Map) : boolean
  .faceted : boolean
  .shaderByName (Shader_Name) : string
  .opacityType (Opacity_Type) : integer
  .opacity : percent
  .filterColor (Filter_Color) : RGB color
  .filterMap (Filter_Map) : texturemap
  .opacityFallOffType (Falloff_Type) : integer
  .opacityFallOff (Falloff) : percent
  .ior (Index_of_Refraction) : float
  .wireSize (Wire_Size) : float
  .wireUnits (Wire_Units) : integer
  .applyReflectionDimming (Apply_Reflection_Dimming) : boolean
  .dimLevel (Dim_Level) : float
  .reflectionLevel (Reflection_Level) : float
  .sampler (Pixel_Sampler) : integer
  .samplerQuality (Sampler_Quality) : float
  .samplerEnable (Sampler_Enable) : boolean
  .samplerAdaptThreshold (Adaptive_Threshold) : float
  .samplerAdaptOn (Adaptive_On) : boolean
  .subSampleTextureOn (SubSample_Textures) : boolean
  .samplerAdvancedOptions (Advanced_Options) : boolean
  .samplerByName (Sampler_Name) : string
  .UserParam0 (Optional_Param0) : float
  .UserParam1 (Optional_Param1) : float
  .samplerUseGlobal (Use_Global_Settings) : boolean
  .mapEnables (Map_Enables) : boolean array
  .maps : texturemap array
  .mapAmounts (Map_Amounts) : percent array
  .adTextureLock (Ambient_Diffuse_Texture_Lock) : boolean
  .ambientMap (alias for maps[0])
  .ambientMapAmount (alias for mapAmounts[0])
  .ambientMapEnable (alias for mapEnables[0])
  .bumpMap (alias for maps[8])
  .bumpMapAmount (alias for mapAmounts[8])
  .bumpMapEnable (alias for mapEnables[8])
  .diffuseMap (alias for maps[1])
  .diffuseMapAmount (alias for mapAmounts[1])
  .diffuseMapEnable (alias for mapEnables[1])
  .displacementMap (alias for maps[11])
  .displacementMapAmount (alias for mapAmounts[11])
  .displacementMapEnable (alias for mapEnables[11])
  .filterMap (alias for maps[7])
  .filterMapAmount (alias for mapAmounts[7])
  .filterMapEnable (alias for mapEnables[7])
  .glossinessMap (alias for maps[4])
  .glossinessMapAmount (alias for mapAmounts[4])
  .glossinessMapEnable (alias for mapEnables[4])
  .opacityMap (alias for maps[6])
  .opacityMapAmount (alias for mapAmounts[6])
  .opacityMapEnable (alias for mapEnables[6])
  .reflectionMap (alias for maps[9])
  .reflectionMapAmount (alias for mapAmounts[9])
  .reflectionMapEnable (alias for mapEnables[9])
  .refractionMap (alias for maps[10])
  .refractionMapAmount (alias for mapAmounts[10])
  .refractionMapEnable (alias for mapEnables[10])
  .selfIllumMap (alias for maps[5])
  .selfIllumMapAmount (alias for mapAmounts[5])
  .selfIllumMapEnable (alias for mapEnables[5])
  .specularLevelMap (alias for maps[3])
  .specularLevelMapAmount (alias for mapAmounts[3])
  .specularLevelMapEnable (alias for mapEnables[3])
  .specularMap (alias for maps[2])
  .specularMapAmount (alias for mapAmounts[2])
  .specularMapEnable (alias for mapEnables[2])
  .noExposureControl : boolean
  .exposureControlInvertSelfIllum : boolean
  .exposureControlInvertReflection : boolean
  .exposureControlInvertRefraction : boolean
  .ambient (Ambient_Color) : RGB color
  .diffuse (Diffuse_Color) : RGB color
  .specular (Specular_Color) : RGB color
  .adTextureLock (Ambient_Diffuse_Texture_Lock) : boolean
  .adLock (Ambient_Diffuse_Lock) : boolean
  .dsLock (Diffuse_Specular_Lock) : boolean
  .useSelfIllumColor (Use_Self_Illum_Color) : boolean
  .selfIllumAmount (Self_Illumination) : percent
  .selfIllumColor (Self_Illum_Color) : RGB color
  .specularLevel (Specular_Level) : percent
  .glossiness : percent
  .soften : float
false

How can I get all the parameters of a material?

13 Replies
for o in (GetPropNames $.material) do
(
Getproperty o $.material
)
1 Reply
(@iandreev)
Joined: 11 months ago

Posts: 0

But this is maxscript. I need to get the same list as showProperties but using 3dsmax SDK on C++

can’t you get this info directly from from StdMat2, StdMat, Mtl class hierarchy ?

from an INode something like this will get you access

 Mtl* nodeMtl = node->GetMtl ();
  StdMat2* stdMat = dynamic_cast<StdMat2*>(nodeMtl );
 if(stdMat)
 {
 .....
1 Reply
(@iandreev)
Joined: 11 months ago

Posts: 0

I am sorry but no I can’t. Because I need to output not only standard material, I need to output all parameters of any material.

there a property enumeration system , IGameProperty, in the IGame export wrapper you could look at.

1 Reply
(@iandreev)
Joined: 11 months ago

Posts: 0

IGameProperty is a wrapper around the standard 3ds Max ParamBlock and ParamBlock2. I’m already working with ParamBlock and ParamBlock2. You can see the code I listed in the first massage.

The problem that the numbers of parameters I received with ParamBlock/ParamBlock2 system is much less than I received with showProperties. Where can I find ALL the parameters?

looks to me as if you are not sending the right/complete paramblock to your enumerator`or the enumerator is getting all the params.

one of the ParamBlockDesc2 for stdmtl2

static ParamBlockDesc2 std2_shader_blk ( 
  										std2_shader, _T("shaderParameters"),  0, &stdmtl2CD, P_AUTO_CONSTRUCT + P_AUTO_UI, SHADER_PB_REF, 
  
  										//rollout
  										IDD_DMTL_SHADER4, IDS_KE_SHADER, 0, 0, &shaderDlgProc, 
  
  										// params
  										std2_shader_type, _T("shaderType"), TYPE_INT, 				0, 		IDS_JW_SHADERTYPE, 	
  										p_default, 		3, 
  										p_ui, 			TYPE_INTLISTBOX, IDC_SHADER, 0,
  										p_accessor,		&shaderPBAccessor,
  										end, 
  										std2_wire, 		_T("wire"), 		TYPE_BOOL, 				0, 		IDS_DS_WIREFRAME, 	
  										p_default, 		FALSE, 
  										p_ui, 			TYPE_SINGLECHEKBOX, IDC_WIRE, 
  										p_accessor,		&shaderPBAccessor,
  										end, 
  										std2_two_sided, 	_T("twoSided"), TYPE_BOOL, 				0, 		IDS_JW_TWOSIDED, 	
  										p_default, 		FALSE, 
  										p_ui, 			TYPE_SINGLECHEKBOX, IDC_2SIDE, 
  										p_accessor,		&shaderPBAccessor,
  										end, 
  										std2_face_map, 	_T("faceMap"), 		TYPE_BOOL, 				0, 		IDS_JW_FACEMAP, 	
  										p_default, 		FALSE, 
  										p_ui, 			TYPE_SINGLECHEKBOX, IDC_FACE_MAP, 
  										p_accessor,		&shaderPBAccessor,
  										end, 
  										std2_faceted, 		_T("faceted"), 		TYPE_BOOL, 			0, 		IDS_KE_FACETED, 	
  										p_default, 		FALSE, 
  										p_ui, 			TYPE_SINGLECHEKBOX, IDC_FACETED, 
  										p_accessor,		&shaderPBAccessor,
  										end,
  										std2_shader_by_name, _T("shaderByName"), TYPE_STRING, 		0, 		IDS_JW_SHADERBYNAME, 	
  										p_accessor,		&shaderPBAccessor,
  										end,
  										end
  										);

seems to contain params not in your sdk output (from stdmtl2.cpp in maxsdk\samples\materials

Yes, I has seen stdmtl2.cpp. And I’ve got all the parameters that are in stdmtl.cpp. But there are the last 16 parameters of showProperties output of Standard material:


  .noExposureControl : boolean
  .exposureControlInvertSelfIllum : boolean
  .exposureControlInvertReflection : boolean
  .exposureControlInvertRefraction : boolean
  .ambient (Ambient_Color) : RGB color
  .diffuse (Diffuse_Color) : RGB color
  .specular (Specular_Color) : RGB color
  .adTextureLock (Ambient_Diffuse_Texture_Lock) : boolean
  .adLock (Ambient_Diffuse_Lock) : boolean
  .dsLock (Diffuse_Specular_Lock) : boolean
  .useSelfIllumColor (Use_Self_Illum_Color) : boolean
  .selfIllumAmount (Self_Illumination) : percent
  .selfIllumColor (Self_Illum_Color) : RGB color
  .specularLevel (Specular_Level) : percent
  .glossiness : percent
  .soften : float

What is it? I tried to search any of these parameters in stdmtl2.cpp and there is no text coincidence. It seems to me these parameters are parameters of Shader *pShader; (string 191 of stdmtl2.h) But pShader belongs only to class StdMtl2. How to get pShader using max SDK from a Mtl object? Or how to get ALL of these parameters?

In Standard material, each “Shader” such as Blinn/Phong/Anisotropic is a seperate plugin.

OK, I found it.
It is possible to get all the parameters with ReferenceMaker::GetReference() method.

2 Replies
(@denist)
Joined: 11 months ago

Posts: 0

however, if you asked a question on this forum but got an answer yourself, please show your solution. thanx

(@iandreev)
Joined: 11 months ago

Posts: 0

Actually ReferenceMaker::GetReference() is the solution. The following code will output all the parameters of the material.


void LogParamBlockProp(IParamBlock *pblock, int shift)
{
	LogOutput("This is a ParamBlock with parameters:", shift);
	LogOutput("{", shift);

	int numParam = pblock->NumParams();
	for(int i=0;i<numParam;i++)
	{
		const char* type;
		switch(pblock->GetParameterType(i))
		{
			case TYPE_FLOAT:
				type = "type_float";
				break;
			case TYPE_INT:
				type = "type_int";
				break;
			case TYPE_BOOL:
				type = "type_bool";
				break;
			case TYPE_POINT3:
				type = "type_point3";
				break;
			case TYPE_RGBA:
				type = "type_rgba";
				break;
			default:
				type = "Unknown";
				break;
		}

		{
			char buffer[STRING_BUFFER_SIZE];
			sprintf_s(
					buffer,
					"Parameter %d: %s",
					i,
					type);
			LogOutput(buffer, shift+1);
		}

	}
	LogOutput("}", shift);
}

void LogParamBlockProp(IParamBlock2 *pblock, int shift)
{
	ParamBlockDesc2 *desc = pblock->GetDesc();

	LogOutput("This is a IParamBlock2 with parameters:", shift);
	LogOutput("{", shift);

	int numParam = desc->Count();
	for(int i=0;i<numParam;i++)
	{
		const char* type;
		switch(desc->paramdefs[i].type)
		{
			case TYPE_FLOAT:
				type = "type_float";
				break;
			case TYPE_WORLD:
				type = "type_world";
				break;
			case TYPE_INT:
				type = "type_int";
				break;
			case TYPE_BOOL:
				type = "type_bool";
				break;
			case TYPE_POINT3:
				type = "type_point3";
				break;
			case TYPE_COLOR:
				type = "type_color";
				break;
			case TYPE_RGBA:
				type = "type_rgba";
				break;
			case TYPE_PCNT_FRAC:
				type = "type_pcnt_frac";
				break;
			case TYPE_BITMAP:
				type = "type_bitmap";
				break;
			case TYPE_FRGBA:
				type = "type_frgba";
				break;
			case TYPE_TEXMAP:
				type = "type_texmap";
				break;
			default:
				type = "Unknown";
				break;
		}

		{
			char buffer[STRING_BUFFER_SIZE];
			sprintf_s(
					buffer,
					"Parameter %d: %s %s",
					desc->paramdefs[i].ID,
					desc->paramdefs[i].int_name,
					type);
			LogOutput(buffer, shift+1);
		}


	}
	LogOutput("}", shift);
}

void LogMaterialRefs(ReferenceMaker* mtl, int shift)
{
	int nref = mtl->NumRefs();

	{
		char buffer[STRING_BUFFER_SIZE];
		sprintf_s(
				buffer,
				"This Mtl contains %d ReferenceTargets:",
				nref );
		LogOutput(buffer, shift);
	}

	if(nref == 0)
	{
		return;
	}

	LogOutput("{", shift);

	for(int i=0; i<nref; i++)
	{
		ReferenceTarget* ref = mtl->GetReference(i);

		if(!ref)
		{
			LogOutput("NULL", shift+1);
			continue;
		}

		Class_ID classid = ref->ClassID();

		if(classid == PARAMBLOCKCLASSID)
		{
			LogOutput("PARAMBLOCKCLASSID", shift+1);
			LogParamBlockProp((IParamBlock *)ref, shift+1);
		}
		else if ( classid == PARAMBLOCK2CLASSID)
		{
			LogOutput("PARAMBLOCK2CLASSID", shift+1);
			LogParamBlockProp((IParamBlock2 *)ref, shift+1);
		}
		else if ( classid == TEXTUREMAPSCLASSID)
		{
			LogOutput("TEXTUREMAPSCLASSID", shift+1);
			LogMaterialRefs(ref, shift+1);
		}
		else if ( classid == SHADERCLASSID)
		{
			LogOutput("SHADERCLASSID", shift+1);
			LogMaterialRefs(ref, shift+1);
		}
		else if ( classid == SAMPLERCLASSID)
		{
			LogOutput("SAMPLERCLASSID", shift+1);
		}
		else
		{
			char buffer[STRING_BUFFER_SIZE];
			sprintf_s(
					buffer,
					"UNKNOWN Class ID:  0x%x  0x%x",
					classid.PartA(),
					classid.PartB() );
			LogOutput(buffer, shift+1);
		}
	}

	LogOutput("}", shift);

}

thanks a lot!