The OFFICIAL programming thread
-
@gators1 said in The OFFICIAL programming thread:
???
I’m making a game with a map where everything is a at a position that is a grid reference away from the center. So player X might be at grid reference (-2, 1), and there might be a big impassable rock at (1, 0).
However, the pathfinding API (the library that tells me how the player moves from one location to another,) requires that each point on the map be expressed/id’d as a single number greater than zero.
So, how do you take something like (-2,1) or (1,0) and create a single, unsigned, numbers from them like 3 or 14 and then later take 3 or 14 and turn it back into (-2,1) and (1,0)? That’s what my code does.
-
Oh, and:

-
@hog said in The OFFICIAL programming thread:
@gators1 said in The OFFICIAL programming thread:
???
I’m making a game with a map where everything is a at a position that is a grid reference away from the center. So player X might be at grid reference (-2, 1), and there might be a big impassable rock at (1, 0).
However, the pathfinding API (the library that tells me how the player moves from one location to another,) requires that each point on the map be expressed as a single number greater than zero.
So, how do you take something like (-2,1) or (1,0) and create a single, unsigned, numbers from them like 3 or 14 and then later take 3 or 14 and turn it back into (-2,1) and (1,0)? That’s what my code does.
Wait, did Jerry hire you to work on his game? You know it’s a scam, right?
-
@hog said in The OFFICIAL programming thread:
const BITS_PER_DIMENSION = 2 const MAX_EXTENT = 1 << (BITS_PER_DIMENSION - 1) func _ready(): print("Bits per dimension: %d, Max extent: %d" % [BITS_PER_DIMENSION, MAX_EXTENT]) var ids = [] for col in range(-MAX_EXTENT, MAX_EXTENT): var col_normalized = col + MAX_EXTENT var col_shifted = col_normalized << BITS_PER_DIMENSION for row in range(-MAX_EXTENT, MAX_EXTENT): var row_normalized = row + MAX_EXTENT var id = col_shifted + row_normalized ids.push_back(id) print("col: %4d, row: %4d, id: %4d" % [col, row, id]) print("**************** Reversed **************") var mask_high = (1 << BITS_PER_DIMENSION) - 1 print("mask high: %d" % mask_high) for id in ids: var row_normalized = id & mask_high var row = row_normalized - MAX_EXTENT var col_normalized = id >> BITS_PER_DIMENSION var col = col_normalized - MAX_EXTENT print("col: %4d, row: %4d, id: %4d" % [col, row, id])Result:
--- Debugging process started --- Godot Engine v3.3.2.stable.official - https://godotengine.org OpenGL ES 2.0 Renderer: GeForce 940MX/PCIe/SSE2 OpenGL ES Batching: ON Bits per dimension: 2, Max extent: 2 col: -2, row: -2, id: 0 col: -2, row: -1, id: 1 col: -2, row: 0, id: 2 col: -2, row: 1, id: 3 col: -1, row: -2, id: 4 col: -1, row: -1, id: 5 col: -1, row: 0, id: 6 col: -1, row: 1, id: 7 col: 0, row: -2, id: 8 col: 0, row: -1, id: 9 col: 0, row: 0, id: 10 col: 0, row: 1, id: 11 col: 1, row: -2, id: 12 col: 1, row: -1, id: 13 col: 1, row: 0, id: 14 col: 1, row: 1, id: 15 **************** Reversed ************** mask high: 3 col: -2, row: -2, id: 0 col: -2, row: -1, id: 1 col: -2, row: 0, id: 2 col: -2, row: 1, id: 3 col: -1, row: -2, id: 4 col: -1, row: -1, id: 5 col: -1, row: 0, id: 6 col: -1, row: 1, id: 7 col: 0, row: -2, id: 8 col: 0, row: -1, id: 9 col: 0, row: 0, id: 10 col: 0, row: 1, id: 11 col: 1, row: -2, id: 12 col: 1, row: -1, id: 13 col: 1, row: 0, id: 14 col: 1, row: 1, id: 15My bit shifting days are but a remote memory so you may have to help me understand how
var id = col_shifted + row_normalized
does not overwrite the previously stored pattern in col_shifted.
-
@hog said in The OFFICIAL programming thread:
Oh, and:

Maybe you should program this forum. That’s award winning content right there.
-
@rote7 said in The OFFICIAL programming thread:
@hog said in The OFFICIAL programming thread:
const BITS_PER_DIMENSION = 2 const MAX_EXTENT = 1 << (BITS_PER_DIMENSION - 1) func _ready(): print("Bits per dimension: %d, Max extent: %d" % [BITS_PER_DIMENSION, MAX_EXTENT]) var ids = [] for col in range(-MAX_EXTENT, MAX_EXTENT): var col_normalized = col + MAX_EXTENT var col_shifted = col_normalized << BITS_PER_DIMENSION for row in range(-MAX_EXTENT, MAX_EXTENT): var row_normalized = row + MAX_EXTENT var id = col_shifted + row_normalized ids.push_back(id) print("col: %4d, row: %4d, id: %4d" % [col, row, id]) print("**************** Reversed **************") var mask_high = (1 << BITS_PER_DIMENSION) - 1 print("mask high: %d" % mask_high) for id in ids: var row_normalized = id & mask_high var row = row_normalized - MAX_EXTENT var col_normalized = id >> BITS_PER_DIMENSION var col = col_normalized - MAX_EXTENT print("col: %4d, row: %4d, id: %4d" % [col, row, id])Result:
--- Debugging process started --- Godot Engine v3.3.2.stable.official - https://godotengine.org OpenGL ES 2.0 Renderer: GeForce 940MX/PCIe/SSE2 OpenGL ES Batching: ON Bits per dimension: 2, Max extent: 2 col: -2, row: -2, id: 0 col: -2, row: -1, id: 1 col: -2, row: 0, id: 2 col: -2, row: 1, id: 3 col: -1, row: -2, id: 4 col: -1, row: -1, id: 5 col: -1, row: 0, id: 6 col: -1, row: 1, id: 7 col: 0, row: -2, id: 8 col: 0, row: -1, id: 9 col: 0, row: 0, id: 10 col: 0, row: 1, id: 11 col: 1, row: -2, id: 12 col: 1, row: -1, id: 13 col: 1, row: 0, id: 14 col: 1, row: 1, id: 15 **************** Reversed ************** mask high: 3 col: -2, row: -2, id: 0 col: -2, row: -1, id: 1 col: -2, row: 0, id: 2 col: -2, row: 1, id: 3 col: -1, row: -2, id: 4 col: -1, row: -1, id: 5 col: -1, row: 0, id: 6 col: -1, row: 1, id: 7 col: 0, row: -2, id: 8 col: 0, row: -1, id: 9 col: 0, row: 0, id: 10 col: 0, row: 1, id: 11 col: 1, row: -2, id: 12 col: 1, row: -1, id: 13 col: 1, row: 0, id: 14 col: 1, row: 1, id: 15My bit shifting days are but a remote memory so you may have to help me understand how
var id = col_shifted + row_normalized
does not overwrite the previously stored pattern in col_shifted.
Sure, it’s a combination of three things:
- they’ve both been converted to unsigned ints (normalized) so the highest bit isn’t set in either number
- and the lowest bits of col_shifted are 0 because of the shift
- row_normalized only has the lowest bits set because the size of the number is constrained to +/- MAX_EXTENTS
So, even with maximum values for row and column, the addition is like:
00001100 col_shifted + 00000011 row_normalized = -------- 00001111Edit: by the way, the code i posted earlier was just a proof of concept. My actual use case (which I’ve since coded) has three dimensions. It is using 22 bits (9 + 9 + 4) for a map of 512x512x16 possible locations.
-
This post is deleted! -

-
-
Time for my favorite frownie: m(
-
Interesting article, I didn’t know that
“The SQL spec (part 2 = 1732) pages is more than twice the length of the Javascript 2021 spec (879 pages), almost matches the C++ 2020 spec (1853) pages and contains 411 occurrences of ‘implementation-defined’, occurrences which include type inference and error propagation.”
Sweet jesus, double the length of the JS specs…
One SQL problem that I couldn’t solve so far is finding a good way to use the output of a single column query (multiple rows, result count must be flexible) as headers and/or fields for a subsequent query.
-
@rote7 said in The OFFICIAL programming thread:
Interesting article, I didn’t know that
“The SQL spec (part 2 = 1732) pages is more than twice the length of the Javascript 2021 spec (879 pages), almost matches the C++ 2020 spec (1853) pages and contains 411 occurrences of ‘implementation-defined’, occurrences which include type inference and error propagation.”
Sweet jesus, double the length of the JS specs…
One SQL problem that I couldn’t solve so far is finding a good way to use the output of a single column query (multiple rows, result count must be flexible) as headers and/or fields for a subsequent query.
Dynamic DB-driven filter query? Sounds like a specific SQL client function to me.
-
@Kilemall Yes, that was my first idea too. My goal is to replace a whole lot of client logic with a set of queries/subqueries and/or joins. I am looking for a pivot mechanism to transform a set of column(s) into rows.
E.g. turn
col_1 | col_2
param_1 | value_1
param_2 | value_2
param_foo | value_fointo a dynamic DB operation that delivers a result like the client generated query “SELECT * FROM table WHERE param_1 = value_1 AND param_2 = value_2 AND param_foo = value_foo” without all the string concatenation, input scrubbing etc. pp. going on in the client.
-
@rote7 said in The OFFICIAL programming thread:
Interesting article, I didn’t know that
“The SQL spec (part 2 = 1732) pages is more than twice the length of the Javascript 2021 spec (879 pages), almost matches the C++ 2020 spec (1853) pages and contains 411 occurrences of ‘implementation-defined’, occurrences which include type inference and error propagation.”
Sweet jesus, double the length of the JS specs…
One SQL problem that I couldn’t solve so far is finding a good way to use the output of a single column query (multiple rows, result count must be flexible) as headers and/or fields for a subsequent query.
I think you need to do it as a stored procedure if I remember right and using the PIVOT function. Basically instead of defining the static columns as in the base function, you dynamically insert them in the stored procedure. If you are doing this as part of another code project, you could do the same by just assembling the text of the SQL script to sent dynamically (e.g. “SELECT “& [column name varIable]&” FROM TABLE_NAME;”
-
This thread:

-
Stored procedures are one possible solution. But, and this is a big but, they are DB dependent and I am looking for a way to achieve this with as little as possible DB specific SQL dialect.
As for the client generated SQL, that’s the current solution as a part of a homegrown ORM. I am just curious if it can be done purely in the DB as a way to replace a bunch of DB specific logic during the SQL generation in that ORM.

/* insert snappy comment here */
-
I’d snap one off in her
-
@rote7 said in The OFFICIAL programming thread:
Stored procedures are one possible solution. But, and this is a big but, they are DB dependent and I am looking for a way to achieve this with as little as possible DB specific SQL dialect.
As for the client generated SQL, that’s the current solution as a part of a homegrown ORM. I am just curious if it can be done purely in the DB as a way to replace a bunch of DB specific logic during the SQL generation in that ORM.

/* insert snappy comment here */
@rote7
Yeah, I couldn’t find a way other than a stored procedure in Oracle. The function requires you to define the columns in the SQL so it’s static. Nothing in many searches I did changed that, though the procedure thing was suggested. Seems like a stupid design since pivoting often requires dynamic results. -
@gators1 She bumped her chin on something.
-
@gustaf said in The OFFICIAL programming thread:
This thread:

This is what I was waiting for, the caterwauls of the computer illiterati! SUCCESS ROTE SUCCESS!


