nuclear@0: #include "texgen.h" nuclear@0: nuclear@0: static void intcolor(const Vector4 &color, int *icol); nuclear@0: nuclear@0: Image *texgen_solid(int xsz, int ysz, const Vector4 &color) nuclear@0: { nuclear@0: Image *img = new Image; nuclear@0: if(!img->create(xsz, ysz, Image::FMT_RGBA)) { nuclear@0: delete img; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int col[4]; nuclear@0: intcolor(color, col); nuclear@0: nuclear@0: unsigned char *pix = (unsigned char*)img->get_pixels(); nuclear@0: for(int i=0; icreate(xsz, ysz, Image::FMT_RGBA)) { nuclear@0: delete img; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int c1[4], c2[4]; nuclear@0: intcolor(col1, c1); nuclear@0: intcolor(col2, c2); nuclear@0: nuclear@0: int udiv = xsz / usub; nuclear@0: int vdiv = ysz / vsub; nuclear@0: nuclear@0: unsigned char *pix = (unsigned char*)img->get_pixels(); nuclear@0: for(int i=0; icreate(xsz, ysz, Image::FMT_RGBA)) { nuclear@0: delete img; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: unsigned char *pix = (unsigned char*)img->get_pixels(); nuclear@0: for(int i=0; ioctaves) * 0.5 + 0.5; nuclear@0: return lerp(arg->col1, arg->col2, noise); nuclear@0: } nuclear@0: nuclear@0: static Vector4 fbm_abs_eval(float x, float y, void *cls) nuclear@0: { nuclear@0: NoiseArg *arg = (NoiseArg*)cls; nuclear@0: nuclear@0: float noise = turbulence2(x, y, arg->octaves) * 0.5 + 0.5; nuclear@0: return lerp(arg->col1, arg->col2, noise); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: Image *texgen_fbm(int xsz, int ysz, float usize, float vsize, int octaves, const Vector4 &col1, const Vector4 &col2) nuclear@0: { nuclear@0: NoiseArg arg = {octaves, col1, col2}; nuclear@0: if(arg.octaves < 1) { nuclear@0: arg.octaves = 1; nuclear@0: } nuclear@0: nuclear@0: return texgen(xsz, ysz, usize, vsize, fbm_eval, &arg); nuclear@0: } nuclear@0: nuclear@0: Image *texgen_fbm_abs(int xsz, int ysz, float usize, float vsize, int octaves, const Vector4 &col1, const Vector4 &col2) nuclear@0: { nuclear@0: NoiseArg arg = {octaves, col1, col2}; nuclear@0: if(arg.octaves < 1) { nuclear@0: arg.octaves = 1; nuclear@0: } nuclear@0: nuclear@0: return texgen(xsz, ysz, usize, vsize, fbm_abs_eval, &arg); nuclear@0: } nuclear@0: nuclear@0: static inline void intcolor(const Vector4 &color, int *icol) nuclear@0: { nuclear@0: for(int i=0; i<4; i++) { nuclear@0: icol[i] = std::max(std::min((int)(color[i] * 255.0), 255), 0); nuclear@0: } nuclear@0: }