warp.c

Go to the documentation of this file.
00001 /* --
00002 OpenFX version 2.0 - Modelling, Animation and Rendering Package
00003 Copyright (C) - OpenFX Development Team
00004 -- */
00005 
00006 /* warp.c */
00007 
00008 #include <math.h>
00009 #include <windows.h>
00010 #include <commctrl.h>
00011 
00012 #include "warp.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 long _RenderGlobalEffect
00060 (char *PrmList, sfxinfo *SFXinfo, sfxdata *SFXdata, vertex *Vlist){
00061  return 1;
00062 }
00063 
00064 void _PreviewGlobalEffect
00065 (char *PrmList, sfxinfo *SFXinfo, sfxdata *SFXdata, Svertex *Vlist){
00066  return;
00067 }
00068 
00069 long _RenderExternalEffect(char *parameters, sfxinfo *SFXinfo,
00070                                  vertex *v){
00071  double scale,dpmax,dpmin,t,sp;
00072  long i;
00073  int PRMwarp;
00074  char *buffer[128];
00075  sscanf(parameters,"%s %d",buffer,&PRMwarp);
00076  t=SFXinfo->time;
00077  dpmax=SFXinfo->vmax[1]-SFXinfo->vmin[1];
00078  if(PRMwarp == 2){                  /* Warp in */
00079   if(t <= 0.5)sp=1.0+2.0*t;
00080   else        sp=2.0-2.0*(t-0.5);
00081   scale=2.0*(t-0.5);
00082   for(i=0;i<SFXinfo->nvert;i++){
00083    if(t <= 0.5)v[i].p[1] = (v[i].p[1] - SFXinfo->vmin[1])*sp + SFXinfo->vmin[1];
00084    else v[i].p[1] = (v[i].p[1] - SFXinfo->vmin[1])*sp +
00085                     SFXinfo->vmin[1] + scale*dpmax;
00086   }
00087  }
00088  else if(PRMwarp == 1){             /* Warp Out */
00089   t=1.0-SFXinfo->time;
00090   for(i=0;i<SFXinfo->nvert;i++){
00091    v[i].p[1] = v[i].p[1] + t*dpmax;
00092   }
00093  }
00094  return 1;
00095 }
00096 
00097 void _PreviewExternalEffect(char *parameters, sfxinfo *SFXinfo,
00098                                     Svertex *v){
00099  double scale,dpmax,dpmin,t,sp;
00100  long i;
00101  int PRMwarp;
00102  char *buffer[128];
00103  sscanf(parameters,"%s %d",buffer,&PRMwarp);
00104  t=SFXinfo->time;
00105  dpmax=SFXinfo->vmax[1]-SFXinfo->vmin[1];
00106  if(PRMwarp == 2){                  /* Warp in */
00107   if(t <= 0.5)sp=1.0+2.0*t;
00108   else        sp=2.0-2.0*(t-0.5);
00109   scale=2.0*(t-0.5);
00110   for(i=0;i<SFXinfo->nvert;i++){
00111    if(t <= 0.5)v[i][1] = (v[i][1] - SFXinfo->vmin[1])*sp + SFXinfo->vmin[1];
00112    else v[i][1] = (v[i][1] - SFXinfo->vmin[1])*sp +
00113                     SFXinfo->vmin[1] + scale*dpmax;
00114   }
00115  }
00116  else if(PRMwarp == 1){             /* Warp Out */
00117   t=1.0-SFXinfo->time;
00118   for(i=0;i<SFXinfo->nvert;i++){
00119    v[i][1] = v[i][1] + t*dpmax;
00120   }
00121  }
00122 }
00123 
00124 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00125 
00126 static int warp=1;
00127 
00128 char * _SetExternalParameters(
00129   char *Op,                 /* string for the parameters                  */
00130   HWND hWnd,                /* parent window                              */
00131   long ruler,               /* ruler scale value to facilitate scaling    */
00132   char *name,               /* name of DLL file with the effect           */
00133   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00134  ){
00135  char buffer[128];
00136  if(Op != NULL){  /* parameters exist so read them off the list          */
00137                   /* the name of the DLL file is always the first string */
00138    sscanf(Op,"%s %ld",buffer,&warp);
00139  }
00140  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG_WARP),hWnd,
00141               (DLGPROC)DlgProc) == FALSE)return Op;
00142  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00143  sprintf(buffer,"7 %ld",warp);
00144  if((Op=(char *)CALL_MALLOC(strlen(buffer)+1)) == NULL){
00145   MessageBox (GetFocus(),"External effect: Out of memory","Error",
00146                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00147    return NULL;
00148  }
00149  strcpy(Op,buffer);
00150  return Op;
00151 }
00152 
00153 BOOL CALLBACK DlgProc(HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam){
00154  char str[12];
00155  switch( msg ) {
00156    case WM_INITDIALOG:
00157      if(warp == 1)SendDlgItemMessage(hDlg,DLG_WARP_WARPIN,BM_SETCHECK,1,0);
00158      else SendDlgItemMessage(hDlg,DLG_WARP_WARPOUT,BM_SETCHECK,1,0);
00159      LoadAnimatedClip(hDlg);
00160      CentreDialogOnScreen(hDlg);
00161      return TRUE;
00162    case WM_PAINT:
00163      PaintBackground(hDlg);
00164      break;
00165    case WM_SYSCOMMAND:
00166      switch(LOWORD(wparam & 0xfff0)){
00167        case SC_CLOSE:
00168          EndDialog(hDlg,FALSE);
00169          return(TRUE);
00170        default:
00171          break;
00172      }
00173      break;
00174    case WM_COMMAND:
00175      switch(LOWORD(wparam)){
00176         case DLG_WARP_WARPIN:    warp=1; break;
00177         case DLG_WARP_WARPOUT:   warp=2; break;
00178         case DLG_WARP_OK:
00179           EndDialog(hDlg,TRUE);
00180           return(TRUE);
00181         case DLG_WARP_CANCEL:
00182           EndDialog(hDlg,FALSE);
00183           return(TRUE);
00184         default:
00185           break;
00186       }
00187       break;
00188     default: break;
00189  }
00190  return FALSE;
00191 }
Generated on Tue Jan 28 06:18:30 2014 for OpenFX by  doxygen 1.6.3