Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/visuals/visual.c
3203 views
1
/*****************************************************************************
2
*
3
* Elmer, A Finite Element Software for Multiphysical Problems
4
*
5
* Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 2
10
* of the License, or (at your option) any later version.
11
*
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License
18
* along with this program (in file fem/GPL-2); if not, write to the
19
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20
* Boston, MA 02110-1301, USA.
21
*
22
*****************************************************************************/
23
24
/*******************************************************************************
25
*
26
* Visual classes main module + utilities
27
*
28
*******************************************************************************
29
*
30
* Author: Juha Ruokolainen
31
*
32
* Address: CSC - IT Center for Science Ltd.
33
* Keilaranta 14, P.O. BOX 405
34
* 02101 Espoo, Finland
35
* Tel. +358 0 457 2723
36
* Telefax: +358 0 457 2302
37
* EMail: [email protected]
38
*
39
* Date: 26 Sep 1995
40
*
41
*
42
* Modification history:
43
*
44
* 28 Sep 1995, - added routine vis_get_visual_type, which gives a pointer to
45
* visual_type_t structure given name of the visual type
46
*
47
* - modified vis_add_visual_type according to change in
48
* visual_type_t and visual_t structures (now holding list of
49
* visual types rather than an array)
50
*
51
* 29 Sep 1995, - added routines vis_get_visual_type_name and vis_get_visual_name
52
* - added routines vis_set_param and vis_new_visual
53
* - added routines vis_add_visual, vis_delete_visual
54
*
55
* Juha R.
56
*
57
******************************************************************************/
58
59
#define MODULE_VISUALS
60
61
#include "../elmerpost.h"
62
63
/*******************************************************************************
64
*
65
* Name: vis_add_visual_type
66
*
67
* Purpose: Register a visual class
68
*
69
* Parameters:
70
*
71
* Input: (visual_t *) visual class to be added
72
*
73
* Output: Global variable VisualDefs is modified
74
*
75
* Return value: TRUE is success, FALSE if malloc() fails
76
*
77
******************************************************************************/
78
int vis_add_visual_type( visual_type_t *VisualDef )
79
{
80
visual_type_t *ptr;
81
82
ptr = (visual_type_t *)calloc(sizeof(visual_type_t),1);
83
if ( !ptr )
84
{
85
fprintf( stderr, "FATAL: vis_visual_type_add: Can't allocate memory.\n" );
86
return FALSE;
87
}
88
89
*ptr = *VisualDef;
90
ptr->Next = VisualDefs.VisualTypes;
91
92
VisualDefs.VisualTypes = ptr;
93
94
VisualDefs.NumberOfVisualTypes++;
95
96
return TRUE;
97
}
98
99
/*******************************************************************************
100
*
101
* Name: vis_get_visual_type
102
*
103
* Purpose: return visual type pointer given visual name
104
*
105
* Parameters:
106
*
107
* Input: (char *) name of visual
108
*
109
* Output: none
110
*
111
* Return value: (visual_type_t *)visual if found, NULL otherwise
112
*
113
******************************************************************************/
114
visual_type_t *vis_get_visual_type(char *name)
115
{
116
visual_type_t *type = VisualDefs.VisualTypes;
117
118
for( type=VisualDefs.VisualTypes; type != NULL; type=type->Next )
119
{
120
if ( strcmp( name, type->VisualName ) == 0 ) return type;
121
}
122
123
fprintf( stderr, "vis_get_visual_type: can't find visual type [%s]\n", name );
124
125
return NULL;
126
}
127
128
/*******************************************************************************
129
*
130
* Name: vis_get_visual_type_name
131
*
132
* Purpose: return pointer to visual type name given visual structure
133
*
134
* Parameters:
135
*
136
* Input: (visual_t *) visual structure
137
*
138
* Output: none
139
*
140
* Return value: (char *) name of the visual type
141
*
142
******************************************************************************/
143
char *vis_get_visual_type_name(visual_t *visual)
144
{
145
return visual->VisualType->VisualName;
146
}
147
148
/*******************************************************************************
149
*
150
* Name: vis_get_visual_name
151
*
152
* Purpose: return pointer to visual name given visual structure
153
*
154
* Parameters:
155
*
156
* Input: (visual_t *) visual structure
157
*
158
* Output: none
159
*
160
* Return value: (char *) name of the visual
161
*
162
******************************************************************************/
163
char *vis_get_visual_name(visual_t *visual)
164
{
165
return visual->Name;
166
}
167
168
/*******************************************************************************
169
*
170
* Name: vis_set_param
171
*
172
* Purpose: set visual parameters
173
*
174
* Parameters:
175
*
176
* Input: (visual_t *) visual whose parameter is set
177
* (char *) parameter name
178
* (intvalue,doublevalue,void *) pointer to param value
179
*
180
* Output: graphics
181
*
182
* Return value: success
183
*
184
******************************************************************************/
185
int vis_set_param
186
( visual_t *visual, char *name,int intvalue,double doublevalue,void *ptrvalue )
187
{
188
visual_type_t *VisualType = visual->VisualType;
189
visual_param_t *VisualParams = VisualType->VisualParams;
190
191
char *offset = (void *)visual->VisualParams;
192
193
if ( !offset || !name )
194
{
195
fprintf( stderr, "vis_set_param: argument failure.\n" );
196
return FALSE;
197
}
198
199
for( ; VisualParams->Name != NULL; VisualParams++ )
200
{
201
if ( strcmp( name, VisualParams->Name ) == 0 )
202
{
203
if ( VisualParams->ParamType == VIS_VISUAL_PARAM_LOGICAL )
204
{
205
*(logical_t *)(offset + VisualParams->Offset) = intvalue;
206
}
207
else if ( VisualParams->ParamType == VIS_VISUAL_PARAM_INT )
208
{
209
*(int *)(offset + VisualParams->Offset) = intvalue;
210
}
211
else if ( VisualParams->ParamType == VIS_VISUAL_PARAM_FLOAT )
212
{
213
*(double *)(offset + VisualParams->Offset) = doublevalue;
214
}
215
else if ( VisualParams->ParamType == VIS_VISUAL_PARAM_POINTER )
216
{
217
*(void **)(offset + VisualParams->Offset) = (void *)ptrvalue;
218
}
219
break;
220
}
221
}
222
223
if ( !VisualParams->Name )
224
{
225
fprintf( stderr, "vis_set_param: no such param [%s,%s]\n", VisualType->VisualName,name );
226
return FALSE;
227
}
228
229
return TRUE;
230
}
231
232
/*******************************************************************************
233
*
234
* Name: vis_default_params
235
*
236
* Purpose: set default parameter values for a visual
237
*
238
* Parameters:
239
*
240
* Input: (visual_t *) visual structure to modify
241
*
242
* Output:
243
*
244
* Return value: void
245
*
246
******************************************************************************/
247
void vis_default_params( visual_t *visual )
248
{
249
visual_type_t *VisualType = visual->VisualType;
250
visual_param_t *VisualParams = VisualType->VisualParams;
251
252
for( ;VisualParams->Name != NULL; VisualParams++ )
253
{
254
vis_set_param( visual,VisualParams->Name, VisualParams->IntValue,
255
VisualParams->FloatValue, VisualParams->PointerValue );
256
}
257
}
258
259
/*******************************************************************************
260
*
261
* Name: vis_new_visual
262
*
263
* Purpose: alloc memory for a new visual structure
264
*
265
* Parameters:
266
*
267
* Input: (char *) Name of the visual type
268
*
269
* Output: none
270
*
271
* Return value: pointer to visual_t or NULL if malloc fails
272
*
273
******************************************************************************/
274
visual_t *vis_new_visual(char *name)
275
{
276
visual_t *visual = (visual_t *)calloc( sizeof(visual_t),1 );
277
278
if ( !visual )
279
{
280
fprintf( stderr, "vis_new_visual: FATAL: can't allocate (a few bytes of) memory\n" );
281
return NULL;
282
}
283
284
if ( !(visual->VisualType = vis_get_visual_type(name)) )
285
{
286
free( visual );
287
return NULL;
288
}
289
290
if ( !(visual->VisualParams = (*visual->VisualType->AllocParams)()) )
291
{
292
free( visual );
293
return NULL;
294
}
295
296
vis_default_params( visual );
297
298
return visual;
299
}
300
301
/*******************************************************************************
302
*
303
* Name: vis_link_visual
304
*
305
* Purpose: link a new visual to list of visuals given
306
*
307
* Parameters:
308
*
309
* Input: (visual_t *) list of visuals (can be null)
310
* (visual_t *) visual to be added
311
*
312
* Output: (visual_t *) is modified
313
*
314
* Return value: (visual_t *) head of list
315
*
316
******************************************************************************/
317
visual_t *vis_link_visual( visual_t *list,visual_t *new )
318
{
319
visual_t *ptr = list;
320
321
if ( list )
322
{
323
while( ptr->Next != NULL ) ptr = ptr->Next;
324
ptr->Next = new;
325
} else list = new;
326
327
return list;
328
}
329
330
/*******************************************************************************
331
*
332
* Name: vis_add_visual
333
*
334
* Purpose: add a new visual to list of visuals given
335
*
336
* Parameters:
337
*
338
* Input: (visual_t *) list of visuals (can be null)
339
* (char *) name of visual type to add
340
*
341
* Output: (visual_t *) is modified
342
*
343
* Return value: pointer to new visual_t or NULL if malloc fails
344
*
345
******************************************************************************/
346
visual_t *vis_add_visual(visual_t *visual,char *name)
347
{
348
visual_t *newvisual = (visual_t *)vis_new_visual(name);
349
350
if ( !newvisual ) return NULL;
351
352
if ( visual )
353
{
354
while( visual->Next != NULL ) visual = visual->Next;
355
visual->Next = newvisual;
356
}
357
358
return newvisual;
359
}
360
361
/*******************************************************************************
362
*
363
* Name: vis_delete_visual
364
*
365
* Purpose: delete list of visuals given as argument
366
*
367
* Parameters:
368
*
369
* Input: (visual_t *) list to be deleted
370
*
371
* Output: none
372
*
373
* Return value: void
374
*
375
******************************************************************************/
376
void vis_delete_visual( visual_t *visual )
377
{
378
visual_t *ptr;
379
380
while( visual != NULL )
381
{
382
(*visual->VisualType->DeleteParams)( visual->VisualParams );
383
visual->VisualParams = NULL;
384
385
ptr = visual->Next;
386
387
free( visual );
388
visual = ptr;
389
}
390
}
391
392
/*******************************************************************************
393
*
394
* Name: vis_next_visual
395
*
396
* Purpose: return pointer to next visual in a list of given visual
397
*
398
* Parameters:
399
*
400
* Input: (visual_t *)
401
*
402
* Output: none
403
*
404
* Return value: pointer to visual_t or NULL if no more visuals in the list
405
*
406
******************************************************************************/
407
visual_t *vis_next_visual( visual_t *visual )
408
{
409
if ( visual ) return visual->Next;
410
411
return NULL;
412
}
413
414
/*******************************************************************************
415
*
416
* Name: vis_display_visual
417
*
418
* Purpose: Display one visual_t visual
419
*
420
* Parameters:
421
*
422
* Input: (geometry_t *) geometry information
423
* (visual_t *) visual
424
*
425
* Output: graphics
426
*
427
* Return value: if mouse interaction is going on and too slow FALSE,
428
* otherwise true
429
*
430
******************************************************************************/
431
int vis_display_visual( geometry_t *geometry, element_model_t *model, visual_t *VL,double t )
432
{
433
return (*VL->VisualType->RealizeVisual)( geometry, model, VL->VisualParams, t );
434
}
435
436
/*******************************************************************************
437
*
438
* Name: vis_display_list
439
*
440
* Purpose: Display a list of visual_t visuals
441
*
442
* Parameters:
443
*
444
* Input: (geometry_t *) geometry information
445
* (visual_t *) visuals
446
* (double t) real time at invocation
447
*
448
* Output: graphics
449
*
450
* Return value: if mouse interaction is going on and too slow FALSE,
451
* otherwise true
452
*
453
******************************************************************************/
454
int vis_display_list( geometry_t *geometry, element_model_t *model, visual_t *VL,double t )
455
{
456
for( ; VL != NULL; VL = VL->Next )
457
{
458
#ifdef DEBUG
459
fprintf( stderr, "DISPLAYING VISUAL TYPE: [%s]\n", VL->VisualType->VisualName );
460
#endif
461
if ( !(*VL->VisualType->RealizeVisual)( geometry, model, VL->VisualParams, t ) )
462
{
463
return FALSE;
464
}
465
466
if ( BreakLoop ) break;
467
}
468
469
return TRUE;
470
}
471
472
473
/*******************************************************************************
474
*
475
* Name: vis_initialize_visual_types
476
*
477
* Purpose: Register all internal visual classes
478
*
479
* Parameters:
480
*
481
* Input: none
482
*
483
* Output: Global variable VisualDefs is modified
484
*
485
* Return value: TRUE is success, FALSE if malloc() fails
486
*
487
******************************************************************************/
488
int vis_initialize_visual_types()
489
{
490
if ( !vis_initialize_mesh_visual() ) return FALSE;
491
if ( !vis_initialize_arrow_visual() ) return FALSE;
492
if ( !vis_initialize_sphere_visual() ) return FALSE;
493
if ( !vis_initialize_contour_line_visual() ) return FALSE;
494
if ( !vis_initialize_isosurface_visual() ) return FALSE;
495
if ( !vis_initialize_particle_visual() ) return FALSE;
496
if ( !vis_initialize_colscale_visual() ) return FALSE;
497
498
return TRUE;
499
}
500
501