Add capabilities to read values from PNGImage as if they where textures

This commit is contained in:
Peder Bergebakken Sundt 2019-03-22 23:52:04 +01:00
parent 2164551e25
commit 86118a34f4
2 changed files with 54 additions and 0 deletions

View File

@ -1,5 +1,6 @@
#include "imageLoader.hpp"
#include <glm/vec2.hpp>
#include <glm/vec4.hpp>
#include <glm/gtc/noise.hpp>
#include <iostream>
#include <vector>
@ -7,11 +8,59 @@
#include <string>
using glm::vec2;
using glm::vec4;
using std::string;
using std::map;
using std::vector;
typedef unsigned int uint;
inline vec4 operator*(vec4 a, double s) {
return a *= s;
}
vec4 PNGImage::get(int x, int y) {
if (repeat_mirrored) {
x %= width *2;
y %= height*2;
if (x >= width) x = width *2 - x - 1;
if (y >= height) y = height*2 - y - 1;
} else {
x %= width; y %= height;
}
return vec4(
float(pixels[x*4+y*width*4 + 0]) / 255,
float(pixels[x*4+y*width*4 + 1]) / 255,
float(pixels[x*4+y*width*4 + 2]) / 255,
float(pixels[x*4+y*width*4 + 3]) / 255);
}
vec4 PNGImage::at_nearest(double u, double v) {
int x = int( u*(width -1) + 0.5);
int y = int(-v*(height-1) - 0.5);
return get(x, y);
}
vec4 PNGImage::at_bilinear(double u, double v) {
double x = u*double(width-1);
double y = -v*double(height-1);
int x1 = int(x + 0.0);
int x2 = int(x + 1.0);
int y1 = int(y + 0.0);
int y2 = int(y + 1.0);
double x2x = x2 - x;
double y2y = y2 - y;
double yy1 = y - y1;
double xx1 = x - x1;
vec4 q11 = get(x1, y1);
vec4 q21 = get(x2, y1);
vec4 q12 = get(x1, y2);
vec4 q22 = get(x2, y2);
return (
q11 * x2x * y2y +
q21 * xx1 * y2y +
q12 * x2x * yy1 +
q22 * xx1 * yy1
);
}
// Original source: https://raw.githubusercontent.com/lvandeve/lodepng/master/examples/example_decode.cpp
PNGImage loadPNGFile(string filename, bool flip_handedness) {
vector<unsigned char> png;

View File

@ -1,6 +1,7 @@
#pragma once
#include "lodepng.h"
#include <glm/vec4.hpp>
#include <vector>
#include <string>
@ -11,6 +12,10 @@ struct PNGImage {
bool repeat_mirrored = false;
std::vector<unsigned char> pixels; // RGBA
bool has_transparancy = false;
glm::vec4 get(int x, int y);
glm::vec4 at_nearest(double u, double v);
glm::vec4 at_bilinear(double u, double v);
};
PNGImage loadPNGFile(std::string filename, bool flip_handedness=false);