Jump to content
Hash, Inc. - Animation:Master

Hacking TSM2


robcat2075

Recommended Posts

  • Hash Fellow

Forward

This material may only be of interest to people who are knowledgeable about rigging and understand what the various constraints do and why they are used. But hopefully they will use this to come up with new things that are useful to the typical user.

 

 

Introduction

 

The core concept of TSM2 is that you place the bare minimum of bones in your character to define the essential joints (admittedly, quite a few in a human) and it will then look at those and use them as landmarks for placing the swarm of intermediary and control bones and various constraints that are needed for a responsive and easy to pose rig. It hides everything you don't need to see and exposes only what you do need to see. It does it quickly and does it automatically. No matter how your character is scaled or postured, the new bones and constraints are adapted to it with no after-the-fact noodling required.

 

That in itself is great since the rig TSM2 installs is an excellent one. The "automatically" thing is extra cool because it's not hard-coded into TSM2. Although undocumented, it's all governed by modifiable components and scripts. If there's a part of the TSM2 rig one wants to operate differently or replace entirely, a clever user can do that.

 

As far as I know, I'm the first clever user to do this and in this thread I'll show what I've found out over the last two months of examining this.

 

 

Rule No. 1

 

Any new scripts and components you make may only replace an existing one with the same name. Anzovin never expected that users would be writing their own scripts; there is no provision to point TSM2 to alternate elements at runtime. So you can't have several named versions of "arm" in a TSM folder. TSM will only look for "arm.txt", not "arm1.txt" or "arm2.txt".

 

If you have extra files in a TSM2 folder TSM2 sometimes gets confused and skips all of them, even the one that was correctly named. Do not confuse TSM2.

 

You'll need to maintain another folder with your various versions with their various names. Rename the version you want to use to a standard TSM file name and copy it over an existing TSM element in a TSM folder.

Link to comment
Share on other sites

  • Replies 84
  • Created
  • Last Reply

Top Posters In This Topic

I've been playing with this - but I can't seem to create a null - I thought the syntax would be similar to:

 

create a bone called "xxx" (ie - create a null called "yyy")

 

perhaps I did something wrong - I also tried: create null

 

I'm wondering if you've got a description of the syntax - or you've had to just play and see what works?

 

Thanks for opening this door - I really like how the different components can be added modularly.

 

 

EDIT: Just occurred to me that perhaps a null has to be part of the component model? and can't be added with the script - I will try

Edited by NancyGormezano
Link to comment
Share on other sites

  • Hash Fellow
I've been playing with this - but I can't seem to create a null -

 

This was going to come later in "Limitations" but... so far, I haven't found a way to create a null. The fact that the TSM2 rig uses no nulls in it is telling.

 

You can still have nulls however. Create bone that would do what your null would do. When you're done rigging you can take your mdl into a text editor and change the bone tags

 

... (there's a dinosaur from the past!)

 

to

 

...

Be careful. A bone with children will have its closing tag after its children's tags

 

I've thought of writing a little app that would crawl thru a mdl file and properly match up opening and closing tags for a bone and convert them. Hey... you're a programmer... you could do that!

 

 

 

 

EDIT: Just occurred to me that perhaps a null has to be part of the component model? and can't be added with the script - I will try
I find that adding a null to the component causes the body part to not get writen at all by TSM Builder
Link to comment
Share on other sites

The ability to add nulls using the SDK was added after TSM was made...I think in v13.

 

If the components are altered, they have to be done using v12 or earlier since the file format changed in v13.

 

I haven't been able to figure out a way to make more than one sub folder for the constraints...anyone know how?

 

 

----------------------

EDIT

----------------------

 

I forgot to mention that Expressions aren't scriptable either.

Link to comment
Share on other sites

  • Hash Fellow
I forgot to mention that Expressions aren't scriptable either.

 

You're dragging those in from another model now anyway, so you don't really need to write them in TSM, right?

 

The expressions don't have to be re-written for each character, do they?

Link to comment
Share on other sites

  • Hash Fellow

As far as folders in folders, I haven't tried it yet.

 

If it can't, write your poses into their immediate parent folder, with the intention of dragging them into another folder manually later.

 

The other folders could be created by TSM with one pose so they'd be already present.

Link to comment
Share on other sites

I forgot to mention that Expressions aren't scriptable either.

 

You're dragging those in from another model now anyway, so you don't really need to write them in TSM, right?

 

Yes, they are presently being imported.

 

The expressions don't have to be re-written for each character, do they?

 

No, I mentioned it as an added caveat for anyone that might want to add Expressions. It can be worked around, it just adds another step in the process.

 

As far as folders in folders, I haven't tried it yet.

 

If it can't, write your poses into their immediate parent folder, with the intention of dragging them into another folder manually later.

 

The other folders could be created by TSM with one pose so they'd be already present.

 

The easiest way I can see is to make Poses that only had the constraints that need compensating, then dragging or importing them into the rigged model. Using TSM to build the Squetch Rig would take more work than just doing a hybrid installation, I'm thinking. All that would be necessary would be to add the compensated constraints to one of the scripts and actually have that part of TSM in the rig temporarily (since TSM looks for each system).

 

I'll run some tests tonight.

Link to comment
Share on other sites

After tonight's testing, I think I have a decent handle on it. I've run out of time for today, but I think I can show my work sometime late tonight (which is my tomorrow). I had to convert the Squetch Rig into a v12 set of bones without nulls (I made a macro for jEdit and used a dummy v12 model) and saved that out as a separate model since I needed TSM to be able to reset the compensates. From there, I figure I can just drag the Poses and added compensate bones that TSM adds to the v13 model.

Link to comment
Share on other sites

I ran out of time again this evening, so I don't have the example ready to post yet. I have one more thing to overcome...and it's a very simple thing, I think.

 

Dragging each compensate bone made by TSM into the Squetch portion would be just as tedious as resetting compensates, so, I decided to use KDiff3 to just put back in the and references. Where I'm hung up is doing the actual replacing using KDiff3...it could either be the "Preprocessor command" or the "Auto merge regular expression". I've never had to do that kind of thing in KDiff3, so I'm still figuring that part out. All I need is to have "NULLOBJECT", where it occurs in the original file (just a text file of the "BONES" section before using TSM), replace "SEGMENT" in the post TSM file (a text file of the "BONES" section after TSM).

 

If anyone has KDiff3 pointers, or can recommend another cross-platform free tool for text file comparison (with instructions that will help me in this), I would be very grateful. If not, I should be able to figure it out eventually...I'm pretty stubborn.

Link to comment
Share on other sites

  • Hash Fellow
All I need is to have "NULLOBJECT", where it occurs in the original file (just a text file of the "BONES" section before using TSM), replace "SEGMENT" in the post TSM file (a text file of the "BONES" section after TSM).

 

This isn't a solution for Kdiff (a text editor?) but my notion for a Flash app was to write a loop that would -take a list of bone names,

-search thru the mdl file for an occurance until it found one

-backtrack to replace it's SEGMENT tag

-from there search count thru the and tags to find the correct closing tag

 

-start over on the next bone name in the list

Link to comment
Share on other sites

All I need is to have "NULLOBJECT", where it occurs in the original file (just a text file of the "BONES" section before using TSM), replace "SEGMENT" in the post TSM file (a text file of the "BONES" section after TSM).

 

This isn't a solution for Kdiff (a text editor?) but my notion for a Flash app was to write a loop that would -take a list of bone names,

-search thru the mdl file for an occurance until it found one

-backtrack to replace it's SEGMENT tag

-from there search count thru the and tags to find the correct closing tag

 

-start over on the next bone name in the list

 

First, I'm taking the original model (v13), using a macro in jEdit to convert the bones section of the file to a v12 set of bones, pasting the v12 bones into a dummy v12 model, opening the v12 model in v13, running a basic installation setup for TSM (with an altered script that includes the constraints that need compensating in the Squetch Rig) so that it won't error out, save the resulting file as a v13 model, drag the new Poses to the original model, delete the unnecessary TSM bones, cut out the updated bones section and then use KDiff3 to compare the original bones to the updated bones (all that would need to be done is to put back the nulls), then paste the fixed bones into the final model.

 

That's what I'm presently doing...I just have to get the nulls back using KDiff3, which I think will only take a little documentation reading on my part to figure out.

 

The bones have to be converted to v12 because TSM can't see v13 bones. I could have built the Squetch Rig using TSM, but, TSM can't handle nulls...the way I'm presently doing it appeared to be the easiest solution given all of the variables.

Link to comment
Share on other sites

  • Hash Fellow
I could have built the Squetch Rig using TSM, but, TSM can't handle nulls

 

You can build that rig using TSM. Just use a bone where there was a null

 

TSM doesn't have to handle nulls. Nulls are just bones with a different onscreen appearance. There's nothing a Null does in a rig that a bone can't do also.

 

I have a rig that has lots of nulls in it. They were all created as bones, placed as bones , constrained as bones... all that. When I'm done I just change their tags to NULLOBJECT, and then they appear as Nulls.

Link to comment
Share on other sites

  • Hash Fellow

Rule No. 2

Components are the templates TSM2 uses to build up the initial set of bones you position in your character. Components are regular A:M mdl files with just bones in them. You can open them up in A:M and look at them.

 

Notice there is just one "finger" component, not a different one for each finger. TSM2 cleverly copies and renames the template bones for as many fingers as you need. Likewise for arms and legs and spines and anything else you might have more than one instance of.

 

Suppose you wanted TSM2 to always add a fan bone at the knuckles of your rig. You could add those bones to the "finger" component and TSM2 will create fanebones on all the knuckles of all the fingers in your rig.

 

However, you have to do this modding in V11.1 or V12 as Components resaved in V13 or higher won't be read by TSM2. (TSM2 runs fine in V13 and higher, just don't edit components in V13 or higher)

 

If you add quite a few bones to a Component some may not get written unless you juggle the order in which they are listed in the PWS just right. Just moving one bone to the top of what is otherwise a list of equal heirarchy bones can mean the difference between all appearing or just one.

 

Also, adding bones to the Components increases the chance the end user may accidentally mess one up or be confused about placing them.

 

In addition, an extra bone in a component can sometimes be mistakenly seen by TSM Rigger as a "system" that you must choose to rig or not rig.

 

Since you need V11.1 or V12 to modify components that might seem limiting, however, in my own work I've moved away from adding ANY bones to the stock TSM2 Components since an equivalent bone can almost always be created in the scripting stage. Creating the bones in scripting means I only have to manage one alternate file for a body part rather than two. Creating bones in scripting is available to all TSM2 users, not just the ones who have V11.1 or V12.

 

My face rig is one exception where I have added quite a few bones to the "neck" component.

 

Although we really won't do much with Components I mention Components here for those who are curious about how this all works and may want to investigate further.

Link to comment
Share on other sites

I could have built the Squetch Rig using TSM, but, TSM can't handle nulls

 

You can build that rig using TSM. Just use a bone where there was a null

 

TSM doesn't have to handle nulls. Nulls are just bones with a different onscreen appearance. There's nothing a Null does in a rig that a bone can't do also.

 

I have a rig that has lots of nulls in it. They were all created as bones, placed as bones , constrained as bones... all that. When I'm done I just change their tags to NULLOBJECT, and then they appear as Nulls.

 

I realize that it would only take a change of tag, Robert. I'm not sure of the number, but, there are a lot of nulls that would need to be changed...manually, that would take longer than just resetting compensates. Do you have an automated way of doing this?

 

There are enough differences between TSM and Squetch that make installing the Squetch Rig using TSM more difficult. TSM looks for specific things, which also causes problems depending on what you're doing. What I'm doing is only using TSM to reset compensates. I'm not sure if TSM can make the FK/IK switch or reset compensates in both the on and off position of a Pose...I haven't gotten to that yet. However, since TSM can't make Expressions, there would have to be an import anyway. There are plenty of limitations.

Link to comment
Share on other sites

  • Hash Fellow
Do you have an automated way of doing this?

That's what my app proposal above was about. I can almost see the code in front of me, but I haven't done any real programming in about 3 years so there'd be a certain time spent getting back up to speed on the little details. If anyone out there is enough of a programmer to read and write text files and do search/slice/insert type operations on strings, I can tell them what they need to do.

 

 

There are enough differences between TSM and Squetch that make installing the Squetch Rig using TSM more difficult. TSM looks for specific things,

As I see it the only things that are hard-coded in TSM2 are the names of those component and Script files. Inside those it's wide open.

 

What I'm doing is only using TSM to reset compensates. I'm not sure if TSM can make the FK/IK switch or reset compensates in both the on and off position of a Pose

 

I haven't quite deduced the proper workflow for creating them but the TSM2 rig has poses in it that contain information on both the On and Off positions, so I suspect this can be done. Just a theory.

 

I do expect that some things for Squetch will have to be dragged into the model after TSM is done but that will still be a lot faster than having to manuallyreset all those compensates.

Link to comment
Share on other sites

  • Admin

There are a lot of 'search and replace' tools out there (MS Word does a fine job too and allows programs to use Visual Basic).

Running a search for 'command line search and replace' on Google I found this utility with the unlikely name of FART (Find And Replace Text). Never used it though...

 

As it is open source that might help in creating/modifying the needed tool.

Of course the source file would have to have the bones named in such a way that the FART tool would find and replace them (i.e. null_bone001 might prompt the appropriate renaming of the segment tag.

 

Also, perhaps... if a bone can be made to appear as a Null... it might negate the need for the Nulls in the first place?

(This would most likely be a feature request)

 

The command line utility I googled:

http://sourceforge.net/projects/fart-it/

Link to comment
Share on other sites

  • Hash Fellow
There are a lot of 'search and replace' tools out there (MS Word does a fine job too and allows programs to use Visual Basic).

Running a search for 'command line search and replace' on Google I found this utility with the unlikely name of FART (Find And Replace Text). Never used it though...

 

The task is just a bit beyond a standard issue text editor because first you need to search for something that you don't want to replace (the name of the bone, in green below) and then locate it SEGMENT tags to replace those (in red below). The first one is predictably nearby... the closing tag could be quite a way away depending how many children your bone has.

 

Not a hard algorithm to write. you're right, it's possible a text editor could be reprogrammed to do this task.

 

 

Start=-57.7945 107.167 -5.46956

Rotate=-0.498346 -0.500921 0.500945 0.499783

Length=3

Name=1 right lowerarmBenderTarget

BoneColor=1 0 0 255

UserMoved=TRUE

Start=-46.5222 107.165 -5.48856

Rotate=-0.498346 -0.500921 0.500945 0.499783

Length=3

Name=1 right lowerarmBend125->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-35.2498 107.164 -5.50757

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmBend250->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-39.0073 107.164 -5.50124

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmBend375->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-42.7647 107.165 -5.4949

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmBend500->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-46.5222 107.165 -5.48856

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmBend625->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-50.2796 107.166 -5.48223

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmBend750->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-54.0371 107.167 -5.47589

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmBend875->1 right lowerarmBenderTarget translatecomp

BoneColor=1 0 0 255

Hidden=TRUE

Start=-57.7945 107.167 -5.46956

Rotate=0 0 0 0

Length=0.1

Name=1 right lowerarmTwist500

 

Also, perhaps... if a bone can be made to appear as a Null... it might negate the need for the Nulls in the first place?

(This would most likely be a feature request)

 

No, we want nulls for their distinct appearance. the fact that they are just bones in disguise is fortunate.

Link to comment
Share on other sites

No, we want nulls for their distinct appearance. the fact that they are just bones in disguise is fortunate.

 

2 things occur to me -

 

1) perhaps rather than a text editor "program" to change bones to nulls, that the rigger plugin be modified to be able to handle the syntax of "create a null" - seems trivial (on the surface) for anyone who understands the sdk and has access to the TSM plugin code. (does anyone?). I do not know the sdk and I am even more rusty than you Robert (like about 15 years rusty)

 

2) or if thats not likely, I have noticed that I can just add nulls into the hierarchy (manually) and then run the rigger. The existing scripts don't seemed to be bothered by the existence of nulls (have not tested extensively). Perhaps something could be worked such that the geometry bone heirarchy with the necessary nulls for squetch could be imported before running the scripts. This would probably be waaayyy more involved given the complexity of the squetch rig. And requires more thinking. I don't know what the Installrig plugin (run after final import) for squetch does, perhaps that could be modified somewhat to help out as well.

 

I like how the tsm process works: first positioning the geometry bones very simply and manually, 2nd assign (and weight) cps, then third the rigging. The squetch rig obviously has way more options and capabilities.

Link to comment
Share on other sites

  • Hash Fellow
1) perhaps rather than a text editor "program" to change bones to nulls, that the rigger plugin be modified to be able to handle the syntax of "create a null" - seems trivial (on the surface) for anyone who understands the sdk and has access to the TSM plugin code. (does anyone?). I do not know the sdk and I am even more rusty than you Robert (like about 15 years rusty)

 

modifying the TSM2 sourcecode to add certain functionality would be ideal. Especially to update it for Mac Users. I did inquire about releasing it but so far... no response on that.

 

2) or if thats not likely, I have noticed that I can just add nulls into the hierarchy (manually) and then run the rigger. The existing scripts don't seemed to be bothered by the existence of nulls (have not tested extensively). Perhaps something could be worked such that the geometry bone heirarchy with the necessary nulls for squetch could be imported before running the scripts. This would probably be waaayyy more involved given the complexity of the squetch rig. And requires more thinking. I don't know what the Installrig plugin (run after final import) for squetch does, perhaps that could be modified somewhat to help out as well.

 

Yes, you can manually add anything in before running Rigger, but I agree that would be too error prone for the average user.

 

Creating elements thru scripting means it always gets done in exactly the right place and in the right heirarchy and the user never has to bother with it.

 

 

 

 

 

I like how the tsm process works: first positioning the geometry bones very simply and manually, 2nd assign (and weight) cps, then third the rigging. The squetch rig obviously has way more options and capabilities.

 

My goal is to add features but maintain that simple TSM workflow.

Link to comment
Share on other sites

Do you have an automated way of doing this?

That's what my app proposal above was about. I can almost see the code in front of me, but I haven't done any real programming in about 3 years so there'd be a certain time spent getting back up to speed on the little details. If anyone out there is enough of a programmer to read and write text files and do search/slice/insert type operations on strings, I can tell them what they need to do.

 

My thinking was that if you have a v13 file that has the nulls in it and a v13 file (after running TSM and then saving using v13) that has every bone with the same name except for the added compensate bones, a program like KDiff3 could be used to set to over-ride the "" or "" tags with "" and "" tags from the original file that had the nulls. I think I'm close to getting that done...I'll do some more documenation reading for KDiff3 tonight.

 

There are enough differences between TSM and Squetch that make installing the Squetch Rig using TSM more difficult. TSM looks for specific things,

As I see it the only things that are hard-coded in TSM2 are the names of those component and Script files. Inside those it's wide open.

 

The TSM spine has five segments at the standard setting...I forget if it can be set to three, it probably can. Also, there would have to be a bunch of markers added for the FACE controls...personally, I like the posable installation placement of bones (of course, I would though)...it would definitely make the face rig easier to install. That could be added pretty easily as an imported model, but, once it got exported, it would have to be converted to a v12 model to run the last step of TSM.

 

What I'm doing is only using TSM to reset compensates. I'm not sure if TSM can make the FK/IK switch or reset compensates in both the on and off position of a Pose

 

I haven't quite deduced the proper workflow for creating them but the TSM2 rig has poses in it that contain information on both the On and Off positions, so I suspect this can be done. Just a theory.

 

I do expect that some things for Squetch will have to be dragged into the model after TSM is done but that will still be a lot faster than having to manuallyreset all those compensates.

 

I'm thinking that the only Poses that TSM would need to be able to make for the Squetch Rig would be the ones that need compensates reset, the others can be imported. That would save a lot of time on the development end of things.

 

It will all get worked out, it's still early in the process.

Link to comment
Share on other sites

  • Hash Fellow

As far as the 3 bone spine... just replace the spine script with one that works on 3 bones. Three bones that you put in the spine component.

 

Alternatively it wouldn't be hard to script 3 new bones based on the position of those 5 TSM2 bones. Then just constrain the 5 bones to those 3 and continue on rigging the 3.

 

(But I'll tell ya... that five bone TSM2 spine is one of the big reasons TSM2 animators love TSM2 :wub: )

 

 

it would have to be converted to a v12 model to run the last step of TSM.

 

this converting back to V12 stuff I don't see the need for?

 

TSM Rigger (the last TSM step) doesn't read any model files at all. It operates on what is in your model window which means it could have been a V13 model by that point.

 

the only Pre V13 things TSM needs is "components"

 

You can run Builder in V13 and save its result in V13, close A:M, reopen A:M, reload that V13 model and TSM FLipper and TSM Rigger work just fine on it.

Link to comment
Share on other sites

As far as the 3 bone spine... just replace the spine script with one that works on 3 bones. Three bones that you put in the spine component.

 

Alternatively it wouldn't be hard to script 3 new bones based on the position of those 5 TSM2 bones. Then just constrain the 5 bones to those 3 and continue on rigging the 3.

 

I was concerned with altering it because I still am not sure what TSM is looking for in all instances...I've had it decide it didn't like a few things. I'm still feeling my way around.

 

(But I'll tell ya... that five bone TSM2 spine is one of the big reasons TSM2 animators love TSM2 :wub: )

 

I completely understand, everyone has their preferences. I'm pretty happy with the latest Squetch Rig spine myself (of course, I'm biased), but I realize there are just as many reasons someone would want TSM's spine...it's very nice.

 

it would have to be converted to a v12 model to run the last step of TSM.

 

this converting back to V12 stuff I don't see the need for?

 

TSM Rigger (the last TSM step) doesn't read any model files at all. It operates on what is in your model window which means it could have been a V13 model by that point.

 

the only Pre V13 things TSM needs is "components"

 

You can run Builder in V13 and save its result in V13, close A:M, reopen A:M, reload that V13 model and TSM FLipper and TSM Rigger work just fine on it.

 

I've had TSM disagree with me plenty, it wasn't made to do a few things I've attempted. I don't remember what I was trying the times I crashed it, but it could very well have been something silly. Breaking things is a good way to figure them out though.

 

I'll have to illustrate what I'm doing, I guess...it may only make sense to the voices in my head. I'm sure there are several equally valid solutions and hundreds of individual preferences. I'm just working on one, but that doesn't mean it won't open up other possibilities.

Link to comment
Share on other sites

  • Hash Fellow

If you want to make the Squetch spine, dont' try to add it into the TSM2 Spine script. Throw out the TSM2 spine script and replace it with one of your own that creates the bones and constraints you need.

 

There's nothing in the TSM2 spine script that any other part of TSM2 needs or looks for. I can run TSM Rigger with a totally blank spine script; all the other body parts get rigged according to their scripts

 

I've had TSM disagree with me plenty, it wasn't made to do a few things I've attempted. I don't remember what I was trying the times I crashed it, but it could very well have been something silly. Breaking things is a good way to figure them out though.

 

I'll have to illustrate what I'm doing, I guess...it may only make sense to the voices in my head. I'm sure there are several equally valid solutions and hundreds of individual preferences. I'm just working on one, but that doesn't mean it won't open up other possibilities.

 

When I've crashed TSM2 it's always been because my script referenced a bone that didnt' exist. Typically because I slightly mispelled the bone name.

 

When TSM2 has not crashed but not completed all of a script it has been because I had a stray character or mispelling in some place other than a bone name.

Link to comment
Share on other sites

If you want to make the Squetch spine, dont' try to add it into the TSM2 Spine script. Throw out the TSM2 spine script and replace it with one of your own that creates the bones and constraints you need.

 

There's nothing in the TSM2 spine script that any other part of TSM2 needs or looks for. I can run TSM Rigger with a totally blank spine script; all the other body parts get rigged according to their scripts

 

I've had TSM disagree with me plenty, it wasn't made to do a few things I've attempted. I don't remember what I was trying the times I crashed it, but it could very well have been something silly. Breaking things is a good way to figure them out though.

 

I'll have to illustrate what I'm doing, I guess...it may only make sense to the voices in my head. I'm sure there are several equally valid solutions and hundreds of individual preferences. I'm just working on one, but that doesn't mean it won't open up other possibilities.

 

When I've crashed TSM2 it's always been because my script referenced a bone that didnt' exist. Typically because I slightly mispelled the bone name.

 

When TSM2 has not crashed but not completed all of a script it has been because I had a stray character or mispelling in some place other than a bone name.

 

Thanks for the info, Robert! I'll do some more experimenting tonight.

Link to comment
Share on other sites

  • Hash Fellow

also ... if the script didn't fully execute, you can look thru the character to see what got done and what didnt' get done that you were expecting and that will give you a fair idea of where to look for a mistake. If a constraint in the middle of the script didn't get made, then you know the error was somewhere before that.

 

If the script crashed A:M, leaving you with nothing to examine, try running just the first half. If it survives, you know your error was in the second half. If it still crashed, you know the error was in the first half. And you can divide in to smaller parts from there.

Link to comment
Share on other sites

A couple of things I found in my testing so far might be helpful to others, so I thought I'd post them.

 

First, if you want to script a compensated "orient like" constraint that has "store roll" turned off, the scripting looks like:

 

compensated no roll orient like constrain "right_bicep" to "right_bicep_orienter"

 

Second, it appears that hiding and unhiding a bone in a Pose doesn't work in an on/off Pose, but it does in a percentage Pose. Here is a portion of a percentage Pose to illustrate (it's actually an on/off in the Squetch Rig, I just change it to an on/off in A:M afterward):

 

in pose "right_arm_FK_IK"

 

 

compensated no roll orient like constrain "right_bicep" to "right_bicep_orienter"

compensated aim roll at constrain "right_bicep" to "right_bicep_orient"

 

 

 

hide "right_bicep"

hide "right_forearm"

hide "right_hand_controller"

 

show "right_elbow_controller"

show "right_hand_IK_controller"

 

The "hide" and "show" affect the bone when the Pose is at "100%", so, "hide" will unhide a bone when the Pose is at "0%".

 

I went through several Diff/Merge programs, but none of them would merge files the way I wanted. I figured out that I can get the job done using jEdit with the JDiff plugin and recording a macro. It's kind of a low-tech hack, but it appears to do what I need.

 

I still have a few things to work out, but I'm making progress...still a lot of testing and assessing to do.

Link to comment
Share on other sites

  • Hash Fellow
A couple of things I found in my testing so far might be helpful to others, so I thought I'd post them.

 

First, if you want to script a compensated "orient like" constraint that has "store roll" turned off, the scripting looks like:

 

compensated no roll orient like constrain "right_bicep" to "right_bicep_orienter"

 

They even have a better name for it! I always thought "store roll" was an unnecessarily jargonesque term.

 

Second, it appears that hiding and unhiding a bone in a Pose doesn't work in an on/off Pose, but it does in a percentage Pose. Here is a portion of a percentage Pose...

I knew there had to be a way to do that! I'm glad you spent the hours researching that and not me. ;)

Link to comment
Share on other sites

Sorry to interfere the techitalk with a simplistic question,

 

but can you please tell me, if I understand this postings here correctly that you are working on a way

 

to use the Squetchrigg within TSM2 in the same easy to use way like the Anzovin-Rigg?

 

and -what would even be more important for me since this is missing within TSM2- also the face-Rigg?

 

 

That really really would be worthwhile to wait for for me!!!

 

Thanks

 

Jake

Link to comment
Share on other sites

Sorry to interfere the techitalk with a simplistic question,

 

but can you please tell me, if I understand this postings here correctly that you are working on a way

 

to use the Squetchrigg within TSM2 in the same easy to use way like the Anzovin-Rigg?

 

and -what would even be more important for me since this is missing within TSM2- also the face-Rigg?

 

 

That really really would be worthwhile to wait for for me!!!

 

Thanks

 

Jake

 

What I'm presently trying to do is use TSM2 to do the resetting of compensates for the Squetch Rig...which does include the bones rig for the face (the standalone FACE setup compensates will be able to be reset this way as well because of that). Different combinations of rigs are also possible, as Robert has mentioned, but I'm just concerning myself with one task at the moment. Eventually, it will probably branch out into being able to make different combinations of rigs.

 

There are a few hoops to jump through when getting this to work, so I'm trying to map out steps that will make it the least difficult. Last week was the first time I ever looked at TSM, so I'm still finding a few things out...I'm pretty close, I can reset all of the compensates outside of the face rig now.

 

One of the things I haven't been able to do is to get TSM to make both sides of an FK/IK switch, but, what I've done is make the "on" side of the Poses with the "off" side having the constraints set to "0%". That means that a little editing in AM will need to be done on those Poses. There are a few other bits of editing that are necessary because of how TSM deals with things, but I don't think they are "deal breakers". To minimize the editing, I'll be using the Posable installation for the Squetch Rig, convert the bones to v12 so that TSM can reset the compensates then add the Poses and bones from TSM to the original model...or some slight variation of that depending on how things work out.

 

I'm trying to get this accomplished so that I can make the updated installation tutorials for the Squetch Rig...I didn't want the tutorials to be outdated before I finished them.

 

Hope that helps, Jake.

Link to comment
Share on other sites

  • Hash Fellow
To minimize the editing, I'll be using the Posable installation for the Squetch Rig, convert the bones to v12 so that TSM can reset the compensates then add the Poses and bones from TSM to the original model...or some slight variation of that depending on how things work out.

 

is the detour thru V12 so the Posable installation rig can be used? I still dont' understand the need for that detour, and it sounds like anyone who wants to install the Squetch rig is going to have to have V12?

 

I've done a Squetch installation once and I dont' understand the advantage of the pose slider driven installation. It seems to me that using the sliders to rotate and scale the squetch rig into place is no fewer steps that using the regular rotate and scale manipulators in A:M to rotate and scale the TSM2 rig into place.

 

What am i missing?

Link to comment
Share on other sites

The posable installation does both sides at the same time and also eleminates a few step, try installing it manually. It also helps in minimizing mistakes. There are alot of bones that need to be in the correct position or the rig won't work properly. With a manual installation, you have to use the manipulators, if you don't or forget to, you may as well start over. I've done about 20 manual installs, and its not as easy as you think it is. You can easily make a mistake and ruin the install without even knowing you did it. By the time you figure out that there is a problem, it's to late. Trying to fix it manually can be a nightmare if you don't know the rig and where to find the problem.

 

The posable rig is a v13s or better install. The reason he needs to convert it is, he need to adds bones to it in v12 (adding the bones through the script for compensating) or TSM won't read the file properly, it needs to be a v12 file. This is assuming he is going to use the installed rig as a component model.

 

I don't know much about TSM, so Robert my question is, can TSM rigger add new bones to an already installed rig that is not a v12 model file? Or, can a script be written that compensates already existing constrains in a rig?

Link to comment
Share on other sites

To minimize the editing, I'll be using the Posable installation for the Squetch Rig, convert the bones to v12 so that TSM can reset the compensates then add the Poses and bones from TSM to the original model...or some slight variation of that depending on how things work out.

 

is the detour thru V12 so the Posable installation rig can be used? I still dont' understand the need for that detour, and it sounds like anyone who wants to install the Squetch rig is going to have to have V12?

 

I've done a Squetch installation once and I dont' understand the advantage of the pose slider driven installation. It seems to me that using the sliders to rotate and scale the squetch rig into place is no fewer steps that using the regular rotate and scale manipulators in A:M to rotate and scale the TSM2 rig into place.

 

What am i missing?

 

You won't need v12, there's a dummy v12 model that things pass through though...I would include that along with a couple of macros for jEdit. This step isn't necessary.

 

There are a couple of reasons to use the Posable installation to position the Squetch Rig.

1. It's already put together and does the job.

 

2. It has a few dummy-proofing things built into the Pose installation.

 

3. I'm not sure if TSM would reject the markers I would need to add to get the face rig (and possibly a few other areas) to install using its' method...still an experiment that I need to try.

 

4. There are about a thousand bones in the Squetch Rig (if I could make the Poses using TSM, that would be several hundred of those, but it's not possible to build them as they are)...that's a lot of scripting, even if I don't run into a limitation that I have to work around.

 

5. And the things Mark listed....he posted while I was typing this.

 

So far, the limitations that I've found in TSM are:

 

1. It can't handle nulls.

 

2. You can only hide a bone in a percentage Pose.

 

3. You can only make one level of Pose folders (maybe you can make more, but I haven't found a way to do it and TSM doesn't use more for its' rig).

 

4. You can only put a Pose in a folder if it is a percentage Pose.

 

5. It can't make both sides of an FK/IK switch Pose without editing it in A:M.

 

6. It can't make Expressions.

 

The Pose making limitations can be worked around by importing them as is presently done in the Squetch Rig installation...I have made some modified versions of the "FINAL_INSTALL" models that have the compensated constraints taken out. There would still have to be some editing of the FK/IK Poses and any on/off Pose needing compensating that hides bones.

 

There are a few hoops to jump through no matter how TSM is used for the Squetch Rig. TSM wasn't designed to do what I'm trying to do with it, it was made to install a specific set of rigs with specific needs in an older version of A:M. If this experiment fails, I can always resign myself to scripting everything and see if I hit a hidden wall...which is not my first choice and will still require several hoops to be jumped through during an installation even if things go well. However, the job of getting the compensates to work would have already been done, so I wouldn't be losing anything by trying what I'm doing now.

Link to comment
Share on other sites

I don't know much about TSM, so Robert my question is, can TSM rigger add new bones to an already installed rig that is not a v12 model file? Or, can a script be written that compensates already existing constrains in a rig?

 

Nosir, it has to be a v12 model without any nulls in order to have the TSM rigger work. I'm using a macro I made in jEdit to convert the bones and nulls and then pasting them into a dummy v12 model to get around that. Then, I'm using jEdit, another macro and the "JDiff" plugin to do a comparison between the original v13 Squetch Rig model and the one that TSM resets the compensates on to get the nulls back to their original state (which would also have to be done if I scripted all of the Squetch Rig bones and nulls anyway).

 

Robert's next post helped me figure out that I had a script changed out that caused some problems, sorry for the inaccurate information on that one.

 

TSM compensates constraints when it makes them, it can't compensate an already existing constraint that I am aware of...unless I'm missing something.

Link to comment
Share on other sites

  • Hash Fellow
I don't know much about TSM, so Robert my question is, can TSM rigger add new bones to an already installed rig that is not a v12 model file? Or, can a script be written that compensates already existing constrains in a rig?

 

Nosir, it has to be a v12 model without any nulls in order to have the TSM rigger work.

 

This is not correct. TSM rigger works on a model that has already been loaded. It doesn't matter what version the model came from. Have you noticed that it prompts you to save your work after TSM Builder and TSM Flipper? That would be pointless if you couldn't reload those files for use by TSM2.

 

TSM2 Rigger can add bones to any existing model from any version tht your A:M can load. I've been doing it for 2 months now. But the real TSM workflow is not that you re-rig an existing rig. All the user has to do is put in the minimum Geometry bones and TSM2 rigs and constrains everything on top of that in one step. There is no need to compensate pre-existing constraints.

 

 

TSM Builder requires it's "Components" have been made in V12 or earlier. But that's something the creator of the rig only needs to do once. He makes those available to the end user who never needs to modify them. But if you're using the possable Squetch file to put bones in a model, you wouldn't even need TSM Builder.

 

 

 

Rigger does not need any V12 files at all. Where is that idea coming from?

 

If Rigger needs V12 files how is it that i can save my work after TSM Flipper, quit A:M, restart it, reload my work (now a V13 file) and run Rigger on it?

 

I really think you're introducing some unnecessary complications in this.

Link to comment
Share on other sites

I don't know much about TSM, so Robert my question is, can TSM rigger add new bones to an already installed rig that is not a v12 model file? Or, can a script be written that compensates already existing constrains in a rig?

 

Nosir, it has to be a v12 model without any nulls in order to have the TSM rigger work.

 

This is not correct. TSM rigger works on a model that has already been loaded. It doesn't matter what version the model came from. Have you noticed that it prompts you to save your work after TSM Builder and TSM Flipper? That would be pointless if you couldn't reload those files for use by TSM2.

 

You're right, Robert...I had the replacement script in there and it confused me. I'll cross that off the list. So, that's one step I don't have to do. Thanks! I'm still feeling my way around with TSM, sorry for the mistake. I'll go back and edit that post.

 

The other listed limitations seem to be valid though.

Link to comment
Share on other sites

Please don't hit me. I will try out TSM as soon as I get my "new" PC and AM reinstalled.

 

I find this talk of "scripting" TSM fascinating. I love to fiddle with scripting stuff. My question is in regard to what needs to be done before the rigging.

 

Specifically the basic skeleton that controls the CPs. I have really weird shoulder/bicep bone set up for my Terminator model. (everything is weird actually due to everything being based on single axes rotations). I have 3 shoulder bones, 3 bicep bones, all with euler limits to control what turns/rotates what on what axis and where that rotation takes place.

 

Because of this very odd set up throughout the entire model, how difficult will that be to add a TSM control rig? Will I need to do the scripting thing? Will I have to rename the bones? For instance I don't have a single forearm bone... technically... there are 2. One rotates the forearm, one bends the forearm. The bicep is worse. I have 3 different bones all rotating on each axis with different center points.

 

I want to grab just one bone like the hand, and move the whole arm so all of those constrained bones spin and turn to reach the location.

 

Should I create new bones over this skeleton and rig that to control the base bones and then run TSM? Can I run TSM over this bizarre set up?

 

Thanks for any input.

 

-vern

Link to comment
Share on other sites

I would think you could do it. Run TSM builder and position it and run TSM flipper, once you created the skeleton for TSM, you would need to parent your rig to it to the appropriate bone in TSM skeleton. Then it would be a matter of running TSM rigger.

Link to comment
Share on other sites

  • Hash Fellow

Bone creation and bone constraining via scripting are future installments here.

 

Please don't hit me. I will try out TSM as soon as I get my "new" PC and AM reinstalled.

 

I find this talk of "scripting" TSM fascinating. I love to fiddle with scripting stuff. My question is in regard to what needs to be done before the rigging.

 

 

Specifically the basic skeleton that controls the CPs. I have really weird shoulder/bicep bone set up for my Terminator model. (everything is weird actually due to everything being based on single axes rotations). I have 3 shoulder bones, 3 bicep bones, all with euler limits to control what turns/rotates what on what axis and where that rotation takes place.

 

Because of this very odd set up throughout the entire model, how difficult will that be to add a TSM control rig? Will I need to do the scripting thing?

 

Adding your extra bones after TSM2 has done its thing is easier than adding TSM to an already rigged model. Imagine adding Squetch on top of AM2001. I suppose you could do it , but why?

 

 

 

Will I have to rename the bones? For instance I don't have a single forearm bone... technically... there are 2. One rotates the forearm, one bends the forearm. The bicep is worse. I have 3 different bones all rotating on each axis with different center points.
If one of your bones is name the same as a regular TSM2 bone then you'd have to consider renaming it.

 

I want to grab just one bone like the hand, and move the whole arm so all of those constrained bones spin and turn to reach the location.

 

Should I create new bones over this skeleton and rig that to control the base bones and then run TSM? Can I run TSM over this bizarre set up?

 

Basically you have a humanoid. It has elbows and wrists and knees and ankles and a neck... all that stuff that 99% of characters have. That's what vanilla TSM2 controls and moves.

 

You put TSM2 bones in your character and attach all the relevant CPS to them and run TSM Rigger.

 

Now, you have some other body parts that dont exactly correspond to 99% of characters' anatomies? Add some bones for them at the appropriate spots and constrain them. No scripting required.

 

Scripting is for rig enhancements that you will want to apply to many characters without having to manually recreate them for each one. For example, I modified the "arm" script of TSM2 to add all the bones and constraints for limb bending on top of the regular TSM2. It's 100+ extra bones and twice as many constraints that I had to do manually for each character that are now made automatically. Took me long time to write and debug that script though.

 

But your Terminator is a one-off character. You won't be needing to reproduce those extra joint and gizmo bones on other models. So writing a script for them woudl be unnecessary.

Link to comment
Share on other sites

Robert, he already has the bones in place, cps assigned and constraints setup. He wants to control his geometry bones with TSM2 rig. The way you say to do it, he would have to import his geometry bones and relationships and reassign cps again. either way, he would still need to parent his geometry to TSM2 rig.

Link to comment
Share on other sites

I think I get it. What I could do is import the TSM skeleton and just "link" it to the existing geometry skeleton I have. TSM should then just work with it's own bones to create the control rig right?

 

The only draw back is all the "extra" bones that might be redundant. I could always start from scratch. It's tedious to rig but it's mindlessly tedious. No smart skin, no cp/bone wieghing just straight forward simple mesh group assignment to a single bone. the constraints are dead simple too... just tedious.

 

-vern

Link to comment
Share on other sites

  • Hash Fellow
Robert, he already has the bones in place, cps assigned and constraints setup. He wants to control his geometry bones with TSM2 rig. The way you say to do it, he would have to import his geometry bones and relationships and reassign cps again. either way, he would still need to parent his geometry to TSM2 rig.

 

 

Yup, it's a lot of work when you rig a character and then want to change the rig to something else. But it's not TSM2's fault that that is a lot of work.

 

Yes, you could constrain an already rigged character to TSM2 control bones but what are the chances of someone getting that all right?

 

Imagine if someone wanted to convert an already rigged AM2001 character to Squetch. What are the chances of getting that all right? And you know they'd blame Squetch! Who would ever be able to debug it for them? Better to start from scratch and do the rigging process correctly.

Link to comment
Share on other sites

Who said it would be TSM's fault if it's alot of work? We're trying to do something TSM wasn't designed to do.

 

You wouldn't want to constrain it to another rig (possible conflict in constraints in Verns case) it would need to be parented correctly. He basicly just has a geometry constrained setup with targets.

 

It's alway better to start from scratch. And again, why would someone blame the Squetch rig? They would be doing something that the Squetch rig wasn't designed to do. Even if they did start from scratch to install a rig ,whether it's the 2001 rig, TSM or the Squetch rig, there are not many people who would be able or willing to help them debug a problem in the rig. And you're talking about edited the component models and rewriting the scripts, who is going to debug these rigs when there's a problem?

 

We won't get into converting a 2001 rigged model to the Squetch rig.

 

Back on track, a good test would be to convert the 2001 rig to component models and scripts (with some modifications). Adding bones and constraints to TSM rig is one thing, but building a new rig for TSM to install is another.

Link to comment
Share on other sites

  • Hash Fellow
Back on track, a good test would be to convert the 2001 rig to component models and scripts (with some modifications). Adding bones and constraints to TSM rig is one thing, but building a new rig for TSM to install is another.

 

I know you'll enjoy that project. If you have questions, ask me.

Link to comment
Share on other sites

No, we want nulls for their distinct appearance. the fact that they are just bones in disguise is fortunate.

 

don't know what the SQUETCH Install rig plugin (run after final import) for squetch does, perhaps that could be modified somewhat to help out as well.

 

 

Robert/David/Mark - I am like a dog with a bone...(yuk yuk - get it?)

 

Back to this NULL thang.

 

I definitely think that the SQUETCH Install Rig plugin can be used to add nulls (and other control bones) to a skeleton hierarchy, in the correct place so that the TSM2 rigger can access the nulls to create constraints - unless, of course, I am misunderstanding how the squetch rig install plugin (SIRP) works... I don't believe any text editing would be necessary.

 

Looks to me like the SIRP takes a hierarchy of bones and interprets them sorta like a script. IE it

 

1) deletes any bones that end in INSTALL (or contain INSTALL). eg

 

if you start with the hierarchy of bones:

 

base bone INSTALL

+another bone INSTALL

++NULL

 

and run the SIRP - you will end up with:

NULL

 

2) and It also looks to me that the SIRP could be used to place the NULLS (and any other bones) in their proper place in the hierarchy

 

eg, If you start with a hierarchy of bones looking like:

 

base bone

+GEOM bone

INSTALL_base bone/GEOM bone

+NULL

 

then Run the SIRP, you end up with:

 

base bone

+GEOM bone

++NULL

 

So I am guessing that something could be worked out procedurally like:

 

1) position (optionally only 1 side) of GEOM bones (either created with TSM build or some other means)

2) optionally run TSM Flipper

3) assign CPs and optionally weight CP's

4) Import a control hierarchy of bones that contains NULLS and perhaps other non-GEOM bones & instructs the SIRP to create a "Final" bone hierarchy.

5) Run the SIRP

6) Run TSM2 Rigger (to create poses that require compensates & additional bones? & whatever). I have found you can write TSM2 scripts that access nulls for use in assigning constraints.

 

______________________________________________________________

 

Note: As a side effect in my poking around, I have also learned that the TSM flipper will create a right/left pair of any bone - & the original bone doesn't have to be a TSM special bone name. It will create the complement bone, as long as it doesn't exist already. Unfortunately if there is a NULL named "right null", it will create a BONE called "left null" - but this might be useful if a text editor is required to convert bones to nulls, and the SIRP can't be used.

Link to comment
Share on other sites

  • Hash Fellow

I don't know all the elements you're using there, it sounds like it would work, but I still think it would be easier to just work with all bones, then have a program that will search thru the model file with a list of bone names and flip them to NULLs.

 

I know that program doesn't exist yet but I suspect it wouldn't be more than a page of code to write.

 

I just found out that Flash can write files known as "shared objects" to the user's hard drive (normally Flash doesn't allow itself to write ANYTHING to the user's computer) so that makes me more likely to write this thing.

 

I've written apps in Flash before that parsed and altered large text files, but to save the result I was having to make it print the result to a window from which I would copy and paste into a text editor. It worked fine but saving directly would be nicer.

 

No ETA on when I'll get around to this though.

 

 

Note: As a side effect in my poking around, I have also learned that the TSM flipper will create a right/left pair of any bone - & the original bone doesn't have to be a TSM special bone name. It will create the complement bone, as long as it doesn't exist already.
One caution on this... TSM Flipper will flip "right Bone" to "left Bone" but will also flip "Right Bone" to "left Bone"

 

Normally this is not a problem, unless you have written a script that you sent looking for "Left Bone" when "left Bone" is what is really there. That will cause TSM Rigger to crash.

Link to comment
Share on other sites

I don't know all the elements you're using there, it sounds like it would work,

 

ah...I was assuming the squetch Rig Installer plugin was standard issue - but perhaps it's only included in the zip files for Squetch rig?

 

here is just the plugin for windows - just put under hxt folder. I believe it is included whenever David posts a new version of Squetch rig.

 

Currently now to install the squetch rig, the steps are:

1) import the Squetch posable model into your model - the model to be rigged

2) create an action and do the Poses thing

3) export posed model from the action (just sizes the bones to fit the model to be rigged)

4) delete installation poses

5) Import Final IMPORT Model into newly posed model - I believe this only has poses/relationships in it and does not influence the plugin? Not sure. doesn't matter.

6) Run Install rig plugin (SIRP)

7) reset compensates

8) assign & weight CP's

 

The Squetch Posable Model (mentioned in step 1) appears to have the instructions for how to create the final Squetch hierarchy.

It has a bunch of extra bones with "INSTALL" in the name that get deleted after running the plugin. As well as hooking other bones up properly in the Squetch hierarchy.

 

Perhaps someone can chime in as to exactly what the syntax is for this plugin. This is something that I believe was written by hash?

 

My guess is that this plugin can come in handy as well, for other things if included in the procedure for rigging, and have a hybrid variation of TSM2 scripts and SIRP pseudo-scripts.

Windows_InstallRig.zip

Link to comment
Share on other sites

  • Hash Fellow

well, I know there is a plugin for squetch, I just know nothing of powers other than using it in the workflow you outlined.

 

 

here would be the TSM for Squetch workflow equivalents

 

1) import the Squetch posable model into your model TSM builder creates right side geometry bones

2) create an action and do the Poses thing Fit TSM bones to Mesh. Run TSM Flipper

3) export posed model from the action (just sizes the bones to fit the model to be rigged)

4) delete installation poses

5) Import Final IMPORT Model into newly posed model - I believe this only has poses/relationships in it and does not influence the plugin? Not sure. doesn't matter.

6) Run Install rig plugin (SIRP) TSM Rigger creates additional rig bones and writes constraints and poses

6b) drag in poses containing expressions

6c) program to convert bones to NULLs

7) reset compensates

8) assign & weight CP's Actually I like to do this after TSM Flipper in step 2) but some fan bones may not exist until TSM Rigger is run in step 6)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...