Jump to content
  • entries
    941
  • comments
    5,894
  • views
    870,325

About this blog

Learn about game development technology

Entries in this blog

Steam Dev Days 2016

I got back last night from Steam Dev Days 2016 in Seattle. This year focused heavily on VR, with Valve mentioning they are working on a new unannounced title built for VR. Valve also announced Steamworks will begin supporting the PS4 controller, with other controller support in the works.     This was also an opportunity for me to meet with a bunch of people on the Steam dev team and chat with other developers. I got a lot done! We're getting our Steam controller integration fixed, as I

Josh

Josh

Steam client update for Workshop Store

A Steam client update has gone out which improves the checkout process in the Leadwerks Workshop Store. When the user clicks the "Buy" button in the editor, the item will now be opened in the Steam client for purchase. You do not have to log into the Steam website with a browser to purchase Workshop items anymore.   You must opt into the beta branch of Leadwerks for this behavior to work. This will be the default when 4.2 is released.   More information here: http://store.steampowered.co

Josh

Josh

Starting with Shadowmaps on Vulkan

Now that we have lights working in our clustered forward Vulkan renderer (same great technique the latest DOOM games are using) I am starting to implement shadow maps. The first issue that came up was managing render-to-texture when the texture might still be in use rendering the previous frame. At first I thought multiple shadowmaps would be needed per light, like a double-buffering system, but that would double the number of shadow textures and video memory. Instead, I created a simple object

Josh

Josh

Starting with a Bang

Crowdfunding campaigns are a great way to kick off marketing for a game or product, with several benefits. Free promotion to your target audience. Early validation of an idea before you create the product. A successful crowdfunding campaign demonstrates organic consumer interest, which makes bloggers and journalists much more willing to give your project coverage. Oh yeah, there's also the financial aspect, but that's actually the least important part. If you make $1

Josh

Josh in Articles

Sprite Layers and the GUI

For finer control over what 2D elements appear on what camera, I have implemented a system of "Sprite Layers". Here's how it works: A sprite layer is created in a world. Sprites are created in a layer. Layers are attached to a camera (in the same world). The reason the sprite layer is linked to the world is because the render tweening operates on a per-world basis, and it works with the sprite system just like the entity system. In fact, the rendering thread uses the

Josh

Josh

Sparse Voxel Octrees

Previously I noted that since Voxel global illumination involves calculation of direct lighting, it would actually be possible to do away with shadow maps altogether, and use voxels for direct and global illumination. This can eliminate the problems of image-based shadows like shadow acne and adjusting the shadow map size. I also believe this method will turn out a lot faster than shadow map rendering, and you know how I like fast performance.  The sparse voxel octree node structure consume

Josh

Josh in Articles

Sparse Voxel Octree Reflections

I've now got basic specular reflections working with the sparse voxel octree system. This uses much less memory than a voxel grid or even a compressed volume texture. It also supports faster optimized ray tests, for higher quality reflections and higher resolution. Some of the images in this article were not possible to produce in my initial implementation that used volume textures. This shot shows the reflection of just the diffuse color. Notice the red column is visible in three reflectio

Josh

Josh in Articles

Sparse Voxel Octree Raycasting

I've got cone step tracing working now with the sparse voxel octree implementation. I actually found that two different routines are best when the surface is rough or smooth. For sharp reflections, and precise voxel raytracing works best: For rough surfaces, cone step tracing can be used. There are some issues to work out and I need to revisit the downsampling routine, but it's basically working: Here's a video showing the sharp raycast in motion. Performance is quite good

Josh

Josh in Articles

Sparse Voxel Octree Downsampling

I've moved on to one of the final steps for voxel cone step tracing, which is downsampling the lit voxels in a way that approximates a large area of rays being cast. You can read more about the details of this technique here. This artifact looks like a mirror that is sunken below the surface of some kind of frame. It was appearing because the mesh surface was inside the voxel, and neighboring voxels were being intersected. The solution was to move the ray starting point out of the voxel the

Josh

Josh in Articles

Source art files now supported in Workshop

You might not have noticed this, but Workshop items can now include the following file formats: "bmp","jpg","jpeg","png","tga","dds","psd","blend","fbx","obj","3ds","x","dae"   When Leadwerks installs Workshop items, the source art files are unzipped first, then the final files are unzipped, in order to avoid triggering a reconversion of the file. If you import an FBX and makes some changes to it, you can safely include the FBX in your Workshop package and it will install without reconvertin

Josh

Josh

Something Old, Something New

The new CSG editor is coming along nicely. Yesterday I implemented CSG rotation and skewing, and today I got object center and edge selection working. 3D World Studio uses GL_SELECT mode to handle picking in orthographic viewports, but this stopped being supported in ATI drivers a few years ago! I implemented a CPU math routine for picking brush edges. In orthographics viewports, brushes can be selected by clicking their center or any edge, while models only use the center for selection. (T

Josh

Josh

Some sample LE3 code

Here's some LE3 code for a simple program. The Graphics / Window stuff is not worked out 100%, and it's a little tricky because of the different operating systems and different kinds of windows.   I think we'll see a little more consistency across various languages with the LE3 syntax. It was suggested that the C syntax use the following scheme: verb-class-noun SetEntityPosition() GetMaterialTexture() I agree with this suggestion.   SetGraphicsDriver( OpenGLGraphicsDriver() ); Cre

Josh

Josh

Some hints of 3.0

This is a quick blog to fill you in on some of the features planned for Leadwerks Engine 3.0.   -Any entity can be a physics body. The body command set will become general entity commands, i.e. Entity.SetVelocity(). You can make an entity physically interactive with Entity.SetShape( shape ).   -Any entity can have any number of scripts attached to it. The basic model script functions will be supported for all entities, plus specialized script functions for certain entities. For example,

Josh

Josh

Some Changes...

Leadwerks 3 / 4 was aimed at beginners who were completely new to game development. Since we were the first game engine on Steam, this made a lot of sense at the time, and the decision resulted in a successful outcome. However, in the next engine we are taking a different approach. (This is a direct result of Steam Direct.) Enterprise is a new market I am pursuing, and we have a lot of interest from aerospace and defense VR developers. The fact that I am American also helps here. There are

Josh

Josh

Some backwards-compatible changes to the main script

The design of the App table in Lua was originally created to work with mobile, which has a more restricted program flow. The application calls App:Start() once to initialize it, and then will continually call App:Loop() until the function returns false. These two functions are found in the file "Scripts\App.lua".   Since we are focused on the PC now, it does not make sense to keep this structure. It also makes it more confusing to teach scripting. A conventional program layout with one mai

Josh

Josh

Snow Day

The last day of the season was today, so I was at North Star. We had a storm for the last three days, so the snow was pretty good, just sticky in some places. Even though it was a Sunday, crowds were not bad. Towards the end of the day, most people were hanging out at the lodge and the runs were completely empty. All in all, it was a pretty awesome day.

Josh

Josh

Smooth Move

Smoothing groups are one of the most frequently requested features for 3D World Studio, so I am happy to show you their implementation in Leadwerks3D, finally. Smoothing groups are usually stored as a bitwise flag. When two faces share a vertex at a certain position, if they have one or more smoothing groups in common, their vertex normal is calculated as if they are sharing a vertex.   I first attempted to write an algorithm based on edges, which worked great for cylinders but failed for ge

Josh

Josh

Smart Tessellation

I've actually been doing a lot of work to finalize the terrain system, but I got into tessellation, and another rabbit hole opened up. I've been thinking about detailed models in VR. Tessellation is a nice way to easily increase model detail. It does two things: Curved surfaces get smoother (using point-normal triangles or quads) A displacement map can be used to make small geometric detail to a surface. These are really nice features because they don't require a lot of mem

Josh

Josh in Articles

Smart Pointers Lesson

This is something I typed up for some colleagues and I thought it might be useful info for C++ programmers. To create an object: shared_ptr<TypeID> type = make_shared<TypeID>(constructor args…) This is pretty verbose, so I always do this: auto type = make_shared<TypeID>(constructor args…) When all references to the shared pointer are gone, the object is instantly deleted. There’s no garbage collection pauses, and deletion is always instant: auto thing = m

Josh

Josh

Small Victories

Two issues in the art pipeline were giving me some doubt. I stopped working on them a couple weeks ago, and I'm glad I did because the solutions became clear to me.   Shader Files First, there is the matter of shaders. A shader can actually consist of half a dozen files:bumpmapped.opengl3.vert bumpmapped.opengl3.frag bumpmapped.opengl4.vert bumpmapped.opengl4.vert bumpmapped.opengles.vert bumpmapped.opengles.vert   I originally thought the .shd extension would be good for shaders, i

Josh

Josh

Small Fixes

Most entity types will start with collision type=0 now. Fix so collidable emitter particles won't collide with the emitter itself anymore. Added lens flares to lighting prefabs in showcase map. Added bloom to showcase map. Modified the way the Flicker effect script works.

Josh

Josh

Small behavioral change

In the next beta update, the way entity fields work in the script properties will be a little different. Instead of dragging an object from the scene tree onto the field, you will type in the name of the object (or copy and paste the name from the object's name field). This is being done to make the behavior more intuitive. After working with both approaches, I find the new way much easier to use.     This does however mean that an object that is used in this manner must have a unique na

Josh

Josh

Slogging On

Everything I'm working on right now is a real grind. Trying to get some window code to run on Mac and chatting with Valve on how to optimize the Workshop Store. If I didn't have a plan this would not feel like I was going anywhere. I think that's why programmers often fail to reach beyond a certain level of success. I don't mean simply financial success, I mean they don't go big enough to make a really complete product. They make a car with 22 different gears and no seat. If you don't have

Josh

Josh

Slight Rebrand

Leadwerks Game Engine: Indie Edition on Steam is now just "Leadwerks Game Engine".   Leadwerks Game Engine: Standard Edition on Steam is now "Leadwerks Game Engine: Professional Edition".   When I first put Leadwerks on Steam, it was just an experiment. Separating out the Lua version was something I had not done before. In fact originally, Leadwerks was a C++ library only, and Lua support was added later. After the last two years on Steam, it makes sense to consider the Lua version our ma

Josh

Josh

×
×
  • Create New...