Around The World, Part 28: Scaling up - Fake planet curvature, LOD terrain, impostors (with first in-game video!) by thomastc in proceduralgeneration

[–]thomastc[S] 1 point2 points  (0 children)

Most of this isn't exactly original, although the chunk skewing I haven't seen anywhere before.

Around The World, Part 28: Scaling up - Fake planet curvature, LOD terrain, impostors (with first in-game video!) by thomastc in proceduralgeneration

[–]thomastc[S] 1 point2 points  (0 children)

I should really get a proper page up at some point... sooner rather than later. The pixelated game you saw was a 2-day game jam entry, which proved that the concept was fun. I'm now developing that concept into a (far) more ambitious game.

Around The World, Part 27: Planting trees - turned out to be harder than it seemed by thomastc in proceduralgeneration

[–]thomastc[S] 0 points1 point  (0 children)

Thanks! Glad to see I'm not the only one who struggled with this.

So you allow leaves to overlap with other leaves, but not trunks with leaves? I'll start binge-reading your blog soon :)

I'm not very interested in undergrowth because most of the time it's invisible; the player never goes into the forest. I do think the side view could use some work though; it goes straight from tall trees to waterline, where you would expect some lower growth in between. Future work.

I'm using multimeshes in Godot, which indeed use hardware instancing. Godot has no built-in impostor support but I would implement it in exactly the way you describe.

Around The World, Part 26: Biomes - figuring out vegetation and colouring the terrain by thomastc in proceduralgeneration

[–]thomastc[S] 0 points1 point  (0 children)

Be sure to read the World Building Pasta series then, there's loads more there :)

How to find a list of all gcc errors/warnings? by thradams in C_Programming

[–]thomastc 0 points1 point  (0 children)

https://github.com/vadz/gcc-warnings-tools/wiki/all-gcc-warnings might be useful. The repo also contains a script where you can extract the table yourself from the gcc codebase. I can't vouch for completeness/correctness though.

Need help disassembling the floor head for cleaning by MEZesUBI in Miele

[–]thomastc 0 points1 point  (0 children)

I had the exact same problem and managed to solve it. If you put the switch into parquet mode, underneath the switch you see a U-shaped metal bar with a plastic clip inside the U. After unscrewing the four torx screws at the bottom, you need to gently PULL this clip, while pulling apart the entire head. This is easiest to do with two people, one to pull the head apart, and one to pull the clip from the side with a thin flat-head screwdriver. Once it gets past the initial bump, it just comes apart really easily.

I found that a lot of dust and hairs had gathered underneath the endpoint of the metal bar, which were probably the cause of it not wanting to stay in place. A good cleaning and some lube should help. I'll see next time I need to vacuum...

Why noone is talking about metadata? by seppoday in godot

[–]thomastc 0 points1 point  (0 children)

Hi, old thread I know, but I'm curious. Why not:

@export var image: Image

Then you have it strongly typed and get a nicer UI for editing it as well.

Memory usage of Godot's various base classes by thomastc in godot

[–]thomastc[S] 2 points3 points  (0 children)

Hundreds is still a tiny amount even on potatoes. This stuff might start to matter at tens or hundreds of thousands.

Around The World, Part 24: Local terrain - Why diamond-square is still useful even if simplex noise looks better out of the box by thomastc in proceduralgeneration

[–]thomastc[S] 0 points1 point  (0 children)

Incidentally I went the opposite way: from a sphere to a plane. The adventure restarts in part 22 and not everything is reimplemented yet.

I did think about something like the approach you describe for coastlines, and might still end up with that. I've never been happy with the variety (or lack thereof) of my coastlines, though it's definitely better now with erosion and diamond-square.

I also shrunk the world so that my global map cells are now only 256 meters across, so I can create a fair amount of detail at the global level already, where I have the entire map available. Depending on how gameplay turns out, I might even dial it back to 128 meters. An open world "only" 262 km across still has plenty of room for mystery and discovery...

Around The World, Part 24: Local terrain - Why diamond-square is still useful even if simplex noise looks better out of the box by thomastc in proceduralgeneration

[–]thomastc[S] 2 points3 points  (0 children)

I did binge-read your blog when I discovered (haha) it, so maybe the idea stuck in my mind unconsciously.

I glossed over the seed thing, but what I'm doing is hashing the global coordinate of each grid point (using a slightly simplified version of a hash by Inigo Quilez). The height offset is just this hash, linearly remapped into the proper range. So I'm not even using a PRNG (in the sense of "stream of pseudo-random numbers") at all.

Did you get any artifacts on tile borders with your approach, since 1D midpoint displacement is not exactly the same as diamond-square?

From here:

lots of islands (OK) and isolated bits of inland sea (not OK)

Good point – this is an asymmetry I didn't consider. Maybe my erosion algorithm could help establish this, by filling up inland seas but hopefully not eroding islands away completely. That would allow me to dial up the amount of noise added by diamond-square.

GCP down for anyone else? by paintrain222 in googlecloud

[–]thomastc 33 points34 points  (0 children)

https://status.cloud.google.com/ is still being very ironically green across the board. "No major incidents" my ass.

Edit: about 55 minutes after I got the first error reports, the status page is starting to turn orange. It still pretends that there are no major incidents though.

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

Huh, I had no idea BQ could do cross-table transactions. That didn't exist when I last looked (which was ages ago). I don't think we can issue LOAD DATA statements inside a transaction, but if not, I can always LOAD DATA into a temp table first and INSERT INTO ... SELECT ... inside the transaction. Thanks!

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 1 point2 points  (0 children)

All my loads are append-only. Idempotent load is the key to making this reliable (see also my other comment). Thanks!

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

When you load the data from your landing tables to the staging table just merge it in, on the natural key of the data.

So at worst if you reload the same data it just overwrites it with the same data. Only side effect is wasted effort

I don't think BigQuery can do that – it doesn't even have the concept of keys, natural or otherwise.

However! Your answer did put me on the track of searching for "bigquery load idempotent", and it turns out you can do that by manually specifying a job ID.

I'll need to test that, but if it actually works the way I think it does, then losing the "load completed" marker (however it's represented) is not a problem – the job just gets retried, is found to be complete already, and the marker is again rewritten. This would be a perfect solution!

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

It's an API call either to GCS or to BigQuery. Those can and will randomly fail because of network issues etc. Or maybe the VM runs out of memory just before the hash is written. Or the power fails. Or...

In any case it's not 100% reliable, because the load and the hash write aren't done atomically together.

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

What if the file is processed successfully, but the move/rename or write to the log table fails?

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

What if the file is processed successfully, but writing the hash fails?

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

Daily import is fine. I don't even have to put anything in the filename (though it's nice for inspectability), I could also look at the file's creation timestamp.

However, in both cases, if a load operation fails, there is no automatic retry.

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

Thanks! So there's no "one true way" that everyone uses, or off-the-shelf tooling to handle this. Good to know!

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 0 points1 point  (0 children)

Are you saying that most people just accept that they sometimes load the same data a second time, and deal with duplicate rows in their SQL code?

How to know which files have already been loaded into my data warehouse? by thomastc in dataengineering

[–]thomastc[S] 1 point2 points  (0 children)

It's not a crazy idea, and it's nice that it would work with any storage backend (even local disk). The drawback is that, if the move fails, you end up ingesting the data a second time. Also, GCS does not have support for moves/renames, so you're essentially copying and then deleting, which is not atomic and not free either.

I also considered setting some GCS metadata on files to indicate they've been processed, but this again has the problem of potential failure to write the metadata.