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