TinyGL:
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 40s
Build system / Build (pull_request) Successful in 7m12s

- fix function glClearDepth
- fix bug with z-buffer
- flag demo program rewritten
- fix array functions
This commit is contained in:
2025-04-09 23:15:20 +03:00
parent fcb9f49785
commit 190936d799
22 changed files with 574 additions and 379 deletions

View File

@@ -0,0 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("flag.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "flag")

View File

@@ -0,0 +1,311 @@
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_lib.mac'
include '../../dll.inc'
include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
include '../../develop/libraries/TinyGL/asm_fork/examples/fps.inc'
@use_library
;Macro for double type parameters (8 bytes)
macro glpush GLDoubleVar {
push dword[GLDoubleVar+4]
push dword[GLDoubleVar]
}
align 4
start:
load_library name_tgl, library_path, system_path, import_tinygl
cmp eax,SF_TERMINATE_PROCESS
jz button.exit
mcall SF_SET_EVENTS_MASK, 0x27
; *** init ***
stdcall [kosglMakeCurrent], 0,15,600,380,ctx1
stdcall [glMatrixMode], GL_MODELVIEW
call [glLoadIdentity]
stdcall [glClearColor], 0.549, 0.549, 0.588, 1.0
;stdcall [glEnable], GL_LIGHTING
;stdcall [glLightf], GL_LIGHT0, GL_SPOT_EXPONENT, 0.0
;stdcall [glLightf], GL_LIGHT0, GL_SPOT_CUTOFF, 180.0
;stdcall [glEnable], GL_LIGHT0
stdcall [glLightfv], GL_LIGHT0, GL_POSITION, lightpos
stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, lightdirect
stdcall [glEnable], GL_COLOR_MATERIAL
glpush p3
stdcall [glClearDepth]
stdcall [glEnable], GL_CULL_FACE
stdcall [glEnable], GL_DEPTH_TEST
mcall SF_KEYBOARD, SSF_SET_INPUT_MODE, 1
fninit
stdcall reshape, 600,380
; *** end init ***
align 4
red_win:
call draw_window
mcall SF_THREAD_INFO, procinfo,-1
mov eax,dword[procinfo.box.height]
cmp eax,120
jge @f
mov eax,120 ;min size
@@:
sub eax,43
mov ebx,dword[procinfo.box.width]
cmp ebx,200
jge @f
mov ebx,200
@@:
sub ebx,10
stdcall reshape, ebx,eax
.end0:
align 16
still:
call draw_3d
cmp dword[stop],1
je @f
stdcall Fps, 365,4
mov dword[esp-4],eax
fild dword[esp-4]
fmul dword[delt_3]
fchs
fadd dword[dangle]
fstp dword[dangle] ;dangle -= 0.01*Fps(x,y)
;mcall SF_CHECK_EVENT
mcall SF_WAIT_EVENT_TIMEOUT, 1
jmp .end0
align 4
@@:
mcall SF_WAIT_EVENT
.end0:
cmp al, EV_REDRAW
jz red_win
cmp al, EV_KEY
jz key
cmp al, EV_BUTTON
jz button
jmp still
; new window size or exposure
align 4
proc reshape, width:dword, height:dword
locals
dxy dq ?
endl
stdcall [glViewport], 0, 0, [width], [height]
stdcall [glMatrixMode], GL_PROJECTION
call [glLoadIdentity]
fild dword[width]
fidiv dword[height]
fstp qword[dxy] ;dxy = width/height
glpush p4
glpush p3
glpush dxy
glpush p1
call [gluPerspective] ;28.0, width/height, 1.0, 40.0
stdcall [glMatrixMode], GL_MODELVIEW
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
ret
endp
align 4
p1 dq 28.0
p3 dq 1.0
p4 dq 40.0
align 4
draw_window:
pushad
mcall SF_REDRAW,SSF_BEGIN_DRAW
mcall SF_CREATE_WINDOW, (50 shl 16)+609,(30 shl 16)+425,0x33404040,,title1
call [kosglSwapBuffers]
;Title
mcall SF_DRAW_TEXT, (338 shl 16)+4, 0xc0c0c0, fps, fps.end-fps
mcall SF_DRAW_TEXT, (8 shl 16)+4, 0xc0c0c0, title3, title3.end-title3
;mcall SF_DRAW_TEXT, (180 shl 16)+4, 0xc0c0c0, title2, title2.end-title2
mcall SF_REDRAW,SSF_END_DRAW
popad
ret
align 4
key:
mcall SF_GET_KEY
cmp ah,27 ;Esc
je button.exit
cmp ah,112 ;P
jne @f
xor dword[stop],1
jmp still
@@:
jmp still
align 4
button:
mcall SF_GET_BUTTON
cmp ah,1
jne still
.exit:
mcall SF_TERMINATE_PROCESS
align 4
title1: db 'TinyGL in KolibriOS'
.end: db 0
;title2: db 'F full screen'
;.end: db 0
title3: db 'ESC - exit, P - pause'
.end: db 0
fps: db 'FPS:'
.end: db 0
align 16
proc draw_3d uses ebx ecx edx esi edi
locals
z dd ?
endl
call [glLoadIdentity]
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
stdcall [glTranslatef], 0.0, 0.0, -2.0
stdcall [glRotatef], 10.0, 0.0, 0.0, 1.0
stdcall [glRotatef], 43.0, 0.0, 1.0, 0.0
stdcall [glTranslatef], -0.6, -0.2, -0.1
mov edi, logo+9*41 ;edi = logo[9][0]
mov esi, 41 ;esi = i
align 4
.cycle0: ;for(int i=0;i<41;i++)
stdcall [glTranslatef], 0.045, 0.0, 0.0
call [glPushMatrix]
fld dword[angle]
fsin
fmul dword[delt_1]
fstp dword[z] ;= 0.08*sin(angle)
fld dword[angle]
fadd dword[delt_2]
fstp dword[angle] ;angle += 0.2
mov ecx, 9
mov ebx, edi
; ebx = @temp1, ecx = j
.cycle1: ;for(int j=9;j>=0;j--)
cmp byte[ebx],0 ;if(logo[j][i])
je @f
push 0.0 ;b
push 0.0 ;g
push 1.0 ;r
jmp .end_c2
@@:
push 0.945 ;b
push 0.855 ;g
push 0.859 ;r
.end_c2:
call [glColor3f]
stdcall [glTranslatef], 0.0, 0.045, 0.0
stdcall [glBegin], GL_QUADS
stdcall [glVertex3f], 0.0, -0.04,[z]
stdcall [glVertex3f], 0.04,-0.04,[z]
stdcall [glVertex3f], 0.04, 0.0, [z]
stdcall [glVertex3f], 0.0, 0.0, [z]
call [glEnd]
add ebx, -41
dec ecx
jnz .cycle1
call [glPopMatrix]
inc edi ;edi = logo[9][i]
dec esi
jnz .cycle0
mov edx,dword[dangle]
mov dword[angle],edx
call [kosglSwapBuffers]
ret
endp
align 4
delt_1 dd 0.08
delt_2 dd 0.2
delt_3 dd 0.01
lightpos dd 2.0, 0.0, -2.5, 1.0
lightdirect dd 0.0, 0.0, -0.7
angle dd 0.0
dangle dd 0.0
stop dd 0
;[10][41]
logo db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,1,0,0,1,1,1,0,0,0,1,1,1,0,0,0,\
0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,\
0,0,1,0,1,0,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,1,0,0,0,0,\
0,0,1,1,1,0,0,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,\
0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,\
0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,1,0,0,1,1,1,0,0,0,1,1,1,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;--------------------------------------------------
align 4
import_tinygl:
macro E_LIB n
{
n dd sz_#n
}
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
dd 0,0
macro E_LIB n
{
sz_#n db `n,0
}
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
;--------------------------------------------------
system_path db '/sys/lib/'
name_tgl db 'tinygl.obj',0
;--------------------------------------------------
align 16
i_end:
ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
;sizeof.TinyGLContext = 28
procinfo process_information
cur_dir_path rb 4096
library_path rb 4096
rb 4096
stacktop:
mem:

View File

@@ -1082,7 +1082,7 @@ l_libs_start:
lib_2 l_libs lib_name_2, file_name, system_dir_2, import_box_lib lib_2 l_libs lib_name_2, file_name, system_dir_2, import_box_lib
lib_3 l_libs lib_name_3, file_name, system_dir_3, import_buf2d lib_3 l_libs lib_name_3, file_name, system_dir_3, import_buf2d
lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu
lib_5 l_libs lib_name_5, file_name, system_dir_5, import_lib_tinygl lib_5 l_libs lib_name_5, file_name, system_dir_5, import_tinygl
lib_6 l_libs lib_name_6, file_name, system_dir_6, import_libini lib_6 l_libs lib_name_6, file_name, system_dir_6, import_libini
l_libs_end: l_libs_end:
@@ -1287,7 +1287,7 @@ dd 0,0
akmenuitem_draw db 'kmenuitem_draw',0 akmenuitem_draw db 'kmenuitem_draw',0
align 4 align 4
import_lib_tinygl: import_tinygl:
macro E_LIB n macro E_LIB n
{ {
n dd sz_#n n dd sz_#n
@@ -1343,7 +1343,7 @@ buf_1:
align 4 align 4
el_focus dd tree1 el_focus dd tree1
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\ tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
16,16, 0xffffff,0xb0d0ff,0x400040, 5,35,195-16,250, 16,list_offs_text,0,\ 16,16, 0xffffff,0xb0d0ff,0x10400040, 5,35,195-16,250, 16,list_offs_text,0,\
el_focus,w_scr_t1,0 el_focus,w_scr_t1,0
align 4 align 4
@@ -1362,9 +1362,9 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ;
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD><><E4AEAD><EFBFBD><EFBFBD><EFBFBD> <20>ᢥ饭<E1A2A5><E9A5AD> lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD><><E4AEAD><EFBFBD><EFBFBD><EFBFBD> <20>ᢥ饭<E1A2A5><E9A5AD>
if lang eq ru_RU if lang eq ru_RU
capt db 'info 3ds <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 29.09.20',0 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> capt db 'info 3ds <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 14.04.25',0 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
else ; Default to en_US else ; Default to en_US
capt db 'info 3ds version 29.09.20',0 ;window caption capt db 'info 3ds version 14.04.25',0 ;window caption
end if end if
align 16 align 16

View File

@@ -1408,7 +1408,7 @@ buf_1:
align 4 align 4
el_focus dd tree1 el_focus dd tree1
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\ tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
16,16, 0xffffff,0xb0d0ff,0x400040, 5,47,195-16,250, 16,list_offs_text,0, el_focus,\ 16,16, 0xffffff,0xb0d0ff,0x10400040, 5,47,195-16,250, 16,list_offs_text,0, el_focus,\
w_scr_t1,0 w_scr_t1,0
align 4 align 4
@@ -1427,9 +1427,9 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ;
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD><><E4AEAD><EFBFBD><EFBFBD><EFBFBD> <20>ᢥ饭<E1A2A5><E9A5AD> lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD><><E4AEAD><EFBFBD><EFBFBD><EFBFBD> <20>ᢥ饭<E1A2A5><E9A5AD>
if lang eq ru_RU if lang eq ru_RU
capt db 'info 3ds [user] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 29.09.20',0 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> capt db 'info 3ds [user] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 14.04.25',0 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
else ; Default to en_US else ; Default to en_US
capt db 'info 3ds [user] version 29.09.20',0 ; Window caption capt db 'info 3ds [user] version 14.04.25',0 ; Window caption
end if end if
align 16 align 16

View File

@@ -812,9 +812,8 @@ proc draw_3d uses eax ebx ecx edi, o_data:dword
@@: @@:
stdcall [glDisable],GL_LIGHTING stdcall [glDisable],GL_LIGHTING
.end_l: .end_l:
stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
stdcall [glScalef], [edi+obj_3d.x_scale],[edi+obj_3d.y_scale],[edi+obj_3d.z_scale] stdcall [glScalef], [edi+obj_3d.x_scale],[edi+obj_3d.y_scale],[edi+obj_3d.z_scale]
stdcall [glScalef], 1.0,1.0,0.7 ;correct for z stdcall [glScalef], 1.0,1.0,1.4 ;correct for z
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0
stdcall [glRotatef], [angle_x],1.0,0.0,0.0 stdcall [glRotatef], [angle_x],1.0,0.0,0.0

View File

@@ -951,13 +951,12 @@ endl
endp endp
align 4 align 4
proc glClearDepth uses eax, depth:dword proc glClearDepth uses eax, depth:qword
locals locals
p rd 2 p rd 2
endl endl
mov dword[p],OP_ClearDepth mov dword[p],OP_ClearDepth
mov eax,[depth] fld qword[depth]
fld qword[eax]
fstp dword[p+4] fstp dword[p+4]
lea eax,[ebp-8] ;=sizeof(dd)*2 lea eax,[ebp-8] ;=sizeof(dd)*2

View File

@@ -23,8 +23,7 @@ endl
imul ecx,ebx imul ecx,ebx
shl ecx,2 shl ecx,2
add ecx,[eax+GLContext.color_array] ;ecx = &context.color_array[i] add ecx,[eax+GLContext.color_array] ;ecx = &context.color_array[i]
mov ebx,ebp lea ebx,[ebp-20] ;=sizeof(dd)*5
sub ebx,20 ;=sizeof(dd)*5
mov edx,[ecx] mov edx,[ecx]
mov [ebx+4],edx mov [ebx+4],edx
mov edx,[ecx+4] mov edx,[ecx+4]
@@ -48,8 +47,7 @@ endl
imul esi,ebx imul esi,ebx
shl esi,2 shl esi,2
add esi,[eax+GLContext.normal_array] ;esi = &normal_array[ebx * (3 + c->normal_array_stride)] add esi,[eax+GLContext.normal_array] ;esi = &normal_array[ebx * (3 + c->normal_array_stride)]
mov edi,eax lea edi,[eax+GLContext.current_normal]
add edi,GLContext.current_normal
mov ecx,3 mov ecx,3
rep movsd rep movsd
mov dword[edi],0.0 mov dword[edi],0.0
@@ -92,8 +90,7 @@ endl
imul ecx,ebx imul ecx,ebx
shl ecx,2 shl ecx,2
add ecx,[eax+GLContext.vertex_array] ;ecx = &context.vertex_array[i] add ecx,[eax+GLContext.vertex_array] ;ecx = &context.vertex_array[i]
mov ebx,ebp lea ebx,[ebp-20] ;=sizeof(dd)*5
sub ebx,20 ;=sizeof(dd)*5
mov edx,[ecx] mov edx,[ecx]
mov [ebx+4],edx mov [ebx+4],edx
mov edx,[ecx+4] mov edx,[ecx+4]
@@ -130,8 +127,7 @@ endl
mov eax,[i] mov eax,[i]
mov dword[p+4],eax mov dword[p+4],eax
mov eax,ebp lea eax,[ebp-8] ;=sizeof(dd)*2
sub eax,8 ;=sizeof(dd)*2
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -139,10 +135,9 @@ endp
align 4 align 4
proc glopDrawArrays, context:dword, param:dword proc glopDrawArrays, context:dword, param:dword
locals locals
vi dd ?
idx dd ? idx dd ?
states dd ? states dd ?
size dd ? a_size dd ?
p rd 8 ;функция glopColor требует 8 параметров, другие функции требуют меньше, берем по максимуму что-бы не портить стек p rd 8 ;функция glopColor требует 8 параметров, другие функции требуют меньше, берем по максимуму что-бы не портить стек
endl endl
pushad pushad
@@ -155,132 +150,19 @@ pushad
mov [idx],eax ;param[2].i mov [idx],eax ;param[2].i
mov eax,[ebx+4] mov eax,[ebx+4]
mov [p+4],eax ;p[1].i = param[1].i mov [p+4],eax ;p[1].i = param[1].i
mov eax,ebp lea eax,[ebp-32] ;=sizeof(dd)*8
sub eax,32 ;=sizeof(dd)*8
stdcall glopBegin, edx,eax stdcall glopBegin, edx,eax
mov dword[vi],0 cmp ecx,1
jl @f
align 4 align 4
.cycle_0: ;for (int vi=0; vi<count; vi++) .cycle_0: ;for (int vi=0; vi<count; vi++)
cmp dword[vi],ecx call CopyArrayElementByIndex
jge .cycle_0_end
bt dword[states],1 ;2^1=COLOR_ARRAY
jnc @f
mov esi,[edx+GLContext.color_array_size]
mov [size],esi
add esi,[edx+GLContext.color_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.color_array] ;esi = &context.color_array[i]
mov edi,ebp
sub edi,28 ;edi = &p[1]
mov ebx,[esi+8]
mov [edi],ebx ;p[1].f = context.color_array[i+2]
mov ebx,[esi+4]
mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
mov ebx,[esi]
mov [edi+8],ebx ;p[3].f = context.color_array[i]
add edi,12
cmp dword[size],3
jle .e1
add esi,12
movsd
jmp .e2
.e1:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
.e2:
mov edi,ebp
sub edi,32 ;edi = &p[0]
mov ebx,ebp
sub ebx,12 ;ebp-12 = &p[5]
push ebx
add ebx,4 ;ebp-8 = &p[6]
push ebx
add ebx,4 ;ebp-4 = &p[7]
push ebx
stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi))
@@:
bt dword[states],2 ;2^2=NORMAL_ARRAY
jnc @f
mov esi,[edx+GLContext.normal_array_stride]
add esi,3
imul esi,[idx]
shl esi,2
add esi,[edx+GLContext.normal_array] ;esi = &context.normal_array[ idx * (3 + context.normal_array_stride) ]
mov edi,edx
add edi,GLContext.current_normal
movsd ;context.current_normal.X = context.normal_array[i]
movsd
movsd
mov dword[edi],0.0 ;context.current_normal.W = 0.0f
@@:
bt dword[states],3 ;2^3=TEXCOORD_ARRAY
jnc @f
mov esi,[edx+GLContext.texcoord_array_size]
mov [size],esi
add esi,[edx+GLContext.texcoord_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.texcoord_array] ;esi = &context.texcoord_array[i]
mov edi,edx
add edi,GLContext.current_tex_coord
movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
movsd
cmp dword[size],2
jle .e3
movsd
jmp .e4
.e3:
mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
add edi,4
.e4:
cmp dword[size],3
jle .e5
movsd
jmp @f
.e5:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
@@:
bt dword[states],0 ;2^0=VERTEX_ARRAY
jnc @f
mov esi,[edx+GLContext.vertex_array_size]
mov [size],esi
add esi,[edx+GLContext.vertex_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.vertex_array] ;esi = &context.vertex_array[i]
mov edi,ebp
sub edi,28 ;edi = &p[1]
movsd ;p[1].f = context.vertex_array[i]
movsd
cmp dword[size],2
jle .e6
movsd
jmp .e7
.e6:
mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
add edi,4
jmp .e8 ;и 4-й тоже ставим по умолчанию
.e7:
cmp dword[size],3
jle .e8
movsd
sub edi,20 ;edi=&p[0]
jmp .e9
.e8:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
sub edi,16 ;edi=&p[0]
.e9:
stdcall glopVertex, edx,edi
@@:
inc dword[idx] inc dword[idx]
inc dword[vi] loop .cycle_0
jmp .cycle_0 @@:
.cycle_0_end:
;mov eax,ebp lea eax,[ebp-32] ;=sizeof(dd)*8
;sub eax,32 ;=sizeof(dd)*8
stdcall glopEnd, edx,eax stdcall glopEnd, edx,eax
popad popad
ret ret
@@ -299,8 +181,7 @@ endl
mov eax,[count] mov eax,[count]
mov dword[p+12],eax mov dword[p+12],eax
mov eax,ebp lea eax,[ebp-16] ;=sizeof(dd)*4
sub eax,16 ;=sizeof(dd)*4
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -308,12 +189,12 @@ endp
align 4 align 4
proc glopDrawElements, context:dword, param:dword proc glopDrawElements, context:dword, param:dword
locals locals
type dd ?
indices dd ? ;указатель на 16 или 32 битные индексы
ii dd ? ii dd ?
idx dd ? idx dd ?
states dd ? states dd ?
type dd ? a_size dd ?
size dd ?
indices dd ? ;указатель на 16 или 32 битные индексы
p rd 8 p rd 8
endl endl
pushad pushad
@@ -328,8 +209,7 @@ pushad
mov [type],eax ;type = param[3].i mov [type],eax ;type = param[3].i
mov eax,[ebx+16] mov eax,[ebx+16]
mov [indices],eax ;*indices = param[4].p mov [indices],eax ;*indices = param[4].p
mov eax,ebp lea eax,[ebp-32] ;=sizeof(dd)*8
sub eax,32 ;=sizeof(dd)*8
stdcall glopBegin, edx,eax stdcall glopBegin, edx,eax
mov dword[ii],0 mov dword[ii],0
@@ -351,127 +231,133 @@ align 4
.end_0: .end_0:
mov [idx],esi mov [idx],esi
bt dword[states],1 ;2^1=COLOR_ARRAY call CopyArrayElementByIndex
jnc @f
mov esi,[edx+GLContext.color_array_size]
mov [size],esi
add esi,[edx+GLContext.color_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.color_array] ;esi = &context.color_array[i]
mov edi,ebp
sub edi,28 ;edi = &p[1]
mov ebx,[esi+8]
mov [edi],ebx ;p[1].f = context.color_array[i+2]
mov ebx,[esi+4]
mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
mov ebx,[esi]
mov [edi+8],ebx ;p[3].f = context.color_array[i]
add edi,12
cmp dword[size],3
jle .e1
add esi,12
movsd
jmp .e2
.e1:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
.e2:
mov edi,ebp
sub edi,32 ;edi = &p[0]
mov ebx,ebp
sub ebx,12 ;ebp-12 = &p[5]
push ebx
add ebx,4 ;ebp-8 = &p[6]
push ebx
add ebx,4 ;ebp-4 = &p[7]
push ebx
stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi))
@@:
bt dword[states],2 ;2^2=NORMAL_ARRAY
jnc @f
mov esi,[edx+GLContext.normal_array_stride]
add esi,3
imul esi,[idx] ;esi = idx * (3 + context.normal_array_stride)
shl esi,2
add esi,[edx+GLContext.normal_array]
mov edi,edx
add edi,GLContext.current_normal
movsd ;context.current_normal.X = context.normal_array[i]
movsd
movsd
mov dword[edi],0.0 ;context.current_normal.W = 0.0f
@@:
bt dword[states],3 ;2^3=TEXCOORD_ARRAY
jnc @f
mov esi,[edx+GLContext.texcoord_array_size]
mov [size],esi
add esi,[edx+GLContext.texcoord_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.texcoord_array] ;esi = &context.texcoord_array[i]
mov edi,edx
add edi,GLContext.current_tex_coord
movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
movsd
cmp dword[size],2
jle .e3
movsd
jmp .e4
.e3:
mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
add edi,4
.e4:
cmp dword[size],3
jle .e5
movsd
jmp @f
.e5:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
@@:
bt dword[states],0 ;2^0=VERTEX_ARRAY
jnc @f
mov esi,[edx+GLContext.vertex_array_size]
mov [size],esi
add esi,[edx+GLContext.vertex_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.vertex_array] ;esi = &context.vertex_array[i]
mov edi,ebp
sub edi,28 ;edi = &p[1]
movsd ;p[1].f = context.vertex_array[i]
movsd
cmp dword[size],2
jle .e6
movsd
jmp .e7
.e6:
mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
add edi,4
jmp .e8 ;и 4-й тоже ставим по умолчанию
.e7:
cmp dword[size],3
jle .e8
movsd
sub edi,20 ;edi=&p[0]
jmp .e9
.e8:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
sub edi,16 ;edi=&p[0]
.e9:
stdcall glopVertex, edx,edi
@@:
inc dword[ii] inc dword[ii]
jmp .cycle_0 jmp .cycle_0
.cycle_0_end: .cycle_0_end:
mov eax,ebp lea eax,[ebp-32] ;=sizeof(dd)*8
sub eax,32 ;=sizeof(dd)*8
stdcall glopEnd, edx,eax stdcall glopEnd, edx,eax
popad popad
ret ret
endp endp
;input:
; edx - GLContext
idx equ ebp-44
states equ ebp-40
a_size equ ebp-36
align 4
CopyArrayElementByIndex:
bt dword[states],1 ;2^1=COLOR_ARRAY
jnc @f
mov esi,[edx+GLContext.color_array_size]
mov [a_size],esi
add esi,[edx+GLContext.color_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.color_array] ;esi = &context.color_array[i]
lea edi,[ebp-28] ;edi = &p[1]
mov ebx,[esi+8]
mov [edi],ebx ;p[1].f = context.color_array[i+2]
mov ebx,[esi+4]
mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
mov ebx,[esi]
mov [edi+8],ebx ;p[3].f = context.color_array[i]
add edi,12
cmp dword[a_size],3
jle .e1
add esi,12
movsd
jmp .e2
.e1:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
.e2:
lea edi,[ebp-32] ;edi = &p[0]
lea ebx,[ebp-12] ;ebp-12 = &p[5]
push ebx
add ebx,4 ;ebp-8 = &p[6]
push ebx
add ebx,4 ;ebp-4 = &p[7]
push ebx
stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi))
@@:
bt dword[states],2 ;2^2=NORMAL_ARRAY
jnc @f
mov esi,[edx+GLContext.normal_array_stride]
add esi,3
imul esi,[idx] ;esi = idx * (3 + context.normal_array_stride)
shl esi,2
add esi,[edx+GLContext.normal_array] ;esi = &context.normal_array[ idx * (3 + context.normal_array_stride) ]
lea edi,[edx+GLContext.current_normal]
movsd ;context.current_normal.X = context.normal_array[i]
movsd
movsd
mov dword[edi],0.0 ;context.current_normal.W = 0.0f
@@:
bt dword[states],3 ;2^3=TEXCOORD_ARRAY
jnc @f
mov esi,[edx+GLContext.texcoord_array_size]
mov [a_size],esi
add esi,[edx+GLContext.texcoord_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.texcoord_array] ;esi = &context.texcoord_array[i]
lea edi,[edx+GLContext.current_tex_coord]
movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
movsd
cmp dword[a_size],2
jle .e3
movsd
jmp .e4
.e3:
mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
add edi,4
.e4:
cmp dword[a_size],3
jle .e5
movsd
jmp @f
.e5:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
@@:
bt dword[states],0 ;2^0=VERTEX_ARRAY
jnc @f
mov esi,[edx+GLContext.vertex_array_size]
mov [a_size],esi
add esi,[edx+GLContext.vertex_array_stride]
imul esi,[idx] ;esi = i
shl esi,2
add esi,[edx+GLContext.vertex_array] ;esi = &context.vertex_array[i]
lea edi,[ebp-28] ;edi = &p[1]
movsd ;p[1].f = context.vertex_array[i]
movsd
cmp dword[a_size],2
jle .e6
movsd
jmp .e7
.e6:
mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
add edi,4
jmp .e8 ;и 4-й тоже ставим по умолчанию
.e7:
cmp dword[a_size],3
jle .e8
movsd
sub edi,20 ;edi=&p[0]
jmp .e9
.e8:
mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
sub edi,16 ;edi=&p[0]
.e9:
stdcall glopVertex, edx,edi
@@:
ret
purge idx
purge states
purge a_size
align 4 align 4
proc glDrawElements uses eax, mode:dword, count:dword, type:dword, indices:dword proc glDrawElements uses eax, mode:dword, count:dword, type:dword, indices:dword
locals locals
@@ -488,8 +374,7 @@ endl
mov eax,[indices] mov eax,[indices]
mov dword[p+16],eax mov dword[p+16],eax
mov eax,ebp lea eax,[ebp-20] ;=sizeof(dd)*5
sub eax,20 ;=sizeof(dd)*5
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -533,8 +418,7 @@ endl
;assert(0); ;assert(0);
.end_f: .end_f:
mov eax,ebp lea eax,[ebp-8] ;=sizeof(dd)*2
sub eax,8 ;=sizeof(dd)*2
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -578,8 +462,7 @@ endl
;assert(0); ;assert(0);
.end_f: .end_f:
mov eax,ebp lea eax,[ebp-8] ;=sizeof(dd)*2
sub eax,8 ;=sizeof(dd)*2
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -612,8 +495,7 @@ endl
mov eax,[pointer] mov eax,[pointer]
mov dword[p+12],eax mov dword[p+12],eax
mov eax,ebp lea eax,[ebp-16] ;=sizeof(dd)*4
sub eax,16 ;=sizeof(dd)*4
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -646,8 +528,7 @@ endl
mov eax,[pointer] mov eax,[pointer]
mov dword[p+12],eax mov dword[p+12],eax
mov eax,ebp lea eax,[ebp-16] ;=sizeof(dd)*4
sub eax,16 ;=sizeof(dd)*4
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -676,8 +557,7 @@ endl
mov eax,[pointer] mov eax,[pointer]
mov dword[p+8],eax mov dword[p+8],eax
mov eax,ebp lea eax,[ebp-12] ;=sizeof(dd)*3
sub eax,12 ;=sizeof(dd)*3
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp
@@ -710,8 +590,7 @@ endl
mov eax,[pointer] mov eax,[pointer]
mov dword[p+12],eax mov dword[p+12],eax
mov eax,ebp lea eax,[ebp-16] ;=sizeof(dd)*4
sub eax,16 ;=sizeof(dd)*4
stdcall gl_add_op,eax stdcall gl_add_op,eax
ret ret
endp endp

View File

@@ -12,6 +12,15 @@ include '../opengl_const.inc'
@use_library @use_library
;Константы описывающие файл house.3ds (получены с использованием программы info_3ds)
VERTICES_OFFSET = 0x33 ;смещение по которому идут координаты вершин
FACES_COUNT = 0x162 ;число граней
FACES_OFFSET = 0x96b ;смещение по которому идет информация о гранях
HOUSE_FILE_SIZE = 5297
txt_error_file_size db '"House.3ds file size does not match" -tE',0
align 4 align 4
start: start:
load_library name_tgl, library_path, system_path, import_tinygl load_library name_tgl, library_path, system_path, import_tinygl
@@ -22,9 +31,9 @@ start:
;заполняем массив индексов из файла house.3ds (который вшит внутрь данной программы) ;заполняем массив индексов из файла house.3ds (который вшит внутрь данной программы)
mov esi,house_3ds mov esi,house_3ds
add esi,0x1798 ;смещение по которому идет информация о гранях в файле 3ds (получено с использованием программы info_3ds) add esi,FACES_OFFSET
mov edi,Indices mov edi,Indices
mov eax,0x1a6 ;число граней в файле 3ds (получено с использованием программы info_3ds) mov eax,FACES_COUNT
@@: @@:
movsd movsd
movsw movsw
@@ -48,13 +57,13 @@ red_win:
align 4 align 4
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -141,10 +150,15 @@ caption db 'Test opengl 1.1 arrays, [Esc] - exit, [<-],[->],[Up],[Down] - rotate
align 4 align 4
draw_3d: draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
mov eax,house_3ds.end-house_3ds
cmp eax,HOUSE_FILE_SIZE
je @f
notify_window_run txt_error_file_size
ret
@@:
call [glPushMatrix] call [glPushMatrix]
;масштаб и повороты ;масштаб и повороты
stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0
@@ -152,17 +166,17 @@ call [glPushMatrix]
;рисование через индексный массив ;рисование через индексный массив
mov eax,house_3ds ;начало внедренного файла 3ds mov eax,house_3ds ;начало внедренного файла 3ds
add eax,0xeb ;смещение по которому идут координаты вершин (получено с использованием программы info_3ds) add eax,VERTICES_OFFSET
stdcall [glVertexPointer], 3, GL_FLOAT, 0, eax ;задаем массив для вершин, 3 - число координат для одной вершины stdcall [glVertexPointer], 3, GL_FLOAT, 0, eax ;задаем массив для вершин, 3 - число координат для одной вершины
stdcall [glEnableClientState], GL_VERTEX_ARRAY ;включаем режим рисования вершин stdcall [glEnableClientState], GL_VERTEX_ARRAY ;включаем режим рисования вершин
stdcall [glDrawElements], GL_TRIANGLES, 0x1a6*3, GL_UNSIGNED_SHORT, Indices ;mode, count, type, *indices stdcall [glDrawElements], GL_TRIANGLES, FACES_COUNT*3, GL_UNSIGNED_SHORT, Indices ;mode, count, type, *indices
stdcall [glDisableClientState], GL_VERTEX_ARRAY ;отключаем режим рисования вершин stdcall [glDisableClientState], GL_VERTEX_ARRAY ;отключаем режим рисования вершин
call [glPopMatrix] call [glPopMatrix]
ret ret
align 4 align 4
scale dd 0.0065 ;начальный масштаб (в идеальном случае должен вычислятся, но для даного примера подобран в ручную на глаз) scale dd 0.07 ;начальный масштаб (в идеальном случае должен вычислятся, но для даного примера подобран в ручную на глаз)
delt_sc dd 0.0005 delt_sc dd 0.0005
angle_z dd 90.0 angle_z dd 90.0
angle_y dd 90.0 angle_y dd 90.0
@@ -172,8 +186,9 @@ delt_size dd 3.0
align 4 align 4
house_3ds: ;внедряем файл внутрь программы (в идеальном случае должен открыватся через окно диалога, но для облегчения примера вшит внутрь) house_3ds: ;внедряем файл внутрь программы (в идеальном случае должен открыватся через окно диалога, но для облегчения примера вшит внутрь)
file '../../../../../demos/view3ds/3ds_objects/House.3ds' file '../../../../../demos/view3ds/3ds_objects/House.3ds'
.end:
align 4 align 4
Indices rb 0x1a6*6 ;0x1a6 - число граней, на каждую грань по 3 точки, индекс точки 2 байта Indices rb FACES_COUNT*6 ;на каждую грань по 3 точки, индекс точки 2 байта
;-------------------------------------------------- ;--------------------------------------------------
align 4 align 4

View File

@@ -36,13 +36,13 @@ red_win:
align 16 align 16
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -141,7 +141,6 @@ stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим б
stdcall [glColor3f], 1.0, 1.0, 0.0 stdcall [glColor3f], 1.0, 1.0, 0.0
call [glPushMatrix] call [glPushMatrix]
stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0

View File

@@ -60,6 +60,7 @@ load_libraries l_libs_start,l_libs_end
stdcall [buf2d_convert_text_matrix], buf_1 stdcall [buf2d_convert_text_matrix], buf_1
load_image_file 'toolb_1.png', image_data_toolbar load_image_file 'toolb_1.png', image_data_toolbar
call SetLight
call draw_3d call draw_3d
align 4 align 4
@@ -69,13 +70,13 @@ red_win:
align 4 align 4
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -303,11 +304,7 @@ draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
call [glPushMatrix] call [glPushMatrix]
call SetLight
stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glScalef], 1.0, 1.0, 0.5
stdcall [glColor3f], 1.0, 1.0, 0.0 stdcall [glColor3f], 1.0, 1.0, 0.0
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0

View File

@@ -60,6 +60,7 @@ load_libraries l_libs_start,l_libs_end
stdcall [buf2d_convert_text_matrix], buf_1 stdcall [buf2d_convert_text_matrix], buf_1
load_image_file 'toolb_1.png', image_data_toolbar load_image_file 'toolb_1.png', image_data_toolbar
call SetLight
call draw_3d call draw_3d
align 4 align 4
@@ -69,13 +70,13 @@ red_win:
align 4 align 4
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -296,9 +297,6 @@ draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
call [glPushMatrix] call [glPushMatrix]
call SetLight
stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glColor3f], 1.0, 1.0, 0.0 stdcall [glColor3f], 1.0, 1.0, 0.0

View File

@@ -88,13 +88,13 @@ red_win:
align 4 align 4
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -295,7 +295,6 @@ draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
call [glPushMatrix] call [glPushMatrix]
stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0

View File

@@ -88,13 +88,13 @@ red_win:
align 4 align 4
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -297,9 +297,8 @@ draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
call [glPushMatrix] call [glPushMatrix]
stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glScalef], 1.0, 1.0, 0.1 ;прижимаем сферу, что-бы сразу не вылазила при увеличении stdcall [glScalef], 1.0, 1.0, 0.2 ;прижимаем сферу, что-бы сразу не вылазила при увеличении
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0
stdcall [glRotatef], [angle_x],1.0,0.0,0.0 stdcall [glRotatef], [angle_x],1.0,0.0,0.0

View File

@@ -89,13 +89,13 @@ red_win:
align 4 align 4
still: still:
mcall SF_WAIT_EVENT mcall SF_WAIT_EVENT
cmp al,1 cmp al,EV_REDRAW
jz red_win jz red_win
cmp al,2 cmp al,EV_KEY
jz key jz key
cmp al,3 cmp al,EV_BUTTON
jz button jz button
jmp still jmp still
align 4 align 4
draw_window: draw_window:
@@ -268,8 +268,9 @@ draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
call [glPushMatrix] call [glPushMatrix]
stdcall [glTranslatef], 0.0,0.0,-1.0 ;двигаем сферу на себя, что-бы отсечь переднюю часть
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glScalef], 1.0, 1.0, 0.1 ;прижимаем сферу, что-бы сразу не вылазила при увеличении stdcall [glScalef], 1.0, 1.0, 0.2 ;прижимаем сферу, что-бы сразу не вылазила при увеличении
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0
stdcall [glRotatef], [angle_x],1.0,0.0,0.0 stdcall [glRotatef], [angle_x],1.0,0.0,0.0

View File

@@ -185,7 +185,7 @@ align 4
cmp ecx,GL_SPOT_EXPONENT cmp ecx,GL_SPOT_EXPONENT
jne @f jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+GLLight.spot_exponent],ecx ;l.spot_exponent=p[3] mov [edx+GLLight.spot_exponent],ecx ;l.spot_exponent=p[3]
jmp .end_f jmp .end_f
align 4 align 4
@@: @@:
@@ -193,7 +193,7 @@ align 4
jne .end_spot_c jne .end_spot_c
fld dword[ebp+12] ;float a=v.v[0] fld dword[ebp+12] ;float a=v.v[0]
; assert(a == 180 || (a>=0 && a<=90)); ; assert(a == 180 || (a>=0 && a<=90));
fst dword[edi+GLLight.spot_cutoff] ;l.spot_cutoff=a fst dword[edx+GLLight.spot_cutoff] ;l.spot_cutoff=a
fcom dword[an180f] ;if (a != 180) fcom dword[an180f] ;if (a != 180)
fstsw ax fstsw ax
sahf sahf
@@ -202,7 +202,7 @@ align 4
fmulp fmulp
fdiv dword[an180f] fdiv dword[an180f]
fcos fcos
fstp dword[edi+GLLight.cos_spot_cutoff] ;l.cos_spot_cutoff=cos(a * M_PI / 180.0) fstp dword[edx+GLLight.cos_spot_cutoff] ;l.cos_spot_cutoff=cos(a * M_PI / 180.0)
jmp .end_f jmp .end_f
@@: @@:
ffree st0 ffree st0
@@ -213,21 +213,21 @@ align 4
cmp ecx,GL_CONSTANT_ATTENUATION cmp ecx,GL_CONSTANT_ATTENUATION
jne @f jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+GLLight.attenuation],ecx ;l->attenuation[0]=p[3] mov [edx+GLLight.attenuation],ecx ;l->attenuation[0]=p[3]
jmp .end_f jmp .end_f
align 4 align 4
@@: @@:
cmp ecx,GL_LINEAR_ATTENUATION cmp ecx,GL_LINEAR_ATTENUATION
jne @f jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+GLLight.attenuation+4],ecx ;l->attenuation[1]=p[3] mov [edx+GLLight.attenuation+4],ecx ;l->attenuation[1]=p[3]
jmp .end_f jmp .end_f
align 4 align 4
@@: @@:
cmp ecx,GL_QUADRATIC_ATTENUATION cmp ecx,GL_QUADRATIC_ATTENUATION
jne @f jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+GLLight.attenuation+8],ecx ;l->attenuation[2]=p[3] mov [edx+GLLight.attenuation+8],ecx ;l->attenuation[2]=p[3]
jmp .end_f jmp .end_f
align 4 align 4
@@: ;default: @@: ;default:
@@ -363,15 +363,14 @@ fl_1e_3 dd 1.0e-3
align 16 align 16
proc gl_shade_vertex, context:dword, v:dword proc gl_shade_vertex, context:dword, v:dword
locals locals
R dd ? ;float ebp-96 R dd ? ;float ebp-92
G dd ? ;float ebp-92 G dd ? ;float ebp-88
B dd ? ;float ebp-88 B dd ? ;float ebp-84
A dd ? ;float ebp-84 A dd ? ;float ebp-80
s V3 ;ebp-80 s V3 ;ebp-76
d V3 ;ebp-68 d V3 ;ebp-64
tmp dd ? ;float ebp-56 tmp dd ? ;float ebp-52
att dd ? ;float ebp-52 att dd ? ;float ebp-48
dot_spot dd ? ;float ebp-48
lR dd ? ;float ebp-44 lR dd ? ;float ebp-44
lB dd ? ;float ebp-40 lB dd ? ;float ebp-40
lG dd ? ;float ebp-36 lG dd ? ;float ebp-36
@@ -563,7 +562,6 @@ align 4
fmul dword[d+offs_Z] fmul dword[d+offs_Z]
faddp faddp
fchs fchs
fst dword[dot_spot]
cmp dword[twoside],0 ;if (twoside && dot_spot < 0) cmp dword[twoside],0 ;if (twoside && dot_spot < 0)
je @f je @f
ftst ;if (dot_spot<0) ftst ;if (dot_spot<0)

View File

@@ -197,21 +197,24 @@ push edi esi
add ebx,4 add ebx,4
inc esi inc esi
cmp byte[esi],'f' cmp byte[esi],'f' ;float
jne @f jne @f
fld dword[ebx] fld dword[ebx]
fstp qword[Data_Double] fstp qword[Data_Double]
call DoubleFloat_to_String call DoubleFloat_to_String
stdcall str_cat, edi,Data_String stdcall str_cat, edi,Data_String
@@: @@:
cmp byte[esi],'d' cmp byte[esi],'C' ;const
jne @f je @f
cmp byte[esi],'d' ;integer
je @f
jmp .no_param
@@:
stdcall str_len,edi stdcall str_len,edi
add edi,eax add edi,eax
sub ecx,eax sub ecx,eax
mov eax,dword[ebx] mov eax,dword[ebx]
stdcall convert_int_to_str,ecx stdcall convert_int_to_str,ecx
@@:
.no_param: .no_param:
inc esi inc esi
cmp byte[esi],0 cmp byte[esi],0

View File

@@ -134,7 +134,7 @@ endl
cmp dword[edx+GLContext.lighting_enabled],0 ;if(context.lighting_enabled) cmp dword[edx+GLContext.lighting_enabled],0 ;if(context.lighting_enabled)
jne .if_0 jne .if_0
cmp dword[eax+GLContext.texture_2d_enabled],0 cmp dword[edx+GLContext.texture_2d_enabled],0
jne .if_0 jne .if_0
jmp @f jmp @f
align 4 align 4

View File

@@ -17,7 +17,7 @@ proc ZB_plot uses eax ebx ecx edx edi, zb:dword, p:dword
mov edi,[ebx+ZBufferPoint.z] mov edi,[ebx+ZBufferPoint.z]
shr edi,ZB_POINT_Z_FRAC_BITS shr edi,ZB_POINT_Z_FRAC_BITS
cmp di,word[ecx] cmp di,word[ecx]
jl .end_f jb .end_f
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
mov eax,[ebx+ZBufferPoint.r] mov eax,[ebx+ZBufferPoint.r]
mov byte[edx],ah mov byte[edx],ah

View File

@@ -101,7 +101,7 @@ local .end_0
mov [zz],eax mov [zz],eax
mov ebx,[pz] mov ebx,[pz]
cmp ax,word[ebx] cmp ax,word[ebx]
jl .end_0 jb .end_0
RGBPIXEL RGBPIXEL
mov eax,dword[zz] mov eax,dword[zz]
mov ebx,[pz] mov ebx,[pz]

View File

@@ -102,7 +102,7 @@ local .end_0
mov [zz],eax mov [zz],eax
mov ebx,[pz] mov ebx,[pz]
cmp ax,word[ebx] cmp ax,word[ebx]
jl .end_0 jb .end_0
RGBPIXEL RGBPIXEL
mov eax,dword[zz] mov eax,dword[zz]
mov ebx,[pz] mov ebx,[pz]

View File

@@ -58,7 +58,7 @@ end if
mov eax,[z] mov eax,[z]
shr eax,ZB_POINT_Z_FRAC_BITS shr eax,ZB_POINT_Z_FRAC_BITS
cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
jl .end_0 jb .end_0
;edi = pp ;edi = pp
mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
@@ -103,7 +103,7 @@ local .end_0
mov eax,[z] mov eax,[z]
shr eax,ZB_POINT_Z_FRAC_BITS shr eax,ZB_POINT_Z_FRAC_BITS
cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
jl .end_0 jb .end_0
;edi = pp ;edi = pp
mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
@@ -171,7 +171,7 @@ local .end_0
mov eax,[z] mov eax,[z]
shr eax,ZB_POINT_Z_FRAC_BITS shr eax,ZB_POINT_Z_FRAC_BITS
cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
jl .end_0 jb .end_0
;edi = pp ;edi = pp
mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
@@ -251,7 +251,7 @@ local .end_0
mov eax,[z] mov eax,[z]
shr eax,ZB_POINT_Z_FRAC_BITS shr eax,ZB_POINT_Z_FRAC_BITS
cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
jl .end_0 jb .end_0
;edi = pp ;edi = pp
mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24

View File

@@ -16,9 +16,9 @@ include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US.
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load @use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
if lang eq ru_RU if lang eq ru_RU
caption db '<27><><EFBFBD><EFBFBD><E1ACAE> <20><><EFBFBD><EFBFBD><E1A5AB> 11.11.20',0 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> caption db '<27><><EFBFBD><EFBFBD><E1ACAE> <20><><EFBFBD><EFBFBD><E1A5AB> 14.04.25',0 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
else ; Default to en_US else ; Default to en_US
caption db 'Voxel viewer 11.11.20',0 caption db 'Voxel viewer 14.04.25',0
end if end if
3d_wnd_l equ 5 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> tinygl <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABA5> 3d_wnd_l equ 5 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> tinygl <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABA5>
@@ -750,12 +750,8 @@ draw_3d:
je @f je @f
call SetLight call SetLight
@@: @@:
stdcall [glTranslatef], 0.0,0.0,0.5 ;<3B><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> z <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A5A4><EFBFBD><EFBFBD> <20><> 0.0 <20><> 1.0, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0A6><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><E1A5AA><EFBFBD><EFBFBD><EFBFBD>
;<3B><><EFBFBD><EFBFBD><E1A5AB><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> -0.5 <20><> 0.5, <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> +0.5
;<3B><> <20><><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBABA5><EFBFBD> <20><> <20><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD>
;<3B> <20><><EFBFBD>ᨨ opengl <20><><EFBFBD> Win <20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> -1.0 <20><> 1.0 <20><><EFBFBD><20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD>
stdcall [glScalef], [scale], [scale], [scale] ;㢥<><E3A2A5><EFBFBD><E7A8A2><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD>-<2D><> <20><> <20><><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> stdcall [glScalef], [scale], [scale], [scale] ;㢥<><E3A2A5><EFBFBD><E7A8A2><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD>-<2D><> <20><> <20><><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stdcall [glScalef], 1.0, 1.0, 0.25 ;<3B><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EAA5AA> <20><> <20><EFBFBD><EBABA0><EFBFBD><EFBFBD> <20><> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD> stdcall [glScalef], 1.0, 1.0, 0.5 ;<3B><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EAA5AA> <20><> <20><EFBFBD><EBABA0><EFBFBD><EFBFBD> <20><> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD>
stdcall [glRotatef], [angle_x],1.0,0.0,0.0 stdcall [glRotatef], [angle_x],1.0,0.0,0.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0