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 |