<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5142808678922459337</id><updated>2011-07-08T08:56:34.319+10:00</updated><category term='Ultragraph'/><category term='Coding [3DS loading]'/><category term='Algorithm [Welding]'/><category term='sketches'/><category term='Algorithm [Smoothing Group]'/><category term='Zeitgeist'/><category term='music'/><category term='Algorithm [Normal-Map Sprite]'/><category term='edits'/><category term='Galileo Complex'/><category term='Coding [Lightmaps]'/><category term='Synergy'/><category term='Netherworld Odysseys'/><category term='Zanath'/><category term='Coding [Multicore]'/><category term='Coding [Texture Mapping]'/><title type='text'>Death By Dev</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-4452898370588192628</id><published>2010-07-07T14:43:00.019+10:00</published><updated>2010-07-07T16:25:57.795+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netherworld Odysseys'/><title type='text'>Let the party begin</title><content type='html'>Okay, yes. Neglected blog. Badly neglected. Come into the warm den of my attention and I shall nurture you back to health.&lt;br /&gt;&lt;br /&gt;*GlaDOS voice* It's been a long time...&lt;br /&gt;&lt;br /&gt;There's far too much I've been working on to cover in a single blog post (GlaDOS voice is off now btw), so I've decided to have a week of BLOG POSTING EXTRAVAGANZA! Each day I'll make a post focusing on a particular area of activity.&lt;br /&gt;&lt;br /&gt;This brings me to the troubling conundrum of where to begin. After some deliberation, it became obvious it didn't really matter, so I just picked whatever I felt like writing about right now. Thrilling, I know.&lt;br /&gt;&lt;br /&gt;So let's take a look at Netherworld Odysseys! Though this had a brief limelight of &lt;a href="http://deathbydev.blogspot.com/2008/07/lightmaps-cont.html"&gt;&lt;span style="font-style: italic;"&gt;one post&lt;/span&gt;&lt;/a&gt; in this blog, I did actually dedicate a considerable amount of time to this WarCraft 3 map. I know you don't know or remember what I'm talking about, so a quick refresher:&lt;br /&gt;&lt;br /&gt;Netherworld Odysseys (or just Netherworld or even Neth if I'm feeling lazy enough) is a custom WarCraft 3 map that is basically a Diablo clone. I wanted to focus on party interaction, challenge and replayability. These goals eventually expanded out into the following feature list:&lt;br /&gt;- Random loot and enemy placement&lt;br /&gt;- Multiple difficulties that get &lt;span style="font-style: italic;"&gt;hard&lt;/span&gt;. So hard that you call me a bastard.&lt;br /&gt;- Difficulty also scales with number of players&lt;br /&gt;- Large variety of settings and situations&lt;br /&gt;- Classes with multiple strategies and unique roles among the party&lt;br /&gt;- Saving and loading of characters for each player&lt;br /&gt;&lt;br /&gt;So that's the gist of it. Where I left the map after the last post about it was miserable. The map was starting to crash the game after a certain amount of time playing. This hamstrung the majority of goals I set out with the map. The most sucky thing was it always crashed just as it was getting good. The party was establishing its roles and equipment. The levels were getting tough. You were just about to charge into the crazy boss fight tanked up with buffs, potions and an elaborate plan.&lt;br /&gt;&lt;br /&gt;Then the game crashed.&lt;br /&gt;&lt;br /&gt;Not cool. At that point in development I had no idea how to save or load characters. I was focused so heavily on using the built-in cache feature (which only works for single player) that I just couldn't see any other way.&lt;br /&gt;&lt;br /&gt;Then my housemate &lt;a href="http://www.facebook.com/profile.php?id=737545475"&gt;Fox&lt;/a&gt; pointed out this saving system he'd seen in another War3 RPG map he'd played a while ago. It printed out a code that you wrote down and typed in later when you wanted to load the character again. NES style. I leapt at the idea. Perfect! Easy!&lt;br /&gt;&lt;br /&gt;So after a little bit of time I had that up and running. The map was back on track!&lt;br /&gt;&lt;br /&gt;As a side note, yes I agonisingly hunted for every possible cause of the crashing. I spent at least a &lt;span style="font-style: italic;"&gt;week&lt;/span&gt; on it (I don't know if that's impressive or not). The crash ultimately was something I could not fix.&lt;br /&gt;&lt;br /&gt;Establishing the saving and loading greatly reinvigorated my enthusiasm for the project. I started adding new classes, new areas, items, bosses, abilities. The stages started getting more elaborate. A boss fight could no longer be just a big dude with a lot of health. The battle needed to evolve as you wore him down.&lt;br /&gt;&lt;br /&gt;Suddenly the boss would start busting out a brutal new ability (video game cliche #??). You've run out of potions... now you need to focus on the towers to get a healing rune drop, now there's minions pouring in from the sides.&lt;br /&gt;&lt;br /&gt;Playing around with these ideas was insanely fun. It began to carry over into the level design. At the same time I was reading this D&amp;amp;D Dungeon Master's Guide that I had bought at this book market a while back (claimed the "find of the day" by Ben XD ). That was really fuelling my ideas for situations and elements in the environment.&lt;br /&gt;&lt;br /&gt;Big horde of enemies ambushing you? No worries, just Shockwave that support beam and cause a cave in to crush them; or hit that barrel to set the area on fire; or anger the wildlife then cloak to cause a battle between the two forces!&lt;br /&gt;&lt;br /&gt;For this reason, the most recent 2 dungeons, and especially the last one, took much more time to make than the starting areas. Ultimately I started to get burn out. There are 7 levels in the map as it stands, and I have 2 more planned but not implemented beyond basic concepts in my head. It would be very satisfying to return to this project (it has been dormant for... at least 9 months) and finish off those last two levels (including the EPIC final boss battle), and complete all the classes (Barbarian, Paladin, Mage and Druid are fully playable, Assassin and Ranger remain incomplete).&lt;br /&gt;&lt;br /&gt;If I do so, I'll dedicate an entire post to its release, talk about all the classes and various strategies my friends and I have tried while play testing.&lt;br /&gt;&lt;br /&gt;Oh the play testing. Funny stuff. Ben and &lt;a href="http://www.facebook.com/nanobotbraincloud"&gt;David&lt;/a&gt; had a LAN at their place and gave a bugged version of the map a play... and were tortured for hours. The bug? Sometimes the 5th level boss would spawn as a &lt;span style="font-style: italic;"&gt;regular enemy&lt;/span&gt;. They didn't know it was a bug... they just thought I was an evil, satanic being that feeds on suffering.&lt;br /&gt;&lt;br /&gt;Then there was the LAN we had before that at my place. There was a particular combination of enemy types that spawned near the end of the most recently implemented stage that was ridiculously hard to counter. Ultimately David rage quit and told me to "fuck that map". Ah, good times.&lt;br /&gt;&lt;br /&gt;So yes, blog post about shelfware War3 map. Like I said, I wrote about what I felt like, not necessary the PEAK OF THE EXTRAVAGANZA. More like the &lt;span style="font-style: italic;"&gt;tip&lt;/span&gt;. Oh clever puns and metaphor interplay.&lt;br /&gt;&lt;br /&gt;Return tomorrow for more &lt;span style="font-style: italic;"&gt;incredible content&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-4452898370588192628?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/4452898370588192628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=4452898370588192628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4452898370588192628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4452898370588192628'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2010/07/okay-yes.html' title='Let the party begin'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-5871447227940877729</id><published>2009-10-29T00:57:00.007+10:00</published><updated>2009-10-29T01:11:25.491+10:00</updated><title type='text'>Skylines</title><content type='html'>Been working with more traditional materials lately. Attempting to develop a solid field-sketching work flow. Getting used to working with an artist's grip on the pencil and drawing confident strokes with large sweeps. Will scan in my work when I figure out how to exactly.&lt;br /&gt;&lt;br /&gt;In the mean time, some paltry offerings:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SuhddVk9ZQI/AAAAAAAAAKU/TuTyndjyjUI/s1600-h/sylea.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 397px; height: 400px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SuhddVk9ZQI/AAAAAAAAAKU/TuTyndjyjUI/s400/sylea.jpg" alt="" id="BLOGGER_PHOTO_ID_5397666911993292034" border="0" /&gt;&lt;/a&gt;Concept art for a sprite idea I had. The idea primarily sprung from thinking about palette, especially the neon green. Awful anatomy :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Suhd3cgtFzI/AAAAAAAAAKc/mZPPwQ8MPJ8/s1600-h/mayan_statue_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 231px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Suhd3cgtFzI/AAAAAAAAAKc/mZPPwQ8MPJ8/s400/mayan_statue_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5397667360531093298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Concept sketch for a 3D model to be used in a Team Fortress 2 map I'm making. Learning Blender in the process, great app.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SuheTWSdMLI/AAAAAAAAAKk/QvTvf44r_Bg/s1600-h/skyline_0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SuheTWSdMLI/AAAAAAAAAKk/QvTvf44r_Bg/s400/skyline_0.jpg" alt="" id="BLOGGER_PHOTO_ID_5397667839897055410" border="0" /&gt;&lt;/a&gt;Random doodle I did after work one night. Mainly playing around with brushes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Suhem0pf15I/AAAAAAAAAKs/luahShr_shA/s1600-h/gen_sky_far_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 200px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Suhem0pf15I/AAAAAAAAAKs/luahShr_shA/s400/gen_sky_far_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5397668174464276370" border="0" /&gt;&lt;/a&gt;Background concept for another project of mine which I'm flirting with resuming. Really happy with the direction of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-5871447227940877729?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/5871447227940877729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=5871447227940877729' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/5871447227940877729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/5871447227940877729'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2009/10/skylines.html' title='Skylines'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SuhddVk9ZQI/AAAAAAAAAKU/TuTyndjyjUI/s72-c/sylea.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-65904381936988452</id><published>2009-09-23T01:36:00.014+10:00</published><updated>2009-09-23T02:51:38.683+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zeitgeist'/><category scheme='http://www.blogger.com/atom/ns#' term='sketches'/><title type='text'>Resuscitation</title><content type='html'>Right, where was I? It's been a while. What happened? Where have I been? What have I done, and why have I returned?&lt;br /&gt;&lt;br /&gt;I needed time to consider what I'm doing in my life and where I want to go. I needed to think about the world I'm in and what role I play, as I felt that leaving this issue largely unattended was the cause of a lot of the difficulties I have been having in progressing.&lt;br /&gt;&lt;br /&gt;It's a long story, but I believe I know the answers as best I can now, and am moving forward again. So, does art still play a role in my life? Certainly; that is to say &lt;span style="font-style: italic;"&gt;of course it does&lt;/span&gt;. The direction and focus of my art has become clearer, though.&lt;br /&gt;&lt;br /&gt;I doubt I've mentioned it on here before, but I'm very much interested in broad social issues. There's a lot of things about day to day life and society in general that have bothered me for a long time. I used to be very critical, negative and irritable about a lot of things. Over time, however, my frustration has given way to determination and clarity.&lt;br /&gt;&lt;br /&gt;Over the last couple of years I've read things here and there on the net, and each item has gotten me closer to a big picture of society. Much of this culminated in the discovery of the &lt;a href="http://www.thezeitgeistmovement.com/"&gt;Zeitgeist Movement&lt;/a&gt; and the &lt;a href="http://www.thevenusproject.com/"&gt;Venus Project&lt;/a&gt;. To me, these now are the principle concern of my efforts. If you are unfamiliar with them, I &lt;span style="font-style: italic;"&gt;urge&lt;/span&gt; you to look at them. There's &lt;a href="http://www.thezeitgeistmovement.com/joomla/index.php?option=com_content&amp;amp;view=article&amp;amp;id=30&amp;amp;Itemid=148"&gt;movies&lt;/a&gt;, &lt;a href="http://www.blogtalkradio.com/Peter-Joseph"&gt;podcasts&lt;/a&gt; and &lt;a href="http://www.thevenusproject.com/get-involved/free-downloads"&gt;books&lt;/a&gt; (just the tip of the iceberg). A wealth of information that will most assuredly broaden your perception.&lt;br /&gt;&lt;br /&gt;I've actually been considering how to marry this blog to my Venus Project focus. Either a sister blog will be created, or this one will need to be reworked. Still deciding...&lt;br /&gt;&lt;br /&gt;So back to my art. I will try to the best of my ability to use what artistic skill I have to help spread awareness of the Zeitgeist Movement and its core ideas. Where exactly that goes, I don't really know. I imagine a lot of it will be things like banners, posters and fliers. Though I did have a few chats with someone about making a Venus Project themed comic for a while. The possibilities are many, at any rate. This is the first real thing I've turned out:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i188.photobucket.com/albums/z212/gastrop0d/zeitgeist/poster_02_07.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 380px; height: 588px;" src="http://i188.photobucket.com/albums/z212/gastrop0d/zeitgeist/poster_02_07.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It was originally conceived as part of a series of posters to be placed around university campuses. The idea I had was to have different posters for different schools within the institution, so concepts could be presented to people in ways that would appeal to what they study. For instance, you have issues about behaviourism in the Psychology buildings, issues about censorship and philosophy in the Arts building, and, as is the case with the above poster, issues of technology in the IT and Engineering buildings, etc. I have an idea for a business one which I hope to turn out soon.&lt;br /&gt;&lt;br /&gt;Just for fun, here's a concept sketch I did for the Venus Project comic:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i188.photobucket.com/albums/z212/gastrop0d/comic_01__00b.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 364px; height: 279px;" src="http://i188.photobucket.com/albums/z212/gastrop0d/comic_01__00b.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: center; font-style: italic;"&gt;The protagonist within his gloomy industrial work center&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Aside from that, I will continue my artistic study in order to improve my skills. Not a great deal of time has been committed to this, but progress is being made nonetheless. Here's how it's shaped up:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i188.photobucket.com/albums/z212/gastrop0d/sketches/2009_03_02_pm_04.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 365px; height: 271px;" src="http://i188.photobucket.com/albums/z212/gastrop0d/sketches/2009_03_02_pm_04.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i188.photobucket.com/albums/z212/gastrop0d/sketches/2009_03_03_pm_00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 361px; height: 323px;" src="http://i188.photobucket.com/albums/z212/gastrop0d/sketches/2009_03_03_pm_00.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i188.photobucket.com/albums/z212/gastrop0d/sketches/2009_03_02_pm_03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 356px; height: 219px;" src="http://i188.photobucket.com/albums/z212/gastrop0d/sketches/2009_03_02_pm_03.jpg" alt="" border="0" /&gt;&lt;/a&gt;All posemaniacs references. These were mainly concerned with getting gesture and loose, confident strokes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/Srj1VzkocVI/AAAAAAAAAIU/AFfCTAGmVek/s1600-h/2009_03_17_pho_00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 352px; height: 400px;" src="http://2.bp.blogspot.com/_dxv79sBchMg/Srj1VzkocVI/AAAAAAAAAIU/AFfCTAGmVek/s400/2009_03_17_pho_00.jpg" alt="" id="BLOGGER_PHOTO_ID_5384323109491339602" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Srj1olQomVI/AAAAAAAAAIc/VdORUbjvCAo/s1600-h/2009_04_13_pho_00_sm.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 325px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Srj1olQomVI/AAAAAAAAAIc/VdORUbjvCAo/s400/2009_04_13_pho_00_sm.jpg" alt="" id="BLOGGER_PHOTO_ID_5384323432066881874" border="0" /&gt;&lt;/a&gt;Photo reference. These were for just studying real people. The second woman in particular has a very interesting body.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Srj1ylsU13I/AAAAAAAAAIk/fADG-OIrg8s/s1600-h/2009_07_21_00.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Srj1ylsU13I/AAAAAAAAAIk/fADG-OIrg8s/s400/2009_07_21_00.JPG" alt="" id="BLOGGER_PHOTO_ID_5384323603981719410" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dxv79sBchMg/Srj17p5edGI/AAAAAAAAAIs/XE7bH5Ubu_o/s1600-h/2009_07_21_01.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 283px; height: 400px;" src="http://3.bp.blogspot.com/_dxv79sBchMg/Srj17p5edGI/AAAAAAAAAIs/XE7bH5Ubu_o/s400/2009_07_21_01.JPG" alt="" id="BLOGGER_PHOTO_ID_5384323759729439842" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/Srj2Ev55mXI/AAAAAAAAAI0/hh25aFPI7cw/s1600-h/2009_07_21_02.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 372px; height: 400px;" src="http://2.bp.blogspot.com/_dxv79sBchMg/Srj2Ev55mXI/AAAAAAAAAI0/hh25aFPI7cw/s400/2009_07_21_02.JPG" alt="" id="BLOGGER_PHOTO_ID_5384323915960654194" border="0" /&gt;&lt;/a&gt;Mainly posemaniacs stuff. Playing around with charcoal brushes. I really like the grittiness and ambiguity it gives pieces. I see myself using things like this a lot more.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Srj2Q95LEQI/AAAAAAAAAI8/fuBK3Glmt9k/s1600-h/2009_9_1_goblin_man_2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 338px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Srj2Q95LEQI/AAAAAAAAAI8/fuBK3Glmt9k/s400/2009_9_1_goblin_man_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5384324125874131202" border="0" /&gt;&lt;/a&gt;Just a weird thing I did. Originally it was meant to be a concept sketch for a new &lt;a href="http://www.wayofthepixel.net/pixelation/index.php"&gt;pixelation&lt;/a&gt; avatar. I basically had this concept of a very concave face shape and glowing eyes, but it ended up as a goblin man painting, so, there you go...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/Srj5vGitaiI/AAAAAAAAAJE/yjwJw6oJRRI/s1600-h/integrate_08.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 259px; height: 400px;" src="http://4.bp.blogspot.com/_dxv79sBchMg/Srj5vGitaiI/AAAAAAAAAJE/yjwJw6oJRRI/s400/integrate_08.jpg" alt="" id="BLOGGER_PHOTO_ID_5384327942126791202" border="0" /&gt;&lt;/a&gt;Painting concept; something I'd love to do on a traditional medium at some point. Part of a series on the body and spirit. Part of a long, intricate vision I had while meditating.&lt;br /&gt;&lt;br /&gt;Anatomy study needs to be returned to. Shading study could also use some redressing, but for the most part I'm feeling good about the direction I'm heading. Very happy with the palette I've developed, makes work very fast and easy. Now I just need to get a good selection of brushes going and I'll be set.&lt;br /&gt;&lt;br /&gt;P.S. I cut my hair!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-65904381936988452?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/65904381936988452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=65904381936988452' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/65904381936988452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/65904381936988452'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2009/09/resuscitation.html' title='Resuscitation'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i188.photobucket.com/albums/z212/gastrop0d/zeitgeist/th_poster_02_07.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-4690790320920297758</id><published>2009-03-02T00:32:00.005+10:00</published><updated>2009-03-02T01:09:20.576+10:00</updated><title type='text'>Artistic Transmutation</title><content type='html'>Well I suppose things haven't been as productive as is possible. I've seen myself essentially shift from the position of a producer to that of a consumer. Rather than draw, sing and write, I view, hear and read. This has resulted in a stagnation of inspiration as I lose impulsive association between what is perceived and what is expressed.&lt;br /&gt;&lt;br /&gt;In steps to reverse this alarming position, I reformed my own opinion on the matter, transmuting the situation from indifference to concern. Once this critical realisation was manifest, events aligned to assist in an actuation of this concept to reality. I had a good talk with my old friend Jack, whose reassurances of my inspiration and abilities pushed my resolve and momentum towards action, further resulting in his gifting of a book to my possession. It's an addition to the paltry collection of art books I hold, and it eerily mirrors my current artistic visions and sensibilities.&lt;br /&gt;&lt;br /&gt;Following this event was the reconsolidation of the artistic alliance between Nick and I, where we have undertaken careful study of human anatomy for the purposes of drawing. I've been doing a considerable number of sketches since that commencement, and improvement has been marked, though yet to be notably achieved. Prepare for the largest dump this blog has seen to date:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SaqiaL44ckI/AAAAAAAAAHQ/z1M833Gopkk/s1600-h/ben_07.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 398px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SaqiaL44ckI/AAAAAAAAAHQ/z1M833Gopkk/s400/ben_07.jpg" alt="" id="BLOGGER_PHOTO_ID_5308233681561219650" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;The first sketch, from reference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/Saqiluid-1I/AAAAAAAAAHY/XAs7Q0IMCJA/s1600-h/2009_02_14_sub_04.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 276px; height: 400px;" src="http://4.bp.blogspot.com/_dxv79sBchMg/Saqiluid-1I/AAAAAAAAAHY/XAs7Q0IMCJA/s400/2009_02_14_sub_04.jpg" alt="" id="BLOGGER_PHOTO_ID_5308233879841012562" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Another from reference, still on head study at this stage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/Saqiz9k-DKI/AAAAAAAAAHg/2WJwaXggAMg/s1600-h/2009_02_19_erin_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 278px; height: 400px;" src="http://2.bp.blogspot.com/_dxv79sBchMg/Saqiz9k-DKI/AAAAAAAAAHg/2WJwaXggAMg/s400/2009_02_19_erin_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5308234124396203170" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;More head study, from reference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Saqi_Ur3vmI/AAAAAAAAAHo/almGOozAvRY/s1600-h/vilppu_anat_01_59-03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 231px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Saqi_Ur3vmI/AAAAAAAAAHo/almGOozAvRY/s400/vilppu_anat_01_59-03.jpg" alt="" id="BLOGGER_PHOTO_ID_5308234319577726562" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Following from notes, head study&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dxv79sBchMg/SaqjK54_IeI/AAAAAAAAAHw/DvpMXbRv54E/s1600-h/2009_02_20_neck_00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 383px; height: 400px;" src="http://3.bp.blogspot.com/_dxv79sBchMg/SaqjK54_IeI/AAAAAAAAAHw/DvpMXbRv54E/s400/2009_02_20_neck_00.jpg" alt="" id="BLOGGER_PHOTO_ID_5308234518543409634" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Neck study, this is totally messed up&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SaqkQRRGK4I/AAAAAAAAAIM/rlvIohJgys8/s1600-h/2009_02_19_neck_04.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 340px; height: 400px;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SaqkQRRGK4I/AAAAAAAAAIM/rlvIohJgys8/s400/2009_02_19_neck_04.jpg" alt="" id="BLOGGER_PHOTO_ID_5308235710229523330" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;More neck study, even more messed up&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SaqjdlP2q3I/AAAAAAAAAH4/bc3ep_dZvOs/s1600-h/vilppu_anat_04_00-18-50.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 339px; height: 400px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SaqjdlP2q3I/AAAAAAAAAH4/bc3ep_dZvOs/s400/vilppu_anat_04_00-18-50.jpg" alt="" id="BLOGGER_PHOTO_ID_5308234839419693938" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Neck study, following from notes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/Saqj0D1UW0I/AAAAAAAAAIA/bYXcSGro56c/s1600-h/vilppu_anat_04_00-30-00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 231px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/Saqj0D1UW0I/AAAAAAAAAIA/bYXcSGro56c/s400/vilppu_anat_04_00-30-00.jpg" alt="" id="BLOGGER_PHOTO_ID_5308235225587014466" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;And finally, more neck study from notes, some serious errors on head, and extension of study to shoulders&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Each section of study will need numerous reviews. I am currently looking over the torso and pelvis, and hope to delve into some sketches of those in the next couple of days.&lt;br /&gt;&lt;br /&gt;Rejoice!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-4690790320920297758?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/4690790320920297758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=4690790320920297758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4690790320920297758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4690790320920297758'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2009/03/artistic-transmutation.html' title='Artistic Transmutation'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SaqiaL44ckI/AAAAAAAAAHQ/z1M833Gopkk/s72-c/ben_07.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-5380964281454220509</id><published>2009-01-17T18:54:00.006+10:00</published><updated>2009-01-17T19:57:07.351+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><title type='text'>A Special Kind of Hell</title><content type='html'>I've spent the majority of today attempting to get &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt; to compile.&lt;br /&gt;&lt;br /&gt;Basically, as far as I can tell, after I formatted my computer some time ago and reinstalled MSVC++ 2008, reinstated all the libraries that Synergy uses (Allegro, AllegroGL &amp;amp; SOIL), at some stage something went &lt;span style="font-style: italic;"&gt;wrong&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I loaded up the &lt;span style="font-family:courier new;"&gt;.sln&lt;/span&gt; file, and hit &lt;span style="font-style: italic;"&gt;Build&lt;/span&gt;, and I was confronted with one of the strangest errors I've seen in a while: something about an inline assembly code error, expected an opcode and found a data type, or something bizarre like that.&lt;br /&gt;&lt;br /&gt;I started to systematically compile each individual &lt;span style="font-family:courier new;"&gt;.cpp&lt;/span&gt; file, and found that all of them except 1 compiled just fine. The troublemaker that caused the problem was &lt;span style="font-family:courier new;"&gt;gam_Entity.cpp&lt;/span&gt;, which is weird because that's a very simple source file, with very few dependencies and very straight-forward class-definition-style code.&lt;br /&gt;&lt;br /&gt;So I kind of fiddled around in that file, commenting out sections of code and recompiling, trying to find a particular line that spouted the error, and I found that no line caused it, since I ended up commenting out the entire &lt;span style="font-family:courier new;"&gt;.cpp&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;.h&lt;/span&gt; files! By this point I was just downright flabbergasted, and I turned to google for help.&lt;br /&gt;&lt;br /&gt;I found a couple of pages that mainly went through fiddling with project properties, cleaning out &lt;span style="font-family:courier new;"&gt;.obj&lt;/span&gt; itermediary files, that sort of thing. But none of those seemed to fix it. So then I started thinking maybe it was something about where Allegro was being included, so I started including &lt;span style="font-family:courier new;"&gt;allegro.h&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;alleggl.h&lt;/span&gt; at different points in the header file, commenting out includes, trying &lt;span style="font-family:courier new;"&gt;#include &lt;allegro.h&gt;&lt;/allegro.h&gt;&lt;/span&gt; instead of &lt;span style="font-family:courier new;"&gt;#include "allegro.h"&lt;/span&gt;, random trial and error things like that.&lt;br /&gt;&lt;br /&gt;I don't remember exactly at what point it worked, but somewhere it worked. As far as I can tell, no one thing that I did fixed it, it just seemed to `come good', which is troubling.&lt;br /&gt;&lt;br /&gt;Anyway, after that assembly error stopped coming up, I had a new set of errors coming up; a tonne of link errors. Welcome to the next nightmare. This was basically about 180 LNK2001 errors saying various identifiers had already been included in &lt;span style="font-family:courier new;"&gt;.obj&lt;/span&gt; files. I did more scanning of the net and went a little crazy, and then I realised I had actually gone through all the functions in &lt;span style="font-family:courier new;"&gt;m_common.h&lt;/span&gt; and removed the &lt;span style="font-family:courier new;"&gt;inline&lt;/span&gt; from the beginning of each non-template function definition in an attempt to fix the previous problem. Dur. So I replaced the &lt;span style="font-family:courier new;"&gt;inline&lt;/span&gt;s and bam! No more link errors.&lt;br /&gt;&lt;br /&gt;But then I got a single error; something about P1 and P2 being different versions. Scanning the net more, I found out this relates to the compiler having incosistent versions of itself, or that libraries that I'm using have been compiled with different version compilers, something quite likely. So then I kind of started losing my mind, and tried bringing in different versions of each library to MSVC++ 8.0, downloading and installing MSVC++ 9.0 and installing the libraries for that, and even going back to MSVC++ 6.0 and trying there.&lt;br /&gt;&lt;br /&gt;What I ended up with was uninstalling 8.0 sort of out of some irrational belief that it would help to quell the curse upon my computer, but also (more rationally) that I should try reinstalling it at some point and carefully version checking each library I bring into it.&lt;br /&gt;&lt;br /&gt;MSVC++ 9.0 overcame the P1 != P2 error, but now &lt;span style="font-family:courier new;"&gt;SOIL.lib&lt;/span&gt; was spouting a couple of link errors to unresolved external symbols &lt;span style="font-family:courier new;"&gt;__alloca()&lt;/span&gt; and something else. So now I'm quite lost. My guess is some version inconsistency between the 9.0 compiler and the compiler that SOIL was written for, ie SOIL only compiles on 8.0 or earlier, or something like that. That's something I mean to test when I reinstall 8.0.&lt;br /&gt;&lt;br /&gt;I then tried to comment out the SOIL code and I was left with a single link error about &lt;span style="font-family:courier new;"&gt;MSVCRT&lt;/span&gt; not being able to locate &lt;span style="font-family:courier new;"&gt;_main&lt;/span&gt;. So I followed some instructions on a website to fiddle with the MFC settings in the project settings, which just spawned more errors so I reverted back to EXACTLY how the settings were, and now I have &lt;span style="font-weight: bold;"&gt;7&lt;/span&gt; errors. It's absolute madness!&lt;br /&gt;&lt;br /&gt;MSVC++ 6.0 finally managed to compile and execute an older version of the code once I commented out all reference to SOIL. This is basically the best result that I've achieved. At this point I'm looking at bringing in all the code that I've written since this old version, getting it to function, and then (hopefully!) compile and run. At that point I'll be back to where I was, except in 6.0 instead of 8.0, to which I say &lt;span style="font-style: italic;"&gt;good riddance&lt;/span&gt;. This might also be a good time to rid myself of AllegroGL for good. One lesson I take from this is `the less dependencies, the better'.&lt;br /&gt;&lt;br /&gt;So there it is, my special kind of hell. To be honest, this should never have happened. Part of the function of this blog is to act as an engineering journal, where I can record version changes and things I do to my projects which might end up leading to something like this current scenario in the future. I should have had logged which version all of my libraries, IDE and compiler were and the directory of my last known successful build of Synergy.&lt;br /&gt;&lt;br /&gt;I won't make the same mistake again.&lt;br /&gt;&lt;br /&gt;--------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;Synergy Version:&lt;/span&gt;&lt;span style="font-family: georgia;"&gt; 0.0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;IDE Version:&lt;/span&gt;&lt;span style="font-family: georgia;"&gt; MSVC++ 6.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;Allegro Version:&lt;/span&gt;&lt;span style="font-family: georgia;"&gt; 4.2.2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;AllegroGL Version:&lt;/span&gt;&lt;span style="font-family: georgia;"&gt; 0.4.2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;SOIL Version:&lt;/span&gt;&lt;span style="font-family: georgia;"&gt; 2008/07/07&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;Current Status:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: georgia;"&gt;&lt;li&gt;Compiling &amp;amp; Executing&lt;/li&gt;&lt;li&gt;SOIL producing two LNK2001 errors; all SOIL references have been commented out&lt;/li&gt;&lt;li&gt;Thus, textures currently not loading&lt;/li&gt;&lt;li&gt;Old demo version; multiple smoothed 3D objects floating in space&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;To Do:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: georgia;"&gt;&lt;li&gt;Eliminate all AllegroGL dependency&lt;/li&gt;&lt;li&gt;Fix texture loading&lt;/li&gt;&lt;li&gt;Implement multicore functionality&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Reintegrate following features:&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-family: georgia;"&gt;&lt;li&gt;multiple material meshes&lt;/li&gt;&lt;li&gt;the `Big Room' demo&lt;/li&gt;&lt;li&gt;lightmaps&lt;/li&gt;&lt;li&gt;unified lighting attenuation system&lt;/li&gt;&lt;/ol&gt;&lt;ul style="font-family: georgia;"&gt;&lt;li&gt;Implement uniform lightmap patching system&lt;/li&gt;&lt;li&gt;Implement physics library integration&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-5380964281454220509?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/5380964281454220509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=5380964281454220509' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/5380964281454220509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/5380964281454220509'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2009/01/special-kind-of-hell.html' title='A Special Kind of Hell'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-1251988529440712861</id><published>2009-01-15T15:58:00.008+10:00</published><updated>2009-01-16T00:33:44.098+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [Multicore]'/><category scheme='http://www.blogger.com/atom/ns#' term='sketches'/><title type='text'>Multi Yodel Scope</title><content type='html'>So, I've been on holidays for two months or so, and have been partaking in eclectic activities. Most of these are not significant to the focus of this blog, however I have managed to glean some constructive work from this time.&lt;br /&gt;&lt;br /&gt;First up, I've given some attention to restructuring &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt; to support multicore processing. I had the design goals to allow the engine to scale with cores at run time, to have next to zero locking mechanisms in the code, and to have the multicore functionality as transparent as possible.&lt;br /&gt;&lt;br /&gt;What I ended up with is largely a combination of two materials I read. The first is &lt;a href="http://www.ziggyware.com/readarticle.php?article_id=221"&gt;an introductory article to writing multicore games for the Xbox 360&lt;/a&gt;, which gives a good overall breakdown of an engine's structure into parallel processes. The second is &lt;a href="http://www.valvesoftware.com/publications/2007/GDC2007_SourceMulticore.pdf"&gt;Valve Corporation's presentation on Source Engine's multicore concepts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Taking these two together, I basically have two `Delegator' threads that run through the structure outlined in the 360 article as 2 parallel processes. Every significant independently executable function within those threads is called with a function wrapper &lt;span style="font-family:courier new;"&gt;task()&lt;/span&gt;, which takes a pointer to the function to be run, and up to four parameters caste to &lt;span style="font-family:courier new;"&gt;void&lt;/span&gt; type. The &lt;span style="font-family:courier new;"&gt;task()&lt;/span&gt; function takes the information passed to it and builds a linked list with it, and then pushes that linked list onto a lock-less task queue.&lt;br /&gt;&lt;br /&gt;All the while this is happening, there is a thread pool with some number of threads all executing a &lt;span style="font-family:courier new;"&gt;peon()&lt;/span&gt; function. As the name might suggest, peon functions continually check the task queue for a task, and if they can grab it they do so, break the linked list up into a function call, and then execute the function representing the task to be done. Upon completing the function, the thread returns to its &lt;span style="font-family:courier new;"&gt;peon()&lt;/span&gt; function to continue checking for more work to do. As you might guess, the number of peon threads in operation is related to how many CPU cores are visible to the engine. The more cores available, the more peons can be running.&lt;br /&gt;&lt;br /&gt;Within all of this is a simple semaphore system whereby a task in the queue can be associated with a semaphore. This allows the delegator threads to wait until a certain cluster of tasks in the queue are completed before adding more tasks. This is a necessary evil simply due to the serialised structure of games themselves, and at the moment is the most logical solution I can think of. This is, in fact, a locking mechanism, but it's only operating when the actual logic of the program cannot proceed until the current tasks are completed, and it should minimise any kind of thrashing, since the peon threads never rely on the semaphores.&lt;br /&gt;&lt;br /&gt;So that's Synergy's multicore structure at the moment. Nothing too sophisticated, and still yet to actually be tested! But at least in theory it meets all of my design goals for the moment.&lt;br /&gt;&lt;br /&gt;Next up in my projects is a Team Fortress 2 map! I've been itching to do some mapping for a while, but struggled to settle upon a good idea until I was reading over the Valve Developer Community Team Fortress 2 pages, and there was an article about Circular Control Point map types. This is a game mode currently not implemented in any official map, but has the potential to be an extremely dynamic game type if implemented appropriately.&lt;br /&gt;&lt;br /&gt;After reading about it, I had a rapid explosion of ideas for a map, and begun to sketch out every area in photoshop, paying careful attention to attack/defend dynamics, flanks, killzones and setup areas. As well as the obvious considerations for each class.&lt;br /&gt;&lt;br /&gt;After about a day I had the whole map sketched out and detailed with all major routes, spawns, setup areas, rocket jump access, etc, and began to actually rough the map out in Hammer. As of writing this I have the entire map roughed out in seperate map files and am currently bringing them all together and playing a juggling act to get them to all fit together. Some points have considerably larger areas than others, and so alot of scale harmonising needs to be done, which is a little tedious.&lt;br /&gt;&lt;br /&gt;I'm hoping to have a tight, playable alpha of the map ready by the next tf2mappers.net game day, so it can have some testing done by fellow mappers. Anyway, though it's hardly eye-candy material at this point, here's some screen shots:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SW7tonWa1XI/AAAAAAAAAFY/nFxDqdT5tn4/s1600-h/yodel_peak_060002.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SW7tonWa1XI/AAAAAAAAAFY/nFxDqdT5tn4/s400/yodel_peak_060002.jpg" alt="" id="BLOGGER_PHOTO_ID_5291427894220477810" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Battle area below D&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SW9GT9WYVKI/AAAAAAAAAFo/sui91uYKvOM/s1600-h/yodel_peak_090002.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SW9GT9WYVKI/AAAAAAAAAFo/sui91uYKvOM/s400/yodel_peak_090002.jpg" alt="" id="BLOGGER_PHOTO_ID_5291525395883512994" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Attacker's far staging area at C&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SW9GcikWn6I/AAAAAAAAAFw/o1znow6u444/s1600-h/yodel_peak_090003.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SW9GcikWn6I/AAAAAAAAAFw/o1znow6u444/s400/yodel_peak_090003.jpg" alt="" id="BLOGGER_PHOTO_ID_5291525543313186722" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Primary indoor contesting area of C&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Oh and here's some random sketch I half-finished up the other day:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SW7uCCSEy9I/AAAAAAAAAFg/nyz7oC6L0Ik/s1600-h/ogre_attack_05.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 214px;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SW7uCCSEy9I/AAAAAAAAAFg/nyz7oC6L0Ik/s400/ogre_attack_05.jpg" alt="" id="BLOGGER_PHOTO_ID_5291428330946743250" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;What if the mountain defeats you?&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-1251988529440712861?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/1251988529440712861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=1251988529440712861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/1251988529440712861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/1251988529440712861'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2009/01/multi-yodel-scope.html' title='Multi Yodel Scope'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SW7tonWa1XI/AAAAAAAAAFY/nFxDqdT5tn4/s72-c/yodel_peak_060002.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-7812435435185757567</id><published>2008-09-04T17:47:00.008+10:00</published><updated>2008-09-04T18:23:04.421+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sketches'/><title type='text'></title><content type='html'>Well, I've been largely preoccupied with the struggle between procrastination and obligation that is typical of my student career. For the most part, the only things productive I have been working on have been my Systems Programming assignment, which essentially involves developing a shell for UNIX.&lt;br /&gt;&lt;br /&gt;Outside of that (and largely useless activities such as online gaming), I have tried to find time and motivation to work on some kind of creative activities. I'm trying to avoid diving into my large projects (such as Synergy) for a few reasons:&lt;br /&gt;&lt;br /&gt;- it is mentally draining and involving to work on them, and I need to maintain my mental stamina for academic pursuits.&lt;br /&gt;- I'm learning a lot of very pertinent programming methods in my study this semester. Methods which can apply directly to improving the operation of Synergy. As such, I want to wait until I have grasped this knowledge more fully before I apply it to my personal projects.&lt;br /&gt;&lt;br /&gt;So my focus has been towards finding creative activities which can still contribute to the development of my overall skill set and ultimately the development of my portfolio of work, but are light-weight activities that I can pick up, work on for a set amount of time and then put down and return to my study.&lt;br /&gt;&lt;br /&gt;Ultimately, this has lead me doing a lot more artistic activities, such as drawing. &lt;a href="http://www.myspace.com/batmans_god_damn_page"&gt;Nick&lt;/a&gt; introduced me to &lt;a href="http://www.posemaniacs.com/?pagename=thirtysecond"&gt;a very useful site called `Posemaniacs'&lt;/a&gt;. Head over there if you want to see what it's about. You don't want to? &lt;span style="font-style: italic;"&gt;Fine&lt;/span&gt;, I'll explain: it is a collection of browser-embedded tools for human figure sketching and study. My link leads to the 30-second drawing section, which as you might suspect, involves the presentation of figures in poses for only 30 seconds at a time before changing, promoting rapid sketching and utmost line economy.&lt;br /&gt;&lt;br /&gt;I've only attempted a couple of sessions, undertaking a more reasonable [for me] configuration of 60 seconds. Here's how they've turned out:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SL-WwMGAu-I/AAAAAAAAAEo/hp-hL92679o/s1600-h/60_sec_2008_09_04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SL-WwMGAu-I/AAAAAAAAAEo/hp-hL92679o/s400/60_sec_2008_09_04.png" alt="" id="BLOGGER_PHOTO_ID_5242074245906873314" border="0" /&gt;&lt;/a&gt;And a slightly less deplorable collection:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SL-W6HBWXRI/AAAAAAAAAEw/kT0uqJyh-cQ/s1600-h/60_sec_2008_08_18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SL-W6HBWXRI/AAAAAAAAAEw/kT0uqJyh-cQ/s400/60_sec_2008_08_18.png" alt="" id="BLOGGER_PHOTO_ID_5242074416343833874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I also partook in a competition over at &lt;a href="http://www.geekfangirl.proboards104.com/index.cgi"&gt;GeekFanGirl&lt;/a&gt;, where entrants had to either draw a scene or character from an active role play, or write short story about it/them. Turns out, I was the only one to do an art entry. I drew one of the main NPCs from my own RP I GM, the wild druid, Taech:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dxv79sBchMg/SL-XpNMhNKI/AAAAAAAAAE4/g9GCHe3Wj9I/s1600-h/taech_pose_08.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dxv79sBchMg/SL-XpNMhNKI/AAAAAAAAAE4/g9GCHe3Wj9I/s400/taech_pose_08.png" alt="" id="BLOGGER_PHOTO_ID_5242075225455146146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There was a deadline for entries, and mine made it with 40 seconds to spare. To put it another way, this entry was largely rushed. This was a positive thing, in my mind, because I learned a lot about being economical with my work flow. I'm irritated with a lot of things in the piece though, such as the messed up lines and artifacts around the silhouette, the skull structure being a complete deviation from what I wanted, and the completely schizophrenic rendering styles across the image.&lt;br /&gt;&lt;br /&gt;Still, I'm pretty proud of the results, either way. I refuse to alter it, leaving it as a record of what I could accomplish in the time I had for working on it.&lt;br /&gt;&lt;br /&gt;So that's about it. I'm hoping to make the 60 second sketches a regular, if not daily activity. If I can manage that, then I believe I am well on my way to becoming a competent artist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-7812435435185757567?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/7812435435185757567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=7812435435185757567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/7812435435185757567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/7812435435185757567'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/09/well-ive-been-largely-preoccupied-with.html' title=''/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dxv79sBchMg/SL-WwMGAu-I/AAAAAAAAAEo/hp-hL92679o/s72-c/60_sec_2008_09_04.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-8207361510067671997</id><published>2008-07-25T01:14:00.007+10:00</published><updated>2008-11-13T16:07:00.172+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netherworld Odysseys'/><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [Lightmaps]'/><title type='text'>Lightmaps cont.</title><content type='html'>Well, it's been a little while since there has been any progress of note on any of my primary projects, but today I finally felt motivated enough to jump back in to work on &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;What have I been up to in the mean time? After having a game of a WarCraft III map called `Warchasers' at &lt;a href="http://www.facebook.com/profile.php?id=738880730"&gt;Ben&lt;/a&gt;'s place, I felt compelled to make a much improved clone of its gameplay. I worked obsessively on this clone, titled &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Netherworld Odysseys&lt;/span&gt;. It has become quite sophisticated, with a generalised random loot system, random monster spawning, character saving, charged item stacking, multiple difficulty levels including difficulty scaling with number of players, door/key system and Diablo 2-style mercenaries. Here's a couple of screenshots just for fun:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SIidjN0JijI/AAAAAAAAAD8/JC0JnQYvqV0/s1600-h/neth_001_03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SIidjN0JijI/AAAAAAAAAD8/JC0JnQYvqV0/s400/neth_001_03.jpg" alt="" id="BLOGGER_PHOTO_ID_5226600595892832818" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Assaulting the Spider Warren&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SIid2Jfh2CI/AAAAAAAAAEE/vD0PgZNrzI0/s1600-h/neth_001_00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SIid2Jfh2CI/AAAAAAAAAEE/vD0PgZNrzI0/s400/neth_001_00.jpg" alt="" id="BLOGGER_PHOTO_ID_5226600921150117922" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;The derelict wastelands of the Prison Realm&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Unfortunately the map was foremost designed as a multiplayer experience, but due to a number of technical shortcomings saving and load of characters became a necessary process to keep the map running, and saving/loading of data only works for single player. This in effect rendered the map a single-player only experience, killing my enthusiasm for it.&lt;br /&gt;&lt;br /&gt;However, it's not a complete loss. The triggers I developed for it are highly modular in nature and much of the cool features of the map can be reused in other warcraft maps of mine. If I find time and enthusiasm I might return to it and see if I can improve some of the technical issues crippling it currently and bring it back to a playable state for multiple players, get it to a satisfying play length and release it. Until then it festers on my hard drive...&lt;br /&gt;&lt;br /&gt;So! What did today bring? I admit that I had become horrificly bogged down with the lightmap functionality of Synergy and thus suffering a fetid case of Coder's Block. The lightmaps needed to be divided into correct patches over the level geometry to give an unstretched, unwarped surface for the lighting to exist over.&lt;br /&gt;&lt;br /&gt;Such functionality is non-existent in Synergy in its current state, and my coder's block prevented me from proceeding further with the matter. Thus, today was spent researching methods for patching, and other methods of lighting a scene.&lt;br /&gt;&lt;br /&gt;I ended up reading up on &lt;a href="http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm"&gt;radiosity methods&lt;/a&gt;, and the literature revealed a great deal of insight to me. Such was the extent of my new-found understanding that I went back to the problem of patching with much clarity and began to sketch out a patching algorithm for Synergy (based largely upon &lt;a href="http://www.flipcode.com/archives/Light_Mapping_Theory_and_Implementation.shtml"&gt;this example&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I'm still going through it, and will continue work on it tomorrow, but as it stands currently it seems most satisfactory. Upon implementation I expect Synergy's light mapping to be devoid of artifacts, uniform and correctly aligned. From there it's a very simple extension to add in some brute radiosity.&lt;br /&gt;&lt;br /&gt;Here's hoping there's no hitches.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-8207361510067671997?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/8207361510067671997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=8207361510067671997' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/8207361510067671997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/8207361510067671997'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/07/lightmaps-cont.html' title='Lightmaps cont.'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dxv79sBchMg/SIidjN0JijI/AAAAAAAAAD8/JC0JnQYvqV0/s72-c/neth_001_03.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-2123094274657494080</id><published>2008-07-08T04:20:00.013+10:00</published><updated>2008-11-13T16:07:01.212+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [Lightmaps]'/><category scheme='http://www.blogger.com/atom/ns#' term='sketches'/><title type='text'>Let There Be Lightmaps</title><content type='html'>Lightmaps are officially a nightmare to implement. They seem easy, but I have found otherwise. The last four days have been a battle, but I have made significant progress in implementing this feature in &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I began with the code outlined in &lt;a href="http://www.3ddrome.com/articles/dynamiclightmaps.php"&gt;this tutorial&lt;/a&gt;. A number of modifications needed to be made, including accounting for multiple light sources and using triangular surfaces instead of quads. I also factored lambertian calculation into the formula. Adhering to the tutorial strictly, plus the minor modifications I made to the formula, I ended up with this strange result:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dxv79sBchMg/SHJgA47binI/AAAAAAAAADE/iIoKntSrBMo/s1600-h/lightmap_00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dxv79sBchMg/SHJgA47binI/AAAAAAAAADE/iIoKntSrBMo/s400/lightmap_00.jpg" alt="" id="BLOGGER_PHOTO_ID_5220340486473747058" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Puzzle #1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The streaks were caused by a value overflow with my premature byte casting. Working in dwords and then casting to byte after the clamp got me to this (after adding a couple more lights):&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SHJgpwtinlI/AAAAAAAAADM/iu_JSuaBumQ/s1600-h/lightmap_04.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SHJgpwtinlI/AAAAAAAAADM/iu_JSuaBumQ/s400/lightmap_04.jpg" alt="" id="BLOGGER_PHOTO_ID_5220341188642643538" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Puzzle #2&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So it's obvious to see here the mapping coordinates are wrong. After systematically trying every single combination of texture coordinates for each vertex I discovered the closest result was this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dxv79sBchMg/SHJhG2k_6_I/AAAAAAAAADU/K2KXYnVwiyc/s1600-h/lightmap_05.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dxv79sBchMg/SHJhG2k_6_I/AAAAAAAAADU/K2KXYnVwiyc/s400/lightmap_05.jpg" alt="" id="BLOGGER_PHOTO_ID_5220341688433634290" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;I smell victory close at hand...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This implied the texture needed to be flipped on one axis, so I changed the order the data was input into the bitmap, and lo and behold I had this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SHJhkpD3O1I/AAAAAAAAADc/MyffuZCFOH8/s1600-h/lightmap_06.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SHJhkpD3O1I/AAAAAAAAADc/MyffuZCFOH8/s400/lightmap_06.jpg" alt="" id="BLOGGER_PHOTO_ID_5220342200201067346" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Victory is mine!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Although its close to a correct solution, it's easy to see there are a number of artefacts present in the lightmap, such as the lit borders and holes in corners. All of the problems become much more visible viewing the lightmap in isolation:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SHJiCyO2I6I/AAAAAAAAADk/nmBEmmqMBDM/s1600-h/lightmap_07.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SHJiCyO2I6I/AAAAAAAAADk/nmBEmmqMBDM/s400/lightmap_07.jpg" alt="" id="BLOGGER_PHOTO_ID_5220342718059127714" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Oh god damnit&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Higher resolution lightmaps such as 64x64 mitigate the problem, but cut deeply into the framerate. I'm still considering how I can overcome this problem, but I discovered a number of documents and papers on the subject of lightmaps, so I'll be taking a read of those and hopefully gain a bearing.&lt;br /&gt;&lt;br /&gt;I needed to implement a basic light management system in order to support all of this process, and it has lead to some rather nice results for the lighting overall in the demo. The main improvement is the addition of attenuation constants for each lightsource which coincide with those used to calculate the lightmap, leading to nice consistent lighting:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SHJjR5AyZaI/AAAAAAAAADs/O-twnpYvxzc/s1600-h/lightmap_08.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SHJjR5AyZaI/AAAAAAAAADs/O-twnpYvxzc/s400/lightmap_08.jpg" alt="" id="BLOGGER_PHOTO_ID_5220344077088875938" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Yes, the trees are still around&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And now for something that isn't to do with Synergy engine! I was talking to &lt;a href="http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&amp;amp;friendid=286128916"&gt;Nick&lt;/a&gt; online and he suggested we have a go at doing some &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;sketching&lt;/span&gt; together using opencanvas. I've had my head so deeply in coding territory the last few days that it was a little difficult jumping back into drawing mode, but after roughly 15-20 minutes I had this horrible looking sketch of a person that resembles a damn &lt;span style="font-style: italic;"&gt;night elf&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SHJkZu29G6I/AAAAAAAAAD0/Hdzpc_NhWlM/s1600-h/omg_ne.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SHJkZu29G6I/AAAAAAAAAD0/Hdzpc_NhWlM/s400/omg_ne.jpg" alt="" id="BLOGGER_PHOTO_ID_5220345311313861538" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Mr Cumbersome&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;It's ok in some respects, very mediocre in others. Working with the construction was extremely cumbersome, and has highlighted the fact that I need to engage in more studies and revision of facial construction and anatomy theory. Still it was a good process to work through, and having Nick on hand to point out issues as they manifested was a new and interesting experience. We've agreed to spot each other's work (presumably studies) from now on, which I'm looking forward to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-2123094274657494080?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/2123094274657494080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=2123094274657494080' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/2123094274657494080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/2123094274657494080'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/07/let-there-be-lightmaps.html' title='Let There Be Lightmaps'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dxv79sBchMg/SHJgA47binI/AAAAAAAAADE/iIoKntSrBMo/s72-c/lightmap_00.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-4831700619784866704</id><published>2008-07-05T02:00:00.005+10:00</published><updated>2008-07-05T02:13:37.873+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><title type='text'>Bits and Pieces 2</title><content type='html'>More relatively unremarkable tasks undertaken for &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt; today. Most of it is restructuring of code, generalising demo code into specific classes. This results in a fleshing out of the mesh/model class family, including the 2 new classes SynStaticModel and SynDynamicModel.&lt;br /&gt;&lt;br /&gt;I've also added some code in SynMesh in preparation for implementing dynamic light map functionality in meshes' rendering and an animation skeleton data member for loading in animation information from 3DS files.&lt;br /&gt;&lt;br /&gt;I also created the almighty SynEntity class, of which many other classes are derived. It's just a position and orientation in space with some wrapper functions for doing rotations easily, but that's something that's used over and over and it has tidied up the code considerably.&lt;br /&gt;&lt;br /&gt;I also generalised texture loading functionality into 2 functions in the GfxCore class. This has made setting up textures a breeze.&lt;br /&gt;&lt;br /&gt;That's about it, I suppose. I'm eager to begin implementing light maps as soon as possible. Hopefully tomorrow night.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-4831700619784866704?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/4831700619784866704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=4831700619784866704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4831700619784866704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4831700619784866704'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/07/bits-and-pieces-2.html' title='Bits and Pieces 2'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-6511666523192173257</id><published>2008-07-04T01:43:00.009+10:00</published><updated>2008-11-13T16:07:01.375+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [3DS loading]'/><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm [Welding]'/><title type='text'>Bits and Pieces</title><content type='html'>I've been sucked into Diablo 2 and other distractions lately (damn you, Blizzard), so progress has been meagre. However, I was determined today to continue progress on &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;. I have been deliberating over integrating a physics engine into the code, and the task is daunting.&lt;br /&gt;&lt;br /&gt;I've decided to make the task as easy as possible by setting up everything the physics tests will eventually need and fleshing out the 3DS loading more. This entailed implementing some functionality that supports &lt;span style="font-style: italic;"&gt;environments&lt;/span&gt;. There's alot of different features that fall under this umbrella, including lightmaps, materials, entity spawning, and many others.&lt;br /&gt;&lt;br /&gt;I decided decent ground work for a number of these things was beginning work on extracting material information from the 3DS files. This task proved to be another work in cryptography, as only relatively vague information is at my disposal regarding the file format.&lt;br /&gt;&lt;br /&gt;However, after a number of hours stumbling around in the dark, I was successful: the engine loaded in a model of a simple room that had separate materials for the walls and floor. I decided to manipulate the number in the demo code somewhat to make sure all the objects sit within this new room, in preparation for implementing the physics/collision detection. Here's how it all shaped up:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SGz17ZlYj-I/AAAAAAAAAC8/Z31s52PGOck/s1600-h/test_room.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SGz17ZlYj-I/AAAAAAAAAC8/Z31s52PGOck/s400/test_room.jpg" alt="" id="BLOGGER_PHOTO_ID_5218816469044334562" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Almost starting to look like a game?!&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;There's a lot more material information in the 3DS file I can potentially tap into, but it is not relevant at this stage in the engine. Next I will be focusing on loading in lights from 3DS files, and maybe, just &lt;span style="font-style: italic;"&gt;maybe&lt;/span&gt; take a look at calculating light maps.&lt;span style="font-style: italic;"&gt;..&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;I've also devised a&lt;/span&gt;&lt;span&gt;n algorithm for welding points within a certain distance threshold of each other. Big deal, right? Well as far as my searching on google went, the approach appears to be brute-force O(n^2) algorithms, from what I could find (excerpt &lt;/span&gt;&lt;span&gt;from game programming book). My approach was very simple; apply a 3-dimensional closest-pair algorithm to the vertices, with one modification: when the algorithm reaches an input of only 2 vertices, test if their distance is below the given threshold, if it is, weld them and return infinity for the distance.&lt;br /&gt;&lt;br /&gt;This should in effect weld all vertices within the threshold in O(n log n) time, but I have yet to implement it and test its correctness.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-6511666523192173257?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/6511666523192173257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=6511666523192173257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/6511666523192173257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/6511666523192173257'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/07/bits-and-pieces.html' title='Bits and Pieces'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dxv79sBchMg/SGz17ZlYj-I/AAAAAAAAAC8/Z31s52PGOck/s72-c/test_room.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-7808979068539104564</id><published>2008-06-27T02:25:00.009+10:00</published><updated>2008-07-08T05:00:02.150+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm [Smoothing Group]'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [3DS loading]'/><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm [Welding]'/><title type='text'>Final Battle!</title><content type='html'>Exams are done and dusted! It's similarly epic to defeating the final boss in a game. So far I have gotten back my mark for  Software Engineering; ~80%, so a D. Quite chuffed. So, besides basking in many games of Team Fortress 2, I've been noodling around ideas for what I should focus on next with &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I did some light research into physics engine libraries that are out there, and the selection is &lt;span style="font-style: italic;"&gt;extensive&lt;/span&gt;. I was impressed. At this point the prime candidate looks to be &lt;a href="http://www.bulletphysics.com/Bullet/wordpress/"&gt;Bullet&lt;/a&gt;. Failing that, perhaps &lt;a href="http://www.ode.org/"&gt;ODE&lt;/a&gt;. I made an attempt to compile some of the many MSVC++6 projects that come with Bullet's SDK, some worked, some didn't. There's no binary currently in existence for the library, so I don't know exactly how to proceed. Investigate the forums, I suppose...&lt;br /&gt;&lt;br /&gt;I decided to leave that kind of expedition to a later date, primarily because I had a headache and just didn't feel like I had the energy for it. Instead I decided to perform some optimisation on the 3DS loader function, which is still employing the crutch of the brute force algorithm to calculate smoothed normals, resulting in something close to 5 minutes stall to load in a 50000 polygon, single smooth group (worst case problem) model.&lt;br /&gt;&lt;br /&gt;After chewing over the problem for a little while, I sketched out a rough algorithm that would run in O(fv) time, where f = number of faces and v = number of vertices. After implementing it, I found the algorithm `almost' works. Satisfyingly, however, it took about &lt;span style="font-style: italic;"&gt;2 seconds&lt;/span&gt; to load in that same 50000 poly model! A very significant speed increase. Conceptually, what the algorithm `should' be doing is exactly the same as the brute force algorithm, but somewhere in the implementation there is a deviation which I have yet to isolate.&lt;br /&gt;&lt;br /&gt;I thought the incorrectness may have stemmed from the fact that 3DS files export duplicate vertices for the same coordinate in space. To remove this potential threat to the algorithm, I set about implementing a welding algorithm that would merge duplicate vertices into the one vertex list entry, thus compressing the total number of vertices in the mesh.&lt;br /&gt;&lt;br /&gt;This algorithm posed some very interesting challenges. The root challenge is that it could not be less efficient than the proposed smoothing algorithm (O(fv)). From this root challenge spawns many other challenges as a result. The algorithm I sketched out is quite straight-forward, but the implementation proved to be a little trickier. The main issue was `how do you compare vertices?'&lt;br /&gt;&lt;br /&gt;I divined the answer to this question whilst going to the toilet (details, details...). Essentially the order you compare the components of a vertex depends upon the order you sort them in, which seems obvious upon reflection. With a newly crafted comparison function, I had myself a &lt;a href="http://pastebin.com/f230dcd71"&gt;linear-time welding function&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However, this welding function did not fix the smoothing algorithm. I've decided to leave further debugging until I've had a night's sleep, nevertheless progress is promising!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;EDIT (14:14, 27/06/2008):&lt;/span&gt; The algorithm is working! I was missing a test for the final pass on indices to assign new normal values...I wasn't testing if the face was part of the smoothing group! How obvious. Amazing what some sleep can do. The code for the linear-time normal smoothing is pretty decent.&lt;br /&gt;&lt;br /&gt;I've also had a look back over the mesh rendering function, and split the function depending on which shade model is enabled, meaning that rendering in Flat mode will use the face normal, rather than the normal of the first index in the face, which gives incorrect results.&lt;br /&gt;&lt;br /&gt;I'm very happy that I managed this speed increase! Now I can consider physics integration with a clear state of mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-7808979068539104564?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/7808979068539104564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=7808979068539104564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/7808979068539104564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/7808979068539104564'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/06/final-battle.html' title='Final Battle!'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-3009953337013807248</id><published>2008-06-18T17:42:00.002+10:00</published><updated>2008-11-13T16:07:01.591+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding [Texture Mapping]'/><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [3DS loading]'/><title type='text'>Give Me Some Skin!</title><content type='html'>After suffering an 08:30 exam and the apocalyptic effects it has on my sleeping patterns, I felt I might loosen the screws in my mind by taking another look at implementing texture mapping in &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;My suspicions lay in the library I was using to load texture data into OpenGL. To test this, I downloaded and integrated &lt;a href="http://lonesock.net/soil.html"&gt;SOIL&lt;/a&gt;. So it seemed I could load in textures, but they were not mapped at all to the meshes.&lt;br /&gt;&lt;br /&gt;Which made me realise I had left the texture mapping aspect of the SynMesh class, well, hanging. So going back over that was a simple affair, though I had to make an educated guess as to how the .3DS file's texture mapping data is actually organised in respect to polygons. It is, of course, the obvious answer, which is for each vertex in the vertex list, the texture vertex at the same relative position in the texture vertex list is that vertex's texture coordinate.&lt;br /&gt;&lt;br /&gt;A little tweaking of &lt;span style="font-family:courier new;"&gt;SynMesh.render()&lt;/span&gt;, and various other spots in the demo code, and I was in business:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SFkczipjBMI/AAAAAAAAACs/EPG16_AWE9g/s1600-h/texturing_unlit.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SFkczipjBMI/AAAAAAAAACs/EPG16_AWE9g/s400/texturing_unlit.jpg" alt="" id="BLOGGER_PHOTO_ID_5213229715458032834" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Bless my flesh!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Note, the skin for the tree actually isn't finished. So that's a data thing, not a processing error. Very satisfying, after the endless battle with AllegroGL just to do basic texture mapping. Tsk tsk. Here's a lit screenshot, just for fun:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SFkeNwBir3I/AAAAAAAAAC0/B4CfUMV_Asc/s1600-h/texturing_lit.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SFkeNwBir3I/AAAAAAAAAC0/B4CfUMV_Asc/s400/texturing_lit.jpg" alt="" id="BLOGGER_PHOTO_ID_5213231265236561778" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Trees of Bliss&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-3009953337013807248?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/3009953337013807248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=3009953337013807248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/3009953337013807248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/3009953337013807248'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/06/give-me-some-skin.html' title='Give Me Some Skin!'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SFkczipjBMI/AAAAAAAAACs/EPG16_AWE9g/s72-c/texturing_unlit.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-3682471884044794824</id><published>2008-06-15T20:00:00.002+10:00</published><updated>2008-11-13T16:07:02.436+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm [Smoothing Group]'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [3DS loading]'/><title type='text'>Criminally Smooth</title><content type='html'>:). I am pleased. It was a long, hard battle, with much contemplation, testing, probing and trial and error, but &lt;span style="font-style: italic; font-weight: bold; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt; now sports Smoothing Group functionality!&lt;br /&gt;&lt;br /&gt;Loading in the smoothing group info was a small mission in itself, one which began with trying to find &lt;a href="http://www.martinreddy.net/gfx/3d/3DS.spec"&gt;info on how to get it out of a .3DS file&lt;/a&gt;. Implementing this actually spurred a revolution in my coding for being very specific about my longs (`32 or 64 bit?'), which seems to have somehow increased the frame rate of Synergy's various demos by up to 6Hz?!&lt;br /&gt;&lt;br /&gt;Building upon the code from &lt;a href="http://www.spacesimulator.net/tut4_3dsloader.html"&gt;that tutorial I linked to&lt;/a&gt; in the previous post, the &lt;a href="http://pastebin.com/f26cd01a9"&gt;code for reading smoothing groups&lt;/a&gt; is about as simple as it gets.&lt;br /&gt;&lt;br /&gt;I pondered for most of the day on how the process would actually work, sewing threads of ideas through the problem in my head, considering different approaches. What I finally ended up with was a &lt;a href="http://pastebin.com/f16b2dec0"&gt;brute-force algorithm with slight optimisations&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The road to reach this code was treacherous, though, with some interesting results along the way:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SFVF98Qik7I/AAAAAAAAAB8/DDGAvEfsLvA/s1600-h/backInThe60s.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SFVF98Qik7I/AAAAAAAAAB8/DDGAvEfsLvA/s400/backInThe60s.jpg" alt="" id="BLOGGER_PHOTO_ID_5212149074201056178" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;A World With 1 Normal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;This problem was isolated and corrected relatively quickly, basically I didn't have the indices' blank normals initialised to be blank normals. So fixing that brought me to this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SFVGdFEmYSI/AAAAAAAAACE/ixgA1vfJPrc/s1600-h/smoothing_00.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SFVGdFEmYSI/AAAAAAAAACE/ixgA1vfJPrc/s400/smoothing_00.jpg" alt="" id="BLOGGER_PHOTO_ID_5212149609142837538" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Revenge Of The Cubes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Great. So some things looking lovely, others looking completely screwed. This proved to be part of a bigger problem, it also created seams:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SFVHQPGoEeI/AAAAAAAAACM/rcBs-JNL3jE/s1600-h/smoothing_01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SFVHQPGoEeI/AAAAAAAAACM/rcBs-JNL3jE/s400/smoothing_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5212150488009019874" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Almost Anatomically Correct!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;And generally just lead to strange lighting behaviour on flat surfaces:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SFVHobFdZqI/AAAAAAAAACU/Kx85s6b5XUw/s1600-h/smoothing_02.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SFVHobFdZqI/AAAAAAAAACU/Kx85s6b5XUw/s400/smoothing_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5212150903542212258" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Colt 1911s Never Looked So... Jaded&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Although for the most part that Colt 1911 model (made by &lt;a href="http://www.facebook.com/profile.php?id=628483412"&gt;Dylan&lt;/a&gt;) looks very very sexy, one can quickly pick out areas which are rendered incorrectly.&lt;br /&gt;&lt;br /&gt;I found the problem to be that the first index in a smoothing group wasn't included in part of the normal calculation! So, fixing that Synergy could now do the Colts justice:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SFVIiUSt4SI/AAAAAAAAACc/9REiveHhf88/s1600-h/smoothing_fixed.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SFVIiUSt4SI/AAAAAAAAACc/9REiveHhf88/s400/smoothing_fixed.jpg" alt="" id="BLOGGER_PHOTO_ID_5212151898151182626" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Quantum Sexiness&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Not to mention the skulls!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SFVJCVUlOFI/AAAAAAAAACk/m_m2q9pMak8/s1600-h/smoothing_skulls.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SFVJCVUlOFI/AAAAAAAAACk/m_m2q9pMak8/s400/smoothing_skulls.jpg" alt="" id="BLOGGER_PHOTO_ID_5212152448183253074" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;Mission: Accomplished&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;So, what's next? Study! It's time to stop getting sucked into my projects and turn my attention towards trying to get HDs for my end of semester exams. So, until next week I guess Synergy will have to wait.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-3682471884044794824?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/3682471884044794824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=3682471884044794824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/3682471884044794824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/3682471884044794824'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/06/criminally-smooth.html' title='Criminally Smooth'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SFVF98Qik7I/AAAAAAAAAB8/DDGAvEfsLvA/s72-c/backInThe60s.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-3188569201638603859</id><published>2008-06-14T19:30:00.001+10:00</published><updated>2008-11-13T16:07:03.870+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding [3DS loading]'/><title type='text'>Meshin' Accomplished</title><content type='html'>Yeah I know, I'm the lamest person on Earth for using that title. But I don't care, I've succeeded too much today to feel anything but empirically chuffed. Despite cleaning up baby vomit at my Day Job, my time was devoted wholly to &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;After working on the SynMesh and SynModel classes last night, I was keen to get a function running that could load in mesh data from some 3D model file format. After some research I eliminated the majority of options, including all formats without bone/keyframe animation, and all formats which aren't widely accessible. That is, not supported by a wide range of modelling programs. That left me with 3D Studio Max's .3DS format. Big surprise there.&lt;br /&gt;&lt;br /&gt;Like all great things my quest for this functionality began with a google search, which lead me to a &lt;a href="http://www.spacesimulator.net/tut4_3dsloader.html"&gt;very useful tutorial&lt;/a&gt;. After some copying, pasting, and butchering of this code into a form suitable for my code, I began to, with breath guarded, integrate it into the &lt;span style="font-style: italic;"&gt;cubetopia&lt;/span&gt; demo, replacing my hand-coded geometry information with SynMeshes loaded from a .3DS geosphere.&lt;br /&gt;&lt;br /&gt;Some small tweaks here and there and BAM! Meshes loaded:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SFPpbMFDXhI/AAAAAAAAABE/O4vwn6CBLWo/s1600-h/trippin_balls.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SFPpbMFDXhI/AAAAAAAAABE/O4vwn6CBLWo/s400/trippin_balls.jpg" alt="" id="BLOGGER_PHOTO_ID_5211765847105953298" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Trippin' Balls&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;I suppose it can't really be called `cubetopia' anymore. Perhaps &lt;span style="font-style: italic;"&gt;gala&lt;/span&gt; would be more fitting. A number of issues were outstanding at this point. The foremost was that there were no normals! So I set about calculating normals upon loading each face. That lead to some interesting mistakes:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dxv79sBchMg/SFPqngAXoFI/AAAAAAAAABM/u53A2ENlqeA/s1600-h/celled.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dxv79sBchMg/SFPqngAXoFI/AAAAAAAAABM/u53A2ENlqeA/s400/celled.jpg" alt="" id="BLOGGER_PHOTO_ID_5211767158125076562" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Really Trippin' Balls&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;After becoming friendlier with the concept of vector normalisation, I got this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SFPrRqIYJ2I/AAAAAAAAABU/07Gt-Ne8Bas/s1600-h/magic_light.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SFPrRqIYJ2I/AAAAAAAAABU/07Gt-Ne8Bas/s400/magic_light.jpg" alt="" id="BLOGGER_PHOTO_ID_5211767882397525858" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Find the Lightsource&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;After loading in a cube mesh, I discovered the reason for this bizarre lighting was that the meshes were inside out! So, setting &lt;span style="font-family:courier new;"&gt;glFrontFace(GL_CCW)&lt;/span&gt; I finally achieved a well rounded result:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SFPsqYErYII/AAAAAAAAABc/npHzhvbYE_k/s1600-h/trippin_balls_done.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SFPsqYErYII/AAAAAAAAABc/npHzhvbYE_k/s400/trippin_balls_done.jpg" alt="" id="BLOGGER_PHOTO_ID_5211769406558527618" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Lo! 'Tis a Gala Night&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Feeling very satisfied with myself, I was eager to push the code and see just how far I'd actually gotten it to work. Next was a model of a tree that I was working on once upon a time, and to my delight it worked straight away, giving a pretty funky result:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SFPuVFSoDJI/AAAAAAAAABk/nH5nYqONfvQ/s1600-h/styx.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SFPuVFSoDJI/AAAAAAAAABk/nH5nYqONfvQ/s400/styx.jpg" alt="" id="BLOGGER_PHOTO_ID_5211771239762758802" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Styx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;I began to notice a significant delay in loading the 3DS file, so I decided to see how much this delay scaled with input size. I needed a high poly model... and then I remembered a skull I was sculpting in zbrush once upon a time. This lead to a huge delay of almost 2 minutes to load the file. It was obvious where the hangup was: the obscene amount of debug info I was printing to the console and the log file. I commented those out and the delay was vanquished, which lead me to the final product for the evening:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SFPvN3HHoFI/AAAAAAAAABs/E4rqahac5SE/s1600-h/hi_poly_flat_shading.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SFPvN3HHoFI/AAAAAAAAABs/E4rqahac5SE/s400/hi_poly_flat_shading.jpg" alt="" id="BLOGGER_PHOTO_ID_5211772215208943698" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Synergy's High Poly Flat Shading v0.00001&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;Each skull is ~50k polygons, so theres 400k polys being rendered there. It is both a milestone and a map of the steps yet to take. The most obvious next step is to implement Smoothing Groups. For instance, here is the exact same model rendered in Max with smoothing groups on:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SFPwHEYfayI/AAAAAAAAAB0/aJ6LckhQrc0/s1600-h/smoothed.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SFPwHEYfayI/AAAAAAAAAB0/aJ6LckhQrc0/s400/smoothed.jpg" alt="" id="BLOGGER_PHOTO_ID_5211773198024010530" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;The Next Mission&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Big difference. So that's about it; excellent progress for 5 hours work, in my opinion. I hope to make the same leaps and bounds tomorrow, but we'll see...&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-3188569201638603859?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/3188569201638603859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=3188569201638603859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/3188569201638603859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/3188569201638603859'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/06/meshin-accomplished.html' title='Meshin&apos; Accomplished'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SFPpbMFDXhI/AAAAAAAAABE/O4vwn6CBLWo/s72-c/trippin_balls.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-2831782120432521193</id><published>2008-06-14T01:24:00.002+10:00</published><updated>2008-11-13T16:07:03.986+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm [Normal-Map Sprite]'/><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='Zanath'/><category scheme='http://www.blogger.com/atom/ns#' term='Galileo Complex'/><title type='text'>Chilled</title><content type='html'>Working spasmodically over the last couple of days. Felt like I needed to back off a little bit, since my mind was beginning to race constantly, and it was affecting my sleeping patterns, which in turn affected my productivity. So work performed must be measured to ensure optimal output.&lt;br /&gt;&lt;br /&gt;Chilled out now though, thanks to good old &lt;a href="http://en.wikipedia.org/wiki/Elliott_smith"&gt;Elliott&lt;/a&gt;. The relaxed mind state has assisted in persistence and patience in moments of slow progress, such as being unable to crack the nut of OpenGL texture mapping for &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Synergy&lt;/span&gt;. I've gone over every line of code a number of times, and can find no deviation from the example code I have been observing, yet my code does not work.&lt;br /&gt;&lt;br /&gt;My only conclusion is that it is some combination of operations I am doing, which on the their own are valid, but in sequence lead to failure of texture mapping. I believe it has something to do with the way I have set up materials in combination with the parameters I have provided AllegroGL to load the bitmaps with.&lt;br /&gt;&lt;br /&gt;After spending a couple of hours here and there each day trying to crack it, I set it aside and turned my time towards more fruitful endeavours: models and animation. Progress has been going well with these, and I have the SynMesh and SynModel classes laid out, with a little bit of body to them. I'll be sinking my teeth into the gut of them sometime soon. I have a very clear idea in my head of how the entire Skeletal Animation Method works; a depth-first traversed tree of matrices which are pushed onto a matrix stack similar to OpenGL's method of rendering.&lt;br /&gt;I've also been talking with &lt;a href="http://www.facebook.com/profile.php?id=628483412"&gt;Dylan&lt;/a&gt; about a test bed for Synergy. That is, a game built with it to test and showcase its features. Those are key goals for the game, but we will certainly not ignore the most important goal: to make an insanely fun, insanely cool game we (and others) can play.&lt;br /&gt;&lt;br /&gt;The concept we decided on was made unanimously, silent and in parallel with each other. We basically said at the same time `It should be &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Galileo Complex&lt;/span&gt;!'&lt;br /&gt;&lt;br /&gt;`What's that?' you ask. Well how do I not mutate this into a huge story... basically it's a game concept we came up with a couple of years ago, that we never really had the resources and faculties to do at the time, but was always going to be a cool idea. It's a top-down action game that is a blend between death match and RTS. You control a commander who leads a group of AI-controlled players, and you must complete objectives in order to progress through the current level you are on. Objectives change depending on what other commanders have done, and matches can be a back-and-forth tug of war over areas of the level and its various objectives and resources.&lt;br /&gt;&lt;br /&gt;I won't really go into more detail, but that's the core of it. We are inspired by the elegance of Quake's Deathmatch (Quake 1 that is), and Total Annihilation's RTS combat and interface. So our feature list pools alot of things we observe these games exhibiting; a key one being the game should be extendible. That is, people should be able to mod is easily and in a fun way. There's lots of exciting ideas we have, and I'm itching to get the Synergy Engine up to a point where we can start actually sinking our teeth into this thing.&lt;br /&gt;&lt;br /&gt;Originally I thought the game could be an orthographic, fixed camera angle viewport. That is, essentially a 2D game. We're thinking of going with perspective rendering now, but an interesting design idea I had for the 2D thing was character-sprites that had Normal Maps, thus allowing for real-time lighting to be calculated for them, giving them a very 3D appearance without having to rasterise polygons.&lt;br /&gt;&lt;br /&gt;While waiting for my tea to brew, I paced the living room and devised &lt;a href="http://pastebin.com/f7d485079"&gt;a rough algorithm&lt;/a&gt; for calculating the normal-mapped sprite from a 3D model.&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I haven't really checked it for correctness or efficiency (should be roughly O(xy)), but it feels pretty solid. Despite the fact we're probably going with perspective projection for Galileo, I'll still implement this feature in Synergy. We'll probably end up using it in a number of places in the game anyway; it's too cool not to fiddle around with.&lt;br /&gt;&lt;br /&gt;Now, on to &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 51, 204);"&gt;Zanath&lt;/span&gt;. Figured out some exciting things regarding terrain creation for this. It came about when I finally got around to exporting the terrain model I've been working on to Ogre3D's .SCENE format. Basically, when you export, you get a bunch of easily-editable text files that you can do alot of tweaking with. After checking out some stuff in various forums, I believe I can get texture-splatting happening for Zanath!&lt;br /&gt;&lt;br /&gt;This has got me excited, since it means best performance, great detail and easy asset creation/editting. I still need to do alot of experimenting and such to figure out &lt;span style="font-style: italic;"&gt;exactly&lt;/span&gt; how to do it, but I feel confident that it is entirely within reach.&lt;br /&gt;&lt;br /&gt;Until I &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; actually figure it out, I have to export things using megatexture-like methods. But the result is pleasingly accurate:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dxv79sBchMg/SFKZ3Y07-uI/AAAAAAAAAA8/ZBlV6TUvdjc/s1600-h/testValeAsScene.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dxv79sBchMg/SFKZ3Y07-uI/AAAAAAAAAA8/ZBlV6TUvdjc/s400/testValeAsScene.jpg" alt="" id="BLOGGER_PHOTO_ID_5211396895657425634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;That's about it I guess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-2831782120432521193?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/2831782120432521193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=2831782120432521193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/2831782120432521193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/2831782120432521193'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/06/chilled.html' title='Chilled'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dxv79sBchMg/SFKZ3Y07-uI/AAAAAAAAAA8/ZBlV6TUvdjc/s72-c/testValeAsScene.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5142808678922459337.post-4786383349569885699</id><published>2008-06-10T20:00:00.000+10:00</published><updated>2008-11-13T16:07:04.393+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synergy'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='Zanath'/><category scheme='http://www.blogger.com/atom/ns#' term='edits'/><category scheme='http://www.blogger.com/atom/ns#' term='Ultragraph'/><title type='text'>Kickoff</title><content type='html'>Here we are. This is my blog. This is where I write particular thoughts associated with moments in time, thus logging things I think and do.&lt;br /&gt;&lt;br /&gt;But that's obvious. Sorry; writing as I think. *Ahem*&lt;br /&gt;&lt;br /&gt;Let's be specific. This is a place where I log things I am developing/working on. That is, projects of mine. What sort of projects do I work on? Well, there's many sorts, actually. I'm either a renaissance man, or a jack of all trades; further data is necessary to decide just how pretentious I sound right about now.&lt;br /&gt;&lt;br /&gt;Music, coding, illustration, 3d modelling, writing, designing. That's the basic summary. These are primarily geared towards the overall domain of `computer game development', but not necessarily.&lt;br /&gt;&lt;br /&gt;Well, that's the Cliff's Notes, let's cease the blathering and begin the blog in earnest. I will begin by outlining the primary collection of my current projects:&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Synergy Engine&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a game engine I have been coding in C++ using the &lt;a href="http://alleg.sourceforge.net/"&gt;Allegro&lt;/a&gt;, &lt;a href="http://allegrogl.sourceforge.net/"&gt;AllegroGL&lt;/a&gt; (weaning off of this) and OpenGL libraries. It's very much in its infant stages currently. I called it the Synergy Engine primarily because that is how it began; simply a combination of many different fragments of code and classes that I had previously written, formed into a working system. Thus, the engine was devised under the concept of attaining a `power' that was more than the sum of its pieces, but rather from the synergy of their cooperation.&lt;br /&gt;&lt;br /&gt;It originally was scoped to be primarily 2D in its functionality, but curiosity and to a lesser extent boredom bested me, and I began to focus principally on 3D rendering. So far it has been very fun, satisfying, educational and fruitful. What I have currently is 1024 lit cubes floating around in space at 40Hz, mouse-look and WASD controls for transforming the camera, console commands for controlling variables, error logging and some basic resource caching. Should be cross-platform compatible (though I definitely wouldn't stake my life on that). Not bad for someone who only vaguely knew the rendering pipeline conceptually before commencing the project.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Ultragraph&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Fantastic&lt;/span&gt; name, I know. How do I begin describing this project without sounding like the hugest nerd in the world. Wait, we crossed that threshold long before now, so I'll just go all-out:&lt;br /&gt;&lt;br /&gt;Ultragraph is a program that allows a user to model mathematical graphs in 3D, assigning custom data to vertices and edges, and performing a number of queries and operations on graphs such as topological sorting, traversing, spanning tree, circuit finding, path finding, travelling sales person, etc. I want to add a number of other tools, such as support for layers, hiding/showing of groups of vertices and operation/state history. I'm sure there's things I've left out.&lt;br /&gt;&lt;br /&gt;The main purpose of the program is to allow for something I call Knowledge Management. Basically, we can use graphs with state histories and layers to model the `knowledge' of some entity, such as a character. Vertices contain data which may be as simple as a text string pertaining to some proposition that is held to be true by the entity's knowledge, such as &lt;span style="font-style: italic;"&gt;`&lt;/span&gt;&lt;span style="font-style: italic;"&gt;All men&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt; are mortal&lt;/span&gt;&lt;span style="font-style: italic;"&gt;'&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Edges can represent a lot of different things, but principally I think they are best used for modelling causality between propositions. Perhaps logical dependency (that is if there is an edge (A, B)&lt;a, b=""&gt;, then B depends upon A being true. That is, if A is false, B must also be false. We could also use weighted edges to model probabilistic inferences.&lt;br /&gt;&lt;br /&gt;`Okay,' you might be saying, `WHY would you want that?' Well, turns out, I think it's an extremely useful tool for role playing. Yes, I mean role playing as in sitting at a table with other people, and dice, and character sheets and `The pungent stench of mildew emanates from the wet dungeon walls,' style conversation. Well not exactly. More so the internet forum mutation of role playing; the non-real-time stu&lt;/a,&gt;&lt;a, b=""&gt;ff.&lt;br /&gt;&lt;br /&gt;If you are playing a highly intelligent, analytical character, having a mathematical model of all of their knowledge accumulated over the entire coarse of the role play, that you can query and use for inference, is something which will really cut down how long it takes you to make a post, and it will make your character behaviour a lot cooler, because you'll truly be playing a character that never lets a fact slip (unless you, the player, play that they slipped it).&lt;/a,&gt;&lt;br /&gt;&lt;a, b=""&gt;&lt;br /&gt;So it gives you much more control. Anyway, there's many many other applications for such a program besides role playing; graphs are hugely ap&lt;/a,&gt;&lt;a, b=""&gt;plicable to all sorts of things. Anyway, that's Ultragraph.&lt;br /&gt;&lt;br /&gt;&lt;/a,&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Zanath&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is an 3D Action-RPG in the vein of Zelda:OOT. I know what you're thinking, `RPG = dead project walking'. Well, it's not really my project, I'm just on board for it, so that doesn't really bother me; if it survives, that's great; if it doesn't, I'll live.&lt;br /&gt;&lt;br /&gt;I'm currently doing concept art for environments and modelling some basic terrain for engine testing purposes. As well as dropping my thoughts on game play and story&lt;br /&gt;considerations pretty much every chance I get, which is quite often.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Music Project (Cable Sack, Obscura Child)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Title undecided at this point. Collaboration with my best friend and other associates. We have a solid concept that we are constructing and extrapolating from, and some interesting ideas on possible working process paradigms. Not much more can be said at this point, it's very young.&lt;/li&gt;&lt;/ul&gt;Today was reasonably progressive; I did an &lt;span style="font-weight: bold; font-style: italic;"&gt;Edit&lt;/span&gt; for someone I know from &lt;a href="http://www.pixeljoint.com/"&gt;Pixel Joint&lt;/a&gt;, who's doing a Runescape sig; here's how that shaped up:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SE10MkvwRSI/AAAAAAAAAAc/HMSjsJIV_0I/s1600-h/runescape4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SE10MkvwRSI/AAAAAAAAAAc/HMSjsJIV_0I/s400/runescape4.png" alt="" id="BLOGGER_PHOTO_ID_5209948103308756258" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Original&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SE10vEvwRTI/AAAAAAAAAAk/s7LD-bg6D_Q/s1600-h/runescape4_ed2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SE10vEvwRTI/AAAAAAAAAAk/s7LD-bg6D_Q/s400/runescape4_ed2.png" alt="" id="BLOGGER_PHOTO_ID_5209948696014243122" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Edit&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Turned him into a monster! Satisfying, since I haven't really touched any digital art since the start of the semester (14 weeks ago, and I wasn't exactly in-form even back then, anyway). Felt good to get in on some illustration and actually do something that didn't frustrate me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Zanath&lt;/span&gt; work comprised mainly of trying to figure out how the HELL to make a low-poly tree model that actually looks half decent. It's incredibly frustrating that very little information on this seems to exist on the internet (seriously, is this innate knowledge to our species that I'm just missing?). Here's some renders of where I'm at with it:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SE12xkvwRUI/AAAAAAAAAAs/v8X9ZMzdzXA/s1600-h/terrain_render_09.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dxv79sBchMg/SE12xkvwRUI/AAAAAAAAAAs/v8X9ZMzdzXA/s1600-h/terrain_render_09.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dxv79sBchMg/SE12xkvwRUI/AAAAAAAAAAs/v8X9ZMzdzXA/s400/terrain_render_09.jpg" alt="" id="BLOGGER_PHOTO_ID_5209950937987171650" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Trees of Torment&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Let's ignore that the trees all have the same z-rotation. But you can see how glaring the foliage planes are. The trunks are simple, since I've been pouring my attention into the damned foliage. I feel like I &lt;span style="font-style: italic;"&gt;am&lt;/span&gt; getting closer, though. If I can't break this block soon, I'll set it aside and turn my attention to things I &lt;span style="font-style: italic;"&gt;know&lt;/span&gt; I can do, like rocks, walls, houses, turrets, etc. Basically anything that isn't a plant.&lt;br /&gt;&lt;br /&gt;Also, you can see the glaring need for the terrain to have either a giant texture (megatexture I call it, though it has nothing to do with the id tech, that's just what I call that method), or texture splatting of some kind (multi-channel blending). Shadow decals or light mapping aren't possible, since part of the design spec is the game must have day/night cycles, so that ball is really in the coder's court.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Synergy&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;saw some love! I had a second attempt at moving the geometry definition to Display Lists; no performance change (actually it almost went &lt;span style="font-style: italic;"&gt;down&lt;/span&gt; 1Hz!). However, after I played around with the code execution sequence, moved some things around, simplified, I managed to turn that -1Hz into +10Hz! So I'm sitting on 40Hz now, which is satisfying. Curious what it looks like? Behold the cubes!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dxv79sBchMg/SE14zEvwRVI/AAAAAAAAAA0/J92ix2lt30U/s1600-h/06_10_08_syn3D.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dxv79sBchMg/SE14zEvwRVI/AAAAAAAAAA0/J92ix2lt30U/s400/06_10_08_syn3D.jpg" alt="" id="BLOGGER_PHOTO_ID_5209953162780230994" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Synergy - Cubetopia&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;Read over a lot of material about Shadow Volume methods for calculating real-time shadows. Looks fun! I'll definitely give it a crack after I've ironed out texture mapping and anti-aliasing.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;That's about it... and this took a lot longer to write than I thought it would; it's now nearly 5am. Delightful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5142808678922459337-4786383349569885699?l=deathbydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deathbydev.blogspot.com/feeds/4786383349569885699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5142808678922459337&amp;postID=4786383349569885699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4786383349569885699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5142808678922459337/posts/default/4786383349569885699'/><link rel='alternate' type='text/html' href='http://deathbydev.blogspot.com/2008/06/kickoff.html' title='Kickoff'/><author><name>gastrop0d</name><uri>http://www.blogger.com/profile/18048465903362448446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dxv79sBchMg/SZKLtTvCBJI/AAAAAAAAAGw/sch-ai_u9hA/S220/pix_tcg_portrait_08.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dxv79sBchMg/SE10MkvwRSI/AAAAAAAAAAc/HMSjsJIV_0I/s72-c/runescape4.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
