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