How to get all the parameters of a material?

Become a member of the CGSociety

Connect, Share, and Learn with our Large Growing CG Art Community. It's Free!

THREAD CLOSED
 
Thread Tools Search this Thread Display Modes
Old 03 March 2012   #1
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?
 
Old 03 March 2012   #2
for o in (GetPropNames $.material) do
(
Getproperty o $.material
)
__________________
Maxscript Made Easy...
http://davewortley.wordpress.com/
 
Old 03 March 2012   #3
Originally Posted by DaveWortley:
for o in (GetPropNames $.material) do
(
Getproperty o $.material
)


But this is maxscript. I need to get the same list as showProperties but using 3dsmax SDK on C++
 
Old 03 March 2012   #4
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)
 {
 .....

Last edited by Klunk : 03 March 2012 at 11:38 PM.
 
Old 03 March 2012   #5
Originally Posted by claude666: can't you get this info directly from from StdMat2, StdMat, Mtl class hierarchy ?

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.
 
Old 03 March 2012   #6
there a property enumeration system , IGameProperty, in the IGame export wrapper you could look at.
 
Old 03 March 2012   #7
Originally Posted by claude666: there a property enumeration system , IGameProperty, in the IGame export wrapper you could look at.


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?
 
Old 03 March 2012   #8
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

Last edited by Klunk : 03 March 2012 at 04:20 PM.
 
Old 03 March 2012   #9
Originally Posted by claude666: 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

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?
 
Old 03 March 2012   #10
In Standard material, each "Shader" such as Blinn/Phong/Anisotropic is a seperate plugin.
 
Old 03 March 2012   #11
OK, I found it.
It is possible to get all the parameters with ReferenceMaker::GetReference() method.
 
Old 03 March 2012   #12
Originally Posted by iandreev: OK, I found it.
It is possible to get all the parameters with ReferenceMaker::GetReference() method.

however, if you asked a question on this forum but got an answer yourself, please show your solution. thanx
 
Old 03 March 2012   #13
Originally Posted by denisT: however, if you asked a question on this forum but got an answer yourself, please show your solution. thanx


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);

}
 
Old 03 March 2012   #14
thanks a lot!
 
Old 03 March 2012   #15
Thread automatically closed

This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.
__________________
CGTalk Policy/Legalities
Note that as CGTalk Members, you agree to the terms and conditions of using this website.
 
Thread Closed share thread



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
CGSociety
Society of Digital Artists
www.cgsociety.org

Powered by vBulletin
Copyright 2000 - 2006,
Jelsoft Enterprises Ltd.
Minimize Ads
Forum Jump
Miscellaneous

All times are GMT. The time now is 11:23 AM.


Powered by vBulletin
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.