95 int cols, rows, depths;
98 float xres, yres, zres;
101 int j, p, num, c_ndx, crnt_ev;
104 int n_i = gvl->n_isosurfs;
106 int *check_color, *check_transp, *check_material, *check_emis, *check_shin;
107 float *kem, *ksh, pkem, pksh;
108 unsigned int *ktrans, *curcolor;
111 int *pos, *nz, *e_dl, tmp_pos, edge_pos[13];
113 GLdouble modelMatrix[16], projMatrix[16];
117 geovol_isosurf *isosurf;
121 check_color = G_malloc(n_i *
sizeof(
int));
122 check_transp = G_malloc(n_i *
sizeof(
int));
123 check_material = G_malloc(n_i *
sizeof(
int));
124 check_emis = G_malloc(n_i *
sizeof(
int));
125 check_shin = G_malloc(n_i *
sizeof(
int));
127 kem = G_malloc(n_i *
sizeof(
float));
128 ksh = G_malloc(n_i *
sizeof(
float));
130 ktrans = G_malloc(n_i *
sizeof(
unsigned int));
131 curcolor = G_malloc(n_i *
sizeof(
unsigned int));
133 pos = G_malloc(n_i *
sizeof(
int));
134 nz = G_malloc(n_i *
sizeof(
int));
135 e_dl = G_malloc(n_i *
sizeof(
int));
138 for (i = 0; i < gvl->n_isosurfs; i++) {
139 G_debug(5,
" start : gvl: %s isosurf : %d\n",
150 cols = gvl->cols / gvl->isosurf_x_mod;
151 rows = gvl->rows / gvl->isosurf_y_mod;
152 depths = gvl->depths / gvl->isosurf_z_mod;
169 window[0] += (int)(yres * 2);
170 window[1] -= (int)(yres * 2);
171 window[2] -= (int)(xres * 2);
172 window[3] += (int)(xres * 2);
183 for (i = 0; i < gvl->n_isosurfs; i++) {
184 isosurf = gvl->isosurf[i];
191 ktrans[i] = (255 << 24);
192 if (CONST_ATT == isosurf->att[ATT_TRANSP].att_src &&
193 isosurf->att[ATT_TRANSP].constant != 0.0) {
194 ktrans[i] = (255 - (int)isosurf->att[ATT_TRANSP].constant) << 24;
196 else if (MAP_ATT == isosurf->att[ATT_TRANSP].att_src) {
204 if (CONST_ATT == isosurf->att[ATT_EMIT].att_src) {
205 kem[i] = isosurf->att[ATT_EMIT].constant / 255.;
207 else if (MAP_ATT == isosurf->att[ATT_EMIT].att_src) {
215 if (CONST_ATT == isosurf->att[ATT_SHINE].att_src) {
216 ksh[i] = isosurf->att[ATT_SHINE].constant / 255.;
218 else if (MAP_ATT == isosurf->att[ATT_SHINE].att_src) {
226 if (CONST_ATT == isosurf->att[ATT_COLOR].att_src) {
227 curcolor[i] = (int)isosurf->att[ATT_COLOR].constant;
229 else if (MAP_ATT == isosurf->att[ATT_COLOR].att_src) {
236 (check_shin[i] || check_emis[i] || (kem[i] && check_color[i]));
245 for (z = 0; z < depths - 1; z++) {
249 for (i = 0; i < gvl->n_isosurfs; i++) {
250 G_debug(5,
" break : isosurf : %d datalength : %d B\n", i,
262 for (y = 0; y < rows - 1; y++) {
263 yc = ((rows - 1) * yres) - (y * yres);
265 for (
x = 0;
x < cols - 1;
x++) {
268 for (i = 0; i < gvl->n_isosurfs; i++) {
282 c_ndx = (c_ndx - 1) * 256 +
READ();
291 for (j = 0; j <
cell_table[c_ndx].nedges; j++) {
296 pos[i] + j * e_dl[i];
300 if (check_transp[i] || (ktrans[i] >> 24) < 255) {
313 for (p = 0, num = 0; num <
cell_table[c_ndx].npolys;
317 for (j = 0; j < 3; j++) {
320 pos[i] = edge_pos[crnt_ev];
324 pt[
X] = xc + (
READ() / 255. * xres);
325 pt[
Y] = yc + (-(
READ() / 255. * yres));
326 pt[Z] = zc + (
READ() / 255. * zres);
329 pt[edge_vert_pos[crnt_ev][0]] =
READ() / 255.;
330 pt[edge_vert_pos[crnt_ev][1]] =
331 edge_vert_pos[crnt_ev][2];
332 pt[edge_vert_pos[crnt_ev][3]] =
333 edge_vert_pos[crnt_ev][4];
335 pt[
X] = xc + (pt[
X] * xres);
336 pt[
Y] = yc + (-(pt[
Y] * yres));
337 pt[Z] = zc + (pt[Z] * zres);
340 n[
X] = (
READ() / 127. - 1.) / xres;
341 n[
Y] = (-(
READ() / 127. - 1.)) / yres;
342 n[Z] = (
READ() / 127. - 1.) / zres;
344 if (gvl->isosurf[i]->inout_mode) {
350 if (check_color[i]) {
354 curcolor[i] = (
r & 0xff) | ((
g & 0xff) << 8) |
359 ktrans[i] =
READ() << 24;
363 ksh[i] = ((float)
READ()) / 255.;
366 kem[i] = ((float)
READ()) / 255.;
368 if (pksh != ksh[i] || pkem != kem[i] ||
369 (kem[i] && check_color[i])) {
384 pos[i] = tmp_pos +
cell_table[c_ndx].nedges * e_dl[i] +
391 for (i = 0; i < gvl->n_isosurfs; i++) {
392 G_debug(5,
" end : isosurf : %d datalength : %d B\n", i, pos[i]);
491 int color, offset, transp;
493 float x, nextx, y, nexty, z, stepx, stepy, stepz;
494 int cols, rows, c,
r;
495 float f_cols, f_rows, distxy, distz, modx, mody, modz, modxy;
497 double resx, resy, resz;
500 slice = gvl->slice[ndx];
503 distxy =
DISTANCE_2(slice->x2, slice->y2, slice->x1, slice->y1);
504 distz = fabsf(slice->z2 - slice->z1);
507 if (distxy == 0. || distz == 0.) {
512 if (slice->dir ==
X) {
513 modx = gvl->slice_y_mod;
514 mody = gvl->slice_z_mod;
515 modz = gvl->slice_x_mod;
523 else if (slice->dir ==
Y) {
524 modx = gvl->slice_x_mod;
525 mody = gvl->slice_z_mod;
526 modz = gvl->slice_y_mod;
535 modx = gvl->slice_x_mod;
536 mody = gvl->slice_y_mod;
537 modz = gvl->slice_z_mod;
547 modxy =
DISTANCE_2((slice->x2 - slice->x1) / distxy * modx,
548 (slice->y2 - slice->y1) / distxy * mody, 0., 0.);
551 f_cols = distxy / modxy;
552 cols = f_cols > (int)f_cols ? (
int)f_cols + 1 : (int)f_cols;
554 f_rows = distz / modz;
555 rows = f_rows > (int)f_rows ? (
int)f_rows + 1 : (int)f_rows;
558 stepx = (slice->x2 - slice->x1) / f_cols;
559 stepy = (slice->y2 - slice->y1) / f_cols;
560 stepz = (slice->z2 - slice->z1) / f_rows;
568 nextx =
x + stepx * f_cols;
569 nexty = y + stepy * f_cols;
577 if (slice->transp > 0) {
578 transp = (255 - slice->transp) << 24;
585 for (c = 0; c < cols; c++) {
594 for (
r = 0;
r < rows + 1;
r++) {
596 offset = (c + 1) * (rows + 1) * 3 +
r * 3;
599 color = (slice->data[offset] & 0xff) |
600 ((slice->data[offset + 1] & 0xff) << 8) |
601 ((slice->data[offset + 2] & 0xff) << 16);
604 pt[ptX] = nextx * resx;
605 pt[ptY] = nexty * resy;
608 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
612 offset = c * (rows + 1) * 3 +
r * 3;
615 color = (slice->data[offset] & 0xff) |
616 ((slice->data[offset + 1] & 0xff) << 8) |
617 ((slice->data[offset + 2] & 0xff) << 16);
624 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
627 if (
r + 1 > f_rows) {
628 z += stepz * (f_rows - (float)
r);
638 if (c + 2 > f_cols) {
640 nextx += stepx * (f_cols - (float)(c + 1));
642 nexty += stepy * (f_cols - (float)(c + 1));
670 double resx, resy, resz;
674 G_debug(5,
"gvld_wire_slices");
691 for (i = 0; i < gvl->n_slices; i++) {
692 slice = gvl->slice[i];
695 if (slice->dir ==
X) {
703 else if (slice->dir ==
Y) {
723 pt[ptX] = slice->x1 * resx;
724 pt[ptY] = slice->y1 * resy;
725 pt[ptZ] = slice->z1 * resz;
727 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
730 pt[ptX] = slice->x1 * resx;
731 pt[ptY] = slice->y1 * resy;
732 pt[ptZ] = slice->z2 * resz;
734 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
737 pt[ptX] = slice->x2 * resx;
738 pt[ptY] = slice->y2 * resy;
739 pt[ptZ] = slice->z2 * resz;
741 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
744 pt[ptX] = slice->x2 * resx;
745 pt[ptY] = slice->y2 * resy;
746 pt[ptZ] = slice->z1 * resz;
748 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
751 pt[ptX] = slice->x1 * resx;
752 pt[ptY] = slice->y1 * resy;
753 pt[ptZ] = slice->z1 * resz;
755 pt[
Y] = (gvl->rows - 1) * gvl->yres - pt[
Y];
778 G_debug(5,
"gvld_wind3_box(): id=%d", gvl->gvol_id);
802 pt[
X] = (gvl->cols - 1) * gvl->xres;
806 pt[
X] = (gvl->cols - 1) * gvl->xres;
807 pt[
Y] = (gvl->rows - 1) * gvl->yres;
811 pt[
Y] = (gvl->rows - 1) * gvl->yres;
824 pt[Z] = (gvl->depths - 1) * gvl->zres;
826 pt[
X] = (gvl->cols - 1) * gvl->xres;
828 pt[Z] = (gvl->depths - 1) * gvl->zres;
830 pt[
X] = (gvl->cols - 1) * gvl->xres;
831 pt[
Y] = (gvl->rows - 1) * gvl->yres;
832 pt[Z] = (gvl->depths - 1) * gvl->zres;
835 pt[
Y] = (gvl->rows - 1) * gvl->yres;
836 pt[Z] = (gvl->depths - 1) * gvl->zres;
840 pt[Z] = (gvl->depths - 1) * gvl->zres;
852 pt[Z] = (gvl->depths - 1) * gvl->zres;
857 pt[
X] = (gvl->cols - 1) * gvl->xres;
861 pt[
X] = (gvl->cols - 1) * gvl->xres;
863 pt[Z] = (gvl->depths - 1) * gvl->zres;
869 pt[
Y] = (gvl->rows - 1) * gvl->yres;
873 pt[
Y] = (gvl->rows - 1) * gvl->yres;
874 pt[Z] = (gvl->depths - 1) * gvl->zres;
879 pt[
X] = (gvl->cols - 1) * gvl->xres;
880 pt[
Y] = (gvl->rows - 1) * gvl->yres;
883 pt[
X] = (gvl->cols - 1) * gvl->xres;
884 pt[
Y] = (gvl->rows - 1) * gvl->yres;
885 pt[Z] = (gvl->depths - 1) * gvl->zres;