GRASS Programmer's Manual  6.4.2(2012)
gsd_cplane.c
Go to the documentation of this file.
00001 
00019 #include <grass/gstypes.h>
00020 #include "rowcol.h"
00021 
00022 static void init_cplane(void);
00023 
00024 static float Cp_pt[4], Cp_norm[MAX_CPLANES][4];
00025 static float Cp_trans[MAX_CPLANES][3], Cp_rot[MAX_CPLANES][3];
00026 static int Cp_ison[MAX_CPLANES];        /* also need isdef? */
00027 
00028 static void init_cplane(void)
00029 {
00030     int i;
00031 
00032     gs_get_datacenter(Cp_pt);
00033     gs_get_data_avg_zmax(&(Cp_pt[Z]));
00034 
00035     for (i = 0; i < MAX_CPLANES; i++) {
00036         Cp_ison[i] = 0;
00037         Cp_norm[i][X] = 1.0;
00038         Cp_norm[i][Y] = Cp_norm[i][Z] = 0.0;
00039         Cp_norm[i][W] = 1.;
00040         Cp_rot[i][X] = Cp_trans[i][X] = 0.0;
00041         Cp_rot[i][Y] = Cp_trans[i][Y] = 0.0;
00042         Cp_rot[i][Z] = Cp_trans[i][Z] = 0.0;
00043     }
00044 
00045     return;
00046 }
00047 
00055 void gsd_def_cplane(int num, float *pt, float *norm)
00056 {
00057     float sx, sy, sz, ppt[3];
00058     double params[4];
00059     float zmin, zmax;
00060 
00061     GS_get_scale(&sx, &sy, &sz, 1);
00062 
00063     /* Something's still wrong with the zexag - DONT USE TILT */
00064     GS_get_zrange(&zmin, &zmax, 0);
00065 
00066     ppt[0] = (pt[0] + Cp_pt[0]) * sx;
00067     ppt[1] = (pt[1] + Cp_pt[1]) * sy;
00068     ppt[2] = (pt[2] + Cp_pt[2] - zmin) * sz;
00069 
00070     params[0] = norm[0] * sx;
00071     params[1] = norm[1] * sy;
00072     params[2] = norm[2] * sz;
00073     GS_dv3norm(params);
00074     params[3] = -ppt[0] * params[0] - ppt[1] * params[1] - ppt[2] * params[2];
00075 
00076     gsd_def_clipplane(num, params);
00077 
00078     return;
00079 }
00080 
00086 void gsd_update_cplanes(void)
00087 {
00088     int i;
00089 
00090     for (i = 0; i < MAX_CPLANES; i++) {
00091         if (Cp_ison[i]) {
00092             gsd_def_cplane(i, Cp_trans[i], Cp_norm[i]);
00093         }
00094     }
00095 
00096     return;
00097 }
00098 
00104 void gsd_cplane_on(int num)
00105 {
00106     static int first = 1;
00107 
00108     if (first) {
00109         first = 0;
00110         init_cplane();
00111         gsd_def_cplane(num, Cp_trans[num], Cp_norm[num]);
00112     }
00113 
00114     gsd_set_clipplane(num, 1);
00115 
00116     Cp_ison[num] = 1;
00117 
00118     return;
00119 }
00120 
00126 void gsd_cplane_off(int num)
00127 {
00128 
00129     gsd_set_clipplane(num, 0);
00130     Cp_ison[num] = 0;
00131 
00132     return;
00133 }
00134 
00142 void gsd_get_cplanes_state(int *onstate)
00143 {
00144     int i;
00145 
00146     for (i = 0; i < MAX_CPLANES; i++) {
00147         onstate[i] = Cp_ison[i];
00148     }
00149 
00150     return;
00151 }
00152 
00162 int gsd_get_cplanes(Point4 * planes)
00163 {
00164     int i, ons;
00165     Point3 thru;
00166 
00167     for (ons = i = 0; i < MAX_CPLANES; i++) {
00168         if (Cp_ison[i]) {
00169             thru[X] = Cp_pt[X] + Cp_trans[ons][X];
00170             thru[Y] = Cp_pt[Y] + Cp_trans[ons][Y];
00171             thru[Z] = Cp_pt[Z] + Cp_trans[ons][Z];
00172             planes[ons][X] = -Cp_norm[ons][X];
00173             planes[ons][Y] = -Cp_norm[ons][Y];
00174             planes[ons][Z] = -Cp_norm[ons][Z];
00175             planes[ons][W] = -(DOT3(planes[ons], thru));
00176             ons++;
00177         }
00178     }
00179 
00180     return (ons);
00181 }
00182 
00188 void gsd_update_cpnorm(int num)
00189 {
00190     float v[1][4];
00191 
00192     v[0][X] = v[0][W] = 1.0;
00193     v[0][Y] = v[0][Z] = 0.0;
00194 
00195     P_pushmatrix();
00196     P_rot(Cp_rot[num][Z], 'z');
00197     P_rot(Cp_rot[num][Y], 'y');
00198     P_rot(Cp_rot[num][X], 'x');
00199     P_transform(1, v, &Cp_norm[num]);
00200     P_popmatrix();
00201 
00202     return;
00203 }
00204 
00211 void gsd_cplane_setrot(int num, float rx, float ry, float rz)
00212 {
00213     Cp_rot[num][X] = rx;
00214     Cp_rot[num][Y] = ry;
00215     Cp_rot[num][Z] = rz;
00216 
00217     gsd_update_cpnorm(num);
00218     gsd_def_cplane(num, Cp_trans[num], Cp_norm[num]);
00219 
00220     return;
00221 }
00222 
00229 void gsd_cplane_settrans(int num, float tx, float ty, float tz)
00230 {
00231     Cp_trans[num][X] = tx;
00232     Cp_trans[num][Y] = ty;
00233     Cp_trans[num][Z] = tz;
00234 
00235     gsd_def_cplane(num, Cp_trans[num], Cp_norm[num]);
00236 
00237     return;
00238 }
00239 
00247 void gsd_draw_cplane_fence(geosurf * surf1, geosurf * surf2, int cpnum)
00248 {
00249     int was_on;
00250     float len, dir[3], bgn[2], end[2], px, py, fencenorm[3];
00251 
00252     /* temporarily turn this plane off */
00253     if ((was_on = Cp_ison[cpnum])) {
00254         gsd_set_clipplane(cpnum, 0);
00255     }
00256 
00257     /* line on surface (asuming NO TILT) is (-A,B)->(A,-B), 
00258        extended thru Cp_pt */
00259     dir[X] = -Cp_norm[cpnum][Y];
00260     dir[Y] = Cp_norm[cpnum][X];
00261     dir[Z] = 0.0;
00262     GS_v3norm(dir);
00263     px = Cp_trans[cpnum][X] + Cp_pt[X];
00264     py = Cp_trans[cpnum][Y] + Cp_pt[Y];
00265 
00266     /* TODO: make line from point & direction, clip to region */
00267     /* for now, to test: */
00268     bgn[X] = px;
00269     bgn[Y] = py;
00270     end[X] = px;
00271     end[Y] = 3 * VROW2Y(surf1, 0);
00272     len = GS_P2distance(bgn, end) - 1;
00273     bgn[X] = px + len * dir[X];
00274     bgn[Y] = py + len * dir[Y];
00275     end[X] = px - len * dir[X];
00276     end[Y] = py - len * dir[Y];
00277 
00278     fencenorm[X] = -Cp_norm[cpnum][X];
00279     fencenorm[Y] = -Cp_norm[cpnum][Y];
00280     fencenorm[Z] = -Cp_norm[cpnum][Z];
00281     gsd_wall(bgn, end, fencenorm);
00282 
00283     /* turn this plane back on */
00284     if (was_on) {
00285         gsd_set_clipplane(cpnum, 1);
00286     }
00287 
00288     return;
00289 }
00290 
00296 void gsd_draw_cplane(int num)
00297 {
00298     float size, cpv[3];
00299     int i;
00300     float scalez;
00301     unsigned long colr;
00302 
00303     /* turn off all clipping planes */
00304     for (i = 0; i < MAX_CPLANES; i++) {
00305         if (Cp_ison[i]) {
00306             gsd_set_clipplane(i, 0);
00307         }
00308     }
00309 
00310     GS_get_longdim(&size);
00311     size /= 2.;
00312     cpv[X] = 0.0;
00313 
00314     gsd_blend(1);
00315 
00316     gsd_zwritemask(0x0);
00317 
00318     gsd_pushmatrix();
00319 
00320     gsd_do_scale(1);
00321 
00322     gsd_translate(Cp_pt[X] + Cp_trans[num][X],
00323                   Cp_pt[Y] + Cp_trans[num][Y], Cp_pt[Z] + Cp_trans[num][Z]);
00324 
00325     gsd_rot(Cp_rot[num][Z], 'z');
00326     gsd_rot(Cp_rot[num][Y], 'y');
00327     gsd_rot(Cp_rot[num][X], 'x');
00328 
00329     if ((scalez = GS_global_exag())) {
00330         gsd_scale(1.0, 1.0, 1. / scalez);
00331     }
00332 
00333     colr = (GS_default_draw_color() | 0xff000000) & 0x33ffffff;
00334     gsd_color_func(colr);
00335     gsd_bgnpolygon();
00336     cpv[Y] = size;
00337     cpv[Z] = size;
00338     gsd_vert_func(cpv);
00339     cpv[Y] = -size;
00340     gsd_vert_func(cpv);
00341     cpv[Z] = -size;
00342     gsd_vert_func(cpv);
00343     cpv[Y] = size;
00344     gsd_vert_func(cpv);
00345     gsd_endpolygon();
00346 
00347     gsd_popmatrix();
00348     gsd_blend(0);
00349     gsd_zwritemask(0xffffffff);
00350 
00351     /* turn on clipping planes */
00352     for (i = 0; i < MAX_CPLANES; i++) {
00353         if (Cp_ison[i]) {
00354             gsd_set_clipplane(i, 1);
00355         }
00356     }
00357 
00358     return;
00359 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines