00001
00002
00003
00004
00005
00006
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;
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,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,
00120 HWND hWnd,
00121 long ruler,
00122 char *name,
00123 X__MEMORY_MANAGER *lpEVI
00124 ){
00125 char buffer[128];
00126 if(Op != NULL){
00127
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);
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 }