本文整理汇总了C#中RawList.Clear方法的典型用法代码示例。如果您正苦于以下问题:C# RawList.Clear方法的具体用法?C# RawList.Clear怎么用?C# RawList.Clear使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类RawList
的用法示例。
在下文中一共展示了RawList.Clear方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Move
public void Move()
{
int[] testArray = Enumerable.Range(0, 10).ToArray();
RawList<int> intList = new RawList<int>();
intList.AddRange(testArray);
intList.Move(0, 3, 1);
CollectionAssert.AreEqual(new int[] { 0, 0, 1, 2, 4, 5, 6, 7, 8, 9 }, intList);
intList.Clear();
intList.AddRange(testArray);
intList.Move(0, 3, 3);
CollectionAssert.AreEqual(new int[] { 0, 1, 2, 0, 1, 2, 6, 7, 8, 9 }, intList);
intList.Clear();
intList.AddRange(testArray);
intList.Move(0, 3, 5);
CollectionAssert.AreEqual(new int[] { 0, 1, 2, 3, 4, 0, 1, 2, 8, 9 }, intList);
intList.Clear();
intList.AddRange(testArray);
intList.Move(7, 3, -1);
CollectionAssert.AreEqual(new int[] { 0, 1, 2, 3, 4, 5, 7, 8, 9, 9 }, intList);
intList.Clear();
intList.AddRange(testArray);
intList.Move(7, 3, -3);
CollectionAssert.AreEqual(new int[] { 0, 1, 2, 3, 7, 8, 9, 7, 8, 9 }, intList);
intList.Clear();
intList.AddRange(testArray);
intList.Move(7, 3, -5);
CollectionAssert.AreEqual(new int[] { 0, 1, 7, 8, 9, 5, 6, 7, 8, 9 }, intList);
intList.Clear();
}
示例2: GiveBack
/// <summary>
/// Returns a resource to the pool.
/// </summary>
/// <param name="list">List to return.</param>
public static void GiveBack(RawList<BroadPhaseEntry> list)
{
if (SubPoolBroadPhaseEntryList == null)
SubPoolBroadPhaseEntryList = new UnsafeResourcePool<RawList<BroadPhaseEntry>>();
list.Clear();
SubPoolBroadPhaseEntryList.GiveBack(list);
}
示例3: Basics
[Test] public void Basics()
{
RawList<int> intList = new RawList<int>();
intList.Add(10);
intList.AddRange(new int[] { 17, 42, 94 });
Assert.AreEqual(4, intList.Count);
Assert.IsTrue(intList.Contains(42));
Assert.AreEqual(2, intList.IndexOf(42));
CollectionAssert.AreEqual(new int[] { 10, 17, 42, 94 }, intList);
CollectionAssert.AreEqual(new int[] { 10, 17, 42, 94 }, intList.Data.Take(4));
intList.ShrinkToFit();
Assert.AreEqual(intList.Count, intList.Capacity);
intList.Remove(42);
Assert.AreEqual(3, intList.Count);
Assert.IsTrue(!intList.Contains(42));
Assert.AreEqual(-1, intList.IndexOf(42));
CollectionAssert.AreEqual(new int[] { 10, 17, 94 }, intList);
CollectionAssert.AreEqual(new int[] { 10, 17, 94 }, intList.Data.Take(3));
intList.Insert(1, 100);
CollectionAssert.AreEqual(new int[] { 10, 100, 17, 94 }, intList);
CollectionAssert.AreEqual(new int[] { 10, 100, 17, 94 }, intList.Data.Take(4));
intList.InsertRange(2, new int[] { 150, 200, 250, 300 });
CollectionAssert.AreEqual(new int[] { 10, 100, 150, 200, 250, 300, 17, 94 }, intList);
CollectionAssert.AreEqual(new int[] { 10, 100, 150, 200, 250, 300, 17, 94 }, intList.Data.Take(8));
intList.Clear();
Assert.AreEqual(0, intList.Count);
Assert.IsTrue(!intList.Contains(94));
}
示例4: RunTest
double RunTest(int splitOffset, IParallelLooper parallelLooper)
{
Entity toAdd;
//BoundingBox box = new BoundingBox(new Vector3(-5, 1, 1), new Vector3(5, 7, 7));
BoundingBox box = new BoundingBox(new Vector3(-500, -500, -500), new Vector3(500, 500, 500));
int splitDepth = splitOffset + (int)Math.Ceiling(Math.Log(parallelLooper.ThreadCount, 2));
DynamicHierarchy dh = new DynamicHierarchy(parallelLooper);
Random rand = new Random(0);
RawList<Entity> entities = new RawList<Entity>();
for (int k = 0; k < 10000; k++)
{
Vector3 position = new Vector3((float)(rand.NextDouble() * (box.Max.X - box.Min.X) + box.Min.X),
(float)(rand.NextDouble() * (box.Max.Y - box.Min.Y) + box.Min.Y),
(float)(rand.NextDouble() * (box.Max.Z - box.Min.Z) + box.Min.Z));
toAdd = new Box(position, 1, 1, 1, 1);
toAdd.CollisionInformation.CollisionRules.Personal = CollisionRule.NoNarrowPhasePair;
toAdd.CollisionInformation.UpdateBoundingBox(0);
dh.Add(toAdd.CollisionInformation);
entities.Add(toAdd);
}
Space.ForceUpdater.Gravity = new Vector3();
int numRuns = 3000;
//Prime the system.
dh.Update();
var testType = Test.Update;
BroadPhaseOverlap[] overlapBasis = new BroadPhaseOverlap[dh.Overlaps.Count];
dh.Overlaps.CopyTo(overlapBasis, 0);
double time = 0;
double startTime, endTime;
switch (testType)
{
#region Update Timing
case Test.Update:
for (int i = 0; i < numRuns; i++)
{
//DH4
startTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
//dh.Update();
//lock (dh.Locker)
//{
// dh.Overlaps.Clear();
// if (dh.ROOTEXISTS)
// {
// dh.MultithreadedRefitPhase(splitDepth);
// dh.MultithreadedOverlapPhase(splitDepth);
// }
//}
//dh.Update();
//lock (dh.Locker)
//{
// dh.Overlaps.Clear();
// if (dh.ROOTEXISTS)
// {
// dh.SingleThreadedRefitPhase();
// dh.SingleThreadedOverlapPhase();
// }
//}
endTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
time += endTime - startTime;
//if (dh.Overlaps.Count != overlapBasis.Length)
// Debug.WriteLine("Failed Update.");
//for (int j = 0; j < overlapBasis.Length; j++)
//{
// if (!dh.Overlaps.Contains(overlapBasis[j]))
// Debug.WriteLine("Failed Update.");
//}
//MoveEntities(entities);
}
break;
#endregion
#region Refit Timing
case Test.Refit:
for (int i = 0; i < numRuns; i++)
{
dh.Overlaps.Clear();
//DH4
//.........这里部分代码省略.........
示例5: GetTileAreaOutlines
private static void GetTileAreaOutlines(IReadOnlyGrid<bool> tileArea, Vector2 tileSize, ref List<Vector2[]> outlines)
{
// Initialize the container we'll put our outlines into
if (outlines == null)
outlines = new List<Vector2[]>();
else
outlines.Clear();
// Generate a data structure containing all visible edges
TileEdgeMap edgeMap = new TileEdgeMap(tileArea.Width + 1, tileArea.Height + 1);
for (int y = 0; y < edgeMap.Height; y++)
{
for (int x = 0; x < edgeMap.Width; x++)
{
// Determine highlight state of the four tiles around this node
bool topLeft = x > 0 && y > 0 && tileArea[x - 1, y - 1];
bool topRight = x < tileArea.Width && y > 0 && tileArea[x , y - 1];
bool bottomLeft = x > 0 && y < tileArea.Height && tileArea[x - 1, y ];
bool bottomRight = x < tileArea.Width && y < tileArea.Height && tileArea[x , y ];
// Determine which edges are visible
if (topLeft != topRight ) edgeMap.AddEdge(new Point2(x, y), new Point2(x , y - 1));
if (topRight != bottomRight) edgeMap.AddEdge(new Point2(x, y), new Point2(x + 1, y ));
if (bottomRight != bottomLeft ) edgeMap.AddEdge(new Point2(x, y), new Point2(x , y + 1));
if (bottomLeft != topLeft ) edgeMap.AddEdge(new Point2(x, y), new Point2(x - 1, y ));
}
}
// Traverse edges to form outlines until no more edges are left
RawList<Vector2> outlineBuilder = new RawList<Vector2>();
while (true)
{
// Find the beginning of an outline
Point2 current = edgeMap.FindNonEmpty();
if (current.X == -1 || current.Y == -1) break;
// Traverse it until no more edges are left
while (true)
{
Point2 next = edgeMap.GetClockwiseNextFrom(current);
if (next.X == -1 || next.Y == -1) break;
outlineBuilder.Add(next * tileSize);
edgeMap.RemoveEdge(current, next);
current = next;
}
// Close the loop by adding the first element again
if (outlineBuilder.Count > 0)
outlineBuilder.Add(outlineBuilder[0]);
// If we have enough vertices, keep the outline for drawing
Vector2[] outline = new Vector2[outlineBuilder.Count];
outlineBuilder.CopyTo(outline, 0);
outlines.Add(outline);
// Reset the outline builder to an empty state
outlineBuilder.Clear();
}
}
示例6: GiveBack
/// <summary>
/// Returns a resource to the pool.
/// </summary>
/// <param name="list">List to return.</param>
public static void GiveBack(RawList<Collidable> list)
{
list.Clear();
SubPoolCollidableList.GiveBack(list);
}
示例7: GetClosestPointOnTriangleToPoint
public static void GetClosestPointOnTriangleToPoint(RawList<Vector3> q, int i, int j, int k, ref Vector3 p, RawList<int> subsimplex, RawList<float> baryCoords, out Vector3 closestPoint)
{
subsimplex.Clear();
baryCoords.Clear();
float v, w;
Vector3 a = q[i];
Vector3 b = q[j];
Vector3 c = q[k];
Vector3 ab;
Vector3.Subtract(ref b, ref a, out ab);
Vector3 ac;
Vector3.Subtract(ref c, ref a, out ac);
//Vertex region A?
Vector3 ap;
Vector3.Subtract(ref p, ref a, out ap);
float d1;
Vector3.Dot(ref ab, ref ap, out d1);
float d2;
Vector3.Dot(ref ac, ref ap, out d2);
if (d1 <= 0 && d2 < 0)
{
subsimplex.Add(i);
baryCoords.Add(1);
closestPoint = a;
return; //barycentric coordinates (1,0,0)
}
//Vertex region B?
Vector3 bp;
Vector3.Subtract(ref p, ref b, out bp);
float d3;
Vector3.Dot(ref ab, ref bp, out d3);
float d4;
Vector3.Dot(ref ac, ref bp, out d4);
if (d3 >= 0 && d4 <= d3)
{
subsimplex.Add(j);
baryCoords.Add(1);
closestPoint = b;
return; //barycentric coordinates (0,1,0)
}
//Edge region AB?
float vc = d1 * d4 - d3 * d2;
if (vc <= 0 && d1 >= 0 && d3 <= 0)
{
subsimplex.Add(i);
subsimplex.Add(j);
v = d1 / (d1 - d3);
baryCoords.Add(1 - v);
baryCoords.Add(v);
Vector3.Multiply(ref ab, v, out closestPoint);
Vector3.Add(ref closestPoint, ref a, out closestPoint);
return; //barycentric coordinates (1-v, v, 0)
}
//Vertex region C?
Vector3 cp;
Vector3.Subtract(ref p, ref c, out cp);
float d5;
Vector3.Dot(ref ab, ref cp, out d5);
float d6;
Vector3.Dot(ref ac, ref cp, out d6);
if (d6 >= 0 && d5 <= d6)
{
subsimplex.Add(k);
baryCoords.Add(1);
closestPoint = c;
return; //barycentric coordinates (0,0,1)
}
//Edge region AC?
float vb = d5 * d2 - d1 * d6;
if (vb <= 0 && d2 >= 0 && d6 <= 0)
{
subsimplex.Add(i);
subsimplex.Add(k);
w = d2 / (d2 - d6);
baryCoords.Add(1 - w);
baryCoords.Add(w);
Vector3.Multiply(ref ac, w, out closestPoint);
Vector3.Add(ref closestPoint, ref a, out closestPoint);
return; //barycentric coordinates (1-w, 0, w)
}
//Edge region BC?
float va = d3 * d6 - d5 * d4;
if (va <= 0 && (d4 - d3) >= 0 && (d5 - d6) >= 0)
{
subsimplex.Add(j);
subsimplex.Add(k);
w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
baryCoords.Add(1 - w);
baryCoords.Add(w);
Vector3.Subtract(ref c, ref b, out closestPoint);
Vector3.Multiply(ref closestPoint, w, out closestPoint);
Vector3.Add(ref closestPoint, ref b, out closestPoint);
return; //barycentric coordinates (0, 1 - w ,w)
}
//Inside triangle?
subsimplex.Add(i);
subsimplex.Add(j);
subsimplex.Add(k);
float denom = 1 / (va + vb + vc);
v = vb * denom;
//.........这里部分代码省略.........
示例8: GiveBack
/// <summary>
/// Returns a resource to the pool.
/// </summary>
/// <param name="list">List to return.</param>
public static void GiveBack(RawList<CompoundChild> list)
{
list.Clear();
SubPoolCompoundChildList.GiveBack(list);
}
示例9: GetClosestPointOnTetrahedronToPoint
public static void GetClosestPointOnTetrahedronToPoint(RawList<Vector3> tetrahedron, ref Vector3 p, RawList<int> subsimplex, RawList<float> baryCoords, out Vector3 closestPoint)
{
var subsimplexCandidate = CommonResources.GetIntList();
var baryCoordsCandidate = CommonResources.GetFloatList();
Vector3 a = tetrahedron[0];
Vector3 b = tetrahedron[1];
Vector3 c = tetrahedron[2];
Vector3 d = tetrahedron[3];
closestPoint = p;
Vector3 pq;
float bestSqDist = float.MaxValue;
subsimplex.Clear();
subsimplex.Add(0); //Provides a baseline; if the object is not outside of any planes, then it's inside and the subsimplex is the tetrahedron itself.
subsimplex.Add(1);
subsimplex.Add(2);
subsimplex.Add(3);
baryCoords.Clear();
Vector3 q;
bool baryCoordsFound = false;
// If point outside face abc then compute closest point on abc
if (ArePointsOnOppositeSidesOfPlane(ref p, ref d, ref a, ref b, ref c))
{
GetClosestPointOnTriangleToPoint(tetrahedron, 0, 1, 2, ref p, subsimplexCandidate, baryCoordsCandidate, out q);
Vector3.Subtract(ref q, ref p, out pq);
float sqDist = pq.LengthSquared();
// Update best closest point if (squared) distance is less than current best
if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
closestPoint = q;
subsimplex.Clear();
baryCoords.Clear();
for (int k = 0; k < subsimplexCandidate.Count; k++)
{
subsimplex.Add(subsimplexCandidate[k]);
baryCoords.Add(baryCoordsCandidate[k]);
}
//subsimplex.AddRange(subsimplexCandidate);
//baryCoords.AddRange(baryCoordsCandidate);
baryCoordsFound = true;
}
}
// Repeat test for face acd
if (ArePointsOnOppositeSidesOfPlane(ref p, ref b, ref a, ref c, ref d))
{
GetClosestPointOnTriangleToPoint(tetrahedron, 0, 2, 3, ref p, subsimplexCandidate, baryCoordsCandidate, out q);
Vector3.Subtract(ref q, ref p, out pq);
float sqDist = pq.LengthSquared();
if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
closestPoint = q;
subsimplex.Clear();
baryCoords.Clear();
for (int k = 0; k < subsimplexCandidate.Count; k++)
{
subsimplex.Add(subsimplexCandidate[k]);
baryCoords.Add(baryCoordsCandidate[k]);
}
//subsimplex.AddRange(subsimplexCandidate);
//baryCoords.AddRange(baryCoordsCandidate);
baryCoordsFound = true;
}
}
// Repeat test for face adb
if (ArePointsOnOppositeSidesOfPlane(ref p, ref c, ref a, ref d, ref b))
{
GetClosestPointOnTriangleToPoint(tetrahedron, 0, 3, 1, ref p, subsimplexCandidate, baryCoordsCandidate, out q);
Vector3.Subtract(ref q, ref p, out pq);
float sqDist = pq.LengthSquared();
if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
closestPoint = q;
subsimplex.Clear();
baryCoords.Clear();
for (int k = 0; k < subsimplexCandidate.Count; k++)
{
subsimplex.Add(subsimplexCandidate[k]);
baryCoords.Add(baryCoordsCandidate[k]);
}
//subsimplex.AddRange(subsimplexCandidate);
//baryCoords.AddRange(baryCoordsCandidate);
baryCoordsFound = true;
}
}
// Repeat test for face bdc
if (ArePointsOnOppositeSidesOfPlane(ref p, ref a, ref b, ref d, ref c))
{
GetClosestPointOnTriangleToPoint(tetrahedron, 1, 3, 2, ref p, subsimplexCandidate, baryCoordsCandidate, out q);
Vector3.Subtract(ref q, ref p, out pq);
float sqDist = pq.LengthSquared();
if (sqDist < bestSqDist)
{
closestPoint = q;
subsimplex.Clear();
baryCoords.Clear();
for (int k = 0; k < subsimplexCandidate.Count; k++)
{
//.........这里部分代码省略.........
示例10: RemoveResetsReferenceTypesToDefault
[Test] public void RemoveResetsReferenceTypesToDefault()
{
RawList<string> list = new RawList<string>(Enumerable.Range(0, 10).Select(i => i.ToString()));
// Is the internal array empty if not assigned otherwise?
if (list.Capacity > list.Count)
Assert.AreSame(null, list.Data[list.Count]);
// Adjusting the count shouldn't affect the internal array, just as documented
list.Count = 0;
for (int i = 0; i < 10; i++)
{
Assert.AreNotSame(null, list.Data[i]);
}
list.Count = 10;
// Check various types of removal and make sure the internal array is reset properly
{
// Remove an element
list.Remove("1");
Assert.AreSame(null, list.Data[list.Count]);
list.RemoveAt(5);
Assert.AreSame(null, list.Data[list.Count]);
// Remove a range
list.RemoveRange(0, 5);
for (int i = list.Count; i < list.Data.Length; i++)
{
Assert.AreSame(null, list.Data[i]);
}
// Clear the list
list.Clear();
for (int i = list.Count; i < list.Data.Length; i++)
{
Assert.AreSame(null, list.Data[i]);
}
}
}
示例11: SelectImporter
protected RawList<ImportInputAssignment> SelectImporter(AssetImportEnvironment env)
{
if (!env.IsPrepareStep) throw new ArgumentException(
"The specified import environment must be configured as a preparation environment.",
"env");
// Find an importer to handle some or all of the unhandled input files
RawList<ImportInputAssignment> candidateMapping = new RawList<ImportInputAssignment>();
foreach (IAssetImporter importer in AssetManager.Importers)
{
env.ResetAcquiredData();
try
{
importer.PrepareImport(env);
}
catch (Exception ex)
{
Log.Editor.WriteError("An error occurred in the preparation step of '{1}': {0}",
Log.Exception(ex),
Log.Type(importer.GetType()));
continue;
}
if (env.HandledInput.Any())
{
candidateMapping.Add(new ImportInputAssignment
{
Importer = importer,
HandledInput = env.HandledInput.ToArray(),
ExpectedOutput = env.Output.ToArray()
});
}
}
// Sort candidate mapping from most files to least files, so we can solve the biggest conflicts first
candidateMapping.Sort((a, b) => b.HandledInput.Length - a.HandledInput.Length);
// Determine if multiple importers intend to handle the same files and resolve conflicts
List<int> conflictingIndices = new List<int>();
List<string> conflictingFiles = new List<string>();
for (int mainIndex = 0; mainIndex < candidateMapping.Count; mainIndex++)
{
ImportInputAssignment assignment = candidateMapping[mainIndex];
// Find all conflicts related to this assignment
conflictingIndices.Clear();
conflictingFiles.Clear();
for (int secondIndex = 0; secondIndex < candidateMapping.Count; secondIndex++)
{
if (secondIndex == mainIndex) continue;
ImportInputAssignment conflictAssignment = candidateMapping[secondIndex];
IEnumerable<string> mainFiles = assignment.HandledInput.Select(item => item.Path);
IEnumerable<string> secondFiles = conflictAssignment.HandledInput.Select(item => item.Path);
string[] conflicts = mainFiles.Intersect(secondFiles).ToArray();
if (conflicts.Length > 0)
{
if (conflictingIndices.Count == 0) conflictingIndices.Add(mainIndex);
conflictingIndices.Add(secondIndex);
conflictingFiles.AddRange(conflicts);
}
}
// Resolve conflicts with this assignment
if (conflictingIndices.Count > 0)
{
// Determine which importer to prefer for this conflict
ImportInputAssignment[] conflictingAssignments = conflictingIndices.Select(i => candidateMapping[i]).ToArray();
int keepIndex = this.ResolveMappingConflict(conflictingAssignments);
// If we somehow decided that none of the options is viable, abort the operation
if (keepIndex == -1)
{
candidateMapping.Clear();
return candidateMapping;
}
// Sort indices to remove in declining order and remove their mappings
conflictingIndices.Remove(keepIndex);
conflictingIndices.Sort((a, b) => b - a);
foreach (int index in conflictingIndices)
{
candidateMapping.RemoveAt(index);
}
// Start over with the conflict search
mainIndex = -1;
continue;
}
}
return candidateMapping;
}
示例12: GiveBack
/// <summary>
/// Returns a resource to the pool.
/// </summary>
/// <param name="triangleIndices">TriangleIndices list to return.</param>
public static void GiveBack(RawList<TriangleMeshConvexContactManifold.TriangleIndices> triangleIndices)
{
if (SubPoolTriangleIndicesList == null)
SubPoolTriangleIndicesList = new UnsafeResourcePool<RawList<TriangleMeshConvexContactManifold.TriangleIndices>>();
triangleIndices.Clear();
SubPoolTriangleIndicesList.GiveBack(triangleIndices);
}
示例13: UpdateLabel
protected void UpdateLabel()
{
SetString(m_sInitialString, true);
if (m_fWidth > 0)
{
// Step 1: Make multiline
string str_whole = m_sString;
int stringLength = m_sString.Length;
var multiline_string = new StringBuilder(stringLength);
var last_word = new StringBuilder(stringLength);
int line = 1, i = 0;
bool start_line = false, start_word = false;
float startOfLine = -1, startOfWord = -1;
int skip = 0;
RawList<CCNode> children = m_pChildren;
for (int j = 0; j < children.count; j++)
{
CCSprite characterSprite;
while ((characterSprite = (CCSprite) GetChildByTag(j + skip)) == null)
{
skip++;
}
if (!characterSprite.Visible)
{
continue;
}
if (i >= stringLength)
{
break;
}
char character = str_whole[i];
if (!start_word)
{
startOfWord = GetLetterPosXLeft(characterSprite);
start_word = true;
}
if (!start_line)
{
startOfLine = startOfWord;
start_line = true;
}
// Newline.
if (character == '\n')
{
int len = last_word.Length;
while (len > 0 && Char.IsWhiteSpace(last_word[len - 1]))
{
len--;
last_word.Remove(len, 1);
}
multiline_string.Append(last_word);
multiline_string.Append('\n');
#if XBOX || XBOX360
last_word.Length = 0;
#else
last_word.Clear();
#endif
start_word = false;
start_line = false;
startOfWord = -1;
startOfLine = -1;
i++;
line++;
if (i >= stringLength)
break;
character = str_whole[i];
if (startOfWord == 0)
{
startOfWord = GetLetterPosXLeft(characterSprite);
start_word = true;
}
if (startOfLine == 0)
{
startOfLine = startOfWord;
start_line = true;
}
}
// Whitespace.
if (Char.IsWhiteSpace(character))
{
last_word.Append(character);
multiline_string.Append(last_word);
#if XBOX || XBOX360
last_word.Length = 0;
//.........这里部分代码省略.........
示例14: BroadPhasesTestDemo
//.........这里部分代码省略.........
#endregion
#region Ray cast timing
case Test.RayCast:
float rayLength = 100;
RawList<Ray> rays = new RawList<Ray>();
for (int i = 0; i < numRuns; i++)
{
rays.Add(new Ray()
{
Position = new Vector3((float)(rand.NextDouble() * (box.Max.X - box.Min.X) + box.Min.X),
(float)(rand.NextDouble() * (box.Max.Y - box.Min.Y) + box.Min.Y),
(float)(rand.NextDouble() * (box.Max.Z - box.Min.Z) + box.Min.Z)),
Direction = Vector3.Normalize(new Vector3((float)(rand.NextDouble() - .5), (float)(rand.NextDouble() - .5), (float)(rand.NextDouble() - .5)))
});
}
RawList<BroadPhaseEntry> outputIntersections = new RawList<BroadPhaseEntry>();
////DH
//startTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
//for (int i = 0; i < numRuns; i++)
//{
// dhOld.QueryAccelerator.RayCast(rays.Elements[i], rayLength, outputIntersections);
// outputIntersections.Clear();
//}
//endTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
//DHOldTime = endTime - startTime;
//DH4
startTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
for (int i = 0; i < numRuns; i++)
{
dh.QueryAccelerator.RayCast(rays.Elements[i], rayLength, outputIntersections);
outputIntersections.Clear();
}
endTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
DHtime = endTime - startTime;
//Grid2DSAS
startTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
for (int i = 0; i < numRuns; i++)
{
grid2DSAS.QueryAccelerator.RayCast(rays.Elements[i], rayLength, outputIntersections);
outputIntersections.Clear();
}
endTime = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
grid2DSAStime = endTime - startTime;
break;
#endregion
#region Bounding box query timing
case Test.BoundingBoxQuery:
float boundingBoxSize = 10;
var boundingBoxes = new RawList<BoundingBox>();
Vector3 offset = new Vector3(boundingBoxSize / 2, boundingBoxSize / 2, boundingBoxSize / 2);
for (int i = 0; i < numRuns; i++)
{
Vector3 center = new Vector3((float)(rand.NextDouble() * (box.Max.X - box.Min.X) + box.Min.X),
(float)(rand.NextDouble() * (box.Max.Y - box.Min.Y) + box.Min.Y),
(float)(rand.NextDouble() * (box.Max.Z - box.Min.Z) + box.Min.Z));
boundingBoxes.Add(new BoundingBox()
{
Min = center - offset,
Max = center + offset
});
}
示例15: IsPointContained
internal bool IsPointContained(ref Vector3 point, RawList<int> triangles)
{
Vector3 rayDirection;
//Point from the approximate center of the mesh outwards.
//This is a cheap way to reduce the number of unnecessary checks when objects are external to the mesh.
Vector3.Add(ref boundingBox.Max, ref boundingBox.Min, out rayDirection);
Vector3.Multiply(ref rayDirection, .5f, out rayDirection);
Vector3.Subtract(ref point, ref rayDirection, out rayDirection);
//If the point is right in the middle, we'll need a backup.
if (rayDirection.LengthSquared() < .01f)
rayDirection = Vector3.Up;
var ray = new Ray(point, rayDirection);
triangleMesh.Tree.GetOverlaps(ray, triangles);
float minimumT = float.MaxValue;
bool minimumIsClockwise = false;
for (int i = 0; i < triangles.Count; i++)
{
Vector3 a, b, c;
triangleMesh.Data.GetTriangle(triangles.Elements[i], out a, out b, out c);
RayHit hit;
bool hitClockwise;
if (Toolbox.FindRayTriangleIntersection(ref ray, float.MaxValue, ref a, ref b, ref c, out hitClockwise, out hit))
{
if (hit.T < minimumT)
{
minimumT = hit.T;
minimumIsClockwise = hitClockwise;
}
}
}
triangles.Clear();
//If the first hit is on the inner surface, then the ray started inside the mesh.
return minimumT < float.MaxValue && minimumIsClockwise == innerFacingIsClockwise;
}