From 4cce5703332eba2a5b7e4ac06625e86d13c35138 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 29 Jan 2015 11:59:15 +0000 Subject: [PATCH] new voxel utilite 'vox_tgl' git-svn-id: svn://kolibrios.org@5388 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/media/voxel_editor/trunk/str.inc | 177 ++ .../media/voxel_editor/utilites/build_ru.bat | 7 +- .../media/voxel_editor/utilites/toolbar_t.png | Bin 0 -> 2645 bytes .../media/voxel_editor/utilites/vox_3d.inc | 1546 +++++++++++++++++ .../voxel_editor/utilites/vox_creator.asm | 164 +- .../media/voxel_editor/utilites/vox_mover.asm | 193 +- .../media/voxel_editor/utilites/vox_tgl.asm | 1030 +++++++++++ 7 files changed, 2784 insertions(+), 333 deletions(-) create mode 100644 programs/media/voxel_editor/trunk/str.inc create mode 100644 programs/media/voxel_editor/utilites/toolbar_t.png create mode 100644 programs/media/voxel_editor/utilites/vox_3d.inc create mode 100644 programs/media/voxel_editor/utilites/vox_tgl.asm diff --git a/programs/media/voxel_editor/trunk/str.inc b/programs/media/voxel_editor/trunk/str.inc new file mode 100644 index 0000000000..affbfffec1 --- /dev/null +++ b/programs/media/voxel_editor/trunk/str.inc @@ -0,0 +1,177 @@ +; +; Файл для работы со строковыми функциями +; + +; str_len (str1) +; Длина строки (возвращается в eax) + +; str_cat (str1, str2) +; Добавление к строке st1 строки str2 + +; str_n_cat (str1, str2, n_len) +; Добавление к строке st1 строки str2. Если строка str2 длиннее чем n_len, то добавляются первые n_len символов. + +; conv_str_to_int (buf) +; Преобразование строки buf в число (возвращается в eax) + +; convert_int_to_str (len) +; Преобразование числа (eax) в строку (edi). len - длинна строки edi, которую можно использовать для преобразования. + + +;output: +; eax = strlen +align 4 +proc str_len, str1:dword + mov eax,[str1] + @@: + cmp byte[eax],0 + je @f + inc eax + jmp @b + @@: + sub eax,[str1] + ret +endp + +align 4 +proc str_cat uses eax ecx edi esi, str1:dword, str2:dword + mov esi,[str2] + stdcall str_len,esi + mov ecx,eax + inc ecx + mov edi,[str1] + stdcall str_len,edi + add edi,eax + cld + repne movsb + ret +endp + +align 4 +proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n_len:dword + mov esi,[str2] + mov ecx,[n_len] + mov edi,[str1] + stdcall str_len,edi + add edi,eax + cld + repne movsb + mov byte[edi],0 + ret +endp + +;input: +; buf - указатель на строку, число должно быть в 10 или 16 ричном виде +;output: +; eax - число +align 4 +proc conv_str_to_int uses ebx ecx esi, buf:dword + xor eax,eax + xor ebx,ebx + mov esi,[buf] + ;определение отрицательных чисел + xor ecx,ecx + inc ecx + cmp byte[esi],'-' + jne @f + dec ecx + inc esi + @@: + + cmp word[esi],'0x' + je .load_digit_16 + + .load_digit_10: ;считывание 10-тичных цифр + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'9' + jg @f + sub bl,'0' + imul eax,10 + add eax,ebx + inc esi + jmp .load_digit_10 + jmp @f + + .load_digit_16: ;считывание 16-ричных цифр + add esi,2 + .cycle_16: + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'f' + jg @f + cmp bl,'9' + jle .us1 + cmp bl,'A' + jl @f ;отсеиваем символы >'9' и <'A' + .us1: ;составное условие + cmp bl,'F' + jle .us2 + cmp bl,'a' + jl @f ;отсеиваем символы >'F' и <'a' + sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки + .us2: ;составное условие + sub bl,'0' + cmp bl,9 + jle .cor1 + sub bl,7 ;convert 'A' to '10' + .cor1: + shl eax,4 + add eax,ebx + inc esi + jmp .cycle_16 + @@: + or ecx,ecx ;если число отрицательное + jnz @f + neg eax + inc eax + @@: + ret +endp + +;input: +; eax - число +; edi - буфер для строки +; len - длинна буфера +;output: +align 4 +proc convert_int_to_str, len:dword +pushad + mov esi,[len] + add esi,edi + dec esi + bt eax,31 + jae @f + ;если число отрицательное + neg eax + ;inc eax ;??? + mov byte[edi],'-' + inc edi + @@: + call .str +popad + ret +endp + +align 4 +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + ;dec edi ;смещение необходимое для записи с конца строки + call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + cmp edi,esi + jge @f + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор + @@: + ret ;пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться diff --git a/programs/media/voxel_editor/utilites/build_ru.bat b/programs/media/voxel_editor/utilites/build_ru.bat index 3ba5ae0c6a..01289404e0 100644 --- a/programs/media/voxel_editor/utilites/build_ru.bat +++ b/programs/media/voxel_editor/utilites/build_ru.bat @@ -1,10 +1,13 @@ if not exist bin mkdir bin if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png if not exist bin\toolbar_m.png @copy toolbar_m.png bin\toolbar_m.png -if not exist bin\buf2d.obj @fasm.exe -m 16384 ..\..\..\develop\libraries\buf2d\trunk\buf2d.asm bin\buf2d.obj -@kpack bin\buf2d.obj +if not exist bin\toolbar_t.png @copy toolbar_t.png bin\toolbar_t.png +if not exist bin\buf2d.obj @fasm.exe -m 16384 ..\..\..\develop\libraries\TinyGL\asm_fork\tinygl.asm bin\tinygl.obj +@kpack bin\tinygl.obj @fasm.exe -m 16384 vox_creator.asm bin\vox_creator.kex @kpack bin\vox_creator.kex @fasm.exe -m 16384 vox_mover.asm bin\vox_mover.kex @kpack bin\vox_mover.kex +@fasm.exe -m 16384 vox_tgl.asm bin\vox_tgl.kex +@kpack bin\vox_tgl.kex pause \ No newline at end of file diff --git a/programs/media/voxel_editor/utilites/toolbar_t.png b/programs/media/voxel_editor/utilites/toolbar_t.png new file mode 100644 index 0000000000000000000000000000000000000000..2f70f66e8373bedcc22cc601c77605f34f6313da GIT binary patch literal 2645 zcmV-b3aa&qP)N2bPDNB8 zb~7$DE-^7j^FlWO0144aL_t(oN9CDoP*dp{$Mc~d`f1zgZaeMRY3+7xXYGL8D!T5j z*jmxu9i7(2b!TnGt**GaHh!g=5K|9hY3y=F4d8Xq9T!^3K|TIt}?>2%;BM1wbQ zKY8+Gd3pJn-2?S9nT*V!0CWv*lgYHO_85)E+1c6g@p0&3baYfMmlF&QK*QqV;?t*3 z;S-+u`FVrEFflO!^=7jf`f6!u!59kwZtMX7OmlN{larI=93c@afEWY3K z01vp`0x&o6xSk~<4))^K7;JWyWgS#16^zV&=aFl`0DBZ)>7k(^U>t34tRCE8!vXSk zclnNPJ|~Ju;C>a86U8pHIzWzq;7~TvbTxqs??*$E(FjHPEV8N#qA9z0|MR#5A@MY@ zKIq~s8U&!HGu-9L?82Nld*I+_%mbe$ymvB*Cdg%)XLyAB`B>U=&lz4;OkR3qcJkGX z_{*t`3rW#omND=-*Ub|gtnZbvG~~err01lKtbkjY(eoo2n7gj%I;f^Fwt^d7nipA^ z{WUiuB8PqDWx=&-Fa@w?K5IGZW~uy%GAB zOJ!Wfik6Oae~JQ~A0zFDpDFe)Htw0L-Z53=9TBqW!`-i-KpOMXRM+|9{OfmQF-YGT zr27PN=g5lk&r41F7V37+l=+SGUvK~BhabKBDmGCxcI<`j#>*x7vBq~j=}3R-G@ zZ$Z4vP~ksW==qrQS`Xu8`pI8=ZQg(biBVyKoS2^S&)QiuObW*L8l%5odG!Yc;Xlp} z+mLehmmj_JE6X~tu6@a(e-d>*_~Ji4fJr!ZX!l?CZvW#Op1=3p^!lqCe(|$ce)6N2 ze){rDZf!ow9pz$s+cPL2N$V;&CljgFP6P(9;U|tC+N9ymAqcYKK+psRu;BprtfZSW zwY;(d-$ImvCNO{v2lBsY?97^2SY9@m&6I*BFn|pQa!-reGe%~gJQ+0_DFsbn02>Zu zh19mC4v(A7x~VBjK@%9jh66V~sZu2C2epPrCKIKg2@GJvf%Lyu$m0j>PEDV#gj_{ikv|z&l z=3#zaWLNxO3q&Gm_&zqMyu1bkMW_TI^>|qm^8wg!Ao^gQD7q*4Sg}x851$}DUkJjA z0A!!4l`#6ih6C!x?u&ca(Fbz`g1WR5LJ*Hv1;UB|@Is{xvG>7)1MsIXQ+RrNRG8fZ zm4qUW#ajSJ_c8VMcHeCkK`*82Idti&;021#P8{k+0Vzo+Nu3f{rBbqW?H%gv7#daI z78py99EXOcYn6#@C@Ckv3RvyK))XuaK*b4wCMn$=fD^#c)7=8Fj_FeRDnJjQ2Y{@{ zusZ!jR^SFJM@mPT)lXXhXml8BivU0X2M>b2(*rgJTSvgctt~J-xo0SVuCj2Wv1V*64f+PRMsrf5 zIX*NLF=rIFOtnLyuteaCgW^OKXA`nw#pFp2_zDwQB?YNAl9{TB$x zv9VOcOuZ!gl*3ulDh2AYOGab)*jUQMMCSZ_y_|QhN1E#pfQA-c_&|H+^fYgJ`c_|C zM*YpRHfv{l^9|pZHw(fIhBAYpM8f?_*CllUKyzVq5M*UE3iGZWaIrP8W`RIZSy{=UQZVVv$wu<0n9b6w#%3V!;FFChbQgX-lViAxz8d6@5wg0TYZGqGPH3qYB-L%`7}U8F>@DO?WPPA*Y#r!7# zbi=GGCD%vPez@z1U>WguIOy+wTFDXYNAGmusMgyRV7EJ{cPo~OyL)MUD-CYd!{s~r z(K`>v)DM^KVe6E7I)%z`jw~?0byvP(SC0H0p^`4^?X}uFSfO>$EWXR;t9F)kZ@Z=R z$-C_Z;wpWFJ=?j;okh3Pnlw|At~$%jCuqJ<(zzo~;gu!xOsMu@33q}Lt9_uDr|{;h z-{eSwvZQ-)pjutbSHF?dvL#cxg`^J-N0(otIoF+e(aL=9L6&kC8nN+%iUE!Nv=gn34CshZQwu$dO zHugN4Emqbg*X$`!ZOssQF-p9u)Wzs5G0PdOf;X?^zRfK4x*_r@RQq#P{%o-qh^N|C z(B_{Z@@AHJXVu4Gk!g_P)x1EMa!v#DQqE?`?S|MlOX3H*(cqI-<9#{zcN{U3$P=Ab zm|d)_)avuamm>4`ewp!`bD5i>c)Rn(7h4Cc{@wg jge @f + imul ebx,vox_ogl_size + add ebx,edi + +align 4 + .cycle_3: + mov dx,word[edi+vox_ogl_zoom] + mov esi,edi +align 4 + .cycle_4: + add esi,vox_ogl_size + cmp esi,ebx + jg @f + cmp dx,word[esi+vox_ogl_zoom] + jne .cycle_4 + + mov eax,dword[edi+vox_ogl_x0] + cmp eax,dword[esi+vox_ogl_x0] + jne @f + mov eax,dword[edi+vox_ogl_y0] + inc eax ; y+ + cmp eax,dword[esi+vox_ogl_y0] + jl @f + jne .cycle_4 + mov eax,dword[edi+vox_ogl_z0] + inc eax ; z+ + cmp eax,dword[esi+vox_ogl_z0] + jne .cycle_4 + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє + bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z1 ; + bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z0 ; + @@: + add edi,vox_ogl_size + loop .cycle_3 + +; *** + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + +align 4 + .cycle_7: + mov dx,word[edi+vox_ogl_zoom] + mov esi,edi +align 4 + .cycle_8: + add esi,vox_ogl_size + cmp esi,ebx + jg @f + cmp dx,word[esi+vox_ogl_zoom] + jne .cycle_8 + + mov eax,dword[edi+vox_ogl_x0] + cmp eax,dword[esi+vox_ogl_x0] + jne @f + mov eax,dword[edi+vox_ogl_y0] + inc eax ; y+ + cmp eax,dword[esi+vox_ogl_y0] + jl @f + jne .cycle_8 + mov eax,dword[edi+vox_ogl_z0] + dec eax ; z- + cmp eax,dword[esi+vox_ogl_z0] + jne .cycle_8 + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє + bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z0 ; + bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z1 ; + @@: + add edi,vox_ogl_size + loop .cycle_7 +pop esi edx ebx + + ; (2) + ; ёюЁЄшЁютър тюъёхыхщ яю ъююЁфшэрЄрь x,z,y + ; + mov edi,[p_mem] + mov ecx,dword[edi] + add edi,4 + sub edi,vox_ogl_size + stdcall pole_fl_sort_zxy, edi, ecx + + ;юЄёхўхэшх ёюёхфэшї уЁрэхщ фы  єёъюЁхэш  юЄЁшёютъш + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + +align 4 + .cycle_1: + mov ax,word[edi+vox_ogl_zoom] + cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom] + jne @f + mov eax,dword[edi+vox_ogl_z0] + cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0] + jne @f + mov eax,dword[edi+vox_ogl_x0] + cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0] + jne @f + mov eax,dword[edi+vox_ogl_y0] + inc eax ;єтхышўштрхь т√ёюЄє, фы  сєфє∙хую ёЁртэхэш  + cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0] + jne @f + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє, Єю ёюёхфэшх т√ёюЄє ш эшч юЄёхърхь + btr dword[edi+vox_ogl_planes],vox_ogl_gran_y1 ;тхЁї юЄёхърхь + btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_y0 ;эшч юЄёхърхь + @@: + add edi,vox_ogl_size + loop .cycle_1 + +push ebx edx esi + ;фшруюэры№э√х ёюёхфэшх тюъёхыш + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + + mov ebx,ecx + ;inc ebx ;??? cmp esi,ebx -> jge @f + imul ebx,vox_ogl_size + add ebx,edi + +align 4 + .cycle_11: + mov dx,word[edi+vox_ogl_zoom] + mov esi,edi +align 4 + .cycle_12: + add esi,vox_ogl_size + cmp esi,ebx + jg @f + cmp dx,word[esi+vox_ogl_zoom] + jne .cycle_12 + + mov eax,dword[edi+vox_ogl_z0] + cmp eax,dword[esi+vox_ogl_z0] + jne @f + mov eax,dword[edi+vox_ogl_x0] + inc eax ; x+ + cmp eax,dword[esi+vox_ogl_x0] + jl @f + jne .cycle_12 + mov eax,dword[edi+vox_ogl_y0] + inc eax ; y+ + cmp eax,dword[esi+vox_ogl_y0] + jne .cycle_12 + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє + bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y1 ; + bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y0 ; + @@: + add edi,vox_ogl_size + loop .cycle_11 + +; *** + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + +align 4 + .cycle_15: + mov dx,word[edi+vox_ogl_zoom] + mov esi,edi +align 4 + .cycle_16: + add esi,vox_ogl_size + cmp esi,ebx + jg @f + cmp dx,word[esi+vox_ogl_zoom] + jne .cycle_16 + + mov eax,dword[edi+vox_ogl_z0] + cmp eax,dword[esi+vox_ogl_z0] + jne @f + mov eax,dword[edi+vox_ogl_x0] + inc eax ; x+ + cmp eax,dword[esi+vox_ogl_x0] + jl @f + jne .cycle_16 + mov eax,dword[edi+vox_ogl_y0] + dec eax ; y- + cmp eax,dword[esi+vox_ogl_y0] + jne .cycle_16 + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє + bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y0 ; + bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y1 ; + @@: + add edi,vox_ogl_size + loop .cycle_15 + +pop esi edx ebx + + ; (3) + ; ёюЁЄшЁютър тюъёхыхщ яю ъююЁфшэрЄрь y,z,x + ; + mov edi,[p_mem] + mov ecx,dword[edi] + add edi,4 + sub edi,vox_ogl_size + stdcall pole_fl_sort_yzx, edi, ecx + + ;юЄёхўхэшх ёюёхфэшї уЁрэхщ фы  єёъюЁхэш  юЄЁшёютъш + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + +align 4 + .cycle_2: + mov ax,word[edi+vox_ogl_zoom] + cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom] + jne @f + mov eax,dword[edi+vox_ogl_y0] + cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0] + jne @f + mov eax,dword[edi+vox_ogl_z0] + cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0] + jne @f + mov eax,dword[edi+vox_ogl_x0] + inc eax ;єтхышўштрхь т√ёюЄє, фы  сєфє∙хую ёЁртэхэш  + cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0] + jne @f + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє, Єю ёюёхфэшх т√ёюЄє ш эшч юЄёхърхь + btr dword[edi+vox_ogl_planes],vox_ogl_gran_x1 ;тхЁї юЄёхърхь + btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_x0 ;эшч юЄёхърхь + @@: + add edi,vox_ogl_size + loop .cycle_2 + +push ebx edx esi + ;фшруюэры№э√х ёюёхфэшх тюъёхыш + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + + mov ebx,ecx + ;inc ebx ;??? cmp esi,ebx -> jge @f + imul ebx,vox_ogl_size + add ebx,edi + +align 4 + .cycle_5: + mov dx,word[edi+vox_ogl_zoom] + mov esi,edi +align 4 + .cycle_6: + add esi,vox_ogl_size + cmp esi,ebx + jg @f + cmp dx,word[esi+vox_ogl_zoom] + jne .cycle_6 + + mov eax,dword[edi+vox_ogl_y0] + cmp eax,dword[esi+vox_ogl_y0] + jne @f + mov eax,dword[edi+vox_ogl_z0] + inc eax ; z+ + cmp eax,dword[esi+vox_ogl_z0] + jl @f + jne .cycle_6 + mov eax,dword[edi+vox_ogl_x0] + inc eax ; x+ + cmp eax,dword[esi+vox_ogl_x0] + jne .cycle_6 + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє + bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1z1 ; + bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0z0 ; + @@: + add edi,vox_ogl_size + loop .cycle_5 + +; *** + mov edi,[p_mem] + mov ecx,dword[edi] + dec ecx + add edi,4 + +align 4 + .cycle_9: + mov dx,word[edi+vox_ogl_zoom] + mov esi,edi +align 4 + .cycle_10: + add esi,vox_ogl_size + cmp esi,ebx + jg @f + cmp dx,word[esi+vox_ogl_zoom] + jne .cycle_10 + + mov eax,dword[edi+vox_ogl_y0] + cmp eax,dword[esi+vox_ogl_y0] + jne @f + mov eax,dword[edi+vox_ogl_z0] + inc eax ; z+ + cmp eax,dword[esi+vox_ogl_z0] + jl @f + jne .cycle_10 + mov eax,dword[edi+vox_ogl_x0] + dec eax ; x- + cmp eax,dword[esi+vox_ogl_x0] + jne .cycle_10 + ;хёыш яю т√ёюЄх тюъёхыш ЁрчышўрхЄё  эр 1 ъююЁфшэрЄє + bts dword[edi+vox_ogl_planes],vox_ogl_gran_x0z1 ; + bts dword[esi+vox_ogl_planes],vox_ogl_gran_x1z0 ; + @@: + add edi,vox_ogl_size + loop .cycle_9 + +pop esi edx ebx + + ;яЁхюсЁрчютрэшх ъююЁфшэрЄ тю float + stdcall vox_obj_3d_recalc, [p_mem] +popad + .end_f: + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - єЁютхэ№ Єхъє°хую єчыра +; edi - єърчрЄхы№ эр фрээ√х тюъёхы№эюую юс·хъЄр +align 4 +proc create_sub_vox_obj_3d, v_obj:dword, p_mem:dword, k_scale:dword + cmp byte[edi+3],0 ;ёьюЄЁшь хёЄ№ ыш яюффхЁхт№  + je .sub_trees + + ;фюсрты хь єчхы, ъюЄюЁ√щ ёюфхЁцшЄ фюўхЁэшх єчы√, яЁш ¤Єюь фюўхЁэшх ьхыъшх ш эх яюярфр■Є эр т√тюф + cmp ecx,0 + jne @f + push ecx + mov eax,[p_mem] + inc dword[eax] ;єтхышўштрхь ёўхЄўшъ тюъёхыхщ эр 1 + mov eax,[eax] + imul eax,vox_ogl_size ;єьэюцрхь эр ЁрчьхЁ фрээ√ї ю тюъёхых + add eax,4-vox_ogl_size ;ўшёыю тюъёхыхщ 4 срщЄр + add eax,[p_mem] + mov [eax+vox_ogl_x0],ebx + mov [eax+vox_ogl_y0],edx + mov [eax+vox_ogl_z0],esi + sub ecx,[k_scale] + mov word[eax+vox_ogl_zoom],cx + mov dword[eax+vox_ogl_planes],def_del_planes + mov ecx,dword[edi] + and ecx,0xffffff + mov [eax+vox_ogl_color],ecx + pop ecx + @@: + + ;ЁхъєЁёштэ√щ яхЁхсюЁ яюффхЁхт№хт + push edx + ;тїюф тэєЄЁ№ єчыр + dec ecx + + mov eax,1 + cmp ecx,1 + jl @f + shl eax,cl + @@: + + add edx,eax ;ъюЁхъЄшЁютър т√ёюЄ√ яюф тюъёхы№ эшцэхую єЁютэ  + + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;ЄхёЄшЁєхь Єюы№ъю ah + jnc .c_next + push eax ebx edx esi + stdcall vox_corect_coords_pl, [v_obj],1 + stdcall create_sub_vox_obj_3d, [v_obj], [p_mem],[k_scale] + pop esi edx ebx eax + .c_next: + shr ah,1 + dec al + jnz .cycle + ;т√їюф шч єчыр + inc ecx + pop edx + jmp .end_f + .sub_trees: + cmp ecx,0 + jl .end_0 ;эх Ёшёєхь юўхэ№ ьрыхэ№ъшх тюъёхыш + + ;cmp ecx,1 + ;jl @f + ;ътрфЁрЄ сюы№°х Єхъє∙хую ьрё°Єрср + ;stdcall vox_draw_square_1g, [buf_i],[buf_z],eax + ;jmp .end_0 + ;@@: + ;ътрфЁрЄ Єхъє∙хую ьрё°Єрср + push ecx + mov eax,[p_mem] + inc dword[eax] ;єтхышўштрхь ёўхЄўшъ тюъёхыхщ эр 1 + mov eax,[eax] + imul eax,vox_ogl_size ;єьэюцрхь эр ЁрчьхЁ фрээ√ї ю тюъёхых + add eax,4-vox_ogl_size ;ўшёыю тюъёхыхщ 4 срщЄр + add eax,[p_mem] + mov [eax+vox_ogl_x0],ebx + mov [eax+vox_ogl_y0],edx + mov [eax+vox_ogl_z0],esi + cmp ecx,1 + jl @f + ;ътрфЁрЄ сюы№°х Єхъє∙хую ьрё°Єрср + shr dword[eax+vox_ogl_x0],cl + shr dword[eax+vox_ogl_y0],cl + shr dword[eax+vox_ogl_z0],cl + @@: + sub ecx,[k_scale] + mov word[eax+vox_ogl_zoom],cx + mov dword[eax+vox_ogl_planes],def_del_planes + mov ecx,dword[edi] + and ecx,0xffffff + mov [eax+vox_ogl_color],ecx + pop ecx + .end_0: + add edi,4 + .end_f: + ret +endp + +;description: +; т OpenGL ЄЁхсє■Єё  ъююЁфшэрЄ√ float +; яЁхюсЁрчютрэшх ъююЁфшэрЄ шч int тю float, +align 4 +proc vox_obj_3d_recalc uses eax ebx ecx, p_mem:dword + +;яюыєўрхь ъююЁфшэрЄ√ т яЁхфхырї юЄ 0 фю 1 т фЁюсэюь тшфх + mov eax,[p_mem] + mov ecx,dword[eax] + add eax,4 + + finit +align 4 + @@: + fild word[eax+vox_ogl_zoom] + fld1 ; ЁрчьхЁ ъєсшўхёъющ уЁрэш схч єўхЄр ьрё°Єрср + fscale ; st0=1*2^st1 шыш ЁрчьхЁ ъєсшўхёъющ уЁрэш ё єўхЄюь ьрё°Єрср + fxch + + ;coord x + fild dword[eax+vox_ogl_x0] + fscale + fchs + fst dword[eax+vox_ogl_x0] + fsub st0,st2 ;фюсрты хь ъю тЄюЁющ Єюўъх ЁрчьхЁ ьрё°ЄрсшЁютрээющ ъєсшўхёъющ уЁрэш + fstp dword[eax+vox_ogl_x1] + ;coord y + fild dword[eax+vox_ogl_y0] + fscale + fst dword[eax+vox_ogl_y0] + fadd st0,st2 + fstp dword[eax+vox_ogl_y1] + ;coord z + fild dword[eax+vox_ogl_z0] + fscale + fst dword[eax+vox_ogl_z0] + fadd st0,st2 + fstp dword[eax+vox_ogl_z1] + + ;goto next voxel + add eax,vox_ogl_size + ffree st0 + fincstp + ffree st0 + fincstp + loop @b + +;юЄэшьрхь юЄ ърцфющ ъююЁфшэрЄ√ яю 0.5 фы  ЎхэЄЁютъш юс·хъЄр яю ЎхэЄЁє ¤ъЁрэр + mov eax,[p_mem] + mov ecx,dword[eax] + add eax,4 + fld1 ;st0=1 + fchs ;st0=-1 + fld1 ;st0=1 st1=-1 + fscale ;st0=1*2^st1 шыш 1*2^-1=1/2=0.5 +align 4 + @@: + ;coord x + fld dword[eax+vox_ogl_x0] + fadd st0,st1 ;+0.5 + fstp dword[eax+vox_ogl_x0] + fld dword[eax+vox_ogl_x1] + fadd st0,st1 ;+0.5 + fstp dword[eax+vox_ogl_x1] + ;coord y + fld dword[eax+vox_ogl_y0] + fsub st0,st1 ;-0.5 + fstp dword[eax+vox_ogl_y0] + fld dword[eax+vox_ogl_y1] + fsub st0,st1 ;-0.5 + fstp dword[eax+vox_ogl_y1] + ;coord z + fld dword[eax+vox_ogl_z0] + fsub st0,st1 ;-0.5 + fstp dword[eax+vox_ogl_z0] + fld dword[eax+vox_ogl_z1] + fsub st0,st1 ;-0.5 + fstp dword[eax+vox_ogl_z1] + + ;goto next voxel + add eax,vox_ogl_size + loop @b + ffree st0 + fincstp + ffree st0 + fincstp + ret +endp + +;╤юЁЄшЁютър тхъЄюЁр a[1..n] ьхЄюфюь ╘ыющфр +align 4 +proc pole_fl_sort, a:dword, n:dword + pushad + mov ecx,dword[a] + ;╘юЁьшЁютрЄ№ шёїюфэюх ўрёЄшўэю єяюЁ фюўхээюх фхЁхтю + mov eax,dword[n] + shr eax,1 + @@: ;for(i=n/2; i>=2; i--) + stdcall pole_fl_surface, ecx,eax,[n] ;(a,i,n) + dec eax + cmp eax,2 + jge @b + ;┬√яюыэшЄ№ яЁюЎхфєЁє тёяы√Єш  ╘ыющфр фы  ърцфюую яюффхЁхтр + mov eax,dword[n] + @@: ;for(i=n; i>=2; i--){ + stdcall pole_fl_surface, ecx,1,eax ;(a,1,i) + ;╧юьхёЄшЄ№ эрщфхээ√щ ьръёшьры№э√щ ¤ыхьхэЄ т ъюэхЎ ёяшёър + stdcall swap_cell, ecx,1,eax ;ьхэ хь ьхёЄрьш a[1] <-> a[i] + dec eax + cmp eax,2 + jge @b + popad + ret +endp + +;╧ЁюЎхфєЁр тёяы√Єш  ╘ыющфр яю фхЁхтє a[1..k] +align 4 +proc pole_fl_surface, a:dword, i:dword, k:dword + pushad + ;edx -> ... + ;edi -> m + ;esi -> j + mov eax,dword[a] + mov ebx,dword[i] + mov ecx,dword[k] + + stdcall copy_cell, eax, -1,ebx ;copy=a[i]; + mov edi,ebx + shl edi,1 ;m=2*i уфх edi=m + .cycle_b: ;while (m<=k) { + cmp edi,ecx + jg .cycle_e + jne @f ;if (m==k) j=m; + mov esi,edi + jmp .else_e + @@: ;else if (pole_compare_cells_bm(a[m],a[m+1])) j=m; + mov edx,edi + inc edx + stdcall pole_compare_cells_bm, eax, edi,edx + cmp dl,0 + je @f + mov esi,edi + jmp .else_e + @@: ;else j=m+1; + mov esi,edi + inc esi + .else_e: + + ;if (pole_compare_cells_bm(a[j],copy)) { + stdcall pole_compare_cells_bm, eax, esi,-1 + cmp dl,0 + je .cycle_e ;} else break; //т√їюф шч Ўшъыр + + stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; + mov ebx,esi ;i=j; + mov edi,ebx + shl edi,1 ;m=2*i; + + jmp .cycle_b + .cycle_e: + + ;чэрўхэш  ьэюушї ЁхушёЄЁют єцх эх трцэ√ Є. ъ. ъюэхЎ ЇєэъЎшш + stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; + + popad + ret +endp + +;output: +; dl +align 4 +proc pole_compare_cells_bm uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword + + mov eax,[i0] ;eax -> cell[i0] + imul eax,vox_ogl_size + add eax,[p_mem] + + mov ebx,[i1] ;ebx -> cell[i1] + cmp ebx,0 + jl .copy + imul ebx,vox_ogl_size + add ebx,[p_mem] + jmp @f + .copy: + mov ebx,mem_copy_32 + @@: + + mov cx,word[ebx+vox_ogl_zoom] ;zoom + cmp word[eax+vox_ogl_zoom],cx + jle @f ;zoom0>zoom1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if zoom0x1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if x0y1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if y0z1 + mov dl,1 + jmp .fun_e + @@: + + .r_0: + xor dl,dl + .fun_e: + ret +endp + +if 0 ;яюър эх эєцэю, эю ЁрсюЄрыю яЁртшы№эю +;╤юЁЄшЁютър тхъЄюЁр a[1..n] ьхЄюфюь ╘ыющфр +align 4 +proc pole_fl_sort_xzy, a:dword, n:dword + pushad + mov ecx,dword[a] + ;╘юЁьшЁютрЄ№ шёїюфэюх ўрёЄшўэю єяюЁ фюўхээюх фхЁхтю + mov eax,dword[n] + shr eax,1 + @@: ;for(i=n/2; i>=2; i--) + stdcall pole_fl_surface_xzy, ecx,eax,[n] ;(a,i,n) + dec eax + cmp eax,2 + jge @b + ;┬√яюыэшЄ№ яЁюЎхфєЁє тёяы√Єш  ╘ыющфр фы  ърцфюую яюффхЁхтр + mov eax,dword[n] + @@: ;for(i=n; i>=2; i--){ + stdcall pole_fl_surface_xzy, ecx,1,eax ;(a,1,i) + ;╧юьхёЄшЄ№ эрщфхээ√щ ьръёшьры№э√щ ¤ыхьхэЄ т ъюэхЎ ёяшёър + stdcall swap_cell, ecx,1,eax ;ьхэ хь ьхёЄрьш a[1] <-> a[i] + dec eax + cmp eax,2 + jge @b + popad + ret +endp + +;╧ЁюЎхфєЁр тёяы√Єш  ╘ыющфр яю фхЁхтє a[1..k] +align 4 +proc pole_fl_surface_xzy, a:dword, i:dword, k:dword + pushad + ;edx -> ... + ;edi -> m + ;esi -> j + mov eax,dword[a] + mov ebx,dword[i] + mov ecx,dword[k] + + stdcall copy_cell, eax, -1,ebx ;copy=a[i]; + mov edi,ebx + shl edi,1 ;m=2*i уфх edi=m + .cycle_b: ;while (m<=k) { + cmp edi,ecx + jg .cycle_e + jne @f ;if (m==k) j=m; + mov esi,edi + jmp .else_e + @@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m; + mov edx,edi + inc edx + stdcall pole_compare_bm_xzy, eax, edi,edx + cmp dl,0 + je @f + mov esi,edi + jmp .else_e + @@: ;else j=m+1; + mov esi,edi + inc esi + .else_e: + + ;if (pole_compare_bm_xzy(a[j],copy)) { + stdcall pole_compare_bm_xzy, eax, esi,-1 + cmp dl,0 + je .cycle_e ;} else break; //т√їюф шч Ўшъыр + + stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; + mov ebx,esi ;i=j; + mov edi,ebx + shl edi,1 ;m=2*i; + + jmp .cycle_b + .cycle_e: + + ;чэрўхэш  ьэюушї ЁхушёЄЁют єцх эх трцэ√ Є. ъ. ъюэхЎ ЇєэъЎшш + stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; + + popad + ret +endp + +;output: +; dl +align 4 +proc pole_compare_bm_xzy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword + + mov eax,[i0] ;eax -> cell[i0] + imul eax,vox_ogl_size + add eax,[p_mem] + + mov ebx,[i1] ;ebx -> cell[i1] + cmp ebx,0 + jl .copy + imul ebx,vox_ogl_size + add ebx,[p_mem] + jmp @f + .copy: + mov ebx,mem_copy_32 + @@: + + mov cx,word[ebx+vox_ogl_zoom] ;zoom + cmp word[eax+vox_ogl_zoom],cx + jle @f ;zoom0>zoom1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if zoom0x1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if x0z1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if z0y1 + mov dl,1 + jmp .fun_e + @@: + + .r_0: + xor dl,dl + .fun_e: + ret +endp +end if + +;╤юЁЄшЁютър тхъЄюЁр a[1..n] ьхЄюфюь ╘ыющфр +align 4 +proc pole_fl_sort_zxy, a:dword, n:dword + pushad + mov ecx,dword[a] + ;╘юЁьшЁютрЄ№ шёїюфэюх ўрёЄшўэю єяюЁ фюўхээюх фхЁхтю + mov eax,dword[n] + shr eax,1 + @@: ;for(i=n/2; i>=2; i--) + stdcall pole_fl_surface_zxy, ecx,eax,[n] ;(a,i,n) + dec eax + cmp eax,2 + jge @b + ;┬√яюыэшЄ№ яЁюЎхфєЁє тёяы√Єш  ╘ыющфр фы  ърцфюую яюффхЁхтр + mov eax,dword[n] + @@: ;for(i=n; i>=2; i--){ + stdcall pole_fl_surface_zxy, ecx,1,eax ;(a,1,i) + ;╧юьхёЄшЄ№ эрщфхээ√щ ьръёшьры№э√щ ¤ыхьхэЄ т ъюэхЎ ёяшёър + stdcall swap_cell, ecx,1,eax ;ьхэ хь ьхёЄрьш a[1] <-> a[i] + dec eax + cmp eax,2 + jge @b + popad + ret +endp + +;╧ЁюЎхфєЁр тёяы√Єш  ╘ыющфр яю фхЁхтє a[1..k] +align 4 +proc pole_fl_surface_zxy, a:dword, i:dword, k:dword + pushad + ;edx -> ... + ;edi -> m + ;esi -> j + mov eax,dword[a] + mov ebx,dword[i] + mov ecx,dword[k] + + stdcall copy_cell, eax, -1,ebx ;copy=a[i]; + mov edi,ebx + shl edi,1 ;m=2*i уфх edi=m + .cycle_b: ;while (m<=k) { + cmp edi,ecx + jg .cycle_e + jne @f ;if (m==k) j=m; + mov esi,edi + jmp .else_e + @@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m; + mov edx,edi + inc edx + stdcall pole_compare_bm_zxy, eax, edi,edx + cmp dl,0 + je @f + mov esi,edi + jmp .else_e + @@: ;else j=m+1; + mov esi,edi + inc esi + .else_e: + + ;if (pole_compare_bm_xzy(a[j],copy)) { + stdcall pole_compare_bm_zxy, eax, esi,-1 + cmp dl,0 + je .cycle_e ;} else break; //т√їюф шч Ўшъыр + + stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; + mov ebx,esi ;i=j; + mov edi,ebx + shl edi,1 ;m=2*i; + + jmp .cycle_b + .cycle_e: + + ;чэрўхэш  ьэюушї ЁхушёЄЁют єцх эх трцэ√ Є. ъ. ъюэхЎ ЇєэъЎшш + stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; + + popad + ret +endp + +;output: +; dl +align 4 +proc pole_compare_bm_zxy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword + + mov eax,[i0] ;eax -> cell[i0] + imul eax,vox_ogl_size + add eax,[p_mem] + + mov ebx,[i1] ;ebx -> cell[i1] + cmp ebx,0 + jl .copy + imul ebx,vox_ogl_size + add ebx,[p_mem] + jmp @f + .copy: + mov ebx,mem_copy_32 + @@: + + mov cx,word[ebx+vox_ogl_zoom] ;zoom + cmp word[eax+vox_ogl_zoom],cx + jle @f ;zoom0>zoom1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if zoom0z1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if z0x1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if x0y1 + mov dl,1 + jmp .fun_e + @@: + + .r_0: + xor dl,dl + .fun_e: + ret +endp + +;╤юЁЄшЁютър тхъЄюЁр a[1..n] ьхЄюфюь ╘ыющфр +align 4 +proc pole_fl_sort_yzx, a:dword, n:dword + pushad + mov ecx,dword[a] + ;╘юЁьшЁютрЄ№ шёїюфэюх ўрёЄшўэю єяюЁ фюўхээюх фхЁхтю + mov eax,dword[n] + shr eax,1 + @@: ;for(i=n/2; i>=2; i--) + stdcall pole_fl_surface_yzx, ecx,eax,[n] ;(a,i,n) + dec eax + cmp eax,2 + jge @b + ;┬√яюыэшЄ№ яЁюЎхфєЁє тёяы√Єш  ╘ыющфр фы  ърцфюую яюффхЁхтр + mov eax,dword[n] + @@: ;for(i=n; i>=2; i--){ + stdcall pole_fl_surface_yzx, ecx,1,eax ;(a,1,i) + ;╧юьхёЄшЄ№ эрщфхээ√щ ьръёшьры№э√щ ¤ыхьхэЄ т ъюэхЎ ёяшёър + stdcall swap_cell, ecx,1,eax ;ьхэ хь ьхёЄрьш a[1] <-> a[i] + dec eax + cmp eax,2 + jge @b + popad + ret +endp + +;╧ЁюЎхфєЁр тёяы√Єш  ╘ыющфр яю фхЁхтє a[1..k] +align 4 +proc pole_fl_surface_yzx, a:dword, i:dword, k:dword + pushad + ;edx -> ... + ;edi -> m + ;esi -> j + mov eax,dword[a] + mov ebx,dword[i] + mov ecx,dword[k] + + stdcall copy_cell, eax, -1,ebx ;copy=a[i]; + mov edi,ebx + shl edi,1 ;m=2*i уфх edi=m + .cycle_b: ;while (m<=k) { + cmp edi,ecx + jg .cycle_e + jne @f ;if (m==k) j=m; + mov esi,edi + jmp .else_e + @@: ;else if (pole_compare_bm_yzx(a[m],a[m+1])) j=m; + mov edx,edi + inc edx + stdcall pole_compare_bm_yzx, eax, edi,edx + cmp dl,0 + je @f + mov esi,edi + jmp .else_e + @@: ;else j=m+1; + mov esi,edi + inc esi + .else_e: + + ;if (pole_compare_bm_yzx(a[j],copy)) { + stdcall pole_compare_bm_yzx, eax, esi,-1 + cmp dl,0 + je .cycle_e ;} else break; //т√їюф шч Ўшъыр + + stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; + mov ebx,esi ;i=j; + mov edi,ebx + shl edi,1 ;m=2*i; + + jmp .cycle_b + .cycle_e: + + ;чэрўхэш  ьэюушї ЁхушёЄЁют єцх эх трцэ√ Є. ъ. ъюэхЎ ЇєэъЎшш + stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; + + popad + ret +endp + +;output: +; dl +align 4 +proc pole_compare_bm_yzx uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword + + mov eax,[i0] ;eax -> cell[i0] + imul eax,vox_ogl_size + add eax,[p_mem] + + mov ebx,[i1] ;ebx -> cell[i1] + cmp ebx,0 + jl .copy + imul ebx,vox_ogl_size + add ebx,[p_mem] + jmp @f + .copy: + mov ebx,mem_copy_32 + @@: + + mov cx,word[ebx+vox_ogl_zoom] ;zoom + cmp word[eax+vox_ogl_zoom],cx + jle @f ;zoom0>zoom1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if zoom0y1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if y0z1 + mov dl,1 + jmp .fun_e + @@: + jne .r_0 ;if z0x1 + mov dl,1 + jmp .fun_e + @@: + + .r_0: + xor dl,dl + .fun_e: + ret +endp + +align 4 +proc copy_cell uses ecx edi esi, p_mem:dword, i0:dword, i1:dword + + mov esi,[i1] + cmp esi,0 + jl .copy_0 + imul esi,vox_ogl_size + add esi,[p_mem] + jmp @f + .copy_0: + mov esi,mem_copy_32 + @@: + + mov edi,[i0] + cmp edi,0 + jl .copy_1 + imul edi,vox_ogl_size + add edi,[p_mem] + jmp @f + .copy_1: + mov edi,mem_copy_32 + @@: + +if vox_ogl_size eq 34 + mov ecx,8 ;ecx=32/4 + cld + rep movsd + movsw +else + vox_ogl_size эх Ёртэю 34 ! +end if + ret +endp + +align 4 +proc swap_cell uses eax ebx ecx edi esi, p_mem:dword, i0:dword, i1:dword + mov esi,[i0] + imul esi,vox_ogl_size + add esi,[p_mem] + mov edi,[i1] + imul edi,vox_ogl_size + add edi,[p_mem] +if vox_ogl_size eq 34 + ;vox_ogl_size = 34 = 32 + 2 + mov ecx,8 ;ecx=32/4 + cld + @@: + mov eax,dword[edi] + mov ebx,dword[esi] + mov dword[edi],ebx + mov dword[esi],eax + add esi,4 + add edi,4 + loop @b + mov ax,word[edi] + mov bx,word[esi] + mov word[edi],bx + mov word[esi],ax +else + vox_ogl_size эх Ёртэю 34 ! +end if + ret +endp + +align 4 +mem_copy_32 rb vox_ogl_size + +;ЇєэъЎш  фы  ъюЁхъЄшЁютъш ъююЁфшэрЄ +;эряЁртыхэш  юёхщ ъююЁфшэрЄ т тюъёхых: +;*z +;| +;+-* x +;input: +; al - эюьхЁ єчыр т фхЁхтх (юЄ 1 фю 8) +; ebx - ъююЁфшэрЄр x +; edx - ъююЁфшэрЄр y +; esi - ъююЁфшэрЄр z +; ecx - єЁютхэ№ Єхъє°хую єчыр +;output: +; ebx - эютр  ъююЁфшэрЄр x +; edx - эютр  ъююЁфшэрЄр y +; esi - эютр  ъююЁфшэрЄр z +align 4 +proc vox_corect_coords_pl, v_obj:dword, v_size:dword + cmp ecx,0 + jl .end_f ;фы  єёъюЁхэш  юЄЁшёютъш + + push eax edi + and eax,15 ;т√фхы хь эюьхЁ єчыр т фхЁхтх + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + mov eax,[v_size] + cmp ecx,1 + jl @f + shl eax,cl + @@: + + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,eax + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub edx,eax + @@: + bt word[edi],1 ;test voxel coord y + jc @f + mov eax,1 + cmp ecx,1 + jl .end_0 + shl eax,cl + .end_0: + add esi,eax ;ьхэ хь уыєсшэє фы  сєЇхЁр z + @@: + pop edi eax + .end_f: + ret +endp + +normal_gran_z1 equ -1.0 +normal_gran_z0 equ 1.0 +normal_gran_y1 equ 1.0 +normal_gran_y0 equ -1.0 +normal_gran_x1 equ -1.0 +normal_gran_x0 equ 1.0 +align 4 +p1 dd ? +p2 dd ? + +align 4 +proc draw_voxels_3d uses ebx ecx edx edi, p_mem:dword +locals + v_count dd ? +endl + mov edi,[p_mem] + cmp edi,0 + je .end_f + mov eax,dword[edi] + mov dword[v_count],eax + add edi,4 + +bt word[opt_cube_box],0 +jnc @f +;Ёшёютрэшх Ёрьъш +stdcall [glColor3ub],128,128,128 +stdcall [glBegin],GL_LINE_STRIP + stdcall [glVertex3f], -0.5, -0.5, -0.5 + stdcall [glVertex3f], -0.5, 0.5, -0.5 + stdcall [glVertex3f], 0.5, 0.5, -0.5 + stdcall [glVertex3f], 0.5, -0.5, -0.5 + stdcall [glVertex3f], -0.5, -0.5, -0.5 + stdcall [glVertex3f], -0.5, -0.5, 0.5 + stdcall [glVertex3f], -0.5, 0.5, 0.5 + stdcall [glVertex3f], 0.5, 0.5, 0.5 + stdcall [glVertex3f], 0.5, -0.5, 0.5 + stdcall [glVertex3f], -0.5, -0.5, 0.5 +stdcall [glEnd] +stdcall [glBegin],GL_LINES + stdcall [glVertex3f], -0.5, 0.5, -0.5 + stdcall [glVertex3f], -0.5, 0.5, 0.5 + stdcall [glVertex3f], 0.5, 0.5, -0.5 + stdcall [glVertex3f], 0.5, 0.5, 0.5 + stdcall [glVertex3f], 0.5, -0.5, -0.5 + stdcall [glVertex3f], 0.5, -0.5, 0.5 +stdcall [glEnd] +@@: + +;Ёшёютрэшх юс·хъЄр + stdcall [glBegin],GL_QUADS + .cycle_0: + cmp dword[v_count],1 + jl .cycle_1 + stdcall [glColor3ub],[edi+vox_ogl_color+2],[edi+vox_ogl_color+1],[edi+vox_ogl_color] + + bt word[edi+vox_ogl_planes],vox_ogl_gran_z1 + jnc .e_gran_z1 + ;яхЁхфэ   уЁрэ№ Normal(0.0,0.0,normal_gran_z1) + normal_gran p1,x0 + normal_gran_2 p1,x0z1,x1 + normal_gran p2,y0 + normal_gran_2 p2,y0z1,y1 + stdcall [glNormal3f], [p1],[p2],normal_gran_z1 + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1] + normal_gran p1,x1 + normal_gran_2 p1,x1z1,x0 + ;normal_gran p2,y0 + ;normal_gran_2 p2,y0z1,y1 + stdcall [glNormal3f], [p1],[p2],normal_gran_z1 + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1] + ;normal_gran p1,x1 + ;normal_gran_2 p1,x1z1,x0 + normal_gran p2,y1 + normal_gran_2 p2,y1z1,y0 + stdcall [glNormal3f], [p1],[p2],normal_gran_z1 + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1] + normal_gran p1,x0 + normal_gran_2 p1,x0z1,x1 + ;normal_gran p2,y1 + ;normal_gran_2 p2,y1z1,y0 + stdcall [glNormal3f], [p1],[p2],normal_gran_z1 + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1] + .e_gran_z1: + + bt word[edi+vox_ogl_planes],vox_ogl_gran_y0 + jnc .e_gran_y0 + ;тхЁїэ   уЁрэ№ Normal(0.0,normal_gran_y0,0.0) + normal_gran p1,x0 + normal_gran_2 p1,x0y0,x1 + normal_gran p2,z0 + normal_gran_2 p2,y0z0,z1 + stdcall [glNormal3f], [p1],normal_gran_y0,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0] + normal_gran p1,x1 + normal_gran_2 p1,x1y0,x0 + ;normal_gran p2,z0 + ;normal_gran_2 p2,y0z0,z1 + stdcall [glNormal3f], [p1],normal_gran_y0,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0] + ;normal_gran p1,x1 + ;normal_gran_2 p1,x1y0,x0 + normal_gran p2,z1 + normal_gran_2 p2,y0z1,z0 + stdcall [glNormal3f], [p1],normal_gran_y0,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1] + normal_gran p1,x0 + normal_gran_2 p1,x0y0,x1 + ;normal_gran p2,z1 + ;normal_gran_2 p2,y0z1,z0 + stdcall [glNormal3f], [p1],normal_gran_y0,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1] + .e_gran_y0: + + bt word[edi+vox_ogl_planes],vox_ogl_gran_y1 + jnc .e_gran_y1 + ;эшцэ   уЁрэ№ Normal(0.0,normal_gran_y1,0.0) + normal_gran p1,x0 + normal_gran_2 p1,x0y1,x1 + normal_gran p2,z1 + normal_gran_2 p2,y1z1,z0 + stdcall [glNormal3f], [p1],normal_gran_y1,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1] + normal_gran p1,x1 + normal_gran_2 p1,x1y1,x0 + ;normal_gran p2,z1 + ;normal_gran_2 p2,y1z1,z0 + stdcall [glNormal3f], [p1],normal_gran_y1,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1] + ;normal_gran p1,x1 + ;normal_gran_2 p1,x1y1,x0 + normal_gran p2,z0 + normal_gran_2 p2,y1z0,z1 + stdcall [glNormal3f], [p1],normal_gran_y1,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0] + normal_gran p1,x0 + normal_gran_2 p1,x0y1,x1 + ;normal_gran p2,z0 + ;normal_gran_2 p2,y1z0,z1 + stdcall [glNormal3f], [p1],normal_gran_y1,[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0] + .e_gran_y1: + + bt word[edi+vox_ogl_planes],vox_ogl_gran_x0 + jnc .e_gran_x0 + ;ыхтр  уЁрэ№ Normal(normal_gran_x0,0.0,0.0) + normal_gran p1,y0 + normal_gran_2 p1,x0y0,y1 + normal_gran p2,z1 + normal_gran_2 p2,x0z1,z0 + stdcall [glNormal3f], normal_gran_x0,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1] + normal_gran p1,y1 + normal_gran_2 p1,x0y1,y0 + ;normal_gran p2,z1 + ;normal_gran_2 p2,x0z1,z0 + stdcall [glNormal3f], normal_gran_x0,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1] + ;normal_gran p1,y1 + ;normal_gran_2 p1,x0y1,y0 + normal_gran p2,z0 + normal_gran_2 p2,x0z0,z1 + stdcall [glNormal3f], normal_gran_x0,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0] + normal_gran p1,y0 + normal_gran_2 p1,x0y0,y1 + ;normal_gran p2,z0 + ;normal_gran_2 p2,x0z0,z1 + stdcall [glNormal3f], normal_gran_x0,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0] + .e_gran_x0: + + bt word[edi+vox_ogl_planes],vox_ogl_gran_x1 + jnc .e_gran_x1 + ;яЁртр  уЁрэ№ Normal(normal_gran_x1,0.0,0.0) + normal_gran p1,y0 + normal_gran_2 p1,x1y0,y1 + normal_gran p2,z1 + normal_gran_2 p2,x1z1,z0 + stdcall [glNormal3f], normal_gran_x1,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1] + ;normal_gran p1,y0 + ;normal_gran_2 p1,x1y0,y1 + normal_gran p2,z0 + normal_gran_2 p2,x1z0,z1 + stdcall [glNormal3f], normal_gran_x1,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0] + normal_gran p1,y1 + normal_gran_2 p1,x1y1,y0 + ;normal_gran p2,z0 + ;normal_gran_2 p2,x1z0,z1 + stdcall [glNormal3f], normal_gran_x1,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0] + ;normal_gran p1,y1 + ;normal_gran_2 p1,x1y1,y0 + normal_gran p2,z1 + normal_gran_2 p2,x1z1,z0 + stdcall [glNormal3f], normal_gran_x1,[p1],[p2] + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1] + .e_gran_x1: + + bt word[edi+vox_ogl_planes],vox_ogl_gran_z0 + jnc .e_gran_z0 + ;чрфэ   уЁрэ№ Normal(0.0,0.0,normal_gran_z0) + normal_gran p1,x0 + normal_gran_2 p1,x0z0,x1 + normal_gran p2,y1 + normal_gran_2 p2,y1z0,y0 + stdcall [glNormal3f], [p1],[p2],normal_gran_z0 + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0] + normal_gran p1,x1 + normal_gran_2 p1,x1z0,x0 + ;normal_gran p2,y1 + ;normal_gran_2 p2,y1z0,y0 + stdcall [glNormal3f], [p1],[p2],normal_gran_z0 + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0] + ;normal_gran p1,x1 + ;normal_gran_2 p1,x1z0,x0 + normal_gran p2,y0 + normal_gran_2 p2,y0z0,y1 + stdcall [glNormal3f], [p1],[p2],normal_gran_z0 + stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0] + normal_gran p1,x0 + normal_gran_2 p1,x0z0,x1 + ;normal_gran p2,y0 + ;normal_gran_2 p2,y0z0,y1 + stdcall [glNormal3f], [p1],[p2],normal_gran_z0 + stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0] + .e_gran_z0: + + ;goto next voxel + add edi,vox_ogl_size + dec dword[v_count] + jmp .cycle_0 + .cycle_1: + + stdcall [glEnd] + + .end_f: + ret +endp diff --git a/programs/media/voxel_editor/utilites/vox_creator.asm b/programs/media/voxel_editor/utilites/vox_creator.asm index 620627cf12..cf39120f53 100644 --- a/programs/media/voxel_editor/utilites/vox_creator.asm +++ b/programs/media/voxel_editor/utilites/vox_creator.asm @@ -13,6 +13,7 @@ include '../../../../programs/macros.inc' include '../../../../programs/proc32.inc' include '../../../../programs/develop/libraries/box_lib/load_lib.mac' include '../../../../programs/dll.inc' +include '../trunk/str.inc' vox_offs_tree_table equ 4 vox_offs_data equ 12 @@ -20,7 +21,7 @@ txt_buf rb 8 include '../trunk/vox_rotate.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel creator 03.10.13',0 ;подпись окна +caption db 'Voxel creator 29.01.15',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -397,20 +398,13 @@ pushad ; *** рисование главного окна (выполняется 1 раз при запуске) *** xor eax,eax - mov ebx,(20 shl 16)+410 - mov ecx,(20 shl 16)+520 mov edx,[sc.work] or edx,(3 shl 24)+0x30000000 - mov edi,caption - int 0x40 + mcall ,(20 shl 16)+410,(20 shl 16)+520,,,caption ; *** создание кнопок на панель *** - mov eax,8 - mov ebx,(5 shl 16)+20 - mov ecx,(5 shl 16)+20 - mov edx,3 mov esi,[sc.work_button] - int 0x40 + mcall 8,(5 shl 16)+20,(5 shl 16)+20,3 mov ebx,(30 shl 16)+20 mov edx,4 @@ -449,11 +443,8 @@ pushad int 0x40 ; *** рисование иконок на кнопках *** - mov eax,7 - mov ebx,[image_data_toolbar] - mov ecx,(16 shl 16)+16 mov edx,(7 shl 16)+7 ;icon new - int 0x40 + mcall 7,[image_data_toolbar],(16 shl 16)+16 add ebx,IMAGE_TOOLBAR_ICON_SIZE add edx,(25 shl 16) ;icon open @@ -504,8 +495,6 @@ align 4 draw_pok: ;обновление подписи размера файла mov edi,txt_f_size.size - mov dword[edi],0 - mov dword[edi+4],0 mov eax,dword[vox_obj_size] mov ebx,txt_pref .cycle: @@ -516,17 +505,15 @@ draw_pok: jmp .cycle @@: - call convert_int_to_str + stdcall convert_int_to_str, 16 stdcall str_cat, edi,ebx stdcall str_cat, edi,txt_space ;завершающий пробел - mov eax,4 ;рисование текста - mov ebx,(275 shl 16)+7 + ;рисование текста mov ecx,[sc.work_text] or ecx,0x80000000 or (1 shl 30) - mov edx,txt_f_size mov edi,[sc.work] ;цвет фона окна - int 0x40 + mcall 4,(275 shl 16)+7,,txt_f_size ret @@ -1237,108 +1224,6 @@ proc open_image_in_buf, buf:dword ret endp -;input: -; buf - указатель на строку, число должно быть в 10 или 16 ричном виде -;output: -; eax - число -align 4 -proc conv_str_to_int, buf:dword - xor eax,eax - push ebx ecx esi - xor ebx,ebx - mov esi,[buf] - ;определение отрицательных чисел - xor ecx,ecx - inc ecx - cmp byte[esi],'-' - jne @f - dec ecx - inc esi - @@: - - cmp word[esi],'0x' - je .load_digit_16 - - .load_digit_10: ;считывание 10-тичных цифр - mov bl,byte[esi] - cmp bl,'0' - jl @f - cmp bl,'9' - jg @f - sub bl,'0' - imul eax,10 - add eax,ebx - inc esi - jmp .load_digit_10 - jmp @f - - .load_digit_16: ;считывание 16-ричных цифр - add esi,2 - .cycle_16: - mov bl,byte[esi] - cmp bl,'0' - jl @f - cmp bl,'f' - jg @f - cmp bl,'9' - jle .us1 - cmp bl,'A' - jl @f ;отсеиваем символы >'9' и <'A' - .us1: ;составное условие - cmp bl,'F' - jle .us2 - cmp bl,'a' - jl @f ;отсеиваем символы >'F' и <'a' - sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки - .us2: ;составное условие - sub bl,'0' - cmp bl,9 - jle .cor1 - sub bl,7 ;convert 'A' to '10' - .cor1: - shl eax,4 - add eax,ebx - inc esi - jmp .cycle_16 - @@: - cmp ecx,0 ;если число отрицательное - jne @f - sub ecx,eax - mov eax,ecx - @@: - pop esi ecx ebx - ret -endp - -align 4 -proc str_cat uses eax ecx edi esi, str1:dword, str2:dword - mov esi,dword[str2] - stdcall str_len,esi - mov ecx,eax - inc ecx - mov edi,dword[str1] - stdcall str_len,edi - add edi,eax - cld - repne movsb - ret -endp - -;output: -; eax = strlen -align 4 -proc str_len, str1:dword - mov eax,[str1] - @@: - cmp byte[eax],0 - je @f - inc eax - jmp @b - @@: - sub eax,[str1] - ret -endp - msgbox_0: db 1,0 db 'Внимание',0 @@ -1691,38 +1576,7 @@ buf_vox: rb BUF_STRUCT_SIZE*(2+1) - -;input: -; eax = value -; edi = string buffer -;output: -align 4 -convert_int_to_str: - pushad - cld - mov dword[edi+1],0 - mov word[edi+5],0 - call .str - popad - ret - -align 4 -.str: - mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число - ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной - cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax - jb @f - xor edx,edx ;очистить edx - div ecx ;разделить - остаток в edx - push edx ;положить в стек - ;dec edi ;смещение необходимое для записи с конца строки - call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx - pop eax - @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) - or al,0x30 ;данная команда короче чем две выше - stosb ;записать элемент из регистра al в ячеку памяти es:edi - ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться - +align 16 i_end: rb 2048 thread: diff --git a/programs/media/voxel_editor/utilites/vox_mover.asm b/programs/media/voxel_editor/utilites/vox_mover.asm index 54ff8cc20e..fef372aa42 100644 --- a/programs/media/voxel_editor/utilites/vox_mover.asm +++ b/programs/media/voxel_editor/utilites/vox_mover.asm @@ -15,9 +15,10 @@ include '../../../../programs/develop/libraries/box_lib/load_lib.mac' include '../../../../programs/dll.inc' include '../trunk/vox_draw.inc' include '../trunk/vox_rotate.inc' +include '../trunk/str.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel mover 13.09.12',0 ;подпись окна +caption db 'Voxel mover 29.01.15',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -32,7 +33,6 @@ ends run_file_70 FileInfoBlock image_data dd 0 ;указатель на временную память. для нужен преобразования изображения -fn_toolbar db 'toolbar_m.png',0 IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*18 image_data_toolbar dd 0 @@ -174,7 +174,7 @@ start: stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z - load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE + load_image_file 'toolbar_m.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE stdcall mem.Alloc,[max_open_file_size] mov dword[open_file_vox],eax @@ -352,16 +352,11 @@ pushad ; *** рисование главного окна (выполняется 1 раз при запуске) *** mov edx,[sc.work] or edx,(3 shl 24)+0x30000000 - mov edi,caption - mcall 0,dword[wnd_s_pos],dword[wnd_s_pos+4] + mcall 0,dword[wnd_s_pos],dword[wnd_s_pos+4],,,caption ; *** создание кнопок на панель *** - mov eax,8 - mov ebx,(5 shl 16)+20 - mov ecx,(5 shl 16)+20 - mov edx,3 mov esi,[sc.work_button] - int 0x40 + mcall 8,(5 shl 16)+20,(5 shl 16)+20,3 mov ebx,(30 shl 16)+20 mov edx,4 @@ -416,11 +411,8 @@ pushad int 0x40 ; *** рисование иконок на кнопках *** - mov eax,7 - mov ebx,[image_data_toolbar] - mov ecx,(16 shl 16)+16 mov edx,(7 shl 16)+7 ;icon new - int 0x40 + mcall 7,[image_data_toolbar],(16 shl 16)+16 add ebx,IMAGE_TOOLBAR_ICON_SIZE add edx,(25 shl 16) ;icon open @@ -485,14 +477,10 @@ popad align 4 draw_pok: - mov eax,47 - mov ecx,[v_zoom] - mov ebx,(3 shl 16)+(1 shl 31) - mov edx,((350+6*9) shl 16)+OT_CAPT_Y_COLOR+2 mov esi,[sc.work_button_text] or esi,(1 shl 30) mov edi,[sc.work_button] - int 0x40 ;масштаб + mcall 47, (3 shl 16)+(1 shl 31), [v_zoom], ((350+6*9) shl 16)+OT_CAPT_Y_COLOR+2 ;масштаб mov ecx,[n_plane] add edx,115 shl 16 ;9 int 0x40 ;номер сечения @@ -501,11 +489,11 @@ draw_pok: mov dword[txt_curor.size],0 mov eax,dword[v_cur_x] mov edi,txt_curor.size - call convert_int_to_str + stdcall convert_int_to_str,10 stdcall str_cat, edi,txt_mull mov eax,dword[v_cur_y] mov edi,txt_buf - call convert_int_to_str + stdcall convert_int_to_str,16 stdcall str_cat, txt_curor.size,edi stdcall str_cat, txt_curor.size,txt_space ;завершающий пробел @@ -513,25 +501,23 @@ draw_pok: mov dword[txt_mov_offs.size],0 mov eax,dword[mov_x] mov edi,txt_mov_offs.size - call convert_int_to_str + stdcall convert_int_to_str,30 stdcall str_cat, edi,txt_space mov eax,dword[mov_y] mov edi,txt_buf - call convert_int_to_str + stdcall convert_int_to_str,16 stdcall str_cat, txt_mov_offs.size,edi stdcall str_cat, txt_mov_offs.size,txt_space mov eax,dword[mov_z] mov edi,txt_buf - call convert_int_to_str + stdcall convert_int_to_str,16 stdcall str_cat, txt_mov_offs.size,edi stdcall str_cat, txt_mov_offs.size,txt_space ;завершающий пробел - mov eax,4 ;рисование текста - mov ebx,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2 + ;рисование текста mov ecx,[sc.work_text] or ecx,0x80000000 ;or (1 shl 30) - mov edx,txt_color - int 0x40 + mcall 4, (OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2,,txt_color mov edx,txt_curor add ebx,115 shl 16 @@ -559,16 +545,14 @@ on_change_color: pushad mov ebx,((OT_CAPT_X_COLOR+35) shl 16)+16 ;по оси x mov ecx,(OT_CAPT_Y_COLOR shl 16)+12 ;по оси y - mov edx,[v_color] - mcall 13 + mcall 13,,,[v_color] - mov ebx,(1 shl 8)+(6 shl 16) mov ecx,edx mov edx,((OT_CAPT_X_COLOR+55) shl 16)+OT_CAPT_Y_COLOR+2 mov esi,[sc.work_text] add esi,(1 shl 30) mov edi,[sc.work] - mcall 47 + mcall 47,(1 shl 8)+(6 shl 16) popad ret @@ -1319,150 +1303,6 @@ pushad popad ret -if 0 -;input: -; buf - указатель на строку, число должно быть в 10 или 16 ричном виде -;output: -; eax - число -align 4 -proc conv_str_to_int, buf:dword - xor eax,eax - push ebx ecx esi - xor ebx,ebx - mov esi,[buf] - ;определение отрицательных чисел - xor ecx,ecx - inc ecx - cmp byte[esi],'-' - jne @f - dec ecx - inc esi - @@: - - cmp word[esi],'0x' - je .load_digit_16 - - .load_digit_10: ;считывание 10-тичных цифр - mov bl,byte[esi] - cmp bl,'0' - jl @f - cmp bl,'9' - jg @f - sub bl,'0' - imul eax,10 - add eax,ebx - inc esi - jmp .load_digit_10 - jmp @f - - .load_digit_16: ;считывание 16-ричных цифр - add esi,2 - .cycle_16: - mov bl,byte[esi] - cmp bl,'0' - jl @f - cmp bl,'f' - jg @f - cmp bl,'9' - jle .us1 - cmp bl,'A' - jl @f ;отсеиваем символы >'9' и <'A' - .us1: ;составное условие - cmp bl,'F' - jle .us2 - cmp bl,'a' - jl @f ;отсеиваем символы >'F' и <'a' - sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки - .us2: ;составное условие - sub bl,'0' - cmp bl,9 - jle .cor1 - sub bl,7 ;convert 'A' to '10' - .cor1: - shl eax,4 - add eax,ebx - inc esi - jmp .cycle_16 - @@: - cmp ecx,0 ;если число отрицательное - jne @f - sub ecx,eax - mov eax,ecx - @@: - pop esi ecx ebx - ret -endp -end if - -;input: -; eax = value -; edi = string buffer -;output: -align 4 -convert_int_to_str: - pushad - bt eax,31 - jae @f - ;если число отрицательное - neg eax - ;inc eax - ;clc - mov byte[edi],'-' - inc edi - @@: - mov dword[edi+1],0 - mov word[edi+5],0 - call .str - popad - ret - -align 4 -.str: - mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число - ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной - cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax - jb @f - xor edx,edx ;очистить edx - div ecx ;разделить - остаток в edx - push edx ;положить в стек - ;dec edi ;смещение необходимое для записи с конца строки - call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx - pop eax - @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) - or al,0x30 ;данная команда короче чем две выше - stosb ;записать элемент из регистра al в ячеку памяти es:edi - ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться - -align 4 -proc str_cat, str1:dword, str2:dword - push eax ecx edi esi - mov esi,dword[str2] - stdcall str_len,esi - mov ecx,eax - inc ecx - mov edi,dword[str1] - stdcall str_len,edi - add edi,eax - cld - repne movsb - pop esi edi ecx eax - ret -endp - -;output: -; eax = strlen -align 4 -proc str_len, str1:dword - mov eax,[str1] - @@: - cmp byte[eax],0 - je @f - inc eax - jmp @b - @@: - sub eax,[str1] - ret -endp ;данные для диалога открытия файлов align 4 @@ -1744,6 +1584,7 @@ buf_vox: db 6,7,4,3 ;w,h,h_osn,n rb BUF_STRUCT_SIZE*(3+1) +align 16 i_end: wnd_s_pos: ;место для настроек стартовой позиции окна rq 0 diff --git a/programs/media/voxel_editor/utilites/vox_tgl.asm b/programs/media/voxel_editor/utilites/vox_tgl.asm new file mode 100644 index 0000000000..d24919d309 --- /dev/null +++ b/programs/media/voxel_editor/utilites/vox_tgl.asm @@ -0,0 +1,1030 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem + dd stacktop + dd 0 + dd sys_path + +include '../../../../programs/macros.inc' +include '../../../../programs/proc32.inc' +include '../../../../programs/develop/libraries/box_lib/load_lib.mac' +include '../../../../programs/dll.inc' +include '../../../../programs/develop/libraries/TinyGL/asm_fork/opengl_const.inc' +include 'vox_3d.inc' +include '../trunk/str.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Voxel viewer 29.01.15',0 ;подпись окна + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +run_file_70 FileInfoBlock +image_data dd 0 ;указатель на временную память. для нужен преобразования изображения + +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*9 +image_data_toolbar dd 0 + +offs_zbuf_pbuf equ 24 + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall dword[img_decode], dword[buf],ebx,0 + mov dword[image_data],eax + ;преобразуем изображение к формату rgb + stdcall dword[img_to_rgb2], dword[image_data],dword[buf] + ;удаляем временный буфер image_data + stdcall dword[img_destroy], dword[image_data] + @@: +} + + + +align 4 +start: + load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузилась библиотека + mov ebp,lib_0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mcall 48,3,sc,sizeof.system_colors + mcall 40,0x27 + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + + stdcall [buf2d_create], buf_0 ;создание буфера + + load_image_file 'toolbar_t.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE + + mcall 26,9 + mov [last_time],eax + + stdcall [kosglMakeCurrent], 5,30,512,512,ctx1 + stdcall [glEnable], GL_DEPTH_TEST + stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов + stdcall [glClearColor], 0.0,0.0,0.0,0.0 + stdcall [glShadeModel], GL_SMOOTH + + call but_new_file + + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 26,9 + mov ebx,[last_time] + add ebx,50 ;задержка + cmp ebx,eax + jge @f + mov ebx,eax + @@: + sub ebx,eax + mcall 23 + bt word[opt_auto_rotate],0 + jnc @f + or eax,eax + jz timer_funct + @@: + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + + jmp still + +align 4 +timer_funct: + pushad + mcall 26,9 + mov [last_time],eax + + ;автоматическое изменение угла обзора + fld dword[angle_y] + fsub dword[delt_size] + fstp dword[angle_y] + call draw_3d + stdcall [kosglSwapBuffers] + + popad + jmp still + +align 4 +draw_window: +pushad + mcall 12,1 + + ; *** рисование главного окна (выполняется 1 раз при запуске) *** + xor eax,eax + mov edx,[sc.work] + or edx,(3 shl 24)+0x30000000 + mcall ,(20 shl 16)+800,(20 shl 16)+570,,,caption + + ; *** создание кнопок на панель *** + mov esi,[sc.work_button] + mcall 8,(5 shl 16)+20,(5 shl 16)+20,3 + + mov ebx,(30 shl 16)+20 + mov edx,4 + int 0x40 + add ebx,25 shl 16 + mov edx,5 + int 0x40 + add ebx,30 shl 16 + mov edx,6 + int 0x40 + add ebx,25 shl 16 + mov edx,7 + int 0x40 + add ebx,25 shl 16 + mov edx,8 + int 0x40 + add ebx,25 shl 16 + mov edx,9 + int 0x40 + add ebx,25 shl 16 + mov edx,10 + int 0x40 + add ebx,25 shl 16 + mov edx,11 + int 0x40 + add ebx,25 shl 16 + mov edx,12 + int 0x40 + + ; *** рисование иконок на кнопках *** + mov edx,(7 shl 16)+7 ;icon new + mcall 7,[image_data_toolbar],(16 shl 16)+16 + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon open + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon save + int 0x40 + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(30 shl 16) ;zoom + + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;zoom - + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;light on/off + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;box on/off + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;auto rotate on/off + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;info voxels + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;refresh + int 0x40 + + stdcall [buf2d_draw], buf_0 + stdcall [kosglSwapBuffers] + + mcall 12,2 +popad + ret + + +align 4 +key: + mcall 2 + + cmp ah,178 ;Up + jne @f + fld dword[angle_z] + fadd dword[delt_size] + fstp dword[angle_z] + call draw_3d + stdcall [kosglSwapBuffers] + @@: + cmp ah,177 ;Down + jne @f + fld dword[angle_z] + fsub dword[delt_size] + fstp dword[angle_z] + call draw_3d + stdcall [kosglSwapBuffers] + @@: + cmp ah,176 ;Left + jne @f + fld dword[angle_x] + fadd dword[delt_size] + fstp dword[angle_x] + call draw_3d + stdcall [kosglSwapBuffers] + @@: + cmp ah,179 ;Right + jne @f + fld dword[angle_x] + fsub dword[delt_size] + fstp dword[angle_x] + call draw_3d + stdcall [kosglSwapBuffers] + @@: + + jmp still + + +align 4 +button: + mcall 17 + cmp ah,3 + jne @f + call but_new_file + @@: + cmp ah,4 + jne @f + call but_open_file + @@: + cmp ah,5 + jne @f + call but_save_file + @@: + cmp ah,6 + jne @f + call but_zoom_p + @@: + cmp ah,7 + jne @f + call but_zoom_m + @@: + cmp ah,8 + jne @f + call but_3 + @@: + cmp ah,9 + jne @f + call but_4 + @@: + cmp ah,10 + jne @f + call but_5 + @@: + cmp ah,11 + jne @f + call but_6 + @@: + cmp ah,12 + jne @f + call but_7 + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file_data] + stdcall mem.Free,[open_file_ogl] + mcall -1 + + +align 4 +but_new_file: + mov dword[angle_x], 0.0 + mov [angle_y], 0.0 + mov [angle_z], 180.0 + ret + +align 4 +open_file_data dd 0 ;указатель на память для открытия файлов +open_file_size dd 0 ;размер открытого файла +open_b rb 560 +open_file_ogl dd 0 ;для записи координат шраней вокселей в показе opengl +v_zoom dd 0 + +align 4 +but_open_file: +pushad + copy_path open_dialog_name,communication_area_default_path,file_name,0 + mov [OpenDialog_data.type],0 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_open_file + ;код при удачном открытии диалога + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 5 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 + + ;mov eax,dword[open_b+32] + ;mov edi,txt_buf + ;call conv_int_to_str + ;notify_window_run txt_buf + + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + stdcall mem.ReAlloc,[open_file_data],ecx + mov [open_file_data],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], ecx + m2m dword[run_file_70.Buffer], dword[open_file_data] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_open_file + + mov [open_file_size],ebx + mcall 71,1,openfile_path + + mov eax,[open_file_data] + movzx eax,byte[eax] + mov dword[v_zoom],eax ;берем масштаб по умолчанию + mov ecx,[open_file_size] + sub ecx,vox_offs_data + shr ecx,2 + imul ecx,vox_ogl_size + add ecx,4 ;ecx = размер памяти необходимой для распаковки координат + stdcall mem.ReAlloc,[open_file_ogl],ecx + or eax,eax + jz .end_open_file + mov [open_file_ogl],eax + stdcall buf_vox_obj_create_3d,[open_file_data],eax,0,0,[v_zoom] + call draw_cadr_8 + .end_open_file: +popad + ret + +;description: +; рисование 8-ми кадров под разными углами поворота +align 4 +draw_cadr_8: + call but_new_file ;установка углов поворота по умолчанию + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + + ;рисование 8-ми кадров + fild dword[rot_angles+4] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 128, 0, buf_1 + + fild dword[rot_angles+8] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 0, 128, buf_1 + + fild dword[rot_angles+12] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 128, 128, buf_1 + + fild dword[rot_angles+16] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 0, 256, buf_1 + + fild dword[rot_angles+20] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 128, 256, buf_1 + + fild dword[rot_angles+24] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 0, 384, buf_1 + + fild dword[rot_angles+28] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 128, 384, buf_1 + + ; *** последний кадр *** + fild dword[rot_angles] + fstp dword[angle_y] + call draw_3d + call draw_cadr + stdcall [buf2d_bit_blt], buf_0, 0, 0, buf_1 + + call draw_3d + ; *** + + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +align 4 +rot_angles dd 0,45,90,135,180,225,270,315 + +align 4 +draw_cadr: + mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext + mov eax,[eax] ;eax -> ZBuffer + mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf + mov dword[buf_1],eax + + mov dword[buf_1.w],512 + mov dword[buf_1.h],512 + stdcall [buf2d_img_hdiv2],buf_1 + mov dword[buf_1.h],256 + stdcall [buf2d_img_hdiv2],buf_1 + mov dword[buf_1.h],128 + stdcall [buf2d_img_wdiv2],buf_1 + mov dword[buf_1.w],256 + stdcall [buf2d_img_wdiv2],buf_1 + mov dword[buf_1.w],128 + ret + +align 4 +but_save_file: + pushad + copy_path open_dialog_name,communication_area_default_path,file_name,0 + mov [OpenDialog_data.type],1 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_save_file + ;код при удачном открытии диалога + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 2 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov ebx, dword[open_file_data] + ;пишем в файл новый масштаб + mov edx,dword[v_zoom] + mov byte[ebx],dl + ; + mov [run_file_70.Buffer], ebx + mov ebx,[open_file_size] + mov dword[run_file_70.Count], ebx ;размер файла + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;сохраняем файл + ;cmp ebx,0xffffffff + ;je .end_save_file + ; ... сообщение о неудачном сохранении ... + + .end_save_file: + popad + ret + +align 4 +proc but_zoom_p uses eax + cmp dword[v_zoom],11 ;max=2^11=2048 + jge @f + inc dword[v_zoom] + stdcall buf_vox_obj_create_3d,[open_file_data],[open_file_ogl],0,0,[v_zoom] + call draw_3d + stdcall [kosglSwapBuffers] + @@: + ret +endp + +align 4 +proc but_zoom_m uses eax + cmp dword[v_zoom],1 + jle @f + dec dword[v_zoom] + stdcall buf_vox_obj_create_3d,[open_file_data],[open_file_ogl],0,0,[v_zoom] + call draw_3d + stdcall [kosglSwapBuffers] + @@: + ret +endp + +align 4 +proc but_3 uses eax + xor word[opt_light],1 + cmp word[opt_light],0 + je @f + stdcall [glEnable], GL_LIGHTING + stdcall [glEnable], GL_LIGHT0 + jmp .end_light + @@: + stdcall [glDisable], GL_LIGHTING + stdcall [glDisable], GL_LIGHT0 + .end_light: + call draw_3d + stdcall [kosglSwapBuffers] + ret +endp + +align 4 +proc but_4 uses eax + xor word[opt_cube_box],1 + call draw_3d + stdcall [kosglSwapBuffers] + ret +endp + +align 4 +proc but_5 uses eax + xor word[opt_auto_rotate],1 + ret +endp + +align 4 +proc but_6 uses eax ebx ecx edx edi + ;вычисление статистики по вокселям + mov eax,[open_file_ogl] + or eax,eax + jz .end_stat + mov ebx,[eax] + mov ecx,ebx + mov edx,ebx + imul ebx,6 + add eax,4 +align 4 + .cycle_0: + bt word[eax+vox_ogl_planes],vox_ogl_gran_z0 + jc @f + dec ebx + @@: + bt word[eax+vox_ogl_planes],vox_ogl_gran_z1 + jc @f + dec ebx + @@: + bt word[eax+vox_ogl_planes],vox_ogl_gran_y0 + jc @f + dec ebx + @@: + bt word[eax+vox_ogl_planes],vox_ogl_gran_y1 + jc @f + dec ebx + @@: + bt word[eax+vox_ogl_planes],vox_ogl_gran_x0 + jc @f + dec ebx + @@: + bt word[eax+vox_ogl_planes],vox_ogl_gran_x1 + jc @f + dec ebx + @@: + add eax,vox_ogl_size + loop .cycle_0 + + mov eax,edx + mov edi,txt_stat_m1.v + stdcall convert_int_to_str,20 + + ;mov eax,ebx + ;mov edi,txt_stat_m2.v + ;stdcall convert_int_to_str,20 + + ;stdcall str_n_cat,txt_stat_m1.v,txt_stat_m2,50 + notify_window_run txt_stat_m1 + .end_stat: + ret +endp + +align 4 +txt_stat_m1: + db 'Статистика',13,10,'Вокселей: ' +.v: rb 50 +txt_stat_m2: + db 13,10,'Отображаемых граней: ' +.v: rb 20 + +align 4 +proc but_7 uses eax + call draw_cadr_8 + ret +endp + +align 4 +draw_3d: + stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины + stdcall [glPushMatrix] + + cmp word[opt_light],0 + je @f + call SetLight + @@: + stdcall [glTranslatef], 0.0,0.0,0.5 ;координаты по оси z должны быть в пределах от 0.0 до 1.0, иначе изображение будет отсекаться + ;воксельный объект имеет координаты по осям от -0.5 до 0.5, потому его двигаем на +0.5 + ;но все же при поворотах будут отсекатся края, которые вылезут за пределы плоскостей отсечения + ;в версии opengl под Win координаты идут от -1.0 до 1.0 потому там этого делать не нужно + stdcall [glScalef], [scale], [scale], [scale] ;увеличиваем воксельный объект, что-бы не был очень маленьким + stdcall [glRotatef], [angle_y],0.0,1.0,0.0 + stdcall [glRotatef], [angle_x],1.0,0.0,0.0 + stdcall [glRotatef], [angle_z],0.0,0.0,1.0 + stdcall draw_voxels_3d,[open_file_ogl] + + stdcall [glPopMatrix] +ret + +align 4 +proc SetLight + stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position + stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir + + stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light + stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light + + stdcall [glEnable], GL_COLOR_MATERIAL + stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE + stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular + stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess + stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient + + stdcall [glEnable], GL_LIGHTING + stdcall [glEnable], GL_LIGHT0 + + ;;;stdcall [glLightModeli], GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE + ret +endp + +;input: +; buf - указатель на строку, число должно быть в 10 или 16 ричном виде +;output: +; eax - число +align 4 +proc conv_str_to_int, buf:dword + xor eax,eax + push ebx ecx esi + xor ebx,ebx + mov esi,[buf] + ;определение отрицательных чисел + xor ecx,ecx + inc ecx + cmp byte[esi],'-' + jne @f + dec ecx + inc esi + @@: + + cmp word[esi],'0x' + je .load_digit_16 + + .load_digit_10: ;считывание 10-тичных цифр + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'9' + jg @f + sub bl,'0' + imul eax,10 + add eax,ebx + inc esi + jmp .load_digit_10 + jmp @f + + .load_digit_16: ;считывание 16-ричных цифр + add esi,2 + .cycle_16: + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'f' + jg @f + cmp bl,'9' + jle .us1 + cmp bl,'A' + jl @f ;отсеиваем символы >'9' и <'A' + .us1: ;составное условие + cmp bl,'F' + jle .us2 + cmp bl,'a' + jl @f ;отсеиваем символы >'F' и <'a' + sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки + .us2: ;составное условие + sub bl,'0' + cmp bl,9 + jle .cor1 + sub bl,7 ;convert 'A' to '10' + .cor1: + shl eax,4 + add eax,ebx + inc esi + jmp .cycle_16 + @@: + or ecx,ecx ;если число отрицательное + jnz @f + neg eax + inc eax + @@: + pop esi ecx ebx + ret +endp + +;данные для диалога открытия файлов +align 4 +OpenDialog_data: +.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd plugin_path ;+16 +.dir_default_path dd default_dir ;+20 +.start_path dd file_name ;+24 путь к диалогу открытия файлов +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_path dd openfile_path ;+36 путь к открываемому файлу +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 10 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 10 ;+54 ; Window Y position + +default_dir db '/rd/1',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/rd/1/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: +db 'VOX',0 +db 'TXT',0 +.end: +db 0 + + + +head_f_i: +head_f_l db 'Системная ошибка',0 + +system_dir_0 db '/sys/lib/' +lib_name_0 db 'proc_lib.obj',0 +err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0 +err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0 + +system_dir_1 db '/sys/lib/' +lib_name_1 db 'libimg.obj',0 +err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0 +err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0 + +system_dir_2 db '/sys/lib/' +lib_name_2 db 'buf2d.obj',0 +err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0 +err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0 + +l_libs_start: + lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\ + err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i + lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\ + err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i + lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\ + err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i + lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\ + err_msg_found_lib_3,head_f_l,import_lib_tinygl,err_msg_import_3,head_f_i +l_libs_end: + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +proclib_import: ;описание экспортируемых функций + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + +align 4 +import_buf2d: + init dd sz_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + dd 0,0 + sz_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +;-------------------------------------------------- +align 4 +import_lib_tinygl: + +macro E_LIB n +{ + n dd sz_#n +} +include '../../../../programs/develop/libraries/TinyGL/asm_fork/export.inc' + dd 0,0 +macro E_LIB n +{ + sz_#n db `n,0 +} +include '../../../../programs/develop/libraries/TinyGL/asm_fork/export.inc' + +;-------------------------------------------------- +system_dir_3 db '/sys/lib/' +lib_name_3 db 'tinygl.obj',0 +err_msg_found_lib_3 db 'Не найдена библиотека ',39,'tinygl.obj',39,0 +err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'tinygl',39,0 +;-------------------------------------------------- + +sc system_colors +last_time dd 0 + +align 16 +procinfo process_information + +align 4 +buf_0: dd 0 ;указатель на буфер изображения + dw 530 ;+4 left + dw 30 ;+6 top +.w: dd 256 ;+8 w +.h: dd 512 ;+12 h +.color: dd 0xffffd0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top +.w: dd 512 ;+8 w +.h: dd 512 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext +;sizeof.TinyGLContext = 28 + +scale dd 1.414213562 +angle_x dd 0.0 +angle_y dd 0.0 +angle_z dd 0.0 +delt_size dd 3.0 + +opt_light dw 0 ;опция для включения/выключения света +opt_cube_box dw 1 ;опция для рисования рамки вокруг объекта +opt_auto_rotate dw 1 ;опция для автоматического поворота объекта + +light_position dd 0.0, 0.0, 2.0, 1.0 ; Расположение источника [0][1][2] + ;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии) +light_dir dd 0.0,0.0,0.0 ;направление лампы + +mat_specular dd 0.3, 0.3, 0.3, 1.0 ; Цвет блика +mat_shininess dd 3.0 ; Размер блика (обратная пропорция) +white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником +lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения + + +align 16 +i_end: + rb 4096 +stacktop: + sys_path rb 1024 + file_name: + rb 1024 ;4096 + library_path rb 1024 + plugin_path rb 4096 + openfile_path rb 4096 + filename_area rb 256 +mem: