<?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-2062954633360869709</id><updated>2012-01-29T17:15:07.128+01:00</updated><category term='C++'/><category term='demoscene'/><category term='portfolio'/><category term='java'/><category term='IGK'/><category term='QubicGames'/><category term='thoughts'/><category term='effect'/><category term='Tools'/><category term='design'/><category term='compo'/><category term='code'/><category term='indie'/><category term='lib'/><category term='projektowanie'/><category term='misc'/><title type='text'>sobol techblog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-1219827400898618667</id><published>2012-01-29T17:15:00.000+01:00</published><updated>2012-01-29T17:15:07.136+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><title type='text'>Fake Snowflake Shadow</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Some time ago I was walking at night in a dense snow fall. I won't talk about my mood, but I was walking alone, nobody was around and I had some time to think, or rather to observe what was happening around. I was really excited about the shadows that where casted by snowflakes. They were dancing everywhere around, like small spiders running through the snow. Something beautiful, honestly. Of course, I mean shadows that are casted by something like street lamp. Now the problem is - how to simulate them? Of course we can cast each shadow accurately. But there are some obvious problems, and when I say problem I mean performance. I think I don't have to explain what problems are connected to shadowing complex particle system with multiple lights (just imagine the deferred shading with all those particles outside buffers, problems with transparency, or FR with multiple pass particle drawing, crazy). And also, there is some possibility, that you render your flakes (or even more possibly - rain) as post process. Sure! It is possible to do it in a straight way, but we wouldn't be game developers if we wouldn't look for some fakes ;) So how can we add some fancy shadows on the snow, that will look like drunk spiders? As you can expect, I'm not going to talk about any physically accurate solution. Look at the image first.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mu5K2rDoFV0/TyVgkxl51XI/AAAAAAAAE_E/t_x6kHkJa7E/s1600/schemat.png" imageanchor="1"&gt;&lt;img border="0" height="317" src="http://3.bp.blogspot.com/-mu5K2rDoFV0/TyVgkxl51XI/AAAAAAAAE_E/t_x6kHkJa7E/s400/schemat.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The upper part of the image is a 2D ortho projection of the world, the Source is our street lamp, green line is the ground. The lower part is meant to be the top-down view. As you can see, when the snowflake is close to the lamp (high), it's shadow is casted far from the center of the lamp cone, and it's movement dx1 is quite big. Then, when the snowflake falls and is close to the ground, it's movement dx2 decreases and position get's closer to the center. The situation shown here is utopia, because the flake falls straight down, with const speed. But, what it shows is that the shadow will be tending towards cone center with decreasing speed. This is a very important observation. Now, let's look at the right side. The snow is falling by some trajectory and in successive time periods it is located in P0, P1, P2 and P3 positions. The rule is quite the same, its shadow in time (T0-T3) tends towards cone center with decreasing speed, but we have to remember that this speed will not decrease monotonically, but will be varying. There even may be a situation, when T(n) is farther from cone center than T(n-1). When we look from top at the problem, we also have to add some variation in the other axis (due to air drag, the flake doesn't move straight), we can assume that shadow moves over some simple spline, directed towards S' (cone center) and with variably decreasing speed. The Lambda area is some small area around S', where shadows tend to dissapear (i think that making them bigger and more transparent would look good). You have to include this Lambda area if you don't want your shadows to dissapear suddenly. That's what I've observed in nature - flakes don't go towards strict cone center, but towards some area, because the light bulb isn't a point, but a volume.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ok, I think that the idea is simple and obvious, so now - how can we simulate this? There are many possibilities, like:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Particle system used only for shadows&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Post process stage shadowing&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Animated textures (even on low-end hardware, but I won't call any exact names ;P) with texture projection&lt;/li&gt;&lt;li style="text-align: justify;"&gt;etc.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;What you can take from this note is the general behaviour of snowflakes. Their movement is partly predictable (or at least its schema), and by reproducing it you can achieve some eye-candy scene.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-1219827400898618667?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/1219827400898618667/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2012/01/fake-snowflake-shadow.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1219827400898618667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1219827400898618667'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2012/01/fake-snowflake-shadow.html' title='Fake Snowflake Shadow'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mu5K2rDoFV0/TyVgkxl51XI/AAAAAAAAE_E/t_x6kHkJa7E/s72-c/schemat.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-6026759225728336392</id><published>2011-11-23T15:46:00.000+01:00</published><updated>2011-11-23T15:46:46.516+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QubicGames'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><title type='text'>2 Fast 4 GNOMZ</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is the second game in Gnomia world,&amp;nbsp;&lt;a href="http://soboltech.blogspot.com/2011/08/gnomz-game.html"&gt;look at the first one.&lt;/a&gt;&amp;nbsp;While GNOMZ was a multiplayer game, 2 Fast 4 GNOMZ is an exclusively single player game, just like the previous one - made by QubicGames for WiiWare service. This time our goal is to run through the world of Gnomia to find a woman and, of course, collect socks. There are four characters that you can morph into, that's why there is '4' in the title. The game is quite indie in style and is strongly related to Bit.Trip Runner and Super Meat Boy in a matter of difficulty. Our goal was to create a game that is really a challenge, only for hardcore, oldschool gamers.&amp;nbsp;My role at 2F4G was project management and lead programming. There were 11 people working on this title development, including programming, visuals and audio.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KiufPjaJg48/Ts0FcnYjisI/AAAAAAAAE6w/ve0Y1B85mnU/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-KiufPjaJg48/Ts0FcnYjisI/AAAAAAAAE6w/ve0Y1B85mnU/s320/7.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5cXrybHMLaM/Ts0FfWQV_bI/AAAAAAAAE64/8lKYelfYH74/s1600/11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-5cXrybHMLaM/Ts0FfWQV_bI/AAAAAAAAE64/8lKYelfYH74/s320/11.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SYwusA_j3c0/Ts0F2ASAWfI/AAAAAAAAE7A/1htruC78MGY/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-SYwusA_j3c0/Ts0F2ASAWfI/AAAAAAAAE7A/1htruC78MGY/s320/2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--Q3r4Ahsc8Y/Ts0F362089I/AAAAAAAAE7I/xV4yQbdtqio/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/--Q3r4Ahsc8Y/Ts0F362089I/AAAAAAAAE7I/xV4yQbdtqio/s320/9.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-6026759225728336392?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/6026759225728336392/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/11/2-fast-4-gnomz.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6026759225728336392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6026759225728336392'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/11/2-fast-4-gnomz.html' title='2 Fast 4 GNOMZ'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-KiufPjaJg48/Ts0FcnYjisI/AAAAAAAAE6w/ve0Y1B85mnU/s72-c/7.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-7940471691062120859</id><published>2011-11-04T10:56:00.000+01:00</published><updated>2011-11-04T10:56:11.177+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QubicGames'/><title type='text'>GNOMZ on the market</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9vWyv6fPfnI/TrO1SpbIDvI/AAAAAAAAE6Q/B5dCWFMPCaY/s1600/gnomz_art1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-9vWyv6fPfnI/TrO1SpbIDvI/AAAAAAAAE6Q/B5dCWFMPCaY/s320/gnomz_art1.png" width="249" /&gt;&lt;/a&gt;&lt;/div&gt;I can proudly say, that my youngest child - GNOMZ, was finally published on WiiWare, USA. Read more at &lt;a href="http://gnomzthegame.com/"&gt;gnomzthegame.com&lt;/a&gt;. You can also buy the game, visit&amp;nbsp;&lt;a href="http://www.nintendo.com/games/detail/5WJsiPjXj01TEbtbaIpvdrKrUycDQeGO"&gt;nintendo.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I can also say, that Gnomia is such an inquiring world, that we are allready working on another title that is going to be placed there. This has been already announced on&amp;nbsp;&lt;a href="http://wiiware.nintendolife.com/news/2011/10/interviews_qubicgames_gnomz_wiiware"&gt;nintendolife.com&lt;/a&gt;&amp;nbsp;by Michał Dys, our PR fella ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-7940471691062120859?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/7940471691062120859/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/11/gnomz-on-market.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/7940471691062120859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/7940471691062120859'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/11/gnomz-on-market.html' title='GNOMZ on the market'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-9vWyv6fPfnI/TrO1SpbIDvI/AAAAAAAAE6Q/B5dCWFMPCaY/s72-c/gnomz_art1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-2152981450259738336</id><published>2011-09-16T10:19:00.000+02:00</published><updated>2011-09-16T10:19:23.409+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><title type='text'>With or without GPU, that is the question...</title><content type='html'>&lt;div style="text-align: justify;"&gt;This post just represents my thoughts about how people get into some hi-tec trap. They know how to create some eye candy effects, like fish eye or chromatic aberration with GPU shader with 5 lines of code&amp;nbsp;or less&amp;nbsp;- that's cool. But when it comes to a situation when people don't have those shaders for their support, they get confused and say "that's impossible, you can not create such effects without modern GPU" and that's bullshit. A good example is the platform, that I'm currently working on - Wii. I can not say anything more technical about this platform due to some legal rights, but I can say (and everybody know it) that it's rather a low-end hardware. Let's get back to those effects that I've mentioned. You can create some approximation (simple fake, but that's what graphics are all about, ain't it?) using simple linear texture filtering - just create a grid of quads with regular mapping and distort their positions in some manner. With fish eye - just create radial distortion with strength proportional to distance from center of the grid. It looks quite good and is extremely cheap both in performance and implementation.Chromatic aberration - draw red channel on such grid with horizontal distortion with some strength, then green one with 2/3 of this strength and blue one with 1/3, mix them using additive blending et voila!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As a conclusion - this can be really simple, just don't ever think that something is possible only on new GPUs or CPUs or whatever, stay open-minded :) I think that this is quite what low end hardware demoscene is all about.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-2152981450259738336?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/2152981450259738336/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/09/with-or-without-gpu-that-is-question.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2152981450259738336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2152981450259738336'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/09/with-or-without-gpu-that-is-question.html' title='With or without GPU, that is the question...'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-4726798007973660306</id><published>2011-08-28T19:00:00.001+02:00</published><updated>2011-08-28T19:00:00.981+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Class method as template parameter</title><content type='html'>&lt;div style="text-align: justify;"&gt;I had an interesting problem that can be solved using a little bit tricky C++ code. Imagine a singleton that holds some pointer to a class that has many methods with identical params, but different purposes. Now, imagine you're creating some wrapper for this class in some other class (the first one was a ID3D11Device in my case, so I didn't modify it) and your code is also identical, despite this single method call. You can obviously copy paste this problem, creating n-times more lines of code. But this is an ugly solution, so below I paste the nice one. Class A is the ID3D11Device, class B is my wrapper. In my case fun1 was enough (i knew A type while implementing this), but because i find this useful - i paste code for case with unknown A type. Of course in practice, fun1 and fun2 would be big functions with this single call embedded somewhere deep.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;struct A {&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;void a(int param) { std::cout &amp;lt;&amp;lt; "a " &amp;lt;&amp;lt; param &amp;lt;&amp;lt; std::endl; }&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;void b(int param) { std::cout &amp;lt;&amp;lt; "b " &amp;lt;&amp;lt; param &amp;lt;&amp;lt; std::endl; }&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;};&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;struct B {&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;template&amp;lt; void (A::*F)(int) &amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;void fun1() {&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;A* a = new A; // obtain A, this may be singleton or anything else&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;(a-&amp;gt;*F)(1);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;delete a;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;template&amp;lt; typename T, void (T::*F)(int) &amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;void fun2(T* t) {&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;(t-&amp;gt;*F)(2);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;};&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;int main() {&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;B b;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;b.fun1&amp;lt; &amp;amp;A::a &amp;gt;();&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;b.fun1&amp;lt; &amp;amp;A::b &amp;gt;();&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;A a;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;b.fun2&amp;lt; A,&amp;amp;A::a &amp;gt;(&amp;amp;a);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;b.fun2&amp;lt; A, &amp;amp;A::b &amp;gt;(&amp;amp;a);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;return 0;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The only aspect that may need some explanation at the moment is how to pass ID3D11Device method marked with&amp;nbsp;STDMETHODCALLTYPE as template parameter. Notice, that&amp;nbsp;STDMETHODCALLTYPE is just a macro for&amp;nbsp;__stdcall. We can pass this additional keyword using syntax like:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;template&amp;lt; HRESULT (__stdcall ID3D11Device::*CreateShader)(const void*, SIZE_T, ID3D11ClassLinkage*, ID3D11VertexShader**) &amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;bool load_(const char* filename) {&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;...&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ok, now for the real example - the code will be a little bit more tricky, because we have to use derived template param as param for functions used as template params, blah, compliacted - look at the code :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;template&amp;lt; typename ShaderType &amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class Shader {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;protected:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;ShaderType* shader;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;public:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;Shader() {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;shader = NULL;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;virtual ~Shader() {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;if(shader) {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;			&lt;/span&gt;shader-&amp;gt;Release();&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;template&amp;lt; HRESULT (__stdcall ID3D11Device::*CreateShader)(const void*, SIZE_T, ID3D11ClassLinkage*, ShaderType**) &amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;bool load_(const char* filename, const char* entryPoint, const char* shaderModel) {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;template&amp;lt; void (__stdcall ID3D11DeviceContext::*SetShader)(ShaderType*, ID3D11ClassInstance* const*, UINT) &amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;void bind_() {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class VertexShader : public Shader&amp;lt; ID3D11VertexShader &amp;gt; {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;public:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;__forceinline bool load(const char* filename) {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;return load_&amp;lt; &amp;amp;ID3D11Device::CreateVertexShader &amp;gt;(filename, "mainVS", "vs_4_0");&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;__forceinline void bind() {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;bind_&amp;lt; &amp;amp;ID3D11DeviceContext::VSSetShader &amp;gt;();&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class PixelShader : public Shader&amp;lt; ID3D11PixelShader &amp;gt; {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class GeometryShader : public Shader&amp;lt; ID3D11GeometryShader &amp;gt; {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class DomainShader : public Shader&amp;lt; ID3D11DomainShader &amp;gt; {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class HullShader : public Shader&amp;lt; ID3D11HullShader &amp;gt; {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;class ComputeShader : public Shader&amp;lt; ID3D11ComputeShader &amp;gt; {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;};&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Of course you may decide to make load and bind virtuals, and to pack them into some kind of manager - this is just a design decision, whether you want to automate use of those classes. In such case design would get a little bit more complicated. My load is virtual, bind isn't. Additionally, VertexShader is strongly coupled with VertexLayout (ID3D11InputLayout), which is created while loading, so my structure looks something like this:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CLRDcbujSG8/TlpxmlluzfI/AAAAAAAAEzs/aiEh2YcWLNk/s1600/adsf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://2.bp.blogspot.com/-CLRDcbujSG8/TlpxmlluzfI/AAAAAAAAEzs/aiEh2YcWLNk/s320/adsf.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-4726798007973660306?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/4726798007973660306/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/08/class-method-as-template-parameter.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4726798007973660306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4726798007973660306'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/08/class-method-as-template-parameter.html' title='Class method as template parameter'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-CLRDcbujSG8/TlpxmlluzfI/AAAAAAAAEzs/aiEh2YcWLNk/s72-c/adsf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-4711414295269207585</id><published>2011-08-24T22:17:00.032+02:00</published><updated>2011-11-08T14:04:37.047+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QubicGames'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><title type='text'>GNOMZ the game</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;GNOMZ is a WiiWare multiplayer hot seat action platformer developed by &lt;a href="http://www.qubicgames.com/"&gt;QubicGames&lt;/a&gt;. I worked over this project as lead programmer and project manager since january till august 2011. You can read more about this game on &lt;a href="http://www.gnomzthegame.com/"&gt;GnomzTheGame.com&lt;/a&gt;. I also wrote some paper about implementing AI in GNOMZ, you can read it&amp;nbsp;&lt;a href="https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0By0d9ks0L73COTBiMDUzMGYtNDE4Yi00YzVjLWIwYTAtOWEzOTliMjc0NzI1&amp;amp;hl=en_US"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-be4hIkGtIV0/TlVc64BC0CI/AAAAAAAAEzY/rAP1qIBYzqo/s1600/JFB_Win_D+2011-08-18+11-15-17-48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/-be4hIkGtIV0/TlVc64BC0CI/AAAAAAAAEzY/rAP1qIBYzqo/s320/JFB_Win_D+2011-08-18+11-15-17-48.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-45EKlRoZP1w/TlVdLJYcL6I/AAAAAAAAEzc/kjEQ6oJHUFY/s1600/JFB_Win_D+2011-08-18+11-15-45-48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-45EKlRoZP1w/TlVdLJYcL6I/AAAAAAAAEzc/kjEQ6oJHUFY/s320/JFB_Win_D+2011-08-18+11-15-45-48.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-N51DH6YixrY/TlVdXvXWPFI/AAAAAAAAEzg/JempIdR-0dc/s1600/JFB_Win_D+2011-08-18+11-16-48-48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://1.bp.blogspot.com/-N51DH6YixrY/TlVdXvXWPFI/AAAAAAAAEzg/JempIdR-0dc/s320/JFB_Win_D+2011-08-18+11-16-48-48.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-SfBvAdgyf_o/TlVdZfKJq_I/AAAAAAAAEzk/ELZWG0XbROw/s1600/JFB_Win_D+2011-08-18+10-43-02-81.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-SfBvAdgyf_o/TlVdZfKJq_I/AAAAAAAAEzk/ELZWG0XbROw/s320/JFB_Win_D+2011-08-18+10-43-02-81.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-j2bygXq-gN0/Tlar6QXH4iI/AAAAAAAAEzo/sqQYXrn23Pg/s1600/JFB_Win_D+2011-08-18+11-19-47-47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-j2bygXq-gN0/Tlar6QXH4iI/AAAAAAAAEzo/sqQYXrn23Pg/s320/JFB_Win_D+2011-08-18+11-19-47-47.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Reviews:&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #444444; font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px;"&gt;"I would say that Gnomz is an excellent multiplayer game&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;a href="http://www.gev.com/2011/11/wii-game-review-gnomz/"&gt;www.gev.com&lt;/a&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;span id="goog_21040765"&gt;&lt;/span&gt;&lt;span id="goog_21040766"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-4711414295269207585?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/4711414295269207585/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/08/gnomz-game.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4711414295269207585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4711414295269207585'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/08/gnomz-game.html' title='GNOMZ the game'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-be4hIkGtIV0/TlVc64BC0CI/AAAAAAAAEzY/rAP1qIBYzqo/s72-c/JFB_Win_D+2011-08-18+11-15-17-48.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-3291196443950141785</id><published>2011-08-06T14:54:00.000+02:00</published><updated>2011-08-06T14:54:28.835+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Smart Traffic Signs</title><content type='html'>&lt;div style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;span lang="en-US"&gt;Recently, I've been traveling more than 4k km by car, and I had some time to think about stuff not connected with gamedev. In Germany I've noticed a strange sign - speed limit depending on slipperiness of the road surface. It was strange, because there were no precautions if weather is ok, so you can go 300km/h if your car can, and in case of rain you can go only 80km/h, so it's quite discrete. And than the idea came - why not measure the state of the road and show the speed limit in electronic form. For example in dense rain - 80km/h, in snow - 50km/h, in light rain - 120km/h and so on. We kept going, and on the bridge there was a sign - in case of wind, 100km/h or something like this. The idea is even better here - just measure wind speed and show appropriate limits. The method is great because the sign can measure a lot of parameters at a time, and using some heuristics it can show the speed limit, or some other information. What other info? For example - imagine a sign showing a pedestrian crossing. If you go at night you usually can't see anything, so slowing down is the only option, but even going 50km/h is too much if someone enters the crossing. The solution is simple - show some additional info, that there is someone near the crossing, so that the driver knows that he has to stop, not only slow down. It's not easy to implement, but in my opinion it's not impossible. Smart signs can also take into consideration some other stuff, like traffic - read&amp;nbsp;&lt;a href="http://www.sciencedaily.com/releases/2007/07/070727191521.htm"&gt;this&lt;/a&gt;. In my opinion, the method has almost no limits, and would really improve safety on roads. The only question is, will politics spend money on our safety? I don't think so, they need money for PR :)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blog.spy-gadgets-vs-stupid-criminals.com/wp-content/uploads/2009/02/zombiesign.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://blog.spy-gadgets-vs-stupid-criminals.com/wp-content/uploads/2009/02/zombiesign.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;span lang="en-US"&gt;Let's go further - the speed limit also depends on the car, for example big truck should have much bigger limits. Why not implement traffic signs... in cars? Imagine a display that shows you the limit, or in extreme it can even automatically limit your speed. The idea can be really simple - all traffic signs have some transmitters attached, that broadcast restrictions at some place (some norm would be required). Receivers collect those broadcast, and analyze them, for example taking into consideration mass of the car, state of it's tires and so on. But for now this is rather science fiction, because all cars would have to implement this. Maybe it's a good moment to start such revolution, this depends on motorization brands. Remember, that such a solution doesn't have to mean that we remove all "classic" signs - they can stay, we can just add some new features to them.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-3291196443950141785?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/3291196443950141785/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/08/smart-traffic-signs.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/3291196443950141785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/3291196443950141785'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/08/smart-traffic-signs.html' title='Smart Traffic Signs'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-2091697995698061143</id><published>2011-04-07T22:51:00.002+02:00</published><updated>2011-04-07T22:52:50.629+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IGK'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='compo'/><category scheme='http://www.blogger.com/atom/ns#' term='indie'/><title type='text'>Tempy Guardian, 3rd place in IGK'2011</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is our entry to IGK'2011 8 hour competition. Our - I mean my team, that is:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Michał "Sobol" Sobiecki (me) - shaders &amp;amp; rendering, catapult, most of the framework&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Maciek "Słoń" Stefańczyk - gameplay (with Box2D), sound framework&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Kacper "Szkudi" Szkudlarek - sounds, level design&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Oskar Świerad - all graphics and animations&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Compo theme was "Temple Guardian", and orgs ment tower defence by this. But we decided to create an anti-game, with Godzilla as Tempy Guardian (it means stupid guardian in polish). The guardian is so stupid, that he can not defend the temple, that is nuclear plant, because he prefers to dance. We have to destroy green pulsating radioactive something with blue teddybears thrown with the catapult. Simple, but fun. And that was our goal.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;During the competition, we have created 90% of the code. We didn't manage to finish particle system (due to stupid bug... sic!) and stuff like this. But as I said, 90% of the game was created during the compo, including all 8 levels! We've placed 3rd, out of 12 teams.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Os6TXYAd6EE/TZ4i4stj41I/AAAAAAAAEM4/BGysUBGfKE0/s1600/01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-Os6TXYAd6EE/TZ4i4stj41I/AAAAAAAAEM4/BGysUBGfKE0/s400/01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-z4v32LfucPc/TZ4i8X78tVI/AAAAAAAAEM8/4_RlFs1gNio/s1600/02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-z4v32LfucPc/TZ4i8X78tVI/AAAAAAAAEM8/4_RlFs1gNio/s400/02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BdGa5Abg57k/TZ4i-ob4ywI/AAAAAAAAENA/LVLD5Dv2PgI/s1600/03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-BdGa5Abg57k/TZ4i-ob4ywI/AAAAAAAAENA/LVLD5Dv2PgI/s400/03.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.youtube.com/watch?v=2pAPoAckP-8"&gt;[YouTube presentation]&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/5497528/TG_release.rar"&gt;[DOWNLOAD]&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-2091697995698061143?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/2091697995698061143/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/04/tempy-guardian-3rd-place-in-igk2011.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2091697995698061143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2091697995698061143'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/04/tempy-guardian-3rd-place-in-igk2011.html' title='Tempy Guardian, 3rd place in IGK&apos;2011'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Os6TXYAd6EE/TZ4i4stj41I/AAAAAAAAEM4/BGysUBGfKE0/s72-c/01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-1064239694968847215</id><published>2011-02-21T17:59:00.001+01:00</published><updated>2011-04-03T18:06:39.449+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QubicGames'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><title type='text'>Remote Racers (QubicGames)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Remote Racers is a 3D racing game for Nintendo DSi platform. I worked over it as a main programmer after project reactivation (September - December 2010). The game was developed and published by QubicGames. On the 21st of February, 2011, the game showed up in DSiWare market in the USA. The trailer is available on &lt;a href="http://www.youtube.com/watch?v=5Ec74PRlcWo&amp;amp;feature=player_embedded"&gt;YouTube&lt;/a&gt;. You can also visit projects&amp;nbsp;&lt;a href="http://remoteracers.qubicgames.com/"&gt;official website&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://remoteracers.qubicgames.com/wp-content/uploads/2011/02/jaskinia-eksplozja.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://remoteracers.qubicgames.com/wp-content/uploads/2011/02/jaskinia-eksplozja.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://remoteracers.qubicgames.com/wp-content/uploads/2011/02/deska2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://remoteracers.qubicgames.com/wp-content/uploads/2011/02/deska2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://remoteracers.qubicgames.com/wp-content/uploads/2011/02/candy-na-speedzie.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://remoteracers.qubicgames.com/wp-content/uploads/2011/02/candy-na-speedzie.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-1064239694968847215?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/1064239694968847215/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/02/remote-racers-qubicgames.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1064239694968847215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1064239694968847215'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/02/remote-racers-qubicgames.html' title='Remote Racers (QubicGames)'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-7904478433173839912</id><published>2011-02-08T18:08:00.003+01:00</published><updated>2011-04-03T18:18:18.311+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Modelling thrown powder snow phenomenon for computer animation</title><content type='html'>&lt;div style="text-align: justify;"&gt;This project is my Bachelor's Thesis on Warsaw University of Technology, Department of Electronics and Computer Science. The original title is "Modelowanie zjawiska wzbitego puchu śnieżnego dla potrzeb animacji komputerowej".&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;u&gt;Abstract&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The present thesis describes a fluid simulator based on nonlinear Navier-Stokes equations. The way of creating a stable solver is described. There is also some information on how to create vorticity confinement improvement. Next, the way of rendering solver output data using Blender 3D software is presented. Finally, the paper presents some examples and gives an insight into the implementation of the solver.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You can watch some effects on YouTube:&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=DUhS9sfJKHc"&gt;[1]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=twW6ynuyOds"&gt;[2]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=Xgh41fDCz0w&amp;amp;feature=related"&gt;[3]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=b29glegKoNk"&gt;[4]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=y65u49hKhV0"&gt;[5]&lt;/a&gt;. I graduated with "5" mark (very good) on the 8th of february 2011.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/armatka20071.jpeg?attachauth=ANoY7cq2d6qVjVz6sQC2PqsMK1PH_yMWQWxA-Ey0OOX_Iaj8IfiOqG0fea27WAey4o8r2MGkoBnORB_Jkor-I1fTu7PRoF21Qi7I9-Jmp2sbElxiDXtHE1aRumwB4GSOAQN59AI7yLlWpz_GWvpDvqKTTCQrZnvUm_EzGc04YyA1X0LylTC9m2A3QQWxTvpNP7JpMv_5ROiibMKyiXao_iBAW6f6SUA6GA%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/armatka20071.jpeg?attachauth=ANoY7cq2d6qVjVz6sQC2PqsMK1PH_yMWQWxA-Ey0OOX_Iaj8IfiOqG0fea27WAey4o8r2MGkoBnORB_Jkor-I1fTu7PRoF21Qi7I9-Jmp2sbElxiDXtHE1aRumwB4GSOAQN59AI7yLlWpz_GWvpDvqKTTCQrZnvUm_EzGc04YyA1X0LylTC9m2A3QQWxTvpNP7JpMv_5ROiibMKyiXao_iBAW6f6SUA6GA%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/pasnik10041.jpeg?attachauth=ANoY7cqYCTmEQZ3SZxg9SO89hwDdtZGOkmPlnON2rQ3LH8s5t1ERN9o0IUijMDu-0MULc5IdVznZ_G5UlVe1zeHlpvIRiJFlmtMrypgZZwDPEb00pLTc0Di5SB7JpKoj3axDmn3oPgJLuyMbAnKVFtrA-qi6-DHKjT5qaUZ60hhYZ4yEtI9PAcvIBPjqSWEyxXeHaBrz9cptqy7cjtgverT93Fr_1iIf1w%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/pasnik10041.jpeg?attachauth=ANoY7cqYCTmEQZ3SZxg9SO89hwDdtZGOkmPlnON2rQ3LH8s5t1ERN9o0IUijMDu-0MULc5IdVznZ_G5UlVe1zeHlpvIRiJFlmtMrypgZZwDPEb00pLTc0Di5SB7JpKoj3axDmn3oPgJLuyMbAnKVFtrA-qi6-DHKjT5qaUZ60hhYZ4yEtI9PAcvIBPjqSWEyxXeHaBrz9cptqy7cjtgverT93Fr_1iIf1w%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/gestosc_armatka1.bmp?attachauth=ANoY7cof6OaIZnWVrOYyNjNIt0IRLMZ1iqtSb_ue8eLaU6RPJzTSP3P68zYMDzXYnfjmLttmwRRxwpBpYd7MGjZ2Guszj12fpaosO8TBtA4xmzNjpQtOHpXf-OzeOHyEA1ICitp075FpzoSEnFhP6qKvuBz5lk9meu2FwdtPkOa-uhAQydEtqKgF4E8vgW5XBXrroUD6L69eqlILxU1oa297U5Yd6wxoAw%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/gestosc_armatka1.bmp?attachauth=ANoY7cof6OaIZnWVrOYyNjNIt0IRLMZ1iqtSb_ue8eLaU6RPJzTSP3P68zYMDzXYnfjmLttmwRRxwpBpYd7MGjZ2Guszj12fpaosO8TBtA4xmzNjpQtOHpXf-OzeOHyEA1ICitp075FpzoSEnFhP6qKvuBz5lk9meu2FwdtPkOa-uhAQydEtqKgF4E8vgW5XBXrroUD6L69eqlILxU1oa297U5Yd6wxoAw%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-7904478433173839912?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/7904478433173839912/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2011/02/modelling-thrown-powder-snow-phenomenon.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/7904478433173839912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/7904478433173839912'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2011/02/modelling-thrown-powder-snow-phenomenon.html' title='Modelling thrown powder snow phenomenon for computer animation'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-3124600796175998233</id><published>2010-03-20T17:46:00.024+01:00</published><updated>2011-04-03T20:00:17.478+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><title type='text'>Space Pirate, 3D space shooter</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is a 3D game, where you can become a pilot of a space fighter. It's an oldschool shoot'em'up game, so you have to destroy dozens of enemies on several levels. You can also improve your ship, buying new weapons and abilities (like bullet time or invisibility).&amp;nbsp;The game is based on Util3D game engine, that I've created from scratch in C++, OpenGL and CG for shaders. Models were created by Marcin "Karkoś" Karkowski. Music is by Combichrist (I hope they don't mind, after all it's just a small game not for sale). Idea, design and code is by me (Michał "Sobol" Sobiecki). I have to mention, that part of graphics is also by me - for example procedural backgrounds generated on the fly while game loads :)&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/sp_logo_small.jpg?attachauth=ANoY7crbZ3ycyXpXR5uvMLLLZB7vTqEyNdgNoQKDNimEETW_SAy1s45yghfvZXTwNs10iYgZKQQ14UFJN6NsK-nkLjqa3ehvN6CV8Zz_SeTxvUrloakMYA--ic3RFgMKPL4oNf3kSuez7Hi3gN-R1bJLZ83djEs4E6tvpHE20V2HuXlQ1MpQxcrSx-IFAYWNts0wJXtFtr6bJbNYnrW-BTo9KFVzAQfl_g%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/sp_logo_small.jpg?attachauth=ANoY7crbZ3ycyXpXR5uvMLLLZB7vTqEyNdgNoQKDNimEETW_SAy1s45yghfvZXTwNs10iYgZKQQ14UFJN6NsK-nkLjqa3ehvN6CV8Zz_SeTxvUrloakMYA--ic3RFgMKPL4oNf3kSuez7Hi3gN-R1bJLZ83djEs4E6tvpHE20V2HuXlQ1MpQxcrSx-IFAYWNts0wJXtFtr6bJbNYnrW-BTo9KFVzAQfl_g%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://warsztat.gd/screens/e708005476da747e492f831cf9372986.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://warsztat.gd/screens/e708005476da747e492f831cf9372986.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://warsztat.gd/screens/c28b3fcaa39ebab6cd75b61b9afaa68d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://warsztat.gd/screens/c28b3fcaa39ebab6cd75b61b9afaa68d.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://warsztat.gd/screens/2319dcb9d679dd533290900f7e586d35.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://warsztat.gd/screens/2319dcb9d679dd533290900f7e586d35.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://warsztat.gd/screens/f3a671f2bcc7f70036a5694c42c3918d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://warsztat.gd/screens/f3a671f2bcc7f70036a5694c42c3918d.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://warsztat.gd/screens/e6e5562107f4ff2f1d7ba7550c19be9b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://warsztat.gd/screens/e6e5562107f4ff2f1d7ba7550c19be9b.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/5497528/SpacePirate.rar"&gt;[DOWNLOAD]&lt;/a&gt;&amp;nbsp;(remember about VC 2008 redists)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-3124600796175998233?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/3124600796175998233/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2010/03/space-pirate-3d-space-shooter.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/3124600796175998233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/3124600796175998233'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2010/03/space-pirate-3d-space-shooter.html' title='Space Pirate, 3D space shooter'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-1299958611841809121</id><published>2009-12-26T19:08:00.000+01:00</published><updated>2009-12-26T19:08:39.036+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Import archiwum GG do Pidgin</title><content type='html'>&lt;div style="text-align: justify;"&gt;Pidgin to całkiem przyjemny multikomunikator, obsługujący między innymi protokół znanego i nielubianego GG, dobra alternatywa dla oficjalnego klienta. Przy zmianie klienta nie chciałem jednak rozstać się ze swoim archiwum, do którego jestem mocno przywiązany, dlatego zacząłem googlować, i szybko dowiedziałem się, że do Pidgin "nie da się" zaimportować archiwum z GG. Skoro się nie da, to na szybko zobaczyłem jaki jest format archiwum w nowym kliencie, i napisałem konwerter. Ponieważ z braku czasu cała operacja nie mogła przekroczyć godziny, pogooglałem znowu i znalazłem fajny programik do zamiany archives.dat z GG na plik txt (i przy okazji dobry opis formatu archiwum) &lt;a href="http://users.v-lo.krakow.pl/%7Eanszom/ggarch/index.pl.shtml"&gt;http://users.v-lo.krakow.pl/~anszom/ggarch/index.pl.shtml&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://pidgin.im/shared/img/logo.text.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://pidgin.im/shared/img/logo.text.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pomyślałem, że może konwerter się komuś przyda (może nie każdy będzie musiał pisać własny :P) więc udostępniam. Skąd wziąć archives.dat? Z "C:\Documents and Settings\NAZWA_KONTA\Gadu-Gadu\KONTO_GG". W wyniku działania konwertera wygeneruje się spora liczba plików (i mogą troszkę ważyć - mi z 18 megowego archiwum zrobiło się 30, przy czym "rozmiar na dysku" to aż 82. Ahh to wyrównanie... Gdzie je wrzucić? "C:\Documents and Settings\NAZWA_KONTA\Dane aplikacji\.purple\logs\gadu-gadu\TWOJ_NUMER_GG\". I tyle, po wrzuceniu wygenerowanych plików do tego folderu Pidgin sobie już poradzi.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/soboltech/portfolio/gg2pidginArchive.rar"&gt;[DOWNLOAD]&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-1299958611841809121?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/1299958611841809121/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/12/import-archiwum-gg-do-pidgin.html#comment-form' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1299958611841809121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1299958611841809121'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/12/import-archiwum-gg-do-pidgin.html' title='Import archiwum GG do Pidgin'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-7919964601745039697</id><published>2009-12-01T17:37:00.003+01:00</published><updated>2011-04-03T17:45:16.272+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><title type='text'>The kulkis</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is a simple 3D shooting game, created in one week from scratch in C++, OpenGL using ODE physics engine. There are some troops of yellow spheres flying around the city. The goal is to shoot them with red ones, but... when you shoot a troop, they start to panic and escape. The red ones become yellow after some time, so you have to shoot reasonably. Red ones have also an advantage - they pursuit yellow ones :)&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/015.jpg?attachauth=ANoY7co8N5HjPbaG-FypB_xFyG5rV6ntVFM6v1ORuJJ8y5jSI4Opx8og8ZXiOCd4wzTq5BY055y2wF3nRtLU7zuBaRbDCBdPtiZdRLKP1SGLXocx9E7tN6DY4u9UndZJpFxSlVyCD8eghOz4mhwemcB5pdV2ouQyGWuXpdk2-qrGWB17uRf0aGhMb6opthQQT6ze2nITObhNaWV2YxmplztfYxTsdLdKJQ%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/015.jpg?attachauth=ANoY7co8N5HjPbaG-FypB_xFyG5rV6ntVFM6v1ORuJJ8y5jSI4Opx8og8ZXiOCd4wzTq5BY055y2wF3nRtLU7zuBaRbDCBdPtiZdRLKP1SGLXocx9E7tN6DY4u9UndZJpFxSlVyCD8eghOz4mhwemcB5pdV2ouQyGWuXpdk2-qrGWB17uRf0aGhMb6opthQQT6ze2nITObhNaWV2YxmplztfYxTsdLdKJQ%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/017.jpg?attachauth=ANoY7crrFXqfAxF672YcnoRbIAjAvarkEI2F79Ypm0A-bzr9XJKP0QrbPQbKVtZHe1NgmWMLDTTHRdxs7j2iMQYc_yyKRFflFdG1H1_aBGLpaG-IgPefpP91f7arRLxzVWA1fIJgJhH_Z0WjQ_eEiCLE75VcCas0nGQLluk1m8SZs52kiBfMSy90A2OTcau9dZtiniweILbh55pAtz1WlNr_iSUvz0IfDg%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/017.jpg?attachauth=ANoY7crrFXqfAxF672YcnoRbIAjAvarkEI2F79Ypm0A-bzr9XJKP0QrbPQbKVtZHe1NgmWMLDTTHRdxs7j2iMQYc_yyKRFflFdG1H1_aBGLpaG-IgPefpP91f7arRLxzVWA1fIJgJhH_Z0WjQ_eEiCLE75VcCas0nGQLluk1m8SZs52kiBfMSy90A2OTcau9dZtiniweILbh55pAtz1WlNr_iSUvz0IfDg%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/016.jpg?attachauth=ANoY7cpNWyhbH0LjT0I6zzraSUoz_SSYtkHPrung3RZGz3y39_IYCwIaaIySOvIjE3ARG7ZbXZnRCsudZF6oBUxQdLk8yEtdeV099s3d8WKdT1crMaWxLt6fjyi0wyBeDSJfhb58Nc0-q49m6ZUeccBE8Ts8P87mkB-fuaPBCo92wuakgO3UWdt82S5QrJiKErz3NvzOfSMjIJgw4ZCrMvmaa2Wl2NsVmA%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/portfolio/016.jpg?attachauth=ANoY7cpNWyhbH0LjT0I6zzraSUoz_SSYtkHPrung3RZGz3y39_IYCwIaaIySOvIjE3ARG7ZbXZnRCsudZF6oBUxQdLk8yEtdeV099s3d8WKdT1crMaWxLt6fjyi0wyBeDSJfhb58Nc0-q49m6ZUeccBE8Ts8P87mkB-fuaPBCo92wuakgO3UWdt82S5QrJiKErz3NvzOfSMjIJgw4ZCrMvmaa2Wl2NsVmA%3D%3D&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/portfolio/kulkiFinal.rar?attredirects=0"&gt;[DOWNLOAD]&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-7919964601745039697?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/7919964601745039697/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/12/kulkis.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/7919964601745039697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/7919964601745039697'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/12/kulkis.html' title='The kulkis'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-50350287248477618</id><published>2009-11-30T21:59:00.001+01:00</published><updated>2009-11-30T22:02:44.845+01:00</updated><title type='text'>Widmo molocha...</title><content type='html'>&lt;div style="text-align: justify;"&gt;Dzisiaj nietypowy post, mający stanowić antyreklamę firmy którą wszyscy dobrze znają - TPSA. Opowiem krótką bajkę o tym co mnie boli. Od jakiegoś czasu (będzie ze 2 miesiące) neostrada zrywa mi połączenie, średnio na 6h w ciągu dnia, w dodatku najczęściej w najmniej korzystnych godzinach (prawo Murphyego). Na początku podszedłem do sprawy bardzo spokojnie - zadzwoniłem do obsługi technicznej, przysłali technika, który stwierdził, że winę ponosi listwa antyprzepięciowa, przez którą połączony jest modem do gniazdka (bzdura, ale nvm). Odłączyłem listwę, żeby nie było, że robię coś wbrew zaleceniom. Połączenie nadal zrywało, więc kolejny telefon do obsługi. Dokładnie taka sama rozmowa - "a telefon jest połączony przez mikrofiltr? a kabel jest podłączony? a komputer to pan włączył?" No kurwa mać ;/ Zgłoszenie poszło do techników, którzy nawet nie raczyli się umówić, o przyjechaniu nie wspominam. Potem było kilka rozmów o tym "czy połączyłem telefon przez mikrofiltr" i wezwań techników którzy się nie pojawiali. W ostatniej rozmowie pan w słuchawce powiedział mi praktycznie wprost, że mogę go opieprzać jak chcę a to i tak nic nie da, bo on ma gówno do tego, i co najwyżej może wezwać do mnie techników. Technik zadzwonił w niedzielę o 9.00 przed świtem, umówił się na poniedziałek między 13 a 15. Zarezerwowałem czas, czekałem, nie pojawił się, najnormalniej w świecie, parszywie mnie olał.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.worldofmonopoly.co.uk/images/board300x300.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.worldofmonopoly.co.uk/images/board300x300.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Konkluzja jest taka - jeszcze nie wiem jak to załatwić, ale albo pozwolą mi przedterminowo zerwać umowę, albo ich zaskarżę, bo to co robią, to najnormalniejsze w świecie świństwo. Zapomnieli, że już nie są monopolistą, i że mogę zmienić ich denną neostradę na inny "internet".&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-50350287248477618?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/50350287248477618/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/11/widmo-molocha.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/50350287248477618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/50350287248477618'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/11/widmo-molocha.html' title='Widmo molocha...'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-1264347180950376295</id><published>2009-11-13T23:34:00.000+01:00</published><updated>2009-11-13T23:34:04.821+01:00</updated><title type='text'>Efekty uboczne</title><content type='html'>&lt;div style="text-align: justify;"&gt;Przy okazji robienia proceduralnego generatora teł do gry przypadkiem wygenerowałem całkiem ciekawe obrazki. Wprawdzie kompletnie bezużyteczne przy mojej aktualnej pracy, ale ruszyły moją wyobraźnię i myślę, że mogłyby mieć spore zastosowanie w demoscenie na przykład. Szczególnie, że generatorem jest zwykły atraktor pickover (kto nie zna, odsyłam do &lt;a href="http://www.chaoscope.org/doc/attractors.htm#pickover"&gt;chaoscope&lt;/a&gt;) z drobną wariacją, ustalającą kolor na podstawie odległości od źródeł światła, czyli można to zaimplementować w "paru" bajtach dosłownie.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/___MDH2-ZWaA/Sv3eFGu4F6I/AAAAAAAADH8/-5zYFlx6PU4/s1600-h/scr01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/___MDH2-ZWaA/Sv3eFGu4F6I/AAAAAAAADH8/-5zYFlx6PU4/s320/scr01.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/___MDH2-ZWaA/Sv3eNrk04FI/AAAAAAAADIE/kBZhmqVKMTo/s1600-h/scr02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/___MDH2-ZWaA/Sv3eNrk04FI/AAAAAAAADIE/kBZhmqVKMTo/s320/scr02.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Takie efekty uboczne bardzo często są powodem powstawania nowych pomysłów, rozwiązań czy algorytmów.&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-1264347180950376295?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/1264347180950376295/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/11/efekty-uboczne.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1264347180950376295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/1264347180950376295'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/11/efekty-uboczne.html' title='Efekty uboczne'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/___MDH2-ZWaA/Sv3eFGu4F6I/AAAAAAAADH8/-5zYFlx6PU4/s72-c/scr01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-4526361955296003071</id><published>2009-10-27T15:21:00.001+01:00</published><updated>2009-10-27T15:27:55.574+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projektowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Re: Pola i akcesory wewnątrz klas</title><content type='html'>&lt;div style="text-align: justify;"&gt;Do napisania tego posta sprowokował mnie Xion, swoją&lt;a href="http://xion.org.pl/2009/10/26/pola-i-akcesory-wewnatrz-klasy/"&gt;&lt;/a&gt; &lt;a href="http://xion.org.pl/2009/10/26/pola-i-akcesory-wewnatrz-klasy/"&gt;notką&lt;/a&gt;. Kiedyś sam o tym troszkę rozmyślałem, i doszedłem do wniosku, że zwykle wewnątrz klasy lepiej jest się odwołać bezpośrednio do składowych. Są jednak pewne wyjątki. I tutaj historia z życia wzięta, ale rozpisywać się nie będę, bo jak wiadomo jeden pseudokod znaczy więcej niż tysiąc słów :P&lt;br /&gt;&lt;/div&gt;&lt;pre class="prettyprint" style="font-family: arial;"&gt;class Scene {&lt;br /&gt;&lt;br /&gt;// trzy wskazniki na glowne macierze &lt;br /&gt;const Matrix4x4* modelMatrix;&lt;br /&gt;const Matrix4x4* viewMatrix;&lt;br /&gt;const Matrix4x4* projMatrix;&lt;br /&gt;&lt;br /&gt;// od groma wyliczonych z nich macierzy &lt;br /&gt;Matrix4x4 modelViewMatrix, modelViewProjMatrix, invModel, (...), invModelViewProjMatrix;&lt;br /&gt;&lt;br /&gt;bool /* w oryginale tu jest bitset */ modelChanged, (...), invModelViewProjChanged; &lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;// tylko trzy metody set &lt;br /&gt;void setModelMatrix(const Matrix4x4* m) const;&lt;br /&gt;void setViewMatrix(const Matrix4x4* m) const;&lt;br /&gt;void setProjMatrix(const Matrix4x4* m) const;&lt;br /&gt;&lt;br /&gt;// od groma metod get&lt;br /&gt;const Matrix4x4&amp;amp; getModelMatrix() const; &lt;br /&gt;(...) &lt;br /&gt;const Matrix4x4&amp;amp; getInvModelViewProj() const;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Do tego dodajmy klasę ShaderManager, która pobiera sobie te macierze (i nie tylko, ale nie będę mieszać tutaj za bardzo, bo do puenty nie dojdę nigdy). I teraz - jak słusznie zauważył Xion użycie metod set na zewnątrz klasy Scene nie budzi (nie powinno!) wątpliwości. W tym przypadku jest to również konieczne wewnątrz. Przyczyna? Ktoś kto uważnie przeczytał pseudokod pewnie się domyśla, że liczenie (bądź co bądź kosztowne, szczególnie w przypadku inverse) macierzy jest odłożone do pierwszego get. Natomiast set aktualizuje odpowiednie wartości "changed". W przypadku nieużywania set trzeba te wartości zmienić ręcznie, co powoduje generalny syf w kodzie.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pojawia się tutaj pytanie - co jeśli ktoś używa naszej klasy i o tym nie wie, i napisze gdzieś po prostu modelMatrix = identity4x4. Albo (o zgrozo :P) my sami mamy już tak rozdmuchaną klasę, że o tym zapominamy. Znalezienie błędu potem może być dosyć kosztowne. Moje rozwiązanie (które stosuję) polega na wywaleniu całej logiki związanej z macierzami do klasy SceneMatrix, gdzie macierze są w prywatnym obszarze a metody w publicznym, i dziedziczenie po niej. Zaleta jest taka, że w zależności od potrzeb możemy dziedziczyć publicznie lub prywatnie i w ten sposób udostępniać lub chować metody get / set na zewnątrz. Przy takim podejściu nie ma mowy o "zapomnieniu", że trzeba użyć set zamiast operatora=. Wadą jest to, że zwykle prowadzi to do wielodziedziczenia, ale moim zdaniem nie jest to ani błąd ani problem w takim przypadku.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-4526361955296003071?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/4526361955296003071/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/10/re-pola-i-akcesory-wewnatrz-klas.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4526361955296003071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4526361955296003071'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/10/re-pola-i-akcesory-wewnatrz-klas.html' title='Re: Pola i akcesory wewnątrz klas'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-4642590027928293409</id><published>2009-10-24T16:18:00.003+02:00</published><updated>2009-10-24T18:02:52.338+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='lib'/><title type='text'>Geometria w C++</title><content type='html'>&lt;div style="text-align: justify;"&gt;Każdy kto pisze silnik graficzny, fizyczny, lub po prostu grę, potrzebuje często używać algorytmów geometrii obliczeniowej - triangulacji, liczenia otoczek wypukłych, operacji Boolowskich na wielokątach lub geometrii 3 wymiarowej, czy choćby prostym sprawdzaniu kolizji punktu z bryłą. Są to algorytmy używane w większości dziedzin związanych z kodowaniem gier i nie tylko, również ważne w CADach, robotyce, sofcie medycznym etc. Ponieważ odkrywanie koła po raz setny jest bezsensowne, postanowiłem znaleźć bibliotekę realizującą takie zadania za nas.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;CGAL&lt;/b&gt; (Computational Geometry Algorithms Library) wydaje się być strzałem w dziesiątkę. Jest to bardzo dojrzały projekt, rozwijany od 97 roku o ile się nie mylę. Obecnie doczekał się już wersji 3.5. Udostępnia bardzo pokaźną liczbę struktur danych i algorytmów. Poszczególne biblioteki projektu są proste w użyciu i dobrze udokumentowane. Całość napisana jest z myślą o C++, ale z tego co wyczytałem jest również wsparcie dla Pythona (co może się przydać w pisaniu skryptów do AI). Szczegółowy przegląd ficzerów można znaleźć na stronie &lt;a href="http://www.cgal.org/"&gt;http://www.cgal.org/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Teraz licencja - do zastosowań niekomercyjnych CGAL jest darmowy (połowicznie na licencji LGPL i QPL). Natomiast w przypadku zastosowań komercyjnych tak różowo nie jest, trzeba zakupić licencję, niestety nie znalazłem ceny na ich stronie.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://www.cgal.org/Manual/last/doc_html/cgal_manual/AABB_tree/figs/teaser.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.cgal.org/Manual/last/doc_html/cgal_manual/AABB_tree/figs/teaser.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Wykobi&lt;/b&gt; jest dużo mniej rozwiniętym (obecnie wersja 0.0.4), ale również ciekawym i dobrze zapowiadającym się projektem na licencji GNU GPL w przypadku zastosowań niekomercyjnych oraz na płatnej licencji w przeciwnym przypadku. Warto zobaczyć co oferuje, na stronie &lt;a href="http://www.wykobi.com/"&gt;http://www.wykobi.com/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;VGL&lt;/b&gt; jest częścią większego pakietu VXL. Nie oferuje zbyt wiele, tak na prawdę jest to zbiór struktur danych oraz kilku podstawowych algorytmów, głównie do transformacji przestrzennych. Jednak uznałem, że warto go odnotować, choćby ze względu na możliwość używania za free po spełnieniu podstawowych warunków o dołączeniu licencji, nie używaniu TM i wyraźnym zaznaczeniu modyfikacji. Cały pakiet VXL oferuje już troszkę więcej - między innymi algorytmy algebry liniowej i operacje na obrazach. &lt;a href="http://vxl.sourceforge.net/"&gt;http://vxl.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Na koniec zostawiłem &lt;b&gt;Generic Geometry Library&lt;/b&gt; (GGL), która nie oferuje wprawdzie tyle co CGAL, ale jest całkowicie darmowa. Jest to kandydat do wcielenia w zestaw libów Boost. Udostępnia kilka ciekawych funkcji jak liczenie otoczki wypukłej (algorytm Grahama), clipping czy proste testy kolizyjne (a raczej bazę do takich testów). &lt;a href="http://geometrylibrary.geodan.nl/index.html"&gt;http://geometrylibrary.geodan.nl/index.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Muszę jednak wspomnieć o dokumentacji do GGL, która jest... tragiczna. Dobrym przykładem jest opis użycia klasy graham do liczenia otoczki wypukłej. Jest on wygenerowany przez doxygena, co bardzo lubię, ale brakuje tam choćby słowa komentarza od autora. &lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Na koniec dodam, że jeśli ktoś zna inne ciekawe liby (najlepiej free) to zachęcam do podzielenia się linkiem :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-4642590027928293409?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/4642590027928293409/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/10/geometria-w-c.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4642590027928293409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4642590027928293409'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/10/geometria-w-c.html' title='Geometria w C++'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-4584507629019568236</id><published>2009-10-01T18:58:00.001+02:00</published><updated>2011-04-03T19:02:52.743+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='demoscene'/><title type='text'>SSequence, 4k intro sequencer</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;This small application purpose is to create sounds (like beat or hat) for 4k intros, that can be later composed into music. The sounds are exported directly into C++ header file (in the form of code that generates them). It was created using C++ and wxWidgets. The tool was never released due to lack of time to finish it. Anyway, it was kind of fun.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/screen02.jpg?attachauth=ANoY7cpuTQdsany1V7KvefaD2f1CLIzhXix-dtS9O8jK_Mrnw6CMcdjPYwuSAo_x2IEkqsd3Gtll7iMwoVnykWW6uZTLbmPCY9LO-QYDXi1oczP3ZmA3xaECSAoyG89bubD1BIxuHpaKC2zYsHEZPsz69G4cA9ZApl77vsvgNa2v35oUUvWnoKYknrGKLeFfu7M5PyX18ZNw&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/screen02.jpg?attachauth=ANoY7cpuTQdsany1V7KvefaD2f1CLIzhXix-dtS9O8jK_Mrnw6CMcdjPYwuSAo_x2IEkqsd3Gtll7iMwoVnykWW6uZTLbmPCY9LO-QYDXi1oczP3ZmA3xaECSAoyG89bubD1BIxuHpaKC2zYsHEZPsz69G4cA9ZApl77vsvgNa2v35oUUvWnoKYknrGKLeFfu7M5PyX18ZNw&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-4584507629019568236?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/4584507629019568236/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/10/ssequence-4k-intro-sequencer.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4584507629019568236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/4584507629019568236'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/10/ssequence-4k-intro-sequencer.html' title='SSequence, 4k intro sequencer'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-2460331954086710848</id><published>2009-09-28T17:09:00.003+02:00</published><updated>2009-09-28T17:54:27.714+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Złom jako stymulator postępu technologicznego</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ponieważ zmęczyło mnie ostatnio trochę hardcorowe pisanie silnika, postanowiłem zrobić sobie małą odskocznię. Wygrzebałem ze strychu laptopa, sprzęt można by powiedzieć archaiczny, bo z prockiem 266MHz, jakąś dwumegową kartą etc. i postanowiłem napisać na nim bibliotekę fizyki 2d, taką, żeby dało się na niej oprzeć płynnie działającą prostą gierkę z fizyką. Nic niezwykłego - jakiś collision response dla convexów, jakiś tam rigid body model etc. Normalnie pewnie nie zwrócił bym na to uwagi, ale z racji sprzętu jakoś mnie tknęło, gdy w jednej z funkcji musiałem zrobić coś takiego:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;// pseudokod&lt;br /&gt;int k = jakies obliczenia;&lt;br /&gt;T* t = new T[k];&lt;br /&gt;// jakies przetwarzanie&lt;br /&gt;delete[] t;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Przy czym funkcja była bardzo krótka, i jak mi się wydawało, alokacja pamięci na heapie była jej wąskim gardłem (na tym sprzęcie jest to wąskie gardło co by nie mówić :P). Mogłem zastosować opcję T t[100] i liczyć, że 100 nie będzie przekroczone, ale to nie jest ani eleganckie ani profesjonalne, w ogóle to jak rosyjska ruletka. No i wtedy mnie tknęło - dlaczego T t[100] jest właściwie szybsze niż new? Dlatego, że alokacja na stosie to tylko przesunięcie wskaźnika stosu, a na heapie to wyszukanie odpowiednio dużego spójnego obszaru, ustawienie flag w jakiejś mapie pamięci (zależnie od niskopoziomowej implementacji zarządzania pamięcią), dopiero potem faktyczne przydzielenie tego obszaru i zwrócenie wskaźnika. Tak powstał pomysł napisania funkcji salloc i sfree. W pełni świadomy problemów z "popieprzeniem stosu" pomiędzy ich wywołaniami postanowiłem zrobić te funkcje jako inline, i tu pojawił się mały problem, leżący w mojej pamięci, a raczej w odwołaniu z niej do specyfikacji C++, która to nie nakazuje aby funkcja inline była faktycznie inline. Mówiąc inaczej - funkcja inline może ale nie musi pomijać całą zabawę z ramką stosu. Tak wpadłem na użycie __forceinline i z bananem na ryju odpaliłem funkcje do testów... banan szybko znikł, segfault, ale dlaczego? Rozkmina chwilę potrwała, w końcu wykonałem taki oto test:&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;__forceinline int stest() {&lt;br /&gt;int toRet;&lt;br /&gt;__asm mov toRet, esp&lt;br /&gt;return toRet;&lt;br /&gt;}&lt;br /&gt;int t1, t2;&lt;br /&gt;__asm mov t1, esp&lt;br /&gt;t2 = stest;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Po wypisaniu t1 i t2 okazało się, że o ile w trybie release są one takie same, o tyle w trybie debug wartości są różne, o zgrozo! Okazało się, że programiści z Microsoftu zrobili sobie joke, nazywając słowo kluczowe __forceinline, bo tak na prawdę ono wcale nie jest force i robi z funkcji inline kiedy chce i jak chce, czyli powiedzieli "cmoknijcie nas w pompkę my i tak lepiej wiemy kiedy inline jest potrzebne". Zresztą popatrzcie co na to &lt;a href="http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx"&gt;MSDN&lt;/a&gt;&lt;br /&gt;Tak więc zapadła decyzja, zrobię to jak koder ANSI C - przy pomocy makro, za co zwolennicy "idealnego C++" by mnie zabili pewnie, ale to nie moja wina, że producenci kompilatorów robią sobie jaja.&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;#define salloc(PTR, M_SIZE) \&lt;br /&gt;__asm sub esp, M_SIZE \&lt;br /&gt;__asm mov PTR, esp&lt;br /&gt;&lt;br /&gt;#define sfree(M_SIZE) \&lt;br /&gt;__asm add esp, M_SIZE&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Dobra, teraz pytanie - czy było warto? Do testu odpalałem funkcje w których tylko alokowałem i zwalniałem pamięć (na 1000 intów), w pętli po 10 000 000 razy (na Athlonie XP 2400+). Wyniki przeszły moje oczekiwania, może nie najśmielsze ale zawsze :P&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Tryb DEBUG:&lt;br /&gt;new: 23.6571&lt;br /&gt;salloc: 0.596729&lt;br /&gt;Tryb RELEASE:&lt;br /&gt;new: 4.29237&lt;br /&gt;salloc: 0.0172891&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Wyniki podane są w sekundach. Zalety są kosmiczne, ale wady też są - wspomniane mieszanie na stosie na pewno nie jest zdrowe dla początkujących koderów, metoda jest raczej przeznaczona dla tych świadomych, rozumiejących co się dzieje na stosie.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-2460331954086710848?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/2460331954086710848/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/09/zom-jako-stymulator-postepu.html#comment-form' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2460331954086710848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2460331954086710848'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/09/zom-jako-stymulator-postepu.html' title='Złom jako stymulator postępu technologicznego'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-2581676206234296217</id><published>2009-09-03T14:03:00.012+02:00</published><updated>2009-09-03T16:58:07.573+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Konstruktory, konstruktory</title><content type='html'>&lt;div style="text-align: justify;"&gt;Załóżmy, że mamy klasę, w której nie ma funkcji wirtualnych (!), po niczym nie dziedziczy (w szczególności wirtualnie), i skomponowana jest tylko z niestatycznych i niestałych obiektów podstawowych. Jest to klasyczny przypadek klas typu Vector2, Vector3, Matrix3x3, Matrix4x4, oraz wielu innych matematycznych (i nie tylko) w grach. W takich klasach bardzo często wywoływany jest konstruktor kopiujący, więc warto byłoby się zastanowić jak taki konstruktor napisać optymalnie (*). Najprostszy sposób, to kopiowanie każdej wartości osobno. Inną możliwością jest wywołanie funkcji w rodzaju memcpy, żeby cały blok danych przekopiować na raz (stąd założenie o funkcjach wirtualnych etc., żeby nie nadpisać vtable pointera), co z kolei powoduje nakład na całą zabawę z ramką stosu. Teoretycznie można to jeszcze zoptymalizować przez modyfikator inline dla konstruktora. Ostatnie podejście, które sprawdziłem to... nie pisanie konstruktora ;P&lt;br /&gt;Do testu przygotowałem 4 klasy - A, B, C i D, wykorzystujące wspomniane 4 podejścia. Konstruktory kopiujące dla A, B i C wyglądają następująco (dla testu drugiego, czyli symulacji macierzy 4x4, test pierwszy odpowiadał wektorowi trójelementowemu):&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;A(const A&amp;amp; a) {&lt;br /&gt;x1 = a.x1; y1 = a.y1; z1 = a.z1; w1 = a.w1;&lt;br /&gt;x2 = a.x2; y2 = a.y2; z2 = a.z2; w2 = a.w2;&lt;br /&gt;x3 = a.x3; y3 = a.y3; z3 = a.z3; w3 = a.w3;&lt;br /&gt;x4 = a.x4; y4 = a.y4; z4 = a.z4; w4 = a.w4;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;B(const B&amp;amp; b) {&lt;br /&gt;memcpy(this, &amp;amp;b, sizeof(B));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline C(const C&amp;amp; c) {&lt;br /&gt;memcpy(this, &amp;amp;c, sizeof(C));&lt;br /&gt;}&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Następnie dla każdej z 4 klas przeprowadziłem identyczny test ( testCycles = 100000000):&lt;pre style="font-family: arial;" class="prettyprint"&gt;for(int i = 0; i &amp;lt; testCycles; i++) {&lt;br /&gt;A acopy = A(a);&lt;br /&gt;}&lt;/pre&gt;Jak wspomniałem, test 1 odpowiadał Vector3, test 2 - Matrix4x4.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/___MDH2-ZWaA/Sp-1zDkkf3I/AAAAAAAACwY/kTR5JGKrZIw/wykres_konstruktory.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 492px; height: 393px;" src="http://lh4.ggpht.com/___MDH2-ZWaA/Sp-1zDkkf3I/AAAAAAAACwY/kTR5JGKrZIw/wykres_konstruktory.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Można się było domyślać, że narzut wywołania funkcji przewyższy zysk przy małej liczbie elementów do skopiowania. Natomiast wynik dla klasy D, z wygenerowanym automatycznie konstruktorem kopiującym jest dosyć zastanawiający, szczególnie dla przypadku 1 (aż z wrażenia dla pewności sprawdziłem, czy kompilator w ogóle kopiował obiekty :P). Więc moja odpowiedź na pytanie (*) - jak optymalnie napisać taki konstruktor brzmi: nie pisać wcale! Kompilator sobie poradzi.&lt;br /&gt;&lt;br /&gt;Przy okazji sprawdziłem jeszcze jedną rzecz. Wielu programistów twierdzi, że lista inicjatorów konstruktora to tylko zabieg stylistyczny i nie różni się od przypisania wartości do obiektu wewnątrz konstruktora. Oczywiście mylnie, bo stosując drugie podejście wywołujemy niejawnie konstruktor obiektu tymczasowego, potem operator przypisania, a potem jeszcze destruktor. Prosty test:&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;class X {&lt;br /&gt;std::string text;&lt;br /&gt;public:&lt;br /&gt;X() {&lt;br /&gt;text = "text";&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class Y {&lt;br /&gt;std::string text;&lt;br /&gt;public:&lt;br /&gt;Y() : text("text") {}&lt;br /&gt;};&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;W pętli wywoływałem tym razem zwykły konstruktor, wynik potwierdza to, co napisałem:&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/___MDH2-ZWaA/Sp-4I80TewI/AAAAAAAACwg/EWUlzeVt3wI/wykres_inicjatory.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 385px; height: 307px;" src="http://lh6.ggpht.com/___MDH2-ZWaA/Sp-4I80TewI/AAAAAAAACwg/EWUlzeVt3wI/wykres_inicjatory.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-2581676206234296217?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/2581676206234296217/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/09/konstruktory-konstruktory.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2581676206234296217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2581676206234296217'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/09/konstruktory-konstruktory.html' title='Konstruktory, konstruktory'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/___MDH2-ZWaA/Sp-1zDkkf3I/AAAAAAAACwY/kTR5JGKrZIw/s72-c/wykres_konstruktory.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-3197382410071332722</id><published>2009-09-01T13:11:00.004+02:00</published><updated>2009-09-01T13:46:38.660+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='indie'/><title type='text'>Mazanie po murach i inne zabawy</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ostatnio sporo czasu spędzam na oglądaniu produkcji niezależnych twórców, w poszukiwaniu inspiracji / pomysłu / weny - niepotrzebne skreślić. W moje ręce wpadła gierka, która wygrała w kategorii "Best Student Game" na Independent Games Festival 2009, pod złowieszczym tytułem "Tag: The Power of Paint". Po oglądnięciu screenów stwierdziłem, że to jakaś lipa - kiepsko (wręcz obciachowo) wyglądający cel shade'owy FPS, w dodatku nie widać przeciwników. No ale przecież zajął 1 miejsce w jakiejś kategorii, więc nie może być tak źle - ściągnąłem i... zakochałem się, genialna gra. Jest to bardzo nietypowe połączenie FPSa i gry logicznej - gatunków biegunowych. Do dyspozycji mamy 3 bronie - z zieloną, czerwoną i niebieską farbą oraz czwarte psikadełko - do zamazywania, coś jak gumka do ścierania. Każda farba ma pewne właściwości, gdy wejdziemy na pomalowaną nią podłogę... ścianę lub sufit. Zielona - powoduje, że nasza postać skacze, czerwona - że biegnie, niebieska - że przykleja się do ścian (dlatego można łazić po sufitach). Ogólnie chodzi o to, żeby tak bazgrać po planszy, żeby dostać się do punktu docelowego. Momentami trzeba sporo się pogłowić, popróbować różnych rozwiązań. Dodatkowo element zręcznościowy powoduje, że choć wiemy jak przeskoczyć z dachu na dach, to musimy do tego podchodzić kilka razy. No i jeszcze to łażenie po ścianach - kto grał w AVP już to przechodził, ale tutaj jest jakoś bardziej zwariowanie, momentami naprawdę mocno gubi się orientację przestrzenną. Warto zagrać. A jeszcze co ciekawe, w assetach znajdują się nieskompilowane shadery i oskryptowanie całej gry w XMLu, więc można ją sobie troszkę pozmieniać bez grzebania w binarkach.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/___MDH2-ZWaA/Sp0E0AYHrkI/AAAAAAAACwQ/1_-oZM6hRXI/s1600-h/Tag_Screenshot_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/___MDH2-ZWaA/Sp0E0AYHrkI/AAAAAAAACwQ/1_-oZM6hRXI/s320/Tag_Screenshot_1.png" alt="" id="BLOGGER_PHOTO_ID_5376458821651115586" border="0" /&gt;&lt;/a&gt;Przy okazji wspomnę jeszcze o 2 gierkach z tego samego festiwalu. Pierwsza to rewelacyjny pomysł na gameplay - &lt;a href="http://www.snapshotgame.com/"&gt;&lt;span style="text-decoration: underline;"&gt;Snapshot&lt;/span&gt;&lt;/a&gt; Możemy robić screeny różnych przedmiotów (np. słonia, drzwi), potem umieszczać te screeny w jakimś miejscu, przenosząc w ten sposób owe przedmioty - np. stawiamy screena ze słoniem przy jakimś pudle, dzięki czemu słoń je przepchnie, albo drzwi na jakiejś ścianie, dzięki czemu będziemy mogli przez nią przejść. Dodatkowo klimatem przypomina troszkę czasy ośmiobitowców. Druga - &lt;a href="http://www.playfeist.net/"&gt;FEIST&lt;/a&gt; spodobała mi się po prostu pod względem artystycznym, niesamowity klimat, zazdroszczę umiejętności grafikowi i designerowi (takie przeciwieństwo wspomnianego wyżej Tag :D).&lt;br /&gt;&lt;br /&gt;A, jeszcze może wypada wspomnieć - samo IGF jest eventem odbywającym się w trakcie GDC. Wspomniana edycja odbyła się już dość dawno, w marcu. Mając fajny projekt na pewno warto się zgłosić, bo nagrody pieniężne są całkiem pokaźne, no i ten prestiż :P&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-3197382410071332722?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/3197382410071332722/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/09/mazanie-po-murach-i-inne-zabawy.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/3197382410071332722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/3197382410071332722'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/09/mazanie-po-murach-i-inne-zabawy.html' title='Mazanie po murach i inne zabawy'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/___MDH2-ZWaA/Sp0E0AYHrkI/AAAAAAAACwQ/1_-oZM6hRXI/s72-c/Tag_Screenshot_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-5916259429210363213</id><published>2009-08-12T19:02:00.000+02:00</published><updated>2009-08-12T19:11:27.540+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>printf - based - listener</title><content type='html'>&lt;div style="text-align: justify; font-family: arial;"&gt;Potrzebowałem zrobić listener dowolnej ilości zmiennych oparty na funkcji o prototypie podobnym do&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;int printf ( const char * format, ... );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;wyzwalany jakąś funkcją (w szczególnym przypadku callbackiem). Na przykład wyświetlający informacje typu FPS w grze, albo jako reakcja na event czy przychodzący z sieci pakiet. Dla uproszczenia tej notki załóżmy, że ma obsługiwać jedynie inty i floaty. Można oczywiście napisać wielką funkcję, w której w zależności od jakiejś zmiennej będziemy wywoływać w switchu printf(napis, int1), printf(napis, int1. int2) etc. aż do 1000 zmiennych różnych typów, czego na pewno nikt nie przekroczy. Ale można też to zrobić inaczej. Moje rozwiązanie jest proste - podajmy parametry bezpośrednio z poziomu asma. W dokumentacjach można wyczytać jak VS (w moim przypadku, bo go używam) wywołuje funkcje (calling convention), jednak warto to sprawdzić w praktyce.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Na początek robimy sobie małą aplikację testową:&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;int main() {&lt;br /&gt;printf("printf call %d %f\n", 1, 2.0f);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/stdio.h&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;Kompilujemy, odpalamy, i (o dziwo) na ekranie wyświetla się napis „printf call 1 2.000000”. Podejrzyjmy wygenerowaną binarkę w desassemblerze, np. w IDA (program jest dostępny w wersji Freeware – troszkę ograniczonej, ale dla przeciętnego człowieka oferuje i tak o wiele za dużo). Interesuje nas poniższy fragment (jeśli nie umiesz znaleźć go w swoim disasmie, warto się pouczyć podstaw RE, choćby z [1] czy [2], czasem się przydają nawet jeśli nie chcemy być RE).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;.text:004113BE                 mov     esi, esp&lt;br /&gt;.text:004113C0                 sub     esp, 8&lt;br /&gt;.text:004113C3                 fld     ds:dbl_415758&lt;br /&gt;.text:004113C9                 fstp    [esp+0D4h+var_D4]&lt;br /&gt;.text:004113CC                 push    1&lt;br /&gt;.text:004113CE                 push    offset aPrintfCallDF&lt;br /&gt;.text:004113D3                 call    ds:printf&lt;br /&gt;.text:004113D9                 add     esp, 10h&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;Jak widać parametry funkcji wrzucane są na stos od końca. Czyli zgodnie z opisem w dokumentacji. Jeśli chodzi o inty sprawa jest banalna - znany wszystkim push wartości. Więc np. zamiast&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;int i = 1;&lt;br /&gt;int j = 2;&lt;br /&gt;printf("printf call %d %d\n", i, j);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;możemy zrobić równoważne:&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;int i = 1;&lt;br /&gt;int j = 2;&lt;br /&gt;&lt;br /&gt;__asm {&lt;br /&gt;push j&lt;br /&gt;push i&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;printf("printf call %d %d\n");&lt;br /&gt;&lt;br /&gt;int add_ = 8;&lt;br /&gt;__asm add esp, add_&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;Na początku wrzucamy zmienne na stos zgodnie z konwencją kompilatora, potem robimy call i na końcu zwiększamy wskaźnik stosu o tyle o ile zmniejszyliśmy go niejawnie przy pushowaniu. Jaki z tego jest zysk? Ano taki:&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;int tablica[5] = {1, 2, 3, 4, 5};&lt;br /&gt;&lt;br /&gt;for(int i = 4; i &gt;= 0; --i) {&lt;br /&gt;int k = tablica[i];&lt;br /&gt;__asm push k&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;printf("printf call %d %d %d %d %d\n");&lt;br /&gt;&lt;br /&gt;int add_ = 4 * 5;&lt;br /&gt;__asm add esp, add_&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;A co z floatami? FLD wrzuca float’a na stos FPU, natomiast FSTP kopiuje pierwszą wartość z tego stosu pod wskazany adres, po czym wykonuje POPa (btw. jest też wersja bez POPa - FST). Trzeba też pamiętać, że potrzebujemy aż 64 bitów.&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;float f = 3.14f;&lt;br /&gt;int floatSize = 8;&lt;br /&gt;__asm {&lt;br /&gt;fld f&lt;br /&gt;sub esp, floatSize&lt;br /&gt;fstp qword ptr [esp]&lt;br /&gt;}&lt;br /&gt;printf("float = %f\n");&lt;br /&gt;__asm add esp, floatSize&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;Samego listenera można teraz zaimplementować na tyle sposobów ilu jest koderów. W moim przypadku cały snippet wygląda tak:&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: arial;" class="prettyprint"&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;vector&gt;&lt;br /&gt;#include &lt;string&gt;&lt;br /&gt;&lt;br /&gt;class PrintfListener {&lt;br /&gt;enum Type {&lt;br /&gt;T_INT,&lt;br /&gt;T_FLOAT&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;struct Value {&lt;br /&gt;Type type;&lt;br /&gt;union V_ {&lt;br /&gt; int* i;&lt;br /&gt; float* f;&lt;br /&gt;} val;&lt;br /&gt;&lt;br /&gt;Value(int* i) { type = T_INT; val.i = i; }&lt;br /&gt;Value(float* f) { type = T_FLOAT; val.f = f; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;std::vector&lt;value&gt; value;&lt;br /&gt;std::string str;&lt;br /&gt;public:&lt;br /&gt;void addParam(int* i) { value.push_back(Value(i)); }&lt;br /&gt;void addParam(float* f) { value.push_back(Value(f)); }&lt;br /&gt;void setString(const std::string&amp;amp; s) { str.assign(s); }&lt;br /&gt;&lt;br /&gt;void use() {&lt;br /&gt;std::vector&lt;value&gt;::iterator it = value.end();&lt;br /&gt;int totalSize = 0;&lt;br /&gt;while(true) {&lt;br /&gt; --it;&lt;br /&gt;&lt;br /&gt; switch(it-&gt;type) {&lt;br /&gt;  case T_INT: {&lt;br /&gt;   int v = *(it-&gt;val.i);&lt;br /&gt;   __asm push v&lt;br /&gt;   totalSize += 4;&lt;br /&gt;  } break;&lt;br /&gt;  case T_FLOAT: {&lt;br /&gt;   float v = *(it-&gt;val.f);&lt;br /&gt;   __asm {&lt;br /&gt;    fld v&lt;br /&gt;    sub esp, 8&lt;br /&gt;    fstp qword ptr [esp]&lt;br /&gt;   }&lt;br /&gt;   totalSize += 8;&lt;br /&gt;  } break;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if(it == value.begin()) break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;printf(str.c_str());&lt;br /&gt;__asm add esp, totalSize&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;int i = 0;&lt;br /&gt;float f = 0.0f;&lt;br /&gt;&lt;br /&gt;PrintfListener listener;&lt;br /&gt;listener.addParam(&amp;amp;i);&lt;br /&gt;listener.addParam(&amp;amp;f);&lt;br /&gt;listener.setString("i = %d, f = %f\n");&lt;br /&gt;&lt;br /&gt;listener.use();&lt;br /&gt;&lt;br /&gt;i = 10;&lt;br /&gt;f = 3.14f;&lt;br /&gt;listener.use();&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/value&gt;&lt;/value&gt;&lt;/string&gt;&lt;/vector&gt;&lt;/stdio.h&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-family: arial;"&gt;Ok, a jak to ugryźć inaczej? Można np. zastosować STLowy string stream i do printfa przekazywać gotowy poskładany string - ale wtedy właściwie tracimy największą zaletę formatującego printfa, więc przy takim podejściu byśmy już pewnie użyli iostream na konsoli i napisali inną funkcję wypisującą w przypadku aplikacji graficznej. Jak ktoś ma inne genialne sposoby (może da się to zrobić dużo prościej?) to będę wdzięczny za wszelkie info :)&lt;br /&gt;&lt;br /&gt;[1] ReverseCraft by Gynvael – dobre źródło dla początkujących z RE: &lt;a href="http://re.coldwind.pl/"&gt;http://re.coldwind.pl/&lt;/a&gt;&lt;br /&gt;[2] Introduction to Reverse Engineering Software by Mike Perry - świetne źródło, troszkę wiekowe, dla początkujących z RE, bardzo dużo informacji od podszewki: &lt;a href="http://www.acm.uiuc.edu/sigmil/RevEng/"&gt;http://www.acm.uiuc.edu/sigmil/RevEng/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-5916259429210363213?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/5916259429210363213/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/08/printf-based-listener.html#comment-form' title='Komentarze (5)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/5916259429210363213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/5916259429210363213'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/08/printf-based-listener.html' title='printf - based - listener'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-2029025633755542662</id><published>2009-06-01T17:03:00.002+02:00</published><updated>2011-04-03T17:37:04.812+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='demoscene'/><title type='text'>Birthday demo</title><content type='html'>&lt;div style="text-align: justify;"&gt;This piece of demoscene was created for my friend, Kasia Wasak, on her 22nd birthday. There were some typical demoscene effects included, like growing weeds and moving spheres with environment mapping using dynamic cube-mapping technique.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen4.jpg?attachauth=ANoY7cphRK8bSfDMyFkjR3lZtcrdKL5ojj_PnYbD6Pjy7dGJDIHl9WBfoKxeVDqUUx6kJ4QVqQY4cZuUwVWl11J14wPcRqihc_zn06y0_rBXr61S6TdWZfVC7ub1j44OelMz6kd2GcVXUahV9E3zYAcX_iP4feNTCdvhq5EsRwO9FYuCb44Yd5HILBbYG_oLSmNOY5cVx4ov&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen4.jpg?attachauth=ANoY7cphRK8bSfDMyFkjR3lZtcrdKL5ojj_PnYbD6Pjy7dGJDIHl9WBfoKxeVDqUUx6kJ4QVqQY4cZuUwVWl11J14wPcRqihc_zn06y0_rBXr61S6TdWZfVC7ub1j44OelMz6kd2GcVXUahV9E3zYAcX_iP4feNTCdvhq5EsRwO9FYuCb44Yd5HILBbYG_oLSmNOY5cVx4ov&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen3.jpg?attachauth=ANoY7cqIFz8k9S3u8f9xgGEDc_CJSKCutqKUYGAmsg_Je6PZhKH_BPFILef9DGUia6koz3FDhzOxcKifkxSJSxYxrPs51BEMcsKjZ3GkNYLkChhGwR-qON6Qy2TzCNRh8y7kaZJM2sDJpqS57fI6qhFGqPmTDhgYEHZ_oD1zLeRc-KkNfN0hmK4mM2jOl-3w7DPThak-I7Lx&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen3.jpg?attachauth=ANoY7cqIFz8k9S3u8f9xgGEDc_CJSKCutqKUYGAmsg_Je6PZhKH_BPFILef9DGUia6koz3FDhzOxcKifkxSJSxYxrPs51BEMcsKjZ3GkNYLkChhGwR-qON6Qy2TzCNRh8y7kaZJM2sDJpqS57fI6qhFGqPmTDhgYEHZ_oD1zLeRc-KkNfN0hmK4mM2jOl-3w7DPThak-I7Lx&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen2.jpg?attachauth=ANoY7crr8Ew8KntJnNLNcyr9__R3DO_sL0AdHURKr1oIo3ycDSjmeRRYxot4KgxbJ6yyxoT2hETJBQqzeGxSIp0MjlasjjWyiGOZrc5XY21lZ3dpkh94oWjBMfLmEn2qAlOBmrTh7u13q19Q5Mg7bNHl0GANtjpGmK3K_QpfTLuHWzKKkI4pwAoIoJNfULMV1Nvy3iT1kfCs&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen2.jpg?attachauth=ANoY7crr8Ew8KntJnNLNcyr9__R3DO_sL0AdHURKr1oIo3ycDSjmeRRYxot4KgxbJ6yyxoT2hETJBQqzeGxSIp0MjlasjjWyiGOZrc5XY21lZ3dpkh94oWjBMfLmEn2qAlOBmrTh7u13q19Q5Mg7bNHl0GANtjpGmK3K_QpfTLuHWzKKkI4pwAoIoJNfULMV1Nvy3iT1kfCs&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen1.jpg?attachauth=ANoY7coVH5EzeC98OMPmNAj-0UDMRR7BKhiyEeNNK77jG9QWycZlahUCdm_pz_ajfiDSDUjtWkeOhm3t0o5p1cXLUzv6f4VkgL-wtY0SFqRv_d1SmmUIBZtc2OgPKzyii5VNlArOP2bv0zMSFT4ZwZVZRf_u3xwE4CMTzPl2BgCU_8tNSPL-cKFu8N6PUDu-UtY8UMY5Lhjw&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen1.jpg?attachauth=ANoY7coVH5EzeC98OMPmNAj-0UDMRR7BKhiyEeNNK77jG9QWycZlahUCdm_pz_ajfiDSDUjtWkeOhm3t0o5p1cXLUzv6f4VkgL-wtY0SFqRv_d1SmmUIBZtc2OgPKzyii5VNlArOP2bv0zMSFT4ZwZVZRf_u3xwE4CMTzPl2BgCU_8tNSPL-cKFu8N6PUDu-UtY8UMY5Lhjw&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen5.jpg?attachauth=ANoY7coogouM1zprOwFQulE5kG4zQ-Tp1uQBrOoJS8fHe-SJwqZaPfkzCCH1Nmb7f89JX3AFb9PE3k9YJxeqhbsYJlgavrsNx1HqUreXyFEWhANugXljL5zpBUkA03o8kWHEqRf4sC2OcYhKc2vCIuof3hgQwLfUeWMe8J0Qj611tzMfHvIS0RsomsrQZpt58kpe22zAXdIx&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/laurka_screen5.jpg?attachauth=ANoY7coogouM1zprOwFQulE5kG4zQ-Tp1uQBrOoJS8fHe-SJwqZaPfkzCCH1Nmb7f89JX3AFb9PE3k9YJxeqhbsYJlgavrsNx1HqUreXyFEWhANugXljL5zpBUkA03o8kWHEqRf4sC2OcYhKc2vCIuof3hgQwLfUeWMe8J0Qj611tzMfHvIS0RsomsrQZpt58kpe22zAXdIx&amp;amp;attredirects=0" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-2029025633755542662?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/2029025633755542662/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/06/birthday-demo.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2029025633755542662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/2029025633755542662'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/06/birthday-demo.html' title='Birthday demo'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-5617517186365643722</id><published>2009-04-25T17:26:00.001+02:00</published><updated>2011-04-03T17:33:59.989+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><category scheme='http://www.blogger.com/atom/ns#' term='demoscene'/><title type='text'>Metaballs 2D</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just a demoscene effect, kind of presentation. But nothing big. In this small project I created dynamic metaballs (isosurfaces) and synchronized it with Drum &amp;amp; Bass music in the background. There were also some fancy electrical breakdowns in this demo, that occured when one metaball was close to another, and the other was then attracted by the first one. One of the metaballs was controlled by input device (mouse). And there were also some equalizers in this demo ;) Everything was created in C++ and CG (all metaball stuff is calculated on the GPU, with some simple shader).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://sites.google.com/site/soboltech/16.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/18.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://sites.google.com/site/soboltech/18.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="398" src="http://sites.google.com/site/soboltech/17.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-5617517186365643722?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/5617517186365643722/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/04/metaballs-2d.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/5617517186365643722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/5617517186365643722'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/04/metaballs-2d.html' title='Metaballs 2D'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-6809289136467448065</id><published>2009-03-28T17:12:00.027+01:00</published><updated>2011-04-03T17:26:04.050+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IGK'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='compo'/><title type='text'>Don't Kill The Babcia (Granny)</title><content type='html'>&lt;div style="text-align: justify;"&gt;The game was created in 8 hours during 6th Conference of Games Engineering in Siedlce, Poland. Compo theme was "psychodelic game". Our team was: me (Sobol, most of the code), Słoń (code &amp;amp; gfx), Koshmaar (some code &amp;amp; gfx &amp;amp; sfx) and Artpoz (code &amp;amp; sfx &amp;amp; gfx).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Our entry was and MMO game (yeah, right - Massive Multiplayer Offline :P), because up to 24 people could could play on one keyboard. The goal of the game is NOT to kill grannies, that are talking some bullshit and swearing at you. Sometimes granny takes a white rabbit out of her pocket and throws it at you. You have to press your key then to block it, otherwise you loose frag. Sometimes granny tries to frighten you by taking the rabbit, but not throwing. If you press the key in such a moment, you loose frag, because granny dies. Once every couple of seconds, there is a keybord shuffle, and you have to find your new key.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We placed 8th out of 9 teams. That's not too good, I agree. But the main problem in my opinion is that we were not able to present our game to the public, because they didn't understand what we were doing. In my opinion this game was kind of fun :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/babcia_scr1.jpg?attachauth=ANoY7cqTwWJbRFlTa7HYqPs1MCWitkBHUPOj7a5W9Y8UWQAOxDuNdzopddatrdEbuOfnU9KY0mZ2H9d-pBvdM6_jjWHy__wTj19kqvRLvzbvALvMNxAmyUTZzTVkS8m61QBTDxXvyV3ZaFDX-X0iEEUi-_sZC6QzM_Yau-E8bDHr6mgAMr8KBmZ55AubCmPm2BDmxBLWDiA2&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/babcia_scr1.jpg?attachauth=ANoY7cqTwWJbRFlTa7HYqPs1MCWitkBHUPOj7a5W9Y8UWQAOxDuNdzopddatrdEbuOfnU9KY0mZ2H9d-pBvdM6_jjWHy__wTj19kqvRLvzbvALvMNxAmyUTZzTVkS8m61QBTDxXvyV3ZaFDX-X0iEEUi-_sZC6QzM_Yau-E8bDHr6mgAMr8KBmZ55AubCmPm2BDmxBLWDiA2&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/babcia_scr2.jpg?attachauth=ANoY7cocHVSzrvEcsTKKV-FjApFKfN3qez5ocvLxRUrXVFzUGCY9n1coJvrsMv-RVwqUHDq2CPgmXIy8HFiMFFgRrhCE-AGHf8JH_opKJvs9pnzdjKmDZ2jM301P8wjRdVvfDKtAKNCcNgKAsbaQ3zNDWgL0nEsBG8wI_g4eDPPhhHV7P57nmdjeiD-N40sjYQ98ojK8z-Gt&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/babcia_scr2.jpg?attachauth=ANoY7cocHVSzrvEcsTKKV-FjApFKfN3qez5ocvLxRUrXVFzUGCY9n1coJvrsMv-RVwqUHDq2CPgmXIy8HFiMFFgRrhCE-AGHf8JH_opKJvs9pnzdjKmDZ2jM301P8wjRdVvfDKtAKNCcNgKAsbaQ3zNDWgL0nEsBG8wI_g4eDPPhhHV7P57nmdjeiD-N40sjYQ98ojK8z-Gt&amp;amp;attredirects=0" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-6809289136467448065?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/6809289136467448065/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2009/03/dont-kill-babcia-granny.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6809289136467448065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6809289136467448065'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2009/03/dont-kill-babcia-granny.html' title='Don&apos;t Kill The Babcia (Granny)'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-8157543510980003729</id><published>2008-12-24T16:54:00.001+01:00</published><updated>2011-04-03T17:02:54.477+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>SA4011, Mirco Machines remake</title><content type='html'>&lt;div style="text-align: justify;"&gt;This game was created as a term project for "Advanced C++" classes on WEiTI, Warsaw University of Science. The game was supposed to be a crazy variation over Codemasters Micro Machines. We created a game that several people could play over TCP/IP connection, and got the highest mark possible (5). You could choose between 6 unique vehicles (driven by me and my 5 friends). Unfortunately it's too bugy to release on the internet.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/micromachines.jpg?attachauth=ANoY7cpKs2SVkl_QvGo9IATflbbyqqP55ZXS9NR4IcJNeK7QHPEBxCtx7yXWIoJ2zlNfFnNwPVNNWyNWrv00fCGMniaTbXNE1Hx3cWIKYL12M9LAmOQnrUa1-ThM0JTtjXzWT9HXoKkIW01b_XZ6sFk9FBtgDYTVP1i6aOy4P1xKcevwUcBm9rqeMMpdLH5rdLsg6tRuk3OJ&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/micromachines.jpg?attachauth=ANoY7cpKs2SVkl_QvGo9IATflbbyqqP55ZXS9NR4IcJNeK7QHPEBxCtx7yXWIoJ2zlNfFnNwPVNNWyNWrv00fCGMniaTbXNE1Hx3cWIKYL12M9LAmOQnrUa1-ThM0JTtjXzWT9HXoKkIW01b_XZ6sFk9FBtgDYTVP1i6aOy4P1xKcevwUcBm9rqeMMpdLH5rdLsg6tRuk3OJ&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;span id="goog_85175277"&gt;&lt;/span&gt;&lt;span id="goog_85175278"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/pizd.jpg?attachauth=ANoY7cq7Y1LGSfVd-qoPIkR08HW_ClAkBT5sLdQ0cBLyFztQ4hwitmcGQiCu0Bg5eZUgwUR7ADgePVJAQ-q78TBIET30x_MnyLhIaaylJvK8wcR94rqx8gWI3mCirRaYqO3d9Gx3p77JSmRYT1M9S1dH4FMMXEF40f5alCZJzln0UkwumhV341tQ2UxSR87azfWbmRwpioKk&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/pizd.jpg?attachauth=ANoY7cq7Y1LGSfVd-qoPIkR08HW_ClAkBT5sLdQ0cBLyFztQ4hwitmcGQiCu0Bg5eZUgwUR7ADgePVJAQ-q78TBIET30x_MnyLhIaaylJvK8wcR94rqx8gWI3mCirRaYqO3d9Gx3p77JSmRYT1M9S1dH4FMMXEF40f5alCZJzln0UkwumhV341tQ2UxSR87azfWbmRwpioKk&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/slon2.jpg?attachauth=ANoY7cqBGllPfK3yRkA2YEpE7VmKE0wfV0oWly4yJoVzpGTHSxn-asU4l_5jeCoG2Y3wgsfTLSMXLuhbCHurTMWXVAO50lidY8z5YT_MpgoOgbaVm7WGtZXzkB_FJ7WeBKboTm4MrIQJX4kpKTel_2vW75MJ7mJDCrLSIiIJTtNdY5cAvzgPppp6Jt6fqCFUGnOIInwzUBgJ&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/slon2.jpg?attachauth=ANoY7cqBGllPfK3yRkA2YEpE7VmKE0wfV0oWly4yJoVzpGTHSxn-asU4l_5jeCoG2Y3wgsfTLSMXLuhbCHurTMWXVAO50lidY8z5YT_MpgoOgbaVm7WGtZXzkB_FJ7WeBKboTm4MrIQJX4kpKTel_2vW75MJ7mJDCrLSIiIJTtNdY5cAvzgPppp6Jt6fqCFUGnOIInwzUBgJ&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/slon.jpg?attachauth=ANoY7cpXOQ7x4E88xUjrs9fHQU_Uz_XbhA2x1u6FV4E_AsabINj2ZxF1VyY1oFN6KuBVmqriaGW8BdF7FMC2DTCC04iWzcrT5PW1rWzrXrDyz-SYjVaUoU6sIWvUSklRS-B1ESKDQEUrU_qTh0Qe_BrDG0l1x80O0tGXUYQUlJyVOc8fQX4_y0CmgTPJvAtwbITlIIuWJTuf&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/slon.jpg?attachauth=ANoY7cpXOQ7x4E88xUjrs9fHQU_Uz_XbhA2x1u6FV4E_AsabINj2ZxF1VyY1oFN6KuBVmqriaGW8BdF7FMC2DTCC04iWzcrT5PW1rWzrXrDyz-SYjVaUoU6sIWvUSklRS-B1ESKDQEUrU_qTh0Qe_BrDG0l1x80O0tGXUYQUlJyVOc8fQX4_y0CmgTPJvAtwbITlIIuWJTuf&amp;amp;attredirects=0" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/sputnik.jpg?attachauth=ANoY7craGXDeMYRuWqmMPiHMQ2VFosDiXHifLW6YDOAVHsN6WIUDSAPaz4p-x61UptUlIVC1j92U7nb4kAABDJDS57jcXbe5yzWC0sRJHwTdIYRD-RP8glJ5oZfL_GHcWI0nV0qnR49eOPy4MmfINb8cbdaAhzzlnW3dCmI_g4yGhSqUIsy6u1mFeE8kvZpISOiY1sWxir8a&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/sputnik.jpg?attachauth=ANoY7craGXDeMYRuWqmMPiHMQ2VFosDiXHifLW6YDOAVHsN6WIUDSAPaz4p-x61UptUlIVC1j92U7nb4kAABDJDS57jcXbe5yzWC0sRJHwTdIYRD-RP8glJ5oZfL_GHcWI0nV0qnR49eOPy4MmfINb8cbdaAhzzlnW3dCmI_g4yGhSqUIsy6u1mFeE8kvZpISOiY1sWxir8a&amp;amp;attredirects=0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Our team was:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Michał "Sobol" Sobiecki (me)&lt;/li&gt;&lt;li&gt;Maciek "Słoń" Stefańczyk&lt;/li&gt;&lt;li&gt;Kacper "Szkudi" Szkudlarek&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-8157543510980003729?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/8157543510980003729/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2008/12/sa4011-mirco-machines-remake.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/8157543510980003729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/8157543510980003729'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2008/12/sa4011-mirco-machines-remake.html' title='SA4011, Mirco Machines remake'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-6500525267796170889</id><published>2008-05-18T16:47:00.000+02:00</published><updated>2011-04-03T16:53:23.427+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='demoscene'/><category scheme='http://www.blogger.com/atom/ns#' term='compo'/><title type='text'>Think, 4k intro</title><content type='html'>&lt;div style="text-align: justify;"&gt;Yeah, what can I say? Pure demoscene. This 4k intro (size limited to 4kb) was my entry for gamedev.pl demoscene compo, on may 2008, where I took 2nd place. Video rip was placed on&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=YzbN8qFpFaE"&gt;YouTube&lt;/a&gt;, and there was also some entry on&amp;nbsp;&lt;a href="http://pouet.net/prod.php?which=50578"&gt;Pouet&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/4k_old.jpg?attachauth=ANoY7cpefBbTeEWGr7weoPMTQZHphebPoAbW1m3ZLOZfKufQy555Ds2IBtFdU0XSwzKmJl502VkBNJPCASyKS1jCHbh5-OzxvEfYmY9cUPa8giwu9rpGkxjOM9t5tPO1ITtXTSnrYz0On_cbWKHHcYgqh4iPTJUN_ur9jO3yIEk7k1lxmeVQv32zDkM9Ze_XkPRnKAdQGfrb&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/4k_old.jpg?attachauth=ANoY7cpefBbTeEWGr7weoPMTQZHphebPoAbW1m3ZLOZfKufQy555Ds2IBtFdU0XSwzKmJl502VkBNJPCASyKS1jCHbh5-OzxvEfYmY9cUPa8giwu9rpGkxjOM9t5tPO1ITtXTSnrYz0On_cbWKHHcYgqh4iPTJUN_ur9jO3yIEk7k1lxmeVQv32zDkM9Ze_XkPRnKAdQGfrb&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/_/rsrc/1259709295925/50578-medium-init-.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://sites.google.com/site/soboltech/_/rsrc/1259709295925/50578-medium-init-.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-6500525267796170889?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/6500525267796170889/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2008/05/think-4k-intro.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6500525267796170889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6500525267796170889'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2008/05/think-4k-intro.html' title='Think, 4k intro'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-6930998400557039410</id><published>2008-04-01T16:35:00.002+02:00</published><updated>2011-04-03T16:46:42.756+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='compo'/><title type='text'>Too fast, too rabie</title><content type='html'>&lt;div style="text-align: justify;"&gt;"Too fast, too rabie" ("Szybcy i ze wścieklizną") is a 2D platform game created as a term project for Event Driven Programming classes. The first version was released after one week of development on gamedev.pl compo, where it took 2nd place. The game was created using J2SE, JOGL (OpenGL 4 Java) and Swing for map editor.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_04.jpg?attachauth=ANoY7cqITwxwgiSWHxeZ8WTtmuaDP__azUsGLMvqPPd-z4xRgc9wWjq1pRXXOXMTPqK1wWI9Z9R-bF4gMBw4OZMsKx8WwgXIb3hR8o3IZmcNR2BcpQojffczTa_3iYr6FxvK5yFdDAO_hE0ren-o1Mp0sxinvkk_UWGFb6C3yRqD4BH8om7Cog0gqs9TJr93mlr2t4V6Z3es&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_04.jpg?attachauth=ANoY7cqITwxwgiSWHxeZ8WTtmuaDP__azUsGLMvqPPd-z4xRgc9wWjq1pRXXOXMTPqK1wWI9Z9R-bF4gMBw4OZMsKx8WwgXIb3hR8o3IZmcNR2BcpQojffczTa_3iYr6FxvK5yFdDAO_hE0ren-o1Mp0sxinvkk_UWGFb6C3yRqD4BH8om7Cog0gqs9TJr93mlr2t4V6Z3es&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_02.jpg?attachauth=ANoY7coNhzldUNu3mhSjbT8QoIgKa0t1L5aQNovE0RtPqW5GHZhzpiBQawQRCKBRSrfYMtpUzypq-NswZ4fKtLWg_C-r-jiuT9UKaq6c_F37Rd2fz6xoMiX6nHpaxfaez2ajbgW6oW23GGxQcU9DUHSfBJlJ7Pjs71Qcf32JBGwKLp63B7PPqR9mYuPhiVhSKg65lYzCgRZK&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_02.jpg?attachauth=ANoY7coNhzldUNu3mhSjbT8QoIgKa0t1L5aQNovE0RtPqW5GHZhzpiBQawQRCKBRSrfYMtpUzypq-NswZ4fKtLWg_C-r-jiuT9UKaq6c_F37Rd2fz6xoMiX6nHpaxfaez2ajbgW6oW23GGxQcU9DUHSfBJlJ7Pjs71Qcf32JBGwKLp63B7PPqR9mYuPhiVhSKg65lYzCgRZK&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_03.jpg?attachauth=ANoY7cowO4eDJ55zkrieD7IVHbjfAkxpVHLeHTtfOUcu4VgwKGM4T8zeTA-86NGtXE_40cPadk_AwCSP9OKjiwvbxDFdFUHmi53Amqzxsdi5Fetfk6m3ceHGFxraLF4pmaqriLLb_qa9G4-u55oMJ8NMvdYRH468E6kn-7DZ74YyP44Oi84Bmk9YlvBkgcrh7rIElE6tag-J&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_03.jpg?attachauth=ANoY7cowO4eDJ55zkrieD7IVHbjfAkxpVHLeHTtfOUcu4VgwKGM4T8zeTA-86NGtXE_40cPadk_AwCSP9OKjiwvbxDFdFUHmi53Amqzxsdi5Fetfk6m3ceHGFxraLF4pmaqriLLb_qa9G4-u55oMJ8NMvdYRH468E6kn-7DZ74YyP44Oi84Bmk9YlvBkgcrh7rIElE6tag-J&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_01.jpg?attachauth=ANoY7cpKKUWOQUwPRotKGWMJi6fKiMMBQvNKNvMJzp_FgIQyS5AkUkR-EiZwDrwE06QmihqkiA_VPEDCLO7l9FSAEpjrBpOC71fEPJFS6bhHwT1W_rHcSzv_5JgZWtnNRHyH-rwwZvRb8NAaED4p3abBBJ50v3MWObeXZDXfLUIlFXDhsCVtG2bjadsqUSdj4yFxIqlbzCZ3&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/PROZ_01.jpg?attachauth=ANoY7cpKKUWOQUwPRotKGWMJi6fKiMMBQvNKNvMJzp_FgIQyS5AkUkR-EiZwDrwE06QmihqkiA_VPEDCLO7l9FSAEpjrBpOC71fEPJFS6bhHwT1W_rHcSzv_5JgZWtnNRHyH-rwwZvRb8NAaED4p3abBBJ50v3MWObeXZDXfLUIlFXDhsCVtG2bjadsqUSdj4yFxIqlbzCZ3&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/releaseproz.rar?attredirects=0"&gt;[DOWNLOAD]&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Lucida Grande', 'Lucida Sans', Verdana, Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-6930998400557039410?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/6930998400557039410/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2008/04/too-fast-too-rabie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6930998400557039410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/6930998400557039410'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2008/04/too-fast-too-rabie.html' title='Too fast, too rabie'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-8467304638199063185</id><published>2007-03-01T16:14:00.001+01:00</published><updated>2011-04-03T16:35:00.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><title type='text'>URPL28, sci-fi RTS game</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/urpl28_title.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://sites.google.com/site/soboltech/urpl28_title.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Quote from original project site:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;i&gt;"URPL28 is a real time strategy game. Player can choose between two game modes - campaign and free play and three races (...) There are three times of day, and each race has supremacy during one of them. (...) It's a unique combination of fantasy and science fiction genres. (...)"&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;The game was created in 5 months (September 2006 - february 2007). The project was abandoned after releasing tech demo (the release was on time) due to the beginning of my Bachelor course.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;u&gt;Credits:&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Idea, Code &amp;amp; Design - me ("Sobol" , M.Sobiecki)&lt;/li&gt;&lt;li&gt;2D artist - "BlackHawk", P.Lenart&lt;/li&gt;&lt;li&gt;Sounds &amp;amp; music - "Beleg", R.Wieczorek&lt;/li&gt;&lt;li&gt;www - cRgh0sT&lt;/li&gt;&lt;li&gt;Testing - Cenobium team (specialized in reversing and IRC :P)&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;u&gt;Thanks guys for your help and support!&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/urpl28_screen02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://sites.google.com/site/soboltech/urpl28_screen02.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/urpl28_screen01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://sites.google.com/site/soboltech/urpl28_screen01.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/urpl28_screen00.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://sites.google.com/site/soboltech/urpl28_screen00.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/urpl28_screen03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://sites.google.com/site/soboltech/urpl28_screen03.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sites.google.com/site/soboltech/URPL28_TechDemo.rar"&gt;[DOWNLOAD, Tech Demo 2k7]&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-8467304638199063185?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/8467304638199063185/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2007/03/urpl28-sci-fi-rts-game.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/8467304638199063185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/8467304638199063185'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2007/03/urpl28-sci-fi-rts-game.html' title='URPL28, sci-fi RTS game'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2062954633360869709.post-9167630573852080082</id><published>2007-01-01T15:36:00.022+01:00</published><updated>2011-04-03T17:11:41.464+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portfolio'/><category scheme='http://www.blogger.com/atom/ns#' term='compo'/><title type='text'>Big Trouble in Moomins Valley</title><content type='html'>&lt;div style="text-align: justify;"&gt;The game took first place in gamedev.pl 2006 Christmas compo.&amp;nbsp;The theme of this compo was "Moomins or some other popular cartoon". I named it "Big Trouble in Moomins Valley" ("Wielka Draka w Dolinie Muminków") It was created in 9 days, from scratch. Although it was quite buggy, it allowed two players to play against each over over TCP/IP connection.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/2k7compoo_screen.jpg?attachauth=ANoY7coQ-xfWrx-rdb3kF9TJAUrGEQzCyXJN5NgL8y3GHOQzTLEZnesmYyseKhEC4k1DlGQoaS5kNYOHeIZMLtR-cYGB9wWLMkjnsTCd_S6VJ8K-Szphx3alS2HyiNDWN0A3xOP3Gmw6OnIFlbpUN9NMhuXGpcPqRwj46ca3zqypFVThKMhxuKwMetU2ChyAViB_iklZW5juXZIiLOYXiJG7yWcYfIZalA%3D%3D&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/2k7compoo_screen.jpg?attachauth=ANoY7coQ-xfWrx-rdb3kF9TJAUrGEQzCyXJN5NgL8y3GHOQzTLEZnesmYyseKhEC4k1DlGQoaS5kNYOHeIZMLtR-cYGB9wWLMkjnsTCd_S6VJ8K-Szphx3alS2HyiNDWN0A3xOP3Gmw6OnIFlbpUN9NMhuXGpcPqRwj46ca3zqypFVThKMhxuKwMetU2ChyAViB_iklZW5juXZIiLOYXiJG7yWcYfIZalA%3D%3D&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/muminy_menu.jpg?attachauth=ANoY7crhHpVlSbhfmODHr10sTsESSmejGCvA1OJUB3Upovdc5sj9rrXh1kJMo89UPJqVc0EmCI0wRz1P_XuO_s4vPzZJIZP5AQ099W5VrALrajoeGkj4_ClJVpKQ6I96oGDnUfLD_mb9UVU2OAnabwSA07Lk39KUx4quT_wYprfygodYW66Gd3UF-fbdhDFq4uJAokeDqz-M&amp;amp;attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://5806582967201166236-a-1802744773732722657-s-sites.googlegroups.com/site/soboltech/muminy_menu.jpg?attachauth=ANoY7crhHpVlSbhfmODHr10sTsESSmejGCvA1OJUB3Upovdc5sj9rrXh1kJMo89UPJqVc0EmCI0wRz1P_XuO_s4vPzZJIZP5AQ099W5VrALrajoeGkj4_ClJVpKQ6I96oGDnUfLD_mb9UVU2OAnabwSA07Lk39KUx4quT_wYprfygodYW66Gd3UF-fbdhDFq4uJAokeDqz-M&amp;amp;attredirects=0" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sobol.tech.googlepages.com/final_c2k7.rar"&gt;[DOWNLOAD]&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2062954633360869709-9167630573852080082?l=soboltech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soboltech.blogspot.com/feeds/9167630573852080082/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://soboltech.blogspot.com/2007/01/big-trouble-in-moomins-valley.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/9167630573852080082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2062954633360869709/posts/default/9167630573852080082'/><link rel='alternate' type='text/html' href='http://soboltech.blogspot.com/2007/01/big-trouble-in-moomins-valley.html' title='Big Trouble in Moomins Valley'/><author><name>Sobol</name><uri>http://www.blogger.com/profile/03482750071918079625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
