-void MapBrushes()
-{
- char hint[128];
- char skip[128];
- char sidetext[64];
- char surftext[64];
- char surftext2[64];
- char surft[64];
- float Steep;
- vec3_t PlaneNormal,SurfNormal;
- vec3_t t[2];
- int i, j, k;
- int surf;
- bool CheckAngle;
- BRUSH brush;
- XYZ v[8];
-
- strcpy(surftext,Texture[Game][0]);
- strcpy(sidetext,(strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- strcpy(surftext2,(strlen(Texture[Game][2]) ? Texture[Game][2] : Texture[Game][0]));
-
- // if surftext2 is identical to surftext, there's no need to
- // check surface angle
- if(!g_strcasecmp(surftext,surftext2))
- CheckAngle = FALSE;
- else
- {
- CheckAngle = TRUE;
- Steep = (float)cos((double)SlantAngle/57.2957795);
- switch(Plane)
- {
- case PLANE_XY0: PlaneNormal[0]= 0.;PlaneNormal[1]= 0.;PlaneNormal[2]= 1.;break;
- case PLANE_XY1: PlaneNormal[0]= 0.;PlaneNormal[1]= 0.;PlaneNormal[2]=-1.;break;
- case PLANE_XZ0: PlaneNormal[0]= 0.;PlaneNormal[1]= 1.;PlaneNormal[2]= 1.;break;
- case PLANE_XZ1: PlaneNormal[0]= 0.;PlaneNormal[1]=-1.;PlaneNormal[2]= 1.;break;
- case PLANE_YZ0: PlaneNormal[0]= 1.;PlaneNormal[1]= 0.;PlaneNormal[2]= 1.;break;
- case PLANE_YZ1: PlaneNormal[0]=-1.;PlaneNormal[1]= 0.;PlaneNormal[2]= 1.;break;
- }
- }
-
- OpenFuncGroup();
-
- for(i=0; i<NH; i++)
- {
- for(j=0; j<NV; j++)
- {
- if( (i+j) % 2 )
- {
- VectorCopy(xyz[i ][j ].p, v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i+1][j ].p, v[1].p);
- VectorCopy(xyz[i+1][j+1].p, v[2].p);
- break;
- default:
- VectorCopy(xyz[i+1][j+1].p, v[1].p);
- VectorCopy(xyz[i+1][j ].p, v[2].p);
- }
- }
- else
- {
- VectorCopy(xyz[i ][j ].p, v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i+1][j ].p, v[1].p);
- VectorCopy(xyz[i ][j+1].p, v[2].p);
- break;
- default:
- VectorCopy(xyz[i ][j+1].p, v[1].p);
- VectorCopy(xyz[i+1][j ].p, v[2].p);
- }
- }
- VectorCopy(v[0].p,v[3].p);
- VectorCopy(v[1].p,v[4].p);
- VectorCopy(v[2].p,v[5].p);
- switch(Plane)
- {
- case PLANE_XZ0:
- case PLANE_XZ1:
- v[0].p[1] = backface;
- v[1].p[1] = backface;
- v[2].p[1] = backface;
- break;
- case PLANE_YZ0:
- case PLANE_YZ1:
- v[3].p[0] = backface;
- v[4].p[0] = backface;
- v[5].p[0] = backface;
- break;
- default:
- v[3].p[2] = backface;
- v[4].p[2] = backface;
- v[5].p[2] = backface;
- }
-
- brush.Number = i*NV*2+j*2;
- brush.NumFaces = 5;
- XYZtoV(&v[0],&brush.face[0].v[0]);
- XYZtoV(&v[3],&brush.face[0].v[1]);
- XYZtoV(&v[4],&brush.face[0].v[2]);
- strcpy(brush.face[0].texture,
- (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- brush.face[0].Shift[0] = (float)TexOffset[0];
- brush.face[0].Shift[1] = (float)TexOffset[1];
- brush.face[0].Rotate = 0.;
- brush.face[0].Scale[0] = (float)TexScale[0];
- brush.face[0].Scale[1] = (float)TexScale[1];
- brush.face[0].Contents = contents;
- brush.face[0].Surface = surface[1];
- brush.face[0].Value = 0;
-
- XYZtoV(&v[1],&brush.face[1].v[0]);
- XYZtoV(&v[4],&brush.face[1].v[1]);
- XYZtoV(&v[5],&brush.face[1].v[2]);
- strcpy(brush.face[1].texture,
- (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- brush.face[1].Shift[0] = (float)TexOffset[0];
- brush.face[1].Shift[1] = (float)TexOffset[1];
- brush.face[1].Rotate = 0.;
- brush.face[1].Scale[0] = (float)TexScale[0];
- brush.face[1].Scale[1] = (float)TexScale[1];
- brush.face[1].Contents = contents;
- brush.face[1].Surface = surface[1];
- brush.face[1].Value = 0;
-
- XYZtoV(&v[2],&brush.face[2].v[0]);
- XYZtoV(&v[5],&brush.face[2].v[1]);
- XYZtoV(&v[3],&brush.face[2].v[2]);
- strcpy(brush.face[2].texture,
- (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- brush.face[2].Shift[0] = (float)TexOffset[0];
- brush.face[2].Shift[1] = (float)TexOffset[1];
- brush.face[2].Rotate = 0.;
- brush.face[2].Scale[0] = (float)TexScale[0];
- brush.face[2].Scale[1] = (float)TexScale[1];
- brush.face[2].Contents = contents;
- brush.face[2].Surface = surface[1];
- brush.face[2].Value = 0;
-
- if(CheckAngle && (Plane==PLANE_XZ0 || Plane==PLANE_XZ1))
- {
- XYZVectorSubtract(v[4].p,v[3].p,t[0]);
- XYZVectorSubtract(v[5].p,v[4].p,t[1]);
- CrossProduct(t[0],t[1],SurfNormal);
- VectorNormalize(SurfNormal,SurfNormal);
- if(DotProduct(SurfNormal,PlaneNormal) < Steep)
- {
- strcpy(surft,surftext2);
- surf = surface[2];
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
-
- XYZtoV(&v[3],&brush.face[3].v[0]);
- XYZtoV(&v[5],&brush.face[3].v[1]);
- XYZtoV(&v[4],&brush.face[3].v[2]);
- strcpy(brush.face[3].texture,
- (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? surft : sidetext));
- brush.face[3].Shift[0] = (float)TexOffset[0];
- brush.face[3].Shift[1] = (float)TexOffset[1];
- brush.face[3].Rotate = 0.;
- brush.face[3].Scale[0] = (float)TexScale[0];
- brush.face[3].Scale[1] = (float)TexScale[1];
- brush.face[3].Contents = contents;
- brush.face[3].Surface = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? surf : surface[1]);
- brush.face[3].Value = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? ArghRad2 : 0);
-
- if(CheckAngle && Plane!=PLANE_XZ0 && Plane!=PLANE_XZ1)
- {
- XYZVectorSubtract(v[2].p,v[0].p,t[0]);
- XYZVectorSubtract(v[1].p,v[2].p,t[1]);
- CrossProduct(t[0],t[1],SurfNormal);
- VectorNormalize(SurfNormal,SurfNormal);
- if(DotProduct(SurfNormal,PlaneNormal) < Steep)
- {
- strcpy(surft,surftext2);
- surf = surface[2];
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
-
- XYZtoV(&v[0],&brush.face[4].v[0]);
- XYZtoV(&v[1],&brush.face[4].v[1]);
- XYZtoV(&v[2],&brush.face[4].v[2]);
- strcpy(brush.face[4].texture,
- (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? sidetext : surft));
- brush.face[4].Shift[0] = (float)TexOffset[0];
- brush.face[4].Shift[1] = (float)TexOffset[1];
- brush.face[4].Rotate = 0.;
- brush.face[4].Scale[0] = (float)TexScale[0];
- brush.face[4].Scale[1] = (float)TexScale[1];
- brush.face[4].Contents = contents;
- brush.face[4].Surface = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? surface[1] : surf);
- brush.face[4].Value = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? 0 : ArghRad2);
-
- MakeBrush(&brush);
- if( (i+j) %2 )
- {
- VectorCopy(xyz[i ][j+1].p,v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i ][j ].p,v[1].p);
- VectorCopy(xyz[i+1][j+1].p,v[2].p);
- break;
- default:
- VectorCopy(xyz[i+1][j+1].p,v[1].p);
- VectorCopy(xyz[i ][j ].p,v[2].p);
- }
- }
- else
- {
- VectorCopy(xyz[i ][j+1].p,v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i+1][j ].p,v[1].p);
- VectorCopy(xyz[i+1][j+1].p,v[2].p);
- break;
- default:
- VectorCopy(xyz[i+1][j+1].p,v[1].p);
- VectorCopy(xyz[i+1][j ].p,v[2].p);
- }
- }
- VectorCopy(v[0].p,v[3].p);
- VectorCopy(v[1].p,v[4].p);
- VectorCopy(v[2].p,v[5].p);
- switch(Plane)
- {
- case PLANE_XZ0:
- case PLANE_XZ1:
- v[0].p[1] = backface;
- v[1].p[1] = backface;
- v[2].p[1] = backface;
- break;
- case PLANE_YZ0:
- case PLANE_YZ1:
- v[3].p[0] = backface;
- v[4].p[0] = backface;
- v[5].p[0] = backface;
- break;
- default:
- v[3].p[2] = backface;
- v[4].p[2] = backface;
- v[5].p[2] = backface;
- }
- brush.Number = i*NV*2+j*2+1;
- brush.NumFaces = 5;
- XYZtoV(&v[0],&brush.face[0].v[0]);
- XYZtoV(&v[3],&brush.face[0].v[1]);
- XYZtoV(&v[4],&brush.face[0].v[2]);
- strcpy(brush.face[0].texture,
- (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- brush.face[0].Shift[0] = (float)TexOffset[0];
- brush.face[0].Shift[1] = (float)TexOffset[1];
- brush.face[0].Rotate = 0.;
- brush.face[0].Scale[0] = (float)TexScale[0];
- brush.face[0].Scale[1] = (float)TexScale[1];
- brush.face[0].Contents = contents;
- brush.face[0].Surface = surface[1];
- brush.face[0].Value = 0;
-
- XYZtoV(&v[1],&brush.face[1].v[0]);
- XYZtoV(&v[4],&brush.face[1].v[1]);
- XYZtoV(&v[5],&brush.face[1].v[2]);
- strcpy(brush.face[1].texture,
- (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- brush.face[1].Shift[0] = (float)TexOffset[0];
- brush.face[1].Shift[1] = (float)TexOffset[1];
- brush.face[1].Rotate = 0.;
- brush.face[1].Scale[0] = (float)TexScale[0];
- brush.face[1].Scale[1] = (float)TexScale[1];
- brush.face[1].Contents = contents;
- brush.face[1].Surface = surface[1];
- brush.face[1].Value = 0;
-
- XYZtoV(&v[2],&brush.face[2].v[0]);
- XYZtoV(&v[5],&brush.face[2].v[1]);
- XYZtoV(&v[3],&brush.face[2].v[2]);
- strcpy(brush.face[2].texture,
- (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
- brush.face[2].Shift[0] = (float)TexOffset[0];
- brush.face[2].Shift[1] = (float)TexOffset[1];
- brush.face[2].Rotate = 0.;
- brush.face[2].Scale[0] = (float)TexScale[0];
- brush.face[2].Scale[1] = (float)TexScale[1];
- brush.face[2].Contents = contents;
- brush.face[2].Surface = surface[1];
- brush.face[2].Value = 0;
-
- if(CheckAngle && (Plane==PLANE_XZ0 || Plane==PLANE_XZ1))
- {
- XYZVectorSubtract(v[4].p,v[3].p,t[0]);
- XYZVectorSubtract(v[5].p,v[4].p,t[1]);
- CrossProduct(t[0],t[1],SurfNormal);
- VectorNormalize(SurfNormal,SurfNormal);
- if(DotProduct(SurfNormal,PlaneNormal) < Steep)
- {
- strcpy(surft,surftext2);
- surf = surface[2];
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
- XYZtoV(&v[3],&brush.face[3].v[0]);
- XYZtoV(&v[5],&brush.face[3].v[1]);
- XYZtoV(&v[4],&brush.face[3].v[2]);
- strcpy(brush.face[3].texture,
- (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? surft : sidetext));
- brush.face[3].Shift[0] = (float)TexOffset[0];
- brush.face[3].Shift[1] = (float)TexOffset[1];
- brush.face[3].Rotate = 0.;
- brush.face[3].Scale[0] = (float)TexScale[0];
- brush.face[3].Scale[1] = (float)TexScale[1];
- brush.face[3].Contents = contents;
- brush.face[3].Surface = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? surf : surface[1]);
- brush.face[3].Value = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? ArghRad2 : 0);
-
- if(CheckAngle && Plane!=PLANE_XZ0 && Plane!=PLANE_XZ1)
- {
- XYZVectorSubtract(v[2].p,v[0].p,t[0]);
- XYZVectorSubtract(v[1].p,v[2].p,t[1]);
- CrossProduct(t[0],t[1],SurfNormal);
- VectorNormalize(SurfNormal,SurfNormal);
- if(DotProduct(SurfNormal,PlaneNormal) < Steep)
- {
- strcpy(surft,surftext2);
- surf = surface[2];
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
- }
- else
- {
- strcpy(surft,surftext);
- surf = surface[0];
- }
- XYZtoV(&v[0],&brush.face[4].v[0]);
- XYZtoV(&v[1],&brush.face[4].v[1]);
- XYZtoV(&v[2],&brush.face[4].v[2]);
- strcpy(brush.face[4].texture,
- (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? sidetext : surft));
- brush.face[4].Shift[0] = (float)TexOffset[0];
- brush.face[4].Shift[1] = (float)TexOffset[1];
- brush.face[4].Rotate = 0.;
- brush.face[4].Scale[0] = (float)TexScale[0];
- brush.face[4].Scale[1] = (float)TexScale[1];
- brush.face[4].Contents = contents;
- brush.face[4].Surface = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? surface[1] : surf);
- brush.face[4].Value = (Plane==PLANE_XZ0 || Plane==PLANE_XZ1 ? 0 : ArghRad2);
-
- MakeBrush(&brush);
- }
- }
- CloseFuncGroup();
-
- if( AddHints || GimpHints )
- {
- int detail, i1, j1, N;
- double front;
-
- switch(Game)
- {
- case HALFLIFE:
- strcpy(hint,"HINT");
- strcpy(skip,"HINT");
- break;
- case SIN:
- strcpy(hint,"generic/misc/hint");
- strcpy(skip,"generic/misc/skip");
- break;
- case HERETIC2:
- strcpy(hint,"general/hint");
- strcpy(skip,"general/hint"); // Heretic2 doesn't have a skip texture
- break;
- case KINGPIN:
- strcpy(hint,"common/0_hint");
- strcpy(skip,"common/0_skip");
- break;
- case GENESIS3D:
- strcpy(hint,"hint");
- strcpy(skip,"hint");
- break;
- case QUAKE3:
- strcpy(hint,"textures/common/hint");
- strcpy(skip,"textures/common/skip");
- break;
- default:
- strcpy(hint,"e1u1/hint");
- strcpy(skip,"e1u1/skip");
- }
-
- OpenFuncGroup();
-
- if(AddHints==1)
- {
- detail = CONTENTS_DETAIL;
- N = 0;
- for(i=0; i<NH; i++)
- {
- i1 = i+1;
-
- for(j=0; j<NV; j++)
- {
-
- // For detail hint brushes, no need to use a hint brush over
- // EVERY grid square... it would be redundant. Instead use
- // a checkerboard pattern
- if((i+j)%2) continue;
-
- j1 = j+1;
-
- VectorCopy(xyz[i ][j ].p, v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i1][j ].p, v[1].p);
- VectorCopy(xyz[i1][j1].p, v[2].p);
- VectorCopy(xyz[i ][j1].p, v[3].p);
- break;
- default:
- VectorCopy(xyz[i ][j1].p, v[1].p);
- VectorCopy(xyz[i1][j1].p, v[2].p);
- VectorCopy(xyz[i1][j ].p, v[3].p);
- }
-
- VectorCopy(v[0].p,v[4].p);
- VectorCopy(v[1].p,v[5].p);
- VectorCopy(v[2].p,v[6].p);
- VectorCopy(v[3].p,v[7].p);
-
- switch(Plane)
- {
- case PLANE_XY1:
- front = LessThan(zmin,32.);
- v[4].p[2] = backface;
- v[5].p[2] = backface;
- v[6].p[2] = backface;
- v[7].p[2] = backface;
- break;
- case PLANE_XZ0:
- front = MoreThan(ymax,32.);
- v[0].p[1] = backface;
- v[1].p[1] = backface;
- v[2].p[1] = backface;
- v[3].p[1] = backface;
- break;
- case PLANE_XZ1:
- front = LessThan(ymin,32.);
- v[0].p[1] = backface;
- v[1].p[1] = backface;
- v[2].p[1] = backface;
- v[3].p[1] = backface;
- break;
- case PLANE_YZ0:
- front = MoreThan(xmax,32.);
- v[4].p[0] = backface;
- v[5].p[0] = backface;
- v[6].p[0] = backface;
- v[7].p[0] = backface;
- break;
- case PLANE_YZ1:
- front = LessThan(xmin,32.);
- v[4].p[0] = backface;
- v[5].p[0] = backface;
- v[6].p[0] = backface;
- v[7].p[0] = backface;
- break;
- default:
- front = MoreThan(zmax,32.);
- v[4].p[2] = backface;
- v[5].p[2] = backface;
- v[6].p[2] = backface;
- v[7].p[2] = backface;
- }
-
- switch(Plane)
- {
- case PLANE_XZ0:
- case PLANE_XZ1:
- v[4].p[1] = front;
- v[5].p[1] = v[4].p[1];
- v[6].p[1] = v[4].p[1];
- v[7].p[1] = v[4].p[1];
- break;
- case PLANE_YZ0:
- case PLANE_YZ1:
- v[0].p[0] = front;
- v[1].p[0] = v[0].p[0];
- v[2].p[0] = v[0].p[0];
- v[3].p[0] = v[0].p[0];
- break;
- default:
- v[0].p[2] = front;
- v[1].p[2] = v[0].p[2];
- v[2].p[2] = v[0].p[2];
- v[3].p[2] = v[0].p[2];
- }
-
- brush.NumFaces = 6;
- brush.Number = N;
- XYZtoV(&v[0],&brush.face[0].v[0]);
- XYZtoV(&v[1],&brush.face[0].v[1]);
- XYZtoV(&v[2],&brush.face[0].v[2]);
- strcpy(brush.face[0].texture,skip);
- brush.face[0].Shift[0] = 0.;
- brush.face[0].Shift[1] = 0.;
- brush.face[0].Rotate = 0.;
- brush.face[0].Scale[0] = 1.;
- brush.face[0].Scale[1] = 1.;
- brush.face[0].Contents = detail;
- brush.face[0].Surface = SURF_SKIP;
- brush.face[0].Value = 0;
-
- XYZtoV(&v[4],&brush.face[1].v[0]);
- XYZtoV(&v[7],&brush.face[1].v[1]);
- XYZtoV(&v[6],&brush.face[1].v[2]);
- strcpy(brush.face[1].texture,skip);
- brush.face[1].Shift[0] = 0.;
- brush.face[1].Shift[1] = 0.;
- brush.face[1].Rotate = 0.;
- brush.face[1].Scale[0] = 1.;
- brush.face[1].Scale[1] = 1.;
- brush.face[1].Contents = detail;
- brush.face[1].Surface = SURF_SKIP;
- brush.face[1].Value = 0;
-
- XYZtoV(&v[0],&brush.face[2].v[0]);
- XYZtoV(&v[4],&brush.face[2].v[1]);
- XYZtoV(&v[5],&brush.face[2].v[2]);
- strcpy(brush.face[2].texture,hint);
- brush.face[2].Shift[0] = 0.;
- brush.face[2].Shift[1] = 0.;
- brush.face[2].Rotate = 0.;
- brush.face[2].Scale[0] = 1.;
- brush.face[2].Scale[1] = 1.;
- brush.face[2].Contents = detail;
- brush.face[2].Surface = SURF_HINT;
- brush.face[2].Value = 0;
-
- XYZtoV(&v[1],&brush.face[3].v[0]);
- XYZtoV(&v[5],&brush.face[3].v[1]);
- XYZtoV(&v[6],&brush.face[3].v[2]);
- strcpy(brush.face[3].texture,hint);
- brush.face[3].Shift[0] = 0.;
- brush.face[3].Shift[1] = 0.;
- brush.face[3].Rotate = 0.;
- brush.face[3].Scale[0] = 1.;
- brush.face[3].Scale[1] = 1.;
- brush.face[3].Contents = detail;
- brush.face[3].Surface = SURF_HINT;
- brush.face[3].Value = 0;
-
- XYZtoV(&v[2],&brush.face[4].v[0]);
- XYZtoV(&v[6],&brush.face[4].v[1]);
- XYZtoV(&v[7],&brush.face[4].v[2]);
- strcpy(brush.face[4].texture,hint);
- brush.face[4].Shift[0] = 0.;
- brush.face[4].Shift[1] = 0.;
- brush.face[4].Rotate = 0.;
- brush.face[4].Scale[0] = 1.;
- brush.face[4].Scale[1] = 1.;
- brush.face[4].Contents = detail;
- brush.face[4].Surface = SURF_HINT;
- brush.face[4].Value = 0;
-
- XYZtoV(&v[3],&brush.face[5].v[0]);
- XYZtoV(&v[7],&brush.face[5].v[1]);
- XYZtoV(&v[4],&brush.face[5].v[2]);
- strcpy(brush.face[5].texture,hint);
- brush.face[5].Shift[0] = 0.;
- brush.face[5].Shift[1] = 0.;
- brush.face[5].Rotate = 0.;
- brush.face[5].Scale[0] = 1.;
- brush.face[5].Scale[1] = 1.;
- brush.face[5].Contents = detail;
- brush.face[5].Surface = SURF_HINT;
- brush.face[5].Value = 0;
-
- MakeBrush(&brush);
- N++;
- }
- }
- }
- if(GimpHints)
- {
- N = 0;
- // these brush parameters never change
- brush.NumFaces = 5;
- for(i=0; i<6; i++)
- {
- strcpy(brush.face[i].texture,hint);
- brush.face[i].Shift[0] = 0.;
- brush.face[i].Shift[1] = 0.;
- brush.face[i].Rotate = 0.;
- brush.face[i].Scale[0] = 1.;
- brush.face[i].Scale[1] = 1.;
- brush.face[i].Contents = 0;
- brush.face[i].Surface = SURF_HINT;
- brush.face[i].Value = 0;
- }
- for(i=0; i<NH; i++)
- {
- for(j=0; j<NV; j++)
- {
- for(k=0; k<2; k++)
- {
- if(k==0)
- {
- if( (i+j) % 2 )
- {
- VectorCopy(xyz[i ][j ].p, v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i+1][j ].p, v[1].p);
- VectorCopy(xyz[i+1][j+1].p, v[2].p);
- break;
- default:
- VectorCopy(xyz[i+1][j+1].p, v[1].p);
- VectorCopy(xyz[i+1][j ].p, v[2].p);
- }
- }
- else
- {
- VectorCopy(xyz[i ][j ].p, v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i+1][j ].p, v[1].p);
- VectorCopy(xyz[i ][j+1].p, v[2].p);
- break;
- default:
- VectorCopy(xyz[i ][j+1].p, v[1].p);
- VectorCopy(xyz[i+1][j ].p, v[2].p);
- }
- }
- }
- else
- {
- if( (i+j) %2 )
- {
- VectorCopy(xyz[i ][j+1].p,v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i ][j ].p,v[1].p);
- VectorCopy(xyz[i+1][j+1].p,v[2].p);
- break;
- default:
- VectorCopy(xyz[i+1][j+1].p,v[1].p);
- VectorCopy(xyz[i ][j ].p,v[2].p);
- }
- }
- else
- {
- VectorCopy(xyz[i ][j+1].p,v[0].p);
- switch(Plane)
- {
- case PLANE_XY1:
- case PLANE_XZ1:
- case PLANE_YZ1:
- VectorCopy(xyz[i+1][j ].p,v[1].p);
- VectorCopy(xyz[i+1][j+1].p,v[2].p);
- break;
- default:
- VectorCopy(xyz[i+1][j+1].p,v[1].p);
- VectorCopy(xyz[i+1][j ].p,v[2].p);
- }
- }
- }
- VectorCopy(v[0].p,v[3].p);
- VectorCopy(v[1].p,v[4].p);
- VectorCopy(v[2].p,v[5].p);
- switch(Plane)
- {
- case PLANE_XY0:
- v[0].p[2] += HINT_OFFSET;
- v[1].p[2] += HINT_OFFSET;
- v[2].p[2] += HINT_OFFSET;
+void MapBrushes(){
+ char hint[128];
+ char skip[128];
+ char sidetext[64];
+ char surftext[64];
+ char surftext2[64];
+ char surft[64];
+ float Steep;
+ vec3_t PlaneNormal,SurfNormal;
+ vec3_t t[2];
+ int i, j, k;
+ int surf;
+ bool CheckAngle;
+ BRUSH brush;
+ XYZ v[8];
+
+ strcpy( surftext,Texture[Game][0] );
+ strcpy( sidetext,( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ strcpy( surftext2,( strlen( Texture[Game][2] ) ? Texture[Game][2] : Texture[Game][0] ) );
+
+ // if surftext2 is identical to surftext, there's no need to
+ // check surface angle
+ if ( !g_strcasecmp( surftext,surftext2 ) ) {
+ CheckAngle = FALSE;
+ }
+ else
+ {
+ CheckAngle = TRUE;
+ Steep = (float)cos( (double)SlantAngle / 57.2957795 );
+ switch ( Plane )
+ {
+ case PLANE_XY0: PlaneNormal[0] = 0.; PlaneNormal[1] = 0.; PlaneNormal[2] = 1.; break;
+ case PLANE_XY1: PlaneNormal[0] = 0.; PlaneNormal[1] = 0.; PlaneNormal[2] = -1.; break;
+ case PLANE_XZ0: PlaneNormal[0] = 0.; PlaneNormal[1] = 1.; PlaneNormal[2] = 1.; break;
+ case PLANE_XZ1: PlaneNormal[0] = 0.; PlaneNormal[1] = -1.; PlaneNormal[2] = 1.; break;
+ case PLANE_YZ0: PlaneNormal[0] = 1.; PlaneNormal[1] = 0.; PlaneNormal[2] = 1.; break;
+ case PLANE_YZ1: PlaneNormal[0] = -1.; PlaneNormal[1] = 0.; PlaneNormal[2] = 1.; break;
+ }
+ }
+
+ OpenFuncGroup();
+
+ for ( i = 0; i < NH; i++ )
+ {
+ for ( j = 0; j < NV; j++ )
+ {
+ if ( ( i + j ) % 2 ) {
+ VectorCopy( xyz[i ][j ].p, v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i + 1][j ].p, v[1].p );
+ VectorCopy( xyz[i + 1][j + 1].p, v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i + 1][j + 1].p, v[1].p );
+ VectorCopy( xyz[i + 1][j ].p, v[2].p );
+ }
+ }
+ else
+ {
+ VectorCopy( xyz[i ][j ].p, v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i + 1][j ].p, v[1].p );
+ VectorCopy( xyz[i ][j + 1].p, v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i ][j + 1].p, v[1].p );
+ VectorCopy( xyz[i + 1][j ].p, v[2].p );
+ }
+ }
+ VectorCopy( v[0].p,v[3].p );
+ VectorCopy( v[1].p,v[4].p );
+ VectorCopy( v[2].p,v[5].p );
+ switch ( Plane )
+ {
+ case PLANE_XZ0:
+ case PLANE_XZ1:
+ v[0].p[1] = backface;
+ v[1].p[1] = backface;
+ v[2].p[1] = backface;
+ break;
+ case PLANE_YZ0:
+ case PLANE_YZ1:
+ v[3].p[0] = backface;
+ v[4].p[0] = backface;
+ v[5].p[0] = backface;
+ break;
+ default:
+ v[3].p[2] = backface;
+ v[4].p[2] = backface;
+ v[5].p[2] = backface;
+ }
+
+ brush.Number = i * NV * 2 + j * 2;
+ brush.NumFaces = 5;
+ XYZtoV( &v[0],&brush.face[0].v[0] );
+ XYZtoV( &v[3],&brush.face[0].v[1] );
+ XYZtoV( &v[4],&brush.face[0].v[2] );
+ strcpy( brush.face[0].texture,
+ ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ brush.face[0].Shift[0] = (float)TexOffset[0];
+ brush.face[0].Shift[1] = (float)TexOffset[1];
+ brush.face[0].Rotate = 0.;
+ brush.face[0].Scale[0] = (float)TexScale[0];
+ brush.face[0].Scale[1] = (float)TexScale[1];
+ brush.face[0].Contents = contents;
+ brush.face[0].Surface = surface[1];
+ brush.face[0].Value = 0;
+
+ XYZtoV( &v[1],&brush.face[1].v[0] );
+ XYZtoV( &v[4],&brush.face[1].v[1] );
+ XYZtoV( &v[5],&brush.face[1].v[2] );
+ strcpy( brush.face[1].texture,
+ ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ brush.face[1].Shift[0] = (float)TexOffset[0];
+ brush.face[1].Shift[1] = (float)TexOffset[1];
+ brush.face[1].Rotate = 0.;
+ brush.face[1].Scale[0] = (float)TexScale[0];
+ brush.face[1].Scale[1] = (float)TexScale[1];
+ brush.face[1].Contents = contents;
+ brush.face[1].Surface = surface[1];
+ brush.face[1].Value = 0;
+
+ XYZtoV( &v[2],&brush.face[2].v[0] );
+ XYZtoV( &v[5],&brush.face[2].v[1] );
+ XYZtoV( &v[3],&brush.face[2].v[2] );
+ strcpy( brush.face[2].texture,
+ ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ brush.face[2].Shift[0] = (float)TexOffset[0];
+ brush.face[2].Shift[1] = (float)TexOffset[1];
+ brush.face[2].Rotate = 0.;
+ brush.face[2].Scale[0] = (float)TexScale[0];
+ brush.face[2].Scale[1] = (float)TexScale[1];
+ brush.face[2].Contents = contents;
+ brush.face[2].Surface = surface[1];
+ brush.face[2].Value = 0;
+
+ if ( CheckAngle && ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ) ) {
+ XYZVectorSubtract( v[4].p,v[3].p,t[0] );
+ XYZVectorSubtract( v[5].p,v[4].p,t[1] );
+ CrossProduct( t[0],t[1],SurfNormal );
+ VectorNormalize( SurfNormal,SurfNormal );
+ if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
+ strcpy( surft,surftext2 );
+ surf = surface[2];
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+
+ XYZtoV( &v[3],&brush.face[3].v[0] );
+ XYZtoV( &v[5],&brush.face[3].v[1] );
+ XYZtoV( &v[4],&brush.face[3].v[2] );
+ strcpy( brush.face[3].texture,
+ ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surft : sidetext ) );
+ brush.face[3].Shift[0] = (float)TexOffset[0];
+ brush.face[3].Shift[1] = (float)TexOffset[1];
+ brush.face[3].Rotate = 0.;
+ brush.face[3].Scale[0] = (float)TexScale[0];
+ brush.face[3].Scale[1] = (float)TexScale[1];
+ brush.face[3].Contents = contents;
+ brush.face[3].Surface = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surf : surface[1] );
+ brush.face[3].Value = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? ArghRad2 : 0 );
+
+ if ( CheckAngle && Plane != PLANE_XZ0 && Plane != PLANE_XZ1 ) {
+ XYZVectorSubtract( v[2].p,v[0].p,t[0] );
+ XYZVectorSubtract( v[1].p,v[2].p,t[1] );
+ CrossProduct( t[0],t[1],SurfNormal );
+ VectorNormalize( SurfNormal,SurfNormal );
+ if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
+ strcpy( surft,surftext2 );
+ surf = surface[2];
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+
+ XYZtoV( &v[0],&brush.face[4].v[0] );
+ XYZtoV( &v[1],&brush.face[4].v[1] );
+ XYZtoV( &v[2],&brush.face[4].v[2] );
+ strcpy( brush.face[4].texture,
+ ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? sidetext : surft ) );
+ brush.face[4].Shift[0] = (float)TexOffset[0];
+ brush.face[4].Shift[1] = (float)TexOffset[1];
+ brush.face[4].Rotate = 0.;
+ brush.face[4].Scale[0] = (float)TexScale[0];
+ brush.face[4].Scale[1] = (float)TexScale[1];
+ brush.face[4].Contents = contents;
+ brush.face[4].Surface = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surface[1] : surf );
+ brush.face[4].Value = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? 0 : ArghRad2 );
+
+ MakeBrush( &brush );
+ if ( ( i + j ) % 2 ) {
+ VectorCopy( xyz[i ][j + 1].p,v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i ][j ].p,v[1].p );
+ VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
+ VectorCopy( xyz[i ][j ].p,v[2].p );
+ }
+ }
+ else
+ {
+ VectorCopy( xyz[i ][j + 1].p,v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i + 1][j ].p,v[1].p );
+ VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
+ VectorCopy( xyz[i + 1][j ].p,v[2].p );
+ }
+ }
+ VectorCopy( v[0].p,v[3].p );
+ VectorCopy( v[1].p,v[4].p );
+ VectorCopy( v[2].p,v[5].p );
+ switch ( Plane )
+ {
+ case PLANE_XZ0:
+ case PLANE_XZ1:
+ v[0].p[1] = backface;
+ v[1].p[1] = backface;
+ v[2].p[1] = backface;
+ break;
+ case PLANE_YZ0:
+ case PLANE_YZ1:
+ v[3].p[0] = backface;
+ v[4].p[0] = backface;
+ v[5].p[0] = backface;
+ break;
+ default:
+ v[3].p[2] = backface;
+ v[4].p[2] = backface;
+ v[5].p[2] = backface;
+ }
+ brush.Number = i * NV * 2 + j * 2 + 1;
+ brush.NumFaces = 5;
+ XYZtoV( &v[0],&brush.face[0].v[0] );
+ XYZtoV( &v[3],&brush.face[0].v[1] );
+ XYZtoV( &v[4],&brush.face[0].v[2] );
+ strcpy( brush.face[0].texture,
+ ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ brush.face[0].Shift[0] = (float)TexOffset[0];
+ brush.face[0].Shift[1] = (float)TexOffset[1];
+ brush.face[0].Rotate = 0.;
+ brush.face[0].Scale[0] = (float)TexScale[0];
+ brush.face[0].Scale[1] = (float)TexScale[1];
+ brush.face[0].Contents = contents;
+ brush.face[0].Surface = surface[1];
+ brush.face[0].Value = 0;
+
+ XYZtoV( &v[1],&brush.face[1].v[0] );
+ XYZtoV( &v[4],&brush.face[1].v[1] );
+ XYZtoV( &v[5],&brush.face[1].v[2] );
+ strcpy( brush.face[1].texture,
+ ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ brush.face[1].Shift[0] = (float)TexOffset[0];
+ brush.face[1].Shift[1] = (float)TexOffset[1];
+ brush.face[1].Rotate = 0.;
+ brush.face[1].Scale[0] = (float)TexScale[0];
+ brush.face[1].Scale[1] = (float)TexScale[1];
+ brush.face[1].Contents = contents;
+ brush.face[1].Surface = surface[1];
+ brush.face[1].Value = 0;
+
+ XYZtoV( &v[2],&brush.face[2].v[0] );
+ XYZtoV( &v[5],&brush.face[2].v[1] );
+ XYZtoV( &v[3],&brush.face[2].v[2] );
+ strcpy( brush.face[2].texture,
+ ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
+ brush.face[2].Shift[0] = (float)TexOffset[0];
+ brush.face[2].Shift[1] = (float)TexOffset[1];
+ brush.face[2].Rotate = 0.;
+ brush.face[2].Scale[0] = (float)TexScale[0];
+ brush.face[2].Scale[1] = (float)TexScale[1];
+ brush.face[2].Contents = contents;
+ brush.face[2].Surface = surface[1];
+ brush.face[2].Value = 0;
+
+ if ( CheckAngle && ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ) ) {
+ XYZVectorSubtract( v[4].p,v[3].p,t[0] );
+ XYZVectorSubtract( v[5].p,v[4].p,t[1] );
+ CrossProduct( t[0],t[1],SurfNormal );
+ VectorNormalize( SurfNormal,SurfNormal );
+ if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
+ strcpy( surft,surftext2 );
+ surf = surface[2];
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+ XYZtoV( &v[3],&brush.face[3].v[0] );
+ XYZtoV( &v[5],&brush.face[3].v[1] );
+ XYZtoV( &v[4],&brush.face[3].v[2] );
+ strcpy( brush.face[3].texture,
+ ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surft : sidetext ) );
+ brush.face[3].Shift[0] = (float)TexOffset[0];
+ brush.face[3].Shift[1] = (float)TexOffset[1];
+ brush.face[3].Rotate = 0.;
+ brush.face[3].Scale[0] = (float)TexScale[0];
+ brush.face[3].Scale[1] = (float)TexScale[1];
+ brush.face[3].Contents = contents;
+ brush.face[3].Surface = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surf : surface[1] );
+ brush.face[3].Value = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? ArghRad2 : 0 );
+
+ if ( CheckAngle && Plane != PLANE_XZ0 && Plane != PLANE_XZ1 ) {
+ XYZVectorSubtract( v[2].p,v[0].p,t[0] );
+ XYZVectorSubtract( v[1].p,v[2].p,t[1] );
+ CrossProduct( t[0],t[1],SurfNormal );
+ VectorNormalize( SurfNormal,SurfNormal );
+ if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
+ strcpy( surft,surftext2 );
+ surf = surface[2];
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+ }
+ else
+ {
+ strcpy( surft,surftext );
+ surf = surface[0];
+ }
+ XYZtoV( &v[0],&brush.face[4].v[0] );
+ XYZtoV( &v[1],&brush.face[4].v[1] );
+ XYZtoV( &v[2],&brush.face[4].v[2] );
+ strcpy( brush.face[4].texture,
+ ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? sidetext : surft ) );
+ brush.face[4].Shift[0] = (float)TexOffset[0];
+ brush.face[4].Shift[1] = (float)TexOffset[1];
+ brush.face[4].Rotate = 0.;
+ brush.face[4].Scale[0] = (float)TexScale[0];
+ brush.face[4].Scale[1] = (float)TexScale[1];
+ brush.face[4].Contents = contents;
+ brush.face[4].Surface = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surface[1] : surf );
+ brush.face[4].Value = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? 0 : ArghRad2 );
+
+ MakeBrush( &brush );
+ }
+ }
+ CloseFuncGroup();
+
+ if ( AddHints || GimpHints ) {
+ int detail, i1, j1, N;
+ double front;
+
+ switch ( Game )
+ {
+ case HALFLIFE:
+ strcpy( hint,"HINT" );
+ strcpy( skip,"HINT" );
+ break;
+ case SIN:
+ strcpy( hint,"generic/misc/hint" );
+ strcpy( skip,"generic/misc/skip" );
+ break;
+ case HERETIC2:
+ strcpy( hint,"general/hint" );
+ strcpy( skip,"general/hint" ); // Heretic2 doesn't have a skip texture
+ break;
+ case KINGPIN:
+ strcpy( hint,"common/0_hint" );
+ strcpy( skip,"common/0_skip" );
+ break;
+ case GENESIS3D:
+ strcpy( hint,"hint" );
+ strcpy( skip,"hint" );
+ break;
+ case QUAKE3:
+ strcpy( hint,"textures/common/hint" );
+ strcpy( skip,"textures/common/skip" );
+ break;
+ default:
+ strcpy( hint,"e1u1/hint" );
+ strcpy( skip,"e1u1/skip" );
+ }
+
+ OpenFuncGroup();
+
+ if ( AddHints == 1 ) {
+ detail = CONTENTS_DETAIL;
+ N = 0;
+ for ( i = 0; i < NH; i++ )
+ {
+ i1 = i + 1;
+
+ for ( j = 0; j < NV; j++ )
+ {
+
+ // For detail hint brushes, no need to use a hint brush over
+ // EVERY grid square... it would be redundant. Instead use
+ // a checkerboard pattern
+ if ( ( i + j ) % 2 ) {
+ continue;
+ }
+
+ j1 = j + 1;
+
+ VectorCopy( xyz[i ][j ].p, v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i1][j ].p, v[1].p );
+ VectorCopy( xyz[i1][j1].p, v[2].p );
+ VectorCopy( xyz[i ][j1].p, v[3].p );
+ break;
+ default:
+ VectorCopy( xyz[i ][j1].p, v[1].p );
+ VectorCopy( xyz[i1][j1].p, v[2].p );
+ VectorCopy( xyz[i1][j ].p, v[3].p );
+ }
+
+ VectorCopy( v[0].p,v[4].p );
+ VectorCopy( v[1].p,v[5].p );
+ VectorCopy( v[2].p,v[6].p );
+ VectorCopy( v[3].p,v[7].p );
+
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ front = LessThan( zmin,32. );
+ v[4].p[2] = backface;
+ v[5].p[2] = backface;
+ v[6].p[2] = backface;
+ v[7].p[2] = backface;
+ break;
+ case PLANE_XZ0:
+ front = MoreThan( ymax,32. );
+ v[0].p[1] = backface;
+ v[1].p[1] = backface;
+ v[2].p[1] = backface;
+ v[3].p[1] = backface;
+ break;
+ case PLANE_XZ1:
+ front = LessThan( ymin,32. );
+ v[0].p[1] = backface;
+ v[1].p[1] = backface;
+ v[2].p[1] = backface;
+ v[3].p[1] = backface;
+ break;
+ case PLANE_YZ0:
+ front = MoreThan( xmax,32. );
+ v[4].p[0] = backface;
+ v[5].p[0] = backface;
+ v[6].p[0] = backface;
+ v[7].p[0] = backface;
+ break;
+ case PLANE_YZ1:
+ front = LessThan( xmin,32. );
+ v[4].p[0] = backface;
+ v[5].p[0] = backface;
+ v[6].p[0] = backface;
+ v[7].p[0] = backface;
+ break;
+ default:
+ front = MoreThan( zmax,32. );
+ v[4].p[2] = backface;
+ v[5].p[2] = backface;
+ v[6].p[2] = backface;
+ v[7].p[2] = backface;
+ }
+
+ switch ( Plane )
+ {
+ case PLANE_XZ0:
+ case PLANE_XZ1:
+ v[4].p[1] = front;
+ v[5].p[1] = v[4].p[1];
+ v[6].p[1] = v[4].p[1];
+ v[7].p[1] = v[4].p[1];
+ break;
+ case PLANE_YZ0:
+ case PLANE_YZ1:
+ v[0].p[0] = front;
+ v[1].p[0] = v[0].p[0];
+ v[2].p[0] = v[0].p[0];
+ v[3].p[0] = v[0].p[0];
+ break;
+ default:
+ v[0].p[2] = front;
+ v[1].p[2] = v[0].p[2];
+ v[2].p[2] = v[0].p[2];
+ v[3].p[2] = v[0].p[2];
+ }
+
+ brush.NumFaces = 6;
+ brush.Number = N;
+ XYZtoV( &v[0],&brush.face[0].v[0] );
+ XYZtoV( &v[1],&brush.face[0].v[1] );
+ XYZtoV( &v[2],&brush.face[0].v[2] );
+ strcpy( brush.face[0].texture,skip );
+ brush.face[0].Shift[0] = 0.;
+ brush.face[0].Shift[1] = 0.;
+ brush.face[0].Rotate = 0.;
+ brush.face[0].Scale[0] = 1.;
+ brush.face[0].Scale[1] = 1.;
+ brush.face[0].Contents = detail;
+ brush.face[0].Surface = SURF_SKIP;
+ brush.face[0].Value = 0;
+
+ XYZtoV( &v[4],&brush.face[1].v[0] );
+ XYZtoV( &v[7],&brush.face[1].v[1] );
+ XYZtoV( &v[6],&brush.face[1].v[2] );
+ strcpy( brush.face[1].texture,skip );
+ brush.face[1].Shift[0] = 0.;
+ brush.face[1].Shift[1] = 0.;
+ brush.face[1].Rotate = 0.;
+ brush.face[1].Scale[0] = 1.;
+ brush.face[1].Scale[1] = 1.;
+ brush.face[1].Contents = detail;
+ brush.face[1].Surface = SURF_SKIP;
+ brush.face[1].Value = 0;
+
+ XYZtoV( &v[0],&brush.face[2].v[0] );
+ XYZtoV( &v[4],&brush.face[2].v[1] );
+ XYZtoV( &v[5],&brush.face[2].v[2] );
+ strcpy( brush.face[2].texture,hint );
+ brush.face[2].Shift[0] = 0.;
+ brush.face[2].Shift[1] = 0.;
+ brush.face[2].Rotate = 0.;
+ brush.face[2].Scale[0] = 1.;
+ brush.face[2].Scale[1] = 1.;
+ brush.face[2].Contents = detail;
+ brush.face[2].Surface = SURF_HINT;
+ brush.face[2].Value = 0;
+
+ XYZtoV( &v[1],&brush.face[3].v[0] );
+ XYZtoV( &v[5],&brush.face[3].v[1] );
+ XYZtoV( &v[6],&brush.face[3].v[2] );
+ strcpy( brush.face[3].texture,hint );
+ brush.face[3].Shift[0] = 0.;
+ brush.face[3].Shift[1] = 0.;
+ brush.face[3].Rotate = 0.;
+ brush.face[3].Scale[0] = 1.;
+ brush.face[3].Scale[1] = 1.;
+ brush.face[3].Contents = detail;
+ brush.face[3].Surface = SURF_HINT;
+ brush.face[3].Value = 0;
+
+ XYZtoV( &v[2],&brush.face[4].v[0] );
+ XYZtoV( &v[6],&brush.face[4].v[1] );
+ XYZtoV( &v[7],&brush.face[4].v[2] );
+ strcpy( brush.face[4].texture,hint );
+ brush.face[4].Shift[0] = 0.;
+ brush.face[4].Shift[1] = 0.;
+ brush.face[4].Rotate = 0.;
+ brush.face[4].Scale[0] = 1.;
+ brush.face[4].Scale[1] = 1.;
+ brush.face[4].Contents = detail;
+ brush.face[4].Surface = SURF_HINT;
+ brush.face[4].Value = 0;
+
+ XYZtoV( &v[3],&brush.face[5].v[0] );
+ XYZtoV( &v[7],&brush.face[5].v[1] );
+ XYZtoV( &v[4],&brush.face[5].v[2] );
+ strcpy( brush.face[5].texture,hint );
+ brush.face[5].Shift[0] = 0.;
+ brush.face[5].Shift[1] = 0.;
+ brush.face[5].Rotate = 0.;
+ brush.face[5].Scale[0] = 1.;
+ brush.face[5].Scale[1] = 1.;
+ brush.face[5].Contents = detail;
+ brush.face[5].Surface = SURF_HINT;
+ brush.face[5].Value = 0;
+
+ MakeBrush( &brush );
+ N++;
+ }
+ }
+ }
+ if ( GimpHints ) {
+ N = 0;
+ // these brush parameters never change
+ brush.NumFaces = 5;
+ for ( i = 0; i < 6; i++ )
+ {
+ strcpy( brush.face[i].texture,hint );
+ brush.face[i].Shift[0] = 0.;
+ brush.face[i].Shift[1] = 0.;
+ brush.face[i].Rotate = 0.;
+ brush.face[i].Scale[0] = 1.;
+ brush.face[i].Scale[1] = 1.;
+ brush.face[i].Contents = 0;
+ brush.face[i].Surface = SURF_HINT;
+ brush.face[i].Value = 0;
+ }
+ for ( i = 0; i < NH; i++ )
+ {
+ for ( j = 0; j < NV; j++ )
+ {
+ for ( k = 0; k < 2; k++ )
+ {
+ if ( k == 0 ) {
+ if ( ( i + j ) % 2 ) {
+ VectorCopy( xyz[i ][j ].p, v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i + 1][j ].p, v[1].p );
+ VectorCopy( xyz[i + 1][j + 1].p, v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i + 1][j + 1].p, v[1].p );
+ VectorCopy( xyz[i + 1][j ].p, v[2].p );
+ }
+ }
+ else
+ {
+ VectorCopy( xyz[i ][j ].p, v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i + 1][j ].p, v[1].p );
+ VectorCopy( xyz[i ][j + 1].p, v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i ][j + 1].p, v[1].p );
+ VectorCopy( xyz[i + 1][j ].p, v[2].p );
+ }
+ }
+ }
+ else
+ {
+ if ( ( i + j ) % 2 ) {
+ VectorCopy( xyz[i ][j + 1].p,v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i ][j ].p,v[1].p );
+ VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
+ VectorCopy( xyz[i ][j ].p,v[2].p );
+ }
+ }
+ else
+ {
+ VectorCopy( xyz[i ][j + 1].p,v[0].p );
+ switch ( Plane )
+ {
+ case PLANE_XY1:
+ case PLANE_XZ1:
+ case PLANE_YZ1:
+ VectorCopy( xyz[i + 1][j ].p,v[1].p );
+ VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
+ break;
+ default:
+ VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
+ VectorCopy( xyz[i + 1][j ].p,v[2].p );
+ }
+ }
+ }
+ VectorCopy( v[0].p,v[3].p );
+ VectorCopy( v[1].p,v[4].p );
+ VectorCopy( v[2].p,v[5].p );
+ switch ( Plane )
+ {
+ case PLANE_XY0:
+ v[0].p[2] += HINT_OFFSET;
+ v[1].p[2] += HINT_OFFSET;
+ v[2].p[2] += HINT_OFFSET;