Working on new scripting system.
-
This code does not work with the current version and it may change before release. No ETA but its coming along well.
I have been revamping the scripting system to make it much more flexible and powerful and I finally got the basics in place. Its pretty cool.There is a new scripted field like OnTick and OnTouch except the code that runs in that window is totally different.
What you do is specify what happens when an event like touch or tick occurs. This script is the same as setting OnTick to "@count=0".
setEvent("OnTick"){@count=0}
Meaning every Tick set the variable @count=0
Here is an more complex example that will keep track of how many times an object is touched.
setEvent("onstart"){@count=0} setEvent("ontouch"){@count+=1} setEvent("onend"){puts "#{name} was touched #{@count} times."}
First line says that at the start of the simulation set @count to 0. Unlike the current scrips @count is private to this object. So each object has its own version of @count. @@count would be public and shared among all objects.
setEvent("OnTouch"){@count+=1}
The first time an object touches me increase the count. Note. This event only fires the first time two objects start touching and not every frame like the current OnTouch. There is a new OnTouching event that does that.
setEvent("OnEnd"){puts "#{name} was touched #{@count} times."}
OnEnd is called at when the user ends the simulation. This prints the count in the ruby console. Not a very exciting example but it shows off some of the basics.
Events so far are:
OnStart=Start of simulation
OnEnd=End of sim
OnTick=Same as current OnTick
OnTouch=Two objects start touching
OnUntouch=Two object stop touching
OnTouching=Same as current OnTouch
OnKeyDown=Called once when the user presses a key
OnKeyUp=Called once when the user releases a keyI am planning on adding events for joystick buttons, timers and mouse click and drag.
In the events you can now set most of the objects flags like hidden, nocollision, static, magnetic etc.
#At sim start hide the object setEvent("onstart"){hidden=true} #When an object touches me... setEvent("ontouch"){|toucher| #if the object that touched me is named "box if toucher.name=="box" #unhide and become solid hidden=false nocollision=false end } #unhide group at end of sim setEvent("onend"){hidden=false}
You can copy and push objects and soon and create and connect joints. This code in a "wheel" object it will automatically connect it to the object named "car" with a hinge.
setEvent("onstart"){ car=findBody("car") connectTo(car,"hinge") }
Objects with this code act like they are covered in very sticky fly paper.
setEvent("ontouch"){|toucher| #connect anything that touches me with a #fixed joint connectTo(toucher,"fixed") }
Some other things planned are teleporting and a fancy version of lookat.
Chris
-
SDK maker
-
AWESOME
Can we disconnect joints yet...?
-
It's possible to set the joints' variables with connectTo?
Ad also, this innovations will need a lot of documentations. -
Yes you can disconnect joints. Yes you can edit the joint parameters and yes it will need a lot of documents.
-
Teleporting?!?! I can't wait!
-
Teleporting. I was thinking about that. I was thinking that If I could find the identity %(#808080)[( 0x14758974, i think that kind of a thing. I used
model = Sketchup.active_model
selection = model.selection
UI.messagebox selectionto find it.)] of a group, I might be able to set it's position with a key, with the current version. I don't know though.
-
Teleporting isnt possible in the current version. Even if you set the position of an object the physics engine would just move it back the next frame.
-
Could I make one small request? Could you set SP to run every script in a model once, when it is loaded? This would stop the error messages popping up when I try and edit a script that uses a method or variable, that's set in another script, which itself hasn't been run yet.
-
Due to how they work I cant make it do that with the OnTouch and OnTick fields. But the new scripted field does it. Its a lot better.
-
I got teleport working tonight. Its a lot of fun. I made a car that teleports back to the start if it flips over.
But disconnecting joints is proving to be difficult. If I want to maintain backward compatibility it might be that only certain joints can be disconnected.
-
With the teleportation, will the camera be moved if it's following a teleported object? And could you have a breakable object, which, when broken, teleports back to the starting position with all its joints intact?
I think as long as we can break fixed joints on command it should be alright. Oh, and I just thought of a possible solution to the deletion problem; maybe, while the simulation is running, you create a new, invisible layer. When the script 'deletes' an object, just move it into that layer and set its state to ignore... then just change it back and remove the new layer at the end of each simulation!
-
Yes to the camera. I dont know about the breakable objects.
Next version you should be able to destroy objects.
-
This stuff is great. UM,can I ask when the next version is going to out.
-
Not sure. Everytime I mention a date or a timeframe for a release I wind up missing it.
And speaking of breakable... I worked on something a little different today.
-
Awesome! THAT must have been hard to do
-
Did you split that manually, or was it randomly split at the initiation of the simulation? And if you did figure out the script that splits an object, can you control the breaking force, if possible?
-
I wrote a script that splits an object N times and I call it from the new OnTouch event. So it is "broken" at collide time. Right now it is a totally random shatter rather than splits at the point of contact. But I might be able to make it to a more realistic now that OnTouch now has info about how fast and exactly where bodies collide.
The other problem is the pieces don't inherit the movement of the original object. So that big box drops to the floor, stops on a dime and shatters, and then slowly falls to pieces. I need to figure out how to give the pieces velocity and rotation.
-
Ok, that's REALLY awesome... first, does it split the actual geometry, or the collision mesh? And one important thing would be efficiency; would we be able to set the generated pieces to noCollision, and delete them after a timer? Or better yet, create the biggest pieces normally, but on a deletion timer, and make the smaller pieces noCollision.
And I'm pretty sure it won't, but will it break in response to tension and/or internal stress? For example, putting a heavy weight in direct contact, without dropping it, or hitting it with an extremely powerful magnet.
-
That looks so cool, can't wait. But I have a question is this version going to still be sp3 or is it going to be spIV? Are we going to be able to control how many places the breakable script breaks? Also in the next version will we be able to group joints multiple times?
Advertisement