Subversion Repositories Kolibri OS

Rev

Rev 1881 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1880 mario79 1
;---------------------------------------------------------------------
2
; Free3D version 0.5
3
;
4
; last update:  20/02/2011
5
; written by:   Marat Zakiyanov aka Mario79, aka Mario
6
; changes:      PNG textures 128x128
7
;               using libraries cnv_png.obj and archiver.obj
8
;               using dinamically allocation of memory
9
;
10
;---------------------------------------------------------------------
11
;
12
;   Fisheye Raycasting Engine Etc. FREE3D for MENUETOS by Dieter Marfurt
13
;   Version 0.4 (requires some texture-files to compile (see Data Section))
14
;   dietermarfurt@angelfire.com - www.melog.ch/mos_pub/
15
;   Don't hit me - I'm an ASM-Newbie... since years :)
16
;
17
;   Compile with FASM for Menuet (requires .INC files - see DATA Section)
18
;
19
;   Willow - greatly srinked code size by using GIF texture and FPU to calculate sine table
20
;
21
;   !!!! Don't use GIF_LITE.INC in your apps - it's modified for FREE3D !!!!
22
;
23
;   Heavyiron - new 0-function of drawing window from kolibri (do not work correctly with menuet)
24
 
25
TEX_SIZE	equ	128*128*4	;64*64*4	;
26
 
27
ICON_SIZE_X	equ	128	;64
28
ICON_SIZE_Y	equ	128	;64
29
 
30
Floors_Height	equ	32000
31
;ceil	=	sinus+TEX_SIZE	;16*1024
32
;wall	=	ceil+TEX_SIZE*1
33
;wall2	=	ceil+TEX_SIZE*2
34
;wall3	=	ceil+TEX_SIZE*3
35
;wall4	=	ceil+TEX_SIZE*4
36
;wall5	=	ceil+TEX_SIZE*5
37
;wall6	=	ceil+TEX_SIZE*6
38
;wall7	=	ceil+TEX_SIZE*7
39
;APP_MEM	equ	0x400000
40
;---------------------------------------------------------------------
41
use32
42
org	0x0
43
	db 'MENUET01'	; 8 byte id
44
	dd 0x01		; header version
45
	dd START	; start of code
46
	dd IM_END	; size of image
47
	dd I_END	; 0x100000 ; memory for app
48
	dd stacktop	; 0x100000 ; esp
49
	dd 0x0
50
	dd path
51
;---------------------------------------------------------------------
52
include '..\..\..\macros.inc'
53
;include	'macros.inc'
54
include '../../../develop/libraries/box_lib/load_lib.mac'
55
;include 'load_lib.mac'
56
@use_library
57
;COLOR_ORDER	equ OTHER
58
;include		'gif_lite.inc'
59
;---------------------------------------------------------------------
60
START:	; start of execution
61
	mcall	68,11
62
 
63
load_libraries	l_libs_start,end_l_libs
64
	test	eax,eax
65
	jnz	finish
66
 
67
; unpack deflate
68
	mov	eax,[unpack_DeflateUnpack2]
69
	mov	[deflate_unpack],eax
70
 
71
	call	load_icons
72
	call	convert_icons
73
 
74
	mov	esi,sinus
75
	mov	ecx,360*10
76
	fninit
77
	fld	[sindegree]
78
;--------------------------------------
79
.sinlp:
80
	fst	st1
81
	fsin
82
	fmul	[sindiv]
83
	fistp	dword[esi]
84
	add	esi,4
85
	fadd	[sininc]
86
	loop	.sinlp
87
	call	draw_window	; at first, draw the window
88
	call	draw_stuff
89
;--------------------------------------
90
align	4
91
gamestart:
92
; ******* MOUSE CHECK *******
93
;	mov	eax,37	; check mouse (use mouse over window to navigate)
94
;	mov	ebx,2	; check mousebuttons
95
;	mcall
96
;	cmp	eax,0	; only use mouse when button down
97
;	je	noneed	; deactivated cause of disappear-bug etc.
98
 
99
	mcall	37,1	; check	mouseposition
100
	mov	ebx,eax
101
	shr	eax,16
102
	and	eax,0x0000FFFF	; mousex
103
	and	ebx,0x0000FFFF	; mousey
104
 
105
	cmp	eax,5	; mouse out of window ?
106
	jb	check_refresh	; it will prevent an app-crash
107
 
108
	cmp	ebx,22
109
	jb	check_refresh
110
 
111
	cmp	eax,640
112
	jg	check_refresh
113
 
114
	cmp	ebx,501
115
	jg	check_refresh
116
 
117
	cmp	eax,315	; navigating?
118
	jb	m_left
119
 
120
	cmp	eax,325	;
121
	jg	m_right
122
;--------------------------------------
123
continue:
124
	cmp	ebx,220	;
125
	jb	s_up
126
 
127
	cmp	ebx,260	;
128
	jg	s_down
129
;--------------------------------------
130
;   ******* END OF MOUSE CHECK *******
131
align	4
132
check_refresh:
133
 
134
;	mov	eax,23	; wait for system event with 10 ms timeout
135
;	mov	ebx,1	; thats max 100 FPS
136
	mcall	11	; ask no wait for full speed
137
 
138
	cmp	eax,1	; window redraw request ?
139
	je	red2
140
 
141
	cmp	eax,2	; key in buffer ?
142
	je	key2
143
 
144
	cmp	eax,3	; button in buffer ?
145
	je	button2
146
 
147
	mov	edi,[mouseya]	; check flag if a refresh has to be done
148
	cmp	edi,1
149
	jne	gamestart
150
 
151
	mov	[mouseya],dword 0
152
	call	draw_stuff
153
	jmp	gamestart
154
;---------------------------------------------------------------------
155
align	4
156
red2:	; redraw
157
	call	draw_window
158
	call	draw_stuff
159
	jmp	gamestart
160
;---------------------------------------------------------------------
161
align	4
162
key2:	; key
163
	mcall	2
164
	cmp	al,1
165
	je	gamestart	; keybuffer empty
166
 
167
	cmp	ah,27	; esc=End App
168
	je	finish
169
 
170
	cmp	ah,178	; up
171
	je	s_up
172
 
173
	cmp	ah,177	; down
174
	je	s_down
175
 
176
	cmp	ah,176	; left
177
	je	s_left
178
 
179
	cmp	ah,179	; right
180
	je	s_right
181
 
182
	jmp	gamestart	; was any other key
183
;---------------------------------------------------------------------
184
align	4
185
s_up:	; walk forward (key or mouse)
186
	mov	eax,[vpx]
187
	mov	ebx,[vpy]
188
 
189
	mov	ecx,[vheading]
190
	mov	edi,[sinus+ecx*4]
191
 
192
	mov	edx,[vheading]
193
	lea	edx,[sinus+3600+edx*4]
194
	cmp	edx,eosinus	;cosinus taken from (sinus plus 900) mod 3600
195
	jb	ok200
196
 
197
	sub	edx,14400
198
;--------------------------------------
199
ok200:
200
	mov	esi,[edx]
201
;	sal	esi,1	; edit walking speed here
202
;	sal	edi,1
203
	add	eax,edi	; newPx
204
	add	ebx,esi	; newPy
205
	mov	edi,eax	; newPx / ffff
206
	mov	esi,ebx	; newPy / ffff
207
	sar	edi,16
208
	sar	esi,16
209
	mov	ecx,esi
210
	sal	ecx,5	; equal *32
211
	lea	ecx,[grid+ecx+edi]
212
	cmp	[ecx],byte 0	; collision check
213
	jne	cannotwalk0
214
	mov	[vpx],eax
215
	mov	[vpy],ebx
216
	mov	[mouseya],dword 1	; set refresh	flag
217
;--------------------------------------
218
cannotwalk0:
219
	jmp	check_refresh
220
;---------------------------------------------------------------------
221
align	4
222
s_down:	; walk	backward
223
	mov	eax,[vpx]
224
	mov	ebx,[vpy]
225
	mov	ecx,[vheading]
226
	mov	edi,[sinus+ecx*4]
227
	mov	edx,[vheading]
228
	lea	edx,[sinus+3600+edx*4]
229
	cmp	edx,eosinus	; cosinus taken from (sinus plus 900) mod 3600
230
	jb	ok201
231
	sub	edx,14400
232
;--------------------------------------
233
ok201:
234
	mov	esi,[edx]
235
;	sal	esi,1	; edit walking speed here
236
;	sal	edi,1
237
	sub	eax,edi	; newPx
238
	sub	ebx,esi	; newPy
239
	mov	edi,eax	; newPx / ffff
240
	mov	esi,ebx	; newPy / ffff
241
	sar	edi,16
242
	sar	esi,16
243
	mov	ecx,esi
244
	sal	ecx,5
245
	lea	ecx,[grid+ecx+edi]
246
	cmp	[ecx],byte 0
247
	jne	cannotwalk1
248
	mov	[vpx],eax
249
	mov	[vpy],ebx
250
	mov	[mouseya],dword 1
251
;--------------------------------------
252
cannotwalk1:
253
	jmp	check_refresh
254
;---------------------------------------------------------------------
255
align	4
256
s_left:	; turn	left	(key)
257
	mov	edi,[vheading]	; heading
258
	add	edi,50
259
	cmp	edi,3600
260
	jb	ok_heading0
261
 
262
	sub	edi,3600
263
;--------------------------------------
264
ok_heading0:
265
	mov	[vheading],edi
266
	mov	[mouseya],dword 1
267
	jmp	check_refresh
268
;---------------------------------------------------------------------
269
align	4
270
s_right:	; turn	right
271
	mov	edi,[vheading]
272
	sub	edi,50
273
	cmp	edi,-1
274
	jg	ok_heading1
275
 
276
	add	edi,3600
277
;--------------------------------------
278
ok_heading1:
279
	mov	[vheading],edi
280
	mov	[mouseya],dword 1
281
	jmp	check_refresh
282
;---------------------------------------------------------------------
283
align	4
284
m_left:	; turn	left	(mouse)
285
	mov	edi,[vheading]	; heading
286
	mov	ecx,315
287
	sub	ecx,eax
288
	sar	ecx,2
289
	add	edi,ecx
290
	cmp	edi,3600
291
	jb	ok_heading2
292
 
293
	sub	edi,3600
294
;--------------------------------------
295
ok_heading2:
296
	mov	[vheading],edi
297
	mov	[mouseya],dword 1
298
	jmp	continue	; allow both: walk and rotate
299
;---------------------------------------------------------------------
300
align	4
301
m_right:	; turn right
302
	mov	edi,[vheading]
303
	sub	eax,325
304
	sar	eax,2
305
	sub	edi,eax
306
	cmp	edi,-1
307
	jg	ok_heading3
308
 
309
	add	edi,3600
310
;--------------------------------------
311
ok_heading3:
312
	mov	[vheading],edi
313
	mov	[mouseya],dword 1
314
	jmp	continue
315
;---------------------------------------------------------------------
316
align	4
317
button2:	; button
318
	mcall	17
319
	cmp	ah,1	; button id=1 ?
320
	jne	gamestart
321
;--------------------------------------
322
finish:
323
	mcall	-1	; close this program
324
;---------------------------------------------------------------------
325
;   *********************************************
326
;   *******  WINDOW DEFINITIONS AND DRAW ********
327
;   *********************************************
328
align	4
329
draw_window:
330
	mcall	12,1
331
	xor	eax,eax
332
	xor	esi,esi
333
	mcall	,<50,649>,<50,506>,0x74ffffff,,title
334
	mcall	12,2
335
	ret
336
;---------------------------------------------------------------------
337
;   *********************************************
338
;   *******       COMPUTE 3D-VIEW        ********
339
;   *********************************************
340
align	4
341
draw_stuff:
342
	mov	[step1],dword 1
343
;	mov	[step64],dword 64
344
	mov	esi,[vheading]
345
	add	esi,320
346
	mov	[va],esi
347
	mov	eax,[vheading]
348
	sub	eax,320
349
	mov	[vacompare],eax
350
;------------------------------------ CAST 640 PIXEL COLUMNS ---------------
351
; FOR A=320+heading to -319+heading step -1 (a is stored in [va])
352
;---------------------------------------------------------------------------
353
;	mov	edx,5
354
	mov	[vx1],dword 0	;5 ;edx ; init x1 ... pixelcolumn
355
;--------------------------------------
356
align	4
357
for_a:
358
	mov	edx,[vx1]
359
	mov	[vx1b],edx
360
	sub	[vx1b],dword 320
361
	mov	edx,[va]	; a2
362
	cmp	edx,-1	; a2 is a mod 3600
363
	jg	ok1
364
 
365
	add	edx,3600
366
;--------------------------------------
367
ok1:
368
	cmp	edx,3600
369
	jb	ok2
370
 
371
	sub	edx,3600
372
;--------------------------------------
373
ok2:
374
; get stepx and stepy
375
	; pointer to stepx
376
	lea	ecx,[sinus+edx*4]
377
	mov	esi,[ecx]
378
	sar	esi,4	; accuracy
379
	mov	[vstepx],esi	; store stepx
380
	lea	esi,[sinus+3600+edx*4]
381
	cmp	esi,eosinus	;cosinus taken from ((sinus plus 900) mod 3600)
382
	jb	ok202
383
 
384
	sub	esi,14400
385
;--------------------------------------
386
ok202:
387
	mov	ecx,[esi]
388
	sar	ecx,4
389
	mov	[vstepy],ecx	; store	stepy
390
 
391
	mov	eax,[vpx]	; get Camera Position
392
	mov	ebx,[vpy]
393
	mov	[vxx],eax	; init caster position
394
	mov	[vyy],ebx
395
 
396
	mov	edi,0	; init L (number of raycsting-steps)
397
	mov	[step1],dword 1	; init Caster stepwidth for L.
398
;--------------------------------------
399
;  raycast a pixel column
400
align	4
401
raycast:
402
	add	edi,[step1]	; count caster steps
403
	jmp	nodouble	; use this to prevent blinking/wobbling textures: much slower!
404
 
405
;	cmp	edi,32
406
;	je	double
407
 
408
;	cmp	edi,512
409
;	je	double
410
 
411
;	cmp	edi,1024
412
;	je	double
413
 
414
;	jmp	nodouble
415
;---------------------------------------------------------------------
416
;double:
417
;	mov	edx,[step1]
418
;	sal	edx,1
419
;	mov	[step1],edx
420
 
421
;	mov	edx,[vstepx]
422
;	sal	edx,1
423
;	mov	[vstepx],edx
424
 
425
;	mov	edx,[vstepy]
426
;	sal	edx,1
427
;	mov	[vstepy],edx
428
;--------------------------------------
429
nodouble:
430
	mov	eax,Floors_Height	;32000	; 3600 ; determine Floors Height based on distance
431
	xor	edx,edx
432
	mov	ebx,edi
433
 
434
	div	ebx
435
 
436
	shl	edx,1
437
	cmp	ebx,edx
438
	jae	@f
439
	inc	eax
440
@@:
441
 
442
	mov	esi,eax
443
	mov	[vdd],esi
444
	mov	edx,260
445
	sub	edx,esi
446
	mov	[vh],edx
447
 
448
	cmp	edx,22
449
	jb	no_nu_pixel
450
 
451
	cmp	edx,259
452
	jg	no_nu_pixel	; draw only new pixels
453
 
454
	cmp	edx,[h_old]
455
	je	no_nu_pixel
456
 
457
	mov	eax,[vxx]	; calc floor pixel
458
	mov	ebx,[vyy]
459
 
460
	and	eax,0x0000FFFF
461
	and	ebx,0x0000FFFF
462
 
463
	shr	eax,10
464
	shr	ebx,10	; pixel coords inside Texture x,y 64*64
465
	mov	[xfrac],eax
466
	mov	[yfrac],ebx
467
; plot floor pixel !!!!
468
	mov	[vl],edi	; save L
469
	mov	[ytemp],esi	; remember L bzw. H
470
 
471
	mov	edi,[yfrac]	; get pixel color of this floor pixel
472
	sal	edi,9	;8 - for 64x64
473
	mov	esi,[xfrac]
474
	sal	esi,3	;2 - for 64x64
475
; in fact its floor, just using the wall texture :)
476
;	lea	edi,[wall+edi+esi]
477
	add	edi,[wall1]
478
	add	edi,esi
479
	mov	edx,[edi]
480
	mov	[remesi],esi
481
;**** calculate pixel adress:****
482
	mov	esi,[ytemp]
483
	add	esi,240
484
	imul	esi,1920
485
	mov	eax,[vx1]
486
	lea	eax,[eax+eax*2]
487
	lea	esi,[screen_buffer+eax+esi]
488
 
489
	cmp	esi,screen_buffer+1920*480
490
	jg	foff0
491
 
492
	cmp	esi,screen_buffer
493
	jb	foff0
494
; now we have the adress of the floor-pixel color in edi
495
; and the adress of the pixel in the image in esi
496
	mov	edx,[edi]
497
;******************** custom distance DARKEN Floor
498
	mov	eax,[vdd]
499
;	jmp	nodark0	; use this to deactivate darkening floor (a bit faster)
500
 
501
	cmp	eax,80
502
	jg	nodark0
503
; split	rgb
504
	mov	[blue],edx
505
	and	[blue],dword 255
506
 
507
	shr	edx,8
508
	mov	[green],edx
509
	and	[green],dword 255
510
 
511
	shr	edx,8
512
	mov	[red],edx
513
	and	[red],dword 255
514
 
515
	mov	eax,81	; darkness parameter
516
	sub	eax,[vdd]
517
	sal	eax,1
518
; reduce rgb
519
	sub	[red],eax
520
	cmp	[red],dword 0
521
	jg	notblack10
522
 
523
	mov	[red],dword 0
524
;--------------------------------------
525
notblack10:
526
	sub	[green],eax
527
	cmp	[green],dword 0
528
	jg	notblack20
529
 
530
	mov	[green],dword 0
531
;--------------------------------------
532
notblack20:
533
	mov	edx,[blue]
534
	sub	[blue],eax
535
	cmp	[blue],dword 0
536
	jg	notblack30
537
 
538
	mov	[blue],dword 0
539
;--------------------------------------
540
notblack30:
541
	shl	dword [red],16	; reassemble rgb
542
	shl	dword [green],8
543
	mov	edx,[red]
544
	or	edx,[green]
545
	or	edx,[blue]
546
;--------------------------------------
547
nodark0:
548
;   eo custom darken floor
549
	mov	eax,edx
550
 
551
;	cmp	esi,screen_buffer+1920*480
552
;	ja	foff0
553
 
554
;	cmp	esi,screen_buffer
555
;	jb	foff0
556
 
557
	mov	[esi],eax	; actually draw the floor pixel
558
; paint "forgotten" pixels
559
	mov	edx,[lasty]
560
	sub	edx,1920
561
	cmp	esi,edx
562
	je	foff0
563
 
564
	mov	[esi+1920],eax
565
	sub	edx,1920
566
	cmp	esi,edx
567
	je	foff0
568
 
569
	mov	[edx+1920],eax
570
	sub	edx,1920
571
	cmp	esi,edx
572
	je	foff0
573
 
574
	mov	[edx+1920],eax
575
;--------------------------------------
576
align	4
577
foff0:
578
	mov	[lasty],esi
579
;**** end of draw floor pixel ****
580
	mov	esi,[remesi]
581
	mov	edi,[vl]	; restore L
582
;--------------------------------------
583
no_nu_pixel:
584
	mov	esi,[vh]
585
	mov	[h_old],esi
586
 
587
	mov	eax,[vxx]
588
	mov	ebx,[vyy]
589
 
590
	add	eax,[vstepx]	; casting...
591
	add	ebx,[vstepy]
592
 
593
	mov	[vxx],eax
594
	mov	[vyy],ebx
595
 
596
	sar	eax,16
597
	sar	ebx,16
598
 
599
	mov	[vpxi],eax	; casters position in Map Grid
600
	mov	[vpyi],ebx
601
 
602
	mov	edx,ebx
603
	shl	edx,5
604
	lea	edx,[grid+edx+eax]
605
 
606
	cmp	[edx],byte 0	; raycaster reached a wall? (0=no)
607
	jne	getout
608
 
609
	cmp	edi,10000	; limit view range
610
	jb	raycast
611
;--------------------------------------
612
getout:
613
	mov	eax,[edx]	; store Grid Wall Value for Texture Selection
614
	mov	[vk],eax
615
	call	blur	; deactivate this (blurs the near floor) : a bit faster
616
 
617
; simply copy floor to ceil pixel column here
618
;	jmp	nocopy	; use this for test purposes
619
	pusha
620
	mov	eax,screen_buffer+1920*240
621
	mov	ebx,eax	;screen_buffer+1920*240
622
;--------------------------------------
623
align	4
624
copyfloor:
625
	sub	eax,1920
626
	add	ebx,1920
627
	mov	ecx,[vx1]
628
	lea	ecx,[ecx+ecx*2]
629
	lea	edx,[ecx+ebx]
630
	add	ecx,eax
631
	mov	esi,[edx]
632
	mov	[ecx],esi
633
	cmp	eax,screen_buffer
634
	jg	copyfloor
635
;@@:
636
	popa
637
; *** end of copy floor to ceil
638
;nocopy:
639
;--------------------------------------
640
; draw this pixelrows wall
641
	mov	[vl],edi
642
	mov	edi,260
643
	sub	edi,[vdd]
644
	cmp	edi,0
645
	jg	ok3
646
 
647
	xor	edi,edi
648
;--------------------------------------
649
ok3:
650
	mov	[vbottom],edi	; end wall ceil (or window top)
651
	mov	esi,262
652
	add	esi,[vdd]	; start wall floor
653
	xor	edi,edi
654
; somethin is wrong with xfrac,so recalc...
655
	mov	eax,[vxx]
656
	and	eax,0x0000FFFF
657
	shr	eax,10
658
	mov	[xfrac],eax
659
 
660
	mov	eax,[vyy]
661
	and	eax,0x0000FFFF
662
	shr	eax,10
663
	mov	[yfrac],eax
664
;--------------------------------------
665
pixelrow:
666
; find each pixels color:
667
	add	edi,ICON_SIZE_Y
668
	sub	esi,1
669
	cmp	esi,502		; dont calc offscreen-pixels
670
	jg	speedup
671
 
672
	xor	edx,edx
673
	mov	eax,edi
674
	mov	ebx,[vdd]
675
;	add	ebx,ebx
676
	shl	ebx,1
677
	div	ebx
678
 
679
	shl	edx,1
680
	cmp	ebx,edx
681
	jae	@f
682
	inc	eax
683
@@:
684
	and	eax,ICON_SIZE_Y-1
685
	mov	[ytemp],eax	; get y of texture for wall
686
 
687
	mov	eax,[xfrac]
688
	add	eax,[yfrac]
689
	and	eax,ICON_SIZE_X-1
690
	mov	[xtemp],eax	; get x of texture for wall
691
; now prepare to plot that wall-pixel...
692
	mov	[remedi],edi
693
	mov	edi,[ytemp]
694
	sal	edi,9	;8 - for 64x64
695
	mov	edx,[xtemp]
696
	sal	edx,3	;2 - for 64x64
697
	add	edi,edx
698
	mov	eax,[vk]	; determine which texture should be used
699
	and	eax,255
700
 
701
	cmp	eax,1
702
	jne	checkmore1
703
 
704
	add	edi,[wall0]	;ceil
705
	jmp	foundtex
706
;---------------------------------------------------------------------
707
align	4
708
checkmore1:
709
	cmp	eax,2
710
	jne	checkmore2
711
 
712
	add	edi,[wall1]
713
	jmp	foundtex
714
;---------------------------------------------------------------------
715
align	4
716
checkmore2:
717
	cmp	eax,3
718
	jne	checkmore3
719
 
720
	add	edi,[wall2]
721
	jmp	foundtex
722
;---------------------------------------------------------------------
723
align	4
724
checkmore3:
725
	cmp	eax,4
726
	jne	checkmore4
727
 
728
	add	edi,[wall3]
729
	jmp	foundtex
730
;---------------------------------------------------------------------
731
align	4
732
checkmore4:
733
	cmp	eax,5
734
	jne	checkmore5
735
 
736
	add	edi,[wall4]
737
	jmp	foundtex
738
;---------------------------------------------------------------------
739
align	4
740
checkmore5:
741
	cmp	eax,6
742
	jne	checkmore6
743
 
744
	add	edi,[wall5]
745
	jmp	foundtex
746
;---------------------------------------------------------------------
747
align	4
748
checkmore6:
749
	cmp	eax,7
750
	jne	checkmore7
751
 
752
	add	edi,[wall6]
753
	jmp	foundtex
754
;---------------------------------------------------------------------
755
align	4
756
checkmore7:
757
	cmp	eax,8
758
	jne	checkmore8
759
 
760
	add	edi,[wall7]
761
	jmp	foundtex
762
;---------------------------------------------------------------------
763
align	4
764
checkmore8:
765
foundtex:
766
	mov	edx,[edi]	; get pixel color inside texture
767
; ***pseudoshade south-west
768
;	jmp	east	; activate this for southwest pseudoshade : a bit slower + blink-bug
769
;---------------------------------------------------------------------
770
;	mov	edi,[yfrac]
771
;	mov	[pseudo],dword 0	; store flag for custom distance darkening
772
;	cmp	edi,[xfrac]
773
;	jge	east
774
 
775
;	and	edx,0x00FEFEFE
776
;	shr	edx,1
777
;	mov	[pseudo],dword 1
778
;--------------------------------------
779
east:
780
	call	dark_distance	; deactivate wall distance darkening: a bit faster
781
; ******* DRAW WALL PIXEL *******
782
	mov	eax,esi
783
	lea	eax,[esi-22]
784
	imul	eax,1920
785
	mov	ebx,[vx1]
786
	lea	ebx,[ebx+ebx*2]
787
	lea	eax,[eax+screen_buffer+ebx]
788
 
789
	cmp	eax,screen_buffer+1920*480
790
	ja	dont_draw
791
 
792
	cmp	eax,screen_buffer
793
	jb	dont_draw
794
 
795
	mov	[eax],edx	; actually set the pixel in the image
796
;--------------------------------------
797
; *** eo draw wall pixel
798
dont_draw:
799
	mov	edi,[remedi]
800
;--------------------------------------
801
speedup:
802
	cmp	esi,[vbottom]	; end of this column?
803
	jg	pixelrow
804
 
805
	mov	edi,[vl]	; restoring
806
	mov	eax,[vx1]	; inc X1
807
	add	eax,1
808
	mov	[vx1],eax
809
;*** NEXT A ***
810
	mov	esi,[va]
811
	sub	esi,1
812
	mov	[va],esi
813
	cmp	esi,[vacompare]
814
	jg	for_a
815
;*** EO NEXT A ***
816
;--------------------------------------
817
; **** put image !!!!!****
818
	xor	edx,edx
819
	mcall	7,screen_buffer,<640,480>
820
	ret
821
;---------------------------------------------------------------------
822
align	4
823
blur:
824
	pusha
825
	mov	eax,screen_buffer+360*1920
826
;--------------------------------------
827
align	4
828
copyfloor2:
829
	add	eax,1920
830
	mov	ebx,[vx1]
831
	lea	ebx,[ebx+ebx*2]
832
	add	ebx,eax
833
 
834
	mov	ecx,[ebx-15]
835
	and	ecx,0x00FEFEFE
836
	shr	ecx,1
837
 
838
	mov	edx,[ebx-12]
839
	and	edx,0x00FEFEFE
840
	shr	edx,1
841
	add	edx,ecx
842
	and	edx,0x00FEFEFE
843
	shr	edx,1
844
 
845
	mov	ecx,[ebx-9]
846
	and	ecx,0x00FEFEFE
847
	shr	ecx,1
848
	add	edx,ecx
849
 
850
	and	edx,0x00FEFEFE
851
	shr	edx,1
852
 
853
	mov	ecx,[ebx-6]
854
	and	ecx,0x00FEFEFE
855
	shr	ecx,1
856
	add	edx,ecx
857
 
858
	and	edx,0x00FEFEFE
859
	shr	edx,1
860
 
861
	mov	ecx,[ebx-3]
862
	and	ecx,0x00FEFEFE
863
	shr	ecx,1
864
	add	edx,ecx
865
 
866
	and	edx,0x00FEFEFE
867
	shr	edx,1
868
 
869
	mov	ecx,[ebx]
870
	and	ecx,0x00FEFEFE
871
	shr	ecx,1
872
	add	edx,ecx
873
 
874
	mov	[ebx],edx
875
 
876
	cmp	eax,screen_buffer+478*1920
877
	jb	copyfloor2
878
 
879
	popa
880
	ret
881
;---------------------------------------------------------------------
882
; ******* Darken by Distance *******
883
align	4
884
dark_distance:
885
; color must be in edx, wall height in [vdd]
886
	mov	eax,[vdd]
887
	cmp	eax,50
888
	jg	nodark
889
; split rgb
890
	mov	[blue],edx
891
	and	[blue],dword 255
892
 
893
	shr	edx,8
894
	mov	[green],edx
895
	and	[green],dword 255
896
 
897
	shr	edx,8
898
	mov	[red],edx
899
	and	[red],dword 255
900
 
901
	mov	eax,51	; darkness parameter
902
	sub	eax,[vdd]
903
	cmp	[pseudo],dword 1
904
	je	isdarkside
905
 
906
	sal	eax,2
907
;--------------------------------------
908
align	4
909
isdarkside:
910
; reduce rgb
911
	sub	[red],eax
912
	cmp	[red],	dword 0
913
	jg	notblack10b
914
 
915
	mov	[red],dword 0
916
;--------------------------------------
917
align	4
918
notblack10b:
919
	sub	[green],eax
920
	cmp	[green],dword 0
921
	jg	notblack20b
922
 
923
	mov	[green],dword 0
924
;--------------------------------------
925
align	4
926
notblack20b:
927
	mov	edx,[blue]
928
	sub	[blue],eax
929
	cmp	[blue],dword 0
930
	jg	notblack30b
931
 
932
	mov	[blue],dword 0
933
;--------------------------------------
934
align	4
935
notblack30b:
936
	shl	dword [red],16	; reassemble rgb
937
	shl	dword [green],8
938
	mov	edx,[red]
939
	or	edx,[green]
940
	or	edx,[blue]
941
	mov	eax,edx
942
;--------------------------------------
943
align	4
944
nodark:
945
	ret
946
;---------------------------------------------------------------------
947
load_icons:
948
	mov	ebx,icons_file_name
949
	mov	esi,path
950
	mov	edi,file_name
951
	call	copy_file_path
952
 
953
	mov	[fileinfo.subfunction],dword 5
954
	mov	[fileinfo.size],dword 0
955
	mov	[fileinfo.return],dword file_info
956
	mcall	70,fileinfo
957
	test	eax,eax
958
	jnz	.error
959
 
960
	mov	[fileinfo.subfunction],dword 0
961
 
962
	mov	ecx,[file_info+32]
963
	mov	[fileinfo.size],ecx
964
	mov	[img_size],ecx
965
 
966
	mcall	68,12
967
	test	eax,eax
968
	jz	finish	;memory_get_error
969
 
970
	mov	[fileinfo.return],eax
971
	mov	[image_file],eax
972
 
973
	mcall	70,fileinfo
974
	test	eax,eax
975
	jnz	.error
976
	ret
977
.error:
978
;	mov	[N_error],2
979
;	mov	[error_type],eax
980
	jmp	finish
981
;---------------------------------------------------------------------
982
copy_file_path:
983
	xor	eax,eax
984
	cld
985
@@:
986
	lodsb
987
	stosb
988
	test	eax,eax
989
	jnz	@b
990
	mov	esi,edi
991
	dec	esi
992
	std
993
@@:
994
	lodsb
995
	cmp	al,'/'
996
	jnz	@b
997
	mov	edi,esi
998
	add	edi,2
999
	mov	esi,ebx
1000
	cld
1001
@@:
1002
	lodsb
1003
	stosb
1004
	test	eax,eax
1005
	jnz	@b
1006
	ret
1007
;---------------------------------------------------------------------
1008
convert_icons:
1009
	xor	eax,eax
1010
	mov	[return_code],eax
1011
	mov	eax,image_file
1012
	call	[cnv_png_import.Start]
1013
 
1014
	mov	ecx,[image_file]
1015
	mcall	68,13,
1016
	test	eax,eax
1017
	jz	finish	;memory_free_error
1018
 
1019
	cmp	[return_code],dword 0
1020
;	je	@f
1021
;	mov	[N_error],6
1022
;	jmp	button.exit
1023
;@@:
1024
	jne	finish
1025
 
1026
	mcall	68,20,ICON_SIZE_X*ICON_SIZE_Y*4*8+44,[raw_pointer]
1027
	mov	[raw_pointer],eax
1028
 
1029
	mov	ebx,[raw_pointer]
1030
; set RAW area for icon
1031
	mov	eax,[ebx+28]
1032
	add	eax,ebx
1033
	mov	edi,eax
1034
	mov	esi,eax
1035
	add	esi,ICON_SIZE_X*ICON_SIZE_Y*8*3-1
1036
	add	edi,ICON_SIZE_X*ICON_SIZE_Y*8*4-4
1037
 
1038
;	add	eax,TEX_SIZE
1039
	mov	[wall0],eax
1040
	add	eax,TEX_SIZE
1041
	mov	[wall1],eax
1042
	add	eax,TEX_SIZE
1043
	mov	[wall2],eax
1044
	add	eax,TEX_SIZE
1045
	mov	[wall3],eax
1046
	add	eax,TEX_SIZE
1047
	mov	[wall4],eax
1048
	add	eax,TEX_SIZE
1049
	mov	[wall5],eax
1050
	add	eax,TEX_SIZE
1051
	mov	[wall6],eax
1052
	add	eax,TEX_SIZE
1053
	mov	[wall7],eax
1054
	add	eax,TEX_SIZE
1055
; conversion 24b to 32 b
1056
	mov	ecx,ICON_SIZE_X*ICON_SIZE_Y*8
1057
	std
1058
@@:
1059
	xor	eax,eax
1060
	lodsb
1061
	rol	eax,8
1062
	lodsb
1063
	rol	eax,8
1064
	lodsb
1065
;	ror	eax,16
1066
	stosd
1067
	dec	ecx
1068
	jnz	@b
1069
	cld
1070
	ret
1071
;---------------------------------------------------------------------
1072
; DATA AREA
1073
;ceil=ceil
1074
;wall=wall floor
1075
;2 corner stone
1076
;3 leaf mosaic
1077
;4 closed window
1078
;5 greek mosaic
1079
;6 old street stones
1080
;7 maya wall
1081
;---------------------------------------------------------------------
1082
align	4
1083
grid:	; 32*32 Blocks, Map: 0 = Air, 1 to 8 = Wall
1084
db 2,1,2,1,2,1,2,1,2,1,2,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
1085
db 1,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8
1086
db 5,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8
1087
db 1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,3,3,3,3,0,0,0,0,0,0,8
1088
db 5,0,1,2,3,4,5,6,7,8,2,1,3,3,3,0,5,0,2,1,2,3,0,0,0,0,0,0,0,0,0,8
1089
db 1,0,0,0,0,0,0,0,0,0,2,3,0,0,0,0,5,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8
1090
db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,5,0,0,0,0,3,3,0,3,3,0,0,0,0,0,8
1091
db 1,1,0,1,1,1,1,4,1,0,1,3,0,0,0,0,5,2,1,2,0,3,0,0,0,3,0,0,0,0,0,8
1092
db 5,0,0,0,1,0,0,0,0,0,0,1,0,3,3,3,5,0,0,0,0,3,0,0,0,3,0,0,0,0,0,8
1093
db 1,0,0,0,1,0,0,5,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,3,0,0,0,0,0,8
1094
db 5,0,0,0,0,0,0,5,0,0,0,1,0,0,0,0,5,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8
1095
db 1,4,4,4,4,4,4,4,4,4,4,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,8,8
1096
db 2,2,2,2,2,2,8,8,8,8,8,8,8,8,8,0,0,0,6,6,0,7,7,7,7,7,7,7,7,7,8,8
1097
db 1,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1
1098
db 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,2,2,2,2,0,0,0,0,3,3,3,3,3,1
1099
db 1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,6,0,0,0,0,2,0,0,0,0,3,0,0,0,0,1
1100
db 5,0,2,3,2,3,2,3,2,3,2,1,0,0,0,0,6,0,2,2,0,2,0,0,0,0,3,0,5,5,0,1
1101
db 1,0,0,0,0,0,0,4,0,0,0,3,0,0,0,0,6,0,0,2,0,2,0,2,0,0,3,0,0,0,0,1
1102
db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,6,0,0,2,2,2,0,2,0,0,3,3,3,3,0,1
1103
db 1,1,0,1,1,1,1,4,1,0,1,3,7,7,7,0,6,0,0,0,0,0,0,2,0,0,0,0,0,3,0,1
1104
db 5,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,6,0,0,0,0,2,2,2,0,0,0,0,0,3,0,1
1105
db 1,0,0,0,1,0,0,5,0,0,0,3,0,0,0,0,6,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1
1106
db 5,0,0,0,0,0,0,5,0,0,0,1,0,0,0,0,6,0,5,1,0,2,0,0,4,4,0,4,4,0,0,1
1107
db 1,4,1,4,1,4,1,4,1,4,1,3,0,0,0,0,6,0,0,5,0,2,0,0,0,4,0,4,0,0,0,1
1108
db 1,0,0,0,0,0,0,4,0,0,0,3,0,3,3,3,6,0,0,1,0,1,0,0,4,4,0,4,4,0,0,1
1109
db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,6,0,0,5,0,1,0,4,4,0,0,0,4,4,0,1
1110
db 1,1,0,1,1,1,1,4,1,0,1,3,0,0,0,0,6,0,0,1,0,1,0,4,0,0,0,0,0,4,0,1
1111
db 5,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,6,0,0,5,0,1,0,4,0,0,0,0,0,4,0,1
1112
db 1,0,0,0,1,0,0,5,0,0,0,3,0,0,0,0,6,1,5,1,0,1,0,4,4,0,0,0,4,4,0,1
1113
db 5,0,0,0,0,0,0,5,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,4,4,4,4,4,0,0,1
1114
db 1,4,1,4,1,4,1,4,1,4,1,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1
1115
db 2,1,2,1,2,1,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1116
;---------------------------------------------------------------------
1117
vpx:
1118
	dd 0x0001FFFF	; initial player position * 0xFFFF
1119
vpy:
1120
	dd 0x0001FFFF
1121
 
1122
title	db 'Free3D v0.5 - fisheye raycasting engine etc.',0
1123
 
1124
sindegree	dd 0.0
1125
sininc		dd 0.0017453292519943295769236907684886
1126
sindiv		dd 6553.5
1127
;textures:
1128
;file 'texture.gif'
1129
;---------------------------------------------------------------------
1130
align	4
1131
fileinfo:
1132
.subfunction	dd 5
1133
.Offset		dd 0
1134
.Offset_1	dd 0
1135
.size		dd 0
1136
.return		dd file_info
1137
		db 0
1138
.name:		dd file_name
1139
;---------------------------------------------------------------------
1140
icons_file_name		db 'texture_24b.png',0
1141
;---------------------------------------------------------------------
1142
plugins_directory	db 0
1143
 
1144
system_dir_Boxlib	db '/sys/lib/box_lib.obj',0
1145
system_dir_CnvPNG	db '/sys/lib/cnv_png.obj',0
1146
system_dir_Sort		db '/sys/lib/sort.obj',0
1147
system_dir_UNPACK	db '/sys/lib/archiver.obj',0
1148
 
1149
ihead_f_i:
1150
ihead_f_l	db 'System	error',0
1151
 
1152
er_message_found_lib1	db 'cnv_png.obj - Not found!',0
1153
er_message_import1	db 'cnv_png.obj - Wrong import!',0
1154
 
1155
err_message_found_lib2	db 'archiver.obj - Not found!',0
1156
err_message_import2	db 'archiver.obj - Wrong import!',0
1157
 
1158
 
1159
align	4
1160
l_libs_start:
1161
library01	l_libs	system_dir_CnvPNG+9,path,file_name,system_dir_CnvPNG,\
1162
er_message_found_lib1,ihead_f_l,cnv_png_import,er_message_import1,ihead_f_i,plugins_directory
1163
 
1164
library02	l_libs	system_dir_UNPACK+9,path,file_name,system_dir_UNPACK,\
1165
err_message_found_lib2,ihead_f_l,UNPACK_import,err_message_import2,ihead_f_i,plugins_directory
1166
 
1167
end_l_libs:
1168
;---------------------------------------------------------------------
1169
align	4
1170
cnv_png_import:
1171
.Start		dd aCP_Start
1172
.Version	dd aCP_Version
1173
.Check		dd aCP_Check
1174
.Assoc		dd aCP_Assoc
1175
	dd 0
1176
	dd 0
1177
aCP_Start	db 'START',0
1178
aCP_Version	db 'version',0
1179
aCP_Check	db 'Check_Header',0
1180
aCP_Assoc	db 'Associations',0
1181
;---------------------------------------------------------------------
1182
align	4
1183
UNPACK_import:
1184
;unpack_Version			dd aUnpack_Version
1185
;unpack_PluginLoad		dd aUnpack_PluginLoad
1186
;unpack_OpenFilePlugin		dd aUnpack_OpenFilePlugin
1187
;unpack_ClosePlugin		dd aUnpack_ClosePlugin
1188
;unpack_ReadFolder		dd aUnpack_ReadFolder
1189
;unpack_SetFolder		dd aUnpack_SetFolder
1190
;unpack_GetFiles		dd aUnpack_GetFiles
1191
;unpack_GetOpenPluginInfo	dd aUnpack_GetOpenPluginInfo
1192
;unpack_Getattr			dd aUnpack_Getattr
1193
;unpack_Open			dd aUnpack_Open
1194
;unpack_Read			dd aUnpack_Read
1195
;unpack_Setpos			dd aUnpack_Setpos
1196
;unpack_Close			dd aUnpack_Close
1197
;unpack_DeflateUnpack		dd aUnpack_DeflateUnpack
1198
unpack_DeflateUnpack2		dd aUnpack_DeflateUnpack2
1199
	dd 0
1200
	dd 0
1201
 
1202
;aUnpack_Version		db 'version',0
1203
;aUnpack_PluginLoad		db 'plugin_load',0
1204
;aUnpack_OpenFilePlugin		db 'OpenFilePlugin',0
1205
;aUnpack_ClosePlugin		db 'ClosePlugin',0
1206
;aUnpack_ReadFolder		db 'ReadFolder',0
1207
;aUnpack_SetFolder		db 'SetFolder',0
1208
;aUnpack_GetFiles		db 'GetFiles',0
1209
;aUnpack_GetOpenPluginInfo	db 'GetOpenPluginInfo',0
1210
;aUnpack_Getattr		db 'getattr',0
1211
;aUnpack_Open			db 'open',0
1212
;aUnpack_Read			db 'read',0
1213
;aUnpack_Setpos			db 'setpos',0
1214
;aUnpack_Close			db 'close',0
1215
;aUnpack_DeflateUnpack		db 'deflate_unpack',0
1216
aUnpack_DeflateUnpack2		db 'deflate_unpack2',0
1217
 
1218
;---------------------------------------------------------------------
1219
IM_END:
1220
;---------------------------------------------------------------------
1221
; not	change	this	section!!!
1222
; start	section
1223
;---------------------------------------------------------------------
1224
align	4
1225
image_file	rd 1
1226
raw_pointer	rd 1
1227
return_code	rd 1
1228
img_size	rd 1
1229
deflate_unpack	rd 1
1230
raw_pointer_2	rd 1	;+20
1231
;---------------------------------------------------------------------
1232
; end	section
1233
;---------------------------------------------------------------------
1234
align	4
1235
;---------------------------------------------------------------------
1236
wall0	rd 1
1237
wall1	rd 1
1238
wall2	rd 1
1239
wall3	rd 1
1240
wall4	rd 1
1241
wall5	rd 1
1242
wall6	rd 1
1243
wall7	rd 1
1244
;screen_buffer	rd 1
1245
;---------------------------------------------------------------------
1246
align	4
1247
col1:
1248
	dd ?	;-
1249
; misc raycaster vars:
1250
vxx:
1251
	dd ?	;-
1252
vyy:
1253
	dd ?	;-
1254
vl:
1255
	dd ?	;-
1256
vstepx:
1257
	dd ?	;-
1258
vstepy:
1259
	dd ?	;-
1260
vxxint:
1261
	dd ?	;-
1262
vyyint:
1263
	dd ?	;-
1264
vk:
1265
	dd ?	;-
1266
va:
1267
	dd ?	;-
1268
va2:
1269
	dd ?	;-
1270
vdd:
1271
	dd ?	;-
1272
vx1:
1273
	dd ?	;-
1274
vx1b:
1275
	dd ?	;-
1276
vh:
1277
	dd ?	;-
1278
vdt:
1279
	dd ?	;-
1280
vheading:	; initial heading: 0 to 3599
1281
	dd ?	;-
1282
vacompare:
1283
	dd ?	;-
1284
vpxi:
1285
	dd ?	;-
1286
vpyi:
1287
	dd ?	;-
1288
wtolong:
1289
	dw ?,?	;-,?;-
1290
 
1291
xtemp:
1292
	dd ?	;-
1293
ytemp:
1294
	dd ?	;-
1295
xfrac:
1296
	dd ?	;-
1297
yfrac:
1298
	dd ?	;-
1299
h_old:
1300
	dd ?	;-
1301
vbottom:
1302
	dd ?	;-
1303
mouseya:
1304
	dd ?	;-
1305
remeax:
1306
	dd ?	;-
1307
remebx:
1308
	dd ?	;-
1309
remecx:
1310
	dd ?	;-
1311
remedx:
1312
	dd ?	;-
1313
remedi:
1314
	dd ?	;-
1315
remesi:
1316
	dd ?	;-
1317
red:
1318
	dd ?	;-
1319
green:
1320
	dd ?	;-
1321
blue:
1322
	dd ?	;-
1323
pseudo:
1324
	dd ?	;-
1325
step1:
1326
	dd ?	;-
1327
;step64:
1328
;	dd ?	;-
1329
lasty:
1330
	dd ?	;-
1331
;---------------------------------------------------------------------
1332
;I_END:
1333
IncludeUGlobals
1334
align	4
1335
sinus	rd 360*10
1336
eosinus:
1337
;	rd 16*1024*4
1338
;---------------------------------------------------------------------
1339
align	4
1340
	rb 1024
1341
stacktop:
1342
;---------------------------------------------------------------------
1343
path:
1344
	rb 4096
1345
;---------------------------------------------------------------------
1346
file_name:
1347
	rb 4096
1348
;---------------------------------------------------------------------
1349
file_info:
1350
	rb 40
1351
;---------------------------------------------------------------------
1352
screen_buffer:
1353
	rb 640*480*3 *3/2
1354
;---------------------------------------------------------------------
1355
I_END:
1356
;---------------------------------------------------------------------