GRASS Programmer's Manual  6.4.2(2012)
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
nviz/draw.c
Go to the documentation of this file.
1 
16 #include <grass/nviz.h>
17 
18 static int sort_surfs_max(int *, int *, int *, int);
19 
27 int Nviz_draw_all_surf(nv_data * dc)
28 {
29  int i, nsurfs;
30  int sortSurfs[MAX_SURFS], sorti[MAX_SURFS];
31  int *surf_list;
32  float x, y, z;
33  int num, w;
34 
35  /* Get position for Light 1 */
36  num = 1;
37  x = dc->light[num].x;
38  y = dc->light[num].y;
39  z = dc->light[num].z;
40  w = dc->light[num].z;
41 
42  surf_list = GS_get_surf_list(&nsurfs);
43 
44  sort_surfs_max(surf_list, sortSurfs, sorti, nsurfs);
45 
46  G_free(surf_list);
47 
48  /* re-initialize lights */
49  GS_setlight_position(num, x, y, z, w);
50  num = 2;
51  GS_setlight_position(num, 0., 0., 1., 0);
52 
53  for (i = 0; i < nsurfs; i++) {
54  GS_draw_surf(sortSurfs[i]);
55  }
56 
57  /* GS_draw_cplane_fence params will change - surfs aren't used anymore */
58  for (i = 0; i < MAX_CPLANES; i++) {
59  if (dc->cp_on[i])
60  GS_draw_cplane_fence(sortSurfs[0], sortSurfs[1], i);
61  }
62 
63  return 1;
64 }
65 
79 int sort_surfs_max(int *surf, int *id_sort, int *indices, int num)
80 {
81  int i, j;
82  float maxvals[MAX_SURFS];
83  float tmp, max = 0., tmin, tmax, tmid;
84 
85  for (i = 0; i < num; i++) {
86  GS_get_zextents(surf[i], &tmin, &tmax, &tmid);
87  if (i == 0)
88  max = tmax;
89  else
90  max = max < tmax ? tmax : max;
91  maxvals[i] = tmax;
92  }
93 
94  for (i = 0; i < num; i++) {
95  tmp = maxvals[0];
96  indices[i] = 0;
97  for (j = 0; j < num; j++) {
98  if (maxvals[j] < tmp) {
99  tmp = maxvals[j];
100  indices[i] = j;
101  }
102  }
103 
104  maxvals[indices[i]] = max + 1;
105  id_sort[i] = surf[indices[i]];
106  }
107 
108  return 1;
109 }
110 
117 {
118  // GS_set_cancel(0);
119 
120  /* in case transparency is set */
121  GS_set_draw(GSD_BOTH);
122 
123  GS_ready_draw();
124 
125  GV_alldraw_vect();
126 
127  GS_done_draw();
128 
129  GS_set_draw(GSD_BACK);
130 
131  // GS_set_cancel(0);
132 
133  return 1;
134 }
135 
142 {
143  int i;
144  int *site_list, nsites;
145 
146  site_list = GP_get_site_list(&nsites);
147 
148  /* in case transparency is set */
149  GS_set_draw(GSD_BOTH);
150 
151  GS_ready_draw();
152 
153  for (i = 0; i < nsites; i++) {
154  GP_draw_site(site_list[i]);
155  }
156  G_free(site_list);
157 
158  GS_done_draw();
159 
160  GS_set_draw(GSD_BACK);
161 
162  return 1;
163 }
164 
171 {
172  int *vol_list, nvols, i;
173 
174  vol_list = GVL_get_vol_list(&nvols);
175 
176  /* in case transparency is set */
177  GS_set_draw(GSD_BOTH);
178 
179  GS_ready_draw();
180 
181  for (i = 0; i < nvols; i++) {
182  GVL_draw_vol(vol_list[i]);
183  }
184 
185  G_free(vol_list);
186 
187  GS_done_draw();
188 
189  GS_set_draw(GSD_BACK);
190 
191  return 1;
192 }
193 
199 int Nviz_draw_all(nv_data * data)
200 {
201  int i;
202  int draw_surf, draw_vect, draw_site, draw_vol;
203 
204  draw_surf = 1;
205  draw_vect = 1;
206  draw_site = 1;
207  draw_vol = 1;
208  /*
209  draw_north_arrow = 0;
210  arrow_x = 0;
211  draw_label = 0;
212  draw_legend = 0;
213  draw_fringe = 0;
214  draw_scalebar = 0;
215  draw_bar_x = 0;
216  */
217 
218  GS_set_draw(GSD_BACK); /* needs to be BACK to avoid flickering */
219 
220  GS_ready_draw();
221 
222  GS_clear(data->bgcolor);
223 
224  if (draw_surf)
225  Nviz_draw_all_surf(data);
226 
227  if (draw_vect)
228  Nviz_draw_all_vect(data);
229 
230  if (draw_site)
231  Nviz_draw_all_site(data);
232 
233  if (draw_vol)
234  Nviz_draw_all_vol(data);
235 
236  for(i = 0; i < data->num_fringes; i++) {
237  struct fringe_data * f = data->fringe[i];
238  GS_draw_fringe(f->id, f->color, f->elev, f->where);
239  }
240 
241  GS_done_draw();
242  GS_set_draw(GSD_BACK);
243 
244  return 1;
245 }
246 
261 int Nviz_draw_quick(nv_data * data, int draw_mode)
262 {
263  GS_set_draw(GSD_BACK);
264 
265  GS_ready_draw();
266 
267  GS_clear(data->bgcolor);
268 
269  /* draw surfaces */
270  if (draw_mode & DRAW_QUICK_SURFACE)
271  GS_alldraw_wire();
272 
273  /* draw vector lines */
274  if (draw_mode & DRAW_QUICK_VLINES)
275  GV_alldraw_vect();
276 
277  /* draw vector points */
278  if (draw_mode & DRAW_QUICK_VPOINTS)
279  GP_alldraw_site();
280 
281  /* draw volumes */
282  if (draw_mode & DRAW_QUICK_VOLUME) {
284  }
285 
286  GS_done_draw();
287 
288  return 1;
289 }