none
Как прочитать данные из буфера вершин? RRS feed

  • Вопрос

  • Как прочитать данные из буфера вершин?

    Загружаем  mesh объект из файла. И хотим скопировать данные из его буфера вершин в массив.

    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 Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    
    namespace test
    {
        public partial class Form1 : Form
        {
            CustomVertex.PositionNormalTextured[] vplane; //Массив
            Mesh plane; //Mesh объект
    
            public Form1()
            {
                InitializeComponent();
            }
    
            //Загрузка формы
            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    plane = Mesh.FromFile("gm.X", MeshFlags.Managed, dr);
                }
                catch
                {
                    MessageBox.Show("Ошибки при загрузке файла X");
                    this.Close();
                }
    
                vplane = new CustomVertex.PositionNormalTextured[plane.NumberVertices];
                GraphicsStream gs;
    
                //Запись из буфера в массив
                gs = plane.VertexBuffer.Lock(0, 0, LockFlags.None);
                gs.Read(vplane.GetType()); //В этом месте программа висит!!!
                plane.VertexBuffer.Unlock();
            }
        }
    } 

    Программа зависает. Что я делаю не так?

    Обратная операция - запись из массива в буфер вершин, работает без проблем.

    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 Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    
    namespace test
    {
        public partial class Form1 : Form
        {
            CustomVertex.PositionNormalTextured[] vplane;
            Mesh plane;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            //Загрузка формы
            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    plane = Mesh.FromFile("gm.X", MeshFlags.Managed, dr);
                }
                catch
                {
                    MessageBox.Show("Ошибки при загрузке файла X");
                    this.Close();
                }
    
                vplane = new CustomVertex.PositionNormalTextured[plane.NumberVertices];
                GraphicsStream gs;
    
                //Заполнение массива
                float x = 0, y = 0, pi = (float)Math.PI;
                for (int i = 0; i < plane.NumberVertices; i++)
                {
                    vplane[i].Normal = new Vector3(0, 0, 1);
                    vplane[i].Position = new Vector3(x, y, 0);
                    vplane[i].Z = (float)Math.Sin(x * pi / 10) * (float)Math.Sin(y * pi / 10) * 5;
                    vplane[i].Tu = x / 2;
                    vplane[i].Tv = y / 2;
                    x++;
                    if (x > 100)
                    {
                        x = 0;
                        y++;
                    }
                }
    
                //Запись из массива в буфер
                gs = plane.VertexBuffer.Lock(0, 0, LockFlags.None);
                gs.Write(vplane);
                plane.VertexBuffer.Unlock();
            }
        }
    }


    • Изменено hellokol 29 октября 2012 г. 20:27
    29 октября 2012 г. 19:54

Ответы

  • Привет.

    Проблема еще актуальна или вы нашли решение?

    Попробуйте читать не весь массив CustomVertex.PositionNormalTextured, а только одно значение, т.е. как тип передавайте CustomVertex.PositionNormalTextured и читайте в цикле. Также можно попробовать читать массив байт, посмотреть не будет ли зависания при этом.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 26 ноября 2012 г. 6:21
    16 ноября 2012 г. 11:14

Все ответы

  • У вас при чтении:

    gs.Read(vplane.GetType()); 

    а при записи:

    gs.Write(vplane);

    Это нормально, что в первом случае вызывается GetType()?

    30 октября 2012 г. 6:34
  • Я вообще не понял как работает метод

    GraphicsStream.Read

    Что и куда он читает и как им пользоваться.

    Вот ссылка на MSDN

    http://msdn.microsoft.com/en-us/library/ms920477.aspx

    У него четыре перегрузки. Примеров нет.

    Попробовал так:

    gs = plane.VertexBuffer.Lock(0, 0, LockFlags.None); vplane = (CustomVertex.PositionNormalTextured[])gs.Read(vplane.GetType(), new int[1] { plane.NumberVertices }); //Опять ошибка plane.VertexBuffer.Unlock();

    !Операция является недопустимой из-за текущего состояния объекта.

    • Изменено hellokol 30 октября 2012 г. 16:36
    30 октября 2012 г. 8:36
  • Привет.

    Проблема еще актуальна или вы нашли решение?

    Попробуйте читать не весь массив CustomVertex.PositionNormalTextured, а только одно значение, т.е. как тип передавайте CustomVertex.PositionNormalTextured и читайте в цикле. Также можно попробовать читать массив байт, посмотреть не будет ли зависания при этом.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 26 ноября 2012 г. 6:21
    16 ноября 2012 г. 11:14