GRASS 8 Programmer's Manual 8.6.0dev(2026)-0f6a7341fc
Loading...
Searching...
No Matches
gsd_cplane.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gsd_cplane.c
3
4 \brief OGSF library - manipulating surfaces (lower level functions)
5
6 GRASS OpenGL gsurf OGSF Library
7
8 SPDX-FileCopyrightText: 1999-2008 GRASS Development Team
9 SPDX-License-Identifier: GPL-2.0-or-later
10
11 \author Bill Brown USACERL, GMSL/University of Illinois (January 1993)
12 \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
13 */
14
15#include <grass/ogsf.h>
16#include "rowcol.h"
17
18static void init_cplane(void);
19
20static float Cp_pt[4], Cp_norm[MAX_CPLANES][4];
21static float Cp_trans[MAX_CPLANES][3], Cp_rot[MAX_CPLANES][3];
22static int Cp_ison[MAX_CPLANES]; /* also need isdef? */
23
24static void init_cplane(void)
25{
26 int i;
27
28 gs_get_datacenter(Cp_pt);
29 gs_get_data_avg_zmax(&(Cp_pt[Z]));
30
31 for (i = 0; i < MAX_CPLANES; i++) {
32 Cp_ison[i] = 0;
33 Cp_norm[i][X] = 1.0;
34 Cp_norm[i][Y] = Cp_norm[i][Z] = 0.0;
35 Cp_norm[i][W] = 1.;
36 Cp_rot[i][X] = Cp_trans[i][X] = 0.0;
37 Cp_rot[i][Y] = Cp_trans[i][Y] = 0.0;
38 Cp_rot[i][Z] = Cp_trans[i][Z] = 0.0;
39 }
40
41 return;
42}
43
44/*!
45 \brief Define cplace
46
47 \param num
48 \param pt
49 \param norm
50 */
51void gsd_def_cplane(int num, float *pt, float *norm)
52{
53 float sx, sy, sz, ppt[3];
54 double params[4];
55 float zmin, zmax;
56
57 GS_get_scale(&sx, &sy, &sz, 1);
58
59 /* Something's still wrong with the zexag - DONT USE TILT */
60 GS_get_zrange(&zmin, &zmax, 0);
61
62 ppt[0] = (pt[0] + Cp_pt[0]) * sx;
63 ppt[1] = (pt[1] + Cp_pt[1]) * sy;
64 ppt[2] = (pt[2] + Cp_pt[2] - zmin) * sz;
65
66 params[0] = (double)norm[0] * sx;
67 params[1] = (double)norm[1] * sy;
68 params[2] = (double)norm[2] * sz;
69 GS_dv3norm(params);
70 params[3] = -ppt[0] * params[0] - ppt[1] * params[1] - ppt[2] * params[2];
71
72 gsd_def_clipplane(num, params);
73
74 return;
75}
76
77/*!
78 \brief Update cplaces
79
80 Called when viewing matrix changes
81 */
83{
84 int i;
85
86 for (i = 0; i < MAX_CPLANES; i++) {
87 if (Cp_ison[i]) {
88 gsd_def_cplane(i, Cp_trans[i], Cp_norm[i]);
89 }
90 }
91
92 return;
93}
94
95/*!
96 \brief ADD
97
98 \param num
99 */
100void gsd_cplane_on(int num)
101{
102 static int first = 1;
103
104 if (first) {
105 first = 0;
106 init_cplane();
107 gsd_def_cplane(num, Cp_trans[num], Cp_norm[num]);
108 }
109
110 gsd_set_clipplane(num, 1);
111
112 Cp_ison[num] = 1;
113
114 return;
115}
116
117/*!
118 \brief Turn off clip plane
119
120 \param num cplane id
121 */
122void gsd_cplane_off(int num)
123{
124
125 gsd_set_clipplane(num, 0);
126 Cp_ison[num] = 0;
127
128 return;
129}
130
131/*!
132 \brief Get cplane state
133
134 <i>onstate</i> MUST be big enough to hold MAX_CPLANES ints
135
136 \param onstate
137 */
139{
140 int i;
141
142 for (i = 0; i < MAX_CPLANES; i++) {
143 onstate[i] = Cp_ison[i];
144 }
145
146 return;
147}
148
149/*!
150 \brief Get cplaces
151
152 Planes MUST be big enough to hold MAX_CPLANES Point4s
153
154 \param planes surface coordinates, normal pointing away from visible side
155
156 \return ADD
157 */
159{
160 int i, ons;
161 Point3 thru;
162
163 for (ons = i = 0; i < MAX_CPLANES; i++) {
164 if (Cp_ison[i]) {
165 thru[X] = Cp_pt[X] + Cp_trans[ons][X];
166 thru[Y] = Cp_pt[Y] + Cp_trans[ons][Y];
167 thru[Z] = Cp_pt[Z] + Cp_trans[ons][Z];
168 planes[ons][X] = -Cp_norm[ons][X];
169 planes[ons][Y] = -Cp_norm[ons][Y];
170 planes[ons][Z] = -Cp_norm[ons][Z];
171 planes[ons][W] = -(DOT3(planes[ons], thru));
172 ons++;
173 }
174 }
175
176 return (ons);
177}
178
179/*!
180 \brief ADD
181
182 \param num
183 */
184void gsd_update_cpnorm(int num)
185{
186 float v[1][4];
187
188 v[0][X] = v[0][W] = 1.0;
189 v[0][Y] = v[0][Z] = 0.0;
190
191 P_pushmatrix();
192 P_rot(Cp_rot[num][Z], 'z');
193 P_rot(Cp_rot[num][Y], 'y');
194 P_rot(Cp_rot[num][X], 'x');
195 P_transform(1, v, &Cp_norm[num]);
196 P_popmatrix();
197
198 return;
199}
200
201/*!
202 \brief ADD
203
204 \param num
205 \param rx,ry,rz
206 */
207void gsd_cplane_setrot(int num, float rx, float ry, float rz)
208{
209 Cp_rot[num][X] = rx;
210 Cp_rot[num][Y] = ry;
211 Cp_rot[num][Z] = rz;
212
214 gsd_def_cplane(num, Cp_trans[num], Cp_norm[num]);
215
216 return;
217}
218
219/*!
220 \brief ADD
221
222 \param num
223 \param tx,ty,tz
224 */
225void gsd_cplane_settrans(int num, float tx, float ty, float tz)
226{
227 Cp_trans[num][X] = tx;
228 Cp_trans[num][Y] = ty;
229 Cp_trans[num][Z] = tz;
230
231 gsd_def_cplane(num, Cp_trans[num], Cp_norm[num]);
232
233 return;
234}
235
236/*!
237 \brief ADD
238
239 \param surf1 first surface (geosurf)
240 \param surf2 second surface (geosurf) [unused]
241 \param cpnum
242 */
244{
245 int was_on;
246 float len, dir[3], bgn[2], end[2], px, py, fencenorm[3];
247
248 /* temporarily turn this plane off */
249 if ((was_on = Cp_ison[cpnum])) {
251 }
252
253 /* line on surface (assuming NO TILT) is (-A,B)->(A,-B),
254 extended thru Cp_pt */
255 dir[X] = -Cp_norm[cpnum][Y];
256 dir[Y] = Cp_norm[cpnum][X];
257 dir[Z] = 0.0;
258 GS_v3norm(dir);
259 px = Cp_trans[cpnum][X] + Cp_pt[X];
260 py = Cp_trans[cpnum][Y] + Cp_pt[Y];
261
262 /* TODO: make line from point & direction, clip to region */
263 /* for now, to test: */
264 bgn[X] = px;
265 bgn[Y] = py;
266 end[X] = px;
267 end[Y] = 3 * VROW2Y(surf1, 0);
268 len = GS_P2distance(bgn, end) - 1;
269 bgn[X] = px + len * dir[X];
270 bgn[Y] = py + len * dir[Y];
271 end[X] = px - len * dir[X];
272 end[Y] = py - len * dir[Y];
273
274 fencenorm[X] = -Cp_norm[cpnum][X];
275 fencenorm[Y] = -Cp_norm[cpnum][Y];
276 fencenorm[Z] = -Cp_norm[cpnum][Z];
277 gsd_wall(bgn, end, fencenorm);
278
279 /* turn this plane back on */
280 if (was_on) {
282 }
283
284 return;
285}
286
287/*!
288 \brief Draw cplane
289
290 \param num
291 */
292void gsd_draw_cplane(int num)
293{
294 float size, cpv[3];
295 int i;
296 float scalez;
297 unsigned long colr;
298
299 /* turn off all clipping planes */
300 for (i = 0; i < MAX_CPLANES; i++) {
301 if (Cp_ison[i]) {
302 gsd_set_clipplane(i, 0);
303 }
304 }
305
306 GS_get_longdim(&size);
307 size /= 2.;
308 cpv[X] = 0.0;
309
310 gsd_blend(1);
311
312 gsd_zwritemask(0x0);
313
315
316 gsd_do_scale(1);
317
318 gsd_translate(Cp_pt[X] + Cp_trans[num][X], Cp_pt[Y] + Cp_trans[num][Y],
319 Cp_pt[Z] + Cp_trans[num][Z]);
320
321 gsd_rot(Cp_rot[num][Z], 'z');
322 gsd_rot(Cp_rot[num][Y], 'y');
323 gsd_rot(Cp_rot[num][X], 'x');
324
325 if ((scalez = GS_global_exag())) {
326 gsd_scale(1.0, 1.0, 1. / scalez);
327 }
328
329 colr = (GS_default_draw_color() | 0xff000000) & 0x33ffffff;
332 cpv[Y] = size;
333 cpv[Z] = size;
335 cpv[Y] = -size;
337 cpv[Z] = -size;
339 cpv[Y] = size;
342
344 gsd_blend(0);
345 gsd_zwritemask(0xffffffff);
346
347 /* turn on clipping planes */
348 for (i = 0; i < MAX_CPLANES; i++) {
349 if (Cp_ison[i]) {
350 gsd_set_clipplane(i, 1);
351 }
352 }
353
354 return;
355}
int P_popmatrix(void)
Pop top of matrix stack, placing it into the current transformation matrix.
Definition trans.c:184
int GS_v3norm(float *)
Change v1 so that it is a unit vector (3D)
Definition gs_util.c:242
void gsd_pushmatrix(void)
Push the current matrix stack.
Definition gsd_prim.c:507
void gsd_scale(float, float, float)
Multiply the current matrix by a general scaling matrix.
Definition gsd_prim.c:521
unsigned int GS_default_draw_color(void)
Get default draw color.
Definition gs2.c:2435
void gsd_do_scale(int)
Set current scale.
Definition gsd_views.c:351
int GS_dv3norm(double *)
Changes v1 so that it is a unit vector.
Definition gs_util.c:291
void gsd_def_clipplane(int, double *)
Define clip plane.
Definition gsd_prim.c:1010
int GS_get_zrange(float *, float *, int)
Get z-extent for all loaded surfaces.
Definition gs2.c:2684
float GS_P2distance(float *, float *)
Calculate distance in plane.
Definition gs_util.c:156
int GS_get_longdim(float *)
Get largest dimension.
Definition gs2.c:136
void gsd_bgnpolygon(void)
Delimit the vertices of a primitive or a group of like primitives.
Definition gsd_prim.c:368
int gsd_wall(float *, float *, float *)
ADD.
Definition gsd_surf.c:1706
void P_rot(float, char)
Rotate matrix.
Definition trans.c:204
int gs_get_datacenter(float *)
Get data center point.
Definition gs.c:1226
void gsd_color_func(unsigned int)
Set current color.
Definition gsd_prim.c:694
void gsd_translate(float, float, float)
Multiply the current matrix by a translation matrix.
Definition gsd_prim.c:535
void gsd_popmatrix(void)
Pop the current matrix stack.
Definition gsd_prim.c:497
void gsd_zwritemask(unsigned long)
Write out z-mask.
Definition gsd_prim.c:237
void gsd_set_clipplane(int, int)
Set clip plane.
Definition gsd_prim.c:1037
int P_pushmatrix(void)
Push current transformation matrix onto matrix stack.
Definition trans.c:163
void GS_get_scale(float *, float *, float *, int)
Get axis scale.
Definition gs2.c:3235
void P_transform(int, float(*)[4], float(*)[4])
Transform array of vectors using current T matrix.
Definition trans.c:103
int gs_get_data_avg_zmax(float *)
Get average z-max value.
Definition gs.c:1197
void gsd_blend(int)
Specify pixel arithmetic.
Definition gsd_prim.c:990
void gsd_rot(float, char)
ADD.
Definition gsd_prim.c:601
void gsd_vert_func(float *)
ADD.
Definition gsd_prim.c:682
void gsd_endpolygon(void)
Delimit the vertices of a primitive or a group of like primitives.
Definition gsd_prim.c:383
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
void gsd_cplane_off(int num)
Turn off clip plane.
Definition gsd_cplane.c:122
void gsd_get_cplanes_state(int *onstate)
Get cplane state.
Definition gsd_cplane.c:138
void gsd_cplane_settrans(int num, float tx, float ty, float tz)
ADD.
Definition gsd_cplane.c:225
int gsd_get_cplanes(Point4 *planes)
Get cplaces.
Definition gsd_cplane.c:158
void gsd_draw_cplane_fence(geosurf *surf1, geosurf *surf2, int cpnum)
ADD.
Definition gsd_cplane.c:243
void gsd_draw_cplane(int num)
Draw cplane.
Definition gsd_cplane.c:292
void gsd_cplane_setrot(int num, float rx, float ry, float rz)
ADD.
Definition gsd_cplane.c:207
void gsd_update_cpnorm(int num)
ADD.
Definition gsd_cplane.c:184
void gsd_cplane_on(int num)
ADD.
Definition gsd_cplane.c:100
void gsd_def_cplane(int num, float *pt, float *norm)
Define cplace.
Definition gsd_cplane.c:51
void gsd_update_cplanes(void)
Update cplaces.
Definition gsd_cplane.c:82
OGSF header file (structures)
#define MAX_CPLANES
Definition ogsf.h:48
#define X
Definition ogsf.h:141
float Point3[3]
Definition ogsf.h:206
#define Z
Definition ogsf.h:143
#define W
Definition ogsf.h:144
#define Y
Definition ogsf.h:142
float Point4[4]
Definition ogsf.h:205
#define DOT3(a, b)
Definition ogsf.h:181
#define VROW2Y(gs, vrow)
Definition rowcol.h:39
Definition ogsf.h:267