00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <stdlib.h>
00027 #include <stdio.h>
00028 #include <math.h>
00029 #include <float.h>
00030 #include <windows.h>
00031
00032 #if __ZTC__ || __SC__
00033 #ifndef max
00034 #define max(a,b) ( ((a) > (b)) ? (a) : (b) )
00035 #endif
00036 #endif
00037
00038 #if __WATCOMC__
00039 #define PI 3.1415926
00040 #endif
00041
00042 #if __X__MIPS__
00043 BOOL WINAPI _CRT_INIT(HINSTANCE ,DWORD , LPVOID );
00044 #endif
00045
00046 static HINSTANCE hDLLinstance=NULL;
00047
00048 #include "..\animate\memory.h"
00049 #include "..\animate\memdef.h"
00050 #include "defines.h"
00051 #include "rstruct.h"
00052 #include "test.h"
00053
00054 #if __WATCOMC__
00055 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00056 #else
00057 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00058 #endif
00059 HANDLE ghMod;
00060 switch (dwReason) {
00061 case DLL_PROCESS_ATTACH:
00062 #if __X__MIPS__
00063 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00064 #endif
00065 hDLLinstance = hDLL;
00066 break;
00067 case DLL_PROCESS_DETACH:
00068 #if __X__MIPS__
00069 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00070 #endif
00071 break;
00072 }
00073 return (int)TRUE;
00074 }
00075
00076 #if __SC__
00077 #pragma startaddress(DllMain)
00078 #endif
00079
00080 #define VECCOPY(a,b) { b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; }
00081 #define VECSUM(a,b,c) { c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; c[2]=a[2]+b[2];}
00082 #define VECSUB(a,b,c) { c[0]=a[0]-b[0]; c[1]=a[1]-b[1]; c[2]=a[2]-b[2];}
00083 #define VECSCALE(a,b,c) { c[0]=(a)*b[0]; c[1]=(a)*b[1]; c[2]=(a)*b[2];}
00084 #define DOT(a,b) ( (a[0]*b[0]) + (a[1]*b[1]) + (a[2]*b[2]) )
00085 #define CROSS(v1,v2,r) { \
00086 r[0] = (v1[1]*v2[2]) - (v2[1]*v1[2]); \
00087 r[1] = (v1[2]*v2[0]) - (v1[0]*v2[2]); \
00088 r[2] = (v1[0]*v2[1]) - (v2[0]*v1[1]); \
00089 }
00090 #define FLOOR(x) ((x) >= 0.0 ? floor(x) : (0.0 - floor(0.0 - (x)) - 1.0))
00091 #define FMOD(x,a) ((x) >= 0.0 ? fmod(x,a) :(a - fmod(-(x),a)))
00092 #define ROOT32 0.866025403
00093 #define ROOT3 1.73205080
00094
00095 static double turb=0.1,t1=0.4,t2=0.7,c[3]={255.0,255.0,0.0};
00096 static double x=1.0,y=1.0,z=1.0;
00097 static long tr_type=0,tr_type1=0,tr_type2=0,tr_type3=0;
00098
00099 #if 0
00100 long CALLBACK ExternalTextureStartup(
00101 #else
00102 long _ExternalTextureStartup(
00103 #endif
00104 long frame,long nframes,char *parameter_list){
00105 if(parameter_list[0] != '#'){
00106 MessageBox ( GetFocus(),
00107 (LPCTSTR) "External texture: Startup",
00108 (LPCTSTR) "Parameter list missing",
00109 MB_OK | MB_SYSTEMMODAL );
00110 }
00111 else {
00112 parameter_list++;
00113 sscanf(parameter_list,"%f %f %f %f %f %f %f %f %f %ld %ld %ld %ld",
00114 &c[0],&c[1],&c[2],&turb,&t1,&t2,&x,&y,&z,
00115 &tr_type,&tr_type1,&tr_type2,&tr_type3);
00116 }
00117 return 1;
00118 }
00119
00120 #if 0
00121 long CALLBACK ExternalTextureMorph(
00122 #else
00123 long _ExternalTextureMorph(
00124 #endif
00125 char *parameter_list, double mr){
00126 int i;
00127 double mx,my,mz;
00128 double mturb,mt1,mt2,mc[3];
00129 parameter_list++;
00130 sscanf(parameter_list,"%f %f %f %f %f %f %f %f %f",
00131 &mc[0],&mc[1],&mc[2],&mturb,&mt1,&mt2,&mx,&my,&mz);
00132 t1=mt1+(t1-mt1)*mr;
00133 t2=mt2+(t2-mt2)*mr;
00134 turb=(turb-mturb)*mr;
00135 for(i=0;i<3;i++)c[i]=mc[i]+(c[i]-mc[i])*mr;
00136 x=mx+(x-mx)*mr;
00137 y=my+(y-my)*mr;
00138 z=mz+(z-mz)*mr;
00139 return 1;
00140 }
00141
00142
00143 void Hsv2Rgb(double h, double s, double v,
00144 double *r, double *g, double *b){
00145 double rr,gg,bb,hh,ss,vv,maxcol,mincol;
00146 hh=(double)h; ss=(double)s; vv=(double)v;
00147 mincol=vv*(1.0-ss);
00148 if(hh <= 120.0){bb=mincol;
00149 if(hh <= 60){rr=vv; gg=mincol+hh*(vv-mincol)/(120.0-hh);}
00150 else {gg=vv; rr=mincol+(120.0-hh)*(vv-mincol)/hh;}
00151 }
00152 else if( hh <= 240){rr=mincol;
00153 if(hh <= 180){gg=vv; bb=mincol+(hh-120.0)*(vv-mincol)/(240.0-hh);}
00154 else {bb=vv; gg=mincol+(240.0-hh)*(vv-mincol)/(hh-120.0);}
00155 }
00156 else {gg=mincol;
00157 if(hh <= 300){bb=vv; rr=mincol+(hh-240.0)*(vv-mincol)/(360.0-hh);}
00158 else {rr=vv; bb=mincol+(360.0-hh)*(vv-mincol)/(hh-240.0);}
00159 }
00160 *r = rr;
00161 *g = gg;
00162 *b = bb;
00163 }
00164
00165 double hermite(double t, double tmin, double tmax){
00166 t=(t-tmin)/(tmax-tmin);
00167 return (t - t*t);
00168 }
00169
00170 double sigmoid(double t, double tmin, double tmax){
00171 t=3.1415926*(2.0*(t-tmin)/(tmax-tmin));
00172 return 0.5*(1.0-cos(t));
00173 }
00174
00175 double triangle(double value){
00176 register double offset;
00177 if (value >= 0.0) offset = value - floor(value);
00178 else offset = value - (-1.0 - floor(fabs(value)));
00179 if (offset >= 0.5) return (2.0 * (1.0 - offset));
00180 else return (2.0 * offset);
00181 }
00182
00183 double costab(double value){
00184 if (value < 0.0)return 0.0;
00185 return 0.5*(1.0+cos((value-floor(value))*3.141592657*2));
00186 }
00187
00188 double sintab(double value){
00189 if (value >= 0.0)
00190 return 0.5*(1.0+sin((value-floor(value))*3.141592657*2));
00191 return 0.0;
00192 }
00193
00194 static double ffmod(double x){
00195 if(x < 0){
00196 double a;
00197 a=fmod(-x,1.0);
00198 return 1.0-a;
00199 }
00200 return fmod(x,1.0);
00201 }
00202
00203 static double step(double a, double x){
00204 if(x < a)return 0.0;
00205 return 1.0;
00206 }
00207
00208 static void mix(double *r, double *g, double *b, double mx,
00209 double r1, double g1, double b1,
00210 double r2, double g2, double b2){
00211 *r = mx*r1 + (1.0-mx)*r2;
00212 *g = mx*g1 + (1.0-mx)*g2;
00213 *b = mx*b1 + (1.0-mx)*b2;
00214 }
00215
00216 #if 0
00217 long CALLBACK ExternalTextureProcedure(
00218 #else
00219 long _ExternalTextureProcedure(
00220 #endif
00221 long coord_type, vector p, vector n,
00222 double alpha, double beta, double gamma,
00223 double bump, double map_x, double map_y,
00224 double *alpha_channel, unsigned char sc[3], double colour[3],
00225 double *reflectivity, double *transparency,
00226 X__SHADER *lpEVI
00227 ){
00228 long i;
00229 double a,cc,xx,yy,zz,noiseH,r,g,b;
00230 vector u,v,BozoTurbulence;
00231 xx=alpha / x;
00232 yy=beta / y;
00233 zz=gamma / z;
00234
00235
00236 #if 0
00237
00238 {
00239 vector pp[22]={{0.25,0.0, 0.0},
00240 {0.75,0.0, 0.0},
00241 {0.0, ROOT32/2, 0.0},
00242 {0.5, ROOT32/2, 0.0},
00243 {1.0, ROOT32/2, 0.0},
00244 {0.25,ROOT32, 0.0},
00245 {0.75,ROOT32, 0.0},
00246 {0.0, 1.0/2.0/ROOT3-ROOT32/2,ROOT32/2.0},
00247 {0.5, 1.0/2.0/ROOT3-ROOT32/2,ROOT32/2.0},
00248 {1.0, 1.0/2.0/ROOT3-ROOT32/2,ROOT32/2.0},
00249 {0.25,1.0/2.0/ROOT3, ROOT32/2.0},
00250 {0.75,1.0/2.0/ROOT3, ROOT32/2.0},
00251 {0.0, 1.0/2.0/ROOT3+ROOT32/2,ROOT32/2.0},
00252 {0.5, 1.0/2.0/ROOT3+ROOT32/2,ROOT32/2.0},
00253 {1.0, 1.0/2.0/ROOT3+ROOT32/2,ROOT32/2.0},
00254 {0.25,0.0, ROOT32},
00255 {0.75,0.0, ROOT32},
00256 {0.0, ROOT32/2, ROOT32},
00257 {0.5, ROOT32/2, ROOT32},
00258 {1.0, ROOT32/2, ROOT32},
00259 {0.25,ROOT32, ROOT32},
00260 {0.75,ROOT32, ROOT32}};
00261 vector dn;
00262 double dx,dy,dz,cr,cg,cb,zb,noise;
00263
00264
00265 cc=0.25;
00266 nNoise(xx,yy,zz,&noise)
00267 Hsv2Rgb(noise*360.0,1.0,1.0,&cr,&cg,&cb);
00268
00269 yy /= ROOT32;
00270 xx=FMOD(xx,1.0);
00271 yy=FMOD(yy,ROOT32);
00272 zz /= ROOT32;
00273 zz=FMOD(zz,ROOT32);
00274 zb=0.0;
00275 VECCOPY(n,dn)
00276 r=colour[0]/255.0;
00277 g=colour[1]/255.0;
00278 b=colour[2]/255.0;
00279 for(i=0;i<22;i++){
00280 dx=(xx-pp[i][0]);
00281 dy=(yy-pp[i][1]);
00282 dz=(zz-pp[i][2]);
00283 if((a=sqrt(dx*dx+dy*dy+dz*dz)) < cc){
00284 if((cc-a) > zb){
00285 zb=(cc-a);
00286 r=cr;
00287 g=cg;
00288 b=cb;
00289 if(a > 0.20){
00290 mix(&r,&g,&b,(a-0.20)/(cc-0.20),
00291 (double)colour[0]/255.0,
00292 (double)colour[1]/255.0,
00293 (double)colour[2]/255.0,
00294 r,g,b);
00295 }
00296 }
00297 }
00298 }
00299 }
00300 #endif
00301
00302 #if 0
00303
00304 {
00305 vector pp[35]={{0.25,0.0, 0.0},
00306 {0.75,0.0, 0.0},
00307 {0.0, ROOT32/2, 0.0},
00308 {0.5, ROOT32/2, 0.0},
00309 {1.0, ROOT32/2, 0.0},
00310 {0.25,ROOT32, 0.0},
00311 {0.75,ROOT32, 0.0},
00312
00313 {-0.25,0.0, 0.0},
00314 { 1.25,0.0, 0.0},
00315 {-0.25,ROOT32, 0.0},
00316 { 1.25,ROOT32, 0.0},
00317 {-0.25,0.0, ROOT32},
00318 { 1.25,0.0, ROOT32},
00319 {-0.25,ROOT32, ROOT32},
00320 { 1.25,ROOT32, ROOT32},
00321 {-0.25,1.0/2.0/ROOT3,ROOT32/2.0},
00322 { 1.75,1.0/2.0/ROOT3,ROOT32/2.0},
00323 {0.0,1.0/2.0/ROOT3+ROOT32,ROOT32/2.0},
00324 {0.5,1.0/2.0/ROOT3+ROOT32,ROOT32/2.0},
00325 {1.0,1.0/2.0/ROOT3+ROOT32,ROOT32/2.0},
00326
00327 {0.0, 1.0/2.0/ROOT3-ROOT32/2,ROOT32/2.0},
00328 {0.5, 1.0/2.0/ROOT3-ROOT32/2,ROOT32/2.0},
00329 {1.0, 1.0/2.0/ROOT3-ROOT32/2,ROOT32/2.0},
00330 {0.25,1.0/2.0/ROOT3, ROOT32/2.0},
00331 {0.75,1.0/2.0/ROOT3, ROOT32/2.0},
00332 {0.0, 1.0/2.0/ROOT3+ROOT32/2,ROOT32/2.0},
00333 {0.5, 1.0/2.0/ROOT3+ROOT32/2,ROOT32/2.0},
00334 {1.0, 1.0/2.0/ROOT3+ROOT32/2,ROOT32/2.0},
00335 {0.25,0.0, ROOT32},
00336 {0.75,0.0, ROOT32},
00337 {0.0, ROOT32/2, ROOT32},
00338 {0.5, ROOT32/2, ROOT32},
00339 {1.0, ROOT32/2, ROOT32},
00340 {0.25,ROOT32, ROOT32},
00341 {0.75,ROOT32, ROOT32}};
00342 double dx,dy,dz,zb,ccc,dc,zbb;
00343 double flat_edge=0.025;
00344 double bevel_edge=0.06;
00345 double blend_edge=0.06;
00346
00347
00348
00349 BOOL ins;
00350 int id;
00351 cc=0.8;
00352 nNoise(xx*15.0,yy*15.0,zz*15.0,noiseH);
00353 vNoise(v,xx,yy,zz);
00354 xx += 0.8*v[0];
00355 yy += 0.8*v[1];
00356 zz += 0.8*v[2];
00357 yy /= ROOT32;
00358 xx=FMOD(xx,1.0);
00359 yy=FMOD(yy,ROOT32);
00360 zz /= ROOT32;
00361 zz=FMOD(zz,ROOT32);
00362 zb=-10.0;
00363 ins=TRUE;
00364 for(i=0;i<35;i++){
00365 dx=(xx-pp[i][0]);
00366 dy=(yy-pp[i][1]);
00367 dz=(zz-pp[i][2]);
00368 if((a=sqrt(dx*dx+dy*dy+dz*dz)) < cc){
00369 dc=(cc-a);
00370 if(dc > zb){
00371 id=i;
00372 zb=dc;
00373 }
00374 }
00375 }
00376 zbb= -10.0;
00377 for(i=0;i<35;i++){
00378 if(i == id)continue;
00379 dx=(xx-pp[i][0]);
00380 dy=(yy-pp[i][1]);
00381 dz=(zz-pp[i][2]);
00382 if((a=sqrt(dx*dx+dy*dy+dz*dz)) < cc){
00383 dc=(cc-a);
00384 if(dc > zbb){
00385 zbb=dc;
00386 }
00387 }
00388 }
00389 if((ccc=fabs(zbb - zb)) < flat_edge)ins=FALSE;
00390 if(ins){
00391 if(id == 3 || id == 31 || id == 23 || id == 24){
00392 r=sc[0]/255.0;
00393 g=sc[1]/255.0;
00394 b=sc[2]/255.0;
00395 }
00396 else{
00397 r=colour[0]/255.0;
00398 g=colour[1]/255.0;
00399 b=colour[2]/255.0;
00400 }
00401 r -= (noiseH*0.25);
00402 g -= (noiseH*0.25);
00403 b -= (noiseH*0.25);
00404 r=max(r,0.0); g=max(g,0.0); b=max(b,0.0);
00405 if(ccc < bevel_edge){
00406 v[0]=(xx-pp[id][0]);
00407 v[1]=(yy-pp[id][1]);
00408 v[2]=(zz-pp[id][2]);
00409 normalize(v);
00410 CROSS(v,n,u)
00411 CROSS(n,u,v)
00412 normalize(v);
00413 a=0.4;
00414 VECSCALE(a,v,v)
00415 VECSCALE((1.0-a),n,n)
00416 VECSUM(v,n,n)
00417 normalize(n);
00418 }
00419 if(ccc < blend_edge)mix(&r,&g,&b,(ccc-flat_edge)/(blend_edge-flat_edge),
00420 r,g,b,
00421 (double)c[0]/255.0,
00422 (double)c[1]/255.0,
00423 (double)c[2]/255.0
00424 );
00425 }
00426 else{
00427 r=c[0]/255.0;
00428 g=c[1]/255.0;
00429 b=c[2]/255.0;
00430 }
00431
00432 }
00433 #endif
00434
00435 #if 0
00436
00437 nNoise(xx, yy, zz, &noiseH);
00438 noiseH = sintab(noiseH*10.0);
00439 if(noiseH > 0.1){
00440 noiseH=(noiseH-0.1)/(1.0-0.1);
00441 r=(noiseH*(double)c[0]+(1.0-noiseH)*(double)colour[0]);
00442 g=(noiseH*(double)c[1]+(1.0-noiseH)*(double)colour[1]);
00443 b=(noiseH*(double)c[2]+(1.0-noiseH)*(double)colour[2]);
00444 r=r/255.0;
00445 g=g/255.0;
00446 b=b/255.0;
00447 }
00448 else{
00449 r=colour[0]/255.0;
00450 g=colour[1]/255.0;
00451 b=colour[2]/255.0;
00452 }
00453 #endif
00454
00455 colour[0] = r * 255.0;
00456 colour[1] = g * 255.0;
00457 colour[2] = b * 255.0;
00458 return 1;
00459 }
00460
00461 #if 0
00462 void CALLBACK ExternalTextureClose(void){
00463 #else
00464 void _ExternalTextureClose(void){
00465 #endif
00466 }
00467
00468 void CentreDialogOnScreen(HWND hwnd){
00469 RECT rcDlg;
00470 long Xres,Yres;
00471 Yres=GetSystemMetrics(SM_CYSCREEN);
00472 Xres=GetSystemMetrics(SM_CXSCREEN);
00473 GetWindowRect(hwnd,&rcDlg);
00474 OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00475 OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00476 SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00477 return;
00478 }
00479
00480 static void SetColour(double *colour, HWND parent){
00481 CHOOSECOLOR cc;
00482 static COLORREF CustColours[16]={
00483 RGB(255,255,255), RGB(239,239,239), RGB(223,223,223), RGB(207,207,207),
00484 RGB(191,191,191), RGB(175,175,175), RGB(159,159,159), RGB(143,143,143),
00485 RGB(127,127,127), RGB(111,111,111), RGB( 95, 95, 95), RGB( 79, 79, 79),
00486 RGB( 63, 63, 63), RGB( 47, 47, 47), RGB( 31, 31, 31), RGB( 15, 15, 15) };
00487 cc.lStructSize=sizeof(CHOOSECOLOR);
00488 cc.hwndOwner=parent;
00489 cc.rgbResult=RGB((BYTE)colour[0],(BYTE)colour[1],(BYTE)colour[2]);
00490 cc.lpCustColors=(LPDWORD)CustColours;
00491
00492 cc.Flags= CC_RGBINIT;
00493 cc.lCustData=(DWORD)0;
00494 if(ChooseColor(&cc)){
00495 colour[0]=(double)GetRValue(cc.rgbResult);
00496 colour[1]=(double)GetGValue(cc.rgbResult);
00497 colour[2]=(double)GetBValue(cc.rgbResult);
00498 }
00499 }
00500
00501 BOOL CALLBACK BozoDlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00502
00503 #if 0
00504 char * CALLBACK SetExternalParameters(
00505 #else
00506 char * _SetExternalParameters(
00507 #endif
00508 char *Op,
00509 HWND hWnd,
00510 X__MEMORY_MANAGER *lpEVI
00511 ){
00512 char szbuf[255],*Op1;
00513 if(Op != NULL){
00514 Op1=Op;
00515 Op1++;
00516 sscanf(Op1,"%f %f %f %f %f %f %f %f %f %ld %ld %ld %ld",
00517 &c[0],&c[1],&c[2],&turb,&t1,&t2,&x,&y,&z,
00518 &tr_type,&tr_type1,&tr_type2,&tr_type3);
00519 }
00520 if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG_BOZO),hWnd,
00521 (DLGPROC)BozoDlgProc) == FALSE)return Op;
00522 if(Op != NULL)CALL_FREE(Op);
00523 sprintf(szbuf,"# %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %ld %ld %ld %ld",
00524 c[0],c[1],c[2],turb,t1,t2,x,y,z,tr_type,tr_type1,tr_type2,tr_type3);
00525 if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00526 MessageBox (GetFocus(),"External shader: Out of memory","Error",
00527 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00528 return NULL;
00529 }
00530 strcpy(Op,szbuf);
00531 return Op;
00532 }
00533
00534 BOOL CALLBACK BozoDlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00535 char str[16];
00536 switch( msg ) {
00537 case WM_INITDIALOG:
00538 sprintf(str,"%.2f",turb);
00539 SendDlgItemMessage(hwnd,DLG_BOZO_TURB,WM_SETTEXT,0,(LPARAM)str);
00540 SendDlgItemMessage(hwnd,DLG_BOZO_TURB,EM_LIMITTEXT,(WPARAM)12,0);
00541 sprintf(str,"%.2f",t1);
00542 SendDlgItemMessage(hwnd,DLG_BOZO_T1,WM_SETTEXT,0,(LPARAM)str);
00543 SendDlgItemMessage(hwnd,DLG_BOZO_T1,EM_LIMITTEXT,(WPARAM)12,0);
00544 sprintf(str,"%.2f",t2);
00545 SendDlgItemMessage(hwnd,DLG_BOZO_T2,WM_SETTEXT,0,(LPARAM)str);
00546 SendDlgItemMessage(hwnd,DLG_BOZO_T2,EM_LIMITTEXT,(WPARAM)12,0);
00547 sprintf(str,"%.2f",x);
00548 SendDlgItemMessage(hwnd,DLG_BOZO_XSCALE,WM_SETTEXT,0,(LPARAM)str);
00549 SendDlgItemMessage(hwnd,DLG_BOZO_XSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00550 sprintf(str,"%.2f",y);
00551 SendDlgItemMessage(hwnd,DLG_BOZO_YSCALE,WM_SETTEXT,0,(LPARAM)str);
00552 SendDlgItemMessage(hwnd,DLG_BOZO_YSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00553 sprintf(str,"%.2f",z);
00554 SendDlgItemMessage(hwnd,DLG_BOZO_ZSCALE,WM_SETTEXT,0,(LPARAM)str);
00555 SendDlgItemMessage(hwnd,DLG_BOZO_ZSCALE,EM_LIMITTEXT,(WPARAM)12,0);
00556 if(tr_type == 0)
00557 SendDlgItemMessage(hwnd,DLG_BOZO_SEMI,BM_SETCHECK,TRUE,0);
00558 else
00559 SendDlgItemMessage(hwnd,DLG_BOZO_SETT,BM_SETCHECK,TRUE,0);
00560 if(tr_type1 == 1)
00561 SendDlgItemMessage(hwnd,DLG_BOZO_CLEARC,BM_SETCHECK,TRUE,0);
00562 if(tr_type2 == 1)
00563 SendDlgItemMessage(hwnd,DLG_BOZO_CLEARS,BM_SETCHECK,TRUE,0);
00564 if(tr_type3 == 1)
00565 SendDlgItemMessage(hwnd,DLG_BOZO_CLEAR3,BM_SETCHECK,TRUE,0);
00566 CentreDialogOnScreen(hwnd);
00567 return TRUE;
00568 case WM_DRAWITEM:{
00569 LPDRAWITEMSTRUCT lpdis;
00570 HBRUSH hbr,hbrold;
00571 BYTE r,g,b;
00572 lpdis=(LPDRAWITEMSTRUCT)lparam;
00573 if(lpdis->CtlID == DLG_BOZO_COLOUR){
00574 r=(BYTE)c[0]; g=(BYTE)c[1]; b=(BYTE)c[2];
00575 if(lpdis->itemState & ODS_SELECTED)
00576 InvertRect(lpdis->hDC,&(lpdis->rcItem));
00577 else{
00578 hbr=CreateSolidBrush(RGB(r,g,b));
00579 hbrold=SelectObject(lpdis->hDC,hbr);
00580 Rectangle(lpdis->hDC,lpdis->rcItem.left,lpdis->rcItem.top,
00581 lpdis->rcItem.right,lpdis->rcItem.bottom);
00582 SelectObject(lpdis->hDC,hbrold);
00583 DeleteObject(hbr);
00584 }
00585 }
00586 }
00587 break;
00588 case WM_COMMAND:
00589 switch(LOWORD(wparam)){
00590 case DLG_BOZO_COLOUR:
00591 SetColour(c,hwnd);
00592 InvalidateRect(GetDlgItem(hwnd,DLG_BOZO_COLOUR),NULL,FALSE);
00593 break;
00594 case IDCANCEL:
00595 case DLG_BOZO_CANCEL:
00596 EndDialog(hwnd,FALSE);
00597 return(TRUE);
00598 case IDOK:
00599 case DLG_BOZO_OK:
00600 if(GetDlgItemText(hwnd,DLG_BOZO_TURB,str,10) == 0)
00601 EndDialog(hwnd,FALSE);
00602 if((turb=atof(str)) == 0)EndDialog(hwnd,FALSE);
00603 if(GetDlgItemText(hwnd,DLG_BOZO_T1,str,10) == 0)
00604 EndDialog(hwnd,FALSE);
00605 if((t1=atof(str)) == 0)EndDialog(hwnd,FALSE);
00606 if(GetDlgItemText(hwnd,DLG_BOZO_T2,str,10) == 0)
00607 EndDialog(hwnd,FALSE);
00608 if((t2=atof(str)) == 0)EndDialog(hwnd,FALSE);
00609 if(GetDlgItemText(hwnd,DLG_BOZO_XSCALE,str,10) == 0)
00610 EndDialog(hwnd,FALSE);
00611 if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00612 if(GetDlgItemText(hwnd,DLG_BOZO_YSCALE,str,10) == 0)
00613 EndDialog(hwnd,FALSE);
00614 if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00615 if(GetDlgItemText(hwnd,DLG_BOZO_ZSCALE,str,10) == 0)
00616 EndDialog(hwnd,FALSE);
00617 if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00618 if(SendDlgItemMessage(hwnd,DLG_BOZO_SETT,BM_GETCHECK,0,0))
00619 tr_type=1; else tr_type=0;
00620 if(SendDlgItemMessage(hwnd,DLG_BOZO_CLEARC,BM_GETCHECK,0,0))
00621 tr_type1=1; else tr_type1=0;
00622 if(SendDlgItemMessage(hwnd,DLG_BOZO_CLEARS,BM_GETCHECK,0,0))
00623 tr_type2=1; else tr_type2=0;
00624 if(SendDlgItemMessage(hwnd,DLG_BOZO_CLEAR3,BM_GETCHECK,0,0))
00625 tr_type3=1; else tr_type3=0;
00626 EndDialog(hwnd,TRUE);
00627 return(TRUE);
00628 default:
00629 break;
00630 }
00631 break;
00632 default: break;
00633 }
00634 return FALSE;
00635 }
00636