dos3d
changeset 1:0b7f840afe4a
palette management
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 21 Nov 2011 08:35:58 +0200 |
parents | f04884489bad |
children | 8c9a63a902d5 |
files | Makefile src/palman.c src/palman.h src/test.c |
diffstat | 4 files changed, 174 insertions(+), 25 deletions(-) [+] |
line diff
1.1 --- a/Makefile Mon Nov 21 06:14:01 2011 +0200 1.2 +++ b/Makefile Mon Nov 21 08:35:58 2011 +0200 1.3 @@ -1,5 +1,6 @@ 1.4 obj = src/test.o \ 1.5 src/mingl.o src/mglrast.o src/mglgen.o \ 1.6 + src/palman.o \ 1.7 dosemu/dosemu.o 1.8 dep = $(obj:.o=.d) 1.9 bin = test
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/src/palman.c Mon Nov 21 08:35:58 2011 +0200 2.3 @@ -0,0 +1,110 @@ 2.4 +/* 2.5 +256-color 3D graphics hack for real-mode DOS. 2.6 +Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org> 2.7 + 2.8 +This program is free software: you can redistribute it and/or modify 2.9 +it under the terms of the GNU General Public License as published by 2.10 +the Free Software Foundation, either version 3 of the License, or 2.11 +(at your option) any later version. 2.12 + 2.13 +This program is distributed in the hope that it will be useful, 2.14 +but WITHOUT ANY WARRANTY; without even the implied warranty of 2.15 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2.16 +GNU General Public License for more details. 2.17 + 2.18 +You should have received a copy of the GNU General Public License 2.19 +along with this program. If not, see <http://www.gnu.org/licenses/>. 2.20 +*/ 2.21 + 2.22 +#include <string.h> 2.23 +#include "palman.h" 2.24 + 2.25 +#define MAX_COLORS 256 2.26 +static struct palm_color colors[MAX_COLORS]; 2.27 +static int base_index[MAX_COLORS]; 2.28 + 2.29 +static struct palm_color pal[MAX_COLORS]; 2.30 +static unsigned int ncol, pcol; 2.31 +static int range; 2.32 + 2.33 +void palm_clear(void) 2.34 +{ 2.35 + ncol = 0; 2.36 +} 2.37 + 2.38 +int palm_add_color(unsigned char r, unsigned char g, unsigned char b) 2.39 +{ 2.40 + if(ncol >= MAX_COLORS) { 2.41 + return -1; 2.42 + } 2.43 + colors[ncol].r = r; 2.44 + colors[ncol].g = g; 2.45 + colors[ncol].b = b; 2.46 + ncol++; 2.47 + return 0; 2.48 +} 2.49 + 2.50 +/* TODO: build an octree */ 2.51 +int palm_build(void) 2.52 +{ 2.53 + int i, j; 2.54 + 2.55 + /* gradient range for each color */ 2.56 + range = MAX_COLORS / ncol; 2.57 + 2.58 + if(range == 1) { 2.59 + memcpy(pal, colors, ncol * sizeof *pal); 2.60 + return 0; 2.61 + } 2.62 + pcol = 0; 2.63 + 2.64 + for(i=0; i<ncol; i++) { 2.65 + unsigned int r, g, b, dr, dg, db; 2.66 + 2.67 + base_index[i] = pcol; 2.68 + 2.69 + dr = (colors[i].r << 8) / (range - 1); 2.70 + dg = (colors[i].g << 8) / (range - 1); 2.71 + db = (colors[i].b << 8) / (range - 1); 2.72 + 2.73 + r = g = b = 0; 2.74 + for(j=0; j<range; j++) { 2.75 + pal[pcol].r = (unsigned char)(r >> 8); 2.76 + pal[pcol].g = (unsigned char)(g >> 8); 2.77 + pal[pcol].b = (unsigned char)(b >> 8); 2.78 + pcol++; 2.79 + r += dr; 2.80 + g += dg; 2.81 + b += db; 2.82 + } 2.83 + } 2.84 + return pcol; 2.85 +} 2.86 + 2.87 +struct palm_color *palm_palette(void) 2.88 +{ 2.89 + return pal; 2.90 +} 2.91 + 2.92 +int palm_palette_size(void) 2.93 +{ 2.94 + return pcol; 2.95 +} 2.96 + 2.97 + 2.98 +int palm_color_base(unsigned char r, unsigned char g, unsigned char b) 2.99 +{ 2.100 + int i; 2.101 + 2.102 + for(i=0; i<pcol; i++) { 2.103 + if(colors[i].r == r && colors[i].g == g && colors[i].b == b) { 2.104 + return base_index[i]; 2.105 + } 2.106 + } 2.107 + return -1; 2.108 +} 2.109 + 2.110 +int palm_color_range(void) 2.111 +{ 2.112 + return range; 2.113 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/src/palman.h Mon Nov 21 08:35:58 2011 +0200 3.3 @@ -0,0 +1,38 @@ 3.4 +/* 3.5 +256-color 3D graphics hack for real-mode DOS. 3.6 +Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org> 3.7 + 3.8 +This program is free software: you can redistribute it and/or modify 3.9 +it under the terms of the GNU General Public License as published by 3.10 +the Free Software Foundation, either version 3 of the License, or 3.11 +(at your option) any later version. 3.12 + 3.13 +This program is distributed in the hope that it will be useful, 3.14 +but WITHOUT ANY WARRANTY; without even the implied warranty of 3.15 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3.16 +GNU General Public License for more details. 3.17 + 3.18 +You should have received a copy of the GNU General Public License 3.19 +along with this program. If not, see <http://www.gnu.org/licenses/>. 3.20 +*/ 3.21 + 3.22 +#ifndef PALMAN_H_ 3.23 +#define PALMAN_H_ 3.24 + 3.25 +struct palm_color { 3.26 + unsigned char r, g, b; 3.27 +}; 3.28 + 3.29 +void palm_clear(void); 3.30 +int palm_add_color(unsigned char r, unsigned char g, unsigned char b); 3.31 + 3.32 +int palm_build(void); 3.33 + 3.34 +struct palm_color *palm_palette(void); 3.35 +int palm_palette_size(void); 3.36 + 3.37 +int palm_color_base(unsigned char r, unsigned char g, unsigned char b); 3.38 +int palm_color_range(void); 3.39 + 3.40 + 3.41 +#endif /* PALMAN_H_ */
4.1 --- a/src/test.c Mon Nov 21 06:14:01 2011 +0200 4.2 +++ b/src/test.c Mon Nov 21 08:35:58 2011 +0200 4.3 @@ -24,10 +24,7 @@ 4.4 #include "mingl.h" 4.5 #include "timer.h" 4.6 #include "mouse.h" 4.7 - 4.8 -#define ROFFS 64 4.9 -#define GOFFS 128 4.10 -#define BOFFS 192 4.11 +#include "palman.h" 4.12 4.13 static int init(void); 4.14 static void shutdown(void); 4.15 @@ -42,6 +39,9 @@ 4.16 4.17 static unsigned char *fbuf; 4.18 4.19 +static int white_base, red_base, green_base, blue_base; 4.20 +static int grad_range; 4.21 + 4.22 static int use_vsync = 1; 4.23 static int under_windows = 0; 4.24 static unsigned long num_frm; 4.25 @@ -98,6 +98,7 @@ 4.26 static int init(void) 4.27 { 4.28 int i; 4.29 + struct palm_color *pal; 4.30 4.31 init_timer(under_windows ? 0 : 100); 4.32 4.33 @@ -109,12 +110,21 @@ 4.34 signal(SIGILL, sighandler); 4.35 signal(SIGABRT, sighandler); 4.36 4.37 - for(i=0; i<64; i++) { 4.38 - int x = i << 2; 4.39 - set_palette(i, x, x, x); 4.40 - set_palette(i + ROFFS, x, 0, 0); 4.41 - set_palette(i + GOFFS, 0, x, 0); 4.42 - set_palette(i + BOFFS, 0, 0, x); 4.43 + palm_add_color(255, 255, 255); 4.44 + palm_add_color(255, 0, 0); 4.45 + palm_add_color(0, 255, 0); 4.46 + palm_add_color(0, 0, 255); 4.47 + palm_build(); 4.48 + 4.49 + white_base = palm_color_base(255, 255, 255); 4.50 + red_base = palm_color_base(255, 0, 0); 4.51 + green_base = palm_color_base(0, 255, 0); 4.52 + blue_base = palm_color_base(0, 0, 255); 4.53 + grad_range = palm_color_range(); 4.54 + 4.55 + pal = palm_palette(); 4.56 + for(i=0; i<palm_palette_size(); i++) { 4.57 + set_palette(i, pal[i].r, pal[i].g, pal[i].b); 4.58 } 4.59 4.60 if(mgl_init(320, 200) == -1) { 4.61 @@ -125,7 +135,7 @@ 4.62 4.63 mgl_enable(MGL_CULL_FACE); 4.64 mgl_enable(MGL_SMOOTH); 4.65 - mgl_color_range(63); /* gradient range */ 4.66 + mgl_color_range(grad_range - 1); /* gradient range */ 4.67 4.68 mgl_enable(MGL_LIGHTING); 4.69 mgl_light_intensity(0, 1.0); 4.70 @@ -162,30 +172,20 @@ 4.71 4.72 switch(prim) { 4.73 case TORUS: 4.74 - mgl_index(GOFFS); 4.75 + mgl_index(green_base); 4.76 mgl_torus(1.0, 0.25, 16, 8); 4.77 break; 4.78 case SPHERE: 4.79 - mgl_index(BOFFS); 4.80 + mgl_index(blue_base); 4.81 mgl_sphere(1.0, 16, 8); 4.82 break; 4.83 case CUBE: 4.84 - mgl_index(ROFFS); 4.85 + mgl_index(red_base); 4.86 mgl_cube(1.0); 4.87 } 4.88 4.89 - /*mgl_begin(MGL_QUADS); 4.90 - mgl_index(ROFFS); 4.91 - mgl_color1f(1.0); 4.92 - mgl_vertex2f(-1, -1); 4.93 - mgl_vertex2f(1, -1); 4.94 - mgl_color1f(0.1); 4.95 - mgl_vertex2f(1, 1); 4.96 - mgl_vertex2f(-1, 1); 4.97 - mgl_end();*/ 4.98 - 4.99 if(!auto_rotate) { 4.100 - draw_cursor(fbuf, 320, 200, mx, my, 63); 4.101 + draw_cursor(fbuf, 320, 200, mx, my, white_base + grad_range - 1); 4.102 } 4.103 4.104 copy_frame(fbuf);