/* DESCRIPTION: SV_ClipMoveToEntity/SV_SingleClipMoveToEntity
// LOCATION: world.c
// PATH: Mostly in this file.
//
// SV_ClipMoveToEntity is a proxy (and only access point) for the next one.
//
// The function seems to be related to collision detection.
*/
void SV_SingleClipMoveToEntity(edict_t *ent, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t * Outgoing_Trace) {

   vec3_t var_c;
   vec3_t var_18;
   vec3_t var_24;
   hull_t * var_28;
//   int var_2c;
   int var_30;
   int var_34;
   int var_38;

   vec3_t forward;
   vec3_t right;
   vec3_t up;
   vec3_t var_68;
   int var_6c;
   trace_t var_a4;
   vec3_t var_bc;
   vec3_t var_c8;
   vec3_t var_d4;

   Q_memset(Outgoing_Trace, 0, sizeof(trace_t));

   Outgoing_Trace->fraction = 1.0;
   Outgoing_Trace->allsolid = 1;

   Outgoing_Trace->endpos[0] = end[0];
   Outgoing_Trace->endpos[1] = end[1];
   Outgoing_Trace->endpos[2] = end[2];

   if(global_sv.models[ent->v.modelindex]->modeltype == 3) {
      //taken: 1616, -528, 127.97 endpos

      var_28 = SV_HullForStudioModel(ent, mins, maxs, var_c, &var_30);
   }
   else {
      var_28 = SV_HullForEntity(ent, mins, maxs, var_c);
      var_30 = 1; //if model?
   }

   VectorSubtract(start, var_c, var_18);
   VectorSubtract(end, var_c, var_24);

   if((ent->v.solid != SOLID_BSP) ||
      (ent->v.angles[0] == 0 && ent->v.angles[1] == 0 && ent->v.angles[2] == 0)) {

      //taken
      var_38 = 0; //rotated prob
   }
   else { var_38 = 1; }

   if(var_38) { //This is another function in QW.

      AngleVectors(ent->v.angles, forward, right, up); //v.angles is def +58.

      VectorCopy(var_18, var_68);

      var_18[0] = DotProduct(var_68, forward);
      var_18[1] = -DotProduct(var_68, right);
      var_18[2] = DotProduct(var_68, up);

      VectorCopy(var_24, var_68);

      var_24[0] = DotProduct(var_68, forward);
      var_24[1] = -DotProduct(var_68, right);
      var_24[2] = DotProduct(var_68, up);
   } //Curiously enough, I'm taking linear algebra right now.  I hate it.

   //= 20
   if(var_30 == 1) {
      SV_RecursiveHullCheck(var_28, var_28->firstclipnode, 0, 1.0, var_18, var_24, Outgoing_Trace);
   }
   else {
      for(var_6c = 0, var_34 = 0; var_34 < var_30; var_34++) {

         Q_memset(&var_a4, 0, sizeof(trace_t));
         var_a4.fraction = 1.0;
         var_a4.allsolid = 1;
         VectorCopy(end, var_a4.endpos);

         SV_RecursiveHullCheck(&(var_28[var_34]), var_28[var_34].firstclipnode, 0, 1.0, var_18, var_24, &var_a4);

         if(var_34 != 0 && var_a4.startsolid == 0 && var_a4.allsolid == 0 &&
            var_a4.fraction > Outgoing_Trace->fraction) { continue; }

         if(Outgoing_Trace->startsolid == 0) {
            Q_memcpy(Outgoing_Trace, &var_a4, sizeof(trace_t));
         }
         else {
            Q_memcpy(Outgoing_Trace, &var_a4, sizeof(trace_t)); //Probably could be a bit more efficient here.
            Outgoing_Trace->startsolid = 1;
         }
         var_6c = var_34;
      }
      Outgoing_Trace->hitgroup = SV_HitgroupForStudioHull(var_6c);
   }

   if(Outgoing_Trace->fraction != 1.0) {
      if(var_38 != 0) {

         AngleVectorsTranspose(ent->v.angles, var_68, var_bc, var_c8);

         VectorCopy(Outgoing_Trace->plane.normal, var_d4);
         Outgoing_Trace->plane.normal[0] = DotProduct(var_d4, var_68);
         Outgoing_Trace->plane.normal[1] = -DotProduct(var_d4, var_bc);
         Outgoing_Trace->plane.normal[2] = DotProduct(var_d4, var_c8);
      }
      //Scaling, clearly.
      Outgoing_Trace->endpos[0] = start[0] + (Outgoing_Trace->fraction * (end[0] - start[0]));
      Outgoing_Trace->endpos[1] = start[1] + (Outgoing_Trace->fraction * (end[1] - start[1]));
      Outgoing_Trace->endpos[2] = start[2] + (Outgoing_Trace->fraction * (end[2] - start[2]));
   }
   if(Outgoing_Trace->fraction < 1.0 || Outgoing_Trace->startsolid != 0) {
      Outgoing_Trace->pHit = ent;
   }
}
Exemple #2
0
/*
================
PM_DrawPhysEntBBox(int num)

================
*/
void PM_DrawPhysEntBBox(int num, int pcolor, float life)
{
	physent_t *pe;
	vec3_t org;
	int j;
	vec3_t tmp;
	vec3_t		p[8];
	float gap = BOX_GAP;
	vec3_t modelmins, modelmaxs;

	if (num >= pmove->numphysent ||
		num <= 0)
		return;

	pe = &pmove->physents[num];

	if (pe->model)
	{
		VectorCopy(pe->origin, org);

		pmove->PM_GetModelBounds( pe->model, modelmins, modelmaxs );
		for (j = 0; j < 8; j++)
		{
			tmp[0] = (j & 1) ? modelmins[0] - gap : modelmaxs[0] + gap;
			tmp[1] = (j & 2) ? modelmins[1] - gap : modelmaxs[1] + gap;
			tmp[2] = (j & 4) ? modelmins[2] - gap : modelmaxs[2] + gap;

			VectorCopy(tmp, p[j]);
		}

		// If the bbox should be rotated, do that
		if (pe->angles[0] || pe->angles[1] || pe->angles[2])
		{
			vec3_t	forward, right, up;

			AngleVectorsTranspose(pe->angles, forward, right, up);
			for (j = 0; j < 8; j++)
			{
				VectorCopy(p[j], tmp);
				p[j][0] = DotProduct  ( tmp, forward );
				p[j][1] = DotProduct ( tmp, right );
				p[j][2] = DotProduct  ( tmp, up );
			}
		}

		// Offset by entity origin, if any.
		for (j = 0; j < 8; j++)
			VectorAdd(p[j], org, p[j]);

		for (j = 0; j < 6; j++)
		{
			PM_DrawRectangle(
				p[PM_boxpnt[j][1]],
				p[PM_boxpnt[j][0]],
				p[PM_boxpnt[j][2]],
				p[PM_boxpnt[j][3]],
				pcolor, life);
		}
	}
	else
	{
		for (j = 0; j < 8; j++)
		{
			tmp[0] = (j & 1) ? pe->mins[0] : pe->maxs[0];
			tmp[1] = (j & 2) ? pe->mins[1] : pe->maxs[1];
			tmp[2] = (j & 4) ? pe->mins[2] : pe->maxs[2];

			VectorAdd(tmp, pe->origin, tmp);
			VectorCopy(tmp, p[j]);
		}

		for (j = 0; j < 6; j++)
		{
			PM_DrawRectangle(
				p[PM_boxpnt[j][1]],
				p[PM_boxpnt[j][0]],
				p[PM_boxpnt[j][2]],
				p[PM_boxpnt[j][3]],
				pcolor, life);
		}

	}
}