Subversion Repositories Kolibri OS

Rev

Rev 6287 | Rev 8409 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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