spring.c

Go to the documentation of this file.
00001 /* --
00002 OpenFX version 2.0 - Modelling, Animation and Rendering Package
00003 Copyright (C) 2000 - 2007 OpenFX Development Team
00004 -- */
00005 
00006 /* spring.c */
00007 
00008 #include <math.h>
00009 #include <windows.h>
00010 #include <commctrl.h>
00011 
00012 #include "spring.h"
00013 
00014 #if __ZTC__ || __SC__
00015 #ifndef max
00016 #define max(a,b)  ( ((a) > (b)) ? (a) : (b) )
00017 #endif
00018 #endif
00019 
00020 #ifndef PI
00021 #define PI 3.1415926
00022 #endif
00023 
00024 #if __X__MIPS__
00025 BOOL WINAPI _CRT_INIT(HINSTANCE ,DWORD , LPVOID );
00026 #endif
00027 
00028 static HINSTANCE hDLLinstance=NULL;
00029 
00030 #include "pstruct.h"
00031 
00032 #include "paint.c"
00033 
00034 #if __WATCOMC__
00035 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00036 #else
00037 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00038 #endif
00039   switch (dwReason) {
00040     case DLL_PROCESS_ATTACH:
00041 #if __X__MIPS__
00042       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00043 #endif
00044       hDLLinstance = hDLL;  /* handle to DLL file */
00045       break;
00046     case DLL_PROCESS_DETACH:
00047 #if __X__MIPS__
00048       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00049 #endif
00050       break;
00051   }
00052 return (int)TRUE;
00053 }
00054 
00055 #if __SC__
00056 #pragma startaddress(LibMain)
00057 #endif
00058 
00059 /* internal effects have no need to use this */
00060 
00061 long _RenderGlobalEffect
00062 (char *PrmList, sfxinfo *SFXinfo, sfxdata *SFXdata, vertex *Vlist){
00063  return 1;
00064 }
00065 
00066 void _PreviewGlobalEffect
00067 (char *PrmList, sfxinfo *SFXinfo, sfxdata *SFXdata, Svertex *Vlist){
00068  return;
00069 }
00070 
00071 long _RenderExternalEffect(char *parameters, sfxinfo *SFXinfo,
00072                                  vertex *v){
00073  double scale,dpmax,dpmin,t,sp;
00074  char buffer[128];
00075  int PRMcomp;
00076  long i;
00077  sscanf(parameters,"%s %d",buffer,&PRMcomp);
00078  t=SFXinfo->time;
00079  scale=4.0 * ((double)PRMcomp / 75.0) * (t-0.75);
00080  if     (t <= 0.50)sp=1.0-2.0*t*t;
00081  else if(t <= 0.75)sp=0.5+1.5*(t-0.5);
00082  else              sp=2.0-scale;
00083  dpmax=SFXinfo->vmax[1]-SFXinfo->vmin[1];
00084  for(i=0;i<SFXinfo->nvert;i++){
00085   if(t <= 0.75)v[i].p[1] = (v[i].p[1] - SFXinfo->vmin[1])*sp +
00086                            SFXinfo->vmin[1];
00087   else v[i].p[1] = (v[i].p[1] - SFXinfo->vmin[1])*sp + SFXinfo->vmin[1] +
00088                    scale*dpmax;
00089  }
00090  return 1;
00091 }
00092 
00093 void _PreviewExternalEffect(char *parameters, sfxinfo *SFXinfo,
00094                                     Svertex *v){
00095  double scale,dpmax,dpmin,t,sp;
00096  char buffer[128];
00097  int PRMcomp;
00098  long i;
00099  sscanf(parameters,"%s %d",buffer,&PRMcomp);
00100  t=SFXinfo->time;
00101  scale=4.0 * ((double)PRMcomp / 75.0) * (t-0.75);
00102  if     (t <= 0.50)sp=1.0-2.0*t*t;
00103  else if(t <= 0.75)sp=0.5+1.5*(t-0.5);
00104  else              sp=2.0-scale;
00105  dpmax=SFXinfo->vmax[1]-SFXinfo->vmin[1];
00106  for(i=0;i<SFXinfo->nvert;i++){
00107   if(t <= 0.75)v[i][1] = (v[i][1] - SFXinfo->vmin[1])*sp +
00108                            SFXinfo->vmin[1];
00109   else v[i][1] = (v[i][1] - SFXinfo->vmin[1])*sp + SFXinfo->vmin[1] +
00110                    scale*dpmax;
00111  }
00112 }
00113 
00114 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00115 
00116 static int compression=75;
00117 
00118 char * _SetExternalParameters(
00119   char *Op,                 /* string for the parameters                  */
00120   HWND hWnd,                /* parent window                              */
00121   long ruler,               /* ruler scale value to facilitate scaling    */
00122   char *name,               /* name of DLL file with the effect           */
00123   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00124   ){
00125  char buffer[128];
00126  if(Op != NULL){  /* parameters exist so read them off the list          */
00127                   /* the name of the DLL file is always the first string */
00128    sscanf(Op,"%s %ld",buffer,&compression);
00129  }
00130  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG_SPRING),hWnd,
00131               (DLGPROC)DlgProc) == FALSE)return Op;
00132  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00133  sprintf(buffer,"8 %ld",compression);
00134  if((Op=(char *)CALL_MALLOC(strlen(buffer)+1)) == NULL){
00135   MessageBox (GetFocus(),"External effect: Out of memory","Error",
00136                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00137    return NULL;
00138  }
00139  strcpy(Op,buffer);
00140  return Op;
00141 }
00142 
00143 BOOL CALLBACK DlgProc(HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam){
00144  char str[12];
00145  switch( msg ) {
00146    case WM_INITDIALOG:
00147      SetDlgItemInt(hDlg,DLG_SPRING_COMPRESSION,compression,FALSE);
00148      LoadAnimatedClip(hDlg);
00149      CentreDialogOnScreen(hDlg);
00150      return TRUE;
00151    case WM_PAINT:
00152      PaintBackground(hDlg);
00153      break;
00154    case WM_SYSCOMMAND:
00155      switch(LOWORD(wparam & 0xfff0)){
00156        case SC_CLOSE:
00157          EndDialog(hDlg,FALSE);
00158          return(TRUE);
00159        default:
00160          break;
00161      }
00162      break;
00163    case WM_COMMAND:
00164      switch(LOWORD(wparam)){
00165         case DLG_SPRING_OK:
00166           if(GetDlgItemText(hDlg,DLG_SPRING_COMPRESSION,str,3) != 0)
00167             compression=atoi(str);
00168           EndDialog(hDlg,TRUE);
00169           return(TRUE);
00170         case DLG_SPRING_CANCEL:
00171           EndDialog(hDlg,FALSE);
00172           return(TRUE);
00173         default:
00174           break;
00175       }
00176       break;
00177     default: break;
00178  }
00179  return FALSE;
00180 }
Generated on Tue Jan 28 06:18:29 2014 for OpenFX by  doxygen 1.6.3