172 lines
5.1 KiB
C#
172 lines
5.1 KiB
C#
|
/* The MIT License
|
|||
|
*
|
|||
|
* Copyright (c) 2010 Intel Corporation.
|
|||
|
* All rights reserved.
|
|||
|
*
|
|||
|
* Based on the convexdecomposition library from
|
|||
|
* <http://codesuppository.googlecode.com> by John W. Ratcliff and Stan Melax.
|
|||
|
*
|
|||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
* of this software and associated documentation files (the "Software"), to deal
|
|||
|
* in the Software without restriction, including without limitation the rights
|
|||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
* copies of the Software, and to permit persons to whom the Software is
|
|||
|
* furnished to do so, subject to the following conditions:
|
|||
|
*
|
|||
|
* The above copyright notice and this permission notice shall be included in
|
|||
|
* all copies or substantial portions of the Software.
|
|||
|
*
|
|||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|||
|
* THE SOFTWARE.
|
|||
|
*/
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
|
|||
|
namespace OpenSim.Region.Physics.ConvexDecompositionDotNet
|
|||
|
{
|
|||
|
public class HullResult
|
|||
|
{
|
|||
|
public bool Polygons = true; // true if indices represents polygons, false indices are triangles
|
|||
|
public List<float3> OutputVertices = new List<float3>();
|
|||
|
public List<int> Indices;
|
|||
|
|
|||
|
// If triangles, then indices are array indexes into the vertex list.
|
|||
|
// If polygons, indices are in the form (number of points in face) (p1, p2, p3, ..) etc..
|
|||
|
}
|
|||
|
|
|||
|
public class PHullResult
|
|||
|
{
|
|||
|
public List<float3> Vertices = new List<float3>();
|
|||
|
public List<int> Indices = new List<int>();
|
|||
|
}
|
|||
|
|
|||
|
[Flags]
|
|||
|
public enum HullFlag : int
|
|||
|
{
|
|||
|
QF_DEFAULT = 0,
|
|||
|
QF_TRIANGLES = (1 << 0), // report results as triangles, not polygons.
|
|||
|
QF_SKIN_WIDTH = (1 << 2) // extrude hull based on this skin width
|
|||
|
}
|
|||
|
|
|||
|
public enum HullError : int
|
|||
|
{
|
|||
|
QE_OK, // success!
|
|||
|
QE_FAIL // failed.
|
|||
|
}
|
|||
|
|
|||
|
public class HullDesc
|
|||
|
{
|
|||
|
public HullFlag Flags; // flags to use when generating the convex hull.
|
|||
|
public List<float3> Vertices;
|
|||
|
public float NormalEpsilon; // the epsilon for removing duplicates. This is a normalized value, if normalized bit is on.
|
|||
|
public float SkinWidth;
|
|||
|
public uint MaxVertices; // maximum number of vertices to be considered for the hull!
|
|||
|
public uint MaxFaces;
|
|||
|
|
|||
|
public HullDesc()
|
|||
|
{
|
|||
|
Flags = HullFlag.QF_DEFAULT;
|
|||
|
Vertices = new List<float3>();
|
|||
|
NormalEpsilon = 0.001f;
|
|||
|
MaxVertices = 4096;
|
|||
|
MaxFaces = 4096;
|
|||
|
SkinWidth = 0.01f;
|
|||
|
}
|
|||
|
|
|||
|
public HullDesc(HullFlag flags, List<float3> vertices)
|
|||
|
{
|
|||
|
Flags = flags;
|
|||
|
Vertices = new List<float3>(vertices);
|
|||
|
NormalEpsilon = 0.001f;
|
|||
|
MaxVertices = 4096;
|
|||
|
MaxFaces = 4096;
|
|||
|
SkinWidth = 0.01f;
|
|||
|
}
|
|||
|
|
|||
|
public bool HasHullFlag(HullFlag flag)
|
|||
|
{
|
|||
|
return (Flags & flag) != 0;
|
|||
|
}
|
|||
|
|
|||
|
public void SetHullFlag(HullFlag flag)
|
|||
|
{
|
|||
|
Flags |= flag;
|
|||
|
}
|
|||
|
|
|||
|
public void ClearHullFlag(HullFlag flag)
|
|||
|
{
|
|||
|
Flags &= ~flag;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class ConvexH
|
|||
|
{
|
|||
|
public struct HalfEdge
|
|||
|
{
|
|||
|
public short ea; // the other half of the edge (index into edges list)
|
|||
|
public byte v; // the vertex at the start of this edge (index into vertices list)
|
|||
|
public byte p; // the facet on which this edge lies (index into facets list)
|
|||
|
|
|||
|
public HalfEdge(short _ea, byte _v, byte _p)
|
|||
|
{
|
|||
|
ea = _ea;
|
|||
|
v = _v;
|
|||
|
p = _p;
|
|||
|
}
|
|||
|
|
|||
|
public HalfEdge(HalfEdge e)
|
|||
|
{
|
|||
|
ea = e.ea;
|
|||
|
v = e.v;
|
|||
|
p = e.p;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public List<float3> vertices = new List<float3>();
|
|||
|
public List<HalfEdge> edges = new List<HalfEdge>();
|
|||
|
public List<Plane> facets = new List<Plane>();
|
|||
|
|
|||
|
public ConvexH(int vertices_size, int edges_size, int facets_size)
|
|||
|
{
|
|||
|
vertices = new List<float3>(vertices_size);
|
|||
|
edges = new List<HalfEdge>(edges_size);
|
|||
|
facets = new List<Plane>(facets_size);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class VertFlag
|
|||
|
{
|
|||
|
public byte planetest;
|
|||
|
public byte junk;
|
|||
|
public byte undermap;
|
|||
|
public byte overmap;
|
|||
|
}
|
|||
|
|
|||
|
public class EdgeFlag
|
|||
|
{
|
|||
|
public byte planetest;
|
|||
|
public byte fixes;
|
|||
|
public short undermap;
|
|||
|
public short overmap;
|
|||
|
}
|
|||
|
|
|||
|
public class PlaneFlag
|
|||
|
{
|
|||
|
public byte undermap;
|
|||
|
public byte overmap;
|
|||
|
}
|
|||
|
|
|||
|
public class Coplanar
|
|||
|
{
|
|||
|
public ushort ea;
|
|||
|
public byte v0;
|
|||
|
public byte v1;
|
|||
|
}
|
|||
|
}
|