Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Terrain Composer2 a next generation GPU powered terrain tool.

Discussion in 'Assets and Asset Store' started by eagle555, Sep 16, 2012.

  1. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    Thank you for your post. Yes indeed the buttons are a bit blurry, but they are still visable here. I created a whole pdf document as well as inbuild remark text with every layer that explains the whole island tutorial. So the video can be used as a reference, but is not really needed.

    Greetings,
    Nathaniel
     
  2. ProjectOne

    ProjectOne

    Joined:
    Aug 9, 2010
    Posts:
    442
    Hi,
    this looks very impressive and useful,
    On the asset store the description mentions "You can create low detail with high performance terrain to mobile platforms, as well as high detail AAA terrain for high end graphic systems."

    Would you have any stats (draw calls, framerate) examples, videos... on how this runs on iOS? How low detail is has to be or how good it still looks and performs on mobile although with detail/size compromise?

    I am very interested, thank you
     
  3. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    That's good question. I don't have any stats yet on how unity terrain runs on IOS. What I'm going to do is test it for android this month after I build in mesh mode into TerrainComposer. This week I will make mobile terrain for a customer who's starting a kickstarter project, a game for mobiles (android and iOS), so I will be able to give more information how to set it up and stats for mobiles soon. TerrainComposer is compatible with T4M terrain. So you can use T4M to convert the created unity terrain with TerrainComposer to a mesh. T4M terrain is specially designed for mobile.

    Greetings,
    Nathaniel
     
    Last edited: Apr 2, 2013
  4. ProjectOne

    ProjectOne

    Joined:
    Aug 9, 2010
    Posts:
    442
    Excellent, that should provide good info. Good to hear about the compatibility with T4M as well.
    Thanks
     
  5. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    Just purchased this, looks great! But where do I get satellite images so nicely tiled? (I don't think I can use Google imagery without a license.)
     
  6. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    That's a good question.You can use google map saver for this http://www.codres.de/google-map-saver. Or Global mapper http://www.globalmapper.com, global mapper is better because you can extract heightmap data and satellite data exactly fitting and there's no copyright text in the satellite images.

    Greetings,
    Nathaniel
     
  7. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    Thanks for the suggestions for satellite images. I can't use the Google images due to licensing requirements. Anybody out there who already has purchased Global Mapper--could I pay you to generate some images for me?

    EDIT: This site has great satellite images (of the US): http://earthexplorer.usgs.gov
     
    Last edited: Apr 11, 2013
  8. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    You can ask google for permission. The link seems also google images...
     
  9. WJ

    WJ

    Joined:
    Oct 25, 2012
    Posts:
    97
    Thanks for sending me the latest version with tri planar support however it doesn't work :( I have the same issues as FractalCore above. I can only get my texture to render with vertex lighting but even then no matter what I set the tile sizes to it's fuzzy and looks really bad.

    Need to be able to apply normals and splats for the game I'm working on, any idea when this will be fixed? Or is there something I'm missing?

    Thanks

    * Edit, with the new version you sent me the textures still look bad even after I start a new project and don't use tri planar. I just get a solid color no matter the tile size it looks bad. I'm using deferred lighting and everything else is at default settings.
     
    Last edited: Apr 23, 2013
  10. caldrin

    caldrin

    Joined:
    Dec 4, 2011
    Posts:
    127
    This looks like an amazing tool.. think ill have to be picking this one up :)
     
  11. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello WJ,

    It's better to contact me at my email Nathaniel_Doldersum@hotmail.com, as I don't check the forum all the time. We can do screenshare on skype. It could be that you have another terrain shader in your project, it has nothing to do with TerrainComposer since on default it doesn't use any shader, so your terrain would look like this also, if you create it manually through Unity without installing TerrainComposer. All the triplanar textures need to be assigned. And the triplanar shader doesn't work with DirectX 11. If you want to use a shader with DX11, you can use Ats or RTP shader.

    Greetings,
    Nathaniel
     
  12. unitylover2012

    unitylover2012

    Joined:
    Oct 7, 2012
    Posts:
    12
    Any news on part two of the tutorial?

    Thanks
     
  13. marcaurelio74

    marcaurelio74

    Joined:
    Sep 2, 2012
    Posts:
    60
  14. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    That's a good question. TerrainComposer works very well with RTP, since TC uses standard Unity Terrain you can use any additional Terrain Shader with it.

    Greetings,
    Nathaniel
     
  15. marcaurelio74

    marcaurelio74

    Joined:
    Sep 2, 2012
    Posts:
    60
    Really Thanks for your answer.

    A couple of more question's :
    Do you have an estimated release data for version 1.2?
    I cannot see the tutorial video on your site, they are still not uploaded or is a problem on my side?
    Thanks
     
  16. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Yes, 1.2 will be released in about 1-2 weeks. The tutorial videos should work. They are mp4's, if you right click you can save as.

    Greetings,
    Nathaniel
     
  17. marcaurelio74

    marcaurelio74

    Joined:
    Sep 2, 2012
    Posts:
    60
    Thanks for your answer's.
    Buyed.
     
  18. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Thank you, I wish you good luck with it, if you have any more questions just ask ;)

    Greetings,
    Nathaniel
     
    Last edited: May 21, 2013
  19. HeadClot88

    HeadClot88

    Joined:
    Jul 3, 2012
    Posts:
    736
    How much does terrain composer Cost?

    and Does it work with Unity free?

    Edit: Should have done some looking around :/

    It costs 90 USD which looks like it is worth it :)

    and It works with Unity Free and Pro.

    You have a future customer come this payday :)
     
    Last edited: May 21, 2013
  20. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Thank you for the questions, and answering them :). It's all on the TerrainComposer site http://www.terraincomposer.com
     
  21. marcaurelio74

    marcaurelio74

    Joined:
    Sep 2, 2012
    Posts:
    60
    Hi Nathaniel,
    first of all i have to say that your asset is really really good.

    I'm playing with it, but sometimes without an apparent reason it throw an exception :

    ArgumentOutOfRangeException: Argument is out of range.
    Parameter name: index

    System.Collections.Generic.List`1[subfilter_class].get_Item (Int32 index) (at /Applications/buildAgent/work/b59ae78cff80e584/mcs/class/corlib/System.Collections.Generic/List.cs:633)
    terraincomposer_save.convert_software_version () (at Assets/TerrainComposer/Scripts/terraincomposer_save.js:10795)
    TerrainComposer.generate_startup () (at Assets/TerrainComposer/Editor/TerrainComposer.js:2141)
    TerrainComposer.Paint () (at Assets/TerrainComposer/Editor/TerrainComposer.js:1970)
    TerrainComposer.OnGUI () (at Assets/TerrainComposer/Editor/TerrainComposer.js:712)
    System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Applications/buildAgent/work/b59ae78cff80e584/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

    I didn't create the terrain with TC, but normally with Unity.
    I have set only 2 group's with one layer for each group to generate splatmap.

    Any idea?
    Thanks
     
  22. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    Yes it know what it is, I fixed this in version 1.06. I did send you an email about it. It's a little synchronisation bug between the TC data and the actual terrain data if you change something in terrain directly (e.g splat textures) without updating it in TC.

    Greetings,
    Nathaniel
     
  23. marcaurelio74

    marcaurelio74

    Joined:
    Sep 2, 2012
    Posts:
    60
    The version 1.06 work like a charm.
    Good job.
    Thanks for your immediate support with my issue.
     
  24. Deleted User

    Deleted User

    Guest

    eagle555 if its possible can you please do Tutorial on how to connect multiple types of terrain in to one big environment ?.

    What i mean is blend for example desert, mountains and forest type terrain in to one big environment. I can't create a good looking terrain using Terrain Composer with more than one type of terrain. If its about one than yes it can create beautiful terrains but is there a way to blend few types of terrains together ?

    Such tutorial would be VERY helpful.
     
  25. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    That's a good question. I show how to do this in the video on the front page of my website http://www.youtube.com/watch?v=tuAFTYw4cQU&feature=player_embedded

    What you need is a subfilter in a heightmap/splat layer to mask an area, so you can use a certain setup in 1 layer or filter and another texturing setup in another. Subfilters allow you to blend many things together unlimited.

    Greetings,
    Nathaniel
     
  26. ayina

    ayina

    Joined:
    May 30, 2013
    Posts:
    3
    Hello, I'm using TC, I add to my terrain Splatmap, in my terrain, terrain distance closer to the camera, the terrain is black, I added Splatmap not display correctly, thank you $colormap.jpg
     
  27. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    That's not an issue with TerrainComposer, but probably there's a terrain shader in your project that is doing this, as I see some specular going on, could be ats shader or the triplanar shader. Some packs from the Asset Store come with additional terrain shaders, for example many Michael O art packs. If you would create a terrain manually with Unity and paint it manually you would have the same issue.

    You can delete the shader or you can set it up, with those shaders you have to assign a script to each terrain and set things up there.

    Greetings,
    Nathaniel
     
  28. ayina

    ayina

    Joined:
    May 30, 2013
    Posts:
    3
    Thank you for your reply, I re-create a scene, no problem, thanks
     
  29. Deleted User

    Deleted User

    Guest

    eagle555 this is not what i really mean :/. I will try to figure it out by my self and if i will find something i will post the results.
     
  30. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    I think you mean you want to blend different types of terrains?, for example mountains, planes, desert etc. Yes this is possible, I do this in the video, only it's a small scale and subtle, however if you would make the zoom higher in the perlin function in the subfilters (in the procedural landscape project) you will notice that there's two landscapes.

    This is a screenshot I just made with zooming in on both subfilters and creating a larger terrain. Now you can better see there's two landscapes in there.

    $terrain_mix.jpg

    That's one way to do it. You can also make each terrain seperately what you're doing now, then you export the heightmaps with TerrainComposer. For example if you have 3 heightmap raw files of 3 different terrain. Now you can create 1 heightmap layer and 3 filters with the input on Raw Heightmap, select you heightmaps and define in a subfilter in each filter the area it covers, you can do this with a perlin curve, or create an image with different colors (a color for each type of terrain) like I do in the island tutorial.

    I can show you on skype with screenshare ;), just contact me at my email.

    Greetings,
    Nathaniel
     
  31. Deleted User

    Deleted User

    Guest

    Yes i am a bit overwhelmed with work and any help would be really nice i could also explain what i mean on Skype so its very nice of you to offer such help i will contact you on email as soon as possible so we can set date for such conversation.
     
  32. CaptainChristian

    CaptainChristian

    Joined:
    Apr 3, 2013
    Posts:
    100
    Hi,

    I bought Terrain Composer a couple of weeks ago and until there is an API to generate objects procedurally on runtime I am stuck with coding it myself. I don't mind doing so, but I encountered two problems. Somehow I cannot access all terrains under my terrainparent gameobject and I cannot place objects on the ground. All objects float above the ground at the same height. Could you tell me how to access all terrain data, please. I guess once this works, objects stop floating mid-air.
     
  33. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
  34. CaptainChristian

    CaptainChristian

    Joined:
    Apr 3, 2013
    Posts:
    100
    I already found those two references, but I cannot get my head around combining all subterrains into a single for such operations only. I don't want to merge them together technically for LoD and other performance reasons, but I would still like to access all of the data as it was a single huge terrain.
    To be specific: how do I combine the terraindata of all subterrains as if it was a single terrain.

    I want to generate settlements and create roads inbetween them across terrain borders. A hint would be appreciated.
     
  35. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    That is not directly possible, but you have to code a function that searches for the terrain relative to it's position. You need a Generatic List or an Array of all the Terrains. And then loop through them if the transform position is inside your coordinates and if so returns.

    With this code I just programmed it should work. You have to put all terrains under a parent GameObject for it to work, and assign the parent GameObject to the 'TerrainParent' in the script. Then you can create a cube, assign it to the 'cube' in the script, and then click play, and drag the cube around in the Scene view to see the terrain height at the position of the cube.

    If you need the C# version let me know.

    Code (csharp):
    1. #pragma strict
    2.  
    3. // Assign the Terrain Parent GameObject to TerrainParent
    4. var TerrainParent: GameObject;
    5.  
    6. var terrains: List.<Transform> = new List.<Transform>();
    7. var terrainRects: Rect[];
    8.  
    9. // Assign a test GameObject to the cube to test
    10. var cube: Transform;
    11.  
    12. function Awake()
    13. {
    14.     // Create an Array of all the transforms from the children (terrains) of the parent GameObject
    15.     var terrainsTemp: Transform[] = TerrainParent.GetComponentsInChildren.<Transform>();
    16.     var terrain: Terrain;
    17.    
    18.     // Create a Generic List without the Parent GameObject in the Array
    19.     for (var countTerrain: int = 0;countTerrain < terrainsTemp.Length;++countTerrain)
    20.     {
    21.         // checks if item from list is a Terrain
    22.         terrain = terrainsTemp[countTerrain].GetComponent(Terrain);
    23.         if (terrain){terrains.Add(terrainsTemp[countTerrain]);}
    24.     }
    25.    
    26.     terrainRects = new Rect[terrains.Count];
    27.    
    28.     // Create another Array of Rect that contains the area of each terrain
    29.     for (countTerrain = 0;countTerrain < terrains.Count;++countTerrain)
    30.     {
    31.         terrain = terrains[countTerrain].GetComponent(Terrain);
    32.        
    33.         terrainRects[countTerrain].x = terrains[countTerrain].position.x;
    34.         terrainRects[countTerrain].y = terrains[countTerrain].position.z;
    35.        
    36.         terrainRects[countTerrain].width = terrain.terrainData.size.x;
    37.         terrainRects[countTerrain].height = terrain.terrainData.size.z;
    38.     }
    39. }
    40.  
    41. function getTerrainTile(position: Vector3): Terrain
    42. {
    43.     for (var countTerrain: int = 0;countTerrain < terrains.Count;++countTerrain)
    44.     {
    45.         if (terrainRects[countTerrain].Contains(Vector2(position.x,position.z)))
    46.         {
    47.             return terrains[countTerrain].GetComponent(Terrain);
    48.         }  
    49.     }
    50.     return null;
    51. }
    52.  
    53. function getTerrainHeight(position: Vector3): float
    54. {
    55.     var terrain: Terrain = getTerrainTile(position);
    56.    
    57.     if (terrain)
    58.     {
    59.         return terrain.SampleHeight(position);
    60.     }
    61.     else
    62.     {
    63.         return -1;
    64.     }
    65. }
    66.  
    67.  
    68. // Test getTerrainHeight function with the cube GameObject
    69. // Display terrain height based on position of cube
    70. function Update()
    71. {
    72.     var height: float = getTerrainHeight(cube.position);
    73.     Debug.Log("Position: "+cube.position+" height: "+height);
    74. }
    75.  
     
    Last edited: May 31, 2013
  36. CaptainChristian

    CaptainChristian

    Joined:
    Apr 3, 2013
    Posts:
    100
    A C# version would be tremendously helpful. Thank you.
     
  37. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    Here's the C# version:

    Code (csharp):
    1. using UnityEngine;
    2. using System.Collections;
    3. using System.Collections.Generic;
    4.  
    5. public class GetTerrainHeight : MonoBehaviour
    6. {
    7.  
    8.     // Assign the Terrain Parent GameObject to TerrainParent
    9.     public GameObject TerrainParent;
    10.    
    11.     List<Transform> terrains = new List<Transform>();
    12.     Rect[] terrainRects;
    13.    
    14.     // Assign a test GameObject to the cube to test
    15.     public Transform cube;
    16.    
    17.     void Awake()
    18.     {
    19.         // Create an Array of all the transforms from the children (terrains) of the parent GameObject
    20.         Transform[] terrainsTemp = TerrainParent.GetComponentsInChildren<Transform>();
    21.         Terrain terrain;
    22.        
    23.         // Create a Generic List without the Parent GameObject in the Array
    24.         for (int countTerrain = 0;countTerrain < terrainsTemp.Length;++countTerrain)
    25.         {
    26.             // checks if item from list is a Terrain
    27.             terrain = terrainsTemp[countTerrain].GetComponent<Terrain>();
    28.             if (terrain){terrains.Add(terrainsTemp[countTerrain]);}
    29.         }
    30.        
    31.         terrainRects = new Rect[terrains.Count];
    32.        
    33.        
    34.         // Create another Array of Rect that contains the area of each terrain
    35.         for (int countTerrain = 0;countTerrain < terrains.Count;++countTerrain)
    36.         {
    37.             terrain = terrains[countTerrain].GetComponent<Terrain>();
    38.            
    39.             terrainRects[countTerrain].x = terrains[countTerrain].position.x;
    40.             terrainRects[countTerrain].y = terrains[countTerrain].position.z;
    41.            
    42.             terrainRects[countTerrain].width = terrain.terrainData.size.x;
    43.             terrainRects[countTerrain].height = terrain.terrainData.size.z;
    44.         }
    45.     }
    46.    
    47.     Terrain getTerrainTile(Vector3 position)
    48.     {
    49.         for (int countTerrain = 0;countTerrain < terrains.Count;++countTerrain)
    50.         {
    51.             if (terrainRects[countTerrain].Contains(new Vector2(position.x,position.z)))
    52.             {
    53.                 return terrains[countTerrain].GetComponent<Terrain>();
    54.             }  
    55.         }
    56.         return null;
    57.     }
    58.    
    59.     float getTerrainHeight(Vector3 position)
    60.     {
    61.         Terrain terrain = getTerrainTile(position);
    62.        
    63.         if (terrain)
    64.         {
    65.             return terrain.SampleHeight(position);
    66.         }
    67.         else
    68.         {
    69.             return -1;
    70.         }
    71.     }
    72.    
    73.    
    74.     // Test getTerrainHeight void with the cube GameObject
    75.     // Display terrain height based on position of cube
    76.     void Update()
    77.     {
    78.         float height = getTerrainHeight(cube.position);
    79.         Debug.Log("Position: "+cube.position+" height: "+height);
    80.     }
    81. }
     
  38. CaptainChristian

    CaptainChristian

    Joined:
    Apr 3, 2013
    Posts:
    100
    Thank you again. I am going to knock myself out with the prodived code.

    Looking forward to the API documentation to fully unleash Terrain Composer on my terrains.
     
  39. iKronos

    iKronos

    Joined:
    Sep 1, 2012
    Posts:
    14
    Hi eagle555,
    Is TC compatible with "EasyRoads"?
    If not, are you planning to make it compatible?
    BR
     
  40. Deleted User

    Deleted User

    Guest

    iKronos Terrain Composer effects the terrain and its not terrain it self so every shader, plug-in and other things that effect terrain will work without a problem i have Easy Roads my self and everything works like a charm.
     
  41. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    As Thinker already answered :), yes this is all compatible.

    Greetings,
    Nathaniel
     
  42. CaptainChristian

    CaptainChristian

    Joined:
    Apr 3, 2013
    Posts:
    100
    Do you know, by any chance, why getting steepness with the following code returns the wrong results:

    Code (csharp):
    1. terrData = GetTerrainTile (vector).terrainData;
    2.            
    3. if (terrData == null)
    4.     return 999999;
    5.            
    6. terrSize = terrData.size;
    7. normalizedPos = new Vector2 (Mathf.InverseLerp (0.0f, terrSize.x, vector.x),
    8.                                  Mathf.InverseLerp (0.0f, terrSize.z, vector.z));
    9. steepness = terrData.GetSteepness (normalizedPos.x, normalizedPos.y);
    I am getting weird return values that don't make any sense. All vectors below a specifc treshold are drawn with DrawRay() and from the looks of it, steepness is calculated with the wrong parameters. Some subterrains are completely blank while others are filled with repeating patterns, like lines after lines placed behind each other. I used the same code with minor alterations for standard single terrains, which returns the correct positions.

    Do you have any idea why multi terrains could pose a problem?
     

    Attached Files:

    Last edited: Jun 4, 2013
  43. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    I think the problem is with your code. Why do you use inverse lerp to normalize your local position?

    first you should get your local position inside the terrain, and then devide it by the terrain size to normalize it :


    Code (csharp):
    1. Vector3 position = .... <- your world space measuring point.
    2.  
    3. Terrain terrain;
    4.  
    5. terrain = getTerrainTile(position);
    6. Vector3 terrainSize = terrain.terrainData.size;
    7.  
    8. Vector3 localPos = position-terrain.transform.position;
    9. Vector3 normalizedPos = localPos/terrainSize;
    10.  
    11. float steepness = terrain.terrainData(normalizedPos.x,normalizedPos.z);
    12.  
    the steepness is slope of the terrain at the point, it return a float, if you want to calculate the normal you have to use TerrainData.GetInterpolatedNormal

    Greetings,
    Nathaniel
     
  44. CaptainChristian

    CaptainChristian

    Joined:
    Apr 3, 2013
    Posts:
    100
    Gee, thank you. It is working like a charm. The 90$ are well invested.
     
  45. subone

    subone

    Joined:
    Feb 27, 2013
    Posts:
    26
    Awesome Tool ! :)
     
    Last edited: Jun 9, 2013
  46. dbrian

    dbrian

    Joined:
    Jun 1, 2013
    Posts:
    32
    Hello Nathaniel -

    Can you talk about compatibility with the ats ULTRA shaders?

    (https://www.assetstore.unity3d.com/#/content/4722)

    Does Terrain Composer do anything special with the terrain shaders? If I have splat maps can I still use Terrain Composer to create my objects and trees etc.?
     
  47. SimtropBuggi

    SimtropBuggi

    Joined:
    Feb 15, 2013
    Posts:
    98
    I would love to use this to create the prototype of my game but I have zero budget at this early stage. Any chance for a 'try before you buy' or limited functionality trial version?
     
  48. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello,

    TerrainComposer works with standard Unity terrain. So you can use any shader for it, there's no influence on shaders or anything, also the manual terrain editing still works. Yes you can use TC to do only objects or trees.

    Best Regards,
    Nathaniel
     
  49. dbrian

    dbrian

    Joined:
    Jun 1, 2013
    Posts:
    32
    Excellent, thanks. Two more questions -

    1. I didn't see an example of the stitching feature in the videos. Does this actually fix/average mesh seams? What does the stitching do?
    2. Will there be an upgrade cost for 2.0? When do you expect it released?

    Looking forward to a purchase!
     
  50. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    That are good questions.

    1. Stitching isn't needed if you use TerrainComposer for heightmap creation, it automatically fits perfectly, however if you have terrains already there and they need to be stitched TerrainComposer can do that. I improved the stitch function in version 2.
    2. No there won't be any upgrade costs. I want to release it somewhere this month.

    Best Regards,
    Nathaniel
     
    Last edited: Jun 15, 2013