/*****************************************************************************1*2* Elmer, A Finite Element Software for Multiphysical Problems3*4* Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland5*6* This program is free software; you can redistribute it and/or7* modify it under the terms of the GNU General Public License8* as published by the Free Software Foundation; either version 29* of the License, or (at your option) any later version.10*11* This program is distributed in the hope that it will be useful,12* but WITHOUT ANY WARRANTY; without even the implied warranty of13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14* GNU General Public License for more details.15*16* You should have received a copy of the GNU General Public License17* along with this program (in file fem/GPL-2); if not, write to the18* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,19* Boston, MA 02110-1301, USA.20*21*****************************************************************************/2223/*******************************************************************************24*25* Visual classes main module + utilities26*27*******************************************************************************28*29* Author: Juha Ruokolainen30*31* Address: CSC - IT Center for Science Ltd.32* Keilaranta 14, P.O. BOX 40533* 02101 Espoo, Finland34* Tel. +358 0 457 272335* Telefax: +358 0 457 230236* EMail: [email protected]37*38* Date: 26 Sep 199539*40*41* Modification history:42*43* 28 Sep 1995, - added routine vis_get_visual_type, which gives a pointer to44* visual_type_t structure given name of the visual type45*46* - modified vis_add_visual_type according to change in47* visual_type_t and visual_t structures (now holding list of48* visual types rather than an array)49*50* 29 Sep 1995, - added routines vis_get_visual_type_name and vis_get_visual_name51* - added routines vis_set_param and vis_new_visual52* - added routines vis_add_visual, vis_delete_visual53*54* Juha R.55*56******************************************************************************/5758#define MODULE_VISUALS5960#include "../elmerpost.h"6162/*******************************************************************************63*64* Name: vis_add_visual_type65*66* Purpose: Register a visual class67*68* Parameters:69*70* Input: (visual_t *) visual class to be added71*72* Output: Global variable VisualDefs is modified73*74* Return value: TRUE is success, FALSE if malloc() fails75*76******************************************************************************/77int vis_add_visual_type( visual_type_t *VisualDef )78{79visual_type_t *ptr;8081ptr = (visual_type_t *)calloc(sizeof(visual_type_t),1);82if ( !ptr )83{84fprintf( stderr, "FATAL: vis_visual_type_add: Can't allocate memory.\n" );85return FALSE;86}8788*ptr = *VisualDef;89ptr->Next = VisualDefs.VisualTypes;9091VisualDefs.VisualTypes = ptr;9293VisualDefs.NumberOfVisualTypes++;9495return TRUE;96}9798/*******************************************************************************99*100* Name: vis_get_visual_type101*102* Purpose: return visual type pointer given visual name103*104* Parameters:105*106* Input: (char *) name of visual107*108* Output: none109*110* Return value: (visual_type_t *)visual if found, NULL otherwise111*112******************************************************************************/113visual_type_t *vis_get_visual_type(char *name)114{115visual_type_t *type = VisualDefs.VisualTypes;116117for( type=VisualDefs.VisualTypes; type != NULL; type=type->Next )118{119if ( strcmp( name, type->VisualName ) == 0 ) return type;120}121122fprintf( stderr, "vis_get_visual_type: can't find visual type [%s]\n", name );123124return NULL;125}126127/*******************************************************************************128*129* Name: vis_get_visual_type_name130*131* Purpose: return pointer to visual type name given visual structure132*133* Parameters:134*135* Input: (visual_t *) visual structure136*137* Output: none138*139* Return value: (char *) name of the visual type140*141******************************************************************************/142char *vis_get_visual_type_name(visual_t *visual)143{144return visual->VisualType->VisualName;145}146147/*******************************************************************************148*149* Name: vis_get_visual_name150*151* Purpose: return pointer to visual name given visual structure152*153* Parameters:154*155* Input: (visual_t *) visual structure156*157* Output: none158*159* Return value: (char *) name of the visual160*161******************************************************************************/162char *vis_get_visual_name(visual_t *visual)163{164return visual->Name;165}166167/*******************************************************************************168*169* Name: vis_set_param170*171* Purpose: set visual parameters172*173* Parameters:174*175* Input: (visual_t *) visual whose parameter is set176* (char *) parameter name177* (intvalue,doublevalue,void *) pointer to param value178*179* Output: graphics180*181* Return value: success182*183******************************************************************************/184int vis_set_param185( visual_t *visual, char *name,int intvalue,double doublevalue,void *ptrvalue )186{187visual_type_t *VisualType = visual->VisualType;188visual_param_t *VisualParams = VisualType->VisualParams;189190char *offset = (void *)visual->VisualParams;191192if ( !offset || !name )193{194fprintf( stderr, "vis_set_param: argument failure.\n" );195return FALSE;196}197198for( ; VisualParams->Name != NULL; VisualParams++ )199{200if ( strcmp( name, VisualParams->Name ) == 0 )201{202if ( VisualParams->ParamType == VIS_VISUAL_PARAM_LOGICAL )203{204*(logical_t *)(offset + VisualParams->Offset) = intvalue;205}206else if ( VisualParams->ParamType == VIS_VISUAL_PARAM_INT )207{208*(int *)(offset + VisualParams->Offset) = intvalue;209}210else if ( VisualParams->ParamType == VIS_VISUAL_PARAM_FLOAT )211{212*(double *)(offset + VisualParams->Offset) = doublevalue;213}214else if ( VisualParams->ParamType == VIS_VISUAL_PARAM_POINTER )215{216*(void **)(offset + VisualParams->Offset) = (void *)ptrvalue;217}218break;219}220}221222if ( !VisualParams->Name )223{224fprintf( stderr, "vis_set_param: no such param [%s,%s]\n", VisualType->VisualName,name );225return FALSE;226}227228return TRUE;229}230231/*******************************************************************************232*233* Name: vis_default_params234*235* Purpose: set default parameter values for a visual236*237* Parameters:238*239* Input: (visual_t *) visual structure to modify240*241* Output:242*243* Return value: void244*245******************************************************************************/246void vis_default_params( visual_t *visual )247{248visual_type_t *VisualType = visual->VisualType;249visual_param_t *VisualParams = VisualType->VisualParams;250251for( ;VisualParams->Name != NULL; VisualParams++ )252{253vis_set_param( visual,VisualParams->Name, VisualParams->IntValue,254VisualParams->FloatValue, VisualParams->PointerValue );255}256}257258/*******************************************************************************259*260* Name: vis_new_visual261*262* Purpose: alloc memory for a new visual structure263*264* Parameters:265*266* Input: (char *) Name of the visual type267*268* Output: none269*270* Return value: pointer to visual_t or NULL if malloc fails271*272******************************************************************************/273visual_t *vis_new_visual(char *name)274{275visual_t *visual = (visual_t *)calloc( sizeof(visual_t),1 );276277if ( !visual )278{279fprintf( stderr, "vis_new_visual: FATAL: can't allocate (a few bytes of) memory\n" );280return NULL;281}282283if ( !(visual->VisualType = vis_get_visual_type(name)) )284{285free( visual );286return NULL;287}288289if ( !(visual->VisualParams = (*visual->VisualType->AllocParams)()) )290{291free( visual );292return NULL;293}294295vis_default_params( visual );296297return visual;298}299300/*******************************************************************************301*302* Name: vis_link_visual303*304* Purpose: link a new visual to list of visuals given305*306* Parameters:307*308* Input: (visual_t *) list of visuals (can be null)309* (visual_t *) visual to be added310*311* Output: (visual_t *) is modified312*313* Return value: (visual_t *) head of list314*315******************************************************************************/316visual_t *vis_link_visual( visual_t *list,visual_t *new )317{318visual_t *ptr = list;319320if ( list )321{322while( ptr->Next != NULL ) ptr = ptr->Next;323ptr->Next = new;324} else list = new;325326return list;327}328329/*******************************************************************************330*331* Name: vis_add_visual332*333* Purpose: add a new visual to list of visuals given334*335* Parameters:336*337* Input: (visual_t *) list of visuals (can be null)338* (char *) name of visual type to add339*340* Output: (visual_t *) is modified341*342* Return value: pointer to new visual_t or NULL if malloc fails343*344******************************************************************************/345visual_t *vis_add_visual(visual_t *visual,char *name)346{347visual_t *newvisual = (visual_t *)vis_new_visual(name);348349if ( !newvisual ) return NULL;350351if ( visual )352{353while( visual->Next != NULL ) visual = visual->Next;354visual->Next = newvisual;355}356357return newvisual;358}359360/*******************************************************************************361*362* Name: vis_delete_visual363*364* Purpose: delete list of visuals given as argument365*366* Parameters:367*368* Input: (visual_t *) list to be deleted369*370* Output: none371*372* Return value: void373*374******************************************************************************/375void vis_delete_visual( visual_t *visual )376{377visual_t *ptr;378379while( visual != NULL )380{381(*visual->VisualType->DeleteParams)( visual->VisualParams );382visual->VisualParams = NULL;383384ptr = visual->Next;385386free( visual );387visual = ptr;388}389}390391/*******************************************************************************392*393* Name: vis_next_visual394*395* Purpose: return pointer to next visual in a list of given visual396*397* Parameters:398*399* Input: (visual_t *)400*401* Output: none402*403* Return value: pointer to visual_t or NULL if no more visuals in the list404*405******************************************************************************/406visual_t *vis_next_visual( visual_t *visual )407{408if ( visual ) return visual->Next;409410return NULL;411}412413/*******************************************************************************414*415* Name: vis_display_visual416*417* Purpose: Display one visual_t visual418*419* Parameters:420*421* Input: (geometry_t *) geometry information422* (visual_t *) visual423*424* Output: graphics425*426* Return value: if mouse interaction is going on and too slow FALSE,427* otherwise true428*429******************************************************************************/430int vis_display_visual( geometry_t *geometry, element_model_t *model, visual_t *VL,double t )431{432return (*VL->VisualType->RealizeVisual)( geometry, model, VL->VisualParams, t );433}434435/*******************************************************************************436*437* Name: vis_display_list438*439* Purpose: Display a list of visual_t visuals440*441* Parameters:442*443* Input: (geometry_t *) geometry information444* (visual_t *) visuals445* (double t) real time at invocation446*447* Output: graphics448*449* Return value: if mouse interaction is going on and too slow FALSE,450* otherwise true451*452******************************************************************************/453int vis_display_list( geometry_t *geometry, element_model_t *model, visual_t *VL,double t )454{455for( ; VL != NULL; VL = VL->Next )456{457#ifdef DEBUG458fprintf( stderr, "DISPLAYING VISUAL TYPE: [%s]\n", VL->VisualType->VisualName );459#endif460if ( !(*VL->VisualType->RealizeVisual)( geometry, model, VL->VisualParams, t ) )461{462return FALSE;463}464465if ( BreakLoop ) break;466}467468return TRUE;469}470471472/*******************************************************************************473*474* Name: vis_initialize_visual_types475*476* Purpose: Register all internal visual classes477*478* Parameters:479*480* Input: none481*482* Output: Global variable VisualDefs is modified483*484* Return value: TRUE is success, FALSE if malloc() fails485*486******************************************************************************/487int vis_initialize_visual_types()488{489if ( !vis_initialize_mesh_visual() ) return FALSE;490if ( !vis_initialize_arrow_visual() ) return FALSE;491if ( !vis_initialize_sphere_visual() ) return FALSE;492if ( !vis_initialize_contour_line_visual() ) return FALSE;493if ( !vis_initialize_isosurface_visual() ) return FALSE;494if ( !vis_initialize_particle_visual() ) return FALSE;495if ( !vis_initialize_colscale_visual() ) return FALSE;496497return TRUE;498}499500501