<?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-7431955836196950934</id><updated>2012-01-29T01:24:45.068-08:00</updated><category term='Stereo 3D'/><category term='Vista'/><category term='Vista64'/><category term='Rift'/><category term='3D'/><category term='World of Warcraft'/><category term='CES'/><category term='Holy Trinity'/><category term='MMORPG'/><category term='DX1 Driver'/><category term='Dragon Age'/><category term='videogames'/><category term='Driver'/><category term='Ergodex'/><category term='NVidia'/><category term='DX1'/><category term='Windows 7'/><title type='text'>PolygonalHell</title><subtitle type='html'>Musing on Software Engineering, Graphics, Games and plain old Programming.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-5251937694636008130</id><published>2011-03-20T13:22:00.000-07:00</published><updated>2011-03-26T12:18:39.723-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='World of Warcraft'/><category scheme='http://www.blogger.com/atom/ns#' term='MMORPG'/><category scheme='http://www.blogger.com/atom/ns#' term='Holy Trinity'/><category scheme='http://www.blogger.com/atom/ns#' term='Rift'/><category scheme='http://www.blogger.com/atom/ns#' term='videogames'/><title type='text'>The holy trinity and MMORPG combat</title><content type='html'>Recently I was discussing the Cataclysm changes in WoW with a friend over lunch, he was complaining about the changes in healing and tanking in the new heroics. That coupled with the lack of tanks and healers available for random groups having drained the fun out of the game for him. In particular he was complaining that the new difficulty had created an environment where Tanks would quit any random group they considered even marginal, because they could instantly join another group.&lt;br /&gt;&lt;br /&gt;One of the things he suggested was removing the Holy Trinity from MMORPG games. For those who don't know  the Holy Trinity is the combination of DPS, Tank and Healer that's become the de-facto design for group based combat in MMORPG's. The first game I can remember using role based groups like this was Everquest (although it wasn't really a trinity at that point). Almost every game since has copied the basic mechanic. WoW did simplify it somewhat reducing it to 3 clear roles, and Blizzard has probably spent more time tailoring content to the pattern than anyone else. Asheron’s Call did eschew the class system all together, but it lead to cookie cutter builds, sure everyone could heal, DPS and take damage, but because there were a certain set of skills that had to be taken in any viable build everyone ended up with the same skills with only minor differences.&lt;br /&gt;&lt;br /&gt;Getting back to my friends point which was that 2 of the 3 roles (Tanking and Healing) were more difficult to play or at least had dramatically more impact when performed poorly and almost everyone preferred to play the 3rd role anyway. Looking at WOW for a minute, even with 3 DPS to 1 Tank/Heal ratios, there still aren't enough Tanks or Healers to meet the demand in random dungeon queues, which tends to support his point.&lt;br /&gt;&lt;br /&gt;It started me thinking, what would group combat without the Trinity look like? I’m fairly certain there are a number of different viable mechanics, but it’s an interesting exercise to try and devise one, at least at a very high level.&lt;br /&gt;&lt;br /&gt;The requirements are relatively straight forwards.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We want to reward coordinated group play.&lt;/li&gt;&lt;li&gt;We don’t want it to become everyman for himself.&lt;/li&gt;&lt;li&gt;We don't want to excessively reward particular class combinations.&lt;/li&gt;&lt;li&gt;The classes still have to feel unique.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;After a some though the basic idea I came up with is that combat becomes about handing off threat between the participants in a battle. In long battles multiple party members get to be "it" (the primary target of the mob). While you're “it”, you have several penalties that prevent you from retaining "it" status.&lt;br /&gt;&lt;br /&gt;Let’s start with a simple system with one class.&lt;br /&gt;Characters have two resources HP’s and Energy. In practice you could just have one, but it’s harder to sell through game “Lore”.&lt;br /&gt;In addition they have 3 dynamic attributes&lt;br /&gt;Threat Generation&lt;br /&gt;DPS&lt;br /&gt;Damage Mitigation&lt;br /&gt;Imagine these attributes as spring systems with dampers.&lt;br /&gt;These 3 attributes are effectively signed values starting in some neutral state (0) trying to return with some force to that state.&lt;br /&gt;&lt;br /&gt;Character skills either directly or indirectly inject impulses or forces (positive or negative) to each of these 3 attributes and there is momentum associated with changes of the values.&lt;br /&gt;The closer the attributes are to the neutral state  the faster health and energy regenerate.&lt;br /&gt;&lt;br /&gt;Depending on the skills a player uses, they can choose to generate extreme DPS or go with extreme damage mitigation, but will run out of energy and in the worst case gain or lose aggro with no energy to change there current focus.&lt;br /&gt;&lt;br /&gt;That’s basically it, players have to coordinate their role changes with others in the party, changes aren’t instantaneous, so it requires a level of skill.&lt;br /&gt;&lt;br /&gt;How do you differentiate classes in such a system? well you’ve got the obvious visual differences, Dodge vs Shield vs Magic etc. You can still use mechanics like the WoW rogue action points or the slight variation that Rift uses for Warriors. In addition if you look at what we are trying to do here it’s have the group manage a shared pool of energy/health throughout an encounter, so there is no reason that you can’t have skills that trade them between players. The 0 point of the attributes and the strength of forces could also be changed per class. I think that gives enough leeway for class uniqueness.&lt;br /&gt;&lt;br /&gt;What about solo PVE? that pretty much amounts to DPS vs Damage Mitigation and the use of counters none of which are precluded by a change in core group mechanics.&lt;br /&gt;&lt;br /&gt;And PVP? This is much harder because there is to way to manage threat with players, but it’s true of pretty much every other MMORPG game anyway, you kill the healers first, then it becomes a game of numbers. At least here the roles aren’t predefined and can change in battle. As to 1 on 1 PVP I think it’s close to impossible to balance a game for it with any substantial class variation.&lt;br /&gt;&lt;br /&gt;There are almost certainly a lot of other core mechanics that could achieve compelling group play without the split by role mechanic. It requires designers to not start with the premise that MMORPG == Holy Trinity. Unfortunately I suspect that’s easier said than done.&lt;br /&gt;&lt;br /&gt;One last thought, possibly the hardest part of all of this would be selling new mechanics to existing MMORPG players, there is a reason most new MMORPG’s follow in the WoW mold, and it’s because wondering too far from it alienates your player base.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-5251937694636008130?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/5251937694636008130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=5251937694636008130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/5251937694636008130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/5251937694636008130'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2011/03/holy-trinity-and-mmorpg-combat.html' title='The holy trinity and MMORPG combat'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-8442587333120652971</id><published>2010-01-18T10:44:00.000-08:00</published><updated>2010-01-18T11:06:50.004-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stereo 3D'/><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='NVidia'/><category scheme='http://www.blogger.com/atom/ns#' term='CES'/><title type='text'>3D- as in Stereo</title><content type='html'>I've been somewhat facinated with Stereo images for a long time, I owned one of the very first vomit inducing entertainment oriented VR headsets. Although I'll admit I didn't pay the $1000's the manufacturer originally asked for it.&lt;br /&gt;&lt;br /&gt;With the sudden resurgence of 3D at CES, I started looking at NVidia's shutter glasses solution. NVidia came in and demo'd an early prototype of the Viewsonic monitor while I was working on Spore. I can go buy a 22 inch 120Hz Viewsonic monitor with the glasses for about $400, which doesn't seem unreasonable. I can buy the monitor alone for about $250 which is competitive with other 2 inch monitors. Then I looked at the price of a second set of glasses (just the glasses not the transmitter), $150 for an additional pair of shutter glasses seems obscene to me.&lt;br /&gt;&lt;br /&gt;With HDMI 1.4 and the sudden popularity of 3D at CES, I suspect it won't be long before most panels are 120Hz and support input signals at that rate, so the cost of entry is going to be the cost of the N-Vision kit, NVidia needs to get the price down.&lt;br /&gt;&lt;br /&gt;I'm a big fan of surround gaming, it really does add a lot more to games than you might first expect. I use a Matrox Tripple Head To Go (I wouldn't recomend it), and I've been considering "upgrading" (not sure it would actually be faster) to an ATI 5850 GPU hoping that eyefinity" resolves some of the setup pain. I must admit I'm intrigued by the 3D surround Demo NVidia did at CES, but I already own 3 24 inch monitors that I use for surround gaming, and the concept of replacing them with 3 new 22inch monitors and adding a second $300 video card is a little excessive even for me.&lt;br /&gt;&lt;br /&gt;Stereo 3D really doesn't add much for the "hardcore" gamer, yes it's more immersive, but it usually makes it harder to play, and performance is reduced by Half because of the 2x rendering. So is it aimed at the less hard core player, if it is the cost of entry needs to drop, probably to less that $100.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-8442587333120652971?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/8442587333120652971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=8442587333120652971' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/8442587333120652971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/8442587333120652971'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2010/01/3d-as-in-stereo.html' title='3D- as in Stereo'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-3098721671184435665</id><published>2009-11-26T13:50:00.000-08:00</published><updated>2009-11-26T14:01:07.160-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ergodex'/><category scheme='http://www.blogger.com/atom/ns#' term='Driver'/><category scheme='http://www.blogger.com/atom/ns#' term='DX1'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='Dragon Age'/><category scheme='http://www.blogger.com/atom/ns#' term='DX1 Driver'/><title type='text'>DX1 App Update - Macros should now work in more games</title><content type='html'>&lt;a href="http://www.polygonhell.com/DX1Release3264Bit.zip"&gt;Download DX1 App&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've added support to use ScanCodes instead of VKey codes in macros. Macros that use ScanCodes will work in a wider variety of games. I've tested both timed and multikey macros in Dragon Age Origins where VKey macros do not work ScanCode macros do.&lt;br /&gt;&lt;br /&gt;All your old macros should still work fine, you'll have to manually convert them to ScanCode macros if you want them to work in games that use DirectInput. By default all new macros are ScanCode macros.&lt;br /&gt;&lt;br /&gt;This is a list of ScanCodes for most of the basic stuff - you'll need to convert them to decimal.&lt;br /&gt;&lt;br /&gt;#define DIK_ESCAPE          0x01&lt;br /&gt;#define DIK_1               0x02&lt;br /&gt;#define DIK_2               0x03&lt;br /&gt;#define DIK_3               0x04&lt;br /&gt;#define DIK_4               0x05&lt;br /&gt;#define DIK_5               0x06&lt;br /&gt;#define DIK_6               0x07&lt;br /&gt;#define DIK_7               0x08&lt;br /&gt;#define DIK_8               0x09&lt;br /&gt;#define DIK_9               0x0A&lt;br /&gt;#define DIK_0               0x0B&lt;br /&gt;#define DIK_MINUS           0x0C    /* - on main keyboard */&lt;br /&gt;#define DIK_EQUALS          0x0D&lt;br /&gt;#define DIK_BACK            0x0E    /* backspace */&lt;br /&gt;#define DIK_TAB             0x0F&lt;br /&gt;#define DIK_Q               0x10&lt;br /&gt;#define DIK_W               0x11&lt;br /&gt;#define DIK_E               0x12&lt;br /&gt;#define DIK_R               0x13&lt;br /&gt;#define DIK_T               0x14&lt;br /&gt;#define DIK_Y               0x15&lt;br /&gt;#define DIK_U               0x16&lt;br /&gt;#define DIK_I               0x17&lt;br /&gt;#define DIK_O               0x18&lt;br /&gt;#define DIK_P               0x19&lt;br /&gt;#define DIK_LBRACKET        0x1A&lt;br /&gt;#define DIK_RBRACKET        0x1B&lt;br /&gt;#define DIK_RETURN          0x1C    /* Enter on main keyboard */&lt;br /&gt;#define DIK_LCONTROL        0x1D&lt;br /&gt;#define DIK_A               0x1E&lt;br /&gt;#define DIK_S               0x1F&lt;br /&gt;#define DIK_D               0x20&lt;br /&gt;#define DIK_F               0x21&lt;br /&gt;#define DIK_G               0x22&lt;br /&gt;#define DIK_H               0x23&lt;br /&gt;#define DIK_J               0x24&lt;br /&gt;#define DIK_K               0x25&lt;br /&gt;#define DIK_L               0x26&lt;br /&gt;#define DIK_SEMICOLON       0x27&lt;br /&gt;#define DIK_APOSTROPHE      0x28&lt;br /&gt;#define DIK_GRAVE           0x29    /* accent grave */&lt;br /&gt;#define DIK_LSHIFT          0x2A&lt;br /&gt;#define DIK_BACKSLASH       0x2B&lt;br /&gt;#define DIK_Z               0x2C&lt;br /&gt;#define DIK_X               0x2D&lt;br /&gt;#define DIK_C               0x2E&lt;br /&gt;#define DIK_V               0x2F&lt;br /&gt;#define DIK_B               0x30&lt;br /&gt;#define DIK_N               0x31&lt;br /&gt;#define DIK_M               0x32&lt;br /&gt;#define DIK_COMMA           0x33&lt;br /&gt;#define DIK_PERIOD          0x34    /* . on main keyboard */&lt;br /&gt;#define DIK_SLASH           0x35    /* / on main keyboard */&lt;br /&gt;#define DIK_RSHIFT          0x36&lt;br /&gt;#define DIK_MULTIPLY        0x37    /* * on numeric keypad */&lt;br /&gt;#define DIK_LMENU           0x38    /* left Alt */&lt;br /&gt;#define DIK_SPACE           0x39&lt;br /&gt;#define DIK_CAPITAL         0x3A&lt;br /&gt;#define DIK_F1              0x3B&lt;br /&gt;#define DIK_F2              0x3C&lt;br /&gt;#define DIK_F3              0x3D&lt;br /&gt;#define DIK_F4              0x3E&lt;br /&gt;#define DIK_F5              0x3F&lt;br /&gt;#define DIK_F6              0x40&lt;br /&gt;#define DIK_F7              0x41&lt;br /&gt;#define DIK_F8              0x42&lt;br /&gt;#define DIK_F9              0x43&lt;br /&gt;#define DIK_F10             0x44&lt;br /&gt;#define DIK_NUMLOCK         0x45&lt;br /&gt;#define DIK_SCROLL          0x46    /* Scroll Lock */&lt;br /&gt;#define DIK_NUMPAD7         0x47&lt;br /&gt;#define DIK_NUMPAD8         0x48&lt;br /&gt;#define DIK_NUMPAD9         0x49&lt;br /&gt;#define DIK_SUBTRACT        0x4A    /* - on numeric keypad */&lt;br /&gt;#define DIK_NUMPAD4         0x4B&lt;br /&gt;#define DIK_NUMPAD5         0x4C&lt;br /&gt;#define DIK_NUMPAD6         0x4D&lt;br /&gt;#define DIK_ADD             0x4E    /* + on numeric keypad */&lt;br /&gt;#define DIK_NUMPAD1         0x4F&lt;br /&gt;#define DIK_NUMPAD2         0x50&lt;br /&gt;#define DIK_NUMPAD3         0x51&lt;br /&gt;#define DIK_NUMPAD0         0x52&lt;br /&gt;#define DIK_DECIMAL         0x53    /* . on numeric keypad */&lt;br /&gt;#define DIK_F11             0x57&lt;br /&gt;#define DIK_F12             0x58&lt;br /&gt;&lt;br /&gt;#define DIK_F13             0x64    /*                     (NEC PC98) */&lt;br /&gt;#define DIK_F14             0x65    /*                     (NEC PC98) */&lt;br /&gt;#define DIK_F15             0x66    /*                     (NEC PC98) */&lt;br /&gt;&lt;br /&gt;#define DIK_KANA            0x70    /* (Japanese keyboard)            */&lt;br /&gt;#define DIK_CONVERT         0x79    /* (Japanese keyboard)            */&lt;br /&gt;#define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */&lt;br /&gt;#define DIK_YEN             0x7D    /* (Japanese keyboard)            */&lt;br /&gt;#define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */&lt;br /&gt;#define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */&lt;br /&gt;#define DIK_AT              0x91    /*                     (NEC PC98) */&lt;br /&gt;#define DIK_COLON           0x92    /*                     (NEC PC98) */&lt;br /&gt;#define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */&lt;br /&gt;#define DIK_KANJI           0x94    /* (Japanese keyboard)            */&lt;br /&gt;#define DIK_STOP            0x95    /*                     (NEC PC98) */&lt;br /&gt;#define DIK_AX              0x96    /*                     (Japan AX) */&lt;br /&gt;#define DIK_UNLABELED       0x97    /*                        (J3100) */&lt;br /&gt;#define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */&lt;br /&gt;#define DIK_RCONTROL        0x9D&lt;br /&gt;#define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */&lt;br /&gt;#define DIK_DIVIDE          0xB5    /* / on numeric keypad */&lt;br /&gt;#define DIK_SYSRQ           0xB7&lt;br /&gt;#define DIK_RMENU           0xB8    /* right Alt */&lt;br /&gt;#define DIK_HOME            0xC7    /* Home on arrow keypad */&lt;br /&gt;#define DIK_UP              0xC8    /* UpArrow on arrow keypad */&lt;br /&gt;#define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */&lt;br /&gt;#define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */&lt;br /&gt;#define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */&lt;br /&gt;#define DIK_END             0xCF    /* End on arrow keypad */&lt;br /&gt;#define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */&lt;br /&gt;#define DIK_NEXT            0xD1    /* PgDn on arrow keypad */&lt;br /&gt;#define DIK_INSERT          0xD2    /* Insert on arrow keypad */&lt;br /&gt;#define DIK_DELETE          0xD3    /* Delete on arrow keypad */&lt;br /&gt;#define DIK_LWIN            0xDB    /* Left Windows key */&lt;br /&gt;#define DIK_RWIN            0xDC    /* Right Windows key */&lt;br /&gt;#define DIK_APPS            0xDD    /* AppMenu key */&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-3098721671184435665?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.polygonhell.com/DX1Release3264Bit.zip' title='DX1 App Update - Macros should now work in more games'/><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/3098721671184435665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=3098721671184435665' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/3098721671184435665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/3098721671184435665'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2009/11/dx1-app-update-macros-should-now-work.html' title='DX1 App Update - Macros should now work in more games'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-7064798144111486076</id><published>2009-11-24T10:31:00.000-08:00</published><updated>2009-11-24T17:17:30.493-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ergodex'/><category scheme='http://www.blogger.com/atom/ns#' term='Driver'/><category scheme='http://www.blogger.com/atom/ns#' term='DX1'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='Dragon Age'/><category scheme='http://www.blogger.com/atom/ns#' term='DX1 Driver'/><title type='text'>DX1 macro problems - Dragon Age Origins</title><content type='html'>I've been playing Dragon Age Origins and I noted that macros don't work in the app. They work fine in WOW and Torchlight. After a little research I think it's likely that DAO is using DirectInput to read the keyboard.&lt;br /&gt;Apparently SendInput does do the right thing with DirectInput, but you have to use scan code instead of virtual keycodes. My guess would be sending Scan codes with Send Input inserts them earlier in the OS's input chain.&lt;br /&gt;I've recieved email from a couple of people with similar problems in apps I don't run.&lt;br /&gt;If I can get VS2008 installed on my new machine I'll try the change over the weekend and push out a fixed app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-7064798144111486076?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/7064798144111486076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=7064798144111486076' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7064798144111486076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7064798144111486076'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2009/11/dx1-macro-problems-dragon-age-origins.html' title='DX1 macro problems - Dragon Age Origins'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-7536705863981746946</id><published>2009-07-21T10:01:00.000-07:00</published><updated>2009-07-21T10:43:36.017-07:00</updated><title type='text'>Linux/Open and open source software...</title><content type='html'>About once every 12 months I take one of my machines and install various Linux/BSD distributions, mostly because I have a soft spot for UNIX like OS's. Pretty much every time I go through the same set of things that end up with me turning the machine off and leaving it off. It's usually a combination of hardware incompatibilities and poor development tools.&lt;br /&gt;&lt;br /&gt;This time however I had an agenda, I wanted to re purpose the machine in question as a media player, the original plan was to install XBMC and be done with it.&lt;br /&gt;&lt;br /&gt;OK so I go grab the latest Ubuntu disks, install it, which I have to say was extremely pain free. I install the xbmc package, and play a video, unfortunately it doesn't appear to respect the timer and plays the video very quickly with skipping audio. Hmmmmmm, so I dig around on various boards, the general consensus is it's a pulse audio issue, what's odd is that mplayer doesn't display the issue. OK I remove pulse from my system and try again, same thing. Hmmmmm, I decide to try it with the NULL sound driver to verify it's actually audio and the video plays at the correct speed.&lt;br /&gt;&lt;br /&gt;I figure maybe it's a fixed issue, so I pull down the latest build via svn, rebuild XBMC, same issue.&lt;br /&gt;&lt;br /&gt;In a fit of frustration I install Fedora and have more or less the same issues. I start looking at the video player inside XBMC, discover what a massive app it actually is. All I want is something basic that lets me browse videos from my server and play them.&lt;br /&gt;&lt;br /&gt;So I decide screw it, I wonder what it actually takes to write a video player using some of the open source components all the others seem to leverage. the answer turns out to be not very much the ffmpeg libraries provide most of the infrastructure, and it's relatively easy to get something up and running in a day or so. I did have some issues with the libswscale library, it has a bug where by it incorrectly swaps pixels when it's doing a 1:1 scale and isn't using the MMX routines, but I could patch that locally (I'd submit a fix, but it looks to me like the original author very much intended it to do what it's doing, and I have no idea why).&lt;br /&gt;&lt;br /&gt;OK so all's well that ends well?&lt;br /&gt;&lt;br /&gt;Not really at some point I decided to take my basic video player and use OpenGL to put the pixels on the screen, all of a sudden I have this issue where I get repeating sound fragments, and since I'm syncing video to the audio clock choppy video.&lt;br /&gt;&lt;br /&gt;My first thought was the audio thread starving, but for that to happen the app would have to be eating all the CPU and it's not. &lt;br /&gt;&lt;br /&gt;I discover that as I make the target widow smaller it stops being an issue, I know it's not a rendering related issue though, because if I remove the clocksync and just let the video run, it runs faster, so I'm not limited by drawing pixels. So I waste a lot of time looking at various aspects of my code ruling them all out.&lt;br /&gt;&lt;br /&gt;So I come up with a new theory, the audio driver is missing interrupts when the onboard video is busy for extended periods. To test my theory I try subdividing the single large polygon I'm using for display into 1024 small polygons and miraculously the issue goes away. Even doing a glClear is sufficient for the issue to return.&lt;br /&gt;&lt;br /&gt;So now I'm at a loss, I can't easily establish if this is a hardware issue, or a driver issue, and if it's a driver issue, if it's a video driver or an audio driver problem, or even a chipset driver issue. &lt;br /&gt;&lt;br /&gt;FWIW I believe it's an audio driver issue, I've tried the code with both an A2DP sound driver and I've put in an external sound card, and as long as I'm not using the internal sound card (NVidia MCP51) the issue doesn't present. I've tried setting various driver options with modprobe without success.&lt;br /&gt;&lt;br /&gt;So I'm left with ignore the issue and just leave the sound card in there (which irritates me because it should work). Or start digging through the ALSA driver code which I really don't want to do.&lt;br /&gt;&lt;br /&gt;Ugh!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-7536705863981746946?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/7536705863981746946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=7536705863981746946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7536705863981746946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7536705863981746946'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2009/07/linuxopen-and-open-source-software.html' title='Linux/Open and open source software...'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-359676250369220596</id><published>2009-03-01T13:27:00.001-08:00</published><updated>2009-03-01T13:36:31.165-08:00</updated><title type='text'>Minor DX1App update</title><content type='html'>&lt;a href="http://www.polygonhell.com/DX1Release3264Bit.zip"&gt;Updated &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DX&lt;/span&gt;1 programming App&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made a small change to the way &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;multikey&lt;/span&gt; macros are processed to fix an issue I was seeing with my own use in WOW. It turned out to be an issue with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;plugin&lt;/span&gt; I was using, but the fix is the right thing to do.&lt;br /&gt;&lt;br /&gt;Added support for 64bit App switching, I've had to use the process name instead of the app name for the switching code. You need to create a ".&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;pgm&lt;/span&gt;" file in the Macro directory (not the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;app's&lt;/span&gt; directory) named &lt;em&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;processName&lt;/span&gt;&lt;/em&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;pgm&lt;/span&gt; where process name should be the name of the process. Usually the process name is the same as the app name.&lt;br /&gt;&lt;br /&gt;I've tested this with the 64 bit version of media player, by creating a file called &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;wmplayer&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;pgm&lt;/span&gt; in the Macro directory.&lt;br /&gt;&lt;br /&gt;The issue is that a 32 bit app (which the programmer is) can't look at the process info for a 64 bit app. It's not trivial to build a native 64 bit version of the programming app because of the data &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;marshaling&lt;/span&gt; for the native windows calls, so I've added the work around.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-359676250369220596?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.polygonhell.com/DX1Release3264Bit.zip' title='Minor DX1App update'/><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/359676250369220596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=359676250369220596' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/359676250369220596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/359676250369220596'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2009/03/minor-dx1app-update.html' title='Minor DX1App update'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-2403067103553332376</id><published>2009-01-11T12:38:00.000-08:00</published><updated>2009-01-11T12:44:14.030-08:00</updated><title type='text'>DX1 App update</title><content type='html'>I've updated the driver and source code drop.&lt;br /&gt;This drop only affects the app and the source code, no changes to the driver.&lt;br /&gt;&lt;br /&gt;I've fixed the problem when mapping the 9 and Z keys from the main keyboard. The code that built the table that converted the windows key code to driver HID codes had a couple of typos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-2403067103553332376?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.polygonhell.com/DX1Release3264Bit.zip' title='DX1 App update'/><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/2403067103553332376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=2403067103553332376' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/2403067103553332376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/2403067103553332376'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2009/01/dx1-app-update.html' title='DX1 App update'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-7915268021117910838</id><published>2009-01-03T20:05:00.000-08:00</published><updated>2009-01-03T20:14:40.588-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ergodex'/><category scheme='http://www.blogger.com/atom/ns#' term='DX1'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista64'/><category scheme='http://www.blogger.com/atom/ns#' term='DX1 Driver'/><title type='text'>New 32 and 64 Bit Ergodex DX1 drivers</title><content type='html'>As promised a 64 bit version of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DX&lt;/span&gt;1 Driver and app.&lt;br /&gt;This drop also includes support for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;multikey&lt;/span&gt; macros and various  fixes.&lt;br /&gt;Also included is the source code for the programming App, hopefully someone with more desire can build something a bit more user friendly.&lt;br /&gt;&lt;br /&gt;This was more work than I expected, the code was easy enough to fix, but I had a somewhat subtle error in my ".inf" file that was only causing an issue on my 64 bit machine. It's also possible it was causing issues in the 32 bit version so you might want to grab the new drop.&lt;br /&gt;&lt;br /&gt;At some point I renamed a number of classes in the application, and I don't remember if it was &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;pre&lt;/span&gt; or post the last drop, that invalidated saved macros and key bindings, so you might want to delete any if you have a problem running the App.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.polygonhell.com/DX1Release3264Bit.zip"&gt;http://www.polygonhell.com/DX1Release3264Bit.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-7915268021117910838?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.polygonhell.com/DX1Release3264Bit.zip' title='New 32 and 64 Bit Ergodex DX1 drivers'/><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/7915268021117910838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=7915268021117910838' title='91 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7915268021117910838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7915268021117910838'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2009/01/new-32-and-64-bit-ergodex-dx1-drivers.html' title='New 32 and 64 Bit Ergodex DX1 drivers'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>91</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-7773358633462046180</id><published>2008-12-23T15:33:00.000-08:00</published><updated>2008-12-23T15:34:33.386-08:00</updated><title type='text'>Bah Humbug</title><content type='html'>The delivery of my stuff was delayed by the inclement weather, so it'll be the new year before I can get an updated drop of the driver out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-7773358633462046180?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/7773358633462046180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=7773358633462046180' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7773358633462046180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/7773358633462046180'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2008/12/bah-humbug.html' title='Bah Humbug'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-1953105417889316265</id><published>2008-12-16T09:14:00.001-08:00</published><updated>2008-12-16T09:21:43.650-08:00</updated><title type='text'>Quick Update</title><content type='html'>I've had a number of requests over the last week or so for 64 bit binary versions of the Ergodex driver, and the possibility of a source code drop.&lt;br /&gt;&lt;br /&gt;I'm currently in the midst of relocating to the Seattle area, and I don't have access to the computer with the driver source code on it. I should have access after the 22nd.&lt;br /&gt;&lt;br /&gt;Once I have access to the computer I'll build and release a 64 bit version along with an updated programming app, as I've made several fixes since the release here.&lt;br /&gt;I will also release the source code for the programming app at that time.&lt;br /&gt;I will not release the source code to the driver itself until I've had a chance to poor over the licensing restrictions and figured out exactly what license I can release it under.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-1953105417889316265?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/1953105417889316265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=1953105417889316265' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/1953105417889316265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/1953105417889316265'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2008/12/quick-update.html' title='Quick Update'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-3025613704099653822</id><published>2008-07-14T15:15:00.000-07:00</published><updated>2008-07-14T15:23:28.729-07:00</updated><title type='text'>Ergodex DX1 Driver Vista</title><content type='html'>You can download a binary release of my Vista 32 DX1 driver below&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.polygonhell.com/DX1%20Release.rar"&gt;DX1 Driver&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If there is any demand I guess I can compile a version for Vista 64 but I have no way to test it currently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-3025613704099653822?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/3025613704099653822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=3025613704099653822' title='176 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/3025613704099653822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/3025613704099653822'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2008/07/ergodex-dx1-driver-vista.html' title='Ergodex DX1 Driver Vista'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>176</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-2727071884714019241</id><published>2008-07-08T15:46:00.000-07:00</published><updated>2008-07-08T15:47:27.311-07:00</updated><title type='text'>Writing a DX1 device driver for Vista</title><content type='html'>I recently upgraded to Vista after an incident involving a replacement video card resulting in a lost hard drive (don’t ask), for the most part I actually prefer Vista to XP. About the only real downside (other than the stupid security escalation dialogs) was the lack of a driver for my Ergodex DX1.&lt;br /&gt;&lt;br /&gt;After rummaging through the Ergodex forums and waiting for them to actually provide a driver, I ran across this site http://ergodex.hydraproductions.com/wiki/ since Dom had already reverse engineered the USB protocol I thought I’d try writing a driver for the device.&lt;br /&gt;&lt;br /&gt;I think the last time I wrote a device driver of any description for windows might have been circa windows 3.1. I have a pretty good understanding of the hardware and the underlying protocols, because Consoles usually don’t make much of an effort to hide the nuts and bolts, but my Windows skillz leave a bit to be desired.&lt;br /&gt;&lt;br /&gt;I downloaded the windows DDK, scanned the examples, and started messing around with the Bulk USB sample. After a while it became obvious I was going to have to install another copy of Vista on a second box in order to debug anything or at least use my laptop as the target. I was scanning through the docs and I came across the WDF doc, it seemed that the UMDF provided everything I needed to write a USB driver in usermode and allowed me to debug just by attaching Visual Studio to the running device process.&lt;br /&gt;&lt;br /&gt;So on Sunday night I started experimenting with one of the samples, by Wednesday Night the driver was basically functional. It’s changed a bit since then because I changed my mind on how to communicate with the programming/macro playback software. Since then I’ve put together enough of a programming/macro app to do what I need.&lt;br /&gt;&lt;br /&gt;There are two things that jump out at me from this experience, &lt;br /&gt;&lt;br /&gt;The first is how well designed at least the UMDF portion of the WDF is, the reason I could write a driver in literally 3 or 4 evenings, was that the base functionality just does the right thing most of the time just leaving you to marshal data and pass it on.&lt;br /&gt;&lt;br /&gt;The second, is how frustrating it is that a company like Ergodex still can’t get Vista drivers out, the vast majority of the work for the suit is in the programming tool and I’m sure the XP one Ergodex has could just be dropped on Vista, just leaving the part that took me 3 or 4 days.&lt;br /&gt;&lt;br /&gt;I’ll release the driver here along with my horrible programming application when I get some time to make a pass on the code. I’ll also release the source code for none commercial purposes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-2727071884714019241?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/2727071884714019241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=2727071884714019241' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/2727071884714019241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/2727071884714019241'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2008/07/writing-dx1-device-driver-for-vista.html' title='Writing a DX1 device driver for Vista'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-2425919846195925145</id><published>2008-05-04T13:16:00.000-07:00</published><updated>2008-05-10T13:00:03.125-07:00</updated><title type='text'>WOW Multimonitor and Vista</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_f3UGH-HWgjc/SB4oJFsXpnI/AAAAAAAAAAw/HZOL9NWkhhE/s1600-h/DualMonitor.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5196635156644341362" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_f3UGH-HWgjc/SB4oJFsXpnI/AAAAAAAAAAw/HZOL9NWkhhE/s400/DualMonitor.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Consider this a Howto. (with a bad picture)&lt;br /&gt;&lt;br /&gt;1. install WOW and get it running.&lt;br /&gt;&lt;br /&gt;OK now we find that since Vista has removed the Stretch window option we can only run on one monitor. There isn't much we can do about full screen mode, but we can run in a Window and stretch the window across the monitors. This works, but the window grows in height as we stretch horizontally, since WOW is trying to maintain the aspect ratio.&lt;br /&gt;&lt;br /&gt;To fix this, edit your config.wtf file and edit the gxResolution line, it's important to note that if either the width or height specified on the resolution line exceed the resolution of your primary monitor, it will just be reset. All that matters for now is that you pick something with the correctaspect ratio.&lt;br /&gt;&lt;br /&gt;I'm using a pair of widescreen monitors, with a final resolution of 3840x1200, so I set my gxResolution line to one quarter of that 960x300.&lt;br /&gt;&lt;br /&gt;SET gxResolution "960x300"&lt;br /&gt;&lt;br /&gt;Note that under vista if you don't run WOW as administrator, it seems to ignore the settings in Config.wtf, so run it as administrator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OK at this point, you should be able to stretch the image in the correct aspect ratio accross the two monitors.&lt;br /&gt;&lt;br /&gt;I was almost happy with this but I really hate the stupid window border, I really wanted the equivalent of the maximised check box in the graphics options. i.e Maximised across both monitors with no border. Unfortunately setting the Miximized option will of course maximize to just one monitor.&lt;br /&gt;&lt;br /&gt;I messed around with various multmonitor utils and none of them did what I wanted, so I wrote a program to do exactly what I wanted to the WOW window.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.polygonhell.com/wind1.exe"&gt;http://www.polygonhell.com/wind1.exe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a command line utility, and has to be run as administrator (since it needs to modify another processes window), basically it finds the first window with the start of the title "World of Warcraft", changes the stype flags to remove the window border and then resizes the window to the specified size.&lt;br /&gt;&lt;br /&gt;There is minimal error checking since it was a quick hack, it takes upto 4 parameters, x, y, width and height (see below). if you omit the arguments it defaults to 0,0,640, 480&lt;br /&gt;&lt;br /&gt;wind1.exe -1920 0 3840 1200&lt;br /&gt;&lt;br /&gt;That's the command I use, the X is negative, because it happens my primary monitor is to the right of my secondary monitor, you can run it multiple times to move and resize the window, but there is no functionality to restore the border.&lt;br /&gt;&lt;br /&gt;This is not a keylogger, and for the overly paranoid the source code is below if you want to build it yourself.&lt;br /&gt;&lt;br /&gt;EDIT -- Fixed a problem in identifying the correct window, under some circumstances it would find the button on the Taskbar instead of the window and just do nothing. Revised code below, also updated exe at the above link.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;// WOWFullScreen -- Hack to maximise the window with no border to an arbitrary area&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;span class="str"&gt;"stdafx.h"&lt;/span&gt;&lt;br /&gt;#include &lt;span class="str"&gt;"windows.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; _tmain(&lt;span class="kwrd"&gt;int&lt;/span&gt; argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt;    WCHAR *match = L&lt;span class="str"&gt;"World of Warcraft"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; x = 0;&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; y = 0;&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; width = 640;&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; height = 480;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (argc &amp;gt; 1)&lt;br /&gt;        x = _wtoi(argv[1]);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (argc &amp;gt; 2)&lt;br /&gt;        y = _wtoi(argv[2]);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (argc &amp;gt; 3)&lt;br /&gt;        width = _wtoi(argv[3]);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (argc &amp;gt; 4)&lt;br /&gt;        height = _wtoi(argv[4]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    WCHAR name[1024];&lt;br /&gt;    HWND wind = 0;&lt;br /&gt;&lt;br /&gt;    HWND window = GetDesktopWindow();&lt;br /&gt;    HWND child = GetWindow(window, GW_CHILD);&lt;br /&gt;    child = GetWindow(child, GW_HWNDFIRST);&lt;br /&gt;    &lt;span class="kwrd"&gt;while&lt;/span&gt; (child)&lt;br /&gt;    {&lt;br /&gt;        GetWindowText(child, name, 1023);&lt;br /&gt;        unsigned &lt;span class="kwrd"&gt;int&lt;/span&gt;  style = GetWindowLong(child, GWL_STYLE);&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; ((style &amp;amp; 0x160f0000) == 0x160f0000 &amp;amp;&amp;amp; !wcsncmp(match, name, wcslen(match)))&lt;br /&gt;        {&lt;br /&gt;            wind = child;&lt;br /&gt;            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        child = GetWindow(child, GW_HWNDNEXT);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    unsigned &lt;span class="kwrd"&gt;int&lt;/span&gt;  style = GetWindowLong(wind, GWL_STYLE);&lt;br /&gt;    unsigned &lt;span class="kwrd"&gt;int&lt;/span&gt;  styleEX = GetWindowLong(wind, GWL_EXSTYLE);&lt;br /&gt;&lt;br /&gt;    style = style &amp;amp; ~( WS_CAPTION | WS_THICKFRAME);&lt;br /&gt;    SetWindowLong(wind, GWL_STYLE, style);&lt;br /&gt;    SetWindowPos(wind, HWND_TOP, x, y, width, height, 0);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-2425919846195925145?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/2425919846195925145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=2425919846195925145' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/2425919846195925145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/2425919846195925145'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2008/05/wow-multimonitor-and-vista.html' title='WOW Multimonitor and Vista'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_f3UGH-HWgjc/SB4oJFsXpnI/AAAAAAAAAAw/HZOL9NWkhhE/s72-c/DualMonitor.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-9173072355101381276</id><published>2008-01-12T11:34:00.001-08:00</published><updated>2008-01-12T13:29:57.819-08:00</updated><title type='text'>Thoughts on development tools and the future</title><content type='html'>I had a conversation with a friend recently about why Sony had really failed to match the quality of Microsofts devtools.&lt;br /&gt;&lt;br /&gt;The answer is pretty simple, for the most part they are hacking their devtools into Visual Studio and copying what MS already has. At some level it's all they can do, as a developer I don't want two different dev environments for two different consoles, I have to switch back and forth too often for that. The reason I finally gave up on my seperate text editor and started editing files inside Visual Studio was because the VS brief emulation was bad enough that editing files in both places was inconsistent and irritating.&lt;br /&gt;&lt;br /&gt;But the conversation got me thinking about how tools like Visual Studio haven't scaled well with the size and complexity of modern games, andin fact how much more painful development is now (despite the infinitely better tools) than it ever has been.&lt;br /&gt;&lt;br /&gt;The issue is the cycle time, I make a change/add a feature, compile, link run and test. For me currently excluding the editting that's at least 3 minutes, and as much as 20 depending on what files I touch in the codebase. That makes any sort of itterative development hideously painful. We work around by having hot loaded tuning files, and exposing variables that we want to itterate on in those files, but that doesn't cover a lot of code specific cases.&lt;br /&gt;&lt;br /&gt;Some of the pain is self inflicted, our startup time to get into the game on dev builds is pretty bad, because we generally develop with thousands of "loose files", loaded off the disc to make changing them easier, where as we ship with them packed into larger packages.&lt;br /&gt;&lt;br /&gt;But a big chunk is in compilation and linking.&lt;br /&gt;&lt;br /&gt;We use incredibuild, though it's only really a win in a rebuild all case. We could probably improve link times some by cleaning up some of the dependencies between source files and we do sweep files for un-needed header dependencies on occasion. Making some of our libraries DLL's would probably help the link time. But why is it even necessary?&lt;br /&gt;&lt;br /&gt;In the Genesis/SNES days, for the most part I could edit, assemble and run in less than  10 seconds. OK I'm comparing less than 100K lines of assembler to over 1M lines of C++, but we need to find a solution.&lt;br /&gt;&lt;br /&gt;And it's not just the compile/link time, managing all the files in the project becomes a challenge, I use Visual Assist and would recommend to to others, it has tools that help navigating code bases, but the some of the more useful ones like goto symbol really only work about 1/2 the time on large codebases.&lt;br /&gt;&lt;br /&gt;I've championed the idea of providing artists and designers with powerful tools that let them itterate quickly, even at the expense of runtime performance (although that's a fine line to walk) for probably 10 years now. They produce better content and that makes the technology look good. We need to apply the same sort of thought process to engineering.&lt;br /&gt;&lt;br /&gt;MS has made some efforts in this direction, Compile and Continue, is an incredible tool, unfortunately it seems to just stop working on large codebases. They have mechanisms to lookup symbols and go to them, but using it on large codebases leads to huge random pauses when editing.&lt;br /&gt;What's worse is that because MS has concentrated on the feature set of Visual Studio, dealing with large codebases in visual studio has actually gotten worse as it's moved forwards. VS6 is better in this regard than 2003 and 2003 is better than 2005. My understanding is that 2008 is starting to move towards improvements in this area, but I haven't had a chance to test that.&lt;br /&gt;&lt;br /&gt;All a user can really do to alleviate the situation is work with less source code. There are ways to do this if you make the right set of design decisions, but when you start making technical decisions based on the inadequacies of the development environment there is something very wrong.&lt;br /&gt;&lt;br /&gt;The majority of programmers I know bitch about Visual Studio on a daily basis, most of what it does, it does just about adequately. If someone like a Sony or Whoever really wanted to compete in the devtool arena with MS I think the window is there to do so. For Sony they'd have to stop thinking in terms of PS3 tools and start thinking in terms of core development tools for multiple platforms, cross platform development is not going away and the cost of having to use two dev environments is just too high. You don't need the feature set of Visual Studio to beat it, you just need to do the useful things well, and let people do all there work inside it. If it were me I'd concentrate on any mechanism to let programmers itterate quickly on large codebases, and make it your differentiating feature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-9173072355101381276?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/9173072355101381276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=9173072355101381276' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/9173072355101381276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/9173072355101381276'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2008/01/thoughts-on-development-tools-and.html' title='Thoughts on development tools and the future'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7431955836196950934.post-8315184549890956341</id><published>2007-09-09T10:02:00.000-07:00</published><updated>2007-09-09T11:11:15.803-07:00</updated><title type='text'>Developing games with large teams</title><content type='html'>As the video game industry has grown, so have the the expectations of the customer and accordingly product complexity. Time pressures however have remained more or less constant, while there are a few products that ship "when they are ready", most still have to ship for &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;Xmas&lt;/span&gt;, for the end of a fiscal quarter or the start of some sports season.&lt;br /&gt;&lt;br /&gt;As a result &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;team sizes&lt;/span&gt; have ballooned over the last 5 years or so, it's a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;predictable&lt;/span&gt; solution to the problem, with predictable problems of its own. The old &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;adage&lt;/span&gt; that 9 women can't have a baby in 1 month is pretty much understood by everyone involved, having said that there are plenty of people involved who still believe that 20 women can have a baby in 5 months.&lt;br /&gt;&lt;br /&gt;There are some things you can do on a large team, that small teams simply can't do you have resources to burn, so you can do experiments or add features that a smaller team simply &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;couldn't&lt;/span&gt; afford too. However the cost of this is extreme, when lots of people are contributing to a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;codebase&lt;/span&gt;, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;codebase&lt;/span&gt; will be &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;necessarily&lt;/span&gt; larger for the same functionality, larger means more complex and more difficult to maintain, engineers generally have only local knowledge of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;codebase&lt;/span&gt;, often coupled with an incomplete or inaccurate understanding of the rest. Because of the increased engineer count, there is a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;tendency&lt;/span&gt; to have a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;disproportionately&lt;/span&gt; high number of inexperienced engineers. Code quality becomes difficult to police and you start to suffer from "death by a thousand cuts" in both performance and memory.&lt;br /&gt;&lt;br /&gt;The mistake that is commonly made is to believe that you can control this from the top, by adding &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;separate&lt;/span&gt; engineering/project management and tracking the project at a finer granularity. This IMO as two fundamental problems with it, project managers staring at there planning tools start to look at engineers as work units, and the completion tests look at features in isolation rather than in the context of the game as a whole. This leads to a loss of ownership by the individual contributors and a lot of unscheduled time to take the collection of features built this way that have to be cut/fixed or reimplemented before the game actually ships.&lt;br /&gt;&lt;br /&gt;Now I'm not advocating no planning or tracking, they are both very valuable tools in managing any project. But it's important to do everything in the context of the game, and understand that estimates are estimates, rather than pressuring an engineer to deliver something inside a milestone, pressure the engineer to deliver the right thing and understand that milestones are about gut checks and tracking. Give the people on the ground ownership for large scale features, let then see them through from start to end. Listen to your senior engineers, they've been through it before and they are going to give you as valid a read on the project state as any tracking tool.&lt;br /&gt;&lt;br /&gt;The real solution though is fewer, more experienced people over a longer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;timeframe&lt;/span&gt;. Start with small teams, give them ownership and grow them as the resources are needed and can be used. If your a large company, start more projects, experiment, evaluate the projects regularly and kill the ones that aren't working out. The idea here is based on the model used by investors for every 10 projects you back your looking for 1 to make it big and cover the costs of the others.&lt;br /&gt;&lt;br /&gt;The biggest problem I see with a setup like this is people quitting because their project is cancelled, but this is really about setting expectations, yes you'll loose some people but you'll attract just as many with the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;opportunity&lt;/span&gt; to own and contribute to something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7431955836196950934-8315184549890956341?l=polygonalhell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonalhell.blogspot.com/feeds/8315184549890956341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7431955836196950934&amp;postID=8315184549890956341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/8315184549890956341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7431955836196950934/posts/default/8315184549890956341'/><link rel='alternate' type='text/html' href='http://polygonalhell.blogspot.com/2007/09/developing-games-with-large-teams.html' title='Developing games with large teams'/><author><name>Rob Povey</name><uri>http://www.blogger.com/profile/00814509809962646468</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
