Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

Получить данные из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.01 c
2-1137746544
ПаТаЧок
2006-01-20 11:42
2006.02.05
Как промотреть файл формата mov


15-1137360108
Gero
2006-01-16 00:21
2006.02.05
Я был в шоке когда прочитал


8-1124853884
palgen
2005-08-24 07:24
2006.02.05
Как перевести Panel.Canvas в Image.Canvas ?


3-1133879911
Sergey_Masloff
2005-12-06 17:38
2006.02.05
NVL для NUMERIC в FireBird


3-1133980782
Байрам
2005-12-07 21:39
2006.02.05
Поиск, нечувствительный к регистру





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский