00001
00002
00003
00004
00005
00006 #include <stdlib.h>
00007 #include <stdio.h>
00008 #include <math.h>
00009 #include <float.h>
00010 #include <windows.h>
00011 #include <gl/gl.h>
00012
00013 #if __ZTC__ || __SC__
00014 #ifndef max
00015 #define max(a,b) ( ((a) > (b)) ? (a) : (b) )
00016 #endif
00017 #endif
00018
00019 #if __WATCOMC__
00020 #define PI 3.1415926
00021 #endif
00022
00023 #if __X__MIPS__
00024 BOOL WINAPI _CRT_INIT(HINSTANCE ,DWORD , LPVOID );
00025 #endif
00026
00027 static HINSTANCE hDLLinstance=NULL;
00028
00029 #include "..\animate\memory.h"
00030 #include "..\animate\memdef.h"
00031 #include "defines.h"
00032 #include "rstruct.h"
00033 #include "planet1.h"
00034
00035 #define VECCOPY(a,b) { b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; }
00036 #define VECSUM(a,b,c) { c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; c[2]=a[2]+b[2];}
00037 #define VECSUB(a,b,c) { c[0]=a[0]-b[0]; c[1]=a[1]-b[1]; c[2]=a[2]-b[2];}
00038 #define VECSCALE(a,b,c) { c[0]=(a)*b[0]; c[1]=(a)*b[1]; c[2]=(a)*b[2];}
00039 #define DOT(a,b) ( (a[0]*b[0]) + (a[1]*b[1]) + (a[2]*b[2]) )
00040
00041 #define IMOD(z,a) ((z) - ((z)/(a))*(a))
00042 #define PATTERN(x,y,z) ( ((z)+16384L)*64536L + \
00043 ((y)+16384L)*32768L + \
00044 ((x)+16384L))
00045 #define FLOOR(x) ((x) >= 0.0 ? floor(x) : (0.0 - floor(0.0 - (x)) - 1.0))
00046 #define FMOD(x,a) ((x) >= 0.0 ? fmod(x,a) :(a - fmod(-(x),a)))
00047
00048
00049 #if __WATCOMC__
00050 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00051 #else
00052 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00053 #endif
00054 HANDLE ghMod;
00055 switch (dwReason) {
00056 case DLL_PROCESS_ATTACH:
00057 #if __X__MIPS__
00058 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00059 #endif
00060 hDLLinstance = hDLL;
00061 break;
00062 case DLL_PROCESS_DETACH:
00063 #if __X__MIPS__
00064 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00065 #endif
00066 break;
00067 }
00068 return (int)TRUE;
00069 }
00070
00071 #if __SC__
00072 #pragma startaddress(DllMain)
00073 #endif
00074
00075 static double x=1.0,y=1.0,z=1.0,
00076 filaments=0.05,bands=10.0,
00077 local_noise=0.5,sharpness=0.9,
00078 c1[3]={255.0,255.0,255.0};
00079
00080 #if 0
00081 long CALLBACK ExternalTextureStartup(
00082 #else
00083 long _ExternalTextureStartup(
00084 #endif
00085 long frame,long nframes,char *parameter_list, X__SHADER *lpEVI
00086 ){
00087 if(parameter_list[0] != '#'){
00088 MessageBox ( GetFocus(),
00089 (LPCTSTR) "External texture: Startup",
00090 (LPCTSTR) "Parameter list missing",
00091 MB_OK | MB_SYSTEMMODAL );
00092 }
00093 else {
00094 parameter_list++;
00095 sscanf(parameter_list,"%f %f %f %f %f %f %f %f %f %f",
00096 &filaments,&bands,
00097 &local_noise,&sharpness,
00098 &c1[0],&c1[1],&c1[2],
00099 &x,&y,&z);
00100 }
00101 return LoadAndCompileShader("planet1");
00102 }
00103
00104 #if 0
00105 long CALLBACK ExternalTextureMorph(
00106 #else
00107 long _ExternalTextureMorph(
00108 #endif
00109 char *parameter_list, double mr){
00110 int i;
00111 double x_m,y_m,z_m,c1_m[3],filaments_m,sharpness_m,local_noise_m,bands_m;
00112 parameter_list++;
00113 sscanf(parameter_list,"%f %f %f %f %f %f %f %f %f %f",
00114 &filaments_m,&bands_m,
00115 &local_noise_m,&sharpness_m,
00116 &c1_m[0],&c1_m[1],&c1_m[2],
00117 &x_m,&y_m,&z_m);
00118 for(i=0;i<3;i++)c1[i]=c1_m[i]+(c1[i]-c1_m[i])*mr;
00119 filaments=filaments_m+(filaments-filaments_m)*mr;
00120 bands=bands_m+(bands-bands_m)*mr;
00121 local_noise=local_noise_m+(local_noise-local_noise_m)*mr;
00122 sharpness=sharpness_m+(sharpness-sharpness_m)*mr;
00123 x=x_m+(x-x_m)*mr;
00124 y=y_m+(y-y_m)*mr;
00125 z=z_m+(z-z_m)*mr;
00126 return 1;
00127 }
00128
00129 #if 0
00130 long CALLBACK ExternalTextureProcedure(
00131 #else
00132 long _ExternalTextureProcedure(
00133 #endif
00134 long coord_type, vector p, vector n,
00135 double alpha, double beta, double gamma,
00136 double bump, double map_x, double map_y,
00137 double *alpha_channel, unsigned char sc[3], double colour[3],
00138 double *reflectivity, double *transparency,
00139 X__SHADER *lpEVI
00140 ){
00141 double xx,yy,zz,noise1,noise2,s,ss;
00142 xx=alpha / x;
00143 yy=beta / y;
00144 zz=gamma / z;
00145 sTurbulence(xx*20,yy*20,zz*10,&noise2);
00146 zz += noise2*filaments;
00147 nNoise(xx*0.001,yy*0.001,zz*bands,&s);
00148 nNoise(xx*50,yy*50,zz*25,&ss);
00149 s=s+local_noise*(ss-0.5);
00150 s=max(s,0.0); s=min(s,1.0);
00151 s=0.5+(s-0.5)*sharpness;
00152 colour[0] = s*colour[0]+(1-s)*c1[0];
00153 colour[1] = s*colour[1]+(1-s)*c1[1];
00154 colour[2] = s*colour[2]+(1-s)*c1[2];
00155 return 1;
00156 }
00157
00158 void _ExternalTextureClose(X__SHADER *lpEVI){
00159 UnloadCompiledShader(tGLshaderID);
00160 }
00161
00162 long _ExternalTextureProcedureGL(
00163 double bump_scale,
00164 unsigned char sc[3],
00165 unsigned char ac[3],
00166 X__SHADER *lpEVI
00167 ){
00168 SetUniformVector(tGLshaderID,"C1",(GLfloat)c1[0]/255.0,(GLfloat)c1[1]/255.0,(GLfloat)c1[2]/255.0);
00169 SetUniformVector(tGLshaderID,"ScalingV",1.0/x,1.0/z,1.0/y);
00170 SetUniformVariable(tGLshaderID,"Filaments",filaments);
00171 SetUniformVariable(tGLshaderID,"Bands",bands);
00172 SetUniformVariable(tGLshaderID,"LocalNoise",local_noise);
00173 SetUniformVariable(tGLshaderID,"Sharpness",sharpness);
00174 DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00175 return 1;
00176 }
00178
00179 void CentreDialogOnScreen(HWND hwnd){
00180 RECT rcDlg;
00181 long Xres,Yres;
00182 Yres=GetSystemMetrics(SM_CYSCREEN);
00183 Xres=GetSystemMetrics(SM_CXSCREEN);
00184 GetWindowRect(hwnd,&rcDlg);
00185 OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00186 OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00187 SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00188 return;
00189 }
00190
00191 static void SetColour(double *colour, HWND parent){
00192 CHOOSECOLOR cc;
00193 static COLORREF CustColours[16]={
00194 RGB(255,255,255), RGB(239,239,239), RGB(223,223,223), RGB(207,207,207),
00195 RGB(191,191,191), RGB(175,175,175), RGB(159,159,159), RGB(143,143,143),
00196 RGB(127,127,127), RGB(111,111,111), RGB( 95, 95, 95), RGB( 79, 79, 79),
00197 RGB( 63, 63, 63), RGB( 47, 47, 47), RGB( 31, 31, 31), RGB( 15, 15, 15) };
00198 cc.lStructSize=sizeof(CHOOSECOLOR);
00199 cc.hwndOwner=parent;
00200 cc.rgbResult=RGB((BYTE)colour[0],(BYTE)colour[1],(BYTE)colour[2]);
00201 cc.lpCustColors=(LPDWORD)CustColours;
00202 cc.Flags= CC_RGBINIT;
00203 cc.lCustData=(DWORD)0;
00204 if(ChooseColor(&cc)){
00205 colour[0]=(double)GetRValue(cc.rgbResult);
00206 colour[1]=(double)GetGValue(cc.rgbResult);
00207 colour[2]=(double)GetBValue(cc.rgbResult);
00208 }
00209 }
00210
00211 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00212
00213 #if 0
00214 char * CALLBACK SetExternalParameters(
00215 #else
00216 char * _SetExternalParameters(
00217 #endif
00218 char *Op,
00219 HWND hWnd,
00220 X__MEMORY_MANAGER *lpEVI
00221 ){
00222 char szbuf[255],*Op1;
00223 if(Op != NULL){
00224 Op1=Op;
00225 Op1++;
00226 sscanf(Op1,"%f %f %f %f %f %f %f %f %f %f",
00227 &filaments,&bands,
00228 &local_noise,&sharpness,
00229 &c1[0],&c1[1],&c1[2],
00230 &x,&y,&z);
00231 }
00232 if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00233 (DLGPROC)DlgProc) == FALSE)return Op;
00234 if(Op != NULL)CALL_FREE(Op);
00235 sprintf(szbuf,"# %.3f %.3f %.3f %.3f %.1f %.1f %.1f %.2f %.2f %.2f",
00236 filaments,bands,
00237 local_noise,sharpness,
00238 c1[0],c1[1],c1[2],
00239 x,y,z);
00240 if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00241 MessageBox (GetFocus(),"External shader: Out of memory","Error",
00242 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00243 return NULL;
00244 }
00245 strcpy(Op,szbuf);
00246 return Op;
00247 }
00248
00249 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00250 char str[16];
00251 switch( msg ) {
00252 case WM_INITDIALOG:
00253 sprintf(str,"%.2f",x);
00254 SendDlgItemMessage(hwnd,DLG_XSCALE,WM_SETTEXT,0,(LPARAM)str);
00255 SendDlgItemMessage(hwnd,DLG_XSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00256 sprintf(str,"%.2f",y);
00257 SendDlgItemMessage(hwnd,DLG_YSCALE,WM_SETTEXT,0,(LPARAM)str);
00258 SendDlgItemMessage(hwnd,DLG_YSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00259 sprintf(str,"%.2f",z);
00260 SendDlgItemMessage(hwnd,DLG_ZSCALE,WM_SETTEXT,0,(LPARAM)str);
00261 SendDlgItemMessage(hwnd,DLG_ZSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00262 sprintf(str,"%.2f",filaments);
00263 SendDlgItemMessage(hwnd,DLG_FILAMENTS,WM_SETTEXT,0,(LPARAM)str);
00264 sprintf(str,"%.2f",bands);
00265 SendDlgItemMessage(hwnd,DLG_BANDS,WM_SETTEXT,0,(LPARAM)str);
00266 sprintf(str,"%.2f",local_noise);
00267 SendDlgItemMessage(hwnd,DLG_LOCAL_NOISE,WM_SETTEXT,0,(LPARAM)str);
00268 sprintf(str,"%.2f",sharpness);
00269 SendDlgItemMessage(hwnd,DLG_SHARPNESS,WM_SETTEXT,0,(LPARAM)str);
00270 CentreDialogOnScreen(hwnd);
00271 return TRUE;
00272 case WM_DRAWITEM:{
00273 LPDRAWITEMSTRUCT lpdis;
00274 HBRUSH hbr,hbrold;
00275 BYTE r,g,b;
00276 lpdis=(LPDRAWITEMSTRUCT)lparam;
00277 if(lpdis->CtlID == DLG_COLOUR1){
00278 if(lpdis->CtlID == DLG_COLOUR1){
00279 r=(BYTE)c1[0]; g=(BYTE)c1[1]; b=(BYTE)c1[2];
00280 }
00281 if(lpdis->itemState & ODS_SELECTED)
00282 InvertRect(lpdis->hDC,&(lpdis->rcItem));
00283 else{
00284 hbr=CreateSolidBrush(RGB(r,g,b));
00285 hbrold=SelectObject(lpdis->hDC,hbr);
00286 Rectangle(lpdis->hDC,lpdis->rcItem.left,lpdis->rcItem.top,
00287 lpdis->rcItem.right,lpdis->rcItem.bottom);
00288 SelectObject(lpdis->hDC,hbrold);
00289 DeleteObject(hbr);
00290 }
00291 }
00292 }
00293 break;
00294 case WM_COMMAND:
00295 switch(LOWORD(wparam)){
00296 case DLG_COLOUR1:
00297 SetColour(c1,hwnd);
00298 InvalidateRect(GetDlgItem(hwnd,DLG_COLOUR1),NULL,FALSE);
00299 break;
00300 case IDCANCEL:
00301 EndDialog(hwnd,FALSE);
00302 return(TRUE);
00303 case IDOK:
00304 if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00305 EndDialog(hwnd,FALSE);
00306 if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00307 if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00308 EndDialog(hwnd,FALSE);
00309 if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00310 if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00311 EndDialog(hwnd,FALSE);
00312 if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00313 if(GetDlgItemText(hwnd,DLG_FILAMENTS,str,10) == 0)
00314 EndDialog(hwnd,FALSE);
00315 filaments=atof(str);
00316 if(GetDlgItemText(hwnd,DLG_SHARPNESS,str,10) == 0)
00317 EndDialog(hwnd,FALSE);
00318 sharpness=atof(str);
00319 if(GetDlgItemText(hwnd,DLG_BANDS,str,10) == 0)
00320 EndDialog(hwnd,FALSE);
00321 bands=atof(str);
00322 if(GetDlgItemText(hwnd,DLG_LOCAL_NOISE,str,10) == 0)
00323 EndDialog(hwnd,FALSE);
00324 local_noise=atof(str);
00325 EndDialog(hwnd,TRUE);
00326 return(TRUE);
00327 default:
00328 break;
00329 }
00330 break;
00331 default: break;
00332 }
00333 return FALSE;
00334 }