fplasma.c

Go to the documentation of this file.
00001 /* --
00002 OpenFX version 2.0 - Modelling, Animation and Rendering Package
00003 Copyright (C) 2000 - 2007 OpenFX Development Team
00004 -- */
00005 
00006 // fplasma.c
00007 
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010 #include <math.h>
00011 #include <float.h>
00012 #include <windows.h>
00013 #include <gl/gl.h>
00014 
00015 #if __ZTC__ || __SC__
00016 #ifndef max
00017 #define max(a,b)  ( ((a) > (b)) ? (a) : (b) )
00018 #endif
00019 #endif
00020 
00021 #if __WATCOMC__
00022 #define PI 3.1415926
00023 #endif
00024 
00025 #if __X__MIPS__
00026 BOOL WINAPI _CRT_INIT(HINSTANCE ,DWORD , LPVOID );
00027 #endif
00028 
00029 static HINSTANCE hDLLinstance=NULL;
00030 
00031 #include "..\animate\memory.h" /* for memory definition */
00032 #include "..\animate\memdef.h" /* local names           */
00033 #include "defines.h"
00034 #include "rstruct.h"
00035 #include "fplasma.h"
00036 
00037 #if __WATCOMC__
00038 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00039 #else
00040 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00041 #endif
00042   HANDLE ghMod;
00043   switch (dwReason) {
00044     case DLL_PROCESS_ATTACH:
00045 #if __X__MIPS__
00046       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00047 #endif
00048       hDLLinstance = hDLL;  /* handle to DLL file */
00049       break;
00050     case DLL_PROCESS_DETACH:
00051 #if __X__MIPS__
00052       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00053 #endif
00054       break;
00055   }
00056   return (int)TRUE;
00057 }
00058 
00059 static double red_freq=5.0,green_freq=6.0,   blue_freq=7.0;
00060 static double red_phas=0.0,green_phas=0.333333333,blue_phas=0.66666666;
00061 static double x=1.0,y=1.0,z=1.0;
00062 static double brite=255.0;
00063 
00064 #if 0
00065 long CALLBACK ExternalTextureStartup(
00066 #else
00067 long _ExternalTextureStartup(
00068 #endif
00069   long frame,long nframes,char *parameter_list, X__SHADER *lpEVI){
00070  if(parameter_list[0] != '#'){
00071    MessageBox ( GetFocus(),
00072                 (LPCTSTR) "External texture: Startup",
00073                 (LPCTSTR) "Parameter list missing",
00074                 MB_OK | MB_SYSTEMMODAL );
00075  }
00076  else {
00077   parameter_list++;
00078   sscanf(parameter_list,"%f %f %f  %f  %f %f %f  %f %f %f",
00079          &x,&y,&z,&brite,
00080          &red_freq,&green_freq,&blue_freq,
00081          &red_phas,&green_phas,&blue_phas);
00082  }
00083  return LoadAndCompileShader("fplasma");
00084 }
00085 
00086 #if 0
00087 long CALLBACK ExternalTextureMorph(
00088 #else
00089 long _ExternalTextureMorph(
00090 #endif
00091  char *parameter_list, double mr){
00092  double red_freq_m,green_freq_m,blue_freq_m;
00093  double red_phas_m,green_phas_m,blue_phas_m;
00094  double x_m,y_m,z_m;
00095  double brite_m;
00096  parameter_list++;
00097  sscanf(parameter_list,"%f %f %f  %f  %f %f %f  %f %f %f",
00098         &x_m,&y_m,&z_m,&brite_m,
00099         &red_freq_m,&green_freq_m,&blue_freq_m,
00100         &red_phas_m,&green_phas_m,&blue_phas_m);
00101  x=x_m+(x-x_m)*mr;
00102  y=y_m+(y-y_m)*mr;
00103  z=z_m+(z-z_m)*mr;
00104  brite=brite_m+(brite-brite_m)*mr;
00105  red_freq=red_freq_m+(red_freq-red_freq_m)*mr;
00106  green_freq=green_freq_m+(green_freq-green_freq_m)*mr;
00107  blue_freq=blue_freq_m+(blue_freq-blue_freq_m)*mr;
00108  red_phas=red_phas_m+(red_phas-red_phas_m)*mr;
00109  green_phas=green_phas_m+(green_phas-green_phas_m)*mr;
00110  blue_phas=blue_phas_m+(blue_phas-blue_phas_m)*mr;
00111  return 1;
00112 }
00113 
00114 double costab(double value){
00115   if (value < 0.0)return 0.0;
00116   return 0.5*(1.0+cos((value-floor(value))*3.141592657*2));
00117 }
00118 
00119 
00120 #if 0
00121 long CALLBACK ExternalTextureProcedure(
00122 #else
00123 long _ExternalTextureProcedure(
00124 #endif
00125   long coord_type,  vector p, vector n,
00126   double alpha, double beta, double gamma,
00127   double bump,  double map_x,  double map_y,
00128   double *alpha_channel, unsigned char sc[3], double colour[3],
00129   double *reflectivity, double *transparency,
00130   X__SHADER *lpEVI
00131 ){
00132  vector v;
00133  double xx,yy,zz,noiseH,r,g,b,noiseHH;
00134  xx=alpha / x;
00135  yy=beta  / y;
00136  zz=gamma / z;
00137  vNoise(v,
00138  ((double)((int)(xx*4)))/4.0,
00139  ((double)((int)(yy*4)))/4.0,
00140  ((double)((int)(zz*4)))/4.0);
00141  xx += v[0]; yy += v[1]; zz += v[2];
00142  nNoise(xx, yy, zz, &noiseH);
00143  nNoise(xx*0.5, yy*0.5, zz*0.5,&noiseHH);
00144  noiseH += noiseHH;
00145  nNoise(xx*0.25, yy*0.25, zz*0.25, &noiseHH);
00146  noiseH += noiseHH;
00147  r = costab(noiseH*red_freq+red_phas);             // * freq  + phase
00148  g = costab(noiseH*green_freq+green_phas);
00149  b = costab(noiseH*blue_freq+blue_phas);
00150  colour[0]  = r * brite;
00151  colour[1]  = g * brite;
00152  colour[2]  = b * brite;
00153  return 1;
00154 }
00155 
00156 void _ExternalTextureClose(X__SHADER *lpEVI){
00157  UnloadCompiledShader(tGLshaderID);
00158 }
00159 
00160 long _ExternalTextureProcedureGL(
00161   double bump_scale,
00162   unsigned char sc[3],
00163   unsigned char ac[3],
00164   X__SHADER *lpEVI
00165 ){
00166  SetUniformVector(tGLshaderID,"MaterialC",(GLfloat)ac[0]/255.0,(GLfloat)ac[1]/255.0,(GLfloat)ac[2]/255.0);
00167  // Callback to Render the Polygons - this allows for multiple passes - through same shaders
00168  // possibly with different parameters - including vertex offset - blending depth enabling 
00169  // to allow for multipass textures e.g. hair and fur (shell model) it's arguments must not be altered!!!
00170  DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00171  return 1;
00172 }
00174 
00175 void CentreDialogOnScreen(HWND hwnd){
00176  RECT rcDlg;
00177  long Xres,Yres;
00178  Yres=GetSystemMetrics(SM_CYSCREEN);
00179  Xres=GetSystemMetrics(SM_CXSCREEN);
00180  GetWindowRect(hwnd,&rcDlg);
00181  OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00182  OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00183  SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00184  return;
00185 }
00186 
00187 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00188 
00189 #if 0
00190 char * CALLBACK SetExternalParameters(
00191 #else
00192 char * _SetExternalParameters(
00193 #endif
00194   char *Op,                 /* string for the parameters                  */
00195   HWND hWnd,                /* parent window                              */
00196   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00197                              ){
00198  char szbuf[255],*Op1;
00199  if(Op != NULL){  /* parameters exist so read them off the list */
00200    Op1=Op;
00201    Op1++;
00202    sscanf(Op1,"%f %f %f  %f  %f %f %f  %f %f %f",
00203          &x,&y,&z,&brite,
00204          &red_freq,&green_freq,&blue_freq,
00205          &red_phas,&green_phas,&blue_phas);
00206  }
00207  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00208               (DLGPROC)DlgProc) == FALSE)return Op;
00209  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00210  sprintf(szbuf,"# %.2f %.2f %.2f  %.2f  %.2f %.2f %.2f  %.6f %.6f %.6f ",
00211          x,y,z,brite,
00212          red_freq,green_freq,blue_freq,
00213          red_phas,green_phas,blue_phas);
00214  if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00215   MessageBox (GetFocus(),"External shader: Out of memory","Error",
00216                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00217    return NULL;
00218  }
00219  strcpy(Op,szbuf);
00220  return Op;
00221 }
00222 
00223 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00224  char str[16];
00225  double scale=120.0*3.0;
00226  switch( msg ) {
00227    case WM_INITDIALOG:
00228      sprintf(str,"%.2f",x);
00229      SendDlgItemMessage(hwnd,DLG_XSCALE,WM_SETTEXT,0,(LPARAM)str);
00230      SendDlgItemMessage(hwnd,DLG_XSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00231      sprintf(str,"%.2f",y);
00232      SendDlgItemMessage(hwnd,DLG_YSCALE,WM_SETTEXT,0,(LPARAM)str);
00233      SendDlgItemMessage(hwnd,DLG_YSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00234      sprintf(str,"%.2f",z);
00235      SendDlgItemMessage(hwnd,DLG_ZSCALE,WM_SETTEXT,0,(LPARAM)str);
00236      SendDlgItemMessage(hwnd,DLG_ZSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00237      sprintf(str,"%.2f",brite);
00238      SendDlgItemMessage(hwnd,DLG_BRITE,WM_SETTEXT,0,(LPARAM)str);
00239      sprintf(str,"%.1f",red_freq);
00240      SendDlgItemMessage(hwnd,DLG_RED_FREQ,WM_SETTEXT,0,(LPARAM)str);
00241      sprintf(str,"%.1f",green_freq);
00242      SendDlgItemMessage(hwnd,DLG_GREEN_FREQ,WM_SETTEXT,0,(LPARAM)str);
00243      sprintf(str,"%.1f",blue_freq);
00244      SendDlgItemMessage(hwnd,DLG_BLUE_FREQ,WM_SETTEXT,0,(LPARAM)str);
00245      sprintf(str,"%.1f",red_phas*scale);
00246      SendDlgItemMessage(hwnd,DLG_RED_PHAS,WM_SETTEXT,0,(LPARAM)str);
00247      sprintf(str,"%.1f",green_phas*scale);
00248      SendDlgItemMessage(hwnd,DLG_GREEN_PHAS,WM_SETTEXT,0,(LPARAM)str);
00249      sprintf(str,"%.1f",blue_phas*scale);
00250      SendDlgItemMessage(hwnd,DLG_BLUE_PHAS,WM_SETTEXT,0,(LPARAM)str);
00251      CentreDialogOnScreen(hwnd);
00252      return TRUE;
00253    case WM_COMMAND:
00254      switch(LOWORD(wparam)){
00255         case IDCANCEL:
00256           EndDialog(hwnd,FALSE);
00257           return(TRUE);
00258         case IDOK:
00259           if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00260              EndDialog(hwnd,FALSE);
00261           if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00262           if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00263              EndDialog(hwnd,FALSE);
00264           if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00265           if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00266              EndDialog(hwnd,FALSE);
00267           if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00268           if(GetDlgItemText(hwnd,DLG_BRITE,str,10) == 0)
00269              EndDialog(hwnd,FALSE);
00270           if((brite=atof(str)) == 0)EndDialog(hwnd,FALSE);
00271           if(GetDlgItemText(hwnd,DLG_RED_FREQ,str,10) == 0)
00272              EndDialog(hwnd,FALSE);
00273           if((red_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00274           if(GetDlgItemText(hwnd,DLG_GREEN_FREQ,str,10) == 0)
00275              EndDialog(hwnd,FALSE);
00276           if((green_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00277           if(GetDlgItemText(hwnd,DLG_BLUE_FREQ,str,10) == 0)
00278              EndDialog(hwnd,FALSE);
00279           if((blue_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00280 
00281          if(GetDlgItemText(hwnd,DLG_RED_PHAS,str,10) == 0)
00282              EndDialog(hwnd,FALSE);
00283           red_phas=atof(str)/scale;
00284           if(GetDlgItemText(hwnd,DLG_GREEN_PHAS,str,10) == 0)
00285              EndDialog(hwnd,FALSE);
00286           green_phas=atof(str)/scale;
00287           if(GetDlgItemText(hwnd,DLG_BLUE_PHAS,str,10) == 0)
00288              EndDialog(hwnd,FALSE);
00289           blue_phas=atof(str)/scale;
00290 
00291           EndDialog(hwnd,TRUE);
00292           return(TRUE);
00293         default:
00294           break;
00295       }
00296       break;
00297     default: break;
00298  }
00299  return FALSE;
00300 }
00301 
Generated on Tue Jan 28 06:18:32 2014 for OpenFX by  doxygen 1.6.3