GRASS Programmer's Manual
6.4.2(2012)
|
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 }