Ultra-slow script exit...

I've got a fairly basic script (I can throw it here on demand) - I gather all of the materials in the scene with a specific prefix, confirm their sub-maps are of a specific type (via classof) - and then edit simple flags (visible, etc) - for them.

I added timestamping, and the code itself runs _fast_ - we're only talking a dozen or so simple materials. However right before it ends, it takes 30+ seconds to clear the final function. If I do _all_ of the code _except_ editing a map (I just comment out only the X=Y code) - it runs super fast, exits right away.

Does this raise a flag with anyone? Is there some specific dumb thing I may need to look for? I feel like the fact that the delay is only when an object is changed, that it's related to instancing or some sort of dirty-data cache... but the scene in terms of materials is not that complex - and 30 seconds is a _ton_ of time for a modern machine to do work...

Any and all thoughts would be appreciated...

fn matGather &mat &mats =
(
	if ((findstring mat.name "MAT[") == 1) then
	(
		appendIfUnique mats mat
	)
 
	mats
)
 
fn matGatherMul &mat &mats =
(
	for m in mat.materialList do
	(
		if (classof m == Standardmaterial) then
		(
			matGather &m &mats
		)
	)
)
 
fn matGatherScene &mats =
(
	for m in sceneMaterials do
	(
		if (classof m == Multimaterial) then 
		(
			matGatherMul &m &mats
		)
 
		if (classof m == Standardmaterial) then
		(
			matGather &m &mats
		)
	)
)
 
fn diffGetMap diff =
(
	if (classof diff == Bitmaptexture) then
	(
		diff
	)
	else 
	(
		if (classof diff == CompositeTexturemap) then
		(
			diffGetMap diff.mapList[1]
		) else (
			undefined
		)
	)
)

fn colorApply &cc apply = 
(
	cc.lightnessMode = 1
	cc.enableR = true
	cc.gainR = (apply.r/255)*100
	cc.enableG = true
	cc.gainG = (apply.g/255)*100
	cc.enableB = true
	cc.gainB = (apply.b/255)*100
)
 
fn teamCreate &diffM teamC stripeC =
(
	wantTeam = substitutestring diffM.filename "_DIFF." "_TEAM."
	wantStripe = substitutestring diffM.filename "_DIFF." "_STRP."
	teamM = undefined
	stripeM = undefined
	valid = 1
 
	try ( teamM = BitmapTexture filename:wantTeam ) catch ( valid = 0 )
	try ( stripeM = BitmapTexture filename:wantStripe ) catch ( valid = 0 )
 
	if (valid == 1) then
	(
		holdC = CompositeTexturemap()
		holdC.mapEnabled.count = 3
 
		teamCor = ColorCorrection()
		colorApply teamCor teamC
		teamCor.map = teamM
 
		stripeCor = ColorCorrection()
		colorApply stripeCor stripeC
		stripeCor.map = stripeM
 
		holdC.mapList = #(diffM, teamCor, stripeCor)
		holdC.layerName = #("diff", "team", "stripe")
		holdC
	) else (
		diffM
	)
)
 
fn teamShow &mat show teamC stripeC =
(
	diffC = mat.diffuseMap
	diffM = diffGetMap diffC
 
	if (diffM != undefined) then
	(
		if (classof diffC == BitmapTexture) then
		(
			diffC = teamCreate diffC teamC stripeC
			mat.diffuseMap = diffC
		)
	)
 
	if (classof diffC == CompositeTexturemap) then
	(
		if (diffC.mapList.count == 3) then
		(
			if (diffC.layerName[2] == "team") then
			(
				if (diffC.layerName[3] == "stripe") then
				(
					diffC.mapEnabled[2] = show
					diffC.mapEnabled[3] = show
 
					if (classof diffC.mapList[2] == ColorCorrection) then ( colorApply diffC.mapList[2] teamC )
					if (classof diffC.mapList[3] == ColorCorrection) then ( colorApply diffC.mapList[3] stripeC )
				)
			)
		)
	)
)
 
fn visualizeTeams show teamC stripeC =
(
	matSet = #()
	matGatherScene matSet
 
	for m in matSet do
	(
		teamShow m show teamC stripeC
	)
 
	-- DELAYS RIGHT HERE FOR AGES!!!
 
	matSet = #()
)

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
barigazy's picture

...

I adde one more fn as filter

fn filterCompTex map = (isKindOf map CompositeTexturemap and map.mapList.count == 3 and map.layerName[2] == "team" and map.layerName[3] == "stripe")
fn teamShow mat show teamC stripeC = 
(
	if isKindOf mat.diffuseMap BitmapTex then (mat.diffuseMap = teamCreate mat.diffuseMap teamC stripeC) else 
	(
		if filterCompTex mat.diffuseMap do
		(
			mat.diffuseMap.mapEnabled[2] = mat.diffuseMap.mapEnabled[3] = show
			if isKindOf mat.diffuseMap.mapList[2] ColorCorrection do ( colorApply mat.diffuseMap.mapList[2] teamC )
			if isKindOf mat.diffuseMap.mapList[3] ColorCorrection do ( colorApply mat.diffuseMap.mapList[3] stripeC )
		)
	)
)

bga

barigazy's picture

...

And the last one

fn visualizeTeams show teamC stripeC =
(
	local matSet = matGather patt:"*MAT[*"
	undo off with redraw off
	(
		for m in matSet do (teamShow m show teamC stripeC)
	)
	free matSet ; freeSceneBitmaps()
)

BTW if your material name starts with MAT... then use pattern in this form "MAT[*"

bga

barigazy's picture

...

I hope that this correction until now works faster.
Cheers!

;)

bga

barigazy's picture

...

Your code is too long. I'm sure that this can be shorter and better is you explain
what do you want to achive in brief

bga

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.