Inc (Vertices); // ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ° Π»Π°Π½Π΄ΡΠ°ΡΡΠ°
Inc (Vertices);
Inc (Vertices);
AssignFile (t, 'Boeing.txt1);
Reset (t);
while not EOF(t) do begin
Readln (t, wrkVec.X); // Π‘ΡΠΈΡΡΠ²Π°Π΅ΠΌ Π²Π΅ΠΊΡΠΎΡ Π½ΠΎΡΠΌΠ°Π»ΠΈ
Readln (t, wrkVec.Y);
Readln (t, wrkVec.Z);
// Π‘ΡΠΈΡΡΠ²Π°Π΅ΠΌ Π²Π΅ΡΡΠΈΠ½Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°
Readln (t, Vertices.X);
Readln (t, Vertices.Y);
Readln (t, Vertices.Z); .
// ΠΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΡΡΡΡ
Vertices.X := Vertices.X / 3;
Vertices.Y := Vertices.Y / 3;
Vertices.Z := Vertices.Z / 3;
Vertices.normVector := wrkVec;
Vertices.Color := $00808080; // Π¦Π²Π΅Ρ - ΡΠ΅ΡΠ΅Π±ΡΠΈΡΡΡΠΉ
Inc (Vertices);
Readln (t, Vertices.X);
Readln (t, Vertices.Y);
Readln (t, Vertices.Z);
Vertices.X := Vertices.X / 3;
Vertices.Y := Vertices.Y / 3;
Vertices.Z := Vertices.Z / 3;
Vertices.normVector := wrkVec;
Vertices.Color := $00808080;
Inc (Vertices);
Readln (t, Vertices.X);
Readln (t, Vertices.Y);
Readln (t, Vertices.Z) ;
Vertices.X := Vertices.X / 3;
Vertices.Y := Vertices.Y / 3;
Vertices.Z := Vertices.Z / 3;
Vertices.normVector := wrkVec;
Vertices.Color := $00808080;
Inc (Vertices);
end;
CloseFile (t); FD3DVB.Unlock;
Result := FD3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);
end;
ΠΠΎΡΠ»Π΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π΅Π΅ Π²ΠΎΠΊΡΡΠ³ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ΅ΠΉ:
procedure TfrmD3D.FormCreate(Sender: TObject);
var
hRet : HRESULT;
matView, matProj : TD3DMatrix;
matWrkl, matWrk2 : TDSDMatrix;
begin
Randomize; // ΠΠ°Π½Π΄ΡΠ°ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎ-Π½ΠΎΠ²ΠΎΠΌΡ
ShowCursor (False); // Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
hRet := InitD3D;
if Failed (hRet) then ErrorOut ('InitD3D', hRet);
hRet := InitVB;
if Failed (hRet) then ErrorOut ('InitVertex', hRet);
SetupLights;
// ΠΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ°ΠΌΠΎΠ»Π΅Ρ
SetRotateXMatrix(matWrkl, Pi / 2);
SetRotateZMatrix(matWrk2, Pi);
SetTranslateMatrix (matAirplan, 7.0, 2.0, 5.0);
// ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΉ Π΄Π»Ρ ΡΠ°ΠΌΠΎΠ»Π΅ΡΠ°
matAirplan := MatrixMul (matAirplan, MatrixMul (matWrk2, matWrkl));
GenLand; // ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π»Π°Π½Π΄ΡΠ°ΡΡ ΠΏΠ΅ΠΉΠ·Π°ΠΆΠ°
SetViewMatrix(matView, D3DVector(16, 2.5, 5),
D3DVector(0, 0, 5), D3DVector(0, 1, 0));
FD3DDevice.SetTransform(D3DTS_VIEW, matView);
SetProjectionMatrix(matProj, 1, 1, 1, 15);
FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);
end;
ΠΠ°Π½Π΄ΡΠ°ΡΡ ΡΠΈΡΡΠ΅ΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΠΊΠ°ΠΌ:
arocedure TfrmDSD.DrawArea(const x, Ρ : Integer);
var
Vertices : ATCustomVertex;
b egin
FD3DVB.Lock(0, 4 * SizeOf(TCustomVertex), PByte(Vertices), 0) ;
Vertices.X := x * Step;
Vertices.Y := Land[x, Ρ - 1].h;
Vertices.Z := (y - 1) * Step;
Vertices.normVector := Land[x, Ρ - 1].VecNormal;
Vertices.Color := Land[x, Ρ - 1].Color;
Inc (Vertices);
Vertices.X := x * Step;
Vertices.Y := Landfx, y].h;
Vertices.Z := Ρ * Step;
Vertices.normVector := Land[x, y].VecNormal;
Vertices.Color := Landfx, y].Color;
Inc (Vertices);
Vertices.X := (x + 1) * Step;
Vertices.Y := Landfx + 1, Ρ - 1].h;
Vertices.Z := (y - 1) * Step;
Vertices.normVector := Land[x + 1, Ρ - 1].VecNormal;
Vertices.Color := Land[x + 1, Ρ - 1].Color;
Inc (Vertices);
Vertices.X := (x + 1) * Step;
Vertices.Y := Land[x +1, y].h;
Vertices.Z := Ρ * Step;
Vertices.normVector := Land[x + 1, y].VecNormal;
Vertices.Color := Land[x + 1, y].Color;
FD3DVB.Unlock;
FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2) ;
end;
function TfrmD3D.Render : HRESULT;
var
hRet : HRESULT;
i, j :Integer;
begin
// ΠΠΊΡΠ°Π½ ΠΎΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π³ΠΎΠ»ΡΠ±ΠΎΠ²Π°ΡΡΠΌ ΡΠ²Π΅ΡΠΎΠΌ
FD3DDevice.Clear(0, nil, D3DCLEARJTARGET or D3DCLEAR_ZBUFFER,
$00000FFF, 1.0, 0);
FD3DDevice.BeginScene; with FD3DDevice do begin
SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
// Π’ΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ Π»Π°Π½Π΄ΡΠ°ΡΡΠ° ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡΡΡΡ ΠΏΠΎ ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΡΡΡΠ΅Π»ΠΊΠ΅
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
// ΠΠ΅ΡΡΠΈΠ½Ρ Π»Π°Π½Π΄ΡΠ°ΡΡΠ° ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Ρ Π² ΠΌΠΈΡΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ
SetTransform(D3DTS_WORLD, IdentityMatrix);
end;
// ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΠΊΠΈ Π»Π°Π½Π΄ΡΠ°ΡΡΠ°
for j := 2 to NumZ - 1 do
for i := 1 to NumX - 5 do DrawArea(i,j);
with FD3DDevice do begin
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΌΠ°ΡΡΠΈΡΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΉ ΡΠ°ΠΌΠΎΠ»Π΅ΡΠ°
SetTransform(D3DTS_WORLD, matAirplan);
// ΠΠ΅ΡΡΠΈΠ½Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡΡΡΡ ΠΏΡΠΎΡΠΈΠ² ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΡΡΡΠ΅Π»ΠΊΠΈ
SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
// ΠΠ°Π½Π½ΡΠ΅ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ
DrawPrimitive(D3DPT_TRIANGLELIST, 4, 20661 div 3);
end;
FD3DDevice.EndScene;
Result := FDSDDevice.Present(nil, nil, 0, nil) ;
end;
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΡΠΈΡΠΎΠ²Π°Π½ ΡΠ°ΠΌΠΎΠ»Π΅Ρ, ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΌΠΈΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΎΡΡΠ°Π΅ΡΡΡ ΠΌΠ°ΡΡΠΈΡΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΉ Π½Π°ΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π»Π°Π½Π΄ΡΠ°ΡΡΠ° Π·Π°Π΄Π°Π΅ΠΌ Π·Π΄Π΅ΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΠΈ.
ΠΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠ΅ ΠΊΠ°Π΄ΡΠ° Π»Π°Π½Π΄ΡΠ°ΡΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ, Π° ΡΠ°ΠΌΠΎΠ»Π΅Ρ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π²ΠΎΠΊΡΡΠ³ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠΈ Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ³ΠΎΠ»:
procedure MoveLand; // Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΠΉΠ·Π°ΠΆΠ°
var
i, j : Integer;
TempLand : array [l..NumX] of LandParam; // ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² begin
// ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠ»ΠΈ ΡΡΡΠΎΠΊΡ ΠΌΠ°ΡΡΠΈΠ²Π° Π»Π°Π½Π΄ΡΠ°ΡΡΠ°
for i := 1 to NuraX do TempLand[i] := Land[i,NumZ];
// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π»Π°Π½Π΄ΡΠ°ΡΡ
for j := NumZ downto 2 do
for i := 1 to NumX do Land[i,j] := Landfi,j-1]; // ΠΡΡΠ³ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΠΎΠΊΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°
for i := 1 to NumX do Land[i,l] := TempLand[i];
end;
procedure TfrmDSD.ApplicationEventslIdle(Sender: TObject;
var Done: Boolean);
var
matWrk : TD3DMatrix;
begin
if FActive then begin
Render; // ΠΠ°ΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΊΠ°Π΄Ρ
MoveLand; // ΠΠ΅ΡΠ΅Π΄Π²ΠΈΠ½ΡΠ»ΠΈ Π»Π°Π½Π΄ΡΠ°ΡΡ
SetRotateYMatrix(matWrk, 0.1); // ΠΠ°ΡΡΠΈΡΠ° Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ°
matAirplan := MatrixMul (matAirplan, matWrk); // ΠΠΎΠ²ΠΎΡΠΎΡ ΡΠ°ΠΌΠΎΠ»Π΅ΡΠ°
end;
Done := False;
end;
ΠΠ»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΌΠ°ΡΡΠΈΡΡ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° Π²ΡΡΠΈΡΠ»ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π²Π° Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠ°, ΠΈ, ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠΎΡΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΈ ΡΠ²Π΅ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡ ΠΈΡΡΠ΅Π½ΠΈΠΉ. Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ, ΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΊΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΡΠΌ ΠΏΡΠΎΡΡΡΠΌ ΠΈ Π±ΡΡΡΡΡΠΌ.
ΠΠ΄Π½Π°ΠΊΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠΈΠ»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΡ ΠΎΠ΄ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΡ, Π²Π΅Π΄Ρ Π΄Π²Π΅ ΡΡΡΡΡΠΈ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠΊΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ²Π΅ΡΠΎΠΌ, Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ²Π΅Ρ. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΆΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° ΠΏΠ°ΠΌΡΡΡ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡΡ, Π½ΠΎ ΠΌΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎΠ³Π΄Π° ΡΠ³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² Π»Π°Π½Π΄ΡΠ°ΡΡΠ°.
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 09 ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ΄Π΅ΡΡ Π½Π° ΡΠΎΠ½Π΅ ΡΠΎΠ³ΠΎ ΠΆΠ΅ Π»Π°Π½Π΄ΡΠ°ΡΡΠ°, ΡΡΠΎ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, Π³ΠΎΡΠ΄ΠΎ ΠΏΠ°ΡΠΈΡ ΠΎΡΠ΅Π» (ΡΠΈΡ. 9.10).
ΠΠΊΡΠ°ΡΡΠ΅ ΡΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ: Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π²Π° Π±ΡΡΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠ½ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ², ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²Π΅ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
type
TCUSTOMVERTEXLand = packed record
X, Y, Z : Single;
normVector : TD3DVector;
Color : DWORD;
end;
TCUSTOMVERTEXEagle = packed record
X, Y, Z :
Single;
normVector : TD3DVector;
end;
const
D3DFVF_CUSTOMVERTEXLand = D3DFVF_XYZ or D3DFVF_NORMAL or
D3DFVFJJIFFUSE; D3DFVF CUSTOMVERTEXEagle = D3DFVF_XYZ or D3DFVF_NORMAL;
ΠΡΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ², Π·Π°Π΄Π°Π²Π°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΠΊΠΎΠ²ΡΡ Π±ΡΡΠ΅ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ². ΠΡΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡΡ ΠΏΠ°ΠΌΡΡΡ.
ΠΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π±ΡΡΠ΅Ρ Π²Π΅ΡΡΠΈΠ½ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½Π°Ρ ΠΌΠ½ΠΎΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ·ΡΠΊΠ΅ C++. ΠΠ»Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π» Π² ΠΊΠΎΠ΄ Π½Π° ΡΠ·ΡΠΊΠ΅ Pascal. ΠΡΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΠ°Ρ Π΅Π³ΠΎ ΡΠ°ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ²Ρ Π΄Π°Π½Π½ΡΡ . Π’ΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠ½, ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π° Avertices, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Vertices.
ΠΠ΅ΡΠ²ΡΠ΅ 13 ΡΡΡΠΎΠΊ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π°Π»ΠΈΡΡ. Π’Π°ΠΊΠΆΠ΅ ΡΠ΄Π°Π»ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, Π½Π°ΡΠΈΠ½Π°Ρ ΡΠΎ ΡΡΡΠΎΠΊΠΈ GLint GenSoobjectListΠΎ. Π ΠΎΡΡΠ°Π²ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ»Π΅ ΡΠ±ΠΈΡΠ°ΡΡΡΡ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ f, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π·Π°ΠΏΡΡΠΎΠΉ ΠΈ ΡΠΈΠ³ΡΡΠ½ΠΎΠΉ ΡΠΊΠΎΠ±ΠΊΠ΅. ΠΠ°Π»Π΅Π΅ Π²ΡΠ΅ ΡΠΈΠ³ΡΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ Π·Π°ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π° ΠΎΠ±ΡΡΠ½ΡΠ΅.
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ - ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠ°Ρ ΡΡΡΠΎΠΊΠ°
tatic GLint face_indicies[1200][9]
Π·Π°ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ:
ace_indicies : array [0..1199, 0..8] of integer
Π’ΠΈΠΏ GLfloat Π·Π°ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠΌ single, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΠ΅Π»ΠΎΠΌΡ.
Π’ΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΎΠΉ include ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΎΠ΅ΠΊΡΠ° (Π² ΡΠ΅ΠΊΡΠΈΡ const), Π° ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΡΠ΅ΡΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΌ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΠΎ, Π·Π°Π΄Π°ΡΡΠ΅Π΅ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ°. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΠΈ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΎΠΏΠΈΡΠ°ΡΡΠ΅ΠΌΡΡ Π½Π° ΡΠ°Π·ΠΌΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ²Π° normals. Π’Π°ΠΊΠΆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΡΠ΅-ΡΠ΅ΡΡΡ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±Π½ΡΠΉ ΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Ρ:
unction TfrmD3D.InitVBEagle : HRESULT;
var
Vertices : ~TCustomVertexEagle;
hRet : HRESULT;
i, j : Integer;
vi : Integer; // ΠΠ½Π΄Π΅ΠΊΡ Π²Π΅ΡΡΠΈΠ½ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ²
ni : Integer; // ΠΠ½Π΄Π΅ΠΊΡ Π½ΠΎΡΠΌΠ°Π»Π΅ΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ²
begin
hRet := FDSDDevice.CreateVertexBuffer(10500 *
SizeOf(TCustomVertexEagle), 0, D3DFVF_CUSTOMVERTEXEagle, D3DPOOL_DEFAULT, FD3DVBEagle);
if Failed(hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DVBEagle.Lock(0, 10500 * SizeOf(TCustomVertexEagle),
PByte(Vertices), 0) ;
if Failed(hRet) then begin
Result := hRet;
Exit;
end;
// Π¦ΠΈΠΊΠ» Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ° Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²
for i := 0 to sizeof(face_indicies) div sizeof(face__indicies[0]) - 1 do for j := 0 to 2 do begin
vi := face_indicies[i][j]; // ΠΠ½Π΄Π΅ΠΊΡ ΡΠ°ΡΠ΅ΡΠ°
ni := face_indicies[i] [j+3]; // ΠΠ½Π΄Π΅ΠΊΡ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΡΠ°ΡΠ΅ΡΠ°
// ΠΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌ, ΡΠΌΠ½ΠΎΠΆΠ°Ρ Π½Π° 5
Vertices.X := Avertices[vi][0] * 5;
Vertices.Y := Avertices[vi][1] * 5;
Vertices.Z := Avertices[vi][2] * 5;
Vertices.normVector.X := normals[ni] [0] ;
Vertices.normVector.Y := normals[ni][1];
Vertices.normVector.Z := normals[ni][2];
Inc(Vertices);
end;
Result := FDSDVBEagle.Unlock;
end;
ΠΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π», Π° ΠΏΡΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΠΎΠΊΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠ²Π΅ΡΠΎΠ²ΠΎΠΉ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ½Ρ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»:
with FDSDDevice do begin
SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
// ΠΠ»Ρ Π»Π°Π½Π΄ΡΠ°ΡΡΠ° ΡΠ²Π΅Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² Π·Π°Π΄Π°Π΅ΡΡΡ ΡΠ²Π΅ΡΠΎΠ²ΠΎΠΉ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ½
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
SetTransform(D3DTS_WORLD, IdentityMatrix); // ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠ΅ΡΠΈΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ,
// ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ
LightEnable(2, False);
SetStreamSource(0, FD3DVBLand, SizeOf(TCustomVertexLand));
SetVertexShader(D3DFVF_CUSTOMVERTEXLand);