Форум: "Игры";
Текущий архив: 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