plasma.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 // plasma.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 "plasma.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 static int ShaderProgramID = -1;
00065 
00066 #if 0
00067 long CALLBACK ExternalTextureStartup(
00068 #else
00069 long _ExternalTextureStartup(
00070 #endif
00071   long frame,long nframes,char *parameter_list, X__SHADER *lpEVI
00072 ){
00073  if(parameter_list[0] != '#'){
00074    MessageBox ( GetFocus(),
00075                 (LPCTSTR) "External texture: Startup",
00076                 (LPCTSTR) "Parameter list missing",
00077                 MB_OK | MB_SYSTEMMODAL );
00078  }
00079  else {
00080   parameter_list++;
00081   sscanf(parameter_list,"%f %f %f  %f  %f %f %f  %f %f %f",
00082          &x,&y,&z,&brite,
00083          &red_freq,&green_freq,&blue_freq,
00084          &red_phas,&green_phas,&blue_phas);
00085  }
00086  if(lpEVI->fp_LoadAndCompileShader == NULL)MessageBox(NULL,"NULL Compile",NULL,MB_OK);
00087  ShaderProgramID=LoadAndCompileShader("plasma");
00088  return ShaderProgramID;
00089 }
00090 
00091 #if 0
00092 long CALLBACK ExternalTextureMorph(
00093 #else
00094 long _ExternalTextureMorph(
00095 #endif
00096  char *parameter_list, double mr){
00097  double red_freq_m,green_freq_m,blue_freq_m;
00098  double red_phas_m,green_phas_m,blue_phas_m;
00099  double x_m,y_m,z_m;
00100  double brite_m;
00101  parameter_list++;
00102  sscanf(parameter_list,"%f %f %f  %f  %f %f %f  %f %f %f",
00103         &x_m,&y_m,&z_m,&brite_m,
00104         &red_freq_m,&green_freq_m,&blue_freq_m,
00105         &red_phas_m,&green_phas_m,&blue_phas_m);
00106  x=x_m+(x-x_m)*mr;
00107  y=y_m+(y-y_m)*mr;
00108  z=z_m+(z-z_m)*mr;
00109  brite=brite_m+(brite-brite_m)*mr;
00110  red_freq=red_freq_m+(red_freq-red_freq_m)*mr;
00111  green_freq=green_freq_m+(green_freq-green_freq_m)*mr;
00112  blue_freq=blue_freq_m+(blue_freq-blue_freq_m)*mr;
00113  red_phas=red_phas_m+(red_phas-red_phas_m)*mr;
00114  green_phas=green_phas_m+(green_phas-green_phas_m)*mr;
00115  blue_phas=blue_phas_m+(blue_phas-blue_phas_m)*mr;
00116  return 1;
00117 }
00118 
00119 double costab(double value){
00120   if (value < 0.0)return 0.0;
00121   return 0.5*(1.0+cos((value-floor(value))*3.141592657*2));
00122 }
00123 
00124 
00125 #if 0
00126 long CALLBACK ExternalTextureProcedure(
00127 #else
00128 long _ExternalTextureProcedure(
00129 #endif
00130   long coord_type,  vector p, vector n,
00131   double alpha, double beta, double gamma,
00132   double bump,  double map_x,  double map_y,
00133   double *alpha_channel, unsigned char sc[3], double colour[3],
00134   double *reflectivity, double *transparency,
00135   X__SHADER *lpEVI
00136 ){
00137  double xx,yy,zz,noiseH,r,g,b,noiseHH;
00138  xx=alpha / x;
00139  yy=beta  / y;
00140  zz=gamma / z;
00141  nNoise(xx, yy, zz,&noiseH);
00142  nNoise(xx*0.5, yy*0.5, zz*0.5, &noiseHH);
00143  noiseH += noiseHH;
00144  nNoise(xx*0.25, yy*0.25, zz*0.25,&noiseHH);
00145  noiseH += noiseHH;
00146  r = costab(noiseH*red_freq+red_phas);             // * freq  + phase
00147  g = costab(noiseH*green_freq+green_phas);
00148  b = costab(noiseH*blue_freq+blue_phas);
00149  colour[0]  = r * brite;
00150  colour[1]  = g * brite;
00151  colour[2]  = b * brite;
00152  return 1;
00153 }
00154 
00155 #if 0
00156 void CALLBACK ExternalTextureClose( X__SHADER *lpEVI){
00157 #else
00158 void _ExternalTextureClose( X__SHADER *lpEVI){
00159 #endif
00160 if(tGLshaderID != ShaderProgramID)MessageBox(NULL,"Bad match12",NULL,MB_OK);
00161  UnloadCompiledShader(ShaderProgramID);
00162 }
00163 
00165 #if 0
00166 long CALLBACK ExternalTextureProcedureGL(
00167 #else
00168 long _ExternalTextureProcedureGL(
00169 #endif
00170   double bump_scale,
00171   unsigned char sc[3],
00172   unsigned char ac[3],
00173   X__SHADER *lpEVI
00174 ){
00175  // Set any shader specific uniform variables here.
00176  if(tGLshaderID != ShaderProgramID)MessageBox(NULL,"Bad match1",NULL,MB_OK);
00177  SetUniformVector(ShaderProgramID,"MaterialC",(GLfloat)ac[0]/255.0,(GLfloat)ac[1]/255.0,(GLfloat)ac[2]/255.0);
00178  // Callback to Render the Polygons - this allows for multiple passes - through same shaders
00179  // possibly with different parameters - including vertex offset - blending depth enabling 
00180  // to allow for multipass textures e.g. hair and fur (shell model) it's arguments must not be altered!!!
00181  DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00182  return 1;
00183 }
00185 
00186 void CentreDialogOnScreen(HWND hwnd){
00187  RECT rcDlg;
00188  long Xres,Yres;
00189  Yres=GetSystemMetrics(SM_CYSCREEN);
00190  Xres=GetSystemMetrics(SM_CXSCREEN);
00191  GetWindowRect(hwnd,&rcDlg);
00192  OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00193  OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00194  SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00195  return;
00196 }
00197 
00198 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00199 
00200 #if 0
00201 char * CALLBACK SetExternalParameters(
00202 #else
00203 char * _SetExternalParameters(
00204 #endif
00205   char *Op,                 /* string for the parameters                  */
00206   HWND hWnd,                /* parent window                              */
00207   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00208                              ){
00209  char szbuf[255],*Op1;
00210  if(Op != NULL){  /* parameters exist so read them off the list */
00211    Op1=Op;
00212    Op1++;
00213    sscanf(Op1,"%f %f %f  %f  %f %f %f  %f %f %f",
00214          &x,&y,&z,&brite,
00215          &red_freq,&green_freq,&blue_freq,
00216          &red_phas,&green_phas,&blue_phas);
00217  }
00218  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00219               (DLGPROC)DlgProc) == FALSE)return Op;
00220  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00221  sprintf(szbuf,"# %.2f %.2f %.2f  %.2f  %.2f %.2f %.2f  %.6f %.6f %.6f ",
00222          x,y,z,brite,
00223          red_freq,green_freq,blue_freq,
00224          red_phas,green_phas,blue_phas);
00225  if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00226   MessageBox (GetFocus(),"External shader: Out of memory","Error",
00227                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00228    return NULL;
00229  }
00230  strcpy(Op,szbuf);
00231  return Op;
00232 }
00233 
00234 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00235  char str[16];
00236  double scale=120.0*3.0;
00237  switch( msg ) {
00238    case WM_INITDIALOG:
00239      sprintf(str,"%.2f",x);
00240      SendDlgItemMessage(hwnd,DLG_XSCALE,WM_SETTEXT,0,(LPARAM)str);
00241      SendDlgItemMessage(hwnd,DLG_XSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00242      sprintf(str,"%.2f",y);
00243      SendDlgItemMessage(hwnd,DLG_YSCALE,WM_SETTEXT,0,(LPARAM)str);
00244      SendDlgItemMessage(hwnd,DLG_YSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00245      sprintf(str,"%.2f",z);
00246      SendDlgItemMessage(hwnd,DLG_ZSCALE,WM_SETTEXT,0,(LPARAM)str);
00247      SendDlgItemMessage(hwnd,DLG_ZSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00248      sprintf(str,"%.2f",brite);
00249      SendDlgItemMessage(hwnd,DLG_BRITE,WM_SETTEXT,0,(LPARAM)str);
00250      sprintf(str,"%.1f",red_freq);
00251      SendDlgItemMessage(hwnd,DLG_RED_FREQ,WM_SETTEXT,0,(LPARAM)str);
00252      sprintf(str,"%.1f",green_freq);
00253      SendDlgItemMessage(hwnd,DLG_GREEN_FREQ,WM_SETTEXT,0,(LPARAM)str);
00254      sprintf(str,"%.1f",blue_freq);
00255      SendDlgItemMessage(hwnd,DLG_BLUE_FREQ,WM_SETTEXT,0,(LPARAM)str);
00256      sprintf(str,"%.1f",red_phas*scale);
00257      SendDlgItemMessage(hwnd,DLG_RED_PHAS,WM_SETTEXT,0,(LPARAM)str);
00258      sprintf(str,"%.1f",green_phas*scale);
00259      SendDlgItemMessage(hwnd,DLG_GREEN_PHAS,WM_SETTEXT,0,(LPARAM)str);
00260      sprintf(str,"%.1f",blue_phas*scale);
00261      SendDlgItemMessage(hwnd,DLG_BLUE_PHAS,WM_SETTEXT,0,(LPARAM)str);
00262      CentreDialogOnScreen(hwnd);
00263      return TRUE;
00264    case WM_COMMAND:
00265      switch(LOWORD(wparam)){
00266         case IDCANCEL:
00267           EndDialog(hwnd,FALSE);
00268           return(TRUE);
00269         case IDOK:
00270           if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00271              EndDialog(hwnd,FALSE);
00272           if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00273           if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00274              EndDialog(hwnd,FALSE);
00275           if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00276           if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00277              EndDialog(hwnd,FALSE);
00278           if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00279           if(GetDlgItemText(hwnd,DLG_BRITE,str,10) == 0)
00280              EndDialog(hwnd,FALSE);
00281           if((brite=atof(str)) == 0)EndDialog(hwnd,FALSE);
00282           if(GetDlgItemText(hwnd,DLG_RED_FREQ,str,10) == 0)
00283              EndDialog(hwnd,FALSE);
00284           if((red_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00285           if(GetDlgItemText(hwnd,DLG_GREEN_FREQ,str,10) == 0)
00286              EndDialog(hwnd,FALSE);
00287           if((green_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00288           if(GetDlgItemText(hwnd,DLG_BLUE_FREQ,str,10) == 0)
00289              EndDialog(hwnd,FALSE);
00290           if((blue_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00291 
00292          if(GetDlgItemText(hwnd,DLG_RED_PHAS,str,10) == 0)
00293              EndDialog(hwnd,FALSE);
00294           red_phas=atof(str)/scale;
00295           if(GetDlgItemText(hwnd,DLG_GREEN_PHAS,str,10) == 0)
00296              EndDialog(hwnd,FALSE);
00297           green_phas=atof(str)/scale;
00298           if(GetDlgItemText(hwnd,DLG_BLUE_PHAS,str,10) == 0)
00299              EndDialog(hwnd,FALSE);
00300           blue_phas=atof(str)/scale;
00301 
00302           EndDialog(hwnd,TRUE);
00303           return(TRUE);
00304         default:
00305           break;
00306       }
00307       break;
00308     default: break;
00309  }
00310  return FALSE;
00311 }
00312 
Generated on Tue Jan 28 06:18:32 2014 for OpenFX by  doxygen 1.6.3