spray.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 //    sptray.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 "spray.h"
00036 
00037 double triangle(double value){
00038   register double offset;
00039   if (value >= 0.0) offset = value - floor(value);
00040   else offset = value - (-1.0 - floor(fabs(value)));
00041   if (offset >= 0.5) return (2.0 * (1.0 - offset));
00042   else return (2.0 * offset);
00043 }
00044 
00045 #if __WATCOMC__
00046 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00047 #else
00048 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00049 #endif
00050   HANDLE ghMod;
00051   switch (dwReason) {
00052     case DLL_PROCESS_ATTACH:
00053 #if __X__MIPS__
00054       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00055 #endif
00056       hDLLinstance = hDLL;  /* handle to DLL file */
00057       break;
00058     case DLL_PROCESS_DETACH:
00059 #if __X__MIPS__
00060       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00061 #endif
00062       break;
00063   }
00064   return (int)TRUE;
00065 }
00066 
00067 #if __SC__
00068 #pragma startaddress(DllMain)
00069 #endif
00070 
00071 static double density=0.1;
00072 static double c1[3]={0.0,0.0,0.0};
00073 static double x=1.0,y=1.0,z=1.0;
00074 
00075 #if 0
00076 long CALLBACK ExternalTextureStartup(
00077 #else
00078 long _ExternalTextureStartup(
00079 #endif
00080   long frame,long nframes,char *parameter_list, X__SHADER *lpEVI){
00081  if(parameter_list[0] != '#'){
00082    MessageBox ( GetFocus(),
00083                 (LPCTSTR) "External texture: Startup",
00084                 (LPCTSTR) "Parameter list missing",
00085                 MB_OK | MB_SYSTEMMODAL );
00086  }
00087  else {
00088   parameter_list++;
00089   sscanf(parameter_list,"%f %f %f  %f  %f %f %f",
00090          &x,&y,&z,&density,
00091          &c1[0],&c1[1],&c1[2]);
00092  }
00093  return LoadAndCompileShader("spray");
00094 }
00095 
00096 #if 0
00097 long CALLBACK ExternalTextureMorph(
00098 #else
00099 long _ExternalTextureMorph(
00100 #endif
00101  char *parameter_list, double mr){
00102  int i;
00103  double density_m;
00104  double c1_m[3];
00105  double x_m,y_m,z_m;
00106  parameter_list++;
00107  sscanf(parameter_list,"%f %f %f  %f  %f %f %f",
00108         &x_m,&y_m,&z_m,&density_m,
00109         &c1_m[0],&c1_m[1],&c1_m[2]);
00110  for(i=0;i<3;i++)c1[i]=c1_m[i]+(c1[i]-c1_m[i])*mr;
00111  density=density_m+(density-density_m)*mr;
00112  x=x_m+(x-x_m)*mr;
00113  y=y_m+(y-y_m)*mr;
00114  z=z_m+(z-z_m)*mr;
00115  return 1;
00116 }
00117 
00118 #if 0
00119 long CALLBACK ExternalTextureProcedure(
00120 #else
00121 long _ExternalTextureProcedure(
00122 #endif
00123   long coord_type,  vector p, vector n,
00124   double alpha, double beta, double gamma,
00125   double bump,  double map_x,  double map_y,
00126   double *alpha_channel, unsigned char sc[3], double colour[3],
00127   double *reflectivity, double *transparency,
00128   X__SHADER *lpEVI
00129 ){
00130  double xx,yy,zz,noiseH;
00131  vector v;
00132  xx=alpha / x;
00133  yy=beta  / y;
00134  zz=gamma / z;
00135  xx *= 5.0; yy *= 5.0; zz *= 5.0;
00136  vNoise(v,xx,yy,zz);
00137  v[0]=triangle(v[0]*50.0);
00138  v[1]=triangle(v[1]*50.0);
00139  v[2]=triangle(v[2]*50.0);
00140  nNoise(xx+v[0], yy+v[1], zz+v[2], &noiseH);
00141  if(noiseH > (1.0-density)){
00142    colour[0]=c1[0];
00143    colour[1]=c1[1];
00144    colour[2]=c1[2];
00145    *transparency=0.0;
00146  }
00147  return 1;
00148 }
00149 
00150 void _ExternalTextureClose(X__SHADER *lpEVI){
00151  UnloadCompiledShader(tGLshaderID);
00152 }
00153 
00154 long _ExternalTextureProcedureGL(
00155   double bump_scale,
00156   unsigned char sc[3],
00157   unsigned char ac[3],
00158   X__SHADER *lpEVI
00159 ){
00160  SetUniformVector(tGLshaderID,"C1",(GLfloat)c1[0]/255.0,(GLfloat)c1[1]/255.0,(GLfloat)c1[2]/255.0);
00161  SetUniformVector(tGLshaderID,"ScalingV",1.0/x,1.0/z,1.0/y);
00162  SetUniformVariable(tGLshaderID,"Density",density);
00163  DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00164  return 1;
00165 }
00167 
00168 void CentreDialogOnScreen(HWND hwnd){
00169  RECT rcDlg;
00170  long Xres,Yres;
00171  Yres=GetSystemMetrics(SM_CYSCREEN);
00172  Xres=GetSystemMetrics(SM_CXSCREEN);
00173  GetWindowRect(hwnd,&rcDlg);
00174  OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00175  OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00176  SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00177  return;
00178 }
00179 
00180 static void SetColour(double *colour, HWND parent){
00181  CHOOSECOLOR cc;
00182  static COLORREF CustColours[16]={
00183    RGB(255,255,255), RGB(239,239,239), RGB(223,223,223), RGB(207,207,207),
00184    RGB(191,191,191), RGB(175,175,175), RGB(159,159,159), RGB(143,143,143),
00185    RGB(127,127,127), RGB(111,111,111), RGB( 95, 95, 95), RGB( 79, 79, 79),
00186    RGB( 63, 63, 63), RGB( 47, 47, 47), RGB( 31, 31, 31), RGB( 15, 15, 15) };
00187  cc.lStructSize=sizeof(CHOOSECOLOR);
00188  cc.hwndOwner=parent;
00189  cc.rgbResult=RGB((BYTE)colour[0],(BYTE)colour[1],(BYTE)colour[2]);
00190  cc.lpCustColors=(LPDWORD)CustColours;
00191  cc.Flags= CC_RGBINIT;
00192  cc.lCustData=(DWORD)0;
00193  if(ChooseColor(&cc)){
00194    colour[0]=(double)GetRValue(cc.rgbResult);
00195    colour[1]=(double)GetGValue(cc.rgbResult);
00196    colour[2]=(double)GetBValue(cc.rgbResult);
00197  }
00198 }
00199 
00200 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00201 
00202 #if 0
00203 char * CALLBACK SetExternalParameters(
00204 #else
00205 char * _SetExternalParameters(
00206 #endif
00207   char *Op,                 /* string for the parameters                  */
00208   HWND hWnd,                /* parent window                              */
00209   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00210                              ){
00211  char szbuf[255],*Op1;
00212  if(Op != NULL){  /* parameters exist so read them off the list */
00213    Op1=Op;
00214    Op1++;
00215    sscanf(Op1,"%f %f %f  %f  %f %f %f",
00216          &x,&y,&z,&density,
00217          &c1[0],&c1[1],&c1[2]);
00218  }
00219  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00220               (DLGPROC)DlgProc) == FALSE)return Op;
00221  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00222  sprintf(szbuf,"# %.2f %.2f %.2f  %.3f "
00223                  "%.2f %.2f %.2f ",
00224          x,y,z,density,
00225          c1[0],c1[1],c1[2]);
00226  if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00227   MessageBox (GetFocus(),"External shader: Out of memory","Error",
00228                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00229    return NULL;
00230  }
00231  strcpy(Op,szbuf);
00232  return Op;
00233 }
00234 
00235 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00236  char str[16];
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",density);
00249      SendDlgItemMessage(hwnd,DLG_DENSITY,WM_SETTEXT,0,(LPARAM)str);
00250      SendDlgItemMessage(hwnd,DLG_DENSITY,EM_LIMITTEXT,(WPARAM)12,0);
00251      CentreDialogOnScreen(hwnd);
00252      return TRUE;
00253    case WM_DRAWITEM:{
00254        LPDRAWITEMSTRUCT lpdis;
00255        HBRUSH   hbr,hbrold;
00256        BYTE r,g,b;
00257        lpdis=(LPDRAWITEMSTRUCT)lparam;
00258        if(lpdis->CtlID == DLG_COLOUR1){
00259          if(lpdis->CtlID == DLG_COLOUR1){
00260            r=(BYTE)c1[0]; g=(BYTE)c1[1]; b=(BYTE)c1[2];
00261          }
00262          if(lpdis->itemState & ODS_SELECTED)
00263             InvertRect(lpdis->hDC,&(lpdis->rcItem));
00264          else{
00265            hbr=CreateSolidBrush(RGB(r,g,b));
00266            hbrold=SelectObject(lpdis->hDC,hbr);
00267            Rectangle(lpdis->hDC,lpdis->rcItem.left,lpdis->rcItem.top,
00268                          lpdis->rcItem.right,lpdis->rcItem.bottom);
00269            SelectObject(lpdis->hDC,hbrold);
00270            DeleteObject(hbr);
00271          }
00272        }
00273      }
00274      break;
00275    case WM_COMMAND:
00276      switch(LOWORD(wparam)){
00277         case DLG_COLOUR1:
00278           SetColour(c1,hwnd);
00279           InvalidateRect(GetDlgItem(hwnd,DLG_COLOUR1),NULL,FALSE);
00280           break;
00281         case IDCANCEL:
00282           EndDialog(hwnd,FALSE);
00283           return(TRUE);
00284         case IDOK:
00285           if(GetDlgItemText(hwnd,DLG_DENSITY,str,10) == 0)
00286              EndDialog(hwnd,FALSE);
00287           if((density=atof(str)) == 0)EndDialog(hwnd,FALSE);
00288           if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00289              EndDialog(hwnd,FALSE);
00290           if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00291           if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00292              EndDialog(hwnd,FALSE);
00293           if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00294           if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00295              EndDialog(hwnd,FALSE);
00296           if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00297           EndDialog(hwnd,TRUE);
00298           return(TRUE);
00299         default:
00300           break;
00301       }
00302       break;
00303     default: break;
00304  }
00305  return FALSE;
00306 }
Generated on Tue Jan 28 06:18:32 2014 for OpenFX by  doxygen 1.6.3