Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3000 | leency | 1 | ; App written by randall ported to KolibriOS and MenuetOS64 by macgub (www.macgub.hekko.pl). |
2 | ; Now it use static memory, it is mixed 32bit code and SSE2 instructions. |
||
3 | |||
4 | include '../../../macros.inc' |
||
5 | |||
6 | use32 |
||
7 | |||
8 | org 0x0 |
||
9 | |||
10 | db 'MENUET01' ; 8 byte id |
||
11 | dd 0x01 ; header version |
||
12 | dd START ; start of code |
||
13 | dd IMG_END ; size of image |
||
14 | dd I_END ;0x100000 ; memory for app |
||
15 | dd I_END ;0xbffff ; esp |
||
16 | dd 0x0 , 0x0 ; I_Param , I_Icon |
||
17 | |||
18 | START: ; start of execution |
||
19 | |||
20 | call draw_window |
||
21 | call Main |
||
22 | call draw_from_buffer |
||
23 | |||
24 | still: |
||
25 | |||
26 | ; mov eax,23 ; wait here for event |
||
27 | ; mov ebx,timeout |
||
28 | ; int 0x40 |
||
29 | ; mov eax,11 ; check for event no wait |
||
30 | mov eax,10 ; wait for event |
||
31 | int 0x40 |
||
32 | |||
33 | cmp eax,1 ; redraw request ? |
||
34 | je red |
||
35 | cmp eax,2 ; key in buffer ? |
||
36 | je key |
||
37 | cmp eax,3 ; button in buffer ? |
||
38 | je button |
||
39 | |||
40 | jmp noclose |
||
41 | |||
42 | red: ; redraw |
||
43 | call draw_window |
||
44 | call draw_from_buffer |
||
45 | jmp still |
||
46 | |||
47 | key: ; key |
||
48 | mov eax,2 ; just read it and ignore |
||
49 | int 0x40 |
||
50 | shr eax,8 |
||
51 | cmp eax, 27 |
||
52 | jne still |
||
53 | mov eax, -1 |
||
54 | int 0x40 |
||
55 | |||
56 | |||
57 | button: ; button |
||
58 | mov eax,17 ; get id |
||
59 | int 0x40 |
||
60 | |||
61 | cmp ah,1 ; button id=1 ? |
||
62 | jne noclose |
||
63 | |||
64 | mov eax,-1 ; close this program |
||
65 | int 0x40 |
||
66 | noclose: |
||
67 | |||
68 | jmp still |
||
69 | |||
70 | |||
71 | draw_from_buffer: |
||
72 | |||
73 | mov eax,7 |
||
74 | mov ebx,screen4 |
||
75 | mov ecx,IMG_WIDTH*65536+IMG_HEIGHT |
||
76 | mov edx,0*65536+0 |
||
77 | int 0x40 |
||
78 | ret |
||
79 | |||
80 | |||
81 | ;------------------------------------------------------------------------------- |
||
82 | ; NAME: shuf |
||
83 | ;------------------------------------------------------------------------------- |
||
84 | macro shuf d*,s*,z*,y*,x*,w* { |
||
85 | shufps d,s,(z shl 6) or (y shl 4) or (x shl 2) or w |
||
86 | } |
||
87 | ;------------------------------------------------------------------------------- |
||
88 | ; NAME: length3 |
||
89 | ; IN: xmm0.xyz input vector |
||
90 | ; OUT: xmm0.xyzw vector length |
||
91 | ;------------------------------------------------------------------------------- |
||
92 | macro length3 { |
||
93 | mulps xmm0,xmm0 |
||
94 | movaps xmm1,xmm0 |
||
95 | movaps xmm2,xmm0 |
||
96 | shufps xmm0,xmm0,0x00 |
||
97 | shufps xmm1,xmm1,0x55 |
||
98 | shufps xmm2,xmm2,0xaa |
||
99 | addps xmm0,xmm1 |
||
100 | addps xmm0,xmm2 |
||
101 | sqrtps xmm0,xmm0 |
||
102 | } |
||
103 | ;------------------------------------------------------------------------------- |
||
104 | ; NAME: length4 |
||
105 | ; IN: xmm0.xyzw input vector |
||
106 | ; OUT: xmm0.xyzw vector length |
||
107 | ;------------------------------------------------------------------------------- |
||
108 | macro length4 { |
||
109 | mulps xmm0,xmm0 |
||
110 | movaps xmm1,xmm0 |
||
111 | movaps xmm2,xmm0 |
||
112 | movaps xmm3,xmm0 |
||
113 | shufps xmm0,xmm0,0x00 |
||
114 | shufps xmm1,xmm1,0x55 |
||
115 | shufps xmm2,xmm2,0xaa |
||
116 | shufps xmm3,xmm3,0xff |
||
117 | addps xmm0,xmm1 |
||
118 | addps xmm2,xmm3 |
||
119 | addps xmm0,xmm2 |
||
120 | sqrtps xmm0,xmm0 |
||
121 | } |
||
122 | ;------------------------------------------------------------------------------- |
||
123 | ; NAME: normalize3 |
||
124 | ; IN: xmm0.xyz input vector |
||
125 | ; OUT: xmm0.xyz normalized vector |
||
126 | ;------------------------------------------------------------------------------- |
||
127 | macro normalize3 { |
||
128 | movaps xmm3,xmm0 |
||
129 | mulps xmm0,xmm0 |
||
130 | movaps xmm1,xmm0 |
||
131 | movaps xmm2,xmm0 |
||
132 | shufps xmm0,xmm0,0x00 |
||
133 | shufps xmm1,xmm1,0x55 |
||
134 | shufps xmm2,xmm2,0xaa |
||
135 | addps xmm0,xmm1 |
||
136 | addps xmm0,xmm2 |
||
137 | rsqrtps xmm0,xmm0 |
||
138 | mulps xmm0,xmm3 |
||
139 | } |
||
140 | ;------------------------------------------------------------------------------- |
||
141 | ; NAME: cross |
||
142 | ; IN: xmm0.xyz first input vector |
||
143 | ; IN: xmm1.xyz second input vector |
||
144 | ; OUT: xmm0.xyz cross product result |
||
145 | ;------------------------------------------------------------------------------- |
||
146 | macro cross { |
||
147 | movaps xmm2,xmm0 |
||
148 | movaps xmm3,xmm1 |
||
149 | shuf xmm0,xmm0,3,0,2,1 |
||
150 | shuf xmm1,xmm1,3,1,0,2 |
||
151 | shuf xmm2,xmm2,3,1,0,2 |
||
152 | shuf xmm3,xmm3,3,0,2,1 |
||
153 | mulps xmm0,xmm1 |
||
154 | mulps xmm2,xmm3 |
||
155 | subps xmm0,xmm2 |
||
156 | } |
||
157 | ;------------------------------------------------------------------------------- |
||
158 | ; NAME: dot3 |
||
159 | ; IN: xmm0.xyz first input vector |
||
160 | ; IN: xmm1.xyz second input vector |
||
161 | ; OUT: xmm0.xyzw dot product result |
||
162 | ;------------------------------------------------------------------------------- |
||
163 | macro dot3 { |
||
164 | mulps xmm0,xmm1 |
||
165 | movaps xmm1,xmm0 |
||
166 | movaps xmm2,xmm0 |
||
167 | shufps xmm0,xmm0,0x00 |
||
168 | shufps xmm1,xmm1,0x55 |
||
169 | shufps xmm2,xmm2,0xaa |
||
170 | addps xmm0,xmm1 |
||
171 | addps xmm0,xmm2 |
||
172 | } |
||
173 | ;------------------------------------------------------------------------------- |
||
174 | ; NAME: dot4 |
||
175 | ; IN: xmm0.xyzw first input vector |
||
176 | ; IN: xmm1.xyzw second input vector |
||
177 | ; OUT: xmm0.xyzw dot product result |
||
178 | ;------------------------------------------------------------------------------- |
||
179 | macro dot4 { |
||
180 | mulps xmm0,xmm1 |
||
181 | movaps xmm1,xmm0 |
||
182 | movaps xmm2,xmm0 |
||
183 | movaps xmm3,xmm0 |
||
184 | shufps xmm0,xmm0,0x00 |
||
185 | shufps xmm1,xmm1,0x55 |
||
186 | shufps xmm2,xmm2,0xaa |
||
187 | shufps xmm3,xmm3,0xff |
||
188 | addps xmm0,xmm1 |
||
189 | addps xmm2,xmm3 |
||
190 | addps xmm0,xmm2 |
||
191 | } |
||
192 | ;------------------------------------------------------------------------------- |
||
193 | ; NAME: qsq |
||
194 | ; IN: xmm0.xyzw quaternion |
||
195 | ; OUT: xmm0.xyzw squared quaternion |
||
196 | ;------------------------------------------------------------------------------- |
||
197 | macro qsq { |
||
198 | movaps xmm3,xmm0 |
||
199 | movaps xmm4,xmm0 |
||
200 | movaps xmm1,xmm0 |
||
201 | dot3 |
||
202 | shufps xmm3,xmm3,0xff |
||
203 | movaps xmm5,xmm3 |
||
204 | mulps xmm3,xmm3 |
||
205 | subps xmm3,xmm0 ; r.___w |
||
206 | mulps xmm4,xmm5 |
||
207 | addps xmm4,xmm4 ; r.xyz_ |
||
208 | andps xmm3,dqword [g_ClearXYZ] |
||
209 | andps xmm4,dqword [g_ClearW] |
||
210 | orps xmm3,xmm4 |
||
211 | movaps xmm0,xmm3 |
||
212 | } |
||
213 | ;------------------------------------------------------------------------------- |
||
214 | ; NAME: qmul |
||
215 | ; IN: xmm0.xyzw first quaternion |
||
216 | ; IN: xmm1.xyzw second quaternion |
||
217 | ; OUT: xmm0.xyzw first quaternion multiplied by second quaternion |
||
218 | ;------------------------------------------------------------------------------- |
||
219 | macro qmul { |
||
220 | movaps xmm6,xmm0 ; q1.xyzw |
||
221 | movaps xmm7,xmm1 ; q2.xyzw |
||
222 | dot3 |
||
223 | movaps xmm4,xmm6 |
||
224 | movaps xmm5,xmm7 |
||
225 | shufps xmm4,xmm4,0xff ; q1.wwww |
||
226 | shufps xmm5,xmm5,0xff ; q2.wwww |
||
227 | movaps xmm1,xmm4 |
||
228 | mulps xmm1,xmm5 |
||
229 | subps xmm1,xmm0 |
||
230 | andps xmm1,dqword [g_ClearXYZ] |
||
231 | movaps [xxmm8],xmm1 ; r.000w |
||
232 | movaps xmm0,xmm6 |
||
233 | movaps xmm1,xmm7 |
||
234 | cross |
||
235 | mulps xmm7,xmm4 |
||
236 | mulps xmm6,xmm5 |
||
237 | addps xmm6,xmm7 |
||
238 | addps xmm0,xmm6 |
||
239 | andps xmm0,dqword [g_ClearW] |
||
240 | orps xmm0,[xxmm8] |
||
241 | } |
||
242 | ;------------------------------------------------------------------------------- |
||
243 | ; NAME: logss |
||
244 | ; IN: xmm0.x function argument |
||
245 | ; OUT: xmm0.x function result |
||
246 | ;------------------------------------------------------------------------------- |
||
247 | macro logss { |
||
248 | maxss xmm0,[g_MinNormPos] |
||
249 | movss xmm1,[g_1_0] |
||
250 | movd edx,xmm0 |
||
251 | andps xmm0,dqword [g_InvMantMask] |
||
252 | orps xmm0,xmm1 |
||
253 | movaps xmm4,xmm0 |
||
254 | subss xmm0,xmm1 |
||
255 | addss xmm4,xmm1 |
||
256 | shr edx,23 |
||
257 | rcpss xmm4,xmm4 |
||
258 | mulss xmm0,xmm4 |
||
259 | addss xmm0,xmm0 |
||
260 | movaps xmm2,xmm0 |
||
261 | mulss xmm0,xmm0 |
||
262 | sub edx,0x7f |
||
263 | movss xmm4,[g_log_p0] |
||
264 | movss xmm6,[g_log_q0] |
||
265 | mulss xmm4,xmm0 |
||
266 | movss xmm5,[g_log_p1] |
||
267 | mulss xmm6,xmm0 |
||
268 | movss xmm7,[g_log_q1] |
||
269 | addss xmm4,xmm5 |
||
270 | addss xmm6,xmm7 |
||
271 | movss xmm5,[g_log_p2] |
||
272 | mulss xmm4,xmm0 |
||
273 | movss xmm7,[g_log_q2] |
||
274 | mulss xmm6,xmm0 |
||
275 | addss xmm4,xmm5 |
||
276 | movss xmm5,[g_log_c0] |
||
277 | addss xmm6,xmm7 |
||
278 | cvtsi2ss xmm1,edx |
||
279 | mulss xmm0,xmm4 |
||
280 | rcpss xmm6,xmm6 |
||
281 | mulss xmm0,xmm6 |
||
282 | mulss xmm0,xmm2 |
||
283 | mulss xmm1,xmm5 |
||
284 | addss xmm0,xmm2 |
||
285 | addss xmm0,xmm1 |
||
286 | } |
||
287 | |||
288 | ;------------------------------------------------------------------------------- |
||
289 | ; NAME: QJuliaDist |
||
290 | ; IN: xmm0.xyz position |
||
291 | ; OUT: xmm0.xyzw distance to the nearest point in quaternion julia set |
||
292 | ;------------------------------------------------------------------------------- |
||
293 | align 64 |
||
294 | QJuliaDist: |
||
295 | Z equ ebp-16 |
||
296 | Zp equ ebp-32 |
||
297 | NormZ equ ebp-36 |
||
298 | NormZp equ ebp-40 |
||
299 | push ebp |
||
300 | mov ebp,esp |
||
301 | sub esp,64 |
||
302 | ; init Z and Zp |
||
303 | andps xmm0,dqword [g_ClearW] |
||
304 | shuf xmm0,xmm0,0,3,2,1 |
||
305 | movups [Z],xmm0 |
||
306 | movaps xmm1,dqword [g_UnitW] |
||
307 | movups [Zp],xmm1 |
||
308 | ; iterate |
||
309 | mov ecx,10 |
||
310 | .Iterate: |
||
311 | ; compute and update Zp |
||
312 | movups xmm0,[Z] |
||
313 | movups xmm1,[Zp] |
||
314 | qmul |
||
315 | addps xmm0,xmm0 |
||
316 | movups [Zp],xmm0 |
||
317 | ; compute and update Z |
||
318 | movups xmm0,[Z] |
||
319 | qsq |
||
320 | addps xmm0,dqword [g_Quat] |
||
321 | movups [Z],xmm0 |
||
322 | ; check if squared length of Z is greater than g_EscapeThreshold, |
||
323 | ; break the loop if it is |
||
324 | movaps xmm1,xmm0 |
||
325 | dot4 |
||
326 | movss xmm1,[g_EscapeThreshold] |
||
327 | cmpltss xmm1,xmm0 |
||
328 | movd eax,xmm1 |
||
329 | cmp eax,0xffffffff |
||
330 | je .IterateEnd |
||
331 | ; continue the loop |
||
332 | sub ecx,1 |
||
333 | test ecx,ecx |
||
334 | jnz .Iterate |
||
335 | .IterateEnd: |
||
336 | movups xmm0,[Z] |
||
337 | length4 |
||
338 | movss [NormZ],xmm0 |
||
339 | movups xmm0,[Zp] |
||
340 | length4 |
||
341 | movss [NormZp],xmm0 |
||
342 | movss xmm0,[NormZ] |
||
343 | logss |
||
344 | divss xmm0,[NormZp] |
||
345 | mulss xmm0,[NormZ] |
||
346 | mulss xmm0,[g_0_5] |
||
347 | shufps xmm0,xmm0,0x00 |
||
348 | mov esp,ebp |
||
349 | pop ebp |
||
350 | ; restore Z,Zp,NormZ,NormZp |
||
351 | ret |
||
352 | ;------------------------------------------------------------------------------- |
||
353 | ; NAME: Map |
||
354 | ; IN: xmm0.xyz position |
||
355 | ; OUT: xmm0.xyzw distance to the nearest object from input position |
||
356 | ; OUT: eax material ID of the nearest object |
||
357 | ;------------------------------------------------------------------------------- |
||
358 | align 64 |
||
359 | Map: |
||
360 | ; P equ ebp-16 |
||
361 | ; MinDist equ ebp-32 |
||
362 | MatID equ ebp-40 |
||
363 | push ebp |
||
364 | mov ebp,esp |
||
365 | sub esp,128 |
||
366 | movaps [.P],xmm0 |
||
367 | movaps xmm0,dqword [g_255_0] |
||
368 | movaps [.MinDist],xmm0 |
||
369 | mov dword [MatID],0 |
||
370 | ; QJulia |
||
371 | movaps xmm0,[.P] |
||
372 | call QJuliaDist |
||
373 | movaps xmm1,xmm0 |
||
374 | cmpltps xmm1,[.MinDist] |
||
375 | movd eax,xmm1 |
||
376 | cmp eax,0xffffffff |
||
377 | jne @f |
||
378 | movaps [.MinDist],xmm0 |
||
379 | mov dword [MatID],4 |
||
380 | @@: |
||
381 | ; sphere |
||
382 | movaps xmm0,[.P] |
||
383 | subps xmm0,dqword [g_UnitY] |
||
384 | length3 |
||
385 | subps xmm0,dqword [g_1_0] |
||
386 | movaps xmm1,xmm0 |
||
387 | cmpltps xmm1,[.MinDist] |
||
388 | movd eax,xmm1 |
||
389 | cmp eax,0xffffffff |
||
390 | jne @f |
||
391 | ;movaps [MinDist],xmm0 |
||
392 | ;mov dword [MatID],1 |
||
393 | @@: |
||
394 | ; plane |
||
395 | movaps xmm0,[.P] |
||
396 | movaps xmm1,dqword [g_UnitY] |
||
397 | dot3 |
||
398 | addps xmm0,dqword [g_1_0] |
||
399 | movaps xmm1,xmm0 |
||
400 | cmpltps xmm1,[.MinDist] |
||
401 | movd eax,xmm1 |
||
402 | cmp eax,0xffffffff |
||
403 | jne @f |
||
404 | movaps [.MinDist],xmm0 |
||
405 | mov dword [MatID],2 |
||
406 | @@: |
||
407 | ; box |
||
408 | xorps xmm0,xmm0 |
||
409 | subps xmm0,[.P] |
||
410 | maxps xmm0,[.P] |
||
411 | subps xmm0,dqword [g_BoxSize] |
||
412 | maxps xmm0,dqword [g_0_0] |
||
413 | length3 |
||
414 | subps xmm0,dqword [g_BoxEdge] |
||
415 | movaps xmm1,xmm0 |
||
416 | cmpltps xmm1,[.MinDist] |
||
417 | movd eax,xmm1 |
||
418 | cmp eax,0xffffffff |
||
419 | jne @f |
||
420 | ;movaps [MinDist],xmm0 |
||
421 | ;mov dword [MatID],3 |
||
422 | @@: |
||
423 | movaps xmm0,[.MinDist] |
||
424 | mov eax,[MatID] |
||
425 | mov esp,ebp |
||
426 | pop ebp |
||
427 | ret |
||
428 | align 16 |
||
429 | .P: |
||
430 | rd 4 |
||
431 | .MinDist: |
||
432 | rd 4 |
||
433 | |||
434 | ; restore P,MinDist,MatID |
||
435 | ;------------------------------------------------------------------------------- |
||
436 | ; NAME: CastRay |
||
437 | ; IN: xmm0.xyz ray origin |
||
438 | ; IN: xmm1.xyz ray direction |
||
439 | ; OUT: xmm0.xyzw distance from ray orgin to the nearest intersected object |
||
440 | ; or -1.0 if there is no intersection |
||
441 | ;------------------------------------------------------------------------------- |
||
442 | align 64 |
||
443 | CastRay: |
||
444 | ; RO equ ebp-16 |
||
445 | ; RD equ ebp-32 |
||
446 | ; T equ ebp-48 |
||
447 | MatID equ ebp-52 |
||
448 | push ebp |
||
449 | mov ebp,esp |
||
450 | sub esp,128 |
||
451 | ; init stack variables |
||
452 | movaps [.RO],xmm0 |
||
453 | movaps [.RD],xmm1 |
||
454 | xorps xmm0,xmm0 |
||
455 | movaps [.T],xmm0 |
||
456 | .March: |
||
457 | ; find distance to the nearest object |
||
458 | movaps xmm0,[.RD] |
||
459 | mulps xmm0,[.T] |
||
460 | addps xmm0,[.RO] |
||
461 | call Map |
||
462 | mov [MatID],eax |
||
463 | ; return if distance is less than g_HitDist |
||
464 | movaps xmm1,xmm0 |
||
465 | cmpltps xmm1,dqword [g_HitDist] |
||
466 | movd eax,xmm1 |
||
467 | cmp eax,0xffffffff |
||
468 | je .Hit |
||
469 | ; increment T with distance to the nearest object |
||
470 | movaps xmm1,[.T] |
||
471 | addps xmm1,xmm0 |
||
472 | movaps [.T],xmm1 |
||
473 | ; continue loop only if distance is less than g_MaxDist |
||
474 | cmpltps xmm1,dqword [g_MaxDist] |
||
475 | movd eax,xmm1 |
||
476 | cmp eax,0xffffffff |
||
477 | je .March |
||
478 | xorps xmm0,xmm0 |
||
479 | subps xmm0,dqword [g_1_0] |
||
480 | movaps [.T],xmm0 |
||
481 | mov dword [MatID],0 |
||
482 | .Hit: |
||
483 | movaps xmm0,[.T] |
||
484 | mov eax,[MatID] |
||
485 | mov esp,ebp |
||
486 | pop ebp |
||
487 | ret |
||
488 | align 16 |
||
489 | .RO: |
||
490 | rd 4 |
||
491 | .RD: |
||
492 | rd 4 |
||
493 | .T: |
||
494 | rd 4 |
||
495 | ; restore RO,RD,T,MatID |
||
496 | ;------------------------------------------------------------------------------- |
||
497 | ; NAME: CastShadowRay |
||
498 | ; IN: xmm0.xyz ray origin |
||
499 | ; IN: xmm1.xyz ray direction |
||
500 | ; OUT: xmm0.xyzw visibility factor [0.0, 1.0], |
||
501 | ; 0.0 means path is fully blocked, |
||
502 | ; 1.0 means path is fully clear |
||
503 | ;------------------------------------------------------------------------------- |
||
504 | align 64 |
||
505 | CastShadowRay: |
||
506 | ; RO equ ebp-16 |
||
507 | ; RD equ ebp-32 |
||
508 | R equ ebp-48 |
||
509 | ; T equ ebp-64 |
||
510 | push ebp |
||
511 | mov ebp,esp |
||
512 | sub esp,128 |
||
513 | ; init stack variables |
||
514 | movaps [.RO],xmm0 |
||
515 | movaps [.RD],xmm1 |
||
516 | movaps xmm0,dqword [g_0_01] |
||
517 | movaps [.T],xmm0 |
||
518 | movaps xmm0,dqword [g_1_0] |
||
519 | movups [R],xmm0 |
||
520 | .March: |
||
521 | ; find distance to the nearest object |
||
522 | movaps xmm0,[.RD] |
||
523 | mulps xmm0,[.T] |
||
524 | addps xmm0,[.RO] |
||
525 | call Map |
||
526 | ; return 0.0 if distance is less than g_ShadowHitDist |
||
527 | movaps xmm1,xmm0 |
||
528 | cmpltps xmm1,dqword [g_ShadowHitDist] |
||
529 | movd eax,xmm1 |
||
530 | cmp eax,0xffffffff |
||
531 | je .Hit |
||
532 | ; compute R |
||
533 | movaps xmm1,xmm0 |
||
534 | rcpps xmm2,[.T] |
||
535 | mulps xmm1,xmm2 |
||
536 | mulps xmm1,dqword [g_16_0] |
||
537 | movups xmm2,[R] |
||
538 | minps xmm2,xmm1 |
||
539 | movups [R],xmm2 |
||
540 | ; increment T with distance to the nearest object |
||
541 | movaps xmm1,[.T] |
||
542 | addps xmm1,xmm0 |
||
543 | movaps [.T],xmm1 |
||
544 | ; continue loop only if distance is less than g_ShadowMaxDist |
||
545 | cmpltps xmm1,dqword [g_ShadowMaxDist] |
||
546 | movd eax,xmm1 |
||
547 | cmp eax,0xffffffff |
||
548 | je .March |
||
549 | ; return (R,R,R,R) |
||
550 | movups xmm0,[R] |
||
551 | mov esp,ebp |
||
552 | pop ebp |
||
553 | ret |
||
554 | .Hit: |
||
555 | ; return (0,0,0,0) |
||
556 | xorps xmm0,xmm0 |
||
557 | mov esp,ebp |
||
558 | pop ebp |
||
559 | ret |
||
560 | ; restore RO,RD,R,T |
||
561 | align 16 |
||
562 | .RO: |
||
563 | rd 4 |
||
564 | .RD: |
||
565 | rd 4 |
||
566 | .T: |
||
567 | rd 4 |
||
568 | ;------------------------------------------------------------------------------- |
||
569 | ; NAME: ComputeNormal |
||
570 | ; IN: xmm0.xyz position |
||
571 | ; OUT: xmm0.xyz normal vector |
||
572 | ;------------------------------------------------------------------------------- |
||
573 | align 64 |
||
574 | ComputeNormal: |
||
575 | P equ ebp-16 |
||
576 | N equ ebp-32 |
||
577 | push ebp |
||
578 | mov ebp,esp |
||
579 | sub esp,128 |
||
580 | movups [P],xmm0 |
||
581 | ; compute x coordinate |
||
582 | addps xmm0,dqword [g_NormalDX] |
||
583 | call Map |
||
584 | movss [N+0],xmm0 |
||
585 | movups xmm0,[P] |
||
586 | subps xmm0,dqword [g_NormalDX] |
||
587 | call Map |
||
588 | movss xmm1,[N+0] |
||
589 | subss xmm1,xmm0 |
||
590 | movss [N+0],xmm1 |
||
591 | ; compute y coordinate |
||
592 | movups xmm0,[P] |
||
593 | addps xmm0,dqword [g_NormalDY] |
||
594 | call Map |
||
595 | movss [N+4],xmm0 |
||
596 | movups xmm0,[P] |
||
597 | subps xmm0,dqword [g_NormalDY] |
||
598 | call Map |
||
599 | movss xmm1,[N+4] |
||
600 | subss xmm1,xmm0 |
||
601 | movss [N+4],xmm1 |
||
602 | ; compute z coordinate |
||
603 | movups xmm0,[P] |
||
604 | addps xmm0,dqword [g_NormalDZ] |
||
605 | call Map |
||
606 | movss [N+8],xmm0 |
||
607 | movups xmm0,[P] |
||
608 | subps xmm0,dqword [g_NormalDZ] |
||
609 | call Map |
||
610 | movss xmm1,[N+8] |
||
611 | subss xmm1,xmm0 |
||
612 | movss [N+8],xmm1 |
||
613 | ; normalize |
||
614 | movups xmm0,[N] |
||
615 | normalize3 |
||
616 | mov esp,ebp |
||
617 | pop ebp |
||
618 | ret |
||
619 | ; restore P,N |
||
620 | ;------------------------------------------------------------------------------- |
||
621 | ; NAME: Shade |
||
622 | ; IN: xmm0.xyz position |
||
623 | ; IN: xmm1.xyz normal vector |
||
624 | ; IN: edi material ID |
||
625 | ; OUT: xmm0.xyz color |
||
626 | ;------------------------------------------------------------------------------- |
||
627 | align 64 |
||
628 | Shade: |
||
629 | ; P equ ebp-16 |
||
630 | ; N equ ebp-32 |
||
631 | ; RGB equ ebp-48 |
||
632 | C equ ebp-64 |
||
633 | NdotL equ ebp-80 |
||
634 | L equ ebp-96 |
||
635 | ; AOScale equ ebp-112 |
||
636 | ; AO equ ebp-128 |
||
637 | Temp equ ebp-144 |
||
638 | Idx equ ebp-148 |
||
639 | MatID equ ebp-152 |
||
640 | push ebp |
||
641 | mov ebp,esp |
||
642 | sub esp,256 |
||
643 | movaps [.P],xmm0 |
||
644 | movaps [.N],xmm1 |
||
645 | mov [MatID],edi |
||
646 | ; |
||
647 | ; AO |
||
648 | ; |
||
649 | xorps xmm0,xmm0 |
||
650 | movaps [.AO],xmm0 |
||
651 | movaps xmm0,dqword [g_10_0] |
||
652 | movaps [.AOscale],xmm0 |
||
653 | mov dword [Idx],0 |
||
654 | .AOLoop: |
||
655 | cvtsi2ss xmm0,[Idx] |
||
656 | shufps xmm0,xmm0,0x00 |
||
657 | mulps xmm0,xmm0 |
||
658 | mulps xmm0,dqword [g_0_015] |
||
659 | addps xmm0,dqword [g_0_01] |
||
660 | movups [Temp],xmm0 |
||
661 | mulps xmm0,[.N] |
||
662 | addps xmm0,[.P] |
||
663 | call Map |
||
664 | movups xmm1,[Temp] |
||
665 | subps xmm1,xmm0 |
||
666 | mulps xmm1,[.AOscale] |
||
667 | movaps xmm0,[.AO] |
||
668 | addps xmm0,xmm1 |
||
669 | movaps [.AO],xmm0 |
||
670 | movaps xmm0,[.AOscale] |
||
671 | mulps xmm0,dqword [g_0_5] |
||
672 | movaps [.AOscale],xmm0 |
||
673 | add dword [Idx],1 |
||
674 | cmp dword [Idx],5 |
||
675 | jne .AOLoop |
||
676 | movaps xmm0,[.AO] |
||
677 | maxps xmm0,dqword [g_0_0] |
||
678 | minps xmm0,dqword [g_1_0] |
||
679 | movaps xmm1,dqword [g_1_0] |
||
680 | subps xmm1,xmm0 |
||
681 | movaps [.AO],xmm1 |
||
682 | ; |
||
683 | ; Material ID Switch |
||
684 | ; |
||
685 | mov edi,[MatID] |
||
686 | cmp edi,1 |
||
687 | je .Mat1 |
||
688 | cmp edi,2 |
||
689 | je .Mat2 |
||
690 | jmp .MatDef |
||
691 | .Mat1: |
||
692 | movaps xmm0,dqword [g_Red] |
||
693 | movaps [.RGB],xmm0 |
||
694 | jmp .MatBreak |
||
695 | .Mat2: |
||
696 | movaps xmm0,dqword [g_Green] |
||
697 | movaps [.RGB],xmm0 |
||
698 | jmp .MatBreak |
||
699 | .MatDef: |
||
700 | movaps xmm0,dqword [g_1_0] |
||
701 | movaps [.RGB],xmm0 |
||
702 | .MatBreak: |
||
703 | ; |
||
704 | ; Light0 Contribution |
||
705 | ; |
||
706 | ; compute light vector and "N dot L" value |
||
707 | movaps xmm0,dqword [g_L0Pos] |
||
708 | subps xmm0,[.P] |
||
709 | normalize3 |
||
710 | movups [L],xmm0 |
||
711 | movups xmm1,[N] |
||
712 | dot3 |
||
713 | movups [NdotL],xmm0 |
||
714 | ; cast shadow ray |
||
715 | movaps xmm0,[.P] |
||
716 | movups xmm1,[L] |
||
717 | call CastShadowRay |
||
718 | movups xmm1,[NdotL] |
||
719 | mulps xmm0,xmm1 |
||
720 | mulps xmm0,dqword [g_0_6] |
||
721 | addps xmm0,dqword [g_0_4] |
||
722 | maxps xmm0,dqword [g_0_0] |
||
723 | mulps xmm0,dqword [g_0_7] |
||
724 | mulps xmm0,dqword [.RGB] |
||
725 | movups [C],xmm0 |
||
726 | ; |
||
727 | ; Light1 Contribution |
||
728 | ; |
||
729 | ; compute light vector and "N dot L" value |
||
730 | movaps xmm0,dqword [g_L1Pos] |
||
731 | subps xmm0,[.P] |
||
732 | normalize3 |
||
733 | movups [L],xmm0 |
||
734 | movaps xmm1,[.N] |
||
735 | dot3 |
||
736 | movups [NdotL],xmm0 |
||
737 | ; cast shadow ray |
||
738 | movaps xmm0,[.P] |
||
739 | movups xmm1,[L] |
||
740 | call CastShadowRay |
||
741 | movups xmm1,[NdotL] |
||
742 | mulps xmm0,xmm1 |
||
743 | mulps xmm0,dqword [g_0_6] |
||
744 | addps xmm0,dqword [g_0_4] |
||
745 | maxps xmm0,dqword [g_0_0] |
||
746 | mulps xmm0,dqword [g_0_3] |
||
747 | mulps xmm0,dqword [.RGB] |
||
748 | movups xmm1,[C] |
||
749 | addps xmm0,xmm1 |
||
750 | mulps xmm0,[.AO] |
||
751 | mov esp,ebp |
||
752 | pop ebp |
||
753 | ret |
||
754 | ; restore P,N,C,RGB,NdotL,L,AOScale,AO,Temp,Idx,MatID |
||
755 | align 16 |
||
756 | .N: |
||
757 | rd 4 |
||
758 | .P: |
||
759 | rd 4 |
||
760 | .RGB: |
||
761 | rd 4 |
||
762 | .AOscale: |
||
763 | rd 4 |
||
764 | .AO: |
||
765 | rd 4 |
||
766 | ;------------------------------------------------------------------------------- |
||
767 | ; NAME: ComputeColor |
||
768 | ; IN: xmm0.x normalized x coordinate |
||
769 | ; IN: xmm0.y normalized y coordinate |
||
770 | ; OUT: xmm0.xyz pixel color |
||
771 | ;------------------------------------------------------------------------------- |
||
772 | align 64 |
||
773 | ComputeColor: |
||
774 | ; X equ ebp-32 |
||
775 | ; Y equ ebp-48 |
||
776 | ; RD equ ebp-64 |
||
777 | P equ ebp-80 |
||
778 | N equ ebp-96 |
||
779 | MatID equ ebp-100 |
||
780 | push ebp |
||
781 | mov ebp,esp |
||
782 | sub esp,128 |
||
783 | ; save function parameters on the stack |
||
784 | shufps xmm0,xmm0,0x00 |
||
785 | shufps xmm1,xmm1,0x00 |
||
786 | movaps [.X],xmm0 |
||
787 | movaps [.Y],xmm1 |
||
788 | ; compute z axis |
||
789 | xorps xmm0,xmm0 |
||
790 | subps xmm0,dqword [g_CamPos] |
||
791 | normalize3 |
||
792 | movaps xmm7,xmm0 |
||
793 | ; compute x axis |
||
794 | movaps xmm0,dqword [g_UnitY] |
||
795 | movaps xmm1,xmm7 |
||
796 | cross |
||
797 | normalize3 |
||
798 | movaps xmm6,xmm0 |
||
799 | ; compute y axis |
||
800 | movaps xmm0,xmm7 |
||
801 | movaps xmm1,xmm6 |
||
802 | cross |
||
803 | normalize3 |
||
804 | ; compute ray direction |
||
805 | mulps xmm0,[.Y] |
||
806 | mulps xmm6,[.X] |
||
807 | movaps xmm1,xmm7 |
||
808 | mulps xmm1,dqword [g_0_5] |
||
809 | addps xmm7,xmm1 |
||
810 | addps xmm0,xmm6 |
||
811 | addps xmm0,xmm7 |
||
812 | normalize3 |
||
813 | movaps [.RD],xmm0 |
||
814 | ; cast ray |
||
815 | movaps xmm0,dqword [g_CamPos] |
||
816 | movaps xmm1,[.RD] |
||
817 | call CastRay |
||
818 | mov [MatID],eax |
||
819 | ; return if there is no intersection |
||
820 | movaps xmm1,xmm0 |
||
821 | cmpltps xmm0,dqword [g_0_0] |
||
822 | movd eax,xmm0 |
||
823 | cmp eax,0xffffffff |
||
824 | je .Return |
||
825 | ; compute intersection point |
||
826 | movaps xmm0,[.RD] |
||
827 | mulps xmm0,xmm1 |
||
828 | addps xmm0,dqword [g_CamPos] |
||
829 | movups [P],xmm0 |
||
830 | ; compute normal vector |
||
831 | call ComputeNormal |
||
832 | movups [N],xmm0 |
||
833 | ; shade |
||
834 | mov edi,[MatID] |
||
835 | movups xmm0,[P] |
||
836 | movups xmm1,[N] |
||
837 | call Shade |
||
838 | .Return: |
||
839 | mov esp,ebp |
||
840 | pop ebp |
||
841 | ret |
||
842 | ; restore X,Y,RD,P,N,MatID |
||
843 | align 16 |
||
844 | .X: |
||
845 | rd 4 |
||
846 | .Y: |
||
847 | rd 4 |
||
848 | .RD: |
||
849 | rd 4 |
||
850 | ;------------------------------------------------------------------------------- |
||
851 | ; NAME: Main |
||
852 | ; DESC: Program entry point. |
||
853 | ;------------------------------------------------------------------------------- |
||
854 | align 64 |
||
855 | Main: |
||
856 | ImgPtr equ ebp-8 |
||
857 | Img8Ptr equ ebp-16 |
||
858 | X equ ebp-20 |
||
859 | Y equ ebp-24 |
||
860 | mov ebp,esp |
||
861 | sub esp,128 |
||
862 | ; |
||
863 | ; generate floating point image |
||
864 | ; |
||
865 | mov dword [ImgPtr],screen16 |
||
866 | mov ebx,screen16 |
||
867 | ; begin loops |
||
868 | mov dword [Y],0 |
||
869 | .LoopY: |
||
870 | mov dword [X],0 |
||
871 | .LoopX: |
||
872 | ; compute normalized x coordinate [-1.777 , 1.777] |
||
873 | cvtsi2ss xmm0,[X] |
||
874 | divss xmm0,[g_ImgWidth] |
||
875 | subss xmm0,[g_0_5] |
||
876 | addss xmm0,xmm0 |
||
877 | mov eax,1.777 |
||
878 | movd xmm2,eax |
||
879 | mulss xmm0,xmm2 |
||
880 | ; compute normalized y coordinate [-1.0 , 1.0] |
||
881 | cvtsi2ss xmm1,[Y] |
||
882 | divss xmm1,[g_ImgHeight] |
||
883 | subss xmm1,[g_0_5] |
||
884 | addss xmm1,xmm1 |
||
885 | ; compute and write pixel color to the buffer |
||
886 | call ComputeColor |
||
887 | movaps [ebx],xmm0 |
||
888 | ; advance pixel pointer |
||
889 | add ebx,16 |
||
890 | ; continue .LoopX |
||
891 | add dword [X],1 |
||
892 | cmp dword [X],IMG_WIDTH |
||
893 | jne .LoopX |
||
894 | ; continue .LoopY |
||
895 | add dword [Y],1 |
||
896 | cmp dword [Y],IMG_HEIGHT |
||
897 | jne .LoopY |
||
898 | ; |
||
899 | ; convert image to 4 x 8 bpp |
||
900 | ; |
||
901 | mov dword [Img8Ptr],screen4 |
||
902 | ; set dst and src pointers and loop counter |
||
903 | mov edi,screen4 |
||
904 | mov esi,[ImgPtr] |
||
905 | mov ecx,IMG_WIDTH*IMG_HEIGHT |
||
906 | @@: |
||
907 | ; clamp to [0.0 ,1.0] |
||
908 | movaps xmm0,[esi] |
||
909 | maxps xmm0,dqword [g_0_0] |
||
910 | minps xmm0,dqword [g_1_0] |
||
911 | ; convert from [0.0 ,1.0] to [0 ,255] |
||
912 | mulps xmm0,dqword [g_255_0] |
||
913 | cvttps2dq xmm0,xmm0 |
||
914 | ; pshufb xmm0,dqword [g_ImageConvMask] |
||
915 | ; set alpha to 0xff |
||
916 | movd [edi],xmm0 |
||
917 | or dword [edi],0xff000000 |
||
918 | ; continue loop |
||
919 | add esi,16 |
||
920 | add edi,4 |
||
921 | sub ecx,1 |
||
922 | jnz @b |
||
923 | ;convert to 24 bit per pixel |
||
924 | mov esi,screen4 |
||
925 | mov edi,esi |
||
926 | mov ecx,IMG_WIDTH*IMG_HEIGHT |
||
927 | cld |
||
928 | @@: |
||
929 | lodsd |
||
930 | mov ah,al |
||
931 | push ax |
||
932 | ror eax,16 |
||
933 | pop ax |
||
934 | stosd |
||
935 | dec edi |
||
936 | loop @b |
||
937 | |||
938 | mov esp,ebp |
||
939 | |||
940 | ret |
||
941 | ; ********************************************* |
||
942 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
943 | ; ********************************************* |
||
944 | draw_window: |
||
945 | |||
946 | mcall 12, 1 ; function 12:tell os about windowdraw |
||
947 | |||
948 | mcall 48, 4 ;get skin width |
||
949 | lea ecx, [50*65536+IMG_HEIGHT+4+eax] ; [y start] *65536 + [y size] + [skin_height] |
||
950 | mcall 0,<50,IMG_WIDTH+9>,,0x74000000,,labelt ;draw window |
||
951 | |||
952 | mcall 12, 2 ; function 12:tell os about windowdraw |
||
953 | |||
954 | ret |
||
955 | |||
956 | |||
957 | |||
958 | ;------------------------------------------------------------------------------- |
||
959 | labelt: |
||
960 | db 'qjulia',0 |
||
961 | labelen: |
||
962 | |||
963 | align 4 |
||
964 | IMG_WIDTH = 800 |
||
965 | IMG_HEIGHT = 600 |
||
966 | g_ImgWidth dd 800.0 |
||
967 | g_ImgHeight dd 600.0 |
||
968 | g_EscapeThreshold dd 16.0 |
||
969 | g_MinNormPos dd 0x00800000 |
||
970 | g_log_p0 dd -0.789580278884799154124 |
||
971 | g_log_p1 dd 16.3866645699558079767 |
||
972 | g_log_p2 dd -64.1409952958715622951 |
||
973 | g_log_q0 dd -35.6722798256324312549 |
||
974 | g_log_q1 dd 312.093766372244180303 |
||
975 | g_log_q2 dd -769.691943550460008604 |
||
976 | g_log_c0 dd 0.693147180559945 |
||
977 | |||
978 | align 16 |
||
979 | ;g_ImageConvMask db 8,4,0,12,12 dup 0x80 |
||
980 | g_InvMantMask dd 4 dup (not 0x7f800000) |
||
981 | g_0_0 dd 4 dup 0.0 |
||
982 | g_0_5 dd 4 dup 0.5 |
||
983 | g_1_0 dd 4 dup 1.0 |
||
984 | g_255_0 dd 4 dup 255.0 |
||
985 | g_16_0 dd 4 dup 128.0 |
||
986 | g_10_0 dd 4 dup 10.0 |
||
987 | g_0_6 dd 4 dup 0.6 |
||
988 | g_0_4 dd 4 dup 0.4 |
||
989 | g_0_7 dd 4 dup 0.7 |
||
990 | g_0_3 dd 4 dup 0.3 |
||
991 | g_0_01 dd 4 dup 0.01 |
||
992 | g_0_015 dd 4 dup 0.015 |
||
993 | g_CamPos dd 1.2,1.4,1.2,1.0 |
||
994 | g_UnitY dd 0.0,1.0,0.0,0.0 |
||
995 | g_UnitW dd 0.0,0.0,0.0,1.0 |
||
996 | g_HitDist dd 4 dup 0.001 |
||
997 | g_ShadowHitDist dd 4 dup 0.0005 |
||
998 | g_ShadowMaxDist dd 4 dup 10.0 |
||
999 | g_MaxDist dd 4 dup 40.0 |
||
1000 | g_NormalDX dd 0.001,0.0,0.0,0.0 |
||
1001 | g_NormalDY dd 0.0,0.001,0.0,0.0 |
||
1002 | g_NormalDZ dd 0.0,0.0,0.001,0.0 |
||
1003 | g_L0Pos dd 10.0,8.0,-6.0,1.0 |
||
1004 | g_L1Pos dd -12.0,19.0,6.0,1.0 |
||
1005 | g_Red dd 1.0,1.0,1.0,1.0 |
||
1006 | g_Green dd 1.0,1.0,1.0,1.0 |
||
1007 | g_BoxSize dd 1.5,1.0,1.5,1.0 |
||
1008 | g_BoxEdge dd 4 dup 0.03 |
||
1009 | g_ClearXYZ dd 0x00000000,0x00000000,0x00000000,0xffffffff |
||
1010 | g_ClearW dd 0xffffffff,0xffffffff,0xffffffff,0x00000000 |
||
1011 | g_Quat dd 0.2,0.0,0.0,-1.0 |
||
1012 | IMG_END: |
||
1013 | align 16 |
||
1014 | screen16 rb IMG_WIDTH*IMG_HEIGHT*16 |
||
1015 | align 16 |
||
1016 | screen4 rb IMG_WIDTH*IMG_HEIGHT*4 |
||
1017 | align 16 |
||
1018 | xxmm8: |
||
1019 | rd 4 |
||
1020 | memStack: |
||
1021 | rd 65536 |
||
1022 | align 16 |
||
1023 | I_END:50,IMG_WIDTH+9> |