В общем как то странно. Раньше все работало, теперь перестало. Даже не знаю в чем может быть ошибка. Просто не отрисовывываюся полигоны
Очень хотелось бы разобраться, что я делаю не так. Заранее благодарен
Код:
constructor T3DObject.Create(device: IDirect3DDevice9);
begin
inherited Create;
FVertexCount:= 0;
FPolygoneCount:= 0;
FDevice:= device;
FDevice.CreateVertexBuffer(555*SizeOf(T3DVertex),0,fvf,D3DPOOL_DEFAULT,FVertexBuffer,nil);
FDevice.CreateIndexBuffer(555*SizeOf(word),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,FIndexBuffer,nil);
D3DXMatrixTranslation(TransformMatrix,0,0,0);
usealpha:= false;
end;
function T3DObject.AddVertex(x, y, z, nx, ny, nz, u, v: single; var index: word): boolean;
var ver: T3DVertex;
pver: pointer;
begin
Result:= false;
ver.pos.x:= x; ver.npos.x:= nx; ver.u:= u;
ver.pos.y:= y; ver.npos.y:= ny; ver.v:= v;
ver.pos.z:= z; ver.npos.z:= nz;
if Failed( FVertexBuffer.Lock(FVertexCount*SizeOf(T3DVertex),SizeOf(T3DVertex),pver,0) ) then
exit;
Move(ver,pver^,SizeOf(T3DVertex));
FVertexBuffer.Unlock;
index:= FVertexCount;
inc(FVertexCount);
Result:= true;
end;
function T3DObject.CreatePolygone(v1, v2, v3: word): boolean;
var ind: array [0..2] of word;
pind: pointer;
begin
Result:= false;
ZeroMemory(@ind,SizeOf(ind));
ind[0]:= v1;
ind[1]:= v2;
ind[2]:= v3;
if Failed( FIndexBuffer.Lock(3*FPolygoneCount*SizeOf(word),3*SizeOf(word),pind,0) ) then exit;
inc(FPolygoneCount);
Move(ind,pind^,3*SizeOf(word));
FindexBuffer.Unlock;
Result:= true;
end;
procedure T3DObject.Render;
begin
FDevice.SetStreamSource(0,FVertexBuffer,0,SizeOf(T3DVertex));
FDevice.SetIndices(FIndexBuffer);
FDevice.SetTransform(D3DTS_WORLD,TransformMatrix);
if usealpha then
FDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, itrue);
FDevice.SetMaterial(material);
FDevice.SetTexture(0,texture);
FDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3*FPolygoneCount,0,FPolygoneCount);
if usealpha then
FDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, ifalse);
end;
function T3DApi.Render: cardinal;
var i: integer;
begin
Result:= $000;
Device.Clear(0,nil,D3DClear_Target or D3DClear_ZBuffer,$888888, 1.0, 0);
device.BeginScene;
for i:= 0 to Fobjcount-1 do
Fobjects[i].Render;
device.EndScene;
device.Present(nil,nil,0,nil);
end;
procedure T3DApi.Create3DObject(var AObj: T3DObject);
begin
Aobj:= T3DObject.Create(Device);
with Aobj do
begin
_id:= Fobjcount;
inc(Fobjcount);
SetLength(FObjects,FObjcount);
Fobjects[_id]:= Aobj;
end;
end;