This repository has been archived on 2024-02-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
MyPresenter1.0/bgrabitmap/perspectivescan2.inc
2015-02-08 16:52:18 -08:00

205 lines
5.9 KiB
PHP

{$i bgrasse.inc}
{$ifdef BGRASSE_AVAILABLE}{$asmmode intel}{$endif}
{$IFDEF PARAM_USESSE}
asm
{$IFDEF PARAM_USESHADER}
{$IFDEF cpux86_64}
mov rax, ShaderContext
movaps xmm2, [rax+32] //positionInvZ
movaps xmm3, [rax+48] //normalInvZ
{$ELSE}
mov eax, ShaderContext
movaps xmm2, [eax+32] //positionInvZ
movaps xmm3, [eax+48] //normalInvZ
{$ENDIF}
{$ENDIF}
{$IFNDEF PARAM_USESOLIDCOLOR}
xorps xmm5,xmm5
movlps xmm5, texPos
{$ENDIF}
end;
{$ENDIF}
for i := ix1 to ix2 do
begin
{$IFDEF PARAM_USESSE}
{$IFDEF PARAM_USEZBUFFER}
if InvZPos > pzbuffer^ then
begin
pzbuffer^ := InvZPos;
{$ENDIF}
asm
movss xmm4, InvZPos
rcpss xmm4,xmm4 //zPos
shufps xmm4,xmm4,0 //broadcast
{$IFDEF PARAM_USESHADER}
{$ifdef cpux86_64}
mov rax, ShaderContext
{$else}
mov eax, ShaderContext
{$endif}
mulps xmm2, xmm4 //positionInvZ*zPos (A)
mulps xmm3, xmm4 //normalInvZ*zPos
{$ifdef cpux86_64}
movaps [rax+0], xmm2 //(A) Position
{$else}
movaps [eax+0], xmm2 //(A) Position
{$endif}
//normalize
movaps xmm1, xmm3
mulps xmm3, xmm3
{$IFDEF PARAM_USESSE3}
haddps xmm3,xmm3
haddps xmm3,xmm3
{$ELSE}
//mix1
movaps xmm7, xmm3
shufps xmm7, xmm7, $4e
addps xmm3, xmm7
//mix2
movaps xmm7, xmm3
shufps xmm7, xmm7, $11
addps xmm3, xmm7
{$ENDIF}
xorps xmm7,xmm7
comiss xmm3,xmm7
jna @skipnormal
rsqrtps xmm3,xmm3
mulps xmm3, xmm1 //apply
@skipnormal:
{$ifdef cpux86_64}
movaps [rax+16], xmm3 //Normal
{$else}
movaps [eax+16], xmm3 //Normal
{$endif}
{$ENDIF}
{$IFNDEF PARAM_USESOLIDCOLOR}
mulps xmm5, xmm4
{$IFDEF PARAM_USEINTERPOLATION}
movlps texPosByZ, xmm5
{$ELSE}
cvtps2dq xmm1,xmm5
movlps intTexPos,xmm1
{$ENDIF}
{$ENDIF}
end;
{$ELSE}
{$IFDEF PARAM_USEZBUFFER}
if InvZPos > pzbuffer^ then
begin
pzbuffer^ := InvZPos;
{$ENDIF}
{$IFDEF PARAM_USESHADER}
zPos := 1/InvZPos;
with ShaderContext^ do
begin
Normal := NormalInvZ*zPos;
Normalize3D_128(Normal);
Position := PositionInvZ*zPos;
end;
{$ELSE}
{$IFNDEF PARAM_USESOLIDCOLOR}
zPos := 1/InvZPos;
{$ENDIF}
{$ENDIF}
{$ENDIF}
DrawPixelInlineWithAlphaCheck(pdest,
{$IFDEF PARAM_USESHADER} ShaderFunction(ShaderContext, {$ENDIF}
{$IFDEF PARAM_USELIGHTING} ApplyLightnessFast( {$ENDIF}
{$IFDEF PARAM_USESOLIDCOLOR}
solidColor
{$ELSE}
{$IFNDEF PARAM_USESSE}
{$IFDEF PARAM_USEINTERPOLATION}
scanAtFunc(texPos.x*zPos,texPos.y*zPos)
{$ELSE}
scanAtIntegerFunc(round(texPos.x*zPos),round(texPos.y*zPos))
{$ENDIF}
{$ELSE}
{$IFDEF PARAM_USEINTERPOLATION}
scanAtFunc(texPosByZ.x,texPosByZ.y)
{$ELSE}
scanAtIntegerFunc(intTexPos.x,intTexPos.y)
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$IFDEF PARAM_USELIGHTING} ,light) {$ENDIF}
{$IFDEF PARAM_USESHADER} ) {$ENDIF}
);
{$IFDEF PARAM_USEZBUFFER}
end;
inc(pzbuffer);
{$ENDIF}
{$IFDEF PARAM_USESSE}
{$IFNDEF PARAM_USESOLIDCOLOR}
asm
movups xmm5, texPos
movups xmm1, texStep
end;
InvZPos += zStep;
asm
addps xmm5, xmm1
movlps texPos, xmm5
end;
{$ELSE}
InvZPos += zStep;
{$ENDIF}
{$ELSE}
{$IFNDEF PARAM_USESOLIDCOLOR}
texPos.x += texStep.x;
texPos.y += texStep.y;
{$ENDIF}
InvZPos += zStep;
{$ENDIF}
{$IFDEF PARAM_USESHADER}
{$IFDEF PARAM_USESSE}
{$ifdef cpux86_64}
asm
mov rax, ShaderContext
movaps xmm2, [rax+32] //PositionInvZ
movaps xmm1, [rax+64] //PositionStepInvZ
movaps xmm3, [rax+48] //NormalInvZ
movaps xmm0, [rax+80] //NormalStepInvZ
addps xmm2, xmm1
addps xmm3, xmm0
movaps [rax+32], xmm2
movaps [rax+48], xmm3
end;
{$else}
asm
mov eax, ShaderContext
movaps xmm2, [eax+32] //PositionInvZ
movaps xmm1, [eax+64] //PositionStepInvZ
movaps xmm3, [eax+48] //NormalInvZ
movaps xmm0, [eax+80] //NormalStepInvZ
addps xmm2, xmm1
addps xmm3, xmm0
movaps [eax+32], xmm2
movaps [eax+48], xmm3
end;
{$endif}
{$ELSE}
with ShaderContext^ do
begin
PositionInvZ += PositionStepInvZ;
NormalInvZ += NormalStepInvZ;
end;
{$ENDIF}
{$ENDIF}
{$IFDEF PARAM_USELIGHTING}
NextLight;
{$ENDIF}
inc(pdest);
end;