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
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"
00040 #include "..\animate\memdef.h"
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;
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){
00107 unsigned char texdata[4][3]={{255,255,255},{255,0,0},{0,255,0},{255,255,0}};
00108
00109 PADDR(PFNGLACTIVETEXTUREPROC, glActiveTexture);
00110 if(glActiveTexture == NULL)MessageBox(NULL,"NULL function",NULL,MB_OK);
00111
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,
00117 0, GL_RGB, GL_UNSIGNED_BYTE,
00118 &texdata[0][0]);
00119
00120
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
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
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,
00264 HWND hWnd,
00265 X__MEMORY_MANAGER *lpEVI
00266 ){
00267 char szbuf[255],*Op1;
00268 if(Op != NULL){
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);
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 }