[nexuiz-commits] r6704 - trunk/misc/tools

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon May 11 07:30:50 EDT 2009


Author: div0
Date: 2009-05-11 07:30:50 -0400 (Mon, 11 May 2009)
New Revision: 6704

Added:
   trunk/misc/tools/hitplot2tga.c
Log:
hitplot to tga tool


Added: trunk/misc/tools/hitplot2tga.c
===================================================================
--- trunk/misc/tools/hitplot2tga.c	                        (rev 0)
+++ trunk/misc/tools/hitplot2tga.c	2009-05-11 11:30:50 UTC (rev 6704)
@@ -0,0 +1,162 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <err.h>
+#include <string.h>
+#include <math.h>
+
+typedef void (*colorfunc_t) (double x, double y, double dx, double dy, double *r, double *g, double *b);
+
+double rnd()
+{
+	return rand() / (RAND_MAX + 1.0);
+}
+
+double softclip(double x, double a)
+{
+	// don't ask what this does - but it works
+	double cse = (2*a*x - x - a + 1) * x;
+	return cse / (cse + (1 - a));
+}
+
+void writepic(colorfunc_t f, const char *fn, int width, int height)
+{
+	int x, y;
+	uint8_t tga[18];
+
+	FILE *file = fopen(fn, "wb");
+	if(!file)
+		err(1, "fopen >%s", fn);
+
+	memset(tga, 0, sizeof(tga));
+	tga[2] = 2;          // uncompressed type
+	tga[12] = (width >> 0) & 0xFF;
+	tga[13] = (width >> 8) & 0xFF;
+	tga[14] = (height >> 0) & 0xFF;
+	tga[15] = (height >> 8) & 0xFF;
+	tga[16] = 24;        // pixel size
+
+	if(fwrite(&tga, sizeof(tga), 1, file) != 1)
+		err(1, "fwrite >%s", fn);
+	//for(y = height-1; y >= 0; --y)
+	for(y = 0; y < height; ++y)
+		for(x = 0; x < width; ++x)
+		{
+			uint8_t rgb[3];
+			double rr, gg, bb;
+			double xx, yy;
+			double xxx, yyy, zzz;
+			double r;
+			xx = (x + 0.5) / width;
+			yy = (y + 0.5) / height;
+			f(xx, yy, 0.5 / width, 0.5 / height, &rr, &gg, &bb);
+			rgb[2] = floor(rnd() + rr * 255);
+			rgb[1] = floor(rnd() + gg * 255);
+			rgb[0] = floor(rnd() + bb * 255);
+			if(fwrite(rgb, sizeof(rgb), 1, file) != 1)
+				err(1, "fwrite >%s", fn);
+		}
+	
+	fclose(file);
+}
+
+typedef struct
+{ 
+	double x, y, dist;
+	int weapon;
+}
+plotpoint_t;
+
+plotpoint_t *plotpoints;
+size_t nPlotpoints, allocatedPlotpoints;
+
+void readpoints(const char *fn)
+{
+	char buf[1024];
+
+	FILE *infile = fopen(fn, "r");
+	if(!infile)
+		err(1, "fopen <%s", fn);
+
+	nPlotpoints = allocatedPlotpoints = 0;
+	plotpoints = NULL;
+
+	while(fgets(buf, sizeof(buf), infile))
+	{
+		if(*buf == '#') 
+		{
+			fputs(buf + 1, stdout);
+			continue;
+		}
+		if(nPlotpoints >= allocatedPlotpoints)
+		{
+			if(allocatedPlotpoints == 0)
+				allocatedPlotpoints = 1024;
+			else
+				allocatedPlotpoints = nPlotpoints * 2;
+			plotpoints = (plotpoint_t *) realloc(plotpoints, allocatedPlotpoints * sizeof(*plotpoints));
+		}
+		if(sscanf(buf, "%lf %lf %lf %d", &plotpoints[nPlotpoints].x, &plotpoints[nPlotpoints].y, &plotpoints[nPlotpoints].dist, &plotpoints[nPlotpoints].weapon) != 4)
+			continue;
+		++nPlotpoints;
+	}
+}
+
+void calcplot1(double x, double y, double *out, double sigma2)
+{
+	size_t i;
+	double dist2;
+	double val, totalval = 0, weight, totalweight = 0;
+
+	for(i = 0; i < nPlotpoints; ++i)
+	{
+		dist2 = (x - plotpoints[i].x) * (x - plotpoints[i].x) + (y - plotpoints[i].y) * (y - plotpoints[i].y);
+		weight = 1; // / plotpoints[i].dist;
+		val = exp(-dist2 / sigma2);
+
+		totalweight += weight;
+		totalval += weight * val;
+	}
+
+	*out = softclip(totalval / (totalweight * sqrt(sigma2 * 2 * M_PI)), 0.8);
+}
+
+void calcplotp(double x, double y, double dx, double dy, double *out)
+{
+	size_t i;
+	double distx, disty;
+
+	for(i = 0; i < nPlotpoints; ++i)
+	{
+		distx = x - plotpoints[i].x;
+		disty = y - plotpoints[i].y;
+
+		if(distx < dx)
+		if(distx > -dx)
+		if(disty < dy)
+		if(disty > -dy)
+		{
+			*out = 1;
+			break;
+		}
+	}
+}
+
+void calcplot(double x, double y, double dx, double dy, double *r, double *g, double *b)
+{
+	calcplot1(x, y, r, 1/64.0);
+	calcplot1(x, y, g, 1/512.0);
+	calcplot1(x, y, b, 1/4096.0);
+	calcplotp(x, y, dx, dy, b);
+}
+
+int main(int argc, char **argv)
+{
+	FILE *in;
+
+	if(argc != 3)
+		errx(1, "Usage: %s infile.plot outfile.tga", *argv);
+	
+	readpoints(argv[1]);
+	writepic(calcplot, argv[2], 512, 512);
+}



More information about the nexuiz-commits mailing list