diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 23a6d4d7..83ed6e3f 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -571,8 +571,8 @@ struct dplane_t : qplane3f #define Q2_CONTENTS_LADDER 0x20000000 // Special contents flags for the compiler only -#define CFLAGS_STRUCTURAL_COVERED_BY_DETAIL (1 << 0) -#define CFLAGS_WAS_ILLUSIONARY (1 << 1) /* was illusionary, got changed to something else */ +#define CFLAGS_STRUCTURAL_COVERED_BY_DETAIL (1 << 0) // fixme-brushbsp: remove +#define CFLAGS_WAS_ILLUSIONARY (1 << 1) // fixme-brushbsp: remove #define CFLAGS_BMODEL_MIRROR_INSIDE \ (1 << 3) /* set "_mirrorinside" "1" on a bmodel to mirror faces for when the player is inside. */ #define CFLAGS_NO_CLIPPING_SAME_TYPE \ diff --git a/include/qbsp/csg4.hh b/include/qbsp/csg4.hh index e4e3c3a9..12cade7b 100644 --- a/include/qbsp/csg4.hh +++ b/include/qbsp/csg4.hh @@ -27,6 +27,7 @@ extern int csgmergefaces; int MakeSkipTexinfo(); -face_t *NewFaceFromFace(face_t *in); +face_t *NewFaceFromFace(const face_t *in); +face_t *MirrorFace(const face_t *face); std::tuple SplitFace(face_t *in, const qplane3d &split); void UpdateFaceSphere(face_t *in); diff --git a/qbsp/csg4.cc b/qbsp/csg4.cc index d4422cb6..fa9f0dcf 100644 --- a/qbsp/csg4.cc +++ b/qbsp/csg4.cc @@ -69,7 +69,7 @@ Duplicates the non point information of a face, used by SplitFace and MergeFace. ================== */ -face_t *NewFaceFromFace(face_t *in) +face_t *NewFaceFromFace(const face_t *in) { face_t *newf = new face_t{}; @@ -288,6 +288,17 @@ static void ClipInside(const face_t *clipface, bool precedence, std::listw = face->w.flip(); + newface->planeside = face->planeside ^ 1; + newface->contents.swap(); + newface->lmshift.swap(); + + return newface; +} + /* ================== SaveFacesToPlaneList diff --git a/qbsp/surfaces.cc b/qbsp/surfaces.cc index 2f5518a7..afce4be1 100644 --- a/qbsp/surfaces.cc +++ b/qbsp/surfaces.cc @@ -577,6 +577,11 @@ static void AddFaceToTree_r(mapentity_t* entity, face_t *face, brush_t *srcbrush for (face_t *part: parts) { node->facelist.push_back(part); + + // fixme-brushbsp: condition for face being two sided? + if (true) { + node->facelist.push_back(MirrorFace(part)); + } } } diff --git a/testmaps/qbsp_simple.map b/testmaps/qbsp_simple.map index c23abca2..5e05fb44 100644 --- a/testmaps/qbsp_simple.map +++ b/testmaps/qbsp_simple.map @@ -11,19 +11,28 @@ { ( -112 -112 96 ) ( -112 -111 96 ) ( -112 -112 97 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 ( -80 -96 80 ) ( -81 -96 80 ) ( -80 -96 81 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 0 ] 180 1 1 -( -80 -432 80 ) ( -80 -431 80 ) ( -81 -432 80 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 1 1 +( -80 -432 0 ) ( -80 -431 0 ) ( -81 -432 0 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 1 1 ( -160 -112 96 ) ( -161 -112 96 ) ( -160 -111 96 ) orangestuff8 [ -1 0 0 16 ] [ 0 -1 0 16 ] 180 1 1 ( -160 128 96 ) ( -160 128 97 ) ( -161 128 96 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 0 ] 180 1 1 ( 144 -432 80 ) ( 144 -432 81 ) ( 144 -431 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 } // brush 1 { -( -179.8822509939086 -118.62741699796953 88 ) ( -179.8822509939086 -118.62741699796953 89 ) ( -180.5893577750951 -119.33452377915609 88 ) orangestuff8 [ 0.7071067811865475 0.7071067811865475 0 35.078217 ] [ 0 0 -1 -8 ] 180 1 1 -( -89.37258300203048 -141.25483399593907 88 ) ( -90.07968978321703 -140.5477272147525 88 ) ( -89.37258300203048 -141.25483399593907 89 ) orangestuff8 [ -0.7071067811865475 0.7071067811865475 0 -27.313705 ] [ 0 0 -1 -8 ] 0 1 1 -( 159.52900397563428 -344.90158697766475 72 ) ( 158.82189719444773 -344.1944801964782 72 ) ( 158.82189719444773 -345.6086937588513 72 ) orangestuff8 [ 0.7071067811865475 0.7071067811865475 0 35.078217 ] [ 0.7071067811865475 -0.7071067811865475 0 27.313705 ] 225 1 1 -( -123.31370849898477 -175.19595949289334 88 ) ( -124.0208152801713 -175.9030662740799 88 ) ( -124.02081528017132 -174.48885271170678 88 ) orangestuff8 [ -0.7071067811865475 -0.7071067811865475 0 -35.078217 ] [ 0.7071067811865475 -0.7071067811865475 0 27.313705 ] 135 1 1 -( -78.05887450304573 -107.3137084989848 72 ) ( -78.76598128423227 -108.02081528017132 72 ) ( -78.05887450304573 -107.3137084989848 73 ) orangestuff8 [ -0.7071067811865475 -0.7071067811865475 0 -35.078217 ] [ 0 0 -1 -8 ] 180 1 1 -( 170.84271247461902 -333.58787847868 72 ) ( 170.84271247461902 -333.58787847868 73 ) ( 170.13560569343247 -332.88077169749346 72 ) orangestuff8 [ 0.7071067811865475 -0.7071067811865475 0 27.313705 ] [ 0 0 -1 -8 ] 0 1 1 +( 64 -16 96 ) ( 64 -15 96 ) ( 64 -16 97 ) *zwater1 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 64 -16 96 ) ( 64 -16 97 ) ( 65 -16 96 ) *zwater1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 64 -16 96 ) ( 65 -16 96 ) ( 64 -15 96 ) *zwater1 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 80 144 ) ( 96 81 144 ) ( 97 80 144 ) *zwater1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 80 112 ) ( 97 80 112 ) ( 96 80 113 ) *zwater1 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 96 80 112 ) ( 96 80 113 ) ( 96 81 112 ) *zwater1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 2 +{ +( -48 80 96 ) ( -48 81 96 ) ( -48 80 97 ) brown_brick [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -48 64 96 ) ( -48 64 97 ) ( -47 64 96 ) brown_brick [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -48 80 0 ) ( -47 80 0 ) ( -48 81 0 ) brown_brick [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 176 96 ) ( 16 177 96 ) ( 17 176 96 ) brown_brick [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 176 112 ) ( 17 176 112 ) ( 16 176 113 ) brown_brick [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 176 112 ) ( 16 176 113 ) ( 16 177 112 ) brown_brick [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } } // entity 1