From f6f3d7ff2dcd1d11381d1e9ce2b73cbc0c8ef732 Mon Sep 17 00:00:00 2001 From: GoaLitiuM Date: Sun, 15 Aug 2021 22:52:40 +0300 Subject: [PATCH] more edge cases handled, one more left --- Assets/Maps/cube.map | 141 +++++++++++++++++++-------- Content/Materials/dev/dev_128.flax | Bin 30845 -> 30845 bytes Content/Materials/dev/slick.flax | Bin 0 -> 30845 bytes Content/Scenes/TestImportScene.scene | 34 +------ Source/Game/Q3MapImporter.cs | 71 +++++++++----- 5 files changed, 149 insertions(+), 97 deletions(-) create mode 100644 Content/Materials/dev/slick.flax diff --git a/Assets/Maps/cube.map b/Assets/Maps/cube.map index 193534e..3e6729f 100644 --- a/Assets/Maps/cube.map +++ b/Assets/Maps/cube.map @@ -4,17 +4,49 @@ { "classname" "worldspawn" "_tb_textures" "textures/common;textures/dev" +"_tb_def" "builtin:goake.ent" // brush 0 { -( 0 576 -32 ) ( 0 577 -32 ) ( 0 576 -31 ) common/slick 0 0 0 4 4 0 0 0 -( 224 0 -32 ) ( 224 0 -31 ) ( 225 0 -32 ) common/slick 0 0 0 4 4 0 0 0 -( 224 576 -512 ) ( 225 576 -512 ) ( 224 577 -512 ) common/slick 0 0 0 4 4 0 0 0 -( 256 608 0 ) ( 256 609 0 ) ( 257 608 0 ) common/slick 0 0 0 4 4 0 0 0 -( 256 512 -16 ) ( 257 512 -16 ) ( 256 512 -15 ) common/slick 0 0 0 4 4 0 0 0 -( 512 608 -16 ) ( 512 608 -15 ) ( 512 609 -16 ) common/slick 0 0 0 4 4 0 0 0 +( -32 176 112 ) ( -32 176 176 ) ( 0 144 144 ) common/slick 0 0 0 1 1 0 0 0 +( 0 144 144 ) ( 32 176 112 ) ( -32 176 112 ) common/slick 0 0 0 1 1 0 0 0 +( 0 144 144 ) ( -32 176 176 ) ( 32 176 176 ) common/slick 0 0 0 1 1 0 0 0 +( 32 176 176 ) ( -32 176 176 ) ( -32 176 112 ) common/slick 0 0 0 1 1 0 0 0 +( 0 144 144 ) ( 32 176 176 ) ( 32 176 112 ) common/slick 0 0 0 1 1 0 0 0 } // brush 1 { +( 0 144 144 ) ( -32 112 176 ) ( -32 112 112 ) common/slick 0 0 0 1 1 0 0 0 +( -32 112 176 ) ( 32 112 176 ) ( 32 112 112 ) common/slick 0 0 0 1 1 0 0 0 +( 0 144 144 ) ( -32 112 112 ) ( 32 112 112 ) common/slick 0 0 0 1 1 0 0 0 +( 0 144 144 ) ( 32 112 176 ) ( -32 112 176 ) common/slick 0 0 0 1 1 0 0 0 +( 32 112 112 ) ( 32 112 176 ) ( 0 144 144 ) common/slick 0 0 0 1 1 0 0 0 +} +// brush 2 +{ +( 0 0 144 ) ( -32 32 176 ) ( -32 -32 176 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 144 ) ( -32 -32 176 ) ( 32 -32 176 ) common/slick 0 0 0 1 1 0 0 0 +( -32 32 176 ) ( 32 32 176 ) ( 32 -32 176 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 144 ) ( 32 32 176 ) ( -32 32 176 ) common/slick 0 0 0 1 1 0 0 0 +( 32 -32 176 ) ( 32 32 176 ) ( 0 0 144 ) common/slick 0 0 0 1 1 0 0 0 +} +// brush 3 +{ +( -32 -32 48 ) ( -32 32 48 ) ( 0 0 80 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 80 ) ( 32 -32 48 ) ( -32 -32 48 ) common/slick 0 0 0 1 1 0 0 0 +( 32 32 48 ) ( -32 32 48 ) ( -32 -32 48 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 80 ) ( -32 32 48 ) ( 32 32 48 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 80 ) ( 32 32 48 ) ( 32 -32 48 ) common/slick 0 0 0 1 1 0 0 0 +} +// brush 4 +{ +( -32 -32 112 ) ( -32 32 112 ) ( 0 0 144 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 144 ) ( 32 -32 112 ) ( -32 -32 112 ) common/slick 0 0 0 1 1 0 0 0 +( 32 32 112 ) ( -32 32 112 ) ( -32 -32 112 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 144 ) ( -32 32 112 ) ( 32 32 112 ) common/slick 0 0 0 1 1 0 0 0 +( 0 0 144 ) ( 32 32 112 ) ( 32 -32 112 ) common/slick 0 0 0 1 1 0 0 0 +} +// brush 5 +{ ( -64 -64 16 ) ( -64 -63 16 ) ( -64 -64 17 ) common/slick 0 0 0 1 1 0 0 0 ( -64 -64 16 ) ( -64 -64 17 ) ( -63 -64 16 ) common/slick 0 0 0 1 1 0 0 0 ( -64 -64 16 ) ( -63 -64 16 ) ( -64 -63 16 ) common/slick 0 0 0 1 1 0 0 0 @@ -22,45 +54,14 @@ ( 64 64 48 ) ( 65 64 48 ) ( 64 64 49 ) common/slick 0 0 0 1 1 0 0 0 ( 64 64 48 ) ( 64 64 49 ) ( 64 65 48 ) common/slick 0 0 0 1 1 0 0 0 } -// brush 2 -{ -( -32 -32 112 ) ( -32 32 112 ) ( 0 0 144 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 144 ) ( 32 -32 112 ) ( -32 -32 112 ) common/slick 0 0 0 1 1 0 0 0 -( 32 32 112 ) ( -32 32 112 ) ( -32 -32 112 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 144 ) ( -32 32 112 ) ( 32 32 112 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 144 ) ( 32 32 112 ) ( 32 -32 112 ) common/slick 0 0 0 1 1 0 0 0 -} -// brush 3 -{ -( 0 0 144 ) ( -32 32 176 ) ( -32 -32 176 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 144 ) ( -32 -32 176 ) ( 32 -32 176 ) common/slick 0 0 0 1 1 0 0 0 -( -32 32 176 ) ( 32 32 176 ) ( 32 -32 176 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 144 ) ( 32 32 176 ) ( -32 32 176 ) common/slick 0 0 0 1 1 0 0 0 -( 32 -32 176 ) ( 32 32 176 ) ( 0 0 144 ) common/slick 0 0 0 1 1 0 0 0 -} -// brush 4 -{ -( -32 176 112 ) ( -32 176 176 ) ( 0 144 144 ) common/slick 0 0 0 1 1 0 0 0 -( 0 144 144 ) ( 32 176 112 ) ( -32 176 112 ) common/slick 0 0 0 1 1 0 0 0 -( 0 144 144 ) ( -32 176 176 ) ( 32 176 176 ) common/slick 0 0 0 1 1 0 0 0 -( 32 176 176 ) ( -32 176 176 ) ( -32 176 112 ) common/slick 0 0 0 1 1 0 0 0 -( 0 144 144 ) ( 32 176 176 ) ( 32 176 112 ) common/slick 0 0 0 1 1 0 0 0 -} -// brush 5 -{ -( 0 144 144 ) ( -32 112 176 ) ( -32 112 112 ) common/slick 0 0 0 1 1 0 0 0 -( -32 112 176 ) ( 32 112 176 ) ( 32 112 112 ) common/slick 0 0 0 1 1 0 0 0 -( 0 144 144 ) ( -32 112 112 ) ( 32 112 112 ) common/slick 0 0 0 1 1 0 0 0 -( 0 144 144 ) ( 32 112 176 ) ( -32 112 176 ) common/slick 0 0 0 1 1 0 0 0 -( 32 112 112 ) ( 32 112 176 ) ( 0 144 144 ) common/slick 0 0 0 1 1 0 0 0 -} // brush 6 { -( -32 -32 48 ) ( -32 32 48 ) ( 0 0 80 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 80 ) ( 32 -32 48 ) ( -32 -32 48 ) common/slick 0 0 0 1 1 0 0 0 -( 32 32 48 ) ( -32 32 48 ) ( -32 -32 48 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 80 ) ( -32 32 48 ) ( 32 32 48 ) common/slick 0 0 0 1 1 0 0 0 -( 0 0 80 ) ( 32 32 48 ) ( 32 -32 48 ) common/slick 0 0 0 1 1 0 0 0 +( 256 352 256 ) ( 256 353 256 ) ( 256 352 257 ) common/slick 16 16 30 -1 1 0 0 0 +( 240 352 256 ) ( 240 352 257 ) ( 241 352 256 ) common/slick 16 16 30 1 1 0 0 0 +( 240 352 256 ) ( 241 352 256 ) ( 240 353 256 ) common/slick 16 16 30 -1 1 0 0 0 +( 320 432 320 ) ( 320 433 320 ) ( 321 432 320 ) common/slick 16 16 30 1 1 0 0 0 +( 320 416 264 ) ( 321 416 264 ) ( 320 416 265 ) common/slick 16 16 30 -1 1 0 0 0 +( 320 432 264 ) ( 320 432 265 ) ( 320 433 264 ) common/slick 16 16 30 1 1 0 0 0 } // brush 7 { @@ -80,4 +81,58 @@ ( 320 416 136 ) ( 321 416 136 ) ( 320 416 137 ) common/slick 0 0 0 -1 1 0 0 0 ( 320 432 136 ) ( 320 432 137 ) ( 320 433 136 ) common/slick 32 0 0 1 1 0 0 0 } +// brush 9 +{ +( 0 576 -32 ) ( 0 577 -32 ) ( 0 576 -31 ) common/slick 0 0 0 4 4 0 0 0 +( 224 0 -32 ) ( 224 0 -31 ) ( 225 0 -32 ) common/slick 0 0 0 4 4 0 0 0 +( 224 576 -512 ) ( 225 576 -512 ) ( 224 577 -512 ) common/slick 0 0 0 4 4 0 0 0 +( 256 608 0 ) ( 256 609 0 ) ( 257 608 0 ) common/slick 0 0 0 4 4 0 0 0 +( 256 512 -16 ) ( 257 512 -16 ) ( 256 512 -15 ) common/slick 0 0 0 4 4 0 0 0 +( 512 608 -16 ) ( 512 608 -15 ) ( 512 609 -16 ) common/slick 0 0 0 4 4 0 0 0 +} +// brush 10 +{ +( 416 429.25483399593895 136 ) ( 416.70710678118661 429.96194077712562 136 ) ( 416 429.25483399593895 137 ) common/slick 28 0 0 -1 1 0 0 0 +( 416 338.74516600406093 128 ) ( 415.29289321881345 339.45227278524749 128 ) ( 416 338.74516600406093 129 ) common/slick 0 0 0 -1 1 0 0 0 +( 404.68629150101526 327.4314575050762 128 ) ( 405.39339828220182 328.13856428626275 128 ) ( 403.97918471982871 328.13856428626269 128 ) common/slick 0 32 0 -1 1 0 0 0 +( 404.68629150101532 440.5685424949238 192 ) ( 403.97918471982877 441.27564927611036 192 ) ( 405.39339828220187 441.27564927611036 192 ) common/slick 0 32 0 1 1 0 0 0 +( 404.68629150101526 327.4314575050762 128 ) ( 404.68629150101526 327.4314575050762 129 ) ( 405.39339828220182 328.13856428626275 128 ) common/slick 28 0 0 1 1 0 0 0 +( 404.68629150101532 440.5685424949238 136 ) ( 404.68629150101532 440.5685424949238 137 ) ( 403.97918471982877 441.27564927611036 136 ) common/slick 0 0 0 1 1 0 0 0 +} +// brush 11 +{ +( 512 384 114.74516600406099 ) ( 512 384.70710678118655 115.45227278524749 ) ( 512 383.29289321881345 115.45227278524754 ) common/slick -32 0 0 -1 1 0 0 0 +( 496 384 114.74516600406099 ) ( 496 383.29289321881345 115.45227278524754 ) ( 497 384 114.74516600406099 ) common/slick 0 8 180 1 1 0 0 0 +( 576 395.31370849898474 216.56854249492386 ) ( 576 396.02081528017129 217.27564927611041 ) ( 577 395.31370849898474 216.56854249492386 ) common/slick 0 8 0 1 1 0 0 0 +( 496 384 114.74516600406099 ) ( 497 384 114.74516600406099 ) ( 496 384.70710678118655 115.45227278524749 ) common/slick 0 8 180 1 1 0 0 0 +( 576 423.59797974644664 165.65685424949243 ) ( 577 423.59797974644664 165.65685424949243 ) ( 576 422.89087296526009 166.36396103067898 ) common/slick 0 8 180 1 1 0 0 0 +( 576 434.91168824543138 176.97056274847722 ) ( 576 434.20458146424482 177.67766952966372 ) ( 576 435.61879502661793 177.67766952966377 ) common/slick -32 0 0 1 1 0 0 0 +} +// brush 12 +{ +( 641.37258300203052 327.4314575050762 137.3725830020303 ) ( 641.87258300203052 328.13856428626286 136.87258300203041 ) ( 640.87258300203052 328.13856428626275 137.8725830020303 ) common/slick 0 0 180 1 1 0 0 0 +( 649.37258300203052 338.74516600406105 129.37258300203041 ) ( 648.87258300203052 339.45227278524749 129.8725830020303 ) ( 650.07968978321708 338.74516600406105 130.07968978321691 ) common/slick 16 8 1.77636e-15 1 1 0 0 0 +( 655.02943725152284 429.25483399593918 135.02943725152275 ) ( 655.52943725152284 429.96194077712562 134.52943725152275 ) ( 655.73654403270939 429.25483399593918 135.7365440327093 ) common/slick -16 8 0 -1 1 0 0 0 +( 647.02943725152284 440.5685424949238 143.02943725152275 ) ( 647.73654403270939 440.5685424949238 143.7365440327093 ) ( 646.52943725152284 441.27564927611047 143.52943725152275 ) common/slick 0 0 180 1 1 0 0 0 +( 641.37258300203052 327.4314575050762 137.3725830020303 ) ( 642.07968978321708 327.4314575050762 138.07968978321679 ) ( 641.87258300203052 328.13856428626286 136.87258300203041 ) common/slick 0 0 180 1 1 0 0 0 +( 686.62741699796948 440.5685424949238 182.62741699796945 ) ( 686.12741699796948 441.27564927611047 183.12741699796945 ) ( 687.12741699796948 441.27564927611047 182.12741699796945 ) common/slick -32 -24 90 1 1 0 0 0 +} +// brush 13 +{ +( 416 429.25483399593895 200 ) ( 416.70710678118661 429.96194077712562 200 ) ( 416 429.25483399593895 201 ) common/slick 0 0 0 1 1 0 0 0 +( 416 338.74516600406093 192 ) ( 415.29289321881345 339.45227278524749 192 ) ( 416 338.74516600406093 193 ) common/slick 0 0 0 1 1 0 0 0 +( 404.68629150101526 327.4314575050762 192 ) ( 405.39339828220182 328.13856428626275 192 ) ( 403.97918471982871 328.13856428626269 192 ) common/slick 0 0 0 1 1 0 0 0 +( 404.68629150101532 440.5685424949238 256 ) ( 403.97918471982877 441.27564927611036 256 ) ( 405.39339828220187 441.27564927611036 256 ) common/slick 0 0 0 1 1 0 0 0 +( 404.68629150101526 327.4314575050762 192 ) ( 404.68629150101526 327.4314575050762 193 ) ( 405.39339828220182 328.13856428626275 192 ) common/slick 0 0 0 1 1 0 0 0 +( 404.68629150101532 440.5685424949238 200 ) ( 404.68629150101532 440.5685424949238 201 ) ( 403.97918471982877 441.27564927611036 200 ) common/slick 0 0 0 1 1 0 0 0 +} +// brush 14 +{ +( 512 384 206.74516600406099 ) ( 512 384.70710678118655 207.45227278524749 ) ( 512 383.29289321881345 207.45227278524754 ) common/slick 0 0 0 1 1 0 0 0 +( 496 384 206.74516600406099 ) ( 496 383.29289321881345 207.45227278524754 ) ( 497 384 206.74516600406099 ) common/slick 0 0 0 1 1 0 0 0 +( 576 395.31370849898474 308.56854249492386 ) ( 576 396.02081528017129 309.27564927611041 ) ( 577 395.31370849898474 308.56854249492386 ) common/slick 0 0 0 1 1 0 0 0 +( 496 384 206.74516600406099 ) ( 497 384 206.74516600406099 ) ( 496 384.70710678118655 207.45227278524749 ) common/slick 0 0 0 1 1 0 0 0 +( 576 423.59797974644664 257.65685424949243 ) ( 577 423.59797974644664 257.65685424949243 ) ( 576 422.89087296526009 258.36396103067898 ) common/slick 0 0 0 1 1 0 0 0 +( 576 434.91168824543138 268.97056274847722 ) ( 576 434.20458146424482 269.67766952966372 ) ( 576 435.61879502661793 269.67766952966377 ) common/slick 0 0 0 1 1 0 0 0 +} } diff --git a/Content/Materials/dev/dev_128.flax b/Content/Materials/dev/dev_128.flax index 611523544b6cc2537ce2ad93d2a49b0269df0074..23c9a0a4bef56c9bd9e455d35d9945ce7da6d6c5 100644 GIT binary patch delta 53 ucmezSf${GL#tl470v|6g67y+}bK9GGvg?$r4*O;qrj3l4qIa1WlmGyngBRfd delta 53 ucmezSf${GL#tl470#}%A;u?>N`pyzQsj&W&=$p+lOdA<7Mei~%C;Jr{=n diff --git a/Content/Materials/dev/slick.flax b/Content/Materials/dev/slick.flax new file mode 100644 index 0000000000000000000000000000000000000000..c16344cfaa216f056244982386c9d66f786d4951 GIT binary patch literal 30845 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 dotY && dotX > dotZ) - theUp = Vector3.Right; - else if (dotZ > dotX && dotZ > dotY) - theUp = -Vector3.Forward; - else if (dotY > dotX && dotY > dotZ) - theUp = -Vector3.Up; - else - theUp = -Vector3.Up; - var up1 = Vector3.Up; - var up2 = -Vector3.Forward; Vector2 uvScale = new Vector2(0f); float uvRotation = 0f; Vector2 uvOffset = new Vector2(0f); bool found = false; + Vector2 textureSize = new Vector2(64f); // TODO: figure out the correct size for the material foreach (var brushPlane in brush.planes) { Plane plane = brushPlane.plane; if ((plane.Normal - normal).Length < 0.01f) { - uvScale = 1f / brushPlane.scale / 64f; // texture size? + normal = plane.Normal; // for consistency + uvScale = 1f / brushPlane.scale / textureSize; // texture size? uvRotation = brushPlane.rotation; - uvOffset = brushPlane.offset; + uvOffset = brushPlane.offset * brushPlane.scale; found = true; break; } } if (!found) - Console.Print("no found, hidden surface?"); + Console.Print("no found, bad geometry?"); + + // texture is projected to the surface from the closest axis + + Vector3 normal2 = normal; + List> dots = new List>(new [] + { + new Tuple(Mathf.Abs(Vector3.Dot(normal2, Vector3.Right)), Vector3.Right), + new Tuple(Mathf.Abs(Vector3.Dot(normal2, Vector3.Forward)), -Vector3.Forward), + + new Tuple(Mathf.Abs(Vector3.Dot(normal2, Vector3.Up)), -Vector3.Up), + + }); + dots.Sort((l, r) => l.Item1.CompareTo(r.Item1)); + Vector3 theUp = dots.Last().Item2; + + /*var dotX = Mathf.Abs(Vector3.Dot(normal2, Vector3.Right)); + var dotY = Mathf.Abs(Vector3.Dot(normal2, Vector3.Up)); + var dotZ = Mathf.Abs(Vector3.Dot(normal2, Vector3.Forward)); + Vector3 theUp; + if (false) + {} + else if (dotY > dotX && dotY > dotZ) + theUp = -Vector3.Up; + else if (dotX > dotY && dotX > dotZ) + theUp = Vector3.Right; + else if (dotZ > dotX && dotZ > dotY) + theUp = -Vector3.Forward; + else + theUp = Vector3.Right;*/ + + var up1 = Vector3.Up; + var up2 = -Vector3.Forward; var finalUp = Mathf.Abs(Vector3.Dot(theUp, up1)) > 0.01f ? up2 : up1; var finalUp2 = Mathf.Abs(Vector3.Dot(theUp, up1)) > 0.01f ? up1 : up2; + var theRight = Vector3.Right; Quaternion rot = Quaternion.Identity; rot = rot * Quaternion.LookRotation(theUp, finalUp); - rot = rot * Quaternion.RotationAxis(Vector3.Forward, 180f * Mathf.DegreesToRadians); - rot = rot * Quaternion.RotationAxis(theUp, uvRotation * Mathf.DegreesToRadians); + rot = rot * Quaternion.RotationAxis(up2, 180f * Mathf.DegreesToRadians); + rot = rot * Quaternion.RotationAxis(Mathf.Abs(Vector3.Dot(theUp, theRight)) > 0.01f ? theRight : finalUp2, uvRotation * Mathf.DegreesToRadians); + + //if (Mathf.Abs(Vector3.Dot(theUp, theRight)) <= 0.01f) + // uvOffset *= 2; - - brushUvs[i + 0] = ((Vector2)(v1 * rot) * uvScale) + uvOffset / 64f; - brushUvs[i + 1] = ((Vector2)(v2 * rot) * uvScale) + uvOffset / 64f; - brushUvs[i + 2] = ((Vector2)(v3 * rot) * uvScale) + uvOffset / 64f; + brushUvs[i + 0] = ((Vector2)(v1 * rot) + (uvOffset)) * uvScale; + brushUvs[i + 1] = ((Vector2)(v2 * rot) + (uvOffset)) * uvScale; + brushUvs[i + 2] = ((Vector2)(v3 * rot) + (uvOffset)) * uvScale; brushNormals[i + 0] = normal; brushNormals[i + 1] = normal;