Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/objects/objects.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
* Objects 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: 2 Oct 1995
40
*
41
* Modified by:
42
*
43
* Date of modification:
44
*
45
******************************************************************************/
46
47
#define MODULE_OBJECTS
48
49
#include "../elmerpost.h"
50
51
/*******************************************************************************
52
*
53
* Name: obj_initialize_object
54
*
55
* Purpose: Initialize object to default values
56
*
57
* Parameters:
58
*
59
* Input: none
60
*
61
* Output: (object_t *)
62
*
63
* Return value: void
64
*
65
******************************************************************************/
66
void obj_object_initialize( object_t *object )
67
{
68
int i;
69
70
obj_init_transform( &object->Transform );
71
for( i=0; i<6;i++ ) object->ClipPlane[i] = -1;
72
PiDiv180 = acos(0.0) / 90.0;
73
}
74
75
/*******************************************************************************
76
*
77
* Name: obj_new
78
*
79
* Purpose: Create a new object. Internal only.
80
*
81
* Parameters:
82
*
83
* Input: Name of the object to create.
84
*
85
* Output: none
86
*
87
* Return value: (object_t *)
88
*
89
******************************************************************************/
90
object_t *obj_new(char *name)
91
{
92
object_t *object = calloc(1,sizeof(object_t));
93
94
if ( !object )
95
{
96
fprintf( stderr, "object_new: FATAL: can't allocate a few bytes of memory.\n" );
97
return NULL;
98
}
99
100
if ( name )
101
{
102
if ( !(object->Name = malloc( strlen(name)+1 ) ) )
103
{
104
fprintf( stderr, "object_new: FATAL: can't allocate a few bytes of memory.\n" );
105
free( object );
106
return NULL;
107
}
108
109
strcpy( object->Name,name );
110
}
111
112
obj_object_initialize( object );
113
114
return object;
115
}
116
117
/*******************************************************************************
118
*
119
* Name: obj_add_object
120
*
121
* Purpose: Add a new object to list of objects given.
122
*
123
* Parameters:
124
*
125
* Input: (object_t *) input list
126
* (char *) name of the object to create
127
*
128
* Output: (object_t *) is modified
129
*
130
* Return value: pointer to (object_t *), the new entry in the list.
131
*
132
******************************************************************************/
133
object_t *obj_add_object( object_t *object,char *name )
134
{
135
object_t *new = obj_new(name);
136
137
if ( !new ) return NULL;
138
139
if ( object )
140
{
141
new->Id = 1;
142
while( object->Next ) { object = object->Next; new->Id++; }
143
object->Next = new;
144
}
145
146
return new;
147
}
148
149
/*******************************************************************************
150
*
151
* Name: obj_find
152
*
153
* Purpose: Return pointer to an object with given name if any.
154
*
155
* Parameters:
156
*
157
* Input: (object_t *) input list of objects
158
* (char *) name of the object to find
159
*
160
* Output: none
161
*
162
* Return value: pointer to (object_t *) if found, NULL otherwise
163
*
164
******************************************************************************/
165
object_t *obj_find( object_t *object,char *name )
166
{
167
while( object )
168
{
169
if ( strcmp( object->Name, name ) == 0 ) return object;
170
object = object->Next;
171
}
172
173
return NULL;
174
}
175
176
/*******************************************************************************
177
*
178
* Name: obj_display_list
179
*
180
* Purpose: Display list of objects given.
181
*
182
* Parameters:
183
*
184
* Input: (object_t *) input list of objects
185
*
186
* Output: graphics
187
*
188
* Return value: if mouse interaction is going on and too slow FALSE,
189
* otherwise true
190
*
191
******************************************************************************/
192
int obj_display_list( object_t *object,double t )
193
{
194
extern double XMin,XMax,YMin,YMax,ZMin,ZMax;
195
int i;
196
void gra_clip_plane(), gra_bbox(), obj_set_matrix(), gra_disable_clip();
197
198
for( ; object != NULL; object = object->Next )
199
{
200
gra_push_matrix();
201
obj_set_matrix( object );
202
203
for( i=0; i<6; i++ )
204
if ( object->ClipPlane[i] >= 0 )
205
gra_clip_plane( object->ClipPlane[i],object->ClipEquation[i] );
206
207
if ( user_hook_object_before )
208
(*user_hook_object_before)
209
(
210
GlobalPass,object->Geometry,object->ElementModel,object->VisualList,t
211
);
212
213
if ( epMouseDown && epMouseDownTakesTooLong > 3 )
214
{
215
gra_bbox( XMin,XMax,YMin,YMax,ZMin,ZMax );
216
}
217
else if ( !vis_display_list( object->Geometry,object->ElementModel,object->VisualList,t ) )
218
{
219
gra_pop_matrix();
220
return FALSE;
221
}
222
223
if ( user_hook_object_after )
224
(*user_hook_object_after)
225
(
226
GlobalPass,object->Geometry,object->ElementModel,object->VisualList,t
227
);
228
229
for( i=0; i<6; i++ )
230
if ( object->ClipPlane[i] >= 0 ) gra_disable_clip( object->ClipPlane[i] );
231
232
233
gra_pop_matrix();
234
}
235
236
return TRUE;
237
}
238
239