Notifications
Clear all

[Closed] couple of new tools

hey guys just wanted to let any one who’s intereseted know that i have a couple of tools i’ve been working on, on my web site(www.losart3d.com) available for download. if you guys want to check them out they might be a bit use full.
feel free to send me bugg reports too any of this tools, i have written them mostly at home, so it’s a bit hard to work all the little buggs out.

some of the tools are…

Los advanced bip tools
This is a tool I wrotte to add a couple of extra deformation tools to the biped rigg. the coolest part in my opinon is that it builds upper arm twist and thie twist which biped dosnet have.
[left]it also adds point helpers to avrage the elbows, knees hips, and it does simple neck setup to get avraged rotation from the head.[/left]
[left]Los Advanced Skin Toolz[/left]
Lots of little tools and actions for skinning. plus a more powerfull envelope editor based on Grant’s aswome skining tool. and in the way a maya like painting interface for weights.

[left]Los Spline Ik[/left]
This is a pseudo Spline ik system. it has full twist built into it and it can be scaled in all axies. plus non of the fliping that happens with max’s built in spline ik solution.

Los Power Scrub
this is a simple slider hack to get around the time slider lag bugg cused by riggs with lots of constraints. if you are have to wait more than 2 seconds for the time slider to kick in while scrubing your riggs you might want to use this.

and a few others that i’m to lazy to include

cheers,
Los.


Carlos Anguiano
tech animator rhythm and hues

9 Replies

Lovely work Carlos, your power scrub script works an absolute treat with my skeleton rig, which was giving plenty of grief in the scrubbing department.
However, can I make just a couple of tiny suggestions:
Could the script resize when the modifier panel is resized?
This probably goes against the workings of max’s UI slider feature, but when you click on the slider bar, could the current time go to that frame (like the timeslider does)? Does that make sense?
Ahh, they’re such minor gripes I’d more than understand if you decided that the script was finished.
Anyway, thanks once again. Keep up the great work.
:¬)

1 Reply
(@carlosa)
Joined: 11 months ago

Posts: 0

–updated –
hey Chinwagon,
after a bit of RnD i came up with a new version of the script that doesn’t use the slider, and i wrotte my own custom one. it dosn’t fix your resize problem yet, but it will allow you to skip frames but clicking on different areas of the time slider.

give it a try tell me what you think.
http://www.losart3d.com/scripts/lospwerScrub2.mzp
i had to package it as an mzp becuse i was having some problems turning the new scirpt into a macro.
so to instal this make sure you run the scirpt form the script menu. it won’t work if you just drag in into the viewport.

the macro will be made in the category “LosArt3D” and the tool is just “PowerScrub2”

i wrotte this today in a few hours so let me know what other buggs you find.
o yeah it might be a bit slower to start

cheers,
Los

i totaly agree with Chinwagon, there are a couple of limitation to the slider. sence it is a slider controll it’s almost imposible to fix the skip to click frame issue, sence it’s a bugg of the slider controll.
it’s also really hard to make a call back interface changes.
you could if you wanted… close the slider and run it agein.
it should resize to feet your new viewport. at my last gig one of the guys had the slider running across duel monitors.
i’m sorry i can make this tool better. it was just a hack to get around a problem that discreet has fixed in max 8.
i could maybe change the slider interface to use something else besides a slider??
i wil look into it. thanks for the sugestion.
cheers,
Los.

Really nice work once again Carlos, I’m beginning to prefer your slider to the in-built one, more accurate and easier to work with.
Yeah, I have noticed that it is slower to start up, but I do prefer it to your previous version.
It does have a few niggles when using the trackbar as it displays the timeslider and then the trackbar, but that’s pretty negligible really.
Testing it on a basic scene of 100 frames, the power scrubber is cut off on the right side making a little hard to scrub to the last frame.
Perhaps moving the close button to the left side next to the slider would be better as you would still be able to close it when you resized the modifier panel and the scrubber would line up with the frame numbers above it (and losing the label would add some screen space, but that would be like saying the Mona Lisa would have more space if Michaelangelo took his name off it! ;¬) ).
Finally, it would be great if the power scrubber updated when the scene animation range changed as it would save time reloading it.
Great stuff, keep it up!
:¬)

hey brad what ress are you working at??
i might be able to put in a timer or somthing to check for viewport changes (trackview, and expoert mode). then it could resize automaticaly.
thanks for you input brad…
cheers,
Los.

some one told me my tool useless sence there is a short cut to scrubing the slider in the track view without having the track view open.

maybe this is a better work around to the issue :shrug:

Yeah, the time slider capture toggle (I see Luigi’s been telling you about this. It was me who told him about it). This is what I use instead of the time slider right now (assigned to the hotkey “T” in my case). It works a treat in that it relates your horizontal mouse position to what frame you’re on. However this will mean that it jumps to the relevant frame before letting you smoothly scrub. I – like a few other animators I’ve worked with – like to be able to just grab the slider and scrub to see what’s happening around the frame I’m currently on.
Secondly, I work at a screen res of 1920×1200, which is probably why I’m getting the powerscrub to be a bit offset.
Don’t give up on your script though, I don’t think it’s useless, I think it’s bloody great actually. I think I now prefer it to max’s too chunky time slider.
:¬)

i found the size issue you told me about.
i have to dig in a fix this issue. seem i’m getting some bad calibration issues when i work with larger frame sizes.
i put a new version up on my site seems i over looked a bug that made the slider spass out if the animation range didn’t start at 0(now fixed).
thanks for you help dude, this new slider version might actualy be usefull some day :P.
cheers,
LOs.

cool man, the slider getting cut off, and the calibration seems to be right on point.
i tried it with ranges going from 3 frames to 500 frames.
and it seems to holp up well.
i would apriciate it if you could give it a try and give me some feed back Brad.
cheers,
Los.

Nice one, it’s improving all the time.
I found that if you have a long scene of say, 1000 frames, the script takes a much longer amount of time to open, as it seems to be calculating all of the little ticks in the slider. Maybe the script could abbreviate the number of ticks when it gets above certain frame lengths…
Getting it to check for frame length changes, etc. an update accordingly would be rockin’.
Another (very) minor issue is that to scrub to the first or last frame you have to drag your mouse right over the first/last frame’s box. I think it’d be great if it recognized when you dragged the mouse to the very left or right of the rollout, it would snap to the first or last frame respectively.
I took the liberty of doing a little bit of a UI tweak so that it lines up with the frame numbers above it better (well, at least on my monitor. It might be all wrong on yours), and moved the close button up and to the left.

global pw
 global pwrScVpW
 global pwrScSldW
 global pwrROWidth
 fn powerScrubsetupVars =
 (
 	curLayout = viewPort.getLayout()
 	viewport.setLayout #layout_1
 	vpSize = getviewSize()
 	frNmb = (animationRange.end - animationRange.start) + 1
 	
 	timeSegs = (vpSize.x - 90)/frNmb
 	pwrScSldW = timeSegs * frNmb
 	sizeDif = ((vpSize.x - 30) - pwrScSldW)/2
 	pwrScVpW = pwrScSldW + ((sizeDif + 10) * 2)
 	viewport.setlayout curlayout
 	pwrROWidth = vpSize.x
 )
 powerScrubsetupVars()
 struct powerScrub2
 (
 	ro,
 	mouseDown = false,
 
 	sliderBgBmp,
 	sliderMrkBmp,
 	vpW,
 	slidW,
 	slidH = 20,
 	pixelSeg,
 	ogMrkPos,
 	frNmb = (animationRange.end - animationRange.start) + 1,
 	fn returnXPixel pos =
 	(
 		xpos = pos.x - ogMrkPos.x
 		imgW = ro.timeSliderBg.width
 		if xpos >= 0 and xpos <= imgW then
 		(
 			return xpos
 		)
 	),
 	fn convertXposToTime xpos =
 	(
 		Ofset = pixelSeg/2
 		t = ((xpos )/pixelSeg )
 		return t + animationrange.start
 	),
 	fn getXPosFromTime tm =
 	(
 		x = ogMrkPos[1]
 		return ((pixelSeg * tm) + x)
 	),
 	
 	fn makeBg =
 	(
 		slidW = pwrScSldW
 		f = animationRange.end - animationRange.start
 		pixelSeg = (slidW/(f + 1))
 		bg = bitmap (pixelSeg * (f + 1)) slidH color:(colorman.getcolor #timesliderbg * 200)
 		mrk = bitmap pixelSeg (slidH - 1) color:((colorman.getcolor #timesliderbg * 255) * 1.5)
 
 		for i = 1 to (f + 1) do
 		(
 			xpos = pixelSeg * (i - 1)
 			for b = 1 to slidW do
 			(
 				pix = [xpos,b]
 			setpixels bg pix #(((colorman.getcolor #timesliderbg * 255) * 1.5))
 			)
 		)
 		sliderBgBmp = bg
 		sliderMrkBmp = mrk
 	),
 	fn updateSlider =
 	(
 		t = currentTime - animationrange.start
 		stF = pw.getXPosFromTime t
 		pw.ro.timeSliderMrk.pos.x = stF 
 	),
 
 	fn registerAndDuck =
 	(
 		timeSlider.setvisible false
 		registerTimeCallBack updateSlider
 		cui.registerDialogBar ro style:#(#cui_dock_bottom)
 		cui.dockDialogBar ro #cui_dock_bottom
 	),
 	fn ui = 
 	(
 		rollout ro01 "powerScrub2" width:pwrROWidth
 		(
 		imgTag timeSliderBg "" bitmap:sliderBgBmp enabled:false align:#center offset:[-6,0]
 			imgTag timeSliderMrk "" bitmap:sliderMrkBmp enabled:false offset:[-6,0]
 			button close "X" align:#left offset:[-10,-48]
 			label lb "\"LosPowerScrub_2.1\"" align:#center
 			on ro01 lbuttondown val do
 			(
 				pw.mouseDown = true
 				px = pw.returnXPixel val
 				if px != undefined then
 				(
 					t = pw.convertXposToTime px
 					sliderTime = t 
 					mrkPos = pw.getXPosFromTime t
 					timeSliderMrk.pos.x = mrkPos
 				)
 			)
 			on close pressed do
 			(
 				unregisterTimeCallBack pw.updateSlider
 				cui.floatDialogBar pw.ro
 				cui.unregisterDialogBar pw.ro
 				destroyDialog pw.ro
 				timeSlider.setvisible true
 				pw = undefined
 			)
 			on ro01 lbuttonUp val do
 			(
 				pw.mouseDown = false
 			)
 			on ro01 mousemove val do
 			(
 				if pw.mouseDown == true then
 				(
 					px = pw.returnXPixel val
 					if px != undefined then
 					(
 		 		t = pw.convertXposToTime px
     		    		sliderTime = t 
     		    		pw.updateSlider()
 					)
 				)
 			)
 		)
 		return ro01
 	),
 	fn run =
 	(
 		makeBg()
 		ro = ui()
 		createDialog ro
 		ogMrkPos = ro.timeSliderBg.pos
 		ro.timeSliderMrk.pos = ogMrkPos
 		updateSlider()
 		registerAndDuck()
 	)
 )
 if pw == undefined then
 (
 	pw = powerscrub2()
 	pw.run()
 )

:¬)