⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macro_baketextures.mcr

📁 3dmax导出3d模型二次开发插件
💻 MCR
📖 第 1 页 / 共 5 页
字号:
		effect.lightmap_mapping = _obj.bakeChannel
		effect.diffuse_mapping = 1
		-- effect.diffuse_mapping = _obj.bakeChannel
		
		_bakeMtl.diffusemap = undefined 	-- toss old diffuse map

		-- activate the hardware material
		manager.enabled = true
		manager.activateEffect _bakeMtl true
		
		redrawviews() -- why is this here???
		return true
	) -- end, have light & diffuse maps
	
	messageBox( "You must have both a diffuse map and a lighting \n  map to use the LightMap shader." )
	return false -- error exit
)
 
function setupGeneralHWShader _obj _bakeMtl =
(
	manager = getVPManager( _bakeMtl )

	-- find the shader & make it active
	effect = setHWShader( manager )( generalHWShaderName  )
	-- check it
	if (effect == undefined) then
	(
		format "effect undefined\n"
		return false
	)
	
	-- turn off the maps we won't use, to be sure
	effect.BUMP_ON = effect.DETAIL_ON = effect.REFLECTION_ON = false 
	
	-- do the static colors
	effect.COLOR_AMBIENT = _bakeMtl.ambient
	effect.COLOR_DIFFUSE = _bakeMtl.diffuse
	effect.COLOR_SPECULAR = _bakeMtl.specular
	effect.SPIN_ALPHA = _bakeMtl.opacity / 100.0
	effect.SPIN_TEXSCALE = 0.0

	--	diffuse map first
	if ( (nEle = findByClass (_obj)("DiffuseMap")) > 0 ) then
	(
		element = _obj.GetBakeElement( nEle )
		fname = validateFileName( element )( element.fileType )
		effect.DIFFUSE = openBitmap( fname )
		effect.DIFFUSE_ON = true
		effect.MAP_DIFFUSE1 = _obj.bakeChannel
		--format "set diffuse map = % \n" (effect.DIFFUSE)
	) else (
		effect.DIFFUSE_ON = false
	)
	
	--	then specular
	if ( (nEle = findByClass (_obj)("SpecularMap")) > 0 ) then
	(
		element = _obj.GetBakeElement( nEle )
		fname = validateFileName( element )( element.fileType )
		effect.MASK = openBitmap( fname )
		effect.SPECULAR_ON = true
		effect.MAP_SPECULAR = _obj.bakeChannel
		--format "set specular map = % \n" (effect.SPECULAR )
	) else (
		effect.SPECULAR_ON = false
	)
	
	--	then normals
	if ( (nEle = findByClass (_obj)("NormalsMap")) > 0 ) then
	(
		element = _obj.GetBakeElement( nEle )
		fname = validateFileName( element )( element.fileType )
		effect.NORMAL = openBitmap( fname )
		effect.NORMAL_ON = true
		effect.MAP_BUMP = _obj.bakeChannel
		effect.SPIN_BUMPSCALE = 1000.0	-- what's the right value here? 1000 - 3000
		--format "set normal map = % \n" (effect.NORMAL )
	) else (
		effect.NORMAL_ON = false
	)
	
	_bakeMtl.diffusemap = undefined 	-- toss old diffuse map
	-- activate the hardware material 	manager.enabled = true
	manager.activateEffect _bakeMtl true
	
	redrawviews() 
)


------------------------------------------------------------------
--
--	Function to update the output material & create shells if needed
--
function updateMaterial   _obj =
(
	format "    update material on % \n" _obj.name
	
	materialType = (classof _obj.material as string)
--	format "Material Type:	% \n" materialType

	-- if the material is already a shell material, update only the result material
	if (materialType != "Shell_Material") then
	(
		-- Make a new shell material and set it up
		 origMaterial = _obj.material
		if origMaterial == undefined then
		(	-- it's a dummy material, make a real one
			origMaterial = standard()
			origMaterial.diffuse = _obj.wireColor
		)
		newMaterial = Shell_material()
		nm = newMaterial.name
		newMaterial.name = _obj.name + "_" + nm
		newMaterial.originalMaterial = origMaterial
		
		undo on (
		_obj.material = newMaterial
		-- format "        create shell material, orig: %  type: % \n" (origMaterial as string)(materialType)
		)		
		-- standard material
		_obj.material.bakedMaterial = standard()
		_obj.material.bakedMaterial.name = "baked_" + origMaterial.name
	
	) -- end, create shell material
	
	-- now update the baked material
	bakeMaterial = _obj.material.bakedMaterial

	-- setup the material according to the selected output shader/mapping....
	case of
	(
		(commonBakeProps.dUseShader.selection == 1):
		(	
			-- default
			activateHWShader( bakeMaterial )( false )
			applyDefaultFileMapping( _obj )( bakeMaterial )
			-- show the texture in the vp?
			if ( _obj.material != undefined) \
				and (bakeMaterial!=undefined) \
				and (bakeMaterial.diffusemap != undefined) then
			(	
				ShowTextureMap 	_obj.material \
					bakeMaterial.diffusemap \
					commonBakeProps.cBakedInVP.checked
			)				
		)
		
		(useHWShader == 0) : 
		(
			-- stdmtl + file mapping
			activateHWShader( bakeMaterial )( false )
			applyIniFileMtlMapping( _obj )( bakeMaterial )
			-- show the texture in the vp?
			if ( _obj.material != undefined) \
				and (bakeMaterial!=undefined) \
				and (bakeMaterial.diffusemap != undefined) then
			(	
				format "show texture map\n"
				ShowTextureMap 	_obj.material \
					bakeMaterial.diffusemap \
					commonBakeProps.cBakedInVP.checked
				format "end show texture map\n"
			)				
		)
		
		(useHWShader > 0) : 
		(
			-- hw shaders 
			if hwShaders[ useHWShader ] == lightMapHWShaderName  then
				setupLightMapShader( _obj )( bakeMaterial )
			else if hwShaders[ useHWShader ] == generalHWShaderName  then
				setupGeneralHWShader( _obj )( bakeMaterial )
				
			-- extend w/ custom shaders here......
			-- else if hwShaders[ useHWShader ] == myHWShaderName  then
			-- 		setupMyHWShader( _obj )( bakeMaterial )
				
			--else
			--	messageBox "Unknown shader = %, index = % \n" ( hwShaders[ useHWShader ] )( useHWShader )
			
		)
	)-- end, case
	
	-- which material do we use for the viewport
	_obj.material.viewportMtlIndex = if( commonBakeProps.cBakedInVP.checked ) then 1 else 0
	
	format "end update material\n"
					
) -- end, update material

----------------------------------------------------------------------------
--
-- these routines collect the file names for a frame & then spplys them
-- prior to material updating
--
fn collectUpdateFiles _obj =
(
	--format "on object: % \n" (_obj as string)
	for i = 1 to _obj.numBakeElements() do
	(
		-- get the element
		ele = _obj.getBakeElement( i )	
		
		-- save the file name,
		updateFileNames[ i ] = ele.fileType
--		format "	save filename = %\n" ele.fileType
	)
)

-- apply collected filenames to object elements
fn applyUpdateFiles _obj =
(
	--format "restore files on object: % \n" (_obj as string)
	for i = 1 to _obj.numBakeElements() do
	(
		-- get the element
		ele = _obj.getBakeElement( i )	
		
		-- restore the file name,
		if updateFileNames[ i ] != undefined then
			ele.fileType = updateFileNames[ i ] 
	
--		format "	restore filename = %\n" ele.fileType
	)
)

-----------------------------------------------------------------------------
--
--	these functions remove the flatteners, shell & baked materials from a scene
--	reattaching the original materials to the nodes
--
function removeFlatteners  =
(
	local theSelected = if (commonBakeProps.rSceneType.state) == 1 then 
					(selection as array)
				-- bake all
				else if (commonBakeProps.rSceneType.state) == 2 then 
					(geometry as array)

	--format "remove flatteners\n"
	for curObj in theSelected do
	(
		if( objectIsBakable( curObj ) == false ) then
		(
				--format "ignoring object: % \n" (classof curObj as string)
				continue
		)
		
		deleteAutoFlatten( curObj )

	) -- end, for each object
)

						
function removeBakeMaterials  =
(
	--format "remove bake materials\n"
	local theSelected = if (commonBakeProps.rSceneType.state) == 1 then 
							(selection as array)
						-- bake all
						else if (commonBakeProps.rSceneType.state) == 2 then 
							(geometry as array)

	for curObj in theSelected do
	(
		deleteBakeMaterial( curObj )
		
	) -- end, for each object
	
) -- end, removeBake materials


----------------------------------------------------------------------------
--
--	Routines to handle file checking
--
-- message box to confirm overwrite of existing files
rollout fileOverwriteBox "File Exists" width:400 height:113
(
	button bCancel "Cancel Render" pos:[202,63] width:92 height:24
	button bOverwriteFiles "Overwrite Files" pos:[99,63] width:87 height:24
	checkbox cNotAgain "Don't show again" pos:[10,90] width:120 height:18 checked:false 
	groupBox gFile "Confirm File Overwrite:" pos:[3,8] width:396 height:50
	edittext eFileName "" pos:[4,27] width:390 height:22 enabled:false

	on fileOverwriteBox open do
	(
		-- format "conflicted filename = %,   val = % \n" overwriteFileName overwriteVal 
		eFilename.text = overwriteFileName 
	)
	
	on bCancel pressed do 
	(
		gTextureBakeOverwriteFilesOk = 0
		destroydialog ( fileOverwriteBox )
	)
	on bOverwriteFiles pressed do
	(
		gTextureBakeOverwriteFilesOk= if cNotAgain.checked then 2 else 1
		destroydialog ( fileOverwriteBox )
	)
	
) -- end, file overwrite dialog


-- returns true if ok to overwrite 
fn okToOverwrite _fileName =
(
	if gTextureBakeOverwriteFilesOk < 2 then -- if 0 or 1 ...
	(
		overwriteFileName = _fileName
		createDialog  fileOverwriteBox  modal:true
	)		
	return( gTextureBakeOverwriteFilesOk > 0 )
)

-- resets the "don't ask again" flag
fn resetFileOverwrite = ( 
	gTextureBakeOverwriteFilesOk = 0 
)

-- function to see if files already exist, then check if ok to over write it.
function checkFileOverwrite _obj =
(
	for i = 1 to _obj.numBakeElements() do
	(
		-- get the element
		ele = _obj.getBakeElement( i )	
		
		-- see if the file exists
		if (getFiles( ele.fileType )).count > 0 then
		(
			--format "file exists: % \n" (ele.fileType)
			-- it exists, what do we do?
			if okToOverwrite( ele.fileType ) then
			(
				--format "ok to overwrite file\n"
				-- deleteFile( ele.fileType ) -- delete so we can check for cancel
			) else (
				--format "cancel\n"
				return false -- cancel render
			)
				
		) -- end, file exists
	) -- end, for each element
	
	return true
)



-----------------------------------------------------------------------------------------
--
--	these functions parse a frame number/range string into individual sequences
--

-- this is the actual string parser
function parseFrameString _str _strPos =
	(
		n = _strPos
		start = end = undefined
		numStr = ""
	
		--format "parse frame string = %, pos = % \n" _str _strPos
		
		numEnd = false
		-- parse into tokens separated by commas, they will have one or two numbers and a dash
		while n <= _str.count and _str[n] != "," do
		(
			if _str[n] == "-" then
			(
				if start != undefined then 
				(
					messageBox "Incorrect range in frame string"
					return 0
				)
				else
				(
					start = if numStr.count > 0 then (numStr as integer) else -1 -- set first number
					-- format "found range mark, s = % n = % ...\n" numStr start
					numStr = "" -- reset string to look for second number
					numEnd = false
				)
	 		)
			else if _str[n] >= "0" and _str[n] <= "9" then
			(
				if numEnd then (
					messageBox "Missing comma in frame string"
					return 0
				) else (
					numStr += _str[n]	-- add digit to string
					-- format "numString = % \n" numStr
				)
				
			) else if ( _str[n] == " " ) then	-- spaces are ok, but end numbers
				if numStr.count > 0 then numEnd = true
				
			else if ( _str[n] as integer ) != 0 then
			(
				--format "char is % = %\n" _str[n] (_str[n] as integer)
				messageBox( "Illegal character in frame string = " + _str[n] )
				return 0
			)
				 
			n += 1 -- increment the string parse position
		)
		-- comma or end of string, convert last number
		if numStr.count > 0 then end = (numStr as integer) 
		
		
		if start != undefined and end != undefined then (
			-- sequence
			if start < end then
			(
				sequenceStart = start
				sequenceEnd = end
			) else (
				sequenceStart = end
				sequenceEnd = start
			)
			return n+1
	  	) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -