private bool OnPrimitiveTest(uint lastVertexId, DrawMode mode)
{
bool result = false;
var indexBuffer = this.indexBuffer as ZeroIndexBuffer;
int first = indexBuffer.FirstVertex;
if (first < 0) { return false; }
int vertexCount = indexBuffer.RenderingVertexCount;
if (vertexCount <= 0) { return false; }
int last = first + vertexCount - 1;
switch (mode)
{
case DrawMode.Points:
result = true;
break;
case DrawMode.LineStrip:
result = vertexCount > 1;
break;
case DrawMode.LineLoop:
result = vertexCount > 1;
break;
case DrawMode.Lines:
if (vertexCount > 1)
{
if (vertexCount % 2 == 0)
{
result = (first <= lastVertexId && lastVertexId <= last);
}
else
{
result = (first <= lastVertexId && lastVertexId <= last - 1);
}
}
break;
case DrawMode.LineStripAdjacency:
if (vertexCount > 3)
{
result = (first < lastVertexId && lastVertexId < last);
}
break;
case DrawMode.LinesAdjacency:
if (vertexCount > 3)
{
var lastPart = last - (last + 1 - first) % 4;
if (first <= lastVertexId && lastVertexId <= lastPart)
{
var m = (lastVertexId - first) % 4;
result = (m == 1 || m == 2);
}
}
break;
case DrawMode.TriangleStrip:
if (vertexCount > 2)
{
result = vertexCount > 2;
}
break;
case DrawMode.TriangleFan:
if (vertexCount > 2)
{
result = vertexCount > 2;
}
break;
case DrawMode.Triangles:
if (vertexCount > 2)
{
if (first <= lastVertexId)
{
result = ((vertexCount % 3 == 0) && (lastVertexId <= last))
|| ((vertexCount % 3 == 1) && (lastVertexId < last))
|| ((vertexCount % 3 == 2) && (lastVertexId + 1 < last));
}
}
break;
case DrawMode.TriangleStripAdjacency:
if (vertexCount > 5)
{
var lastPart = last - (last + 1 - first) % 2;
if (first <= lastVertexId && lastVertexId <= lastPart)
{
result = (lastVertexId - first) % 2 == 0;
}
}
break;
case DrawMode.TrianglesAdjacency:
if (vertexCount > 5)
{
var lastPart = last - (last + 1 - first) % 6;
if (first <= lastVertexId && lastVertexId <= lastPart)
{
result = (lastVertexId - first) % 2 == 0;
}
}
break;
case DrawMode.Patches:
// TODO: not know what to do for now
break;
case DrawMode.QuadStrip:
if (vertexCount > 3)
{
if (first <= lastVertexId && lastVertexId <= last)
{
result = (vertexCount % 2 == 0)
|| (lastVertexId < last);
}
}
break;
case DrawMode.Quads:
if (vertexCount > 3)
{
if (first <= lastVertexId && lastVertexId <= last)
{
var m = vertexCount % 4;
if (m == 0) { result = true; }
else if (m == 1) { result = lastVertexId + 0 < last; }
else if (m == 2) { result = lastVertexId + 1 < last; }
else if (m == 3) { result = lastVertexId + 2 < last; }
else { throw new Exception("This should never happen!"); }
}
}
break;
case DrawMode.Polygon:
if (vertexCount > 2)
{
result = (first <= lastVertexId && lastVertexId <= last);
}
break;
default:
throw new NotImplementedException();
}
return result;
}