public void CalculateIndexes(float threshold) { if (!FlatShading) Indices.Clear(); else Indices = new List<int>(); List<int> tri_count = new List<int>(); tree.ProcessCell(Indices, tri_count, threshold); if (!FlatShading) { IndexCount = Indices.Count; if (Indices.Count == 0) return; for (int i = 0; i < Indices.Count; i++) Indices[i] = Indices[i] & 0xFFFFFFF; IndexBuffer.SetData<int>(Indices.ToArray()); } else { List<VertexPositionColorNormalNormal> new_vertices = new List<VertexPositionColorNormalNormal>(); List<VertexPositionColor> wire_verts = new List<VertexPositionColor>(); List<int> wire_indexes = new List<int>(); int t_index = 0; for (int i = 0; i < Indices.Count; i += 3) { int count = tri_count[t_index++]; Vector3 n = Vector3.Zero; if (count == 1) n = GetNormalQ(VerticesDN, Indices[i + 2] & 0xFFFFFFF, Indices[i + 0] & 0xFFFFFFF, Indices[i + 1] & 0xFFFFFFF); else n = GetNormalQ(VerticesDN, Indices[i + 2] & 0xFFFFFFF, Indices[i + 0] & 0xFFFFFFF, Indices[i + 1] & 0xFFFFFFF, Indices[i + 5] & 0xFFFFFFF, Indices[i + 3] & 0xFFFFFFF, Indices[i + 4] & 0xFFFFFFF); Vector3 nc = n * 0.5f + Vector3.One * 0.5f; nc.Normalize(); Color c = new Color(nc); VertexPositionColorNormalNormal v0 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 0] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v1 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 1] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v2 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 2] & 0xFFFFFFF].Normal); new_vertices.Add(v0); new_vertices.Add(v1); new_vertices.Add(v2); int start = wire_verts.Count; if (count > 1) { VertexPositionColorNormalNormal v3 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 3] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 3] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v4 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 4] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 4] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v5 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 5] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 5] & 0xFFFFFFF].Normal); new_vertices.Add(v3); new_vertices.Add(v4); new_vertices.Add(v5); if (Indices[i] >= 0x10000000) { //0-2, 2-1, 1-4, 4-0 wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 4] & 0xFFFFFFF].Position, c)); wire_indexes.Add(start + 0); wire_indexes.Add(start + 2); wire_indexes.Add(start + 2); wire_indexes.Add(start + 1); wire_indexes.Add(start + 1); wire_indexes.Add(start + 3); wire_indexes.Add(start + 3); wire_indexes.Add(start + 0); } else { //0-1, 1-2, 2-5, 5-0 wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 5] & 0xFFFFFFF].Position, c)); wire_indexes.Add(start + 0); wire_indexes.Add(start + 1); wire_indexes.Add(start + 1); wire_indexes.Add(start + 2); wire_indexes.Add(start + 2); wire_indexes.Add(start + 3); wire_indexes.Add(start + 3); wire_indexes.Add(start + 0); } i += 3; } else { wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c)); wire_indexes.Add(start + 0); wire_indexes.Add(start + 1); wire_indexes.Add(start + 1); wire_indexes.Add(start + 2); wire_indexes.Add(start + 2); wire_indexes.Add(start + 0); } } if (new_vertices.Count > 0) VertexBuffer.SetData<VertexPositionColorNormalNormal>(new_vertices.ToArray()); if (wire_verts.Count > 0) { WireframeBuffer.SetData<VertexPositionColor>(wire_verts.ToArray()); WireframeIndexBuffer.SetData<int>(wire_indexes.ToArray()); } VertexCount = new_vertices.Count; WireframeCount = wire_indexes.Count; WireframeVertexCount = wire_verts.Count; } }
public void CalculateIndexes(float threshold) { if (!FlatShading) { Indices.Clear(); } else { Indices = new List <int>(); } List <int> tri_count = new List <int>(); tree.ProcessCell(Indices, tri_count, threshold); if (!FlatShading) { IndexCount = Indices.Count; if (Indices.Count == 0) { return; } for (int i = 0; i < Indices.Count; i++) { Indices[i] = Indices[i] & 0xFFFFFFF; } IndexBuffer.SetData <int>(Indices.ToArray()); } else { List <VertexPositionColorNormalNormal> new_vertices = new List <VertexPositionColorNormalNormal>(); List <VertexPositionColor> wire_verts = new List <VertexPositionColor>(); List <int> wire_indexes = new List <int>(); int t_index = 0; for (int i = 0; i < Indices.Count; i += 3) { int count = tri_count[t_index++]; Vector3 n = Vector3.Zero; if (count == 1) { n = GetNormalQ(VerticesDN, Indices[i + 2] & 0xFFFFFFF, Indices[i + 0] & 0xFFFFFFF, Indices[i + 1] & 0xFFFFFFF); } else { n = GetNormalQ(VerticesDN, Indices[i + 2] & 0xFFFFFFF, Indices[i + 0] & 0xFFFFFFF, Indices[i + 1] & 0xFFFFFFF, Indices[i + 5] & 0xFFFFFFF, Indices[i + 3] & 0xFFFFFFF, Indices[i + 4] & 0xFFFFFFF); } Vector3 nc = n * 0.5f + Vector3.One * 0.5f; nc.Normalize(); Color c = new Color(nc); VertexPositionColorNormalNormal v0 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 0] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v1 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 1] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v2 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 2] & 0xFFFFFFF].Normal); new_vertices.Add(v0); new_vertices.Add(v1); new_vertices.Add(v2); int start = wire_verts.Count; if (count > 1) { VertexPositionColorNormalNormal v3 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 3] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 3] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v4 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 4] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 4] & 0xFFFFFFF].Normal); VertexPositionColorNormalNormal v5 = new VertexPositionColorNormalNormal(VerticesDN[Indices[i + 5] & 0xFFFFFFF].Position, c, n, VerticesDN[Indices[i + 5] & 0xFFFFFFF].Normal); new_vertices.Add(v3); new_vertices.Add(v4); new_vertices.Add(v5); if (Indices[i] >= 0x10000000) { //0-2, 2-1, 1-4, 4-0 wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 4] & 0xFFFFFFF].Position, c)); wire_indexes.Add(start + 0); wire_indexes.Add(start + 2); wire_indexes.Add(start + 2); wire_indexes.Add(start + 1); wire_indexes.Add(start + 1); wire_indexes.Add(start + 3); wire_indexes.Add(start + 3); wire_indexes.Add(start + 0); } else { //0-1, 1-2, 2-5, 5-0 wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 5] & 0xFFFFFFF].Position, c)); wire_indexes.Add(start + 0); wire_indexes.Add(start + 1); wire_indexes.Add(start + 1); wire_indexes.Add(start + 2); wire_indexes.Add(start + 2); wire_indexes.Add(start + 3); wire_indexes.Add(start + 3); wire_indexes.Add(start + 0); } i += 3; } else { wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 0] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 1] & 0xFFFFFFF].Position, c)); wire_verts.Add(new VertexPositionColor(VerticesDN[Indices[i + 2] & 0xFFFFFFF].Position, c)); wire_indexes.Add(start + 0); wire_indexes.Add(start + 1); wire_indexes.Add(start + 1); wire_indexes.Add(start + 2); wire_indexes.Add(start + 2); wire_indexes.Add(start + 0); } } if (new_vertices.Count > 0) { VertexBuffer.SetData <VertexPositionColorNormalNormal>(new_vertices.ToArray()); } if (wire_verts.Count > 0) { WireframeBuffer.SetData <VertexPositionColor>(wire_verts.ToArray()); WireframeIndexBuffer.SetData <int>(wire_indexes.ToArray()); } VertexCount = new_vertices.Count; WireframeCount = wire_indexes.Count; WireframeVertexCount = wire_verts.Count; } }