<?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-3407439644292467598</id><updated>2012-05-20T07:57:02.237+02:00</updated><category term='cooking'/><category term='logging'/><category term='deferred rendering'/><category term='Python'/><category term='Högskola'/><category term='deferred shading'/><category term='re'/><category term='maplist'/><category term='extract'/><category term='Keendra'/><category term='logs'/><category term='Behavior tree'/><category term='RPG'/><category term='parallax mapping'/><category term='I got an effin&apos; job'/><category term='frezorer'/><category term='Unreal Frontend'/><category term='forums'/><category term='Quantum Studios'/><category term='freevo'/><category term='HLSL'/><category term='SSAO'/><category term='Andreas Nilsson'/><category term='parsing'/><category term='Astar'/><category term='forum'/><category term='horror'/><category term='3D Programming'/><category term='Carmack'/><category term='Programming'/><category term='Job'/><category term='C++'/><category term='Blekinge'/><category term='College'/><category term='Karlskrona'/><category term='UDP'/><category term='hugeanticpeanut'/><category term='Frontend'/><category term='CookedPC'/><category term='Epic'/><category term='Scripts'/><category term='Objective-C'/><category term='Networking'/><category term='KNA'/><category term='Unity'/><category term='Work'/><category term='Unreal Development Kit'/><category term='Parallax'/><category term='Tkinter'/><category term='Facebook'/><category term='School'/><category term='Network'/><category term='Csharp'/><category term='normal mapping'/><category term='Epic Games'/><category term='A*'/><category term='parallax map'/><category term='mysql'/><category term='UDKGame'/><category term='Behave'/><category term='Behaviour tree'/><category term='parse'/><category term='cook'/><category term='Unity 3d'/><category term='Mind Sway'/><category term='remote'/><category term='BTH'/><category term='Bad excuse for not blogging more often'/><category term='game'/><category term='fresh prince lyrics'/><category term='relief mapping'/><category term='regex'/><category term='Germany'/><category term='Life'/><category term='iPhone'/><category term='Leave of Absence'/><category term='3D'/><category term='Assignment'/><category term='Relief'/><category term='DX10'/><category term='xDelia'/><category term='UDK'/><category term='regular expressions'/><category term='Unity3d'/><category term='pathfinding'/><category term='Game Programming'/><category term='3D Engine'/><category term='DirectX'/><category term='Portfolio'/><category term='UnrealScript'/><category term='Rasmus Welin'/><category term='deferred'/><title type='text'>Henrik Poulsen's Blog</title><subtitle type='html'>A Game Programmer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Henrik Poulsen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/--c3K0OpJZ2s/AAAAAAAAAAI/AAAAAAAAACw/w7bDVwT_ahs/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-6436596234644211347</id><published>2012-01-15T16:31:00.000+01:00</published><updated>2012-01-16T19:47:45.074+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extract'/><category scheme='http://www.blogger.com/atom/ns#' term='logs'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='parsing'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='re'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='parse'/><title type='text'>Regular Expressions: Learning by doing</title><content type='html'>&lt;span style="font-size: large;"&gt;Why&lt;/span&gt;&lt;br /&gt;Regular expressions are a behemoth of syntactical nightmares, that is at least the opinion I have always had of regular expressions in the past. The problem with learning it, in my opinion, is the lack of guided examples that are similar to what I want to accomplish. The tutorials tend to just be very generic explanations of the syntax and when you end up trying to use it to fit your purposes it all collapses on your head.&lt;br /&gt;So I want to solve a scenario I need the help of regular expressions for and hopefully it will be helpful for someone else down the line.&lt;br /&gt;This is just a very basic guide to a simple scenario and I will not go in depth into what exactly everything does. The hopes is just that it will bring a little clarity to other lost souls out there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;What&lt;/span&gt;&lt;br /&gt;There is a need for remaking the logging logic for a system I am working on, since it was very basic and very outdated (timestamps didn't record milliseconds, no severity of the output in the logs and little to no context to the content of the print). After having that done I was curious about the aspect of developing a small python script which could extract useful information from the massive amounts of logs, to aid the people that actually have to read the logs when problems arise.&lt;br /&gt;Some example situations might be as follows.&lt;br /&gt;&lt;br /&gt;Only show entries for&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A certain time/date interval.&lt;/li&gt;&lt;li&gt;Specific processes.&lt;/li&gt;&lt;li&gt;A specific process id.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So we need to be able to extract the different elements of a log entry so that the script then can utilize them in any way we might need them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The log format I want to process is similar to the following:&lt;/div&gt;&lt;pre class="prettyprint"&gt;[2012-01-13 13:00:00.250,    Error &amp;lt;   MyServer:8071  &amp;gt; [ContextInProcess|LocalInfo] Gosh! Something went wrong around here&lt;br /&gt;[2012-01-13 13:00:00:270,     Info &amp;lt;otherserver:2871  &amp;gt; [BullshitDetector] MyServer was just joking.&lt;br /&gt;Go ahead and ignore it.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What we can see here is that the information is padded to help with readability (since these logs are made for humans, so they need to be easy to read) and multi-line entries are allowed as well.&lt;br /&gt;&lt;br /&gt;So this post will be focused on parsing out the different elements of the log entries so they can be processed later.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;How&lt;/span&gt;&lt;br /&gt;Since we have some different elements to the log entries we want to be able to extract these and put names to them so we can easily utilize them later.&lt;br /&gt;&lt;br /&gt;So since this is quite a daunting task, for the regex-phobic, we take this one step at a time and start very simple.&lt;br /&gt;First we create a simple python script which just reads in my log sample from above and runs it through re.compile and then we can continue building from there.&lt;br /&gt;&lt;pre class="prettyprint"&gt;import re&lt;br /&gt;def main():&lt;br /&gt;    file = open("Log.txt")&lt;br /&gt;    com = re.compile(r'^(?P&amp;lt;everything&amp;gt;.*)', re.X)&lt;br /&gt;    for line in file:&lt;br /&gt;        match = com.match(line);&lt;br /&gt;        if match:&lt;br /&gt;            print match.groupdict()&lt;br /&gt;    file.close()&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    main()&lt;/pre&gt;&lt;br /&gt;The python code itself should be quite straight forward.&lt;br /&gt;We open Log.txt, then read it one line at a time and run it through the regular expression we set up, if it matches we just print out the resulting dictionary, then we close the file.&lt;br /&gt;One interesting thing about the python code is re.X, this enables verbose mode for the regex compiler.&lt;br /&gt;This basically means that it will ignore any white spaces we insert into the expression (with some exceptions), and allows us to comment the expression with #, which allows us to make the expression readable in our code.&lt;br /&gt;So this is what it would look like if we tried to structure the above expression a little bit&amp;nbsp;better.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;re.compile(r'''&lt;br /&gt;    ^                   # from the start of the line&lt;br /&gt;    (?P&amp;lt;everything&amp;gt;     # we create a group called "everything"&lt;br /&gt;        .*              # the group will match anything&lt;br /&gt;    )                   # end of group     &lt;br /&gt;    ''', re.X)&lt;br /&gt;&lt;/pre&gt;It will give the exact same result, but now it is so readable that I doubt I will have to explain the elements of this expression.&lt;br /&gt;So now lets tackle the expression itself. After running the script you would get the following output.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;{'everything': '[2012-01-13 13:00:00.250, &amp;nbsp; &amp;nbsp;Error &amp;lt; &amp;nbsp; MyServer:8071 &amp;nbsp;&amp;gt; [ContextInProcess|LocalInfo] Gosh! Something went wrong around here'}&lt;br /&gt;{'everything': '[2012-01-13 13:00:00:270, &amp;nbsp; &amp;nbsp; Info &amp;lt;otherserver:2871 &amp;nbsp;&amp;gt; [BullshitDetector] MyServer was just joking.'}&lt;br /&gt;{'everything': 'Go ahead and ignore it.'}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We got three prints, one for every line in the file. And we can see that in every print we have a dictionary with only one key (everything) and it contains the entire row from the log. This should be pretty obvious from the commented version of the expression why it would result in this.&lt;br /&gt;&lt;br /&gt;So this is all fine and dandy, but it is not very usable in this manner. We would like to group the different elements in the log entries so we get a nicely formatted dictionary at the end with all the relevant keys that we would need.&lt;br /&gt;We also want to ensure that the entries correctly formatted. So that if there were ever a multi-line log entry printed which looks like this:&lt;br /&gt;&lt;pre class="prettyprint"&gt;[2012-01-13 15:00:00.980, &amp;nbsp; &amp;nbsp;Error &amp;lt; &amp;nbsp; MyServer:8071 &amp;nbsp;&amp;gt; [ContextInProcess|LocalInfo] Interesting stuff on the next line.&lt;br /&gt;[something, other &amp;lt; whatever: nice &amp;gt; [ hmm ] ok&lt;br /&gt;&lt;/pre&gt;It should fail since we would expect the first parameter to be a timestamp and not a string. Then we should know that this line is actually a part of the last log entry we parsed out and it should be appended to it.&lt;br /&gt;&lt;br /&gt;Since we have delimiters in the format of the log it is quite simple to extract the different groups we want.&lt;br /&gt;In this next version we have just extracted the different elements of our log entry and given them appropriate names.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;com = re.compile(r'''&lt;br /&gt;        ^\[                 # the line starts with a [&lt;br /&gt;        (?P&amp;lt;timestamp&amp;gt;      # timestamp group&lt;br /&gt;            .*&lt;br /&gt;        )&lt;br /&gt;        , # delimiter&lt;br /&gt;        (?P&amp;lt;severity&amp;gt;       # severity group&lt;br /&gt;            .*&lt;br /&gt;        ) &lt;br /&gt;        &amp;lt; # delimiter&lt;br /&gt;        (?P&amp;lt;process&amp;gt;        # process group&lt;br /&gt;            .*&lt;br /&gt;        )&lt;br /&gt;        : # delimiter &lt;br /&gt;        (?P&amp;lt;pid&amp;gt;            # process id group&lt;br /&gt;            .*&lt;br /&gt;        )&lt;br /&gt;        &amp;gt;\ \[ # delimiter for "&amp;gt; ["&lt;br /&gt;        (?P&amp;lt;context&amp;gt;        # context group&lt;br /&gt;            .*&lt;br /&gt;        )&lt;br /&gt;        \] # delimiter&lt;br /&gt;        (?P&amp;lt;entry&amp;gt;          # the log entry group&lt;br /&gt;        .*&lt;br /&gt;        )&lt;br /&gt;    ''', re.X)&lt;br /&gt;&lt;/pre&gt;This gives us:&lt;br /&gt;&lt;pre class="prettyprint"&gt;{'severity': '    Error ', 'process': '   MyServer', 'timestamp': '2012-01-13 13&lt;br /&gt;:00:00.250', 'pid': '8071  ', 'context': 'ContextInProcess|LocalInfo', 'entry':&lt;br /&gt;' Gosh! Something went wrong around here'}&lt;br /&gt;{'severity': '     Info ', 'process': 'otherserver', 'timestamp': '2012-01-13 13&lt;br /&gt;:00:00:270', 'pid': '2871  ', 'context': 'BullshitDetector', 'entry': ' MyServer&lt;br /&gt; was just joking.'}&lt;br /&gt;&lt;/pre&gt;Now we have all the groups we need, but no validation for any of the fields. This code is also quite simple. We just specify our groups and then select our delimiters between the groups.&lt;br /&gt;Note that we have to escape special characters and spaces. So at line 18 you see "&amp;gt;\ \[" but it means "&amp;gt; [" and that is the three character delimiter between the process id group and context group that we have in our format. The results of the script have not trimmed the excess white spaces from the elements, but this is outside of the scope of this post since that is very easily handled in python later.&lt;br /&gt;&lt;br /&gt;We could of course stop here since now we do have the data that we want in the format that we want.&lt;br /&gt;However the special case mentioned earlier about the multi-line entry would give a false positive with the code we currently have. What we can do to avoid this is to specify the expected contents of the different groups we have. So that if it doesn't match what we expect, then it wont return anything and we will take this as a hint that this line is a continuation of the last match we had.&lt;br /&gt;&lt;br /&gt;So here comes a final version of our expression.&lt;br /&gt;&lt;pre class="prettyprint"&gt;com = re.compile(r'''&lt;br /&gt;        ^\[                 # the line starts with a [&lt;br /&gt;        (?P&amp;lt;timestamp&amp;gt;      # timestamp group&lt;br /&gt;            [0-9]{4}    # year&lt;br /&gt;            -&lt;br /&gt;            [0-9]{2}    # month&lt;br /&gt;            -&lt;br /&gt;            [0-9]{2}    # day&lt;br /&gt;            \ # whitespace&lt;br /&gt;            [0-9]{2}    # hour&lt;br /&gt;            :&lt;br /&gt;            [0-9]{2}    # minute&lt;br /&gt;            :&lt;br /&gt;            [0-9]{2}    # second&lt;br /&gt;            .&lt;br /&gt;            [0-9]{3}    # millisecond&lt;br /&gt;        )&lt;br /&gt;        , # delimiter&lt;br /&gt;        (?P&amp;lt;severity&amp;gt;       # severity group&lt;br /&gt;            [A-za-z ]+&lt;br /&gt;        ) &lt;br /&gt;        &amp;lt; # delimiter&lt;br /&gt;        (?P&amp;lt;process&amp;gt;        # process group&lt;br /&gt;            [A-Za-z ]+&lt;br /&gt;        )&lt;br /&gt;        : # delimiter &lt;br /&gt;        (?P&amp;lt;pid&amp;gt;            # process id group&lt;br /&gt;            [0-9 ]+&lt;br /&gt;        )&lt;br /&gt;        &amp;gt;\ \[ # delimiter for "&amp;gt; ["&lt;br /&gt;        (?P&amp;lt;context&amp;gt;        # context group&lt;br /&gt;            .*&lt;br /&gt;        )&lt;br /&gt;        \] # delimiter&lt;br /&gt;        (?P&amp;lt;entry&amp;gt;          # the log entry group&lt;br /&gt;            .*&lt;br /&gt;        )&lt;br /&gt;    ''', re.X)&lt;br /&gt;&lt;/pre&gt;What we have done here is set up some rules for some of the groups (timestamp, severity, process and pid) which makes it harder to get false positives.&lt;br /&gt;If we take a look at the timestamp group we see the following type of statements:&lt;br /&gt;&lt;pre class="prettyprint"&gt;[0-9]{4}&lt;/pre&gt;[0-9] means that we want to match any number between and including 0-9.&lt;br /&gt;{4} means that we want there to be exactly 4 of such numbers. &lt;br /&gt;So the above one would indicate a year, since it has four digits.&lt;br /&gt;In this manner we have defined up the entire timestamp in such variations, with the appropriate delimiters in between. This will not impact our original group, since the outer group remains unchanged, we have just changed the pattern with which it detects a valid timestamp group.&lt;br /&gt;&lt;br /&gt;In the severity group we have:&lt;br /&gt;&lt;pre class="prettyprint"&gt;[A-Za-z ]+&lt;/pre&gt;&lt;b&gt;[A-Za-z ]&lt;/b&gt; This is just a variation of the one from the timestamp one. It means that we want all letter ranges between upper-case and lower-case A-Z. Also notice the white space added, this is because we are not trimming white spaces, so if there is a white space in there it would fail if we got there. Note that we do not have to escape the white space here.&lt;br /&gt;&lt;b&gt;+&lt;/b&gt; Means one or more. So if one of the fields were to be blank it would fail. If we wouldn't care if they were empty we could replace them with * which is zero or more.&lt;br /&gt;The context and entry groups we leave as they were since they can be very diverse and we don't want any restrictions there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Afterthought&lt;/span&gt;&lt;br /&gt;With the discovery of the verbose flag for regex it sure became a lot easier to read these kinds of expressions, so that was an encouraging discovery.&lt;br /&gt;There are still some things that could be done with the expression. For example the context group could be entirely optional which would impact the delimiters etc, so that might be material for a second post in the future if I end up going there.&lt;br /&gt;My opinions of regular expressions have slightly improved after doing this, but I still find it rather crude when you want to do some more "complex" things so there is still a long way to go before I become a convert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let me know in the comments what you thought. Did it give you anything even though it was very basic?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-6436596234644211347?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/6436596234644211347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2012/01/regular-expressions-learning-by-doing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/6436596234644211347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/6436596234644211347'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2012/01/regular-expressions-learning-by-doing.html' title='Regular Expressions: Learning by doing'/><author><name>Henrik Poulsen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/--c3K0OpJZ2s/AAAAAAAAAAI/AAAAAAAAACw/w7bDVwT_ahs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-7858641916980656923</id><published>2010-12-16T12:28:00.000+01:00</published><updated>2012-01-12T19:17:33.936+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='xDelia'/><category scheme='http://www.blogger.com/atom/ns#' term='Behave'/><category scheme='http://www.blogger.com/atom/ns#' term='A*'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><category scheme='http://www.blogger.com/atom/ns#' term='Behavior tree'/><category scheme='http://www.blogger.com/atom/ns#' term='Behaviour tree'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinding'/><category scheme='http://www.blogger.com/atom/ns#' term='Unity3d'/><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='Csharp'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Mind Sway'/><category scheme='http://www.blogger.com/atom/ns#' term='Unity 3d'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Astar'/><title type='text'>Portfolio Entry: Mind Sway</title><content type='html'>&lt;span style="font-size: large;"&gt;About&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="http://dragonspawn.se/wp-content/uploads/2010/12/Mind-Sway.png"&gt;&lt;img alt="" class="size-medium wp-image-166 alignright" height="253" src="http://dragonspawn.se/wp-content/uploads/2010/12/Mind-Sway-300x253.png" title="Mind Sway" width="300" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Mind Sway is a prototype Facebook game developed by me for &lt;a href="http://xdelia.org/"&gt;xDelia&lt;/a&gt;, my employer May 2010 - February 2011.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Purpose&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Simply put, the goal of this game is to help the person that plays it become more financially responsible. To facilitate this goal Mind Sway is developed as a platform for testing and improving financial capability in people. The desire is that the game will contain an avatar which is semi-autonomous and can be controlled by the player, but which can end up making horrible&amp;nbsp;decisions due to high impulsiveness, and other factors. The player can then opt to participate in minigames aimed at the factors the avatar is poor at and at the same time improve this factor in themselves as well, by implementing scientifically tested tasks which has the desired results.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;Technology&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;Implemented in Unity3d&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;Utilizes the &lt;a href="http://eej.dk/angryant/behave/"&gt;Behave library&lt;/a&gt; for behavior trees used by all characters in the game.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="http://www.arongranberg.com/unity/a-pathfinding/"&gt;A* Pathfinding library&lt;/a&gt; for all pathing in the game.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;MySQL for the storing of all user data.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;Facebook API for identifying users and getting any pertinent information (such as finding out which friends the player has whom are playing the game as well)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;Media&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" height="100" style="height: 390px; width: 640px;" width="100"&gt;&lt;param name="allowFullScreen" value="true" /&gt;        &lt;param name="allowScriptAccess" value="always" /&gt;        &lt;param name="src" value="http://www.youtube.com/v/YxRmUsuCnSE?version=3" /&gt;        &lt;param name="allowfullscreen" value="true" /&gt;        &lt;embed style="height: 390px; width: 640px;" type="application/x-shockwave-flash" width="100" height="100" src="http://www.youtube.com/v/YxRmUsuCnSE?version=3" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-7858641916980656923?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/7858641916980656923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2010/12/portfolio-entry-mind-sway.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7858641916980656923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7858641916980656923'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2010/12/portfolio-entry-mind-sway.html' title='Portfolio Entry: Mind Sway'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-1333009490601857257</id><published>2010-12-06T18:48:00.000+01:00</published><updated>2012-01-12T19:17:33.927+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Epic'/><category scheme='http://www.blogger.com/atom/ns#' term='cook'/><category scheme='http://www.blogger.com/atom/ns#' term='Epic Games'/><category scheme='http://www.blogger.com/atom/ns#' term='forums'/><category scheme='http://www.blogger.com/atom/ns#' term='Scripts'/><category scheme='http://www.blogger.com/atom/ns#' term='maplist'/><category scheme='http://www.blogger.com/atom/ns#' term='UDKGame'/><category scheme='http://www.blogger.com/atom/ns#' term='CookedPC'/><category scheme='http://www.blogger.com/atom/ns#' term='UnrealScript'/><category scheme='http://www.blogger.com/atom/ns#' term='cooking'/><category scheme='http://www.blogger.com/atom/ns#' term='Unreal Development Kit'/><category scheme='http://www.blogger.com/atom/ns#' term='Unreal Frontend'/><category scheme='http://www.blogger.com/atom/ns#' term='UDK'/><category scheme='http://www.blogger.com/atom/ns#' term='forum'/><category scheme='http://www.blogger.com/atom/ns#' term='Frontend'/><title type='text'>Cooking for UDK</title><content type='html'>I attempted to cook an alpha version of my UDK Game, Zombie Road, this weekend but soon ran into problems with missing scripts and packages. So here is a small check list of things that needs to be done to fix it, beyond adding things to the .ini files.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Compile game in frontend.&lt;/li&gt;&lt;li&gt;Cook game, don't forget adding your maps to the maplist.&lt;/li&gt;&lt;li&gt;Go to your UDKGame\Scripts folder and copy your game's .u file, in my case ZombieRoad.u, to UDKGame\CookedPC&lt;/li&gt;&lt;li&gt;Copy all used packages from UDKGame\Content to UDKGame\CookedPC which would be things like maps, weapons, vehicles etc.&lt;/li&gt;&lt;li&gt;Package game in Frontend.&lt;/li&gt;&lt;li&gt;Done&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Up to step 2 is easy to find. Step 3 you can find on the UDK forums if you do the correct searches. Step 4 is trickier.&lt;br /&gt;Hopefully this saves someone else the trouble of finding this out the hard way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-1333009490601857257?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/1333009490601857257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2010/12/cooking-for-udk.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1333009490601857257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1333009490601857257'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2010/12/cooking-for-udk.html' title='Cooking for UDK'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-864453230152357486</id><published>2010-11-23T18:50:00.000+01:00</published><updated>2012-04-04T21:38:46.966+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UDK'/><category scheme='http://www.blogger.com/atom/ns#' term='Epic Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><title type='text'>Portfolio Entry: Zombie Road [WIP]</title><content type='html'>&lt;a href="http://dragonspawn.se/wp-content/uploads/2010/11/incglow.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img alt="" class="size-medium wp-image-133 alignright" height="258" src="http://dragonspawn.se/wp-content/uploads/2010/11/incglow-300x258.jpg" title="incglow" width="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Foreword&lt;/span&gt;&lt;br /&gt;A collaborative project by me and &lt;a href="http://hugeanticpeanut.deviantart.com/"&gt;Rasmus Welin&lt;/a&gt; done with &lt;a href="http://www.udk.com/"&gt;UDK, Unreal Development Kit&lt;/a&gt;.&amp;nbsp;I mainly handle all the code and Rasmus is in charge of of modelling, level editing etc. This post will represent the current state of the game and will be updated with time as new features are added to the game. For posts about the continued development on this game see the&amp;nbsp;&lt;a href="http://dragonspawn.se/?cat=86" title="Zombie Road"&gt;Zombie Road&lt;/a&gt; category.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Purpose&lt;/span&gt;&lt;br /&gt;The purposes for doing this project are several.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Having a proper game in my portfolio&lt;/li&gt;&lt;li&gt;Gaining experience with Unreal Script&lt;/li&gt;&lt;li&gt;Gaining more experience in general game programming, since prior experiences have been with low level implementations.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;Concept&lt;/span&gt;&lt;/div&gt;Zombie Road is a co-op first person shooter. It is inspired by Killing floor, Left 4 Dead and other first person Zombie shooters, but also things from games like Ultima Online when it comes to character progression. Rather than using the level system it will be based upon improvement of individual skillsets. It will not contain player vs player gameplay and will be purely focused on co-op survival.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Features &amp;amp; Technology&lt;/span&gt;&lt;br /&gt;This is a list of features that currently exists in the game and any particular technologies used to implement them.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Scaleform UI&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Menus&lt;/li&gt;&lt;li&gt;HUD&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistent user data&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;User data is stored on &lt;a href="http://code.google.com/appengine/"&gt;GAE, Google App Engine&lt;/a&gt; (character progress etc).&amp;nbsp;GAE is also used for the server listings for the server browser.&lt;/li&gt;&lt;li&gt;UDK's steam integration is used to fetch the player's account ID. This is what is used to keep track of unique players without the need of our own account logic.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Server Browser&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Implemented my own server browser with the help of GAE and scaleform. The servers are posted to and fetched from a GAE datastore and presented in a scaleform menu.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Wave based gameplay&lt;/strong&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Waves are easily configured in the UDK editor so you can specify things like:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Wave count&lt;/li&gt;&lt;li&gt;Amount of mobs for each wave (goal condition)&lt;/li&gt;&lt;li&gt;How many mobs are allowed to be spawned at any one time&lt;/li&gt;&lt;li&gt;Types of mobs to spawn&lt;/li&gt;&lt;li&gt;Frequency of mobs. Either by percent or a fixed number (for example 30% for certain mobs and that only 1 of a certain type of mob is allowed to be spawned (boss)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;Media&lt;/span&gt;&lt;/div&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" height="300" width="600"&gt;&lt;param name="allowFullScreen" value="true" /&gt;   &lt;param name="allowscriptaccess" value="always" /&gt;   &lt;param name="src" value="http://www.youtube.com/v/59ATO-E1rsg?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" /&gt;   &lt;param name="allowfullscreen" value="true" /&gt;   &lt;embed type="application/x-shockwave-flash" width="600" height="300" src="http://www.youtube.com/v/59ATO-E1rsg?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-q02igFeEmy4/Tw7Qqgoq97I/AAAAAAAAAFY/TYY24Q4KZQw/s1600/ZoR_editor_spawns.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="120" src="http://4.bp.blogspot.com/-q02igFeEmy4/Tw7Qqgoq97I/AAAAAAAAAFY/TYY24Q4KZQw/s400/ZoR_editor_spawns.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Editing wave information in editor&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Feel free to comment below.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-864453230152357486?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/864453230152357486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2010/11/foreword-collaborative-project-by-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/864453230152357486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/864453230152357486'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2010/11/foreword-collaborative-project-by-me.html' title='Portfolio Entry: Zombie Road [WIP]'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-q02igFeEmy4/Tw7Qqgoq97I/AAAAAAAAAFY/TYY24Q4KZQw/s72-c/ZoR_editor_spawns.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-1014494592127055249</id><published>2010-04-23T19:10:00.000+02:00</published><updated>2012-01-12T19:19:56.191+01:00</updated><title type='text'>Compiling a run-time generated DirectX 11 shader</title><content type='html'>&lt;div&gt;I recently got the idea to try to create a procedural shader system for DirectX 11. This basically entails that one simply throws a mesh at the shader generator and it generates a customized shader for this mesh that suits it perfectly.&lt;br /&gt;I knew it is being done in high-end game engines but I had no idea how one actually does it. I spent quite a lot of time on google trying to find this, but it basically looks like some universal secret even though it actually is quite simple. So I played around with it a bit and I managed to get it to work in the end. So the follow code snippet is the procedure I used for getting it to work, probably a whole load of other ones out there.&lt;br /&gt;Just hope this saves other people the same frustrations I had for a while.&lt;br /&gt;&lt;pre class="brush: cpp"&gt;void GenerateShader()&lt;br /&gt;{&lt;br /&gt;    ostringstream shader;&lt;br /&gt;&lt;br /&gt;    // Basic Vertex Shader&lt;br /&gt;    shader &amp;lt;&amp;lt; "float4 BasicVS( float4 Pos : POSITION ) : SV_POSITION" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "{" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; " return Pos;" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "}" &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;    // Basic Pixel Shader&lt;br /&gt;    shader &amp;lt;&amp;lt; "float4 BasicPS( float4 Pos : SV_POSITION ) : SV_Target" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt;"{" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt;" return float4( 1.0f, 1.0f, 1.0f, 1.0f );" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt;"}" &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;    // A standard DirectX 10 technique&lt;br /&gt;    shader &amp;lt;&amp;lt; "technique10 DefaultTechnique" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "{" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; " pass p0" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; " {" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "  SetGeometryShader(NULL);" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "  SetVertexShader(CompileShader(vs_4_0, BasicVS()));" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "  SetPixelShader(CompileShader(ps_4_0, BasicPS()));" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; " }" &amp;lt;&amp;lt; endl;&lt;br /&gt;    shader &amp;lt;&amp;lt; "}" &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;    // This is where the "magic" is at. Grab the char* from your stringstream&lt;br /&gt;    // and feed it into D3DCompile() along with whatever other parameters you usually send it.&lt;br /&gt;&lt;br /&gt;    ID3DBlob* errorBlob;&lt;br /&gt;    unsigned int shaderSize = shader.str().size() * sizeof(char);&lt;br /&gt;    HRESULT hr = D3DCompile(shader.str().c_str(), shaderSize, "none", 0, 0, "DefaultTechnique", "fx_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &amp;amp;blob_, &amp;amp;errorBlob);&lt;br /&gt;&lt;br /&gt;    if( FAILED(hr) )&lt;br /&gt;    {&lt;br /&gt;        OutputDebugStringA( (char*)errorBlob-&amp;gt;GetBufferPointer() );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    SAFE_RELEASE( errorBlob );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;So now all that is left is 99.9% of the work to actually switch case together a shader that supports all the things your different meshes might need.&lt;br /&gt;Maybe I will post something on that later when I manage to make a dent in that daunting task :p&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-1014494592127055249?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/1014494592127055249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2010/04/i-recently-got-idea-to-try-to-create.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1014494592127055249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1014494592127055249'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2010/04/i-recently-got-idea-to-try-to-create.html' title='Compiling a run-time generated DirectX 11 shader'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-2886995628781743734</id><published>2010-02-03T13:28:00.000+01:00</published><updated>2012-01-12T19:17:33.932+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='normal mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='HLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Relief'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='parallax mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='relief mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='DX10'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallax'/><title type='text'>Portfolio Entry: Relief &amp; Parallax Mapping</title><content type='html'>&lt;object class="alignright size-medium wp-image-140" height="175" width="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FNnPFLb6YOg?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1"&gt; &lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt; &lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt; &lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FNnPFLb6YOg?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="175"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;I implemented this during a weekend, mostly because relief mapping has always interested me. Decided to toss in parallax mapping as well when I was "in the neighborhood", and a little normal mapping for good measure as well. This is the basic implementation of both techniques with no optimizations or artifact corrections.&lt;br /&gt;&lt;br /&gt;Here is a small code snippet. Nothing special, just don't like to not show code.&lt;br /&gt;&lt;pre class="brush: cpp"&gt;void GenerateShader()&lt;br /&gt;float ray_intersect_relief(in float2 orig, in float2 dir)&lt;br /&gt;{&lt;br /&gt;    const float max_num_linear_steps = 20;&lt;br /&gt;    const float max_num_binary_steps = 5;&lt;br /&gt;    float depth = 0.0f;&lt;br /&gt;    float size = 1.0f / max_num_linear_steps;&lt;br /&gt;&lt;br /&gt;    // Attempt to find the first intersection against the relief map with a linear search.&lt;br /&gt;    // This is because binary search can easily miss topography.&lt;br /&gt;    for(int i = 0; i &amp;lt; max_num_linear_steps - 1; i++)&lt;br /&gt;    {&lt;br /&gt;        float4 t = gTexRelief.Sample(textureSampler, orig + dir * depth);&lt;br /&gt;        if(depth &amp;lt; t.r)&lt;br /&gt;            depth += size;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // A binary search to try and find the "edge" of the closest intersection point&lt;br /&gt;    for(int j = 0; j &amp;lt; max_num_binary_steps; j++)&lt;br /&gt;    {&lt;br /&gt;        size *= 0.5f;&lt;br /&gt;        float4 t = gTexRelief.Sample(textureSampler, orig + dir * depth);&lt;br /&gt;        if(depth &amp;lt; t.r)&lt;br /&gt;            depth += 2*size;&lt;br /&gt;        depth -= size;&lt;br /&gt;    }&lt;br /&gt;    return depth;&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/3407439644292467598-2886995628781743734?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/2886995628781743734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2010/02/portfolio-entry-relief-parallax-mapping.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/2886995628781743734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/2886995628781743734'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2010/02/portfolio-entry-relief-parallax-mapping.html' title='Portfolio Entry: Relief &amp;amp; Parallax Mapping'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-7263009363858956470</id><published>2010-01-09T19:23:00.000+01:00</published><updated>2012-01-12T19:26:33.129+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='deferred rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='deferred'/><category scheme='http://www.blogger.com/atom/ns#' term='deferred shading'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='SSAO'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='parallax map'/><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='parallax mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='relief mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='Bad excuse for not blogging more often'/><title type='text'>100 days later (give or take a few)</title><content type='html'>So... It's been a while.&lt;br /&gt;&lt;br /&gt;Life is good, excluding the torment of a dying molar, and not a whole lot has happened in this time of silence. Work has been good, but has not really been related to what I wanted to write about in this blog so I opted to stay quiet for a while.&lt;br /&gt;&lt;br /&gt;Lately I started looking at available positions in various game companies and it was somewhat upsetting to notice that you are not really suited for filling any position other than as a junior. So I basically decided that I really needed to do something about my portfolio. It was a while back that I decided this, but there was&amp;nbsp;Christmas&amp;nbsp;and stuff in the way so I haven't really started doing stuff until now. Now it has begun though.&lt;br /&gt;&lt;br /&gt;The general idea is that I will simply implement all the various things I have always wanted to try and then post the results in the portfolio section (hopefully with some binaries as well). The types of thing I will be implementing will mostly be 3D graphics related, since this is the area I always seem to find myself drooling over. But there will also be some other stuff like resource management and so on.&lt;br /&gt;&lt;br /&gt;I have already implemented the first thing I will be putting on the portfolio (relief mapping) and it will be going up there shortly (probably not today though). Other things to be expected, in the very near future, are things like, just to name a few: Parallax mapping, Screen Space Ambient Occlusion, Deferred rendering.&lt;br /&gt;&lt;br /&gt;If one refuses to work for any other industry one can only blame&amp;nbsp;themselves&amp;nbsp;for not doing everything in their power to be worthy of working there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-7263009363858956470?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/7263009363858956470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2010/01/100-days-later-give-or-take-few.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7263009363858956470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7263009363858956470'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2010/01/100-days-later-give-or-take-few.html' title='100 days later (give or take a few)'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-1623642486527572616</id><published>2009-09-30T12:23:00.000+02:00</published><updated>2012-01-12T19:26:33.119+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xDelia'/><category scheme='http://www.blogger.com/atom/ns#' term='School'/><category scheme='http://www.blogger.com/atom/ns#' term='College'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Leave of Absence'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><category scheme='http://www.blogger.com/atom/ns#' term='fresh prince lyrics'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Blekinge'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='Quantum Studios'/><category scheme='http://www.blogger.com/atom/ns#' term='Högskola'/><category scheme='http://www.blogger.com/atom/ns#' term='Germany'/><category scheme='http://www.blogger.com/atom/ns#' term='I got an effin&apos; job'/><title type='text'>Lots of changes</title><content type='html'>Yeah so I went to the job meeting. 15 minutes into the meeting I got the job! So I am now a full time employee ( for 6 months at least ) at the &lt;a href="http://www.xdelia.org/" target="_blank" title="xDelia Project"&gt;xDelia project&lt;/a&gt; as a game programmer.&lt;br /&gt;&lt;br /&gt;I start tomorrow already, so it is going a million miles an hour at the moment. I am headed over to Germany, Tuesday - Thursday, next week for some work related workshop as well. So lots of things happening indeed.&lt;br /&gt;&lt;br /&gt;So now there's lots to do. I need to fill out some papers for the educational part of school and report that I am taking a leave of absence. Then of course there is also contract signing and all matter of other stuff I need to fix with the job (have to hunt down a computer for my room, and then of course have someone tell me where my room is). Not to mention having to report to CSN my leave of absence as well so they'll stop sending me money, but for some reason you need to know how much you will earn, which I don't know yet, before you are allowed to report a leave of absence. Seems kind of silly to me.&lt;br /&gt;&lt;blockquote&gt;Now this is the story all about how&lt;br /&gt;My life got flipped, turned upside down&lt;/blockquote&gt;&lt;br /&gt;Kinda how it feels. This will pretty much change everything I was doing. No more school for a while of course and iPhone coding will be put on the back-burner again. It is, however, all good. I get what I value most. Experience. With the economy as it is there is no way in Helsinki that any game company would hire someone that has no prior work experience. So this job will be worth a lot for my CV. Hopefully it will be for at least a year. Generally looks better in the resumé than 6 months, I say anyway.&lt;br /&gt;&lt;br /&gt;So who's turn is it next now then from Quantum Studios?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-1623642486527572616?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/1623642486527572616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/09/lots-of-changes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1623642486527572616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1623642486527572616'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/09/lots-of-changes.html' title='Lots of changes'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-3263193929440800029</id><published>2009-09-25T17:18:00.000+02:00</published><updated>2012-01-12T19:28:53.783+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='School'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><title type='text'>Full speed ahead... into nothing?</title><content type='html'>Yeah so I'm still full up with all the school assignments. My little web server is slowly getting somewhere, if it will be done within a reasonable amount of time is yet unknown.&lt;br /&gt;&lt;br /&gt;I recieved what could seem to be a job offer the other day. I don't really know what terms are involved yet (pay, hours, duration, etc) so trying to not get my hopes up. Going to meet up with the person that contacted me on tuesday and discuss it. Hopefully it will be something worthwhile. I really want an excuse to cut down on college for a while.&lt;br /&gt;&lt;br /&gt;I really hope it will lead somewhere, but no point in obsessing about it until tuesday.&lt;br /&gt;&lt;br /&gt;Back to C and continue with the web server a while longer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-3263193929440800029?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/3263193929440800029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/09/full-speed-ahead-into-nothing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/3263193929440800029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/3263193929440800029'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/09/full-speed-ahead-into-nothing.html' title='Full speed ahead... into nothing?'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-2199737140678151599</id><published>2009-09-18T13:23:00.000+02:00</published><updated>2012-01-12T19:29:37.818+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Keendra'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><category scheme='http://www.blogger.com/atom/ns#' term='Carmack'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Assignment'/><title type='text'>Web server</title><content type='html'>So I started on the web server assignment. I can tell already that this is gonna take plenty of hours to finish. So the plan is to continue working on that today. Hopefully I will learn something from this that I will actually need some day.&lt;br /&gt;&lt;br /&gt;Also got rejected from the job I applied to the other day. Kinda silly that companies won't even consider people with no prior job experience, where will the next Carmack come from then? ( did keendra smile now? ) :p&lt;br /&gt;&lt;br /&gt;There should be a law on companies having to offer junior positions if their corporation is larger than x people =P As long as there is senior staff there it shouldn't matter all that much if some of the positions gets filled by post-grads.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-2199737140678151599?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/2199737140678151599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/09/web-server.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/2199737140678151599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/2199737140678151599'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/09/web-server.html' title='Web server'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-3874747555066899219</id><published>2009-09-16T15:35:00.000+02:00</published><updated>2012-01-12T19:30:14.465+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='School'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><category scheme='http://www.blogger.com/atom/ns#' term='Assignment'/><category scheme='http://www.blogger.com/atom/ns#' term='Bad excuse for not blogging more often'/><title type='text'>No news is good news?</title><content type='html'>Yeah so I haven't written in a while. Been busy with school so there hasn't been much progress with the "furthering of my career" aspect of my life.&lt;br /&gt;&lt;br /&gt;One of the courses I am taking is assignment oriented, so there is no exam, which makes the assignments very time consuming. So I have been working alot at that.&lt;br /&gt;&lt;br /&gt;After these few weeks of being back to school I have convinced myself that I really need to try harder to find a job. School is nice and stuff, but I feel ready to make a name for myself and gain proper work experience.&lt;br /&gt;&lt;br /&gt;So I updated my portfolio a bit today (just added info about my Bachelor's thesis) and found a job I am going to apply for as well. So the rest of the day will be dedicated to three tasks.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Write a cover letter and apply for the job.&lt;/li&gt;&lt;li&gt;Start looking at the next assignment.&lt;/li&gt;&lt;li&gt;Go to Amiralen (a local shopping center) and do some grocery shopping (Dragons need food apparently).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;So yeah, thats about it.&lt;br /&gt;&lt;br /&gt;Give me a job!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-3874747555066899219?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/3874747555066899219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/09/no-news-is-good-news.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/3874747555066899219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/3874747555066899219'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/09/no-news-is-good-news.html' title='No news is good news?'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-7292336466103614356</id><published>2009-08-30T19:30:00.000+02:00</published><updated>2012-01-12T19:30:53.869+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Network'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='remote'/><category scheme='http://www.blogger.com/atom/ns#' term='freevo'/><category scheme='http://www.blogger.com/atom/ns#' term='UDP'/><title type='text'>Networking Done</title><content type='html'>The UDP networking is now done for my Freevo remote app, tested it with my Freevo server earlier and it works perfectly. Just have to finish up the Settings tab, which will most likely be done today, so that one can specify what host and port it should connect to and stuff like that. Then it’s just the final icons and intensive bug testing and tweaking left to do. Making this app has been a great help in putting the stuff I have learned in the book into practice. &lt;br /&gt;So school starts again tomorrow. Or well not really. I’m just going to talk to someone about what courses I decided on for my master’s education (since you get to pick 90% of the curriculum yourself). The courses don’t actually start until Tuesday. Will be nice to start meeting other people again, rather than sitting here cooped up in Karlskrona with nobody we know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-7292336466103614356?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/7292336466103614356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/08/networking-done.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7292336466103614356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7292336466103614356'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/08/networking-done.html' title='Networking Done'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-3977939292061195255</id><published>2009-08-29T10:29:00.000+02:00</published><updated>2012-01-12T19:32:43.850+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Andreas Nilsson'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='frezorer'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='freevo'/><category scheme='http://www.blogger.com/atom/ns#' term='Rasmus Welin'/><category scheme='http://www.blogger.com/atom/ns#' term='hugeanticpeanut'/><category scheme='http://www.blogger.com/atom/ns#' term='RPG'/><title type='text'>Art update</title><content type='html'>So I found some artists to help me out with my apps. &lt;a href="http://frezorer.deviantart.com/" target="_blank" title="Andrea's Deviant page"&gt;Andreas Nilsson&lt;/a&gt; is making some icons for the Freevo remote app. &lt;a href="http://hugeanticpeanut.deviantart.com/" target="_blank" title="Rasmus' Deviant page"&gt;Rasmus Welin&lt;/a&gt; is learning how to make sprite characters for the usage in the JRPG I mentioned previously. So now I just have to get out of procrastination mode and continue work on the apps.&lt;br /&gt;&lt;br /&gt;Starting the Masters education on Monday at BTH, so I don't know how much time there will be for programming on these things during the week, but there's always the weekends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-3977939292061195255?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/3977939292061195255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/08/art-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/3977939292061195255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/3977939292061195255'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/08/art-update.html' title='Art update'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-7393109771730273512</id><published>2009-08-27T11:34:00.000+02:00</published><updated>2012-01-12T19:33:05.753+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='RPG'/><title type='text'>The Battle Plan</title><content type='html'>So I have decided what my big iPhone game down the road will be. It will be a jrpg styled game, like all the “Tales of” games.&lt;br /&gt;&lt;br /&gt;This decision came after buying a game, which is similar in concept, from the app store. People were raving about how perfect and wonderful this game was etc etc.&lt;br /&gt;&lt;br /&gt;It didn’t take long to realize that people have really low standards to when it comes to games on the iPhone. Sure it isn’t a super powerful platform for games in the first place, but the products should still be held at a high standard. It lacked lots of sound effects, dialogs made no sense, made lots of contemporary comments which ruined the atmosphere (gangster rap in a medieval fantasy setting doesn’t make sense now does it?), worthless controls, annoying background music. The list just goes on and on and still almost all of those which have commented on this game gave the score 5/5.&lt;br /&gt;&lt;br /&gt;So that was when I decided that a jrpg is what I would, to show people how a proper game should be like on the iPhone. This will probably be years in the making, but I have time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-7393109771730273512?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/7393109771730273512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/08/battle-plan.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7393109771730273512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7393109771730273512'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/08/battle-plan.html' title='The Battle Plan'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-5391678860385253626</id><published>2009-08-17T11:45:00.000+02:00</published><updated>2012-01-12T19:33:38.877+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>iPhone ahoy!</title><content type='html'>Yeah. So I finally started reading the iPhone book the other day. So far I have learned a whole bunch of cool stuff when it comes to making graphical interfaces and I must say that it was easier and more streamlined than I thought it would be.&lt;br /&gt;So soon maybe I am qualified to make my first in-game menu for a game ;)&lt;br /&gt;Check back soon for more about my progress, if it pleases you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-5391678860385253626?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/5391678860385253626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/08/iphone-ahoy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/5391678860385253626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/5391678860385253626'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/08/iphone-ahoy.html' title='iPhone ahoy!'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-5335946798780484317</id><published>2009-08-07T14:13:00.000+02:00</published><updated>2012-01-12T19:34:54.614+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tkinter'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Karlskrona'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Update of small importance.</title><content type='html'>So I haven’t posted anything in a while. Mainly because nothing much programming related has happened.&lt;br /&gt;I moved in with my girlfriend to our new apartment in Karlskrona, KNA, last weekend and since then we have generally been busy with getting the place in order and exploring KNA.&lt;br /&gt;I did however finish one more assignment in the “Multimedia programming with Python”. Which sounds much more fun than it actually is. The course recommends the usage of Tkinter, which I find to be extremely boring and feels very old and poorly designed. Not to mention some problems it seems to have with Python’s garbage collector.&lt;br /&gt;With the assignment I submitted yesterday I chose to declare a function that would load some images and display them on the screen, but for some unexplainable reason the images just wouldn’t show on the screen although the window would get the correct size to fit every image.&lt;br /&gt;So after an hour of two of debugging and googling I found the problem with the following snippet of code:&lt;br /&gt;&lt;blockquote&gt;image = Image.open("python.jpg")     &lt;br /&gt;tkpicture = ImageTk.PhotoImage(image)      &lt;br /&gt;label_image = Label(self.parent, image=tkpicture)&lt;/blockquote&gt;This code is completely appropriate and loads an image from file and works in all cases, except when it is used within a function.&lt;br /&gt;Apparently the line Label(self.parent, image=tkpicture) does not trigger python to increment the reference count of tkpicture. So when one returns from the loadImage() function the garbage collector thinks tkpicture is unused and therefore deletes it.&lt;br /&gt;The “solution” to this problem is to do the following:&lt;br /&gt;&lt;blockquote&gt;label_image = Label(self.parent, image=tkpicture)     &lt;br /&gt;label_image.image = tkpicture&lt;/blockquote&gt;This seems infinitely inane since assigning tkpicture to image is what the Label constructor is doing already. I highly doubt that there isn’t a better way of doing this. Not to mention that doing this prevents Python from cleaning up tkpicture by itself. So one have to make sure to do this:&lt;br /&gt;&lt;blockquote&gt;label_image.image = o&lt;/blockquote&gt;Otherwise one would be leaking memory due to that extra reference.&lt;br /&gt;Just one final assignment to be done and then I am done with this course, and a happy day it will be.&lt;br /&gt;&lt;br /&gt;Going to start reading the iPhone book soon. That I can guarantee will be a much more pleasant experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-5335946798780484317?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/5335946798780484317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/08/update-of-small-importance.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/5335946798780484317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/5335946798780484317'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/08/update-of-small-importance.html' title='Update of small importance.'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-8701216546200386982</id><published>2009-07-24T17:38:00.000+02:00</published><updated>2012-01-12T19:35:15.693+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Objective-C Progress</title><content type='html'>&lt;div&gt;I picked up a couple of books the other day to help me out with learning Objective-C, objc, and developing for the iPhone. I finished reading the objc one today, and I must say that it was very good. I had tried doing some tutorials on objc before I read this book and it generally left me with more unanswered questions than I had from the start. &lt;br /&gt;Since I am a C++ programmer through and through it is tricky to pick up a new language that looks similar, but works completely different. I was having more issues with objc than with learning Python.&lt;br /&gt;However, as I stated, it feels a lot better now having read the objc book. It’s named &lt;a href="http://amzn.com/1430218150"&gt;"Learn Objective-C on the Mac"&lt;/a&gt; and I recommend it to anyone that would wish to learn objc. However one should know that this is intended for people that already know some other programming language, so it isn’t aimed towards beginners.&lt;br /&gt;The next step is to read the iPhone book, named &lt;a href="http://amzn.com/1430224592"&gt;"Beginning iPhone 3 Development: Exploring the iPhone SDK"&lt;/a&gt;, which should prove to be equally good and even more relevant to my goal of making iPhone games (duh!).&lt;br /&gt;So check back in a couple of days and maybe there is something interesting to be seen.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-8701216546200386982?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/8701216546200386982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/07/objective-c-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/8701216546200386982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/8701216546200386982'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/07/objective-c-progress.html' title='Objective-C Progress'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-7799292936443131872</id><published>2009-07-23T20:23:00.000+02:00</published><updated>2012-01-12T19:35:36.076+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Keendra'/><category scheme='http://www.blogger.com/atom/ns#' term='Karlskrona'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>So... It happened.</title><content type='html'>&lt;div&gt;To the glee of some (&lt;a href="http://keendra.com/"&gt;Keendra&lt;/a&gt;) and the despair of others (mostly me) I ended up starting a blog.&lt;br /&gt;Thought it was time to let people, who are interested, what I’m up to. However this blog will be focused on my aspirations of becoming a game programmer and all which that entails.&lt;br /&gt;Currently I am on summer break. Got my Bachelor’s Degree in Computer Science, with a specialization in Game Programming, in June and I’m going straight for my Master’s in Computer Science, which starts in September.&lt;br /&gt;On the agenda currently I am moving to Karlskrona, Sweden in a week with my girlfriend. Other than that I have started reading up on Objective-C/iPhone programming with the hopes of making some cool iPhone games in the near future with some friends, and maybe make some money.&lt;br /&gt;Other than that there isn’t much to report at this time. &lt;br /&gt;Check back later for more =P&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-7799292936443131872?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/7799292936443131872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/07/so-it-happened.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7799292936443131872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7799292936443131872'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/07/so-it-happened.html' title='So... It happened.'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-786747639998688746</id><published>2009-06-01T19:38:00.000+02:00</published><updated>2012-04-28T16:39:48.140+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Portfolio Entry: Bachelor's Thesis "Potential of GPU Based Hybrid RayTracing For Real-Time Games"</title><content type='html'>&lt;h1&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3z44K4oSD_M/T5wA467VkDI/AAAAAAAAAGE/E9CxZCsxWVI/s1600/rayTracer.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="237" src="http://3.bp.blogspot.com/-3z44K4oSD_M/T5wA467VkDI/AAAAAAAAAGE/E9CxZCsxWVI/s320/rayTracer.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Abstract&lt;/h1&gt;&lt;br /&gt;The development of Graphics Hardware Technology is blazing fast, with new and more improved models, that out spec the previous generations with leaps and bounds, before one has the time to digest the potential of the previous generations computing power. With the progression of this technology the computer games industry has always been quick to adapt this new power and all the features that emerge as the graphic card industry learn what the customers need from their products. The current generations of games use extraordinary visual effects to heighten the immersion into the games, all of which is thanks to the constant progress of the graphics hardware, which would have been an impossibility just a couple of years ago.&lt;br /&gt;&lt;br /&gt;Ray tracing has been used for years in the movie industry for creation of stunning special effects and whole movies completely made in 3D. This technique for giving realistic imagery has always been for usage exclusively for non-interactive entertainment, since this way of rendering an image is extremely expensive when it comes to computations. To generate one single image with Ray Tracing you might need several hundred millions of calculations, which so far haven’t been proven to work in real-time situations, such as for games.&lt;br /&gt;&lt;br /&gt;However, due to the continuous increase of processing power in Graphical Processing Units, GPUs, the limits of what can, and cannot, be done in real-time is constantly shifting further and further into the realm of possibility. So this thesis focuses upon finding out just how close we are to getting ray tracing into the realm of real-time games.&lt;br /&gt;&lt;br /&gt;Two tests were performed to find out the potential a current (2009) high-end computer system has when it comes to handling a raster - ray tracing hybrid implementation. The first test is to see how well a modern GPU handles rendering of a very simple scene with phong shading and ray traced shadows without any optimizations. And the second test is with the same scenario, but this time done with a basic optimization; this last test is to illustrate the impact that possible optimizations have on ray tracers. These tests were later compared to Intel’s results with ray tracing Enemy Territory: Quake Wars.&lt;br /&gt;&lt;br /&gt;If you wish to read the thesis you can find it &lt;a href="http://www.bth.se/fou/cuppsats.nsf/6753b78eb2944e0ac1256608004f0535/b27da4d4733a0234c12575c90044f834?OpenDocument" target="_blank" title="Bachelor's thesis"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-786747639998688746?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/786747639998688746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/06/portfolio-entry-bachelor-thesis-of-gpu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/786747639998688746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/786747639998688746'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/06/portfolio-entry-bachelor-thesis-of-gpu.html' title='Portfolio Entry: Bachelor&amp;#39;s Thesis &amp;quot;Potential of GPU Based Hybrid RayTracing For Real-Time Games&amp;quot;'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-3z44K4oSD_M/T5wA467VkDI/AAAAAAAAAGE/E9CxZCsxWVI/s72-c/rayTracer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-1433075056825045673</id><published>2009-06-01T19:35:00.000+02:00</published><updated>2012-01-12T19:36:40.881+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Network'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><category scheme='http://www.blogger.com/atom/ns#' term='horror'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Blekinge'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='Quantum Studios'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Portfolio Entry: Transcendence</title><content type='html'>&lt;object class="alignright size-medium wp-image-140" height="233" width="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vlvpfIK0pzo?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vlvpfIK0pzo?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="233"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;This is a two player co-operative horror game that me and my classmates&amp;nbsp;made as our final project in our Bachelors education in Computer Science. We also competed in the Swedish Game Awards -09 with this game.&lt;br /&gt;&lt;br /&gt;My role in this project&amp;nbsp;was as the Project Leader and the 3D Engine programmer. Since we have had bad experiences with existing 3D Engines I decided to start creating my own 3D engine for the game about 6 months before we started working on the actual game. As of the end of march 2009 the engine consisted of 12,000 LOC.&lt;br /&gt;&lt;br /&gt;Other than this I also worked on modelling the house (which was made in 3D Studio Max) and spent much time completing our in-house Collada parser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-1433075056825045673?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/1433075056825045673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2009/06/portfolio-entry-transcendence.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1433075056825045673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/1433075056825045673'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2009/06/portfolio-entry-transcendence.html' title='Portfolio Entry: Transcendence'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-8193882438091110216</id><published>2008-05-01T19:33:00.000+02:00</published><updated>2012-01-12T19:37:36.754+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Portfolio Entry: The Dreamer</title><content type='html'>&lt;object class="alignright size-medium wp-image-140" height="233" width="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/doCYR573noc?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/doCYR573noc?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="233"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;A class project made by me an my classmates (9 people) during 3 weeks in May 2008 for a Game Production course.&lt;br /&gt;&lt;br /&gt;This was coded entirely in Python and used the game engine Panda3D.&lt;br /&gt;&lt;br /&gt;My responsiblity for this project was that of Project Lead and my main implementation responsibility was coding the quest system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-8193882438091110216?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/8193882438091110216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2008/05/portfolio-entry-dreamer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/8193882438091110216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/8193882438091110216'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2008/05/portfolio-entry-dreamer.html' title='Portfolio Entry: The Dreamer'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-6321868480421410816</id><published>2008-02-01T18:31:00.000+01:00</published><updated>2012-01-12T19:37:56.727+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Portfolio Entry: Bread Cat Blaster Apathy</title><content type='html'>&lt;object class="alignright size-medium wp-image-140" height="233" width="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QmSmIdMVpdA?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QmSmIdMVpdA?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="233"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;It features Phong Shading, Normalmapping, Skinned mesh, Level parsing from XML and the main feature is the Quadtree implementation which is shown in the middle of the clip with different colors for the different splits.&lt;br /&gt;&lt;br /&gt;We used DirectX 9.0c for this project and the client was coded in C++.&lt;br /&gt;&lt;br /&gt;This game and the level editor which accompanied this game (Made by a classmate) recieved a diploma for best project in the course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-6321868480421410816?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/6321868480421410816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2008/02/portfolio-entry-bread-cat-blaster.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/6321868480421410816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/6321868480421410816'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2008/02/portfolio-entry-bread-cat-blaster.html' title='Portfolio Entry: Bread Cat Blaster Apathy'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3407439644292467598.post-7378852238642272521</id><published>2007-11-01T18:30:00.000+01:00</published><updated>2012-01-12T19:38:18.076+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BTH'/><category scheme='http://www.blogger.com/atom/ns#' term='Blekinge'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='3D Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Portfolio Entry: Walk on Terrain</title><content type='html'>&lt;object class="alignright size-medium wp-image-140" height="233" width="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/so-YWy5zx0I?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/so-YWy5zx0I?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="233"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Featuring Walking on terrain, multi-textured terrain, Phong shading and a basic particlesystem.&lt;br /&gt;&lt;br /&gt;The project was made with C++ and DirectX 9.0c&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3407439644292467598-7378852238642272521?l=www.henrikpoulsen.se' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.henrikpoulsen.se/feeds/7378852238642272521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.henrikpoulsen.se/2007/11/portfolio-entry-walk-on-terrain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7378852238642272521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3407439644292467598/posts/default/7378852238642272521'/><link rel='alternate' type='text/html' href='http://www.henrikpoulsen.se/2007/11/portfolio-entry-walk-on-terrain.html' title='Portfolio Entry: Walk on Terrain'/><author><name>Anna-Maria Eriksson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-ndR9DGJMYBM/AAAAAAAAAAI/AAAAAAAAFLg/Gcsqxvkyz0Y/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
