dos3d

changeset 4:c3e0bccd673e

added texture mapping
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 21 Nov 2011 11:51:23 +0200
parents 0e781cc43178
children c8ffdbc6139e
files .hgignore src/palman.c src/palman.h src/test.c src/texture.c src/texture.h
diffstat 6 files changed, 153 insertions(+), 28 deletions(-) [+]
line diff
     1.1 --- a/.hgignore	Mon Nov 21 10:16:09 2011 +0200
     1.2 +++ b/.hgignore	Mon Nov 21 11:51:23 2011 +0200
     1.3 @@ -1,4 +1,5 @@
     1.4  \.o$
     1.5  \.obj$
     1.6  \.d$
     1.7 +\.swp$
     1.8  ^test$
     2.1 --- a/src/palman.c	Mon Nov 21 10:16:09 2011 +0200
     2.2 +++ b/src/palman.c	Mon Nov 21 11:51:23 2011 +0200
     2.3 @@ -44,6 +44,18 @@
     2.4  	return 0;
     2.5  }
     2.6  
     2.7 +int palm_color_index(unsigned char r, unsigned char g, unsigned char b)
     2.8 +{
     2.9 +	int i;
    2.10 +
    2.11 +	for(i=0; i<ncol; i++) {
    2.12 +		if(colors[i].r == r && colors[i].g == g && colors[i].b == b) {
    2.13 +			return i;
    2.14 +		}
    2.15 +	}
    2.16 +	return -1;
    2.17 +}
    2.18 +
    2.19  /* TODO: build an octree */
    2.20  int palm_build(void)
    2.21  {
    2.22 @@ -94,14 +106,12 @@
    2.23  
    2.24  int palm_color_base(unsigned char r, unsigned char g, unsigned char b)
    2.25  {
    2.26 -	int i;
    2.27 +	int c;
    2.28  
    2.29 -	for(i=0; i<pcol; i++) {
    2.30 -		if(colors[i].r == r && colors[i].g == g && colors[i].b == b) {
    2.31 -			return base_index[i];
    2.32 -		}
    2.33 +	if((c = palm_color_index(r, g, b)) == -1) {
    2.34 +		return -1;
    2.35  	}
    2.36 -	return -1;
    2.37 +	return base_index[c];
    2.38  }
    2.39  
    2.40  int palm_color_range(void)
     3.1 --- a/src/palman.h	Mon Nov 21 10:16:09 2011 +0200
     3.2 +++ b/src/palman.h	Mon Nov 21 11:51:23 2011 +0200
     3.3 @@ -25,6 +25,7 @@
     3.4  
     3.5  void palm_clear(void);
     3.6  int palm_add_color(unsigned char r, unsigned char g, unsigned char b);
     3.7 +int palm_color_index(unsigned char r, unsigned char g, unsigned char b);
     3.8  
     3.9  int palm_build(void);
    3.10  
     4.1 --- a/src/test.c	Mon Nov 21 10:16:09 2011 +0200
     4.2 +++ b/src/test.c	Mon Nov 21 11:51:23 2011 +0200
     4.3 @@ -41,6 +41,7 @@
     4.4  static unsigned char *fbuf;
     4.5  
     4.6  static struct texture *tex;
     4.7 +static char *texfile;
     4.8  
     4.9  static int white_base, red_base, green_base, blue_base;
    4.10  static int grad_range;
    4.11 @@ -113,16 +114,38 @@
    4.12  	signal(SIGILL, sighandler);
    4.13  	signal(SIGABRT, sighandler);
    4.14  
    4.15 -	palm_add_color(255, 255, 255);
    4.16 -	palm_add_color(255, 0, 0);
    4.17 -	palm_add_color(0, 255, 0);
    4.18 -	palm_add_color(0, 0, 255);
    4.19 -	palm_build();
    4.20  
    4.21 -	white_base = palm_color_base(255, 255, 255);
    4.22 -	red_base = palm_color_base(255, 0, 0);
    4.23 -	green_base = palm_color_base(0, 255, 0);
    4.24 -	blue_base = palm_color_base(0, 0, 255);
    4.25 +	if(mgl_init(320, 200) == -1) {
    4.26 +		fprintf(stderr, "mgl init failed\n");
    4.27 +		return -1;
    4.28 +	}
    4.29 +	fbuf = mgl_framebuffer();
    4.30 +
    4.31 +
    4.32 +	if(!texfile) {
    4.33 +		palm_add_color(255, 255, 255);
    4.34 +		palm_add_color(255, 0, 0);
    4.35 +		palm_add_color(0, 255, 0);
    4.36 +		palm_add_color(0, 0, 255);
    4.37 +		palm_build();
    4.38 +
    4.39 +		white_base = palm_color_base(255, 255, 255);
    4.40 +		red_base = palm_color_base(255, 0, 0);
    4.41 +		green_base = palm_color_base(0, 255, 0);
    4.42 +		blue_base = palm_color_base(0, 0, 255);
    4.43 +
    4.44 +		tex = tex_gen_checker(64, 64, 3, 3, red_base, blue_base);
    4.45 +	} else {
    4.46 +		if(!(tex = load_texture(texfile))) {
    4.47 +			return -1;
    4.48 +		}
    4.49 +
    4.50 +		palm_build();
    4.51 +		get_texture_pixels(tex);
    4.52 +
    4.53 +		mgl_enable(MGL_TEXTURE_2D);
    4.54 +	}
    4.55 +
    4.56  	grad_range = palm_color_range();
    4.57  
    4.58  	pal = palm_palette();
    4.59 @@ -130,12 +153,6 @@
    4.60  		set_palette(i, pal[i].r, pal[i].g, pal[i].b);
    4.61  	}
    4.62  
    4.63 -	if(mgl_init(320, 200) == -1) {
    4.64 -		fprintf(stderr, "mgl init failed\n");
    4.65 -		return -1;
    4.66 -	}
    4.67 -	fbuf = mgl_framebuffer();
    4.68 -
    4.69  	mgl_enable(MGL_CULL_FACE);
    4.70  	mgl_enable(MGL_SMOOTH);
    4.71  	mgl_color_range(grad_range - 1);	/* gradient range */
    4.72 @@ -148,10 +165,6 @@
    4.73  	mgl_load_identity();
    4.74  	mgl_perspective(45.0, 320.0 / 200.0, 0.5, 100.0);
    4.75  
    4.76 -	if(!(tex = tex_gen_checker(64, 64, 3, 3, red_base, blue_base))) {
    4.77 -		fprintf(stderr, "failed to generate texture\n");
    4.78 -		return -1;
    4.79 -	}
    4.80  	mgl_teximage(tex->width, tex->height, tex->pixels);
    4.81  
    4.82      return 0;
    4.83 @@ -358,6 +371,10 @@
    4.84  				auto_rotate = !auto_rotate;
    4.85  				break;
    4.86  
    4.87 +			case 't':
    4.88 +				texfile = argv[++i];
    4.89 +				break;
    4.90 +
    4.91  			case 'v':
    4.92  				use_vsync = !use_vsync;
    4.93  				break;
     5.1 --- a/src/texture.c	Mon Nov 21 10:16:09 2011 +0200
     5.2 +++ b/src/texture.c	Mon Nov 21 11:51:23 2011 +0200
     5.3 @@ -16,13 +16,96 @@
     5.4  along with this program.  If not, see <http://www.gnu.org/licenses/>.
     5.5  */
     5.6  
     5.7 +#include <stdio.h>
     5.8 +#include <string.h>
     5.9  #include <stdlib.h>
    5.10  #include "texture.h"
    5.11  #include "palman.h"
    5.12  
    5.13 -struct texture *tex_load(const char *fname)
    5.14 +struct texture *load_texture(const char *fname)
    5.15  {
    5.16 -	return 0;	/* TODO */
    5.17 +	int i, num_pixels;
    5.18 +	struct texture *tex;
    5.19 +	long fpos;
    5.20 +
    5.21 +	if(!(tex = malloc(sizeof *tex))) {
    5.22 +		return 0;
    5.23 +	}
    5.24 +	memset(tex, 0, sizeof *tex);
    5.25 +
    5.26 +	if(!(tex->file = fopen(fname, "rb"))) {
    5.27 +		fprintf(stderr, "failed to open texture: %s\n", fname);
    5.28 +		free_texture(tex);
    5.29 +		return 0;
    5.30 +	}
    5.31 +	if(fscanf(tex->file, "P6 %d %d 255 ", &tex->width, &tex->height) != 2) {
    5.32 +		fprintf(stderr, "invalid pixmap: %s\n", fname);
    5.33 +		free_texture(tex);
    5.34 +		return 0;
    5.35 +	}
    5.36 +	fpos = ftell(tex->file);
    5.37 +
    5.38 +	num_pixels = tex->width * tex->height;
    5.39 +	for(i=0; i<num_pixels; i++) {
    5.40 +		int r, g, b;
    5.41 +
    5.42 +		r = fgetc(tex->file);
    5.43 +		g = fgetc(tex->file);
    5.44 +		b = fgetc(tex->file);
    5.45 +
    5.46 +		if(feof(tex->file)) {
    5.47 +			fprintf(stderr, "unexpected EOF while reading: %s\n", fname);
    5.48 +			free_texture(tex);
    5.49 +			return 0;
    5.50 +		}
    5.51 +
    5.52 +		if(palm_color_index(r, g, b) == -1) {
    5.53 +			palm_add_color(r, g, b);
    5.54 +			printf("adding color %d %d %d\n", r, g, b);
    5.55 +		}
    5.56 +	}
    5.57 +	fseek(tex->file, fpos, SEEK_SET);
    5.58 +	return tex;
    5.59 +}
    5.60 +
    5.61 +void free_texture(struct texture *tex)
    5.62 +{
    5.63 +	if(tex) {
    5.64 +		if(tex->file) {
    5.65 +			fclose(tex->file);
    5.66 +		}
    5.67 +		free(tex->pixels);
    5.68 +		free(tex);
    5.69 +	}
    5.70 +}
    5.71 +
    5.72 +unsigned char *get_texture_pixels(struct texture *tex)
    5.73 +{
    5.74 +	if(!tex->pixels && tex->file) {
    5.75 +		int i, num_pixels = tex->width * tex->height;
    5.76 +
    5.77 +		if(!(tex->pixels = malloc(num_pixels))) {
    5.78 +			return 0;
    5.79 +		}
    5.80 +
    5.81 +		for(i=0; i<num_pixels; i++) {
    5.82 +			int r, g, b, base;
    5.83 +
    5.84 +			r = fgetc(tex->file);
    5.85 +			g = fgetc(tex->file);
    5.86 +			b = fgetc(tex->file);
    5.87 +
    5.88 +			if((base = palm_color_base(r, g, b)) == -1) {
    5.89 +				base = 0;
    5.90 +			}
    5.91 +			tex->pixels[i] = base;
    5.92 +		}
    5.93 +
    5.94 +		fclose(tex->file);
    5.95 +		tex->file = 0;
    5.96 +	}
    5.97 +
    5.98 +	return tex->pixels;
    5.99  }
   5.100  
   5.101  struct texture *tex_gen_checker(int xsz, int ysz, int ush, int vsh, int c1, int c2)
   5.102 @@ -34,6 +117,8 @@
   5.103  	if(!(tex = malloc(sizeof *tex))) {
   5.104  		return 0;
   5.105  	}
   5.106 +	memset(tex, 0, sizeof *tex);
   5.107 +
   5.108  	if(!(tex->pixels = malloc(xsz * ysz))) {
   5.109  		free(tex);
   5.110  		return 0;
     6.1 --- a/src/texture.h	Mon Nov 21 10:16:09 2011 +0200
     6.2 +++ b/src/texture.h	Mon Nov 21 11:51:23 2011 +0200
     6.3 @@ -21,10 +21,21 @@
     6.4  struct texture {
     6.5  	int width, height;
     6.6  	unsigned char *pixels;
     6.7 +
     6.8 +	struct {
     6.9 +		unsigned char r, g, b;
    6.10 +	} *palette;
    6.11 +	int num_colors;
    6.12 +
    6.13 +	FILE *file;
    6.14  };
    6.15  
    6.16 -struct texture *tex_load(const char *fname);
    6.17 +struct texture *load_texture(const char *fname);
    6.18 +void free_texture(struct texture *tex);
    6.19  
    6.20  struct texture *tex_gen_checker(int xsz, int ysz, int usub, int vsub, int c1, int c2);
    6.21  
    6.22 +unsigned char *get_texture_pixels(struct texture *tex);
    6.23 +int find_texture_color(struct texture *tex, int r, int g, int b);
    6.24 +
    6.25  #endif	/* TEXTURE_H_ */