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 "plasma.h"
00036
00037 #if __WATCOMC__
00038 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00039 #else
00040 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00041 #endif
00042 HANDLE ghMod;
00043 switch (dwReason) {
00044 case DLL_PROCESS_ATTACH:
00045 #if __X__MIPS__
00046 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00047 #endif
00048 hDLLinstance = hDLL;
00049 break;
00050 case DLL_PROCESS_DETACH:
00051 #if __X__MIPS__
00052 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00053 #endif
00054 break;
00055 }
00056 return (int)TRUE;
00057 }
00058
00059 static double red_freq=5.0,green_freq=6.0, blue_freq=7.0;
00060 static double red_phas=0.0,green_phas=0.333333333,blue_phas=0.66666666;
00061 static double x=1.0,y=1.0,z=1.0;
00062 static double brite=255.0;
00063
00064 static int ShaderProgramID = -1;
00065
00066 #if 0
00067 long CALLBACK ExternalTextureStartup(
00068 #else
00069 long _ExternalTextureStartup(
00070 #endif
00071 long frame,long nframes,char *parameter_list, X__SHADER *lpEVI
00072 ){
00073 if(parameter_list[0] != '#'){
00074 MessageBox ( GetFocus(),
00075 (LPCTSTR) "External texture: Startup",
00076 (LPCTSTR) "Parameter list missing",
00077 MB_OK | MB_SYSTEMMODAL );
00078 }
00079 else {
00080 parameter_list++;
00081 sscanf(parameter_list,"%f %f %f %f %f %f %f %f %f %f",
00082 &x,&y,&z,&brite,
00083 &red_freq,&green_freq,&blue_freq,
00084 &red_phas,&green_phas,&blue_phas);
00085 }
00086 if(lpEVI->fp_LoadAndCompileShader == NULL)MessageBox(NULL,"NULL Compile",NULL,MB_OK);
00087 ShaderProgramID=LoadAndCompileShader("plasma");
00088 return ShaderProgramID;
00089 }
00090
00091 #if 0
00092 long CALLBACK ExternalTextureMorph(
00093 #else
00094 long _ExternalTextureMorph(
00095 #endif
00096 char *parameter_list, double mr){
00097 double red_freq_m,green_freq_m,blue_freq_m;
00098 double red_phas_m,green_phas_m,blue_phas_m;
00099 double x_m,y_m,z_m;
00100 double brite_m;
00101 parameter_list++;
00102 sscanf(parameter_list,"%f %f %f %f %f %f %f %f %f %f",
00103 &x_m,&y_m,&z_m,&brite_m,
00104 &red_freq_m,&green_freq_m,&blue_freq_m,
00105 &red_phas_m,&green_phas_m,&blue_phas_m);
00106 x=x_m+(x-x_m)*mr;
00107 y=y_m+(y-y_m)*mr;
00108 z=z_m+(z-z_m)*mr;
00109 brite=brite_m+(brite-brite_m)*mr;
00110 red_freq=red_freq_m+(red_freq-red_freq_m)*mr;
00111 green_freq=green_freq_m+(green_freq-green_freq_m)*mr;
00112 blue_freq=blue_freq_m+(blue_freq-blue_freq_m)*mr;
00113 red_phas=red_phas_m+(red_phas-red_phas_m)*mr;
00114 green_phas=green_phas_m+(green_phas-green_phas_m)*mr;
00115 blue_phas=blue_phas_m+(blue_phas-blue_phas_m)*mr;
00116 return 1;
00117 }
00118
00119 double costab(double value){
00120 if (value < 0.0)return 0.0;
00121 return 0.5*(1.0+cos((value-floor(value))*3.141592657*2));
00122 }
00123
00124
00125 #if 0
00126 long CALLBACK ExternalTextureProcedure(
00127 #else
00128 long _ExternalTextureProcedure(
00129 #endif
00130 long coord_type, vector p, vector n,
00131 double alpha, double beta, double gamma,
00132 double bump, double map_x, double map_y,
00133 double *alpha_channel, unsigned char sc[3], double colour[3],
00134 double *reflectivity, double *transparency,
00135 X__SHADER *lpEVI
00136 ){
00137 double xx,yy,zz,noiseH,r,g,b,noiseHH;
00138 xx=alpha / x;
00139 yy=beta / y;
00140 zz=gamma / z;
00141 nNoise(xx, yy, zz,&noiseH);
00142 nNoise(xx*0.5, yy*0.5, zz*0.5, &noiseHH);
00143 noiseH += noiseHH;
00144 nNoise(xx*0.25, yy*0.25, zz*0.25,&noiseHH);
00145 noiseH += noiseHH;
00146 r = costab(noiseH*red_freq+red_phas);
00147 g = costab(noiseH*green_freq+green_phas);
00148 b = costab(noiseH*blue_freq+blue_phas);
00149 colour[0] = r * brite;
00150 colour[1] = g * brite;
00151 colour[2] = b * brite;
00152 return 1;
00153 }
00154
00155 #if 0
00156 void CALLBACK ExternalTextureClose( X__SHADER *lpEVI){
00157 #else
00158 void _ExternalTextureClose( X__SHADER *lpEVI){
00159 #endif
00160 if(tGLshaderID != ShaderProgramID)MessageBox(NULL,"Bad match12",NULL,MB_OK);
00161 UnloadCompiledShader(ShaderProgramID);
00162 }
00163
00165 #if 0
00166 long CALLBACK ExternalTextureProcedureGL(
00167 #else
00168 long _ExternalTextureProcedureGL(
00169 #endif
00170 double bump_scale,
00171 unsigned char sc[3],
00172 unsigned char ac[3],
00173 X__SHADER *lpEVI
00174 ){
00175
00176 if(tGLshaderID != ShaderProgramID)MessageBox(NULL,"Bad match1",NULL,MB_OK);
00177 SetUniformVector(ShaderProgramID,"MaterialC",(GLfloat)ac[0]/255.0,(GLfloat)ac[1]/255.0,(GLfloat)ac[2]/255.0);
00178
00179
00180
00181 DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00182 return 1;
00183 }
00185
00186 void CentreDialogOnScreen(HWND hwnd){
00187 RECT rcDlg;
00188 long Xres,Yres;
00189 Yres=GetSystemMetrics(SM_CYSCREEN);
00190 Xres=GetSystemMetrics(SM_CXSCREEN);
00191 GetWindowRect(hwnd,&rcDlg);
00192 OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00193 OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00194 SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00195 return;
00196 }
00197
00198 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00199
00200 #if 0
00201 char * CALLBACK SetExternalParameters(
00202 #else
00203 char * _SetExternalParameters(
00204 #endif
00205 char *Op,
00206 HWND hWnd,
00207 X__MEMORY_MANAGER *lpEVI
00208 ){
00209 char szbuf[255],*Op1;
00210 if(Op != NULL){
00211 Op1=Op;
00212 Op1++;
00213 sscanf(Op1,"%f %f %f %f %f %f %f %f %f %f",
00214 &x,&y,&z,&brite,
00215 &red_freq,&green_freq,&blue_freq,
00216 &red_phas,&green_phas,&blue_phas);
00217 }
00218 if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00219 (DLGPROC)DlgProc) == FALSE)return Op;
00220 if(Op != NULL)CALL_FREE(Op);
00221 sprintf(szbuf,"# %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.6f %.6f %.6f ",
00222 x,y,z,brite,
00223 red_freq,green_freq,blue_freq,
00224 red_phas,green_phas,blue_phas);
00225 if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00226 MessageBox (GetFocus(),"External shader: Out of memory","Error",
00227 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00228 return NULL;
00229 }
00230 strcpy(Op,szbuf);
00231 return Op;
00232 }
00233
00234 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00235 char str[16];
00236 double scale=120.0*3.0;
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",brite);
00249 SendDlgItemMessage(hwnd,DLG_BRITE,WM_SETTEXT,0,(LPARAM)str);
00250 sprintf(str,"%.1f",red_freq);
00251 SendDlgItemMessage(hwnd,DLG_RED_FREQ,WM_SETTEXT,0,(LPARAM)str);
00252 sprintf(str,"%.1f",green_freq);
00253 SendDlgItemMessage(hwnd,DLG_GREEN_FREQ,WM_SETTEXT,0,(LPARAM)str);
00254 sprintf(str,"%.1f",blue_freq);
00255 SendDlgItemMessage(hwnd,DLG_BLUE_FREQ,WM_SETTEXT,0,(LPARAM)str);
00256 sprintf(str,"%.1f",red_phas*scale);
00257 SendDlgItemMessage(hwnd,DLG_RED_PHAS,WM_SETTEXT,0,(LPARAM)str);
00258 sprintf(str,"%.1f",green_phas*scale);
00259 SendDlgItemMessage(hwnd,DLG_GREEN_PHAS,WM_SETTEXT,0,(LPARAM)str);
00260 sprintf(str,"%.1f",blue_phas*scale);
00261 SendDlgItemMessage(hwnd,DLG_BLUE_PHAS,WM_SETTEXT,0,(LPARAM)str);
00262 CentreDialogOnScreen(hwnd);
00263 return TRUE;
00264 case WM_COMMAND:
00265 switch(LOWORD(wparam)){
00266 case IDCANCEL:
00267 EndDialog(hwnd,FALSE);
00268 return(TRUE);
00269 case IDOK:
00270 if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00271 EndDialog(hwnd,FALSE);
00272 if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00273 if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00274 EndDialog(hwnd,FALSE);
00275 if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00276 if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00277 EndDialog(hwnd,FALSE);
00278 if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00279 if(GetDlgItemText(hwnd,DLG_BRITE,str,10) == 0)
00280 EndDialog(hwnd,FALSE);
00281 if((brite=atof(str)) == 0)EndDialog(hwnd,FALSE);
00282 if(GetDlgItemText(hwnd,DLG_RED_FREQ,str,10) == 0)
00283 EndDialog(hwnd,FALSE);
00284 if((red_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00285 if(GetDlgItemText(hwnd,DLG_GREEN_FREQ,str,10) == 0)
00286 EndDialog(hwnd,FALSE);
00287 if((green_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00288 if(GetDlgItemText(hwnd,DLG_BLUE_FREQ,str,10) == 0)
00289 EndDialog(hwnd,FALSE);
00290 if((blue_freq=atof(str)) == 0)EndDialog(hwnd,FALSE);
00291
00292 if(GetDlgItemText(hwnd,DLG_RED_PHAS,str,10) == 0)
00293 EndDialog(hwnd,FALSE);
00294 red_phas=atof(str)/scale;
00295 if(GetDlgItemText(hwnd,DLG_GREEN_PHAS,str,10) == 0)
00296 EndDialog(hwnd,FALSE);
00297 green_phas=atof(str)/scale;
00298 if(GetDlgItemText(hwnd,DLG_BLUE_PHAS,str,10) == 0)
00299 EndDialog(hwnd,FALSE);
00300 blue_phas=atof(str)/scale;
00301
00302 EndDialog(hwnd,TRUE);
00303 return(TRUE);
00304 default:
00305 break;
00306 }
00307 break;
00308 default: break;
00309 }
00310 return FALSE;
00311 }
00312