GRASS 8 Programmer's Manual 8.6.0dev(2026)-985dd2421b
Loading...
Searching...
No Matches
change_view.c
Go to the documentation of this file.
1/*!
2 \file lib/nviz/change_view.c
3
4 \brief Nviz library -- Change view settings
5
6 Based on visualization/nviz/src/change_view.c
7
8 SPDX-FileCopyrightText: 2008, 2010 GRASS Development Team
9 SPDX-License-Identifier: GPL-2.0-or-later
10
11 \author Updated/modified by Martin Landa <landa.martin gmail.com> (Google SoC
12 2008/2010)
13 */
14
15#include <math.h>
16
17#include <grass/glocale.h>
18#include <grass/nviz.h>
19
20/*!
21 \brief GL canvas resized
22
23 \param width window width
24 \param height window height
25
26 \return 1 on success
27 \return 0 on failure (window resized by default to 20x20 px)
28 */
29int Nviz_resize_window(int width, int height)
30{
31 int ret;
32
33 ret = 1;
34
35 if (width < 1 || height < 1) {
36 width = 20;
37 height = 20;
38 ret = 0;
39 }
40
41 G_debug(1, "Nviz_resize_window(): width = %d height = %d", width, height);
42 GS_set_viewport(0, width, 0, height);
43
44 /* GS_clear(0x0000FF); causes red flash - debug only */
49
50 return ret;
51}
52
53/*!
54 \brief Update ranges
55
56 Call whenever a new surface is added, deleted, or exag changes
57
58 \return 1
59 */
61{
62 float zmin, zmax, exag;
63
64 GS_get_longdim(&(dc->xyrange));
65
66 dc->zrange = 0.;
67
68 /* Zrange is based on a minimum of Longdim */
69 if (GS_global_exag()) {
70 exag = GS_global_exag();
71 dc->zrange = dc->xyrange / exag;
72 }
73 else {
74 exag = 1.0;
75 }
76
77 GS_get_zrange_nz(&zmin, &zmax); /* actual */
78
79 zmax = zmin + (3. * dc->xyrange / exag);
80 zmin = zmin - (2. * dc->xyrange / exag);
81
82 if ((zmax - zmin) > dc->zrange)
83 dc->zrange = zmax - zmin;
84
85 return 1;
86}
87
88/*!
89 \brief Change position of view
90
91 \param x_pos x position (model coordinates)
92 \param y_pos y position (model coordinates)
93
94 \return 1
95 */
97{
98 float xpos, ypos, from[3];
99 float tempx, tempy;
100
101 xpos = x_pos;
102 xpos = (xpos < 0) ? 0 : (xpos > 1.0) ? 1.0 : xpos;
103 ypos = 1.0 - y_pos;
104 ypos = (ypos < 0) ? 0 : (ypos > 1.0) ? 1.0 : ypos;
105
107 G_debug(3, "Invalid view position coordinates, using %f,%f", xpos,
108 1.0 - ypos);
109 }
110
111 G_debug(1, "Nviz_set_viewpoint_position(): x = %f y = %f", x_pos, y_pos);
112 GS_get_from(from);
113
116
117 if ((from[X] != tempx) || (from[Y] != tempy)) {
118
119 from[X] = tempx;
120 from[Y] = tempy;
121
122 GS_moveto(from);
123
124 /* Nviz_draw_quick(data); */
125 }
126
127 return 1;
128}
129
131{
132 float from[3];
133 double xpos, ypos;
134
135 GS_get_from(from);
136 xpos = (from[X] + RANGE_OFFSET) / RANGE;
137 ypos = (from[Y] + RANGE_OFFSET) / RANGE;
138 *x_pos = xpos;
139 *x_pos = (*x_pos < 0) ? 0 : (*x_pos > 1.0) ? 1.0 : *x_pos;
140 *y_pos = 1.0 - ypos;
141 *y_pos = (*y_pos < 0) ? 0 : (*y_pos > 1.0) ? 1.0 : *y_pos;
142
144 G_debug(3, "Invalid view position coordinates, using %f,%f", *x_pos,
145 1.0 - *y_pos);
146 }
147}
148
149/*!
150 \brief Change viewpoint height
151
152 \param height height value (world coordinates)
153
154 \return 1
155 */
157{
158 float from[3];
159
160 G_debug(1, "Nviz_set_viewpoint_height(): value = %f", height);
161
162 GS_get_from_real(from);
163
164 if (height != from[Z]) {
165 from[Z] = height;
166
167 GS_moveto_real(from);
168
169 /*
170 normalize (from);
171 GS_setlight_position(1, from[X], from[Y], from[Z], 0);
172 */
173
174 /* Nviz_draw_quick(data); */
175 }
176
177 return 1;
178}
179
180void Nviz_get_viewpoint_height(double *height)
181{
182 float from[3];
183
184 G_debug(1, "Nviz_get_viewpoint_height():");
185
186 GS_get_from_real(from);
187
188 *height = from[Z];
189}
190
191/*!
192 \brief Change viewpoint perspective (field of view)
193
194 \param persp perspective value (0-100, in degrees)
195
196 \return 1
197 */
199{
200 int fov;
201
202 G_debug(1, "Nviz_set_viewpoint_persp(): value = %d", persp);
203
204 fov = (int)(10 * persp);
205 GS_set_fov(fov);
206
207 /* Nviz_draw_quick(data); */
208
209 return 1;
210}
211
212/*!
213 \brief Change viewpoint twist
214
215 \param twist persp twist value (-180-180, in degrees)
216
217 \return 1
218 */
220{
221 G_debug(1, "Nviz_set_viewpoint_twist(): value = %d", twist);
222 GS_set_twist(10 * twist);
223
224 /* Nviz_draw_quick(data); */
225
226 return 1;
227}
228
229/*!
230 \brief Change z-exag value
231
232 \param data nviz data
233 \param exag exag value
234
235 \return 1
236 */
237int Nviz_change_exag(nv_data *data, double exag)
238{
239 double temp;
240
241 G_debug(1, "Nviz_change_exag(): value = %f", exag);
243
244 if (exag != temp) {
245 GS_set_global_exag(exag);
246 Nviz_update_ranges(data);
247
248 /* Nviz_draw_quick(data); */
249 }
250
251 return 1;
252}
253
254/*!
255 \brief Change focused point
256
257 \param sx,sy screen coordinates
258
259 \return 1
260 */
261int Nviz_look_here(double sx, double sy)
262{
263 G_debug(1, "Nviz_look_here(): screen coordinates = %f %f", sx, sy);
264 GS_look_here(sx, sy);
265 return 1;
266}
267
268/*!
269 \brief Get current modelview matrix
270 */
275
276/*!
277 \brief Set rotation parameters
278
279 Rotate scene by given parameters related to mouse drag event
280 (difference from current state).
281 Coordinates determine the second point of rotation axis,
282 the first point is (0, 0, 0).
283
284 \param angle angle
285 \param x,y,z axis coordinate
286 */
287void Nviz_set_rotation(double angle, double x, double y, double z)
288{
289 G_debug(3, "Nviz_set_rotation(): angle = %f, x = %f, y = %f, z = %f", angle,
290 x, y, z);
291 GS_set_rotation(angle, x, y, z);
292}
293
294/*!
295 \brief Stop scene rotation
296 */
298{
300}
301
302/*!
303 \brief Stop scene rotation
304 */
306{
308}
309
310/*!
311 \brief Fly through the scene
312
313 Computes parameters needed for moving scene.
314 Changes viewpoint and viewdir.
315 Based on visualization/nviz/src/togl_flythrough.c and simplified.
316
317 \param data nviz data [unused]
318 \param fly_info values computed from mouse movement
319 \param scale rate of movement
320 \param lateral type of movement
321
322 */
323void Nviz_flythrough(nv_data *data G_UNUSED, float *fly_info, int *scale,
324 int lateral)
325{
326 float dir[3], from[4], cur_from[4], cur_dir[4];
327 float speed, h, p, sh, ch, sp, cp;
328 float diff_x, diff_y, diff_z;
329 float quasi_zero;
330
331 quasi_zero = 0.0001;
332
335
336 p = asin(cur_dir[Z]);
337 h = atan2(-cur_dir[X], -cur_dir[Y]);
338
339 speed = scale[0] * fly_info[0];
340
341 h += scale[1] * fly_info[1]; /* change heading */
342 if (!lateral) /* in case of "lateral" doesn't change pitch */
343 p -= scale[1] * fly_info[2];
344
345 h = fmod(h + M_PI, 2 * M_PI) - M_PI;
346
347 sh = sin(h);
348 ch = cos(h);
349 sp = sin(p);
350 cp = cos(p);
351
352 dir[X] = -sh * cp;
353 dir[Y] = -ch * cp;
354 dir[Z] = sp;
355
356 if (lateral) {
357 from[X] = cur_from[X] + speed * dir[Y];
358 from[Y] = cur_from[Y] - speed * dir[X];
359 from[Z] = cur_from[Z] + scale[0] * fly_info[2];
360 }
361 else {
362 from[X] = cur_from[X] + speed * dir[X];
363 from[Y] = cur_from[Y] + speed * dir[Y];
364 /* not sure how this should behave (change Z coord or not ?) */
365 from[Z] = cur_from[Z]; /* + speed * dir[Z] */
366 }
367
368 diff_x = fabs(cur_dir[X] - dir[X]);
369 diff_y = fabs(cur_dir[Y] - dir[Y]);
370 diff_z = fabs(cur_dir[Z] - dir[Z]);
371
372 if (/* something has changed */
373 (diff_x > quasi_zero) || (diff_y > quasi_zero) ||
374 (diff_z > quasi_zero) || (cur_from[X] != from[X]) ||
375 (cur_from[Y] != from[Y]) || (cur_from[Z] != from[Z])) {
376 GS_moveto(from);
377 GS_set_viewdir(dir); /* calls gsd_set_view */
378 }
379}
int Nviz_set_viewpoint_height(double height)
Change viewpoint height.
void Nviz_flythrough(nv_data *data, float *fly_info, int *scale, int lateral)
Fly through the scene.
int Nviz_update_ranges(nv_data *dc)
Update ranges.
Definition change_view.c:60
int Nviz_look_here(double sx, double sy)
Change focused point.
void Nviz_init_rotation(void)
Stop scene rotation.
void Nviz_get_viewpoint_position(double *x_pos, double *y_pos)
void Nviz_get_viewpoint_height(double *height)
int Nviz_resize_window(int width, int height)
GL canvas resized.
Definition change_view.c:29
void Nviz_get_modelview(double *modelMatrix)
Get current modelview matrix.
int Nviz_set_viewpoint_twist(int twist)
Change viewpoint twist.
int Nviz_set_viewpoint_position(double x_pos, double y_pos)
Change position of view.
Definition change_view.c:96
int Nviz_set_viewpoint_persp(int persp)
Change viewpoint perspective (field of view)
void Nviz_set_rotation(double angle, double x, double y, double z)
Set rotation parameters.
void Nviz_unset_rotation(void)
Stop scene rotation.
int Nviz_change_exag(nv_data *data, double exag)
Change z-exag value.
int G_debug(int, const char *,...) __attribute__((format(printf
int GS_look_here(int, int)
Send screen coords sx and sy, lib traces through surfaces; sets new center to point of nearest inters...
Definition gs2.c:3001
void GS_set_rotation(double, double, double, double)
Set rotation params.
Definition gs2.c:2881
void GS_set_fov(int)
Set field of view.
Definition gs2.c:2837
void GS_get_viewdir(float *)
Get viewdir.
Definition gs2.c:2803
void GS_set_draw(int)
Sets which buffer to draw to.
Definition gs2.c:2458
void GS_get_from(float *)
Get viewpoint 'from' position.
Definition gs2.c:2720
void GS_alldraw_wire(void)
Draw all wires.
Definition gs2.c:1916
void GS_init_rotation(void)
Reset scene rotation.
Definition gs2.c:2903
int GS_get_longdim(float *)
Get largest dimension.
Definition gs2.c:136
void GS_get_from_real(float *)
Get viewpoint 'from' real coordinates.
Definition gs2.c:2734
void GS_set_twist(int)
Set viewpoint twist value.
Definition gs2.c:2871
void GS_set_viewdir(float *)
Set viewdir.
Definition gs2.c:2817
void GS_get_zrange_nz(float *, float *)
Get Z extents for all loaded surfaces.
Definition gs2.c:2354
void GS_moveto(float *)
Move viewpoint.
Definition gs2.c:2612
void GS_unset_rotation(void)
Stop scene rotation.
Definition gs2.c:2895
void GS_ready_draw(void)
Definition gs2.c:2484
void GS_set_global_exag(float)
Set global z-exag value.
Definition gs2.c:1974
void GS_moveto_real(float *)
Move position to (real)
Definition gs2.c:2642
void GS_done_draw(void)
Draw done, swap buffers.
Definition gs2.c:2497
void GS_set_viewport(int, int, int, int)
Set viewport.
Definition gs2.c:2975
float GS_global_exag(void)
Get global z-exag value.
Definition gs2.c:1996
#define G_UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
Definition gis.h:43
#define M_PI
Definition gis.h:154
#define RANGE_OFFSET
Definition nviz.h:58
#define RANGE
Definition nviz.h:57
#define X
Definition ogsf.h:141
#define Z
Definition ogsf.h:143
#define Y
Definition ogsf.h:142
#define GSD_BACK
Definition ogsf.h:106
Definition nviz.h:96
#define x