public override void OnEndDrawMesh(GraphicsDevice graphicsDevice, ModelMesh mesh, Matrix bone, Matrix view, Matrix projection) { if (!Active) { return; } foreach (ModelMeshPart meshPart in mesh.MeshParts) { NormalBuffers normalBuffers = meshPart.Tag as NormalBuffers; if (normalBuffers == null) { continue; } graphicsDevice.SetVertexBuffer(normalBuffers.Vertices); graphicsDevice.Indices = normalBuffers.Indices; _lineEffect.World = bone; _lineEffect.View = view; _lineEffect.Projection = projection; foreach (EffectPass pass in _lineEffect.CurrentTechnique.Passes) { pass.Apply(); graphicsDevice.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, normalBuffers.VertexCount, 0, normalBuffers.PrimitiveCount); } } }
private static NormalBuffers GetNormalBuffers(ModelMesh mesh, ModelMeshPart meshPart, GraphicsDevice graphicsDevice, float normalLengthPercentage) { if (meshPart.VertexBuffer == null) { return(null); } Vector3[] positions = VertexElementExtractor.GetVertexElement(meshPart, VertexElementUsage.Position); if (positions == null) { return(null); } Vector3[] normals = VertexElementExtractor.GetVertexElement(meshPart, VertexElementUsage.Normal); if (normals == null) { return(null); } NormalBuffers normalBuffers = new NormalBuffers(); normalBuffers.PrimitiveCount = normals.Length; normalBuffers.VertexCount = normals.Length * 2; float size = mesh.BoundingSphere.Radius * normalLengthPercentage; VertexBuffer vertexBuffer = new VertexBuffer(graphicsDevice, typeof(VertexPositionColor), normalBuffers.VertexCount, BufferUsage.WriteOnly); VertexPositionColor[] vertices = new VertexPositionColor[normalBuffers.VertexCount]; int counter = 0; for (int i = 0; i < normals.Length; ++i) { Vector3 normalColorTemp = Vector3.Normalize(normals[i]); normalColorTemp += Vector3.One; normalColorTemp *= 0.5f; Color normalColor = new Color(normalColorTemp); vertices[counter++] = new VertexPositionColor(positions[i], normalColor); vertices[counter++] = new VertexPositionColor(positions[i] + (normals[i] * size), normalColor); } vertexBuffer.SetData(vertices); normalBuffers.Vertices = vertexBuffer; IndexBuffer indexBuffer = new IndexBuffer(graphicsDevice, IndexElementSize.SixteenBits, normalBuffers.VertexCount, BufferUsage.WriteOnly); indexBuffer.SetData(Enumerable.Range(0, normalBuffers.VertexCount).Select(i => (short)i).ToArray()); normalBuffers.Indices = indexBuffer; return(normalBuffers); }
private static NormalBuffers GetNormalBuffers(ModelMesh mesh, ModelMeshPart meshPart, GraphicsDevice graphicsDevice, float normalLengthPercentage) { if (meshPart.VertexBuffer == null) return null; Vector3[] positions = VertexElementExtractor.GetVertexElement(meshPart, VertexElementUsage.Position); if (positions == null) return null; Vector3[] normals = VertexElementExtractor.GetVertexElement(meshPart, VertexElementUsage.Normal); if (normals == null) return null; NormalBuffers normalBuffers = new NormalBuffers(); normalBuffers.PrimitiveCount = normals.Length; normalBuffers.VertexCount = normals.Length * 2; float size = mesh.BoundingSphere.Radius * normalLengthPercentage; VertexBuffer vertexBuffer = new VertexBuffer(graphicsDevice, typeof (VertexPositionColor), normalBuffers.VertexCount, BufferUsage.WriteOnly); VertexPositionColor[] vertices = new VertexPositionColor[normalBuffers.VertexCount]; int counter = 0; for (int i = 0; i < normals.Length; ++i) { Vector3 normalColorTemp = Vector3.Normalize(normals[i]); normalColorTemp += Vector3.One; normalColorTemp *= 0.5f; Color normalColor = new Color(normalColorTemp); vertices[counter++] = new VertexPositionColor(positions[i], normalColor); vertices[counter++] = new VertexPositionColor(positions[i] + (normals[i] * size), normalColor); } vertexBuffer.SetData(vertices); normalBuffers.Vertices = vertexBuffer; IndexBuffer indexBuffer = new IndexBuffer(graphicsDevice, IndexElementSize.SixteenBits, normalBuffers.VertexCount, BufferUsage.WriteOnly); indexBuffer.SetData(Enumerable.Range(0, normalBuffers.VertexCount).Select(i => (short) i).ToArray()); normalBuffers.Indices = indexBuffer; return normalBuffers; }
public override void OnEndDrawMesh(ModelMesh mesh, RenderSettings renderSettings) { NormalBuffers normalBuffers = GetNormalBuffers(mesh); _device.VertexDeclaration = _lineVertexDeclaration; _device.SetStreamSource(0, normalBuffers.Vertices, 0, VertexPositionColor.SizeInBytes); _device.Indices = normalBuffers.Indices; _lineEffect.WorldViewProjection = renderSettings.ViewMatrix * renderSettings.ProjectionMatrix; int passes = _lineEffect.Begin(); for (int pass = 0; pass < passes; ++pass) { _lineEffect.BeginPass(pass); _device.DrawIndexedPrimitive(PrimitiveType.LineList, 0, 0, normalBuffers.VertexCount, 0, normalBuffers.PrimitiveCount); _lineEffect.EndPass(); } }
private NormalBuffers GetNormalBuffers(ModelMesh mesh) { if (!_normals.ContainsKey(mesh)) { NormalBuffers normalBuffers = new NormalBuffers(); Line3D[] normalLines = NormalLinesGenerator.Generate(mesh.SourceMesh); normalBuffers.PrimitiveCount = normalLines.Length; normalBuffers.VertexCount = normalLines.Length * 2; VertexBuffer vertexBuffer = new VertexBuffer(_device, normalBuffers.VertexCount * VertexPositionColor.SizeInBytes, Usage.WriteOnly, VertexFormat.None, Pool.Default); DataStream vertexDataStream = vertexBuffer.Lock(0, normalBuffers.VertexCount * VertexPositionColor.SizeInBytes, LockFlags.None); VertexPositionColor[] vertices = new VertexPositionColor[normalBuffers.VertexCount]; int counter = 0; for (int i = 0; i < normalLines.Length; ++i) { Vector3D normalColor = Vector3D.Normalize(normalLines[i].Direction); normalColor += Vector3D.One; normalColor *= 0.5f; vertices[counter++] = new VertexPositionColor(normalLines[i].Start, normalColor); vertices[counter++] = new VertexPositionColor(normalLines[i].End, normalColor); } vertexDataStream.WriteRange(vertices); vertexBuffer.Unlock(); normalBuffers.Vertices = vertexBuffer; IndexBuffer indexBuffer = new IndexBuffer(_device, normalBuffers.VertexCount * sizeof(int), Usage.WriteOnly, Pool.Default, false); DataStream indexDataStream = indexBuffer.Lock(0, normalBuffers.VertexCount * sizeof(int), LockFlags.None); indexDataStream.WriteRange(Enumerable.Range(0, normalBuffers.VertexCount).ToArray()); indexBuffer.Unlock(); normalBuffers.Indices = indexBuffer; _normals.Add(mesh, normalBuffers); } return _normals[mesh]; }
private NormalBuffers GetNormalBuffers(ModelMesh mesh) { if (!_normals.ContainsKey(mesh)) { NormalBuffers normalBuffers = new NormalBuffers(); Line3D[] normalLines = NormalLinesGenerator.Generate(mesh.SourceMesh); normalBuffers.PrimitiveCount = normalLines.Length; normalBuffers.VertexCount = normalLines.Length * 2; VertexBuffer vertexBuffer = new VertexBuffer(_device, normalBuffers.VertexCount * VertexPositionColor.SizeInBytes, Usage.WriteOnly, VertexFormat.None, Pool.Default); DataStream vertexDataStream = vertexBuffer.Lock(0, normalBuffers.VertexCount * VertexPositionColor.SizeInBytes, LockFlags.None); VertexPositionColor[] vertices = new VertexPositionColor[normalBuffers.VertexCount]; int counter = 0; for (int i = 0; i < normalLines.Length; ++i) { Vector3D normalColor = Vector3D.Normalize(normalLines[i].Direction); normalColor += Vector3D.One; normalColor *= 0.5f; vertices[counter++] = new VertexPositionColor(normalLines[i].Start, normalColor); vertices[counter++] = new VertexPositionColor(normalLines[i].End, normalColor); } vertexDataStream.WriteRange(vertices); vertexBuffer.Unlock(); normalBuffers.Vertices = vertexBuffer; IndexBuffer indexBuffer = new IndexBuffer(_device, normalBuffers.VertexCount * sizeof(int), Usage.WriteOnly, Pool.Default, false); DataStream indexDataStream = indexBuffer.Lock(0, normalBuffers.VertexCount * sizeof(int), LockFlags.None); indexDataStream.WriteRange(Enumerable.Range(0, normalBuffers.VertexCount).ToArray()); indexBuffer.Unlock(); normalBuffers.Indices = indexBuffer; _normals.Add(mesh, normalBuffers); } return(_normals[mesh]); }