205 lines
5.9 KiB
PHP
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;
|