qbsp: fix memory corruption in SplitBrush
This commit is contained in:
parent
9629134612
commit
578d24951d
|
|
@ -38,6 +38,7 @@ winding_t *BaseWindingForPlane(const qbsp_plane_t *p);
|
||||||
void CheckWinding(const winding_t *w);
|
void CheckWinding(const winding_t *w);
|
||||||
winding_t *NewWinding(int points);
|
winding_t *NewWinding(int points);
|
||||||
winding_t *CopyWinding(const winding_t *w);
|
winding_t *CopyWinding(const winding_t *w);
|
||||||
|
void CopyWindingInto(winding_t *dest, const winding_t *src); // FIXME: get rid of this
|
||||||
winding_t *FlipWinding(const winding_t *w);
|
winding_t *FlipWinding(const winding_t *w);
|
||||||
winding_t *ClipWinding(winding_t *in, const qbsp_plane_t *split, bool keepon);
|
winding_t *ClipWinding(winding_t *in, const qbsp_plane_t *split, bool keepon);
|
||||||
void DivideWinding(const winding_t *in, const qbsp_plane_t *split, winding_t **front,
|
void DivideWinding(const winding_t *in, const qbsp_plane_t *split, winding_t **front,
|
||||||
|
|
|
||||||
|
|
@ -1564,7 +1564,7 @@ void SplitBrush (const brush_t *brush,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
face_t *newface = CopyFace(face);
|
face_t *newface = CopyFace(face);
|
||||||
newface->w = *cw[j];
|
CopyWindingInto(&newface->w, cw[j]);
|
||||||
UpdateFaceSphere(newface);
|
UpdateFaceSphere(newface);
|
||||||
|
|
||||||
// link it into the front or back brush we are building
|
// link it into the front or back brush we are building
|
||||||
|
|
@ -1624,16 +1624,14 @@ void SplitBrush (const brush_t *brush,
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
winding_t *newwinding = FlipWinding(midwinding);
|
winding_t *newwinding = FlipWinding(midwinding);
|
||||||
newface->w = *newwinding;
|
CopyWindingInto(&newface->w, newwinding);
|
||||||
newface->planenum = planenum;
|
newface->planenum = planenum;
|
||||||
newface->planeside = !planeside;
|
newface->planeside = !planeside;
|
||||||
FreeMem(newwinding, WINDING, 1);
|
FreeMem(newwinding, WINDING, 1);
|
||||||
} else {
|
} else {
|
||||||
winding_t *newwinding = CopyWinding(midwinding);
|
CopyWindingInto(&newface->w, midwinding);
|
||||||
newface->w = *newwinding;
|
|
||||||
newface->planenum = planenum;
|
newface->planenum = planenum;
|
||||||
newface->planeside = planeside;
|
newface->planeside = planeside;
|
||||||
FreeMem(newwinding, WINDING, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateFaceSphere(newface);
|
UpdateFaceSphere(newface);
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,12 @@ CopyWinding(const winding_t *w)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CopyWindingInto(winding_t *dest, const winding_t *src) // FIXME: get rid of this
|
||||||
|
{
|
||||||
|
dest->numpoints = src->numpoints;
|
||||||
|
memcpy(dest->points, src->points, sizeof(vec3_t) * src->numpoints);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
FlipWinding
|
FlipWinding
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue