void MakeBrushes(int NumTris, NODE *Node, TRI *Tri,bool surf, int offset,char *texture0, char *texture1, char *texture2) { extern double backface; BRUSH brush; int contents; int i, j; float Steep; vec3_t PlaneNormal,SurfNormal; bool CheckAngle; vec3_t t[2]; // if texture2 is identical to texture0, there's no need to // check surface angle if(!g_strcasecmp(texture0,texture2) || !strlen(texture2)) 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; } } contents = 0; if(surf) { if(UseDetail) contents += CONTENTS_DETAIL; if(UseLadder) contents += CONTENTS_LADDER; } OpenFuncGroup(); for(i=0; i<NumTris; i++) { brush.Number = i; brush.NumFaces = 5; // front brush.face[0].v[0][0] = Node[Tri[i].v[0]].p[0]; brush.face[0].v[0][1] = Node[Tri[i].v[0]].p[1]; brush.face[0].v[0][2] = Node[Tri[i].v[0]].p[2]; brush.face[0].v[1][0] = Node[Tri[i].v[2]].p[0]; brush.face[0].v[1][1] = Node[Tri[i].v[2]].p[1]; brush.face[0].v[1][2] = Node[Tri[i].v[2]].p[2]; brush.face[0].v[2][0] = Node[Tri[i].v[1]].p[0]; brush.face[0].v[2][1] = Node[Tri[i].v[1]].p[1]; brush.face[0].v[2][2] = Node[Tri[i].v[1]].p[2]; if(offset != 0) { switch(Plane) { case PLANE_XY0: brush.face[0].v[0][2] += offset; brush.face[0].v[1][2] += offset; brush.face[0].v[1][2] += offset; break; case PLANE_XY1: brush.face[0].v[0][2] -= offset; brush.face[0].v[1][2] -= offset; brush.face[0].v[1][2] -= offset; break; case PLANE_XZ0: brush.face[0].v[0][1] += offset; brush.face[0].v[1][1] += offset; brush.face[0].v[1][1] += offset; break; case PLANE_XZ1: brush.face[0].v[0][1] -= offset; brush.face[0].v[1][1] -= offset; brush.face[0].v[1][1] -= offset; break; case PLANE_YZ0: brush.face[0].v[0][0] += offset; brush.face[0].v[1][0] += offset; brush.face[0].v[1][0] += offset; break; case PLANE_YZ1: brush.face[0].v[0][0] -= offset; brush.face[0].v[1][0] -= offset; brush.face[0].v[1][0] -= offset; break; } } switch(Plane) { case PLANE_XZ0: case PLANE_XZ1: // back brush.face[1].v[0][0] = Node[Tri[i].v[0]].p[0]; brush.face[1].v[0][1] = (float)backface; brush.face[1].v[0][2] = Node[Tri[i].v[0]].p[2]; brush.face[1].v[1][0] = Node[Tri[i].v[1]].p[0]; brush.face[1].v[1][1] = (float)backface; brush.face[1].v[1][2] = Node[Tri[i].v[1]].p[2]; brush.face[1].v[2][0] = Node[Tri[i].v[2]].p[0]; brush.face[1].v[2][1] = (float)backface; brush.face[1].v[2][2] = Node[Tri[i].v[2]].p[2]; // 0-1 side brush.face[2].v[0][0] = Node[Tri[i].v[0]].p[0]; brush.face[2].v[0][1] = Node[Tri[i].v[0]].p[1]; brush.face[2].v[0][2] = Node[Tri[i].v[0]].p[2]; brush.face[2].v[1][0] = Node[Tri[i].v[1]].p[0]; brush.face[2].v[1][1] = Node[Tri[i].v[1]].p[1]; brush.face[2].v[1][2] = Node[Tri[i].v[1]].p[2]; brush.face[2].v[2][0] = Node[Tri[i].v[1]].p[0]; brush.face[2].v[2][1] = (float)backface; brush.face[2].v[2][2] = Node[Tri[i].v[1]].p[2]; // 1-2 side brush.face[3].v[0][0] = Node[Tri[i].v[1]].p[0]; brush.face[3].v[0][1] = Node[Tri[i].v[1]].p[1]; brush.face[3].v[0][2] = Node[Tri[i].v[1]].p[2]; brush.face[3].v[1][0] = Node[Tri[i].v[2]].p[0]; brush.face[3].v[1][1] = Node[Tri[i].v[2]].p[1]; brush.face[3].v[1][2] = Node[Tri[i].v[2]].p[2]; brush.face[3].v[2][0] = Node[Tri[i].v[2]].p[0]; brush.face[3].v[2][1] = (float)backface; brush.face[3].v[2][2] = Node[Tri[i].v[2]].p[2]; // 2-0 side brush.face[4].v[0][0] = Node[Tri[i].v[2]].p[0]; brush.face[4].v[0][1] = Node[Tri[i].v[2]].p[1]; brush.face[4].v[0][2] = Node[Tri[i].v[2]].p[2]; brush.face[4].v[1][0] = Node[Tri[i].v[0]].p[0]; brush.face[4].v[1][1] = Node[Tri[i].v[0]].p[1]; brush.face[4].v[1][2] = Node[Tri[i].v[0]].p[2]; brush.face[4].v[2][0] = Node[Tri[i].v[0]].p[0]; brush.face[4].v[2][1] = (float)backface; brush.face[4].v[2][2] = Node[Tri[i].v[0]].p[2]; break; case PLANE_YZ0: case PLANE_YZ1: // back brush.face[1].v[0][0] = (float)backface; brush.face[1].v[0][1] = Node[Tri[i].v[0]].p[1]; brush.face[1].v[0][2] = Node[Tri[i].v[0]].p[2]; brush.face[1].v[1][0] = (float)backface; brush.face[1].v[1][1] = Node[Tri[i].v[1]].p[1]; brush.face[1].v[1][2] = Node[Tri[i].v[1]].p[2]; brush.face[1].v[2][0] = (float)backface; brush.face[1].v[2][1] = Node[Tri[i].v[2]].p[1]; brush.face[1].v[2][2] = Node[Tri[i].v[2]].p[2]; // 0-1 side brush.face[2].v[0][0] = Node[Tri[i].v[0]].p[0]; brush.face[2].v[0][1] = Node[Tri[i].v[0]].p[1]; brush.face[2].v[0][2] = Node[Tri[i].v[0]].p[2]; brush.face[2].v[1][0] = Node[Tri[i].v[1]].p[0]; brush.face[2].v[1][1] = Node[Tri[i].v[1]].p[1]; brush.face[2].v[1][2] = Node[Tri[i].v[1]].p[2]; brush.face[2].v[2][0] = (float)backface; brush.face[2].v[2][1] = Node[Tri[i].v[1]].p[1]; brush.face[2].v[2][2] = Node[Tri[i].v[1]].p[2]; // 1-2 side brush.face[3].v[0][0] = Node[Tri[i].v[1]].p[0]; brush.face[3].v[0][1] = Node[Tri[i].v[1]].p[1]; brush.face[3].v[0][2] = Node[Tri[i].v[1]].p[2]; brush.face[3].v[1][0] = Node[Tri[i].v[2]].p[0]; brush.face[3].v[1][1] = Node[Tri[i].v[2]].p[1]; brush.face[3].v[1][2] = Node[Tri[i].v[2]].p[2]; brush.face[3].v[2][0] = (float)backface; brush.face[3].v[2][1] = Node[Tri[i].v[2]].p[1]; brush.face[3].v[2][2] = Node[Tri[i].v[2]].p[2]; // 2-0 side brush.face[4].v[0][0] = Node[Tri[i].v[2]].p[0]; brush.face[4].v[0][1] = Node[Tri[i].v[2]].p[1]; brush.face[4].v[0][2] = Node[Tri[i].v[2]].p[2]; brush.face[4].v[1][0] = Node[Tri[i].v[0]].p[0]; brush.face[4].v[1][1] = Node[Tri[i].v[0]].p[1]; brush.face[4].v[1][2] = Node[Tri[i].v[0]].p[2]; brush.face[4].v[2][0] = (float)backface; brush.face[4].v[2][1] = Node[Tri[i].v[0]].p[1]; brush.face[4].v[2][2] = Node[Tri[i].v[0]].p[2]; break; default: // back brush.face[1].v[0][0] = Node[Tri[i].v[0]].p[0]; brush.face[1].v[0][1] = Node[Tri[i].v[0]].p[1]; brush.face[1].v[0][2] = (float)backface; brush.face[1].v[1][0] = Node[Tri[i].v[1]].p[0]; brush.face[1].v[1][1] = Node[Tri[i].v[1]].p[1]; brush.face[1].v[1][2] = (float)backface; brush.face[1].v[2][0] = Node[Tri[i].v[2]].p[0]; brush.face[1].v[2][1] = Node[Tri[i].v[2]].p[1]; brush.face[1].v[2][2] = (float)backface; // 0-1 side brush.face[2].v[0][0] = Node[Tri[i].v[0]].p[0]; brush.face[2].v[0][1] = Node[Tri[i].v[0]].p[1]; brush.face[2].v[0][2] = Node[Tri[i].v[0]].p[2]; brush.face[2].v[1][0] = Node[Tri[i].v[1]].p[0]; brush.face[2].v[1][1] = Node[Tri[i].v[1]].p[1]; brush.face[2].v[1][2] = Node[Tri[i].v[1]].p[2]; brush.face[2].v[2][0] = Node[Tri[i].v[1]].p[0]; brush.face[2].v[2][1] = Node[Tri[i].v[1]].p[1]; brush.face[2].v[2][2] = (float)backface; // 1-2 side brush.face[3].v[0][0] = Node[Tri[i].v[1]].p[0]; brush.face[3].v[0][1] = Node[Tri[i].v[1]].p[1]; brush.face[3].v[0][2] = Node[Tri[i].v[1]].p[2]; brush.face[3].v[1][0] = Node[Tri[i].v[2]].p[0]; brush.face[3].v[1][1] = Node[Tri[i].v[2]].p[1]; brush.face[3].v[1][2] = Node[Tri[i].v[2]].p[2]; brush.face[3].v[2][0] = Node[Tri[i].v[2]].p[0]; brush.face[3].v[2][1] = Node[Tri[i].v[2]].p[1]; brush.face[3].v[2][2] = (float)backface; // 2-0 side brush.face[4].v[0][0] = Node[Tri[i].v[2]].p[0]; brush.face[4].v[0][1] = Node[Tri[i].v[2]].p[1]; brush.face[4].v[0][2] = Node[Tri[i].v[2]].p[2]; brush.face[4].v[1][0] = Node[Tri[i].v[0]].p[0]; brush.face[4].v[1][1] = Node[Tri[i].v[0]].p[1]; brush.face[4].v[1][2] = Node[Tri[i].v[0]].p[2]; brush.face[4].v[2][0] = Node[Tri[i].v[0]].p[0]; brush.face[4].v[2][1] = Node[Tri[i].v[0]].p[1]; brush.face[4].v[2][2] = (float)backface; } for(j=0; j<5; j++) { strcpy(brush.face[j].texture, (strlen(texture1) ? texture1 : texture0)); brush.face[j].Shift[0] = (float)TexOffset[0]; brush.face[j].Shift[1] = (float)TexOffset[1]; brush.face[j].Rotate = 0.; brush.face[j].Scale[0] = (float)TexScale[0]; brush.face[j].Scale[1] = (float)TexScale[1]; brush.face[j].Contents = contents; if(surf) brush.face[j].Surface = 0; else brush.face[j].Surface = SURF_HINT; brush.face[j].Value = 0; } if(CheckAngle) { XYZVectorSubtract(brush.face[0].v[2],brush.face[0].v[0],t[0]); XYZVectorSubtract(brush.face[0].v[1],brush.face[0].v[2],t[1]); CrossProduct(t[0],t[1],SurfNormal); VectorNormalize(SurfNormal,SurfNormal); if(DotProduct(SurfNormal,PlaneNormal) < Steep) strcpy(brush.face[0].texture,texture2); else strcpy(brush.face[0].texture,texture0); } else strcpy(brush.face[0].texture,texture0); if(surf) brush.face[0].Value = ArghRad2; MakeBrush(&brush); } CloseFuncGroup(); } // end MakeBrushes
//================================================================= void MapOut(int NumNodes,int NumTris, NODE *Node, TRI *Tri) { extern double backface; extern double xmin, xmax, ymin, ymax, zmin, zmax; BRUSH brush; char hint[32], skip[32]; int i, j; int face; /* ghCursorCurrent = LoadCursor(NULL,IDC_WAIT); SetCursor(ghCursorCurrent); */ UseDetail = 1; // this is temporary MakeBrushes(NumTris,Node,Tri,TRUE,0,Texture[Game][0],Texture[Game][1],Texture[Game][2]); if(AddHints || GimpHints) { switch(Game) { case SIN: strcpy(hint,"generic/misc/hint"); strcpy(skip,"generic/misc/skip"); break; case HALFLIFE: strcpy(hint,"HINT"); strcpy(skip,"HINT"); break; case HERETIC2: strcpy(hint,"general/hint"); strcpy(skip,"general/skip"); break; case KINGPIN: strcpy(hint,"common/0_hint"); strcpy(skip,"common/0_skip"); break; case QUAKE3: strcpy(hint,"common/hint"); strcpy(skip,"common/skip"); break; default: strcpy(hint,"e1u1/hint"); strcpy(skip,"e1u1/skip"); } } if( GimpHints ) MakeBrushes(NumTris,Node,Tri,FALSE,HINT_OFFSET,hint,hint,hint); if( AddHints==1 ) { int j0, j1, j2, k, k0, k1; int q[4]; int w,h,h0,h1,t,OK; float s[3]; double front; int MaxHints; // We don't want a whole slew of hint brushes, which we'd get // with low decimation values and our current placement scheme. // Limit number of hint brushes to number of undecimated grid // squares. switch(Plane) { case PLANE_XY1: front = LessThan(zmin,32.); break; case PLANE_XZ0: front = MoreThan(ymax,32.); break; case PLANE_XZ1: front = LessThan(ymin,32.); break; case PLANE_YZ0: front = MoreThan(xmax,32.); break; case PLANE_YZ1: front = LessThan(xmin,32.); break; default: front = MoreThan(zmax,32.); } for(i=0; i<NumTris; i++) Tri[i].flag = 0; switch(Plane) { case PLANE_XZ0: case PLANE_XZ1: j0 = 1; j1 = 0; j2 = 2; break; case PLANE_YZ0: case PLANE_YZ1: j0 = 0; j1 = 1; j2 = 2; break; default: j0 = 2; j1 = 0; j2 = 1; } brush.Number = 0; brush.NumFaces = 6; MaxHints = NH*NV-1; for(w=1; w<min(16,NH) && brush.Number < MaxHints; w++) { for(h=max(1,w/2); h<min(16,NV) && brush.Number < MaxHints; h++) { for(i=0; i<=NH-w && brush.Number < MaxHints; i++) { for(j=0; j<=NV-h && brush.Number < MaxHints; j++) { q[0] = i*NVP1+j; q[2] = q[0] + w*NVP1 + h; switch(Plane) { case PLANE_XY1: case PLANE_XZ0: case PLANE_YZ1: q[1] = q[0] + h; q[3] = q[2] - h; break; default: q[1] = q[2] - h; q[3] = q[0] + h; } for(k=0, OK=1; k<NumTris && OK; k++) { if(Tri[k].min[j1] >= max(Node[q[0]].p[j1],Node[q[2]].p[j1])) continue; if(Tri[k].min[j2] >= max(Node[q[0]].p[j2],Node[q[2]].p[j2])) continue; if(Tri[k].max[j1] <= min(Node[q[0]].p[j1],Node[q[2]].p[j1])) continue; if(Tri[k].max[j2] <= min(Node[q[0]].p[j2],Node[q[2]].p[j2])) continue; for(h0=0; h0<4 && OK; h0++) { h1 = (h0+1)%4; for(t=0; t<3 && OK; t++) { s[t] = side(Node[q[h0]].p[j1],Node[q[h0]].p[j2], Node[q[h1]].p[j1],Node[q[h1]].p[j2], Node[Tri[k].v[t]].p[j1],Node[Tri[k].v[t]].p[j2]); } if((s[1] > 0 || s[2] > 0) && s[0] < 0) OK=0; if((s[2] > 0 || s[0] > 0) && s[1] < 0) OK=0; if((s[0] > 0 || s[1] > 0) && s[2] < 0) OK=0; } } if(!OK) continue; switch(Plane) { case PLANE_XZ0: case PLANE_XZ1: // front brush.face[0].v[0][0] = Node[q[2]].p[0]; brush.face[0].v[0][1] = (float)front; brush.face[0].v[0][2] = Node[q[2]].p[2]; brush.face[0].v[1][0] = Node[q[1]].p[0]; brush.face[0].v[1][1] = (float)front; brush.face[0].v[1][2] = Node[q[1]].p[2]; brush.face[0].v[2][0] = Node[q[0]].p[0]; brush.face[0].v[2][1] = (float)front; brush.face[0].v[2][2] = Node[q[0]].p[2]; // back brush.face[1].v[0][0] = Node[q[0]].p[0]; brush.face[1].v[0][1] = (float)backface; brush.face[1].v[0][2] = Node[q[0]].p[2]; brush.face[1].v[1][0] = Node[q[1]].p[0]; brush.face[1].v[1][1] = (float)backface; brush.face[1].v[1][2] = Node[q[1]].p[2]; brush.face[1].v[2][0] = Node[q[2]].p[0]; brush.face[1].v[2][1] = (float)backface; brush.face[1].v[2][2] = Node[q[2]].p[2]; for(k0=0; k0<brush.NumFaces-2; k0++) { k =k0+2; k1=(k0+1) % (brush.NumFaces-2); brush.face[k].v[0][0] = Node[q[k0]].p[0]; brush.face[k].v[0][1] = (float)front; brush.face[k].v[0][2] = Node[q[k0]].p[2]; brush.face[k].v[1][0] = Node[q[k1]].p[0]; brush.face[k].v[1][1] = (float)front; brush.face[k].v[1][2] = Node[q[k1]].p[2]; brush.face[k].v[2][0] = Node[q[k1]].p[0]; brush.face[k].v[2][1] = (float)backface; brush.face[k].v[2][2] = Node[q[k1]].p[2]; } break; case PLANE_YZ0: case PLANE_YZ1: // front brush.face[0].v[0][0] = (float)front; brush.face[0].v[0][1] = Node[q[2]].p[1]; brush.face[0].v[0][2] = Node[q[2]].p[2]; brush.face[0].v[1][0] = (float)front; brush.face[0].v[1][1] = Node[q[1]].p[1]; brush.face[0].v[1][2] = Node[q[1]].p[2]; brush.face[0].v[2][0] = (float)front; brush.face[0].v[2][1] = Node[q[0]].p[1]; brush.face[0].v[2][2] = Node[q[0]].p[2]; // back brush.face[1].v[0][0] = (float)backface; brush.face[1].v[0][1] = Node[q[0]].p[1]; brush.face[1].v[0][2] = Node[q[0]].p[2]; brush.face[1].v[1][0] = (float)backface; brush.face[1].v[1][1] = Node[q[1]].p[1]; brush.face[1].v[1][2] = Node[q[1]].p[2]; brush.face[1].v[2][0] = (float)backface; brush.face[1].v[2][1] = Node[q[2]].p[1]; brush.face[1].v[2][2] = Node[q[2]].p[2]; for(k0=0; k0<brush.NumFaces-2; k0++) { k =k0+2; k1=(k0+1) % (brush.NumFaces-2); brush.face[k].v[0][0] = (float)front; brush.face[k].v[0][1] = Node[q[k0]].p[1]; brush.face[k].v[0][2] = Node[q[k0]].p[2]; brush.face[k].v[1][0] = (float)front; brush.face[k].v[1][1] = Node[q[k1]].p[1]; brush.face[k].v[1][2] = Node[q[k1]].p[2]; brush.face[k].v[2][0] = (float)backface; brush.face[k].v[2][1] = Node[q[k1]].p[1]; brush.face[k].v[2][2] = Node[q[k1]].p[2]; } break; default: // front brush.face[0].v[0][0] = Node[q[2]].p[0]; brush.face[0].v[0][1] = Node[q[2]].p[1]; brush.face[0].v[0][2] = (float)front; brush.face[0].v[1][0] = Node[q[1]].p[0]; brush.face[0].v[1][1] = Node[q[1]].p[1]; brush.face[0].v[1][2] = (float)front; brush.face[0].v[2][0] = Node[q[0]].p[0]; brush.face[0].v[2][1] = Node[q[0]].p[1]; brush.face[0].v[2][2] = (float)front; // back brush.face[1].v[0][0] = Node[q[0]].p[0]; brush.face[1].v[0][1] = Node[q[0]].p[1]; brush.face[1].v[0][2] = (float)backface; brush.face[1].v[1][0] = Node[q[1]].p[0]; brush.face[1].v[1][1] = Node[q[1]].p[1]; brush.face[1].v[1][2] = (float)backface; brush.face[1].v[2][0] = Node[q[2]].p[0]; brush.face[1].v[2][1] = Node[q[2]].p[1]; brush.face[1].v[2][2] = (float)backface; for(k0=0; k0<brush.NumFaces-2; k0++) { k =k0+2; k1=(k0+1) % (brush.NumFaces-2); brush.face[k].v[0][0] = Node[q[k0]].p[0]; brush.face[k].v[0][1] = Node[q[k0]].p[1]; brush.face[k].v[0][2] = (float)front; brush.face[k].v[1][0] = Node[q[k1]].p[0]; brush.face[k].v[1][1] = Node[q[k1]].p[1]; brush.face[k].v[1][2] = (float)front; brush.face[k].v[2][0] = Node[q[k1]].p[0]; brush.face[k].v[2][1] = Node[q[k1]].p[1]; brush.face[k].v[2][2] = (float)backface; } break; } // switch (Plane) for(face=0; face<6; face++) { strcpy(brush.face[face].texture,(face<=1 ? skip : hint)); brush.face[face].Shift[0] = 0; brush.face[face].Shift[1] = 0; brush.face[face].Rotate = 0.; brush.face[face].Scale[0] = 1; brush.face[face].Scale[1] = 1; brush.face[face].Contents = CONTENTS_DETAIL; brush.face[face].Surface = (face<=1 ? SURF_SKIP : SURF_HINT); brush.face[face].Value = 0; } if(!brush.Number) OpenFuncGroup(); MakeBrush(&brush); brush.Number++; } // for(j= } // for(i= } // for(h= } // for(w= if(brush.Number) CloseFuncGroup(); } /* ghCursorCurrent = ghCursorDefault; SetCursor(ghCursorCurrent); */ }
void CCreateStaircaseDialog::DoDialog(CThredBrush* Brush) { if(DoModal() == IDOK ) { MakeBrush(Brush ); } }