Subversion Repositories Kolibri OS

Rev

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