[C# et DirextX] Petits problèmes...

Petits problèmes... [C# et DirextX] - C#/.NET managed - Programmation

Marsh Posté le 23-11-2005 à 21:49:50    

Je suis en train de m'amuser à faire un petit prog utilisant D3D.
 
Et j'ai quelques soucis...
 
Après avoir modifié un truc entre hier et aujourd'hui (mais quoi ?) me objets 3D de type "Carre" s'affichent bien, mais pas ceux de type "triangle" (ils ne s'affichent plus du tout, à moins de passer en rendu de type "pointlist" pour les vertices, et à ce moment, que ce soit les carrés ou les triangles, y'a la moitié des points qui giclent)
 
En gros, mon architecture :
 
3 classes "fonctionnelles" : Ground, Building, Unit, qui permettent de définir dans le programme le sol, les bâtiments et les unités.
Chaque classe est dérivée autant de fois que j'ai de types d'éléments (Grass, SmallHouse, BigHouse, etc.)
 
Ces classes sont similaire, et contiennent toutes une propriété public "Model3D" contenant un type "Object" (j'étais à cours d'idée :D) qui représente l'objet 3D correspondant.
 
Cette classe 3D a quelques propriétés (texture, verticesColor, verticesTexture, indices, primitiveCount) ainsi qu'une méthode "Draw()" qui permet de coller dans mon Device D3D l'objet.
Elle est héritée autant de voir que j'ai de type d'objet 3D. Pour le moment, "Carre" et "Triangle", possédant chacun deux constructeurs, un avec Texture et l'autre sans.
 
Déjà, est-ce que cette architecture vous semble "clean" ? Niveau performances, je ne sais pas trop ce que ça donne, mais ça me semblait pas mal comme façon de conserver les objets "3D" associés aux objets fonctionnels.
 
En tout cas, avantage, c'est toujours la même méthode "Draw" de la classe générique "Object" qui est utilisée pour le rendu, donc niveau maintenance, je ne m'éparpille pas trop, et c'est pas le moteur qui regroupe le chargement des vertices et autres.
 
Voici le code de ma classe Object ainsi que ses enfants hérités. Je pense que c'est là-dedans que ça débloque...
 

Code :
  1. using System;
  2. using System.Drawing;
  3. using Microsoft.DirectX;
  4. using Microsoft.DirectX.Direct3D;
  5. namespace littleGame
  6. {
  7. /// <summary>
  8. /// Summary description for objects.
  9. /// </summary>
  10. public class Object
  11. {
  12.  protected CustomVertex.PositionColored[] verticesColor;
  13.  protected CustomVertex.PositionNormalTextured[] verticesTexture;
  14.  protected int[] indices;
  15.  protected Bitmap texture;
  16.  protected int primitiveCount = 0;
  17.  public Object()
  18.  {
  19.   texture = null;
  20.  }
  21.  public void Draw(Device device)
  22.  {
  23.   VertexBuffer vb;
  24.   if (texture == null)
  25.   {
  26.    vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 5, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
  27.    vb.SetData(this.verticesColor, 0 ,LockFlags.None);
  28.   }
  29.   else
  30.   {
  31.    vb = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), 5, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);
  32.    vb.SetData(this.verticesTexture, 0 ,LockFlags.None);
  33.   }
  34.   IndexBuffer ib;
  35.   ib = new IndexBuffer(typeof(int), 6, device, Usage.WriteOnly, Pool.Default);
  36.   ib.SetData(this.indices, 0, LockFlags.None);
  37.   device.SetStreamSource(0, vb, 0);
  38.   device.Indices = ib;
  39.   int nbVertices = 0;
  40.   if (texture == null)
  41.   {
  42.    device.VertexFormat = CustomVertex.PositionColored.Format;
  43.    nbVertices = verticesColor.Length;
  44.   }
  45.   else
  46.   {
  47.    device.VertexFormat = CustomVertex.PositionNormalTextured.Format;
  48.    nbVertices = verticesTexture.Length;
  49.    Texture D3DTexture = Texture.FromBitmap(device, texture, Usage.None, Pool.Managed);
  50.    device.TextureState[0].ColorOperation = TextureOperation.Modulate;
  51.    device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
  52.    device.TextureState[0].ColorArgument2 = TextureArgument.Diffuse;
  53.    device.TextureState[0].AlphaOperation = TextureOperation.Disable;
  54.    device.SetTexture(0, D3DTexture);
  55.   }
  56.   device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, nbVertices, 0, primitiveCount);
  57.  }
  58. }
  59. public class Carre : Object
  60. {
  61.  /// <summary>
  62.  /// Crée un carré centré sur le vecteur p d'un côté c
  63.  /// </summary>
  64.  /// <param name="p">Position</param>
  65.  /// <param name="c">Côté</param>
  66.  public Carre(Vector3 p, float c)
  67.  {
  68.   primitiveCount = 2;
  69.   verticesColor = new CustomVertex.PositionColored[4];
  70.   verticesColor[0].Position = new Vector3(p.X - c/2f, p.Y - c/2f, p.Z);
  71.   verticesColor[0].Color = Color.Red.ToArgb();
  72.   verticesColor[1].Position = new Vector3(p.X + c/2f, p.Y - c/2f, p.Z);
  73.   verticesColor[1].Color = Color.Green.ToArgb();
  74.   verticesColor[2].Position = new Vector3(p.X + c/2f, p.Y + c/2f, p.Z);
  75.   verticesColor[2].Color = Color.Blue.ToArgb();
  76.   verticesColor[3].Position = new Vector3(p.X - c/2f, p.Y + c/2f, p.Z);
  77.   verticesColor[3].Color = Color.White.ToArgb();
  78.   indices = new int[6];
  79.   indices[0] = 2;
  80.   indices[1] = 0;
  81.   indices[2] = 3;
  82.   indices[3] = 2;
  83.   indices[4] = 1;
  84.   indices[5] = 0;
  85.  }
  86.  /// <summary>
  87.  /// Crée un carré texturé centré sur le vecteur p d'un côté c avec la texture t
  88.  /// </summary>
  89.  /// <param name="p">Position</param>
  90.  /// <param name="c">Côté</param>
  91.  public Carre(Vector3 p, float c, Bitmap t)
  92.  {
  93.   primitiveCount = 2;
  94.   texture = t;
  95.   verticesTexture = new CustomVertex.PositionNormalTextured[4];
  96.   verticesTexture[0].Position = new Vector3(p.X - c/2f, p.Y - c/2f, p.Z);
  97.   verticesTexture[0].Tu = 0f;
  98.   verticesTexture[0].Tv = 0f;
  99.   verticesTexture[0].Normal = verticesTexture[3].Position;
  100.   verticesTexture[1].Position = new Vector3(p.X + c/2f, p.Y - c/2f, p.Z);
  101.   verticesTexture[1].Tu = 1f;
  102.   verticesTexture[1].Tv = 0f;
  103.   verticesTexture[1].Normal = verticesTexture[3].Position;
  104.   verticesTexture[2].Position = new Vector3(p.X + c/2f, p.Y + c/2f, p.Z);
  105.   verticesTexture[2].Tu = 1f;
  106.   verticesTexture[2].Tv = 1f;
  107.   verticesTexture[2].Normal = verticesTexture[3].Position;
  108.   verticesTexture[3].Position = new Vector3(p.X - c/2f, p.Y + c/2f, p.Z);
  109.   verticesTexture[3].Tu = 0f;
  110.   verticesTexture[3].Tv = 1f;
  111.   verticesTexture[3].Normal = verticesTexture[3].Position;
  112.   indices = new int[6];
  113.   indices[0] = 2;
  114.   indices[1] = 0;
  115.   indices[2] = 3;
  116.   indices[3] = 2;
  117.   indices[4] = 1;
  118.   indices[5] = 0;
  119.  }
  120. }
  121. public class Triangle : Object
  122. {
  123.  /// <summary>
  124.  /// Crée un triangle centré sur le vecteur p d'un côté c
  125.  /// </summary>
  126.  /// <param name="p">Position</param>
  127.  /// <param name="c">Côté</param>
  128.  /// <param name="t">Texture</param>
  129.  public Triangle(Vector3 p, float c)
  130.  {
  131.   primitiveCount = 1;
  132.   verticesColor = new CustomVertex.PositionColored[3];
  133.   verticesColor[0].Position = new Vector3(p.X, p.Y + c/2f, p.Z);
  134.   verticesColor[0].Color = Color.Red.ToArgb();
  135.   verticesColor[1].Position = new Vector3(p.X - c/2f, p.Y - c/2f, p.Z);
  136.   verticesColor[1].Color = Color.Green.ToArgb();
  137.   verticesColor[2].Position = new Vector3(p.X + c/2f, p.Y - c/2f, p.Z);
  138.   verticesColor[2].Color = Color.Blue.ToArgb();
  139.   indices = new int[3];
  140.   indices[0] = 0;
  141.   indices[1] = 1;
  142.   indices[2] = 2;
  143.  }
  144.  /// <summary>
  145.  /// Crée un triangle centré sur le vecteur p d'un côté c
  146.  /// </summary>
  147.  /// <param name="p">Position</param>
  148.  /// <param name="c">Côté</param>
  149.  /// <param name="t">Texture</param>
  150.  public Triangle(Vector3 p, float c, Bitmap t)
  151.  {
  152.   primitiveCount = 2;
  153.   texture = t;
  154.   verticesTexture = new CustomVertex.PositionNormalTextured[3];
  155.   verticesTexture[0].Position = new Vector3(p.X, p.Y + c/2f, p.Z);
  156.   verticesTexture[0].Tu = 1f;
  157.   verticesTexture[0].Tv = .5f;
  158.   verticesTexture[0].Normal = verticesTexture[3].Position;
  159.   verticesTexture[1].Position = new Vector3(p.X - c/2f, p.Y - c/2f, p.Z);
  160.   verticesTexture[1].Tu = 0f;
  161.   verticesTexture[1].Tv = 0f;
  162.   verticesTexture[1].Normal = verticesTexture[3].Position;
  163.   verticesTexture[2].Position = new Vector3(p.X + c/2f, p.Y - c/2f, p.Z);
  164.   verticesTexture[2].Tu = 0f;
  165.   verticesTexture[2].Tv = 1f;
  166.   verticesTexture[2].Normal = verticesTexture[3].Position;
  167.   indices = new int[3];
  168.   indices[0] = 0;
  169.   indices[1] = 1;
  170.   indices[2] = 2;
  171.  }
  172. }
  173. }


 
Et là, chose bizarre, mes triangles ne s'affichent plus lorsque je crée un objet dont le modèle 3D est un triangle :??:
 
Ma Class "Building" et ses filles, qui est un exemple de création d'un Triangle, et d'un Carré (qui marche) :
 

Code :
  1. using System;
  2. using Microsoft.DirectX;
  3. using Microsoft.DirectX.Direct3D;
  4. namespace littleGame
  5. {
  6. /// <summary>
  7. /// Summary description for buildings.
  8. /// </summary>
  9. public class Building
  10. {
  11.  public Object Model3D;
  12.  public Building()
  13.  {
  14.  }
  15. }
  16. public class SmallHouse : Building
  17. {
  18.  public SmallHouse(Vector3 position)
  19.  {
  20.   this.Model3D = new Carre(position, 1);
  21.  }
  22. }
  23. public class BigHouse : Building
  24. {
  25.  public BigHouse(Vector3 position)
  26.  {
  27.   this.Model3D = new Triangle(position, 1);
  28.  }
  29. }
  30. }


 
Vois pas trop la différence...
 
Et pour le rendu :
 

Code :
  1. using System;
  2. using Microsoft.DirectX;
  3. namespace littleGame
  4. {
  5. public class World
  6. {
  7.  private D3dDrawable area;
  8.  /*-------------------- PRIVATE FIELDS-------------------- */
  9.  //-- private member fields
  10.  Building[] buildings;
  11.  Ground[] grounds;
  12.  /*-------------------- CONSTRUCTORS-------------------- */
  13.  public World(D3dDrawable area)
  14.  {
  15.   this.area = area;
  16.   // Create object
  17.   grounds = new Ground[49];
  18.   grounds[0] = new Grass(new Vector3(-3, -3, 0));
  19.   grounds[1] = new Grass(new Vector3(-3, -2, 0));
  20.   grounds[2] = new Grass(new Vector3(-3, -1, 0));
  21.   /* ... */
  22.   grounds[47] = new Grass(new Vector3(3, 2, 0));
  23.   grounds[48] = new Grass(new Vector3(3, 3, 0));
  24.   buildings = new Building[4];
  25.   buildings[0] = new SmallHouse(new Vector3(0, 0, .5f));
  26.   buildings[1] = new SmallHouse(new Vector3(-2, 0, .5f));
  27.   buildings[2] = new BigHouse(new Vector3(1, 2, .5f));
  28.   buildings[3] = new BigHouse(new Vector3(2, 1, .5f));
  29.  }
  30.  #region /*-------------------- PUBLIC METHODS --------------------*/
  31.  /// <summary>
  32.  /// Undefine the balls.
  33.  /// </summary>
  34.  public void ClearWorld()
  35.  {
  36.   buildings = null;
  37.   grounds = null;
  38.  }
  39.  /// <summary>
  40.  /// Draws the contents of the world.
  41.  /// </summary>
  42.  public void Draw(Microsoft.DirectX.Direct3D.Device device)
  43.  {
  44.   for (int i = 0; i < grounds.Length; i++)
  45.   {
  46.    grounds[i].Model3D.Draw(device);
  47.   }
  48.   for (int i = 0; i < buildings.Length; i++)
  49.   {
  50.    buildings[i].Model3D.Draw(device);
  51.   }
  52.  }
  53.  /// <summary>
  54.  /// Update the location of the objects.
  55.  /// </summary>
  56.  public void UpdateWorld()
  57.  {
  58.  }
  59.  #endregion
  60. }
  61. }


 
Franchement, je ne vois pas ce qui cloche...
 
Autre truc étrange : si j'appelle un objet texturé, alors mes objets colorés n'ont plus les bonnes couleur !
 
On continue : mon array "grounds" représente 49 (7x7) carrés texturés, centrés sur le point (0, 0, 0), qui est aussi le centre de ma vue 3D.
Et pourtant, je ne vois qu'une large bande verticale de 3x7 carrés à l'écran (correctement texturés par contre). C'est quoi aussi ce délire ?
 
Et enfin, de temps à autre, lorsque j'arrête mon appli, ça met plus d'une minute à s'arrêter, et parfois ça met une demi-seconde :heink:
 
Franchement, là, je ne comprends pas ce qu'il se passe !

Reply

Marsh Posté le 23-11-2005 à 21:49:50   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed