Attenuation0 := 1.0;
Attenuationl := 0.0;
Attenuation2 := 0.0;
Range := 2.5;
end;
with FD3DDevice do begin SetLight(0, LightO);
SetLight(l, Lightl);
SetLight(2, Light2);
LightEnable(0, True);
LightEnable(1, True);
LightEnable (2, True);
end;
end;
ΠΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ΅Π½Ρ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ², ΠΎΡΠ²Π΅ΡΠ°ΡΡΡΡ ΡΡΠ΅ΠΌΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°ΠΌΠΈ ΡΠ²Π΅ΡΠ°. ΠΡΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ² ΡΠΎΡΠ΅ΡΠ½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π²ΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ.
ΠΡΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΡΠ΅Π½Ρ Π³ΠΎΠ»ΠΎΠ²Ρ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ "ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ" Π² ΡΠΎΡΠΊΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅, ΠΈ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π΅Π΅ Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ RotY:
procedure TfrmDSD.DrawScene;
var
i : Integer;
matView : TD3DMatrix;
begin
// ΠΠΈΠ΄ΠΎΠ²Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ°, Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
SetViewMatrix(matView, D3DVector(XPos, 0.25, ZPos).,
D3DVector (XPos + cos (RotY) ,* 0.25 + Lookupdown,
ZPos - sin (RotY)), ZVector);
with FD3DDevice do begin
SetTransform(D3DTS_VIEW, matView);
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
SetRenderState(D3DRS_LIGHTING, DWORD (True));
end;
// ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
FPS if flgFPS then DrawLetters; // Π ΠΈΡΡΠ΅ΠΌ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
DrawManl; // ΠΡΠ°ΡΠ½ΡΠΉ
DrawMan2; // Π‘ΠΈΠ½ΠΈΠΉ
DrawMan3; // ΠΠ΅Π»Π΅Π½ΡΠΉ
// ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π½
with FD3DDevice do begin
// Π£ΡΠΈΡΡΠ²Π°ΡΡ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
// ΠΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΡΡΠΈΡ ΡΠ΅ΠΊΡΡΡΡ
SetTextureStageState(0,D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(0,D3DTSS_MINFILTER, D3DTEXF_LINEAR);
// He ΡΡΠΈΡΡΠ²Π°ΡΡ Π΄ΠΈΡΡΡΠ·ΠΈΡ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_AMBIENT, $OOOFOFOF);
// ΠΠ°Π΄Π°Π΅ΠΌ Π±Π΅Π»ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»
SetMaterial(MaterialWhite);
// ΠΠ°ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π° Π±ΡΡΠ΅Ρ Π²Π΅ΡΡΠΈΠ½ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠΈΡΠ°
SetStreamSource(0, FD3DVB, SizeOf(TNormDiffTextVertex));
SetVertexShader(D3DFVF_NORMDIFFTEXTVERTEX);
// ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² Π·Π°Π΄Π°Π½Ρ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ
SetTransform(D3DTS_WORLD, IdentityMatrix);
end;
// Π¦ΠΈΠΊΠ» Π²ΡΠ²ΠΎΠ΄Π° ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
for i := 0 to NumTriangles - 1 do with FDSDDevice do begin
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½ΡΠΆΠ½ΡΡ ΡΠ΅ΠΊΡΡΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ
SetTexture(0, FD3DTextures[World [i].NumTexture]);
DrawPrimitive(D3DPT_TRIANGLELIST, i * 3, 1); // ΠΡΠ²ΠΎΠ΄ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°
end;
FD3Ddevice.SetTexture(0, nil); // Π’Π΅ΠΊΡΡΡΡΠ° Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
end;
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π°Π΄Π°Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΡΡ, ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠ°Ρ Π±ΠΈΠ»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ. Π‘Π΄Π΅Π»Π°Π½ΠΎ ΡΡΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ ΡΡΠΈΠΊΡ ΠΈ ΡΡΠ΅Π½Π°ΠΌ Π½Π΅ ΠΏΡΠΎΡΠ²Π»ΡΠ»Π°ΡΡ Π±Π»ΠΎΡΠ½ΠΎΡΡΡ ΡΠ΅ΠΊΡΡΡΡ, Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡ Π±Ρ ΠΊΡΡΠΏΠ½ΠΎΠ·Π΅ΡΠ½ΠΈΡΡΡΠΌ.
Π£ΡΡΠΈΡΠ΅, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΡΡΠΈΠΈ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ Π΅Π΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΠΏΠΎΠΊΡΡΡΠΎΠΉ ΡΠ΅ΠΊΡΡΡΡΠΎΠΉ. ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΌΠ΅Π»ΠΊΠΎΠΉ Π·Π΅ΡΠ½ΠΈΡΡΠΎΡΡΠΈ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π΄ΡΡΡΠΈΡ ΡΡ ΡΠ΅ΠΊΡΡΡΡ. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ Π΄ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π° Π½Π΅Π³ΠΎ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ ΡΠ΅ΠΊΡΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠΉ Π΄Π΅ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π’Π°ΠΊΠΆΠ΅ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½Π½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ.
Π’ΡΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°, ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π½Π° ΡΡΠ΅Π½Π΅, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ Π·Π°ΠΊΠΎΠ½Π°ΠΌ. ΠΠ΅ΡΠ²ΡΠΉ, ΠΎΠ΄Π΅ΡΡΠΉ Π² ΠΊΡΠ°ΡΠ½ΡΡ ΡΡΡΠ±ΠΎΠ»ΠΊΡ, Π±Π΅ΡΠΏΡΠ΅ΡΡΠ²Π½ΠΎ ΠΊΡΡΠΆΠΈΡ Π²ΠΎΠΊΡΡΠ³ ΡΠ΅Π½ΡΡΠ° ΠΊΠΎΠΌΠ½Π°ΡΡ:
procedure TfrmD3D.MoveManl;
begin
// ΠΠΎΠ²ΠΎΡΠΎΡ Π²ΠΎΠΊΡΡΠ³ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠΈ
SetRotateYMatrix (rotManl, Angle + Pi);
// ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΡΡΠ³Ρ
transManl._41 := cos (-Angle) / 2;
transManl._43 := sin(-Angle) / 2;
// ΠΠΏΠΎΡΠ½Π°Ρ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°
matManl := MatrixMul(transManl, MatrixMul(rotManl, matWrkl));
ΠΡΠΎΡΠΎΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΠΊ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅Ρ ΠΊΠΎΠΌΠ½Π°ΡΡ, ΠΏΠΎΡΠ²Π»ΡΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ΅Π½Ρ ΠΈ ΠΈΡΡΠ΅Π·Π°Ρ Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ:
procedure TfrmD3D.MoveMan2;
begin
// ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π₯-ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ
transMan2._41 := transMan2._41 - 0.01;
// ΠΡΠΈ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ½Π°ΡΠ°Π»Π°
if transMan2._41 < -3.1 then transMan2._41 := 3.1;
matMan2 := MatrixMul(transMan2, matWrk2);
Π’ΡΠ΅ΡΠΈΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΠΊ Π½Π°Π·ΠΎΠΉΠ»ΠΈΠ²ΠΎ ΠΏΡΠ΅ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ³ΡΠΎΠΊΠ°, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΊ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ, Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡ ΠΊ Π½Π΅ΠΌΡ Π»ΠΈΡΠΎΠΌ:
procedure TfrmD3D.MoveMan3;
var
wrkAngle : Single;
distX, distZ : Single;
begin
// Π Π°ΡΡΡΠΎΡΠ½ΠΈΡ Π΄ΠΎ ΠΈΠ³ΡΠΎΠΊΠ°
distX := XPos - ΠΠ°ΠΏΠΠ ΠΎΠ·Π₯;
distZ := ZPos - ManSPosZ;
// ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°
if distZ < 0
then wrkAngle := arctan (distX / distZ) - Pi / 2 else
wrkAngle := arctan (distX / distZ) + Pi / 2; // Π Π°Π·Π²ΠΎΡΠΎΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ° Π»ΠΈΡΠΎΠΌ ΠΊ ΠΈΠ³ΡΠΎΠΊΡ
SetRotateYMatrix (rotMan3, wrkAngle);
// ΠΡΠ»ΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΠΊ ΡΠ΄Π°Π»Π΅Π½ ΠΎΡ Π·ΡΠΈΡΠ΅Π»Ρ, ΡΠΎ Π΄Π²ΠΈΠ³Π°Π΅ΡΡΡ,Π² Π΅Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ
if (abs(distX) > 0.02) and (abs (distZ) > 0.02) then begin
ΠΠ°ΠΏΠΠ ΠΎΠ·Π₯ := ΠΠ°nΠΠ ΠΎΠ·Π₯ + distX / 20; // ΠΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°
Man3PosZ := Man3PosZ + distZ / 20;
transMan3._41 := ΠΠ°nΠΠ ΠΎΠ·Π₯;
transMan3._43 := Man3PosZ;
end;
// ΠΠΏΠΎΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°
matMan3 := MatrixMul(transManS, MatrixMul(rotMan3, matWrk2));
ΠΠ»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°ΠΌ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΡΠΊΠ²ΠΎΠ·Ρ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡ ΠΈ Π΄ΡΡΠ³ ΡΠ΅ΡΠ΅Π· Π΄ΡΡΠ³Π°. ΠΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡ, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Π³ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΊΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ.
ΠΠ»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ FPS ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΠΈΡΡ ΠΈ ΡΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Ρ ΠΌΠ½ΠΎΡ Π² ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» numbers.txt. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° piaceLetter ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π² ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² Π΄Π»Ρ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°:
procedure TfrmD3D.DrawLetters;
var
i : Integer; nS, nW : Integer;
begin
with FDSDDevice do begin
// ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½Ρ ΠΏΡΠΎΡΠΈΠ² ΡΠ°ΡΠΎΠ²ΠΎΠΉ
SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
//ΠΠ΅ ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
SetRenderState(D3DRS_LIGHTING, DWORD (False));
// ΠΠ°ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊ Π½Π° Π±ΡΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
SetStreamSource(0, FD3DVBLetter, SizeOf(TNormVertex));
SetVertexShader(D3DFVF_NORMVERTEX);
end;
// Π¦ΠΈΠΊΠ» Π²ΡΠ²ΠΎΠ΄Π° Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² FPS for i := 1 to Length(FpsOut) do begin
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΡΠΈΠΌΠ²ΠΎΠ»Π°
PiaceLetter (FpsOut[i], nS, nW);
// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°
LetTrans._41 := i * 0.1;
FD3DDevice.SetTransform(D3DTS_WORLD, LetTrans);
FD3DDevice.DrawPrimitive(D3DPTJTRIANGLELIST, nS, nW);
end;
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ with FD3DDevice do begin
SetRenderState(D3DRS_COLLMODE, D3DCULL_CCW);
SetRenderState(D3DRS_LIGHTING, DWORD (True) ) ;
end;
end;
Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ "ΠΏΠΎΠ΄Π²Π΅ΡΠ΅Π½Π½ΡΠΌΠΈ" Π² Π²ΠΎΠ·Π΄ΡΡ Π΅, ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΡΠ°ΡΠΈΠ²ΠΎ ΠΈ Π·Π°Π³Π°Π΄ΠΎΡΠ½ΠΎ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π» Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅ Ρ ΠΎΡΠ΅Π½Ρ ΡΠΊΡΠΎΠΌΠ½ΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π±ΠΎΠ»Π΅Π΅ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΡΡΡΡ ΡΠΈΡΡΡ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π΅ΡΠΎΠΌΡΠΉ ΡΠ΄Π°Ρ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π°Π½ΠΎΡΠΈΡΡΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΡΠ΅ΠΊΡΡΡΡΡ, Π° ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠΈΡΠ° Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΡΠΈΠ»ΡΠ½ΠΎΠΌΡ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π΄ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ² ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠΊΠΎΡΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΌΠ΅Π½Π° ΡΠ΅ΠΊΡΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΠΌΠ½ΠΎΡ Π΄Π»Ρ ΡΡΠ΅Π½, ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΠ·ΠΈΡΡΡΡΠΈΡ Π²ΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠ΅ΠΊΡΠΎΡΠ°, Π½Π΅ ΠΏΡΠΈΠ²Π΅Π»Π° ΠΊ Π·Π°ΠΌΠ΅ΡΠ½ΠΎΠΌΡ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΡ:
function TfrmD3D.BukupTexture (var FDSTextBMP : IDIRECT3DTEXTURE8;
const FileName : String) : HRESULT;
var
hRet : HRESULT;
d3dlr : TD3DLOCKED__RECT;
dwDstPitch : DWORD;
X, Y : DWORD;
Bmp : TBitmap;
R, G, Π : Byte;
begin
Bmp := TBitmap.Create;
try
Bmp.LoadFromfile (FileName);
except
raise EAbort.Create ('Can''t open file: ' + FileName);
Result := S_FALSE;
Exit;
end;
hRet := FD3DDevice.CreateTexture (Bmp.Width, Bmp.Height, 0, 0,
D3DFMT_A8R8G8B8, D3DPOOL MANAGED, FD3TextBMP);
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3TextBMP.LockRect(0, d3dlr, nil, 0) ;
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
dwDstPitch := d3dlr.Pitch;
for Y := 0' to Bmp.Height - 1 do
for X := 0 to Bmp.Width - 1 do begin
R := GetRValue (Bmp.Canvas.Pixels [X,
DWORD (Bmp.Height -1) - Y] ) ;
G := GetGValue (Bmp.Canvas.Pixels [X,
DWORD (Bmp.Height -I) - Y] ) ;
Π := GetBValue (Bmp.Canvas.Pixels [X,
DWORD (Bmp.Height -I) - Y] ) ;
PDWORD(DWORD(d3dlr.pBits)+Y*dwDstPitch+X*4)Π» :=
D3DCOLOR_XRGB(R, G, B);
end;
// Π Π΅Π·Π΅ΡΠ²ΠΈΡΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΡΠ°
GetMem (TexPointer, 4 * Bmp.Width * Bmp.Height); // ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΡΡΡ
CopyMemory (TexPointer, d3dlr.pBits, 4 * Bmp.Width * Bmp.Height)
wrkTexWidth := Bmp.Width; wrkTexHeight := Bmp.Height; Bmp.Free;
Result := FDSTextBMP.UnlockRect(0);
end;
// ΠΠΎΠΊΡΡΡΠΈΠ΅ ΡΠ½Π΅Π³ΠΎΠΌ ΡΠ΅ΠΊΡΡΡΡΡ
function TfrmDSD.SnowTexture (var FD3TextBMP : IDIRECT3DTEXTURE8)
HRESULT;
var
hRet : HRESULT;
d3dlr : TD3DLOCKED_RECT;
i : Integer;
dwDstPitch : DWORD;
begin
// ΠΠ°ΠΏΠΈΡΠ°Π΅ΠΌ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ ΡΠ΅ΠΊΡΡΡΡΡ
hRet := FDSTextBMP.LockRect(0, d3dlr, nil, 0);
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
// ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ Π² Π½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΡΡΡ
CopyMemory (d3dlr.pBits, TexPointer, 4 * wrkTexWidth * wrkTexHeight);
dwDstPitch := d3dlr.Pitch;
// ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ ΡΠ΅ΠΊΡΡΡΡΡ Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΡΠ½ΡΠΌ
for i := 1 to 10000 do
PDWORD (DWORD(d3dlr.pBits) + DWORD(random(wrkTexHeight)) * dwDstPitch +
DWORD(random(wrkTexWidth)) * 4)Π := 0; Result := FD3TextBMP.OnlockRect(0);
end;
ΠΠ΄Π½ΠΎ ΠΈΠ· ΡΠ°ΠΌΡΡ Π²Π°ΠΆΠ½ΡΡ ΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° - ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠΎΠΌ. ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ, ΠΊΠ»Π°Π²ΠΈΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΡΡΡΠΎΡΠΎΠΌ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅, ΠΊΠ»Π°Π²ΠΈΡΠΈ <Page Up> ΠΈ <Page Down> ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½Ρ Π·Π° ΡΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΠΎ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΠΈ:
function TfrmD3D.ReadImmediateData : HRESULT;
var
hRet : HRESULT; dims2 : TDIMOUSESTATE2;
NewXPos, NewZPos : Single;
begin
Zero-Memory (8dims2, SizeOf (dims2) ) ;
hRet := DIMouse.GetDeviceState(SizeOf(TDIMOUSESTATE2), @dims2);
if Failed (hRet) then begin
hRet := DIMouse.Acquire;
while hRet = DIERR_INPUTLOST do
hRet := DIMouse.Acquire; end;
// ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΡΠ° ΠΌΡΡΠΈ Π²Π»Π΅Π²ΠΎ-Π²ΠΏΡΠ°Π²ΠΎ
if dims2.1X <> Π
// ΠΠ΅Π½ΡΠ΅ΠΌ ΡΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ
then RotY := RotY + 0.01 * dims2.1X; // ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΡΠ° ΠΌΡΡΠΈ Π²ΠΏΠ΅ΡΠ΅Π΄-Π½Π°Π·Π°Π΄
if dims2.1Y > 0 then begin // ΠΠ²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠ° Π½Π°Π·Π°Π΄
// ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
NewXPos := XPos + sin(RotY - Pi / 2) * 0.05;
NewZPos := ZPos + cos(RotY - Pi / 2) * 0.05;
// ΠΠ΅Ρ Π»ΠΈ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ ΠΊ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π½Π°Π·Π°Π΄, Π³ΠΎΠ»ΠΎΠ²Ρ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ
if TestRender (NewXPos, NewZPos, RotY - Pi) then begin
XPos := NewXPos; // ΠΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ Π½Π΅Ρ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΈΠ³ΡΠΎΠΊΠ°
ZPos := NewZPos;
end
end else if dims2.1Y < 0 then begin // ΠΠ²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΏΠ΅ΡΠ΅Π΄
NewXPos := XPos + sin(RotY + Pi / 2) * 0.05;
NewZPos := ZPos + cos(RotY + Pi / 2) * 0.05;
// ΠΡΡΡ Π»ΠΈ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡ ΠΊ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
if TestRender (NewXPos, NewZPos, RotY) then begin