Commit de8b6e79 authored by Thomas White's avatar Thomas White
Browse files

render_hkl: Bring --povray up to date

parent f2b07d85
......@@ -9,5 +9,5 @@ EXTRA_DIST = configure src/cell.h src/hdf5-file.h src/image.h \
src/povray.h src/index-priv.h src/geometry.h src/templates.h \
data/sfac/Ca.nff data/sfac/C.nff data/sfac/Fe.nff data/sfac/H.nff \
data/sfac/Mg.nff data/sfac/N.nff data/sfac/O.nff data/sfac/P.nff \
data/sfac/S.nff data/sfac/f0_WaasKirf.dat
data/sfac/S.nff data/sfac/f0_WaasKirf.dat src/render_hkl.h
SUBDIRS = src data doc
......@@ -206,7 +206,7 @@ EXTRA_DIST = configure src/cell.h src/hdf5-file.h src/image.h \
src/povray.h src/index-priv.h src/geometry.h src/templates.h \
data/sfac/Ca.nff data/sfac/C.nff data/sfac/Fe.nff data/sfac/H.nff \
data/sfac/Mg.nff data/sfac/N.nff data/sfac/O.nff data/sfac/P.nff \
data/sfac/S.nff data/sfac/f0_WaasKirf.dat
data/sfac/S.nff data/sfac/f0_WaasKirf.dat src/render_hkl.h
SUBDIRS = src data doc
all: config.h
......
......@@ -21,13 +21,16 @@
#include "cell.h"
#include "utils.h"
#include "symmetry.h"
#include "render_hkl.h"
#define MAX_PROC (256)
int povray_render_animation(UnitCell *cell, double *ref,
unsigned int *c, unsigned int nproc)
int povray_render_animation(UnitCell *cell, double *ref, unsigned int *counts,
ReflItemList *items, unsigned int nproc,
const char *sym, int wght, double boost)
{
FILE *fh;
double asx, asy, asz;
......@@ -36,7 +39,6 @@ int povray_render_animation(UnitCell *cell, double *ref,
pid_t pids[MAX_PROC];
float max;
int i;
signed int h, k, l;
if ( (nproc > MAX_PROC) || (nproc < 1) ) {
ERROR("Number of processes must be a number between 1 and %i\n",
......@@ -162,20 +164,68 @@ int povray_render_animation(UnitCell *cell, double *ref,
fprintf(fh, "}\n");
max = 0.5e6;
for ( h=-INDMAX; h<INDMAX; h++ ) {
for ( k=-INDMAX; k<INDMAX; k++ ) {
for ( l=-INDMAX; l<INDMAX; l++ ) {
max = 0.0;
for ( i=0; i<num_items(items); i++ ) {
float radius, x, y, z;
struct refl_item *it;
float val;
it = get_item(items, i);
switch ( wght ) {
case WGHT_I :
val = lookup_intensity(ref, it->h, it->k, it->l);
break;
case WGHT_SQRTI :
val = lookup_intensity(ref, it->h, it->k, it->l);
val = (val>0.0) ? sqrt(val) : 0.0;
break;
case WGHT_COUNTS :
val = lookup_count(counts, it->h, it->k, it->l);
val /= (float)num_equivs(it->h, it->k, it->l, sym);
break;
case WGHT_RAWCOUNTS :
val = lookup_count(counts, it->h, it->k, it->l);
break;
default :
ERROR("Invalid weighting.\n");
abort();
}
if ( val > max ) max = val;
}
max /= boost;
for ( i=0; i<num_items(items); i++ ) {
struct refl_item *it;
float radius;
int s;
float val, p, r, g, b, trans;
int j;
if ( !lookup_count(c, h, k, l) ) continue;
val = lookup_intensity(ref, h, k, l);
it = get_item(items, i);
val = max-val;
switch ( wght ) {
case WGHT_I :
val = lookup_intensity(ref, it->h, it->k, it->l);
break;
case WGHT_SQRTI :
val = lookup_intensity(ref, it->h, it->k, it->l);
val = (val>0.0) ? sqrt(val) : 0.0;
break;
case WGHT_COUNTS :
val = lookup_count(counts, it->h, it->k, it->l);
val /= (float)num_equivs(it->h, it->k, it->l, sym);
break;
case WGHT_RAWCOUNTS :
val = lookup_count(counts, it->h, it->k, it->l);
break;
default :
ERROR("Invalid weighting.\n");
abort();
}
s = val / (max/6);
p = fmod(val, max/6);
......@@ -214,30 +264,33 @@ int povray_render_animation(UnitCell *cell, double *ref,
break;
}
val = max-val;
if ( val <= 0.0 ) continue;
radius = 0.1 * sqrt(sqrt(val))/1e2;
radius -= 0.008;
if ( radius > 0.03 ) radius = 0.03;
if ( radius <= 0.0 ) continue;
trans = (0.03-radius)/0.03;
radius += 0.002;
x = asx*h + bsx*k + csx*l;
y = asy*h + bsy*k + csy*l;
z = asz*h + bsz*k + csz*l;
fprintf(fh, "sphere { <%.5f, %.5f, %.5f>, %.5f "
"texture{pigment{color rgb <%f, %f, %f>"
" transmit %f} "
"finish { reflection 0.1 } } \n"
"transform { TRANS }\n"
"}\n",
x/1e9, y/1e9, z/1e9, radius, r, g, b, trans);
radius = 0.01 * pow(val, 0.25)/pow(max, 0.25);
trans = 1.0-(val/max);
/* For each equivalent */
for ( j=0; j<num_equivs(it->h, it->k, it->l, sym); j++ ) {
signed int he, ke, le;
float x, y, z;
get_equiv(it->h, it->k, it->l, &he, &ke, &le, sym, j);
x = asx*he + bsx*ke + csx*le;
y = asy*he + bsy*ke + csy*le;
z = asz*he + bsz*ke + csz*le;
fprintf(fh, "sphere { <%.5f, %.5f, %.5f>, %.5f "
"texture{pigment{color rgb <%f, %f, %f>"
" transmit %f} "
"finish { reflection 0.1 } } \n"
"transform { TRANS }\n"
"}\n",
x/1e9, y/1e9, z/1e9, radius,
r, g, b, trans);
}
}
}
}
fprintf(fh, "\n");
......
/*
* povray.c
* povray.h
*
* Invoke POV-ray
*
......@@ -17,6 +17,8 @@
#define POVRAY_H
extern int povray_render_animation(UnitCell *cell, double *ref,
unsigned int *c, unsigned int nproc);
unsigned int *counts, ReflItemList *items,
unsigned int nproc, const char *sym,
int wght, double boost);
#endif /* POVRAY_H */
......@@ -30,13 +30,8 @@
#include "povray.h"
#include "symmetry.h"
#include "render.h"
#include "render_hkl.h"
enum {
WGHT_I,
WGHT_SQRTI,
WGHT_COUNTS,
WGHT_RAWCOUNTS,
};
static void show_help(const char *s)
{
......@@ -621,7 +616,8 @@ int main(int argc, char *argv[])
}
if ( config_povray ) {
r = povray_render_animation(cell, ref, cts, nproc);
r = povray_render_animation(cell, ref, cts, items,
nproc, sym, wght, boost);
} else if ( config_zoneaxis ) {
#ifdef HAVE_CAIRO
render_za(cell, items, ref, cts, boost, sym, wght, colscale,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment