Subversion Repositories Kolibri OS

Rev

Rev 6286 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5218 IgorA 1
struct GLUquadricObj
2
	DrawStyle   dd ? ; GLU_FILL, LINE, SILHOUETTE, or POINT
3
	Orientation dd ? ; GLU_INSIDE or GLU_OUTSIDE
4
	TextureFlag dd ? ; Generate texture coords?
5
	Normals     dd ? ; GLU_NONE, GLU_FLAT, or GLU_SMOOTH
6
	ErrorFunc   dd ? ; Error handler callback function
7
ends
8
 
9
offs_qobj_DrawStyle equ 0
10
offs_qobj_Orientation equ 4
11
offs_qobj_TextureFlag equ 8
12
offs_qobj_Normals equ 12
13
offs_qobj_ErrorFunc equ 16
14
 
8059 IgorA 15
;Так как некоторые извращенческие функции OpenGL воспринимают только параметры
16
;типа double (8 байт) то придется пихать их в стек макросом glpush
17
macro glpush GLDoubleVar {
18
	push dword[GLDoubleVar+4]
19
	push dword[GLDoubleVar]
20
}
21
 
5218 IgorA 22
;void drawTorus(float rc, int numc, float rt, int numt)
23
;{
24
;}
25
 
26
;static void normal3f(GLfloat x, GLfloat y, GLfloat z )
27
;{
28
;}
29
 
8059 IgorA 30
align 4
31
an360f dd 360.0
5218 IgorA 32
 
8059 IgorA 33
align 16
34
proc gluPerspective, fovy:qword, aspect:qword, zNear:qword, zFar:qword
35
locals
36
	mfW dq ?
37
	fW dq ?
38
	mfH dq ?
39
	fH dq ?
40
endl
41
	fldpi
42
	fmul qword[fovy]
43
	fdiv dword[an360f]
44
	fptan
45
	ffree st0 ;выкидываем 1.0 которая осталось после вычисления тангенса
46
	fincstp
47
	fmul qword[zNear]
48
	fld st0
49
	fchs
50
	fstp qword[mfH]
51
	fst qword[fH]
52
	fmul qword[aspect]
53
	fld st0
54
	fchs
55
	fstp qword[mfW]
56
	fstp qword[fW]
57
 
58
	glpush zFar
59
	glpush zNear
60
	glpush fH
61
	glpush mfH
62
	glpush fW
63
	glpush mfW
64
	call glFrustum
65
	ret
66
endp
67
 
5218 IgorA 68
;void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
69
;	  GLdouble centerx, GLdouble centery, GLdouble centerz,
70
;	  GLdouble upx, GLdouble upy, GLdouble upz)
71
;{
72
;}
73
 
6143 IgorA 74
align 16
5218 IgorA 75
gluNewQuadric:
76
	stdcall gl_malloc, sizeof.GLUquadricObj
77
	or eax,eax
78
	jz @f
79
		mov dword[eax+offs_qobj_DrawStyle],GLU_FILL
80
		mov dword[eax+offs_qobj_Orientation],GLU_OUTSIDE
81
		mov dword[eax+offs_qobj_TextureFlag],GL_FALSE
82
		mov dword[eax+offs_qobj_Normals],GLU_SMOOTH
83
		mov dword[eax+offs_qobj_ErrorFunc],0 ;NULL
84
	@@:
85
	ret
86
 
6143 IgorA 87
align 16
5218 IgorA 88
proc gluDeleteQuadric, state:dword
89
	cmp dword[state],0
90
	je @f
91
		stdcall gl_free,[state]
92
	@@:
93
	ret
94
endp
95
 
5290 IgorA 96
;
97
; Set the drawing style to be GLU_FILL, GLU_LINE, GLU_SILHOUETTE,
98
; or GLU_POINT.
99
;
6143 IgorA 100
align 16
5290 IgorA 101
proc gluQuadricDrawStyle uses eax ebx, qobj:dword, drawStyle:dword
102
	mov eax,[qobj]
103
	or eax,eax
104
	jz .err_q
105
	mov ebx,[drawStyle]
106
	cmp ebx,GLU_FILL
107
	je @f
108
	cmp ebx,GLU_LINE
109
	je @f
110
	cmp ebx,GLU_SILHOUETTE
111
	je @f
112
	cmp ebx,GLU_POINT
113
	je @f
114
	jmp .err_q
6143 IgorA 115
align 4
5290 IgorA 116
	@@:
117
		mov dword[eax+offs_qobj_DrawStyle],ebx
118
		jmp @f
6143 IgorA 119
align 4
5290 IgorA 120
	.err_q:
6108 IgorA 121
		stdcall dbg_print,sz_gluQuadricDrawStyle,err_9
5290 IgorA 122
	@@:
123
	ret
124
endp
5218 IgorA 125
 
5290 IgorA 126
;
127
; Set the orientation to GLU_INSIDE or GLU_OUTSIDE.
128
;
6143 IgorA 129
align 16
5290 IgorA 130
proc gluQuadricOrientation uses eax ebx, qobj:dword, orientation:dword
131
	mov eax,[qobj]
132
	or eax,eax
133
	jz .err_q
134
	mov ebx,[orientation]
135
	cmp ebx,GLU_INSIDE
136
	je @f
137
	cmp ebx,GLU_OUTSIDE
138
	je @f
139
	jmp .err_q
6143 IgorA 140
align 4
5290 IgorA 141
	@@:
142
		mov dword[eax+offs_qobj_Orientation],ebx
143
		jmp @f
6143 IgorA 144
align 4
5290 IgorA 145
	.err_q:
6108 IgorA 146
		stdcall dbg_print,sz_gluQuadricOrientation,err_9
5290 IgorA 147
	@@:
148
	ret
149
endp
150
 
6143 IgorA 151
align 16
6108 IgorA 152
proc gluQuadricTexture uses eax ebx, qobj:dword, texture:dword
153
	mov eax,[qobj]
154
	or eax,eax
155
	jz .err_q
156
	mov ebx,[texture]
157
	cmp ebx,GL_TRUE
158
	je @f
159
	cmp ebx,GL_FALSE
160
	je @f
161
	@@:
162
		mov dword[eax+offs_qobj_TextureFlag],ebx
163
		jmp @f
6143 IgorA 164
align 4
6108 IgorA 165
	.err_q:
166
		stdcall dbg_print,sz_gluQuadricTexture,err_9
167
	@@:
168
	ret
169
endp
170
 
6286 IgorA 171
align 16
172
proc gluCylinder qobj:dword, baseRadius:dword, topRadius:dword, height:dword,\
173
	slices:dword, stacks:dword
174
locals
175
	da dq ? ;double
176
	r dq ? ;double
177
	dr dq ? ;double
178
	dz dq ? ;double
179
	x dd ? ;float
180
	y dd ? ;float
181
	z dd ? ;float
182
	nz dd ? ;float
183
	nsign dd ? ;float
184
	i dd ? ;GLint
185
	j dd ? ;GLint
186
	du dd ? ;float
187
	dv dd ? ;float
188
	tcx dd ? ;float
189
	tcy dd ? ;float
190
	x2 dd ? ;float
191
	y2 dd ? ;float
192
endl
193
pushad
194
	mov edx,[qobj]
195
	fld1
196
	cmp dword[edx+offs_qobj_Orientation],GLU_INSIDE
197
	jne @f
198
		fchs
199
	@@:
200
	fstp dword[nsign]
5218 IgorA 201
 
6286 IgorA 202
	fldpi
203
	fadd st0,st0
204
	fidiv dword[slices]
205
	fstp qword[da] ;da = 2.0*M_PI / slices
206
	mov ebx,[topRadius]
207
	fld qword[ebx]
208
	mov ecx,[baseRadius]
209
	fsub qword[ecx]
210
	fld st0 ;copy: topRadius-baseRadius
211
	fidiv dword[stacks]
212
	fstp qword[dr] ;dr = (topRadius-baseRadius) / stacks
213
	mov eax,[height]
214
	fld qword[eax]
215
	fidiv dword[stacks]
216
	fstp qword[dz] ;dz = height / stacks
217
	fchs
218
	fdiv qword[eax]
219
	fstp dword[nz] ;nz = (baseRadius-topRadius) / height ; Z component of normal vectors
220
 
221
	cmp dword[edx+offs_qobj_DrawStyle],GLU_POINT
222
	jne .else0
223
		stdcall glBegin,GL_POINTS
224
		mov ebx,[slices]
225
		mov dword[i],0
226
align 4
227
		.cycle_0: ;for (i=0;i
228
			cmp [i],ebx
229
			jge .cycle_0_end
230
			fild dword[i]
231
			fmul qword[da]
232
			fld st0
233
			fcos
234
			fst dword[x] ;x = cos(i*da)
235
			fmul dword[nsign]
236
			fstp dword[esp-12]
237
			fsin
238
			fst dword[y] ;y = sin(i*da)
239
			fmul dword[nsign]
240
			fstp dword[esp-8]
241
			fld dword[nz]
242
			fmul dword[nsign]
243
			fstp dword[esp-4]
244
			sub esp,12
245
			call glNormal3f ;x*nsign, y*nsign, nz*nsign
246
 
247
			mov dword[z],0.0
248
			mov ecx,[baseRadius]
249
			fld qword[ecx]
250
			fstp qword[r] ;r = baseRadius
251
			mov ecx,[stacks]
252
			inc ecx
253
align 4
254
			.cycle_1: ;for (j=0;j<=stacks;j++)
255
				mov eax,[z]
256
				mov [esp-4],eax
257
				fld qword[r]
258
				fld st0
259
				fmul dword[y]
260
				fstp dword[esp-8]
261
				fmul dword[x]
262
				fstp dword[esp-12]
263
				sub esp,12
264
				call glVertex3f ;x*r, y*r, z
265
				fld dword[z]
266
				fadd qword[dz]
267
				fstp dword[z] ;z += dz
268
				fld qword[r]
269
				fadd qword[dr]
270
				fstp qword[r] ;r += dr
271
				dec ecx
272
				jnz .cycle_1
273
			inc dword[i]
274
			jmp .cycle_0
275
align 4
276
		.cycle_0_end:
277
		call glEnd
278
		jmp .end_f
279
	.else0:
280
	cmp dword[edx+offs_qobj_DrawStyle],GLU_LINE
281
	je @f
282
	cmp dword[edx+offs_qobj_DrawStyle],GLU_SILHOUETTE
283
	je .else2
284
		jmp .else1
285
	@@:
286
		; Draw rings
287
		mov dword[z],0.0
288
		mov ecx,[baseRadius]
289
		fld qword[ecx]
290
		fstp qword[r] ;r = baseRadius
291
		mov ecx,[stacks]
292
		inc ecx
293
align 4
294
		.cycle_2: ;for (j=0;j<=stacks;j++)
295
			stdcall glBegin,GL_LINE_LOOP
296
			mov ebx,[slices]
297
			mov dword[i],0
298
align 4
299
			.cycle_3: ;for (i=0;i
300
				cmp [i],ebx
301
				jge .cycle_3_end
302
				fild dword[i]
303
				fmul qword[da]
304
				fld st0
305
				fcos
306
				fst dword[x] ;x = cos(i*da)
307
				fmul dword[nsign]
308
				fstp dword[esp-12]
309
				fsin
310
				fst dword[y] ;y = sin(i*da)
311
				fmul dword[nsign]
312
				fstp dword[esp-8]
313
				fld dword[nz]
314
				fmul dword[nsign]
315
				fstp dword[esp-4]
316
				sub esp,12
317
				call glNormal3f ;x*nsign, y*nsign, nz*nsign
318
				mov eax,[z]
319
				mov [esp-4],eax
320
				fld qword[r]
321
				fld st0
322
				fmul dword[y]
323
				fstp dword[esp-8]
324
				fmul dword[x]
325
				fstp dword[esp-12]
326
				sub esp,12
327
				call glVertex3f ;x*r, y*r, z
328
				inc dword[i]
329
				jmp .cycle_3
330
align 4
331
			.cycle_3_end:
332
			call glEnd
333
			fld dword[z]
334
			fadd qword[dz]
335
			fstp dword[z] ;z += dz
336
			fld qword[r]
337
			fadd qword[dr]
338
			fstp qword[r] ;r += dr
339
			dec ecx
340
			jnz .cycle_2
341
			jmp .else2_end
342
align 4
343
		.else2:
344
		; draw one ring at each end
345
;     if (baseRadius!=0.0) {
346
			stdcall glBegin,GL_LINE_LOOP
347
align 4
348
			.cycle_4: ;for (i=0;i
349
;		{
350
;           x = cos(i*da);
351
;           y = sin(i*da);
352
;           normal3f( x*nsign, y*nsign, nz*nsign );
353
;           glVertex3f( x*baseRadius, y*baseRadius, 0.0 );
354
;        }
355
			call glEnd
356
			stdcall glBegin,GL_LINE_LOOP
357
align 4
358
			.cycle_5: ;for (i=0;i
359
;		{
360
;           x = cos(i*da);
361
;           y = sin(i*da);
362
;           normal3f( x*nsign, y*nsign, nz*nsign );
363
;           glVertex3f( x*topRadius, y*topRadius, height );
364
;        }
365
			call glEnd
366
;     }
367
		.else2_end:
368
		; draw length lines
369
		stdcall glBegin,GL_LINES
370
		mov ebx,[slices]
371
		mov dword[i],0
372
align 4
373
		.cycle_6: ;for (i=0;i
374
			cmp [i],ebx
375
			jge .cycle_6_end
376
			fild dword[i]
377
			fmul qword[da]
378
			fld st0
379
			fcos
380
			fst dword[x] ;x = cos(i*da)
381
			fmul dword[nsign]
382
			fstp dword[esp-12]
383
			fsin
384
			fst dword[y] ;y = sin(i*da)
385
			fmul dword[nsign]
386
			fstp dword[esp-8]
387
			fld dword[nz]
388
			fmul dword[nsign]
389
			fstp dword[esp-4]
390
			sub esp,12
391
			call glNormal3f ;x*nsign, y*nsign, nz*nsign
392
			mov dword[esp-4],0.0
393
			mov ecx,[baseRadius]
394
			fld qword[ecx]
395
			fld st0
396
			fmul dword[y]
397
			fstp dword[esp-8]
398
			fmul dword[x]
399
			fstp dword[esp-12]
400
			sub esp,12
401
			call glVertex3f ;x*baseRadius, y*baseRadius, 0.0
402
			mov eax,[height]
403
			fld qword[eax]
404
			fstp dword[esp-4]
405
			mov ecx,[topRadius]
406
			fld qword[ecx]
407
			fld st0
408
			fmul dword[y]
409
			fstp dword[esp-8]
410
			fmul dword[x]
411
			fstp dword[esp-12]
412
			sub esp,12
413
			call glVertex3f ;x*topRadius, y*topRadius, height
414
			inc dword[i]
415
			jmp .cycle_6
416
align 4
417
		.cycle_6_end:
418
		call glEnd
419
		jmp .end_f
420
align 4
421
	.else1:
422
	cmp dword[edx+offs_qobj_DrawStyle],GLU_FILL
423
	jne .end_f
424
		fld1
425
		fidiv dword[slices]
426
		fstp dword[du] ;du = 1.0 / slices
427
		fld1
428
		fidiv dword[stacks]
429
		fstp dword[dv] ;dv = 1.0 / stacks
430
		mov dword[tcx],0.0
431
		mov dword[tcy],0.0
432
		mov ebx,[slices]
433
		mov dword[i],0
434
align 4
435
		.cycle_7: ;for (i=0;i
436
			cmp [i],ebx
437
			jge .cycle_7_end
438
			fild dword[i]
439
			fmul qword[da]
440
			fld st0
441
			fcos
442
			fstp dword[y] ;y1 = cos(i*da)
443
			fsin
444
			fchs
445
			fstp dword[x] ;x1 = -sin(i*da)
446
			inc dword[i]
447
			fild dword[i]
448
			fmul qword[da]
449
			fld st0
450
			fcos
451
			fstp dword[y2] ;y2 = cos((i+1)*da)
452
			fsin
453
			fchs
454
			fstp dword[x2] ;x2 = -sin((i+1)*da)
455
			mov dword[z],0.0
456
			mov ecx,[baseRadius]
457
			fld qword[ecx]
458
			fstp qword[r] ;r = baseRadius
459
			mov dword[tcy],0.0
460
			stdcall glBegin,GL_QUAD_STRIP
461
			mov ecx,[stacks]
462
			inc ecx
463
align 4
464
			.cycle_8: ;for (j=0;j<=stacks;j++)
465
 
466
				fld dword[nsign]
467
				ftst
468
				fstsw ax
469
				sahf
470
				jbe .else3
471
					;if (nsign>0.0)
472
					fld st0
473
					fmul dword[nz]
474
					fstp dword[esp-4]
475
					fld st0
476
					fmul dword[y]
477
					fstp dword[esp-8]
478
					fmul dword[x]
479
					fstp dword[esp-12]
480
					sub esp,12
481
					call glNormal3f ;x1*nsign, y1*nsign, nz*nsign
482
					cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
483
					je @f
484
						stdcall glTexCoord2f, [tcx],[tcy]
485
					@@:
486
					mov eax,[z]
487
					mov [esp-4],eax
488
					fld qword[r]
489
					fld st0
490
					fmul dword[y]
491
					fstp dword[esp-8]
492
					fmul dword[x]
493
					fstp dword[esp-12]
494
					sub esp,12
495
					call glVertex3f ;x1*r, y1*r, z
496
					fld dword[nsign]
497
					fld st0
498
					fmul dword[nz]
499
					fstp dword[esp-4]
500
					fld st0
501
					fmul dword[y2]
502
					fstp dword[esp-8]
503
					fmul dword[x2]
504
					fstp dword[esp-12]
505
					sub esp,12
506
					call glNormal3f ;x2*nsign, y2*nsign, nz*nsign
507
					cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
508
					je @f
509
						push dword[tcy]
510
						fld dword[tcx]
511
						fadd dword[du]
512
						fstp dword[esp-4]
513
						sub esp,4
514
						call glTexCoord2f ;tcx+du, tcy
515
					@@:
516
					mov eax,[z]
517
					mov [esp-4],eax
518
					fld qword[r]
519
					fld st0
520
					fmul dword[y2]
521
					fstp dword[esp-8]
522
					fmul dword[x2]
523
					fstp dword[esp-12]
524
					sub esp,12
525
					call glVertex3f ;x2*r, y2*r, z
526
					jmp .else3_end
527
				.else3:
528
					fld st0
529
					fmul dword[nz]
530
					fstp dword[esp-4]
531
					fld st0
532
					fmul dword[y2]
533
					fstp dword[esp-8]
534
					fmul dword[x2]
535
					fstp dword[esp-12]
536
					sub esp,12
537
					call glNormal3f ;x2*nsign, y2*nsign, nz*nsign
538
					cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
539
					je @f
540
						stdcall glTexCoord2f, [tcx],[tcy]
541
					@@:
542
					mov eax,[z]
543
					mov [esp-4],eax
544
					fld qword[r]
545
					fld st0
546
					fmul dword[y2]
547
					fstp dword[esp-8]
548
					fmul dword[x2]
549
					fstp dword[esp-12]
550
					sub esp,12
551
					call glVertex3f ;x2*r, y2*r, z
552
					fld dword[nsign]
553
					fld st0
554
					fmul dword[nz]
555
					fstp dword[esp-4]
556
					fld st0
557
					fmul dword[y]
558
					fstp dword[esp-8]
559
					fmul dword[x]
560
					fstp dword[esp-12]
561
					sub esp,12
562
					call glNormal3f ;x1*nsign, y1*nsign, nz*nsign
563
					cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
564
					je @f
565
						push dword[tcy]
566
						fld dword[tcx]
567
						fadd dword[du]
568
						fstp dword[esp-4]
569
						sub esp,4
570
						call glTexCoord2f ;tcx+du, tcy
571
					@@:
572
					mov eax,[z]
573
					mov [esp-4],eax
574
					fld qword[r]
575
					fld st0
576
					fmul dword[y]
577
					fstp dword[esp-8]
578
					fmul dword[x]
579
					fstp dword[esp-12]
580
					sub esp,12
581
					call glVertex3f ;x1*r, y1*r, z
582
				.else3_end:
583
				fld dword[z]
584
				fadd qword[dz]
585
				fstp dword[z] ;z += dz
586
				fld qword[r]
587
				fadd qword[dr]
588
				fstp qword[r] ;r += dr
589
				fld dword[tcy]
590
				fadd dword[dv]
591
				fstp dword[tcy] ;tcy += dv
592
				dec ecx
593
				jnz .cycle_8
594
			call glEnd
595
			fld dword[tcx]
596
			fadd dword[du]
597
			fstp dword[tcx] ;tcx += du
598
			jmp .cycle_7
599
align 4
600
		.cycle_7_end:
601
	.end_f:
602
popad
603
	ret
604
endp
605
 
5218 IgorA 606
; Disk (adapted from Mesa)
607
 
608
;void gluDisk(GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops )
609
;{
610
;}
611
 
612
;
613
; Sphere (adapted from Mesa)
614
;
615
 
616
;input:
617
; float radius, int slices, int stacks
6143 IgorA 618
align 16
5218 IgorA 619
proc gluSphere qobj:dword, radius:dword, slices:dword, stacks:dword
620
locals
621
	rho dd ? ;float
622
	drho dd ?
623
	theta dd ?
624
	dtheta dd ?
625
	x dd ? ;float
626
	y dd ? ;float
627
	z dd ? ;float
628
	s dd ? ;float
629
	t dd ? ;float
630
	d_s dd ? ;float
631
	d_t dd ? ;float
632
	i dd ? ;int
633
	j dd ? ;int
634
	imax dd ? ;int
635
	normals dd ? ;int
636
	nsign dd ? ;float
637
endl
638
pushad
639
 
640
	mov eax,[qobj]
641
	cmp dword[eax+offs_qobj_Normals],GLU_NONE ;if (qobj.Normals==GLU_NONE)
642
	jne .els_0
643
		mov dword[normals],GL_FALSE
644
		jmp @f
6143 IgorA 645
align 4
5218 IgorA 646
	.els_0:
647
		mov dword[normals],GL_TRUE
648
	@@:
649
	cmp dword[eax+offs_qobj_Orientation],GLU_INSIDE ;if (qobj.Orientation==GLU_INSIDE)
650
	jne .els_1
651
		mov dword[nsign],-1.0
652
		jmp @f
6143 IgorA 653
align 4
5218 IgorA 654
	.els_1:
655
		mov dword[nsign],1.0
656
	@@:
657
 
658
	fldpi
659
	fidiv dword[stacks]
660
	fstp dword[drho]
661
	fld1
662
	fldpi
663
	fscale
664
	fidiv dword[slices]
665
	fstp dword[dtheta]
666
	ffree st0
667
	fincstp
668
 
5290 IgorA 669
	cmp dword[eax+offs_qobj_DrawStyle],GLU_FILL ;if (qobj.DrawStyle==GLU_FILL)
670
	jne .if_glu_line
671
 
5218 IgorA 672
	; draw +Z end as a triangle fan
673
	stdcall glBegin,GL_TRIANGLE_FAN
674
	cmp dword[normals],GL_TRUE
675
	jne @f
676
		stdcall glNormal3f, 0.0, 0.0, 1.0
677
	@@:
678
	cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
679
	je @f
6143 IgorA 680
		stdcall glTexCoord2f, 0.5,1.0
5218 IgorA 681
	@@:
682
	sub esp,4
683
	fld dword[nsign]
684
	fmul dword[radius]
685
	fstp dword[esp]
686
	stdcall glVertex3f, 0.0, 0.0 ;, nsign * radius
687
	fld dword[drho]
688
	fcos
689
	fmul dword[nsign]
690
	fstp dword[z] ;z = nsign * cos(drho)
691
	mov dword[j],0
692
	mov ecx,[slices]
693
align 4
694
	.cycle_0: ;for (j=0;j<=slices;j++)
695
		cmp dword[j],ecx
696
		jg .cycle_0_end
697
		fld dword[drho]
698
		fsin
699
		je @f
700
			fild dword[j]
701
			fmul dword[dtheta]
702
			jmp .t0_end
6143 IgorA 703
align 4
5218 IgorA 704
		@@:
705
			fldz
706
		.t0_end:
707
		fst dword[theta] ;theta = (j==slices) ? 0.0 : j * dtheta
708
		fsin
709
		fchs
710
		fmul st0,st1
711
		fstp dword[x] ;x = -sin(theta) * sin(drho)
712
		fld dword[theta]
713
		fcos
714
		fmulp
715
		fstp dword[y] ;y = cos(theta) * sin(drho)
716
		cmp dword[normals],GL_TRUE
717
		jne @f
718
			fld dword[nsign]
719
			fld dword[z]
720
			fmul st0,st1
721
			fstp dword[esp-4]
722
			fld dword[y]
723
			fmul st0,st1
724
			fstp dword[esp-8]
725
			fld dword[x]
5290 IgorA 726
			fmulp
5218 IgorA 727
			fstp dword[esp-12]
728
			sub esp,12
729
			stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
730
		@@:
731
		fld dword[radius]
732
		fld dword[z]
733
		fmul st0,st1
734
		fstp dword[esp-4]
735
		fld dword[y]
736
		fmul st0,st1
737
		fstp dword[esp-8]
738
		fld dword[x]
5290 IgorA 739
		fmulp
5218 IgorA 740
		fstp dword[esp-12]
741
		sub esp,12
742
		call glVertex3f ;x*radius, y*radius, z*radius
743
		inc dword[j]
744
		jmp .cycle_0
6143 IgorA 745
align 4
5218 IgorA 746
	.cycle_0_end:
5290 IgorA 747
	call glEnd
5218 IgorA 748
 
749
	fld1
750
	fidiv dword[slices]
751
	fstp dword[d_s] ;1.0 / slices
752
	fld1
753
	fidiv dword[stacks]
754
	fstp dword[d_t] ;1.0 / stacks
755
	mov dword[t],1.0 ; because loop now runs from 0
756
	mov ebx,[stacks]
757
	cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
758
	je .els_2
759
		mov dword[i],0
760
		mov [imax],ebx
761
		jmp @f
6143 IgorA 762
align 4
5218 IgorA 763
	.els_2:
764
		mov dword[i],1
765
		dec ebx
766
		mov [imax],ebx
767
	@@:
768
 
769
	; draw intermediate stacks as quad strips
770
	mov ebx,[imax]
771
align 4
772
	.cycle_1: ;for (i=imin;i
773
	cmp dword[i],ebx
774
	jge .cycle_1_end
775
	fild dword[i]
776
	fmul dword[drho]
777
	fstp dword[rho] ;rho = i * drho
778
	stdcall glBegin,GL_QUAD_STRIP
779
	mov dword[s],0.0
780
	mov dword[j],0
781
align 4
782
	.cycle_2: ;for (j=0;j<=slices;j++)
783
		cmp dword[j],ecx
784
		jg .cycle_2_end
785
		fld dword[rho]
786
		fsin
787
		je @f
788
			fild dword[j]
789
			fmul dword[dtheta]
790
			jmp .t1_end
6143 IgorA 791
align 4
5218 IgorA 792
		@@:
793
			fldz
794
		.t1_end:
795
		fst dword[theta] ;theta = (j==slices) ? 0.0 : j * dtheta
796
		fsin
797
		fchs
798
		fmul st0,st1
799
		fstp dword[x] ;x = -sin(theta) * sin(rho)
800
		fld dword[theta]
801
		fcos
802
		fmulp
803
		fstp dword[y] ;y = cos(theta) * sin(rho)
804
		fld dword[rho]
805
		fcos
806
		fmul dword[nsign]
807
		fstp dword[z] ;z = nsign * cos(rho)
808
		cmp dword[normals],GL_TRUE
809
		jne @f
810
			fld dword[nsign]
811
			fld dword[z]
812
			fmul st0,st1
813
			fstp dword[esp-4]
814
			fld dword[y]
815
			fmul st0,st1
816
			fstp dword[esp-8]
817
			fld dword[x]
5290 IgorA 818
			fmulp
5218 IgorA 819
			fstp dword[esp-12]
820
			sub esp,12
821
			stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
822
		@@:
823
		cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
824
		je @f
6143 IgorA 825
			stdcall glTexCoord2f, [s],[t]
5218 IgorA 826
		@@:
827
		fld dword[radius]
828
		fld dword[z]
829
		fmul st0,st1
830
		fstp dword[esp-4]
831
		fld dword[y]
832
		fmul st0,st1
833
		fstp dword[esp-8]
834
		fld dword[x]
5290 IgorA 835
		fmulp
5218 IgorA 836
		fstp dword[esp-12]
837
		sub esp,12
838
		call glVertex3f ;x*radius, y*radius, z*radius
839
		fld dword[rho]
840
		fadd dword[drho]
841
		fsin ;st0 = sin(rho+drho)
842
		fld dword[theta]
843
		fsin
844
		fchs
845
		fmul st0,st1
846
		fstp dword[x] ;x = -sin(theta) * sin(rho+drho)
847
		fld dword[theta]
848
		fcos
849
		fmulp
850
		fstp dword[y] ;y = cos(theta) * sin(rho+drho)
851
		fld dword[rho]
852
		fadd dword[drho]
853
		fcos
854
		fmul dword[nsign]
855
		fstp dword[z] ;z = nsign * cos(rho+drho)
856
		cmp dword[normals],GL_TRUE
857
		jne @f
858
			fld dword[nsign]
859
			fld dword[z]
860
			fmul st0,st1
861
			fstp dword[esp-4]
862
			fld dword[y]
863
			fmul st0,st1
864
			fstp dword[esp-8]
865
			fld dword[x]
5290 IgorA 866
			fmulp
5218 IgorA 867
			fstp dword[esp-12]
868
			sub esp,12
869
			stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
870
		@@:
871
		cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
872
		je @f
6143 IgorA 873
			fld dword[t]
874
			fsub dword[d_t]
6108 IgorA 875
			fstp dword[esp-4]
876
			sub esp,4
6143 IgorA 877
			stdcall glTexCoord2f, [s] ;,t-dt
5218 IgorA 878
			fld dword[s]
879
			fadd dword[d_s]
880
			fstp dword[s]
881
		@@:
882
		fld dword[radius]
883
		fld dword[z]
884
		fmul st0,st1
885
		fstp dword[esp-4]
886
		fld dword[y]
887
		fmul st0,st1
888
		fstp dword[esp-8]
889
		fld dword[x]
5290 IgorA 890
		fmulp
5218 IgorA 891
		fstp dword[esp-12]
892
		sub esp,12
893
		call glVertex3f ;x*radius, y*radius, z*radius
894
		inc dword[j]
895
		jmp .cycle_2
6143 IgorA 896
align 4
5218 IgorA 897
		.cycle_2_end:
5290 IgorA 898
	call glEnd
5218 IgorA 899
	fld dword[t]
900
	fsub dword[d_t]
901
	fstp dword[t]
902
	inc dword[i]
903
	jmp .cycle_1
6143 IgorA 904
align 4
5218 IgorA 905
	.cycle_1_end:
906
 
907
	; draw -Z end as a triangle fan
908
	stdcall glBegin,GL_TRIANGLE_FAN
909
	cmp dword[normals],GL_TRUE
910
	jne @f
911
		stdcall glNormal3f, 0.0, 0.0, -1.0
912
	@@:
913
	cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
914
	je @f
6143 IgorA 915
		stdcall glTexCoord2f, 0.5,0.0
5218 IgorA 916
		mov dword[s],1.0
917
		mov ebx,[d_t]
918
		mov [t],ebx
919
	@@:
920
	sub esp,4
921
	fld dword[radius]
922
	fchs
923
	fmul dword[nsign]
924
	fstp dword[esp]
925
	stdcall glVertex3f, 0.0, 0.0 ;, -radius*nsign
926
	fldpi
927
	fsub dword[drho]
928
	fst dword[rho]
929
	fcos
930
	fmul dword[nsign]
931
	fstp dword[z] ;z = nsign * cos(rho)
932
	mov [j],ecx
5290 IgorA 933
align 4
5218 IgorA 934
	.cycle_3: ;for (j=slices;j>=0;j--)
935
		cmp dword[j],0
936
		jl .cycle_3_end
937
		fld dword[rho]
938
		fsin
939
		je @f
940
			fild dword[j]
941
			fmul dword[dtheta]
942
			jmp .t2_end
6143 IgorA 943
align 4
5218 IgorA 944
		@@:
945
			fldz
946
		.t2_end:
947
		fst dword[theta] ;theta = (j==slices) ? 0.0 : j * dtheta
948
		fsin
949
		fchs
950
		fmul st0,st1
951
		fstp dword[x] ;x = -sin(theta) * sin(rho)
952
		fld dword[theta]
953
		fcos
954
		fmulp
955
		fstp dword[y] ;y = cos(theta) * sin(rho)
956
		cmp dword[normals],GL_TRUE
957
		jne @f
958
			fld dword[nsign]
959
			fld dword[z]
960
			fmul st0,st1
961
			fstp dword[esp-4]
962
			fld dword[y]
963
			fmul st0,st1
964
			fstp dword[esp-8]
965
			fld dword[x]
966
			fmul st0,st1
967
			fstp dword[esp-12]
968
			sub esp,12
969
			ffree st0
970
			fincstp
971
			stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
972
		@@:
973
		cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
974
		je @f
6143 IgorA 975
			stdcall glTexCoord2f, [s],[t]
5218 IgorA 976
			fld dword[s]
977
			fsub dword[d_s]
978
			fstp dword[s]
979
		@@:
980
		fld dword[radius]
981
		fld dword[z]
982
		fmul st0,st1
983
		fstp dword[esp-4]
984
		fld dword[y]
985
		fmul st0,st1
986
		fstp dword[esp-8]
987
		fld dword[x]
5290 IgorA 988
		fmulp
5218 IgorA 989
		fstp dword[esp-12]
990
		sub esp,12
991
		call glVertex3f ;x*radius, y*radius, z*radius
992
		dec dword[j]
993
		jmp .cycle_3
6143 IgorA 994
align 4
5218 IgorA 995
	.cycle_3_end:
5290 IgorA 996
	call glEnd
997
	jmp .end_f
998
 
6143 IgorA 999
align 4
5290 IgorA 1000
	.if_glu_line:
1001
	cmp dword[eax+offs_qobj_DrawStyle],GLU_LINE ;if (qobj.DrawStyle==GLU_LINE)
1002
	je @f
1003
	cmp dword[eax+offs_qobj_DrawStyle],GLU_SILHOUETTE ;if (qobj.DrawStyle==GLU_SILHOUETTE)
1004
	je @f
1005
	jmp .if_glu_point
6143 IgorA 1006
align 4
5290 IgorA 1007
	@@:
1008
 
1009
	; draw stack lines
1010
	mov dword[i],1
1011
	mov ebx,[stacks]
1012
	mov ecx,[slices]
1013
align 4
1014
	.cycle_4: ;for (i=1;i
1015
		cmp dword[i],ebx
1016
		jge .cycle_4_end
1017
		; stack line at i==stacks-1 was missing here
1018
 
1019
		fild dword[i]
1020
		fmul dword[drho]
1021
		fstp dword[rho] ;rho = i * drho
1022
		stdcall glBegin,GL_LINE_LOOP
1023
		mov dword[j],0
1024
align 4
1025
		.cycle_5: ;for (j=0;j
1026
			cmp dword[j],ecx
1027
			jge .cycle_5_end
1028
			fild dword[j]
1029
			fmul dword[dtheta]
1030
			fst dword[theta] ;theta = j * dtheta;
1031
			fcos
1032
			fld dword[rho]
1033
			fsin
1034
			fxch ;толкаем sin(rho) в st1
1035
			fmul st0,st1
1036
			fstp dword[x] ;x = cos(theta) * sin(rho)
1037
			fld dword[theta]
1038
			fsin
1039
			fmulp ;множим на sin(rho) ранее записанный в st1
1040
			fstp dword[y] ;y = sin(theta) * sin(rho)
1041
			fld dword[rho]
1042
			fcos
1043
			fstp dword[z] ;z = cos(rho)
1044
			cmp dword[normals],GL_TRUE
1045
			jne @f
1046
				fld dword[nsign]
1047
				fld dword[z]
1048
				fmul st0,st1
1049
				fstp dword[esp-4]
1050
				fld dword[y]
1051
				fmul st0,st1
1052
				fstp dword[esp-8]
1053
				fld dword[x]
1054
				fmulp
1055
				fstp dword[esp-12]
1056
				sub esp,12
1057
				stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
1058
			@@:
1059
			fld dword[radius]
1060
			fld dword[z]
1061
			fmul st0,st1
1062
			fstp dword[esp-4]
1063
			fld dword[y]
1064
			fmul st0,st1
1065
			fstp dword[esp-8]
1066
			fld dword[x]
1067
			fmulp
1068
			fstp dword[esp-12]
1069
			sub esp,12
1070
			call glVertex3f ;x*radius, y*radius, z*radius
1071
			inc dword[j]
1072
			jmp .cycle_5
6143 IgorA 1073
align 4
5290 IgorA 1074
		.cycle_5_end:
1075
		call glEnd
1076
		inc dword[i]
1077
		jmp .cycle_4
6143 IgorA 1078
align 4
5290 IgorA 1079
	.cycle_4_end:
1080
 
1081
	; draw slice lines
1082
	mov dword[j],0
1083
align 4
1084
	.cycle_6: ;for (j=0;j
1085
		cmp dword[j],ecx
1086
		jge .cycle_6_end
1087
		fild dword[j]
1088
		fmul dword[dtheta]
1089
		fstp dword[theta] ;theta = j * dtheta;
1090
		stdcall glBegin,GL_LINE_STRIP
1091
		mov dword[i],0
1092
align 4
1093
		.cycle_7: ;for (i=0;i<=stacks;i++)
1094
			cmp dword[i],ebx
1095
			jg .cycle_7_end
1096
			fild dword[i]
1097
			fmul dword[drho]
1098
			fst dword[rho] ;rho = i * drho
1099
			fsin
1100
			fld dword[theta]
1101
			fcos
1102
			fmul st0,st1
1103
			fstp dword[x] ;x = cos(theta) * sin(rho)
1104
			fld dword[theta]
1105
			fsin
1106
			fmulp
1107
			fstp dword[y] ;y = sin(theta) * sin(rho)
1108
			fld dword[rho]
1109
			fcos
1110
			fstp dword[z] ;z = cos(rho)
1111
			cmp dword[normals],GL_TRUE
1112
			jne @f
1113
				fld dword[nsign]
1114
				fld dword[z]
1115
				fmul st0,st1
1116
				fstp dword[esp-4]
1117
				fld dword[y]
1118
				fmul st0,st1
1119
				fstp dword[esp-8]
1120
				fld dword[x]
1121
				fmulp
1122
				fstp dword[esp-12]
1123
				sub esp,12
1124
				stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
1125
			@@:
1126
			fld dword[radius]
1127
			fld dword[z]
1128
			fmul st0,st1
1129
			fstp dword[esp-4]
1130
			fld dword[y]
1131
			fmul st0,st1
1132
			fstp dword[esp-8]
1133
			fld dword[x]
1134
			fmulp
1135
			fstp dword[esp-12]
1136
			sub esp,12
1137
			call glVertex3f ;x*radius, y*radius, z*radius
1138
			inc dword[i]
1139
			jmp .cycle_7
6143 IgorA 1140
align 4
5290 IgorA 1141
		.cycle_7_end:
1142
		call glEnd
1143
		inc dword[j]
1144
		jmp .cycle_6
6143 IgorA 1145
align 4
5290 IgorA 1146
	.cycle_6_end:
1147
	jmp .end_f
1148
 
6143 IgorA 1149
align 4
5290 IgorA 1150
	.if_glu_point:
1151
	cmp dword[eax+offs_qobj_DrawStyle],GLU_POINT ;if (qobj.DrawStyle==GLU_POINT)
1152
	jne .end_f
1153
 
1154
	; top and bottom-most points
1155
	stdcall glBegin,GL_POINTS
1156
	cmp dword[normals],GL_TRUE
1157
	jne @f
1158
		stdcall glNormal3f, 0.0,0.0,dword[nsign]
1159
	@@:
1160
	stdcall glVertex3f, 0.0,0.0,dword[radius]
1161
	cmp dword[normals],GL_TRUE
1162
	jne @f
1163
		sub esp,4
1164
		fld dword[nsign]
1165
		fchs
1166
		fstp dword[esp]
1167
		stdcall glNormal3f, 0.0,0.0 ;,-nsign
1168
	@@:
1169
	sub esp,4
1170
	fld dword[radius]
1171
	fchs
1172
	fstp dword[esp]
1173
	stdcall glVertex3f, 0.0,0.0 ;,-radius
1174
 
1175
	; loop over stacks
1176
	mov dword[i],1
1177
	mov ebx,[stacks]
1178
	mov ecx,[slices]
1179
align 4
1180
	.cycle_8: ;for (i=1;i
1181
		cmp dword[i],ebx
1182
		jge .cycle_8_end
1183
		fild dword[i]
1184
		fmul dword[drho]
1185
		fstp dword[rho] ;rho = i * drho
1186
 
1187
		mov dword[j],0
1188
align 4
1189
		.cycle_9: ;for (j=0;j
1190
			cmp dword[j],ecx
1191
			jge .cycle_9_end
1192
			fild dword[j]
1193
			fmul dword[dtheta]
1194
			fst dword[theta] ;theta = j * dtheta;
1195
			fcos
1196
			fld dword[rho]
1197
			fsin
1198
			fxch ;толкаем sin(rho) в st1
1199
			fmul st0,st1
1200
			fstp dword[x] ;x = cos(theta) * sin(rho)
1201
			fld dword[theta]
1202
			fsin
1203
			fmulp ;множим на sin(rho) ранее записанный в st1
1204
			fstp dword[y] ;y = sin(theta) * sin(rho)
1205
			fld dword[rho]
1206
			fcos
1207
			fstp dword[z] ;z = cos(rho)
1208
			cmp dword[normals],GL_TRUE
1209
			jne @f
1210
				fld dword[nsign]
1211
				fld dword[z]
1212
				fmul st0,st1
1213
				fstp dword[esp-4]
1214
				fld dword[y]
1215
				fmul st0,st1
1216
				fstp dword[esp-8]
1217
				fld dword[x]
1218
				fmulp
1219
				fstp dword[esp-12]
1220
				sub esp,12
1221
				stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
1222
			@@:
1223
			fld dword[radius]
1224
			fld dword[z]
1225
			fmul st0,st1
1226
			fstp dword[esp-4]
1227
			fld dword[y]
1228
			fmul st0,st1
1229
			fstp dword[esp-8]
1230
			fld dword[x]
1231
			fmulp
1232
			fstp dword[esp-12]
1233
			sub esp,12
1234
			call glVertex3f ;x*radius, y*radius, z*radius
1235
			inc dword[j]
1236
			jmp .cycle_9
6143 IgorA 1237
align 4
5290 IgorA 1238
		.cycle_9_end:
1239
		inc dword[i]
1240
		jmp .cycle_8
6143 IgorA 1241
align 4
5290 IgorA 1242
	.cycle_8_end:
1243
	call glEnd
1244
 
1245
	.end_f:
5218 IgorA 1246
popad
1247
	ret
1248
endp