IRC log for #brlcad on 20080305

00:26.43 Maloeran Hey Erik, I missed your reply, where did your comic page go? :) You can say it in privmsg if the talks push the reply out of the buffer again, thanks
00:31.41 *** join/#brlcad iraytrace (n=iraytrac@cocoa.sci.utah.edu)
00:32.38 iraytrace evening all !
00:35.30 brlcad Maloeran: it's up at http://bzflag.bz/~erik/comics/
00:35.40 brlcad iraytrace: howdy!
00:35.57 iraytrace Howdy back!
00:58.03 *** join/#brlcad jgay (n=jgay@fsf/staff/jgay)
01:17.11 *** join/#brlcad minusinsk (n=jishi@83.234.35.158)
01:41.15 ``Erik heh, someone needs to put a fly trap up to stick lee here
01:41.46 ``Erik mal: math.missouristate.edu changed to euler.missouristate.edu and they didn't bother telling me until 4 days after it happened
01:41.52 ``Erik so I've been fixing the mail handler and shit to cope
01:42.07 ``Erik and they didn't bother with a cname cuz they're tards
01:42.30 ``Erik but I keep the comic page in cvs, so any place with a reasonable php can take it fast... a mirror is on bz :)
02:09.53 *** join/#brlcad starseeker (n=CY@c-68-33-217-173.hsd1.md.comcast.net) [NETSPLIT VICTIM]
02:09.59 *** join/#brlcad jgay (n=jgay@fsf/staff/jgay) [NETSPLIT VICTIM]
02:09.59 *** join/#brlcad terrylr (i=terrylr@maria-enzersdorf.blauedonau.com) [NETSPLIT VICTIM]
02:09.59 *** join/#brlcad yukonbob (i=1000@s142-179-54-198.bc.hsia.telus.net) [NETSPLIT VICTIM]
02:10.03 *** join/#brlcad vedge (i=vedge@leary.csoft.net) [NETSPLIT VICTIM]
02:10.03 *** join/#brlcad archivist (n=archivis@host81-149-119-172.in-addr.btopenworld.com) [NETSPLIT VICTIM]
02:10.12 *** join/#brlcad SWPadnos (n=Me@dsl107.esjtvtli.sover.net)
02:10.13 *** join/#brlcad MinuteElectron (n=MinuteEl@silentflame/member/pdpc.base.minuteelectron) [NETSPLIT VICTIM]
02:10.13 *** join/#brlcad b0ef (n=b0ef@062016141231.customer.alfanett.no) [NETSPLIT VICTIM]
02:10.13 *** join/#brlcad alex_joni (n=juve@emc/board-of-directors/alexjoni) [NETSPLIT VICTIM]
02:10.13 *** join/#brlcad CIA-32 (n=CIA@208.69.182.149) [NETSPLIT VICTIM]
02:32.35 *** join/#brlcad vedge (i=vedge@leary.csoft.net) [NETSPLIT VICTIM]
02:32.35 *** join/#brlcad archivist (n=archivis@host81-149-119-172.in-addr.btopenworld.com) [NETSPLIT VICTIM]
02:38.54 *** join/#brlcad Twingy (n=justin@74.92.144.217)
02:46.55 *** join/#brlcad PrezzKennedy (i=Matt@74.86.45.130)
02:48.36 *** join/#brlcad poolio_ (n=poolio@bz.bzflag.bz)
02:53.32 *** join/#brlcad PrezKennedy (i=Matt@74.86.45.130) [NETSPLIT VICTIM]
02:53.32 *** join/#brlcad dtidrow (n=dtidrow@69.255.182.248) [NETSPLIT VICTIM]
03:06.27 *** join/#brlcad iraytrace (n=iraytrac@c-67-172-239-24.hsd1.co.comcast.net)
03:10.12 *** join/#brlcad iraytrace (n=iraytrac@c-67-172-239-24.hsd1.co.comcast.net)
03:11.33 starseeker iraytrace: So what's it like doing IRC on a pogo stick? ;-)
03:12.07 iraytrace Its SoMeWhAt DiScOnCeRtInG
03:25.54 starseeker :-)
03:26.05 starseeker Is your connection a bit erratic?
03:48.22 iraytrace Sorry, preoccupied with /.
03:49.29 iraytrace How's life on the coast?
04:31.34 *** join/#brlcad SWPadnos (n=Me@emc/developer/SWPadnos) [NETSPLIT VICTIM]
04:31.34 *** join/#brlcad b0ef (n=b0ef@062016141231.customer.alfanett.no) [NETSPLIT VICTIM]
04:31.34 *** join/#brlcad alex_joni (n=juve@emc/board-of-directors/alexjoni) [NETSPLIT VICTIM]
04:31.58 *** join/#brlcad tofu (n=sean@bz.bzflag.bz)
04:54.42 *** join/#brlcad minusinsk (n=jishi@83.234.35.158)
05:04.18 *** join/#brlcad minusinsk (n=jishi@83.234.35.158)
06:17.37 *** join/#brlcad Axman6 (n=Axman6@pdpc/supporter/student/Axman6)
06:50.33 *** join/#brlcad oden1 (n=oden@c-69-137-199-63.hsd1.fl.comcast.net)
07:01.09 oden1 Good day fellows.
07:01.16 illethal pow
07:01.28 illethal I use weechat-curses and it never keeps my nick name the way I want it.
07:01.45 Axman6 use irssi, and you
07:01.49 Axman6 you'll be fine
07:01.56 Axman6 learn to type, and i'll be fine
07:02.00 illethal Irssi is similar, ya?
07:02.03 illethal Hahaha
07:02.09 Axman6 that is, i should learn to type, not you :P
07:02.17 illethal I should learn also.
07:02.25 illethal I heard hooked on phonics is pretty good.
07:02.48 Axman6 never used weechat, but it's basically considered the best cli irc client (and to some, the best irc client, cli or otherwise ;)
07:03.02 illethal I'd have to agree.
07:03.07 CIA-32 BRL-CAD: 03brlcad * r30457 10/brlcad/trunk/include/ (cmd.h dg.h): this will very-likely re-break the build on Windows, but bio.h is a private header and cannot be included in any public headers. (e.g. it shouldn't ever be installed.)
07:03.16 illethal I don't know all the commands but it smokes the old mIRC I used to use on windows.
07:04.14 brlcad shouldn't that be "i herd hokt on fonics iz prity gud"
07:04.30 illethal ya sumtin lik dat
07:06.54 starseeker brlcad: What's the alternative to including bio.h?
07:07.43 brlcad not including it? :)
07:08.40 brlcad it belongs in the app code, not the public headers -- it's just included elsewhere
07:09.03 brlcad it's also really just a simple wrapper around a more complex set of #include logic
07:09.34 illethal Man brlcad you're so leet.
07:09.37 brlcad logic that provide standard and native I/O decls
07:13.02 CIA-32 BRL-CAD: 03brlcad * r30458 10/brlcad/trunk/include/raytrace.h: why are these three ifree functions needed? if they're special, they should probably be documented with a comment.
07:14.09 CIA-32 BRL-CAD: 03brlcad * r30459 10/brlcad/trunk/include/raytrace.h: give it a name 'just in case' someone really does need these so they can be given a cppflag that will make it all better
07:16.22 illethal Axman6: in irssi, what is the command to join another channel, and still remain in the one you are currently in?
07:20.31 *** join/#brlcad Axman6 (n=Axman6@pdpc/supporter/student/Axman6) [NETSPLIT VICTIM]
07:20.51 CIA-32 BRL-CAD: 03brlcad * r30460 10/brlcad/trunk/regress/flawfinder.sh: add a regression test for bio.h to make sure nobody adds it to a public header down the road.
07:36.01 *** join/#brlcad PrezzzKennedy (i=Matt@74.86.45.130)
07:36.38 *** join/#brlcad dtidrow (n=dtidrow@69.255.182.248) [NETSPLIT VICTIM]
07:37.31 illethal Hello president Kennedy.
07:40.23 *** join/#brlcad PrezzKennedy (i=Matt@74.86.45.130) [NETSPLIT VICTIM]
07:40.23 *** join/#brlcad starseeker (n=CY@c-68-33-217-173.hsd1.md.comcast.net) [NETSPLIT VICTIM]
07:47.54 brlcad yay for for file in `find . -type f \( -name \*.c -o -name \*.cpp -o -name \*.cxx -o -name \*.h -o -name \*.y -o -name \*.l \) -not -regex '.*src/other.*' -not -regex '.*~' -not -regex '.*\.log' -not -regex '.*Makefile.*' -not -regex '.*cache.*' -not -regex '.*\.svn.*' -exec grep -n -I -e '#[[:space:]]*include' {} /dev/null \; | grep "\"common.h\"" | sed 's/:.*//g'` ; do if test -f "`echo $file | sed 's/\.c$/\.l/g'`" ; then continue ; fi ; grep '#[[:space:]]*in
08:16.29 *** join/#brlcad clock_ (n=clock@zux221-122-143.adsl.green.ch)
08:27.52 poolio brlcad: Is that you entry in the obfuscated bash contest?
08:34.25 *** join/#brlcad minusinsk (n=jishi@83.234.35.158)
08:41.57 brlcad heh, no way
08:42.06 brlcad that's pretty straightforward (to me at least) :)
08:42.21 brlcad half of it is just the find pattern
08:42.31 poolio It's straightforward if you try to figure it out, but at 4am and halfway through a paper, it's gibberish.
08:42.40 brlcad i've written much much longer :)
08:43.10 brlcad that one just does a neat thing, finds all non-lexer files that don't include common as the first file
08:44.09 poolio I always mess up quotes and back quotes and double quotes
08:44.14 poolio And sometimes wish I had another type of quote to use
08:48.57 *** join/#brlcad elite01 (n=elite01@dslc-082-082-085-035.pools.arcor-ip.net)
08:56.39 *** join/#brlcad Elperion (n=Bary@p5487744C.dip.t-dialin.net)
08:59.23 *** join/#brlcad Bariton (n=Bary@p5487744C.dip.t-dialin.net)
09:10.46 *** join/#brlcad elite01 (n=elite01@dslc-082-082-085-035.pools.arcor-ip.net)
09:17.29 *** join/#brlcad d_rossberg (n=rossberg@bz.bzflag.bz)
09:33.16 brlcad :)
09:33.54 brlcad d_rossberg: fyi, I'm also working/verifying the windows build
09:34.17 brlcad last stages of trying to make sure everything is stable and working (particularly windows) for this 7.12.0 release
09:34.51 brlcad hopefully the end of this week/weekend if there aren't any problems -- if you find anything, please let me know or mail the dev list
09:36.56 CIA-32 BRL-CAD: 03brlcad * r30461 10/brlcad/trunk/regress/flawfinder.sh:
09:36.56 CIA-32 BRL-CAD: add another coding check for the common.h inclusion ordering. this makes sure
09:36.56 CIA-32 BRL-CAD: common.h always comes first if/when listed in a file. alas the script isn't
09:36.56 CIA-32 BRL-CAD: tweaked to work right if there are spaces in the path name, but then there are
09:36.56 CIA-32 BRL-CAD: probably other scripts like that in regress too
09:41.58 CIA-32 BRL-CAD: 03d_rossberg * r30462 10/brlcad/trunk/src/ (7 files in 2 dirs): some additional bio.h includes to make the Windows build work again
09:42.48 d_rossberg brlcad: now my windows-dll build works again
09:57.06 CIA-32 BRL-CAD: 03d_rossberg * r30463 10/brlcad/trunk/src/other/openNURBS/Makefile.am: opennurbs_zlib.h needs to be installed because of the z_stream type
10:55.15 *** join/#brlcad elite01 (n=elite01@195.37.106.60)
12:44.32 *** join/#brlcad elite01 (n=elite01@dslc-082-082-085-035.pools.arcor-ip.net)
14:22.02 brlcad d_rossberg: okay
14:45.44 ``Erik hukt on fonix heheheh
14:48.21 yukonbob archivist: oxford
14:49.12 archivist Im about 70 miles north near Derby and Burton
14:53.29 brlcad howdybob
14:53.48 yukonbob hey -- what's shaking
14:54.04 yukonbob (/me was waving North, to archivist) :)
14:54.17 yukonbob :)
14:55.54 archivist I like Blackwells bookshop in Oxford
15:10.16 yukonbob brlcad: heh
15:15.00 CIA-32 BRL-CAD: 03erikgreenwald * r30464 10/brlcad/trunk/Makefile.am: include/conf/DATE is in builddir, not srcdir
15:15.43 brlcad gah, then that's version-specific
15:16.07 brlcad I traced down one config and during distcheck, it was stashing DATE into srcdir as a BUILT_SOURCES
15:16.34 brlcad that or something else is missing
15:16.43 brlcad maybe DESTDIR
15:27.17 ``Erik O.o
15:27.17 ``Erik hrm
15:27.37 ``Erik using the rhel automake, it was bitching about not finding that file
15:29.48 Maloeran Thanks brlcad and ``Erik for the update on the comics page :)
15:30.21 ``Erik threre're two copies now, in case one craps out... one at euler.missouristate.edu and one at bz.bzflag.bz
15:34.31 CIA-32 BRL-CAD: 03erikgreenwald * r30465 10/brlcad/trunk/src/ (librt/Makefile.am other/libpng/Makefile.am): update dependancy info
15:34.54 clock_ ``Erik: would it help to make the cutting primitive from more smaller parts?
15:35.13 ``Erik clock: probably
15:36.02 ``Erik making the cut lower in the heirarchy with smaller cutters would be useful
15:36.05 ``Erik i'd imagine
15:36.24 ``Erik or just suck it up and accept the slow raytrace time *shrug* :)
15:36.27 clock_ I don't want the cut low in the hierarchy
15:36.40 clock_ but the raytrace takes like a week
15:37.00 ``Erik yeah? and? :D
15:37.04 clock_ Even when I bought a modern 2-CPU machine just for the purpose of the slow BRL-CAD renderingf
15:37.52 clock_ would it help if the cut would still be at the toplevel, but I wouldn't cut with one big cube, but with a union of a lot of small cubes?
15:39.14 ``Erik y'know, thinking about it now, I don't think so
15:39.35 clock_ so to speed up it must be down in the hierarchy?
15:39.54 ``Erik the bounding box and bounding sphere grow as you walk up the heirarchy, and the thing that's killing you is bad space partitioning, I think
15:40.09 ``Erik brlcad knows the guts of the space partitioning crap far better than I do
15:40.12 clock_ What is exctly space partitioning? An octree?
15:40.18 ``Erik I'm kinda guessing based on symptoms
15:40.29 ``Erik um, I think it's more of a KD-tree
15:40.38 ``Erik or BSP
15:40.45 clock_ What function does it do in BRL-CAD?
15:40.53 ``Erik space partitioning?
15:41.24 ``Erik it's all about culling O.o
15:41.26 clock_ SO basically you have a function which you give a point and it returns you all objects that might intersect that point?
15:42.07 ``Erik a ray (or perhaps a line), and all possibly intersecting geometry on that line/ray
15:42.48 clock_ Well my case should slow down exactly twice
15:42.57 clock_ and not 210x
15:43.24 ``Erik noooo, in your case, it should slow down up to, um, I think 10kx?
15:43.37 clock_ why?
15:43.41 ``Erik I lost your .g file
15:43.48 ``Erik your 'head' object is complex
15:44.12 ``Erik the possibly slowdown is in the neighborhood of the number of primitives in head
15:44.26 ``Erik possible
15:44.38 clock_ Can adding one cube increase the complexity 10,000 times?
15:44.42 ``Erik maybe nlg2n, I d'no the guts of the code
15:45.17 clock_ The rt prints "20,xxx primitives"
15:45.20 clock_ 20 thousand something
15:45.24 ``Erik well, if I have a million sphers in a row and I shoot it from the side, it'll be very fast, because I only ever have to test one sphere per ray
15:45.30 clock_ is it the number of primitives I have in the scene?
15:45.43 clock_ Or does it break down the primitives further into individual intersecting areas?
15:45.46 ``Erik but if I cut all of them in half with one huge box, every ray requires 1m+1 computations
15:46.01 clock_ Why?
15:46.08 clock_ I would think it requires 2 computation
15:46.11 ``Erik if I had 1m sphers and 1m corrosponding boxes, each one cutting a signle sphere, then each ray would take 2
15:46.18 clock_ Once it intersects the bounding box of one sphere
15:46.22 clock_ second times the huge box
15:47.04 ``Erik ... in the general case, you cannot know what the total impact of that single cutter is
15:47.12 clock_ The partitioning should return only those primitives whose bounding boxes are intersected by the ray
15:47.13 ``Erik so you have to evaluate everything in the tree
15:47.26 clock_ So adding one primitive adds maximum one more hit per ray
15:47.51 clock_ Sounds like the algorithm has a bug
15:47.57 clock_ which is triggered by my scene
15:48.13 ``Erik um, the algorithm is fine... I get what you're thinking SHOULD happen
15:48.21 ``Erik but there's no way to DO it computationally
15:48.24 clock_ I don't get it
15:48.29 ``Erik that's where the human blows the machine away
15:49.26 clock_ So you basically do some kind of heuristics and my case is a poison case for that heuristic?
15:49.37 ``Erik ok, i have a million spheres... and I want to cut them in half... but instead of just being discrete spheres in a row, they're now complex... they overlap, some are unions, some are intersections, some are subtractions, and multilayered
15:49.40 ``Erik what do you do?
15:49.50 clock_ shoot a ray
15:49.56 ``Erik answer? no way to know. Have to bump the bounding volume and weave at the end.
15:50.16 clock_ ask the partitioner which spheres bounding boxes intersect my ray
15:50.19 ``Erik actually, there IS a way to know, but it'd take a century to figure out before you could even fire a ray
15:50.24 clock_ intersect only with those returned from the partitioner
15:50.26 clock_ weave the logics
15:50.41 ``Erik but you don't know which spheres bb's MATTER
15:50.52 ``Erik you can't until after you intersect them all
15:51.10 ``Erik after you weave them, in fact
15:51.16 clock_ that's without the partitioner
15:51.26 clock_ the idea of the partitioner is to cull this before you have to fire rays
15:51.30 ``Erik yeah...
15:51.34 ``Erik it culls what it can
15:51.41 clock_ and btw, intersecting with a cube is not much work
15:52.22 ``Erik except it's not "a cube", it's "arbitrary geometry"
15:52.44 clock_ if it's bounding box, then it's a box
15:52.56 clock_ if it were a bounding elephant, then it would be in a shape of an elephant.
15:53.23 ``Erik I assert that its' a lot more complex than you think. Please prove me wrong and provide a patch. :)
15:54.26 clock_ Does the documentation of BRL-CAD contain any tips how to avoid running into excessive rendering time?
15:54.39 clock_ I mean the official user documentation.
15:54.44 ``Erik <-- doesn't know
15:54.46 clock_ Not some comments in the code.
15:55.34 clock_ I could try to isolate the pathological case
15:55.49 clock_ I am trying to use BRL-CAD as a user and I fail.
15:56.07 ``Erik we already know the pathological case... and that there's no quick fix for it
15:56.10 clock_ The performance is close to unusable
15:56.21 clock_ Btw if I display my model, it also takes ages to display
15:56.29 clock_ And during the display there is no space partitioning
15:56.38 clock_ Another example where BRL-CAD is unusably slow
15:57.08 ``Erik *shrug* it's drawing a lot of lines, and there's no 'detail level' built in right now
15:57.09 clock_ What is the pathological case said in general terms?
15:57.36 clock_ I can tell you how long it should take.
15:58.05 clock_ Let's assume all those 20,000 primitives are cylinders - most are
15:58.12 clock_ A cylinder has 2 circles and 4 lines
15:58.16 clock_ each circle has 8 lines
15:58.18 clock_ that's 20 lines total
15:58.24 clock_ 400,000 lines in total
15:58.28 ``Erik intersection with complex geometry increases the ray trace complexity by the number of primitives involved?
15:58.33 clock_ average length of the line is like 10 pixels
15:58.36 clock_ that 4 million pixels
15:58.47 ``Erik interaction, even
15:58.47 clock_ 1 pixel is 3 bytes
15:58.50 clock_ that's 12 megabytes
15:59.27 clock_ let's assume the PCI runs at 100 MHz and each pixel write takes 4 ticks
15:59.36 clock_ that's 500ms to draw it all
15:59.50 clock_ in real it takes 30 seconds. 60 times more than it should.
16:00.00 ``Erik for non-trivial geometry, raytracing is cpu bound, not bus bound
16:00.11 clock_ this is *not* raytracing!
16:00.18 clock_ This is the 'B' command - drawing the wireframe.
16:00.57 ``Erik oh, heh, ok, each primitive is composed of many many lines, each endpoint of the line gets shoved through a matrix and then the line is rasterized
16:01.12 ``Erik still cpu bound, drawing the pixels is quick and easy (even though fb is lametarded slow at it)
16:01.26 ``Erik and we don't use SSE or graphics card matrix modules to accelerate it :(
16:01.36 clock_ you don't have to
16:01.42 clock_ My CPU is 2.2GHz
16:01.53 clock_ What I am getting is 8-bit style ZX Spectrum drawing speed
16:02.06 ``Erik uh not for the complexity of what you're trying to draw
16:02.15 ``Erik remember, we have no LOD :(
16:02.25 ``Erik so you're not drawing 400,000 pixels
16:02.30 ``Erik you're drawing 20,000,000 lines
16:03.28 clock_ no 400,000 lines
16:03.56 clock_ 20,000 primitives times 20 lines per primitive
16:06.24 clock_ In which function is a cylindren broken down into a wireframe of lines for the purpose of display?
16:06.28 clock_ cylinder
16:06.41 clock_ Maybe there are sinuses and cosinuses I could kick out
16:13.17 CIA-32 BRL-CAD: 03brlcad * r30466 10/brlcad/trunk/include/conf/PATCH: heh, skipping 3 and 4, going right to 5
16:15.25 CIA-32 BRL-CAD: 03bob1961 * r30467 10/brlcad/trunk/src/libfb/ (fb_obj.c tcl.c): Include bio.h for windows compilation.
16:45.23 *** join/#brlcad jgay (n=jgay@fsf/staff/jgay)
16:55.34 CIA-32 BRL-CAD: 03bob1961 * r30468 10/brlcad/trunk/misc/win32-msvc8/librt/librt.vcproj: Define _RT_DECL_IFREE. This is needed by asc2g.
16:56.02 CIA-32 BRL-CAD: 03bob1961 * r30469 10/brlcad/trunk/misc/win32-msvc8/asc2g/asc2g.vcproj: Define _RT_DECL_IFREE.
17:05.36 *** join/#brlcad PrezzKennedy (i=Matt@74.86.45.130)
17:08.24 *** join/#brlcad PrezKennedy (i=Matt@74.86.45.130) [NETSPLIT VICTIM]
17:17.50 *** join/#brlcad jgay (n=jgay@fsf/staff/jgay) [NETSPLIT VICTIM]
17:17.50 *** join/#brlcad elite01 (n=elite01@dslc-082-082-085-035.pools.arcor-ip.net) [NETSPLIT VICTIM]
17:17.50 *** join/#brlcad starseeker (n=CY@c-68-33-217-173.hsd1.md.comcast.net) [NETSPLIT VICTIM]
17:22.10 *** join/#brlcad dtidrow (n=dtidrow@69.255.182.248) [NETSPLIT VICTIM]
17:31.21 *** join/#brlcad cad96 (n=8614d860@bz.bzflag.bz)
17:33.38 *** join/#brlcad cad53 (n=8614d860@bz.bzflag.bz)
17:35.53 CIA-32 BRL-CAD: 03bob1961 * r30470 10/brlcad/trunk/src/tclscripts/lib/Dm.tcl: Need to check for the existence of the display variable.
17:39.33 CIA-32 BRL-CAD: 03bob1961 * r30471 10/brlcad/trunk/src/util/rtwizard.bat: Update the version. There should be a way to do this dynamically.
17:43.36 *** join/#brlcad cad37 (n=8614d860@bz.bzflag.bz)
19:03.35 *** join/#brlcad iraytrace (n=iraytrac@cocoa.sci.utah.edu)
19:35.27 *** join/#brlcad vedge_ (n=vedge@leary.csoft.net)
19:52.58 *** join/#brlcad vedge (i=vedge@leary.csoft.net)
20:00.22 CIA-32 BRL-CAD: 03erikgreenwald * r30472 10/brlcad/trunk/src/other/openNURBS/Makefile.am: add deps
21:24.43 *** join/#brlcad Z80-Boy (n=clock@77-56-81-77.dclient.hispeed.ch)
21:26.45 *** join/#brlcad Elperion (n=Bary@p5487744C.dip.t-dialin.net)
23:32.06 *** join/#brlcad iraytrace (n=iraytrac@cocoa.sci.utah.edu)
23:44.51 *** join/#brlcad oden1 (n=oden@c-69-137-199-63.hsd1.fl.comcast.net)

Generated by irclog2html.pl Modified by Tim Riker to work with infobot.