Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
Delphi 10.4 Sydney
|
AW: VMR9 custom allocator-presenter
18. Jan 2018, 14:48
Delphi-Quellcode:
function TPlaneScene.DrawScene(d3ddev: IDirect3DDevice9;
texture: IDirect3DTexture9): HRESULT;
function FailRet(hr: HResult): boolean;
begin
DrawScene := hr;
Result := Failed(hr);
end;
var
dwCurrentTime: DWord;
difference: Int64;
x, y, z: Single;
mask0, mask3: DWord;
pData: Pointer;
begin
if ((d3ddev = nil) or (texture = nil)) then
begin
Result := E_POINTER;
Exit;
end;
if( FvertexBuffer = nil) then
begin
Result := D3DERR_INVALIDCALL;
Exit;
end;
// get the difference in time
dwCurrentTime := GetTickCount;
difference := Ftime - dwCurrentTime;
// figure out the rotation of the plane
x := -cos(difference / 2000);
y := cos(difference / 2000);
z := sin(difference / 2000);
// update the two rotating vertices with the new position
Fvertices[0].position := MakePosition(x, y, z); // top left
Fvertices[3].position := MakePosition(-x, -y, -z); // bottom right
// Adjust the color so the blue is always on the bottom.
// As the corner approaches the bottom, get rid of all the other
// colors besides blue
mask0 := Trunc((255 * (( y + 1) / 2)));
mask3 := Trunc((255 * ((-y + 1) / 2)));
Fvertices[0].color := $ff0000ff or (mask0 shl 16) or (mask0 shl 8);
Fvertices[3].color := $ff0000ff or (mask3 shl 16) or (mask3 shl 8);
// write the new vertex information into the buffer
if FailRet(FvertexBuffer.Lock(0, sizeof(pData), pData, 0)) then exit;
move(Fvertices, pData^ , sizeof(Fvertices));
if FailRet(FvertexBuffer.Unlock) then exit;
// clear the scene so we don't have any articats left
d3ddev.Clear(0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0, 0);
if FailRet(d3ddev.BeginScene) then exit;
if FailRet(d3ddev.SetTexture(0, texture)) then exit;
if FailRet(d3ddev.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE)) then exit;
if FailRet(d3ddev.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE)) then exit;
if FailRet(d3ddev.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE)) then exit;
if FailRet(d3ddev.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)) then exit;
if FailRet(d3ddev.SetStreamSource(0, FvertexBuffer, 0, sizeof(TCustomVertex))) then exit; //set next source ( NEW )
if FailRet(d3ddev.SetFVF(D3DFVF_CUSTOMVERTEX)) then exit;
if FailRet(d3ddev.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2)) then exit; //draw quad
if FailRet(d3ddev.SetTexture(0, nil)) then exit;
if FailRet(d3ddev.EndScene) then exit;
end;
Hier endet leider mein mathematisches & delphianotisches Knoff-Hoff.
Ich dachte eigentlich an ein ZIP-Archiv mit allen benötigten Projektdateien, Quelltexten und Drittanbieter-Units (ja, auch das DSPack).
So das man als Helfender einfach nur das ZIP-Archiv entpackt und das Projekt öffnet und startet.
Nichts desto trotz musst du im oben zitierten Quelltext doch bloß das Drehen verhindern.
Probiere mal testweise diese Zeile difference := Ftime - dwCurrentTime;
gegen difference := 0;
auszustauschen.
Ansonsten kannst du alles ab der Zeile bis zum d3ddev.Clear auskommentieren und ausprobieren.
|
|
Zitat
|