00001
00002
00003
00004
00005
00006
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;
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
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;
00078 else if(PRMaxis == 1) axis=2;
00079 else if(PRMaxis == 2) axis=0;
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;
00100 else if(PRMaxis == 1) axis=2;
00101 else if(PRMaxis == 2) axis=0;
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,
00121 HWND hWnd,
00122 long ruler,
00123 char *name,
00124 X__MEMORY_MANAGER *lpEVI
00125 ){
00126 char buffer[128];
00127 if(Op != NULL){
00128
00129 sscanf(Op,"%s %ld %f %f %f",buffer,&motion,&,&length,&freq);
00130 }
00131 if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG_MODULATE),hWnd,
00132 (DLGPROC)DlgProc) == FALSE)return Op;
00133 if(Op != NULL)CALL_FREE(Op);
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",&);
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 }