Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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]);
        }