GRASS Programmer's Manual
6.4.2(2012)
|
00001 00016 #include <grass/nviz.h> 00017 00018 static int sort_surfs_max(int *, int *, int *, int); 00019 00027 int Nviz_draw_all_surf(nv_data * dc) 00028 { 00029 int i, nsurfs; 00030 int sortSurfs[MAX_SURFS], sorti[MAX_SURFS]; 00031 int *surf_list; 00032 float x, y, z; 00033 int num, w; 00034 00035 /* Get position for Light 1 */ 00036 num = 1; 00037 x = dc->light[num].x; 00038 y = dc->light[num].y; 00039 z = dc->light[num].z; 00040 w = dc->light[num].z; 00041 00042 surf_list = GS_get_surf_list(&nsurfs); 00043 00044 sort_surfs_max(surf_list, sortSurfs, sorti, nsurfs); 00045 00046 G_free(surf_list); 00047 00048 /* re-initialize lights */ 00049 GS_setlight_position(num, x, y, z, w); 00050 num = 2; 00051 GS_setlight_position(num, 0., 0., 1., 0); 00052 00053 for (i = 0; i < nsurfs; i++) { 00054 GS_draw_surf(sortSurfs[i]); 00055 } 00056 00057 /* GS_draw_cplane_fence params will change - surfs aren't used anymore */ 00058 for (i = 0; i < MAX_CPLANES; i++) { 00059 if (dc->cp_on[i]) 00060 GS_draw_cplane_fence(sortSurfs[0], sortSurfs[1], i); 00061 } 00062 00063 return 1; 00064 } 00065 00079 int sort_surfs_max(int *surf, int *id_sort, int *indices, int num) 00080 { 00081 int i, j; 00082 float maxvals[MAX_SURFS]; 00083 float tmp, max = 0., tmin, tmax, tmid; 00084 00085 for (i = 0; i < num; i++) { 00086 GS_get_zextents(surf[i], &tmin, &tmax, &tmid); 00087 if (i == 0) 00088 max = tmax; 00089 else 00090 max = max < tmax ? tmax : max; 00091 maxvals[i] = tmax; 00092 } 00093 00094 for (i = 0; i < num; i++) { 00095 tmp = maxvals[0]; 00096 indices[i] = 0; 00097 for (j = 0; j < num; j++) { 00098 if (maxvals[j] < tmp) { 00099 tmp = maxvals[j]; 00100 indices[i] = j; 00101 } 00102 } 00103 00104 maxvals[indices[i]] = max + 1; 00105 id_sort[i] = surf[indices[i]]; 00106 } 00107 00108 return 1; 00109 } 00110 00116 int Nviz_draw_all_vect() 00117 { 00118 // GS_set_cancel(0); 00119 00120 /* in case transparency is set */ 00121 GS_set_draw(GSD_BOTH); 00122 00123 GS_ready_draw(); 00124 00125 GV_alldraw_vect(); 00126 00127 GS_done_draw(); 00128 00129 GS_set_draw(GSD_BACK); 00130 00131 // GS_set_cancel(0); 00132 00133 return 1; 00134 } 00135 00141 int Nviz_draw_all_site() 00142 { 00143 int i; 00144 int *site_list, nsites; 00145 00146 site_list = GP_get_site_list(&nsites); 00147 00148 /* in case transparency is set */ 00149 GS_set_draw(GSD_BOTH); 00150 00151 GS_ready_draw(); 00152 00153 for (i = 0; i < nsites; i++) { 00154 GP_draw_site(site_list[i]); 00155 } 00156 G_free(site_list); 00157 00158 GS_done_draw(); 00159 00160 GS_set_draw(GSD_BACK); 00161 00162 return 1; 00163 } 00164 00170 int Nviz_draw_all_vol() 00171 { 00172 int *vol_list, nvols, i; 00173 00174 vol_list = GVL_get_vol_list(&nvols); 00175 00176 /* in case transparency is set */ 00177 GS_set_draw(GSD_BOTH); 00178 00179 GS_ready_draw(); 00180 00181 for (i = 0; i < nvols; i++) { 00182 GVL_draw_vol(vol_list[i]); 00183 } 00184 00185 G_free(vol_list); 00186 00187 GS_done_draw(); 00188 00189 GS_set_draw(GSD_BACK); 00190 00191 return 1; 00192 } 00193 00199 int Nviz_draw_all(nv_data * data) 00200 { 00201 int i; 00202 int draw_surf, draw_vect, draw_site, draw_vol; 00203 00204 draw_surf = 1; 00205 draw_vect = 1; 00206 draw_site = 1; 00207 draw_vol = 1; 00208 /* 00209 draw_north_arrow = 0; 00210 arrow_x = 0; 00211 draw_label = 0; 00212 draw_legend = 0; 00213 draw_fringe = 0; 00214 draw_scalebar = 0; 00215 draw_bar_x = 0; 00216 */ 00217 00218 GS_set_draw(GSD_BACK); /* needs to be BACK to avoid flickering */ 00219 00220 GS_ready_draw(); 00221 00222 GS_clear(data->bgcolor); 00223 00224 if (draw_surf) 00225 Nviz_draw_all_surf(data); 00226 00227 if (draw_vect) 00228 Nviz_draw_all_vect(data); 00229 00230 if (draw_site) 00231 Nviz_draw_all_site(data); 00232 00233 if (draw_vol) 00234 Nviz_draw_all_vol(data); 00235 00236 for(i = 0; i < data->num_fringes; i++) { 00237 struct fringe_data * f = data->fringe[i]; 00238 GS_draw_fringe(f->id, f->color, f->elev, f->where); 00239 } 00240 00241 GS_done_draw(); 00242 GS_set_draw(GSD_BACK); 00243 00244 return 1; 00245 } 00246 00261 int Nviz_draw_quick(nv_data * data, int draw_mode) 00262 { 00263 GS_set_draw(GSD_BACK); 00264 00265 GS_ready_draw(); 00266 00267 GS_clear(data->bgcolor); 00268 00269 /* draw surfaces */ 00270 if (draw_mode & DRAW_QUICK_SURFACE) 00271 GS_alldraw_wire(); 00272 00273 /* draw vector lines */ 00274 if (draw_mode & DRAW_QUICK_VLINES) 00275 GV_alldraw_vect(); 00276 00277 /* draw vector points */ 00278 if (draw_mode & DRAW_QUICK_VPOINTS) 00279 GP_alldraw_site(); 00280 00281 /* draw volumes */ 00282 if (draw_mode & DRAW_QUICK_VOLUME) { 00283 GVL_alldraw_wire(); 00284 } 00285 00286 GS_done_draw(); 00287 00288 return 1; 00289 }