Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Quake 3 BSP CM_TraceThroughBrush


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 polyfrag   Crossbones+   -  Reputation: 1868

Like
0Likes
Like

Posted 07 December 2012 - 10:52 PM

I'm fixing a problem in my own engine and can't understand something from Quake 3 in CM_TraceThroughBrush.

https://github.com/id-Software/Quake-III-Arena/blob/master/code/qcommon/cm_trace.c

for (i = 0; i < brush->numsides; i++) {
   side = brush->sides + i;
   plane = side->plane;
   // adjust the plane distance apropriately for mins/maxs
   dist = plane->dist - DotProduct( tw->offsets[ plane->signbits ], plane->normal );
   d1 = DotProduct( tw->start, plane->normal ) - dist;
   d2 = DotProduct( tw->end, plane->normal ) - dist;
   if (d2 > 0) {
	getout = qtrue; // endpoint is not in solid
   }
   if (d1 > 0) {
	startout = qtrue;
   }
   // if completely in front of face, no intersection with the entire brush
   if (d1 > 0 && ( d2 >= SURFACE_CLIP_EPSILON || d2 >= d1 )  ) {
	return;
   }
   // if it doesn't cross the plane, the plane isn't relevent
   if (d1 <= 0 && d2 <= 0 ) {
	continue;
   }
   // crosses face
   if (d1 > d2) { // enter
	f = (d1-SURFACE_CLIP_EPSILON) / (d1-d2);
	if ( f < 0 ) {
	 f = 0;
	}
	if (f > enterFrac) {
	 enterFrac = f;
	 clipplane = plane;
	 leadside = side;
	}
   } else { // leave
	f = (d1+SURFACE_CLIP_EPSILON) / (d1-d2);
	if ( f > 1 ) {
	 f = 1;
	}
	if (f < leaveFrac) {
	 leaveFrac = f;
	}
   }
  }

If d1 and d2 are the starting and ending distances of the box from the plane, why does d1 > d2 mean that it crosses the plane? Shouldn't it be d1*d2 < 0?

Edited by polyfrag, 07 December 2012 - 10:52 PM.


Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS