Jump to content
  • Advertisement
Sign in to follow this  
blacken

SlimDX Mesh.ComputeNormals Error

This topic is 2117 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Share this post


Link to post
Share on other sites
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;
}
Edited by unbird

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!