caustic.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 //    CAUSTIC.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 // to use texture unit 5 include this code
00016 #include <fcntl.h>  
00017 #define __gl2_main_
00018 #include "..\gl2.h"
00019 #define PADDR(functype,funcname) (funcname = (functype) wglGetProcAddress( #funcname ))
00020 GLuint g_texture = 0;
00021 //
00022 
00023 #if __ZTC__ || __SC__
00024 #ifndef max
00025 #define max(a,b)  ( ((a) > (b)) ? (a) : (b) )
00026 #endif
00027 #endif
00028 
00029 #if __WATCOMC__
00030 #define PI 3.1415926
00031 #endif
00032 
00033 #if __X__MIPS__
00034 BOOL WINAPI _CRT_INIT(HINSTANCE ,DWORD , LPVOID );
00035 #endif
00036 
00037 static HINSTANCE hDLLinstance=NULL;
00038 
00039 #include "..\animate\memory.h" /* for memory definition */
00040 #include "..\animate\memdef.h" /* local names           */
00041 #include "defines.h"
00042 #include "rstruct.h"
00043 #include "caustic.h"
00044 
00045 double triangle(double value){
00046   register double offset;
00047   if (value >= 0.0) offset = value - floor(value);
00048   else offset = value - (-1.0 - floor(fabs(value)));
00049   if (offset >= 0.5) return (2.0 * (1.0 - offset));
00050   else return (2.0 * offset);
00051 }
00052 
00053 #if __WATCOMC__
00054 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00055 #else
00056 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00057 #endif
00058   HANDLE ghMod;
00059   switch (dwReason) {
00060     case DLL_PROCESS_ATTACH:
00061 #if __X__MIPS__
00062       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00063 #endif
00064       hDLLinstance = hDLL;  /* handle to DLL file */
00065       break;
00066     case DLL_PROCESS_DETACH:
00067 #if __X__MIPS__
00068       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00069 #endif
00070       break;
00071   }
00072   return (int)TRUE;
00073 }
00074 
00075 #if __SC__
00076 #pragma startaddress(DllMain)
00077 #endif
00078 
00079 static double sharpness=0.0,coverage=0.8;
00080 static double c1[3]={255.0,255.0,255.0};
00081 static double x=1.0,y=1.0,z=1.0;
00082 
00083 
00084 #if 0
00085 long CALLBACK ExternalTextureStartup(
00086 #else
00087 long _ExternalTextureStartup(
00088 #endif
00089   long frame,long nframes,char *parameter_list, X__SHADER *lpEVI){
00090  long result;
00091  if(parameter_list[0] != '#'){
00092    MessageBox ( GetFocus(),
00093                 (LPCTSTR) "External texture: Startup",
00094                 (LPCTSTR) "Parameter list missing",
00095                 MB_OK | MB_SYSTEMMODAL );
00096  }
00097  else {
00098   parameter_list++;
00099   sscanf(parameter_list,"%f %f %f  %f %f  %f %f %f",
00100          &x,&y,&z,&coverage,&sharpness,
00101          &c1[0],&c1[1],&c1[2]);
00102  }
00103  result=LoadAndCompileShader("caustic");
00104  //
00105  g_texture=0;
00106  if(result != -1){  // OpenGL renderer make the texture (units 5 - 7 are available
00107    unsigned char texdata[4][3]={{255,255,255},{255,0,0},{0,255,0},{255,255,0}};
00108    //   gl2Initialize(); // needed for some functions 
00109    PADDR(PFNGLACTIVETEXTUREPROC, glActiveTexture); 
00110    if(glActiveTexture == NULL)MessageBox(NULL,"NULL function",NULL,MB_OK);
00111    //else MessageBox(NULL,"Texture assigned","OK",MB_OK);
00112    glGenTextures( 1, &g_texture );
00113    glActiveTexture(GL_TEXTURE5); 
00114    glBindTexture(GL_TEXTURE_2D,g_texture);
00115    glTexImage2D(GL_TEXTURE_2D, 0, 3, 
00116                 4,1, // width & height
00117                 0, GL_RGB, GL_UNSIGNED_BYTE,
00118                 &texdata[0][0]);
00119 //   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00120 //   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00121    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
00122    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
00123    glBindTexture(GL_TEXTURE_2D,0);
00124  }
00125  //
00126  return result;
00127 }
00128 
00129 #if 0
00130 long CALLBACK ExternalTextureMorph(
00131 #else
00132 long _ExternalTextureMorph(
00133 #endif
00134  char *parameter_list, double mr){
00135  int i;
00136  double coverage_m,sharpness_m;
00137  double c1_m[3];
00138  double x_m,y_m,z_m;
00139  parameter_list++;
00140  sscanf(parameter_list,"%f %f %f  %f %f  %f %f %f",
00141         &x_m,&y_m,&z_m,&coverage_m,&sharpness_m,
00142         &c1_m[0],&c1_m[1],&c1_m[2]);
00143  for(i=0;i<3;i++)c1[i]=c1_m[i]+(c1[i]-c1_m[i])*mr;
00144  coverage=coverage_m+(coverage-coverage_m)*mr;
00145  sharpness=sharpness_m+(sharpness-sharpness_m)*mr;
00146  x=x_m+(x-x_m)*mr;
00147  y=y_m+(y-y_m)*mr;
00148  z=z_m+(z-z_m)*mr;
00149  return 1;
00150 }
00151 
00152 #if 0
00153 long CALLBACK ExternalTextureProcedure(
00154 #else
00155 long _ExternalTextureProcedure(
00156 #endif
00157   long coord_type,  vector p, vector n,
00158   double alpha, double beta, double gamma,
00159   double bump,  double map_x,  double map_y,
00160   double *alpha_channel, unsigned char sc[3], double colour[3],
00161   double *reflectivity, double *transparency,
00162   X__SHADER *lpEVI
00163 ){
00164  double xx,yy,zz,noiseH;
00165  xx=alpha / x;
00166  yy=beta  / y;
00167  zz=gamma / z;
00168  nNoise(xx*5.0, yy*5.0, zz*5.0, &noiseH);
00169  noiseH = triangle(noiseH);
00170  noiseH = (0.3+0.9*noiseH);
00171  if(noiseH > coverage){
00172    noiseH=(noiseH-coverage)/(1.2-coverage);
00173    noiseH=noiseH*(1.0+1.0*sharpness);
00174    noiseH=min(noiseH,1.0);
00175    if(noiseH < 0.98){
00176      if(noiseH < 0.5)*transparency=1.0;
00177      else *transparency=1.0-(noiseH-0.5)*2.084;
00178    }
00179    else *transparency=0.0;
00180    colour[0]=(unsigned char)
00181     (noiseH*(double)c1[0]+(1.0-noiseH)*(double)colour[0]);
00182    colour[1]=(unsigned char)
00183     (noiseH*(double)c1[1]+(1.0-noiseH)*(double)colour[1]);
00184    colour[2]=(unsigned char)
00185     (noiseH*(double)c1[2]+(1.0-noiseH)*(double)colour[2]);
00186  }
00187  return 1;
00188 }
00189 
00190 void _ExternalTextureClose(X__SHADER *lpEVI){
00191  if(g_texture > 0){
00192    glDeleteTextures( 1, &g_texture );
00193    g_texture=0;
00194    //MessageBox(NULL,"Texture deleted","OK",MB_OK);
00195  }
00196  UnloadCompiledShader(tGLshaderID);
00197 }
00198 
00199 long _ExternalTextureProcedureGL(
00200   double bump_scale,
00201   unsigned char sc[3],
00202   unsigned char ac[3],
00203   X__SHADER *lpEVI
00204 ){
00205  // Set any shader specific uniform variables here.
00206  SetUniformVector(tGLshaderID,"MaterialC",(GLfloat)ac[0]/255.0,(GLfloat)ac[1]/255.0,(GLfloat)ac[2]/255.0);
00207  SetUniformVector(tGLshaderID,"C1",(GLfloat)c1[0]/255.0,(GLfloat)c1[1]/255.0,(GLfloat)c1[2]/255.0);
00208  SetUniformVariable(tGLshaderID,"Coverage",coverage);
00209  SetUniformVariable(tGLshaderID,"Sharpness",sharpness);
00210  SetUniformVector(tGLshaderID,"ScalingV",1.0/x,1.0/z,1.0/y);
00211  if(g_texture > 0){
00212    glActiveTexture(GL_TEXTURE5);
00213    glBindTexture(GL_TEXTURE_2D,g_texture);
00214    SetUniformInteger(tGLshaderID,"ShaderTexture",5);
00215  } 
00216  DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00217  if(g_texture > 0){
00218    glBindTexture(GL_TEXTURE_2D,g_texture);
00219  } 
00220  return 1;
00221 }
00223 
00224 void CentreDialogOnScreen(HWND hwnd){
00225  RECT rcDlg;
00226  long Xres,Yres;
00227  Yres=GetSystemMetrics(SM_CYSCREEN);
00228  Xres=GetSystemMetrics(SM_CXSCREEN);
00229  GetWindowRect(hwnd,&rcDlg);
00230  OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00231  OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00232  SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00233  return;
00234 }
00235 
00236 static void SetColour(double *colour, HWND parent){
00237  CHOOSECOLOR cc;
00238  static COLORREF CustColours[16]={
00239    RGB(255,255,255), RGB(239,239,239), RGB(223,223,223), RGB(207,207,207),
00240    RGB(191,191,191), RGB(175,175,175), RGB(159,159,159), RGB(143,143,143),
00241    RGB(127,127,127), RGB(111,111,111), RGB( 95, 95, 95), RGB( 79, 79, 79),
00242    RGB( 63, 63, 63), RGB( 47, 47, 47), RGB( 31, 31, 31), RGB( 15, 15, 15) };
00243  cc.lStructSize=sizeof(CHOOSECOLOR);
00244  cc.hwndOwner=parent;
00245  cc.rgbResult=RGB((BYTE)colour[0],(BYTE)colour[1],(BYTE)colour[2]);
00246  cc.lpCustColors=(LPDWORD)CustColours;
00247  cc.Flags= CC_RGBINIT;
00248  cc.lCustData=(DWORD)0;
00249  if(ChooseColor(&cc)){
00250    colour[0]=(double)GetRValue(cc.rgbResult);
00251    colour[1]=(double)GetGValue(cc.rgbResult);
00252    colour[2]=(double)GetBValue(cc.rgbResult);
00253  }
00254 }
00255 
00256 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00257 
00258 #if 0
00259 char * CALLBACK SetExternalParameters(
00260 #else
00261 char * _SetExternalParameters(
00262 #endif
00263   char *Op,                 /* string for the parameters                  */
00264   HWND hWnd,                /* parent window                              */
00265   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00266                              ){
00267  char szbuf[255],*Op1;
00268  if(Op != NULL){  /* parameters exist so read them off the list */
00269    Op1=Op;
00270    Op1++;
00271    sscanf(Op1,"%f %f %f  %f %f  %f %f %f",
00272          &x,&y,&z,&coverage,&sharpness,
00273          &c1[0],&c1[1],&c1[2]);
00274  }
00275  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00276               (DLGPROC)DlgProc) == FALSE)return Op;
00277  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00278  sprintf(szbuf,"# %.2f %.2f %.2f  %.3f %.2f "
00279                  "%.2f %.2f %.2f ",
00280          x,y,z,coverage,sharpness,
00281          c1[0],c1[1],c1[2]);
00282  if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00283   MessageBox (GetFocus(),"External shader: Out of memory","Error",
00284                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00285    return NULL;
00286  }
00287  strcpy(Op,szbuf);
00288  return Op;
00289 }
00290 
00291 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00292  char str[16];
00293  switch( msg ) {
00294    case WM_INITDIALOG:
00295      sprintf(str,"%.2f",x);
00296      SendDlgItemMessage(hwnd,DLG_XSCALE,WM_SETTEXT,0,(LPARAM)str);
00297      SendDlgItemMessage(hwnd,DLG_XSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00298      sprintf(str,"%.2f",y);
00299      SendDlgItemMessage(hwnd,DLG_YSCALE,WM_SETTEXT,0,(LPARAM)str);
00300      SendDlgItemMessage(hwnd,DLG_YSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00301      sprintf(str,"%.2f",z);
00302      SendDlgItemMessage(hwnd,DLG_ZSCALE,WM_SETTEXT,0,(LPARAM)str);
00303      SendDlgItemMessage(hwnd,DLG_ZSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00304      sprintf(str,"%.2f",coverage);
00305      SendDlgItemMessage(hwnd,DLG_COVERAGE,WM_SETTEXT,0,(LPARAM)str);
00306      SendDlgItemMessage(hwnd,DLG_COVERAGE,EM_LIMITTEXT,(WPARAM)12,0);
00307      sprintf(str,"%.2f",sharpness);
00308      SendDlgItemMessage(hwnd,DLG_SHARPNESS,WM_SETTEXT,0,(LPARAM)str);
00309      SendDlgItemMessage(hwnd,DLG_SHARPNESS,EM_LIMITTEXT,(WPARAM)12,0);
00310      CentreDialogOnScreen(hwnd);
00311      return TRUE;
00312    case WM_DRAWITEM:{
00313        LPDRAWITEMSTRUCT lpdis;
00314        HBRUSH   hbr,hbrold;
00315        BYTE r,g,b;
00316        lpdis=(LPDRAWITEMSTRUCT)lparam;
00317        if(lpdis->CtlID == DLG_COLOUR1){
00318          if(lpdis->CtlID == DLG_COLOUR1){
00319            r=(BYTE)c1[0]; g=(BYTE)c1[1]; b=(BYTE)c1[2];
00320          }
00321          if(lpdis->itemState & ODS_SELECTED)
00322             InvertRect(lpdis->hDC,&(lpdis->rcItem));
00323          else{
00324            hbr=CreateSolidBrush(RGB(r,g,b));
00325            hbrold=SelectObject(lpdis->hDC,hbr);
00326            Rectangle(lpdis->hDC,lpdis->rcItem.left,lpdis->rcItem.top,
00327                          lpdis->rcItem.right,lpdis->rcItem.bottom);
00328            SelectObject(lpdis->hDC,hbrold);
00329            DeleteObject(hbr);
00330          }
00331        }
00332      }
00333      break;
00334    case WM_COMMAND:
00335      switch(LOWORD(wparam)){
00336         case DLG_COLOUR1:
00337           SetColour(c1,hwnd);
00338           InvalidateRect(GetDlgItem(hwnd,DLG_COLOUR1),NULL,FALSE);
00339           break;
00340         case IDCANCEL:
00341           EndDialog(hwnd,FALSE);
00342           return(TRUE);
00343         case IDOK:
00344           if(GetDlgItemText(hwnd,DLG_COVERAGE,str,10) == 0)
00345              EndDialog(hwnd,FALSE);
00346           if((coverage=atof(str)) == 0)EndDialog(hwnd,FALSE);
00347           if(GetDlgItemText(hwnd,DLG_SHARPNESS,str,10) == 0)
00348              EndDialog(hwnd,FALSE);
00349           if((sharpness=atof(str)) == 0)EndDialog(hwnd,FALSE);
00350           if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00351              EndDialog(hwnd,FALSE);
00352           if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00353           if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00354              EndDialog(hwnd,FALSE);
00355           if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00356           if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00357              EndDialog(hwnd,FALSE);
00358           if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00359           EndDialog(hwnd,TRUE);
00360           return(TRUE);
00361         default:
00362           break;
00363       }
00364       break;
00365     default: break;
00366  }
00367  return FALSE;
00368 }
Generated on Tue Jan 28 06:18:31 2014 for OpenFX by  doxygen 1.6.3