A Unity ID allows you to buy and/or subscribe to Unity products and services, shop in the Asset Store and participate
in the Unity community.
Discussion in 'Assets and Asset Store' started by Wright, Mar 10, 2016.
P.S. Did you do something special with the terrain textures in the demo ?
Is there a way to use multiple graphs in a scene? It seems as if there should be (or you would be stuck with only one type of terrain) but I can't seem to figure out how to do it.
I'm on the prowl for the bug, which drives me nuts. I've changed the source to use a dirty flag at the OnGUI call and moved the trigger for the calculation of the spectral weights to the top of the Generate method. Before I compute the weights, I check, if the flag is true and the correct algorithm type is active, otherwise I return without computation. I don't know why but this looks more stable. (Actual implementation: http://pastebin.com/Db979n51)
However from time to time, the issue still exists but it should not, if you see the condition check log output with timestamp of the execution:
As you can see the last entry shouldn't be executed by a condition check of if(i>SpectralWeights.Count).
Any idea how this could be happened?
Wavinator, I really like the look of the terrain you created! Great job!
The says about the mask:
I think I'll add some mask use cases as examples to make it clear.
To do that you need to assign heightmap as an input for a texture layer. It could be adjusted with the curve to be more contrast. Actually, you did everything right in your graph for the Floor texture.
The slope generator could be used to determine the normal of the land surface. And again, I see that your graph deal with it the right way.
And this is not available by the default. Maybe making a custom generator of a slope and modifying it a bit could be used to achieve it.
I was going to make some experiments with turbulence myself.
MM uses a singleton pattern - there could be only one object per scene. I cannot imagine two infinite terrains in one scene. How could they get along together?
The way I see the multiplayer is that each client has it's own piece of terrain. There is no need to generate the terrain for all of the players since the client can see a terrain only from his character's view.
But this feature could be required if we need to switch between characters fast, otherwise this switching should not happen immediately - like in GTA V. I'll think about it.
The pinned terrains are not generating in a playmode, and it is the only kind of terrains you see in editor. If they will not have objects it will not be possible to set them up for the playmode. If they will have objects - then all the terrains will have them without exceptions.
Thanks! I'm really glad to hear that!
Right now I'm trying to make MM fully compatible with Unity 5.4 beta - hunting for some bugs that are very hard to trace. But the upcoming week I plan to devote to video tutorials and documentation.
Nope. And what could I do with them?
Hellhound_01, hold on, I'm going to look through your code asap. And yes, Map Magic uses multithreading to calculate terrains in a background while the game is running, so it all could be related with threads somehow.
Well for distance your terrain textures look really nice. I've been using Relief Terrain Pack v3.3 to do the terrain shading, but in the distance it looks very flat and smooth. Close up is great. I think I need to play with it some more.
If I could get the look of your terrain for distance and the close up of RTP I would be happy.
Great that you are doing some more tutorials. I've been playing with this all weekend and some things are beginning to make sense. Really enjoying it.
Just took a look at the Demo you posted and I am amazed !
The only question I have is that I see I can manually paint on the terrain after it's finished. But when I regenerate it kills the changes I have just applied. Do you know if there is a way to save painted details onto a terrain square. Say for example I manually create a river type area (Not from the procedural generation) is there a way to have it so that the tool will save this so that the next time I click generate it doesn't destroy those "customizations"?
Also is there a way such that I can pain on details onto the terrain then apply filters to this (for example erosion). In World Machine I can create a layout shape as a generator and I can blend these into terrains.
Hope I'm getting myself across.
Edit: Btw HellHound I tried that Noise generator and it dodn't work for me do you have an updated version ?
Have been playing with the demo scene. Swapped out the trees with Speedtree ones, which also means they will rotate randomly when 'grown'. Also put in some higher resolution rocks.
Loved the way it looked so I thought I would share.
This is without RTP, so just as it came terrain rendering-wise.
This will work for non-authoritative games. Our server must fully simulate the physics of our worlds to update the client state, so generating around multiple transforms is a must for us.
I tried to isolate the issue yesterday afternoon but I failed, the issue still exists. With the last changes the occurrence of the ArrayOutOfBounds exception is relative rare, by this reason I will publish the actual development state today in the late afternoon, when I'm back from work. Thanks Denis I'm appreciate for your support, take all the time you need.
What did you tried out? The Simplex Noise Generator? Could you give me more details about the issues you have?
@Wavinator Thanks for sharing the set up of your demo graph. Do you use the standard Unity Shader's or some extensions?
@Freddy888 Really great job! I like your images.
As promised, here is the upload of the actual fractal noise generator: https://bitbucket.org/Hellhound_01/mapmagic-extensions.
The actual version fractal noise generator supports two base generator types: Simplex Perlin Noise and Improved Perlin Noise. Both generator types supports Fractal Brownian Motion (fBm), Billow Noise and Ridget Noise multi-octave value generation. Please take note that the actual version is still in development and contains a bug, which could result in an ArrayOutOfBounds Exception with ridged noise algorithm, if you try to modify the default ridged noise values in the node editor.
You have only to extract the included files in the main folder of the MapMagic Plug-in. Feel free to use, extend or modify it. If you found a bug or general issue I'm deeply thankful if you report an issue at the repository.
With only 1 graph then it sounds like you must have only 1 type of terrain for the whole infinite terrain. So if you have Voronoi for canyons the whole map must be only canyons / Voronoi. Or does this fall under biomes?
Quick question that I have not read anything about so far. If my terrain is infinite beyond the base generated terrain - is it possible to detect where the terrain starts being infinite ? I have an idea to keep the infinite terrain for visual affect, but prevent a player actually going into it. Did that make any sense ?
Freddy888, whow! Your screenshots look absolutely amazing! Keep up doing the great work!
You can limit pinned terrains with colliders. Btw it's better make a projector line or something in a collider prefab to mark the border visually - otherwise limiting player movement would be perceived as a bug (at least my past experience say so). But surely the best way to limit game zone is placing colliders at cliff slopes, stones and other obstacles.
If you will change the graph without changing some of the terrains they will fail to weld with the new terrains generated. So MM should not be generated after pinned terrain changed. But since that causes misunderstanding I'll think of some "lock" feature or something.
This is exactly the description of biomes. It is the most requested feature, so I'll start implementing it in a close future.
Thank you, but the real credit goes to you and all your work, I was just tinkering compared to what you have done
Thanks for the tip re the boundaries, I'll have a play with those ideas. I hadn't thought it might look like a bug, good point. Thanks !
@Wright, I've attempted to add support for multiple transforms controlling infinite terrain generation but couldn't get the code to cooperate. Could you give me a couple pointers on where/what needs changed and idea on the complexity of supporting this feature?
I saw a 1.1 version on asset store, suggest you post a changelog here.
New version was released yesterday. It has these fixes and improvements:
- fixed Raw Input lag
- fixed seams between LODed terrains
- demo scene merged with GUI scene
- Slope Generator fix on ridges
- pin/unpin undo fix
At a current time it got a one known downside of printing a warning (private field is assigned but never used) on import and compile.
It introduced the new Layout class, so custom generators might have a fix.
KyleOlsen, it's not an easy task, a lot of code should be reviewed. I think you'd better start with ObjectGrid.cs, Deploy function because it is the one who is responsible for terrain appear on certain coordinates. But I've got your point and I will think what I can do to implement a feature you request in future versions - or at least make it easier to implement.
Hi there, how long before we can have functional biomes all generating around each other? It's a very integral part of our game right now. Do you have any sort of an ETA when you can focus on that feature?
Hellhound_01, seems that I know where the problem is. You are changing array while the other terrain is still using it from the other thread. Its better not to change generator parameters from the Generate function or at least lock the changing array. I've tried to do so and seems that errors are gone. I can push the changes if you set the access value to read/write (bitbucket name akaWraith).
HolyFireGames, I've even had not started yet It feels like a work for a month, but it could be two weeks as well as two months.
I've uploaded a new version of my generator to regard the actual UI field changes of the Map Magic update to version 1.1.
@Wright Thousand thanks, this sounds great, I've changed the permission of the repository to write for you. BTW: Great job, the new field structure looks safe, stable and fast and is easy to handle.
Assets\MapMagic\Main\Layout.cs(458,59): error CS0121: The call is ambiguous between the following methods or properties: 'Extensions.ClampFromLeft(Rect, float)' and 'Extensions.ClampFromLeft(Rect, int)'
Still cannot reproduce it - I've tried both MM versions (1.0 and 1.1) and your Unity version. I guess it happens on script compile, but my log seems to be absolutely clear. Could you please try this file: Layout.cs, just replace the same file in Main folder. Btw what is your os?
Could it be that you've got a duplicate of MapMagic somewhere in your project (or at least Extensions.cs)?
A feature request for biomes: Allow infinite terrains to be generated at different Y axis levels.
Asking for this because it is difficult to have terrain features that are both detailed and very large. I find in general that maps need to be 2:1 width to height ratio to be easily playable / navigable. If you create terrain with reasonable dimensions (512x, z by 256y) generation is fast but all features will be no more than 256 units high. What if you want a map that has a mountain peak at 2048 and a sea floor at -2048? Of course if you try to make Y units that high the map will be severely distorted.
If map magic allows the Y terrain level to be moved up or down though, a gradient can be applied to the generated heights, causing them to rise/fall from one terrain to the next
I've uploaded a new version of my generator to regard the fix from Denis. Up from this point the generator is full functional and should be stable.
Now it's time to set off for new shores. I`ve started to make my first thoughts about a new generator for rivers and watersheds. Basically I want to generate different kind of rivers (brooks, rivers, streams, etc.) procedurally generated, which could extend over multiple tiles and end in lakes, ocean or merge with other rivers. The computation time should be modal and not too expensive and I don't want to simulate realistic natural hydro thermal erosion But the behavior of the river should be look like realistic, I want to have splines and curves to regard geological formations, move downhill regarding different levels including waterfalls and/or rapids.
I think a good start could be this concept: http://procworld.blogspot.de/2013/10/water-bodies.html. I know it's hard stuff and it's one of the showcase fields of procedural generation. By this reason, any idea is appreciated.
Wavinator, so, thinking in terms of the infinite land, but not the local terrains, your median terrain incline ratio should be equal to 2:1, right? You can achieve this in a easier way by setting your base heightmap, for example, the noise, to follow this rule:
- set the maximum height to 2000 with a terrain size of 1000. (I have not mixed up anything, height should be grater than size)
- set the noise size to 1500 and intensity to 1.
This is what you can achieve:
To be honest, I don't see a point of creating such a complex system like you described. Why does a terrain should be lifted? How to calculate a lift amount? How to blend a lifted terrain with the others?
Hellhound_01, I think that the main difficulty in creating rivers is in passing water flow from one terrain to the others. Since each chunk is isolated and, according to the MM concept, got no data from the neighbor terrain I dont know the way to do it. Yet.
You can try looking through erosion algorithm - it generates a torrent map, which looks like the one described in a blog.
Generate Thread Error:
System.NullReferenceException: Object reference not set to an instance of an object
at MapMagic.MapMagic+Chunk.ThreadFn () [0x00030] in D:\avalonlordsthegame\Avalon Lords\Assets\MapMagic\MapMagic.cs:531
I made this "river/lake system" (just using noise in MM) and of course, its super shallow, no waves, etc!
Haha I didn't realize that this was already possible. Thanks, that's MUCH easier!
@Wright Indeed this is one of the hard stuff (except the math behind that river things ) which should be solved first. I think it's also important for your upcoming biome stuff, because you have to regard the biome settings "at the other side" of the tile to avoid hard cuts and unfeasible natural transitions. I will start to rack my brain over this important things first.
@Exbleative Not bad, for a crossing stream/river. But what I expect is more like a realistic river network, starting from different river springs somewhere in/at the mountains on height level, floating always downhill to a lower level point to create a river mouth. On this way down the river could build up a graph with multiple branches and forms a riverbed. Branches and the main rivers could join together and form up larger river types and maybe converge to a crossing stream like yours.
Also curious Hellhound, how hard you found it implementing the simplex noise? I saw a great looking article here on Gabor noise: http://scrawkblog.com/2016/03/16/gabor-noise-in-unity/ and would love to try it out, but I'm really a rank novice coder.
Does this include full source? I have rolled own voxel terrain engine and I am curious if I could re-purpose your editor for spitting out noise results and the like. I understand I will need to modify the code, so I am curious if I can even do this and how well organized/intuitive is the code base is? Input from anyone who has already purchased the code would be helpful as well especially if you have dug into its modification.
frankcefalu, so I see you solved a compile error. What was that?
It would be great if you could provide some kind of hint about that error. Any clue would help, but I would be very glad to see the a description of the steps you took that caused an error.
Exbleative, you can try creating a simple custom generator first. It should not take much time and you can check yourself if you are able to create generators. And if you succeed than you can try creating a wrapper generator for the algorithm described.
Enoch, MM comes with the full source code. I've tried to make the code clear and understandable, but I'm also curious what will Hellhound_01 or anyone else who dealt with the code respond.
I was making a tutorial showing a creation of the large island (10*10 km).
Yesterday I was stuck trying to explain how to make a shoreline using curves, slope, cavity and blend. I decided it is too difficult for the beginner, so I devoted the whole day making a shore generator today. And here are the first pictures:
A bare land looks rather dull but this could be fixed. Btw I've used AQUAS-Lite as a water shader and I can truly say that it is an amazing asset.
@Exbleative Disregarding the bug, which I could only solve with the support of Denis, for me it was an simple task to write this generator. The code is mostly clear, the amount of classes manageable, and Denis extremely helpful. However you should know I'm an expert programmer (new to Unity and C# but more than 15 years experience with JAVA and C++). Furthermore I've started to implemented my own node editor several weeks ago before Map Magic get involved . By this reason the basics have been already done before I start to write this generator. You should follow the advise of Denis and start with the implementation of the simple custom generator first. It is well documented and includes anything you need to start.
@Enoch As mentioned before for me the code is mostly clear, the amount of classes manageable and I cannot repeat it often enough the support of Denis is incredible.
@Wright Gosch! It's amazing how you generate those things in the same way a magician pulls rabbits out of his hat. The first screenshot looks like a first view to Isla Nebula I'm looking forward to this tutorial.
Looks like the tool I´ve been waiting for a long time and will replace 5 other packages in my work pipeline ! And once Biomes are in, I can acutally use it in my current project.
But I have one question I couldn´t find an answer to: How does this work with navmeshs ? Especially for infinite terrains ?
Since it takes a long time to bake a large terrain, I cannot imagine how this could work.
It's better not to use anything baked on a dynamic terrain: not a lightmap nor a navmesh. A dynamic pathfinding should be used instead, using waypoint navigation, collision detection and steering behaviors. An open terrain is not a maze, so in most cases it will be enough.
Apex Path boasts dynamic pathfinding, but I have not tested it.
We are using Apex Path along side MapMagic with great results.
Just loading the demo scene. Also selecting the terrain and hitting show editor doesn't show any of the nodes. Is this correct? https://gyazo.com/d8d0dcf85242ed85afb4d355c55c89ae
During the last day I've spend every available minute to thought about a concept to share data between the isolated chunks. Here are my thoughts, starting with a simple example:
Assuming that a river or road is based on a path, which could be represented as a graph based on several (minimum two) nodes, I expect that a single node of a path must lie on one of the four borders of a chunk (I'm excluding the edges here first for simplification), if the path is stretched over two chunks.
In that case this node is a kind of connector which is the end point of the path of the chunk where it comes from and the start point of the path of the chunk where it goes through. By this reason I am currently see no way to generate those "connectors" seamlessly without a pre-computation of the chunk it comes from. Because each point on the border which meets any given condition to be a node, is only a candidate until the first part of the path has been completed (this will always the same using seeds at random calculations, but the adjacent chunks cannot forecast which node will be chosen by that path).
Up till now I had not the time to dig deeper into the source code, but I expect that the seamless terrain rendering is basically done by a computation of a 3x3 grid with 9 chunks, where the center grid always represents the active chunk where the camera/player is in. If the camera is moved, the surrounding chunks are updated and generated dynamically based on the move direction. This grid defines the area of interest (AoI) of the infinite terrain.
@Wright Could you confirm this first thoughts, especially the assumption of the AoI grid?
frankcefalu, is this error (NullReferenceException) is single or repeating? Is it the only error? If not - what is the first error after demo scene load? And what happened with a compile error? What is the way you got rid of it? It is important because I think these errors are related. Sorry for asking lots of questions, but I really need some information to reproduce the bug.
Hellhound_01, MM really uses a grid of terrains - their number depends on a generate range. But when the camera position goes to the next grid cell not all of the terrains are generated, but only the new ones. And their generating is done independently in several threads. Terrains are welded using a post-processing - once a new terrain is generated it changes all of the neighbors without recalculating them.
It seems that the most adequate solution would be forbidding a torrent flow awya from terrain, at least for now until one of us will be hit with a genius idea.
Would you be able to pin all the terrains automatically following the river's course (without immediately generating the terrain)? Then stitch them for the actual river generation as a post process? I don't know if that's a bad idea or not, mind
To know where the river will flow we need to generate a terrain first. But it got me thinking what if we will use low-resolution terrain preparation of neighbor terrains? It will not give not much accuracy, but it could be fixed on welding. Maybe it's just what lazygunn was trying to say; so all the credits for the idea should go to him
That would possibly also SEAMLESSLY transition into my wish-list item of generation of distant terrain
Anyone have any thoughts on how to reduce this jagged polygon effect?
It's really unfortunate, because depending on the exact angle of polygons/triangles vs the "direction" of ridges, sometimes my terrain looks super smooth, and other times (like above) it looks super low polygon and jagged. Since my game is about physics interactions on terrain, these jaggies are doubly unfortunate. There's no way MM or some other plugin or shader could sort of detect where this is happening and reduce it? I've tried dx11 smoothing shaders, but they don't help a huge amount and of course slow the game down too.
I almost need something that 'flips' triangle edges around based on these ridge directions Doubt that's possible especially with Unity terrains!
I've also come up with the idea of pre-generate the adjacent terrains of the actual grid to determine where the river will flow. I think this is the mechanism which is used by Minecraft. But meanwhile I think it's not enough. I am now convinced that the finite nature of the path itself is the problem.
Imagine we have two possible river springs in our actual chunk at position 0,0. One of the rivers will flow to the adjacent chunk at top at positon 0,1. Now we could pre-calculate this chunk (and the other maybe too) to determine where the river will will flow. Now we assume that this river will reach a lake in the top chunk shortly after it has passed a mountain. So far so good, in that case anything would be fine. But what if we have a river spring in this pre-calculated chunk at the opposite side of the mountain we have passed or at some other mountain. Unfortunately this river will flow downhill back to the direction the first river comes from and will cross the border far from the first crossing on the same border at the outermost edge? In that case we have a circularity ...
Or imagine that the map should be used for a RTS game (i.e. something like my favourite CIV). Here we have some other players and AI which starts at different positions. How we could ensure that anything comes together without pre-calulate everything?
I've racked my brain over it, and checked some seamless procedual algorithm like mitpoint displacement, Voronoi diagramms or Perlin worms to find a solution. But I failed until, yet ...
Exbleative, I doubt that there is something that can make the edges of the Unity terrain flipped. The only thing I can recommend is to increase a resolution (or a height output scale factor) with increasing of pixel error value. This will subdivide sharp edges leaving the other polycount approximately the same.
Hellhound_01, I think that small torrents and big rivers should be distinguished. For the big river the lowest point on the border should be taken, while torrents - I hope it will not be a big deal if a small torrents will not cross the terrain borders.
I think if someone were to choose to have a river feature in their terrain then they could choose to pregenerate the river tiles too and take advantage of Map Magic's ability to fill in the missing pieces. I'm using Map Magic quite a lot at the moment although admittedly not straying too far from the demo settings while I play it safe to get other things working and although I can imagine at run-time the terrain will be somewhat random, I will still have a pretty good idea how the terrain is going to work out, and can factor in a grace period for the terrain to pre-generate any needed areas
In the end i'd rather have the river and factor in the extra wait at load than not have it as an option.
That sounds not bad and maybe an opinion. Before I got too much headache from this theoretical stuff I've to play around with the generator. BTW is there a simple way to inject my own preview? I've think about a color layer where I could bring out some specific values colored in the preview (water bodies, springs etc.). Or should I add a texture preview to the generator itself?
lazygunn, if the river is really big it's better to use raw as a base map.
I'm still experimenting with splines in MM, but I hope I can make it without an enormous generate time increase.
Hellhound_01, it seems that the simplest way to preview water bodies and springs is to make a temporary outputs in your generator. Then you can output your springs map to them and preview these outputs.