files
kolibrios/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm
IgorA 21658ef74c
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 32s
Build system / Build (pull_request) Successful in 5m11s
Libraries (box_lib, buf2d, libimg, tinygl): optimize function import
Рrograms updated:
- gears, test3, test_glu1, test_glu2,
- test_array1, textures0, textures1, textures2,
- crypt_files, img_transform, scrshoot, t_edit,
- cnc_control, cnc_editor
2025-07-14 08:10:28 +02:00

502 lines
13 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; SPDX-License-Identifier: GPL-2.0-only
; Textures0 - example of texture mapping on a sphere and cube
; Copyright (C) 2015-2025 KolibriOS team
use32
org 0
db 'MENUET01'
dd 1,start,i_end,mem,stacktop,0,cur_dir_path
include '../../../../../proc32.inc'
include '../../../../../macros.inc'
include '../../../../../KOSfuncs.inc'
include '../../../../../load_img.inc'
include '../../../../../load_lib.mac'
include '../kosgl.inc'
include '../opengl_const.inc'
include '../zbuffer.inc'
include '../../../../../develop/info3ds/info_fun_float.inc'
3d_wnd_l equ 0 ;tinygl buffer left indent
3d_wnd_t equ 30 ;tinygl buffer top indent
3d_wnd_w equ 500
3d_wnd_h equ 400
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3
align 4
start:
load_libraries l_libs_start,l_libs_end
;checking how successfully the libraries were loaded
mov ebp,lib_0
.test_lib_open:
cmp dword [ebp+ll_struc_size-4],0
jz @f
mcall SF_TERMINATE_PROCESS
@@:
add ebp,ll_struc_size
cmp ebp,l_libs_end
jl .test_lib_open
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
mcall SF_SET_EVENTS_MASK,0x27
stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,[buf_ogl.w],[buf_ogl.h],ctx1
stdcall [glEnable], GL_DEPTH_TEST
stdcall [glEnable], GL_NORMALIZE ;normals of the same size to avoid artifacts
call [gluNewQuadric]
mov [qObj],eax
stdcall [gluQuadricTexture], eax,GL_TRUE
stdcall [glClearColor], 0.25,0.25,0.25,0.0
stdcall [glShadeModel], GL_SMOOTH
mov eax,[ctx1.gl_context]
mov eax,[eax] ;eax -> ZBuffer
mov eax,[eax+ZBuffer.pbuf]
mov dword[buf_ogl],eax
load_image_file 'font8x9.bmp', image_data_toolbar, buf_1.w,buf_1.h
stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
stdcall mem.Free,[image_data_toolbar] ;освобождаем память
stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
stdcall [buf2d_convert_text_matrix], buf_1
load_image_file 'toolb_1.png', image_data_toolbar
load_image_file 'text_1.png', texture, text_w,text_h ;открытие файла текстуры
fld dword[angle_y]
stdcall update_number, txt_angle_y.v
fld dword[angle_z]
stdcall update_number, txt_angle_z.v
;* Setup texturing *
stdcall [glTexEnvi], GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL
;* generate texture object IDs *
stdcall [glGenTextures], 1, TexObj
stdcall [glBindTexture], GL_TEXTURE_2D, [TexObj]
stdcall [glTexImage2D], GL_TEXTURE_2D, 0, 3, [text_w], [text_h],\
0, GL_RGB, GL_UNSIGNED_BYTE, [texture]
stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST
stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST
stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT
stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT
stdcall [glBindTexture], GL_TEXTURE_2D, [TexObj]
stdcall [glEnable], GL_TEXTURE_2D
call draw_3d
align 4
red_win:
call draw_window
align 4
still:
mcall SF_WAIT_EVENT
cmp al,EV_REDRAW
jz red_win
cmp al,EV_KEY
jz key
cmp al,EV_BUTTON
jz button
jmp still
align 4
draw_window:
pushad
mcall SF_REDRAW,SSF_BEGIN_DRAW
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
mov ebx,[buf_ogl.w]
add ebx,(50 shl 16)+9
mov ecx,[buf_ogl.h]
add ecx,(30 shl 16)+4
add ecx,eax
add cx,[buf_ogl.t]
mcall SF_CREATE_WINDOW,,,0x33ffffff,,caption
mov esi,[sc.work_button]
mcall SF_DEFINE_BUTTON,(6 shl 16)+19,(6 shl 16)+19,3+0x40000000 ;сферы
mcall ,(36 shl 16)+19,,4+0x40000000 ;куб
mcall ,(66 shl 16)+19,,5+0x40000000 ;масштаб +
mcall ,(96 shl 16)+19,,6+0x40000000 ;масштаб -
mcall SF_PUT_IMAGE,[image_data_toolbar],(21 shl 16)+21,(5 shl 16)+5 ;сферы
add ebx,2*IMAGE_TOOLBAR_ICON_SIZE
mcall ,,,(35 shl 16)+5 ;куб
add ebx,IMAGE_TOOLBAR_ICON_SIZE
mcall ,,,(65 shl 16)+5 ;масштаб +
add ebx,IMAGE_TOOLBAR_ICON_SIZE
mcall ,,,(95 shl 16)+5 ;масштаб -
call [kosglSwapBuffers]
mcall SF_REDRAW,SSF_END_DRAW
popad
ret
align 4
key:
mcall SF_GET_KEY
cmp ah,27 ;Esc
je button.exit
cmp ah,61 ;+
jne @f
call but_zoom_p
jmp still
@@:
cmp ah,45 ;-
jne @f
call but_zoom_m
jmp still
@@:
cmp ah,178 ;Up
jne @f
finit
fld dword[angle_y]
fadd dword[delt_size]
fst dword[angle_y]
stdcall update_number, txt_angle_y.v
call draw_3d
call [kosglSwapBuffers]
@@:
cmp ah,177 ;Down
jne @f
finit
fld dword[angle_y]
fsub dword[delt_size]
fst dword[angle_y]
stdcall update_number, txt_angle_y.v
call draw_3d
call [kosglSwapBuffers]
@@:
cmp ah,176 ;Left
jne @f
finit
fld dword[angle_z]
fadd dword[delt_size]
fst dword[angle_z]
stdcall update_number, txt_angle_z.v
call draw_3d
call [kosglSwapBuffers]
@@:
cmp ah,179 ;Right
jne @f
finit
fld dword[angle_z]
fsub dword[delt_size]
fst dword[angle_z]
stdcall update_number, txt_angle_z.v
call draw_3d
call [kosglSwapBuffers]
@@:
jmp still
align 4
button:
mcall SF_GET_BUTTON
cmp ah,3
jne @f
call but_dr_0
jmp still
@@:
cmp ah,4
jne @f
call but_dr_1
jmp still
@@:
cmp ah,5
jne @f
call but_zoom_p
jmp still
@@:
cmp ah,6
jne @f
call but_zoom_m
jmp still
@@:
cmp ah,1
jne still
.exit:
stdcall [gluDeleteQuadric], [qObj]
stdcall mem.Free,[image_data_toolbar]
mcall SF_TERMINATE_PROCESS
;input:
; st0 - number
; txt_addr - pointer to text buffer
align 4
proc update_number uses eax, txt_addr:dword
mov word[NumberSymbolsAD],2
fstp qword[Data_Double]
call DoubleFloat_to_String
mov eax,[txt_addr]
mov byte[eax],0
stdcall str_cat, eax,Data_String
ret
endp
align 4
but_dr_0:
mov dword[dr_figure],0
call draw_3d
call [kosglSwapBuffers]
ret
align 4
but_dr_1:
mov dword[dr_figure],1
call draw_3d
call [kosglSwapBuffers]
ret
align 4
but_zoom_p:
finit
fld dword[scale]
fadd dword[sc_delt]
fcom dword[sc_max]
fstsw ax
sahf
jbe @f
ffree st0
fincstp
fld dword[sc_max]
@@:
fst dword[scale]
mov word[NumberSymbolsAD],3
fstp qword[Data_Double]
call DoubleFloat_to_String
mov byte[txt_scale.v],0
stdcall str_cat, txt_scale.v,Data_String
call draw_3d
call [kosglSwapBuffers]
ret
align 4
but_zoom_m:
finit
fld dword[scale]
fsub dword[sc_delt]
fcom dword[sc_min]
fstsw ax
sahf
ja @f
ffree st0
fincstp
fld dword[sc_min]
@@:
fst dword[scale]
mov word[NumberSymbolsAD],3
fstp qword[Data_Double]
call DoubleFloat_to_String
mov byte[txt_scale.v],0
stdcall str_cat, txt_scale.v,Data_String
call draw_3d
call [kosglSwapBuffers]
ret
align 4
draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
call [glPushMatrix]
stdcall [glScalef], [scale], [scale], [scale]
stdcall [glRotatef], [angle_z],0.0,0.0,1.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0
cmp dword[dr_figure],0
jne @f
; рисование сфер
stdcall [glColor3f], 1.0, 1.0, 0.0
push 32
push 32
glpush rad1
stdcall [gluSphere], [qObj]
stdcall [glColor3f], 1.0, 0.0, 0.0
stdcall [glTranslatef], -1.6,0.0,0.0
push 16
push 16
glpush rad2
stdcall [gluSphere], [qObj]
stdcall [glColor3f], 0.0, 0.0, 1.0
stdcall [glTranslatef], 3.2,0.0,0.0
push 16
push 16
glpush rad2
stdcall [gluSphere], [qObj]
@@:
cmp dword[dr_figure],1
jne @f
; рисование граней куба
stdcall [glBegin],GL_QUADS
; Передняя грань
stdcall [glTexCoord2f], 0.0f, 0.0f
stdcall [glVertex3f], -1.0f, -1.0f, 1.0f ; Низ лево
stdcall [glTexCoord2f], 1.0f, 0.0f
stdcall [glVertex3f], 1.0f, -1.0f, 1.0f ; Низ право
stdcall [glTexCoord2f], 1.0f, 1.0f
stdcall [glVertex3f], 1.0f, 1.0f, 1.0f ; Верх право
stdcall [glTexCoord2f], 0.0f, 1.0f
stdcall [glVertex3f], -1.0f, 1.0f, 1.0f ; Верх лево
; Задняя грань
stdcall [glTexCoord2f], 1.0f, 0.0f
stdcall [glVertex3f], -1.0f, -1.0f, -1.0f ; Низ право
stdcall [glTexCoord2f], 1.0f, 1.0f
stdcall [glVertex3f], -1.0f, 1.0f, -1.0f ; Верх право
stdcall [glTexCoord2f], 0.0f, 1.0f
stdcall [glVertex3f], 1.0f, 1.0f, -1.0f ; Верх лево
stdcall [glTexCoord2f], 0.0f, 0.0f
stdcall [glVertex3f], 1.0f, -1.0f, -1.0f ; Низ лево
; Верхняя грань
stdcall [glTexCoord2f], 0.0f, 1.0f
stdcall [glVertex3f], -1.0f, 1.0f, -1.0f ; Верх лево
stdcall [glTexCoord2f], 0.0f, 0.0f
stdcall [glVertex3f], -1.0f, 1.0f, 1.0f ; Низ лево
stdcall [glTexCoord2f], 1.0f, 0.0f
stdcall [glVertex3f], 1.0f, 1.0f, 1.0f ; Низ право
stdcall [glTexCoord2f], 1.0f, 1.0f
stdcall [glVertex3f], 1.0f, 1.0f, -1.0f ; Верх право
; Нижняя грань
stdcall [glTexCoord2f], 1.0f, 1.0f
stdcall [glVertex3f], -1.0f, -1.0f, -1.0f ; Верх право
stdcall [glTexCoord2f], 0.0f, 1.0f
stdcall [glVertex3f], 1.0f, -1.0f, -1.0f ; Верх лево
stdcall [glTexCoord2f], 0.0f, 0.0f
stdcall [glVertex3f], 1.0f, -1.0f, 1.0f ; Низ лево
stdcall [glTexCoord2f], 1.0f, 0.0f
stdcall [glVertex3f], -1.0f, -1.0f, 1.0f ; Низ право
; Правая грань
stdcall [glTexCoord2f], 1.0f, 0.0f
stdcall [glVertex3f], 1.0f, -1.0f, -1.0f ; Низ право
stdcall [glTexCoord2f], 1.0f, 1.0f
stdcall [glVertex3f], 1.0f, 1.0f, -1.0f ; Верх право
stdcall [glTexCoord2f], 0.0f, 1.0f
stdcall [glVertex3f], 1.0f, 1.0f, 1.0f ; Верх лево
stdcall [glTexCoord2f], 0.0f, 0.0f
stdcall [glVertex3f], 1.0f, -1.0f, 1.0f ; Низ лево
; Левая грань
stdcall [glTexCoord2f], 0.0f, 0.0f
stdcall [glVertex3f], -1.0f, -1.0f, -1.0f ; Низ лево
stdcall [glTexCoord2f], 1.0f, 0.0f
stdcall [glVertex3f], -1.0f, -1.0f, 1.0f ; Низ право
stdcall [glTexCoord2f], 1.0f, 1.0f
stdcall [glVertex3f], -1.0f, 1.0f, 1.0f ; Верх право
stdcall [glTexCoord2f], 0.0f, 1.0f
stdcall [glVertex3f], -1.0f, 1.0f, -1.0f ; Верх лево
call [glEnd]
@@:
call [glPopMatrix]
stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_scale,5,5,0xffff00
stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_z,5,15,0xffff00
stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_y,5,25,0xffff00
ret
align 4
caption db 'Test textures, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0
align 4
rad1 dq 1.0
rad2 dq 0.55
scale dd 0.4 ;начальный масштаб
sc_delt dd 0.05 ;изменение масштаба при нажатии
sc_min dd 0.1 ;минимальный масштаб
sc_max dd 1.1 ;максимальный масштаб
angle_z dd 0.0
angle_y dd 0.0
delt_size dd 3.0
light_position dd 3.0, 2.0, -10.0, 1.0 ; Расположение источника [0][1][2]
;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
light_dir dd 0.0,0.0,0.0 ;направление лампы
mat_specular dd 0.1, 0.1, 0.1, 1.0 ; Цвет блика
;mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
lmodel_ambient dd 0.2, 0.2, 0.2, 1.0 ; Параметры фонового освещения
;--------------------------------------------------
include '../import.inc' ;tinygl
include '../../../buf2d/import.inc'
include '../../../libs-dev/libimg/import.inc'
;--------------------------------------------------
system_dir_0 db '/sys/lib/'
lib_name_0 db 'tinygl.obj',0
system_dir_1 db '/sys/lib/'
lib_name_1 db 'buf2d.obj',0
system_dir_2 db '/sys/lib/'
lib_name_2 db 'libimg.obj',0
;--------------------------------------------------
txt_scale:
db 'Scale: '
.v: rb 11
txt_angle_z:
db 'Rotate z: '
.v: rb 11
txt_angle_y:
db 'Rotate y: '
.v: rb 11
align 4
buf_ogl:
dd 0 ;указатель на буфер изображения
dw 3d_wnd_l ;+4 left
.t: dw 3d_wnd_t ;+6 top
.w: dd 3d_wnd_w
.h: dd 3d_wnd_h
dd 0,24 ;+16 color,bit in pixel
align 4
buf_1:
dd 0 ;указатель на буфер изображения
dd 0 ;+4 left,top
.w: dd 0
.h: dd 0,0,24 ;+16 color,bit in pixel
align 4
l_libs_start:
lib_0 l_libs lib_name_0, file_name, system_dir_0, import_tinygl
lib_1 l_libs lib_name_1, file_name, system_dir_1, import_buf2d
lib_2 l_libs lib_name_2, file_name, system_dir_2, import_libimg
l_libs_end:
align 4
i_end:
ctx1 TinyGLContext
image_data_toolbar dd 0
dr_figure dd 0
qObj dd 0
TexObj dd 0 ;массив указателей на текстуры (в данном случае 1 шт.)
texture dd 0 ;указатель на память с текстурой
text_w dd 0
text_h dd 0
run_file_70 FileInfoBlock
sc system_colors
align 16
cur_dir_path rb 4096
file_name rb 4096
rb 4096
stacktop:
mem: