Главная страница
    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.011 c
2-1137480519
СержК
2006-01-17 09:48
2006.02.05
Как узнать - сколько строк в текстовом файле?


8-1123052284
Irinka
2005-08-03 10:58
2006.02.05
Как программно изменить фон рабочего стола?


6-1130344439
cerber
2005-10-26 20:33
2006.02.05
Запуск скрипта в HTML документе, загруженном в WebBrowser?


2-1137521214
Vavan
2006-01-17 21:06
2006.02.05
Запись в риестр Windows


15-1137263351
Nic
2006-01-14 21:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский