Tuesday, April 10, 2012

New Look

It was a nice quiet long weekend. I had some spare time to sink into this project. While it has nothing to do with procedural generation, I was always bothered by the plain generic look of my Voxel Studio application. So I decided to give it a new look.

This is really a waste of time. Only one person in the entire planet is using this program (you guessed who), but hopefully this may change in the future. For us who spend so much of our lives looking a computer screens I think we should make our software pretty and fun to use.

Here are some screenshots:





The biggest change was I moved all the commands into a single "ribbon" interface. I was never a fan of the ribbon when it was introduced by Microsoft. Now I see it does make the UI simpler, especially for a program you never used before. I like the fact there are no modal dialogs anymore. It also creates more space if you want it. The ribbon can collapse, then it behaves similar to a traditional menu.

Something the screenshots don't show is the docking system for all the views allows to extend your workspace across different monitors. This is how I normally use this program.

27 comments:

  1. That's a _very_ sexy UI.

    The programming endeavours you post about on this blog are the dreams of many, including myself.
    Keep up the good work! :)

    ReplyDelete
  2. For some reason the layout reminds me of QtCreator... which is by no means a bad thing. :)

    ReplyDelete
  3. A good GUI is never time wasted. If nothing else hopefully it will benefit your workflow. In the long run I've no doubt it'll be very important.

    ReplyDelete
  4. The update _does_ look impressive. It's a lot of work, but as pointed out above, even if you're the only user for now, it makes sense to improve your own workflow. That is time well spent and the screenshots are inspiring as always!

    ReplyDelete
  5. My initial thought on seeing the images: oh nooo, it's the ribbon!
    But it seems that if it's well implemented it can turn out pretty good.
    I'm not a big fan of custom UIs, especially if they're disobeying operating system's settings (think about disabled and old people who use high contrast settings). Don't take it as offence, I like this very much and I'm quite generic and plain guy myself which may be the reason to favour such interfaces :D

    ReplyDelete
    Replies
    1. Well you are right about this. This interface is a nightmare if your vision is not good. I'll think about this. Accessibility, same with localization, are pretty low in my list.

      Delete
  6. Impressive.
    Clean, structured layout, reconizable icons, good use of color and contrast. Most UIs get only one or two of those right.

    Even though I dislike ribbons (especially Microsoft's implementation of it) I must say I really like what you created.

    ReplyDelete
  7. My stars.. that's slick. Cool icons, ribbon interface, a 3D GUI that glows. I'm hoping there's going to be a public release.

    ReplyDelete
    Replies
    1. Thanks, about a public release I have to confess I am a bit torn. I still don't see how enthusiast content creators out there can use this tool beyond being a cool toy.

      Some of the components can be used in small projects, like the elevation editor (which is similar to WorldMachine), also the L-System generator which can export the buildings you create to COLLADA. But the real use of this program is to generate a large dataset of meshes for a virtual world, including forests and cities. Something you would use in a larger project like a game or CG movie.

      I am using it for a game, it requires me to load these meshes in the client side. For someone else to do the same, they would need to consume these meshes as well. This requires a different level of investment that may be beyond what the typical enthusiast/hobbyist may want. It would make more sense for a small game studio to get this tool than just an individual.

      It seems I have to think more about use cases for this program. Your insight will really help me on this one.

      Delete
    2. I think there's a decent number of people who would use something like this to aid in the creation of fantasy worlds for things like tabletop RPGs or novels. A friend of mine just used a much more primitive world generator I built to create the first-stage maps for the tabletop fantasy RPG book she'll soon be publishing. I'd love to see what she would have done with a tool this advanced.

      Delete
  8. Looks great! I can't wait to be able to play with this myself, at some point.

    ReplyDelete
  9. What gui library are you using for VoxelStudio / game engine? Or is it an C# app? Is this Microsoft's ribbon from dotNet / MFC or is it an alternative implementation like e.g. Wolfire has done in HTML for his game.
    Looks good though :)

    ReplyDelete
    Replies
    1. It is a managed C++ .NET app. Although the 3D rendering and generation is offloaded to an unmanaged C++ DLL. I found the managed performance was not good. The ribbon is from a third party component library.

      Delete
    2. This comment has been removed by the author.

      Delete
    3. Would you mind sharing what third part component library? It is indeed very pretty and an alternative to using .NET/WPF would certainly be welcomed.

      I'm really impressed with how professional and complete this program is looking. With regards to your earlier comment about not being sure what to do with it: I really think that you are underestimating the desire for/value of a cool "toy". I for one, and I think I can speak for many, would be fascinated for endless hours given the depth and control over massive world creation that you seem to be exposing to the end user, regardless of whether or not I had the resources to share it with some other user simultaneously. If I wanted to do that so bad I could just have them come over!

      Of course, if you intend to market the final product and sell it for a profit, I can understand why you'd want to further consider its industry applications.

      Delete
    4. It is the Krypton component suite for .Net

      Delete
  10. This comment has been removed by the author.

    ReplyDelete
  11. It's a little beside the point of your post, but your fluvial erosion is beautiful. What kind of process do you use to generate it?

    (Forgive me if you've posted about this previously, but I don't see it discussed in the archives.)

    ReplyDelete
    Replies
    1. Thanks. Now that you mention it, I realize I have never covered that stage of the generation. I will do it in the short future.

      For the fluvial erosion I ported the classic algorithm by Ken Musgrave to OpenCL, with some modifications. Here is the original article:

      http://www.kenmusgrave.com/Old_Stuff/files/dissertation.pdf

      Delete
    2. Hmm. I was hoping you had figured out a less progressive, context-sensitive approach, like some form of modification to the noise function. This kind of extra post-processing step won't work so well for my application.

      When you say "that stage" of generation, I assume you mean the macro stage, i.e. continents, oceans and mountain ranges, as I mentioned in my other comment? I've been putting a lot of thought into that over the years. My more recent ideas haven't been implemented yet, but I'm leaning increasingly toward a simplified simulation of actual plate tectonics. In loose terms, divide the map into tectonic plates, give them each a different composition (may be as simple as setting them as oceanic and continental plates), and a direction of movement. Then use those properties to figure out what kind of fault lines are on their borders, and generate features near those faults (coast lines, mountain ranges, continental shelves, etc.).

      Delete
    3. Yes, we all hope to find a replacement for this time consuming methods like fluvial erosion. I wonder if it is possible at all.

      Procedural generation methods can be either local or global. Local methods can be evaluated for individual points in space with no dependencies to neighbor points nor previous runs of the method. Some examples are Perlin, Simplex and Worley noises.

      Global methods are closer to simulations. The results you get for a single point are dependent to points somewhere else in the dataset, there is also acknowledgement of time and cause-effect dynamics.

      Local methods are quite fast, but also quite fake since they do not produce any information. What you get can be cheaply reproduced every time out of some simple seeds. Our eyes can see through that. As Carmack said, they are just crappy compression.

      On the other hand, global methods are able to produce interesting results because of their global nature. This is the same thing that makes them a lot slower to run. You can make them run faster by optimizing their bottlenecks, but I don't think you can get around the fact they are global. From the time they become local, they also become predictable and boring.

      Delete
    4. Ah, what you call local and global, I usually call context-independent and context-aware.

      My approach has been to use global methods for large scale features, so I can store low resolution data for very large quantities of terrain, then stick to local methods for the small scale features. The key discovery that made this ready feasible was learning how to take a 2D spline and map a generated terrain along it, such that x represents distance from the spline and y represents progress along the spline. Then, I can use a local method to generated the terrain that's mapped to spline, but my options become much more interesting, because there is now a meaningful sense of directionality to them. For instance, using a triangle wave as the first step in generating a mountain range. This directionality also gives you just enough context that you might be able to do those sorts fluvial erosion, though I haven't experimented with that.

      With this, my global methods merely need to output a set of supplies representing large scale features, like mountain ranges and river valleys. I haven't yet put all the pieces together, but I have high hopes for this general approach.

      Delete
    5. Well maybe you are on to something. I would love to see some of your techniques in action. If you have a site or even screenshots you can drop them here.

      My reservations come not from experience, but from hunches out of information theory. I feel our brains can discover redundancy vs. entropy quite easily. For this reason a local methods will never be good at fooling us in the long term for large features, even if they manage to fool us for some time while we adapt. But this is just a feeling.

      I also use global methods down to a resolution of six meters. Their output is fed to the local methods, which have features overlapping scales from 100 meters to one tenth of a meter.

      Since the global methods run coarsely, the time they take is negligible compare to the rest of the generation, which includes forests, architecture, politics, lighting, etc. In this light, they are hardly the bottleneck. It actually makes sense for me to have high quality results instead of opting for faster but faker models.

      Delete
    6. My experiments with splines were something like 4 years ago, and while I remember the techniques I used, I'm not sure if I could dig up the tech demo I made.

      That said, I intend to revisit the technique soon. Progress is slow, because I have a demanding day job, but I'll let you know as soon as I have something to show.

      For reference, my website is spiritofiron.com, but I don't actually have much up there. Just the primitive world generator my friend used for her RPG book. It's still a fun toy, though.

      Delete
    7. I dug around and found the source code for my old spline-shaped terrain demo, but it's suffered some pretty bad code rot. I think it would take most of my weekend to resurrect it.

      So I'm gonna go back to my current project, which is getting marching cubes working in the GPU. Once I have that, one of the first things I'll be doing is re-implementing the spline algorithm.

      Also, I wanted to mention: Your work is astounding, and inspiring. It really underscores for me what procedural generation can do, and has inspired me to try some new directions. Thank you, and keep it up!

      Delete
  12. Wow, it looks really great. You really make me want to use it and play around with the randomness :)

    ReplyDelete
  13. Wow, really looking forward to this!

    This would go great with something I'm working on:

    A game in which players and npc's take the different roles in archetypical story scenarios. The story-driving is so much work, I was leaning towards some really simplified graphics but with this I might be able to create a much more immersive experience! Great stuff!

    ReplyDelete