I'm trying to map my "quadruplet" object to an unsigned 32-bit number, that is supposed to represent an RGBA pixel. I'm able to convert my floating point quadruplet values to their respective R, G, B, and A components, but when I try to do an and on all of the components, I'm getting a 0. Here is my code:
proc map*(x, a, b, p, q: float): float {.inline.} =
return (x - a) * (q - p) / (b - a) + p
#...
type
# [-1, 1] -> [0x00, 0xFF]
Quadruplet* = ref object of RootObj
w*: float
x*: float
y*: float
z*: float
# ...
# Returns a quadruplet as a nicely formatted RGBA pixel. Remember:
# [-1, 1] -> [0x00, 0xFF]. Anything out of that range will be clamped
proc toRGBA*(q: Quadruplet): uint32 {.inline.} =
let
r = q.x.clamp(-1, 1).map(-1, 1, 0x00, 0xFF).uint32 shl 24
g = q.y.clamp(-1, 1).map(-1, 1, 0x00, 0xFF).uint32 shl 16
b = q.z.clamp(-1, 1).map(-1, 1, 0x00, 0xFF).uint32 shl 8
a = q.w.clamp(-1, 1).map(-1, 1, 0x00, 0xFF).uint32
pixel = r and g and b and a
echo ""
echo r
echo g
echo b
echo a
echo pixel
echo ""
return pixel
Those echo statements are in there for debugging purposes right now.
So an example call would be: echo Quadruplet(w:0, x:1, y:1, z:1).toRGBA() # 50% white
And it's producing this on standard output
4278190080
16711680
65280
127
0
All of those components look correct, except for when I combine them with the ands into the full pixel. Can someone explain what's wrong here and how to fix it?