00001
00002
00003
00004
00005
00006
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"
00032 #include "..\animate\memdef.h"
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;
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,
00200 HWND hWnd,
00201 X__MEMORY_MANAGER *lpEVI
00202 ){
00203 char szbuf[255],*Op1;
00204 if(Op != NULL){
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);
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 }