remove duplicate verts
This commit is contained in:
@@ -272,16 +272,20 @@
|
|||||||
}
|
}
|
||||||
// brush 30
|
// brush 30
|
||||||
{
|
{
|
||||||
( -64 640 160 ) ( -64 641 160 ) ( -64 640 161 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
|
( -128 544 0 ) ( -128 545 0 ) ( -128 544 1 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
|
||||||
( -64 640 160 ) ( -64 640 161 ) ( -63 640 160 ) common/slick 0 0 0 1 1 0 0 0
|
( -128 544 0 ) ( -128 544 1 ) ( -127 544 0 ) common/slick 0 0 0 1 1 0 0 0
|
||||||
( -64 640 160 ) ( -63 640 160 ) ( -64 641 160 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
( -128 544 0 ) ( -127 544 0 ) ( -128 545 0 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
( 48 736 224 ) ( 48 737 224 ) ( 49 736 224 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
( -16 640 64 ) ( -16 641 64 ) ( -15 640 64 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
( 48 704 176 ) ( 49 704 176 ) ( 48 704 177 ) common/slick 0 0 0 1 1 0 0 0
|
( -16 608 16 ) ( -15 608 16 ) ( -16 608 17 ) common/slick 0 0 0 1 1 0 0 0
|
||||||
( 0 736 176 ) ( 0 736 177 ) ( 0 737 176 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
|
( -64 640 16 ) ( -64 640 17 ) ( -64 641 16 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
|
||||||
}
|
}
|
||||||
}
|
// brush 31
|
||||||
// entity 1
|
|
||||||
{
|
{
|
||||||
"classname" "info_player_deathmatch"
|
( -752 464 64 ) ( -752 465 64 ) ( -752 464 65 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
"origin" "-368 544 120"
|
( -752 464 64 ) ( -752 464 65 ) ( -751 464 64 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
|
( -752 464 64 ) ( -751 464 64 ) ( -752 465 64 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
|
( -672 592 80 ) ( -672 593 80 ) ( -671 592 80 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
|
( -672 592 80 ) ( -671 592 80 ) ( -672 592 81 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
|
( -672 592 80 ) ( -672 592 81 ) ( -672 593 80 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,10 @@
|
|||||||
"ForDistribution": false,
|
"ForDistribution": false,
|
||||||
"SkipPackaging": false,
|
"SkipPackaging": false,
|
||||||
"AdditionalAssets": [],
|
"AdditionalAssets": [],
|
||||||
"AdditionalAssetFolders": [],
|
"AdditionalAssetFolders": [
|
||||||
|
"Content/Materials",
|
||||||
|
"Content/Textures"
|
||||||
|
],
|
||||||
"ShadersNoOptimize": false,
|
"ShadersNoOptimize": false,
|
||||||
"ShadersGenerateDebugData": false,
|
"ShadersGenerateDebugData": false,
|
||||||
"Presets": [
|
"Presets": [
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ namespace Game
|
|||||||
{
|
{
|
||||||
public MapBrush brush;
|
public MapBrush brush;
|
||||||
public Vector3[] vertices; // all vertices
|
public Vector3[] vertices; // all vertices
|
||||||
|
public Vector3 offset;
|
||||||
public BrushGeometryMesh[] meshes;
|
public BrushGeometryMesh[] meshes;
|
||||||
public Model model;
|
public Model model;
|
||||||
public Dictionary<string, MaterialBase> brushMaterials;
|
public Dictionary<string, MaterialBase> brushMaterials;
|
||||||
@@ -135,6 +136,29 @@ namespace Game
|
|||||||
planePoints.Add(intersection);
|
planePoints.Add(intersection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove duplicate points
|
||||||
|
var planePoints3 = planePoints;
|
||||||
|
planePoints = new HashSet<Vector3>();
|
||||||
|
|
||||||
|
foreach (var p1 in planePoints3)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
foreach (var p2 in planePoints)
|
||||||
|
{
|
||||||
|
if (Mathf.Abs((p1 - p2).Length) < 0.00001f)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
planePoints.Add(p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (planePoints.Count != planePoints3.Count)
|
||||||
|
Console.Print("culled " + (planePoints3.Count - planePoints.Count) + " points while triangulation");
|
||||||
|
|
||||||
// pass 2: cull points behind clipping planes
|
// pass 2: cull points behind clipping planes
|
||||||
var planePoints2 = planePoints;
|
var planePoints2 = planePoints;
|
||||||
planePoints = new HashSet<Vector3>();
|
planePoints = new HashSet<Vector3>();
|
||||||
@@ -217,6 +241,13 @@ namespace Game
|
|||||||
|
|
||||||
Assert.IsTrue(geom.vertices.Length > 0);
|
Assert.IsTrue(geom.vertices.Length > 0);
|
||||||
|
|
||||||
|
foreach (var vert in geom.vertices)
|
||||||
|
geom.offset += vert;
|
||||||
|
geom.offset /= geom.vertices.Length;
|
||||||
|
|
||||||
|
for (int i=0; i<geom.vertices.Length; i++)
|
||||||
|
geom.vertices[i] -= geom.offset;
|
||||||
|
|
||||||
Dictionary<string, MaterialBase> brushMaterials = new Dictionary<string, MaterialBase>();
|
Dictionary<string, MaterialBase> brushMaterials = new Dictionary<string, MaterialBase>();
|
||||||
foreach (var brushPlane in geom.brush.planes)
|
foreach (var brushPlane in geom.brush.planes)
|
||||||
{
|
{
|
||||||
@@ -260,6 +291,7 @@ namespace Game
|
|||||||
Console.Print("Pass 1: triangulation: " + sw.Elapsed.TotalMilliseconds + "ms");
|
Console.Print("Pass 1: triangulation: " + sw.Elapsed.TotalMilliseconds + "ms");
|
||||||
|
|
||||||
// pass 2: texturing
|
// pass 2: texturing
|
||||||
|
brushIndex = 0;
|
||||||
sw.Restart();
|
sw.Restart();
|
||||||
foreach (var geom in brushGeometries)
|
foreach (var geom in brushGeometries)
|
||||||
{
|
{
|
||||||
@@ -293,7 +325,7 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
Console.Print("no matching plane found, bad geometry?");
|
Console.Print("no matching plane found for brush " + brushIndex + ", bad geometry?");
|
||||||
|
|
||||||
Vector2 uv1, uv2, uv3;
|
Vector2 uv1, uv2, uv3;
|
||||||
// if quake format
|
// if quake format
|
||||||
@@ -338,9 +370,9 @@ namespace Game
|
|||||||
: axisForward2,
|
: axisForward2,
|
||||||
uvRotation * Mathf.DegreesToRadians);
|
uvRotation * Mathf.DegreesToRadians);
|
||||||
|
|
||||||
uv1 = ((Vector2)(v1 * rot) + uvOffset) * uvScale;
|
uv1 = ((Vector2)((v1 + geom.offset) * rot) + uvOffset) * uvScale;
|
||||||
uv2 = ((Vector2)(v2 * rot) + uvOffset) * uvScale;
|
uv2 = ((Vector2)((v2 + geom.offset) * rot) + uvOffset) * uvScale;
|
||||||
uv3 = ((Vector2)(v3 * rot) + uvOffset) * uvScale;
|
uv3 = ((Vector2)((v3 + geom.offset) * rot) + uvOffset) * uvScale;
|
||||||
}
|
}
|
||||||
var mesh = geom.meshes[meshIndex];
|
var mesh = geom.meshes[meshIndex];
|
||||||
|
|
||||||
@@ -376,6 +408,7 @@ namespace Game
|
|||||||
geom.model.LODs[0].Meshes[i].MaterialSlotIndex = i;
|
geom.model.LODs[0].Meshes[i].MaterialSlotIndex = i;
|
||||||
geom.model.MaterialSlots[i].Material = geom.meshes[i].material;
|
geom.model.MaterialSlots[i].Material = geom.meshes[i].material;
|
||||||
}
|
}
|
||||||
|
brushIndex++;
|
||||||
}
|
}
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
Console.Print("Pass 2: texturing: " + sw.Elapsed.TotalMilliseconds + "ms");
|
Console.Print("Pass 2: texturing: " + sw.Elapsed.TotalMilliseconds + "ms");
|
||||||
@@ -389,6 +422,7 @@ namespace Game
|
|||||||
childModel.Name = "Brush_" + brushIndex;
|
childModel.Name = "Brush_" + brushIndex;
|
||||||
childModel.Parent = mapRootActor;
|
childModel.Parent = mapRootActor;
|
||||||
childModel.Model = geom.model;
|
childModel.Model = geom.model;
|
||||||
|
childModel.Position = geom.offset;
|
||||||
|
|
||||||
for (int i = 0; i < geom.meshes.Length; i++)
|
for (int i = 0; i < geom.meshes.Length; i++)
|
||||||
childModel.SetMaterial(i, geom.meshes[i].material);
|
childModel.SetMaterial(i, geom.meshes[i].material);
|
||||||
|
|||||||
Reference in New Issue
Block a user