Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Получить данные из VB Mesh-а   Найти похожие ветки 

 
Sphinx ©   (2005-08-21 17:19) [0]

Необходимо получить массив данных из 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 << "Vertex " << i << ": (";
 outFile << v[i]._x  << ", " << v[i]._y  << ", " << v[i]._z  << ", ";
 outFile << v[i]._nx << ", " << v[i]._ny << ", " << v[i]._nz << ", ";
 outFile << v[i]._u  << ", " << v[i]._v  << ")"  << std::endl;
}
mesh->UnlockVertexBuffer();

Может кто подскажет где ошибся, или в чем принципиальное отличае в моем коде от приведенного примера на С++ ?


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

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

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


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

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

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


 
A22 ©   (2005-08-22 18:29) [3]

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.035 c
2-1137445785
Comptoi's G
2006-01-17 00:09
2006.02.05
Помогите разобраться


2-1137584716
Officeman
2006-01-18 14:45
2006.02.05
есть ли функция чёт - нечёт ?


15-1137219018
begin...end
2006-01-14 09:10
2006.02.05
С Днём рождения! 14 января


15-1136804756
Grom PE
2006-01-09 14:05
2006.02.05
Программы для укатывания юзера по полу от смеха


2-1137793506
newprogrammer
2006-01-21 00:45
2006.02.05
CASE OF