Jump to content
  • Advertisement


  • Content count

  • Joined

  • Last visited

Community Reputation

13108 Excellent


About JTippetts

  • Rank

Personal Information

  • Role
    3D Artist
  • Interests


  • Github

Recent Profile Visitors

61195 profile views
  1. JTippetts

    Goblinson Crusoe

    Album for Goblinson Crusoe
  2. Been working some more on the editor. I've implemented the ability to tweak the lighting parameters of the level, including the Front (main) light color/brightness, the Back light color and brightness, as well as ambient and fog colors. A couple sliders allow me to control the fog distance and attenuation factors. I have also implemented tools to edit water. I can edit water directly, using a brush like the other editing tools, or I can control it via a filter to fill to a given level. I can also output to the water layer from a function node graph, and the water tools respect mask settings so that gives further ability to control water placement. I have also started work on object spawning. The way it works at the moment is that on application load I scan the Doodads folder. Inside this folder are a number of sub-folders, one for each doodad. A doodad has a specific setup in that each folder must contain a thumbnail image and an XML editor object definition that defines the structure of the object that will be imported into the editor. Another XML file defines the object as it is to be imported into the engine. The editor object is typically just a graphical placeholder, absent all the various game-play related componentry of the official object. After the Doodads directory is scanned, a master list of doodads is displayed on the left when the Doodads tool is selected, showing a scrolling list of all available doodads. On the right is a group window from which you can create and delete groups of doodads. When a group is created, a window appears above showing the currently selected group of doodads. Select a doodad from the master list and click Add to add it to the current set. In the doodad set, each doodad is associated with a Weight that determines the probability of selecting that doodad when applying the doodad brush. By adjusting the weights, I can make some doodads in the set spawn more commonly than others. After a doodad group is assembled, I can use a standard brush to 'paint' doodads onto the terrain. Applying a brush iterates the radius of the brush, and generates a random number per cell, then compares the roll against a probability factor adjusted by the brush hardness and power settings, to determine whether to spawn a doodad at the given location. If a doodad is to be spawned, one is randomly selected from the set based on the probability weights then instanced and added to the map. In addition to brush-based doodad painting, I can also run a filter to fill the entire map from a set. Both brush and filter respect mask settings, allowing me to use masks to constrain doodad placement to specific areas. Currently, only the Doodads folder is scanned. These are non-blocking, non-interactive scene decoration elements only. For game-play-enabled objects, I will likely use a similar system but with finer controls for single-object placement. Don't really want to paint Boss enemy spawns with a large-radius brush, I reckon. Or... maybe I do.... After I implement the object spawning system, I plan to clean up and semi-finalize the savefile format, then I need to make the necessary modifications to the game itself to load these levels. That shouldn't be difficult, since most of the pieces are already there.
  3. JTippetts

    Goblinson Crusoe Level Editor

    The river filter does depress terrain. It overrides the elevation of the spline knots, and instead allows you to specify elevations for the start and end points, tessellating the spline smoothly downgrade. The road filter works differently, preserving elevation at the knots and smoothly interpolating in between, so it can depress terrain if needed, raise terrain, etc... to preserve the smoothness of the curve. I need to implement some analytical tools for road splines, to help ensure that roads are graded correctly to allow pathfinding; GC can only step up or down by 1 step, so if a road is too steep it becomes impassable terrain. Adjusting the knot elevations to limit the grade of the spline segments should help with that, I think.
  4. JTippetts

    Goblinson Crusoe Level Editor

    Been awhile since I updated, but I haven't been idle. Mostly, anyway. The usual hindrances to my development time apply, of course, but I have made some progress. My big project lately has been to repurpose my terrain editor to build a level editor for Goblinson Crusoe. You can see some pictures of my initial efforts here: So far, I have implemented all of the functionality of the unfinished terrain editor (height editing, noise node graphs, etc...) as well as making a first version of spline groups to allow having multiple spline curves for use in road and river building filters. I iimplemented a color chooser for choosing the colors for main light (sun), back light, and fog/ambient colors. (Some of these changes, which are relevant to the original terrain editor, I have propagated backwards to the original project; others, though, are specific to the GC editor.) I have also implemented a slight change to the quad-planar shader the ground textures use, so that I can edit top textures separately from side textures. And of course, as with all large GC-related projects, it has initiated a round of major refactoring in the way that I load and construct levels. Next on the list is editable water, followed by spawn groups to allow spawning level objects, and saving those spawners. The way I'm thinking about spawn groups is to populate a spawns folder with a whole set of proxy objects. These proxy objects will include the graphical model for a level object, along with a Spawner component that provides an indirection link to the actual game object to spawn. This will let me do things like replace the spawned object without having to edit every instance of that object in the level, create spawn objects that randomly select from a set of objects at level load, and so forth. That way, I can randomize the contents of a level when it is loaded, rather than having to randomize at level construction and provide multiple 'copies' of a level for randomized variants. I'm still thinking about the exact particulars of how I want to set this up. I'm also working on a format and spec for randomly generated levels. Some set-piece levels will be static (or, at least, randomized only on certain contents) while others will be wholly randomly generated as they currently are. I hope to tweak the editor to facilitate construction of the various functions that will be used to shape and populate these random zones. That should keep me busy for another several months/years, given the sparsity of the actual time I get to spend on this. (If my wife would let me quit my job and start living off savings and retirement, it'd be a whole lot faster. For a little while, at least, until those bank balances run low. )
  5. JTippetts

    People really have no ideas on game development.

    You're not wrong in your first paragraph. There is a lot of crap out there. Your second paragraph was hilarious, though. Get a few years' experience, and you'll understand why I think so.
  6. I wrote some blog entries about this kind of thing a long time ago: The blog posts describe building randomized islands from chains of noise functions, and uses a very old version of my noise library. They're pretty old, and I've been meaning to update/rewrite some of that stuff for years now, but the gist of it is that you compose many different noise functions to obtain your results. In the island example, I use a circle function with a turbulence modifier for the island outline, various fractal layers to locate terrain types, and so forth. Example: You can see that there is no requirement that X terrain border Y terrain, as you fear, so long as you structure your functions correctly. Hooking into the functions to build a tile map is also doable: https://www.gamedev.net/uploads/blogs/monthly_01_2011/blogentry-47547-0-43024200-1296084301.jpg I put that image as a link instead, since it's kinda big, but it's a tilemap version of the above island. The linked blog posts describe the chain of noise functions used to create the island, though it may be a tad confusing as it's presented in the older, somewhat clunky, format my noise library used back then. Also, a lot of the functions are used for things such as providing the bump texture of forests and mountains for the image version of the map, and are not necessary for the tile map version; for the tile map, I only care where the various terrain types are. I really should update some of that old stuff.... Anyway, if you have any questions let me know.
  7. JTippetts

    Red Flicker down or right direction

    I doubt vsync is the culprit. Turning it off is probably just partially hiding the issue.
  8. Your issue #2 could be solved in a couple of ways: 1) Make an image that is seamlessly tiling in X using a 2D mapping technique. Note that a 2D mapping doesn't really fit well onto a sphere, without distorting. 2) Make an image from a spherical unwrap. You have some noise function, f, that takes as input a 3D coordinate (x,y,z) and an image that is sized WxH. You can iterate the image on X and Y, calculate normalized coordinates as X/W and Y/H, then apply a transformation of spherical coordinates to Cartesian coordinates as: for(x=0; x<W; ++x) { for(y=0; y<H; ++y) { float s=(float)x / (float)W; float t=(float)y / (float)H; // Spherical coords to Cartesian coords. float nx=cos(s*2*pi)*sin(t*pi); float ny=sin(s*2*pi)*sin(t*pi); float nz=cos(t*pi); PixelValue p = f(nx,ny,nz); image.SetPixel(x,y,p); } } The result of a transform like this gives you an image like: which when applied onto the surface of a sphere looks like: Since the image was generated from a spherical coordinate, there is no stretching at the equator or compression at the poles. (You can see that in the 2D mapping, it looks stretched along the top and bottom of the image; this is where the mapping approaches the poles of the sphere.) This depends on having your noise function defined as a 3D function, which is simple enough with Perlin noise. And there are no seams, because the spherical->Cartesian mapping ensures that the noise "wraps around" smoothly. 3) Skip the 3D function -> 2D image map -> 3D sphere technique altogether, and just generate the image directly from fragment coords in the shader itself (assuming that is where it eventually ends up). Of course, if you are using the image to distort a sphere like a heightmap, then this doesn't work.
  9. JTippetts

    Red Flicker down or right direction

    I built the project and ran it, and while I haven't really gone through the code yet, my initial test runs indicate that the problem is most likely with your animation state switching logic, rather than with the texture cache. What led me to believe this is that when you walk upward, if you repeatedly start walking then stop, you can sometimes see flashes of the downward-facing idle sprite, as just a flash of eyes that quickly disappears. This makes me think that the state switching is glitchy, which could be causing issues with sprite frame selection.
  10. JTippetts

    As a game dev, what are you most afraid of?

    Do we really need to make this thread about politics? Think very carefully about your answer.
  11. JTippetts

    Get rotation angle from normalized 2D vector

    I first made such a thing sometime in the late 90s. I assure, it's quite a trivial task. You should make time to learn your trade, or you'll be doomed to wallow in your ignorance for a long time. I won't play your game.
  12. JTippetts

    Get rotation angle from normalized 2D vector

    This particular combination of arrogance and ignorance you have going on is astounding, and not in a good way.
  13. JTippetts

    Get rotation angle from normalized 2D vector

    In C++: https://ideone.com/4DpoJf In Lua: https://ideone.com/oBZU7A From Wikipedia: This produces results in the range (−π, π]... I could go on. I mean, you could google this stuff to find out for sure. The internet is literally, like, right there. It's so easy these days, you don't even have to put pants on to do it.
  14. JTippetts

    Get rotation angle from normalized 2D vector

    atan2 returns values in the range -pi to pi, corresponding to -180 to +180 degrees. You can add pi to the result to get values in the range of 0 to 2pi.
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!