📄 macro_baketextures.mcr
字号:
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 + -