1 | {$i bgrasse.inc}
|
---|
2 |
|
---|
3 | {$ifdef BGRASSE_AVAILABLE}{$asmmode intel}{$endif}
|
---|
4 | {$IFDEF PARAM_USESSE}
|
---|
5 | asm
|
---|
6 | {$IFDEF PARAM_USESHADER}
|
---|
7 | {$IFDEF cpux86_64}
|
---|
8 | mov rax, ShaderContext
|
---|
9 | movaps xmm2, [rax+32] //positionInvZ
|
---|
10 | movaps xmm3, [rax+48] //normalInvZ
|
---|
11 | {$ELSE}
|
---|
12 | mov eax, ShaderContext
|
---|
13 | movaps xmm2, [eax+32] //positionInvZ
|
---|
14 | movaps xmm3, [eax+48] //normalInvZ
|
---|
15 | {$ENDIF}
|
---|
16 | {$ENDIF}
|
---|
17 | {$IFNDEF PARAM_USESOLIDCOLOR}
|
---|
18 | xorps xmm5,xmm5
|
---|
19 | movlps xmm5, texPos
|
---|
20 | {$ENDIF}
|
---|
21 | end;
|
---|
22 | {$ENDIF}
|
---|
23 | for i := ix1 to ix2 do
|
---|
24 | begin
|
---|
25 | {$IFDEF PARAM_USESSE}
|
---|
26 | {$IFDEF PARAM_USEZBUFFER}
|
---|
27 | if InvZPos > pzbuffer^ then
|
---|
28 | begin
|
---|
29 | pzbuffer^ := InvZPos;
|
---|
30 | {$ENDIF}
|
---|
31 | asm
|
---|
32 | movss xmm4, InvZPos
|
---|
33 | rcpss xmm4,xmm4 //zPos
|
---|
34 | shufps xmm4,xmm4,0 //broadcast
|
---|
35 |
|
---|
36 | {$IFDEF PARAM_USESHADER}
|
---|
37 | {$ifdef cpux86_64}
|
---|
38 | mov rax, ShaderContext
|
---|
39 | {$else}
|
---|
40 | mov eax, ShaderContext
|
---|
41 | {$endif}
|
---|
42 |
|
---|
43 | mulps xmm2, xmm4 //positionInvZ*zPos (A)
|
---|
44 | mulps xmm3, xmm4 //normalInvZ*zPos
|
---|
45 | {$ifdef cpux86_64}
|
---|
46 | movaps [rax+0], xmm2 //(A) Position
|
---|
47 | {$else}
|
---|
48 | movaps [eax+0], xmm2 //(A) Position
|
---|
49 | {$endif}
|
---|
50 |
|
---|
51 | //normalize
|
---|
52 | movaps xmm1, xmm3
|
---|
53 | mulps xmm3, xmm3
|
---|
54 |
|
---|
55 | {$IFDEF PARAM_USESSE3}
|
---|
56 | haddps xmm3,xmm3
|
---|
57 | haddps xmm3,xmm3
|
---|
58 | {$ELSE}
|
---|
59 | //mix1
|
---|
60 | movaps xmm7, xmm3
|
---|
61 | shufps xmm7, xmm7, $4e
|
---|
62 | addps xmm3, xmm7
|
---|
63 | //mix2
|
---|
64 | movaps xmm7, xmm3
|
---|
65 | shufps xmm7, xmm7, $11
|
---|
66 | addps xmm3, xmm7
|
---|
67 | {$ENDIF}
|
---|
68 |
|
---|
69 | xorps xmm7,xmm7
|
---|
70 | comiss xmm3,xmm7
|
---|
71 | jna @skipnormal
|
---|
72 |
|
---|
73 | rsqrtps xmm3,xmm3
|
---|
74 | mulps xmm3, xmm1 //apply
|
---|
75 | @skipnormal:
|
---|
76 |
|
---|
77 | {$ifdef cpux86_64}
|
---|
78 | movaps [rax+16], xmm3 //Normal
|
---|
79 | {$else}
|
---|
80 | movaps [eax+16], xmm3 //Normal
|
---|
81 | {$endif}
|
---|
82 | {$ENDIF}
|
---|
83 |
|
---|
84 | {$IFNDEF PARAM_USESOLIDCOLOR}
|
---|
85 | mulps xmm5, xmm4
|
---|
86 | {$IFDEF PARAM_USEINTERPOLATION}
|
---|
87 | movlps texPosByZ, xmm5
|
---|
88 | {$ELSE}
|
---|
89 | cvtps2dq xmm1,xmm5
|
---|
90 | movlps intTexPos,xmm1
|
---|
91 | {$ENDIF}
|
---|
92 | {$ENDIF}
|
---|
93 | end;
|
---|
94 | {$ELSE}
|
---|
95 | {$IFDEF PARAM_USEZBUFFER}
|
---|
96 | if InvZPos > pzbuffer^ then
|
---|
97 | begin
|
---|
98 | pzbuffer^ := InvZPos;
|
---|
99 | {$ENDIF}
|
---|
100 | {$IFDEF PARAM_USESHADER}
|
---|
101 | zPos := 1/InvZPos;
|
---|
102 | with ShaderContext^ do
|
---|
103 | begin
|
---|
104 | Normal := NormalInvZ*zPos;
|
---|
105 | Normalize3D_128(Normal);
|
---|
106 | Position := PositionInvZ*zPos;
|
---|
107 | end;
|
---|
108 | {$ELSE}
|
---|
109 | {$IFNDEF PARAM_USESOLIDCOLOR}
|
---|
110 | zPos := 1/InvZPos;
|
---|
111 | {$ENDIF}
|
---|
112 | {$ENDIF}
|
---|
113 | {$ENDIF}
|
---|
114 | DrawPixelInlineWithAlphaCheck(pdest,
|
---|
115 | {$IFDEF PARAM_USESHADER} ShaderFunction(ShaderContext, {$ENDIF}
|
---|
116 | {$IFDEF PARAM_USELIGHTING} ApplyLightnessFast( {$ENDIF}
|
---|
117 | {$IFDEF PARAM_USESOLIDCOLOR}
|
---|
118 | solidColor
|
---|
119 | {$ELSE}
|
---|
120 | {$IFNDEF PARAM_USESSE}
|
---|
121 | {$IFDEF PARAM_USEINTERPOLATION}
|
---|
122 | scanAtFunc(texPos.x*zPos,texPos.y*zPos)
|
---|
123 | {$ELSE}
|
---|
124 | scanAtIntegerFunc(round(texPos.x*zPos),round(texPos.y*zPos))
|
---|
125 | {$ENDIF}
|
---|
126 | {$ELSE}
|
---|
127 | {$IFDEF PARAM_USEINTERPOLATION}
|
---|
128 | scanAtFunc(texPosByZ.x,texPosByZ.y)
|
---|
129 | {$ELSE}
|
---|
130 | scanAtIntegerFunc(intTexPos.x,intTexPos.y)
|
---|
131 | {$ENDIF}
|
---|
132 | {$ENDIF}
|
---|
133 | {$ENDIF}
|
---|
134 | {$IFDEF PARAM_USELIGHTING} ,light) {$ENDIF}
|
---|
135 | {$IFDEF PARAM_USESHADER} ) {$ENDIF}
|
---|
136 | );
|
---|
137 | {$IFDEF PARAM_USEZBUFFER}
|
---|
138 | end;
|
---|
139 | inc(pzbuffer);
|
---|
140 | {$ENDIF}
|
---|
141 |
|
---|
142 | {$IFDEF PARAM_USESSE}
|
---|
143 | {$IFNDEF PARAM_USESOLIDCOLOR}
|
---|
144 | asm
|
---|
145 | movups xmm5, texPos
|
---|
146 | movups xmm1, texStep
|
---|
147 | end;
|
---|
148 | InvZPos += zStep;
|
---|
149 | asm
|
---|
150 | addps xmm5, xmm1
|
---|
151 | movlps texPos, xmm5
|
---|
152 | end;
|
---|
153 | {$ELSE}
|
---|
154 | InvZPos += zStep;
|
---|
155 | {$ENDIF}
|
---|
156 | {$ELSE}
|
---|
157 | {$IFNDEF PARAM_USESOLIDCOLOR}
|
---|
158 | texPos.x += texStep.x;
|
---|
159 | texPos.y += texStep.y;
|
---|
160 | {$ENDIF}
|
---|
161 | InvZPos += zStep;
|
---|
162 | {$ENDIF}
|
---|
163 |
|
---|
164 | {$IFDEF PARAM_USESHADER}
|
---|
165 | {$IFDEF PARAM_USESSE}
|
---|
166 | {$ifdef cpux86_64}
|
---|
167 | asm
|
---|
168 | mov rax, ShaderContext
|
---|
169 | movaps xmm2, [rax+32] //PositionInvZ
|
---|
170 | movaps xmm1, [rax+64] //PositionStepInvZ
|
---|
171 | movaps xmm3, [rax+48] //NormalInvZ
|
---|
172 | movaps xmm0, [rax+80] //NormalStepInvZ
|
---|
173 | addps xmm2, xmm1
|
---|
174 | addps xmm3, xmm0
|
---|
175 | movaps [rax+32], xmm2
|
---|
176 | movaps [rax+48], xmm3
|
---|
177 | end;
|
---|
178 | {$else}
|
---|
179 | asm
|
---|
180 | mov eax, ShaderContext
|
---|
181 | movaps xmm2, [eax+32] //PositionInvZ
|
---|
182 | movaps xmm1, [eax+64] //PositionStepInvZ
|
---|
183 | movaps xmm3, [eax+48] //NormalInvZ
|
---|
184 | movaps xmm0, [eax+80] //NormalStepInvZ
|
---|
185 | addps xmm2, xmm1
|
---|
186 | addps xmm3, xmm0
|
---|
187 | movaps [eax+32], xmm2
|
---|
188 | movaps [eax+48], xmm3
|
---|
189 | end;
|
---|
190 | {$endif}
|
---|
191 | {$ELSE}
|
---|
192 | with ShaderContext^ do
|
---|
193 | begin
|
---|
194 | PositionInvZ += PositionStepInvZ;
|
---|
195 | NormalInvZ += NormalStepInvZ;
|
---|
196 | end;
|
---|
197 | {$ENDIF}
|
---|
198 | {$ENDIF}
|
---|
199 |
|
---|
200 | {$IFDEF PARAM_USELIGHTING}
|
---|
201 | NextLight;
|
---|
202 | {$ENDIF}
|
---|
203 | inc(pdest);
|
---|
204 | end;
|
---|