SlimDX Mesh.ComputeNormals Error

Started by
1 comment, last by blacken 11 years, 4 months ago
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]
Advertisement
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;
}
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;
}
}
}
}

This topic is closed to new replies.

Advertisement