Search Unity

[Released] Tessera : Generate 3d tile based levels with Wave Function Collapse

Discussion in 'Assets and Asset Store' started by BorisTheBrave, Nov 28, 2019.

  1. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64


    Documentation
    Asset Store

    Procedural generation can generate some awesome results, but it's often tedious to put together the assets. Tessera combines a state of the art generation algorithm with a convenient UI that lets you control the generation by "painting" information onto the sides of your tiles.

    • Fast WFC generator
    • Paint connectors between tiles
    • Control the frequency of individual tile occurences
    • Use existing game objects as constraints to guide generation
    • Use big tiles that occupy the space of multiple cubes



     
  2. one_one

    one_one

    Joined:
    May 20, 2013
    Posts:
    621
    Great to see a WCF asset for unity! I was really impressed by the level generation in Bad North and the developer held a super interesting talk on that. However, one of the issues mentioned in the talk is this: What are good strategies to get more control over the output? WCF is great for local similarity and coherence, but might be quite tricky to get the desired results on a larger scale.
    I quickly went through the documentation and saw a couple of additional constraints, like fixed tiles, skybox and count constraints. But I was wondering if there are ways to tie the output to some sort of ground plan or pre-defined map perhaps?
     
    Gekigengar likes this.
  3. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Directing the generation is definitely a problem worth thinking about. The tools that come with the package do help quite a bit. Here's a few suggestions for how you can use them to get large scale results. I don't think you can do this with any old WFC, these are mostly features specific to my addon.

    1) You can use Tessera just for "infill". That is, you design the boundary of the level (using fixed tiles) and then just generate the central parts. That means you can generate large arenas, or standardize the exits and entrances etc. That could be your ground plan suggestion.

    2) Going further on infill, you can even generate parts of your level a different way, and then let Tessera join up all the remaining bits. Bad North does this, iirc - it generates paths to the houses first so they are always walkable, then generates the rest (of course, that particular use case is covered by the Path constraint in Tessera anyway).

    3) The Path constraint (in the Pro version) is incredibly powerful, and it works globally. One trick I've found is if you use fixed tiles to force there to be walkable tiles at either end of a map, the Path constraint forces there to be a path between them. You can use this to, e.g. draw a road across the map, force rivers and so on. Having a clearly defined path from one end to another is already a huge amount of legibility to a level.

    You can play with a Path constraint set up like that here: https://www.boristhebrave.com/2018/04/28/random-paths-via-chiseling/

    4) You can run the generator multiple times, on different segments of the map, using different settings for each one. This is a simplified version how Caves of Qud works - it has different templates for different areas, all in one map.

    5) You can add a lot of large scale structure to a game just be designing your tiles carefully. Like in my castle demo, because there are no solid tiles that have empty space underneath them, Tessera is forced to build the castle on solid foundations. That is a long distance relationship between tiles, in pure WFC. With care, you can do a lot of tricks like this.

    I'd be interested in your suggestions for further features.
     
  4. one_one

    one_one

    Joined:
    May 20, 2013
    Posts:
    621
    Thanks for the quick and in-depth reply! To clarify my perspective a bit: my main use-case is 3D building generation from modular parts. Surprisingly, I'm not aware of any lightweight unity assets that are allow for flexible & pain-free authoring and which don't try to generate the entire damn geometry procedurally.

    1) Yeah, true, "infilling" is probably the best approach for layouts. But that would also need to come with a constraint about how many additional corners are allowed (none, for rectangular layouts, for example.) I think this can be stream-lined with some (probably quite simple) authoring tools, though. I'm thinking about gizmos in the editor to place corners and then re-trigger generation, for example. I'd say that specifying the shape of the ground floor and the number of floors covers a lot of authoring needs for buildings (combined with a clever model/tile setup). I imagine it could work very much like this, with the ground polygon and floor parameters specified by the author or external logic and WFC/Tessera filling in the gaps.

    2) Yep, indeed! In the context of buildings, this could be great to allow users to drag & drop a rectangle for example to place the corners, or perhaps do it procedurally based on some lot creation, like this medieval city generator. That's sort of what I meant by 'large scale' shapes. I also saw that you're currently cooking up a 'click and place' workflow, I'm curious to see where that leads.

    3) That is very true and I think it'll be very handy for generating navigatable interiors!

    5) Yep, that is true and likely something I'll just have to get a feeling for by playing around with it for a bit.

    Anyway, these are my thoughts for 3D building generation - I got the basic version and I'll dabble around with it in the coming days, probably also trying to come up with some simple authoring tools & workflows for that.
     
  5. Blargenflargle

    Blargenflargle

    Joined:
    Feb 24, 2019
    Posts:
    92
    Hi! This is EXACTLY what I've been looking for. I have some questions though.

    1. Does this dynamically unload far away tiles?
    2. When it creates meshes out of tiles does it create those meshes in "chunks" similar to say, how a minecraft world is loaded?
    3. Can you save the data it creates to be loaded later? So can I pre-generate maps?

    For any of the above questions, if the feature is not implemented, would it be fairly easy with some C# experience to make it work that way? Thank you!
     
  6. Blargenflargle

    Blargenflargle

    Joined:
    Feb 24, 2019
    Posts:
    92
    Another question, is Tessera capable of outputing meshes with the 32 bit mesh index buffer format? Thank you in advance.
     
  7. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    No. By default it creates a game objects for every tile. You're free to attach behaviours to those tiles though, so you can attach any culling mechanism you like. Using the C# API, you can get generate the tile placements without creating game objects, then instantiate them later at your leisure, which is even more performant.

    It does not. You would have to amend the code for this. Or you could run the generator itself multiple times, once per chunk. The Castle sample shows how you can run a generator multiple times. NB: If you run the generator in chunks in a non deterministic order, you will get non deterministic output.

    I don't see why not. You can literally run it in the editor and save the scene.

    Yes, that's the default.
     
  8. Cicaeda

    Cicaeda

    Joined:
    Sep 29, 2017
    Posts:
    34



    Palettes don't seem to work as I expect them to. Tile connections are succeeding when they should, but not failing when they should. I have the palette object slotted into the tiles. Is this a Pro-only feature, am I doing something wrong, or is it a bug?
     
  9. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    It should work on the basic version of Tessera. Have you set all Tiles to use the same palette? Otherwise, I cannot see what the issue would be.
     
  10. Cicaeda

    Cicaeda

    Joined:
    Sep 29, 2017
    Posts:
    34
    I recreated the palette multiple times and very meticulously made sure I was assigning the same one to each tile. I even tried re-opening the sample scenes and starting from scratch a few times. I'm not sure what happened, but it works now after restarting the editor. Unity is messing with me or something. Sorry about this.
     
  11. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    Hi there. Been playing around with generating city tiles with pretty good results. The tiles are 20m2 with a bunch of child objects. When I then try to apply this to an irregular mesh things get a bit wonky.

    The first thing I discovered is that I had to spawn the root object (not just child objects) as the transformed game objects would scatter all over the place.
    tiling gone wrong.png
    There are probably simple solutions to that but the immediate solution was to keep the root object.

    The second issue is a lot more problematic. As I generated a lot of tiles (roughly 100) with perhaps 10-20 child objects the number of meshes generated is pretty huge.
    Tile Knight City Irregular grid 4.png
    The problem comes when I try to enter play mode all of the generated meshes seem be lost. The collision meshes interestingly appear to be kept around. Needless to say working with it a bit of a pain. Wouldn't really want to persist them either unless intend to keep them around permanently.

    Overall I'm very please with the results. The constraints are working very nice. Using the path, count and separation so far. The deformation of the meshes are much less noticeable than I expected on the ground level.

    Not sure this approach is really feasible on large scale for performance reasons. Particularly the amount of meshes that you'll need will likely affect rendering efficiency quite a bit.

    A more likely approach is to generate the topology and then use placeholder objects and replace them with the prefabs or something to that effect.
     
  12. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    I'll look into this, but i'll be able to give a faster response if you make a test scene that demonstrates the problem and send it to me (my email is in the docs).

    Yep, totally. I've already dealt with this though. If you add the "Mesh Output" component, it'll merge all the meshes together into a single game object. It's vastly faster to generate, and more efficient to render (though of course having one giant mesh also has it's problems).

    You have some great looking visuals there. Would you mind if I shared that on social media? If so, how should I credit you?
     
  13. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Hmm, I've not noticed that. Can you try commenting out the following line in MeshUtils and seeing if it helps:
    Code (CSharp):
    1.                 mesh.hideFlags = HideFlags.HideAndDontSave;
    2.  
     
  14. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    I'll poke at it over the weekend!
     
  15. softscience

    softscience

    Joined:
    Jan 30, 2014
    Posts:
    5
    Hi Boris! Have been playing around with Tessera Pro a bit and had a question regarding irregular grids as surface meshes!

    I wanted to try to test a layered structure using an irregular grid and the tiles defined in the castle example scene. However adding layers always seems to yield a result similar to the one pictured below - where the bottom later doesn't align with the layers above, and the layers above retain there overall vertical profile. Have tried both using backtracking and repeat solvers.

    Tessera.png

    Lmk if you have any ideas! Thanks in advance! :^)
     
  16. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    softscience, could you send me an example scene by email demonstrating the problem? My email is in the documentation.


    Just an update for the thread, freya did contact me with a sample, and I was able to fix the issue. It's due in the next release.
     
    softscience and freyzorr like this.
  17. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Just to update the post, softscience sent me an email, and I was able to fix a few days later, and supply them with a fixed copy.

    I've just submitted Tessera 3.1.2 for approval on the asset store, that contains this fix and several others:
    * Fixed Instantiate Only Children to work with mesh deformations
    * Fixed "BoxColliders do not support negative scale or size" warning.
    * Fixed generation on mesh surfaces with multiple layers
    * Volumes work with generation on mesh surfaces
    * Improved Smooth Normals setting
     
    oshoham and freyzorr like this.
  18. Kai_Gil

    Kai_Gil

    Joined:
    Apr 21, 2013
    Posts:
    7
    Hi BorisTheBrave! Amazing asset. Thanks for all your hard work!

    I wondered if you could speak a bit about the conditions that cause a failed generation?

    I want to create a looped track generator using curves, straights, and grass tiles from the Kenny set.

    upload_2020-8-7_14-35-42.png

    upload_2020-8-7_14-36-28.png

    This works fine when I don't use path restriction and a skybox tile (based on the middle tile in above images)

    upload_2020-8-7_14-38-37.png

    BUT it gives me more than one loop at times. So I tried settings a path constraint:

    upload_2020-8-7_14-39-46.png

    And I got lots of errors - failed generation!

    upload_2020-8-7_14-41-32.png

    I then tried 'seeding' with an initial restriction by putting a straight tile in the area.... that didn't work much either, until I lowered the corner tile weight down to 0.2!

    I got much better results, but don't really understand what's going on. Why the failure? It failed even more with the above settings when I then made the generator much larger in the XYZ size vector. :(

    Any clues?
     
  19. Kai_Gil

    Kai_Gil

    Joined:
    Apr 21, 2013
    Posts:
    7
    Here's the generator settings:

    upload_2020-8-7_14-45-42.png

    BTW any time I set things to Backtrack Unity would get stuck in a loop and crash. :(
     
  20. Kai_Gil

    Kai_Gil

    Joined:
    Apr 21, 2013
    Posts:
    7
    Interestingly, just tried larger number of retires (200) and this gave more consistently successful results :D

    Was hoping that backtrack would be able to do that for me I guess.

    Still don't quite understand why things were failing so much before. Any help appreciated :)
     
  21. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Try turning on backtracking, it makes the generator try hard to find a result.
    You can also try try the "Prioritize" setting in the path constraint, though it is less likely to help.
     
  22. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    It's failing because the path constraint does not have perfect foresight - sometimes it'll generate a combination of tiles that cannot be completed while keeping the required constraint. The case you've got (a single winding path) is particularly bad for this, as it cannot add a fork to solve any problems that come up.

    When it gets into that situation, you can either restart from scratch (retries) or undo the most recent change (backtracking). The larger a map, the more likely it is to end up in that situation, and the less likely that you'll be able to get a complete result if you restart from scratch at the first sign of trouble.
     
  23. XRA

    XRA

    Joined:
    Aug 26, 2010
    Posts:
    265
    Hey @BorisTheBrave I've been messing with Tessera, it's great, but wondering if it would be possible to have the same behaviour of "seeding" pre-tiles when using a surface mesh.

    That behaviour doesn't seem to work with surface meshes, is there a spot in the code I could investigate to add support for it?

    I understand that with the surface mesh there would be the same behaviour as the generator bounds (which would result in a gap where the distorted tile is missing) but that is fine for my purposes. Though if it could just fill in the same seed tile within the closest distorted quad that could be nice too.

    Another thought is to allow tagging/painting quads of the surface mesh with a tile color for pre-placement rules. I might be able to just make a custom constraint for that though.

    *Edit* The reason for wanting to pre-seed the surface generator is so I can generate/place branching paths that get converted to surface meshes for the WFC to generate within, but it would be important to ensure entrances/exits to the surface link up with other WFC Generators in the scene using the pre-placed tile behaviour.
     
    Last edited: Sep 14, 2020
  24. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Yes, this has not been implemented yet. It's tricky, but self encapsulated if you want to have a go.

    The relevant method is MeshExtendedTopology.GetCell, which takes a tile and a transform (as a Matrix), returns true if the tile fits into the mesh. It also sets cell as the triple (face, layer, submesh), and rotation with one of the values from CubeRotation, which determine where in the mesh it goes, and at what orientation.

    This isn't a bad idea, but not on the radar right now.
     
  25. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Hi XRA, I've done some investigation, and determined that it's harder than I intimated. So I recommend you leave it - I will to add support for initial constraints on meshes into the next version.

    If you DM me an email address, I can arrange an early copy for you to try out.
     
  26. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    I have been pondering a similar issue as well. How to control specific areas of a irregular quad mesh. We have the different materials and you can get quite some mileage out of those, but you can't really control the rotation or reflection or place complex multi cell hero pieces.

    What I'm thinking is that you actually want to control some perimeter around an area. And how you control is via Tessera is via the tile palettes. So how can we place our regular tiles in the expected deformed shapes. One way I can think of boils down to:
    • populate the whole build area (mesh+layers) with "empty" game objects with only tiles and perhaps some form of visualization to make selection easy.
      • you would treat each cell as the constraints on it self. For example, you mark a single cell/tile with one blue wall and you would expect that cell to be populated with something that matches that blue wall and what ever surrounds it.
    • Then you can pick the now deformed cells you are interested in and set the surface palettes to edit the perimeters your interested in.
    • You can now use these marked edges to guide the generation process.
    You can probably use this process to create a tile/cell mask that could replace the material concept.
    • Mask a area by tagging or indexing the cells created previously
    • Define a generation pass that takes a mask, any pallet tile constraints defined and a list of tiles and then generates only those masked cells
    1. generate the entries
    2. generate the exits
    3. generate the hero pieces
    4. generate the rest
    That way you can then use a selection of the "empty" markup game objects as deformed guides to create hero content so it will automatically have the right palettes and the right shape to fit into the jigsaw.

    This might also be useful to assign exclusion zones.

    Oh dear, that was a mouthful. I hope there is a at least a trace of coherence in this, the terminology is all over the place :D

    Anyway, still a fan and want to see this product keep evolving and thriving. \o/
     
  27. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    That's another feature that's kinda on my todolist. I was envisaging a TesseraPlane component which lets you force the cell paint between a pair of cells. But it would be easier implement your way, and I guess logically equivalent.

    Really, the whole mesh feature is awesome, but underdeveloped. I don't have time do everything at once, but now I'm seeing interest here, i'll focus my attentions.
     
  28. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    Yeah, initially I was thinking of polygon perimeters where each edge is cell wall with paint. But then I thought that we already have a way to deform tiles into the final mesh shapes so why not let the tool generate the cells and you can focus on picking out your area of interest and setting the paints using something familiar, more cube tiles. Sort of like a guide track or layer.

    You can then play with tools to help with that like applying the paints from a tile to a particular map cell to and then rotate or mirror it according to the tile settings.

    I see bunch of untapped potential here :)
     
  29. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    New version nearly ready now. I've listened to your ideas and it's now possible to have a initial tile constraint that only uses the faces, it doesn't actually occupy space. Plus things work on meshes now. That should enable some of the stuff you suggest.
    It's not released yet, but you can browse the docs here.

    I'm also working on some major updates to the internals of Tessera, that will probably become version 4.0.0. They aren't ready yet, but it'll enable things like hexagonal tiles. Here's a sneak peek.
     
  30. Arsonide

    Arsonide

    Joined:
    Nov 16, 2009
    Posts:
    43
    Boris I've had your asset for a while, and it's pretty neat. I just started trying to use it for a practical purpose. I already have a question. I'm in a situation where I have various road intersections, then straight roads of various types. Each straight road I'd like to only connect to other straight roads of its type.

    I was under the impression that the tile painting was an OR relationship, so I painted green on the intersections, red and green on straight 1, yellow and green on straight 2, and blue and green on straight 3.

    Of course, it is not an OR relationship, it's an exact match. Is there some way to easily set up such an OR relationship? My immediate thought is that I can turn each straight road prefab into two prefabs, one that connects to intersections and itself, and one that only connects to itself.

    I'm hoping there is perhaps an easier built in way to do this. If not I can go with this solution.

    EDIT: Ah that doesn't work of course, the transitionary pieces all have green (to connect to the intersections), which allows them to connect to each other.
     
    Last edited: Oct 11, 2020
  31. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Arsonide, please check out setting up a Palette in the documentation. You can change the color matching from exact match to anything you choose.
     
  32. Arsonide

    Arsonide

    Joined:
    Nov 16, 2009
    Posts:
    43
    Thanks! This steers me in the right direction. To be honest I didn't know what "palette" meant yet and assumed it just let you pick custom colors for the gizmos, not actual logical changes.

    EDIT: Yeah this did the trick, thanks. I did find a bug though. In TesseraTileEditorToolBase on line 369 there's an argument out of range exception.

    Reproduction Steps:
    1. Using the default colors, paint the sides of something with some of the "higher index" colors.
    2. Make a palette with 3 colors.
    3. Swap the thing with the higher index colors to the 3 color palette.
    4. Hover over the sides of the painting cube gizmo.
    At this point you should be getting exceptions and the gizmo will start behaving strangely. Solution was to erase all of my painting before swapping the palette.
     
    Last edited: Oct 12, 2020
  33. StevenPicard

    StevenPicard

    Joined:
    Mar 7, 2016
    Posts:
    859
    That looks great!

    A feature I'd love to see is automatic navmesh generation.
     
  34. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Thanks Arsonide, I've identified the issue and will fix soonish.

    Steven, I haven't experimented, but I don't see what feature you need. You can simply run the generator, then rebake the navmesh. Both of those can be done at runtime.
     
  35. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    I have been making house recently and have been getting pretty nice results. upload_2020-10-18_14-6-6.png
    It's often a bit of a struggle figuring out why something does not work. It's almost always either the lack of compatible tiles or incorrect tile palettes. But it can be hard to figure out exactly what. Most often I just get a single error with no information to tell me why the generation failed. There are a few things I can think of that can help.

    • Tile size and offset could probably be scriptable objects to reduce errors when creating tiles and making sure the generator is compatible
    • If would be nice to have a select pile painting option. It's unfortunate when you are inspecting tile and you accidentally modify the tile instead. Having a non-modifying paint mode might mitigate that.
    • There does not seem to be a way to enable Tile Paint mode via shortcut. There is a 'Main Menu/Window/Tile Painting' that sound like it should work but it has not effect. It would be be nice to have shortcuts for the paint modes as well.
    • Is would be great to have a tool to verify tile colors settings. I find it useful assemble tiles to try to figure out how to set the tiles or what tiles are missing. If there was perhaps a component where it would test all it's children. Check tile color connections and mark any inconsistencies causing two adjacent tiles to fail. Some times it can be hard to spot the one square with the wrong color. Especially since you can have colors not match or match depending on the palette rules. You could also make sure all tile have the same size set and the same palette.
    • Being able to see the generator skybox (tick box?) can also be useful. I had a case where I had changed my skybox tile palette a while back but the instance the generator used was apparently different and it took me a long time to figure it out. It's always good to be able to verify what is actually assigned versus what you think is assigned.
    • It would also be nice to have a tile auto spread component you could place on the generator game object and have it create a nice tile spread showing all the game objects/prefabs assigned. It similar to the skybox issue. It can help you be sure you are working on the actual used objects but not some unrelated tile.
    • When using the Animated Generator often don't get any console feedback when it fails. It would be cool to highlight the tiles where we have run out of options so it's easier to spot where we failed. Similar to the uncertainty tile but only placed where we have zero valid options.
    • It would be nice to be able to force a Tessera Tile to always show the un-colored bounds and the tile center with a tick box. It would help when aligning assets with a tile. That would also make it easier to move the tile with the bounds visible.
    • The docs are bit thin on the new Pinning component. It would be helpful to have some practical examples of how it is meant to be used. Can it go on an empty game object? should it align with the referenced tile center. Does it work for mesh generation? I didn't find any examples using the component in the demoes. There is also an error in the docs where Pin type FacesOnly is called FacesAndInterior (https://www.boristhebrave.com/permanent/20/05/tessera_docs_3/articles/constraints.html#pinned)

    Tips
    • Assigning scene view shortcuts to front/right/top to numpad 1/3/7 like blender does makes it much easier to align things in tiles when working. I added perspective mode swap to 5 and CTRL+1/3/7 to get the opposing sides. If find myself using isometric mode a lot when working with tiles.
    • ProGrid is excellent for snapping to a grid. Especially when all the assets are well structured and grid aligned.
    • When changing prefab tiles in scene you must remember to apply the override changes to the actual prefab.
    • I've been using MonKey productivity to to quickly parent assets to tiles. That way I can place a tile around some assets and then quickly reparent them using the Set Parent command.
    • The path constraint can be used to force your generated object to one connected chuck. As in one house rather than two or separate houses. One island rather than many.
    • I have been using blender scripts to cut objects in half and quadrants using the bisect operation. I also use it to set the pivot points. Besides me being bad at blender, it allows be to easily import/export fbx files, make precise axis aligned cuts and rename the objects (left, right, front rear etc)

    I haven't gotten around to try out the Bolt support yet but I see great potential to setup where Tessera is a integrated into a bigger generative pipeline. I imagine theming may become a post process step where you can swap assets between variations and switch materials. Or even generate in layers using stuff like the pinning and existing tiles.

    That was post has become longer than initially intended :) Looking forward for Tessera 4 and the hex support. I have some great assets to test those :D
     
  36. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Looks great. I don't think I'd have been able to tll that was generated.

    Some great suggestions, I'll have a look which ones I can get done. Doc fixes I will prioritize - no point making things if they are too complex to use.

    What's best practise with unity shortcuts? I didn't make any as I was worried they'd clash with something else.
     
  37. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    I'm not sure about any best practices. My suggestion would be to make the operations available and then leave it up to the user to set them. Another approach would be to look at the default shortcut layout and look at what is unassigned and perhaps only put assign the most 'most used'. For me at present that would be paint mode toggle. There is a nice keyboard map that shows all the assigned keys when you open shortcuts.
     
  38. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    I think a analyzer to verify an arrangement of tiles would probably be on the top of my list of features. I provide a layout of tiles and the analyzer would tell me (preferably visually) what tiles contradict each other. Ideally it would test palette colors, rotations, reflections, skybox and each constraint assigned.

    I suspect it would be difficult to figure out where exactly a constraint fails since it's going to be specific to each constraint and might end up being more complicated than the constraint it self :)

    For example knowing that everything checks out except the path constraint fails would imminently narrow things down.
     
  39. freyzorr

    freyzorr

    Joined:
    Jul 26, 2015
    Posts:
    30
    A small quality of life tweak would be to add an enable check box on constraints to be able to temporarily disable them. Quite useful during testing. Otherwise you have to remove the constraint component and then you loose all the settings.
     
    Yany likes this.
  40. protopop

    protopop

    Joined:
    May 19, 2009
    Posts:
    1,561
    I downloaded version 4.2 of Tessera pro and there were a few errors on import

    Assets/Tessera/GeometryUtils.cs(10,43): error CS1061: 'Rotation' does not contain a definition for 'RotateCw' and no accessible extension method 'RotateCw' accepting a first argument of type 'Rotation' could be found (are you missing a using directive or an assembly reference?)

    There's no errors in a clean project. Maybe its a conflict with some Rotation defined somewhere but im wondering if anyone has any ideas?

    UPDATE: It was a conflict. I use NPR paint filter, and it had a Rotation.cs class. I deleted the file and tessera works fine
     

    Attached Files:

    Last edited: Jun 21, 2021
  41. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Glad to hear that.
     
  42. awesomedata

    awesomedata

    Joined:
    Oct 8, 2014
    Posts:
    1,419
    Any chance at some more advanced tutorial videos? -- I'm enjoying this asset, but the one tutorial (while it is really great) doesn't really do much for me. A competing asset has better tutorials, but in my opinion less flexibility.

    However I only know this because I actually read your documentation.

    You really should beef up the more advanced tutorial stuff and show how to create the multi-tiered landscape with your tools. I forget how to use the more advanced features of this when I come back to it and have to reread everything all over again each time. So making it a bit more accessible would do wonders for everyone -- including new customers. D:

    ==
    Some other feedback:

    An "overlay" showing the "filled-in" painted color of the face (such as how the other asset has 2d circle widgets to prevent the need for the x-ray mode) would be a nice viewing option (and make this tool a lot more fun to work with!)

    In lieu of that, at least a quick shortcut key to toggle the x-ray mode on/off, while not as fun or nice to use as the circles filled with color, would at least keep from having to go back-and-forth with the EditorWindow and palette. A second shortcut key to swap between the most recently used two colors would be handy as well. That, or simply check for the Shift or Alt key to know which of the two (or even three) most recent colors you're painting. This would speed up that workflow immensely.

    If you need to know how to implement single-key shortcuts (like the X key in Photoshop to swap or cycle through the top 3 most recently-used colors), let me know. I'm a fellow asset store developer myself and specialize in UX workflows.

    That said -- it would be nice to want to use this tool more often. Until now, I've been using existing tools in Houdini for this exact task. I would love to switch to Unity for this task, assuming the workflow can be improved. :)
     
    Last edited: Jun 28, 2021
    Yany and one_one like this.
  43. LineKernel

    LineKernel

    Joined:
    Dec 11, 2013
    Posts:
    46
    hi @BorisTheBrave , i have a few questions :

    in the next build can you expose the seed please , if seed == 0 seed is random etc ...

    also in the documentation in Quality and performance at the very end in Path Constrain , you wrote "Avoid if it possible, for example, by pre-generating your path and using pins to make tessera use it."
    Is there a way to generate only the path first ? then the level ? or you are saying , make the path manually then generate the level ?

    what does "pins" mean ? you just put tilles in the generator space and they re pined right ? or there is something more ?
    EDIT nvm i found the documentation about pins
    https://www.boristhebrave.com/permanent/20/05/tessera_docs_3/articles/constraints.html#pins

    last : in Multiple pass doc you say : "You can even nest TesseraTiles inside other TesseraTiles, setting instantiateChildrenOnly on the parent tile so that the nested tiles alone are output to be used as pins in the second pass."
    is there any way to get an exemple of that ?


    Thank you so much for this asset , it s really amazing ! i m having so much fun .
     
    Last edited: Jul 3, 2021
    awesomedata and StevenPicard like this.
  44. LineKernel

    LineKernel

    Joined:
    Dec 11, 2013
    Posts:
    46
    hi , i have some question about path , i ve been doing tests/stats to see how it works but it feels luck based .
    i went back to a really simple tileset because it was really not working in a complex 3d layered tileset
    i seems to me that the path coudnt resolve overhangs .

    so i m trying this setup with 2 path tiles a straight path tile and a turn path tile
    and a few environment tiles (wall , 2 wall corners , and a floor)
    the success rate is kinda low , at best i get a 30% chance to complete the path (or the level aka "infinite loop")
    (path constrain color and tiles , connected and parity gives the best result)


    this tileset forces the path to close from the entrance to the exit of the level . if it doesnt succeed , we get the infinite loop of removing the few local tiles over and over again .

    as soon as i add a crossing T tile , the chances drops to 1% so i m wondering about the path .


    i tried 2 path tiles straight and turn , with an empty tile compatible with anything but the path color and it doesn t complete .



    here comes my questions :

    is weight prioritizing over path completion ?
    is there any path completion aim or is it systematically random ?
    is there something i m doing wrong ? is there a way to get a 100% completion rate ?
    (i m not talking about backtracking and retries)
    will you work on the path latter ?
    (i need to know if i can use it 100% runtime-generatively or if i should think about it like some asset generator that have have to manually tune).
     
  45. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Hi, sorry for the late response, I didn't get pinged about updates.

    > is weight prioritizing over path completion ?

    No, it's kinda a mix. The prioritize option puts heavier weight on paths, but it's still a mix.

    > is there any path completion aim or is it systematically random ?

    Random. This is why the manual reminds you that you can do your own path generation if you prefer.

    > is there something i m doing wrong ? is there a way to get a 100% completion rate ?

    I think it would be hard to guarantee. Path constraint is pretty fiddly. You do get better rates for smaller generations or simpler tilesets. Note that the Parity setting only works if you have no forks or dead-ends. Normally I've found adding forks improves the completion rate, as there are more ways of resolving difficulties. Have you considered adding a dead end tile, too, even with low weight?

    > will you work on the path latter ?

    I am investigating some ways of improving the search quality, but am not specifically looking at path improvements atm.
     
  46. LineKernel

    LineKernel

    Joined:
    Dec 11, 2013
    Posts:
    46
    Hi , no worries , that s why i went on twitter , is there a better way to ask questions/communicate ?
    just answering your last post :

    you can do your own path generation if you prefer
    - by doing path generation you mean programming it right ? or manually putting tiles in place ?

    simpler tilesets
    - i've reduced my tileset to it s minimum and made the generator flat to verify why my path was not working on my advanced layered tileset

    Have you considered adding a dead end tile, too, even with low weight
    - i tired everything , nothing gives 100% completion rate , i mean it depends on the size of the generator , but large gen or overlapping layers fails a lot or 100% of the time.
     
  47. awesomedata

    awesomedata

    Joined:
    Oct 8, 2014
    Posts:
    1,419
    Curious if you saw my post above?
     
  48. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    @LineKernel

    > - by doing path generation you mean programming it right ? or manually putting tiles in place ?

    Either

    > - i tired everything , nothing gives 100% completion rate , i mean it depends on the size of the generator , but large gen or overlapping layers fails a lot or 100% of the time.
    maybe send me a sample project file. There's definitely a chance of failure, but it's not been so bad on my own tests

    @awesomedata :

    > Any chance at some more advanced tutorial videos?

    Maybe, not that soon. It's a lot of work, and I feel the docs aren't that bad? Perhaps you want some better samples instead?

    > An "overlay" showing the "filled-in" painted color of the face

    Not sure what you mean?

    > In lieu of that, at least a quick shortcut key to toggle the x-ray mode on/off,

    You can toggle show backfaces with "Z". Not sure what you mean by x-ray mode. You're right i should do more with shortcuts and general usability. How about X to toggle switch to last to colors, E to switch to eraser, A to toggle Show All and Shift-A to Hide All (set opacity to zero or undo it)? Could definitely do with more advice on this.

    > in Multiple pass doc

    This is poorly documented and demoed, I plan a overhaul soon.
     
  49. awesomedata

    awesomedata

    Joined:
    Oct 8, 2014
    Posts:
    1,419
    You should probably take a peek at your competitor's videos. What I was referring to here is when you hover over a face (or a backface), show a little icon or overlay someplace (i.e. around the object or mouse cursor) to indicate what color of face that has, letting users easily see and "colorpick" whatever color that face has quickly to apply that "color" to other objects/faces. Being able to quickly preview the color for similar-enough colors (i.e. green/browns of a similar contrast) is very difficult sometimes for semi-colorblind people (like me) who need to see the color in isolation to tell the difference.


    Mainly just the ability to see through the object/cube to more easily pick or color the face _without_ always seeing the colorbox overlay over the prefab (and making that box temporarily either invisible or more transparent) -- This would be used in conjunction with the color "overlay" mentioned above to still show the color under your mouse (especially to be used with the colorpicker and color tools over a face of the transparent or invisible box/faces). This would make editing prefabs a bit easier/faster to visualize -- especially with shortcuts.

    Still hides the prefab too much. I'd like to see through the colored-box more (or hide it altogether).


    I'd let X swap between at-minimum the last _three_ or _four_ colors used (maybe let this be user-configurable?) -- I can see myself using top/side/bottom and need to quickly swap between these 'colors' easily as I turn and zoom around my prefabs. A little display to show what "color" you have currently (i.e. grass/dirt/water) is definitely useful.

    As for the Eraser, simply holding Shift and then clicking (or right-clicking) to "erase" a color would be much better. It is also consistent with Terrain tools. But yeah, "A" would be consistent with Blender's "Select All" and "Deselect All" faces, so it seems like it could be easy to translate. Not sure what you mean by "opacity or undo it" though. I'd say set the opacity to a user-configurable value (i.e. potentially non-zero) when you "hide" things though, so the user can still see it if they desire. Then again, this could go back to the x-ray thing I mentioned -- and you can simply disable the "hidden" things.


    It doesn't have to be anything but a screen-capture showing "this is how you do 'x' and 'y' -- and a better video might be coming later". Context-sensitive explanations or slightly better visual tooling/grouping of functionality could help too for those of us who just want to quickly jump in without scouring the docs, but you definitely need one or the other to be a bit visible. I, thankfully, understood the basic premise (and details) of how this tool is supposed to work under the hood (and exactly why it sometimes fails). I fear others might have a much harder time with this. Besides, a little hand-holding is not only kind and considerate -- but good for your sales too.

    I nearly didn't buy this because there weren't any clear video tutorials. The Asset Store isn't all that reliable sometimes, so not only do you get "information" from the videos, you also can see the product _functioning_ properly. Therefore showing off the advertised features -- especially the advanced ones -- functioning properly would likely increase your sales by quite a bit for those of us looking at your competitor's slightly more intuitive UI (thanks to his videos filling in some of the "getting started" hurdles). Learning a new tool in Unity is slow -- especially one as advanced as this one. Those videos do ease some of people's fear in using your tool. Just saying.

    When a person says something is "too much work" -- I say "so is anything worthwhile in this world."
    Just food for thought. :)
     
    StevenPicard likes this.
  50. BorisTheBrave

    BorisTheBrave

    Joined:
    Nov 18, 2018
    Posts:
    64
    Yes, I know my tool kinda sucks if you are color blind (though it does have tooltips). Unfortunately, as there are 9 sub faces per face, it can get kinda crowded to use icons. I haven't figured out how to display those in the editor anyway.

    I am adding some simple shortcuts covering what you ask, but your specific proposals are too complex - both to implement, and for users to understand. I've set Shift-A to set the opacity to zero, and pressing it again restores it to the original value. That's sufficient to peek at the underlying tiles. I like the suggestion of using Shift to mean erase. Any suggestions for the other modifier keys?
     
    awesomedata likes this.