ScriptSpot

Forum topic · General Scripting

How to differenciate bump map / normal map in the bump slot

By Rodman · 2012-09-07

Downloads
Description

Hello everyone,

I am trying to convert a vray material into a standard material, and I have a problem to write this algorithm in MAXScript :

if (the bump map slot is not empty) do
(if (the slot contains a normal map) do (normal map goes to bump slot of the standard material)
else (bump map goes to bump slot of the standard material))

Probably I'm wrong, but the problem is that i don't know how to differentiate the 3 possible choices.

This is my actual code which is wrong :



for o in geometry do 
(
if classof o.material == VRayMtl do 
	(
		newmtl = Standardmaterial ()	
		if (o.material.texmap_bump != undefined) do
		(
			if o.material.texmap_bump.normal_map.filename != undefined then
			(
				newmtl.bumpMap.FileName =  o.material.texmap_bump.normal_map.filename
				newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
			)
			else
			(
				newmtl.bumpMap.FileName = o.material.texmap_bump.filename
				newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
				)
			)
		o.material = newmtl		
	)
)

Thank you.

Comments (10)

I found the real problem.Do

Rodman · 2012-09-08

I found the real problem.

Do you know how to test if inside the Normal Map there is a map ?

Your script doesn't contain this case.
In your script, even if you remove or not the line "obj.material.texmap_bump.normal_map.filename != undefined", the VrayNormalMap won't be converted to Normal Map with a material with a Normal Map with no map inside.

In my script if I add the line "o.material.texmap_bump.normal_map.filename != undefined" as a condition, and if I have just a bump map in my material, I will have this error "Unknown property: "filename" in undefined".

I will be grateful if you can solve this problem.


if (isKindOf o.material.texmap_bump Bitmaptex) or (isKindOf o.material.texmap_bump Normal_Bump) do
(
	if (classof o.material.texmap_bump == Normal_Bump) then
	(
	newmtl.bumpMap.FileName =  o.material.texmap_bump.normal_map.filename
	newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
	)
	else
	(
	newmtl.bumpMap.FileName = o.material.texmap_bump.filename
	newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
	)
)

barigazy · 2012-09-08

if you want to test if "NormalBump" have "mormal_map" use this


if isKindOf (o.material.bumpMap) Normal_Bump do
(
	local nmap = o.material.bumpMap
	if nmap.normal_map != undefined then "Have Map" else "Don't Have Map "
)

For your code not need to twice check NormalMap, try this

nMap = o.material.texmap_bump
if nMap != undefined and (isKindOf nMap Bitmaptex or isKindOf nMapNormal_Bump) do
(
newmtl.bumpMap = nMap.normal_map
newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
)

Rodman · 2012-09-09

Thank you ! I've used both of your codes to integrate it with mine. I understand how it works now.

barigazy · 2012-09-09

fine.now you can continue with the rest of script.
cheers!

Rodman · 2012-09-11

I have a new problem.

I want to add the case where the bump map slot contains a checker (for example)

First I transform the checker into a Bitmap inside a path name ThePath
But after this I cant insert this Bitmap inside the new bump slot of my Standardmaterial

I have this :


for o in geometry do 
(
if classof o.material == VRayMtl do 
	(

		newmtl = Standardmaterial ()
		newmtl.diffuse = o.material.diffuse
			
		if o.material.texmap_bump != undefined do
		(
			if isKindOf o.material.texmap_bump Checker then
			(
				fileNameImg = (
					getFilenamePath ThePath + \
					getFilenameFile ThePath + \
					getFilenameType ThePath
					)
					
				rm = renderMap o.material.texmap_refraction \ 
				size:[1024,1024] \
				fileName:fileNameImg \
				filter:true \
				save rm
				close rm
						
				o.material.texmap_bump = Bitmaptexture fileName:fileNameImg	
						
				newmtl.bumpMap.FileName = o.material.texmap_bump.filename
				newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
			)
			else
			(
				newmtl.bumpMap.FileName = o.material.texmap_bump.filename
				newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
			)
		)
	
		o.material = newmtl		
	)
)

And this error : Unknown property: "filename" in undefined

I don't know how to say that o.material.texmap_bump is not checker but Bitmap.

I need your help.

This is your code

barigazy · 2012-09-11

Don't use any more ".FileName" property to assigne bitmap.
You have more then this problem in your code.
Compare my code and your and you;ll see what i mean.

for o in geometry where not isKindOf o targetObject and classof o.material == VRayMtl do
(
newmtl = Standardmaterial diffuseMap:(o.material.texmap_diffuse)
if o.material.texmap_bump != undefined do
(
if not (isKindOf o.material.texmap_bump Bitmaptexture) then
(
-- add your path (this is only for testing)
fileNameImg = @"C:\temp\testMap.jpg"

rm = renderMap o.material.texmap_bump \
size:[1024,1024] \
fileName:fileNameImg \
filter:true \
save rm
close rm

o.material.texmap_bump = Bitmaptexture bitmap:rm

newmtl.bumpMap = o.material.texmap_bump
newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
)
else
(
newmtl.bumpMap = o.material.texmap_bump
newmtl.bumpMapAmount = o.material.texmap_bump_multiplier
)
)
o.material = newmtl
)

Rodman · 2012-09-11

Thank you very much.

What does it mean this : "where not isKindOf o targetObject" ?

barigazy · 2012-09-11

Means that target objects (camera, light target etc.) are
also geometry objects and should be isolated from for-loop
try this to see from yourself

a=targetobject()
superclassof a
--GeometryClass

Rodman · 2012-09-07

I saw it. But I didn't find any clue in it.