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]
SlimDX Mesh.ComputeNormals Error
Started by blacken, Dec 05 2012 03:16 AM
2 replies to this topic
Sponsor:
#2 Members - Reputation: 1611
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 Members - Reputation: 126
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.
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.






