externals.c

Go to the documentation of this file.
00001 /* --
00002 OpenFX - Modelling, Animation and Rendering Package
00003 -- */
00004 
00005 
00006 /* file loader.c  - loads/saves the models from their files on disk  */
00007 
00008 #define MODULE_EXTERNAL 1
00009 
00010 #include "design.h"
00011 
00012 static void LoadRenderer(int anim);
00013 
00014 void LoadMDIviewer(void){
00015  BOOL n=FALSE;
00016  int result;
00017  char modulename[255];
00018  HWND hWnd;
00019  if((hWnd=FindWindow("OFX:Viewer",NULL)) == NULL){
00020    strcpy(modulename,gszHomeDir);strcat(modulename,"mdiview.exe");
00021    n=TRUE;
00022    result=WinExec(modulename,SW_SHOW);
00023    if(result < 32){
00024      if(result == ERROR_FILE_NOT_FOUND ||
00025         result == ERROR_PATH_NOT_FOUND)SendPrgmQuery(IDQ_NOSTART,3);
00026      return;
00027    }
00028    hWnd=FindWindow("OFX:Viewer",NULL);
00029  }
00030  if(IsWindow(hWnd)){
00031    SetForegroundWindow(hWnd);
00032    BringWindowToTop(hWnd);
00033    ShowWindow(hWnd,SW_SHOW);
00034    if(n)PostMessage(hWnd,WM_COMMAND,1004,0);
00035  }
00036  return;
00037 }
00038 
00039 
00040 BOOL LoadHeightField(HWND hwnd){
00041  BOOL status=FALSE;
00042  HMODULE hLib;
00043  FARPROC fpFun;
00044  char lname[256];
00045  X__STRUCTURE *Evs;
00046  BOOL (*fpFun1)(HWND, char *, X__STRUCTURE *);
00047  if(SelectSfxFileName(0,gszGIFfile,gszGIFdir,IDX_MISC_HEIGHTFIELD,
00048    "(*.GIF)|*.gif|",ghwnd_main) == FALSE)return FALSE;
00049  EDIT_ACTION=YES;
00050  Evs=&EviStructure;
00051  strcpy(lname,gszHomeDir); strcat(lname,"height.dll");
00052  if((hLib=LoadLibrary(lname)) != NULL){
00053    if((fpFun=GetProcAddress(hLib,"_HeightField")) != NULL){
00054      fpFun1 = (void *)fpFun;
00055      status=(*fpFun1)(hwnd,gszGIFfile,Evs);
00056    }
00057    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00058    FreeLibrary(hLib);
00059  }
00060  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00061  return status;
00062 }
00063 
00064 BOOL TraceImageOutline(HWND hwnd){
00065  BOOL status=FALSE;
00066  static HMODULE hLibTrace=NULL;
00067  FARPROC fpFun;
00068  char lname[256];
00069  X__STRUCTURE *Evs;
00070  BOOL (*fpFun1)(HWND, HWND, char *, X__STRUCTURE *);
00071  if(hLibTrace != NULL){
00072    return FALSE;
00073  }
00074  if(SelectSfxFileName(0,gszIMGfile,gszIMGdir,IDX_MISC_TRACE,
00075    "All Image Formats|*.bmp;*.gif;*.tga|"
00076    "(*.GIF)|*.gif|(*.TGA)|*.tga|(*.BMP)|*.bmp|",
00077    hwnd) == FALSE)return FALSE;
00078  EDIT_ACTION=YES;
00079  Evs=&EviStructure;
00080  strcpy(lname,gszHomeDir); strcat(lname,"trace.dll");
00081  if((hLibTrace=LoadLibrary(lname)) != NULL){
00082    if((fpFun=GetProcAddress(hLibTrace,"_TraceOutline")) != NULL){
00083      fpFun1 = (void *)fpFun;
00084      status=(*fpFun1)(hwnd,ghwnd_info,gszIMGfile,Evs);
00085    }
00086    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00087    FreeLibrary(hLibTrace);
00088  }
00089  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00090  hLibTrace=NULL;
00091  return status;
00092 }
00093 
00094 BOOL PaintMapOutline(HWND hwnd){ 
00095  BOOL status=FALSE;
00096  static HMODULE hLibTrace=NULL;
00097  FARPROC fpFun;
00098  char lname[256];
00099  unsigned char *pixels;
00100  long w,h,id;
00101  IMAGEMAP *map;
00102  RAMIMAGE *image;
00103  X__STRUCTURE *Evs;
00104  BOOL (*fpFun1)(HWND, HWND, unsigned char *, long, long, long, X__STRUCTURE *);
00105  if(hLibTrace != NULL){
00106    return FALSE;
00107  }
00108  if(nImaps < 1){ SendPrgmQuery(IDQ_NOBRUSH,0); return status; }
00109  else if(nImaps > 1){
00110   if((id=RequestMapID(ghwnd_main,"Select by Map",0)) < 0)return status;
00111  }
00112  else  id=0;
00113  map = &(iMap[id]);
00114  image = NULL;
00115  if(map->s == 1 && map->S != NULL && map->Type != ANIMBRUSH)image  = &(map->si);
00116  if(image == NULL)return status;
00117  if( !image->in_use && image->filename == NULL && 
00118          image->data == NULL && image->size == 0)return status;
00119  // Make a full pixel copy of the image map
00120  pixels=MakeFullMemoryImage(image,&w,&h);
00121 
00122  if(pixels == NULL){MessageBox(NULL,"Bad Image Make",NULL,MB_OK); return status; }
00123 
00124  EDIT_ACTION=YES;
00125  Evs=&EviStructure;
00126  strcpy(lname,gszHomeDir); strcat(lname,"paintmap.dll");
00127  if((hLibTrace=LoadLibrary(lname)) != NULL){
00128    if((fpFun=GetProcAddress(hLibTrace,"_PaintMap")) != NULL){
00129      fpFun1 = (void *)fpFun;
00130      status=(*fpFun1)(hwnd,ghwnd_info,pixels,w,h,id,Evs);
00131    }
00132    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00133    FreeLibrary(hLibTrace);
00134  }
00135  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00136  hLibTrace=NULL;
00137  X__Free(pixels);
00138  return status;
00139 }
00140 
00141 
00142 BOOL ExecuteExternalAction(int id,HWND hwnd){
00143  static BOOL inuse=FALSE;
00144  BOOL status=FALSE;
00145  HMODULE hLib;
00146  FARPROC fpFun;
00147  X__STRUCTURE *Evs;
00148  BOOL (*fpFun1)(HWND, HWND, X__STRUCTURE *);
00149  int l;
00150  char fname[255];
00151  if(tool > INZOOM)DisengageDesignerTool();
00152  if(sktool || SelectedBrush >= 0 || SelectedShader >= 0){
00153    SendPrgmQuery(IDQ_TOOLNOTFINISHED,0);
00154    return FALSE;
00155  }
00156  if(id >= nActionsList)return FALSE;
00157  Empty_Undo();
00158  EDIT_ACTION=YES;
00159  Save_Undo(2);
00160  strcpy(fname,ActionsList[id]);
00161  l=strlen(fname);
00162  fname[l-1]='l';
00163  fname[l-2]='l';
00164  fname[l-3]='d';
00165  if(inuse)return FALSE;
00166  inuse=TRUE;
00167  Evs=&EviStructure;
00168  if((hLib=LoadLibrary(fname)) != NULL){
00169    if((fpFun=GetProcAddress(hLib,"_Xmodeler")) != NULL){
00170      fpFun1 = (void *)fpFun;
00171      status=(*fpFun1)(hwnd,ghwnd_info,Evs);
00172    }
00173    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00174    FreeLibrary(hLib);
00175  }
00176  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00177  inuse=FALSE;
00178  return status;
00179  return TRUE;
00180 }
00181 
00182 BOOL ExecuteExternalModeler(HWND hwnd){
00183  long l;
00184  static BOOL inuse=FALSE;
00185  BOOL status=FALSE;
00186  HMODULE hLib;
00187  FARPROC fpFun;
00188  X__STRUCTURE *Evs;
00189  BOOL (*fpFun1)(HWND, HWND, X__STRUCTURE *);
00190  if(inuse)return FALSE;
00191  l=strlen(gszDLMfile);
00192  strcpy((gszDLMfile+l-3),"dfx");
00193  if(SelectSfxFileName(0,gszDLMfile,gszDLMdir,IDX_MISC_EXTMODELER,
00194    "(*.dfx)|*.dfx|",ghwnd_main) == FALSE)return FALSE;
00195  l=strlen(gszDLMfile);
00196  strcpy((gszDLMfile+l-3),"dll");
00197  inuse=TRUE;
00198  EDIT_ACTION=YES;
00199  Evs=&EviStructure;
00200  if((hLib=LoadLibrary(gszDLMfile)) != NULL){
00201    if((fpFun=GetProcAddress(hLib,"_Xmodeler")) != NULL){
00202      fpFun1 = (void *)fpFun;
00203      status=(*fpFun1)(hwnd,ghwnd_info,Evs);
00204    }
00205    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00206    FreeLibrary(hLib);
00207  }
00208  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00209  inuse=FALSE;
00210  return status;
00211 }
00212 
00213 BOOL ExecuteBezierModeler(HWND hwnd){
00214  char lname[256];
00215  static BOOL inuse=FALSE;
00216  BOOL status=FALSE;
00217  HMODULE hLib;
00218  FARPROC fpFun;
00219  X__STRUCTURE *Evs;
00220  BOOL (*fpFun1)(HWND, HWND, X__STRUCTURE *);
00221  if(inuse)return FALSE;
00222  inuse=TRUE;
00223  EDIT_ACTION=YES;
00224  Evs=&EviStructure;
00225  strcpy(lname,gszHomeDir); strcat(lname,"bezier.dll");
00226  if((hLib=LoadLibrary(lname)) != NULL){
00227    if((fpFun=GetProcAddress(hLib,"_BezierModeler")) != NULL){
00228      fpFun1 = (void *)fpFun;
00229      status=(*fpFun1)(hwnd,ghwnd_info,Evs);
00230    }
00231    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00232    FreeLibrary(hLib);
00233  }
00234  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00235  inuse=FALSE;
00236  return status;
00237 }
00238 
00239 long LoadXmodel(char *name, char *library){
00240  char lname[255],text[128];
00241  long rv=0;
00242  HMODULE hLib=NULL;
00243  FARPROC fpFun;
00244  X__STRUCTURE *Evs;
00245  long (*fpFun1)(HWND, char *, char *, X__STRUCTURE *);
00246  Evs=&EviStructure;
00247  strcpy(lname,gszHomeDir); strcat(lname,library);
00248  if((hLib=LoadLibrary(lname)) != NULL){
00249    if((fpFun=GetProcAddress(hLib,"_Convert")) != NULL){
00250      fpFun1 = (void *)fpFun;
00251      sprintf(lname,"%sW_$.mfx",TempPath);
00252      rv=(*fpFun1)(ghwnd_main,name,lname,Evs);
00253    }
00254    else{
00255      SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00256    }
00257    FreeLibrary(hLib); hLib=NULL;
00258  }
00259  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00260  if(rv > 0)LoadObject(lname,0);
00261  remove(lname);
00262  return rv;
00263 }
00264 
00265 void Export3DSmodel(HWND hwnd){
00266  if(SelectSfxFileName(1,gsz3DSfile,gsz3DSdir,IDX_MISC_EXPORT3DS,
00267    "(*.3DS)|*.3ds|",ghwnd_main) == FALSE)return;
00268  AppendFileExtension(gsz3DSfile,".3ds");
00269  ExportModel(gsz3DSfile,"3dsout.dll");
00270  return;
00271 }
00272 
00273 void ExportDXFmodel(HWND hwnd){
00274  if(SelectSfxFileName(1,gszDXFfile,gszDXFdir,IDX_MISC_EXPORTDXF,
00275    "(*.DXF)|*.dxf|",ghwnd_main) == FALSE)return;
00276  AppendFileExtension(gszDXFfile,".dxf");
00277  ExportModel(gszDXFfile,"dxfout.dll");
00278  return;
00279 }
00280 
00281 long ExportModel(char *name, char *library){
00282  char lname[255];
00283  long rv=0;
00284  HMODULE hLib=NULL;
00285  FARPROC fpFun;
00286  X__STRUCTURE *Evs;
00287  long (*fpFun1)(HWND, char *, X__STRUCTURE *);
00288  Evs=&EviStructure;
00289  strcpy(lname,gszHomeDir); strcat(lname,library);
00290  if((hLib=LoadLibrary(lname)) != NULL){
00291    if((fpFun=GetProcAddress(hLib,"_Export")) != NULL){
00292      fpFun1 = (void *)fpFun;
00293      rv=(*fpFun1)(ghwnd_main,name,Evs);
00294    }
00295    else{
00296      SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00297    }
00298    FreeLibrary(hLib); hLib=NULL;
00299  }
00300  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00301  return rv;
00302 }
00303 
00304 BOOL LoadInternalAction(char *library){
00305  char lname[128];
00306  static BOOL inuse=FALSE;
00307  BOOL status=FALSE;
00308  HMODULE hLib;
00309  FARPROC fpFun;
00310  X__STRUCTURE *Evs;
00311  BOOL (*fpFun1)(HWND, HWND, X__STRUCTURE *);
00312  if(tool > INZOOM)DisengageDesignerTool();
00313  if(sktool || SelectedBrush >= 0 || SelectedShader >= 0){
00314    SendPrgmQuery(IDQ_TOOLNOTFINISHED,0);
00315    return FALSE;
00316  }
00317  if(inuse)return FALSE;
00318  inuse=TRUE;
00319  Empty_Undo();
00320  EDIT_ACTION=YES;
00321  Save_Undo(2);
00322  Evs=&EviStructure;
00323  strcpy(lname,gszHomeDir); strcat(lname,library);
00324  if((hLib=LoadLibrary(lname)) != NULL){
00325    if((fpFun=GetProcAddress(hLib,"_Xmodeler")) != NULL){
00326      fpFun1 = (void *)fpFun;
00327      status=(*fpFun1)(ghwnd_main,ghwnd_info,Evs);
00328      DrawModel();
00329      UpdateCounters();
00330      UpdateSkTreeView();
00331    }
00332    else SendPrgmQuery(IDQ_FAILEDFUNCTION,3);
00333    FreeLibrary(hLib);
00334  }
00335  else SendPrgmQuery(IDQ_FAILEDLIBRARY,3);
00336  inuse=FALSE;
00337  return TRUE;
00338 }
00339 
00340 // include the loadviewer code - this is used by the animator and so
00341 // is in a separate file
00342 
00343 #include "loadview.c"
00344 
00345 // invoke the external plugins through their dialog boxes
00346 
00347 #include "..\animate\callall.h"
00348 
00349 static void LoadRenderer(int anim){
00350  char modulename[256];
00351  HWND hWnd,hWndCall;
00352  int result;
00353  if((hWnd=FindWindow("OFX:RenderClass",NULL)) != NULL){
00354    if     (anim == 1)
00355      PostMessage(hWnd,WM_COMMAND,IDM_CALLBACK_SETUP_PREVIEW,0);
00356    else if(anim == 2)
00357      PostMessage(hWnd,WM_COMMAND,IDM_CALLBACK_RUN,(WORD)1);
00358    else if(anim == 3){
00359      if(ghwndOpenGLview == NULL)hWndCall=ghwnd_view;
00360      else                       hWndCall=ghwndOpenGLview;
00361      PostMessage(hWnd,WM_CALLBACK_MATERIAL,0,(LPARAM)hWndCall);
00362    }
00363    else
00364      SendMessage(hWnd,IDM_CALLBACK_SETUP_MODELLER,0,0);
00365    if(anim != 3){
00366      SetForegroundWindow(hWnd);
00367      BringWindowToTop(hWnd);
00368      ShowWindow(hWnd,SW_SHOW);
00369    }
00370    return;
00371  }
00372  else{
00373    strcpy(modulename,gszHomeDir);strcat(modulename,"render.exe $SAL$");
00374    result=WinExec(modulename,SW_SHOW);
00375    if(result < 32){
00376      if(result == ERROR_FILE_NOT_FOUND ||
00377         result == ERROR_PATH_NOT_FOUND)SendPrgmQuery(IDQ_NOSTART,3);
00378    }
00379    if((hWnd=FindWindow("OFX:RenderClass",NULL)) != NULL){
00380      if     (anim == 1)
00381        PostMessage(hWnd,WM_COMMAND,IDM_CALLBACK_SETUP_PREVIEW,0);
00382      else if(anim == 2)
00383        PostMessage(hWnd,WM_COMMAND,IDM_CALLBACK_RUN,(WORD)1);
00384      else if(anim == 3){
00385        if(ghwndOpenGLview == NULL)hWndCall=ghwnd_view;
00386        else                       hWndCall=ghwndOpenGLview;
00387        PostMessage(hWnd,WM_CALLBACK_MATERIAL,0,(LPARAM)hWndCall);
00388      }
00389      else
00390        PostMessage(hWnd,IDM_CALLBACK_SETUP_MODELLER,0,0);
00391      if(anim != 3){
00392        SetForegroundWindow(hWnd);
00393        BringWindowToTop(hWnd);
00394        ShowWindow(hWnd,SW_SHOW);
00395      }
00396    }
00397    else SendPrgmQuery(IDQ_NOSTART,3);
00398  }
00399  return;
00400 }
00401 
00402 void Render_View(int light_pos, long how){
00403  char config_file[64],SCRIPTfilename[256],OBJECTfilename[256];
00404  long i,narg;
00405  FILE *fs,*fc;
00406  HCURSOR lhcurSave;
00407  double lpx,lpy,lpz,rad,dr,llpx,llpy,llpz,Fi,Theta;
00408  if(type_of_view){
00409    Fi = PerspFi; Theta = -PerspTheta;
00410  }
00411  else{
00412    Fi = -PerspFi; Theta = PerspTheta;
00413  }
00414  dr=PI/180.0;
00415  sprintf(OBJECTfilename,"%sW_$.mfx",TempPath);
00416  remove(OBJECTfilename);
00417  lhcurSave=SetCursor(ghcurWait);
00418  SaveObject(OBJECTfilename,2);    // 2 for saving only in window-box
00419  SetCursor(lhcurSave);
00420  sprintf(SCRIPTfilename,"%sW_$.scr",TempPath);
00421  if((fs=fopen(SCRIPTfilename,"w")) == NULL){
00422    remove(OBJECTfilename);
00423    return;
00424  }
00425  fprintf(fs,"Renderer-Script\n");
00426  fprintf(fs,"1 1\n");
00427  lpx=(double)(TVpointX+TVsizeX/2);
00428  lpy=(double)(TVpointY+TVsizeY/2);
00429  lpz=(double)(TVpointZ+TVsizeZ/2);
00430  rad=TVsizeX*5;
00431  llpx = lpx-rad*10.0*cos(-(Theta+30)*dr)*sin(-(Fi+45)*dr);
00432  llpy = lpy-rad*10.0*cos(-(Theta+30)*dr)*cos(-(Fi+45)*dr);
00433  llpz = lpz-rad*10.0*sin(-(Theta+30)*dr);
00434  lpx -= rad*cos(-Theta*dr)*sin(-Fi*dr);
00435  lpy -= rad*cos(-Theta*dr)*cos(-Fi*dr);
00436  lpz -= rad*sin(-Theta*dr);
00437  fprintf(fs,"e %.1f %.1f %.1f\n",lpx,lpy,lpz);
00438  fprintf(fs,"  %.1f %.1f %.1f\n",Fi,0.0,-Theta);
00439  fprintf(fs,"  %.3f %.3f %.3f\n",3.5,3.5,3.5); /* 3.5 3.0 3.0 */
00440  fprintf(fs,"  %d %d %.1f\n",0,0,0.0);
00441 #if 0
00442  if(light_pos == 0){ /* light over shoulder */
00443    fprintf(fs,"l 0\n  255 255 255 1.0\n");
00444    fprintf(fs,"  %.1f %.1f %.1f\n",llpx,llpy,llpz);
00445    fprintf(fs,"  0.0 0.0 0.0\n 0 0 0.0\n");
00446    fprintf(fs,"  0 1.0 0.0 0.0\n");
00447  }
00448 #endif
00449  fprintf(fs,"s %ld %ld %ld\n",
00450          (long)Preferences.Vcolour[0],
00451          (long)Preferences.Vcolour[1],
00452          (long)Preferences.Vcolour[2]);
00453  fprintf(fs,"  %ld %ld %ld\n",
00454          (long)Preferences.Vcolour[0],
00455          (long)Preferences.Vcolour[1],
00456          (long)Preferences.Vcolour[2]);
00457  fprintf(fs," 0.0 0.1 0.08\n");
00458  fprintf(fs," 0 0 0\n");
00459  fprintf(fs," 0 0 0\n");
00460  fprintf(fs," 0\n");
00461  fprintf(fs,"o 1\n");
00462  fprintf(fs,"%s\n",OBJECTfilename);
00463  fprintf(fs,"0\n");
00464  fprintf(fs,"  %.1f %.1f %.1f\n",0.0,0.0,0.0);
00465  fprintf(fs,"  %.1f %.1f %.1f\n",0.0,0.0,0.0);
00466  fprintf(fs,"  %.3f %.3f %.3f\n",1.0,1.0,1.0);
00467  fprintf(fs,"  %d %d %.1f %d %.3f\n",0,0,0.0,0,1.0);
00468  fprintf(fs,"  1 1 1\n");
00469  fprintf(fs,"f\n");
00470  fprintf(fs,"q\n");
00471  fclose(fs);
00472  sprintf(SCRIPTfilename,"%sW_$",TempPath);
00473  if     (how == 1)LoadRenderer(2);   // Quick render with prev params
00474  else if(how == 0){                  // Setup renderer
00475    LoadRenderer(0);
00476    EnableMenuItem(GetMenu(ghwnd_main),IDM_VIEW_RENDERNOW,MF_ENABLED);
00477  }
00478  else if(how == 2)LoadRenderer(3);   // render into window
00479  return;
00480 }
00481 
00482 void ShaderPreview(void){ // NOT used now
00483   LoadRenderer(1);
00484 }
00485 
00486 
Generated on Tue Jan 28 06:18:25 2014 for OpenFX by  doxygen 1.6.3