Subversion Repositories Kolibri OS

Rev

Rev 6287 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5381 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01'
4
	dd 0x1
5
	dd start
6
	dd i_end
7
	dd mem,stacktop
8
	dd 0,cur_dir_path
9
 
10
include '../../../../../proc32.inc'
11
include '../../../../../macros.inc'
12
include '../../../../../develop/libraries/box_lib/load_lib.mac'
13
include '../../../../../dll.inc'
14
include '../opengl_const.inc'
15
 
16
@use_library
17
 
18
align 4
19
start:
20
	load_library name_tgl, cur_dir_path, library_path, system_path, \
21
		err_message_found_lib, head_f_l, import_lib_tinygl, err_message_import, head_f_i
22
	cmp eax,-1
23
	jz button.exit
24
 
25
	mcall 40,0x27
26
 
27
	;заполняем массив индексов из файла house.3ds (который вшит внутрь данной программы)
28
	mov esi,house_3ds
29
	add esi,0x1798 ;смещение по которому идет информация о гранях в файле 3ds (получено с использованием программы info_3ds)
30
	mov edi,Indices
31
	mov eax,0x1a6 ;число граней в файле 3ds (получено с использованием программы info_3ds)
32
	@@:
33
		movsd
34
		movsw
35
		add esi,2 ;пропускаем свойства грани
36
		dec eax
37
		or eax,eax
38
	jnz @b
39
 
40
	;первоначальные настройки контекста tinygl
41
	stdcall [kosglMakeCurrent], 10,10,400,350,ctx1
42
	stdcall [glEnable], GL_DEPTH_TEST
43
	stdcall [glClearColor], 0.0,0.0,0.0,0.0
44
	stdcall [glShadeModel], GL_SMOOTH
45
 
46
	call draw_3d
47
 
48
align 4
49
red_win:
50
	call draw_window
51
 
52
align 4
53
still:
54
	mcall 10
55
	cmp al,1
56
	jz red_win
57
	cmp al,2
58
	jz key
59
	cmp al,3
60
	jz button
61
	jmp still
62
 
63
align 4
64
draw_window:
65
	pushad
66
	mcall 12,1
67
 
68
	mov edx,0x33ffffff
69
	mcall 0,(50 shl 16)+430,(30 shl 16)+400,,,caption
70
	stdcall [kosglSwapBuffers]
71
 
72
	mcall 12,2
73
	popad
74
	ret
75
 
76
align 4
77
key:
78
	mcall 2
79
 
80
	cmp ah,27 ;Esc
81
	je button.exit
82
 
83
	cmp ah,61 ;+
84
	jne @f
85
		fld dword[scale]
86
		fadd dword[delt_sc]
87
		fstp dword[scale]
88
		call draw_3d
89
		stdcall [kosglSwapBuffers]
90
	@@:
91
	cmp ah,45 ;-
92
	jne @f
93
		fld dword[scale]
94
		fsub dword[delt_sc]
95
		fstp dword[scale]
96
		call draw_3d
97
		stdcall [kosglSwapBuffers]
98
	@@:
99
	cmp ah,178 ;Up
100
	jne @f
101
		fld dword[angle_y]
102
		fadd dword[delt_size]
103
		fstp dword[angle_y]
104
		call draw_3d
105
		stdcall [kosglSwapBuffers]
106
	@@:
107
	cmp ah,177 ;Down
108
	jne @f
109
		fld dword[angle_y]
110
		fsub dword[delt_size]
111
		fstp dword[angle_y]
112
		call draw_3d
113
		stdcall [kosglSwapBuffers]
114
	@@:
115
	cmp ah,176 ;Left
116
	jne @f
117
		fld dword[angle_x]
118
		fadd dword[delt_size]
119
		fstp dword[angle_x]
120
		call draw_3d
121
		stdcall [kosglSwapBuffers]
122
	@@:
123
	cmp ah,179 ;Right
124
	jne @f
125
		fld dword[angle_x]
126
		fsub dword[delt_size]
127
		fstp dword[angle_x]
128
		call draw_3d
129
		stdcall [kosglSwapBuffers]
130
	@@:
131
 
132
	jmp still
133
 
134
align 4
135
button:
136
	mcall 17
137
	cmp ah,1
138
	jne still
139
.exit:
140
	mcall -1
141
 
142
 
143
align 4
144
caption db 'Test opengl 1.1 arrays, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0
145
align 4
146
ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
147
;sizeof.TinyGLContext = 28
148
 
149
align 4
150
draw_3d:
151
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
152
stdcall [glPushMatrix]
153
 
154
	;масштаб и повороты
155
	stdcall [glTranslatef], 0.0,0.0,0.5
156
	stdcall [glScalef], [scale], [scale], [scale]
157
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
158
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
159
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
160
 
161
	;рисование через тндексный массив
162
	mov eax,house_3ds ;начало внедренного файла 3ds
163
	add eax,0xeb ;смещение по которому идут координаты вершин (получено с использованием программы info_3ds)
164
	stdcall [glVertexPointer], 3, GL_FLOAT, 0, eax ;задаем массив для вершин, 3 - число координат для одной вершины
165
	stdcall [glEnableClientState], GL_VERTEX_ARRAY ;включаем режим рисования вершин
166
	stdcall [glDrawElements], GL_TRIANGLES, 0x1a6*3, GL_UNSIGNED_SHORT, Indices ;mode, count, type, *indices
167
	stdcall [glDisableClientState], GL_VERTEX_ARRAY ;отключаем режим рисования вершин
168
 
169
stdcall [glPopMatrix]
170
ret
171
 
172
align 4
173
scale dd 0.0065 ;начальный масштаб (в идеальном случае должен вычислятся, но для даного примера подобран в ручную на глаз)
174
delt_sc dd 0.0005
175
angle_z dd 90.0
176
angle_y dd 90.0
177
angle_x dd 0.0
178
delt_size dd 3.0
179
 
180
align 4
181
house_3ds: ;внедряем файл внутрь программы (в идеальном случае должен открыватся через окно диалога, но для облегчения примера вшит внутрь)
182
file '../../../../../demos/3DS/3ds_objects/house.3ds'
183
align 4
184
Indices rb 0x1a6*6 ;0x1a6 - число граней, на каждую грань по 3 точки, индекс точки 2 байта
185
 
186
;--------------------------------------------------
187
align 4
188
import_lib_tinygl:
189
 
190
macro E_LIB n
191
{
192
	n dd sz_#n
193
}
194
include '../export.inc'
195
	dd 0,0
196
macro E_LIB n
197
{
198
	sz_#n db `n,0
199
}
200
include '../export.inc'
201
 
202
;--------------------------------------------------
203
system_path db '/sys/lib/'
204
name_tgl db 'tinygl.obj',0
205
err_message_found_lib db 'Sorry I cannot load library tinygl.obj',0
206
head_f_i:
207
head_f_l db 'System error',0
208
err_message_import db 'Error on load import library tinygl.obj',0
209
;--------------------------------------------------
210
 
211
i_end:
212
	rb 4096
213
stacktop:
214
cur_dir_path:
215
	rb 4096
216
library_path:
217
	rb 4096
218
mem: