Subversion Repositories Kolibri OS

Rev

Rev 5153 | Rev 5353 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5153 Rev 5337
Line 1... Line 1...
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
Line -... Line 5...
-
 
5
 
-
 
6
;glArrayElement - использование (рисование) одного элемента из массива
-
 
7
;glDrawArrays - рисование всех элементов в массиве
-
 
8
;glDrawElements - рисование тех элементов в массиве, которые заданны в массиве индексов
5
 
9
 
6
align 4
10
align 4
7
proc glopArrayElement uses eax ebx ecx edx, context:dword, param:dword
11
proc glopArrayElement uses eax ebx ecx edx, context:dword, param:dword
8
locals
12
locals
9
	p rd 5
13
	p rd 5
Line 16... Line 20...
16
	jnc @f
20
	jnc @f
17
		mov ecx,[eax+offs_cont_color_array_size]
21
		mov ecx,[eax+offs_cont_color_array_size]
18
		add ecx,[eax+offs_cont_color_array_stride]
22
		add ecx,[eax+offs_cont_color_array_stride]
19
		imul ecx,ebx
23
		imul ecx,ebx
20
		shl ecx,2
24
		shl ecx,2
21
		add ecx,eax
-
 
22
		add ecx,offs_cont_color_array ;ecx = &context.color_array[i]
25
		add ecx,[eax+offs_cont_color_array] ;ecx = &context.color_array[i]
23
		mov ebx,ebp
26
		mov ebx,ebp
24
		sub ebx,20 ;=sizeof(dd)*5
27
		sub ebx,20 ;=sizeof(dd)*5
25
		mov edx,[ecx]
28
		mov edx,[ecx]
26
		mov [ebx+4],edx
29
		mov [ebx+4],edx
27
		mov edx,[ecx+4]
30
		mov edx,[ecx+4]
Line 42... Line 45...
42
	jnc @f
45
	jnc @f
43
		mov esi,dword[eax+offs_cont_normal_array_stride]
46
		mov esi,dword[eax+offs_cont_normal_array_stride]
44
		add esi,3
47
		add esi,3
45
		imul esi,ebx
48
		imul esi,ebx
46
		shl esi,2
49
		shl esi,2
47
		add esi,eax
-
 
48
		add esi,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)]
49
		mov edi,eax
51
		mov edi,eax
50
		add edi,offs_cont_current_normal
52
		add edi,offs_cont_current_normal
51
		mov ecx,3
53
		mov ecx,3
52
		rep movsd
54
		rep movsd
53
		mov dword[edi],0.0
55
		mov dword[edi],0.0
Line 56... Line 58...
56
	jnc @f
58
	jnc @f
57
		mov ecx,[eax+offs_cont_texcoord_array_size]
59
		mov ecx,[eax+offs_cont_texcoord_array_size]
58
		add ecx,[eax+offs_cont_texcoord_array_stride]
60
		add ecx,[eax+offs_cont_texcoord_array_stride]
59
		imul ecx,ebx
61
		imul ecx,ebx
60
		shl ecx,2
62
		shl ecx,2
61
		add ecx,eax
-
 
62
		add ecx,offs_cont_texcoord_array ;ecx = &context.texcoord_array[i]
63
		add ecx,[eax+offs_cont_texcoord_array] ;ecx = &context.texcoord_array[i]
63
		mov edx,[ecx]
64
		mov edx,[ecx]
64
		mov [eax+offs_cont_current_tex_coord],edx
65
		mov [eax+offs_cont_current_tex_coord],edx
65
		mov edx,[ecx+4]
66
		mov edx,[ecx+4]
66
		mov [eax+offs_cont_current_tex_coord+4],edx
67
		mov [eax+offs_cont_current_tex_coord+4],edx
Line 88... Line 89...
88
	jnc @f
89
	jnc @f
89
		mov ecx,[eax+offs_cont_vertex_array_size]
90
		mov ecx,[eax+offs_cont_vertex_array_size]
90
		add ecx,[eax+offs_cont_vertex_array_stride]
91
		add ecx,[eax+offs_cont_vertex_array_stride]
91
		imul ecx,ebx
92
		imul ecx,ebx
92
		shl ecx,2
93
		shl ecx,2
93
		add ecx,eax
-
 
94
		add ecx,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]
Line 105... Line 105...
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
 
-
 
111
		cmp dword[eax+offs_cont_vertex_array_size],3
110
		cmp dword[eax+offs_cont_vertex_array_size],3
112
		jg .l8
111
		jg .l8
113
			mov edx,1.0
112
			mov edx,1.0
114
			jmp .l9
113
			jmp .l9
115
		.l8:
114
		.l8:
Line 136... Line 135...
136
	stdcall gl_add_op,eax
135
	stdcall gl_add_op,eax
137
	ret
136
	ret
138
endp
137
endp
Line 139... Line 138...
139
 
138
 
-
 
139
align 4
-
 
140
proc glopDrawArrays, context:dword, param:dword
-
 
141
locals
-
 
142
	vi dd ?
-
 
143
	idx dd ?
-
 
144
	states dd ?
-
 
145
	size dd ?
-
 
146
	p rd 8 ;функция glopColor требует 8 параметров, другие функции требуют меньше, берем по максимуму что-бы не портить стек
-
 
147
endl
-
 
148
pushad
-
 
149
	mov edx,[context]
-
 
150
	mov ebx,[param]
-
 
151
	mov ecx,[ebx+12] ;count = param[3].i
-
 
152
	mov eax,[edx+offs_cont_client_states]
-
 
153
	mov [states],eax
-
 
154
	mov eax,[ebx+8]
-
 
155
	mov [idx],eax ;param[2].i
-
 
156
	mov eax,[ebx+4]
-
 
157
	mov [p+4],eax ;p[1].i = param[1].i
-
 
158
	mov eax,ebp
-
 
159
	sub eax,32 ;=sizeof(dd)*8
-
 
160
	stdcall glopBegin, edx,eax
-
 
161
 
-
 
162
	mov dword[vi],0
-
 
163
align 4
-
 
164
	.cycle_0: ;for (int vi=0; vi
-
 
165
	cmp dword[vi],ecx
-
 
166
	jge .cycle_0_end
-
 
167
		bt dword[states],1 ;2^1=COLOR_ARRAY
-
 
168
		jnc @f
-
 
169
			mov esi,[edx+offs_cont_color_array_size]
-
 
170
			mov [size],esi
-
 
171
			add esi,[edx+offs_cont_color_array_stride]
-
 
172
			imul esi,[idx] ;esi = i
-
 
173
			shl esi,2
-
 
174
			add esi,[edx+offs_cont_color_array] ;esi = &context.color_array[i]
-
 
175
			mov edi,ebp
-
 
176
			sub edi,28 ;edi = &p[1]
-
 
177
			movsd ;p[1].f = context.color_array[i]
-
 
178
			movsd
-
 
179
			movsd
-
 
180
			cmp dword[size],3
-
 
181
			jle .e1
-
 
182
				movsd
-
 
183
				sub edi,20 ;&p[0]
-
 
184
				jmp .e2
-
 
185
			.e1:
-
 
186
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
-
 
187
				sub edi,16 ;&p[0]
-
 
188
			.e2:
-
 
189
			mov ebx,ebp
-
 
190
			sub ebx,12 ;ebp-12 = &p[5]
-
 
191
			push ebx
-
 
192
			add ebx,4 ;ebp-8 = &p[6]
-
 
193
			push ebx
-
 
194
			add ebx,4 ;ebp-4 = &p[7]
-
 
195
			push ebx
-
 
196
			stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
-
 
197
			stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi))
-
 
198
		@@:
-
 
199
		bt dword[states],2 ;2^2=NORMAL_ARRAY
-
 
200
		jnc @f
-
 
201
			mov esi,[edx+offs_cont_normal_array_stride]
-
 
202
			add esi,3
-
 
203
			imul esi,[idx]
-
 
204
			shl esi,2
-
 
205
			add esi,[edx+offs_cont_normal_array] ;esi = &context.normal_array[ idx * (3 + context.normal_array_stride) ]
-
 
206
			mov edi,edx
-
 
207
			add edi,offs_cont_current_normal
-
 
208
			movsd ;context.current_normal.X = context.normal_array[i]
-
 
209
			movsd
-
 
210
			movsd
-
 
211
			mov dword[edi],0.0 ;context.current_normal.W = 0.0f
-
 
212
		@@:
-
 
213
		bt dword[states],3 ;2^3=TEXCOORD_ARRAY
-
 
214
		jnc @f
-
 
215
			mov esi,[edx+offs_cont_texcoord_array_size]
-
 
216
			mov [size],esi
-
 
217
			add esi,[edx+offs_cont_texcoord_array_stride]
-
 
218
			imul esi,[idx] ;esi = i
-
 
219
			shl esi,2
-
 
220
			add esi,[edx+offs_cont_texcoord_array] ;esi = &context.texcoord_array[i]
-
 
221
			mov edi,edx
-
 
222
			add edi,offs_cont_current_tex_coord
-
 
223
			movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
-
 
224
			movsd
-
 
225
			cmp dword[size],2
-
 
226
			jle .e3
-
 
227
				movsd
-
 
228
				jmp .e4
-
 
229
			.e3:
-
 
230
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
-
 
231
				add edi,4
-
 
232
			.e4:
-
 
233
			cmp dword[size],3
-
 
234
			jle .e5
-
 
235
				movsd
-
 
236
				jmp @f
-
 
237
			.e5:
-
 
238
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
-
 
239
		@@:
-
 
240
		bt dword[states],0 ;2^0=VERTEX_ARRAY
-
 
241
		jnc @f
-
 
242
			mov esi,[edx+offs_cont_vertex_array_size]
-
 
243
			mov [size],esi
-
 
244
			add esi,[edx+offs_cont_vertex_array_stride]
-
 
245
			imul esi,[idx] ;esi = i
-
 
246
			shl esi,2
-
 
247
			add esi,[edx+offs_cont_vertex_array] ;esi = &context.vertex_array[i]
-
 
248
			mov edi,ebp
-
 
249
			sub edi,28 ;edi = &p[1]
-
 
250
			movsd ;p[1].f = context.vertex_array[i]
-
 
251
			movsd
-
 
252
			cmp dword[size],2
-
 
253
			jle .e6
-
 
254
				movsd
-
 
255
				jmp .e7
-
 
256
			.e6:
-
 
257
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
-
 
258
				add edi,4
-
 
259
			.e7:
-
 
260
			cmp dword[size],3
-
 
261
			jle .e8
-
 
262
				movsd
-
 
263
				sub edi,20 ;edi=&p[0]
-
 
264
				jmp .e9
-
 
265
			.e8:
-
 
266
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
-
 
267
				sub edi,16 ;edi=&p[0]
-
 
268
			.e9:
-
 
269
			stdcall glopVertex, edx,edi
-
 
270
		@@:
-
 
271
		inc dword[idx]
-
 
272
	inc dword[vi]
-
 
273
	jmp .cycle_0
-
 
274
	.cycle_0_end:
-
 
275
 
-
 
276
	;mov eax,ebp
-
 
277
	;sub eax,32 ;=sizeof(dd)*8
-
 
278
	stdcall glopEnd, edx,eax
-
 
279
popad
-
 
280
	ret
-
 
281
endp
-
 
282
 
-
 
283
align 4
-
 
284
proc glDrawArrays uses eax, mode:dword, first:dword, count:dword
-
 
285
locals
-
 
286
	p rd 4
-
 
287
endl
-
 
288
	mov dword[p],OP_DrawArrays
-
 
289
	mov eax,[mode]
-
 
290
	mov dword[p+4],eax
-
 
291
	mov eax,[first]
-
 
292
	mov dword[p+8],eax
-
 
293
	mov eax,[count]
-
 
294
	mov dword[p+12],eax
-
 
295
 
-
 
296
	mov eax,ebp
-
 
297
	sub eax,16 ;=sizeof(dd)*4
-
 
298
	stdcall gl_add_op,eax
-
 
299
	ret
-
 
300
endp
-
 
301
 
-
 
302
align 4
-
 
303
proc glopDrawElements uses eax ebx edx, context:dword, param:dword
-
 
304
locals
-
 
305
	p rd 5
-
 
306
endl
-
 
307
 
-
 
308
	mov edx,[context]
-
 
309
	mov ebx,[param]
-
 
310
  ;int i;
-
 
311
  ;int idx;
-
 
312
  ;int states = c->client_states;
-
 
313
  ;int count = param[2].i;
-
 
314
  ;int type = param[3].i;
-
 
315
  ;unsigned int *indices_u32 = (unsigned int*)param[4].p;
-
 
316
  ;unsigned short *indices_u16 = (unsigned short*)indices_u32;
-
 
317
 
-
 
318
	mov eax,[ebx+4]
-
 
319
	mov [p+4],eax ;p[1].i = param[1].i
-
 
320
	mov eax,ebp
-
 
321
	sub eax,20 ;=sizeof(dd)*5
-
 
322
	stdcall glopBegin, edx,eax
-
 
323
 
-
 
324
;  for (int ii=0; ii
-
 
325
;    idx = (type == GL_UNSIGNED_INT) ? indices_u32[ii] : indices_u16[ii];
-
 
326
;    if (states & COLOR_ARRAY) {
-
 
327
;      GLParam p[5];
-
 
328
;      int size = c->color_array_size; 
-
 
329
;      i = idx * (size + c->color_array_stride);
-
 
330
;      p[1].f = c->color_array[i];
-
 
331
;      p[2].f = c->color_array[i+1];
-
 
332
;      p[3].f = c->color_array[i+2];
-
 
333
;      p[4].f = size > 3 ? c->color_array[i+3] : 1.0f;
-
 
334
;      glopColor(c, p);  
-
 
335
;    }
-
 
336
;    if (states & NORMAL_ARRAY) {
-
 
337
;      i = idx * (3 + c->normal_array_stride);
-
 
338
;      c->current_normal.X = c->normal_array[i];
-
 
339
;      c->current_normal.Y = c->normal_array[i+1];
-
 
340
;      c->current_normal.Z = c->normal_array[i+2];
-
 
341
;      c->current_normal.W = 0.0f;
-
 
342
;    }
-
 
343
;    if (states & TEXCOORD_ARRAY) {
-
 
344
;      int size = c->texcoord_array_size;
-
 
345
;      i = idx * (size + c->texcoord_array_stride);
-
 
346
;      c->current_tex_coord.X = c->texcoord_array[i];
-
 
347
;      c->current_tex_coord.Y = c->texcoord_array[i+1];
-
 
348
;      c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f;
-
 
349
;      c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f;
-
 
350
;    }
-
 
351
;    if (states & VERTEX_ARRAY) {
-
 
352
;      GLParam p[5];
-
 
353
;      int size = c->vertex_array_size;
-
 
354
;      i = idx * (size + c->vertex_array_stride);
-
 
355
;      p[1].f = c->vertex_array[i];
-
 
356
;      p[2].f = c->vertex_array[i+1];
-
 
357
;      p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f;
-
 
358
;      p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f;
-
 
359
;      glopVertex(c, p);
-
 
360
;    }
-
 
361
;  }
-
 
362
	mov eax,ebp
-
 
363
	sub eax,20 ;=sizeof(dd)*5
-
 
364
	stdcall glopEnd, edx,eax
-
 
365
	ret
-
 
366
endp
-
 
367
 
-
 
368
align 4
-
 
369
proc glDrawElements uses eax, mode:dword, count:dword, type:dword, indices:dword
-
 
370
locals
-
 
371
	p rd 5
-
 
372
endl
-
 
373
;assert(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT/* nonstandard */);
-
 
374
	mov dword[p],OP_DrawElements
-
 
375
	mov eax,[mode]
-
 
376
	mov dword[p+4],eax
-
 
377
	mov eax,[count]
-
 
378
	mov dword[p+8],eax
-
 
379
	mov eax,[type]
-
 
380
	mov dword[p+12],eax
-
 
381
	mov eax,[indices]
-
 
382
	mov dword[p+16],eax
-
 
383
 
-
 
384
	mov eax,ebp
-
 
385
	sub eax,20 ;=sizeof(dd)*5
-
 
386
	stdcall gl_add_op,eax
-
 
387
	ret
-
 
388
endp
-
 
389
 
140
align 4
390
align 4
141
proc glopEnableClientState uses eax ebx, context:dword, p:dword
391
proc glopEnableClientState uses eax ebx, context:dword, p:dword
142
	mov eax,[context]
392
	mov eax,[context]
143
	mov ebx,[p]
393
	mov ebx,[p]
144
	mov ebx,[ebx+4] ;ebx = p[1]
394
	mov ebx,[ebx+4] ;ebx = p[1]
Line 245... Line 495...
245
locals
495
locals
246
	p rd 4
496
	p rd 4
247
endl
497
endl
248
;  assert(type == GL_FLOAT);
498
;  assert(type == GL_FLOAT);
Line 249... Line 499...
249
 
499
 
250
	mov dword[p],OP_TexCoordPointer
500
	mov dword[p],OP_VertexPointer
251
	mov eax,[size]
501
	mov eax,[size]
252
	mov dword[p+4],eax
502
	mov dword[p+4],eax
253
	mov eax,[stride]
503
	mov eax,[stride]
254
	mov dword[p+8],eax
504
	mov dword[p+8],eax