#ifndef LMP_IMAGE_H
#define LMP_IMAGE_H
#include <cmath>
#include "pointers.h"
namespace LAMMPS_NS {
class Image : protected Pointers {
public:
int width,height; double theta,phi; double xctr,yctr,zctr; double up[3]; double zoom; double persp; double shiny; int ssao; int seed; double ssaoint; double *boxcolor; int background[3];
Image(class LAMMPS *, int);
~Image();
void buffers();
void clear();
void merge();
void write_JPG(FILE *);
void write_PNG(FILE *);
void write_PPM(FILE *);
void view_params(double, double, double, double, double, double);
void draw_sphere(double *, double *, double);
void draw_cube(double *, double *, double);
void draw_cylinder(double *, double *, double *, double, int);
void draw_triangle(double *, double *, double *, double *);
void draw_box(double (*)[3], double);
void draw_axes(double (*)[3], double);
int map_dynamic(int);
int map_reset(int, int, char **);
int map_minmax(int, double, double);
double *map_value2color(int, double);
int addcolor(char *, double, double, double);
double *element2color(char *);
double element2diam(char *);
double *color2rgb(const char *, int index=0);
int default_colors();
private:
int me,nprocs;
int npixels;
class ColorMap **maps;
int nmap;
double *depthBuffer,*surfaceBuffer;
double *depthcopy,*surfacecopy;
unsigned char *imageBuffer,*rgbcopy,*writeBuffer;
double FOV;
double ambientColor[3];
double keyLightTheta;
double keyLightPhi;
double keyLightColor[3];
double fillLightTheta;
double fillLightPhi;
double fillLightColor[3];
double backLightTheta;
double backLightPhi;
double backLightColor[3];
double specularHardness;
double specularIntensity;
double SSAORadius;
int SSAOSamples;
double SSAOJitter;
double zdist;
double tanPerPixel;
double camDir[3],camUp[3],camRight[4],camPos[3];
double keyLightDir[3],fillLightDir[3],backLightDir[3];
double keyHalfDir[3];
int ncolors;
char **username;
double **userrgb;
class RanMars *random;
void draw_pixel(int, int, double, double *, double*);
void compute_SSAO();
inline double saturate(double v) {
if (v < 0.0) return 0.0;
else if (v > 1.0) return 1.0;
else return v;
}
inline double distance(double* a, double* b) {
return sqrt((a[0] - b[0]) * (a[0] - b[0]) +
(a[1] - b[1]) * (a[1] - b[1]) +
(a[2] - b[2]) * (a[2] - b[2]));
}
};
class ColorMap : protected Pointers {
public:
int dynamic;
ColorMap(class LAMMPS *, class Image*);
~ColorMap();
int reset(int, char **);
int minmax(double, double);
double *value2color(double);
private:
class Image *image; int mstyle,mrange; int mlo,mhi; double mlovalue,mhivalue; double locurrent,hicurrent; double mbinsize,mbinsizeinv; double interpolate[3];
struct MapEntry {
int single,lo,hi; double svalue,lvalue,hvalue; double *color; };
MapEntry *mentry;
int nentry;
};
}
#endif