Windows Warp3D - Beta Version Out Now!

Joe Ellis

Member
Another successful week, got loads of things done that I'd been wanting to do for ages but couldn't cus the engine wasn't up and running.

I got the collision system working with a rolling ball type player object:



I'll hopefully upload a playable demo of this soon, I just need to set up how a finished exe will work with the extra files like the models and levels, which is an essential part that needs doing anyway, it should be quite simple though like an installer that installs the game exe and normal gm data along with the extra warp3d files. -Edit, I just realized I can do all this with a zip, I was getting distracted thinking of a finished game which would need an installer

I also improved the block tool so you can drag and create multiple blocks at once:


And had some fun with extrusion, which now works any number of selected faces, it used to only work with one face or a quad, or set of selected edges, now you can just select faces and it automatically finds the edges, extrudes them and attaches the selected faces to the new extruded edges.




I've also done loads more, mainly finalizing all the tools and gui. As you can see, things are really starting to happen, I still need to do quite alot of small tweaks, but I'm getting them done really fast now that the hard part of the engine is out of the way.

I was also thinking of releasing a trial version, which is an exe version of the editor that comes with an example game where you can test out all the stuff in the editor, and I'll be able to release this before the first proper release.
 
Last edited:

Joe Ellis

Member
Had a go at a ps1 style sky, it doesnt look as good as I want it to yet,
I need to deform the mesh and make it more swirly. If you squint your eyes it looks how I want it to.
I did this with the color paint tool with airbrush mode so you can blend all the colors gradually



 

Joe Ellis

Member
I've got a quick update, I haven't had chance to make any screenshots cus I've been working on alot of technical stuff.
But I've done a ton of engine level things, removed most of the bugs, and sorted out things to do with saving and overwriting existing files.

I've almost got the particle system setup, and I've got it to use the same render script as normal models:
There is one script that renders all shaders and the vertex buffers that use each shader, and each particle effect uses a vertex buffer, so they just get added to the render cycle the same as model vertex buffers.

I've almost completed model\instance animation handling, and they can be either skeletal or vertex morphing, and they both use the same animation editor which uses simple stop motion\capture style.

I've setup dynamic light handling, using "light groups"
As there is a limit for how many lights can be active at once, 32 is I think the max before lagging occurs, it could be more, but its not really a good idea for the shader to process all the lights in the level at once, so to make it only deal with ones in the current area, I've made it so you can create groups and set one to be the active light group.
Btw Lights(and all other objects) can be in multiple groups at once. Groups can also be used for activating\deactivating instances, which can be useful for optimizing.

I've completed the system for handling dynamic shadows, I went with a deferred approach in the end, even though it has worse performance, it's worth it for how much simpler the shadows are to set up.
Before each object would have had to use a shader with the shadow code inside it, and this was really awkward cus for each shader there would need to be two copies of it, one with shadows and one without.
But now I've made it so the shadows are rendered in one shader onto a separate surface,
and the world (with the regular shaders) is rendered a second time, with the sun color temporarily set to the same as the ambient color (or it can be set to the "shadow_color", so that objects in shadow still have some shading)
and then this "in shadow" surface is mixed with the normal full bright surface(application_surface) using the shadows surface as the blending ratio.
As you can imagine, it will be at least 3 times slower, cus the whole world is getting rendered two extra times,
but from tests it still runs without lag, so I think as long as the render cycle is optimized by deactivating & not rendering things that aren't
in the current area, it should be able to crunch through the extra draw calls.

I've also cut out a few things to make everything more concise:

I got rid of "Sequences" cus you can easily make a sequence by making a group of actions and linking the group to the instance that triggers it, then use action_group_perform_as_sequence(group)
I also got rid of "Zones" cus these were essentially a 3d box, where something happens when a certain instance enters it.
But this can be quite easily set up by creating an invisible instance, and then you get alot more choices of mask types and the behaviour is alot more customizable.
 

Micah_DS

Member
This is really shaping up to be a serious engine. Wow. :eek:
View attachment 24986

I made a new logo, I like it but I think it could be improved some how, any thoughts?
My only thought is that it kind of reads as "W", then "ARP3D", like the two parts of "WARP" are separated in a way they shouldn't be?
Of course, I'm very much into music production, so the "W" makes me think of a type of waveform visualization and the "ARP" makes me think of "arpeggio", so I could just be seeing it like that because of music stuff.
 

Joe Ellis

Member
@Micah_DS I thought that aswell, but I use music stuff so it could be that, I think if the W wasn't slanted it would be ok, or maybe if it was thinner, I wanna keep it slanted if I can, I'll see if I can make some adjustments
Thanks for the praise aswell, I'm really happy with how its turning out
 

Joe Ellis

Member
Does this rely on any Windows-specific functionality or would you be willing to get it ported to Mac and Linux?

This in particular might help: http://marketplace.yoyogames.com/assets/6621/dialog-module
Or perhaps this as well: http://marketplace.yoyogames.com/assets/8207/file-dropper

Both of which are 100% free. Linux support is planned for the latter in the near future.
Thanks I'll have a look at your assets, however I won't need those actual assets cus it never uses any windows dialogs, it's all done with the gui inside the engine. For file handling I'm using the gui with a non-sandboxed dll with the basic search, open, copy, rename functions, then there's another dll for loading textures, and also the fbx importer. But I paid someone to make them cus I've never used c++ before, so I'll have to get back in touch with him about porting them. I'm definitely planning on porting to Mac and Linux, I'm just not sure when yet. I'd need to 2 pc's with them wouldn't I? Or is it possible to get some kind of emulator? I have virtually no money, so it'll be quite a while till I can afford the dll ports and pc's
 

CMAllen

Member
@Micah_DS I thought that aswell, but I use music stuff so it could be that, I think if the W wasn't slanted it would be ok, or maybe if it was thinner, I wanna keep it slanted if I can, I'll see if I can make some adjustments
Thanks for the praise aswell, I'm really happy with how its turning out
You could angle the left line of the A to match the W. Or you could angle the WARP the same way and leave the 3d as is. Heck...I'll do some mock-ups for you.
 
S

Sam (Deleted User)

Guest
Thanks I'll have a look at your assets, however I won't need those actual assets cus it never uses any windows dialogs, it's all done with the gui inside the engine. For file handling I'm using the gui with a non-sandboxed dll with the basic search, open, copy, rename functions, then there's another dll for loading textures, and also the fbx importer. But I paid someone to make them cus I've never used c++ before, so I'll have to get back in touch with him about porting them. I'm definitely planning on porting to Mac and Linux, I'm just not sure when yet. I'd need to 2 pc's with them wouldn't I? Or is it possible to get some kind of emulator? I have virtually no money, so it'll be quite a while till I can afford the dll ports and pc's
How do you load and save models and such? My extensions I linked are cross-platform and not Windows-only. I also wrote an extension for Win32/Mac/Linux that breaks the sandbox called File Manager. Since you own the Desktop license, I'll have to double check with a staff member but I'm pretty sure I'm allowed to port it for you since you own the required license.
 

Joe Ellis

Member
@Samuel Venable oh right, thanks that'd be a huge help if I could use File Manager. For loading and saving models and levels I use the normal buffer functions, even buffer load & save, cus I copy the required file into the sandbox then use buffer_load like normal, then buffer_save and copy it from the sandbox to the file's proper location. So using File Manager would be really helpful for this. Are you saying I can use it free of charge and include it in my extension package? I'll of course credit you
 
S

Sam (Deleted User)

Guest
@Samuel Venable oh right, thanks that'd be a huge help if I could use File Manager. For loading and saving models and levels I use the normal buffer functions, even buffer load & save, cus I copy the required file into the sandbox then use buffer_load like normal, then buffer_save and copy it from the sandbox to the file's proper location. So using File Manager would be really helpful for this. Are you saying I can use it free of charge and include it in my extension package? I'll of course credit you
All of my extensions are free and open source. Dialog Module is particularly useful for having a fully functional get_open/save_filename on Win32/Mac/Linux for loading/saving models/textures and File Dropper can let you load model/texture files by drag and drop onto the game window on Win32 and Mac. I'm procrastinating a lot, but I intend to write individual GTK+ and (possibly) KDE versions of File Dropper for Linux as well. I recommend using KDialog on Linux when using Dialog Module. i.e. widget_set_system("KDialog");
 

Joe Ellis

Member
@Samuel Venable well thanks, that's gonna be a big help, it will surely speed up the process of porting to mac & linux.
About the dialog module and file dropper, I won't really need to use those cus the editor is made purely in gml and runs inside the game, it's just made to look like it uses windows, so it's got those things built in. But the non-sandboxed extension will be super useful for this, thanks again
 
S

Sam (Deleted User)

Guest
@Nocturne Just wanted to clarify because I've heard conflicting information on this almost every single time I think I have a final answer.

Am I or whoever @Joe Ellis decides to grant access to his source code allowed to port this to Mac and Linux for him, provided that both him and whoever ports both have a valid GMS 2.x Desktop License?
 

Nocturne

Friendly Tyrant
Forum Staff
Admin
Am I or whoever @Joe Ellis decides to grant access to his source code allowed to port this to Mac and Linux for him, provided that both him and whoever ports both have a valid GMS 2.x Desktop License?
Yes. As long as the Op (Joe Ellis) gives consent and whomever does the port has a legally licenced copy of GameMaker Studio there is absolutely no issue. Thanks for asking!
 

Joe Ellis

Member
@Samuel Venable If you want to port it for me, by all means you can, we can discuss it further on a Pm. Do you want paying for it? that's possible.
I think the porting would mainly be for the dll's, the texture loading dll should be very easy to port, as it just uses the directx sdk with simple load & set functions, so it would just need the opengl equivalent, and the fbx importer should require no actual changes, as it just deals with an fbx file data, so it would only need whatever's needed for it to work on the other platforms.

@everyone
I've started making ambient occlusion, I want to improve the maths in the shader alot and make the crevices more pronounced, but so far I like the result, it does a good job of making a completely unshaded scene look pretty normal.

The great thing about it is that its really easy to implement and can work with a single "obj_ao" instance with only a few variables, cus all it does is draw a black quad over the screen and reads from a screen space depthmap to calculate the occlusion and simply sets the pixel alpha to the occlusion amount. So it's like an overlay effect.

I could also make it work with drawing\reading from the application surface and darkening\multiplying by the occlusion, which would probably look better if you wanted the occlusion to be a certain shade or color that isn't black.

Try and spot which one has the ambient occlusion:



Also, last night I think I worked out how to do mesh uv unwrapping, so that'll mean I can finally implement lightmapping\prebaked lighting, and I've already got a brilliant photon mapping\global illumination system, the only thing stopping me from being able to add it to the engine was lack of being able to generate a uv skin, so yeah wooo
 
Last edited:
S

Sam (Deleted User)

Guest
I don't feel justified in getting paid for something that should take about ten minutes, but thanks for the offer! I'll pm you in a few. About to go to a gas station to get a Swiss Chocolate Java Monster to wake me up and then we'll talk. (if you like coffee, I totally recommend this new flavor of Java Monster btw). I'll use libpng for the dll. It's not too much work.
 

Joe Ellis

Member
Wow, I've managed to do texture mesh unwrapping, for making a lightmap uv skin\texture atlas, which means I can finally make lightmapping with bouncing light rays, ei. indirect lighting, super cool, not normally used in cartoony games but it would be amazing for a clay type game, and also for ambient occlusion. woo, I'll hopefully have some pics soon, I need to resurrect the lightmapping thing I made 3 years ago, the whole reason I couldn't use it in warp3d was cus of lack of being able to make the uvs
 

Joe Ellis

Member
Thanks, it is pretty amazing, it's just 3 years of solid work, but I've only got a few small hurdles left, that thing with the uv unwrapping was something I've been trying to work out for about 2 years, so that feels like a huge step
 

JaimitoEs

Member
Wow, I've managed to do texture mesh unwrapping, for making a lightmap uv skin\texture atlas, which means I can finally make lightmapping with bouncing light rays, ei. indirect lighting, super cool, not normally used in cartoony games but it would be amazing for a clay type game, and also for ambient occlusion. woo, I'll hopefully have some pics soon, I need to resurrect the lightmapping thing I made 3 years ago, the whole reason I couldn't use it in warp3d was cus of lack of being able to make the uvs
Wow! I can not wait to see the lightmapping!
It shows the great love in the project and how well it is progressing!
 

Joe Ellis

Member
Here's a video of the animation editor and making a vertex\morph animation, which is the other option aside from skeletal.
This method simply captures vertex positions and face normals and creates a strip of vertex buffers containing the data for the frame's current positions and the next one, so then it can be used with a "morph shader" which blends between the two.
The anim editor is not currently fully working and there's a few problems with the frame thumbnail drawing, but I just wanted to show this cus its the first time I've got vertex animation set up :)

 

Joe Ellis

Member
I've got the path editor working. It took me ages to think of how to make it really easy and simple, and I've made it so you just click and drag the points if the mouse is over them and if the mouse isn't over a point, it makes a new one at the end of the path,
and to insert a point in between 2 points, you just hold down control and click & drag on a point,
and also press pageup\pagedown to move them up and down.

I'm hoping to make paths be able to have multiple points joined together, like a navmesh.
But I might make a different object type altogether for this, this setup is so nice and simple, I don't wanna clutter it up with any extra features

 

Joe Ellis

Member
Here's some progress with the lightmapping:


It uses a 24-bit grayscale surface for adding up the results from each pass,
which allows to up to 65025 passes and 16581375 possible shades instead of 255,
so this means that the more passes are done the smoother the result gets.

This video only showing direct lighting, made to look indirect by using a randomized 360 degree range of the sun angle each pass.
I still need to setup indirect lighting, but it's almost ready to go. I'm going to make it work with point and spot lights aswell, and I guess I need to allow colored lights aswell.

I've also made per pixel ray randomizing rather than per pass,
but this produces that grainy type result, and it takes alot longer to render enough passes until the grain isn't visible. (Roughly half an hour instead of 3 minutes) But I think the end result is more realistic, so maybe this could be used for "final game" quality.

I'm also gonna make an option of outputting 2 separate lightmaps, a direct layer and indirect layer,
cus this would give all kinds of dynamic "shaping" options, like choosing the strength & color of the direct light,
using a different color for indirect light, and high dynamic range changing, like when you go in and out of a building the balance shifts like your eyes do. And also, this is the only way I can think of how to make the realtime shadows work with this,
they'll blend with the direct layer, whilst keeping the indirect layer intact. And you could also only have an indirect light layer, and use the realtime shadows for the direct layer.

Also the uv generator has given me alot of ideas for a uv skin editor,
like tools for rotating parts, moving individual vertices, glueing parts together.
This will make uv mapping alot easier in alot of cases cus your able to see a visual position of the uvs.
And painting onto the model's texture will be possible too, so you'll be able to paint onto the 3d model with the mouse and it will apply the paint to the correct spot on the texture skin.
 

Joe Ellis

Member
I've been struggling to come up with a good way to implement the realtime shadows and particles, and I've made up a solution that kills both birds with one stone, plus many more, the whole nest is getting knocked off the tree! Anyway, yeah I came up with an object type called an "Effect", which are essentially instances of objects like normal, with a few key differences:
  1. They remain active at all times while the level is loaded, so in edit mode they're still active, which is important for testing and configuring them
  2. They have no model, sprite or any other instance related variables assigned to them, only specific ones that are important to their job
Oh, that's it actually, but these enable all kinds of things which aren't built into the main engine, such as:
  • Ambient Occlusion
  • Outlines
  • Wave\ripple effect while underwater
  • Screen tinting (eg. red while getting hurt)
  • Rain
  • Smoke & fire, from torches for example
  • magic particle effects and what not

I'm also debating whether to make this object type not be a separate object type and just have a checkbox on regular instances, something like "persistent" or "always active" but I figured that would generally be annoying always having that option available, so just handle them as separate things, like they are I guess
 
L

Lonewolff

Guest
Nice work dude. Seems we are all doing the same thing in some form or another.

Might be more efficient if all of the 3D guru's did a big collaboration one day.


[edit]
Who am I kidding? We all love the friendly rivalry. :p
 
Last edited:

Joe Ellis

Member

It's been really slow recently, but I've worked out some better mesh tools with auto-triangulation. And some cool subdivision functions, like inserting a
single vertex onto a mesh and it automatically re-triangulates the affected parts, and also a "Quad to hex mesh" function, which will effectively convert
a grid like mesh to a more geodesic\hex looking one.
 

Joe Ellis

Member




Tilemapping is now working, so you can make an entire level model in just one vertex buffer.
You can see seams around the edges, this is cus texture filtering is on and the tilemap isn't padded so the edges are blending with the tiles next to the one its using, so I'm going to make a padding function which will create a padded version of a tileset.

Made a video of it in action:


 
Last edited:

Joe Ellis

Member
Thanks, no actually most of the pictures are using per fragment lighting, but I think I set alot of them up to look more retro. You can tell it's per fragment if you look at the shady parts cus they're round looking rather than straight lines. Also the smooth shading method I've got at the minute doesn't work that well for quads, it looks alot better with a geodesic-hex like mesh, but with quads alot of diagonal lines in the shading show up, making it look more like vertex shading, so I'm gonna have to work out or find out how to tackle this. I think it can be done with a second pass of blending the vertex normals with vertices that they're joined to. This will make general modelling slower and could cause jerkiness, but I'll make so it can be toggled on and off, so while your modelling you can just use the simple fast method

-Edit, I worked out a different method of making smooth normals, where it gets the min and max normal value on each axis from each face\triangle using the vertex, then lerps 0.5 between the two(on each axis), then normalizes the whole result. And now the gouraud look is gone, and the shading looks better in most cases.
 
Last edited:

Joe Ellis

Member
Here's a video showing the dynamic lights system, and it also shows some of the drag & drop functionality I've been working on.
You can drag any model file onto the level to create an instance of it, and the same with objects, sprites and action scripts.


The lights' properties can be changed during game play, as the shaders just use one single global array for all the light data.
Each active light gets an address in the array, so to edit properties you just need to do:

global.light_data[@ light[_light.address] + _light.brightness] = light[_light.brightness]

I've started making objects that control lights during gameplay such as:

flickering, following a certain instance, moving along a path,
pulse, strobe, hue shifting, switches that turn them on and off

Next I need to get spot lights working, and normalmapping with the lights











 

Joe Ellis

Member

This video is not like a flagship video but its still kind of interesting
Cus I've changed the collision system to create one single collision mesh out of every static model in the level.
Before it worked per model\instance which was better on ram usage but worse for performance cus of having to do an inverse matrix transformation on every instance that collides with a static model's bounding box.
So now every moving instance just needs to have "collision_precise()" in it's step event, to collide with the world.
 
Top