Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
6060 IgorA 1
use32
6889 IgorA 2
	org 0
6060 IgorA 3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
4
	dd 1, start, i_end, mem, stacktop, file_name, sys_path
5
 
6513 IgorA 6
version_edit equ 0
7
 
6060 IgorA 8
include '../../macros.inc'
9
include '../../proc32.inc'
6083 serge 10
include '../../KOSfuncs.inc'
6889 IgorA 11
include '../../develop/libraries/libs-dev/libimg/libimg.inc'
6211 IgorA 12
include '../../load_img.inc'
8262 IgorA 13
include '../../load_lib.mac'
6060 IgorA 14
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
15
include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
16
include 'lang.inc'
17
include 'info_fun_float.inc'
18
include 'info_menu.inc'
19
include 'data.inc'
7610 IgorA 20
include 'convert_stl_3ds.inc'
6060 IgorA 21
 
22
3d_wnd_l equ 205 ;отступ для tinygl буфера слева
23
3d_wnd_t equ  47 ;отступ для tinygl буфера сверху
24
3d_wnd_w equ 344
25
3d_wnd_h equ 312
26
 
8255 IgorA 27
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
6060 IgorA 28
 
29
ID_ICON_CHUNK_MAIN equ 0 ;иконка главного блока
30
ID_ICON_CHUNK_NOT_FOUND equ 1 ;иконка не известного блока
31
ID_ICON_DATA equ 2 ;иконка для данных блока, не определенной структуры
32
ID_ICON_POINT equ 8
33
ID_ICON_POINT_SEL equ 9
34
 
35
FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока
36
 
6509 IgorA 37
size_one_list equ 42+sizeof.obj_3d
38
list_offs_chunk_del equ 8 ;может ли блок удалятся
39
list_offs_chunk_lev equ 9 ;уровень блока (прописан в данные узла)
40
list_offs_p_data equ 10 ;указатель на подпись блока
41
list_offs_obj3d equ 14 ;указатель на структуру данных для 3d объекта
42
list_offs_text equ 14+sizeof.obj_3d ;сдвиг начала текста в листе
6060 IgorA 43
include 'info_o3d.inc'
44
 
45
align 4
46
fl255 dd 255.0
47
open_file_data dd 0 ;указатель на память для открытия файлов 3ds
48
open_file_size dd 0 ;размер открытого файла
49
 
50
;
51
main_wnd_height equ 460 ;высота главного окна программы
52
fn_toolbar db 'toolbar.png',0
6130 leency 53
IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3
6060 IgorA 54
image_data_toolbar dd 0
55
;
6211 IgorA 56
icon_tl_sys dd 0 ;указатель на память для хранения системных иконок
57
icon_toolbar dd 0 ;указатель на память для хранения иконок объектов
6060 IgorA 58
 
59
;--------------------------------------
60
level_stack dd 0
61
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
62
 
63
align 4
64
file_3ds: ;переменные используемые при открытии файла
65
.offs: dd 0 ;+0 указатель на начало блока
66
.size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds)
67
rb 8*MAX_FILE_LEVEL
68
 
69
buffer rb size_one_list ;буфер для добавления структур в список tree1
70
 
71
txt_3ds_symb db 0,0
72
;--------------------------------------
73
 
74
 
75
 
76
align 4
77
start:
78
	;--- copy cmd line ---
79
	mov esi,file_name
80
	mov edi,openfile_path
81
@@:
82
	lodsd
7610 IgorA 83
	or eax,eax
84
	jz @f ;выход, если 0
6060 IgorA 85
	stosd
86
	jmp @b
87
@@:
88
	stosd
89
 
90
	load_libraries l_libs_start,l_libs_end
91
	;проверка на сколько удачно загузились библиотеки
92
	mov	ebp,lib_0
93
	.test_lib_open:
94
	cmp	dword [ebp+ll_struc_size-4],0
95
	jz	@f
96
		mcall SF_TERMINATE_PROCESS ;exit not correct
97
	@@:
98
	add ebp,ll_struc_size
99
	cmp ebp,l_libs_end
100
	jl .test_lib_open
6164 leency 101
	mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
6247 IgorA 102
	mcall SF_SET_EVENTS_MASK,0xC0000027
6060 IgorA 103
 
104
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
105
 
106
	;kmenu initialisation
107
	stdcall [kmenu_init],sc
108
	stdcall [ksubmenu_new]
109
	mov [main_menu], eax
110
 
111
	stdcall [ksubmenu_new]
112
	mov [main_menu_view], eax
6513 IgorA 113
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Vertexes, 5
6060 IgorA 114
	stdcall [ksubmenu_add], [main_menu_view], eax
115
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces, 6
116
	stdcall [ksubmenu_add], [main_menu_view], eax
117
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Fill, 7
118
	stdcall [ksubmenu_add], [main_menu_view], eax
6513 IgorA 119
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Mat, 8
120
	stdcall [ksubmenu_add], [main_menu_view], eax
121
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
122
	stdcall [ksubmenu_add], [main_menu_view], eax
6509 IgorA 123
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Light, 9
6060 IgorA 124
	stdcall [ksubmenu_add], [main_menu_view], eax
6513 IgorA 125
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Smooth, 10
126
	stdcall [ksubmenu_add], [main_menu_view], eax
6060 IgorA 127
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
128
	stdcall [ksubmenu_add], [main_menu_view], eax
6513 IgorA 129
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Reset, 11
6060 IgorA 130
	stdcall [ksubmenu_add], [main_menu_view], eax
131
	stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_View, [main_menu_view]
132
	stdcall [ksubmenu_add], [main_menu], eax
133
 
134
	mov dword[w_scr_t1.type],1
7610 IgorA 135
	stdcall [tl_data_init], tree1
6060 IgorA 136
	;системные иконки 16*16 для tree_list
7610 IgorA 137
	include_image_file 'tl_sys_16.png', icon_tl_sys
6060 IgorA 138
	;если изображение не открылось, то в icon_tl_sys будут
139
	;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
140
	mov eax,dword[icon_tl_sys]
141
	mov dword[tree1.data_img_sys],eax
142
 
6211 IgorA 143
	load_image_file 'objects.png', icon_toolbar
6060 IgorA 144
	mov eax,dword[icon_toolbar]
145
	mov dword[tree1.data_img],eax
146
 
6211 IgorA 147
	load_image_file 'font8x9.bmp', image_data_toolbar
6060 IgorA 148
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
149
	stdcall mem.Free,[image_data_toolbar] ;освобождаем память
150
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
151
	stdcall [buf2d_convert_text_matrix], buf_1
152
 
6211 IgorA 153
	load_image_file fn_toolbar, image_data_toolbar
6060 IgorA 154
 
155
	;работа с файлом настроек
156
	copy_path ini_name,sys_path,file_name,0
157
	mov dword[def_dr_mode],0
8262 IgorA 158
	stdcall [ini_get_int],file_name,ini_sec_w3d,key_dv,1
6060 IgorA 159
	or eax,eax
160
	jz @f
161
		or dword[def_dr_mode], 1 shl bit_vertexes
162
	@@:
8262 IgorA 163
	stdcall [ini_get_int],file_name,ini_sec_w3d,key_df,1
6060 IgorA 164
	or eax,eax
165
	jz @f
166
		or dword[def_dr_mode], 1 shl bit_faces
167
	@@:
8262 IgorA 168
	stdcall [ini_get_int],file_name,ini_sec_w3d,key_dff,1
6060 IgorA 169
	or eax,eax
170
	jz @f
171
		or dword[def_dr_mode], 1 shl bit_faces_fill
172
	@@:
8262 IgorA 173
	stdcall [ini_get_int],file_name,ini_sec_w3d,key_dfm,1
6513 IgorA 174
	or eax,eax
175
	jz @f
176
		or dword[def_dr_mode], 1 shl bit_faces_mat
177
	@@:
8262 IgorA 178
	stdcall [ini_get_int],file_name,ini_sec_w3d,key_dl,1
6060 IgorA 179
	or eax,eax
180
	jz @f
181
		or dword[def_dr_mode], 1 shl bit_light
182
	@@:
8262 IgorA 183
	stdcall [ini_get_int],file_name,ini_sec_w3d,key_ds,1
6513 IgorA 184
	or eax,eax
185
	jz @f
186
		or dword[def_dr_mode], 1 shl bit_smooth
187
	@@:
8262 IgorA 188
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
6060 IgorA 189
	mov [color_ox],eax
8262 IgorA 190
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
6060 IgorA 191
	mov [color_oy],eax
8262 IgorA 192
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
6060 IgorA 193
	mov [color_oz],eax
8262 IgorA 194
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
6060 IgorA 195
	mov [color_bk],eax
196
	shr eax,8
197
	mov [color_bk+4],eax
198
	shr eax,8
199
	mov [color_bk+8],eax
8262 IgorA 200
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
6060 IgorA 201
	mov [color_vert],eax
8262 IgorA 202
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
6060 IgorA 203
	mov [color_face],eax
8262 IgorA 204
	stdcall [ini_get_color],file_name,ini_sec_w3d,key_select,0xffff00
6060 IgorA 205
	mov [color_select],eax
206
	finit
207
	fild dword[color_bk+8]
208
	fdiv dword[fl255]
209
	fstp dword[color_bk+8]
210
	mov eax,[color_bk+4]
211
	and eax,0xff
212
	mov [color_bk+4],eax
213
	fild dword[color_bk+4]
214
	fdiv dword[fl255]
215
	fstp dword[color_bk+4]
216
	mov eax,[color_bk]
217
	and eax,0xff
218
	mov [color_bk],eax
219
	fild dword[color_bk]
220
	fdiv dword[fl255]
221
	fstp dword[color_bk]
222
 
223
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
224
	mov [last_time],eax
225
 
226
	stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,3d_wnd_w,3d_wnd_h,ctx1
227
	stdcall [glEnable], GL_DEPTH_TEST
228
	stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов
229
	stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0
230
	stdcall [glShadeModel], GL_SMOOTH
8083 IgorA 231
	call [gluNewQuadric]
6060 IgorA 232
	mov [qObj],eax
233
 
234
	mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
235
	mov eax,[eax] ;eax -> ZBuffer
8083 IgorA 236
	mov eax,[eax+ZBuffer.pbuf]
6060 IgorA 237
	mov dword[buf_ogl],eax
238
 
239
	;open file from cmd line
240
	cmp dword[openfile_path],0
241
	je @f
242
		call but_open_file.no_dlg
243
	@@:
244
	call draw_window
245
 
246
align 4
247
still:
248
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
249
	mov ebx,[last_time]
250
	add ebx,10 ;задержка
251
	cmp ebx,eax
252
	jge @f
253
		mov ebx,eax
254
	@@:
255
	sub ebx,eax
256
	mcall SF_WAIT_EVENT_TIMEOUT
7610 IgorA 257
	or eax,eax
258
	jz timer_funct
6060 IgorA 259
 
260
	cmp al,1
261
	jne @f
262
		call draw_window
263
		jmp still
264
	@@:
265
	cmp al,2
266
	jz key
267
	cmp al,3
268
	jz button
269
	cmp al,6
270
	jne @f
271
		mcall SF_THREAD_INFO,procinfo,-1
272
		cmp ax,word[procinfo+4]
273
		jne @f ;окно не активно
274
		call mouse
275
	@@:
276
	jmp still
277
 
278
align 4
279
mouse:
280
	push eax ebx
281
	mcall SF_MOUSE_GET,SSF_BUTTON_EXT
282
	bt eax,0
283
	jnc .end_m
284
		;mouse l. but. move
285
		cmp dword[mouse_drag],1
286
		jne .end_m
6081 IgorA 287
 
288
		stdcall [tl_node_get_data],tree1
7610 IgorA 289
		or eax,eax
290
		jz .end_d
8083 IgorA 291
			mov ebx,[eax]
6081 IgorA 292
			add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
293
			cmp word[ebx],CHUNK_OBJBLOCK
294
			jne .end_d
295
 
6060 IgorA 296
		mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
297
		mov ebx,eax
8083 IgorA 298
		sar ebx,16 ;mouse.x
6060 IgorA 299
		cmp ebx,3d_wnd_l
300
		jg @f
301
			mov ebx,3d_wnd_l
302
		@@:
303
		sub ebx,3d_wnd_l
304
		cmp ebx,3d_wnd_w
305
		jle @f
306
			mov ebx,3d_wnd_w
307
		@@:
8083 IgorA 308
		movsx eax,ax ;mouse.y
6060 IgorA 309
		cmp eax,3d_wnd_t
310
		jg @f
311
			mov eax,3d_wnd_t
312
		@@:
313
		sub eax,3d_wnd_t
314
		cmp eax,3d_wnd_h
315
		jle @f
316
			mov eax,3d_wnd_h
317
		@@:
318
		finit
319
		fild dword[mouse_y]
320
		mov [mouse_y],eax
321
		fisub dword[mouse_y]
322
		fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
323
		fadd dword[angle_x]
324
		fstp dword[angle_x]
325
 
326
		fild dword[mouse_x]
327
		mov [mouse_x],ebx
328
		fisub dword[mouse_x]
329
		fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
330
		fadd dword[angle_y]
331
		fstp dword[angle_y]
332
 
333
		stdcall [tl_node_get_data],tree1
6081 IgorA 334
		;cmp eax,0 - не надо, было сделано выше
6060 IgorA 335
		add eax,list_offs_obj3d
336
		stdcall draw_3d, eax
337
		jmp .end_d
338
	.end_m:
339
	bt eax,16
340
	jnc @f
341
		;mouse l. but. up
342
		mov dword[mouse_drag],0
343
		jmp .end_d
344
	@@:
345
	bt eax,8
346
	jnc .end_d
347
		;mouse l. but. press
348
		mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
349
		mov ebx,eax
8083 IgorA 350
		sar ebx,16 ;mouse.x
6060 IgorA 351
		cmp ebx,3d_wnd_l
352
		jl .end_d
353
		sub ebx,3d_wnd_l
354
		cmp ebx,3d_wnd_w
355
		jg .end_d
8083 IgorA 356
		movsx eax,ax ;mouse.y
6060 IgorA 357
		cmp eax,3d_wnd_t
358
		jl .end_d
359
		sub eax,3d_wnd_t
360
		cmp eax,3d_wnd_h
361
		jg .end_d
362
		mov dword[mouse_drag],1
363
		mov dword[mouse_x],ebx
364
		mov dword[mouse_y],eax
365
	.end_d:
366
 
8083 IgorA 367
	stdcall [tl_mouse], tree1
6060 IgorA 368
	stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
369
	pop ebx eax
370
	ret
371
 
372
align 4
373
timer_funct:
374
	pushad
375
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
376
	mov [last_time],eax
377
 
378
	;просматриваем выделенный блок данных
379
	stdcall [tl_node_get_data],tree1
7610 IgorA 380
	or eax,eax
381
	jz .end_f
8083 IgorA 382
		lea edi,[eax+list_offs_obj3d]
6060 IgorA 383
		mov ebx,eax
8083 IgorA 384
		mov eax,[ebx]
385
		mov ecx,[ebx+4] ;размер блока
6060 IgorA 386
		stdcall hex_in_str, txt_3ds_offs.dig, eax,8
387
		stdcall hex_in_str, txt_3ds_offs.siz, ecx,8
388
 
8083 IgorA 389
		add eax,[open_file_data] ;получаем значение сдвига в памяти
390
		cmp [offs_last_timer],eax
6060 IgorA 391
		je .end_f
392
			;если выделенный блок данных не совпадает с последним запомненным
8083 IgorA 393
			mov [offs_last_timer],eax
6060 IgorA 394
 
395
			cmp word[eax],CHUNK_OBJBLOCK
396
			jne .end_oblo
6889 IgorA 397
			cmp dword[edi+obj_3d.poi_count],2
6060 IgorA 398
			jl .ini_oblo
399
				stdcall draw_3d,edi
400
				jmp .end_f
401
			.ini_oblo:
402
				stdcall obj_init,edi ;попытка настроить переменные объекта
6889 IgorA 403
				cmp dword[edi+obj_3d.poi_count],2
6060 IgorA 404
				jl .end_f
405
					call mnu_reset_settings ;сброс углов поворота и режимов рисования
406
				jmp .end_f
407
			.end_oblo:
6081 IgorA 408
 
409
			cmp word[eax],CHUNK_MATERIAL
410
			jne .end_mblo
6889 IgorA 411
			cmp dword[edi+material.name],0
6081 IgorA 412
			je .ini_mblo
413
				stdcall draw_material,edi
414
				jmp .end_f
415
			.ini_mblo:
6509 IgorA 416
				stdcall mat_init,edi,eax ;попытка настроить данные материала
6889 IgorA 417
				cmp dword[edi+material.name],0
6081 IgorA 418
				je .end_f
419
					stdcall draw_material,edi
420
				jmp .end_f
421
			.end_mblo:
422
 
423
			stdcall buf_draw_beg, buf_ogl
6060 IgorA 424
			stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_3ds_offs,5,35,0xb000
8083 IgorA 425
			mov edx,[ebx+list_offs_p_data]
7610 IgorA 426
			or edx,edx ;смотрим есть ли описание блока
427
			jz .no_info
6060 IgorA 428
				stdcall [buf2d_draw_text], buf_ogl, buf_1,edx,5,45,0xb000
429
			.no_info:
430
			stdcall [buf2d_draw], buf_ogl ;обновляем буфер на экране
431
	.end_f:
432
	popad
433
	jmp still
434
 
435
align 4
436
draw_window:
437
pushad
438
	mcall SF_REDRAW,SSF_BEGIN_DRAW
439
	mov edx,[sc.work]
440
	or  edx,0x33000000
441
	mcall SF_CREATE_WINDOW, (20 shl 16)+560, (20 shl 16)+main_wnd_height,,, capt
442
 
443
	mcall SF_THREAD_INFO,procinfo,-1
444
	mov eax,dword[procinfo.box.height]
445
	cmp eax,250
446
	jge @f
447
		mov eax,250
448
	@@:
449
	sub eax,30
450
	sub eax,[tree1.box_top]
451
	mov [tree1.box_height],eax
452
	mov word[w_scr_t1.y_size],ax ;новые размеры скроллинга
453
 
454
	stdcall [kmainmenu_draw], [main_menu]
455
 
456
	mov esi,[sc.work_button]
6130 leency 457
	mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(24 shl 16)+20,0x40000003
458
	mcall ,(30 shl 16)+20,,0x40000004 ;open
6509 IgorA 459
	mcall ,(3d_wnd_l shl 16)+20,,0x40000005 ;вершины вкл.
460
	mcall ,((3d_wnd_l+25) shl 16)+20,,0x40000006 ;каркасные грани вкл.
461
	mcall ,((3d_wnd_l+50) shl 16)+20,,0x40000007 ;заливка граней вкл.
462
	mcall ,((3d_wnd_l+75) shl 16)+20,,0x40000008 ;грани по материалам вкл.
463
	mcall ,((3d_wnd_l+100) shl 16)+20,,0x40000009 ;свет вкл./выкл.
6513 IgorA 464
	mcall ,((3d_wnd_l+125) shl 16)+20,,0x4000000a ;сглаживание
465
	mcall ,((3d_wnd_l+150) shl 16)+20,,0x4000000b ;сброс
6889 IgorA 466
	mcall ,((3d_wnd_l+175) shl 16)+20,,0x4000000c ;скрин из 3d окна
6060 IgorA 467
 
6130 leency 468
	mcall SF_PUT_IMAGE,[image_data_toolbar],(21 shl 16)+21,(5 shl 16)+24 ;new
6060 IgorA 469
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
6130 leency 470
	mcall ,,,(30 shl 16)+24 ;open
6060 IgorA 471
	add ebx,IMAGE_TOOLBAR_ICON_SIZE*6
6509 IgorA 472
	mcall ,,,((3d_wnd_l) shl 16)+24 ;вершины вкл.
6060 IgorA 473
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
6509 IgorA 474
	mcall ,,,((3d_wnd_l+25) shl 16)+24 ;каркасные грани вкл.
6060 IgorA 475
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
6509 IgorA 476
	mcall ,,,((3d_wnd_l+50) shl 16)+24 ;заливка граней вкл.
6060 IgorA 477
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
6509 IgorA 478
	mcall ,,,((3d_wnd_l+100) shl 16)+24 ;свет вкл./выкл.
6060 IgorA 479
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
6513 IgorA 480
	mcall ,,,((3d_wnd_l+150) shl 16)+24 ;сброс
6509 IgorA 481
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
482
	mcall ,,,((3d_wnd_l+75) shl 16)+24 ;грани по материалам вкл.
6513 IgorA 483
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
484
	mcall ,,,((3d_wnd_l+125) shl 16)+24 ;сглаживание
6889 IgorA 485
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
486
	mcall ,,,((3d_wnd_l+175) shl 16)+24 ;скрин из 3d окна
6060 IgorA 487
 
488
	mov dword[w_scr_t1.all_redraw],1
489
	stdcall [tl_draw], tree1
490
	stdcall [buf2d_draw], buf_ogl
491
 
492
	mcall SF_REDRAW,SSF_END_DRAW
493
popad
494
	ret
495
 
496
align 4
497
key:
498
	mcall SF_GET_KEY
499
 
500
	cmp dword[el_focus], tree1
501
	jne @f
502
		stdcall [tl_key], tree1
503
		jmp .end
504
	@@:
505
 
506
	cmp ah,178 ;Up
507
	jne @f
508
		fld dword[angle_x]
509
		fadd dword[delt_size]
510
		fstp dword[angle_x]
511
		stdcall [tl_node_get_data],tree1
7610 IgorA 512
		or eax,eax
513
		jz .end
6060 IgorA 514
		add eax,list_offs_obj3d
515
		stdcall draw_3d, eax
516
		jmp .end
517
	@@:
518
	cmp ah,177 ;Down
519
	jne @f
520
		fld dword[angle_x]
521
		fsub dword[delt_size]
522
		fstp dword[angle_x]
523
		stdcall [tl_node_get_data],tree1
7610 IgorA 524
		or eax,eax
525
		jz .end
6060 IgorA 526
		add eax,list_offs_obj3d
527
		stdcall draw_3d, eax
528
		jmp .end
529
	@@:
530
	cmp ah,176 ;Left
531
	jne @f
532
		fld dword[angle_y]
533
		fadd dword[delt_size]
534
		fstp dword[angle_y]
535
		stdcall [tl_node_get_data],tree1
7610 IgorA 536
		or eax,eax
537
		jz .end
6060 IgorA 538
		add eax,list_offs_obj3d
539
		stdcall draw_3d, eax
540
		jmp .end
541
	@@:
542
	cmp ah,179 ;Right
543
	jne @f
544
		fld dword[angle_y]
545
		fsub dword[delt_size]
546
		fstp dword[angle_y]
547
		stdcall [tl_node_get_data],tree1
7610 IgorA 548
		or eax,eax
549
		jz .end
6060 IgorA 550
		add eax,list_offs_obj3d
551
		stdcall draw_3d, eax
552
		;jmp .end
553
	@@:
554
 
555
	.end:
556
	jmp still
557
 
558
 
559
align 4
560
button:
561
	mcall SF_GET_BUTTON
562
	cmp ah,3
563
	jne @f
564
		call but_new_file
565
		jmp still
566
	@@:
567
	cmp ah,4
568
	jne @f
569
		call but_open_file
570
		jmp still
571
	@@:
572
 
573
	;menu functions
574
	cmp ah,5
575
	jne @f
576
		call mnu_vertexes_on
577
		jmp still
578
	@@:
579
	cmp ah,6
580
	jne @f
581
		call mnu_edges_on
582
		jmp still
583
	@@:
584
	cmp ah,7
585
	jne @f
586
		call mnu_faces_on
587
		jmp still
588
	@@:
589
	cmp ah,8
590
	jne @f
6509 IgorA 591
		call mnu_faces_mat
6060 IgorA 592
		jmp still
593
	@@:
594
	cmp ah,9
595
	jne @f
6509 IgorA 596
		call mnu_light_on_off
597
		jmp still
598
	@@:
599
	cmp ah,10
600
	jne @f
6513 IgorA 601
		call mnu_smooth_on_off
602
		jmp still
603
	@@:
604
	cmp ah,11
605
	jne @f
6060 IgorA 606
		call mnu_reset_settings
607
		jmp still
608
	@@:
6889 IgorA 609
	cmp ah,12
610
	jne @f
611
		call mnu_make_scrshot
612
		jmp still
613
	@@:
6060 IgorA 614
 
615
	cmp ah,1
616
	jne still
617
.exit:
618
	mov dword[tree1.data_img],0
619
	mov dword[tree1.data_img_sys],0
620
	stdcall [tl_data_clear], tree1
621
	stdcall [buf2d_delete],buf_1 ;удаляем буфер
622
	stdcall mem.Free,[image_data_toolbar]
623
	stdcall mem.Free,[open_file_data]
624
	stdcall [gluDeleteQuadric], [qObj]
625
	mcall SF_TERMINATE_PROCESS
626
 
627
 
628
align 4
629
but_new_file:
630
push eax ebx
7610 IgorA 631
	stdcall [tl_node_poi_get_info], tree1,0
6060 IgorA 632
	@@:
7610 IgorA 633
		or eax,eax
634
		jz @f
6060 IgorA 635
		mov ebx,eax
636
		stdcall [tl_node_poi_get_data], tree1,ebx
637
		add eax,list_offs_obj3d
638
		stdcall obj_clear_param, eax
7610 IgorA 639
		stdcall [tl_node_poi_get_next_info], tree1,ebx
640
		or eax,eax
641
		jnz @b
6060 IgorA 642
	@@:
643
pop ebx eax
644
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
645
	stdcall [buf2d_clear], buf_ogl, [buf_ogl.color] ;чистим буфер
646
	stdcall [tl_draw], tree1
647
	stdcall [buf2d_draw], buf_ogl ;обновляем буфер на экране
648
	ret
649
 
650
align 4
651
but_open_file:
652
	copy_path open_dialog_name,communication_area_default_path,file_name,0
653
	pushad
654
	mov [OpenDialog_data.type],0
655
	stdcall [OpenDialog_Start],OpenDialog_data
656
	cmp [OpenDialog_data.status],2
657
	je .end_open_file
658
	;код при удачном открытии диалога
7616 IgorA 659
	jmp .end0
6060 IgorA 660
.no_dlg: ;если минуем диалог открытия файла
661
		pushad
7616 IgorA 662
		mov esi,openfile_path
663
		stdcall str_len,esi
664
		add esi,eax
665
		@@: ;цикл для поиска начала имени файла
666
			dec esi
667
			cmp byte[esi],'/'
668
			je @f
669
			cmp byte[esi],0x5c ;'\'
670
			je @f
671
			cmp esi,openfile_path
672
			jg @b
673
		@@:
674
		inc esi
675
		stdcall [OpenDialog_Set_file_name],OpenDialog_data,esi ;копируем имя файла в диалог сохранения
676
	.end0:
6060 IgorA 677
    mov [run_file_70.Function], SSF_GET_INFO
678
    mov [run_file_70.Position], 0
679
    mov [run_file_70.Flags], 0
680
    mov dword[run_file_70.Count], 0
681
    mov dword[run_file_70.Buffer], open_b
682
    mov byte[run_file_70+20], 0
683
    mov dword[run_file_70.FileName], openfile_path
684
    mcall SF_FILE,run_file_70
685
 
686
    mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
687
    stdcall mem.ReAlloc,[open_file_data],ecx
688
    mov [open_file_data],eax
689
 
690
    mov [run_file_70.Function], SSF_READ_FILE
691
    mov [run_file_70.Position], 0
692
    mov [run_file_70.Flags], 0
693
    mov dword[run_file_70.Count], ecx
694
    m2m dword[run_file_70.Buffer], dword[open_file_data]
695
    mov byte[run_file_70+20], 0
696
    mov dword[run_file_70.FileName], openfile_path
697
    mcall SF_FILE,run_file_70 ;загружаем файл 3ds
698
    cmp ebx,0xffffffff
699
    je .end_open_file
700
		mov [open_file_size],ebx
701
		;mcall SF_SET_CAPTION,1,openfile_path
702
 
703
		call init_tree
704
		stdcall [buf2d_draw], buf_ogl ;обновляем буфер на экране
705
	.end_open_file:
706
	popad
707
	ret
708
 
709
align 4
710
init_tree:
711
	;чистим память занятую объектами
7610 IgorA 712
	stdcall [tl_node_poi_get_info], tree1,0
6060 IgorA 713
	@@:
7610 IgorA 714
		or eax,eax
715
		jz @f
6060 IgorA 716
		mov ebx,eax
717
		stdcall [tl_node_poi_get_data], tree1,ebx
7610 IgorA 718
		or eax,eax
719
		jz @f
6060 IgorA 720
			add eax,list_offs_obj3d
721
			stdcall obj_clear_param, eax
7610 IgorA 722
			stdcall [tl_node_poi_get_next_info], tree1,ebx
723
			or eax,eax
724
			jnz @b
6060 IgorA 725
	@@:
726
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
727
 
7610 IgorA 728
	mov esi,[open_file_data]
729
	stdcall convert_stl_3ds, esi,[open_file_size] ;проверяем файл формата *.stl ?
730
	or eax,eax
731
	jz @f
732
		;если файл в формате *.stl
733
		mov [open_file_size],ecx
734
		mov esi,eax
735
		stdcall mem.Free,[open_file_data]
736
		mov [open_file_data],esi
737
		mov byte[can_save],1
738
	@@:
6060 IgorA 739
	cmp word[esi],CHUNK_MAIN
740
	je @f
7610 IgorA 741
		mov eax,[esi]
742
		bswap eax
743
		stdcall hex_in_str, txt_no_3ds.zag, eax,8
6081 IgorA 744
		stdcall buf_draw_beg, buf_ogl
6060 IgorA 745
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_no_3ds,5,25,0xff0000 ;рисуем строку с текстом
746
		jmp .end_open
747
	@@:
748
	;--- обработка открытого *.3ds файла
749
	mov eax,file_3ds
750
	mov dword[level_stack],0 ;обнуляем уровень стека
751
	mov dword[offs_last_timer],0
752
	;--- добавление главного блока в список
753
	stdcall add_3ds_object, ID_ICON_CHUNK_MAIN,0,dword[esi+2],0
754
	call block_children ;вход в дочерний блок
755
 
7610 IgorA 756
	mov edi,[file_3ds.offs]
757
	add edi,[file_3ds.size]
6060 IgorA 758
	.cycle_main:
759
		cmp dword[level_stack],0
760
		jle .end_cycle
761
 
762
		cmp esi,edi ;если конец файла
763
		jge .end_cycle
764
 
7610 IgorA 765
		mov edx,[esi+2] ;размер блока
6060 IgorA 766
		call block_analiz
6081 IgorA 767
		cmp word[esi],CHUNK_MATERIAL
768
		je @f
769
		cmp word[esi],CHUNK_OBJMESH
770
		je @f
771
		cmp word[esi],CHUNK_OBJBLOCK
772
		je @f
773
			mov dword[bl_found],0
774
		@@:
6060 IgorA 775
		cmp dword[bl_found],0
776
		jne @f
777
			;объект не известного вида
778
			call block_next
779
			jmp .cycle_main
780
		@@:
781
			;объект известного вида
782
			mov ecx,dword[bl_found]
783
			mov bx,word[ecx+2] ;номер иконки для объекта
784
			cmp word[esi],CHUNK_OBJBLOCK
785
			jne .pod1
786
				add esi,6
787
				push esi
788
				sub esi,6
6081 IgorA 789
				jmp .pod3
6060 IgorA 790
			.pod1:
6081 IgorA 791
			cmp word[esi],CHUNK_MATERIAL
792
			jne .pod2
793
				cmp word[esi+6],CHUNK_MATNAME
794
				jne .pod2
795
				add esi,12
796
				push esi
797
				sub esi,12
798
				jmp .pod3
799
			.pod2:
6060 IgorA 800
				push dword[ecx+5] ;стандартное название блока
6081 IgorA 801
			.pod3:
6060 IgorA 802
			stdcall add_3ds_object, ebx,dword[level_stack],edx
803
			cmp byte[ecx+4],1
804
			je .bl_data
805
				;блок содержит дочерние блоки
806
				call block_children ;вход в дочерний блок
807
				jmp .cycle_main
808
			.bl_data:
809
				;блок содержит данные
810
				call block_analiz_data
811
				jmp .cycle_main
812
	.end_cycle:
813
		stdcall [tl_cur_beg], tree1
814
		stdcall [tl_draw], tree1
815
	.end_open:
816
	ret
817
 
818
;анализ данных блока
819
;input:
6081 IgorA 820
; eax - stack pointer
6060 IgorA 821
; esi - memory pointer
822
;output:
823
; eax - new stack pointer
824
; esi - new memory pointer
825
align 4
826
proc block_analiz_data uses ebx ecx edx edi
7610 IgorA 827
	mov dx,[esi]
828
	mov ecx,[esi+2]
6060 IgorA 829
	sub ecx,6 ;размер данных в блоке
830
	add esi,6
831
	mov ebx,dword[level_stack]
832
	inc ebx
833
	; *** анализ блоков с разными данными и выделением подблоков
834
	cmp dx,CHUNK_OBJBLOCK ;объект
835
	jne @f
836
		push ax
837
			cld
838
			xor al,al
839
			mov edi,esi
840
			repne scasb
841
		pop ax
842
		sub edi,esi ;edi - strlen
843
		add esi,edi
844
		;sub ecx,edi ;уже сделано в repne
845
		jmp .next_bl
846
	@@:
847
	cmp dx,CHUNK_VERTLIST ;список вершин
848
	je .vertexes
849
	cmp dx,0x4111 ;флаги вершин
850
	je .vertexes
851
	cmp dx,CHUNK_MAPLIST ;текстурные координаты
852
	je .vertexes
853
	jmp @f
854
	.vertexes: ;обработка блоков, содержащих данные вершин
855
		add esi,2
856
		sub ecx,2
857
		sub esi,8 ;восстановление esi
858
		call block_next
859
		jmp .end_f
860
	@@:
861
	cmp dx,CHUNK_FACELIST ;список граней
862
	jne @f
863
		push eax
864
		movzx eax,word[esi]
865
		shl eax,3
866
		add esi,2
867
		sub ecx,2
868
 
869
		sub ecx,eax
870
		cmp ecx,1
871
		jl .data_3 ;проверяем есть ли блок описывающий материал, применяемый к объекту
6081 IgorA 872
if 1
6060 IgorA 873
			add esi,eax
6081 IgorA 874
			mov ecx,dword[esi+2]
875
			stdcall add_3ds_object, 10,ebx,ecx,0 ;данные материала
876
			sub esi,eax
877
else
878
			add esi,eax
6060 IgorA 879
			pop eax
880
			jmp .next_bl
6081 IgorA 881
end if
6060 IgorA 882
		.data_3:
883
 
884
		sub esi,8 ;восстановление esi
885
		pop eax
886
		call block_next
887
		jmp .end_f
888
	@@:
889
	cmp dx,CHUNK_FACEMAT ;материалы граней
890
	jne @f
891
		push ax
892
			cld
893
			xor al,al
894
			mov edi,esi
895
			repne scasb
896
		pop ax
897
		sub edi,esi ;edi - strlen
898
		stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
899
		add esi,edi
900
		add esi,2
901
		sub ecx,2
902
		sub esi,edi ;восстановление esi (1)
903
		sub esi,8   ;восстановление esi (2)
904
		call block_next
905
		jmp .end_f
906
	@@:
907
	; *** анализ блока с данными по умолчанию (без выделения подблоков)
908
		sub esi,6 ;восстановление esi
909
		call block_next
910
		jmp .end_f
911
	.next_bl:
912
	; *** настройки для анализа оставшихся подблоков
913
		mov dword[eax],esi ;указатель на начало блока
914
		mov ebx,dword[esi+2]
915
		mov dword[eax+4],ebx ;размер блока
916
		inc dword[level_stack]
917
		add eax,8
918
	.end_f:
919
	ret
920
endp
921
 
922
;вход в 1-й дочерний блок
923
;input:
924
; eax - указатель на временный стек файла file_3ds
925
; esi - начало родительского блока
926
;output:
927
; ebx - destroy
928
; esi - начало данных родительского блока
929
align 4
930
block_children:
931
	push ecx
932
		;проверка правильности размеров дочернего блока
7610 IgorA 933
		lea ebx,[esi+6] ;переход на начало дочернего блока
934
		add ebx,[ebx+2] ;добавляем размер дочернего блока
6060 IgorA 935
		mov ecx,esi
7610 IgorA 936
		add ecx,[esi+2] ;добавляем размер родительского блока
6060 IgorA 937
		cmp ebx,ecx ;учитывать заголовки не нужно, т. к. сравниваются только данные блоков
938
		jle @f
939
			;диагностировали ошибку файла, дочерний блок выходит за пределы родительского
940
			mov dword[level_stack],FILE_ERROR_CHUNK_SIZE
941
			jmp .end_f
942
		@@:
7610 IgorA 943
		mov [eax],esi ;указатель на начало блока
944
		mov ebx,[esi+2]
945
		mov [eax+4],ebx ;размер блока
6060 IgorA 946
		add esi,6 ;переходим к данным блока
947
		inc dword[level_stack]
948
		add eax,8
949
	.end_f:
950
	pop ecx
951
	ret
952
 
953
;переход к следущему блоку текущего уровня
954
;input:
955
; eax - адрес структуры с переменными
956
align 4
957
block_next:
958
push ebx
959
	add esi,dword[esi+2] ;пропускаем данные блока
960
 
961
	;проверка размеров родительского блока, для возможного выхода на верхний уровень если конец блока
962
	@@:
963
	mov ebx,dword[eax-8]
964
	add ebx,dword[eax-4]
965
	cmp esi,ebx
966
	jl @f
967
		dec dword[level_stack]
968
		sub eax,8
969
		cmp dword[level_stack],0
970
		jg @b
971
	@@:
972
pop ebx
973
	ret
974
 
975
;функция поиска структуры описывающей блок
976
;input:
977
;esi - memory pointer
978
;output:
979
;dword[bl_found] - pointer to chunk struct (= 0 if not found)
980
align 4
981
bl_found dd 0
982
block_analiz:
983
pushad
984
	mov dword[bl_found],0
985
	mov ecx,type_bloks
986
	@@:
987
		mov bx,word[ecx]
988
		cmp word[esi],bx
989
		je .found
990
		add ecx,sizeof.block_3ds
991
		cmp ecx,type_bloks.end
992
		jl @b
993
	jmp .no_found
994
	.found:
995
		mov dword[bl_found],ecx
996
	.no_found:
997
popad
998
	ret
999
 
1000
;input:
1001
; esi - указатель на анализируемые данные
7610 IgorA 1002
; icon - номер иконки
6060 IgorA 1003
; level - уровень вложенности узла
1004
; size_bl - размер блока
7610 IgorA 1005
; info_bl - строка с описанием блока
6060 IgorA 1006
align 4
7610 IgorA 1007
proc add_3ds_object, icon:dword, level:dword, size_bl:dword, info_bl:dword
6060 IgorA 1008
	pushad
1009
		mov bx,word[icon]
1010
		shl ebx,16
1011
		mov bx,word[level]
1012
 
1013
		mov eax,esi
1014
		sub eax,dword[open_file_data]
1015
		mov dword[buffer],eax ;смещение блока
1016
		mov ecx,dword[size_bl]
1017
		mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии)
1018
		mov ecx,dword[bl_found]
7610 IgorA 1019
		or ecx,ecx
1020
		jz @f
6060 IgorA 1021
			;... здесь нужен другой алгоритм защиты от удаления
1022
			mov cl,byte[ecx+4]
1023
		@@:
1024
		mov byte[buffer+list_offs_chunk_del],cl
1025
		mov ecx,[level]
1026
		mov byte[buffer+list_offs_chunk_lev],cl
1027
		mov ecx,dword[info_bl]
1028
		mov dword[buffer+list_offs_p_data],ecx
1029
		stdcall hex_in_str, buffer+list_offs_text,dword[esi+1],2
1030
		stdcall hex_in_str, buffer+list_offs_text+2,dword[esi],2 ;код 3ds блока
7610 IgorA 1031
		or ecx,ecx
1032
		jnz @f
6060 IgorA 1033
			mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки
1034
			jmp .no_capt
1035
		@@:
1036
			mov byte[buffer+list_offs_text+4],' '
1037
			mov esi,ecx
1038
			mov edi,buffer+list_offs_text+5
1039
			mov ecx,size_one_list-(list_offs_text+5)
1040
			cld
1041
			rep movsb
1042
			mov byte[buffer+size_one_list-1],0 ;0 - символ конца строки
1043
		.no_capt:
1044
		mov ecx,(sizeof.obj_3d)/4
1045
		xor eax,eax
8083 IgorA 1046
		mov edi,buffer+list_offs_obj3d
6060 IgorA 1047
		rep stosd
1048
		stdcall [tl_node_add], tree1, ebx, buffer
1049
		stdcall [tl_cur_next], tree1
1050
	popad
1051
	ret
1052
endp
1053
 
1054
;input:
1055
; eax - value
1056
; buf - string buffer
1057
; len - buffer len
1058
;output:
1059
align 4
1060
proc convert_int_to_str, buf:dword, len:dword
1061
pushad
1062
	mov edi,[buf]
1063
	mov esi,[len]
1064
	add esi,edi
1065
	dec esi
1066
	call .str
1067
popad
1068
	ret
1069
endp
1070
 
1071
align 4
1072
.str:
7610 IgorA 1073
	mov ecx,10
6060 IgorA 1074
	cmp eax,ecx
1075
	jb @f
1076
		xor edx,edx
1077
		div ecx
1078
		push edx
1079
		call .str
1080
		pop eax
1081
	@@:
1082
	cmp edi,esi
1083
	jge @f
1084
		or al,0x30
1085
		stosb
1086
		mov byte[edi],0
1087
	@@:
1088
	ret
1089
 
1090
;данные для диалога открытия файлов
1091
align 4
1092
OpenDialog_data:
1093
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
1094
.procinfo		dd procinfo ;+4
1095
.com_area_name	dd communication_area_name ;+8
1096
.com_area		dd 0 ;+12
1097
.opendir_path	dd plugin_path ;+16
1098
.dir_default_path	dd default_dir ;+20
1099
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
1100
.draw_window	dd draw_window ;+28
1101
.status 		dd 0 ;+32
1102
.openfile_path	dd openfile_path ;+36 путь к открываемому файлу
1103
.filename_area	dd filename_area ;+40
1104
.filter_area	dd Filter
1105
.x:
1106
.x_size 		dw 420 ;+48 ; Window X size
1107
.x_start		dw 10 ;+50 ; Window X position
1108
.y:
1109
.y_size 		dw 320 ;+52 ; Window y size
1110
.y_start		dw 10 ;+54 ; Window Y position
1111
 
1112
default_dir db '/rd/1',0
1113
 
1114
communication_area_name:
1115
	db 'FFFFFFFF_open_dialog',0
1116
open_dialog_name:
1117
	db 'opendial',0
1118
communication_area_default_path:
1119
	db '/rd/1/File managers/',0
1120
 
1121
Filter:
1122
dd Filter.end - Filter.1
1123
.1:
1124
db '3DS',0
7610 IgorA 1125
db 'STL',0
7616 IgorA 1126
.3:
6889 IgorA 1127
db 'PNG',0
6060 IgorA 1128
.end:
1129
db 0
1130
 
1131
 
1132
align 4
1133
system_dir_0 db '/sys/lib/'
1134
lib_name_0 db 'proc_lib.obj',0
1135
system_dir_1 db '/sys/lib/'
1136
lib_name_1 db 'libimg.obj',0
1137
system_dir_2 db '/sys/lib/'
1138
lib_name_2 db 'box_lib.obj',0
1139
system_dir_3 db '/sys/lib/'
1140
lib_name_3 db 'buf2d.obj',0
1141
system_dir_4 db '/sys/lib/'
1142
lib_name_4 db 'kmenu.obj',0
6889 IgorA 1143
system_dir_5 db '/sys/lib/'
6060 IgorA 1144
lib_name_5 db 'tinygl.obj',0
1145
system_dir_6 db '/sys/lib/'
1146
lib_name_6 db 'libini.obj',0
1147
 
1148
align 4
1149
l_libs_start:
8262 IgorA 1150
	lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib
1151
	lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg
1152
	lib_2 l_libs lib_name_2, file_name, system_dir_2, import_box_lib
1153
	lib_3 l_libs lib_name_3, file_name, system_dir_3, import_buf2d
1154
	lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu
1155
	lib_5 l_libs lib_name_5, file_name, system_dir_5, import_lib_tinygl
1156
	lib_6 l_libs lib_name_6, file_name, system_dir_6, import_libini
6060 IgorA 1157
l_libs_end:
1158
 
1159
align 4
1160
import_libimg:
1161
	dd alib_init1
1162
	img_is_img  dd aimg_is_img
1163
	img_info    dd aimg_info
1164
	img_from_file dd aimg_from_file
1165
	img_to_file dd aimg_to_file
1166
	img_from_rgb dd aimg_from_rgb
1167
	img_to_rgb  dd aimg_to_rgb
1168
	img_to_rgb2 dd aimg_to_rgb2
1169
	img_decode  dd aimg_decode
1170
	img_encode  dd aimg_encode
1171
	img_create  dd aimg_create
1172
	img_destroy dd aimg_destroy
1173
	img_destroy_layer dd aimg_destroy_layer
1174
	img_count   dd aimg_count
1175
	img_lock_bits dd aimg_lock_bits
1176
	img_unlock_bits dd aimg_unlock_bits
1177
	img_flip    dd aimg_flip
1178
	img_flip_layer dd aimg_flip_layer
1179
	img_rotate  dd aimg_rotate
1180
	img_rotate_layer dd aimg_rotate_layer
1181
	img_draw    dd aimg_draw
1182
 
1183
	dd 0,0
1184
	alib_init1   db 'lib_init',0
1185
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1186
	aimg_info    db 'img_info',0
1187
	aimg_from_file db 'img_from_file',0
1188
	aimg_to_file db 'img_to_file',0
1189
	aimg_from_rgb db 'img_from_rgb',0
1190
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1191
	aimg_to_rgb2 db 'img_to_rgb2',0
1192
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1193
	aimg_encode  db 'img_encode',0
1194
	aimg_create  db 'img_create',0
1195
	aimg_destroy db 'img_destroy',0
1196
	aimg_destroy_layer db 'img_destroy_layer',0
1197
	aimg_count   db 'img_count',0
1198
	aimg_lock_bits db 'img_lock_bits',0
1199
	aimg_unlock_bits db 'img_unlock_bits',0
1200
	aimg_flip    db 'img_flip',0
1201
	aimg_flip_layer db 'img_flip_layer',0
1202
	aimg_rotate  db 'img_rotate',0
1203
	aimg_rotate_layer db 'img_rotate_layer',0
1204
	aimg_draw    db 'img_draw',0
1205
 
1206
align 4
8262 IgorA 1207
import_proclib:
6060 IgorA 1208
	OpenDialog_Init dd aOpenDialog_Init
1209
	OpenDialog_Start dd aOpenDialog_Start
7616 IgorA 1210
	OpenDialog_Set_file_name dd aOpenDialog_Set_file_name
1211
	OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext
6060 IgorA 1212
dd 0,0
1213
	aOpenDialog_Init db 'OpenDialog_init',0
1214
	aOpenDialog_Start db 'OpenDialog_start',0
7616 IgorA 1215
	aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0
1216
	aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0
6060 IgorA 1217
 
1218
align 4
1219
import_buf2d:
1220
	dd sz_init0
1221
	buf2d_create dd sz_buf2d_create
1222
	buf2d_create_f_img dd sz_buf2d_create_f_img
1223
	buf2d_clear dd sz_buf2d_clear
1224
	buf2d_draw dd sz_buf2d_draw
1225
	buf2d_delete dd sz_buf2d_delete
1226
	buf2d_resize dd sz_buf2d_resize
1227
	buf2d_line dd sz_buf2d_line
1228
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1229
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1230
	buf2d_circle dd sz_buf2d_circle
1231
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1232
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1233
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1234
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1235
	buf2d_bit_blt dd sz_buf2d_bit_blt
1236
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1237
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1238
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1239
	buf2d_draw_text dd sz_buf2d_draw_text
1240
	buf2d_crop_color dd sz_buf2d_crop_color
1241
	buf2d_offset_h dd sz_buf2d_offset_h
1242
	buf2d_set_pixel dd sz_buf2d_set_pixel
1243
	dd 0,0
1244
	sz_init0 db 'lib_init',0
1245
	sz_buf2d_create db 'buf2d_create',0
1246
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1247
	sz_buf2d_clear db 'buf2d_clear',0
1248
	sz_buf2d_draw db 'buf2d_draw',0
1249
	sz_buf2d_delete db 'buf2d_delete',0
1250
	sz_buf2d_resize db 'buf2d_resize',0
1251
	sz_buf2d_line db 'buf2d_line',0
1252
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1253
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1254
	sz_buf2d_circle db 'buf2d_circle',0
1255
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1256
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1257
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1258
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1259
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1260
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1261
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1262
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1263
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1264
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1265
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1266
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1267
 
1268
align 4
1269
import_box_lib:
1270
	dd sz_init1
1271
	edit_box_draw dd sz_edit_box_draw
1272
	edit_box_key dd sz_edit_box_key
1273
	edit_box_mouse dd sz_edit_box_mouse
1274
	edit_box_set_text dd sz_edit_box_set_text
1275
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
1276
	scrollbar_hor_draw dd sz_scrollbar_hor_draw
1277
 
1278
	tl_data_init dd sz_tl_data_init
1279
	tl_data_clear dd sz_tl_data_clear
1280
	tl_info_clear dd sz_tl_info_clear
1281
	tl_key dd sz_tl_key
1282
	tl_mouse dd sz_tl_mouse
1283
	tl_draw dd sz_tl_draw
1284
	tl_info_undo dd sz_tl_info_undo
1285
	tl_info_redo dd sz_tl_info_redo
1286
	tl_node_add dd sz_tl_node_add
1287
	tl_node_set_data dd sz_tl_node_set_data
1288
	tl_node_get_data dd sz_tl_node_get_data
1289
	tl_node_delete dd sz_tl_node_delete
1290
	tl_node_move_up dd sz_tl_node_move_up
1291
	tl_node_move_down dd sz_tl_node_move_down
1292
	tl_cur_beg dd sz_tl_cur_beg
1293
	tl_cur_next dd sz_tl_cur_next
1294
	tl_cur_perv dd sz_tl_cur_perv
1295
	tl_node_close_open dd sz_tl_node_close_open
1296
	tl_node_lev_inc dd sz_tl_node_lev_inc
1297
	tl_node_lev_dec dd sz_tl_node_lev_dec
1298
	tl_node_poi_get_info dd sz_tl_node_poi_get_info
1299
	tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
1300
	tl_node_poi_get_data dd sz_tl_node_poi_get_data
1301
 
1302
	dd 0,0
1303
	sz_init1 db 'lib_init',0
9568 IgorA 1304
	sz_edit_box_draw db 'edit_box_draw',0
6060 IgorA 1305
	sz_edit_box_key db 'edit_box_key',0
1306
	sz_edit_box_mouse db 'edit_box_mouse',0
1307
	sz_edit_box_set_text db 'edit_box_set_text',0
1308
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
1309
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
1310
 
1311
	sz_tl_data_init db 'tl_data_init',0
1312
	sz_tl_data_clear db 'tl_data_clear',0
1313
	sz_tl_info_clear db 'tl_info_clear',0
1314
	sz_tl_key db 'tl_key',0
1315
	sz_tl_mouse db 'tl_mouse',0
1316
	sz_tl_draw db 'tl_draw',0
1317
	sz_tl_info_undo db 'tl_info_undo',0
1318
	sz_tl_info_redo db 'tl_info_redo',0
1319
	sz_tl_node_add db 'tl_node_add',0
1320
	sz_tl_node_set_data db 'tl_node_set_data',0
1321
	sz_tl_node_get_data db 'tl_node_get_data',0
1322
	sz_tl_node_delete db 'tl_node_delete',0
1323
	sz_tl_node_move_up db 'tl_node_move_up',0
1324
	sz_tl_node_move_down db 'tl_node_move_down',0
1325
	sz_tl_cur_beg db 'tl_cur_beg',0
1326
	sz_tl_cur_next db 'tl_cur_next',0
1327
	sz_tl_cur_perv db 'tl_cur_perv',0
1328
	sz_tl_node_close_open db 'tl_node_close_open',0
1329
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
1330
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
1331
	sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
1332
	sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
1333
	sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
1334
 
1335
align 4
1336
import_libkmenu:
1337
	kmenu_init		       dd akmenu_init
1338
	kmainmenu_draw		       dd akmainmenu_draw
1339
	kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
1340
	ksubmenu_new		       dd aksubmenu_new
1341
	ksubmenu_delete 	       dd aksubmenu_delete
1342
	ksubmenu_draw		       dd aksubmenu_draw
1343
	ksubmenu_add		       dd aksubmenu_add
1344
	kmenuitem_new		       dd akmenuitem_new
1345
	kmenuitem_delete	       dd akmenuitem_delete
1346
	kmenuitem_draw		       dd akmenuitem_draw
1347
dd 0,0
1348
	akmenu_init			db 'kmenu_init',0
1349
	akmainmenu_draw 		db 'kmainmenu_draw',0
1350
	akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
1351
	aksubmenu_new			db 'ksubmenu_new',0
1352
	aksubmenu_delete		db 'ksubmenu_delete',0
1353
	aksubmenu_draw			db 'ksubmenu_draw',0
1354
	aksubmenu_add			db 'ksubmenu_add',0
1355
	akmenuitem_new			db 'kmenuitem_new',0
1356
	akmenuitem_delete		db 'kmenuitem_delete',0
1357
	akmenuitem_draw 		db 'kmenuitem_draw',0
1358
 
1359
align 4
1360
import_lib_tinygl:
1361
macro E_LIB n
1362
{
1363
	n dd sz_#n
1364
}
1365
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
1366
	dd 0,0
1367
macro E_LIB n
1368
{
1369
	sz_#n db `n,0
1370
}
1371
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
1372
 
1373
align 4
1374
import_libini:
1375
	dd alib_init0
1376
	ini_get_str   dd aini_get_str
1377
	ini_get_int   dd aini_get_int
1378
	ini_get_color dd aini_get_color
1379
dd 0,0
1380
	alib_init0     db 'lib_init',0
1381
	aini_get_str   db 'ini_get_str',0
1382
	aini_get_int   db 'ini_get_int',0
1383
	aini_get_color db 'ini_get_color',0
1384
 
1385
align 4
1386
mouse_dd dd 0
1387
last_time dd 0
1388
angle_dxm dd 1.9111 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
1389
angle_dym dd 1.7333 ;~ 3d_wnd_h/180
1390
ratio dd 1.1025 ;~ 3d_wnd_w/3d_wnd_h
1391
 
1392
align 4
1393
buf_ogl:
1394
	dd 0 ;указатель на буфер изображения
1395
	dw 3d_wnd_l,3d_wnd_t ;+4 left,top
6889 IgorA 1396
.w: dd 3d_wnd_w
1397
.h: dd 3d_wnd_h
6060 IgorA 1398
.color: dd 0xffffd0
1399
	dd 24 ;+16 color,bit in pixel
1400
 
1401
align 4
1402
buf_1:
1403
	dd 0 ;указатель на буфер изображения
6211 IgorA 1404
	dw 0,0 ;+4 left,top
6060 IgorA 1405
	dd 128,144 ;+8 w,h
1406
	dd 0,24 ;+16 color,bit in pixel
1407
 
1408
align 4
1409
el_focus dd tree1
1410
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
1411
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,47,195-16,250, 16,list_offs_text,0, el_focus,\
1412
	w_scr_t1,0
1413
 
1414
align 4
1415
w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1
1416
 
1417
align 4
1418
qObj dd 0
1419
 
1420
light_position dd 0.0, 0.0, -2.0, 1.0 ; Расположение источника [0][1][2]
1421
	;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
1422
light_dir dd 0.0,0.0,0.0 ;направление лампы
1423
 
1424
mat_specular dd 0.3, 0.3, 0.3, 1.0 ; Цвет блика
1425
mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
1426
white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
1427
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения
1428
 
1429
if lang eq ru
8083 IgorA 1430
capt db 'info 3ds [user] версия 29.09.20',0 ;подпись окна
6060 IgorA 1431
else
8083 IgorA 1432
capt db 'info 3ds [user] version 29.09.20',0 ;window caption
6060 IgorA 1433
end if
1434
 
1435
align 16
1436
i_end:
8083 IgorA 1437
	ctx1 rb 28 ;sizeof.TinyGLContext = 28
6060 IgorA 1438
	procinfo process_information
1439
	run_file_70 FileInfoBlock
1440
	sc system_colors
1441
	angle_x rd 1 ;углы поворота сцены
1442
	angle_y rd 1
1443
	angle_z rd 1
1444
	color_ox rd 1
1445
	color_oy rd 1
1446
	color_oz rd 1
1447
	color_bk rd 3
1448
	color_vert rd 1
1449
	color_face rd 1
1450
	color_select rd 1
1451
align 16
6509 IgorA 1452
	rb 4096
6060 IgorA 1453
stacktop:
1454
	sys_path rb 2048
6509 IgorA 1455
	file_name rb 4096
6060 IgorA 1456
	plugin_path rb 4096
1457
	openfile_path rb 4096
1458
	filename_area rb 256
1459
mem: