modulate.c

Go to the documentation of this file.
00001 /* --
00002 OpenFX version 2.0 - Modelling, Animation and Rendering Package
00003 Copyright (C) 2000  - OpenFX Development Team
00004 -- */
00005 
00006 /* modulate.c */
00007 
00008 #include <math.h>
00009 #include <windows.h>
00010 #include <commctrl.h>
00011 
00012 #include "modulate.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,amplitude,PRMamp,PRMlngth,PRMfreq;
00074  char PRMaxis, axis, paxis, paxis2, buffer[128];
00075  long i;
00076  sscanf(parameters,"%s %d %f %f %f",buffer,&PRMaxis,&PRMamp,&PRMlngth,&PRMfreq);
00077  if(PRMaxis == 3) axis=1;         /* F / B */
00078  else if(PRMaxis == 1) axis=2;    /* U / D */
00079  else if(PRMaxis == 2) axis=0;    /* L / R */
00080  if(axis == 0){      paxis = 1; paxis2 = 2; }
00081  else if(axis == 2){ paxis = 1; paxis2 = 0; }
00082  else if(axis == 1){ paxis = 0; paxis2 = 2; }
00083  dpmax=max((SFXinfo->vmax[axis]-SFXinfo->vmin[axis]) * PRMlngth,1.0);
00084  amplitude = 0.1 * (PRMamp / 25.0);
00085  for(i=0;i<SFXinfo->nvert;i++){
00086   scale=1.0+amplitude*cos(PI*2*((SFXinfo->time*PRMfreq)-v[i].p[axis]/dpmax));
00087   v[i].p[paxis]  *= scale;
00088   v[i].p[paxis2] *= scale;
00089  }
00090  return 1;
00091 }
00092 
00093 void _PreviewExternalEffect(char *parameters, sfxinfo *SFXinfo,
00094                                     Svertex *v){
00095  double scale,dpmax,amplitude,PRMamp,PRMlngth,PRMfreq;
00096  char PRMaxis, axis, paxis, paxis2, buffer[128];
00097  long i;
00098  sscanf(parameters,"%s %d %f %f %f",buffer,&PRMaxis,&PRMamp,&PRMlngth,&PRMfreq);
00099  if(PRMaxis == 3) axis=1;         /* F / B */
00100  else if(PRMaxis == 1) axis=2;    /* U / D */
00101  else if(PRMaxis == 2) axis=0;    /* L / R */
00102  if(axis == 0){      paxis = 1; paxis2 = 2; }
00103  else if(axis == 2){ paxis = 1; paxis2 = 0; }
00104  else if(axis == 1){ paxis = 0; paxis2 = 2; }
00105  dpmax=max((SFXinfo->vmax[axis]-SFXinfo->vmin[axis]) * PRMlngth,1.0);
00106  amplitude = 0.1 * (PRMamp / 25.0);
00107  for(i=0;i<SFXinfo->nvert;i++){
00108   scale=1.0+amplitude*cos(PI*2*((SFXinfo->time*PRMfreq)-v[i][axis]/dpmax));
00109   v[i][paxis]  *= scale;
00110   v[i][paxis2] *= scale;
00111  }
00112 }
00113 
00114 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00115 
00116 static int motion=1;
00117 static double amp=25.0,length=1.0,freq=1.0;
00118 
00119 char * _SetExternalParameters(
00120   char *Op,                 /* string for the parameters                  */
00121   HWND hWnd,                /* parent window                              */
00122   long ruler,               /* ruler scale value to facilitate scaling    */
00123   char *name,               /* name of DLL file with the effect           */
00124   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00125   ){
00126  char buffer[128];
00127  if(Op != NULL){  /* parameters exist so read them off the list          */
00128                   /* the name of the DLL file is always the first string */
00129    sscanf(Op,"%s %ld %f %f %f",buffer,&motion,&amp,&length,&freq);
00130  }
00131  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG_MODULATE),hWnd,
00132               (DLGPROC)DlgProc) == FALSE)return Op;
00133  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00134  sprintf(buffer,"5 %ld %f %f %f",motion,amp,length,freq);
00135  if((Op=(char *)CALL_MALLOC(strlen(buffer)+1)) == NULL){
00136   MessageBox (GetFocus(),"External effect: Out of memory","Error",
00137                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00138    return NULL;
00139  }
00140  strcpy(Op,buffer);
00141  return Op;
00142 }
00143 
00144 BOOL CALLBACK DlgProc(HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam){
00145  char str[16];
00146  switch( msg ) {
00147    case WM_INITDIALOG:
00148      if     (motion == 3)SendDlgItemMessage(hDlg,DLG_MODULATE_FB,BM_SETCHECK,1,0);
00149      else if(motion == 2)SendDlgItemMessage(hDlg,DLG_MODULATE_LR,BM_SETCHECK,1,0);
00150      else                SendDlgItemMessage(hDlg,DLG_MODULATE_UD,BM_SETCHECK,1,0);
00151      sprintf(str,"%.2f",amp);
00152      SetDlgItemText(hDlg,DLG_MODULATE_AMP,str);
00153      sprintf(str,"%.2f",length);
00154      SetDlgItemText(hDlg,DLG_MODULATE_LENGTH,str);
00155      sprintf(str,"%.2f",freq);
00156      SetDlgItemText(hDlg,DLG_MODULATE_FREQ,str);
00157      LoadAnimatedClip(hDlg);
00158      CentreDialogOnScreen(hDlg);
00159      return TRUE;
00160    case WM_PAINT:
00161      PaintBackground(hDlg);
00162      break;
00163    case WM_SYSCOMMAND:
00164      switch(LOWORD(wparam & 0xfff0)){
00165        case SC_CLOSE:
00166          EndDialog(hDlg,FALSE);
00167          return(TRUE);
00168        default:
00169          break;
00170      }
00171      break;
00172    case WM_COMMAND:
00173      switch(LOWORD(wparam)){
00174         case DLG_MODULATE_UD:        motion=1; break;
00175         case DLG_MODULATE_LR:        motion=2; break;
00176         case DLG_MODULATE_FB:        motion=3; break;
00177         case DLG_MODULATE_OK:
00178           if(GetDlgItemText(hDlg,DLG_MODULATE_AMP,str,12) != 0)
00179             sscanf(str,"%f",&amp);
00180           if(GetDlgItemText(hDlg,DLG_MODULATE_LENGTH,str,12) != 0)
00181             sscanf(str,"%f",&length);
00182           if(GetDlgItemText(hDlg,DLG_MODULATE_FREQ,str,12) != 0)
00183             sscanf(str,"%f",&freq);
00184           EndDialog(hDlg,TRUE);
00185           return(TRUE);
00186         case DLG_MODULATE_CANCEL:
00187           EndDialog(hDlg,FALSE);
00188           return(TRUE);
00189         default:
00190           break;
00191       }
00192       break;
00193     default: break;
00194  }
00195  return FALSE;
00196 }
Generated on Tue Jan 28 06:18:29 2014 for OpenFX by  doxygen 1.6.3