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 |