.Start.of.DemoNews.118..............................................Size:45,139 ______/\___________________________ __ ________________ ___ /\_______ \____ \ ________ _ _ ______ \ / \| \ ________ | \/ ______/ / | \ _) \ \_/ \ | \ / \ \ _) \ | \______ \ / | \ \ | \ | \ / \ \ /~\ \ / \ \_____ /_______/___| /________/ \____\_____/_______/_________/________/ \_____/ |____/ | Subscribers : 2014 DemoNews Issue #118 - March 5, 1996 | Last Week : 1950 ------------- | Change : +64 DemoNews is a newsletter for the demo scene. | Archive Size : 2169M It is produced by Hornet at the site ftp.cdrom.com. | Last Week : 2108M Our demo archive is located under /pub/demos. | Remaining : 795M | =-[Contents]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Line Section ------ ------------------------------------------------------------------- 33 Calendar 55 Top Downloads 78 Uploads 214 Articles 216 Introduction................................Snowman 249 Quotes Heard in the Demoscene...............Trixter 362 10 Ways NAID '95 Will Differ from NAID '96..GD 527 Funktracker Port to Linux...................JsNO 550 Intro to 3D Graphics - Volume 03............Kiwidog 945 Subscribing 960 Closing =-[Calendar]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Date Event Location Concact Points --------- ------------------- --------- ------------------------------------- 29 Mar 96 Mekka Germany PV80090@PH80090.HH.eunet.de http://www.xs4all.nl/~blahh/RAW/Parties/Invitations/Mekka.html 02 Apr 96 The Gathering Norway mikaels@powertech.no http://www.ifi.uio.no/~uwek/Crusaders/TG 05 Apr 96 Symposium Germany gandalf@blackbox.shnet.org http://134.28.37.10/~frank/bbx-sym96/bbx96.html 06 Apr 96 X Netherlnd cba@xs4all.nl http://www.xs4all.nl/~herkel 31 May 96 Naid Canada naid@autoroute.net http://www.autoroute.net/~naid More information is at http://hagar.arts.kuleuven.ac.be/~sdog/party.html =-[Top Downloads]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= NOTE: Statistics are sometimes slightly off due to symbolic links, mirrors, renamed files, and other things that affect the log files. Pc Times FileName.Ext Pc Times FileName.Ext Pc Times FileName.Ext -- ----- --------.--- -- ----- --------.--- -- ----- --------.--- 1 00416 ft206.zip 1 00238 mfx_tgr2.zip 1 00044 bondage.zip 2 00238 mfx_tgr2.zip 2 00190 nooon_st.zip 2 00035 airwar.zip 3 00236 cp16.zip 3 00188 ftj_ymca.zip 3 00032 spacetit.zip 4 00190 nooon_st.zip 4 00184 animate.zip 4 00026 dst_frac.zip 5 00188 ftj_ymca.zip 5 00129 symbolog.zip 5 00026 vamp10.zip 6 00184 animate.zip 7 00172 scrmt321.zip 1 00426 ft206.zip 1 00152 ggouro2.zip 8 00161 it105.zip 2 00234 cp16.zip 2 00119 dcc_3de.zip 9 00161 ft204.zip 3 00172 scrmt321.zip 3 00115 dn116_3d.zip 4 00161 it105.zip 4 00097 pmw122.zip 5 00090 s64.zip =-[Uploads]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =----------------------------------------------------------[File Information]-= All files listed below are on ftp.cdrom.com under /pub/demos. Please keep in mind that all ratings are subjective. If your file transfers are too slow, there are several alternatives: Our code mirror is ftp.co.iup.edu/code. ftpadmin@ftp.co.iup.edu for help. Try getting files from the web at http://www.cdrom.com/pub/demos See /hornet/demonews/demonews.102 for details about ftpmail. You may also wish to check out a couple of other good demo sites: ftp://ftp.arosnet.se/e:\demo maintained by Zodiak / Cascada ftp://hagar.arts.kuleuven.ac.be/demos maintained by Sleeping Dog / Natives Here are also a few good WWW links to try out (under construction): http://www.th-zwickau.de/~maz/sound.html for music and sound utils =-------------------------------------------------------------[Demos:General]-= Location /demos/alpha Size Rated Description =-------------------------------- ---- ----- ---------------------------------= /1996/d/distant.zip 5 **** Distant by Remal /1996/j/jump_n.zip 208 *+ Jump by Nova =-------------------------------------------------------------[Music:General]-= Location /demos/music Size Rated Description =-------------------------------- ---- ----- ---------------------------------= /disks/1996/m/myst0296.zip 1239 ***+ Mystique Music Disk 02/96 /songs/1994/mod/f/fullmoon.zip 163 ** Full Moon Rock by Heatbeat /songs/1994/mod/i/iridium.zip 247 *** Iridium by Misty and Daeron /songs/1994/mod/k/killingf.zip 96 ***+ Killing Floor v2.1 by Chorus+Sid /songs/1994/mod/m/mypolska.zip 114 **** Myonnytspolska by Dizzy /songs/1994/mod/n/netherwd.zip 293 ***+ Netherworld by Probe /songs/1994/mod/n/nk_acid2.zip 144 *** Acid Jazz (pt 2) by Nuke /songs/1994/mod/n/nocorner.zip 67 **+ No Corners by The Master /songs/1995/mod/d/deci.zip 247 * Deci by T.U.O /songs/1995/mod/j/julius.zip 289 ***+ Julius! by Julius /songs/1995/s3m/g/ghost.zip 116 ** Celes.Mel. by Zaigamor Spellweaver /songs/1995/s3m/v/vibrphns.zip 77 *** Vibraphones by Julien Lariviere /songs/1995/xm/h/h2-brght.zip 238 * Bright Green World by Trajic /songs/1995/xm/i/ineed.zip 563 *** I Need the Actions by Lizardking /songs/1995/xm/l/lk_indi.zip 715 * Elvis E. Ind. by LK+Ante Lundgren /songs/1995/xm/l/lk_infer.zip 417 ***+ Inferno Dance by Lizardking /songs/1995/xm/l/lk_sat.zip 715 * Saturday Night by Lizardking /songs/1995/xm/p/physiogn.zip 293 ***+ Physiognomy by Trajic /songs/1996/it/j/joint.zip 136 *+ Joint by Galahad /songs/1996/it/n/no-secon.zip 107 *** Second Sight by Delta X /songs/1996/it/v/vs_tefth.zip 232 ***+ The Soul Tefth by Vadim VS /songs/1996/mod/d/dem-fl.zip 70 ***+ Flatloop by ??? /songs/1996/mod/d/dieindus.zip 76 *** Die Industry by Frelancer /songs/1996/mod/d/dream_s1.lha 204 ** Dream Sequence Part 1 by Hypno /songs/1996/mod/d/dream_s2.lha 95 *** Dream Sequence Part 2 by Hypno /songs/1996/mod/d/dream_s3.lha 100 **+ Dream Sequence Part 3 by Hypno /songs/1996/mod/h/heavenp.zip 51 ** Heaven of Pain by Madokan /songs/1996/mod/m/mars.zip 97 ** Mars Power by Michiru /songs/1996/mod/v/venus.zip 96 **+ Venus Power by Michiru /songs/1996/s3m/g/g_gcntri.zip 131 ***+ Centauri Grey by GentlE /songs/1996/s3m/g/gals.zip 112 ***+ Gals Spakoz by Zenecade /songs/1996/s3m/g/gf_alway.zip 97 ***+ Always Dark by Ghost Fellow /songs/1996/s3m/g/gf_depen.zip 121 ***+ Dependance by Ghost Fellow /songs/1996/s3m/g/gf_heave.zip 162 **** Heaven is So Far by Ghost Fellow /songs/1996/s3m/g/gf_inter.zip 77 **** Interstice by Ghost Fellow /songs/1996/s3m/g/gf_lost.zip 150 *** Lost Soul by Ghost Fellow /songs/1996/s3m/g/gf_space.zip 117 *** Space Killer by Ghost Fellow /songs/1996/s3m/g/gf_techn.zip 137 *** Tech Not! by Ghost Fellow /songs/1996/s3m/g/gf_willb.zip 76 ***+ This Will Be by Ghost Fellow /songs/1996/s3m/i/icefirst.zip 262 + Think About.. by George Gaspari /songs/1996/s3m/l/lush.zip 138 ***+ Lush Forests by Zaig. Spellweaver /songs/1996/s3m/m/m-river.zip 137 **+ River of Sadness by Guizmo /songs/1996/s3m/m/m-rnr.zip 177 *** R'n'R by Uterere /songs/1996/s3m/m/m-spell.zip 197 **+ Gypsy's Spell by Guizmo /songs/1996/s3m/m/m-war.zip 263 *** WarCraft by Guizmo /songs/1996/s3m/m/meta.zip 59 *** Metamorphica by Zenecade /songs/1996/s3m/n/no-knife.zip 67 **+ CutThroat by SamH /songs/1996/s3m/n/no-var-p.zip 217 **+ Variable-P by Syrinx /songs/1996/s3m/n/no-zjump.zip 292 ***+ Zydeco Jump by Stote /songs/1996/s3m/p/pr-adjst.zip 221 ***+ Adjustments by Darkwolf /songs/1996/s3m/p/pr-aware.zip 143 *** Awareness by Darkwolf /songs/1996/s3m/v/v-river.zip 116 **+ The River Eternal by Vegas /songs/1996/xm/e/echnaton.zip 244 * Echnaton by Scolnick /songs/1996/xm/g/gl-night.arj 618 *** Forever Night by Glitch /songs/1996/xm/h/holyhell.zip 215 *+ Holyhell by ??? /songs/1996/xm/h/htime.zip 415 ** House Time by Trauma /songs/1996/xm/l/ladybug.zip 168 ** Ladybug by Scolnick /songs/1996/xm/l/leggmatt.zip 529 *+ Leggematter'n by Xerxes /songs/1996/xm/m/ms_hfl.zip 83 **+ Heart Full of Love by Miss Saigon /songs/1996/xm/m/myrose.zip 262 ***+ My Rose by Nedeljko Gajic /songs/1996/xm/n/ng-lcyc.zip 384 **+ Lunar Cycle by Solaris /songs/1996/xm/n/ng-ondat.zip 178 **+ Ondated by Demuc /songs/1996/xm/n/ng-rad.zip 326 *** Radition by Cicada /songs/1996/xm/n/no-feuil.zip 350 **** Feuilles Mortes by Spyder /songs/1996/xm/v/vs_feb9.zip 326 **+ February 9th by Vadim VS =----------------------------------------------------------[Graphics:General]-= Location /demos/graphics Size Rated Description =-------------------------------- ---- ----- ---------------------------------= /images/1996/l/lt-appol.zip 170 *** Dance with the Planets by Light =-----------------------------------------------------[Graphics:Non-Reviewed]-= Location /demos/graphics Size Description =-------------------------------- ---- ---------------------------------------= /programs/players/cybrshow.zip 1417 Fractal Arts by Cyberlight Matrix =----------------------------------------------------------------------[Code]-= Location /demos/code Size Rated Lang Description =-------------------------------- ---- ----- ---- ----------------------------= /demosrc/micsrc41.zip 185 **+ A--- BBS intro w/environ. mapping /graph/3d/vga-vul3.zip 14 **+ A--P How to do simple 3D /graph/3d/vga-vul4.zip 9 *** A--- Simple 3D in ASM /graph/examples/bp-hires.zip 14 ** A--- 640x480x16 by Ash/Bunghole /graph/fade/vga-vul2.zip 20 *** A--- ASM source on palette fading /graph/gouraud/gvector2.zip 73 *** --C- Gouraud vectors by Tumblin' /graph/stars/vga-vul5.zip 10 *** A--P How to do a simple starfield /libs/adip.zip 708 ** ABCP SB Awe 32 developers pack /libs/asm_good.zip 118 ***+ A--- Lots of misc. ASM code /pmode/pmw122.zip 127 ****+ --C- Pmode/W v. 1.22 by DD/Ren. /sound/cpmik02.zip 18 ** A--- S3M/GUS player /sound/fmoddoc2.zip 390 ***** --C- Great MOD/S3M/player info! /sound/mxmp12.zip 92 **** A-C- Tiny .XM/GUS player by Cubic /text/ffmts002.zip 102 ***+ ---- Music file formats info. /text/vga-info.zip 139 ***+ ---- Graphical pragmatics via VGA /tutorial/basicdoc.zip 4 *** ---- Beginner's guide to VGA /tutorial/dn114_3d.zip 14 ****+ --CP Intro to 3D by Kiwidog /tutorial/fh-3dtut.zip 12 ***+ A--P 3D vector tutorial /tutorial/kmagv2.zip 54 **+ A--P King's programming mag. #2 /tutorial/kmagv3.zip 63 *** A-CP King's programming mag. #3 /tutorial/tweakdoc.zip 5 ***+ ---- Beginner's guide to Mode X /utils/alabv12.zip 185 ****+ A--- ASM IDE, w/syntax highlight. /utils/pp104swv.zip 44 ** ---P Protect .exes from hacking =-[Articles]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =---------------------------------------------------[Introduction]--[Snowman]-= Hello all, and welcome to DemoNews issue 118. First off, I'd like you all to note that we've passed 2000 subscribers this week! I consider that a milestone. When I started helping with DemoNews that number was under 300. My personal thanks goes to all those who have helped contribute over the past several years, as well as those who have supported and subscribed to this online publication. I used to ask the question "When will we finally saturate the scene?" I now believe that we won't. Not only are huge segments of the demo scene finally getting online, but countless individuals are now just discovering it. After reading almost all of "The Road Ahead" by Bill Gates, I am inspired. Our little listserver error two weeks ago is only the first of many creative and new ideas. For the past couple of weeks, our site has been getting a lot of action. The /pub/demos tree is seeing 3.5Gb a transferred a day on average (that's about 100Gb a month)! Believe it or not, this isn't even 1/3rd what the /pub/games archive is getting. Now, I like games just as much as the next guy. However, games aren't really my first love. I encourage you all to use our demo archive and download as much as possible, as often as possible, at weird hours of the day, while eating, while in the shower, while sleeping, while doing your homework... :) Let's see if we can hit a 5Gb day! Don't forget to submit articles to Darkness / Imphobia for the upcoming diskmag. Snowman / Hornet - r3cgm@cdrom.com =----------------------------------[Quotes Heard in the Demoscene]--[Trixter]-= [This list was compiled by Trixter] _____General Quotes "Good code isn't good design, and good design doesn't need good code." Charlatan "Jezus Christ, are we still having this conversation?" Luc Lodder, on the Amiga vs. PC debate. "When the finish Head General sees the Russian army coming he just boots up his PC and loads Second Reality. Then when all the ruskies are staring in disbelief, a plane drops a bomb on them." Tony, on how the Finnish demoscene could help in the Finnish army "The number of channels available with a PC trackers has led to a generation of lazy mod composers. Instead of using a trick, let's use another track!" Moby / Nooon "Hello, people!! Monitor manuals have H-Sync V-Sync tolerance listings for a _REASON_!!" Lance Kalzus, on reports that Xtal by Complex was blowing up monitors "Moral: Never underestimate democoders..." PsychoMan, on people who think democoding is a limited art "Personally, I'd be surprised to see someone release something on CD that was made up of huge, total, game. Come to think of it, you could create RPGs that take an average of 1.4yrs to complete, if you just stretched your mind and put a GAME on the CD instead of an 'interactive movie'." Mr. P, on the future of gaming "The trick is to forget about writing something good and pull cheese out of your butt." Necros, on how to win the '20-Minutes' compo "A DOT!!!! A FUCKING DOT!!!! YEAH!!!!!!!" Chris Chapin, on getting his first graphic element working "I have to figure out what 'music good moose american!' means." Leviathan, on translating some of the european fan mail he gets "The life of the coder is that of the hermit, except the hermit can't make shadebobs." Leviathan, on coding "You're just trying to find texture coordinates, not to be mathematically correct." Midnight, on how accurate you should be while coding environment mapping "People often forget God's contribution to the demo scene. He coded some brilliant effects, all real-time as well." Lew "As we all know, the audience voted for best productions at Juhla Pi. And, as always - audience was stupid." Jmagic, on why the world's first real-time raytracing demo didn't win 1st place at Juhla Pi _____On Having Sex "Coders do it with a routine." Otto Chrons "Coders do it with bugs." Trixter "Trackers do it with rhythm." Floss "Trackers like to slide up & down." Charlatan _____You Know You've Been Democoding Too Long When... "...You think 'hey, the phong shading on this toilet seat is really cool' and move it up and down a few times just to watch the highlights..." Sam "...You're in a train looking out of the window, and you notice the high-quality multi-layer parallax scrolling." Sam "...You spend an hour in the tub trying to figure out displacement." Leong "...You walk along a wall and are impressed that it's not pixelated, even at close range." Dag-Erling Smrgrav "...You notice how the faucets in bathrooms are envirovment mapped with a nice metal-looking texture..." Jyrki Saarinen "...You move objects around to make sure the clipping and culling routines are working." Quantum Porcupine "...You spill or mess up something and the first reaction that come to mind is 'undo'." Stephan "...You watch the "Mortal Kombat" movie, and during the part where Liu Kang does a flip off a wall, you absent-mindedly say, 'I wonder if that was calculated real-time.'" Dominion Arcana Trixter / Hornet - trixter@ftp.cdrom.com =--------------------------[10 Ways NAID '95 Will Differ from NAID '96]--[GD]-= _____Introduction Are you considering going to NAID this year? Not sure if you want to go or not? Heard some things that made you suspicious? Many people seem unsure whether or not they want to make the sacrifice of time and money to attend. With pressures of school and final exams, some potential attendees are unsure if they will make it to NAID 1996. Following is a list of ten ways that NAID 1996 will differ from NAID 1995. Hopefully, you will see that this is to be a party you won't want to miss. _____Reason 01: From Spotlights to Lasers The NAID organizers have been discussing the possibility of a laser light show this year. Remember those "dance floor" style spotlights they used last year? Well, those would be replaced by laser technology. This will improve the visual effects greatly. By adding laser lights to the setup, it will create an incredible effect for those who want to feel as if they're at a real rave. Even better, anyone needing laser surgery can just position themselves appropriately between laser beams and save thousands of dollars in medical fees. _____Reason 02: Parlez-vous francais? The language barrier was one difficult aspect for some Americans traveling to Montreal. As those who live in Montreal speak french as their primary language, verbal communication was a problem. With a year and two months between NAID 1995 and NAID 1996, hopefully some people have tried to work on the issue of the language barrier. However, I suggest a French-English dictionary, as some of your good friends who know french are most likely going to only teach you french phrases that translate into something like "You look like my mother, you stupid pancake!" or "Will you go to bed with me, you revolting jackass?" _____Reason 03: Price Difference People have been talking about the difference in ticket prices this year. The admission fee is CA$20, as compared to last year which cost CA$7. The organizers have decided to combat complaints about the sudden price increase with some special deals: Three-Arm Discount (TAD) : All persons with three arms shall receive 50% off the admission fees. Two-Foot Discount (TFD) : Anyone who stands less than two feet tall will only need to pay CA$2 for admission. Green-Hair Discount (GHD): Anyone entering with green hair will be admitted for CA$5. Persons taking advantage of the GHD must pose as plants any time someone's parents walk by. _____Reason 04: The wrath of PeriSoft Ever since last year, PeriSoft has been plotting his revenge against the "evil forces of Hornet" for the comment about him in the Hornet NAID report. This year, witness it live as the drama unfolds. Supposedly, one of PeriSoft's revenge tactics will be to bring an Alannis Morrisette CD and secretly place speakers in the Hornet room through which this CD will be played constantly. The results of such an experiment could have drastic effects, so watch and see what happens. _____Reason 05: Necros Dungeon Dwellers Design is a USA-based demo group that was in attendance at NAID 1995. They also entered a demo into the competition. They took many pictures at NAID and released a party report. Unfortunately, DDD made several errors in their NAID report, which confused some people as to who won which compo with which entry. This year, Necros may fall victim to a large amount of lamers asking him if he is going to write another song like his hit, "Can't Take the Bus." _____Reason 06: The Snowman Speech Before the closing ceremony last year, Snowman presented a very memorable speech to the soon-to-be-departing crowd. As many people complimented his efforts, he will again be making a speech this year. However, this year's speech proves to be more than a monologue, as Snowman recently released his cast list: Ara (formerly Epeius) ............... Human "beat box" The Zapper .......................... Bass Guitar Maelcum ............................. "Move it Move it" voice Miss Saigon ......................... "Whoo! Yeah!" voice _____Reason 07: Drugs and Alcohol Drugs and Alcohol are prohibited in the school at which NAID 1996 will be held. Because of this, the organizers are making special arrangements to inspect the belongings of those suspected to have any illegal possessions. They are arranging a "we get half, you get half" deal with anyone who wishes to consume said possessions at the party place. Be sure to stock up and bring twice your normal supply. _____Reason 08: 1-900-NAID-FUN The organizers have been so overwhelmed with telephone calls that they have set up this 1-900 answering service. Callers will be able to get their questions answered and even get a chance to win some great prizes! The prize list follows: Free NAID tickets will be given out to every 1000th caller If you are able to "Name this Hadji S3M" you can win one of these fabulous prizes: - Year old subs (leftover food from Subway, who served food at NAID 1995 and forgot to clean up) - Year old tshirts (they were left outside during a rainstorm, and put through a very powerful dryer. All shirts are now exactly 7 sizes smaller than stated on the label) Each call costs $1.00 a minute. If you're under 18, be sure to get permission from your parent or legal guardian before calling. _____Reason 09: The "Deep-Six Demo Compo" Is your computer waterproof? Ever thought of putting it inside a sealed plastic bag and submerging it in water? Since the pool was not used much last year, the organizers have introduced this competition, which states that "Computers will be submerged into the pool after starting a popular European demo. The owner of last computer to remain running underwater is the winner. The organizers are seeking judges for this competition. To be eligible, you need to be able to hold your breath for 10 minutes, have a certified lifeguard license, and sign a release form stating that the organizers are "not responsible for drowning, choking, or excess water intake." _____Reason 10: Electricity Last year the organizers were very fortunate to not experience any amount of interruption in the power supply. There were no power failures and no equipment was damaged by a spike or surge. This year, you won't want to miss out on your chance to fry the power system! Be the lamer responsible for a blackout during the demo competition! Get hundreds of angry partygoers chasing after you! To enter in this competition, all you need is an electrical device which, when plugged in, will overload the circuit breaker and cause a power outage. Winners will receive a first-class shunning. _____Conclusion This guide is your road map to fun at NAID 1996! Be sure to attend this event because it only happens once a year. Enjoy the show, meet new friends, and learn how to swear at your parents in a different language! What more could you ask for? GD / Hornet - gd@ftp.cdrom.com =-----------------------------------------[Funktracker Port to Linux]--[JsNO]-= I've began work on porting Funktracker from the DOS32 protected mode platform over to X11/Xview, first for Linux, then other Unix's. As this is mainly an exercise to learn X-windows programming, I will be taking it easy. It may be a while before there is a releasable version. NOW would be a good time to tell me anything that you want in there. I've had wades of email about requested extras and changes that people wanted in 1.08b, but couldn't, due to the fact the requests were never considered in the initial contingency of FunkTracker. So, if you tell me now in the designing stage, it will be far easier for me to put in. I'm going to attempt to give it the look and feel of the original FunkTracker (in an Xwindows sort of way), so, if you don't like the original Funky style interface, tell me now, and i'll alter it on weighted opinion. See ya. JsNO / Super Real Darwin - root@superr.topend.com.au =------------------------------[Intro to 3D Graphics - Volume 03]--[Kiwidog]-= _____Introduction Howdy everyone! Time for round three... :-) This is the last introductory article before we dive into polygon fillers, and it's something that's crucial to any effective 3D system. You may be asking yourself, "Hey, I can do projection and rotation now, isn't that all I need to start making solid objects?" Well, not quite. Let's say you want to make a cube. You know how to project the cube's vertices, so that's fine. You can rotate the vertices too, so that's not a problem either. And let's say you know how to do polygon filling too... well what happens when you start rotating the cube around? A big mess. :) Sides in the back show up half the time, so the cube doesn't look solid at all. And then you decide you want to add lightsourcing... uhh.... wait... lightsourcing? How do I do that again? Yup, something's definitely missing. :-) It turns out that backface removal, lightsourcing, and a whole mess of other 3D-related issues often stem down to one small, yet very important math concept... The normal. _____What the Heck's a "Normal"? The normal is just the name of the vector that's perpendicular to a plane. It's as simple as that (actually, I should be using the word "orthogonal", since that's the real name for perpendicular in 3D, but you get the idea). That's all it is. Every 3D plane in space has a normal; it's just the line that sticks straight out of that plane. So what's so useful about normals? Well, if we have a 3D surface (like a polygon face), the normal tells us where the polygon is facing... it's the line that the polygon is "looking at", and that has a LOT of uses. For one, backface removal. You only want to see a polygon face (like on a cube) when the surface is facing toward you. If it's facing away from you, you shouldn't see it (unless you want paper-thin objects). So the normal is very useful here. And lightsourcing is entirely about normals. If you take the angle between the normal of a surface and the vector of surface to the lightsource, you can find out how much it's facing that lightsource and can use that for brightness. We'll be using this fact a lot with Lambert, Gouraud, and Phong shading, as well as Environment Mapping. There are also other nice thing normals are used for, like calculating BSP trees and such. The list goes on and on.... But I'm probably overwhelming you with all this. Let's take it one step at a time, and all the rest of the pieces will face into place later. Don't worry if you're confused for the moment... it'll click soon enough. :) _____Finding the Normal of a Plane You've already dealt with a few normals - the axes. The Z axis sticks straight out of the XY plane, which means (tada!) that the Z axis is the normal of the XY plane. Likewise, the X axis is the normal of the YZ plane, and the Y axis is the normal of the ZX plane. But what about arbitrary surfaces? Most of the time, with our 3D objects, we won't know where they're facing. They won't be on the axes most of the time, that much is for certain. So what do we do to find these special vectors? _____The Dot and Cross Products There are two very useful operations in linear algebra called the Dot Product, and the Cross Product. They're not really hard at all; the equations are pretty simple. But they come in very handy, as you'll soon see. Like the Trig identities, these are two of the most important things you'll ever use in 3D. The Dot Product is just a value (or "scalar", in linear algebra terms). It's a function of two vectors, and usually denoted with a "." character. If we have two vectors A and B, A.B = (Ax * Bx) + (Ay * By) + (Az * Bz) That's it. Just multiply the XYZ parts together of each vector, add them up, and the resulting number is your dot product. What's it for? We'll see soon enough... Now the Cross Product is a little more complicated of an equation. Like the Dot Product, it's a function of two vectors. But unlike the Dot Product, the result is not a scalar value.... it's another vector. If we have our A and B vectors, and C is the cross product (denoted A x B), C = A x B Cx = (Ay * Bz) - (By * Az) Cy = (Az * Bx) - (Bz * Ax) Cz = (Ax * By) - (Bx * Ay) That's how we get each of the XYZ components of the cross product vector. Well what's C after we do this? A very nice thing... it's the vector that's ORTHOGONAL to A and B. Yup, the Cross Product is our normal! :-) Sure enough, if you check these equations against some normals we know, like the axes mentioned above, it turns out that (1,0,0) x (0,1,0) = (0,0,1) Z axis is orthogonal to the X and Y axes. (0,1,0) x (0,0,1) = (1,0,0) X axis is orthogonal to the Y and Z axes. (0,0,1) x (1,0,0) = (0,1,0) Take a wild guess. :-) Now, we can't necessarily use this directly with our polygons. I mean, with our polys all we have is a set of vertices (each 3 for a triangle, 4 for a quadrilateral, whatever). We don't have two vectors. So we need to find two vectors in our poly that we can shove into this cross product equation, and find our normal. How to do that? Not too hard, really. We can form two vectors from any three points in a poly. Say we have a quadrilateral polygon..... P2 . P1 . . P3 . P4 Okay, all we need to do is get two tail-to-tail vectors from the poly. Solution? Simple, just pick a point, and use the vectors to the two points "connected" to it along the edges... P2 .___ A P1 ----. \ \ B \ . P3 . P4 Be warned, though.... the cross product function is NOT commutative. That is, A x B is NOT the same as B x A. As a matter of fact, B x A is the exact OPPOSITE vector of A x B.... it's the same line, just pointing in the other direction! :) How to know which one to use as A and which as B? It depends on what kind of objects you're using. If you're importing from a modeler of sorts, most modelers either order the vertices a certain way or have some kind of field telling you which way the normal is. Then you'll know which vector is supposed to be first, so your normal is in the right direction. Otherwise, if you're making your objects manually, you'll have to be a little more innovative. Many people like to create their faces so the vertices go in either a consistent clockwise or counter-clockwise order. Then you start at a consistent point in the polygon (like the first vertex), and you know which point goes with which vector. It's really a matter of taste, but whatever you do, you should be consistent. Manually correcting normals that go wrong is a real pain in the rear, so getting the system down right the first time will help you a lot in the long run. (BTW... in the above ASCII picture, the order that A and B are in will result in a normal that goes up, towards where the "P1" label is). Now to get nice, accurate normals, we don't want the poly's location in space to have any effect on it... true "vectors" aren't points, they're rays going from the origin to a point. Well, P1 probably isn't going to be at (0,0,0). So for the cross product we need to calculate the vertices as if it were. This is just done by translating the points, subtracting P1 from both the P2 (for vector A) and from P4 (for vector B)... A = (P2 - P1) B = (P4 - P1) Bam, now we just shove A and B into the cross product formula, and out comes our normal. Almost. (Don't you just LOVE these "almosts" and "not quites"? :-) _____Size Matters Only one more thing we have to do to the normal to get it exactly the way we want it. We need to scale it down (or up), so that the vector has an exact length of 1. Why 1? Because having normals of length 1 is a really nice thing as far as calculation is concerned. It's mainly for the "angle between" equation we need for lightsourcing. I'll get to all that in a little bit, but for now, just trust me.... we want it one unit in length. :) Doing that isn't really difficult... we just use the distance formula. From algebra you probably remember that in 2D, the distance between any two points is length = sqrt( (x2-x1)^2 + (y2-y1)^2 ) That gives us the distance, or length, of that line segment. The same thing applies in 3D, by adding the Z component... length = sqrt( (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 ) Well a vector has just one point... the other point is at the origin, so if we want to find the length of our normal, we just set point 1 to (0,0,0), and length = sqrt( x^2 + y^2 + z^2 ) Odds are, when you pump in your normal's values you got from the cross product, the length is NOT going to be equal to 1. It could be 0.2, it could be 10.583, it could be three-thousand-something. Anything. Well since all we care about is direction, not length, we can divide every XYZ component in the normal by its length, and the new length will become 1. As an example, say our normal was (3,5,2). The length would be length = sqrt( 3^2 + 5^2 + 2^2 ) = (9+25+4) = 38 So if we divide each component by 38, our final, scaled normal would be (3/38, 5/38, 2/38) Now as you can see, if all our normals are going to be length 1, then we need to use decimal places.... no component is ever going to be above 1 in size. But using floating point is incredibly slow, and pure integers don't allow for decimal places. The solution? Fixed point. _____A Sidetrack on Fixed Point Fixed point is an easy way to represent non-integer numbers with only integers in the processor. It's done by taking a certain number of bits in a register, and dedicating them to decimal places instead of integer values. Like if we have a 16-bit word, we can do 8.8 fixed point by using the upper 8 bits as the "whole" portion of the number, and the lower 8 bits as the "fractional" portion. Examples of 8.8 fixed point.... 1.0 = 0100h 1.5 = 0180h 0.25 = 0040h 3.75 = 03C0h 5.125 = 0520h ...and so on. All we're doing is using the high byte as the whole, and the low byte as the precision. How precise? Well since we have 8 bits in the fraction, it means we can go down to 1/256 for a fractional value. The more the fractional bits you use, the more accurate your decimal places can be... but the fewer number of whole-number bits you have left (so your value can't go up as high). Sure enough, you're not limited to equal splits. With 16 bits you can do things like 15.1 fixed point (which only goes down to 0.5 for decimal units but allows numbers up to 32767), or you can do 1.15, which can only have a whole number of 0 or 1, but goes down to 1/32768 of decimal accuracy. You choose what works well for your system. (Incidentally, since I code 32-bit mostly these days, I use 16.16 fixed point for pretty much everything 3D-wise. It's accurate enough in decimal places, yet has wholes up to 64k which is a nice range). To sum up, fixed point is just treating integers as fractional numbers by working with the numbers a few powers of 2 above what the number actually means. In 8.8, 0100h (256) means 1, 512 means 2, 768 means 3, etc... you're just scaling the operations up a bit so you can stick with integer operations. Adding and subtracting fixed point is just like regular integer add and sub. You don't have to do anything special... 1.5 + 1.5 = 3.0 0180h + 0180h = 0300h 2.75 - 2.25 = 0.5 02C0h - 0240h = 0080h ...and so on. On the other hand, multiplication and division have to be adjusted by the number of places in your precision, since the resulting number would be too high for multiply, and too low for divide.... 1.5 * 3.0 = 4.5 0180h * 0300h = 048000h NOPE! We have to divide by 100h (8 bits precision). 0180h * 0300h = 048000h / 100h = 0480h (correct) Likewise, division needs to get multiplied by your precision. This must be done BEFORE you divide, or you'll end up losing all your decimal places. 7.5 / 2.5 = 3.0 0780h / 0280h = 0003h WRONG! We need to multiply.... 0780h * 0100h = 078000h / 0280h = 0300h (correct) Note that this means for multiply and divide that you'll need more space than just what's in your fixed point registers. Luckily multiply and divide on the Intel processors multiply into and from EDX:EAX, so you've got extra space already even if you're using assembly language. And the adjustment mul/divs are all powers of two, so you can use bit shifts instead (if you are using 386 regs, make sure you look up the SHLD and SHRD instructions... they come in real useful for this...) Okay, enough of that sidetrack. That's the basics of fixed point. It's an excellent alternative to floating point, and it's the only way to get really good speed with 3D on an integer unit, since you can't use fast normals that aren't 1 unit in length. That's all you need to know about finding normals! :-) Here's the quick summary. To get a normal from any polygon (with any number of vertices) 1. Choose three vertices from the poly that are connected by two edges. The middle vertex is the base of both your vectors, so translate all three points so that this base point is at the origin. 2. The two vectors are the two other points after translation. Choose your first and second vector in the right order so that the normal goes in the direction you want it, "in" or "out", so to speak. If your vertex ordering is consistent or you're importing from a modeler, this shouldn't be a big problem. 3. Take the cross product of the two vectors, in the right order. 4. Scale the cross product down so its length is equal to 1. This is your final normal for the poly (yay!) :) _____You Want Me To Do All That REALTIME?!? Heck no! :) Calculating normals for every surface every frame would be incredibly slow. Major MAJOR waste of time. But you don't have to worry about that, because you can precalculate your normals for the original object, and guess what? If you rotate the normals by the same angles that you rotate the object, the normals will still be correct! :-) So just generate your normals when you load up your object, or store them in the object file itself (if you have your own file format, this can be an easier option). As you rotate your object by rotating all the vertices, just treat the normals like regular vertices. So when rotating a cube, for example, you won't be rotating 8 points... you'll be rotating 14 points, i.e. the 8 vertices and the 6 normals. _____In Our Next Episode There are certainly other ways to deal with normals besides straight rotation and such, and I'll show you these methods as time goes on. We'll also be using these normals (and the thus-far-useless Dot Product) next time, when we start our polygon filling escapade! :) The next article will cover how to fill polygons with a flat color, and also how to lightsource that color using our normals, so don't throw this article away just yet... this info will become very useful very quickly. In the meantime, the supplement will have example source that shows how to use normals for simple backface removal. I'll put a lot of comments in there so you can see what the normals are doing to make it possible. It's quite easy... Anyway, take a look at that source (in Pascal and C, once again... BTW some people have asked me if I'll be doing more ASM source later on, and the answer is yes, I will be)... and play around with some of this stuff on your own! :) I realize there's not much to gain from this article by itself, but it'll give you time to get a very critical portion of your 3D system going. Even if it's still wireframe, it's a big step. _____BTW The supplement files are being renamed from DNxxx_3D.ZIP to DN3D_x.ZIP. This is because it seems I'm not going to make it for every single DemoNews issue, so it's probably less confusing if I name them by volume number than by DemoNews issue number. As such, this article's supplement will be at ftp.cdrom.com/pub/demos/incoming/code/DN3D_3.ZIP DN114_3D.ZIP and DN116_3D.ZIP will be renamed to DN3D_1.ZIP and DN3D_2.ZIP within the next couple weeks, so don't be surprised if you don't find them under their old filenames after a while. All new supplements will be in /pub/demos/incoming/code/ and the previous ones will be under /pub/demos/code/tutorial/ so look there if you don't find them in incoming. Also, give me a couple days after this DemoNews's release to upload the supplement file. I tend to write these articles a little close to the wire, so I don't have time to get the supplement up immediately. If you don't find it in /pub/demos/incoming/code, give it a day or two before emailing me saying you can't find it.... it's probably just me being lazy. :-) Until next time... Kiwidog / Hornet , Terraformer - kiwidog@vt.edu =-[Subscribing]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= _____How to subscribe to DemoNews Mail to : listserver@unseen.aztec.co.za Body : subscribe demuan-list [first_name] [last_name] The listserver will send DemoNews to your e-mail's return address. _____Back Issues Older issues of DemoNews can be located under /demos/hornet/demonews. Newly released issues of DemoNews are posted to /demos/incoming/news. =-[Closing]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= For questions and comments, you can contact us at r3cgm@cdrom.com Your mail will be forwarded to the appropriate individual. ...........................................................End.of.DemoNews.118.