Subversion Repositories Kolibri OS

Rev

Rev 5353 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5353 Rev 5380
1
VERTEX_ARRAY   equ 0x0001
1
VERTEX_ARRAY   equ 0x0001
2
COLOR_ARRAY    equ 0x0002
2
COLOR_ARRAY    equ 0x0002
3
NORMAL_ARRAY   equ 0x0004
3
NORMAL_ARRAY   equ 0x0004
4
TEXCOORD_ARRAY equ 0x0008
4
TEXCOORD_ARRAY equ 0x0008
5
 
5
 
6
;glArrayElement - использование (рисование) одного элемента из массива
6
;glArrayElement - использование (рисование) одного элемента из массива
7
;glDrawArrays - рисование всех элементов в массиве
7
;glDrawArrays - рисование всех элементов в массиве
8
;glDrawElements - рисование тех элементов в массиве, которые заданны в массиве индексов
8
;glDrawElements - рисование тех элементов в массиве, которые заданны в массиве индексов
9
 
9
 
10
align 4
10
align 4
11
proc glopArrayElement uses eax ebx ecx edx, context:dword, param:dword
11
proc glopArrayElement uses eax ebx ecx edx, context:dword, param:dword
12
locals
12
locals
13
	p rd 5
13
	p rd 5
14
endl
14
endl
15
	mov eax,[context]
15
	mov eax,[context]
16
	mov ebx,[param]
16
	mov ebx,[param]
17
	mov ebx,[ebx+4] ;ebx = p[1]
17
	mov ebx,[ebx+4] ;ebx = p[1]
18
  
18
  
19
	bt dword[eax+offs_cont_client_states],1 ;2^1=COLOR_ARRAY
19
	bt dword[eax+offs_cont_client_states],1 ;2^1=COLOR_ARRAY
20
	jnc @f
20
	jnc @f
21
		mov ecx,[eax+offs_cont_color_array_size]
21
		mov ecx,[eax+offs_cont_color_array_size]
22
		add ecx,[eax+offs_cont_color_array_stride]
22
		add ecx,[eax+offs_cont_color_array_stride]
23
		imul ecx,ebx
23
		imul ecx,ebx
24
		shl ecx,2
24
		shl ecx,2
25
		add ecx,[eax+offs_cont_color_array] ;ecx = &context.color_array[i]
25
		add ecx,[eax+offs_cont_color_array] ;ecx = &context.color_array[i]
26
		mov ebx,ebp
26
		mov ebx,ebp
27
		sub ebx,20 ;=sizeof(dd)*5
27
		sub ebx,20 ;=sizeof(dd)*5
28
		mov edx,[ecx]
28
		mov edx,[ecx]
29
		mov [ebx+4],edx
29
		mov [ebx+4],edx
30
		mov edx,[ecx+4]
30
		mov edx,[ecx+4]
31
		mov [ebx+8],edx
31
		mov [ebx+8],edx
32
		mov edx,[ecx+8]
32
		mov edx,[ecx+8]
33
		mov [ebx+12],edx
33
		mov [ebx+12],edx
34
		cmp dword[eax+offs_cont_color_array_size],3
34
		cmp dword[eax+offs_cont_color_array_size],3
35
		jg .l0
35
		jg .l0
36
			mov edx,1.0
36
			mov edx,1.0
37
			jmp .l1
37
			jmp .l1
38
		.l0:
38
		.l0:
39
			mov edx,[ecx+12]
39
			mov edx,[ecx+12]
40
		.l1:
40
		.l1:
41
		mov [ebx+16],edx
41
		mov [ebx+16],edx
42
		stdcall glopColor, eax,ebx
42
		stdcall glopColor, eax,ebx
43
	@@:
43
	@@:
44
	bt dword[eax+offs_cont_client_states],2 ;2^2=NORMAL_ARRAY
44
	bt dword[eax+offs_cont_client_states],2 ;2^2=NORMAL_ARRAY
45
	jnc @f
45
	jnc @f
46
		mov esi,dword[eax+offs_cont_normal_array_stride]
46
		mov esi,dword[eax+offs_cont_normal_array_stride]
47
		add esi,3
47
		add esi,3
48
		imul esi,ebx
48
		imul esi,ebx
49
		shl esi,2
49
		shl esi,2
50
		add esi,[eax+offs_cont_normal_array] ;esi = &normal_array[ebx * (3 + c->normal_array_stride)]
50
		add esi,[eax+offs_cont_normal_array] ;esi = &normal_array[ebx * (3 + c->normal_array_stride)]
51
		mov edi,eax
51
		mov edi,eax
52
		add edi,offs_cont_current_normal
52
		add edi,offs_cont_current_normal
53
		mov ecx,3
53
		mov ecx,3
54
		rep movsd
54
		rep movsd
55
		mov dword[edi],0.0
55
		mov dword[edi],0.0
56
	@@:
56
	@@:
57
	bt dword[eax+offs_cont_client_states],3 ;2^3=TEXCOORD_ARRAY
57
	bt dword[eax+offs_cont_client_states],3 ;2^3=TEXCOORD_ARRAY
58
	jnc @f
58
	jnc @f
59
		mov ecx,[eax+offs_cont_texcoord_array_size]
59
		mov ecx,[eax+offs_cont_texcoord_array_size]
60
		add ecx,[eax+offs_cont_texcoord_array_stride]
60
		add ecx,[eax+offs_cont_texcoord_array_stride]
61
		imul ecx,ebx
61
		imul ecx,ebx
62
		shl ecx,2
62
		shl ecx,2
63
		add ecx,[eax+offs_cont_texcoord_array] ;ecx = &context.texcoord_array[i]
63
		add ecx,[eax+offs_cont_texcoord_array] ;ecx = &context.texcoord_array[i]
64
		mov edx,[ecx]
64
		mov edx,[ecx]
65
		mov [eax+offs_cont_current_tex_coord],edx
65
		mov [eax+offs_cont_current_tex_coord],edx
66
		mov edx,[ecx+4]
66
		mov edx,[ecx+4]
67
		mov [eax+offs_cont_current_tex_coord+4],edx
67
		mov [eax+offs_cont_current_tex_coord+4],edx
68
 
68
 
69
		cmp dword[eax+offs_cont_texcoord_array_size],2
69
		cmp dword[eax+offs_cont_texcoord_array_size],2
70
		jg .l2
70
		jg .l2
71
			mov edx,0.0
71
			mov edx,0.0
72
			jmp .l3
72
			jmp .l3
73
		.l2:
73
		.l2:
74
			mov edx,[ecx+8]
74
			mov edx,[ecx+8]
75
		.l3:
75
		.l3:
76
		mov [eax+offs_cont_current_tex_coord+8],edx
76
		mov [eax+offs_cont_current_tex_coord+8],edx
77
 
77
 
78
		cmp dword[eax+offs_cont_texcoord_array_size],3
78
		cmp dword[eax+offs_cont_texcoord_array_size],3
79
		jg .l4
79
		jg .l4
80
			mov edx,1.0
80
			mov edx,1.0
81
			jmp .l5
81
			jmp .l5
82
		.l4:
82
		.l4:
83
			mov edx,[ecx+12]
83
			mov edx,[ecx+12]
84
		.l5:
84
		.l5:
85
 
85
 
86
		mov [eax+offs_cont_current_tex_coord+12],edx
86
		mov [eax+offs_cont_current_tex_coord+12],edx
87
	@@:
87
	@@:
88
	bt dword[eax+offs_cont_client_states],0 ;2^0=VERTEX_ARRAY
88
	bt dword[eax+offs_cont_client_states],0 ;2^0=VERTEX_ARRAY
89
	jnc @f
89
	jnc @f
90
		mov ecx,[eax+offs_cont_vertex_array_size]
90
		mov ecx,[eax+offs_cont_vertex_array_size]
91
		add ecx,[eax+offs_cont_vertex_array_stride]
91
		add ecx,[eax+offs_cont_vertex_array_stride]
92
		imul ecx,ebx
92
		imul ecx,ebx
93
		shl ecx,2
93
		shl ecx,2
94
		add ecx,[eax+offs_cont_vertex_array] ;ecx = &context.vertex_array[i]
94
		add ecx,[eax+offs_cont_vertex_array] ;ecx = &context.vertex_array[i]
95
		mov ebx,ebp
95
		mov ebx,ebp
96
		sub ebx,20 ;=sizeof(dd)*5
96
		sub ebx,20 ;=sizeof(dd)*5
97
		mov edx,[ecx]
97
		mov edx,[ecx]
98
		mov [ebx+4],edx
98
		mov [ebx+4],edx
99
		mov edx,[ecx+4]
99
		mov edx,[ecx+4]
100
		mov [ebx+8],edx
100
		mov [ebx+8],edx
101
 
101
 
102
		cmp dword[eax+offs_cont_vertex_array_size],2
102
		cmp dword[eax+offs_cont_vertex_array_size],2
103
		jg .l6
103
		jg .l6
104
			mov edx,0.0
104
			mov edx,0.0
105
			jmp .l7
105
			jmp .l7
106
		.l6:
106
		.l6:
107
			mov edx,[ecx+8]
107
			mov edx,[ecx+8]
108
		.l7:
108
		.l7:
109
		mov [ebx+12],edx
109
		mov [ebx+12],edx
110
		cmp dword[eax+offs_cont_vertex_array_size],3
110
		cmp dword[eax+offs_cont_vertex_array_size],3
111
		jg .l8
111
		jg .l8
112
			mov edx,1.0
112
			mov edx,1.0
113
			jmp .l9
113
			jmp .l9
114
		.l8:
114
		.l8:
115
			mov edx,[ecx+12]
115
			mov edx,[ecx+12]
116
		.l9:
116
		.l9:
117
 
117
 
118
		mov [ebx+16],edx
118
		mov [ebx+16],edx
119
		stdcall glopVertex, eax,ebx
119
		stdcall glopVertex, eax,ebx
120
	@@:
120
	@@:
121
	ret
121
	ret
122
endp
122
endp
123
 
123
 
124
align 4
124
align 4
125
proc glArrayElement uses eax, i:dword
125
proc glArrayElement uses eax, i:dword
126
locals
126
locals
127
	p rd 2
127
	p rd 2
128
endl
128
endl
129
	mov dword[p],OP_ArrayElement
129
	mov dword[p],OP_ArrayElement
130
	mov eax,[i]
130
	mov eax,[i]
131
	mov dword[p+4],eax
131
	mov dword[p+4],eax
132
 
132
 
133
	mov eax,ebp
133
	mov eax,ebp
134
	sub eax,8 ;=sizeof(dd)*2
134
	sub eax,8 ;=sizeof(dd)*2
135
	stdcall gl_add_op,eax
135
	stdcall gl_add_op,eax
136
	ret
136
	ret
137
endp
137
endp
138
 
138
 
139
align 4
139
align 4
140
proc glopDrawArrays, context:dword, param:dword
140
proc glopDrawArrays, context:dword, param:dword
141
locals
141
locals
142
	vi dd ?
142
	vi dd ?
143
	idx dd ?
143
	idx dd ?
144
	states dd ?
144
	states dd ?
145
	size dd ?
145
	size dd ?
146
	p rd 8 ;функция glopColor требует 8 параметров, другие функции требуют меньше, берем по максимуму что-бы не портить стек
146
	p rd 8 ;функция glopColor требует 8 параметров, другие функции требуют меньше, берем по максимуму что-бы не портить стек
147
endl
147
endl
148
pushad
148
pushad
149
	mov edx,[context]
149
	mov edx,[context]
150
	mov ebx,[param]
150
	mov ebx,[param]
151
	mov ecx,[ebx+12] ;count = param[3].i
151
	mov ecx,[ebx+12] ;count = param[3].i
152
	mov eax,[edx+offs_cont_client_states]
152
	mov eax,[edx+offs_cont_client_states]
153
	mov [states],eax
153
	mov [states],eax
154
	mov eax,[ebx+8]
154
	mov eax,[ebx+8]
155
	mov [idx],eax ;param[2].i
155
	mov [idx],eax ;param[2].i
156
	mov eax,[ebx+4]
156
	mov eax,[ebx+4]
157
	mov [p+4],eax ;p[1].i = param[1].i
157
	mov [p+4],eax ;p[1].i = param[1].i
158
	mov eax,ebp
158
	mov eax,ebp
159
	sub eax,32 ;=sizeof(dd)*8
159
	sub eax,32 ;=sizeof(dd)*8
160
	stdcall glopBegin, edx,eax
160
	stdcall glopBegin, edx,eax
161
 
161
 
162
	mov dword[vi],0
162
	mov dword[vi],0
163
align 4
163
align 4
164
	.cycle_0: ;for (int vi=0; vi
164
	.cycle_0: ;for (int vi=0; vi
165
	cmp dword[vi],ecx
165
	cmp dword[vi],ecx
166
	jge .cycle_0_end
166
	jge .cycle_0_end
167
		bt dword[states],1 ;2^1=COLOR_ARRAY
167
		bt dword[states],1 ;2^1=COLOR_ARRAY
168
		jnc @f
168
		jnc @f
169
			mov esi,[edx+offs_cont_color_array_size]
169
			mov esi,[edx+offs_cont_color_array_size]
170
			mov [size],esi
170
			mov [size],esi
171
			add esi,[edx+offs_cont_color_array_stride]
171
			add esi,[edx+offs_cont_color_array_stride]
172
			imul esi,[idx] ;esi = i
172
			imul esi,[idx] ;esi = i
173
			shl esi,2
173
			shl esi,2
174
			add esi,[edx+offs_cont_color_array] ;esi = &context.color_array[i]
174
			add esi,[edx+offs_cont_color_array] ;esi = &context.color_array[i]
175
			mov edi,ebp
175
			mov edi,ebp
176
			sub edi,28 ;edi = &p[1]
176
			sub edi,28 ;edi = &p[1]
177
			mov ebx,[esi+8]
177
			mov ebx,[esi+8]
178
			mov [edi],ebx   ;p[1].f = context.color_array[i+2]
178
			mov [edi],ebx   ;p[1].f = context.color_array[i+2]
179
			mov ebx,[esi+4]
179
			mov ebx,[esi+4]
180
			mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
180
			mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
181
			mov ebx,[esi]
181
			mov ebx,[esi]
182
			mov [edi+8],ebx ;p[3].f = context.color_array[i]
182
			mov [edi+8],ebx ;p[3].f = context.color_array[i]
183
			add edi,12
183
			add edi,12
184
			cmp dword[size],3
184
			cmp dword[size],3
185
			jle .e1
185
			jle .e1
186
				add esi,12
186
				add esi,12
187
				movsd
187
				movsd
188
				jmp .e2
188
				jmp .e2
189
			.e1:
189
			.e1:
190
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
190
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
191
			.e2:
191
			.e2:
192
			mov edi,ebp
192
			mov edi,ebp
193
			sub edi,32 ;edi = &p[0]
193
			sub edi,32 ;edi = &p[0]
194
			mov ebx,ebp
194
			mov ebx,ebp
195
			sub ebx,12 ;ebp-12 = &p[5]
195
			sub ebx,12 ;ebp-12 = &p[5]
196
			push ebx
196
			push ebx
197
			add ebx,4 ;ebp-8 = &p[6]
197
			add ebx,4 ;ebp-8 = &p[6]
198
			push ebx
198
			push ebx
199
			add ebx,4 ;ebp-4 = &p[7]
199
			add ebx,4 ;ebp-4 = &p[7]
200
			push ebx
200
			push ebx
201
			stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
201
			stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
202
			stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi))
202
			stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi))
203
		@@:
203
		@@:
204
		bt dword[states],2 ;2^2=NORMAL_ARRAY
204
		bt dword[states],2 ;2^2=NORMAL_ARRAY
205
		jnc @f
205
		jnc @f
206
			mov esi,[edx+offs_cont_normal_array_stride]
206
			mov esi,[edx+offs_cont_normal_array_stride]
207
			add esi,3
207
			add esi,3
208
			imul esi,[idx]
208
			imul esi,[idx]
209
			shl esi,2
209
			shl esi,2
210
			add esi,[edx+offs_cont_normal_array] ;esi = &context.normal_array[ idx * (3 + context.normal_array_stride) ]
210
			add esi,[edx+offs_cont_normal_array] ;esi = &context.normal_array[ idx * (3 + context.normal_array_stride) ]
211
			mov edi,edx
211
			mov edi,edx
212
			add edi,offs_cont_current_normal
212
			add edi,offs_cont_current_normal
213
			movsd ;context.current_normal.X = context.normal_array[i]
213
			movsd ;context.current_normal.X = context.normal_array[i]
214
			movsd
214
			movsd
215
			movsd
215
			movsd
216
			mov dword[edi],0.0 ;context.current_normal.W = 0.0f
216
			mov dword[edi],0.0 ;context.current_normal.W = 0.0f
217
		@@:
217
		@@:
218
		bt dword[states],3 ;2^3=TEXCOORD_ARRAY
218
		bt dword[states],3 ;2^3=TEXCOORD_ARRAY
219
		jnc @f
219
		jnc @f
220
			mov esi,[edx+offs_cont_texcoord_array_size]
220
			mov esi,[edx+offs_cont_texcoord_array_size]
221
			mov [size],esi
221
			mov [size],esi
222
			add esi,[edx+offs_cont_texcoord_array_stride]
222
			add esi,[edx+offs_cont_texcoord_array_stride]
223
			imul esi,[idx] ;esi = i
223
			imul esi,[idx] ;esi = i
224
			shl esi,2
224
			shl esi,2
225
			add esi,[edx+offs_cont_texcoord_array] ;esi = &context.texcoord_array[i]
225
			add esi,[edx+offs_cont_texcoord_array] ;esi = &context.texcoord_array[i]
226
			mov edi,edx
226
			mov edi,edx
227
			add edi,offs_cont_current_tex_coord
227
			add edi,offs_cont_current_tex_coord
228
			movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
228
			movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
229
			movsd
229
			movsd
230
			cmp dword[size],2
230
			cmp dword[size],2
231
			jle .e3
231
			jle .e3
232
				movsd
232
				movsd
233
				jmp .e4
233
				jmp .e4
234
			.e3:
234
			.e3:
235
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
235
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
236
				add edi,4
236
				add edi,4
237
			.e4:
237
			.e4:
238
			cmp dword[size],3
238
			cmp dword[size],3
239
			jle .e5
239
			jle .e5
240
				movsd
240
				movsd
241
				jmp @f
241
				jmp @f
242
			.e5:
242
			.e5:
243
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
243
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
244
		@@:
244
		@@:
245
		bt dword[states],0 ;2^0=VERTEX_ARRAY
245
		bt dword[states],0 ;2^0=VERTEX_ARRAY
246
		jnc @f
246
		jnc @f
247
			mov esi,[edx+offs_cont_vertex_array_size]
247
			mov esi,[edx+offs_cont_vertex_array_size]
248
			mov [size],esi
248
			mov [size],esi
249
			add esi,[edx+offs_cont_vertex_array_stride]
249
			add esi,[edx+offs_cont_vertex_array_stride]
250
			imul esi,[idx] ;esi = i
250
			imul esi,[idx] ;esi = i
251
			shl esi,2
251
			shl esi,2
252
			add esi,[edx+offs_cont_vertex_array] ;esi = &context.vertex_array[i]
252
			add esi,[edx+offs_cont_vertex_array] ;esi = &context.vertex_array[i]
253
			mov edi,ebp
253
			mov edi,ebp
254
			sub edi,28 ;edi = &p[1]
254
			sub edi,28 ;edi = &p[1]
255
			movsd ;p[1].f = context.vertex_array[i]
255
			movsd ;p[1].f = context.vertex_array[i]
256
			movsd
256
			movsd
257
			cmp dword[size],2
257
			cmp dword[size],2
258
			jle .e6
258
			jle .e6
259
				movsd
259
				movsd
260
				jmp .e7
260
				jmp .e7
261
			.e6:
261
			.e6:
262
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
262
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
263
				add edi,4
263
				add edi,4
264
				jmp .e8 ;и 4-й тоже ставим по умолчанию
264
				jmp .e8 ;и 4-й тоже ставим по умолчанию
265
			.e7:
265
			.e7:
266
			cmp dword[size],3
266
			cmp dword[size],3
267
			jle .e8
267
			jle .e8
268
				movsd
268
				movsd
269
				sub edi,20 ;edi=&p[0]
269
				sub edi,20 ;edi=&p[0]
270
				jmp .e9
270
				jmp .e9
271
			.e8:
271
			.e8:
272
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
272
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
273
				sub edi,16 ;edi=&p[0]
273
				sub edi,16 ;edi=&p[0]
274
			.e9:
274
			.e9:
275
			stdcall glopVertex, edx,edi
275
			stdcall glopVertex, edx,edi
276
		@@:
276
		@@:
277
		inc dword[idx]
277
		inc dword[idx]
278
	inc dword[vi]
278
	inc dword[vi]
279
	jmp .cycle_0
279
	jmp .cycle_0
280
	.cycle_0_end:
280
	.cycle_0_end:
281
 
281
 
282
	;mov eax,ebp
282
	;mov eax,ebp
283
	;sub eax,32 ;=sizeof(dd)*8
283
	;sub eax,32 ;=sizeof(dd)*8
284
	stdcall glopEnd, edx,eax
284
	stdcall glopEnd, edx,eax
285
popad
285
popad
286
	ret
286
	ret
287
endp
287
endp
288
 
288
 
289
align 4
289
align 4
290
proc glDrawArrays uses eax, mode:dword, first:dword, count:dword
290
proc glDrawArrays uses eax, mode:dword, first:dword, count:dword
291
locals
291
locals
292
	p rd 4
292
	p rd 4
293
endl
293
endl
294
	mov dword[p],OP_DrawArrays
294
	mov dword[p],OP_DrawArrays
295
	mov eax,[mode]
295
	mov eax,[mode]
296
	mov dword[p+4],eax
296
	mov dword[p+4],eax
297
	mov eax,[first]
297
	mov eax,[first]
298
	mov dword[p+8],eax
298
	mov dword[p+8],eax
299
	mov eax,[count]
299
	mov eax,[count]
300
	mov dword[p+12],eax
300
	mov dword[p+12],eax
301
 
301
 
302
	mov eax,ebp
302
	mov eax,ebp
303
	sub eax,16 ;=sizeof(dd)*4
303
	sub eax,16 ;=sizeof(dd)*4
304
	stdcall gl_add_op,eax
304
	stdcall gl_add_op,eax
305
	ret
305
	ret
306
endp
306
endp
307
 
307
 
308
align 4
308
align 4
309
proc glopDrawElements uses eax ebx edx, context:dword, param:dword
309
proc glopDrawElements, context:dword, param:dword
310
locals
310
locals
-
 
311
	ii dd ?
-
 
312
	idx dd ?
-
 
313
	states dd ?
-
 
314
	type dd ?
-
 
315
	size dd ?
-
 
316
	indices dd ? ;указатель на 16 или 32 битные индексы
311
	p rd 8
317
	p rd 8
312
endl
318
endl
313
 
319
pushad
314
	mov edx,[context]
320
	mov edx,[context]
315
	mov ebx,[param]
321
	mov ebx,[param]
316
  ;int i;
-
 
317
  ;int idx;
-
 
318
  ;int states = c->client_states;
322
	mov eax,[edx+offs_cont_client_states]
319
  ;int count = param[2].i;
-
 
320
  ;int type = param[3].i;
323
	mov [states],eax
321
  ;unsigned int *indices_u32 = (unsigned int*)param[4].p;
-
 
322
  ;unsigned short *indices_u16 = (unsigned short*)indices_u32;
-
 
323
 
-
 
324
	mov eax,[ebx+4]
324
	mov eax,[ebx+4]
325
	mov [p+4],eax ;p[1].i = param[1].i
325
	mov [p+4],eax ;p[1].i = param[1].i
-
 
326
	mov ecx,[ebx+8] ;count = param[2].i
-
 
327
	mov eax,[ebx+12]
-
 
328
	mov [type],eax ;type = param[3].i
-
 
329
	mov eax,[ebx+16]
-
 
330
	mov [indices],eax ;*indices = param[4].p
326
	mov eax,ebp
331
	mov eax,ebp
327
	sub eax,32 ;=sizeof(dd)*8
332
	sub eax,32 ;=sizeof(dd)*8
328
	stdcall glopBegin, edx,eax
333
	stdcall glopBegin, edx,eax
-
 
334
 
-
 
335
	mov dword[ii],0
329
 
336
align 4
-
 
337
	.cycle_0: ;for (int ii=0; ii
-
 
338
	cmp dword[ii],ecx
-
 
339
	jge .cycle_0_end
330
;  for (int ii=0; ii
340
		mov esi,[ii]
-
 
341
		cmp dword[type],GL_UNSIGNED_INT
-
 
342
		jne @f
-
 
343
			shl esi,2
-
 
344
			add esi,[indices]
-
 
345
			mov esi,[esi]
-
 
346
			jmp .end_0
-
 
347
		@@:
-
 
348
			shl esi,1
-
 
349
			add esi,[indices]
-
 
350
			movzx esi,word[esi]
-
 
351
		.end_0:
-
 
352
		mov [idx],esi
331
;    idx = (type == GL_UNSIGNED_INT) ? indices_u32[ii] : indices_u16[ii];
353
 
332
;    if (states & COLOR_ARRAY) {
354
		bt dword[states],1 ;2^1=COLOR_ARRAY
333
;      GLParam p[5];
355
		jnc @f
-
 
356
			mov esi,[edx+offs_cont_color_array_size]
334
;      int size = c->color_array_size; 
357
			mov [size],esi
-
 
358
			add esi,[edx+offs_cont_color_array_stride]
-
 
359
			imul esi,[idx] ;esi = i
335
;      i = idx * (size + c->color_array_stride);
360
			shl esi,2
-
 
361
			add esi,[edx+offs_cont_color_array] ;esi = &context.color_array[i]
-
 
362
			mov edi,ebp
-
 
363
			sub edi,28 ;edi = &p[1]
336
;      p[1].f = c->color_array[i];
364
			mov ebx,[esi+8]
-
 
365
			mov [edi],ebx   ;p[1].f = context.color_array[i+2]
337
;      p[2].f = c->color_array[i+1];
366
			mov ebx,[esi+4]
-
 
367
			mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
338
;      p[3].f = c->color_array[i+2];
368
			mov ebx,[esi]
-
 
369
			mov [edi+8],ebx ;p[3].f = context.color_array[i]
339
;      p[4].f = size > 3 ? c->color_array[i+3] : 1.0f;
370
			add edi,12
-
 
371
			cmp dword[size],3
-
 
372
			jle .e1
-
 
373
				add esi,12
-
 
374
				movsd
-
 
375
				jmp .e2
-
 
376
			.e1:
-
 
377
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
-
 
378
			.e2:
-
 
379
			mov edi,ebp
-
 
380
			sub edi,32 ;edi = &p[0]
-
 
381
			mov ebx,ebp
-
 
382
			sub ebx,12 ;ebp-12 = &p[5]
-
 
383
			push ebx
-
 
384
			add ebx,4 ;ebp-8 = &p[6]
-
 
385
			push ebx
-
 
386
			add ebx,4 ;ebp-4 = &p[7]
-
 
387
			push ebx
-
 
388
			stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
340
;      glopColor(c, p);  
389
			stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi)) 
341
;    }
390
		@@:
-
 
391
		bt dword[states],2 ;2^2=NORMAL_ARRAY
342
;    if (states & NORMAL_ARRAY) {
392
		jnc @f
-
 
393
			mov esi,[edx+offs_cont_normal_array_stride]
343
;      i = idx * (3 + c->normal_array_stride);
394
			add esi,3
-
 
395
			imul esi,[idx] ;esi = idx * (3 + context.normal_array_stride)
344
;      c->current_normal.X = c->normal_array[i];
396
			shl esi,2
-
 
397
			add esi,[edx+offs_cont_normal_array]
-
 
398
			mov edi,edx
345
;      c->current_normal.Y = c->normal_array[i+1];
399
			add edi,offs_cont_current_normal
-
 
400
			movsd ;context.current_normal.X = context.normal_array[i]
-
 
401
			movsd
346
;      c->current_normal.Z = c->normal_array[i+2];
402
			movsd
347
;      c->current_normal.W = 0.0f;
403
			mov dword[edi],0.0 ;context.current_normal.W = 0.0f
348
;    }
404
		@@:
-
 
405
		bt dword[states],3 ;2^3=TEXCOORD_ARRAY
349
;    if (states & TEXCOORD_ARRAY) {
406
		jnc @f
-
 
407
			mov esi,[edx+offs_cont_texcoord_array_size]
350
;      int size = c->texcoord_array_size;
408
			mov [size],esi
-
 
409
			add esi,[edx+offs_cont_texcoord_array_stride]
-
 
410
			imul esi,[idx] ;esi = i
351
;      i = idx * (size + c->texcoord_array_stride);
411
			shl esi,2
-
 
412
			add esi,[edx+offs_cont_texcoord_array] ;esi = &context.texcoord_array[i]
352
;      c->current_tex_coord.X = c->texcoord_array[i];
413
			mov edi,edx
353
;      c->current_tex_coord.Y = c->texcoord_array[i+1];
414
			add edi,offs_cont_current_tex_coord
-
 
415
			movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
-
 
416
			movsd
-
 
417
			cmp dword[size],2
-
 
418
			jle .e3
-
 
419
				movsd
-
 
420
				jmp .e4
-
 
421
			.e3:
-
 
422
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
-
 
423
				add edi,4
-
 
424
			.e4:
-
 
425
			cmp dword[size],3
-
 
426
			jle .e5
-
 
427
				movsd
-
 
428
				jmp @f
354
;      c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f;
429
			.e5:
355
;      c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f;
430
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
356
;    }
431
		@@:
357
;    if (states & VERTEX_ARRAY) {
432
		bt dword[states],0 ;2^0=VERTEX_ARRAY
358
;      GLParam p[5];
433
		jnc @f
-
 
434
			mov esi,[edx+offs_cont_vertex_array_size]
359
;      int size = c->vertex_array_size;
435
			mov [size],esi
-
 
436
			add esi,[edx+offs_cont_vertex_array_stride]
-
 
437
			imul esi,[idx] ;esi = i
360
;      i = idx * (size + c->vertex_array_stride);
438
			shl esi,2
-
 
439
			add esi,[edx+offs_cont_vertex_array] ;esi = &context.vertex_array[i]
361
;      p[1].f = c->vertex_array[i];
440
			mov edi,ebp
362
;      p[2].f = c->vertex_array[i+1];
441
			sub edi,28 ;edi = &p[1]
-
 
442
			movsd ;p[1].f = context.vertex_array[i]
-
 
443
			movsd
-
 
444
			cmp dword[size],2
-
 
445
			jle .e6
-
 
446
				movsd
-
 
447
				jmp .e7
-
 
448
			.e6:
-
 
449
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
363
;      p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f;
450
				add edi,4
-
 
451
				jmp .e8 ;и 4-й тоже ставим по умолчанию
-
 
452
			.e7:
-
 
453
			cmp dword[size],3
-
 
454
			jle .e8
-
 
455
				movsd
-
 
456
				sub edi,20 ;edi=&p[0]
-
 
457
				jmp .e9
-
 
458
			.e8:
-
 
459
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
-
 
460
				sub edi,16 ;edi=&p[0]
364
;      p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f;
461
			.e9:
365
;      glopVertex(c, p);
462
			stdcall glopVertex, edx,edi
-
 
463
		@@:
-
 
464
	inc dword[ii]
-
 
465
	jmp .cycle_0
366
;    }
466
	.cycle_0_end:
367
;  }
467
 
368
	mov eax,ebp
468
	mov eax,ebp
369
	sub eax,32 ;=sizeof(dd)*8
469
	sub eax,32 ;=sizeof(dd)*8
370
	stdcall glopEnd, edx,eax
470
	stdcall glopEnd, edx,eax
-
 
471
popad
371
	ret
472
	ret
372
endp
473
endp
373
 
474
 
374
align 4
475
align 4
375
proc glDrawElements uses eax, mode:dword, count:dword, type:dword, indices:dword
476
proc glDrawElements uses eax, mode:dword, count:dword, type:dword, indices:dword
376
locals
477
locals
377
	p rd 5
478
	p rd 5
378
endl
479
endl
379
;assert(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT/* nonstandard */);
480
;assert(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT/* nonstandard */);
380
	mov dword[p],OP_DrawElements
481
	mov dword[p],OP_DrawElements
381
	mov eax,[mode]
482
	mov eax,[mode]
382
	mov dword[p+4],eax
483
	mov dword[p+4],eax
383
	mov eax,[count]
484
	mov eax,[count]
384
	mov dword[p+8],eax
485
	mov dword[p+8],eax
385
	mov eax,[type]
486
	mov eax,[type]
386
	mov dword[p+12],eax
487
	mov dword[p+12],eax
387
	mov eax,[indices]
488
	mov eax,[indices]
388
	mov dword[p+16],eax
489
	mov dword[p+16],eax
389
 
490
 
390
	mov eax,ebp
491
	mov eax,ebp
391
	sub eax,20 ;=sizeof(dd)*5
492
	sub eax,20 ;=sizeof(dd)*5
392
	stdcall gl_add_op,eax
493
	stdcall gl_add_op,eax
393
	ret
494
	ret
394
endp
495
endp
395
 
496
 
396
align 4
497
align 4
397
proc glopEnableClientState uses eax ebx, context:dword, p:dword
498
proc glopEnableClientState uses eax ebx, context:dword, p:dword
398
	mov eax,[context]
499
	mov eax,[context]
399
	mov ebx,[p]
500
	mov ebx,[p]
400
	mov ebx,[ebx+4] ;ebx = p[1]
501
	mov ebx,[ebx+4] ;ebx = p[1]
401
	or dword[eax+offs_cont_client_states],ebx
502
	or dword[eax+offs_cont_client_states],ebx
402
	ret
503
	ret
403
endp
504
endp
404
 
505
 
405
align 4
506
align 4
406
proc glEnableClientState uses eax, array:dword
507
proc glEnableClientState uses eax, array:dword
407
locals
508
locals
408
	p rd 2
509
	p rd 2
409
endl
510
endl
410
	mov dword[p],OP_EnableClientState
511
	mov dword[p],OP_EnableClientState
411
 
512
 
412
	cmp dword[array],GL_VERTEX_ARRAY
513
	cmp dword[array],GL_VERTEX_ARRAY
413
	jne @f
514
	jne @f
414
		mov dword[p+4],VERTEX_ARRAY
515
		mov dword[p+4],VERTEX_ARRAY
415
		jmp .end_f
516
		jmp .end_f
416
	@@:
517
	@@:
417
	cmp dword[array],GL_NORMAL_ARRAY
518
	cmp dword[array],GL_NORMAL_ARRAY
418
	jne @f
519
	jne @f
419
		mov dword[p+4],NORMAL_ARRAY
520
		mov dword[p+4],NORMAL_ARRAY
420
		jmp .end_f
521
		jmp .end_f
421
	@@:
522
	@@:
422
	cmp dword[array],GL_COLOR_ARRAY
523
	cmp dword[array],GL_COLOR_ARRAY
423
	jne @f
524
	jne @f
424
		mov dword[p+4],COLOR_ARRAY
525
		mov dword[p+4],COLOR_ARRAY
425
		jmp .end_f
526
		jmp .end_f
426
	@@:
527
	@@:
427
	cmp dword[array],GL_TEXTURE_COORD_ARRAY
528
	cmp dword[array],GL_TEXTURE_COORD_ARRAY
428
	jne @f
529
	jne @f
429
		mov dword[p+4],TEXCOORD_ARRAY
530
		mov dword[p+4],TEXCOORD_ARRAY
430
		jmp .end_f
531
		jmp .end_f
431
	@@:
532
	@@:
432
		;assert(0);
533
		;assert(0);
433
	.end_f:
534
	.end_f:
434
 
535
 
435
	mov eax,ebp
536
	mov eax,ebp
436
	sub eax,8 ;=sizeof(dd)*2
537
	sub eax,8 ;=sizeof(dd)*2
437
	stdcall gl_add_op,eax
538
	stdcall gl_add_op,eax
438
	ret
539
	ret
439
endp
540
endp
440
 
541
 
441
align 4
542
align 4
442
proc glopDisableClientState uses eax ebx, context:dword, p:dword
543
proc glopDisableClientState uses eax ebx, context:dword, p:dword
443
	mov eax,[context]
544
	mov eax,[context]
444
	mov ebx,[p]
545
	mov ebx,[p]
445
	mov ebx,[ebx+4] ;ebx = p[1]
546
	mov ebx,[ebx+4] ;ebx = p[1]
446
	and dword[eax+offs_cont_client_states],ebx
547
	and dword[eax+offs_cont_client_states],ebx
447
	ret
548
	ret
448
endp
549
endp
449
 
550
 
450
align 4
551
align 4
451
proc glDisableClientState uses eax, array:dword
552
proc glDisableClientState uses eax, array:dword
452
locals
553
locals
453
	p rd 2
554
	p rd 2
454
endl
555
endl
455
	mov dword[p],OP_DisableClientState
556
	mov dword[p],OP_DisableClientState
456
 
557
 
457
	cmp dword[array],GL_VERTEX_ARRAY
558
	cmp dword[array],GL_VERTEX_ARRAY
458
	jne @f
559
	jne @f
459
		mov dword[p+4], not VERTEX_ARRAY
560
		mov dword[p+4], not VERTEX_ARRAY
460
		jmp .end_f
561
		jmp .end_f
461
	@@:
562
	@@:
462
	cmp dword[array],GL_NORMAL_ARRAY
563
	cmp dword[array],GL_NORMAL_ARRAY
463
	jne @f
564
	jne @f
464
		mov dword[p+4], not NORMAL_ARRAY
565
		mov dword[p+4], not NORMAL_ARRAY
465
		jmp .end_f
566
		jmp .end_f
466
	@@:
567
	@@:
467
	cmp dword[array],GL_COLOR_ARRAY
568
	cmp dword[array],GL_COLOR_ARRAY
468
	jne @f
569
	jne @f
469
		mov dword[p+4], not COLOR_ARRAY
570
		mov dword[p+4], not COLOR_ARRAY
470
		jmp .end_f
571
		jmp .end_f
471
	@@:
572
	@@:
472
	cmp dword[array],GL_TEXTURE_COORD_ARRAY
573
	cmp dword[array],GL_TEXTURE_COORD_ARRAY
473
	jne @f
574
	jne @f
474
		mov dword[p+4], not TEXCOORD_ARRAY
575
		mov dword[p+4], not TEXCOORD_ARRAY
475
		jmp .end_f
576
		jmp .end_f
476
	@@:
577
	@@:
477
		;assert(0);
578
		;assert(0);
478
	.end_f:
579
	.end_f:
479
 
580
 
480
	mov eax,ebp
581
	mov eax,ebp
481
	sub eax,8 ;=sizeof(dd)*2
582
	sub eax,8 ;=sizeof(dd)*2
482
	stdcall gl_add_op,eax
583
	stdcall gl_add_op,eax
483
	ret
584
	ret
484
endp
585
endp
485
 
586
 
486
align 4
587
align 4
487
proc glopVertexPointer uses eax ebx ecx, context:dword, p:dword
588
proc glopVertexPointer uses eax ebx ecx, context:dword, p:dword
488
	mov eax,[context]
589
	mov eax,[context]
489
	mov ebx,[p]
590
	mov ebx,[p]
490
	mov ecx,[ebx+4] ;ecx = p[1]
591
	mov ecx,[ebx+4] ;ecx = p[1]
491
	mov dword[eax+offs_cont_vertex_array_size],ecx
592
	mov dword[eax+offs_cont_vertex_array_size],ecx
492
	mov ecx,[ebx+8] ;ecx = p[2]
593
	mov ecx,[ebx+8] ;ecx = p[2]
493
	mov dword[eax+offs_cont_vertex_array_stride],ecx
594
	mov dword[eax+offs_cont_vertex_array_stride],ecx
494
	mov ecx,[ebx+12] ;ecx = p[3]
595
	mov ecx,[ebx+12] ;ecx = p[3]
495
	mov dword[eax+offs_cont_vertex_array],ecx
596
	mov dword[eax+offs_cont_vertex_array],ecx
496
	ret
597
	ret
497
endp
598
endp
498
 
599
 
499
align 4
600
align 4
500
proc glVertexPointer uses eax, size:dword, type:dword, stride:dword, pointer:dword
601
proc glVertexPointer uses eax, size:dword, type:dword, stride:dword, pointer:dword
501
locals
602
locals
502
	p rd 4
603
	p rd 4
503
endl
604
endl
504
;  assert(type == GL_FLOAT);
605
;  assert(type == GL_FLOAT);
505
 
606
 
506
	mov dword[p],OP_VertexPointer
607
	mov dword[p],OP_VertexPointer
507
	mov eax,[size]
608
	mov eax,[size]
508
	mov dword[p+4],eax
609
	mov dword[p+4],eax
509
	mov eax,[stride]
610
	mov eax,[stride]
510
	mov dword[p+8],eax
611
	mov dword[p+8],eax
511
	mov eax,[pointer]
612
	mov eax,[pointer]
512
	mov dword[p+12],eax
613
	mov dword[p+12],eax
513
 
614
 
514
	mov eax,ebp
615
	mov eax,ebp
515
	sub eax,16 ;=sizeof(dd)*4
616
	sub eax,16 ;=sizeof(dd)*4
516
	stdcall gl_add_op,eax
617
	stdcall gl_add_op,eax
517
	ret
618
	ret
518
endp
619
endp
519
 
620
 
520
align 4
621
align 4
521
proc glopColorPointer uses eax ebx ecx, context:dword, p:dword
622
proc glopColorPointer uses eax ebx ecx, context:dword, p:dword
522
	mov eax,[context]
623
	mov eax,[context]
523
	mov ebx,[p]
624
	mov ebx,[p]
524
	mov ecx,[ebx+4] ;ecx = p[1]
625
	mov ecx,[ebx+4] ;ecx = p[1]
525
	mov dword[eax+offs_cont_color_array_size],ecx
626
	mov dword[eax+offs_cont_color_array_size],ecx
526
	mov ecx,[ebx+8] ;ecx = p[2]
627
	mov ecx,[ebx+8] ;ecx = p[2]
527
	mov dword[eax+offs_cont_color_array_stride],ecx
628
	mov dword[eax+offs_cont_color_array_stride],ecx
528
	mov ecx,[ebx+12] ;ecx = p[3]
629
	mov ecx,[ebx+12] ;ecx = p[3]
529
	mov dword[eax+offs_cont_color_array],ecx
630
	mov dword[eax+offs_cont_color_array],ecx
530
	ret
631
	ret
531
endp
632
endp
532
 
633
 
533
align 4
634
align 4
534
proc glColorPointer uses eax, size:dword, type:dword, stride:dword, pointer:dword
635
proc glColorPointer uses eax, size:dword, type:dword, stride:dword, pointer:dword
535
locals
636
locals
536
	p rd 4
637
	p rd 4
537
endl
638
endl
538
;  assert(type == GL_FLOAT);
639
;  assert(type == GL_FLOAT);
539
 
640
 
540
	mov dword[p],OP_ColorPointer
641
	mov dword[p],OP_ColorPointer
541
	mov eax,[size]
642
	mov eax,[size]
542
	mov dword[p+4],eax
643
	mov dword[p+4],eax
543
	mov eax,[stride]
644
	mov eax,[stride]
544
	mov dword[p+8],eax
645
	mov dword[p+8],eax
545
	mov eax,[pointer]
646
	mov eax,[pointer]
546
	mov dword[p+12],eax
647
	mov dword[p+12],eax
547
 
648
 
548
	mov eax,ebp
649
	mov eax,ebp
549
	sub eax,16 ;=sizeof(dd)*4
650
	sub eax,16 ;=sizeof(dd)*4
550
	stdcall gl_add_op,eax
651
	stdcall gl_add_op,eax
551
	ret
652
	ret
552
endp
653
endp
553
 
654
 
554
align 4
655
align 4
555
proc glopNormalPointer uses eax ebx ecx, context:dword, p:dword
656
proc glopNormalPointer uses eax ebx ecx, context:dword, p:dword
556
	mov eax,[context]
657
	mov eax,[context]
557
	mov ebx,[p]
658
	mov ebx,[p]
558
	mov ecx,[ebx+4] ;ecx = p[1]
659
	mov ecx,[ebx+4] ;ecx = p[1]
559
	mov dword[eax+offs_cont_normal_array_stride],ecx
660
	mov dword[eax+offs_cont_normal_array_stride],ecx
560
	mov ecx,[ebx+8] ;ecx = p[2]
661
	mov ecx,[ebx+8] ;ecx = p[2]
561
	mov dword[eax+offs_cont_normal_array],ecx
662
	mov dword[eax+offs_cont_normal_array],ecx
562
	ret
663
	ret
563
endp
664
endp
564
 
665
 
565
align 4
666
align 4
566
proc glNormalPointer uses eax, type:dword, stride:dword, pointer:dword
667
proc glNormalPointer uses eax, type:dword, stride:dword, pointer:dword
567
locals
668
locals
568
	p rd 3
669
	p rd 3
569
endl
670
endl
570
;  assert(type == GL_FLOAT);
671
;  assert(type == GL_FLOAT);
571
 
672
 
572
	mov dword[p],OP_NormalPointer
673
	mov dword[p],OP_NormalPointer
573
	mov eax,[stride]
674
	mov eax,[stride]
574
	mov dword[p+4],eax
675
	mov dword[p+4],eax
575
	mov eax,[pointer]
676
	mov eax,[pointer]
576
	mov dword[p+8],eax
677
	mov dword[p+8],eax
577
 
678
 
578
	mov eax,ebp
679
	mov eax,ebp
579
	sub eax,12 ;=sizeof(dd)*3
680
	sub eax,12 ;=sizeof(dd)*3
580
	stdcall gl_add_op,eax
681
	stdcall gl_add_op,eax
581
	ret
682
	ret
582
endp
683
endp
583
 
684
 
584
align 4
685
align 4
585
proc glopTexCoordPointer uses eax ebx ecx, context:dword, p:dword
686
proc glopTexCoordPointer uses eax ebx ecx, context:dword, p:dword
586
	mov eax,[context]
687
	mov eax,[context]
587
	mov ebx,[p]
688
	mov ebx,[p]
588
	mov ecx,[ebx+4] ;ecx = p[1]
689
	mov ecx,[ebx+4] ;ecx = p[1]
589
	mov dword[eax+offs_cont_texcoord_array_size],ecx
690
	mov dword[eax+offs_cont_texcoord_array_size],ecx
590
	mov ecx,[ebx+8] ;ecx = p[2]
691
	mov ecx,[ebx+8] ;ecx = p[2]
591
	mov dword[eax+offs_cont_texcoord_array_stride],ecx
692
	mov dword[eax+offs_cont_texcoord_array_stride],ecx
592
	mov ecx,[ebx+12] ;ecx = p[3]
693
	mov ecx,[ebx+12] ;ecx = p[3]
593
	mov dword[eax+offs_cont_texcoord_array],ecx
694
	mov dword[eax+offs_cont_texcoord_array],ecx
594
	ret
695
	ret
595
endp
696
endp
596
 
697
 
597
align 4
698
align 4
598
proc glTexCoordPointer uses eax, size:dword, type:dword, stride:dword, pointer:dword
699
proc glTexCoordPointer uses eax, size:dword, type:dword, stride:dword, pointer:dword
599
locals
700
locals
600
	p rd 4
701
	p rd 4
601
endl
702
endl
602
;  assert(type == GL_FLOAT);
703
;  assert(type == GL_FLOAT);
603
 
704
 
604
	mov dword[p],OP_TexCoordPointer
705
	mov dword[p],OP_TexCoordPointer
605
	mov eax,[size]
706
	mov eax,[size]
606
	mov dword[p+4],eax
707
	mov dword[p+4],eax
607
	mov eax,[stride]
708
	mov eax,[stride]
608
	mov dword[p+8],eax
709
	mov dword[p+8],eax
609
	mov eax,[pointer]
710
	mov eax,[pointer]
610
	mov dword[p+12],eax
711
	mov dword[p+12],eax
611
 
712
 
612
	mov eax,ebp
713
	mov eax,ebp
613
	sub eax,16 ;=sizeof(dd)*4
714
	sub eax,16 ;=sizeof(dd)*4
614
	stdcall gl_add_op,eax
715
	stdcall gl_add_op,eax
615
	ret
716
	ret
616
endp
717
endp