00001
00002
00003
00004
00005
00006
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;
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){
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){
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){
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){
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,
00130 HWND hWnd,
00131 long ruler,
00132 char *name,
00133 X__MEMORY_MANAGER *lpEVI
00134 ){
00135 char buffer[128];
00136 if(Op != NULL){
00137
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);
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 }