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 "spray.h"
00036
00037 double triangle(double value){
00038 register double offset;
00039 if (value >= 0.0) offset = value - floor(value);
00040 else offset = value - (-1.0 - floor(fabs(value)));
00041 if (offset >= 0.5) return (2.0 * (1.0 - offset));
00042 else return (2.0 * offset);
00043 }
00044
00045 #if __WATCOMC__
00046 int APIENTRY LibMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00047 #else
00048 BOOL WINAPI DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved){
00049 #endif
00050 HANDLE ghMod;
00051 switch (dwReason) {
00052 case DLL_PROCESS_ATTACH:
00053 #if __X__MIPS__
00054 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00055 #endif
00056 hDLLinstance = hDLL;
00057 break;
00058 case DLL_PROCESS_DETACH:
00059 #if __X__MIPS__
00060 if(!_CRT_INIT(hDLL,dwReason,lpReserved))return(int)FALSE;
00061 #endif
00062 break;
00063 }
00064 return (int)TRUE;
00065 }
00066
00067 #if __SC__
00068 #pragma startaddress(DllMain)
00069 #endif
00070
00071 static double density=0.1;
00072 static double c1[3]={0.0,0.0,0.0};
00073 static double x=1.0,y=1.0,z=1.0;
00074
00075 #if 0
00076 long CALLBACK ExternalTextureStartup(
00077 #else
00078 long _ExternalTextureStartup(
00079 #endif
00080 long frame,long nframes,char *parameter_list, X__SHADER *lpEVI){
00081 if(parameter_list[0] != '#'){
00082 MessageBox ( GetFocus(),
00083 (LPCTSTR) "External texture: Startup",
00084 (LPCTSTR) "Parameter list missing",
00085 MB_OK | MB_SYSTEMMODAL );
00086 }
00087 else {
00088 parameter_list++;
00089 sscanf(parameter_list,"%f %f %f %f %f %f %f",
00090 &x,&y,&z,&density,
00091 &c1[0],&c1[1],&c1[2]);
00092 }
00093 return LoadAndCompileShader("spray");
00094 }
00095
00096 #if 0
00097 long CALLBACK ExternalTextureMorph(
00098 #else
00099 long _ExternalTextureMorph(
00100 #endif
00101 char *parameter_list, double mr){
00102 int i;
00103 double density_m;
00104 double c1_m[3];
00105 double x_m,y_m,z_m;
00106 parameter_list++;
00107 sscanf(parameter_list,"%f %f %f %f %f %f %f",
00108 &x_m,&y_m,&z_m,&density_m,
00109 &c1_m[0],&c1_m[1],&c1_m[2]);
00110 for(i=0;i<3;i++)c1[i]=c1_m[i]+(c1[i]-c1_m[i])*mr;
00111 density=density_m+(density-density_m)*mr;
00112 x=x_m+(x-x_m)*mr;
00113 y=y_m+(y-y_m)*mr;
00114 z=z_m+(z-z_m)*mr;
00115 return 1;
00116 }
00117
00118 #if 0
00119 long CALLBACK ExternalTextureProcedure(
00120 #else
00121 long _ExternalTextureProcedure(
00122 #endif
00123 long coord_type, vector p, vector n,
00124 double alpha, double beta, double gamma,
00125 double bump, double map_x, double map_y,
00126 double *alpha_channel, unsigned char sc[3], double colour[3],
00127 double *reflectivity, double *transparency,
00128 X__SHADER *lpEVI
00129 ){
00130 double xx,yy,zz,noiseH;
00131 vector v;
00132 xx=alpha / x;
00133 yy=beta / y;
00134 zz=gamma / z;
00135 xx *= 5.0; yy *= 5.0; zz *= 5.0;
00136 vNoise(v,xx,yy,zz);
00137 v[0]=triangle(v[0]*50.0);
00138 v[1]=triangle(v[1]*50.0);
00139 v[2]=triangle(v[2]*50.0);
00140 nNoise(xx+v[0], yy+v[1], zz+v[2], &noiseH);
00141 if(noiseH > (1.0-density)){
00142 colour[0]=c1[0];
00143 colour[1]=c1[1];
00144 colour[2]=c1[2];
00145 *transparency=0.0;
00146 }
00147 return 1;
00148 }
00149
00150 void _ExternalTextureClose(X__SHADER *lpEVI){
00151 UnloadCompiledShader(tGLshaderID);
00152 }
00153
00154 long _ExternalTextureProcedureGL(
00155 double bump_scale,
00156 unsigned char sc[3],
00157 unsigned char ac[3],
00158 X__SHADER *lpEVI
00159 ){
00160 SetUniformVector(tGLshaderID,"C1",(GLfloat)c1[0]/255.0,(GLfloat)c1[1]/255.0,(GLfloat)c1[2]/255.0);
00161 SetUniformVector(tGLshaderID,"ScalingV",1.0/x,1.0/z,1.0/y);
00162 SetUniformVariable(tGLshaderID,"Density",density);
00163 DrawShadedPolygons(tmatpass,tpass,tprogID,tattrloc,tNface,tMainFp,tNvert,tMainVp);
00164 return 1;
00165 }
00167
00168 void CentreDialogOnScreen(HWND hwnd){
00169 RECT rcDlg;
00170 long Xres,Yres;
00171 Yres=GetSystemMetrics(SM_CYSCREEN);
00172 Xres=GetSystemMetrics(SM_CXSCREEN);
00173 GetWindowRect(hwnd,&rcDlg);
00174 OffsetRect(&rcDlg,-rcDlg.left,-rcDlg.top);
00175 OffsetRect(&rcDlg,(Xres-rcDlg.right)/2,(Yres-rcDlg.bottom)/2);
00176 SetWindowPos(hwnd,HWND_TOP,rcDlg.left,rcDlg.top,0,0,SWP_NOSIZE);
00177 return;
00178 }
00179
00180 static void SetColour(double *colour, HWND parent){
00181 CHOOSECOLOR cc;
00182 static COLORREF CustColours[16]={
00183 RGB(255,255,255), RGB(239,239,239), RGB(223,223,223), RGB(207,207,207),
00184 RGB(191,191,191), RGB(175,175,175), RGB(159,159,159), RGB(143,143,143),
00185 RGB(127,127,127), RGB(111,111,111), RGB( 95, 95, 95), RGB( 79, 79, 79),
00186 RGB( 63, 63, 63), RGB( 47, 47, 47), RGB( 31, 31, 31), RGB( 15, 15, 15) };
00187 cc.lStructSize=sizeof(CHOOSECOLOR);
00188 cc.hwndOwner=parent;
00189 cc.rgbResult=RGB((BYTE)colour[0],(BYTE)colour[1],(BYTE)colour[2]);
00190 cc.lpCustColors=(LPDWORD)CustColours;
00191 cc.Flags= CC_RGBINIT;
00192 cc.lCustData=(DWORD)0;
00193 if(ChooseColor(&cc)){
00194 colour[0]=(double)GetRValue(cc.rgbResult);
00195 colour[1]=(double)GetGValue(cc.rgbResult);
00196 colour[2]=(double)GetBValue(cc.rgbResult);
00197 }
00198 }
00199
00200 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
00201
00202 #if 0
00203 char * CALLBACK SetExternalParameters(
00204 #else
00205 char * _SetExternalParameters(
00206 #endif
00207 char *Op,
00208 HWND hWnd,
00209 X__MEMORY_MANAGER *lpEVI
00210 ){
00211 char szbuf[255],*Op1;
00212 if(Op != NULL){
00213 Op1=Op;
00214 Op1++;
00215 sscanf(Op1,"%f %f %f %f %f %f %f",
00216 &x,&y,&z,&density,
00217 &c1[0],&c1[1],&c1[2]);
00218 }
00219 if(DialogBox(hDLLinstance,MAKEINTRESOURCE(DLG),hWnd,
00220 (DLGPROC)DlgProc) == FALSE)return Op;
00221 if(Op != NULL)CALL_FREE(Op);
00222 sprintf(szbuf,"# %.2f %.2f %.2f %.3f "
00223 "%.2f %.2f %.2f ",
00224 x,y,z,density,
00225 c1[0],c1[1],c1[2]);
00226 if((Op=(char *)CALL_MALLOC(strlen(szbuf)+1)) == NULL){
00227 MessageBox (GetFocus(),"External shader: Out of memory","Error",
00228 MB_OK|MB_TASKMODAL|MB_ICONSTOP);
00229 return NULL;
00230 }
00231 strcpy(Op,szbuf);
00232 return Op;
00233 }
00234
00235 BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
00236 char str[16];
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",density);
00249 SendDlgItemMessage(hwnd,DLG_DENSITY,WM_SETTEXT,0,(LPARAM)str);
00250 SendDlgItemMessage(hwnd,DLG_DENSITY,EM_LIMITTEXT,(WPARAM)12,0);
00251 CentreDialogOnScreen(hwnd);
00252 return TRUE;
00253 case WM_DRAWITEM:{
00254 LPDRAWITEMSTRUCT lpdis;
00255 HBRUSH hbr,hbrold;
00256 BYTE r,g,b;
00257 lpdis=(LPDRAWITEMSTRUCT)lparam;
00258 if(lpdis->CtlID == DLG_COLOUR1){
00259 if(lpdis->CtlID == DLG_COLOUR1){
00260 r=(BYTE)c1[0]; g=(BYTE)c1[1]; b=(BYTE)c1[2];
00261 }
00262 if(lpdis->itemState & ODS_SELECTED)
00263 InvertRect(lpdis->hDC,&(lpdis->rcItem));
00264 else{
00265 hbr=CreateSolidBrush(RGB(r,g,b));
00266 hbrold=SelectObject(lpdis->hDC,hbr);
00267 Rectangle(lpdis->hDC,lpdis->rcItem.left,lpdis->rcItem.top,
00268 lpdis->rcItem.right,lpdis->rcItem.bottom);
00269 SelectObject(lpdis->hDC,hbrold);
00270 DeleteObject(hbr);
00271 }
00272 }
00273 }
00274 break;
00275 case WM_COMMAND:
00276 switch(LOWORD(wparam)){
00277 case DLG_COLOUR1:
00278 SetColour(c1,hwnd);
00279 InvalidateRect(GetDlgItem(hwnd,DLG_COLOUR1),NULL,FALSE);
00280 break;
00281 case IDCANCEL:
00282 EndDialog(hwnd,FALSE);
00283 return(TRUE);
00284 case IDOK:
00285 if(GetDlgItemText(hwnd,DLG_DENSITY,str,10) == 0)
00286 EndDialog(hwnd,FALSE);
00287 if((density=atof(str)) == 0)EndDialog(hwnd,FALSE);
00288 if(GetDlgItemText(hwnd,DLG_XSCALE,str,10) == 0)
00289 EndDialog(hwnd,FALSE);
00290 if((x=atof(str)) == 0)EndDialog(hwnd,FALSE);
00291 if(GetDlgItemText(hwnd,DLG_YSCALE,str,10) == 0)
00292 EndDialog(hwnd,FALSE);
00293 if((y=atof(str)) == 0)EndDialog(hwnd,FALSE);
00294 if(GetDlgItemText(hwnd,DLG_ZSCALE,str,10) == 0)
00295 EndDialog(hwnd,FALSE);
00296 if((z=atof(str)) == 0)EndDialog(hwnd,FALSE);
00297 EndDialog(hwnd,TRUE);
00298 return(TRUE);
00299 default:
00300 break;
00301 }
00302 break;
00303 default: break;
00304 }
00305 return FALSE;
00306 }