planet1.c

Go to the documentation of this file.
00001 /* --
00002 -- */
00003 
00004 // planet1.c
00005 
00006 #include <stdlib.h>
00007 #include <stdio.h>
00008 #include <math.h>
00009 #include <float.h>
00010 #include <windows.h>
00011 #include <gl/gl.h>
00012 
00013 #if __ZTC__ || __SC__
00014 #ifndef max
00015 #define max(a,b)  ( ((a) > (b)) ? (a) : (b) )
00016 #endif
00017 #endif
00018 
00019 #if __WATCOMC__
00020 #define PI 3.1415926
00021 #endif
00022 
00023 #if __X__MIPS__
00024 BOOL WINAPI _CRT_INIT(HINSTANCE ,DWORD , LPVOID );
00025 #endif
00026 
00027 static HINSTANCE hDLLinstance=NULL;
00028 
00029 #include "..\animate\memory.h" /* for memory definition */
00030 #include "..\animate\memdef.h" /* local names           */
00031 #include "defines.h"
00032 #include "rstruct.h"
00033 #include "planet1.h"
00034 
00035 #define VECCOPY(a,b)    { b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; }
00036 #define VECSUM(a,b,c)   { c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; c[2]=a[2]+b[2];}
00037 #define VECSUB(a,b,c)   { c[0]=a[0]-b[0]; c[1]=a[1]-b[1]; c[2]=a[2]-b[2];}
00038 #define VECSCALE(a,b,c) { c[0]=(a)*b[0]; c[1]=(a)*b[1]; c[2]=(a)*b[2];}
00039 #define DOT(a,b)        ( (a[0]*b[0]) + (a[1]*b[1]) + (a[2]*b[2]) )
00040 
00041 #define IMOD(z,a) ((z) - ((z)/(a))*(a))
00042 #define PATTERN(x,y,z)   ( ((z)+16384L)*64536L +  \
00043                            ((y)+16384L)*32768L +  \
00044                            ((x)+16384L))
00045 #define FLOOR(x) ((x) >= 0.0 ? floor(x) : (0.0 - floor(0.0 - (x)) - 1.0))
00046 #define FMOD(x,a) ((x) >= 0.0 ? fmod(x,a) :(a - fmod(-(x),a)))
00047 
00048 
00049 #if __WATCOMC__
00050 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00051 #else
00052 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00053 #endif
00054   HANDLE ghMod;
00055   switch (dwReason) {
00056     case DLL_PROCESS_ATTACH:
00057 #if __X__MIPS__
00058       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00059 #endif
00060       hDLLinstance = hDLL;  /* handle to DLL file */
00061       break;
00062     case DLL_PROCESS_DETACH:
00063 #if __X__MIPS__
00064       if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00065 #endif
00066       break;
00067   }
00068   return (int)TRUE;
00069 }
00070 
00071 #if __SC__
00072 #pragma startaddress(DllMain)
00073 #endif
00074 
00075 static double x=1.0,y=1.0,z=1.0,
00076               filaments=0.05,bands=10.0,
00077               local_noise=0.5,sharpness=0.9,
00078               c1[3]={255.0,255.0,255.0};
00079 
00080 #if 0
00081 long CALLBACK ExternalTextureStartup(
00082 #else
00083 long _ExternalTextureStartup(
00084 #endif
00085   long frame,long nframes,char *parameter_list, X__SHADER *lpEVI
00086 ){
00087  if(parameter_list[0] != '#'){
00088    MessageBox ( GetFocus(),
00089                 (LPCTSTR) "External texture: Startup",
00090                 (LPCTSTR) "Parameter list missing",
00091                 MB_OK | MB_SYSTEMMODAL );
00092  }
00093  else {
00094   parameter_list++;
00095   sscanf(parameter_list,"%f %f %f %f  %f %f %f  %f %f %f",
00096          &filaments,&bands,
00097          &local_noise,&sharpness,
00098          &c1[0],&c1[1],&c1[2],
00099          &x,&y,&z);
00100  }
00101  return LoadAndCompileShader("planet1");
00102 }
00103 
00104 #if 0
00105 long CALLBACK ExternalTextureMorph(
00106 #else
00107 long _ExternalTextureMorph(
00108 #endif
00109  char *parameter_list, double mr){
00110  int i;
00111  double x_m,y_m,z_m,c1_m[3],filaments_m,sharpness_m,local_noise_m,bands_m;
00112  parameter_list++;
00113  sscanf(parameter_list,"%f %f %f %f  %f %f %f  %f %f %f",
00114         &filaments_m,&bands_m,
00115         &local_noise_m,&sharpness_m,
00116         &c1_m[0],&c1_m[1],&c1_m[2],
00117         &x_m,&y_m,&z_m);
00118  for(i=0;i<3;i++)c1[i]=c1_m[i]+(c1[i]-c1_m[i])*mr;
00119  filaments=filaments_m+(filaments-filaments_m)*mr;
00120  bands=bands_m+(bands-bands_m)*mr;
00121  local_noise=local_noise_m+(local_noise-local_noise_m)*mr;
00122  sharpness=sharpness_m+(sharpness-sharpness_m)*mr;
00123  x=x_m+(x-x_m)*mr;
00124  y=y_m+(y-y_m)*mr;
00125  z=z_m+(z-z_m)*mr;
00126  return 1;
00127 }
00128 
00129 #if 0
00130 long CALLBACK ExternalTextureProcedure(
00131 #else
00132 long _ExternalTextureProcedure(
00133 #endif
00134   long coord_type,  vector p, vector n,
00135   double alpha, double beta, double gamma,
00136   double bump,  double map_x,  double map_y,
00137   double *alpha_channel, unsigned char sc[3], double colour[3],
00138   double *reflectivity, double *transparency,
00139   X__SHADER *lpEVI
00140 ){
00141  double xx,yy,zz,noise1,noise2,s,ss;
00142  xx=alpha / x;
00143  yy=beta  / y;
00144  zz=gamma / z;
00145  sTurbulence(xx*20,yy*20,zz*10,&noise2);   // filaments
00146  zz += noise2*filaments;                   // filaments
00147  nNoise(xx*0.001,yy*0.001,zz*bands,&s);    // bands
00148  nNoise(xx*50,yy*50,zz*25,&ss);
00149  s=s+local_noise*(ss-0.5);  // local noise
00150  s=max(s,0.0); s=min(s,1.0);
00151  s=0.5+(s-0.5)*sharpness;                  // sharpness
00152  colour[0] = s*colour[0]+(1-s)*c1[0];
00153  colour[1] = s*colour[1]+(1-s)*c1[1];
00154  colour[2] = s*colour[2]+(1-s)*c1[2];
00155  return 1;
00156 }
00157 
00158 void _ExternalTextureClose(X__SHADER *lpEVI){
00159  UnloadCompiledShader(tGLshaderID);
00160 }
00161 
00162 long _ExternalTextureProcedureGL(
00163   double bump_scale,
00164   unsigned char sc[3],
00165   unsigned char ac[3],
00166   X__SHADER *lpEVI
00167 ){
00168  SetUniformVector(tGLshaderID,"C1",(GLfloat)c1[0]/255.0,(GLfloat)c1[1]/255.0,(GLfloat)c1[2]/255.0);
00169  SetUniformVector(tGLshaderID,"ScalingV",1.0/x,1.0/z,1.0/y);
00170  SetUniformVariable(tGLshaderID,"Filaments",filaments);
00171  SetUniformVariable(tGLshaderID,"Bands",bands);
00172  SetUniformVariable(tGLshaderID,"LocalNoise",local_noise);
00173  SetUniformVariable(tGLshaderID,"Sharpness",sharpness);
00174  DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00175  return 1;
00176 }
00178 
00179 void CentreDialogOnScreen(HWND hwnd){
00180  RECT rcDlg;
00181  long Xres,Yres;
00182  Yres=GetSystemMetrics(SM_CYSCREEN);
00183  Xres=GetSystemMetrics(SM_CXSCREEN);
00184  GetWindowRect(hwnd,&rcDlg);
00185  OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00186  OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00187  SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00188  return;
00189 }
00190 
00191 static void SetColour(double *colour, HWND parent){
00192  CHOOSECOLOR cc;
00193  static COLORREF CustColours[16]={
00194    RGB(255,255,255), RGB(239,239,239), RGB(223,223,223), RGB(207,207,207),
00195    RGB(191,191,191), RGB(175,175,175), RGB(159,159,159), RGB(143,143,143),
00196    RGB(127,127,127), RGB(111,111,111), RGB( 95, 95, 95), RGB( 79, 79, 79),
00197    RGB( 63, 63, 63), RGB( 47, 47, 47), RGB( 31, 31, 31), RGB( 15, 15, 15) };
00198  cc.lStructSize=sizeof(CHOOSECOLOR);
00199  cc.hwndOwner=parent;
00200  cc.rgbResult=RGB((BYTE)colour[0],(BYTE)colour[1],(BYTE)colour[2]);
00201  cc.lpCustColors=(LPDWORD)CustColours;
00202  cc.Flags= CC_RGBINIT;
00203  cc.lCustData=(DWORD)0;
00204  if(ChooseColor(&cc)){
00205    colour[0]=(double)GetRValue(cc.rgbResult);
00206    colour[1]=(double)GetGValue(cc.rgbResult);
00207    colour[2]=(double)GetBValue(cc.rgbResult);
00208  }
00209 }
00210 
00211 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00212 
00213 #if 0
00214 char * CALLBACK SetExternalParameters(
00215 #else
00216 char * _SetExternalParameters(
00217 #endif
00218   char *Op,                 /* string for the parameters                  */
00219   HWND hWnd,                /* parent window                              */
00220   X__MEMORY_MANAGER *lpEVI /* pointer to structure with memory functions */
00221                              ){
00222  char szbuf[255],*Op1;
00223  if(Op != NULL){  /* parameters exist so read them off the list */
00224    Op1=Op;
00225    Op1++;
00226   sscanf(Op1,"%f %f %f %f  %f %f %f  %f %f %f",
00227          &filaments,&bands,
00228          &local_noise,&sharpness,
00229          &c1[0],&c1[1],&c1[2],
00230          &x,&y,&z);
00231  }
00232  if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00233               (DLGPROC)DlgProc) == FALSE)return Op;
00234  if(Op != NULL)CALL_FREE(Op);  /* free the old string */
00235  sprintf(szbuf,"# %.3f %.3f %.3f %.3f  %.1f %.1f %.1f  %.2f %.2f %.2f",
00236          filaments,bands,
00237          local_noise,sharpness,
00238          c1[0],c1[1],c1[2],
00239          x,y,z);
00240  if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00241   MessageBox (GetFocus(),"External shader: Out of memory","Error",
00242                 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00243    return NULL;
00244  }
00245  strcpy(Op,szbuf);
00246  return Op;
00247 }
00248 
00249 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00250  char str[16];
00251  switch( msg ) {
00252    case WM_INITDIALOG:
00253      sprintf(str,"%.2f",x);
00254      SendDlgItemMessage(hwnd,DLG_XSCALE,WM_SETTEXT,0,(LPARAM)str);
00255      SendDlgItemMessage(hwnd,DLG_XSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00256      sprintf(str,"%.2f",y);
00257      SendDlgItemMessage(hwnd,DLG_YSCALE,WM_SETTEXT,0,(LPARAM)str);
00258      SendDlgItemMessage(hwnd,DLG_YSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00259      sprintf(str,"%.2f",z);
00260      SendDlgItemMessage(hwnd,DLG_ZSCALE,WM_SETTEXT,0,(LPARAM)str);
00261      SendDlgItemMessage(hwnd,DLG_ZSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00262      sprintf(str,"%.2f",filaments);
00263      SendDlgItemMessage(hwnd,DLG_FILAMENTS,WM_SETTEXT,0,(LPARAM)str);
00264      sprintf(str,"%.2f",bands);
00265      SendDlgItemMessage(hwnd,DLG_BANDS,WM_SETTEXT,0,(LPARAM)str);
00266      sprintf(str,"%.2f",local_noise);
00267      SendDlgItemMessage(hwnd,DLG_LOCAL_NOISE,WM_SETTEXT,0,(LPARAM)str);
00268      sprintf(str,"%.2f",sharpness);
00269      SendDlgItemMessage(hwnd,DLG_SHARPNESS,WM_SETTEXT,0,(LPARAM)str);
00270      CentreDialogOnScreen(hwnd);
00271      return TRUE;
00272    case WM_DRAWITEM:{
00273        LPDRAWITEMSTRUCT lpdis;
00274        HBRUSH   hbr,hbrold;
00275        BYTE r,g,b;
00276        lpdis=(LPDRAWITEMSTRUCT)lparam;
00277        if(lpdis->CtlID == DLG_COLOUR1){
00278          if(lpdis->CtlID == DLG_COLOUR1){
00279            r=(BYTE)c1[0]; g=(BYTE)c1[1]; b=(BYTE)c1[2];
00280          }
00281          if(lpdis->itemState & ODS_SELECTED)
00282             InvertRect(lpdis->hDC,&(lpdis->rcItem));
00283          else{
00284            hbr=CreateSolidBrush(RGB(r,g,b));
00285            hbrold=SelectObject(lpdis->hDC,hbr);
00286            Rectangle(lpdis->hDC,lpdis->rcItem.left,lpdis->rcItem.top,
00287                          lpdis->rcItem.right,lpdis->rcItem.bottom);
00288            SelectObject(lpdis->hDC,hbrold);
00289            DeleteObject(hbr);
00290          }
00291        }
00292      }
00293      break;
00294    case WM_COMMAND:
00295      switch(LOWORD(wparam)){
00296         case DLG_COLOUR1:
00297           SetColour(c1,hwnd);
00298           InvalidateRect(GetDlgItem(hwnd,DLG_COLOUR1),NULL,FALSE);
00299           break;
00300         case IDCANCEL:
00301           EndDialog(hwnd,FALSE);
00302           return(TRUE);
00303         case IDOK:
00304           if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00305              EndDialog(hwnd,FALSE);
00306           if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00307           if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00308              EndDialog(hwnd,FALSE);
00309           if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00310           if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00311              EndDialog(hwnd,FALSE);
00312           if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00313           if(GetDlgItemText(hwnd,DLG_FILAMENTS,str,10) == 0)
00314              EndDialog(hwnd,FALSE);
00315           filaments=atof(str);
00316           if(GetDlgItemText(hwnd,DLG_SHARPNESS,str,10) == 0)
00317              EndDialog(hwnd,FALSE);
00318           sharpness=atof(str);
00319           if(GetDlgItemText(hwnd,DLG_BANDS,str,10) == 0)
00320              EndDialog(hwnd,FALSE);
00321           bands=atof(str);
00322           if(GetDlgItemText(hwnd,DLG_LOCAL_NOISE,str,10) == 0)
00323              EndDialog(hwnd,FALSE);
00324           local_noise=atof(str);
00325           EndDialog(hwnd,TRUE);
00326           return(TRUE);
00327         default:
00328           break;
00329       }
00330       break;
00331     default: break;
00332  }
00333  return FALSE;
00334 }
Generated on Tue Jan 28 06:18:32 2014 for OpenFX by  doxygen 1.6.3