Subversion Repositories Kolibri OS

Rev

Rev 7610 | Rev 8083 | 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'
6060 IgorA 13
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
14
include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
15
include 'lang.inc'
16
include 'info_fun_float.inc'
17
include 'info_menu.inc'
18
include 'data.inc'
7610 IgorA 19
include 'convert_stl_3ds.inc'
6060 IgorA 20
 
21
3d_wnd_l equ 205 ;отступ для tinygl буфера слева
22
3d_wnd_t equ  47 ;отступ для tinygl буфера сверху
23
3d_wnd_w equ 344
24
3d_wnd_h equ 312
25
 
26
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
27
 
28
ID_ICON_CHUNK_MAIN equ 0 ;иконка главного блока
29
ID_ICON_CHUNK_NOT_FOUND equ 1 ;иконка не известного блока
30
ID_ICON_DATA equ 2 ;иконка для данных блока, не определенной структуры
31
ID_ICON_POINT equ 8
32
ID_ICON_POINT_SEL equ 9
33
 
34
FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока
35
 
6509 IgorA 36
size_one_list equ 42+sizeof.obj_3d
37
list_offs_chunk_del equ 8 ;может ли блок удалятся
38
list_offs_chunk_lev equ 9 ;уровень блока (прописан в данные узла)
39
list_offs_p_data equ 10 ;указатель на подпись блока
40
list_offs_obj3d equ 14 ;указатель на структуру данных для 3d объекта
41
list_offs_text equ 14+sizeof.obj_3d ;сдвиг начала текста в листе
6060 IgorA 42
include 'info_o3d.inc'
43
 
44
align 4
45
fl255 dd 255.0
46
open_file_data dd 0 ;указатель на память для открытия файлов 3ds
47
open_file_size dd 0 ;размер открытого файла
48
 
49
;
50
main_wnd_height equ 460 ;высота главного окна программы
51
fn_toolbar db 'toolbar.png',0
6130 leency 52
IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3
6060 IgorA 53
image_data_toolbar dd 0
54
;
6211 IgorA 55
icon_tl_sys dd 0 ;указатель на память для хранения системных иконок
56
icon_toolbar dd 0 ;указатель на память для хранения иконок объектов
6060 IgorA 57
 
58
;--------------------------------------
59
level_stack dd 0
60
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
61
 
62
align 4
63
file_3ds: ;переменные используемые при открытии файла
64
.offs: dd 0 ;+0 указатель на начало блока
65
.size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds)
66
rb 8*MAX_FILE_LEVEL
67
 
68
buffer rb size_one_list ;буфер для добавления структур в список tree1
69
 
70
txt_3ds_symb db 0,0
71
;--------------------------------------
72
 
73
 
74
 
75
align 4
76
start:
77
	;--- copy cmd line ---
78
	mov esi,file_name
79
	mov edi,openfile_path
80
@@:
81
	lodsd
7610 IgorA 82
	or eax,eax
83
	jz @f ;выход, если 0
6060 IgorA 84
	stosd
85
	jmp @b
86
@@:
87
	stosd
88
 
89
	load_libraries l_libs_start,l_libs_end
90
	;проверка на сколько удачно загузились библиотеки
91
	mov	ebp,lib_0
92
	.test_lib_open:
93
	cmp	dword [ebp+ll_struc_size-4],0
94
	jz	@f
95
		mcall SF_TERMINATE_PROCESS ;exit not correct
96
	@@:
97
	add ebp,ll_struc_size
98
	cmp ebp,l_libs_end
99
	jl .test_lib_open
6164 leency 100
	mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
6247 IgorA 101
	mcall SF_SET_EVENTS_MASK,0xC0000027
6060 IgorA 102
 
103
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
104
 
105
	;kmenu initialisation
106
	stdcall [kmenu_init],sc
107
	stdcall [ksubmenu_new]
108
	mov [main_menu], eax
109
 
110
	stdcall [ksubmenu_new]
111
	mov [main_menu_view], eax
6513 IgorA 112
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Vertexes, 5
6060 IgorA 113
	stdcall [ksubmenu_add], [main_menu_view], eax
114
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces, 6
115
	stdcall [ksubmenu_add], [main_menu_view], eax
116
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Fill, 7
117
	stdcall [ksubmenu_add], [main_menu_view], eax
6513 IgorA 118
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Mat, 8
119
	stdcall [ksubmenu_add], [main_menu_view], eax
120
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
121
	stdcall [ksubmenu_add], [main_menu_view], eax
6509 IgorA 122
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Light, 9
6060 IgorA 123
	stdcall [ksubmenu_add], [main_menu_view], eax
6513 IgorA 124
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Smooth, 10
125
	stdcall [ksubmenu_add], [main_menu_view], eax
6060 IgorA 126
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
127
	stdcall [ksubmenu_add], [main_menu_view], eax
6513 IgorA 128
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Reset, 11
6060 IgorA 129
	stdcall [ksubmenu_add], [main_menu_view], eax
130
	stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_View, [main_menu_view]
131
	stdcall [ksubmenu_add], [main_menu], eax
132
 
133
	mov dword[w_scr_t1.type],1
7610 IgorA 134
	stdcall [tl_data_init], tree1
6060 IgorA 135
	;системные иконки 16*16 для tree_list
7610 IgorA 136
	include_image_file 'tl_sys_16.png', icon_tl_sys
6060 IgorA 137
	;если изображение не открылось, то в icon_tl_sys будут
138
	;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
139
	mov eax,dword[icon_tl_sys]
140
	mov dword[tree1.data_img_sys],eax
141
 
6211 IgorA 142
	load_image_file 'objects.png', icon_toolbar
6060 IgorA 143
	mov eax,dword[icon_toolbar]
144
	mov dword[tree1.data_img],eax
145
 
6211 IgorA 146
	load_image_file 'font8x9.bmp', image_data_toolbar
6060 IgorA 147
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
148
	stdcall mem.Free,[image_data_toolbar] ;освобождаем память
149
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
150
	stdcall [buf2d_convert_text_matrix], buf_1
151
 
6211 IgorA 152
	load_image_file fn_toolbar, image_data_toolbar
6060 IgorA 153
 
154
	;работа с файлом настроек
155
	copy_path ini_name,sys_path,file_name,0
156
	mov dword[def_dr_mode],0
157
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dv,1
158
	or eax,eax
159
	jz @f
160
		or dword[def_dr_mode], 1 shl bit_vertexes
161
	@@:
162
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_df,1
163
	or eax,eax
164
	jz @f
165
		or dword[def_dr_mode], 1 shl bit_faces
166
	@@:
167
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dff,1
168
	or eax,eax
169
	jz @f
170
		or dword[def_dr_mode], 1 shl bit_faces_fill
171
	@@:
6513 IgorA 172
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dfm,1
173
	or eax,eax
174
	jz @f
175
		or dword[def_dr_mode], 1 shl bit_faces_mat
176
	@@:
6060 IgorA 177
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dl,1
178
	or eax,eax
179
	jz @f
180
		or dword[def_dr_mode], 1 shl bit_light
181
	@@:
6513 IgorA 182
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_ds,1
183
	or eax,eax
184
	jz @f
185
		or dword[def_dr_mode], 1 shl bit_smooth
186
	@@:
6060 IgorA 187
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
188
	mov [color_ox],eax
189
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
190
	mov [color_oy],eax
191
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
192
	mov [color_oz],eax
193
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
194
	mov [color_bk],eax
195
	shr eax,8
196
	mov [color_bk+4],eax
197
	shr eax,8
198
	mov [color_bk+8],eax
199
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
200
	mov [color_vert],eax
201
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
202
	mov [color_face],eax
203
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_select,0xffff00
204
	mov [color_select],eax
205
	finit
206
	fild dword[color_bk+8]
207
	fdiv dword[fl255]
208
	fstp dword[color_bk+8]
209
	mov eax,[color_bk+4]
210
	and eax,0xff
211
	mov [color_bk+4],eax
212
	fild dword[color_bk+4]
213
	fdiv dword[fl255]
214
	fstp dword[color_bk+4]
215
	mov eax,[color_bk]
216
	and eax,0xff
217
	mov [color_bk],eax
218
	fild dword[color_bk]
219
	fdiv dword[fl255]
220
	fstp dword[color_bk]
221
 
222
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
223
	mov [last_time],eax
224
 
225
	stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,3d_wnd_w,3d_wnd_h,ctx1
226
	stdcall [glEnable], GL_DEPTH_TEST
227
	stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов
228
	stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0
229
	stdcall [glShadeModel], GL_SMOOTH
230
	stdcall [gluNewQuadric]
231
	mov [qObj],eax
232
 
233
	mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
234
	mov eax,[eax] ;eax -> ZBuffer
235
	mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf
236
	mov dword[buf_ogl],eax
237
 
238
	;open file from cmd line
239
	cmp dword[openfile_path],0
240
	je @f
241
		call but_open_file.no_dlg
242
	@@:
243
	call draw_window
244
 
245
align 4
246
still:
247
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
248
	mov ebx,[last_time]
249
	add ebx,10 ;задержка
250
	cmp ebx,eax
251
	jge @f
252
		mov ebx,eax
253
	@@:
254
	sub ebx,eax
255
	mcall SF_WAIT_EVENT_TIMEOUT
7610 IgorA 256
	or eax,eax
257
	jz timer_funct
6060 IgorA 258
 
259
	cmp al,1
260
	jne @f
261
		call draw_window
262
		jmp still
263
	@@:
264
	cmp al,2
265
	jz key
266
	cmp al,3
267
	jz button
268
	cmp al,6
269
	jne @f
270
		mcall SF_THREAD_INFO,procinfo,-1
271
		cmp ax,word[procinfo+4]
272
		jne @f ;окно не активно
273
		call mouse
274
	@@:
275
	jmp still
276
 
277
align 4
278
mouse:
279
	push eax ebx
280
	mcall SF_MOUSE_GET,SSF_BUTTON_EXT
281
	bt eax,0
282
	jnc .end_m
283
		;mouse l. but. move
284
		cmp dword[mouse_drag],1
285
		jne .end_m
6081 IgorA 286
 
287
		stdcall [tl_node_get_data],tree1
7610 IgorA 288
		or eax,eax
289
		jz .end_d
6081 IgorA 290
			mov ebx,dword[eax]
291
			add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
292
			cmp word[ebx],CHUNK_OBJBLOCK
293
			jne .end_d
294
 
6060 IgorA 295
		mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
296
		mov ebx,eax
297
		shr ebx,16 ;mouse.x
298
		cmp ebx,3d_wnd_l
299
		jg @f
300
			mov ebx,3d_wnd_l
301
		@@:
302
		sub ebx,3d_wnd_l
303
		cmp ebx,3d_wnd_w
304
		jle @f
305
			mov ebx,3d_wnd_w
306
		@@:
307
		and eax,0xffff ;mouse.y
308
		cmp eax,3d_wnd_t
309
		jg @f
310
			mov eax,3d_wnd_t
311
		@@:
312
		sub eax,3d_wnd_t
313
		cmp eax,3d_wnd_h
314
		jle @f
315
			mov eax,3d_wnd_h
316
		@@:
317
		finit
318
		fild dword[mouse_y]
319
		mov [mouse_y],eax
320
		fisub dword[mouse_y]
321
		fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
322
		fadd dword[angle_x]
323
		fstp dword[angle_x]
324
 
325
		fild dword[mouse_x]
326
		mov [mouse_x],ebx
327
		fisub dword[mouse_x]
328
		fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
329
		fadd dword[angle_y]
330
		fstp dword[angle_y]
331
 
332
		stdcall [tl_node_get_data],tree1
6081 IgorA 333
		;cmp eax,0 - не надо, было сделано выше
6060 IgorA 334
		add eax,list_offs_obj3d
335
		stdcall draw_3d, eax
336
		jmp .end_d
337
	.end_m:
338
	bt eax,16
339
	jnc @f
340
		;mouse l. but. up
341
		mov dword[mouse_drag],0
342
		jmp .end_d
343
	@@:
344
	bt eax,8
345
	jnc .end_d
346
		;mouse l. but. press
347
		mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
348
		mov ebx,eax
349
		shr ebx,16 ;mouse.x
350
		cmp ebx,3d_wnd_l
351
		jl .end_d
352
		sub ebx,3d_wnd_l
353
		cmp ebx,3d_wnd_w
354
		jg .end_d
355
		and eax,0xffff ;mouse.y
356
		cmp eax,3d_wnd_t
357
		jl .end_d
358
		sub eax,3d_wnd_t
359
		cmp eax,3d_wnd_h
360
		jg .end_d
361
		mov dword[mouse_drag],1
362
		mov dword[mouse_x],ebx
363
		mov dword[mouse_y],eax
364
	.end_d:
365
 
366
	stdcall [tl_mouse], dword tree1
367
	stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
368
	pop ebx eax
369
	ret
370
 
371
align 4
372
timer_funct:
373
	pushad
374
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
375
	mov [last_time],eax
376
 
377
	;просматриваем выделенный блок данных
378
	stdcall [tl_node_get_data],tree1
7610 IgorA 379
	or eax,eax
380
	jz .end_f
6060 IgorA 381
		mov edi,eax
382
		add edi,list_offs_obj3d
383
		mov ebx,eax
6081 IgorA 384
		mov eax,dword[ebx]
6060 IgorA 385
		mov ecx,dword[ebx+4] ;размер блока
386
		stdcall hex_in_str, txt_3ds_offs.dig, eax,8
387
		stdcall hex_in_str, txt_3ds_offs.siz, ecx,8
388
 
389
		add eax,dword[open_file_data] ;получаем значение сдвига в памяти
390
		cmp dword[offs_last_timer],eax
391
		je .end_f
392
			;если выделенный блок данных не совпадает с последним запомненным
393
			mov dword[offs_last_timer],eax
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
425
			mov edx,dword[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
1046
		mov edi,buffer
1047
		add edi,list_offs_obj3d
1048
		rep stosd
1049
		stdcall [tl_node_add], tree1, ebx, buffer
1050
		stdcall [tl_cur_next], tree1
1051
	popad
1052
	ret
1053
endp
1054
 
1055
;input:
1056
; eax - value
1057
; buf - string buffer
1058
; len - buffer len
1059
;output:
1060
align 4
1061
proc convert_int_to_str, buf:dword, len:dword
1062
pushad
1063
	mov edi,[buf]
1064
	mov esi,[len]
1065
	add esi,edi
1066
	dec esi
1067
	call .str
1068
popad
1069
	ret
1070
endp
1071
 
1072
align 4
1073
.str:
7610 IgorA 1074
	mov ecx,10
6060 IgorA 1075
	cmp eax,ecx
1076
	jb @f
1077
		xor edx,edx
1078
		div ecx
1079
		push edx
1080
		call .str
1081
		pop eax
1082
	@@:
1083
	cmp edi,esi
1084
	jge @f
1085
		or al,0x30
1086
		stosb
1087
		mov byte[edi],0
1088
	@@:
1089
	ret
1090
 
1091
;данные для диалога открытия файлов
1092
align 4
1093
OpenDialog_data:
1094
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
1095
.procinfo		dd procinfo ;+4
1096
.com_area_name	dd communication_area_name ;+8
1097
.com_area		dd 0 ;+12
1098
.opendir_path	dd plugin_path ;+16
1099
.dir_default_path	dd default_dir ;+20
1100
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
1101
.draw_window	dd draw_window ;+28
1102
.status 		dd 0 ;+32
1103
.openfile_path	dd openfile_path ;+36 путь к открываемому файлу
1104
.filename_area	dd filename_area ;+40
1105
.filter_area	dd Filter
1106
.x:
1107
.x_size 		dw 420 ;+48 ; Window X size
1108
.x_start		dw 10 ;+50 ; Window X position
1109
.y:
1110
.y_size 		dw 320 ;+52 ; Window y size
1111
.y_start		dw 10 ;+54 ; Window Y position
1112
 
1113
default_dir db '/rd/1',0
1114
 
1115
communication_area_name:
1116
	db 'FFFFFFFF_open_dialog',0
1117
open_dialog_name:
1118
	db 'opendial',0
1119
communication_area_default_path:
1120
	db '/rd/1/File managers/',0
1121
 
1122
Filter:
1123
dd Filter.end - Filter.1
1124
.1:
1125
db '3DS',0
7610 IgorA 1126
db 'STL',0
7616 IgorA 1127
.3:
6889 IgorA 1128
db 'PNG',0
6060 IgorA 1129
.end:
1130
db 0
1131
 
1132
 
1133
align 4
1134
system_dir_0 db '/sys/lib/'
1135
lib_name_0 db 'proc_lib.obj',0
1136
system_dir_1 db '/sys/lib/'
1137
lib_name_1 db 'libimg.obj',0
1138
system_dir_2 db '/sys/lib/'
1139
lib_name_2 db 'box_lib.obj',0
1140
system_dir_3 db '/sys/lib/'
1141
lib_name_3 db 'buf2d.obj',0
1142
system_dir_4 db '/sys/lib/'
1143
lib_name_4 db 'kmenu.obj',0
6889 IgorA 1144
system_dir_5 db '/sys/lib/'
6060 IgorA 1145
lib_name_5 db 'tinygl.obj',0
1146
system_dir_6 db '/sys/lib/'
1147
lib_name_6 db 'libini.obj',0
1148
 
1149
if lang eq ru
1150
	head_f_i:
7610 IgorA 1151
	head_f_l db '"Системная ошибка',0
1152
	err_msg_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,'" -tE',0
1153
	err_msg_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,'" -tW',0
1154
	err_msg_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,'" -tE',0
1155
	err_msg_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,'" -tW',0
1156
	err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,'" -tE',0
1157
	err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,'" -tW',0
1158
	err_msg_found_lib_3 db 'Не найдена библиотека ',39,'buf2d.obj',39,'" -tE',0
1159
	err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,'" -tW',0
1160
	err_msg_found_lib_4 db 'Не найдена библиотека ',39,'kmenu.obj',39,'" -tE',0
1161
	err_msg_import_4 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,'" -tW',0
1162
	err_msg_found_lib_5 db 'Не найдена библиотека ',39,'tinygl.obj',39,'" -tE',0
1163
	err_msg_import_5 db 'Ошибка при импорте библиотеки ',39,'tinygl',39,'" -tW',0
1164
	err_msg_found_lib_6 db 'Не найдена библиотека ',39,'libini.obj',39,'" -tE',0
1165
	err_msg_import_6 db 'Ошибка при импорте библиотеки ',39,'libini',39,'" -tW',0
6060 IgorA 1166
else
1167
	head_f_i:
7610 IgorA 1168
	head_f_l db '"System error',0
1169
	err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,'" -tE',0
1170
	err_msg_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,'" -tW',0
1171
	err_msg_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,'" -tE',0
1172
	err_msg_import_1 db 'Error on load import library ',39,'libimg.obj',39,'" -tW',0
1173
	err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'box_lib.obj',39,'" -tE',0
1174
	err_msg_import_2 db 'Error on load import library ',39,'box_lib.obj',39,'" -tW',0
1175
	err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'buf2d.obj',39,'" -tE',0
1176
	err_msg_import_3 db 'Error on load import library ',39,'buf2d.obj',39,'" -tW',0
1177
	err_msg_found_lib_4 db 'Sorry I cannot found library ',39,'kmenu.obj',39,'" -tE',0
1178
	err_msg_import_4 db 'Error on load import library ',39,'kmenu.obj',39,'" -tW',0
1179
	err_msg_found_lib_5 db 'Sorry I cannot found library ',39,'tinygl.obj',39,'" -tE',0
1180
	err_msg_import_5 db 'Error on load import library ',39,'tinygl',39,'" -tW',0
1181
	err_msg_found_lib_6 db 'Sorry I cannot found library ',39,'libini.obj',39,'" -tE',0
1182
	err_msg_import_6 db 'Error on load import library ',39,'libini',39,'" -tW',0
6060 IgorA 1183
end if
1184
 
1185
align 4
1186
l_libs_start:
1187
	lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
6245 IgorA 1188
		err_msg_found_lib_0, head_f_l, proclib_import,err_msg_import_0,head_f_i
6060 IgorA 1189
	lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
6245 IgorA 1190
		err_msg_found_lib_1, head_f_l, import_libimg, err_msg_import_1,head_f_i
6211 IgorA 1191
	lib_2 l_libs lib_name_2, sys_path, file_name,  system_dir_2,\
6060 IgorA 1192
		err_msg_found_lib_2, head_f_l, import_box_lib,err_msg_import_2,head_f_i
6211 IgorA 1193
	lib_3 l_libs lib_name_3, sys_path, file_name,  system_dir_3,\
6060 IgorA 1194
		err_msg_found_lib_3, head_f_l, import_buf2d,  err_msg_import_3,head_f_i
6211 IgorA 1195
	lib_4 l_libs lib_name_4, sys_path, file_name,  system_dir_4,\
6060 IgorA 1196
		err_msg_found_lib_4, head_f_l, import_libkmenu,err_msg_import_4,head_f_i
6211 IgorA 1197
	lib_5 l_libs lib_name_5, sys_path, file_name,  system_dir_5,\
6247 IgorA 1198
		err_msg_found_lib_5, head_f_l, import_lib_tinygl,err_msg_import_5,head_f_i
6211 IgorA 1199
	lib_6 l_libs lib_name_6, sys_path, file_name,  system_dir_6,\
6060 IgorA 1200
		err_msg_found_lib_6, head_f_l, import_libini, err_msg_import_6,head_f_i
1201
l_libs_end:
1202
 
1203
align 4
1204
import_libimg:
1205
	dd alib_init1
1206
	img_is_img  dd aimg_is_img
1207
	img_info    dd aimg_info
1208
	img_from_file dd aimg_from_file
1209
	img_to_file dd aimg_to_file
1210
	img_from_rgb dd aimg_from_rgb
1211
	img_to_rgb  dd aimg_to_rgb
1212
	img_to_rgb2 dd aimg_to_rgb2
1213
	img_decode  dd aimg_decode
1214
	img_encode  dd aimg_encode
1215
	img_create  dd aimg_create
1216
	img_destroy dd aimg_destroy
1217
	img_destroy_layer dd aimg_destroy_layer
1218
	img_count   dd aimg_count
1219
	img_lock_bits dd aimg_lock_bits
1220
	img_unlock_bits dd aimg_unlock_bits
1221
	img_flip    dd aimg_flip
1222
	img_flip_layer dd aimg_flip_layer
1223
	img_rotate  dd aimg_rotate
1224
	img_rotate_layer dd aimg_rotate_layer
1225
	img_draw    dd aimg_draw
1226
 
1227
	dd 0,0
1228
	alib_init1   db 'lib_init',0
1229
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1230
	aimg_info    db 'img_info',0
1231
	aimg_from_file db 'img_from_file',0
1232
	aimg_to_file db 'img_to_file',0
1233
	aimg_from_rgb db 'img_from_rgb',0
1234
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1235
	aimg_to_rgb2 db 'img_to_rgb2',0
1236
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1237
	aimg_encode  db 'img_encode',0
1238
	aimg_create  db 'img_create',0
1239
	aimg_destroy db 'img_destroy',0
1240
	aimg_destroy_layer db 'img_destroy_layer',0
1241
	aimg_count   db 'img_count',0
1242
	aimg_lock_bits db 'img_lock_bits',0
1243
	aimg_unlock_bits db 'img_unlock_bits',0
1244
	aimg_flip    db 'img_flip',0
1245
	aimg_flip_layer db 'img_flip_layer',0
1246
	aimg_rotate  db 'img_rotate',0
1247
	aimg_rotate_layer db 'img_rotate_layer',0
1248
	aimg_draw    db 'img_draw',0
1249
 
1250
align 4
7616 IgorA 1251
proclib_import:
6060 IgorA 1252
	OpenDialog_Init dd aOpenDialog_Init
1253
	OpenDialog_Start dd aOpenDialog_Start
7616 IgorA 1254
	OpenDialog_Set_file_name dd aOpenDialog_Set_file_name
1255
	OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext
6060 IgorA 1256
dd 0,0
1257
	aOpenDialog_Init db 'OpenDialog_init',0
1258
	aOpenDialog_Start db 'OpenDialog_start',0
7616 IgorA 1259
	aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0
1260
	aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0
6060 IgorA 1261
 
1262
align 4
1263
import_buf2d:
1264
	dd sz_init0
1265
	buf2d_create dd sz_buf2d_create
1266
	buf2d_create_f_img dd sz_buf2d_create_f_img
1267
	buf2d_clear dd sz_buf2d_clear
1268
	buf2d_draw dd sz_buf2d_draw
1269
	buf2d_delete dd sz_buf2d_delete
1270
	buf2d_resize dd sz_buf2d_resize
1271
	buf2d_line dd sz_buf2d_line
1272
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1273
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1274
	buf2d_circle dd sz_buf2d_circle
1275
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1276
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1277
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1278
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1279
	buf2d_bit_blt dd sz_buf2d_bit_blt
1280
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1281
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1282
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1283
	buf2d_draw_text dd sz_buf2d_draw_text
1284
	buf2d_crop_color dd sz_buf2d_crop_color
1285
	buf2d_offset_h dd sz_buf2d_offset_h
1286
	buf2d_set_pixel dd sz_buf2d_set_pixel
1287
	dd 0,0
1288
	sz_init0 db 'lib_init',0
1289
	sz_buf2d_create db 'buf2d_create',0
1290
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1291
	sz_buf2d_clear db 'buf2d_clear',0
1292
	sz_buf2d_draw db 'buf2d_draw',0
1293
	sz_buf2d_delete db 'buf2d_delete',0
1294
	sz_buf2d_resize db 'buf2d_resize',0
1295
	sz_buf2d_line db 'buf2d_line',0
1296
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1297
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1298
	sz_buf2d_circle db 'buf2d_circle',0
1299
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1300
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1301
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1302
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1303
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1304
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1305
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1306
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1307
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1308
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1309
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1310
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1311
 
1312
align 4
1313
import_box_lib:
1314
	dd sz_init1
1315
	edit_box_draw dd sz_edit_box_draw
1316
	edit_box_key dd sz_edit_box_key
1317
	edit_box_mouse dd sz_edit_box_mouse
1318
	edit_box_set_text dd sz_edit_box_set_text
1319
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
1320
	scrollbar_hor_draw dd sz_scrollbar_hor_draw
1321
 
1322
	tl_data_init dd sz_tl_data_init
1323
	tl_data_clear dd sz_tl_data_clear
1324
	tl_info_clear dd sz_tl_info_clear
1325
	tl_key dd sz_tl_key
1326
	tl_mouse dd sz_tl_mouse
1327
	tl_draw dd sz_tl_draw
1328
	tl_info_undo dd sz_tl_info_undo
1329
	tl_info_redo dd sz_tl_info_redo
1330
	tl_node_add dd sz_tl_node_add
1331
	tl_node_set_data dd sz_tl_node_set_data
1332
	tl_node_get_data dd sz_tl_node_get_data
1333
	tl_node_delete dd sz_tl_node_delete
1334
	tl_node_move_up dd sz_tl_node_move_up
1335
	tl_node_move_down dd sz_tl_node_move_down
1336
	tl_cur_beg dd sz_tl_cur_beg
1337
	tl_cur_next dd sz_tl_cur_next
1338
	tl_cur_perv dd sz_tl_cur_perv
1339
	tl_node_close_open dd sz_tl_node_close_open
1340
	tl_node_lev_inc dd sz_tl_node_lev_inc
1341
	tl_node_lev_dec dd sz_tl_node_lev_dec
1342
	tl_node_poi_get_info dd sz_tl_node_poi_get_info
1343
	tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
1344
	tl_node_poi_get_data dd sz_tl_node_poi_get_data
1345
 
1346
	dd 0,0
1347
	sz_init1 db 'lib_init',0
1348
	sz_edit_box_draw db 'edit_box',0
1349
	sz_edit_box_key db 'edit_box_key',0
1350
	sz_edit_box_mouse db 'edit_box_mouse',0
1351
	sz_edit_box_set_text db 'edit_box_set_text',0
1352
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
1353
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
1354
 
1355
	sz_tl_data_init db 'tl_data_init',0
1356
	sz_tl_data_clear db 'tl_data_clear',0
1357
	sz_tl_info_clear db 'tl_info_clear',0
1358
	sz_tl_key db 'tl_key',0
1359
	sz_tl_mouse db 'tl_mouse',0
1360
	sz_tl_draw db 'tl_draw',0
1361
	sz_tl_info_undo db 'tl_info_undo',0
1362
	sz_tl_info_redo db 'tl_info_redo',0
1363
	sz_tl_node_add db 'tl_node_add',0
1364
	sz_tl_node_set_data db 'tl_node_set_data',0
1365
	sz_tl_node_get_data db 'tl_node_get_data',0
1366
	sz_tl_node_delete db 'tl_node_delete',0
1367
	sz_tl_node_move_up db 'tl_node_move_up',0
1368
	sz_tl_node_move_down db 'tl_node_move_down',0
1369
	sz_tl_cur_beg db 'tl_cur_beg',0
1370
	sz_tl_cur_next db 'tl_cur_next',0
1371
	sz_tl_cur_perv db 'tl_cur_perv',0
1372
	sz_tl_node_close_open db 'tl_node_close_open',0
1373
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
1374
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
1375
	sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
1376
	sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
1377
	sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
1378
 
1379
align 4
1380
import_libkmenu:
1381
	kmenu_init		       dd akmenu_init
1382
	kmainmenu_draw		       dd akmainmenu_draw
1383
	kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
1384
	ksubmenu_new		       dd aksubmenu_new
1385
	ksubmenu_delete 	       dd aksubmenu_delete
1386
	ksubmenu_draw		       dd aksubmenu_draw
1387
	ksubmenu_add		       dd aksubmenu_add
1388
	kmenuitem_new		       dd akmenuitem_new
1389
	kmenuitem_delete	       dd akmenuitem_delete
1390
	kmenuitem_draw		       dd akmenuitem_draw
1391
dd 0,0
1392
	akmenu_init			db 'kmenu_init',0
1393
	akmainmenu_draw 		db 'kmainmenu_draw',0
1394
	akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
1395
	aksubmenu_new			db 'ksubmenu_new',0
1396
	aksubmenu_delete		db 'ksubmenu_delete',0
1397
	aksubmenu_draw			db 'ksubmenu_draw',0
1398
	aksubmenu_add			db 'ksubmenu_add',0
1399
	akmenuitem_new			db 'kmenuitem_new',0
1400
	akmenuitem_delete		db 'kmenuitem_delete',0
1401
	akmenuitem_draw 		db 'kmenuitem_draw',0
1402
 
1403
align 4
1404
import_lib_tinygl:
1405
macro E_LIB n
1406
{
1407
	n dd sz_#n
1408
}
1409
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
1410
	dd 0,0
1411
macro E_LIB n
1412
{
1413
	sz_#n db `n,0
1414
}
1415
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
1416
 
1417
align 4
1418
import_libini:
1419
	dd alib_init0
1420
	ini_get_str   dd aini_get_str
1421
	ini_get_int   dd aini_get_int
1422
	ini_get_color dd aini_get_color
1423
dd 0,0
1424
	alib_init0     db 'lib_init',0
1425
	aini_get_str   db 'ini_get_str',0
1426
	aini_get_int   db 'ini_get_int',0
1427
	aini_get_color db 'ini_get_color',0
1428
 
1429
align 4
1430
mouse_dd dd 0
1431
last_time dd 0
1432
angle_dxm dd 1.9111 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
1433
angle_dym dd 1.7333 ;~ 3d_wnd_h/180
1434
ratio dd 1.1025 ;~ 3d_wnd_w/3d_wnd_h
1435
 
1436
align 4
1437
buf_ogl:
1438
	dd 0 ;указатель на буфер изображения
1439
	dw 3d_wnd_l,3d_wnd_t ;+4 left,top
6889 IgorA 1440
.w: dd 3d_wnd_w
1441
.h: dd 3d_wnd_h
6060 IgorA 1442
.color: dd 0xffffd0
1443
	dd 24 ;+16 color,bit in pixel
1444
 
1445
align 4
1446
buf_1:
1447
	dd 0 ;указатель на буфер изображения
6211 IgorA 1448
	dw 0,0 ;+4 left,top
6060 IgorA 1449
	dd 128,144 ;+8 w,h
1450
	dd 0,24 ;+16 color,bit in pixel
1451
 
1452
align 4
1453
el_focus dd tree1
1454
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
1455
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,47,195-16,250, 16,list_offs_text,0, el_focus,\
1456
	w_scr_t1,0
1457
 
1458
align 4
1459
w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1
1460
 
1461
align 4
1462
ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
1463
;sizeof.TinyGLContext = 28
1464
 
1465
qObj dd 0
1466
 
1467
light_position dd 0.0, 0.0, -2.0, 1.0 ; Расположение источника [0][1][2]
1468
	;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
1469
light_dir dd 0.0,0.0,0.0 ;направление лампы
1470
 
1471
mat_specular dd 0.3, 0.3, 0.3, 1.0 ; Цвет блика
1472
mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
1473
white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
1474
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения
1475
 
1476
if lang eq ru
7616 IgorA 1477
capt db 'info 3ds [user] версия 23.03.19',0 ;подпись окна
6060 IgorA 1478
else
7616 IgorA 1479
capt db 'info 3ds [user] version 23.03.19',0 ;window caption
6060 IgorA 1480
end if
1481
 
1482
align 16
1483
i_end:
1484
	procinfo process_information
1485
	run_file_70 FileInfoBlock
1486
	sc system_colors
1487
	angle_x rd 1 ;углы поворота сцены
1488
	angle_y rd 1
1489
	angle_z rd 1
1490
	color_ox rd 1
1491
	color_oy rd 1
1492
	color_oz rd 1
1493
	color_bk rd 3
1494
	color_vert rd 1
1495
	color_face rd 1
1496
	color_select rd 1
1497
align 16
6509 IgorA 1498
	rb 4096
6060 IgorA 1499
stacktop:
1500
	sys_path rb 2048
6509 IgorA 1501
	file_name rb 4096
6060 IgorA 1502
	plugin_path rb 4096
1503
	openfile_path rb 4096
1504
	filename_area rb 256
1505
mem: