SecretImbecile's Thread
Tutorials
The blog where I host my tutorials has switched domains, they can now be found here. They are as follows:
Materials (original Tutorials)

Tunnels (new and upcoming)

- Global Texture Coordinates
- Ambient Maps (soon)
Optimisation

Right now though, you should take a look at my 7 step guide to optimising your parks, because we're in good need of some optimised park releases.
secretimbecile posted on June 23rd, 2018
Gosh, It turns out I don't have a construction thread on the new forums yet. That's weird, given the consistent output of projects I release.
And considering the amount of useful information & knowledge in 3d modelling you have to share, i'm surprised you didn't have a thread on here until now as well.
[Tutorial] LODs
Time for a mini-tutorial. Let's figure out the best way to LODs in Blender, first for simple objects, then complex multi-part objects. This information might be useful to you if, for instance, you've decided to make a completely custom track mesh for your project, ahem.
A simple example
Confusing note: The term "Object" refers to a different level of the scene hierarchy in Nolimits 2 and Blender, so below I'll use "NL2SCO" for Nolimits, and "object" for Blender.
As a quick demonstration, I created the default Suzanne object, and created two copies which have applied subdivision modifiers. I've named the highest-polygon mesh suzannetemplate_lod0, and the lowest suzannetemplate_lod2.

If you've tried using LODs in Nolimits before, you may have noticed how fussy the system can be. Each LOD file needs to have the same material list, and more irritatingly, each file needs to have the same name for each object.
Blender doesn't allow duplicate names for objects, so what I've done in the past, and what I imagine most people do is rename one object to its final name, save the DAE file, revert that change then rename the next one, etc. Luckily, and as always, Blender has yet another feature you haven't learnt to use yet that will make this process simpler.
On the right panel, go to the Data tab. This tab has a bunch of useful features you may have used before; auto smoothing, UV maps and vertex colours. We're interested in the easiest thing to miss, the box at the top.

Every object in blender contains an object data, in most cases a mesh, which is actually a separate entity from the object itself. This is a little unintuitive, which is probably why you glossed over this as you were learning Blender, but this is how blender handles object instancing. As an example, if you wanted to duplicate a tree object 1000 times to make a blender scene, if you just Ctrl+D'd them all your .blend file might be 1000 times larger. If you set the mesh for each of the objects to same, the .blend wouldn't have to store any more mesh data at all.
Rather than using this feature to duplicate objects, we'll use it to quickly swap between LODs. Start by giving each objects' mesh a memorable name. I selected each object and copied the name to the object data. It's also a good idea to click the F (Force) flag, which will stop the mesh data from being deleted.
Now, we'll create a new object, a cube will do. Then, you simply go to the data tab, and use the browse button on the left and select one of the suzanne LODs.

Now to export this ready for NL2, we just select our new object and export the first LOD (as suzanne_0.dae), then change the object data for the next LOD , and save that (as suzanne_1.dae), etc. We don't need to worry about object names, we've only exported one object.
Okay, it's a subtle improvement in workflow for this simple object. On a more complex object, we can really save some time...
Custom coasters
I've hastily made this track model based on lighting run. As a stress test (and a poor example of layout/coaster type fit) I've replaced the track of the library coaster Spinemelter 3000 with it.

A quick guide on how to make this kind of mesh: First create your desired track model in this top-down orientation:

Import a track CSV file from Nolimits 2 Pro into Blender. Add an array modifier and curve modifier to the track object. Set the array to fit curve and select the curve object in the relevant boxes in each modifier:

Great! but when I try this with my high-detail track, it totals at 650,000 polygons! Even full desktop GPUs struggle with more than a few million polygons, so we've taken up a really significant portion of our total polygon budget, and on lower-spec systems we've probably already lost that ideal 60fps target with nothing else in our park. Time to add LODs for the track.
Remove the modifiers and duplicate the track pieces. Use these to create your LOD template objects for the track. You'll want to reduce polygon counts by reducing the sides in the cylinders and curved surfaces, but also varying the subdivisions along the length of the track tubes. I went from 0.5m segments in the highest to a full 4m segment in the lowest. I ended up with 4 meshes, with polygon counts of 1620 (this is pretty high, but provides a good worst case), 740, 388, 24.

Same as before, give each objects' object data a useful name, and enable the force flag. As before, we'll create a new cube object, and set the data to one of our LODs. Add the array and curve modifiers back.
We can't just create LODs for a single track mesh, otherwise we can only swap to the low poly mesh when we're nowhere near the coaster. We need to create the track in sections, so each one can be swapped. (if you're stood at one end of the coaster, the other should be low-poly)
So instead, use a fixed count for the array length. My track model is 4m in length, so I've set the length to 8, for a 32m section. Duplicate this by pressing Ctrl+D, then press x, and type 32 and press enter to move it exactly 32m along the track curve.

Repeat ad nauseum. The shorter the sections the less noticeable the LOD swaps can be made, but if you have too many objects you'll get slowdown on the CPU side as NL2 tries to handle all the objects. For my hyper coaster I needed 44 segments, which is fine, I probably would have been fine halving the segment length and using 88 objects.
When you duplicate an object, blender likes to duplicate its data too, which we don't want. Hide the template objects if you haven't already, then select all your track pieces (Select > Select Pattern... is useful for this) and object data for the active object to the correct template data, then apply this to all the other selected objects by pressing Ctrl+L and selecting Make Links > Object Data.
Double check that each object is now using the same data.You can check this step by saving then reloading your .blend file, all of the duplicated data should be removed from the list now.
Our first LOD is complete. Select all of the objects, and export to track_0.dae. Then, change the object data to the next LOD and repeat the Make Links > Object Data step, export as track_1.dae, etc.
The LOD system in NL2 is really well implemented. You might think that LODs are a per-object thing, and to separately switch LODs for 44 track segments we'd need 44 NL2SCO files, but the LODs are selected for each sub-object independently, the engine will load LODs from all the DAE files at once, if needed.
Set up your NL2SCO as normal, guessing some sensible LOD distances, and view the park with LOD Distance setting set to the minimum to exaggerate the effect. Close track segments are displayed in full detail, whereas distant segments are at minimum detail.

As for performance, I tested at the same position with different LODs and got these results:
- High poly only (650,000) - 123fps
- Low poly only (14,000) - 135fps
- Final Model (variable) - 135fps
A small difference, but looking at it another way, we're able to 630,000 more polygons to our scene with no performance impact at most positions.
2am edit: oh god this wasn't mini at all!
Nice tutorial and perfectly explained in my opinion.
What I can also recommend in some cases is using multiple blend files for LOD and optionally also make usage of linking to meshes of different blend files in there.
[Asset] Distant trees set
The tree lines objects that were introduced with the HD foliage assets a while ago are great, but lacking in variation when used by themselves. I made a set of 2D assets recently based on Nolimits' original 3D trees. Use them to cover your distant terrain with highly performant foliage.


That looks very useful, thanks for creating it.
[Asset] Rope barrier set

Today's word of the day is Stanchion, which I've just learned is the name of the vertical posts in fences and barriers. I made these rope barrier assets recently for a super secret project, but seeing as I thought they'd be quite useful for a lot of projects, I'm releasing them as an asset separately.
They're pretty low poly, and with proper LODs, so you'd probably run into object count limitations before you hit a polygon limit. I uploaded a neato Sketchfab model for the Steam Workshop, which you can take a look at too.
I really appreciate being able to have some scenery pieces like this on hand, thank you for making these public!
I fancy doing a texturing tutorial. How would people be interested in a livestream either Saturday or Sunday (around this hour)?
I'd cover normal map baking, texture painting and PBR materials in NL2, probably for a simple texture like these tiles but with a more interesting colour, some grime, and metallic accent.
Sounds good!
Texturing tutorial livestream
As mentioned above, I'm going livestream Sunday at ~20:30 UTC, covering my workflow for creating textures from scratch.
I'll be using Blender, GIMP and Crazybump, but the same principles can be used in similar software (e.g. Maya, Photoshop, Substance B2M)

VOD
Thanks for joining me. Here is an NL2PKG that you can extract to get the source GIMP file, though be warned it's over 90MB large. Layered image files get huge quick!

Hello there! Long time, no assets provided.
A post appeared in my Reddit feed the other day, pointing out that the light flicker effects from Half-Life 1 have stayed in the engine all the way through to Half-Life:Alyx. They actually originate from original Quake engine, and somebody in the comments managed to link to their values in the original source code. With the actual source code to hand, I thought it would be fun to port them over to Nolimits 2.
RetroFlicker
The RetroFlicker script is my implementation of these classic lighting effects in Nolimits 2. Apply the script to any light object (Using Entity0 for the color) and you have access to 11 lighting effect patterns straight from Quake 1.
Frame Interpolation
Not just useful for a retro look, turning on frame interpolation from the object properties window will blend the light values between the pattern framerate (by default 15fps) up to whatever framerate NL2 is running at. A subtle but significantly smoother look which will look great in any project.
See the video above for a comparison (select one of the 60fps resolutions)
Pattern IDs
- Static (same as no script)
- Flicker one
- Pulse Strong
- Candle one
- Strobe Fast
- Gentle Pulse
- Flicker two
- Candle two
- Candle three
- Strobe Slow
- Fluorescent (broken)
- Pulse Slow
Creating your own lights
The download includes a set of lights to get you started, but any NL2 object with a light can have the script applied to it, assuming it uses Entity0 for to set the initial color.
Apply the script to your own light objects, along with the following object parameters:
pattern:int (default=1)
framerate:double (default = 15.0
interpolate:bool (default=true)
Demo environment
The .nl2pkg download includes a demo environment with almost every light pattern demonstrated. Frame interpolation has been left off on all lights, to provide a truer retro look.
Disclaimers
Source code licensing
The original quake code is released under the GPL licence, and so this script is arguably subject to that license (not a lawyer). This should be fine for usage in NL2 projects, even if you're using it for professional work.
Photosensitivity
These lighting patterns predate the time when video games came with photosensitivity/epilepsy warnings. The fluorescent and strobe effects especially are quite harsh to look at.
Download
The following will download the .nl2pkg, containing the demo scene and the base files for RetroFlicker. To use the script in your own project, extract the RetroFlicker folder within the nl2pkg, and copy that to your own project. You do not need copy the demo folder, which contains assets for the demo scene models.

Gosh, It turns out I don't have a construction thread on the new forums yet. That's weird, given the consistent output of projects I release.
Projects
Point Solitude
Download: Nolimits Central | Steam Workshop
Wow, remember that one time I made something? Point solitude has recently been updated for the 9th time, and whilst it's still awfully blocky, it has some swishy looking grass now.
Cypher III
Download: Direct (Google Drive) | Steam Workshop
I really liked Cypher III by DC High Heat, I considered it an NL1 classic. So, I worked with him and CG Coasters on this NL2 conversion, which I was super proud of, and received zero feedback for. Cool!
The Project Graveyard
If you happen to think I'm good at creating Nolimits 2 parks, you may be interested to know I'm even better at not creating them. Here are a few former projects for you to dissect at your leisure:
Coast Raider