SC04_pre - Text Only Version * edited by TomCat/Abaddon (tomcat@szif.hu) ############################################################################ Tudja valaki, hogy hogyan tudok beallitani olyan 16 szinu VGA uzemmodot, hogy 256*160 meg hasonlokat ?? A 256-os modok kozul jol jonne a 320*100 meg a 160*100 is ... - LGB/Digital Creatures ............................................................................ Nos a 256*X felbontasok beallitasa nem olyan trivialis, ezert ezt most nem reszletezem, de ajanlom figyelmedbe a TWEAK16 programot (ilyen extra felbontasok kitokolesere valo) ill. megnezheted esetleg a GURUMODE-t is. A 320*100: MOV AX,13H INT 10H MOV DX,3D4H MOV AX,309H (vagy biztosabb a 4309H) OUT DX,AX ennyi. A 160*100: 1. fizikailag: lasd a 16-szinure vonatkozo infot. Hatranya: igen keskeny lesz a kep. 2. 320*100-on: irj mindig word-t a byte helyett vagy dword-t a word helyett. Hatranya: a 3 megoldas kozul ez a leglassab. 3. 320*100-on: Ha tweaked modba allitod a VGA kartyat (MODEX), akkor a RAM szelektet kettesevel allitsd, azaz: MOV DX,3C4H MOV AX,302H OUT DX,AX (az elso 2 RAMhoz) MOV DX,3C4H MOV AX,0C02H OUT DX,AX (a masik 2 RAMhoz) Hatranya: a paros es a paratlan oszlopokat kulon kell kezelni. ennyi. TomCat/Abaddon PS: Ha esetleg nem vagy olyan szinten, hogy ez segitet volna, akkor ajanlom figyelmedbe a VGA.TXT-t meg a VGA kertyak programozasa c. konyvet! ............................................................................ Koszi a segitseget, nagyjabol ertem is, az emlitett konyv megvan kulonben. Melyik FTP-n talalom meg azt a TWEAK16 nevu programot ? Nekem most foleg a 256*160/16 szin mod kellene ! Azt olvastam valahol, hogy a VGA elvileg 80*80-tol 720*480-ig (16 szin) mindent bir. Nem lehet olyan proggy-t irni, hogy be kell adni a kivant fuggoleges es vizszintes felbontast, aztan feltolti a VGA portokat ugy hogy ez menjen is ilyen felbontassal ???? Lenne meg egy kerdes, ha valaki tudja : A CRTC reg-ek hasznalataval, hogyan lehet leszukiteni a lathato terultet ? Asszem' start/end horizontal/vertical blanking reg-ek ... Igaz az, hogy a CRTC reg-ek irasa megsertheti a hardware-t ? Ahhoz kepeset en egyszer random szamokkal kiserleteztem ... (az unokatesoimnal :-) ) - LGB/Creature Design ############################################################################ evvel kapcsolatos az en problemam is. van egy szep 3d objectkirakonk, ami sorbarendezi a lapokat, forgatja a testet, rajzol phong, gouraud shaded texture mappos, env. mappos haromszogeket. ebbol szeretnenk egy virtual reality engine-t kesziteni. itt jonnek a problemak. - egyreszt mire kell vagni a lapokat a monitorral parhuzamos sikkal, vagy a latoszognek megfelelo 3 sikkal? - ha vagok egy 3-szoget, akkor akar otszog is lehet igy belole, ezt is vagjam szet haromszogekre? ez nagyon durva lenne bizonyos fillezeseknel. - hogyan kene megirni a kamera vezerlo rutint, hogy lehetoleg minden iranyba tudjon forogni? ti a vilagot is forgatjatok? rod ............................................................................ Na, virtual reality-t meg nem irtam, de erdekesek a problemak. Igazabol nem nagyon ertem a kerdeseidet. Mivel kapcsolatban vetodott fel, hogy nem a kepernyovel parhuzamos sikra vagj? A 3d-2d lekepezesre gondolsz itt, vagy mire? Masik: egy haromszoget vagva tenyleg kaphatsz otszoget is, de erre altalaban nem szokott sor kerulni. Ez csak akkor fordulhat elo, ha objectek metszik egymast, mert ugye a 3d-2d lekepezesnel nem. Innentol pedig a problema mar nem a vagas, hanem a takaras. Erre egy csomo trukk van. Az egyik, hogy a haromszog sulypontjat nezed, es ha azegy adott sik mogott van, akkor az egeszet moge vesz. A masik, amit ezzel kapcsolatban hallottam emlegetni, az un. zpuffer technika. Ezzel mar jol lehet csalni alakzatok egymasbamettszesenel is. A matematikai vagas ugyanis igen durva es ezert lassu. kameraval kapcsolatban pedig annyit, hogy a kamera mozgasat lenyegeben a taj ellentetes iranyu mozgatasaval es forgatasaval erheted el. Ebbol kovetkezik, hogy a kamerat nyil- van barmerre tudod forgatni. Igy a kerdesedre a valasz: igen, en az egesz vila- got forgatnam. Udv: Iron Hawk of Bi0Hazard ............................................................................ En ugy csinalom a kamera mozgasat, hogy az egesz vilagot forgatom/mozgatom a kamera korul, ellenkezo iranyban, mint amerre a kamerat szeretnem mozgatni. Igy a kamera termeszetesen fix, nem mozdul, fordul. A virtual realitynel az elso problema ami az emberben felmerul az az, hogy legtobb esetben elkerulhetetlen egy targynak a kamera, szempont moge kerulese. Ezt kb 3 (nekem ennyirol van tudomasom) fele modon lehet megoldani: - egyszeruen elhagyjuk azt a poligont, amely egy vagy tobb pontjanak negativ vagy 0 a Z kordinataja. Hat ez nem a leghatasosabb, mert lehet, hogy egy resze meg esetleg latszik, de azert esetleg ha nagyon sok es nagyon kicsi polibol allo objectekkel dolgozunk, es nem jon nagyon kozel a szemponthoz, akkor lehet, hogy hasznalhato a modszer, bar meg nem probaltam. - a reszben szem moge kilogo poligonokat z-re vagni. Ajanlott z=kis_szam egyenletu sikra vagni, mert ha z=0-ra csinalod, akkor a perspektiva valoszinuleg, vagy inkabb biztosan nem fog mukodni, bar lehet, hogy valaki feltalalta a spanyolviaszt, es egy teljesen uj perspektivat dolgozott ki. A vagas kulonben totalisan u.a. (na jo, majdnem) mintha a kepernyorol valo kilogast vagnad le. - es vegul, de nem utolsosorban az utolso megoldas; lenyege az, hogy negy sikkal vagod le az egesz vilagot. Mivel a latasod olyan, hogy kb. kup formaban latsz (ez inkabb a kuklopszokra vonatkozik, nem azokra, akik ket latokeszulekkel rendelkeznek). Mivel a monitorok nem kor, ellipszis alakuak, igy fogod magad, es nem egy kup alakkal vagsz, hanem egy 4 oldalu gulaval, mivel a monitor is teglalap alaku. Tehat, kepzeld el a vilagodat, amint rateszel egy gulat, es ami kivul esik a gulan, azt levagod (a szemed a gula csucspontjaban van). Ezt a vagast sokfelekeppen megcsinalhatod, peldaul ugy, hogy minden poligon minden oldalelere kiszamitod a gula oldalaival alkotott dofespontjat. Ez szerintem nem a legszerencsesebb modszer, mert barhogy is szamolom egyenes-sik dofespontjanak meghatarozasahoz kb. 9 szorzas es 1 osztas kell+kivonasok. Es ezzel meg a felenel sem tartasz a szamolasnak. Szoval szerintem ez elfelejtheto. Helyette inkabb nekem SB/ReMaL altal elmondott taktikat ajanlom: A vilagot, amit ki akarsz rajzolni, egy az egybe elforgatod egy derekszogu koordinata rendszerben (origo a szem) az x tengely korul 30-40 fokkal (pontosan nem tudom mennyivel, de kiszamolhato - lehet, hogy nem is esik ebbe a tartomanyba). Majd alkalmazod a 2. pontban leirt z-sikra vagast. Visszaforgatod a levagott vilagot, majd negativ iranyban forgatod el 30-40 fokkal (ezt a ket utobbi lepest ossze lehet/kell vonni). Ugyan ugy vagsz Z-sikra, majd visszaforgatod. Utana az utolso bekezdesben leirtakat megismetled Y tengely koruli elforgatassal (itt a szog egy kicsit nagyobb lesz, mert ugye a monitor horizontalis kiterjedese nagyobb mint a vertikalis). Mielott felkialtanal hogy ez egy halom forgatas, igazad van, de en nem tudok gyorsabb modszert. Pozitivuma hogy ha jok az elforgatasi szogeid, akkor mar nem kell kepernyorol valo kilogast vizsgalni/vagni. A levagas utani haromnal_tobb_szogu_poli problemadat nem nagyon ertem. Ha egyszer tudsz texturazni, shadingelni, env. mappolni stb. haromszoget, akkor miert nem tudsz 4-5 szoget is? Ha meg vegleg nem megy, akkor meg mindig ott van a 3 szogre vagas. Szerintem olyan nagyon nem lenne 'brutalis' ez az utobbi modszer sem. Ha meg tenyleg meg akarod csinalni, akkor valamelyik modszert mindenkepp alkalmazni kell, attol fuggetlenul, hogy lassu, bonyolult, vagy sem. AlmA ............................................................................ Hmmm ha jol emlekszem valaki kifogasolta, hogy ha egy haromszoget metszek a canonical view volume (ez a lato gula, amirol mar volt egy ket szo) akkor az tobb pontbol allo poligont is adhat vissza. Na de kerem ez konvex marad!!! Ez pedig azt jelenti, hogy egyetlen csuklomozdulattal, felbonthajuk tobb egy csucsukban kozos (paronkent 2 kozos csucsal rendekkezo) haromszogekre... Realtime rendszereknel nagy mertekben novelheti a lathatosagi tesztet a kov. nehany dolog melyet PSi-vel folytatott diszkurzus soran allapitottunk meg: - az objektekhez rendeljunk egy kozeppontot es egy sugarat, az igy kapott gomb korul oleli az objektet. Elosszor elforgatjuk a kozeppontot es meg nezzuk, hogy a gomb bent van vagy metszi-e vetito kupot. Ha metszi akkor kell csak laponkent vizsgalni... - Az objektek utkozeset (egymassal valo metszeset) meg ugy ellenorizhetjuk, hogy 'rahuzunk' egy teglatestet, es ezek egymashoz valo viszonyat vizsgal- juk. Meg nem nagyon tudtam megbizhato megoldast talalni arra az esetre, ha nagy meretbeli kulombsegek vannak. Pl. ha egy kis vadaszgep elhalad egy nagy csillagrombolo felszine folott... Itt mar gond lehet a poligonok ki- rakasanak sorrendjevel. GREG ............................................................................ Ha mar ilyen szepen benne vagyunk a VR problemaban, akkor engedtessek meg, hogy meg egy dologrol irjak. A kamera mozgasat a vilagban (felteve persze hogy nem jatekrol van szo) elore le kell tarolni es kesobb lejatszani. Marmost erre nagyon sok modszer letezik, de szinte midegyik megegyezik abban, hogy a kamera mozgasara egy mozgasvektort definialnak, melynek iranya a kamera mozgasanak iranyat hossza pedig a kamera sebesseget mutatja. Esetleg meg lehet csinalni, hogy a kamera allandoan mozog, es te egerrel mozgatod le-fel, jobbra-balra a kamerat. De szinte lehetetlen megcsinalni, hogy mindenfele mozgast (forgas, haladas ...) egerrel lehessen vezerelni. En szemely szerint annak a hive vagyok, hogy billentyuzetrol mozgasd, forgasd a kamerat, vagy esetleg tobb kamera van, amelyeket kulon lehet mozgatni, es valtogatni kozottuk. Meg lehetne csinalni meg azt, hogy a mozgasnak csak nehany pontjat adjuk meg a mozgasnak, es ezek a pontok kozott egy non-linear interpolaciot csinalunk. (ezt az utobbi modszert SB a virtuosys nevezetu 4k-s introjaban hasznalta). Ezt csak azert irtam, mert kivancsi lennek, hogy Ti hogy csinalnatok meg egy ilyen mozgas-szerkesztot, mert egy hatekony szerkeszto nagyon sok felesleges munkatol kimelhet meg. Szoval a kerdes: Hogyan? AlmA ............................................................................ en ezt hasznalnam, bezier, hermite vagy b-spline gorbekkel. a bezier-t es a hermite-et nem nagyon szeretem, mert tudomasom szerint csak 4 kontrollpontra mukodnek. persze lehetseges tobb gorbe-t egymashoz ragasztani, ha jol emlekszem az utolso ket kontrollpontnak kell megegyeznie. ennel joval jobb a b-spline, barmennyi pontra mukodik es nem sokkal bonyolultabbak a kepletek sem. ezeknel a gorbe nem megy at a pontokon, csak az alakjat befolyasoljak, azert hivjak oket kontrollpontnak. ez szerintem megoldast ad a kamera sebessegere is, mivel az algoritmus ket konrollpont kozott megadott szamu szakasszal kozeliti a gorbet. ha tavolabb viszed a pontot gyorsabbnak tunik a mozgas. en csak kontrollpontokkal szorakoznek. egy imagine-szeru 4 ablakos felulet eleg kezelheto lenne. 3 ablakban vetulet a 3 sikra (xy,yz,xz). a 4.-ben pedig perspektivikusan. udv, rod ............................................................................ Ha jol emlekszem, a bezier spline-t nem 4 kontrollponttal szoktak hasznalni, hanem ugy, hogy a kezdo es vegpontoknal megadjak a mozgas iranyat is. Igy a mozgast sokkal szebben lehet leirni. Perla ............................................................................ * A keplet, amit en a bezier gorbe kepletenek tudok: P(t)=P0(1-t)^3+P1*3t(1-t)^2+P2*3t^2(1-t)^2+P3*t^3 * matrix alakban: | -1 3 -3 1 | | P0 | | | | | | 3 -6 3 0 | | P1 | P(t)=[t^3 t^2 t 1]| | | | | -3 3 0 0 | | P2 | | | | | | 1 0 0 0 | | P3 | * ez atalakithato ugy, hogy iranyokat kavarunk bele a dologba P(0)=3(P1-P0) P(1)=3(P3-P2) ezek a vektorok erintoi a gorbenek a P0 es P3 pontokban, lathato, hogy P1 es P2 ezeken a vektorokon fekszik. ez talan abban segit, hogy ha tobb gorbet rakunk egymashoz, akkor a vegpontbeli csatlakozasoknal Pn(1) es Pn+1(0) iranyanak meg kell egyeznie. igy mar keszithetunk girbe-gurba utakat is, kulonben 1 gorbe csak 1 kanyar leirasara alkalmas. * c fajta pszeudo kodban 2d-re: // s - hany egyenessel kozelitse a gorbet // p1,p2,p3,p4 - kontroll pontok s=16; x=p1.x; y=p1.y; for(i=1; i<=s; i++) { t=i/s; x2=x; y2=y; x=(1-t)*(1-t)*(1-t)*p1.x+ 3*t*(1-t)*(1-t)*p2.x+ 3*t*t*(1-t)*p3.x+ t*t*t*p4.x; y=(1-t)*(1-t)*(1-t)*p1.y+ 3*t*(1-t)*(1-t)*p2.y+ 3*t*t*(1-t)*p3.y+ t*t*t*p4.y; draw_line(x,y,x2,y2); } ............................................................................ - Nem tetszenek a B-spineok meg bezier gorbek, nem akarok kontrol pontokkal jatszani. Ki tud valami jo pseudo kodot olyan gorbe huzo algoritmusra ami erinti a pontokat? (Pl. Catmull vagy kicsoda allitolag irt ilyesmit) GREG ............................................................................ Hat igazabol nincs konkret celom, csak foglalkoztam egy keveset a gorbe vonalakkal. Mindenki kontrol pontokkal jatszik, pedig van modszer arra is, hogy a vonal erintse a pontokat. A problema akkor lett fontos amikor objek- tumok utjat akartam megcsinalni, es a linearis interpolacio eleg csunyan nez ki. En altalaban a 3D Studiot veszem alapul (bar tudom mas anim szer- kesztoben is hasonloan oldjak meg) es ott a pontokon kivul csak egy bias-t kell beallitani ami a gorbe 'lapossagat' hatarozza meg (ha minimalis akkor lin. interpolaciot csinal). Na ez lenne az en problemam... GREG ............................................................................ Extra bonuskent itt van egy kis proggy, amit Gregnek kuldok, meg meg akit erdekel. Tetszoleges sikbeli pontokra illeszt gorbet. Most nemigen erek ra, hogy elmagyarazzam, de ha erdekel valakit, a vizsgaidoszak utan megteszem. Egyebkent quad adderrel megy a dolog, errol mar irtam egyszer, bar senki ra se bagozott. Total kutfejbol lett irva, jo gany, ugyhogy senki ne vonjon le semmilyen kovetkeztetest a forras alapjan iranyomban... A program eloszor a 3 szomszedos pontra illesztett parabolakat rajzolja ki, aztan az eredojuket. Jo szorakozast! MC&HNY...Paf ;--- itt vagd el, ha azt akarod, hogy legyen belole valami // quad adder v2.0 // csak egy gyors teszt... // tetszoleges tergorbe kvadratikus interpolacioja adott pontok kozott // (C) 1995.12.16 float m, step1, step2; void plot ( int x, int y, unsigned char col ) { int addr; addr= x+y*320; asm{ push es mov ax, 0a000h mov es, ax mov bx, addr mov al, col mov es:[bx], al pop es } } void calcsteps ( float v0, float v1, float v2 ) { step1 = -0.5*(m*(3*v0-4*v1+v2)-v0+2*v1-v2)/(m*m); step2 = -(2*v1-v0-v2)/(m*m); } main ( void ) { asm { mov ax, 013h int 010h } float v0x, v0y, v0z, v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z; float v4x, v4y, v4z, v5x, v5y, v5z, v6x, v6y, v6z; float vx, vy, vz; float step1x, step2x, step1y, step2y, step1z, step2z; m = 30; v0x = 0; v0y = 0; v1x = 15; v1y = 50; v2x = 40; v2y = 80; v3x = 60; v3y = 90; v4x = 100; v4y = 75; v5x = 100; v5y = 50; v6x = 120; v6y = 0; calcsteps ( v0x, v1x, v2x ); step1x = step1; step2x = step2; calcsteps ( v0y, v1y, v2y ); step1y = step1; step2y = step2; calcsteps ( v0z, v1z, v2z ); step1z = step1; step2z = step2; int i; vx=v0x;vy=v0y; i=0; do { plot ( vx+.5, vy+.5, 32 ); vx += step1x; step1x += step2x; vy += step1y; step1y += step2y; i++; } while ( i<2*m ); calcsteps ( v1x, v2x, v3x ); step1x = step1; step2x = step2; calcsteps ( v1y, v2y, v3y ); step1y = step1; step2y = step2; vx=v1x;vy=v1y; i=0; do { plot ( vx+.5, vy+.5, 40 ); vx += step1x; step1x += step2x; vy += step1y; step1y += step2y; i++; } while ( i<2*m ); calcsteps ( v2x, v3x, v4x ); step1x = step1; step2x = step2; calcsteps ( v2y, v3y, v4y ); step1y = step1; step2y = step2; vx=v2x;vy=v2y; i=0; do { plot ( vx+.5, vy+.5, 48 ); vx += step1x; step1x += step2x; vy += step1y; step1y += step2y; i++; } while ( i<2*m ); calcsteps ( v3x, v4x, v5x ); step1x = step1; step2x = step2; calcsteps ( v3y, v4y, v5y ); step1y = step1; step2y = step2; vx=v3x;vy=v3y; i=0; do { plot ( vx+.5, vy+.5, 56 ); vx += step1x; step1x += step2x; vy += step1y; step1y += step2y; i++; } while ( i<2*m ); calcsteps ( v4x, v5x, v6x ); step1x = step1; step2x = step2; calcsteps ( v4y, v5y, v6y ); step1y = step1; step2y = step2; vx=v4x;vy=v4y; i=0; do { plot ( vx+.5, vy+.5, 64 ); vx += step1x; step1x += step2x; vy += step1y; step1y += step2y; i++; } while ( i<2*m ); plot ( v0x, v0y, 20 ); plot ( v1x, v1y, 20 ); plot ( v2x, v2y, 20 ); plot ( v3x, v3y, 20 ); plot ( v4x, v4y, 20 ); plot ( v5x, v5y, 20 ); plot ( v6x, v6y, 20 ); asm{ xor ah, ah int 016h mov ax, 013h int 010h } float step1x2, step2x2, step1y2, step2y2; float vx1, vy1, vx2, vy2; calcsteps ( v0x, v1x, v2x ); step1x = step1; step2x = step2; calcsteps ( v0y, v1y, v2y ); step1y = step1; step2y = step2; vx1=v0x;vy1=v0y; i=0; do { plot ( vx1+.5, vy1+.5, 128 ); vx1 += step1x; step1x += step2x; vy1 += step1y; step1y += step2y; i++; } while ( iS^Q$L>H+?"!Z'W5ABXAZI#BK"HHGLA@8]G;+(` M0!/+(BE3>P[)RQ@(2_X^)!NSN2AX`NLLWO)9M1'->(\BL6?'BP"_Z%(D#]0N MZ'OPHI?P!HN#T;]E7?S@DB.<:-90#(M4]5^EFDN`,^JN#_#P-L;#HM0^3`%O MT>L9*+>)!E.?W57^X$3R$N2[.1TTD:A5K]4=R6-7ME\XA=R(/N!1GVUO@%AV2PK0I;P&QL+( MRF)I3/!0?])61S.M>>U?-D=2'>CS'6G@!D>Y45[FH8>NH_RD_;#)+DCX4H%; MN"X65?CY$=>MO7;EC2Z(Q3?Y@PFN)15]*N6!VI9[E=NEKOCR'TQUDO]J`Z&% M[E423/H7,OBXX`>#>#N/8KT;S[%D\O[C`E\`(>RYG_\,/B\!P MV"\@A[^PDJXH%\(B5/YB/B./3.2#I_+C(C!EZEX`S^.H0<02(`S!(8QAJ".>,0YB!H!"F7,!*08>:FJ7YW*G+3@KG3!(:`3R)"4$%9[QK2I0:?)6'7EWG(P8#: MDT6\5_*:@S![[>0SKH,Y?=\9(SJ`CQR8&MN>860<2]3X*QU[=KG/4,-)X>:O M1R-]&1=,MOU[Z9@5JH&_5AN5]$1X$M\B'488QC5B!+&8,WY!&S05M?Z@B> MD@1&^HS9^';X1T<,!A6ZH."Q-CH:3HJSN(J]C@-P30Q!2^<,V[\\QG0`@"P` MR08``'LM````IM/6902RBQ\/-0P`(````%-61T%'4E!(+D%33=C%1MYK5QN? M\Z;)Y+\@*E4G5P$'PIY<4'38EHH%V,IQ.VD:H;X.G0O&W*_CGO7M1>2`E.+I MG6Z&5;460_("4/.-BU\_R'#ZK0[F-])(10<'J<^%DG+N_Y/?]Q=%\\HXB=;U M'@>&I-PAO>@P22=IPC$G*@667PV,`ADLJ,J:.E&DL8H?`E MP4<44/*]=KK&5>B#S#'F6*JE7&BL1]L8:SA%U*"H3[$^&7FY'.^!`1OCHX59]_S_I!P2#;&+?) MFPT$(6PH?>V+4-B;FMCH5^8\D^(N-M>OZ M-6\_`M@[[]>=%>'8T`7$B4'[]:IQSZ?6XWL23AKIY2CM8U.V<6Y-ZV/)BE/9G-M#(&8'$MDYGX_QP&.=#I!(48V,J MPH(3@Z9F_N^.'T@W%;`^9\Y6&W#``SY3S'5XIB@ZE.RPKAJ0"VS6YJ[.DJ`N MTC5PO\_/`B-P#?''R1`!AG@\^VZ.! M?L`H=]H/QFW>^UIRL0GYTMR,-ER?I5:?>5?,&!HAF?_BBV:/YA!X+,/XT6#9$`%CC#N['G& M1Q`IU:625%K*:O]WEQZR'7`;+`/E!]6?OR^[_(&VP!."Q"`/]*+F710*>CR> M8DH"+UT4)"/]+PO"XUN6-S9[QQ[Q]B9>N>>VD<$R//N>`HRRE]*&/9-7JP1T M9*VS;*T8R^Q&X@*?LF>7Y>=PNKE5/:_]N_+3/-@O3#/><_9:&Y_4O__(5]E0QX08[EA<">(5_LBU[,3LA8/RDG<% MQ',CZ9Y4I\,1RW@.HZB"/+_>$/B$=*"*^H([>EA2^H#\;9L8'/=Q>?8;\/7! M>MY-W_>BK'U>ORW_'6U\GFHLV"`CSNJ.N1%'D$4>:P#QZ<_&COFCR=*26C!X MYS`EL>?`(=\FGH07%WG"Q<@(@17/M!1`RQY`1M3L>./Q*LK&9UT<'J"$IQIU2"OL] MF>0)QY5:09*;])=$&)`\)OB%9NZ5>R=DUM/64`Y$SLL,;X9,9$OKI/9):J41 MU.A!L>(V4\LOUE1AQLHO2^R.R4\MZ?J*" M/1KV_5'5O_^X'D;YWLNI^)H`Q?^:>N8H^/M21XUD6,NX9X\3B!YKLLYHXZX_ MKCP>H$KKACS7COQZ<[&G*6CS`?]:FTTBH2\X[!M;P125$QR"*TNG3@T(P>/H M(3Z2KV!%3RQJ[YZ9[O,5>^`N_D6K_^HV2K?.UP7IR\LEW+\_-:]I MFOS=?"K'' M'J3_\M*G=I9?M*O0M/.[MO-C3#8@9?!0S"6*P!6E[C4;?`,'^ID.?M>3[)"! MSR$>9VS_2/#)#R=T#D7'$(2(4,FP4Z9E+;*E,V(KPPJU!*MD*$'9/=%^!Q8& MW#3+4+#'YDE*:/,'+1N3X?$<"2C:H)!,H>C-/E^AF@?MJ],"$@`X;66]946D MY"U@)[-A">`U1KJ6L!47/6[`JB<'8=J(6^*=0B&"/^2)106="2=]]J<"?EX% M@*!>=8F^CBS@_-C==":RBW/Y%_#11-1"%T*[!->!I.[8!W7J&J:)MZ4@[IQ); M8!$//F"(Q&5I;6MKW`T>Q6'W[-8 M,V!)`)N9B0]E@DVRQTW)0>Q'LEE4.+FI$%71D7(\$!/,K&1MSFA1H*>TB M%6.&=&S;F7/W[L(C[Q4WAXM_!T8.=`"`*P!]!0``81X```#5'M9O9[:,'P\U M"P`@````4U9'04U54RY!4TT1ZK;CK"G6)Y6KC#L\AXO!XNGRH>SRG7S]7%2" M=\P[0/E^81"J48*;BP"+&;+/&V"RH+2V5_X<*('NT^]'FENS.TR#D`?<)MZ` MES0/``9@T4OG\J]T/>B!D;PS5LA-06OIT/Y+-.1S_3?E,,&J_RS0U.?49T&,E#!+%)\7Q5$H7 MSF?SL\D(2YP$$]67!CUB+S6X[Q=]Q_919-U6-!$7&ONC5UK_=/$.Z!>P0@ML M-.D0BJP\_/OP#/YL/G"03,%N7Q5.VHK MLGL6Q`?!`C>S1WW,U"3XH'BE!@+K5=9@-U2U."$Y`-F`[>)*U"<99G`5?WN* M'0:&WJ3W'P8.#0@$X2UV2)FY&_@K:=>#QA%NH0"W8+%JJ`=91P3*&Z$WL@>Z M4SMHXO$A(@0YK'9'>Z"S=9]Y_[@BI*-HZI@1>6CZAA="*.`'JN`T6I!CQQH$ M!'!8!#:J&>;`SL6)@B`%^2`;N*&IGAY@(\,C']!`O*A#G:J(9F<+'K"^NT4" MXJ+B0JN^",-T3X2M.%EW#_=;1,2OX\?Z%%?>':>V]_EW=3R7,V0\I[0EN01F M6]SN3#CG,^W/\4QM11O*WW'FOKYA8+H@&R%:=.$1%KI$28!E@>05?E\)F7RI M+/(`KOF,SE8KR6*&'&G"Z\)9JEXF#.'HBY2%0EM MKK!-^@>_K[E2]N0%.0E'(LZL`)I/>!:%=2_B7Z)##(,L>B#FD_D'$X)OZF)* M^2WV"3$8_H(?KJPK9K#R)[KO3RGV[[)9&94);2+87T``;L!.,EEP4@6J_P#P M*`@:L)*)Z=H,N$2E%HO,O:*^.GH65I/HBDS[AKY,7MI(U@?P_4^MD^4PM#C. M*1A+G0WZ<@1$L?`]QO-;\C07\ M&JF67(9=>"Z^-A!+T@WL,N$AR3KZ[]N+IAWSL(4"4Z5_`J(]$P9@!7-XC)%G MX8#T#/847\52DT7I7L60>$EW_=U<`Z?%50:6_=JQC<#;\(O`6!/?*K&=[+,4>7FR.\;.'+V&B6DGTZLAZ"Y- M@A6P9)0X9'X#,*^)^.;+J-S:,>POF?ET6J5KL1GO^1ASQ#YWFO%.Z!G:!FS1 M&-ARE!J09Y3H:\[2V)YS\$K%YNU7Z!I0EFJ%X`7ZXZ]+O;SF#H5,\/'J\U#\ M=YKS4/X/(+.?XE(5?)0^DAN]@#XXFSU]&5K2NDXN0/]1[H3.)R0,!JGV)*<( M\K$?Z2R&FC8.T2GT>.*HHB`XGZD6\4;*_>/Z:*T")GI4Z#T]@RWE+%^9F-1[ MUP%%_/B]Q9VSG_,Q>N]X4>?W&2OZZ)3&$A?M(YJZ8R.'G?(<\;42XD7AF7#? M#^/K;S\*CZ44]^9[#(31]+]/*H^&+?[3;I-7W1ZKHCMP]6/*"PJ],(.8/%(# M&=R'G7L=_'R^!).YSOR^"0^U]%@";@&"+\6IXQ!2>7GZ;(8^%CC,IRD,#LPD MYQ^2+:`>ALHSJ-A1&M!$=GB$*Y>7P[N/)N!J;=IWYKDY,Y#ONZ4LFGITF_H'FCT?[,X`JOGBM0%KXZ('L/8U"&I&!-Q^Z.W/=MT\KBXR7(GC@<^P0B8]GZ MH:);=$,I"64TYT65+34*R[C+RYX'`T'9G%R8-D+)S MS1R\#@Y6WZ3PZB;!]Q6Y]KB`C0(-D=RY$@*-&H%G1R)$D0!$E;Q3:X$`6,+6 MP*N4W1M`*>L/VO%PCS-`)GY==@!=,`Q^/!*B"5AH/`0$T[*E2#%INX8^GF.` M:M'AM5AEF+*2'AH57_Q%#L[XF M?N!K\B99`][8!.[V)14`Y1B%K;*GDB^S%T^;>['W<3"15U8_]@R;/9RW.A;X MME!7:7)\8#@BD91].C5+MB=_DD2Z2,>E@!PB$Y9`0)7WTS.;%56F)K^.L4+Z M"HNRF6^.E!2@(JG^5[8VIH9?KSAS(_R5Y'TRSY79;&FC]I?)_%EQX,^TH`-D MZV=9H>@;R\L"LVK;`:L?%U7]]_F,B#]?3IYNZ_$T34TOS;EM[%]#'#"7L'$K M;_1('%G\!#:?<&K00-KY*#:@\R1CF\8-"]>3@UV*QL%LFP#C17.3X[=+Z/^3 MZD/!2\%WTNGN&#E9XV/RD`LUHC&%6IGUW)_V/M>#\K7B"DBL2H!S,NR&9*&E MP`V.*P]%B%4H?0!T%`*4A!5)/J6199+P$E7.,%MP=!K*@0`&_^<8.OMGF8/[ MMUV9%SD!'%THM=?_7^3K=N!14WE:9X-L%'^5\@Q2.VVV"8D\UY9`W[TEOZ.D M!S^B6NCAD]J%13G/H0%K)A)TSON\``3*@X^GYZ9FZUX6TZ"//_J0V\1K3P5R.GAD:^6X`>?]?!A; M/>7X\&NR_IIIE^]).^.<(S)&@J7\>ULO.?*%[3U7HFE0T3S@$^\UT6V1 MX=S^9YH,?`/LI.U>9/B0IR-.V6Z1'T0C3W;$>PCW3R^W/L6)^P:S*_8'?1\W%SI1'0`@"8`6````!`!````:BAJD=:SBQ\/ M-08`(````%-61T$N2.9CPE2$#P`+?]AG).+X'CDS]`Y4@T_@I+>;\5;A3$%2 M318L9E_E;%]C2_.,[:*60"1'N._OJ`C%*"8VR+\0NL":&E_:\*:PP1B%C/I\ M#'P*.,#1BC?X]VX3,'0`@"H`;@```+T!````0I2FGJRQBQ\/-0H`(````%-6 M1T%'4E!(+DB!Q6D)!>K29Y^7AT@C M'>TK]Y,-V04M#%)4DLGZ2(YD4@R#B"YU3!:Y>$>5KLX0D>("B%-,$#>?="B;6D3^QY0!-?'D>?3=^7C MNL<#O%U]`.**9=`"`*`#%````@0(````RH38) M=[&+'P\U"``@````4U9'02Y)3D/-MRE,,".):\:8TDDA-B7/A?JQ>W\!P`ED MJ*WBX^L'<[!909S):3R$<^$$CI^FN8#LMM*,^87^JWEWC-':^@(S^[_S[!U\OY? MH;4"$)Q"O?\`?E=-)>`2,,A`_GT?,3N@)!C[$["`D1^"WE3[_R)U=`K11SAK M&XZ98YF.YACOOIHYD12@5^(D8)4.HCP&-YU)(A7BPWO+QF9O[@)CY&:.@WS(/'"*B[O``FP97EX4M/$"PCD9$GB87Y>*^\ M_%%T`(`E```!``!-`@```%A$BFL.HB<>#S4%`"````!205,N35K7J7:.N3Y\ M[/2@B?R=@:+7<_+R`\Y+^7(HF5_#X'J#H#RA,6\8TM^7DZ!%B/HI/[7)M7M" M/+-2@&B2_DYOH#/@<2/IJ7GO#Y&--#9]>L9@\THOA&V3$%&=7`@1Z09V/`"< M2S-X1P*<*'3IR;."E%=X1W,PE-V*S=._LYVG\*K<^H>@-VEZ"H(]$H)3^>?B M.2\2$(=A$;O\I]@\G5'?$VCW'KP(X$)^B^7]T[0P<'](>HAAP0+?S1989M/Q8+_'I<,PX_$!X#L]_.ZH+99-,E0$?``R>O` M7*WMGLN1?=&._G-E2?N>3@_X;JGF&VUA(70`@"H`&0(``/,$````Q<.T=LG'S:KQ!D!.:#R7F^?.&]YJ)A?F`^IL%[D!;D'W"P] MAKH]CMS&[@SQ8QY:N)KWMKV[\'ALQY8%!:/C*9O`(!J,:D!$]E[,TSJ#OH:@ MZO2^IAM"._6E$:G2N;0Q\D3[R(0@]�'`S83675GH*=Y%!#A[3^9\7B\@,T ME<_R;C>7^I=*>CW%XO[@\9S7W!U]QX0!UT...M(LG`(KAW]_A(`$'U%IQ2N# MR7%A:9QHS^-FT9,">/M%E!J7,3'EN@XOY8E`-1\#Y4$<#4)[0^*SP`;`AJ&+ M58/UF`N@35U0"Y<8!O=[,[F)M*D@2QE&Q:_.>FJ":06"G/S`74KB/&M/67-P7FTVGJ=F>HN(;N?\2%%0&J4"$!4$R:FR@C$ MTL@Z*R;>BY,=VN\PI MJ(/))28029)D5!2PRC5A6+N>A'33>:'RPGF/PJ:FPQUJOK)LE#^\!;HR($+P MP`>QQ&&+(?&\_*KQ*ARE]D-,<'3"B52''&7WE71YL\#YL!+"H>2]%,@_3J*_ MP&`&*L@+V\(6H1+,%C"D'E?^]?Z+>.P23!0G6G\[GKI`?9Y3PE"?4`1RHV%#Y.);STHC\+OQ>56-.[E@[!Z*H+&ZG`7:F3=/Z2UE\=H6K3:A/F]5A)+`,H7G(X`TQ M)^U20-?QZF^^.B,"RCY]DGOJ$TC.<3N4M"Q)3C^V%;$A8,?6"+*HMIXP2\;S M2V<&+SW,#-W],WDX1]`C:@6)6O8&9^&Z0,(/[9?W)POI<^\$DA!+.7]D"PI# MP;6"0UCF,>/G_'W(H1GI'0*KS[Z\XDO@6<'!$]HO\4[T9Y4&K""2#2("P@4" M;(O[;'3#0/>NT:BZZ@V1,=6GH4>&&4OH^JL+\$H$6&N@)8&&`\B@_*R!.I$_ M+L-D0*[*5'EEHNB-3T9ZE&`1O0)+"$02:ICZB2(F/?ADS`X0.9WW7.;F7I-T M`(`J`#0"`````P```,YL#?Y<7TP?#S4*`"````!#3TQ/4EHN4$%,SGN@&?4T M>E$_2:12W0@TISZ#_ZC;L2]+H_%?QH_]P'[V?I',_"_;8?ZK\U^.^G[]'G*? M-?)VK^CYCE_0%'Z81_$2S];/RJ;[[]E^FS7UGXKZX2//I_!P_(^N!Z3S?[/M MO,_<^W\H#Y[W'C]'YWMXN+J\??TA"#9+%_]_3^#W/R_4#U'PX//,^<_C.!YS M\OZ#ROV>WR'S?!X?.47DG9GB2DEC9"+FHC^)>$_21@LB"(6VN8W*7!=OM)(Y M^^2DC1611LQO(1D7VW\I;@?Q&+=`J742#-XB%W^)@BES`XNL@;=Q7\@$1(5. M97#MXF(3`_1$-[&Q-?FVBF37 M5PY&1`"`-+[]TCOA=0ES@,G1P75AH&S@@/.`!Y=,G.E`RSUHR[1UAH*UC>3* M_]'ZXW(*\6R4P8-&;MF%"7'>R>9R)&-'9B83LQ?6;Y_,/%97]'&$XB^0ZGZ< ML4X5`=`#/P5K+19ECIHG8*ZE1^47@QM_D[RHF,5. M.J=ICKHV_N(!]4BTD[0E\A"2&KL4=%*LCSAF/@,Y".PR-)X[4OK7*'6EV//9 MAX"<&&X@`]*4E->TX8,+DSC8*RLB$QH)J*'D0&=+!9J)',AK1S$AEEU\;@A9 MG/WS'JFNMU(X>6$;:Q$.I4)T>$ET`(`H`,L!```X#0```)?QU'YD$;,>#S4( M`"````!%6$E4+E)!5SR35YK9AMGY9"AX6<_;9;V2)/_;?U9B1)X\5]WCAUL^ MVEMUU2'R+5M99W9[`V%SFR53LRG,(V5MQ?J':QMAK>-@_ZVJY1_0; M5RN+T$3-Q11.<3[B8>4GN:*C<0;A`]TYGOC7U4^1(*M;R>.)_O9^9D7$:<2Y MCGL$M:+G.(?5?_/:A M[2W$[A[N6NC]6X?U1-K71MB--%D)BF]&`!Y%!-3^JW6`^)>L8BECU.QC("BW M7I8WFBF]7IXTGN\$UPO`U`/0?['F,U=QY)I M".-$8_(6LWD7@A->/Z._W=Y-Y3X@?&DL_C%@TS>D:>PC)>E3?E0WDO(L59)( M`I_$ZC\Y_.LE3L#;]\AK/Y'H?.#14O(//C='K9P+_L[!T!>]:":[?KBS:RBH M))Z*314!Q*3%-%5W@`%21#&2$086H(I*4E5."&GCI:4D;`O8K9(1KO4-]A+9 MBXG*L%[T=QE]Y4G(F8[])2N3)SMWH!@M-%`"!>U90:"8EOZVQ`EG@NJ0?6%V M4#;3[OW'0W%K]]8AG!^0#G#6**M=.4Z8[&GA[.UHHY6#U&)NNG3''ZW&Z)+ MA&)A"\>Z)#PGQ\(N/%?353`>'(:U.TS<=;@N0*B@G)R<"P9T`(`G`&(?```@ M5@<``!XOJ&TEMHP?#S4'`"````!024,N4D%7`0,4T$<8D^8>\P&^5/X_C>+XOB^+XOB^+X?#X?#X?#X?#X?#X?#X?#X/!X/!X/ M!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/!X/ M!X/!X/!X/!X/(1_@B(G^80'R`B)J;;RP"*7_GI9-1^HE2/4RD"%XX/C`/L?^R94__?<*/>0)\\P*/,!W/4`G7/A@GT#U_V M4A]SD!?,LWFGRHI!K>@%/F([DWJ9_Y0#S5R_[CW4DCY7RHH^]Z@*CZ;XLDXL M>:?]E(9>R'W$AU\I?)LWE)1_K`K/1_W'QCTDCO$8^3\T*/=O0"T\F^ MTP!/+_O,Q[)N>1E\GYJ4>[2C^+F^+\H*0^A#E_Y@`S^$/CX[@^/DO)R3Z!CC MR.;W7<#GRL%+_O4#CI_9MP%%N('?E8*?_9*"/7!V] MCLUV/O'(L\2+?+C`G(?/!6,E<.Y8/[23W7B9P^$H.&1!+_N/8 MLD*$DNYV^N[:`4:`:[`E^7DG^0RW`D[P5XVR#78Y``-H94KP'T\W*+>'65\0 M$3K!-_S`!]&(0##HZNL"R!0FU`/X$"NLA7Y(0?P M"KV(68^-W&RR!QS,A=!]/CR$'_94J7K*_D8"ZQQ^WT9;K(D(/=AO'XM<^I^*&WJ%T*^L1`/*?2I@_]D'_;"$$)/=XL3U$[NZ` MWT2=[#U7V2!'DI!]/S*S\D@_@D(.A$[?=OEWO?"0G]R_[TG)>R_@5CCUNA^[ MYLM-Y!T_IK()?$L'X1!_D0@Z$'I>0![2]W6KHYM#?4M`#PP5,!`_]E1O:1(" M:4JBCN-^_!`EY#W?2\9>)I>+ZY5/.YW-)_(/!1'=I'3U?I@3^5\S_,`&7L>T MAWK@CS>?]QAURY>'TV=LEOXKJ8[V4_CZ?LACTSH_'/Z@`XN M;N:E>$#[U%9XCQT>^`-O%#%/B!(/+B'_^8`.*F]@[/89I>G'X\M;\RR^@#O4 M6&U&7A=0`>$3_[$@E_Y+WKF)#W2;7RFY]SB:=:*3M*A074`#[.X9<_[$@F_\ MW#A[WK`4_G>[Y(XY>3]?)J[HCW85"EY!L?B!(/^RBDO\-A(B?>\JU#N4SX^> M3^$(]U$PN^([X'-0\J$@[X!AOK`5F_[CYOODU?.ZX'`2*;G[G.$!R;>G^T1_ MO$PI7OB/'_1A(.`#74>+[_D+_E1>W#?]DP/B1(/-LB"@3R?4)#SRH%73CV=- M!Z#+0'A``^-TD/)\*`Q[>)!_WLXD'$1_T!"IVJ;O"^-4;CZ=Z$\'S<2#SHA__F`#ZF(]L1S[2B MO0HQN"@'QT5/`$KD6_]#$=V$?[#\?>]OL\'X$24Y$W_,_["A!-_Y- M_W-_W-_XVF_[_["@F_\S[H)S>?]A0S?^?]A-_]A03?^?]A.H?^PH9O_/^PGY MO^YO_*:;_GV\+7RQ1=_V-G_F`#[\%![:74#YBK2_[&T_S`!]["@]M.Z>9H]/ M^QM/\P`0^[A0>WND_-HBW_8VO^8`/N(4/N>)GYO.WL?^QM/\P`?;PH?!+_V%!/_Y_V$_Y(3A_["AX,__G_84'DA-^7_<__E1+ M_O)?^?]A/^E:`6"_["AG_\_Y"@\Y('?]C3S_^=__LM__V7!F_\_["@\O)M2_ M[43_^?]EOYO^YO_/^PG>)Z3R/?^PH9__/\@GO^PH)O_-?'P4?_WYBPR/8^VU MKI_^_/1I?9B$M_F,Q2_,GHEZ&6)CY_;6L_]?M1"?\<*'UWYKR*O1S4_IX3_Y MA<&_I^>?^8%!S"/-!>_2UHLW_?JPTON!"IE[4#WZ4"9Y212]M]=Z_["@\\*[ MWQD27BE_WY$$SRK]$``Z!,.*!]N5N]#C!? M]E(/'*9!.>:!!6!OZ2&5N4H]/!AZ`\^E@F'?)2:7`.SV'VQKP'77_8T'EH7) MN1E^CZ"#J9EYUQ#JOO8?0&FG4!I/_WY6%S7F9?H^@@ZF)>BC>2&FI>L<@'I? M]]X+FK,2_1]!!U,2]$Q7DJSGUCTSJ;S/[BW%[:1MF^CW.X.OFS(^;T'R9NS+ MT1LT\@K,\X/&3?H\2-IC$R]D]R&?0/?QGA>87H";`&>X)GYCN1O@H!C<./V/ MT+KV$:#1`+X0^'>*5\0#P[@9^0#3XC2]\';B+;U!E>"-Q@.4/1RKVAG>]#/@ M`TE&[)]9(Z="4/OH$SH!I0?I'YXT'$D*E(\@22Y!SZ@'L;?19,]X.CQQ(-`+ M^`.WDHC_$F>0'NA,_$"0R"0>=N*RW?`!YH M[.N,]YB,@'U>D#3R0B[X;;!#U@[>00`;#GD>$0'R!203\)[X[^Y,PNX)!Y-" MS+=XMEUJ*:2?RCR[$<\JY[7D@RG?#^Y!S]9YW?6`;UPEM,=?\1"O$(NAZB4O M4)#D';R`D'`Z.R#F@4/'[ZP>ZRA_G0D!'='OU'\\4WX/:'/W2$(^`#BW MJ[I$G42`?K;&>"&SW$N]<5\8E_XHD&@!Q3O.F>ZZ2P`_NUY[OB0#R]R MZ@(.@.G648G^K*=*//BD?%KCWH@3\O>NX<\E]3/WX[S34WF]DW*-#2]#@.X_ M\E_W'FODY%V7RN$[X3\OIB4?GYE7-Z'+WXEZ8_[CWC75O&EZ(F\],'^:6(-` M7O0@G_?PH"7D1W4,OF^QVI+Z0E^L?$]]&#W@G_+PH54_TF[)1^0-[L`#Y1[3 MHI\-E7YB=@]9"@X`F<08/-R!L_Q2@E'VO*8U+_OJ&'R7FYA*;S95Y\$_+W7& M[$G?%'=F^:YYG/R(Q-\SX99CS"@\:/DO)[\Q$P'ON/!30!?Q!W?`(03^X M]PU_[F@4\J"@#Y3[75Y,,/V//?.3"G@EXNZ##YF$YYX%`'Q/)T>8X*!W[?1( M_+/)`/&*;^<7!0#0BI[H_4T3JQ\_C>%`C[`3/!ZQGFZ5CRQA[PH./?[= M2\X\;X&QQ)`>F-ENH$CVD*#K\WZ#XPR79["]J)MTMP>,.Z@*.(%O`'8/0VCS M]>A\+D[X`/[W-Z]UB)]GM#.X%N(\I!,[A+#H#8H]#"A3!]Y"@W'1Z`'>&(GS M\(7KN0>1LG\O//2/$!V\HQO/!8<\`D^_YDG\&HR[[^=\+["0B1^A!0HO>@H' M?LHDHO^8`/P03_=X/7OX4'E/[0!7+_O_,`'UTY-[>3\\\@$>U!0>W$F>?+_N M/C_<"?GFQ1[N`43L__?^8`,O\?)=MJ7_9>?_SUL*'W$CYZP>'_["@_S`!]0" MA]S(^`G_[R?_R7NU!ZM4B]U$C_[&IG_[SR(D5Y-_W_V%#/]1[L)#_V-0DF_[ M^H.`R_[_S`!E_WP!&J/^X/\__G_9H'P@1/^I;T__G:CW[YL*#O_.$/:A(1?1 M/_Y'_'U@4'NHD'_8TLW_9)28N7_<__DO^^\M+@Y?]S_^?KA0S> MC>\A/_E+_O_,`'V(Z#Z6U!G_[G_\BY?G7YS;&-24,O^]7/_Y^@%"@^^"?G_[ MGY__)?,[$GI?]S_^'I?]]LP:7_<__G_84/2\?R23WT)__L*#_,`&7RO$DW>2 M_[G_\_["A[`A??PG_^PH/\P`:*7R/0@Q+_N?_RCE_WY`)^7_<__G_84/44$Y M"#X()__L*#_,`&7Q7=()R]B-?]C/J_\P`1/+_P!/K03PA MY!_V%!/_Y]Z%#Z0=R\8@9[X(R'_L9[_,`'RLK?Z1`3\<@5_V%!_F`#]4%"/Z M.8T^A"?_Z^5`?Y@`^>!0>?_)>_%("DIO^_\P`?\PH?($`??Q&/^R#O^8`/FX M4)`?3\>?XL)__L*#_,`'SVA'YP%$W\B"#\@%!_V%O_V%#Y@4PG\V*H/G`G^L M(GWT9W_,`'Y8*`[XO-@0_(`8S?&_`#/?Y@`_+A0A.^9`J>1!R^"$5YCI?]D- M?^PH?/RFYGJ`U^?"?OQ9[G_V0U_["@]'"A\M!Q>S?%G8_[_S`!(OSX,X>C`W M_"")]!LO^R&G_84/K)3[Z$)\?GW_/?-2OI!!?^QK/^PH?>0H/'/]+_V-7_6`#/Z5]F M$_HK>N+E_W/_YZ4%#8'7W@3X?#(?_]C4_]A0^<^2Y^L`1&O+0O_CR/2'(3'_8S'^80/GH$/VU;7[>83/ M_YCY_X?JR-?_8CL__GM($7UQ&3P_]B.3_^>S@0_8$7Y_^\[/_Y[(!%\B1:#_ MV!!/_Y6S_!?'D5?%"EG_\P/K@$/QQ%#P@JO^Q%_\P@?80(OA")7<"O'#_V!! M_F$#[B!%\`.)W@L["7#_V(G_F$#[$!%\L6X\@`__V!!_F$#ZT!$'VP6+T`!S MJ^LD?]B'_YA`^K`1L,CW(;$/BA<:A._]B%_YA`^J@16&/[<-7XP70=PG_^Q" M?\P@?4@(]0Q?C0'/%`?_[`@#_F$#ZN!'P##]E&?\E"]Y!1?]B!_YA`A]+`DZ M@P/8!F?*`O?81N?\P`?\PI>\!V'UL9'RL#_VIBS_F`#_8%/XH&OKX3WEH(!3 MVMSQ_F`#GL0M7G_.$\H"?_["@.?Y@`^VE]O=V8G,$3V1BK_F`##[0%#Z'Z5Y MW`/_^PG_\P`?M@H?1^JUY+UUEO_9+C_,`'ZP*'VB+Q_V$^G_\QD_V?M/M2O_ M<9V?_R?WSYXMVY_["?G_\G^Q]O];1G_[FY__/J3\7N?D=\__<__DK],%#[M[ M`;_V?>G_\G^A][]0JG_^PGY__/A`H/-/S=7L0TW_9*S_,`&!OZD@<^U%,?^P MGYO_)?<=#V8:?_LE=/_Y]8$][2-1_V2ONY__/J`'_;1J9_^Y__/I0'M=[@)5 M_V2PG_\G]Z#"7\RH,?^P()O_/@2W?AES_?!+Z7_LEI_F$#[P=8^@:3?]@/S_ M^>^M]BN`FOBQ-O^R6_^80/LS*GWCXJK-_YO<],*?^R@/&O8@_UT__F>F%0)_ M2S?]A03_^?O&8O0/8!?^PH= MS/_Y+]ST'`B_[<1S_^8>?]KT3+!E_W/_Y+]C[O3/\!/_8$$__D_Y_I/QWCWR M_[G_\E^EZ7X_?_9F*8G_\G_/]/^48R_[G_\82_,]2^"G_]@03_^3_E>SU3ZW M=+_N?_R7V/D`'_7Z^'Q/_YD_T_K'XJOFR_[G_\_#`@]:_&D_]JH\G/_Y]Z!# M[#]SG_[`@G_\^Z01^R?1!);_L"&?_S[@_]F8I?^?1`/>GWS^5K_V!#/_ MY'QN"NS<\>G\?V81;_LD[_F$#N_=0"9=P]XH$'M(EW_9+4W/_Y\``MY0!![6 M)S_V2__S"!^I`?QWMPG?_9,&?_R?Z7W$3S_LF$6G_\^&`@\%/S[F)[_V3#_S M"!^.`@3]`(O=1/?^R8G^80/P`$(=/)>KT]?PPD)E_W/_YT9>X\@IOD@'YO^_ M\P@=G'QL_R<__*PE/IP(/^STG^80,>\;^?ZC_L"&;_R;_O_LO%"3?^3?]_]F09O_)O MR;Q`0_/C_2_[_S"!_[`@_[+Q:";_R/FY_JO^P(9O_`3>_W\_L>(_[F_\?2]^ MOY_8\?]@0S?^-IO?I?0_]EXI?^3^\9G_L"&;_S/S3(/_9>*=F_\_[`@_[`AF M_\F_[_[+Q-YO_)O^_^P(9O_`3?]S?]S?^8";[^_4=QM+_S)^7YG_8$,W_DW_ MS@/S?3/_8$/^:($Q[,`_]*!!S/( M?]C1_YB`S_]S4>!X0&D__F>8``>(`\3^E`@ZP"O^P(?\Q`?0S#_B`/S_1K.T M`G_L"#_,('S\MWU``'8J;J^V`?_[`AF_\F]%W`!=FS<_UYG=^*!!+_O_,('S MX!^P`31Z;OS?:=@3LW_F+SRH"!@!&C7V($/'EXDO^_\P@?20()>-6?:`/_]@ M0S?^?]@0>3%?I_^]1/_Y+V?YP"#SP$2?_S"Y/Z']N`__U]/SG_\(]G`G^;)O M>3,AO^P(?\P@?6@)/N0'Z(/_8\D__GL@$7S($'H@Y.>G_\SSX"'[P!^7_:N? M_R7L7W0KTO^Y__.Q'GWWP$'DP6/_8$,__F5EZM]^`^'_IY?/_XZG]>_"`@_[ M(AS_^3^N?A`/_U+_N?_?*XK%_W`0>;%9Y_^_]`'[OSH"+J_T$/Y_^\E_CYT1 M[Z\W_?]P$7]`$'G9.*?_M//_O/_?YZ"_/_WA>;]CS\F]-_W-_WX0!6#E]_Z" M1=_[`A_[-!^(-3-]Y.>A"MR_[_U=B^`!%Y1\V4^8`@]$%93_]@0YXA6B?R^; MX:Q]&%8E_W_N!'Y`D1-]OZ.*L5_[.C_]@1>H#@_!@0^DBIR_[SF1XGVH$'I8 M:4W_?_`$7-\,C)Y@2AG^#],#0E_W_V!$DEY1],!!Z<&=-_WEIX!&+S`!^;W_ MU`,V7_>=SR0E%XH"\WPOJ(9_G)_@_5`R9?]BYZ:!!+WKU M4,B7_=+D_H?P0X/JX8T__=1_R!%Z*!!-\#ZP&++_O#9/Y\Q._T0'Y_^^7D_G MT$\G]],D_JA7_\Q`?V0(;$\_1&_F_[9Y&A?@?8@06GKX7T__?]Y:V7,OG2\> M8\1_?T2+WLB8/_,0'`^^`/]H$?C1>?=AYA#3^!`@^W%EG_\]]`AKIJ.^6CS' MF:]_6`?-?]D8OY0).X!"@%Y9`FIO*&*1[\`^8^\%H_S$!X/OH$?8!#0#\K\P MV,?VB+VZF_[_I`B]&`@]\1J>T!:_]@0Q_UG;`?P!!X0%,WQAC\86V&_S$!^) M`B8$.0'RL`>E)O!_O&_E_W_P8&:*\-:$GRIGQ2IG^(#^,_[`A_2`-\8+L"#_ M&!$6A&R;O^_(X/<1*_7_V!#^($#41W,$J)\GB5T!#`)OHP(/#X9G__L!__L"'^8"J@,.H"#P2G_Q8#XQGW M`/O_L"'],(%E]NH"+PI?S3_L;_WT\[_F$#'L1%ZA?OP0(8[^3X:;+_O_,('K M`?P+YUF!/GD+@??1(/^P(/W@'_*[-7ROX^W_$T%_F$#ZZ!`?\W`CE_WG](#\ M`A[$LU)H`9^Y^",G_[_S"![P#\T)]QP/R]`!_[`@_[)1_X`/,<&?P'/T%^Y] M"LG_[_S"![P#]$89RAZBIH"Z_[`@_[`A_X`?:%2TM]5!S"\^2`@(_[.3_YA` M^T`/\0(_%`0?#",6$__?[@#LNLM/4OE/\Q__L1?_L"#]D!R;XH@K`A7]G MPRCY`"#X!FW/_W^L`_+_E(<6T4U-O'Q?A?RP/^P(,_B(M2ZVZ`AYW+Q/^Q%9 M?]_=_N!`3T`5[_]F'_L12?_M[_$29EFZ[?`!7O?PX?A!%/@U0"O>`AG_[HG\0/]_^Q M$?^P((_A#P^#G\@C8?7DCS_]_]@0R_DX@"^$!<2`1__9?__L"#^$"'QALM`C M_C4K_V7__[`AC^#QR*6P2''VO_8$&?O@2>0*Y9"0P!#_V5_NI?]_Q!`^`!!- MXO_8AO6:3IIO^_]0(-?J=WPHAOQ2%*?_O8?U`/AZ_X(D3\8(9\6=4\/_8$/Z MX#_D@$$WQ!FXE\U+_O\\!_L(G<0'/^P(/^P(:.7_<>-#Q\DJ^.,L2_[_5`?\ MH'`_[$'_[`A_[`@E^P*/_L0;_LC%_V`^'N%KOG0(&/S*#O_L"+]\!^?_O_L" M'_,($"]]KQP"_^P(/^P(?\P@9_(Y_F(WYP0#_L"&_T0"#X02OO80/SLO_VS_ M]_]@0?$"`?+F49_^Y_^P9+_N7_>:WU4"+_M>W^L`_/\Q]&GZ_[`AJ9O^\_#- M3_YA`S>;JP_]D7_^P(9__/IAJONT>__9&+`?]@09_V!#_V`_]*AV^I/EZ:?_ MO_L"#)?]_R`/^B;[*;_O_,('_L<#\H[G/_W81^']&[F:WQCZHYM_V\]G_\]3`'EWX/ZLZA M_VQ7F_\]4`)_!`@_Z86+9__/^P'_^QPIO_)O^_43=;G_M3O/_Y[`!!]N;L_[ M2\3_^8^?U[[DS;_VCYG_\];`A)__)_09_WL%_VAWG_\SU"+A_V"< MLF_\_[`B_[`DF_\STX"#I?]@4S?^?]@/_]@33?^<3/6`(/^P)YO_/^P'_^P( M3,W_F%Y?]]R7_F>6@0>C@K_]G4Y__"T_Z?I8_<__<__GZ0$-!Z6PD_[.HS_^ M3_I>EK*O^SIX)__,R#P>#P>#P>#P>#P>#P>#P>#P>#P>#P>#P>#P>#P>#]\C &_L(0_,(0 end ############################################################################ hogyan kell 640x480x16c modban beallitani az elso 16 szint??? mer valahogy nekem nem megy.. mondjuk ha az hatteret beakarom allitani akkor: szin=0 mov al,szin mov dx,3c8h out dx,al inc dx mov al,60 out dx,al mov al,0 out dx,al out dx,al akkor ez most pipec piros lett..:) nade..ezmeg jol megy namost ha a 1-15ig levo szineket szertnem pirosskalaval feltolteni akkor mer nem jo? nem az elso 16 helyen van az elso 16 szin a VGA palettan??? hmm..hmm.. lehet egyebkent hogy csak a nyomurult borlandC bunkozik bele..de ha en vagyok a hulye szoljon valaki .. ne szenvedjek hiaba ! MonK ............................................................................ OK, ez mind szep csak nem eleg. A bios-ban va egy funkcio (int 10h) valamelyik buzergalasa, amelyik VGA-n a 16 szinhez rebdel a 256 regiszterekbol... Bocs, most fejbol nem tudom, de gondolom van Tech helped, vagy valami... Alex ............................................................................ deazert en arra lettem volna kivancsi, hogy NEM biosszal hogy lehet persze biosszal lehet .. de en ilyen kivancsi vagyok.. vajh mer nem jo ez igy es akkor melyiket rendeli melyikhez? ha van valaki aki nem bioszszal allitgatja aszineket az irjon.. MonK ............................................................................ A BIOS-szal csak a sorrendet allitom, be nem pedig a szineket. Egyszer megprobaltuk kitalalni, hogy milyen sorrwnben vannak a szinek...Brrr Szep kis melo volt. Nem erdemes hardware szinten a sorrendel kulon szivni, van egy szep BIOS interrupt avval beallithatod a 0,1,2,3... sorrendet, szerin- tem ez azert kivitelezheto, egyszeri BIOS hivas megengedheto... GREG ............................................................................ SZUpertitkos es megbizhato??? azzonalreagalo forrasim szerint: 0-7 es 56-63 :) (koszi TEEM..;) ha tenleg ez akkor ne szivj tobbet a hardwaresorrend visszakeresessel.. :))) csaaa..aa..a MonK ............................................................................ Szepemleku Sledge Hammer c. eposzombol idezem e kis rutint; Olyan sokat ritkan karomkodtam, amig Greg/TSI telefonosan fel nem vilagositott (akkor meg nem volt Net). Kinomban mar egy grayscale csikos kepet raktam ki: az also 8 color jo volt, a tobbi meg standard colors' mix... Na, valojaban arrol van szo, hogy a BIOS "kezel" egy virtualis palettat, ami 256 elemu. Ebbol - a screenmode-tol fuggoen - latszik 16 vagy 256. Ha egy szint allitasz be BIOS-bol, akkor nem a screen x-edik szinet allitod, hanem eme virtual palette x. szinet, es ha szerencsed van, egy, a kepernyon szereplo szin epp ahhoz a virtualis tablaelemhez van hozzarendelve. Szamomra esszerunek tunne, hogy defaultice az elso szin az elso virtualis palettaelemhez legyen rendelve, and so on, de a VGA tervezoi ugy ereztek, hogy ez 8 korul kezd unalmassa valni, ezert onnan mas fordulatot vesz az elet. Ne kerdezzetek, mi a lof*nak kell igy elrejteni a palettat... .code PalettePalette label near ; indirekt paletta rendezese lea dx,[Greg_of_TSI] mov ax,1002H int 10H ret .data Greg_of_TSI db 00H,01H,02H,03H db 04H,05H,06H,07H db 08H,09H,0aH,0bH db 0cH,0dH,0eH,0fH db 0,0 ERN0 ............................................................................ Az a cseles, hogy az EGA-val kompatiblisnek akartak kihozni a VGA-t, szoval NEM az elso 16 palettaregen van a 16 szin ! Az hogy, melyiken van az ugynevezett ega pal regek hatarozzak meg. Sajna kivulrol nem tudom, de majd megnezem holnapra. LGB/DC (Digital Creatures)_ ............................................................................ Yep...elhangzott tolem egy hamis informacio, ami Monk segitsegevel a CODER-L -n kotott ki, ugyhogy most egy kis korrekcio kovetkezik. (bocs Monk! - gyors info = hibas info ... nem cafolok ra magamra :) Szoval 16 szinu uzemmodok eseten a megfelelo paletta regiszterek: SZINKOD 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 P.SORSZAM 0 1 2 3 4 5 20 7 56 57 58 59 60 61 62 63 Igy mar menni fog direktbe is, nem kell BIOS -t hasznalni, ami (tapasztalataim szerint) lassu is, meg villog is (=> no scroll, no fade). OUT 03C8H, P.SORSZAM OUT 03C9H, red OUT 03C9H, green OUT 03C9H, blue ; es mar be is allitottuk a SZINKOD -dik szint Bye mindenkinek ! /\/\,/""\ (@.@ ) ( ) TE'EM O^O,,;O,,',,,,' ui.: (((((miert van ez igy ?))))) ............................................................................ Azert van igy, mert kompatiblisnek kellett lennie az EGA szabvannyal. Ezert az un EGA paletta regiszeterek (ez a 0,1,2,3,4,5,20,56 ...) egy EGA szinre mutatanak amibol 64 van. Nos a VGA-n ugy kombinaltak a dolgot, hogy nem egy szinre mutat, hanem egy VGA RGB regiszterre, azaz duplan van indexelve a dolog ! Ez azert kellett, hogy kompatibilis maradjon az EGA-val. Ha zavar, akkor modvaltas utan az EGA pal regeket kell ugy atallitanai, hogy az elso 16 VGA rgb regiszterre mutasson, es akkor lineris lesz maris a dolog ! Na pa : LGB / DC (Digital Creatures) ............................................................................ azert arra megiscsak kivancsi lennek hogy a 6. helyen minekall egy 20 as???? hat ennek aztan mar tenleg totalsemmiertelme ammeg logikus? lehet hogy 0-7 meg 56-63 2 reszletben. de az a 20? biztos ez? hmmm... pedig aszthittem mar tobb baromsagot nem fogok megtudni a vga- svga-krol dehat tevedtem... ES hany lehet meeeggg...!:) MonK ............................................................................ 0-63 az 6 bit, ezzel ugy lehet direktben leirni a szineket, hogy csatornankent van 2 bit, egeszen pontosan igy van felbontva: R0 G0 B0 R1 G1 B1 Tehat az 1 azt jelenti, hogy B=10, azaz 2. Na most a tabla (->fixed font): index nev ertek binRGB->igazi R G B 0 0 black 000000 0 0 0 1 1 blue 000001 0 0 2 2 2 green 000010 0 2 0 3 3 cyan 000011 0 2 2 4 4 red 000100 2 0 0 5 5 magenta 000101 2 0 2 6 20 brown 010100 2 1 0 7 7 ligray 000111 2 2 2 8 56 dagray 111000 1 1 1 9 57 liblue 111001 1 1 3 10 58 ligreen 111010 1 3 1 11 59 licyan 111011 1 3 3 12 60 lired 111100 3 1 1 13 61 limagenta 111101 3 1 3 14 62 liyellow 111110 3 3 1 15 63 liwhite 111111 3 3 3 Ugyebar R,G,B=0 es 3 kozott valami. Ha most a brown 2 2 0 lenne, ahogy a 6 illeszkedik a sorba, az nem lenne jo, mert az mar nagyon vilagos, es kozel van a 3 3 1 sargahoz. Ezert inkabb besotetitettek egy kicsit, igy lett 2 1 0, ami nem annyira vilagos. Vilagos? Imi ............................................................................ **Hol volt, hol nem volt volt egyszer egy olyan monitor hogy: **CGA** Ennek volt 16 szine, ezek le voltak fixalva. A szin formatuma igy nezett ki (4 bit): IRGB ahol I=intenzitas, R=red, G=green, B=blue. KIVEVE: 6=0110 ami nem sotet-sarga, hanem barna !!!! Tudtommal ezert egy CGA monitornak 5 szinvezeteke van: I,R,G,B,Br (Nem vagyok total biztos, sohase volt CGA-m. **Aztan telt mult az ido es kitalaltak azt a monitort, hogy: **EGA** Ennek volt 64 fix szine. A szin formatuma igy nezett ki (6 bit): RGBrgb ahol Rr=red(0-3), Gg=green(0-3), Bb=blue(0-3) Es lon az _EGA_ paletta tablazat, (ezt mindenki fent lathatja) ami megmondja, hogy a CGA-s szinhez melyik EGA-s szin tartozik. **Es vegul, de utolsosorban eljutottunk oda, hogy: **VGA** Ennek van/volt 2^18 szine, a formatumod mindenki ismeri. Es lon a _VGA_ paletta amely megmondja hogy, melyik EGA-s szinhez melyik VGA-s szin tartozik. (Megj: A VGA-nal az EGA paletta 0-255 kozotti szamot tartalmazhat) **A VGA eseteben (16 szinu modok) tehat az alapertelmezesben: for r=0 to 3 do for g=0 to 3 do for b=0 to 3 do VGA_paletta[r*16+g*4+b]:=(r*21,g*21,b*21); { A 21 nem biztos, nem emlekszem tenylegesen mennyi } EGA_paletta:=(0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63); konverzio16(szin) -> VGA_paletta[EGA_paletta[szin]] Ebbol kovetkezik, hogyha valaki a 16 szinu modot VGA-n akarja hasznalni, celszeru, az EGA palettat 0,1,...15 ertekekkel feltolteni. **A VGA 256 szinu modok eseteben pedig: for i=0 to 247 {!!!!!!!!!!!!!!!!!} do VGA_paletta[i]:=default_VGA_paletta[i]; { Ezt mindenki nezze meg maganak } EGA_paletta:=(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); Aki ismeri a konverzios fugvenyt az legyen szives irja meg. Mindenesetre ha az EGA_paletta a fenti, akkor konverzio256(szin) -> VGA_paletta[szin] ellenkezo esetben azonban nem egeszen egyszeru, de nem fog mukodni ! ** Es vegul SVGA ! 16 szin: az info biztos itt is mukodik 256 szin: nem biztos hogy hasznalja az EGA palettat, de konnyen elkepzelheto! 32K szin: szinformatum: 5 bit red / 5 bit green / 5 bit blue a palettak jelentese nem ismert, ne allitgasd! 64K szin: szinformatum: 5 bit red / 6 bit green / 5 bit blue a palettak jelentese nem ismert, ne allitgasd! 16M szin: szinformatum: 8 bit red / 8 bit green / 8 bit blue a palettak jelentese nem ismert, ne allitgasd! ** Oszefoglalva Az a szep a PC-ben, hogy barmelyik reszerol orakat lehet meselni, kulonos tekintettel az: - irtozatos baromsagokra - a kompatibilitas miatti szivatasokra - a dokumentalatlansag miatti fejetlensegre - az egymas ellen dolgozo, athidalo megoldasokra + es a mindezekbol adodo mukodeskeptelensegekre Ja es, nem, nem vagyok Amigas :-) Hyp-X /Demons ............................................................................ Nemregiben gond volt a 16 szinu modokban a palettaval, ime itt a megoldas. A kov. progi a szin szamahoz egyezteti a paletta erteket. (Csak 16 szinu modban mukodik) Sorry a pascal nyelvert, de igy latvanyos ;( uses crt,graph; var i,j:integer; procedure waitretrace;assembler; asm mov dx,03dah @1: in al,dx test al,8 jnz @1 @2: in al,dx test al,8 jz @2 end; begin i:=9;j:=2; initgraph(i,j,'c:\util\tp\bgi'); for i:=0 to 15 do begin setcolor(i); outtextxy(10,10*i,'Teszt szoveg'); end; readkey; waitretrace; {Nem art ha a visszafutas alatt csinaljuk} port[$3c8]:=0; for i:=0 to 15 do begin port[$3c9]:=i*3; port[$3c9]:=i*3; port[$3c9]:=0; port[$3c0]:=i; {Szin fizikai szama 0..15} port[$3c0]:=i; {Paletta ezen erteke tartozzon hozza} end; port[$3c0]:=$20;{Kepernyot visszakapcsoljuk} readkey; asm mov ax,03h; int 10h end; end. Morgan/Criminal Gang ############################################################################ Tseng Et4000/W32P-hez hol tudnek barmilyen infot fellelni regiszterek es portok programozasa celjabol, semmi WWW-juk ezeknek nincsen, csak egy elcseszett tech supportjuk a compu$erve-on, de itt ilyen fu kerdesekre nem valaszolnak. Imi ............................................................................ Tseng ugyben keresd a vgadoc4b.zip nevu file-ot. Sajnos az almoson most meghalt egy vinyo (pont az, amin az ftp archivum van...), ugyhogy nalunk most nem fellelheto. Talan probald meg az ftp.vse.cz-ben a /pub/msdos/SAC/pc/text-ben. Vagy archie-val. nagyd ############################################################################ Hogy lehet 1 EXE-bol tobb exe-t inditani egymas utan... (Ugy nez ki, van egy 2k-s indito valami, es sok sok exe osszelinkelve... Pl.: Griff/CATCHUP!..., hogy csinaljak??? Fontos lenne...) RoB ............................................................................ van egy xlink nevu program, ami megcsinalja. interneten elerheto. udv, rod ............................................................................ Az emlitett CATCHUP!/GRIF alkotasban AlMa csinalta ( a tobbi egyeb mellet) az osszefuzest is. Majd igyekszem elerni ot, ha esetleg meg nem olvasta el a kerdest. Addig is leirom, amit nekem mondott: - a futtathato fileok siman egymasutan vannak masolva (copy /b a+b... c.exe - 'a' az un exeloader, ami betolti c.exebol a kovetkezo .exe formatumu file-ot - a loader megirasahoz ajanlatos a .exe formatum alapos ismerete ( relokacio, szegmensek stb.) Bye, MEGADUO / BioHazard ############################################################################ lenyege: Valami buta sinusfuggvennyel krealsz par szaz pontot, mozgatod oket, es osszekotod az egymas utaniakat, az egeszet ugy kezded, hogy 3 bitplanet keszitesz, az elso fazisban letorlod az elsot es arra rajzolsz, a masodik fazisban a masodikat torlod-rajzolod, a harmadikban is igy csinalsz, a negyedikben megint az elso, a palettat meg ugy allitod be, hogy ahol egymas folott a legtobb pont van,az a legvilagosabb nalunk tehat az 111 kombinacio, aztan valamivel sotetebb szinnel 011, 101, 110 kombinaciokat, es a legsotetebb arnyalattal a 001, 010, 100 kombikat. Minel tobb planet hasznalsz, annal szebb lesz (hehe, kb 6.ig igaz) DAB ############################################################################ Hogyan lehet a Pentiumon a memoria lapok meretet 4kb-rol megnovelni ??? Ez sokat gyorsitana a rutinjaimon Pentiumon amikor nagyobb mem.teruletet hasznalok (pl.SHELLS1 v. CHROME). PERLA: de pl. a te PerlMark-odon semmit. udv TomCat/Abaddon ............................................................................ Meg a Liqid partin rogzitettem egy Pentuim nevu magyar nyelvu doksit, amirol kiderult, hogy egy megjeleitendo konyv anyaga, amit Agardi Gabor irt. Elolvastam a doksit es bosszankodva lattam, hogy egy csomo hivatkozas van a fuggelekre, az meg nincs benne. Ezert megvettem a konyvet. Hidegzuhany, a fuggelek majd csak a masodik kotetben lesz... Szoval akit erdekel a konyv annak inkabb odaadom a doksit. Egyebkent vegre megtalaltam a kerdesemre a valaszt: A fizikai lapmeretet a CR4-es vezerloregiszter 4. bitjevel lehet kiterjeszteni 4 MBajtra. Igy a TLB cache talalatainak szama nagyobb lesz es ezert a nagy memoria teruletekkel dolgozo programok felgyorsulnak. A lapozas csak vedett modban lehetseges, de ott is ki lehet kapcsolni a CR0 31. bitjevel. Tudja valaki, hogy ez a program futasi sebesseget hogyan befolyasolja??? TomCat/Abaddon ............................................................................ Nos nem vagyok valami nagy profi a temaban, de szerintem gyorsabb ha nincs lapozas. Ugyanis a lapozaskor eleg sok ido elmegy a cim lekepezesere (lekepezes ??? megartott nekem a mai algebra vizsga) Persze a TBL cache-eli, de akkor is gyorsabb lesz a dolog ha nincs. LGB/DC ............................................................................ Amennyiben a lap cime mar benne van a TLB-ben, akkor a cim kiszamitasa nem jelent plusz idot. Ha nincs benne, akkor persze be kell olvasni. Valahol asszem olvastam hogy mekkora a TLB, de most nem emlekszem ra, de kb akkora nagysagrendu teruletet fed le mint a kulso cache, tehat ha nincs talalat az adat ugysincs benne a belso cache-ben es jo esellyel a kulsoben se. Egyebkent olvastam levelet olyantol aki tesztelte, es 5%-os lassulast mert, de se a gep tipust, se a programot nem ismerem. Hyp-X /Demons? ............................................................................ A Pentium doksi is a /pub/demos/code/text-be kerult. A Pentium doksirol meg annyit, hogy aki nyomtatott formaban szeretne latni, az valoszinuleg meg mindig jobban jar ha megveszi a konyvet, mert annak ara 1200Ft es kb. 300 oldal. Negy forintnal meg aligha olcsobb a nyomtatas es raadasul egy konyv kezelhetobb is... udv, TomCat/Abaddon ############################################################################ Mivel egyszerre tobbmindennel is foglalkozom, most egy kicsit a phong arnyekolassal fogok... Roviden ugye arrol van szo, hogy a normalvektorokat kene interpolalgatni, aztan abbol fenyesseget szamolni. Ez persze eleg lassu, ha az eredeti modszert vesszuk, mert gyokvonasok ropkodnek, meg a szokasos szorzas, osztas, etc. Olvastam, hogy a phongot lehet kozeliteni masodfoku Taylor poly-val, meg az Imphobia #10-ben volt szo quad adderekrol, es asszem ott is celozgattak a phong-ra. A masodfoku taylor vmi ilyesmi : y=ax^2+bx+c A quad adder meg az y=y+d, d=d+e rekurziv formula alapjan mukodik. Ha ezt kibontjuk, akkor az n-edik lepesben y(n)=n*(n-1)/2*e+n*d+y(0) Mivel n^2 az 'nagyjabol' n*(n-1) igy jogos, hogy igy kozelitjuk a parabolat. Az emlitett Imphobia cikkben arra a spec esetre koncentraltak, ha a parabolanak az alabbi 3 pontjat ismerjuk : 0=y(0), y1=y(x), 0=y(2x) Tehat : y1 | **+** | *** *** |* * -+------+------+----- 0 x 2x En tetszoleges esetre kifejeztem d es e erteket, vagyis amikor v0=y(0), v1=y(x1), v2=y(x2). A phong-nal gondolom esszeru az x2=2*x1 valasztas, es igy a legvilagosabb resz a poly ( scanline ) kozepen lesz. A formulak : v0*(x1-x2)*(x1+x2-1)+v1*x2*(x2-1)+v2*x1*(1-x1) d=------------------------------------------------ x1*x2*(x2-x1) 2*(v0*(x1-x2)+v1*x2-v2*x1) e=---------------------------- x1*x2*(x1-x2) Ezek utan ugy filleznenk a poly-t, hogy kiszamolnank az intenzitasokat a poly csucsaiban, az elek menten quad-os interpolacio, es a scanline-ok menten is. Bye...Paf ............................................................................ .-----------------------------------------------------. --| This text comes from IMPHOBIA Issue X - June 1995 |---------------------- `-----------------------------------------------------' SCENE TIPS & TRICKS 2 QUAD ADDERS: (approximating quadratic curves with only using adds) Quad adders are useful if you want to approximate phong shading or ellipses, or also just want to have some nice curves ;) Only two adds per pixel is needed - in contrary to the usual solve with a root! a=1 | ____/-----x-----\____ | __/ \__ | _/ \_ x ... p2, p3 a=0.4 | / \ |/ \ a=0 |___________________________________x__ n=0 n=10 n=20 You can fit a quadratic curve through 3 points: The adding parameters are calculated from the distance p1-p2 and p1-p3, so if we assume p1 is always at the origin (0,0) as above, we only need two points. formula: a(n)=n*b+n*(n-1)/2*c, for n=0 -> a=0 loop: add a, b add b, c And here's how we derived this: determine two value-pairs of x/y (preferably middle and endpoint) and solve the above equation for them, i.e. for n=10, a=1 for n=20, a=0 1=10*b+10*9/2*c -> 1=10*b+45*c | *(-2) 0=20*b+20*19/2*c -> 0=20*b+190*c -2=-20*b-90*c \ + 0= 20*b+190*c / ----------------- -2=100*c, c=-0.02 20*b=-190*c, b=0.19 Initialize a with 0, b with 0.19, c with -0.02 and you'll get the approxima- ted curve with points through (0,0), (10,1) and (20,0). You can approximate the wanted curve closer with Triple adders or greater polynoms however i think you'll get some unwanted high-frequent noise there; decide yourself if the better approximation pays for the additional needed addition in the inner loop. (C) 1995 by The Faker / Surprise! Productions ############################################################################ Nagysokara asszem elkeszultem vele. Ha netan valaki nagyon raer, legyen szives nezze mar meg, hogy hol lehet meg lenyegesen gyorsitani a programon (nem vagyok valami nagy guru). Azert a legjobb tudasom szerint megprobaltam optimalizalni, de lehet, hogy elbaltaztam valahol. Nalam (DX-4, Cirrus VLB) 100 pixeles atmeroig szepen megy, feljebb nem probaltam. Van benne egy C source is, trafo matrix szamitasahoz (ezt ne nagyon nezzetek, eleg kezdetleges...). Az eger nem igazan akar 200 pixelnel lejjebb menni, eddig csak a logitech uj drivere birta a felbontast, bar a horizontalis hatarok beallitasanal az is rakoncatlankodott. A progger az almoson van a /pub/pc/misc-ben, lens2.zip neven. Nagy Daniel | ............................................................................ ;-----------------------------------------------------------------------; ; Lens effect in 640x480x256 using VESA calls ; ; Code by Nagy Daniel. This source is free to use, but if you use it ; ; it'd be nice to mention my name in your source. ; ; ; ; All optimizations made for 486 so there might be flickers on a ; ; slow 386. (Timings in comments 486 timings! ; ; ; ; If you want to resize the lens, just calculate another transfrm.dat, ; ; and correct the 'xsize' value. ; ; ; ; You can use any standard TGA picture if it's 640x480x256. ; ; ; ; Compile: TASM /m9 ; ; Link: TLINK /3 /x ; ; ; ; Send ideas, comments to: nagyd@almos.vein.hu ; ;-----------------------------------------------------------------------; DOSSEG .MODEL SMALL .STACK 200h .CODE .386 xsize equ 72 ;lens diameter (max 252, must be dividable by 4) ;don't change unless you have previously ;calculated a suitable transfrm.dat! ASSUME CS:@CODE, DS:DATAS start: mov ax,DATAS mov ds,ax cld call init ;check for 386, mouse, VGA etc.. mov ax,4f02h mov bx,101h int 10h ;640x480x256 mov ax,4f01h mov cx,100h lea di,vesabuf int 10h xor si,si mov eax,[di+0ch] ;store page flipping routine address mov [si],eax mov ax,inpseg ;set up start segment for picture mov fs,ax ;FS - segment of image on memory call loadtga ;import pic to memory and set palette jnc fileok ;error check mov ax,3 int 10h mov ah,9 lea dx,filerr int 21h jmp endpr fileok: mov ax,0a000h mov es,ax ;ES - segment of video memory call putpic ;display image mov ax,4 mov cx,240 mov dx,100 int 33h ;center mouse cursor mov maddrx,cx ;store mouse cursor position mov maddry,dx mov mnewaddrx,cx ;store mouse cursor position mov mnewaddry,dx call getorig ;get original picture chunk call transf ;make transformation call or2tmp ;copy original to 'temp' buffer lea si,dest call putimg ;display transformed picture ;-------------------- Main loop ----------------------- again: mov ax,000bh int 33h ;examine mouse movement test cx,cx jnz newpic ;horizontal movement -> new picture test dx,dx jnz newpic ;vertical movement -> new picture mov ax,3 int 33h ;read mouse button status test bx,1 jnz finish ;quit if button pressed in al,60h cmp al,1 ;quit if ESC pressed je finish jmp again ;jump back ;-------------- Draw new block if mouse moved ----------------- newpic: mov ax,3 int 33h ;get new mouse position mov mnewaddrx,cx ;and store mouse cursor address mov mnewaddry,dx cli call getorig ;get original picture chunk call transf ;make transformation call vrtchk ;wait for Vertical Retrace lea si,temp call putimg ;display orig pic from 'temp' to oldpos mov ax,mnewaddrx mov bx,mnewaddry ;new position becoming old position mov maddrx,ax mov maddry,bx lea si,dest call putimg ;display transformed picture to newpos call or2tmp ;copy 'orig' to 'temp' until next move sti jmp again ;jump back ;---------------- Quit program ------------------- finish: mov ax,0 ;reset mouse int 33h mov ax,0003h ;reset VGA int 10h endpr: mov ax,4c00h int 21h ;============================================================================= ;============================== Procedures =============================== ;============================================================================= ;============================= Initalize =========================== init proc ;--------- Check for 386 ----------- xor ax,ax push ax popf pushf pop ax and ax,0f000h cmp ax,0f000h je no386 mov ax,07000h push ax popf pushf pop ax and ax,07000h jne vgacheck no386: mov ah,9 lea dx,_386err int 21h jmp endpr ;----------- VGA check ----------- vgacheck: mov ax,1a00h int 10h and al,8 jnz mousechk mov ah,9 lea dx,vgaerr int 21h jmp endpr ;---------- Mouse check ---------- mousechk: mov ax,0 int 33h or ax,ax jnz memcheck mov ah,9 lea dx,mouserr int 21h jmp endpr ;---------- Memory check ---------- memcheck: mov bx,0a000h ;videomem address mov ax,ss add ax,32 ;32x16=512 byte stack sub bx,ax ;bx - free mem in paragraphs cmp bx,19200 ;we need 19200x16=307200 bytes jnb vesachk mov ah,9 lea dx,memerr int 21h jmp endpr ;---------- VESA check ------------- vesachk: mov inpseg,ax ;save segment of image mov ax,ds mov es,ax lea di,vesabuf mov ax,4f00h int 10h lea si,vesasign mov cx,4 rep cmpsb jz ok2run mov ah,9 lea dx,vesaerr int 21h jmp endpr ok2run: mov ax,7 xor cx,cx mov dx,640-xsize int 33h ;define horizontal mouse range inc ax mov dx,480-xsize int 33h ;define vertical mouse range ret endp ;============================= Load TGA pix ============================= loadtga proc mov ax,3D00h lea dx,TGA_filename int 21h ;open file jc errfil mov TGA_handle,ax mov bx,ax mov ah,3Fh mov cx,18 ;read crap lea dx,ReadBuffer int 21h jc errfil mov ah,3Fh mov cx,768 ;read palette lea dx,ReadBuffer int 21h jc errfil mov cx,256 lea si,ReadBuffer lea di,ReadBuffer palfix: mov ah,[si] ;in the TGA format the palette values inc si ;are stored in a rather stupid way, shr ah,2 ;so we have a little conversion here mov bh,[si] inc si shr bh,2 mov al,[si] inc si shr al,2 mov [di],al inc di mov [di],bh inc di mov [di],ah inc di dec cx jnz palfix mov ax,ds mov es,ax mov ax,1012h xor bx,bx mov cx,256 lea dx,ReadBuffer int 10h ;set all palette mov bx,TGA_handle mov ax,inpseg mov ds,ax mov si,5 ;read 5x61440=307200 bytes (640x480) nextchunk: mov ah,3Fh mov cx,61440 xor dx,dx int 21h ;load picture jc errfil mov ax,ds add ax,0f00h ;modify data segment value mov ds,ax ;there would be less hassle if we dec si ;used flat memory model jnz nextchunk mov ax,DATAS mov ds,ax ;restore data segment mov ah,3eh mov bx,TGA_handle int 21h ;close file clc ;the C flag is clear if everything OK ret errfil: mov ax,DATAS ;restore data segment mov ds,ax stc ;the C flag is set on error ret endp loadtga ;========================= Display whole picture ================== putpic proc mov ax,fs mov ds,ax xor dx,dx xor bx,bx mov ax,4f05h ;set first page int 10h inc dx mov cx,5 ;there are 5 pages xor esi,esi xor di,di dnextpag: push cx mov cx,16384 ;16384x4=65536 pixels in a plane dnextpixel: rep movsd mov ax,4f05h int 10h inc dx mov ax,ds add ah,10h mov ds,ax pop cx dec cx jnz dnextpag mov ax,DATAS mov ds,ax ret endp putpic ;========================= Wait for vertical retrace ===================== vrtchk proc mov dx,3dah zz1: in al,dx ;Is it Vertical Retrace? and al,8 jnz zz1 ;Wait if yes zz2: in al,dx ;Is it Vertical Retrace? and al,8 jz zz2 ;Wait if no ret endp ;========================== Get original picture ========================= getorig proc xor esi,esi mov si,mnewaddry mov eax,esi shl esi,9 ;multiply y by 640 shl eax,7 add esi,eax xor eax,eax mov ax,mnewaddrx add esi,eax ;esi = far pointer to pixel position lea di,orig ;di - pointer to 'orig' buffer mov ax,ds mov es,ax mov ax,fs mov cx,si xor ch,ch ;due to segment limitations and cl,0fh ;I divide the far esi pointer shr esi,4 ;to a segment and a minimal offset xchg si,cx ;address, so I don't have to add ax,cx ;change segments during moving data mov ds,ax ;value goes to DS mov cx,xsize ;rows gnextrow: push cx mov cx,xsize/4 ;columns rep movsd add si,640-xsize ;jump to next row pop cx dec cx jnz gnextrow ;store all rows mov ax,DATAS mov ds,ax mov ax,0a000h ;restore segments mov es,ax ret endp getorig ;======================= Original to Temp Buffer ============================ or2tmp proc lea si,orig ;When the lens moves, we have to lea di,temp ;restore the original block. mov ax,ds ;That's why we need a temp buffer mov es,ax mov cx,xsize*xsize/4 rep movsd mov ax,0a000h mov es,ax ret endp or2tmp ;============================ Transformation =========================== transf proc lea bx,trans ;bx = transformation array address lea bp,orig ;bp = original picture array address lea di,dest ;di = transformed picture array address mov cx,xsize*xsize ;transform all points newpixel: mov si,[bx] ;si = pointer to needed pixel add si,bp dec si mov al,[si] mov [di],al ;put the transformed value in the inc di ;proper array inc bx inc bx dec cx jnz newpixel ret endp transf ;=========================== Display image block =========================== ;This routine is the bottleneck, hence we have to execute it two times ;during one vertical retrace. So if the lens flickers on your screen, ;blame this routine. (If you can speed it up, e-mail me please!) ;SI = buffer address to display putimg proc mov bx,maddrx xor edi,edi mov di,maddry mov edx,edi shl edx,9 ;multiply y by 640 shl edi,7 add edx,edi add edx,ebx ;edx - pointer to beginning position mov di,dx ; in video memory shr edx,16 ;dl - number of vid. page, di - offset xor bx,bx ;flipping routine needs this cmp dl,actpage ;don't change page if not necessary jne flip dbegin: mov ch,xsize ;rows dnextrow: mov cl,xsize ;columns dnextcol: mov al,[si] ;ÄÄÄÄÄ¿ mov es:[di],al; ³'movsb' would be 7 clocks inc si ; ³ this is only 4 inc di ;ÄÄÄÄÄÙ jz flip1 ; this method sets zero flag -> flip if dec cl ; next byte is on next page jnz dnextcol ;next column drow: add di,640-xsize jc flip2 ;jump if next row is on next page dec ch jnz dnextrow ;next row ret ;this program is optimized for speed, don't be surprised from the following... flip1: inc dl ;flip if next byte is on next page mov actpage,dl ;save actual page push dx db 0ffh,1eh ;far call for VESA page flipping dw 0 ;this call destroys DX (we use DL) pop dx dec cl ;next column jnz dnextcol jmp drow flip2: inc dl ;flip if next row is on next page mov actpage,dl push dx db 0ffh,1eh dw 0 pop dx dec ch ;next row jnz dnextrow ret flip: mov actpage,dl ;flip if we have to start drawing push dx ;on a different page. This may occur db 0ffh,1eh ;if we move up, and reach a page dw 0 ;boundary pop dx jmp dbegin endp putimg ends ;code segment end ;============================================================================= ;======================== Data area ========================== ;============================================================================= DATAS SEGMENT PARA 'DATA' flipaddress dd 0 ;this MUST be the first in the DATA ;segment!!! Far address of page ;flipping routine goes here orig db xsize*xsize dup (0) ;store original block here temp db xsize*xsize dup (0) ;temporary storage for orig. dest db xsize*xsize dup (0) ;transformed block goes here ReadBuffer db 768 dup (0) ;buffer for VGA palette vesabuf db 256 dup (0) ;VESA info buffer actpage db 0ffh ;actual video page inpseg dw 0 ;segment of picture maddrx dw 0 ;old mouse x maddry dw 0 ;old mouse y mnewaddrx dw 0 ;new mouse x mnewaddry dw 0 ;new mouse y TGA_filename db 'lens.tga',0 ;file name of TGA pic TGA_handle dw 0 ;file handle of TGA pic vesasign db 'VESA' ;VESA signature mouserr db 'Mouse driver not found','$' memerr db 'About 310k free conventional memory required','$' vgaerr db 'VGA card not found','$' filerr db 'Something is wrong with lens.tga','$' _386err db '386 or better required','$' vesaerr db 'VESA interface not found. Please install a VESA driver','$' trans label include transfrm.dat ;transformation matrix loaded here ends ;data segment end end start ............................................................................ #include #include #include /* A transzformacios matrix kiszamitasa egy esetre*/ int xhosz=72; int tran[5184]; /* xhosz^2 */ int px,py; /* coordinates of actual point */ int qz; int ix,iy; /* coordinates of transformed point */ int d,rc,nagyd,rs; int n,m,p; void main (void) { d=xhosz/2; /* distance of globe centre from visual plane */ rc=xhosz/2; /* lens radius */ rs=sqrt(d*d+rc*rc); /* globe radius */ py=xhosz/2; p=1; for(n=0;n #include #include typedef unsigned char byte; typedef unsigned short word; typedef unsigned long dword; #pragma pack(2) typedef struct { word id; dword len; } TChunkHeader, *PChunkHeader; #pragma pack() enum { CHUNK_RGBF = 0x0010, CHUNK_RGBB = 0x0011, // CHUNK_RBGB2 = 0x0012, // ?? NOT HLS. CHUNK_MAIN = 0x4D4D, CHUNK_OBJMESH = 0x3D3D, CHUNK_BKGCOLOR = 0x1200, CHUNK_AMBCOLOR = 0x2100, CHUNK_OBJBLOCK = 0x4000, CHUNK_TRIMESH = 0x4100, CHUNK_VERTLIST = 0x4110, CHUNK_FACELIST = 0x4120, CHUNK_FACEMAT = 0x4130, CHUNK_MAPLIST = 0x4140, CHUNK_SMOOLIST = 0x4150, CHUNK_TRMATRIX = 0x4160, CHUNK_LIGHT = 0x4600, CHUNK_SPOTLIGHT = 0x4610, CHUNK_CAMERA = 0x4700, CHUNK_MATERIAL = 0xAFFF, CHUNK_MATNAME = 0xA000, CHUNK_AMBIENT = 0xA010, CHUNK_DIFFUSE = 0xA020, CHUNK_SPECULAR = 0xA030, CHUNK_TEXTURE = 0xA200, CHUNK_BUMPMAP = 0xA230, CHUNK_MAPFILE = 0xA300, CHUNK_KEYFRAMER = 0xB000, CHUNK_FRAMES = 0xB008, }; // ------------------------------------ // Forward declaration. void ChunkReader(FILE *f, int ind, long p); void SkipReader(FILE *f, int ind, long p) { } void RGBFReader (FILE *f, int ind, long p) { float c[3]; if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s Red: %f, Green: %f, Blue: %f\n", ind, "", c[0], c[1], c[2]); } void RGBBReader (FILE *f, int ind, long p) { byte c[3]; if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s Red: %d, Green: %d, Blue: %d\n", ind, "", c[0], c[1], c[2]); } void ObjBlockReader (FILE *f, int ind, long p) { int c; // Read ASCIIZ object name printf("%*sObject name \"", ind, ""); while ( (c = fgetc(f)) != EOF && c != '\0') putchar(c); printf("\"\n"); // Read rest of chunks inside this one. ChunkReader(f, ind, p); } void VertListReader (FILE *f, int ind, long p) { word nv; float c[3]; if (fread(&nv, sizeof(nv), 1, f) != 1) return; printf("%*sVertices: %d\n", ind, "", nv); while (nv-- > 0) { if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s X: %f, Y: %f, Z: %f\n", ind, "", c[0], c[1], c[2]); } } void FaceListReader (FILE *f, int ind, long p) { word nv; word c[4]; if (fread(&nv, sizeof(nv), 1, f) != 1) return; printf("%*sFaces: %d\n", ind, "", nv); while (nv-- > 0) { if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s A: %d, B: %d, C: %d, Flags 0x%X\n", ind, "", c[0], c[1], c[2], c[3]); } // Read rest of chunks inside this one. ChunkReader(f, ind, p); } void FaceMatReader (FILE *f, int ind, long p) { int c; word n, nf; // Read ASCIIZ material name printf("%*sMaterial name for faces: \"", ind, ""); while ( (c = fgetc(f)) != EOF && c != '\0') putchar(c); printf("\"\n"); if (fread(&n, sizeof(n), 1, f) != 1) return; printf("%*sFaces with this material: %d\n", ind, "", n); while (n-- > 0) { if (fread(&nf, sizeof(nf), 1, f) != 1) return; printf("%*s Face %d\n", ind, "", nf); } } void MapListReader (FILE *f, int ind, long p) { word nv; float c[2]; if (fread(&nv, sizeof(nv), 1, f) != 1) return; printf("%*sVertices: %d\n", ind, "", nv); while (nv-- > 0) { if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s U: %f, V: %f\n", ind, "", c[0], c[1]); } } void SmooListReader (FILE *f, int ind, long p) { dword s; int i; while (ftell(f) < p) { if (fread(&s, sizeof(s), 1, f) != 1) return; printf("%*sSmoothing groups: ", ind, ""); for (i = 0; i < 32; i++) if (s & (1 << i)) printf("%d, ", i + 1); printf("\n"); } } void TrMatrixReader(FILE *f, int ind, long p) { float rot[9]; float trans[3]; if (fread(&rot, sizeof(rot), 1, f) != 1) return; printf("%*sRotation matrix:\n", ind, ""); printf("%*s %f, %f, %f\n", ind, "", rot[0], rot[1], rot[2]); printf("%*s %f, %f, %f\n", ind, "", rot[3], rot[4], rot[5]); printf("%*s %f, %f, %f\n", ind, "", rot[6], rot[7], rot[8]); if (fread(&trans, sizeof(trans), 1, f) != 1) return; printf("%*sTranslation matrix: %f, %f, %f\n", ind, "", trans[0], trans[1], trans[2]); } void LightReader(FILE *f, int ind, long p) { float c[3]; if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s X: %f, Y: %f, Z: %f\n", ind, "", c[0], c[1], c[2]); // Read rest of chunks inside this one. ChunkReader(f, ind, p); } void SpotLightReader(FILE *f, int ind, long p) { float c[5]; if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s Target X: %f, Y: %f, Z: %f; Hotspot %f, Falloff %f\n", ind, "", c[0], c[1], c[2], c[3], c[4]); } void CameraReader(FILE *f, int ind, long p) { float c[8]; if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s Position: X: %f, Y: %f, Z: %f\n", ind, "", c[0], c[1], c[2]); printf("%*s Target: X: %f, Y: %f, Z: %f\n", ind, "", c[3], c[4], c[5]); printf("%*s Bank: %f, Lens: %f\n", ind, "", c[6], c[7]); } void MatNameReader (FILE *f, int ind, long p) { int c; // Read ASCIIZ object name printf("%*sMaterial name \"", ind, ""); while ( (c = fgetc(f)) != EOF && c != '\0') putchar(c); printf("\"\n"); } void MapFileReader (FILE *f, int ind, long p) { int c; // Read ASCIIZ filename printf("%*sMap filename \"", ind, ""); while ( (c = fgetc(f)) != EOF && c != '\0') putchar(c); printf("\"\n"); } void FramesReader(FILE *f, int ind, long p) { dword c[2]; if (fread(&c, sizeof(c), 1, f) != 1) return; printf("%*s Start: %ld, End: %ld\n", ind, "", c[0], c[1]); } // ------------------------------------ struct { word id; const char *name; void (*func)(FILE *f, int ind, long p); } ChunkNames[] = { {CHUNK_RGBF, "RGB float", RGBFReader}, {CHUNK_RGBB, "RGB byte", RGBBReader}, {CHUNK_MAIN, "Main", NULL}, {CHUNK_OBJMESH, "Object Mesh", NULL}, {CHUNK_BKGCOLOR, "Background color", NULL}, {CHUNK_AMBCOLOR, "Ambient color", NULL}, {CHUNK_OBJBLOCK, "Object Block", ObjBlockReader}, {CHUNK_TRIMESH, "Tri-Mesh", NULL}, {CHUNK_VERTLIST, "Vertex list", VertListReader}, {CHUNK_FACELIST, "Face list", FaceListReader}, {CHUNK_FACEMAT, "Face material", FaceMatReader}, {CHUNK_MAPLIST, "Mappings list", MapListReader}, {CHUNK_SMOOLIST, "Smoothings", SmooListReader}, {CHUNK_TRMATRIX, "Matrix", TrMatrixReader}, {CHUNK_LIGHT, "Light", LightReader}, {CHUNK_SPOTLIGHT, "Spotlight", SpotLightReader}, {CHUNK_CAMERA, "Camera", CameraReader}, {CHUNK_MATERIAL, "Material", NULL}, {CHUNK_MATNAME, "Material name", MatNameReader}, {CHUNK_AMBIENT, "Ambient color", NULL}, {CHUNK_DIFFUSE, "Diffuse color", NULL}, {CHUNK_SPECULAR, "Specular color", NULL}, {CHUNK_TEXTURE, "Texture map", NULL}, {CHUNK_BUMPMAP, "Bump map", NULL}, {CHUNK_MAPFILE, "Map filename", MapFileReader}, {CHUNK_KEYFRAMER, "Keyframer data", NULL}, {CHUNK_FRAMES, "Frames", FramesReader}, }; int FindChunk(word id) { int i; for (i = 0; i < sizeof(ChunkNames)/sizeof(ChunkNames[0]); i++) if (id == ChunkNames[i].id) return i; return -1; } // ------------------------------------ int Verbose = 0; void ChunkReader(FILE *f, int ind, long p) { TChunkHeader h; int n; long pc; while (ftell(f) < p) { pc = ftell(f); if (fread(&h, sizeof(h), 1, f) != 1) return; n = FindChunk(h.id); if (n < 0) { if (Verbose) printf("%*sUnknown chunk: 0x%04X, offset 0x%lX, size: %d bytes.\n", ind, "", h.id, pc, h.len); fseek(f, pc + h.len, SEEK_SET); } else { printf("%*sChunk type \"%s\", offset 0x%lX, size %d bytes\n", ind, "", ChunkNames[n].name, pc, h.len); pc = pc + h.len; if (ChunkNames[n].func != NULL) ChunkNames[n].func(f, ind + 2, pc); else ChunkReader(f, ind + 2, pc); fseek(f, pc, SEEK_SET); } if (ferror(f)) break; } } // ------------------------------------ extern void FinishProgram(void) { } void main(int argc, char *argv[]) { FILE *f; long p; if (argc < 2) { printf("Usage: 3DSRDR file.3ds [-verbose]\n"); exit(1); } f = fopen(argv[1], "rb"); if (f == NULL) { printf("Can't open %s!\n", argv[1]); exit(1); } if (argc > 2 && strcmp(argv[2], "-verbose") == 0) Verbose = 1; // Find file size. fseek(f, 0, SEEK_END); p = ftell(f); fseek(f, 0, SEEK_SET); // Go! ChunkReader(f, 0, p); FinishProgram(); } Seeyanara Jare/Iguana/VangeliSTeam =================================================================== VangeliSTeam Internet address: jarevalo@dit.upm.es (JCAB) Iguana Internet address: jare@iguana.dit.upm.es (Jare) ------------------------------------------------------------------- Don't despair if you don't get an answer. We don't read much mail. 4. Reszlet a 3ds2pov konverter forraskodjabol: /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ /* 3DS2POV.C Copyright (c) 1993 Steve Anger and Jeff Bowermaster */ void parse_file() { Chunk chunk; start_chunk(&chunk); if (chunk.tag == 0x4D4D) parse_3ds (&chunk); else abortmsg ("Error: Input file is not .3DS format", 1); end_chunk (&chunk); } void parse_3ds (Chunk *mainchunk) { Chunk chunk; do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x3D3D: parse_mdata (&chunk); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); } void parse_mdata (Chunk *mainchunk) { Chunk chunk; Colour bgnd_colour; do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x2100: parse_colour (&global_amb); break; case 0x1200: parse_colour (&bgnd_colour); break; case 0x1201: write_bgsolid (out, bgnd_colour); break; case 0x2200: parse_fog (&chunk); break; case 0x2210: parse_fog_bgnd(); break; case 0x2201: write_fog (out, fog_colour, fog_distance); break; case 0xAFFF: parse_mat_entry (&chunk); break; case 0x4000: parse_named_object (&chunk); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); } void parse_fog (Chunk *mainchunk) { Chunk chunk; (void)read_float(); (void)read_float(); fog_distance = read_float(); (void)read_float(); parse_colour (&fog_colour); do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x2210: parse_fog_bgnd(); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); } void parse_fog_bgnd() { } void parse_mat_entry (Chunk *mainchunk) { Chunk chunk; MatProp *mprop; mprop = create_mprop(); do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0xA000: strcpy (mprop->name, read_string()); cleanup_name (mprop->name); break; case 0xA010: parse_colour (&mprop->ambient); break; case 0xA020: parse_colour (&mprop->diffuse); break; case 0xA030: parse_colour (&mprop->specular); break; case 0xA040: mprop->shininess = 100.0*parse_percentage(); break; case 0xA050: mprop->transparency = parse_percentage(); break; case 0xA080: mprop->self_illum = TRUE; break; case 0xA220: mprop->reflection = parse_percentage(); (void)parse_mapname (&chunk); break; case 0xA310: if (mprop->reflection == 0.0) mprop->reflection = 1.0; break; case 0xA200: mprop->tex_strength = parse_percentage(); strcpy (mprop->tex_map, parse_mapname (&chunk)); break; case 0xA230: mprop->bump_strength = parse_percentage(); strcpy (mprop->bump_map, parse_mapname (&chunk)); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); LIST_INSERT (mprop_list, mprop); } char *parse_mapname (Chunk *mainchunk) { static char name[80] = ""; Chunk chunk; do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0xA300: strcpy (name, read_string()); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); return name; } void parse_named_object (Chunk *mainchunk) { Chunk chunk; strcpy (obj_name, read_string()); cleanup_name (obj_name); printf ("Working on: %s\n", obj_name); mesh = NULL; do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x4100: parse_n_tri_object (&chunk); break; case 0x4600: parse_n_direct_light (&chunk); break; case 0x4700: parse_n_camera(); break; case 0x4010: if (mesh != NULL) mesh->hidden = TRUE; break; case 0x4012: if (mesh != NULL) mesh->shadow = FALSE; break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); if (mesh != NULL) { update_limits (mesh); if (frame >= 0) LIST_INSERT (mesh_list, mesh); else { write_mesh (out, mesh); free_mesh_data (mesh); free (mesh); } } } void parse_n_tri_object (Chunk *mainchunk) { Chunk chunk; mesh = create_mesh (obj_name, 0, 0); do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x4110: parse_point_array(); break; case 0x4120: parse_face_array (&chunk); break; case 0x4160: parse_mesh_matrix(); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); } void parse_point_array() { int i; mesh->vertices = read_word(); mesh->vertex = malloc (mesh->vertices * sizeof(*(mesh->vertex))); if (mesh->vertex == NULL) abortmsg ("Out of memory allocating mesh", 1); for (i = 0; i < mesh->vertices; i++) read_point (mesh->vertex[i]); } void parse_face_array (Chunk *mainchunk) { Chunk chunk; int i; mesh->faces = read_word(); mesh->face = malloc (mesh->faces * sizeof(*(mesh->face))); if (mesh->face == NULL) abortmsg ("Out of memory allocating mesh", 1); mesh->mtl = malloc (mesh->faces * sizeof(*(mesh->mtl))); if (mesh->mtl == NULL) abortmsg ("Out of memory allocating mesh", 1); for (i = 0; i < mesh->faces; i++) { mesh->face[i].a = read_word(); mesh->face[i].b = read_word(); mesh->face[i].c = read_word(); (void)read_word(); mesh->mtl[i] = NULL; } do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x4130: parse_msh_mat_group(); break; case 0x4150: parse_smooth_group(); break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); for (i = 0; i < mesh->faces; i++) { if (mesh->mtl[i] == NULL) mesh->mtl[i] = update_materials ("Default", 0); } } void parse_msh_mat_group() { Material *new_mtl; char mtlname[80]; int mtlcnt; int i, face; strcpy (mtlname, read_string()); cleanup_name (mtlname); new_mtl = update_materials (mtlname, 0); mtlcnt = read_word(); for (i = 0; i < mtlcnt; i++) { face = read_word(); mesh->mtl[face] = new_mtl; } } void parse_smooth_group() { } void parse_mesh_matrix() { int i, j; if (mesh != NULL) { for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) mesh->matrix[i][j] = read_float(); } mat_inv (mesh->invmatrix, mesh->matrix); } } void parse_n_direct_light (Chunk *mainchunk) { Chunk chunk; Spotlight *s; OmniLight *o; int light_off = FALSE; int spot_flag = FALSE; read_point (pos); parse_colour (&col); do { start_chunk (&chunk); if (chunk.end <= mainchunk->end) { switch (chunk.tag) { case 0x4620: light_off = TRUE; break; case 0x4610: parse_dl_spotlight(); spot_flag = TRUE; break; } } end_chunk (&chunk); } while (chunk.end <= mainchunk->end); if (light_off) return; if (!spot_flag) { if (frame >= 0) { o = LIST_FIND (omni_list, obj_name); if (o != NULL) { pos[X] = o->pos[X]; pos[Y] = o->pos[Y]; pos[Z] = o->pos[Z]; col = o->col; } } write_light (out, obj_name, pos, col); } else { if (frame >= 0) { s = LIST_FIND (spot_list, obj_name); if (s != NULL) { pos[X] = s->pos[X]; pos[Y] = s->pos[Y]; pos[Z] = s->pos[Z]; target[X] = s->target[X]; target[Y] = s->target[Y]; target[Z] = s->target[Z]; col = s->col; hotspot = s->hotspot; falloff = s->falloff; } } if (falloff <= 0.0) falloff = 180.0; if (hotspot <= 0.0) hotspot = 0.7*falloff; write_spot (out, obj_name, pos, target, col, hotspot, falloff); } } void parse_dl_spotlight() { read_point (target); hotspot = read_float(); falloff = read_float(); } void parse_n_camera() { float bank; float lens; read_point (pos); read_point (target); bank = read_float(); lens = read_float(); if (frame >= 0 && cam_list != NULL) { pos[X] = cam_list->pos[X]; pos[Y] = cam_list->pos[Y]; pos[Z] = cam_list->pos[Z]; target[X] = cam_list->target[X]; target[Y] = cam_list->target[Y]; target[Z] = cam_list->target[Z]; lens = cam_list->lens; bank = cam_list->bank; } write_camera (out, obj_name, pos, target, lens, bank); } void parse_colour (Colour *colour) { Chunk chunk; Colour_24 colour_24; start_chunk (&chunk); switch (chunk.tag) { case 0x0010: parse_colour_f (colour); break; case 0x0011: parse_colour_24 (&colour_24); colour->red = colour_24.red/255.0; colour->green = colour_24.green/255.0; colour->blue = colour_24.blue/255.0; break; default: abortmsg ("Error parsing colour", 1); } end_chunk (&chunk); } void parse_colour_f (Colour *colour) { colour->red = read_float(); colour->green = read_float(); colour->blue = read_float(); } void parse_colour_24 (Colour_24 *colour) { colour->red = read_byte(); colour->green = read_byte(); colour->blue = read_byte(); } float parse_percentage() { Chunk chunk; float percent = 0.0; start_chunk (&chunk); switch (chunk.tag) { case 0x0030: percent = parse_int_percentage()/100.0; break; case 0x0031: percent = parse_float_percentage(); break; default: printf ("WARNING: Error parsing percentage"); } end_chunk (&chunk); return percent; } short parse_int_percentage() { word percent = read_word(); return percent; } float parse_float_percentage() { float percent = read_float(); return percent; } void start_chunk (Chunk *chunk) { chunk->start = ftell(in); chunk->tag = read_word(); chunk->length = read_dword(); chunk->end = chunk->start + chunk->length; } void end_chunk (Chunk *chunk) { fseek (in, chunk->end, 0); } byte read_byte() { byte data; data = fgetc (in); return data; } word read_word() { word data; fread (&data, 2, 1, in); return data; } dword read_dword() { dword data; fread (&data, 4, 1, in); return data; } float read_float() { float data; fread (&data, 4, 1, in); return data; } void read_point (Vector v) { v[X] = read_float(); v[Y] = read_float(); v[Z] = read_float(); } char *read_string() { static char string[80]; int i; for (i = 0; i < 80; i++) { string[i] = read_byte(); if (string[i] == '\0') break; } return string; } float findfov (float lens) { static float lens_table[13] = { 15.0, 17.0, 24.0, 35.0, 50.0, 85.0, 100.0, 135.0, 200.0, 500.0, 625.0, 800.0, 1000.0 }; static float fov_table[13] = { 115.0, 102.0, 84.0, 63.0, 46.0, 28.0, 24.0, 18.0, 12.0, 5.0, 4.0, 3.125, 2.5 }; float fov, f1, f2, l1, l2; int i; if (lens < 15.0) lens = 15.0; else if (lens > 1000.0) lens = 1000.0; for (i = 0; i < 13; i++) if (lens < lens_table[i]) break; if (i == 13) i = 12; else if (i == 0) i = 1; f1 = fov_table[i-1]; f2 = fov_table[i]; l1 = lens_table[i-1]; l2 = lens_table[i]; fov = f1 + (lens - l1) * (f2 - f1) / (l2 - l1); return fov; } Ha valakinek van egyeb infoja vagy hasznalta mar a 3ds formatumat, akkor legyenszives tegye kozkincse ismereteit! Engem leginkabb az animacios chunkok erdekelnenek. Mert mostanaban ezen meditalok, hogy kellene a mozgasokat az egyes objektekhez jol eltarolni. Minden jot, TomCat/Abaddon ############################################################################ Ugyebar mindegyikotok tisztaban van (tobbe-kevesbe) kulonbozo arnyekolasokkal, szuper zoomrotatorokkal, es vegulis a grafikaval kapcsolatban szinte mindennel. Akkor mar csak egy dolgot nem ertek: hogy lehet az, hogy meg senkinek sem jutott eszebe egy _rajzoloprogramot_ irni? Erdekes, a zeneszerkesztokbe, a playerekbe mindenki kapasbol belevag, pedig hat abbol tizenketto egy tucat, es egy st3-at vagy ft2-t mar eleg nehez lesz tulszarnyalni (pontosabban maradjunk abban, hogy ez egyelore megfelelo szint). Viszont nem tudom eszrevettetek-e, hogy grafikusaink alig vannak. Szerintem ez betudhato annak is, hogy az utolso hasznalhato rajzolo (hm, osztok-szorzok) cirka ____1989-ben____ jelent meg... Gondolom, mindenki tudja, hogy a dp2-re celzok... Szerintem ugyanolyan freewarekent meg lehetne irni, mint ahogy az st3-at sikerult. Gondoljatok vegig, hogy mekkora dicsoseget szerezhetne vele barki, aki hajlando normalisra megcsinalni! Igenis agyonoptimalizalva, igenis rovidre - elvegre egy _programozo_ igy dolgozik. Ha egy banda belefogna, azt hiszem, mindenki segitene oket - akar itt a coder-l-en, akar barhol mashol. Tehat: CODEREK! PAINTERT A SCENENEK!!! Trajic/h2 ............................................................................ Elobb vagok bele egy operacios rendszer irasaba, mint egy rajzoloprgmeba, ha tul akarom szarnyalni, vagy akarcsak megkozeliteni messzirol az ADOBE PhotoShop 3.x nevut. Fent emlitett sw-termek nem "jo", vagy "kivalo", hanem ELETFORMA. Probald ki. Aztan ha nem volt eleg, kapd elo a Fractal Design Painter-t is. Dupla pelenkat huzz elotte, nehogy ugy jarj, mint en ;-) Egyebkent igazad van, nem rossz "ujjgyakorlat" egy smart rajzolo osszehozasa. Ha tenyleg elkezdodik egy ilyen project, definialjatok valami olyan interface-t, amivel mindenki tud hozza irni plug-in -okat. En peldaul imadom a sejtautomatas torzitasokat... (blur, etc). ERN0 ............................................................................ Hmm.. persze itt mar kozbejon a hasznalhatatlansagi mutato is. Ember, csak a pc-s Deluxe PAint-al ne kelljen csinalni semmit... elegge kezdetleges. Persze az elozo vita/otletgyar nem lett volna rossz. Marmint az, hogy a coder-l elkezd fejleszteni egy rajzprogramot. Ern0-nek uzenem: lattal te mar grtafikust Photoshoppal karakterkeszletet rajzolni.... Amugy a PS3.0 tenyleg egy eszmeletlenul jo program, de inkabb kepretusalasra, effektek hozzaadasara. A Fractal Design P.-hez meg meg nem volt szerencsem. A feluletrol egy kepet mar lattam, ami eleg megnyero volt. Kiprobalnam.... Flex ............................................................................ Egesz jo ez a rajzprogram otlet ! Ha valakinek vannak otletei, hogy mit is varna el egy ilyen programtol, az kuldje mar el nekem, nagyon erdekelne, hogy mit var a mai scene egy jo rajzprogramtol ! (egy szoval sem mondtam, hogy meg akarom irni, de barmi megtortenhet.. - ez csak erdeklodes... -) Udv.:TeeM ui.: mar van egy kb.20 soros listam, hogy mi hianyzik a DP-bol. (pl. a Fractal Painter-bol at lehetne venni nehany poent...) ############################################################################ A temahoz kapcsolodva : talan meg emlekeznek egyesek, hogy irogatok egy ablakozos rendszert assemblyben. A vizsgaidoszak miatt nemileg megtorpantam, de majd most ujult erovel vetem bele magam. Jelen pillanatban odaig fajultak a dolgok, hogy kidolgoztam egy szintaxist, amivel osztalyokat lehet letrehozni az asm proggy kellos kozepen. Ezt persze nem eszi meg a tasm, meg mas sem, de egy elofeldolgozo proggy ezeket asm-ra konvertalja. Ez azert van, hogy megsporoljunk egy csomo unalmas gepelest. Az orokles dolgat meg nem dolgoztam ki teljesen, de lesz, az tuti. Egy kis izelito azoknak, akik netan erdeklodnek : mov eax, [esi:icon.xc] ; ez az icon osztaly xc adatat toltene ; eax-be. esi mutat az osztaly egy ; peldanyara. Mivel asm-ban a pointereknek ; nincs tipusuk, nekunk explicite kell ; eloirni az osztaly tipusat call [esi:icon.redraw] ; ez meg a redraw tagfuggvenyt hivja meg maga az osztaly definialasa vmi ilyesmi lesz : icon class xc dd 0 yc dd 0 contruct:: ...konstruktor kod destruct:: ...destruktor kod redraw:: ...redraw kod .... es meg amilyen tagfuggvenyek kellenek icon endc Szoval, ha lesz valami ebbol a rajzoloprogrambol, akkor a felhasznaloi feluletben asszem tudok segiteni. Meg meg masban is. Szivesen vennek velemenyeket ezzel az asm++ orultseggel kapcsolatban. Udv : Paf ............................................................................ PaF: Szerintem a TASM (3.1-tol) tud objektum orientalt ASMot. (A pontos lehetosegeit nem ismerem, mert meg sose hasznaltam.) Atleta ############################################################################ Most probalkozom eloszor ezzel a zizevel, ha valami nem a legjobb, akkor bocs. Azt szeretnem kerdezni, hogy tudja-e valaki hogyan lehet borland pascal-ban irt windows alkalmazasban meghivni az MSCDEX funkcioit ugy, hogy mukodjenek is. DOS programban minden oke, de windows alatt nem kapok vissza semmit a pufferekben. A verzioszamokat tovabbra is gyonyoruen le tudom kerdezni de nem igazan ez a celom. Ha valaki tudna segiteni megkoszonnem Nagyi (Nagy Istvan) ............................................................................ Az eljaras ha egy DOS-os funkciot hivsz vedett modbol (windows vagy DOS extender tok mindegy): - foglalsz DOS memoriat (lasd: DPMI) ahol megkapod a mem cimet - ennek a teruletnek a DOS-os cimet adod at a DOS funkcionak - majd orulsz hogy mukodik (HA ...) Ez dos extendernel ugy megy hogy DPMI-vel hivod meg a dos funkciot is, amely tamogat olyan hivast, ahol memoriateruleten adod at a parametereket, mert ha kozvetlenul beirnad a szegmens regiszterbe a valos modu szegmens cimet, akkor az ugy nem lesz tul sikeres. (Lasd meg: General Protection Fault es tarsai) Peldaul a pmode/w tukrozi az osszes megszakitast 0-1F-ig, es itt kozvetlen tudsz normal funkciokat hivni, amig nem akarsz cimeket atadni. Ha cimatadasvan akkor viszont: DPMI (kiveve az int 21 es az int 33 mert ott megirtak az extenderben) Nem irtam arrol hogy a DPMI pontosan hogy megy windows alol - mert fogalmam sincs. :( Azert remelem segitettem valamicsket. Hyp-X /Demons ############################################################################ Szoval, mint mindenkinek, nekem is sok doksim, meg peldaprogramom van. Ezek 98%-a trash, szoval allando karbantartast igenyelnek: DEL *.zip Az utobbinal feltunt, hogy eleg sok FONT EDITOR, meg ilyen-olyan FONT kivago programok (?) latnak napvilagot. Szerintem ezek hasznalata puszta idopocsekolas. Sokkal egyszerubb megoldas is van: ASCII sorrendben egy .lbm-be kimentjuk a fontot ugy, hogy a betuk folott egy meghatarozott szinnel olyan szeles csikot huzunk, amilyen szeles a betu. Egy primitiv rutin pedig ez alapjan megallapitja a kezdo offsetet, meg a font szelesseget. A font magassagat pedig pl.: a bal felso sarokban huzott vonal szimbolizalhatja. Nagy elonye, hogy barmilyen valtoztatas a fontban semmilyen kod valtoztatast nem igenyel, csupan a grafikus atrajzolja az .lbm-et... FLEX rulez :-))))) Alex ............................................................................ Tovabbi otleteim: Itt a magassag az konstans, gondolom en. Viszont ezt is jelolhetnenk egy fuggoleges vonallal. Ha pedig minden betunel masik szint hasznalnank a meretvonalakhoz (mondjuk A betu elso szin, B betu 2. szin, C betu 3. szin stb.), akkor osszevissza is elhelyezkedhetnenek a betuk a kepen. TomCat/Abaddon ............................................................................ Nem is tudom, en mar probaltam par karakterkeszletet az Alex fele huzogatos modszerrel atkonvizni, es szerintem nem leanyalom azt a k*&* sok vizszintes vonalat behuzkalni. Ezert a kovetkezot csinaltam: abba a bizonyos primitiv programba be kell epiteni egy ugyancsak primitiv funkciot, ami a karakterek szelesseget is letapogatja (pl. megkeresi azt az elso fuggoleges csikot, ami nem metsz bele a karakterbe.) Ekkor csak a sorok kezdopontjait ill. a karaktermagassagot kell tudnunk, amihez a "grafikusnak" 2 db. pixelt kell mondjuk elhelyeznie a kepen, ha a betuket egy programmal raktuk ki a kepernyore, es biztosan jo Y pozicioban vannak. Ezt ajanlatos vmilyen magasszintu nyelven elvegezni, pl. C/Pascal for Windows (ott ugyis van jo sok cool font). De ha mar itt tartunk, magat a charset file-t is eloallithatja a magasszintu program (pl. van olyan, hogy getpixel), oszt akko' meg azt a bizonyos 2 pixelt se kell kirakni a kepre... Stinyo ............................................................................ Latom a coder-l-en a karakterkeszletes code tanfolyast. Alex leirta az o modszeret, melynek szenvedo alanya vagyok. A modszert csak magasztalni lehet, a code-ot lehet szidni... (itt gepel mellettem, ez a comment). Szoval csak annyit akarok hozzaszolni, hogy nem rossz ez az eljaras. Eloszor is a grafikusnak mind1, hogy odahuzza-e azt a 1 pixel-es vonalat a fontok fole, vagy sem. Masodszor, ha valami valtozik a grafikan (pl. szelesebb lesz az L betu..), akkor csak az L feletti vonalat kell meghosszabbitani es a mogotte levo betuket meg arrebbtolni. Tomcat otlete (amit Alex is emlitett) tovabb egyszerusiti a megoldast. Coder-ek! Egy dologra, azonban felhivnam a figyelmet. Alex kisse tuloptimalizalta a code-ot (word-os masolgatas :-) ) igy a 3pixelnel vekonyabb fontjaim elmentek a NULL:-ba... Azota maradt a byte-os megoldasnal... (1 kepernyos code-okat nem erdemes tuloptimalizalni, ha csak karakterkeszletet masol a picike... :-) ) Flex ............................................................................ khm... Nos, FLEX-el kozosen dolgozunk egy projecten, aminek szerves resze a fennt emlitett modszer. A dolgot ugy kepzeljetek, hogy egyszeruen begepeled ASCII sorrendben a karaktereket. Ezutan egy szinnel (nalunk 0ffh) huzol egy folytonos vonalat, amit pl. a DeLuxe paint teglalap huzo szalkeresztjevel a kivant helyen megszakitasz... En, Alex aki rajzolni aztan vegkepp nem tud, graf. programot kezelni meg ugyse, kb. 20 perc alatt eloallitottam igy egy fontot. Ez egy grafikusnak, akar 5 perc alatt is meglehet. Nos, a programrol, ami beolvas: 1 ciklus, azaz 5 sor: a kepernyo bal felso sarkaba huzott vonal vegigkovetese. ha a vonal megszakadt, akkor mar tudjuk milyen MAGAS a font. 1 ciiklus, de mar 20 sor: innen az offsetet egyesevel vegigkergetjuk a kepernyon. Ha 0ffh-t talalunk, akkor megvan a bal felso sarka a fontnak. Ameddig pedig a vonal tart, az a szelessege. Es igy tovabb. Tehat osszesen: 25 sor forraskod + kb. 5 perc grafikai elokeszites ----------------------------------- mindenhol hasznalhato eljaras "kivulrol" modosithato egyszeru Szerintem ennel jobb, egyszerubb modszer nincs. Egyedul 4kb intro-knal lehet gond, mivel a kep redundanciat (azok a franya vonalak...) tartalmaz. Igy kb. 25-30 byte-al, hosszabb lesz az adatmennyiseg. :-))) Tapasztalat: egy 320x200-as kepernyon 2db SVGA-n is jol olvashato font elfer... Ha valakit erdekel(?) akkor van forras+font is.... Tomcat: A tobbszinu megoldas szerintem nem annyira jo otlet, mert egyreszt a grafikusok (meg a FLEX) kitepi a hajat mire megrajzolja a vonalakat, es a font szinei is lekorlatozodnak. Alex ............................................................................ Mi lenne, ha a 'fontpic' alatt lenne egy pepita pattern mondjuk ketfajta sotetszurkebol, es minden betu boundolva lenne a fix hatarokra (a bal szele). A font betablazo meg ugy allapitana meg a szelesseget, hogy a fix hatartol elkezdene jobbra letapogatni az oszlopot, es ha olyat talal, hogy attol jobbra mar nincs rajzolva semmi, azt venne a betu szelessegenek... lerajzolom: (Plane-os fontpic-nel celszeru a patternt (a max szelesseget) byte-hatarra align-olni talan.) 012345670123456701234567 XXXX....XXXXX:::XX...XXX .XX.....:::XX:::XX..XXX. '.' - egyik szurke .XX.....:::XX:::XX.XXX.. ':' - masik szurke .XX.....:::XX:::XX.XX... 'X' - font anyag szine .XX.....:::XX:::XX.XXX.. .XX.....:::XX:::XX..XXX. .XX.....::XX::::XX...XXX XXXX....XXX:::::XX...XXX Egyertelmu, az 'I' betu 4 pixel szeles, a 'J' pedig 5, viszont a francos 'K'-ban van egy szakadas. Ezert nem szabad a scannelesnek leallni az elso csupa-zerus oszlopnal, hanem vegig kell scannolni a maxwidth-et. Igy nem kell a grafikusnak kuzdeni a mindenfele segedvonalak berajzolasaval, valamint a kep onmagaban is felhasznalhato a font prezentalasara. Az pedig ne aggasszon senkit, hogy az egesz kepen vegig kell menni, egy max fontpic nem valami nagy size. Ha mar belemasztunk a temaba, bonyolitsunk egy kicsit rajta! Sokkal szebb a font, ha megengedjuk egyes betuknek, hogy egymasba masszanak, legalabbis szelessegileg (sot, ez egyes betutipusoknal kovetelmeny). Nem vagyok egy kepzett enzigrafikus, de talan menni fog: 0123456789A XX XX XX XXXX XXXX XX XXX XX XXXX XX XX XX XXXX XX XX O XOO Ket szelesseget kell ekkor kiszamolni minden beture. Az egyik az, hogy a betu kepe milyen szeles (amirol eddig is szo volt). A masik szelesseg-ertek ezzel egyenlo vagy kevesebb nala, ez pedig azt hatarozza meg, hogy a kovetkezo betut honnan kell kezdeni. Fenti pelda szerint a 'K' betu 10 szeles kiirasilag, de a kovetkezo betut a 'K' kezdetetol szamitott 7. pozicion el lehet kezdeni. A font megrajzolasanal mas szinnel kell rajzolni a "kilogo" reszeket, ezzel sincs segedvonalas macera. Ha a palettaban a ket szin egyforma, a sok lmer nem is jon ra a trukkre, hogy honnan tudja a prg, hogy mennyire szabad belemaszni a betube. Bal oldalra kicsit veszelyesebb a muvelet, mert a bal kilogo farkinca szelessegevel jobbrabb tolodik a betu x=0 pontja (source), de a kepernyore megis a bal szeltol kell bemasolni a fontot. Meg egy aprosag: a betu hosszhoz ne konstans 1 vagy 2 erteket adjatok hozza, a kovetkezo betu x-poziciojat meghatarozando, hanem egy valtozot. A valtozo neve pedig legyen "Spacing"... :-) Jo, jo, leallok, a vektoros fontokrol most nem irok. ERN0 ############################################################################ 1.Hogy kell generalni IFS fraktalokat??? 2.Ismeri-e valaki az FractInt IFS parameterallomany egyes ertekeinek jelenteset??? 3.Hogyan morpholodnak egymasba az IFS fraktalok ??? TomCat/Abaddon ............................................................................ 1. van erre egy fdesign nevu program, ez simtelen elerheto. 2. az ifs-eket ugy hozhatjuk letre, hogy veszunk egy pontot kiindulaskeppen es ezen vegzunk el kulonfele muveleteket, forgatas, eltolas. ezekbol a transzformaciokbol is tobb fajta lehet. magyarul pl. van 3 eltolas+forgatas. ezeket ismetelgetjuk jo sokszor es igy kapjuk meg a vegleges kepet. 3. 2 fele generalasa letezik az ifs-eknek, amirol en tudok. az egyik a determinisztikus, amikor sorban megyunk vegig a transzformaciokon es egyre reszletesebb kepet keszitunk. ez baromi lassu. a masik a chaos-algoritnus, amivel veletlenszeruen valasztunk egy transzformaciot, es azt alkalmazzuk az elozoleg kiszamolt pontra. a morp szerintem ugy oldhato meg, hogy kiszamolod elore az alakzatokat es azokat morpholod, mintha csak pontokbol allnanak. ez akkor nez ki jol, ha determinisztikus algoritmussal szamoltunk. udv, rod ............................................................................ > 1. Aki tud barmilyen Fractal-okkal kapcs. proggit, az lecci, irja meg, hol > van fent! ftp.univie.ac.at /pc/dos/msdos/graphics/frain192.zip ............................................................................ A /pub/demos/incoming-ban is megtalalhato a FractInt 19.2 es a FDesign 3.13 (Koszi Rod!) TomCat/Abaddon ############################################################################ Korabban tobbetek leveleben lattam, hogy hasznalt CSG-t vagy volt ra otlete. Enegem erdekelne, hogy ki, hogy csinalta: a metszet, az unio es a kivonas muveletek... TomCat/Abaddon ............................................................................ Szoval minden CSG-ben szereplo objecthez kell egy fuggveny, ami megmondja, hogy egy pont az adott testen belul avagy kivul helyezkedik el. Ez legyen mondjuk a BOOL inside(x,y,z) Ezt fogjuk felhasznalni a tovabbiakban. A csel az lesz, hogy miutan megtalaltuk a kilott egyenesen a legkozelebbi feluletet, megnezzuk, hogy ki kell-e rajzolni. Lassunk egy peldat: ket atfedesben levo gomb AND-je. Ekkor majd csak a belso feluleteket kell kirajzolnunk, tehat mindket gomb feluletenek csak azt a reszet, ami benne van a masikban. Az elobbi fuggvenyunkkel a feladat eleg konnyen megoldhato: csak akkor vesszuk figyelembe a metszespontot, ha a masik gomb inside fuggvenye igaz erteket ad ra. (Vigyazz, hogy egy object sajat inside fuggenyet ne hivd meg, amikor a sajat metszespontjarol van szo...) Ez alapjan talan mar el lehet indulni. A kivonas is hasonlo, persze mas feltetelekkel. Talan meg annyit, hogy osszetett objecteknek is lehet inside fuggvenyuk, pl a ket gomb ANDje eseteben a keletkezett test inside-ja a ket alaptest inside-janak AND-je... Sok sikert a probakozasokhoz. Egyebkenet, a fentiek sajat 5letek, szoval lehet, hogy nem ez a CSG, de nekem jol mukodott a dolog. Udv: Pogi ............................................................................ Hogy taroltad az ilyen osszetett objektetket? Gondolom az objektek egy lancolt listan voltak, es ott hogy jelezted az AND, OR, SUB kapcsolatokat ? Udv, TomCat/Abaddon ............................................................................ Bocs, hogy egy kis delay-el reagalok, de sajnos hetvegenkent otthon szokom lenni. A CSG-vel kapcsolatban nem sokat tudok mondani, en csak olvastam rola, es probaltam megirni, de nem probaltam ki. Szerintem ha szepen felepited faba az egeszet akkor minden menni fog. A muveleteket szerintem logikusan gondolkozva ki lehet talalni. Nicke ............................................................................ Szerintem a legegyszerubb, ha binaris faban tarolod az objecteket, a megfelelo boolean operaciokat pedig a ketteagazasoknal. Lehetne maskepp is, de ez a legegyszerubb. Udv: Pogi ............................................................................ CSG: mivel CAD-rendszerek fejlesztesevel foglalkozok, elmeleti sikon foglal- koztam egy keveset (nagyon keveset) a geometriai modellezesi technikalkkal. A CSG-t ugy szokas megoldani, hogy: 1, egyenes lapok eseten felsikokat (mondjuk normalissal) es tudod, hogy melyik oldalon van anyag --> metszetuk kiadja a testet 2, ezzel megegyezik az inside fuggveny, csak kicsit nehezebben kezelheto. Erdemes vegiggondolni, mikor melyiket eri meg alkalmazni 3, a halmaz muveleteket es az objektumokat nem lancolt listan, hanem grafon kell tarolni, hiszen igy egy hierarchiat tudsz alkotni, ami konyebben kezelheto, editalhato, stb. Ugy kepzeld el, hogy a legalso szinten csak objektumok vannak, es beloluk binaris grafot epitesz (az osszes magasabb szintu csomoponton muve- letek vannak, mint AND,OR,stb.): AND / \ OR gomb / \ kocka hexametaszimplexeder stb. Hat, gyors az nem lesz, de testmodelltol nem is lehet elvarni. Meg egy megjegyzes: ezek az eljerasok _nem_ metszetvonal-szamito eljarasok. Ahhoz ana- litikus eszkozok kellenek, a jelenlegi CAD-allas szerint a feluleteket polie- derekkel csempezik, es igy kozelitik. De ez DEMO-knal nem is szukseges. Barmily kerdes eseten: kiszely@bigmac.eik.bme.hu, tovabba ha gondolod, hozzajarulok levelem kozlesehez. Bar kicsit pongyola lett. exit23 ############################################################################ Irhatnal par sort, hogy hogyan keszult az a tracelt kep, amit feltettel az incoming konyvtarba... Pl. azok a haromszogek, hogyan arnyaltak (milyen normal vektorokkal szamolsz). Hogyan keszult a hatter stb. Kivancsi vagyok, TomCat/Abaddon PS: Lesz publikus BetaTrace? (En ugy erzem az en PenTrace programom nem erdemes publikalni futtathato formaban). ............................................................................ A fennebb emlitett piktura a BetaTrace v1.12 - vel keszult, ez a mostani verzioja a sajat fejlesztesu rajtrakkeremnek. Nehany mondat a fejlesztesrol: - TP7.0 - ban folyik - kb 3 eve - jelenleg az elso C (watcom !!) vezion dolgozok - a fenti verziobol lehet hogy lesz public relase is !! - MACHINE: 386DX-40, 2MB, NO FPU ! A kep: Az ismert BEETHOVE.OBJ szerepel benne (2668 face), phong arnyekolassal. Az objektet a FACE 1.2-vel konverttaltam, IMAGINE .OBJ - bol, BetaTrace .BET-be. A tracer az arnyekolashoz un. PSZEUDO v PONT normalokat alkalmaz, ezek linearis interpolaciojaval allithato elo a PHONG SHADING. A tracer ugyancsak hasznalja a PHONG ILLUMINATION modelt is. A hatterben szereplo minta egy egyszeru matematikai textura (sin,sin,sin...). Rendering time: 0h : 5m : 18s Strezi ............................................................................ Ez ugye azt jelenti, hogy az elek menten interpolalod a pontok normalvektorait es aztan az igy kapott normalvektotokat meg a scanline menten is interpolalod?? TomCat/Abaddon ############################################################################ The Final Points from The Party 95 (with revisions by Phoenix[Kosmic]) Place Points EntryNo "Name" PC DEMO 1 1546 5 Plant & EMF, "Caero" 2 508 4 Jamm, "Dream" 3 448 19 Rage, "Reanimator" 4 346 1 Dubius, "State of Hate" 5 339 10 Pulse, "Reve" 6 320 29 Xtacy, "Stuff" 320 2 Masque, "E-Beat" 8 244 12 Coma, "60BR W" 9 211 30 Omicron, "Mind Body Soul" 10 193 3 Surprise Productions, "Cocoon" 11 188 14 RealTech, "Aquaphobia" 12 165 13 Craze, "Flow" 13 139 7 Hyperopia, "Money" 14 134 20 INF, "Utopia" 15 127 8 Eternia, "New Dimension" 16 120 15 Xerius Productions, "Dive" 17 103 11 Analogue, "Circuit" 18 79 9 Kloon, "It" 19 78 17 TPolm, "Encore" 20 74 18 fudGe 21 68 6 Zta,Tsi and Orange, "Flop" 22 65 28 Goto 10, "380 Volt" 23 56 21 Sublogic, "Blur" 24 42 26 Asylum, "Hurry" 25 40 27 Noice, "Confusion" 26 29 16 Mausis, "Dead End" 27 26 24 Smurf Productions 28 22 23 blaSM, "Not!" 29 13 25 Perfection 30 7 22 TKB, "Paroxysm 13" (fast intro entry) PC INTRO 1 1424 8 Cubic Team & $een, "Lasse Reinbong" 2 564 12 Yodel, "Illumination" 3 521 4 Orange, "The Sea Robot of Love" 4 338 5 SiN, "Poison" 5 331 17 Cascada, "TP5 Intro" 6 278 1 Resistance 7 242 2 The Grid, "Arrow" 8 221 7 The Coexistence, "Unreadable" 9 194 3 Orange, "The Royal Family" 10 184 9 Evolution, "The Missing Link" 11 132 6 ? 12 92 13 Noware 13 79 14 Karma, "Louise" 14 77 21 Robymus 15 73 19 Elfsong, "Oops!" 16 66 20 Funk!, "Reality" 17 54 11 Symptom, "Charity" 18 38 10 Rebels, "X-File" 19 25 15 Qurex, "Purple Magic" 20 18 18 Spirit, "Just-ice" 21 11 16 Grunt ############################################################################ ----------------------------------------------------------- BMP_INFO ver:0.91 irta Kaproncai Tamas (tomcat@rs1.szif.hu) atnezte Nagy Daniel (nagyd@almos.vein.hu) ----------------------------------------------------------- Bitterkepes Fajl-Formatum A Windows bitterkepes fajlok eszkozfuggetelen bitterkepes formatumban tarolod- nak (DIB format). Ennek segitisegevel a Windows a kulonbozo tipusu kepernyok meghajtoival konnyen megjelenitheti a bitterkepet. Az eszkozfuggetlenseg azt jelenti, hogy a bitterkep egy pixelenek szinet olyan formaban adjuk meg, hogy az fuggetlen az egyes kepernyok megjelenito eljarasatol. Az alapertelmezett fajlnev kiterjesztese a Windows DIB fajljanak a .BMP. Bitterkepes Fajl-Strukturak Mindenegyes bitterkepes fajl tartalmaz egy bitterkepes fajl-fejlecet, egy bit- terkep-informacios fejlecet, egy szin tablazatot es egy bajt sorozatot, amely a bitterkep bitjeit definialja. A bitterkepes fajl-fejlec a bitterkepes fajl tipusarol, mereterol, szerkezeterol tartalmaz informaciokat. Ez a fejlec TBITMAPFILEHEADER strukturakent definialt. A bitterkep-informacios fejlec TBITMAPINFOHEADER strukturakent definialt, ami a bitterkep dimenziojat, a tomorites tipusat, a szinek formatumat adja meg. A szin tablazat TRGBQUAD strukturakbol allo tombkent definialt, amely annyi elemet tartalmaz, ahany szin van a bitterkepen. A szin tablazat nem jelenik meg a 24-bites szinu bitterkepeknel, mivel minden pixel a 24-bites voros-zold- kek (RGB) ertekevel tarolt az adott bitterkep adatteruleten. A szineknek a tablazatban fontossagi sorrendben kell megjelenni. Ez segit a kepernyo-meghaj- tonak, ha az eszkoz nem tud annyi szint megjeleniteni, amennyi a bitterkepen van. Ha a DIB Windows 3.0-as vagy kesobbi verzioju, akkor a meghajto hasznal- hatja a TBITMAPINFOHEADER struktura biClrImportant mezojet, hogy megallapitsa, hogy mely szinek a fontosak. A TBITMAPINFO struktura a bitterkep-informacios fejlec es a szin tablazat egy kombinaciojat is abrazolhatja. A szin tablazatot azonnal kovetik a bitterkep bitjei, melyek BYTE tipusu tombokbol allnak es a bitterkep egymast koveto sorait, ill. "scanline"-jait abrazoljak. Minden scanline egymast koveto baj- tokbol all, melyek a pixeleit abrazoljak balrol-jobbra. Egy scanline-t abra- zolo bajtok szama a szinek formatumatol es a bitterkep pixelekben megadott szelessegetol fugg. Ha szukseges, a scanline nulakkal-kiegszitett, hogy hossza a 32 tobbszorose legyen. A szegmenshatarok barhova eshetnek a bitter- kepen. A scanline-ok a bitterkepen alulrol felfele vannak tarolva. Ez azt jelenti, hogy az elso bajt a tomben a bitterkep bal also sarokban levo pixelet abrazolja, az utolso bajt pedig a jobb felso sarokban levo pixelt. A TBITMAPINFOHEADER struktura biBitCount mezoje meghataroza a pixelekhez tar- tozo bitek szamat es a szinek maximalis szamat a bitterkepen. Ez a mezo a kovetkezo ertekeket veheti fel: Ertek Jelentes 1 A bitterkep monokrom es a szin tablazat ket bejegyzest tartalmaz. Minden bit a bitterkepben egy pixelt abrazol. Ha a bit kikapcsolt, akkor a pixel a szin tablazatban elsonkent bejegyzet szinnel kerul a kepernyore. Ha a bit bekapcsolt, akkor a pixel a tablazatban masodik- kent bejegyzet szint kapja. 4 A bitterkepnek maximum 16 db szine lehet. Minden pixel a bitterkepen egy, a szin tablazatba mutato 4-bites indexszel abrazolt. Peldaul ha az elso bajt a bitterkepen hexa 1F, akkor a bajt ket pixelt abrazol. Az elso pixel a szin tablazat masodikkent bejegyzett szinet tartalma- za, a masodik pixel pedig a tizenhatodikkent bejegyzett szint. 8 A bitterkepnek maximum 256 db szine lehet. Minden pixel a bitterkepen egy, a szin tablazatba mutato 1-bajtos indexszel abrazolt. Peldaul, ha az elso bajt a bitterkepen hexa 1F, akkor az elso pixel a szin tabla- zat harminckettedikkent bejegyzett szinet tartalmaza. 24 A bitterkepnek maximum 2^24 db szine lehet. A bmiColors ( vagy bmciColors) mezo erteke NULL, es a bitterkep tombjeben minden 3-bajtos szekvencia a pixel voros, zold es kek komponensenek relativ intenzita- sat abrazolja. A TBITMAPINFOHEADER struktura biClrUsed mezoje megadja a bitterkep altal valo- ban felhasznalt szinek szamat. Ha a biClrUsed mezo nullra allitot, akkor a bitterkep az osszes szint hasznalja a biBitCount mezo ertekenek megfeleloen. Egy altenativ formaja ezen bitterkepes fajlnak, amely a TBITMAPCOREINFO, a TBITMAPCOREHEADER, es TRGBTRIPLE strukturak hasznalata. Bitterkep Tomoritese Windows 3.0-as vagy kesobbi verzioja a run-length encoded (RLE) formatumot tamogatja a 4 vagy 8 bit per pixeles bitterkepek tomoritesenel. A tomorites csokkenti a bitterkep lemezes vagy memoriabeli tarolasahoz igenyelt teruletet. 8-Bit-per-Pixeles Bitterkepek tomoritese Ha a TBITMAPINFOHEADER struktura biCompression mezoje BI_RLE8 erteku, akkor a DIB run-length encoded formatumu tomoritest hasznal a 256-szinu bitterkephez. Ez a formatum ket modot hasznal: a kodolt modot es az abszolut modot. Mindket mod barhol megjelenhet barmely bitterkepen. Kodolt Mod A kodolt modu informacio egysege ket bajt. Az elso bajt megadja azoknak az egymast koveto pixeleknek a szamat, amelyek a masodik bajt altal tartalmazott szin-indexszel rajzolandok. Az elso bajtot a parbol nullara is allithatjuk, eloidezve egy kilepest, amely a sor veget, a bitterkep veget, vagy egy deltat jelezhet a masodik bajttol fuggoen, amely erteke 0 es 2 kozotti lehet. A hasznalhato ertekek jelentesei a kovetkezok: Masodik bajt Jelentes 0 Sor vege. 1 Bitterkep vege. 2 Delta. Az ezt koveto ket bajt elojel nelkuli erteke mutatja a vizszin- tes es a fuggoleges eltolast az aktualis poziciotol a kovetkezo pixel- hez. Abszolut Mod Az abszolut mod a par elso bajtjanak nullara allitasaval es a masodik bajt 3 es hexa FF ertek koze allitasaval jelzett. A masodik bajt az ot koveto bajtok szamat adja meg. Minden bajt egyetlen pixel szin-indexet tartalmaza. Minden bajt sorozatot word hatarig kell igazitani. Ime egy pelda a 8-bites bitterkep- re (A ketjegyu hexa ertekek a masodik oszlopban egy szin-indexet abrazolnak az egyes pixelekhez): Tomoritett adatok Kibontott adatok 03 04 04 04 04 05 06 06 06 06 06 06 00 03 45 56 67 00 45 56 67 02 78 78 78 00 02 05 01 5 lepes jobbra es 1 le 02 78 78 78 00 00 Sor vege 09 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 00 01 RLE bitterkep vege 4-Bit-per-Pixeles Bitterkepek tomoritese Ha a TBITMAPINFOHEADER struktura biCompression mezoje BI_RLE4 erteku, akkor a DIB run-length encoded formatumu tomoritest hasznal a 16-szinu bitterkephez. Ez a formatum ket modot hasznal: a kodolt modot es az abszolut modot. Kodolt Mod A kodolt modu informacio egysege ket bajt. Az elso bajt megadja azoknak az egymast koveto pixeleknek a szamat, amelyek a masodik bajt altal tartalmazott szin-indexekkel rajzolandok. A masodik bajt ket szin-indexet tartalmaz, egyet a felso reszeben ( felso 4 bit) es egyet az also reszeben. Az elso pixel a felso reszben megadott szinnel rajzolt, a masodik az also reszben megadott szinnel rajzolt, a harmadik a felso reszben megadott szinnel rajzolt, es igy tovabb, amig az elso bajt altal adott osszes pixel ki nem rajzolodott. A par elso bajtjat nullara is allithat- juk, eloidezve egy kilepest, amely a sor veget, a bitterkep veget, vagy egy deltat jelezhet a masodik bajttol fuggoen, amely erteke 0 es 2 kozotti lehet. Ezen ertekek jelentese megegyezik a 8-bit-per-pixeles DIB-evel. Abszolut Mod Az abszolut mod az elso bajt nullat tartalmaz, a masodik bajt az ot koveto bajtok szamat adja meg. Minden bajt a felso es also reszeben is tartalmaz egy- egy szin-indexet egy pixelhez. Minden bajt sorozatot word hatarig kell igazi- tani. Ime egy pelda a 4-bites bitterkepre (Az egyjegyu hexa ertekek a masodik oszlopban egy szin-indexet abrazolnak az egyes pixelekhez): Tomoritett adatok Kibontott adatok 03 04 0 4 0 05 06 0 6 0 6 0 00 06 45 56 67 00 4 5 5 6 6 7 04 78 7 8 7 8 00 02 05 01 5 lepes jobbra es 1 le 04 78 7 8 7 8 00 00 Sor vege 09 1E 1 E 1 E 1 E 1 E 1 00 01 RLE bitterkep vege Bitterkep Pelda A kovetkezo pelda egy 16-szinu bitterkep (4 bit per pixel) szoveges leirasa: Win3DIBFajl TBITMAPFILEHEADER Tipus 19778 Meret 3118 Foglalt1 0 Foglalt2 0 OffsetBitek 118 TBITMAPINFOHEADER Meret 40 Szelesseg 80 Magassag 75 Szinsikok 1 BitekSzama 4 Tomorites 0 KepMeret 3000 XPixelPerMeter 0 YPexelPerMeter 0 HasznaltSzinek 16 FontosSzinek 16 Win3SzinTablazat Kek Zold Voros NemHasznalt [00000000] 84 252 84 0 [00000001] 252 252 84 0 [00000002] 84 84 252 0 [00000003] 252 84 252 0 [00000004] 84 252 252 0 [00000005] 252 252 252 0 [00000006] 0 0 0 0 [00000007] 168 0 0 0 [00000008] 0 168 0 0 [00000009] 168 168 0 0 [0000000A] 0 0 168 0 [0000000B] 168 0 168 0 [0000000C] 0 168 168 0 [0000000D] 168 168 168 0 [0000000E] 84 84 84 0 [0000000F] 252 84 84 0 Kep . . Adatterulet . A bitterkephez kapcsolodo Windows strukturak: TBITMAPFILEHEADER (14 bajt) WORD bfType 'BM' DWORD bfSize WORD bfReserved1 0 WORD bfReserved2 0 DWORD bfOffBits TBITMAPINFOHEADER (40 bajt) DWORD biSize DWORD biWidth DWORD biHeight WORD biPlanes 1 WORD biBitCount 1, 4, 8, 24 DWORD biCompression 0 (BI_RGB), 1 (BI_RLE8), 2 (BI_RLE4) DWORD biSizeImage DWORD biXPelsPerMeter DWORD biYPelsPerMeter DWORD biClrUsed DWORD biClrImportant TRGBQUAD (4 bajt) BYTE rgbBlue BYTE rgbGreen BYTE rgbRed BYTE rgbReserved 0 TBITMAPINFO (40+4*? bajt) BITMAPINFOHEADER bmiHeader RGBQUAD bmiColors[] TBITMAPCOREINFO (12+3*? bajt) BITMAPCOREHEADER bmciHeader RGBTRIPLE bmciColors[] TBITMAPCOREHEADER (12 bajt) DWORD bcSize WORD bcWidth WORD bcHeight WORD bcPlanes 1 WORD bcBitCount 1, 4, 8, 24 TRGBTRIPLE (3 bajt) BYTE rgbBlue BYTE rgbGreen BYTE rgbRed TBITMAP Short bmType Short bmWidth Short bmHeight Short bmWidthBytes BYTE bmPlanes BYTE bmBitsPixel LPSTR bmBits ............................................................................ BMP_info: 2 eve en is csinaltam egy leirast (forditast ugyanarrol a file- rol), a BBS-eken BMPHUN.ARJ neven kering. Altalaban egyutt szokott lenni a FLIHUN-nal es a GIFHUN-nal. A te leirasod szerintem jobban sikerult (komolyan), csak azert szolok, hatha tudsz bennuk valami hasznalhatot talalni. exit23