00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "qbsp.h"
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #define PORTALFILE "PRT1"
00036
00037 FILE *pf;
00038 int num_visclusters;
00039 int num_visportals;
00040
00041 void WriteFloat2 (FILE *f, vec_t v)
00042 {
00043 if ( fabs(v - Q_rint(v)) < 0.001 )
00044 fprintf (f,"%i ",(int)Q_rint(v));
00045 else
00046 fprintf (f,"%f ",v);
00047 }
00048
00049
00050
00051
00052
00053
00054 void WritePortalFile_r (node_t *node)
00055 {
00056 int i, s;
00057 portal_t *p;
00058 winding_t *w;
00059 vec3_t normal;
00060 vec_t dist;
00061
00062
00063 if (node->planenum != PLANENUM_LEAF && !node->detail_seperator)
00064 {
00065 WritePortalFile_r (node->children[0]);
00066 WritePortalFile_r (node->children[1]);
00067 return;
00068 }
00069
00070 if (node->contents & CONTENTS_SOLID)
00071 return;
00072
00073 for (p = node->portals ; p ; p=p->next[s])
00074 {
00075 w = p->winding;
00076 s = (p->nodes[1] == node);
00077 if (w && p->nodes[0] == node)
00078 {
00079 if (!Portal_VisFlood (p))
00080 continue;
00081
00082
00083
00084
00085
00086
00087 WindingPlane (w, normal, &dist);
00088 if ( DotProduct (p->plane.normal, normal) < 0.99 )
00089 {
00090 fprintf (pf,"%i %i %i ",w->numpoints, p->nodes[1]->cluster, p->nodes[0]->cluster);
00091 }
00092 else
00093 fprintf (pf,"%i %i %i ",w->numpoints, p->nodes[0]->cluster, p->nodes[1]->cluster);
00094 for (i=0 ; i<w->numpoints ; i++)
00095 {
00096 fprintf (pf,"(");
00097 WriteFloat2 (pf, w->p[i][0]);
00098 WriteFloat2 (pf, w->p[i][1]);
00099 WriteFloat2 (pf, w->p[i][2]);
00100 fprintf (pf,") ");
00101 }
00102 fprintf (pf,"\n");
00103 }
00104 }
00105
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115 void FillLeafNumbers_r (node_t *node, int num)
00116 {
00117 if (node->planenum == PLANENUM_LEAF)
00118 {
00119 if (node->contents & CONTENTS_SOLID)
00120 node->cluster = -1;
00121 else
00122 node->cluster = num;
00123 return;
00124 }
00125 node->cluster = num;
00126 FillLeafNumbers_r (node->children[0], num);
00127 FillLeafNumbers_r (node->children[1], num);
00128 }
00129
00130
00131
00132
00133
00134
00135 void NumberLeafs_r (node_t *node)
00136 {
00137 portal_t *p;
00138
00139 if (node->planenum != PLANENUM_LEAF && !node->detail_seperator)
00140 {
00141 node->cluster = -99;
00142 NumberLeafs_r (node->children[0]);
00143 NumberLeafs_r (node->children[1]);
00144 return;
00145 }
00146
00147
00148
00149 if ( node->contents & CONTENTS_SOLID )
00150 {
00151 node->cluster = -1;
00152 return;
00153 }
00154
00155 FillLeafNumbers_r (node, num_visclusters);
00156 num_visclusters++;
00157
00158
00159 for (p = node->portals ; p ; )
00160 {
00161 if (p->nodes[0] == node)
00162 {
00163 if (Portal_VisFlood (p))
00164 num_visportals++;
00165 p = p->next[0];
00166 }
00167 else
00168 p = p->next[1];
00169 }
00170
00171 }
00172
00173
00174
00175
00176
00177
00178
00179 void CreateVisPortals_r (node_t *node)
00180 {
00181
00182
00183 if (node->planenum == PLANENUM_LEAF || node->detail_seperator )
00184 return;
00185
00186 MakeNodePortal (node);
00187 SplitNodePortals (node);
00188
00189 CreateVisPortals_r (node->children[0]);
00190 CreateVisPortals_r (node->children[1]);
00191 }
00192
00193
00194
00195
00196
00197
00198 void FinishVisPortals2_r (node_t *node)
00199 {
00200 if (node->planenum == PLANENUM_LEAF)
00201 return;
00202
00203 MakeNodePortal (node);
00204 SplitNodePortals (node);
00205
00206 FinishVisPortals2_r (node->children[0]);
00207 FinishVisPortals2_r (node->children[1]);
00208 }
00209
00210 void FinishVisPortals_r (node_t *node)
00211 {
00212 if (node->planenum == PLANENUM_LEAF)
00213 return;
00214
00215 if (node->detail_seperator)
00216 {
00217 FinishVisPortals2_r (node);
00218 return;
00219 }
00220
00221 FinishVisPortals_r (node->children[0]);
00222 FinishVisPortals_r (node->children[1]);
00223 }
00224
00225
00226 int clusterleaf;
00227 void SaveClusters_r (node_t *node)
00228 {
00229 if (node->planenum == PLANENUM_LEAF)
00230 {
00231 dleafs[clusterleaf++].cluster = node->cluster;
00232 return;
00233 }
00234 SaveClusters_r (node->children[0]);
00235 SaveClusters_r (node->children[1]);
00236 }
00237
00238
00239
00240
00241
00242
00243 void WritePortalFile (tree_t *tree)
00244 {
00245 char filename[1024];
00246 node_t *headnode;
00247
00248 qprintf ("--- WritePortalFile ---\n");
00249
00250 headnode = tree->headnode;
00251 num_visclusters = 0;
00252 num_visportals = 0;
00253
00254 Tree_FreePortals_r (headnode);
00255
00256 MakeHeadnodePortals (tree);
00257
00258 CreateVisPortals_r (headnode);
00259
00260
00261
00262 NumberLeafs_r (headnode);
00263
00264
00265 sprintf (filename, "%s.prt", source);
00266 printf ("writing %s\n", filename);
00267 pf = fopen (filename, "w");
00268 if (!pf)
00269 Error ("Error opening %s", filename);
00270
00271 fprintf (pf, "%s\n", PORTALFILE);
00272 fprintf (pf, "%i\n", num_visclusters);
00273 fprintf (pf, "%i\n", num_visportals);
00274
00275 qprintf ("%5i visclusters\n", num_visclusters);
00276 qprintf ("%5i visportals\n", num_visportals);
00277
00278 WritePortalFile_r (headnode);
00279
00280 fclose (pf);
00281
00282
00283
00284 clusterleaf = 1;
00285 SaveClusters_r (headnode);
00286 }
00287