return true;
}
-Vec4 Image::lookup_nearest(float u, float v) const
+Vec4 Image::get_pixel(int x, int y) const
{
- int x = (int)(u * w) % w;
- int y = (int)(v * h) % h;
-
if(is_float) {
return ((Vec4*)pixels)[y * w + x];
}
color.w = pptr[3] / 255.0;
return color;
+}
+
+Vec4 Image::lookup_nearest(float u, float v) const
+{
+ int x = (int)(u * w) % w;
+ int y = (int)(v * h) % h;
+
+ return get_pixel(x, y);
+}
+
+Vec4 Image::lookup_linear(float u, float v, float du, float dv) const
+{
+ /* bottom left */
+ int x0 = (int)(u * w) % w;
+ int y0 = (int)(v * h) % h;
+ int x1 = (x0 + 1) % w;
+ int y1 = (y0 + 1) % h;
+
+ /* uv coordinates at the img corners */
+ float u0 = (float)x0 / (float)w;
+ float v0 = (float)y0 / (float)h;
+ float u1 = (float)(x0 + 1) / (float)w;
+ float v1 = (float)(y0 + 1) / (float)h;
+
+ float tu = (u - u0) / (u1 - u0);
+ float tv = (v - v0) / (v1 - v0);
+
+ Vec4 p00 = get_pixel(x0, y0);
+ Vec4 p01 = get_pixel(x0, y1);
+ Vec4 p11 = get_pixel(x1, y1);
+ Vec4 p10 = get_pixel(x1, y0);
+
+ Vec4 ptop = lerp(p01, p11, tu);
+ Vec4 pbot = lerp(p00, p10, tu);
+
+ return lerp(pbot, ptop, tv);
}
\ No newline at end of file
bool load(const char *fname);
+ Vec4 get_pixel(int x, int y) const;
+
Vec4 lookup_nearest(float u, float v) const;
- //TODO lookup_linear
+ Vec4 lookup_linear(float u, float v, float du, float dv) const;
};
#endif // IMAGE_H_
\ No newline at end of file