Jump to content

  • Log In with Google      Sign In   
  • Create Account

SlimDX Mesh.ComputeNormals Error


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 blacken   Members   -  Reputation: 126

Like
0Likes
Like

Posted 05 December 2012 - 03:16 AM

Hi Guys,

Just wondering if anyone would be able to help me.

I seem to be having an issue with computing normals of a mesh using slimdx.

I am getting the D3DERR_INVALIDCALL: Invalid call (-2005530516) error whenever i try to compute the normal of a mesh. My code is probably not the best, however for a first attempt i am doing what i can.

I have attached it to help with the troubleshooting.

Thanks in advance for any help.
[source lang="csharp"]using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using SlimDX;using SlimDX.Direct3D9;using SlimDX.Windows;namespace WindowsFormsApplication1{ public partial class Form1 : Form { Mesh meshTerrain; Device device; Direct3D direct3d = new Direct3D(); CustomVertex test = null; Vertex[] vertices; short[] indices; int WIDTH, HEIGHT, angle; public Form1() { InitializeComponent(); this.Text = "Managed DirectX Tutorial 1"; test = new CustomVertex(); InitGraphics(); } void InitGraphics() { angle = 0; PresentParameters present_params = new PresentParameters(); present_params.Windowed = true; present_params.SwapEffect = SwapEffect.Discard; device = new Device(direct3d, 0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, present_params); vertices = new Vertex[] { new Vertex ( new Vector3 ( - 1, - 1, - 1 ) , Color.Red.ToArgb ( ) ) , new Vertex ( new Vector3 ( 1, - 1, - 1 ) , Color.LightBlue.ToArgb ( ) ) , new Vertex ( new Vector3 ( 1, - 1, 1 ) , Color.LightCyan.ToArgb ( ) ) , new Vertex ( new Vector3 ( - 1, - 1, 1 ) , Color.CadetBlue.ToArgb ( ) ) , new Vertex ( new Vector3 ( - 1, 1, - 1 ) , Color.Red.ToArgb ( ) ) , new Vertex ( new Vector3 ( 1,1, - 1 ) , Color.Orange.ToArgb ( ) ) , new Vertex ( new Vector3 ( 1,1,1 ) , Color.Goldenrod.ToArgb ( ) ) , new Vertex ( new Vector3 ( - 1, 1,1 ) , Color.Yellow.ToArgb ( ) ) }; indices = new short[] { 4,1,0,4,5,1, 5,2,1,5,6,2, 6,3,2,6,7,3, 7,0,3,7,4,0, 7,5,4,7,6,5, 2,3,0,2,0,1 }; CreateMesh(); //device = new Device(direct3d, 0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, present_params); //device = new Device(direct3d, 0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, present_params); } private void CreateMesh() { meshTerrain = new Mesh(device, 12, 8, MeshFlags.Managed, CustomVertex.PositionColored.format); //meshTerrain = new Mesh(device, (WIDTH - 1) * (HEIGHT - 1) * 2, WIDTH * HEIGHT, MeshFlags.Managed, CustomVertex.PositionColored.format); //meshTerrain = new Mesh(device, (WIDTH - 1) * (HEIGHT - 1) * 2, WIDTH * HEIGHT, MeshFlags.Managed, CustomVertex.PositionColored.format); DataStream stream = meshTerrain.VertexBuffer.Lock(0, 0, LockFlags.None); stream.WriteRange(vertices); meshTerrain.VertexBuffer.Unlock(); stream.Close(); stream = meshTerrain.IndexBuffer.Lock(0, 0, LockFlags.None); stream.WriteRange(indices); meshTerrain.IndexBuffer.Unlock(); stream.Close(); meshTerrain.GenerateAdjacency(0.5f); meshTerrain.OptimizeInPlace(MeshOptimizeFlags.VertexCache); meshTerrain = meshTerrain.Clone(device, MeshFlags.Managed, CustomVertex.PositionColored.format); meshTerrain.ComputeNormals();//need to look at the mesh declaration //and the numbers of faces and vertices //meshTerrain.ComputeNormals(); } protected override void OnPaint(PaintEventArgs e) { device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkSlateBlue, 1.0f, 0); device.BeginScene(); device.VertexFormat = CustomVertex.PositionColored.format; device.SetTransform(TransformState.World, Matrix.Translation(-HEIGHT / 2, -WIDTH / 2, 0) * Matrix.RotationZ(angle)); int numSubSets = meshTerrain.GetAttributeTable().Length; for (int i = 0; i < numSubSets; i++) { meshTerrain.DrawSubset(i); } device.EndScene(); device.Present(); //CustomVertex.TransformedColored[] vertexes = new CustomVertex.TransformedColored[3]; //vertexes[0].Position = new Vector4(50, 50, 0, 1.0f); //vertexes[0].Color = System.Drawing.Color.FromArgb(0, 255, 0).ToArgb(); //vertexes[1].Position = new Vector4(250, 50, 0, 1.0f); //vertexes[1].Color = System.Drawing.Color.FromArgb(0, 0, 255).ToArgb(); //vertexes[2].Position = new Vector4(50, 250, 0, 1.0f); //vertexes[2].Color = System.Drawing.Color.FromArgb(255, 0, 0).ToArgb(); //device.Clear(ClearFlags.Target, System.Drawing.Color.FromArgb(0, 0, 0).ToArgb(), 1.0f, 0); //device.BeginScene(); //device.VertexFormat = CustomVertex.TransformedColored.format; //device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertexes); //device.EndScene(); //device.Present(); } private void Form1_Load(object sender, EventArgs e) { } //[StructLayout(LayoutKind.Sequential)] public struct Vertex { public Vector3 Position; public int color; public Vertex(Vector3 position, int color) { this.Position = position; this.color = color; } } class CustomVertex { //[StructLayout(LayoutKind.Sequential)] public struct TransformedColored { public Vector4 Position; public int Color; public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.PositionRhw; } //[StructLayout(LayoutKind.Sequential)] public struct PositionColored { public Vector3 Position; public int Color; public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.Position; } } }}[/source]

Sponsor:

#2 unbird   Crossbones+   -  Reputation: 6012

Like
2Likes
Like

Posted 05 December 2012 - 04:11 AM

Your vertex format doesn't have a normal, so ComputeNormal can't do its work. You need this:
    [StructLayout(LayoutKind.Sequential)]
    public struct PositionNormalColored
    {
        public Vector3 Position;
        public Vector3 Normal;
        public int Color;
        public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.Position | VertexFormat.Normal;
    }

Edited by unbird, 05 December 2012 - 04:17 AM.


#3 blacken   Members   -  Reputation: 126

Like
0Likes
Like

Posted 06 December 2012 - 01:00 AM

Thank you very much for your help unbird. It no longer throws this error.

However, the next question i have is why doesn't it show the cube?

Any help you could provide would be much appreciated.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct3D9;
using SlimDX.Windows;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
	    Mesh meshTerrain;
	    Device device;
	    Direct3D direct3d = new Direct3D();
	    CustomVertex test = null;
	    Vertex[] vertices;
	    short[] indices;
	    int WIDTH, HEIGHT, angle;
	    public Form1()
	    {
		    InitializeComponent();
		    this.Text = "Managed DirectX Tutorial 1";
		    test = new CustomVertex();
		    InitGraphics();
	    }
	    void InitGraphics()
	    {
		    angle = 0;
		    PresentParameters present_params = new PresentParameters();
		    present_params.Windowed = true;
		    present_params.SwapEffect = SwapEffect.Discard;
		    device = new Device(direct3d, 0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, present_params);
		    vertices = new Vertex[]
		    {
			    new Vertex ( new Vector3 ( - 1, - 1, - 1 ) , Color.Red.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( 1, - 1, - 1 ) , Color.LightBlue.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( 1, - 1, 1 ) , Color.LightCyan.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( - 1, - 1, 1 ) , Color.CadetBlue.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( - 1, 1, - 1 ) , Color.Red.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( 1,1, - 1 ) , Color.Orange.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( 1,1,1 ) , Color.Goldenrod.ToArgb ( ) ) ,
			    new Vertex ( new Vector3 ( - 1, 1,1 ) , Color.Yellow.ToArgb ( ) )
		    };
		    indices = new short[]
		    {
			    4,1,0,4,5,1,
			    5,2,1,5,6,2,
			    6,3,2,6,7,3,
			    7,0,3,7,4,0,
			    7,5,4,7,6,5,
			    2,3,0,2,0,1
		    };
		   
		    CreateMesh();
		    //device = new Device(direct3d, 0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, present_params);
		    //device = new Device(direct3d, 0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, present_params);
	    }
	    private void CreateMesh()
	    {
		    meshTerrain = new Mesh(device, 12, 8, MeshFlags.Managed, CustomVertex.PositionColored.format);
		    DataStream stream = meshTerrain.VertexBuffer.Lock(0, 0, LockFlags.None);
		    stream.WriteRange(vertices);
		    meshTerrain.VertexBuffer.Unlock();
		    stream.Close();
		    stream = meshTerrain.IndexBuffer.Lock(0, 0, LockFlags.None);
		    stream.WriteRange(indices);
		    meshTerrain.IndexBuffer.Unlock();
		    stream.Close();
		    meshTerrain.GenerateAdjacency(0.5f);
		    meshTerrain.OptimizeInPlace(MeshOptimizeFlags.VertexCache);
		    meshTerrain = meshTerrain.Clone(device, MeshFlags.Managed, CustomVertex.PositionNormalColored.format);
		    meshTerrain.ComputeNormals();
		   
	    }
	    protected override void OnPaint(PaintEventArgs e)
	    {
		    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkSlateBlue, 1.0f, 0);
		    device.BeginScene();
		    //device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices);
		    device.VertexFormat = CustomVertex.PositionNormalColored.format;
		    //device.SetTransform(TransformState.World, Matrix.Translation(-HEIGHT / 2, -WIDTH / 2, 0) * Matrix.RotationZ(angle));
		    int numSubSets = meshTerrain.GetAttributeTable().Length;
		    for (int i = 0; i < numSubSets; i++)
		    {
			    meshTerrain.DrawSubset(i);
		    }
		    device.EndScene();
		    device.Present();
		    //CustomVertex.TransformedColored[] vertexes = new CustomVertex.TransformedColored[3];
		   
		    //vertexes[0].Position = new Vector4(50, 50, 0, 1.0f);
		    //vertexes[0].Color = System.Drawing.Color.FromArgb(0, 255, 0).ToArgb();
		    //vertexes[1].Position = new Vector4(250, 50, 0, 1.0f);
		    //vertexes[1].Color = System.Drawing.Color.FromArgb(0, 0, 255).ToArgb();
		    //vertexes[2].Position = new Vector4(50, 250, 0, 1.0f);
		    //vertexes[2].Color = System.Drawing.Color.FromArgb(255, 0, 0).ToArgb();
		   
		    //device.Clear(ClearFlags.Target, System.Drawing.Color.FromArgb(0, 0, 0).ToArgb(), 1.0f, 0);
		    //device.BeginScene();
		    //device.VertexFormat = CustomVertex.TransformedColored.format;
		    //device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertexes);
		    //device.EndScene();
		    //device.Present();
		   
	    }
	    private void Form1_Load(object sender, EventArgs e)
	    {		   
		   
				   
	    }
	    //[StructLayout(LayoutKind.Sequential)]
	    public struct Vertex
	    {
		    public Vector3 Position;
		    public int color;
		    public Vertex(Vector3 position, int color)
		    {
			    this.Position = position;
			    this.color = color;
		    }
	    }
	    class CustomVertex
	    {
		    //[StructLayout(LayoutKind.Sequential)]
		    public struct TransformedColored
		    {
			    public Vector4 Position;
			    public int Color;
			    public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.PositionRhw;
		    }
		    //[StructLayout(LayoutKind.Sequential)]
		    public struct PositionColored
		    {
			    public Vector3 Position;
			    public int Color;
			    public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.Position;
		    }
		    //[StructLayout(LayoutKind.Sequential)]
		    public struct PositionNormalColored
		    {
			    public Vector3 Position;
			    public Vector3 Normal;
			    public int Color;
			    public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.Position | VertexFormat.Normal;
		    }
	    }
    }
}

Edited by blacken, 06 December 2012 - 01:00 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS