Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить данные из VB Mesh-а


Sphinx ©   (2005-08-21 17:19:00) 

Необходимо получить массив данных из IDirect3DVertexBuffer9 расположеного в ID3DXMesh.
Делаю следующим образом
...
 TVertex = record
   x, y, z: Single;
   nx, ny, nz: Single;
 end;
...
 d3dCloneMesh: ID3DXMesh;
 arrVertex: array of TVertex;
 dwNumVert: Cardinal;
 pVertex: Pointer;
...
 d3dCloneMesh := nil;
 fmesh.CloneMeshFVF(fmesh.GetOptions, D3DFVF_XYZ or D3DFVF_NORMAL, fd3d9device, d3dCloneMesh);

 dwNumVert := d3dCloneMesh.GetNumVertices;
 d3dCloneMesh.LockVertexBuffer(D3DLOCK_READONLY, pVertex);
   SetLength(arrVertex, dwNumVert);
   Move(pVertex^, arrVertex, SizeOf(pVertex^));
 d3dCloneMesh.UnlockVertexBuffer;

Но проблема в том, что мне возвращаются нулевые значения...

Поискал в сети и нашел следующий пример на С++ (работающий)

...
struct Vertex
{
Vertex(){}
Vertex(float x, float y, float z,
 float nx, float ny, float nz, float u, float v)
{
  _x = x;   _y = y;   _z = z;
 _nx = nx; _ny = ny; _nz = nz;
  _u = u;   _v = v;
}

float _x, _y, _z, _nx, _ny, _nz, _u, _v;

static const DWORD FVF;
};
...
Vertex* v = 0;
mesh->LockVertexBuffer(0, (void**)&v);
for(int i = 0; i < mesh->GetNumVertices(); i++)
{
 outFile


A22   (2005-08-22 18:29:00) [1]

sizeof(pVertex^) - размер самого указателя, потому и компилируется


Sphinx   (2005-08-22 18:12:00) [2]

2 Sapersky
Мдааа...прокололся по полной...
Что неправильно написал Move я сообразил по трассировке...потому, что ни каких изменений не было...
Огромное спасибо, ошибку указали правильно :)

>Удивительно, что такая конструкция вообще проходит...
И даже ни warning ни hint не вызывает...


Sapersky   (2005-08-22 00:51:00) [3]

Move(pVertex^, arrVertex, SizeOf(pVertex^));

Source и Dest в Мove - это переменные, не указатели. Так что pVertex^ - это правильно, но и динамический массив arrVertex - тоже указатель. Можно взять первый элемент arrVertex[0].
И определение размера по SizeOf в данном случае сомнительно, мягко говоря. Откуда компилятору (полагаю, SizeOf работает на этапе компиляции) знать, что будет в этом Pointer? Удивительно, что такая конструкция вообще проходит...
Правильно - dwNumVert * SizeOf(TVertex).


Наверх

Титульная страница Поиск, карта сайта Написать письмо