From 7a6facbbcfe44864e8be5c72711a675820584760 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 19 Jul 2012 19:06:06 +0000 Subject: [PATCH] 'voxel_editor' add new instrument and docs git-svn-id: svn://kolibrios.org@2883 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/media/voxel_editor/docs/about.png | Bin 0 -> 29061 bytes programs/media/voxel_editor/docs/readme.htm | 111 +++++ .../media/voxel_editor/docs/tb_br_copy.png | Bin 0 -> 504 bytes .../media/voxel_editor/docs/tb_br_paste.png | Bin 0 -> 542 bytes .../media/voxel_editor/docs/tb_br_size.png | Bin 0 -> 1222 bytes programs/media/voxel_editor/docs/tb_brush.png | Bin 0 -> 461 bytes programs/media/voxel_editor/docs/tb_color.png | Bin 0 -> 734 bytes .../media/voxel_editor/docs/tb_eraser.png | Bin 0 -> 650 bytes programs/media/voxel_editor/docs/tb_light.png | Bin 0 -> 618 bytes programs/media/voxel_editor/docs/tb_new.png | Bin 0 -> 403 bytes programs/media/voxel_editor/docs/tb_open.png | Bin 0 -> 707 bytes programs/media/voxel_editor/docs/tb_pen.png | Bin 0 -> 513 bytes programs/media/voxel_editor/docs/tb_pl_m.png | Bin 0 -> 448 bytes programs/media/voxel_editor/docs/tb_pl_p.png | Bin 0 -> 453 bytes programs/media/voxel_editor/docs/tb_r_2_2.png | Bin 0 -> 242 bytes programs/media/voxel_editor/docs/tb_rot_1.png | Bin 0 -> 294 bytes programs/media/voxel_editor/docs/tb_rot_2.png | Bin 0 -> 261 bytes programs/media/voxel_editor/docs/tb_save.png | Bin 0 -> 536 bytes .../media/voxel_editor/docs/tb_zoom_m.png | Bin 0 -> 596 bytes .../media/voxel_editor/docs/tb_zoom_p.png | Bin 0 -> 565 bytes programs/media/voxel_editor/trunk/toolbar.png | Bin 4155 -> 5860 bytes .../media/voxel_editor/trunk/vox_draw.inc | 54 ++ .../media/voxel_editor/trunk/voxel_editor.asm | 464 ++++++++++++++++-- 23 files changed, 576 insertions(+), 53 deletions(-) create mode 100644 programs/media/voxel_editor/docs/about.png create mode 100644 programs/media/voxel_editor/docs/readme.htm create mode 100644 programs/media/voxel_editor/docs/tb_br_copy.png create mode 100644 programs/media/voxel_editor/docs/tb_br_paste.png create mode 100644 programs/media/voxel_editor/docs/tb_br_size.png create mode 100644 programs/media/voxel_editor/docs/tb_brush.png create mode 100644 programs/media/voxel_editor/docs/tb_color.png create mode 100644 programs/media/voxel_editor/docs/tb_eraser.png create mode 100644 programs/media/voxel_editor/docs/tb_light.png create mode 100644 programs/media/voxel_editor/docs/tb_new.png create mode 100644 programs/media/voxel_editor/docs/tb_open.png create mode 100644 programs/media/voxel_editor/docs/tb_pen.png create mode 100644 programs/media/voxel_editor/docs/tb_pl_m.png create mode 100644 programs/media/voxel_editor/docs/tb_pl_p.png create mode 100644 programs/media/voxel_editor/docs/tb_r_2_2.png create mode 100644 programs/media/voxel_editor/docs/tb_rot_1.png create mode 100644 programs/media/voxel_editor/docs/tb_rot_2.png create mode 100644 programs/media/voxel_editor/docs/tb_save.png create mode 100644 programs/media/voxel_editor/docs/tb_zoom_m.png create mode 100644 programs/media/voxel_editor/docs/tb_zoom_p.png diff --git a/programs/media/voxel_editor/docs/about.png b/programs/media/voxel_editor/docs/about.png new file mode 100644 index 0000000000000000000000000000000000000000..7917707cbef6b4ad33b70883fb0d2e70529a6f03 GIT binary patch literal 29061 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 XuJn9wE!&ql5B`~(T5ZlVaXtDU<8Ihd literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/readme.htm b/programs/media/voxel_editor/docs/readme.htm new file mode 100644 index 0000000000..24fc31cf0a --- /dev/null +++ b/programs/media/voxel_editor/docs/readme.htm @@ -0,0 +1,111 @@ + + +╬уыртыхэшх + + + + + +

╨хфръЄюЁ тюъёхы№эющ уЁрЇшъш тхЁёш  юЄ 19.07.2012

+

╬уыртыхэшх

+ + +

╬ яЁюуЁрььх

+

╧ЁюуЁрььр фы  ёючфрэш  ш ЁхфръЄшЁютрэш  3-ї ьхЁэющ тюъёхы№эющ уЁрЇшъш.

+

+

┬эх°эшщ тшф яЁюуЁрьь√.

+

╬ъэю яЁюуЁрьь√ ёюфхЁцшЄ ярэхы№ шэёЄЁєьхэЄют, ЄхъёЄют√х яюфяшёш, сєЇхЁ ё шчюсЁрцхэшхь 3-ї ьхЁэюую юс·хъЄр ш ёхўхэшх ¤Єюую юс·хъЄр. ╫хЁхч сєЇхЁ ё ёхўхэшхь юс·хъЄр ьюцэю ЁхфръЄшЁютрЄ№ шчюсЁрцхэшх. ┬ ЄхъёЄют√ї яюфяшё ї єърчрэю: Єхъє∙шщ ЎтхЄ ърЁрэфр°р, яючшЎш  ъєЁёюЁр, ЁрчьхЁ ъшёЄш, ьрё°Єрс ш эюьхЁ ёхўхэш . ╚чюсЁрцхэш  ёюїЁрэ ■Єё  т сшэрЁэ√щ Їрщы ё Ёрё°шЁхэшхь *.vox.

+

╦шЎхэчш  ётюсюфэр .

+ +

╨рсюЄр ё яЁюуЁрььющ

+ +

╬яшёрэшх ярэхыш шэёЄЁєьхэЄют

+

- ёючфрэшх эютюую Їрщыр.

+

- юЄъЁ√Єшх Їрщыют ё яюью∙№■ фшрыюуютюую юъэр.

+

- ёюїЁрэхэшх Їрщыют.

+

, - єтхышўхэшх ш єьхэ№°хэшх ьрё°Єрср.

+

, - яютюЁюЄ√ шчюсЁрцхэш .

+

, - ёфтшу яыюёъюёЄш ёхўхэш .

+

- єёЄрэютър Ёхцшьр Ёшёютрэш  тюъёхыхщ.

+

- єёЄрэютър Ёхцшьр Ёшёютрэш  ё шёяюы№чютрэшхь ъшёЄш.

+

- єёЄрэютър Ёхцшьр ёЄшЁрэш  тюъёхыхщ.

+

- єёЄрэютър Ёхцшьр т√сюЁр ЎтхЄр.

+

- тъы■ўхэшх ш юЄъы■ўхэшх Ёхцшьр юётх∙хэш  яЁш яЁюЁшёютъх шчюсЁрцхэш .

+

- яЁюЁшёютър шчюсЁрцхэш  ё єыєў°хэ√ь ърўхёЄтюь.

+

- ёючфрэшх ъшёЄш шч т√фхыхээющ юсырёЄш эр шчюсЁрцхэшш.

+

- Ёшёютрэшх ъшёЄ№■ эр шчюсЁрцхэшш.

+

- юяЁхфхыхэшх ЁрчьхЁют фы  шэёЄЁєьхэЄр ъшёЄ№.

+ +

╚чьхэхэшх Єхъє∙хую ЎтхЄр ърЁрфр°р

+

╓тхЄ ърЁрэфр°р ьюцэю яюьхэ Є№ т√чтрт фы  ¤Єюую ярышЄЁє ёЄрэфрЁЄэ√ї ЎтхЄют ъэюяъющ .

+

╥ръцх ЎтхЄ ърЁрэфр°р ьюцэю яюьхэ Є№ ш схч ярышЄЁ√ эрцрт эр ╧╩╠ т юфэюь шч 2-ї сєЇхЁют. ╓тхЄ сєфхЄ юяЁхфхыхэ т чртшёшьюёЄш юЄ ьхёЄр эрцрЄш .

+ +

╨рсюЄр ё ъшёЄ№■

+

╩шёЄ№ ьюцхЄ шёяюы№чютрЄ№ё  фы  ёючфрэш  шчюсЁрцхэшщ ё яютЄюЁ ■∙шьшё  яюїюцшьш фЁєу эр фЁєр ўрёЄ ьш. ─ы  ъюяшЁютрэш  юяЁхфхыхээющ ўрёЄш шчюсЁрцхэш  т√яюыэшЄх Єръшх фхщёЄтш :

+
    +
  • юЄъЁющЄх шыш эрЁшёєщЄх шчюсЁрцхэшх, ўрёЄ№ ъюЄюЁюую эєцэю ъюяшЁютрЄ№
  • +
  • т√схЁшЄх шэёЄЁєьхэЄ ъшёЄ№ (ъэюяър )
  • +
  • эрцьшЄх эр яыюёъюёЄш ёхўхэш  т юсырёЄ№, ъюЄюЁр  сєфхЄ шёяюы№чютрэр ъръ юсЁрчхЎ фы  ёючфрэш  ъшёЄш
  • +
  • яЁш эхюсїюфшьюёЄш шчьхэшЄх ЁрчьхЁ юсырёЄш ъэюяърьш (ьръёшьры№э√щ ЁрчьхЁ ъшёЄш 32*32)
  • +
  • эрцьшЄх ъэюяъє фы  чряюьшэрэш  т√фхыхээющ юсырёЄш
  • +
  • т√схЁшЄх эр яыюёъюёЄш ёхўхэш  эютє■ яючшЎш■ фы  тёЄртъш чряюьэхээюую юсЁрчЎр, эрцьшЄх
  • +
+

┼ёыш эхюсїюфшью ёючфрЄ№ эхёъюы№ъю ъюяшщ юсЁрчЎр Єю яюёыхфэшщ °ру ьюцхЄ яютЄюЁ Єё  ьэюую Ёрч.

+

┼ёыш яЁш ъюяшЁютрэшш т т√фхыхээющ юсырёЄш ЎтхЄ тюъёхыхщ ёютярфхЄ ё Єхъє∙шь ЎтхЄюь ърЁрэфр°р, Єю яЁш шчьхэхэшш ЎтхЄр ърЁрэфр°р тюъёхыш ё фрээ√ь ЎтхЄюь яЁш тёЄртъх сєфєЄ Єръцх ё шчьхэхээ√ь ЎтхЄюь. ╧юЄюьє ъшёЄ№ Єръцх ьюцэю шёяюы№чютрЄ№ фы  чрьхэ√ ЎтхЄр.

+

└тЄюЁ

+

╚уюЁ№ └. (IgorA) - ЁрчЁрсюЄър яЁюуЁрьь√.

+ + + \ No newline at end of file diff --git a/programs/media/voxel_editor/docs/tb_br_copy.png b/programs/media/voxel_editor/docs/tb_br_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa976fb0b3db88516f50cfd31915e2f13101a72 GIT binary patch literal 504 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0gXvSK~y+Tm6A0vtrjs4J&gUccpB3t2^ZSzc?~Wt8(!y`TbM zOK=#iG+Y0H)Bt>)Ov)JeJT627SCz{e09@W@2J*P@M{w>9f{?U*1FF`!0AwT&cYub? zFa)b%^b5eI&L{aPMFFS&3`%(#^Hwc9RA=)D)gXU!bQ8>h48^cCs{xsl)yxWy$v9*a?uNUniA&h!0jD2t1BRIWh*mdrMmSo_jJaB9~ zkVvMGPNzUoFWi8&lXWnnJj6XxNCydw>Bo^{7{ucVgaw)gK+9KHTpb2cl43zM2aC}H uoo)ibf|5UgRmQ`|Fsn@<2%`3R>It8&?wyWYS7>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0kcU&K~y+TrPEPM zQ*ju_@$dh?%}qNSJCKE@jG{~gi^^#*uY!bxg6?|(zJlnc>)t?tNK<+PU3L|dL0z~& z7m7-9+C|RX>bQBfojhmTIjI-Y2&acVw||}wJiq7vh}1XNrGt`QdvEvFSk0s)4lCcwB!HQ?J@IN_DVZR42ld*dr401f!$3$k~If!1Lq_cYS*U zM>^QP25!hlpu3AuAcQKTOkbPg{`GNGRXzDU{|e%#UUZ#i6NEqBk)Q8ArfSH gM`?R+qSJH!3zl@Lp@Xp&RsaA107*qoM6N<$g2Ht6%K!iX literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_br_size.png b/programs/media/voxel_editor/docs/tb_br_size.png new file mode 100644 index 0000000000000000000000000000000000000000..9a83cdf1eb8eac91399eefd08f6229a05ab30535 GIT binary patch literal 1222 zcmV;%1UdVOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1Y1c&K~!i%?OIDr z6HydB{ZVv4&=3P^5EVcC3>Xy+(P*NE#F*&LoeO`73*EWYxN+f9qYFQYOLv;MF)?b@ z5cy~+zw)sHHU$YbrB(}6vDo{}m@+eOI-MDX$V@_R-gM@i`|f%7zWZ8i&CSiTu&xCc z0sDgU$a089z!GMGE(BY8DJv^0Gu_SM;o&)$76(7X>9LXt6OBeq6UXQCK`I1|Ee?5z zrLmF;6NyAH=BzLzPVr1Hd%v@@Q&E`t=D7Z}6Pqhb(eDr9{K2i9E($!oE*4ZDPdC9Y++{NBe?l8jO3w4L}LkNZ+Jd~?kioEFlkY7xLhe= z93X49FpuAjuuRN-8x9eR zFz$Ot;7A3^<+3wNW4fPB(8OnzO7gM2J8|ViBNM%F_6M^xru*4&XewpB;|bhu{eq=S z5)8X&x(j0;T5$P6JA6YCUBYC-kb+8m&?C&g@;oNS*4h#zQd1#IW4fPB(A0zxKXax8 zSvLCY5^ScZG3kdp;(o+={Wwi?-?F zpqH*adV}(s^$2tg;^NWWTy1z9iWx(#RWL_3SFP35m1V-nzWw=gW~rp|F1;K~7|M96B04)iSt$zy0{FhNVUDljhIzKWkgYJ9 z9QEqd7E-yP%`N@P8E<04P$;BW%7{Y{1XT=au%td{;gHUQFh>K;xbbX^Wjrme3kOP2 zyrEuE8@(I^cI$5`9uS4y+6*5vS zD=ia-6jbVi77i(fS!WCpSM8uonPTLuq)C|iHAR@3&Xoz^6jm#?f!PF&han}C`j8EW zh-KCpLyIs*&q|tv;pQRd13f|e7aV4tG1P=H>#Ve>gb@R3^o*ePx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0b)r+K~y+TrPIwy z0#OtP@V|q7AT~4$i!8Ay`!Fml#{yjiEo#vNL=WIgv<}*|DUj%cULa`GDvW_zXpj?1 zMKZal5jE6t#+e!^jao<&%{X+|_x!l`f6g&Q9_n@c;}Aw`r)@G4F$THR)pw~OU~WLg zWipEkHVw+!W*p$MDxxV73%(%)edES}nZ7E{k`ijFh~=OgF}~9naGh4bJ>{{s=mMwM z8qw)y;OxkQP%?-=3J8pLAy>0E<*o_L_DZ00000NkvXXu0mjf DI1spB literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_color.png b/programs/media/voxel_editor/docs/tb_color.png new file mode 100644 index 0000000000000000000000000000000000000000..c6db81bd8c8a9f427345aa487e5292448a6a515c GIT binary patch literal 734 zcmV<40wMj0P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0&_`3K~y+TrIJlg z6Hyd~pO(@V`ZdxPq_j{}G=>T$Mq-SKNjJu&8yChV{tjg6kI<#MBd*;j7;*S2w#-uk#;|?svegz9fbDS!zp5)M5!J z8Zq>a&>6UbC3uaG8GD;t8(_lpj@*}NOgazUt^h`Z6H0mxk`;>I(o_;U?Dr@5>>WIX zoC2;ZZ^%TR(>rhvW1$SoE3le}eJfZ-VDJ(LhutJTBvBrXGUsoUr*6# zXL%;u0)%rBO6D#$D6);2c!!0&qHrXTy4Odk$BAa^WV;JCk07l#vk=L(0BWtuE?EK8 zkp$#>JT#+;WS4+-t-Z#+D%q;lS_@D!4D+?1in@+f%EYM1oaR~*Y0lRw5S55xl3iFU zP#u<#Pr48=2YDM`B;Hi6p|`h{Jl9*og@ z^?bAV4?tt%f@_DD;n&P+d#FE*P*51II0*Lj6S^}_w5XgG{}s^o_a7EN0XGr?J|D=+ QuK)l507*qoM6N<$f+-0>od5s; literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_eraser.png b/programs/media/voxel_editor/docs/tb_eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..839b0bda700a76161bb10dd90047dadd9a9b4716 GIT binary patch literal 650 zcmV;50(Jd~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf02y>eSaefwW^{L9 za%BKPWN%_+AW3auXJt}lVPtu6$z?nM00H_*L_t(IPmPn?YZ^fm#=l)Jg=9rBeF(%- z+<}>3WAsDcFx!}wI)pl4m0eY z-#6#Xd?S1+*fwq$N$V@x9}fYRy7FuX#!6yFh&REBj)AieUm$O8Vm*~Y>-}eF?W5ZX zBv>K=ax#f-rvuBf5ZT_w>AM5OTUjn5T-O5aa>n5GjSY0WT?nEGK@b2o2ZKR;(+{xv z{K?eGJs z*DS{4@w|ZIJ3)=96FeLadBW1$y_rb+5A65*QT(1q=*8}(zys+gs?{oo2ZI5Jow)P* zDNaizR>%YdoB0AlFZXb~_Gl^)U2dXMsX$d#^!xoem_*8K=gFI04wo2w@6|r?q4e|? zSid$U#N%-e|2wEEksV?n5I`=M!R6b?+^2-Y+WEw6f|>$wwG zFOFdt2GZ#?cbzk+>=g6AwWMA9WVpbZUEo((uh)46j!`0!2xM7?$K!$5>*X_r+wF$S k<$`W9hu-En|L?{A1{Gm3s^{Xq6#xJL07*qoM6N<$f}q_Uj{pDw literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_light.png b/programs/media/voxel_editor/docs/tb_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b446c3d5933f9c1f9909f9f3ee0058459dcd3ec8 GIT binary patch literal 618 zcmV-w0+s!VP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0sl!vK~y+Tjg#wZ z(_j?FpQK4IDeY!2T3eUSP0=8w73V%FqF?+Vik}AdkK2DyP!L556^eAq)H)m63SDN` z%X�n@h7dg^u1LzHm73KIi%IyyS#>_tP}7aCW#a=+!<$9kyT+ndJiTUrV8&++7?6 zH4Aur!$hO_8pE~-UyO$1F1)<_xfUI{=xlk5S8VL;V7kmV8v0}=iHH_|I41p}7#0VV@o z*X;pLUj*$+1*%#{r;{guA0&wZr!x$XCq}dyTx(H#Kty5}-*rXr6d5iG%U3?uS>;aatdG94g3fTwo zl)U>A91ahTi&ZE?9m0cGON%u387=ignE{`Cia+J*#B9}xSjNr!FDBaJSprxC;dlbl zuOqStG${vaViA$82HQxd(~u+ynM?-a-;I@^bL;NWygjnQ`Tzg`07*qoM6N<$ Eg5~i8qW}N^ literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_new.png b/programs/media/voxel_editor/docs/tb_new.png new file mode 100644 index 0000000000000000000000000000000000000000..33891fca5b65ef5ddb361022334ac33b1bb7da9b GIT binary patch literal 403 zcmV;E0c`$>P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TRzwR^>gMizQCnQM%%d%h?#-EIF9FgZaqA1cJCavk2;$axH-S<7Z zu0vhdux%T09HS@-+&gcZlNG>4&xFv>G|g@EyF?WP0n#+Z<#O2|8-NfB)ssMe6M*Zw z@O>XymZ7SuA6qqH8dIc3!eqCeZ z^wk8Gqy6$3;TtCGY!zJE2$=u?002ovPDHLkV1n&_rUL)~ literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_open.png b/programs/media/voxel_editor/docs/tb_open.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e086b0d194cb0f7a0e0a320744f35e19c844c9 GIT binary patch literal 707 zcmV;!0zCbRP)N2bPDNB8 zb~7$DE;u(kfL#Cp0zgSbK~y+TrBgd-6j2mCGdmksjfpXZMl_9;2!S+iV{75J2ngEP zX<;ummKLct5zH1*1OvuGK_TJ?#l}D&5DSA~qPWTKV#G~$XJ%*S&CL6GXI55a2`qTw z@aDa_=iGDOoiX06YK{L0qg#RZFCT%09R0mJkw1B%U9u~Indu@fU%l2Q&6C)PQ0EdTnr^%+`FlB_NFY3r`L!X+QfKV2s zHeo!TDd;n2hhUgio16%!%@sUZJOIHZL4XSZNf1Kf*w}bm+LB5FB7$k@v~q@ExMi3K zaPj!J4i9&p@BQb@czADIpFh11xokEiznO2Q2})_IrXZxE>WK?l35kQ`Oh^qytEH5J z<{?Z|VeRV=Fy4oA`6lf%e^oMo+1v4fW zqU9tF5dzYO3>kP3pt`YzyKjducJmdrO_mfnSg$zHWIKPvqbh_XBnKh~k~I)IE&|7f zPnca`*!sTInwpT3@<|N$aTQndW!Xx5?0F+SBkZkK;mFy zGYf;796jg*tPX@WS+&8MHUc6AP6N!gQLFyMTzL?mN^}pu!;<9SbEO|g2iEXmuGoGN zOAAa`2;v>^;~oUOhc37mUn&ZPXVrF|F>&iU&C5X;#qfLv&tq`C0FLXYaB1(+-e*yo pW70ro7m_wx(bdoNXB?eRzW@ZiVc0SQH=qCj002ovPDHLkV1iitD0u(? literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_pen.png b/programs/media/voxel_editor/docs/tb_pen.png new file mode 100644 index 0000000000000000000000000000000000000000..815a8649b07e3e6703395c0f89d055d005b1a5a5 GIT binary patch literal 513 zcmV+c0{;DpP)N2bPDNB8 zb~7$DE;u(kfL#Cp0e(qDK~y+TW88P^|9=KD07w@X8v_FqA-!DZk21)wo5H|$`8bMF zMxf5`zX=)e_b-FgipdNzQ2`95`r-^i%lZ(8K;4bk1%kU)Ge{ph$nf9Bmf_dTnGD}J zcrYA{+kjs`7^LTRGyMAdhvEPCZw&8u?qvAp5lOrOyldt#Fh707@a^9}hOhtsG2D+U zWMJarCDMQ|9~t-;PiFWI)cg&o<%yyS!yk`utl^E-3vA1#GBCV*!|)Ag^H)YjhF8g@ z42*0X#2N7a%?k#OrPIJp{{{@{=h_Ag%=UgbV;jQ-f48k<`1S1@!*`&TFHDRK-_k1> z7@1j!H{k2H4-CpXwlgqUSTMY^c4FW(al)I{FvH-@GX_R3E`}E>+6t`}Bv2%j8g3>(`(42ojni0(~6ytxrdku^(e+I$I$q-#o0E`GQ z7hN+*8pQ?rPO60R7K;4EeYa5!fXjj`$7UV6^MPsroqvO;u=QS$00000NkvXXu0mjf DJ4)AC literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_pl_m.png b/programs/media/voxel_editor/docs/tb_pl_m.png new file mode 100644 index 0000000000000000000000000000000000000000..eef6e675a4e5a7a47b9945ea8e37a2e9a46750e1 GIT binary patch literal 448 zcmV;x0YCnUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0aZyvK~y+TW88P^ z|9=J?;MdEi4E>94Fns>b!XO|Z$e^Mi!Vu>z%yOX{vQT67eTlIOt@?Zi9dPql|fyBpW*MHKMeo>{bP`oU}bpo;U9_?yas?& z;`ATX7=i}ib0J6$!+^)vo-xdydxnrc>|yZy);orc``<|-F=9bd zO^CtYQHa4z58=drK(F8f7||%JCB=}KY=ZD36aJ(^Fd;D#@CaT5WF)v5Za(e({?@L;zI_-rPt`b_M{XLUFZ$cF^$v0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0a{5!K~y+TW88P^ z|9=K3;QRZNVbRvN40j&9VfgUjJp(W2ABMs>4F)!GX_yiWni1K6U3=a$=qR!$afWT>n0#AyH%vdo(g{}^N?SQ-BR`^WGXXn?u`Kf{w3UvX*%NuU^j zt`hDyJVxL(0I$_hNumvyKlcp7<7>|_%p}@?QD%X(-W1PId+Wr5SygGL8;E00000NkvXXu0mjfZ&5ETD@ zSM8*Q+Kj9TZvSR>OHANZKBlsRQQ>HNh;HY_=0$8r8Ft@3?rD}F(8jouk@FkVNjdjR z4MH7HBw7*~G-MxmbHDgxv6mr;!+Yw9oEh4QNfCP+)=AnXOnhn>({SEw!rK?0B6uCn j$-iLip7&9s&yAr*Aw*l{;M6NXCoy=s`njxgN@xNALRC?_ literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_rot_1.png b/programs/media/voxel_editor/docs/tb_rot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5947e46d41474a309160070a7ec8c30716440717 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwB;BHSB#}EtuE>g<;;_z~XG z`0#l2nzjX%j4LKEO0#hlb1*mGX=A)=y@G8|Qewh^cF7b835&AL*JkZr+n kTTiwJmwiIgl%_;8_P+FGNt|Jm5A+6ur>mdKI;Vst0L!LkWdHyG literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_rot_2.png b/programs/media/voxel_editor/docs/tb_rot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f30777da5cb143885b4945fe8d49f82d918f4b81 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwB;4DuU#}EtuCquQ>?tWU%9AF*rSX+#ZP0zEVm0P+omBi@~t2edR(69tL?E+izEbT@`_@WbkzLb6Mw<&;$T! C{Z)AY literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/tb_save.png b/programs/media/voxel_editor/docs/tb_save.png new file mode 100644 index 0000000000000000000000000000000000000000..a709a2b8da00e6104b7576e65a3f33789b5b0278 GIT binary patch literal 536 zcmV+z0_XjSP)N2bPDNB8 zb~7$DE;u(kfL#Cp0hLKaK~y+TrIJlc!$1&*-=qmN1)+$Po_bIe6$*YFMGM8FXa9tt zNAVYkSMUA-kK)Ng(TZ0C7An+_TMI6o$qX~bb(T06%BUc7=0z^>+ z#ux%|8WseJk{;ou8j2o(D@Yik)9ogTJmifc)vE%CWI$gQzrFw@i9F<`nm!;1LWCm0 z1bJi!!b4uF=>sT1`g&n7)9FN!C-xISuJPgM9E-&T_`W~Z8ZFC0y>^e;{Vlb|FbpKs zwr%h~?vOiiMi7)E9E=``tkk99(=sDIPK;D^NmlCkKvxLja z72K99ZW)BZ>BF7AK;?RHCcAh$pd@6|J0pVX1raE8twzj)Q`P=0FO!urA958&6T aF_PbOL|F&dHN8~;0000N2bPDNB8 zb~7$DE-^4L^m3s900GcRL_t(IPh;G7>;HcS3IHRr0rD>TI>pA7%Ld}a9i z@e2@tV)*+3h=J@2TP~ugW#JN5VYv9Qi9w&Y4lV)G{3kMq;r|a{diVzP;@58sOkck< z{I2T2bO9(KaUV%z5LL5fQ2ZPSR`7dGK8DR8*MJPZa`G{XA@GF6xj&JCnVp}(RJ;X6 z!J(@O45Aup47?Hw48MPTVYs*d5Cc>A2DloOq%3@~nc>5e8w`KGe+DMy{|x^bSs57q z{AN(Fvu5BGlVMOvic-~~fAfh75 i@ar=Z19$pXurL74)X@F79eqjw0000N2bPDNB8 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 Ze*p`jW@<4>nil{7002ovPDHLkV1go1{JsDH delta 4123 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 Z2e!uYZ=m$ap#T5?07*qoM6N;tV1mgj(?I|L diff --git a/programs/media/voxel_editor/trunk/vox_draw.inc b/programs/media/voxel_editor/trunk/vox_draw.inc index 2bdcec8efa..ea4a0ffaf4 100644 --- a/programs/media/voxel_editor/trunk/vox_draw.inc +++ b/programs/media/voxel_editor/trunk/vox_draw.inc @@ -321,6 +321,60 @@ popad ret endp +; взять цвет вокселя в 2 этапа: +; 1) ищем место в структуре дерева, где есть узел (если ветвь не существует, выходим из функции) +; 2) берем цвет вокселя +;output: +; eax - цвет вокселя +align 4 +proc buf2d_vox_obj_node_get_color, v_obj:dword,coord_x:dword,coord_y:dword,\ +coord_z:dword,k_scale:dword +push ebx ecx edi esi +locals + p_node dd 0 ;родительский узел +endl + mov edi,[v_obj] + add edi,vox_offs_data + mov esi,[k_scale] + cmp esi,1 + jl .end_2 + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ;цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .end_2 ;если поддерева не существует + dec esi + cmp esi,0 + jg .found + + ; *** (2) *** + ;get + mov eax,dword[edi] + and eax,0xffffff + jmp .end_3 + .end_2: + mov eax,1 shl 31 + .end_3: +pop esi edi ecx ebx + ret +endp + ; сдвигает узлы для добавления новых узлов ;input: ; p_insert - позиция для вставки diff --git a/programs/media/voxel_editor/trunk/voxel_editor.asm b/programs/media/voxel_editor/trunk/voxel_editor.asm index 829b39e74e..acaa7bef2c 100644 --- a/programs/media/voxel_editor/trunk/voxel_editor.asm +++ b/programs/media/voxel_editor/trunk/voxel_editor.asm @@ -17,7 +17,7 @@ include 'dll.inc' include 'vox_draw.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel editor 17.07.12',0 ;подпись окна +caption db 'Voxel editor 19.07.12',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -34,7 +34,7 @@ image_data dd 0 ;ука fn_toolbar db 'toolbar.png',0 IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*14 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*21 image_data_toolbar dd 0 ;значения задаваемые по умолчанию, без ini файла @@ -105,6 +105,7 @@ OT_MAP_X equ 0 OT_MAP_Y equ 0 OT_CAPT_X_COLOR equ 5 ;отступ для подписи цвета OT_CAPT_Y_COLOR equ 30 +PEN_MODE_SELECT_COLOR equ 2 ;режим выбора цвета align 4 start: @@ -221,7 +222,7 @@ mouse: shr ebx,16 and eax,0xffff - cmp dword[v_pen_mode],2 ;select color + cmp dword[v_pen_mode],PEN_MODE_SELECT_COLOR jne .end_2 stdcall get_buf_color, buf_0 stdcall get_buf_color, buf_pl @@ -300,7 +301,7 @@ mouse: mov eax,[v_cur_x] mov ebx,[n_plane] mov edx,[v_cur_y] - + mov ecx,[v_zoom] cmp ecx,[scaled_zoom] jle .no_c_coord_0 @@ -452,6 +453,27 @@ pushad add ebx,25 shl 16 mov edx,16 int 0x40 + add ebx,25 shl 16 + mov edx,17 + int 0x40 + add ebx,25 shl 16 + mov edx,18 + int 0x40 + add ebx,25 shl 16 + mov edx,19 + int 0x40 + add ebx,25 shl 16 + mov edx,20 + int 0x40 + add ebx,25 shl 16 + mov edx,21 + int 0x40 + add ebx,25 shl 16 + mov edx,22 + int 0x40 + add ebx,25 shl 16 + mov edx,23 + int 0x40 ; *** рисование иконок на кнопках *** mov eax,7 @@ -468,37 +490,58 @@ pushad int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(30 shl 16) ; + add edx,(30 shl 16) ;увелич. масштаб int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;уменьш. масштаб int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;поворот 1 int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;поворот 2 int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;сдвиг плоскости + int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;сдвиг плоскости - int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;инструмент карандаш int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;инструмент кисть int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;инструмент затирачка int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;выбор цвета int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ; + add edx,(25 shl 16) ;освещение + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;рендер 2*2 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;создать кисть + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;нарисовать кисть + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;ширина кисти -1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;ширина кисти +1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;высота кисти -1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;высота кисти +1 int 0x40 ; *** рисование буферов *** @@ -511,41 +554,42 @@ popad align 4 draw_pok: - mov eax,4 ;рисование текста - mov ebx,(365 shl 16)+5 - mov ecx,[sc.work_text] - or ecx,0x80000000 ;or (1 shl 30) - mov edx,txt_zoom - ;mov edi,[sc.work] - int 0x40 - add bx,9 - mov edx,txt_cur_x - int 0x40 - add bx,9 - mov edx,txt_cur_y - int 0x40 - add bx,9 - mov edx,txt_n_plane - int 0x40 - mov eax,47 mov ecx,[v_zoom] mov ebx,(3 shl 16)+(1 shl 31) - mov edx,((365+6*9) shl 16)+5 + 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 ;масштаб - mov ecx,[v_cur_x] - add edx,9 - int 0x40 ;курсор x - mov ecx,[v_cur_y] - add edx,9 - int 0x40 ;курсор y mov ecx,[n_plane] - add edx,9 + add edx,115 shl 16 ;9 int 0x40 ;номер сечения + ;обновление параметров курсора + mov dword[txt_curor.size],0 + mov eax,dword[v_cur_x] + mov edi,txt_curor.size + call convert_int_to_str + stdcall str_cat, edi,txt_mull + mov eax,dword[v_cur_y] + mov edi,txt_buf + call convert_int_to_str + stdcall str_cat, txt_curor.size,edi + stdcall str_cat, txt_curor.size,txt_space ;завершающий пробел + + ;обновление параметров кисти + mov dword[txt_brush.size],0 + mov eax,dword[brush_w] + mov edi,txt_brush.size + call convert_int_to_str + stdcall str_cat, edi,txt_mull + mov eax,dword[brush_h] + mov edi,txt_buf + call convert_int_to_str + stdcall str_cat, txt_brush.size,edi + stdcall str_cat, txt_brush.size,txt_space ;завершающий пробел + mov eax,4 ;рисование текста mov ebx,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2 mov ecx,[sc.work_text] @@ -553,6 +597,24 @@ draw_pok: mov edx,txt_color int 0x40 + mov edx,txt_curor + add ebx,115 shl 16 + or ecx,(1 shl 30) + mov edi,[sc.work] + int 0x40 + + mov edx,txt_brush + add ebx,115 shl 16 + int 0x40 + + mov edx,txt_zoom + add ebx,115 shl 16 + int 0x40 + + mov edx,txt_n_plane + add ebx,115 shl 16 + int 0x40 + call on_change_color ret @@ -623,25 +685,53 @@ button: @@: cmp ah,12 jne @f - call but_7 + call but_mode_pen @@: cmp ah,13 jne @f - call but_8 + call but_mode_brush @@: cmp ah,14 jne @f - mov dword[v_pen_mode],2 ;select color - call draw_palete + call but_mode_clear @@: cmp ah,15 jne @f - call but_light + mov dword[v_pen_mode],PEN_MODE_SELECT_COLOR + call draw_palete @@: cmp ah,16 + jne @f + call but_light + @@: + cmp ah,17 jne @f call but_rend_2_2 @@: + cmp ah,18 + jne @f + call but_brush_copy + @@: + cmp ah,19 + jne @f + call but_brush_draw + @@: + cmp ah,20 + jne @f + call but_bru_w_m + @@: + cmp ah,21 + jne @f + call but_bru_w_p + @@: + cmp ah,22 + jne @f + call but_bru_h_m + @@: + cmp ah,23 + jne @f + call but_bru_h_p + @@: cmp ah,1 jne still .exit: @@ -907,11 +997,11 @@ pop ecx eax ret align 4 -but_7: +but_mode_pen: push eax mov eax,dword[v_pen_mode] - mov dword[v_pen_mode],1 ;draw - cmp eax,2 + mov dword[v_pen_mode],1 ;pen + cmp eax,PEN_MODE_SELECT_COLOR jne @f call draw_objects @@: @@ -919,11 +1009,23 @@ but_7: ret align 4 -but_8: +but_mode_brush: + push eax + mov eax,dword[v_pen_mode] + mov dword[v_pen_mode],3 ;brush + cmp eax,PEN_MODE_SELECT_COLOR + jne @f + call draw_objects + @@: + pop eax + ret + +align 4 +but_mode_clear: push eax mov eax,dword[v_pen_mode] mov dword[v_pen_mode],0 ;clear - cmp eax,2 + cmp eax,PEN_MODE_SELECT_COLOR jne @f call draw_objects @@: @@ -1027,6 +1129,172 @@ pop edi stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране ret +;уменьшаем ширину кисти +align 4 +but_bru_w_m: + cmp dword[brush_w],1 + jle @f + dec dword[brush_w] + pushad + call draw_pok + call draw_vox_cursor + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + popad + @@: + ret +;увеличиваем ширину кисти +align 4 +but_bru_w_p: + cmp dword[brush_w],32 + jge @f + inc dword[brush_w] + pushad + call draw_pok + call draw_vox_cursor + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + popad + @@: + ret +;уменьшаем высоту кисти +align 4 +but_bru_h_m: + cmp dword[brush_h],1 + jle @f + dec dword[brush_h] + pushad + call draw_pok + call draw_vox_cursor + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + popad + @@: + ret +;увеличиваем высоту кисти +align 4 +but_bru_h_p: + cmp dword[brush_h],32 + jge @f + inc dword[brush_h] + pushad + call draw_pok + call draw_vox_cursor + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + popad + @@: + ret + +align 4 +but_brush_copy: + cmp dword[v_pen_mode],3 + jne .end_f +pushad + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + @@: + + cld + mov edi,brush_data + mov esi,edx + sub esi,[brush_h] + .cycle_0: + mov ecx,[brush_w] + @@: + push eax + stdcall buf2d_vox_obj_node_get_color, [open_file_vox], eax,ebx,edx, [v_zoom] + cmp eax,[v_color] + jne .end_0 + mov eax,1 shl 30 + .end_0: + mov dword[edi],eax ;color + pop eax + inc eax + add edi,4 + loop @b + dec edx + sub eax,[brush_w] + cmp edx,esi + jg .cycle_0 + + call draw_objects +popad + .end_f: + ret + +align 4 +but_brush_draw: + cmp dword[v_pen_mode],3 + jne .end_f +pushad + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + @@: + + cld + mov edi,brush_data + mov esi,edx + sub esi,[brush_h] + .cycle_0: + mov ecx,[brush_w] + @@: + bt dword[edi],31 ;бит прозрачности + jc .end_2 + bt dword[edi],30 ;бит текущего цвета + jnc .end_0 + push dword[v_color] + jmp .end_1 + .end_0: + push dword[edi] + .end_1: + stdcall buf2d_vox_obj_create_node, [open_file_vox], eax,ebx,edx, [v_zoom] ;, color + .end_2: + inc eax + add edi,4 + loop @b + dec edx + sub eax,[brush_w] + cmp edx,esi + jg .cycle_0 + + call draw_objects +popad + .end_f: + ret + align 4 draw_palete: stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер @@ -1034,6 +1302,7 @@ draw_palete: stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране ret +align 4 v_zoom dd 3 ;текущий масштаб v_cur_x dd 0 ;координата курсора x v_cur_y dd 0 ;координата курсора y (но ось в объекте z) @@ -1047,12 +1316,25 @@ cam_z dd 0 scaled_zoom dd 5 ;масштаб после которого начинается рисование части изображения tile_size dd ? ;размер квадратика на плоскости с сечением max_open_file_size dd ? +brush_w dd 5 ;ширина кисти +brush_h dd 5 ;высота кисти +brush_data dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 +rd 999 ;32*32-25 txt_zoom db 'Масштаб:',0 -txt_cur_x db 'x:',0 -txt_cur_y db 'y:',0 +txt_curor: db 'Курсор: ' +.size: rb 10 txt_n_plane db 'Сечение:',0 txt_color db 'Цвет:',0 +txt_brush: db 'Кисть: ' +.size: rb 10 +txt_mull db '*',0 +txt_space db ' ',0 +txt_buf rb 16 align 4 draw_objects: @@ -1060,7 +1342,7 @@ draw_objects: stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер stdcall [buf2d_clear], buf_pl, [buf_pl.color] ;чистим буфер - cmp dword[v_pen_mode],2 + cmp dword[v_pen_mode],PEN_MODE_SELECT_COLOR jne @f call draw_palete jmp .end_f @@ -1146,6 +1428,9 @@ pushad dec ebx add edi,2 + cmp dword[v_pen_mode],3 + je .brush + ;горизонтальные линии sub eax,2 mov ecx,edi @@ -1162,6 +1447,18 @@ pushad dec edi stdcall [buf2d_line], buf_pl, eax,ebx, edi,ebx,[sc.work_graph] @@: + jmp .end_f + + ;рамка для кисти + .brush: + dec eax + mov ecx,[brush_w] + imul ecx,[tile_size] + ;mov edi,eax + mov edi,ecx + mov esi,[brush_h] + imul esi,[tile_size] + stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,esi,[sc.work_graph] .end_f: popad @@ -1242,6 +1539,67 @@ proc conv_str_to_int, buf:dword endp end if +;input: +; eax = value +; edi = string buffer +;output: +align 4 +convert_int_to_str: + pushad + 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 OpenDialog_data: