00001
00002
00003 #define MODULE_EXTERNAL 1
00004
00005 #include "animate.h"
00006 #include "callall.h"
00007
00008 static long ExportScript(char *name, char *library);
00009
00010 void DeleteEffect(object *op){
00011 UnloadEffectLibrary(op);
00012 if(op->effect != NULL)X__Free(op->effect);
00013 op->effect=NULL;
00014 }
00015
00016 void AddEffect(object *op, HWND parent){
00017 long l;
00018 char tname[256];
00019 l=strlen(gszDLLfile);
00020 strcpy((gszDLLfile+l-3),"efx");
00021 if(SelectSfxFileName(0,gszDLLfile,gszDLLdir,IDX_MISC_OPENEFFECT,
00022 "(*.EFX)|*.efx|",parent) == TRUE){
00023 HMODULE hLib;
00024 FARPROC fpFun;
00025 long id,result=0;
00026 X__MEMORY_MANAGER *Evs;
00027 char *(*fpFun1)(char *, HWND, long, char *, X__MEMORY_MANAGER *);
00028 Evs=&EviMemoryManager;
00029 l=strlen(gszDLLfile);
00030 strcpy((gszDLLfile+l-3),"dll");
00031 strcpy(tname,gszDLLfile);
00032 HideWhiteSpaces(tname);
00033 if((hLib=LoadEffectLibrary(tname,op)) != NULL){
00034 if((fpFun=GetProcAddress(hLib,"_SetExternalParameters")) != NULL){
00035 fpFun1 = (void *)fpFun;
00036 op->effect=(*fpFun1)(op->effect,parent,(long)ruler,tname,Evs);
00037 }
00038 else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00039 if(op->effect == NULL)DeleteEffect(op);
00040 }
00041 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00042 }
00043 return;
00044 }
00045
00046 void EditActorEffect(object *op, HWND parent){
00047 HMODULE hLib;
00048 FARPROC fpFun;
00049 long l,id,result=0;
00050 X__MEMORY_MANAGER *Evs;
00051 char *(*fpFun1)(char *, HWND, long, char *, X__MEMORY_MANAGER *);
00052 Evs=&EviMemoryManager;
00053 if(op->effect == NULL){
00054 SendPrgmQuery(IDQ_NOEFFECT1,3);
00055 return;
00056 }
00057 if((hLib=op->hEffect) != NULL){
00058 if((fpFun=GetProcAddress(hLib,"_SetExternalParameters")) != NULL){
00059 fpFun1 = (void *)fpFun;
00060 op->effect=(*fpFun1)(op->effect,parent,(long)ruler,op->effectname,Evs);
00061 }
00062 else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00063 if(op->effect == NULL)DeleteEffect(op);
00064 }
00065 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00066 return;
00067 }
00068
00069 HMODULE LoadEffectLibrary(char *name, object *op){
00070 HMODULE hLib;
00071 node *Np;
00072 object *Op;
00073 char lname[256];
00074 if(op->hEffect != NULL){
00075 return op->hEffect;
00076 }
00077 if((Np=FirstNp) != NULL)while(Np != NULL){
00078 if((Op=Np->fobj) != NULL)while(Op != NULL){
00079 if(Op->hEffect != NULL){
00080 if(stricmp(name,Op->effectname) == 0){
00081 op->hEffect=Op->hEffect;
00082 strcpy(op->effectname,Op->effectname);
00083 return op->hEffect;
00084 }
00085 }
00086 Op=Op->next;
00087 }
00088 Np=Np->next;
00089 }
00090 strcpy(lname,name);
00091 RestoreWhiteSpaces(lname);
00092 hLib=LoadLibrary(lname);
00093 if(hLib == NULL){
00094 char *sfname,tfname[256];
00095 sfname=short_form(lname);
00096 strcpy(tfname,gszHomeDir); strcat(tfname,"effects\\");
00097 strcat(tfname,sfname);
00098 hLib=LoadLibrary(tfname);
00099 }
00100 if(hLib != NULL){
00101 op->hEffect=hLib;
00102 strcpy(op->effectname,name);
00103 }
00104 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00105 return hLib;
00106 }
00107
00108 void UnloadEffectLibrary(object *op){
00109 node *Np;
00110 object *Op;
00111 int idcount=0;
00112 if(op->hEffect == NULL)return;
00113 if((Np=FirstNp) != NULL)while(Np != NULL){
00114 if((Op=Np->fobj) != NULL)while(Op != NULL){
00115 if(Op != op && Op->hEffect == op->hEffect)idcount++;
00116 Op=Op->next;
00117 }
00118 Np=Np->next;
00119 }
00120 if(idcount > 0){
00121 op->hEffect=NULL;
00122 op->effectname[0]='\0';
00123 return;
00124 }
00125 FreeLibrary(op->hEffect);
00126 op->hEffect=NULL;
00127 op->effectname[0]='\0';
00128 }
00129
00130 BOOL PrintImageFile(HWND hwnd){
00131 BOOL status=FALSE;
00132 HMODULE hLib;
00133 FARPROC fpFun;
00134 char lname[256];
00135 BOOL (*fpFun1)(HWND, char *);
00136 if(SelectSfxFileName(0,gszIMGfile,gszIMGdir,IDX_MISC_IMAGEFILE,
00137 "(*.GIF)|*.gif|(*.TGA)|*.tga|(*.CEL)|*.cel|(*.BMP)|*.bmp|",ghwnd_main) == FALSE)
00138 return FALSE;
00139 strcpy(lname,gszHomeDir); strcat(lname,"eprint.dll");
00140 if((hLib=LoadLibrary(lname)) != NULL){
00141 if((fpFun=GetProcAddress(hLib,"_PrintBitmap")) != NULL){
00142 fpFun1 = (void *)fpFun;
00143 EnableToolPannels(ALL_PANNELS,FALSE);
00144 status=(*fpFun1)(hwnd,gszIMGfile);
00145 EnableToolPannels(ALL_PANNELS,TRUE);
00146 }
00147 else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00148 FreeLibrary(hLib);
00149 }
00150 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00151 return status;
00152 }
00153
00154 void EditImageProcess(HWND parent,XIP *Ip){
00155 HMODULE hLib;
00156 FARPROC fpFun;
00157 X__MEMORY_MANAGER *Evs;
00158 char name[256],nname[256];
00159 char *(*fpFun1)(char *, HWND, long, char *, X__MEMORY_MANAGER *);
00160 Evs=&EviMemoryManager;
00161 if(Ip->p == NULL){
00162 SendPrgmQuery(IDQ_NOPARAMETERS,3);
00163 return;
00164 }
00165 sscanf(Ip->p,"%s",name);
00166 strcpy(nname,name);
00167 RestoreWhiteSpaces(nname);
00168 hLib=LoadLibrary(nname);
00169 if(hLib == NULL){
00170 char *sfname,tfname[256];
00171 sfname=short_form(nname);
00172 strcpy(tfname,gszHomeDir); strcat(tfname,"postprocess\\");
00173 strcat(tfname,sfname);
00174 hLib=LoadLibrary(tfname);
00175 }
00176 if(hLib != NULL){
00177 if((fpFun=GetProcAddress(hLib,"_SetExternalParameters")) != NULL){
00178 fpFun1 = (void *)fpFun;
00179 Ip->p=(*fpFun1)(Ip->p,parent,(long)ruler,name,Evs);
00180 }
00181 else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00182 FreeLibrary(hLib);
00183 }
00184 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00185 if(Ip->p == NULL)DeleteImageProcess(Ip);
00186 return;
00187 }
00188
00189 char *EditObjectImageProcess(HWND parent, char *p){
00190 HMODULE hLib;
00191 FARPROC fpFun;
00192 X__MEMORY_MANAGER *Evs;
00193 char nname[256],name[256];
00194 char *(*fpFun1)(char *, HWND, long, char *, X__MEMORY_MANAGER *);
00195 long l;
00196 Evs=&EviMemoryManager;
00197 if(p == NULL){
00198 l=strlen(gszXIPfile);
00199 strcpy((gszXIPfile+l-3),"xfx");
00200 if(SelectSfxFileName(0,gszXIPfile,gszXIPdir,IDX_MISC_XIP,
00201 "(*.XFX)|*.xfx|",parent) != TRUE)return p;
00202 l=strlen(gszXIPfile);
00203 strcpy((gszXIPfile+l-3),"dll");
00204 strcpy(name,gszXIPfile);
00205 strcpy(nname,name);
00206 HideWhiteSpaces(name);
00207 }
00208 else{
00209 sscanf(p,"%s",name);
00210 strcpy(nname,name);
00211 RestoreWhiteSpaces(nname);
00212 }
00213 RestoreWhiteSpaces(nname);
00214 hLib=LoadLibrary(nname);
00215 if(hLib == NULL){
00216 char *sfname,tfname[256];
00217 sfname=short_form(nname);
00218 strcpy(tfname,gszHomeDir); strcat(tfname,"postprocess\\");
00219 strcat(tfname,sfname);
00220 hLib=LoadLibrary(tfname);
00221 }
00222 if(hLib != NULL){
00223 if((fpFun=GetProcAddress(hLib,"_SetExternalParameters")) != NULL){
00224 fpFun1 = (void *)fpFun;
00225 p=(*fpFun1)(p,parent,(long)ruler,name,Evs);
00226 }
00227 else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00228 FreeLibrary(hLib);
00229 }
00230 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00231 return p;
00232 }
00233
00234 void DeleteImageProcess(XIP *Ip){
00235 XIP *oldIp;
00236 if(Ip == NULL)return;
00237 EDIT_ACTION=YES;
00238 if(Ip->last != NULL)Ip->last->next=Ip->next;
00239 if(Ip->next != NULL)Ip->next->last=Ip->last;
00240 if(Ip == MainIp )MainIp = Ip->last;
00241 if(Ip == FirstIp)FirstIp = Ip->next;
00242 if(Ip->p != NULL)X__Free(Ip->p);
00243 NimageProcesses--;
00244 X__Free(Ip);
00245 }
00246
00247 XIP *CreateImageProcess(HWND parent){
00248 long l;
00249 XIP *temp;
00250 char ftemp[256];
00251 if((temp = (XIP *)X__Malloc(sizeof(XIP))) == NULL){
00252 SendPrgmQuery(IDQ_NOMEM1,0);
00253 return NULL;
00254 }
00255 if(MainIp == NULL)FirstIp=temp;
00256 else MainIp->next=temp;
00257 temp->last=MainIp;
00258 temp->next=NULL;
00259 MainIp = temp;
00260 MainIp->p=NULL;
00261 NimageProcesses++;
00262 if(parent == NULL)return temp;
00263 l=strlen(gszXIPfile);
00264 strcpy((gszXIPfile+l-3),"xfx");
00265 if(SelectSfxFileName(0,gszXIPfile,gszXIPdir,IDX_MISC_XIP,
00266 "(*.XFX)|*.xfx|",parent) == TRUE){
00267 HMODULE hLib;
00268 FARPROC fpFun;
00269 X__MEMORY_MANAGER *Evs;
00270 char *(*fpFun1)(char *, HWND, long, char *, X__MEMORY_MANAGER *);
00271 Evs=&EviMemoryManager;
00272 l=strlen(gszXIPfile);
00273 strcpy((gszXIPfile+l-3),"dll");
00274 strcpy(ftemp,gszXIPfile);
00275 HideWhiteSpaces(ftemp);
00276 if((hLib=LoadLibrary(gszXIPfile)) != NULL){
00277 if((fpFun=GetProcAddress(hLib,"_SetExternalParameters")) != NULL){
00278 fpFun1 = (void *)fpFun;
00279 MainIp->p=(*fpFun1)(MainIp->p,parent,(long)ruler,ftemp,Evs);
00280 }
00281 else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00282 FreeLibrary(hLib);
00283 }
00284 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00285 }
00286 if(MainIp->p == NULL){
00287 DeleteImageProcess(MainIp);
00288 return NULL;
00289 }
00290 EDIT_ACTION=YES;
00291 return temp;
00292 }
00293
00294 void StartExternGL(void){
00295 static BOOL in_use=FALSE;
00296 BOOL found=FALSE;
00297 DWORD version;
00298 int result;
00299 char modulename[255];
00300 HWND hWnd;
00301 return;
00302 version=GetVersion();
00303 if((version & 0x80000000) == 0x80000000){
00304 if(LOBYTE(LOWORD(version)) < 4)return;
00305 }
00306 if((hWnd=FindWindow("OFX:PlayGL",NULL)) != NULL){
00307 SetForegroundWindow(hWnd);
00308 BringWindowToTop(hWnd);
00309 found=TRUE;
00310 }
00311 else{
00312 strcpy(modulename,gszHomeDir);strcat(modulename,"animategl.exe $SAL$");
00313 result=WinExec(modulename,SW_SHOW);
00314 if(result < 32){
00315 if(result == ERROR_FILE_NOT_FOUND || result == ERROR_PATH_NOT_FOUND)
00316 SendPrgmQuery(IDQ_NOLOADMODELER,0);
00317 }
00318 if((hWnd=FindWindow("OFX:PlayGL",NULL)) != NULL){
00319 SetForegroundWindow(hWnd);
00320 BringWindowToTop(hWnd);
00321 found=TRUE;
00322 }
00323 }
00324 if(found && !in_use){
00325 in_use=TRUE;
00326 MakeScript(6,1);
00327 PostMessage(hWnd,(WM_USER+1),0,0);
00328 in_use=FALSE;
00329 }
00330 }
00331
00332 void ExecuteModeler(void){
00333 int result;
00334 char modulename[255];
00335 HWND hWnd;
00336 if((hWnd=FindWindow("OFX:ModelerClass",NULL)) != NULL){
00337 SetForegroundWindow(hWnd);
00338 BringWindowToTop(hWnd);
00339 }
00340 else{
00341 strcpy(modulename,gszHomeDir);strcat(modulename,"design.exe");
00342 result=WinExec(modulename,SW_SHOW);
00343 if(result < 32){
00344 if(result == ERROR_FILE_NOT_FOUND || result == ERROR_PATH_NOT_FOUND)
00345 SendPrgmQuery(IDQ_NOLOADMODELER,0);
00346 }
00347 if((hWnd=FindWindow("OFX:ModelerClass",NULL)) != NULL){
00348 SetForegroundWindow(hWnd);
00349 BringWindowToTop(hWnd);
00350 }
00351 else SendPrgmQuery(IDQ_NOSTART,3);
00352 }
00353 }
00354
00355 void UnloadRenderer(void){
00356 HWND hWnd;
00357 if((hWnd=FindWindow("OFX:RenderClass",NULL)) != NULL){
00358 SendMessage(hWnd,WM_COMMAND,IDM_CALLBACK_SHUTDOWN,0);
00359 return;
00360 }
00361 if((hWnd=FindWindow("OFX:PlayGL",NULL)) != NULL){
00362 SendMessage(hWnd,WM_CLOSE,0,0);
00363 return;
00364 }
00365 }
00366
00367 void LoadRenderer(int anim){
00368 char modulename[256];
00369 HWND hWnd,hWndCall;
00370 int result;
00371 if((hWnd=FindWindow("OFX:RenderClass",NULL)) != NULL){
00372 if(anim == 0){
00373 PostMessage(hWnd,IDM_CALLBACK_HIDDENLINE,0,(LPARAM)ghwnd_view);
00374 return;
00375 }
00376 else if(anim == 3){
00377 if(ghwndOpenGLview == NULL)hWndCall=ghwnd_view;
00378 else{
00379 hWndCall=GetWindow(ghwndOpenGLview,GW_CHILD);
00380 }
00381 if(hWndCall != NULL)PostMessage(hWnd,WM_CALLBACK_MATERIAL,0,(LPARAM)hWndCall);
00382
00383 return;
00384 }
00385 else{
00386 if(anim == 2)PostMessage(hWnd,WM_COMMAND,IDM_CALLBACK_RUN,
00387 (WORD)CurrentFrame);
00388 else{
00389 PostMessage(hWnd,IDM_CALLBACK_SETUP_ANIMATOR,0,
00390 MAKELPARAM((WORD)CurrentFrame,(WORD)Nframes));
00391 EnableMenuItem(GetMenu(ghwnd_main),IDM_FRAME_RENDERNOW,MF_ENABLED);
00392 }
00393 }
00394 SetForegroundWindow(hWnd);
00395 BringWindowToTop(hWnd);
00396 ShowWindow(hWnd,SW_SHOW);
00397 return;
00398 }
00399 else{
00400 strcpy(modulename,gszHomeDir);strcat(modulename,"render.exe $SAL$");
00401 result=WinExec(modulename,SW_SHOW);
00402 if(result < 32){
00403 if(result == ERROR_FILE_NOT_FOUND ||
00404 result == ERROR_PATH_NOT_FOUND)SendPrgmQuery(IDQ_NOSTART,3);
00405 }
00406 if((hWnd=FindWindow("OFX:RenderClass",NULL)) != NULL){
00407 if(anim == 0){
00408 PostMessage(hWnd,IDM_CALLBACK_HIDDENLINE,0,(LPARAM)ghwnd_view);
00409 return;
00410 }
00411 else if(anim == 3){
00412 if(ghwndOpenGLview == NULL)hWndCall=ghwnd_view;
00413 else{
00414 hWndCall=GetWindow(ghwndOpenGLview,GW_CHILD);
00415 }
00416 if(hWndCall != NULL)PostMessage(hWnd,WM_CALLBACK_MATERIAL,0,(LPARAM)hWndCall);
00417
00418 return;
00419 }
00420 else{
00421 PostMessage(hWnd,IDM_CALLBACK_SETUP_ANIMATOR,0,
00422 MAKELPARAM((WORD)CurrentFrame,(WORD)Nframes));
00423 EnableMenuItem(GetMenu(ghwnd_main),IDM_FRAME_RENDERNOW,MF_ENABLED);
00424 }
00425 SetForegroundWindow(hWnd);
00426 BringWindowToTop(hWnd);
00427 ShowWindow(hWnd,SW_SHOW);
00428 }
00429 else SendPrgmQuery(IDQ_NOSTART,3);
00430 }
00431 return;
00432 }
00433
00434 void LoadUtility(char *program, char *class, int message){
00435 BOOL n=FALSE;
00436 int result;
00437 char modulename[255];
00438 HWND hWnd=NULL;
00439 if((class == NULL) || ((hWnd=FindWindow(class,NULL)) == NULL)){
00440 strcpy(modulename,gszHomeDir);strcat(modulename,program);
00441 result=WinExec(modulename,SW_SHOW);
00442 n=TRUE;
00443 if(result < 32){
00444 if(result == ERROR_FILE_NOT_FOUND ||
00445 result == ERROR_PATH_NOT_FOUND)SendPrgmQuery(IDQ_NOSTART,3);
00446 return;
00447 }
00448 if(class != NULL)hWnd=FindWindow(class,NULL);
00449 }
00450 if(hWnd != NULL && IsWindow(hWnd)){
00451 SetForegroundWindow(hWnd);
00452 BringWindowToTop(hWnd);
00453 ShowWindow(hWnd,SW_SHOW);
00454 if(n)PostMessage(hWnd,WM_COMMAND,message,0);
00455 }
00456 return;
00457 }
00458
00459 BOOL MakeVRMLScript(short type){
00460 return (BOOL)ExportScript(NULL,"vrmlx.dll");
00461 }
00462
00463 static long ExportScript(char *name, char *library){
00464 char lname[255];
00465 long rv=0;
00466 HMODULE hLib=NULL;
00467 FARPROC fpFun;
00468 ANI_STRUCTURE *Evs;
00469 long (*fpFun1)(HWND, char *, ANI_STRUCTURE *);
00470 Evs=&AniStructure;
00471 strcpy(lname,gszHomeDir); strcat(lname,library);
00472 if((hLib=LoadLibrary(lname)) != NULL){
00473 if((fpFun=GetProcAddress(hLib,"_Export")) != NULL){
00474 fpFun1 = (void *)fpFun;
00475 rv=(*fpFun1)(ghwnd_main,name,Evs);
00476 }
00477 else{
00478 SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00479 }
00480 FreeLibrary(hLib); hLib=NULL;
00481 }
00482 else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00483 return rv;
00484 }
00485
00486 void LogOnMessage(void){
00487 HMODULE hLib;
00488 FARPROC fpFun;
00489 char lname[256];
00490 int (*fpFun1)(HWND,int);
00491 int id,no_wait;
00492 if(Preferences.splash == 0)return;
00493 if(Preferences.default_start)no_wait = -1;
00494 else no_wait=Preferences.splash;
00495 strcpy(lname,gszHomeDir); strcat(lname,"splash.dll");
00496 if((hLib=LoadLibrary(lname)) != NULL){
00497 if((fpFun=GetProcAddress(hLib,"_PrgmLogon")) != NULL){
00498
00499 fpFun1 = (void *)fpFun;
00500 EnableToolPannels(ALL_PANNELS,FALSE);
00501 id=(*fpFun1)(ghwnd_main,no_wait);
00502 EnableToolPannels(ALL_PANNELS,TRUE);
00503 if(id < 1)PostQuitMessage(0);
00504 else if(id == 2)PostMessage(ghwnd_main,WM_COMMAND,
00505 IDM_FILE_LOAD_ANIMATION,0);
00506 else if(id == 3)PostMessage(ghwnd_main,WM_COMMAND,
00507 IDM_FILE_LOAD_TEMPLATE,0);
00508 else if(id == 4)PostMessage(ghwnd_main,WM_COMMAND,
00509 IDM_HELP_GENERAL,0);
00510 else if(id == 5)PostMessage(ghwnd_main,WM_COMMAND,
00511 IDM_FILE_MODELER,0);
00512 else if(id == 6)PostMessage(ghwnd_main,WM_COMMAND,
00513 IDM_FILE_LOAD_STARTUP,0);
00514 }
00515 FreeLibrary(hLib);
00516 }
00517 return;
00518 }