Exemple #1
0
/*
==============
GrowNodeRegion_r
==============
*/
void GrowNodeRegion_r (node_t *node)
{
  dface_t		*r;
  face_t		*f;
  int			i;

  if (node->planenum == PLANENUM_LEAF)
    return;

  node->firstface = numfaces;

  for (f=node->faces ; f ; f=f->next)
    {
      //		if (f->outputnumber != -1)
      //			continue;	// allready grown into an earlier region
			
      // emit a region

      if (numfaces == MAX_MAP_FACES)
	Error ("MAX_MAP_FACES");
      f->outputnumber = numfaces;
      r = &dfaces[numfaces];

      r->planenum = node->outputplanenum;
      r->side = f->planeside;
      r->texinfo = f->texturenum;
      for (i=0 ; i<MAXLIGHTMAPS ; i++)
	r->styles[i] = 255;
      r->lightofs = -1;

      // add the face and mergable neighbors to it
	
#if 0
      ClearRegionSize ();
      AddFaceToRegionSize (f);
      RecursiveGrowRegion (r, f);
#endif
      r->firstedge = firstedge = numsurfedges;
      for (i=0 ; i<f->numpoints ; i++)
	{
	  if (numsurfedges == MAX_MAP_SURFEDGES)
	    Error ("numsurfedges == MAX_MAP_SURFEDGES");
	  dsurfedges[numsurfedges] = f->edges[i];
	  numsurfedges++;
	}
		
      r->numedges = numsurfedges - r->firstedge;

      numfaces++;
    }

  node->numfaces = numfaces - node->firstface;

  GrowNodeRegion_r (node->children[0]);
  GrowNodeRegion_r (node->children[1]);
}
Exemple #2
0
static void
GrowNodeRegion_r (node_t * node)
{
	dface_t     r;
	face_t     *f;
	int         i;

	if (node->planenum == PLANENUM_LEAF)
		return;

	node->firstface = bsp->numfaces;

	for (f = node->faces; f; f = f->next) {
		if (f->texturenum < 0)
			continue;

//		if (f->outputnumber != -1)
//			continue;		// allready grown into an earlier region

		// emit a region
		if (bsp->numfaces == MAX_MAP_FACES)
			Sys_Error ("MAX_MAP_FACES");
		f->outputnumber = bsp->numfaces;

		r.planenum = node->outputplanenum;
		r.side = f->planeside;
		r.texinfo = f->texturenum;
		for (i = 0; i < MAXLIGHTMAPS; i++)
			r.styles[i] = 255;
		r.lightofs = -1;

		// add the face and mergable neighbors to it
#if 0
		ClearRegionSize ();
		AddFaceToRegionSize (f);
		RecursiveGrowRegion (r, f);
#endif
		r.firstedge = firstedge = bsp->numsurfedges;
		for (i = 0; i < f->points->numpoints; i++) {
			BSP_AddSurfEdge (bsp, f->edges[i]);
		}

		r.numedges = bsp->numsurfedges - r.firstedge;

		BSP_AddFace (bsp, &r);
	}

	node->numfaces = bsp->numfaces - node->firstface;

	GrowNodeRegion_r (node->children[0]);
	GrowNodeRegion_r (node->children[1]);
}
Exemple #3
0
/*
==============
RecursiveGrowRegion
==============
*/
void RecursiveGrowRegion (dface_t *r, face_t *f)
{
  int		e;
  face_t	*f2;
  int		i;
	
  if (f->outputnumber == numfaces)
    return;

  if (f->outputnumber != -1)
    Error ("RecursiveGrowRegion: region collision");
  f->outputnumber = numfaces;
	
  // add edges	
  for (i=0 ; i<f->numpoints ; i++)
    {
      e = f->edges[i];
      if (!edgefaces[abs(e)][0])
	continue;	// edge has allready been removed
      if (e > 0)
	f2 = edgefaces[e][1];
      else
	f2 = edgefaces[-e][0];
      if (f2 && f2->outputnumber == numfaces)
	{
	  edgefaces[abs(e)][0] = NULL;
	  edgefaces[abs(e)][1] = NULL;
	  continue;	// allready merged
	}
      if (f2 && CanJoinFaces (f, f2))
	{	// remove the edge and merge the faces
	  edgefaces[abs(e)][0] = NULL;
	  edgefaces[abs(e)][1] = NULL;
	  RecursiveGrowRegion (r, f2);
	}
      else
	{
	  // emit a surfedge
	  if (numsurfedges == MAX_MAP_SURFEDGES)
	    Error ("numsurfedges == MAX_MAP_SURFEDGES");
	  dsurfedges[numsurfedges] = e;
	  numsurfedges++;
	}
    }

}