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?