Главная страница
    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
6-1130739723
denissoft
2005-10-31 09:22
2006.02.05
то значит символы D0 и D1-?


2-1137672247
First
2006-01-19 15:04
2006.02.05
Округление до двух знаков...


2-1137554228
Ezprcist
2006-01-18 06:17
2006.02.05
Gif


2-1137480059
Id
2006-01-17 09:40
2006.02.05
DateEdit


6-1128421863
Pete
2005-10-04 14:31
2006.02.05
Авторизация TNMSMTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский