<?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-14442680</id><updated>2012-02-16T23:03:09.592-05:00</updated><category term='space'/><category term='linux'/><category term='msvc'/><category term='xml'/><category term='laser'/><category term='darkoverlords'/><category term='introduction'/><category term='ogre'/><category term='gun'/><category term='refactor'/><category term='gameplay'/><category term='unittest'/><category term='core'/><category term='robot'/><category term='graphics'/><category term='music'/><category term='jettank'/><category term='event'/><category term='migrate'/><category term='crosshair'/><category term='youtube'/><category term='missile'/><category term='movement'/><category term='gui'/><category term='controller'/><category term='weapon'/><category term='raknet'/><category term='sound'/><category term='video'/><category term='scene'/><category term='xvidcap'/><category term='network'/><category term='physics'/><category term='framework'/><category term='fmod'/><category term='thruster'/><category term='damage'/><category term='kdevelop'/><category term='NASA'/><category term='replication'/><category term='google'/><title type='text'>Ukrainian Rumble 2</title><subtitle type='html'>Multiplayer Vehicle Battles in a Destructible Environment</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14442680.post-1713963677023998039</id><published>2007-08-17T14:02:00.000-04:00</published><updated>2007-08-17T14:59:34.212-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='laser'/><category scheme='http://www.blogger.com/atom/ns#' term='gun'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><title type='text'>Rebirth of Development: Lasers to the rescue!</title><content type='html'>Man, it's been a while since I really really got into the code of URumble. Reasons to stay away from it for now are more psychological than programming, so I'll stay away from these for now.&lt;br /&gt;&lt;br /&gt;However, the good news is I did not forget my URumble codebase, it's easy to get back onto the horse and easy to recall all class structures, all connection between classes, files, libraries. Just awesome, better than I expect from myself.&lt;br /&gt;&lt;br /&gt;As a proof, I was able to implement a whole new gun: laser in a just a few hours, and then add a graphical effect for it within 3 hours - and this is while still being bothered by external noises. (Why does a world has to exist while I code? Geez.)&lt;br /&gt;&lt;br /&gt;Here's a screenshot of a laser in effect, and you can even see some consoles behind it that shows some details behind the scenes, and the development environment I usually have. Instrumental, calm, positive music is a must, of course.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/mr.olexander/UkrainianRumble2/photo#5099733945578864738"&gt;&lt;img src="http://lh5.google.com/mr.olexander/RsXlAQM6wGI/AAAAAAAAABI/nRN2r4X8I_A/s144/laser_born.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some really Cool things behind this gun. One is that I have developed an entire XML framework around vehicles. Now, guns can be assigned via XML text files without having to edit the code. This is very important, since it allows for faster development, since I don't need to worry about various guns setups while I code new features.&lt;br /&gt;&lt;br /&gt;It took some effort and thinking to create a good XML structure for that. I don't think I nailed it yet. But it is definitely good enough right now, and thus it is perfect within the context of current time. Tomorrow I may have to add something else, and thus it won't be perfect anymore, but that's the way it ought to be developed: "just right for now."&lt;br /&gt;&lt;br /&gt;P.S. And previous tasks of replicating damage over network are done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-1713963677023998039?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/1713963677023998039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=1713963677023998039' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/1713963677023998039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/1713963677023998039'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2007/08/rebirth-of-development-lasers-to-rescue.html' title='Rebirth of Development: Lasers to the rescue!'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-7460598480301610396</id><published>2006-12-17T19:33:00.000-05:00</published><updated>2006-12-17T20:34:57.794-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='weapon'/><category scheme='http://www.blogger.com/atom/ns#' term='damage'/><title type='text'>Replicating Weapons and Damage</title><content type='html'>This replication is more involved than the movement replication I did previously. It involves firing a missile, homing in on the correct target, insuring unique missile id across the network, placing explosions in correct places once the missile hits, and replicating broken joints in physical simulation.&lt;br /&gt;&lt;br /&gt;All of the above requires decent amount of designing. Just imagine entangling those, and you will get yourself a really messed up system.&lt;br /&gt;&lt;br /&gt;So far I had only made on major change - I added robot owner for each gun and missile shot. This was needed to properly report missile events to other clients with ability to check if the missile was shot by a local player (and thus needs to be replicated) or by a remote player (and thus does not need to be replicate).&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;Basic network framework is being tested by every addition of network events. Every new event tests the framework for extendability and maintainability. The framework holds well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-7460598480301610396?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/7460598480301610396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=7460598480301610396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/7460598480301610396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/7460598480301610396'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/12/replicating-weapons-and-damage.html' title='Replicating Weapons and Damage'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-9168174571555621089</id><published>2006-11-25T11:20:00.000-05:00</published><updated>2006-11-25T11:39:24.413-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robot'/><category scheme='http://www.blogger.com/atom/ns#' term='movement'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><title type='text'>Movement Replication Completed</title><content type='html'>The idea has proven to be good.&lt;br /&gt;&lt;br /&gt;Now, any time a vehicle moves (by player or by environment, etc.) the event of that movement is sent to the rest of the players. Those other clients receive a message, read where that vehicle must be, and let the robot handle the operation of the vehicle to achieve the desired position and rotation.&lt;br /&gt;&lt;br /&gt;According to my tests, it definitely overcomes lag. The worst case scenario is when an event comes in rather late (lag). The vehicle does lag behind the actual location on the originating client, but the robot does move the vehicle to the desired location and rotation. So, this works great.&lt;br /&gt;&lt;br /&gt;I have also implemented accuracy setting. Movement updates are sent every time current position is &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt; units far away from the last sent position, or the rotation is &lt;span style="font-weight: bold;"&gt;R&lt;/span&gt; degrees different from the last rotation sent. Currently, this pair of values (&lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;,&lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;) is (1,5), where &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;=1 means 1/6 of the vehicle's length.&lt;br /&gt;&lt;br /&gt;These values have direct affect on two things. One is the accuracy of replication across the network. Another is how much trouble the robot has to go through to achieve the desired position and rotation.&lt;br /&gt;&lt;br /&gt;This last issue can be a problem at low values of &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;. The reason is that vehicle does not turn on a dime, instead its turning mechanism (4 wheels on one side, 4 more on another side) has an error, so the rotation causes the tank to move away from its original position. This means that vehicle gets too far from the desired position (more than &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt; units), and now it must first get back into the position, before continuing to turn. You can now imagine that at low values, this turning error will cause the robot to really struggle to get the vehicle into the position. And that is what it did in my tests.&lt;br /&gt;&lt;br /&gt;While the above is not a problem, since I intend to keep values of P and R high, it is an indication that turning mechanism of the tank must be improved. One possible solution is to alter the power of both sides (set of 4 wheels) in order to achieve equal turning power, kind of like &lt;a href="http://en.wikipedia.org/wiki/Anti-lock_braking_system"&gt;ABS&lt;/a&gt; for vehicles, which alters the power of the breaks on the wheels to prevent loss of contact with the ground. This is, however, is rather complex, so if I do decide to do it, it won't be soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-9168174571555621089?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/9168174571555621089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=9168174571555621089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/9168174571555621089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/9168174571555621089'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/11/movement-replication-completed.html' title='Movement Replication Completed'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-2460783364859064523</id><published>2006-11-19T10:01:00.000-05:00</published><updated>2006-11-19T10:31:27.857-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='movement'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><title type='text'>Improving Movement Replication</title><content type='html'>By far, the most important events to copy across clients are the movements of the vehicles. In my current implementation, I simply send events that describe what command a player pressed: forward, backward, turn left or right, etc. This works, however, there are two problems that create large difference between clients.&lt;br /&gt;&lt;br /&gt;One is lag. Events do not reach other clients right away, so all commands are executed later than they are actually started on the original client. So, this leads to some differences. However, this difference is not that big. The main problem comes from the second problem.&lt;br /&gt;&lt;br /&gt;Physical simulations do not run the same way on different computers. This means that if a vehicle turns to the left for one second on computer A, the vehicle may turn 40 degrees, while on computer B it will turn 35 or 45 degrees. This causes large differences very quickly.&lt;br /&gt;&lt;br /&gt;So, another solution is required. One roadblock is the way my vehicles move. Their movement is produced by a complex interaction of bodies, joints, and motors. So, I cannot do what many other simpler games do: manually "move" the tank from one position to another, and then smooth out the movement by using &lt;a href="http://en.wikipedia.org/wiki/Dead_reckoning"&gt;dead reckoning&lt;/a&gt;. I simply can't do that on my vehicles. They want to be controlled by physical laws (Newtonian), and do not like to be warped from one place to another (This may be limited to the specific engine I am using) or be forced into one position or another (by using direct external forces on vehicles, for example).&lt;br /&gt;&lt;br /&gt;However, while these vehicles want to be "manly" and not be pushed around, I can control those vehicles via usual commands, exactly the same way that player controls the vehicles: IVehicle::moveFoward(), etc.&lt;br /&gt;&lt;br /&gt;So, my idea is to send updates on vehicles position and orientation, and have vehicles on other clients, try to get into this position. They can turn turn and move, whatever they decide to do to get into desired location. (Btw, control is performed via IRobot's)&lt;br /&gt;&lt;br /&gt;This solves one important problem for vehicle movement: even though simulation may run differently, robot-controlled vehicles will take care of the differences by adjusting their movements to get into the position.&lt;br /&gt;&lt;br /&gt;Granted, this does not resolve the first problem, the problem of network lag. But this is something I cannot remove at this moment. Lag simply exists. I may decide to predict the movement on remote clients, however, if there will be a need to further improve the movement replication.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-2460783364859064523?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/2460783364859064523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=2460783364859064523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/2460783364859064523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/2460783364859064523'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/11/improving-movement-replication.html' title='Improving Movement Replication'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-1623474820428290217</id><published>2006-11-13T10:12:00.000-05:00</published><updated>2006-11-13T10:27:38.928-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='raknet'/><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>Child Steps across the Network</title><content type='html'>After spending 25 hours of coding in just two days during weekend, I have developed first operational network events.&lt;br /&gt;&lt;br /&gt;Server is now operational. Clients can connect at any time. Once connected, they are sent appropriate Id for vehicle and robot for the new player, and those same Id's are sent to existing players. Thus, all players are now replicated.&lt;br /&gt;&lt;br /&gt;Current event cover all tank movements, tank's tower rotation, and missile firing. All such events are now broadcasted across the network.&lt;br /&gt;&lt;br /&gt;Overall, I had a blast this past weekend. It has been a while, since I made an awesome progress with URumble. And this one was hard earned, but was well worth it. I can feel pride kicking in again. This means I can push harder then before to develop more and more features into the project. I may have a working demo within months now. And possibly a beta for the New Year's Eve! :D&lt;br /&gt;&lt;br /&gt;That would be the best gift I ever had.&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;OK, I have a few technical comments as well. The entire network code runs on RakNet library. It is GPL licensed for free projects, such as mine. Many thanks go to the creator of RakNet for the free version of his library.&lt;br /&gt;&lt;br /&gt;RakNet is not a high-level library. It does provide a tons of low level features, and a few medium-level ones, but overall, I had to built an entire event framework on top of RakNet. I will probably release my framework at some point in the future as GPL or similar license.&lt;br /&gt;&lt;br /&gt;I first tested the connection on my wireless at home, between my desktop and laptop. I had a really bad lag, though, from 0.25s - 0.5 seconds. This is really bad. I was stunned. I suspected that my wireless connection is really bad, so I tested at my university on 1Gbit LAN. Oh, man, what a difference, I could not notice any lag at all with my eyes. It must have been in the order of a few milliseconds!&lt;br /&gt;&lt;br /&gt;Other than that, developing events has been very easy. One thing though is that I have create a new class for every event (by implementing an abstract interface), as well as adding a new type Id for the event, and adding a few lines to EventFactory, so it knows about this new type, and appropriate new class. This is rather annoying. I'll think about a better solution in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-1623474820428290217?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/1623474820428290217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=1623474820428290217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/1623474820428290217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/1623474820428290217'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/11/child-steps-across-network.html' title='Child Steps across the Network'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-116204698599770919</id><published>2006-10-28T10:45:00.000-04:00</published><updated>2006-11-19T11:09:28.738-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='core'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='refactor'/><title type='text'>Refactored Core Framework, Back to Network</title><content type='html'>After a very long pause, and hours of work and designing new component-based framework, the code is operational once more. I had disabled a lot of features, such as particle effects, and graphics optimizer, since I have designed how to integrate it into component framework.&lt;br /&gt;&lt;br /&gt;However, new framework is awesome, especially, new XML format for it.&lt;br /&gt;&lt;br /&gt;Before I finished migrated all components, such as particles, etc., I want to delve into network once more. This time I have a better vision of what and how things need to be done, and have already implemented basic server. Events are being sent across the network, new players requests and receive their data.&lt;br /&gt;&lt;br /&gt;It is time to start dishing out new features yet again. It is time to return from the sleep of many months where I developed very little.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-116204698599770919?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/116204698599770919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=116204698599770919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/116204698599770919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/116204698599770919'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/10/refactored-core-framework-back-to.html' title='Refactored Core Framework, Back to Network'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-115470711516850521</id><published>2006-08-04T11:57:00.000-04:00</published><updated>2006-11-19T11:09:04.598-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>URumble2 on YouTube.com</title><content type='html'>Some time ago I've uploaded a video on video.google.com. Now I've uploaded the same video to youtube.com: &lt;a href="http://www.youtube.com/watch?v=EQjnSBOSgTM"&gt;http://www.youtube.com/watch?v=EQjnSBOSgTM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's see how it will go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-115470711516850521?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/115470711516850521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=115470711516850521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/115470711516850521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/115470711516850521'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/08/urumble2-on-youtubecom.html' title='URumble2 on YouTube.com'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114754531610697200</id><published>2006-05-13T14:01:00.000-04:00</published><updated>2006-11-13T10:34:37.957-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='scene'/><category scheme='http://www.blogger.com/atom/ns#' term='refactor'/><title type='text'>Oops! Time to Refactor Messy Code.</title><content type='html'>I decided to make a major, very major rewrite of the code class in URumble 2. Here is how it started, if you've coded something large enough, you probably already know the story.&lt;br /&gt;&lt;br /&gt;(I will lay out my thoughts below. It was a discussion between a worker and a insulter (both parts played by me))&lt;br /&gt;---------------------------&lt;br /&gt;&lt;b&gt;Worker:&lt;/b&gt;&lt;br /&gt;Well, it is finally time to kick the network code, and get something going. Let's see I've got basic framework ready to go.&lt;br /&gt;&lt;b&gt;Insulter&lt;/b&gt;:&lt;br /&gt;Are events being sent to the server? I bet something is messed up there. :D You've not touched network code since last year.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;Hmm, StopVehicleEvent is flouding the network.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;Bingo!&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;That's cool I've migrated to &lt;a href="http://sourceforge.net/projects/wgois"&gt;OIS&lt;/a&gt; from OGRE demos input system, so something has changed.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;Nooo, really? I thought you write unittests for everything?&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;Well, not that one.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;How about implementing events to report new player, get a vehicle id, and transmit it to other clients as well, so we can have a 2 player battle? No problem, I just wrote &lt;a href="http://ox.slug.louisville.edu/urumble2/wiki/Network_First_Approach_Player_Connecting"&gt;some docs&lt;/a&gt;, so now I have an idea what to do.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;This network looks complicated. I bet something is going to fail.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;RequestVehicleEvent should do it. Alright, that's done, now connect it to something, so that a vehicle is created as requested by the event.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;Hahaha, I can see how messy rgf::scene::Scene has become! Oh, I see you hard-coding what vehicle to load from RequestVehicleEvent.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;Just for a test, man, I'll improve it later. OK, compile and test.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;Booya! It compiles but doesn't link. Principles still hold, baby.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;Shooo! What's the problem?&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;rgf::scene and rgf::physics can't resolve their linking, b/c they are so tightly coupled. Nice, I thought some smart ass was going to cleanly decouple rgf:: components?&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;No problem, let's decouple them.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;I like it, it's getting uglier. Some core classes in rgf::scene are half-implemented, half-used, and just bloated with various hacks and hooks to get stuff done. That "assert(false);" looks really good. &lt;evil&gt;&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;Jesus, where was the last time I've touched this?&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;A year ago.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;Dang, I will put the network aside for now. I gotta rewrite this rgf::scene and rgf::physics.&lt;br /&gt;&lt;b&gt;I&lt;/b&gt;:&lt;br /&gt;Haha, not so quick, plenty of other things depends on how rgf::scene and rgf::physics work, for example, their concrete implementations: ur::scene and ur::physics.&lt;br /&gt;&lt;b&gt;W&lt;/b&gt;:&lt;br /&gt;8-O Indeed. Time to make a SVN branch, and get started.&lt;br /&gt;---------------------------&lt;br /&gt;To be continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114754531610697200?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114754531610697200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114754531610697200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114754531610697200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114754531610697200'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/05/oops-time-to-refactor-messy-code.html' title='Oops! Time to Refactor Messy Code.'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114746176051674618</id><published>2006-05-12T14:21:00.000-04:00</published><updated>2006-11-19T11:22:49.514-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><title type='text'>Passed Physics, starting Network again</title><content type='html'>I have cleaned up and updated &lt;a href="http://ox.slug.louisville.edu/urumble2/query?component=Physics&amp;status=closed&amp;amp;milestone=Intermediate+Techonology+Implementation"&gt;physical tasks&lt;/a&gt;. A simple castle was created to populate the scene. A tank has been redesigned into a more complex structure. It has 8 wheels and 17 more parts. At the moment, there are no graphical models for them, so I created empty placeholders - very nice white boxes. If you can model anything that is beyond white boxes, drop me a message. I'll be pleased to show your work in the project. Take a look at &lt;a href="http://ox.slug.louisville.edu/urumble2/wiki/Physics_Vehicle_Guidelines"&gt;this manual&lt;/a&gt;. It describes what I'm looking for.&lt;br /&gt;&lt;br /&gt;Now I feel I have enough content and features for network testing. &lt;a href="http://ox.slug.louisville.edu/urumble2/wiki/Network_First_Approach"&gt;The first goal&lt;/a&gt; is to have two player interact. One server accepts both of them and exchanges events. That's not much to ask, and that's the point. One small step at a time has gotten me &lt;a href="http://video.google.com/videosearch?q=ukrainian+rumble"&gt;this far&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once network is up and running, I will add a firing event, and see how the game feels at that moment, and reassess &lt;a href="http://ox.slug.louisville.edu/urumble2/wiki/Network_Goals"&gt;the goals&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A little bit of history: network framework was started a year ago, Summer 2005, but was left off at the basic level of functionality - ability to simply sends events between server and the client. That was accomplished by another programmer on the team, Greg Horvay. However, Greg did not continue network development and instead switch to GUI development. Now, I'm done with current physics iteration, and have a choice to make. My choice is to develop networks.&lt;br /&gt;&lt;br /&gt;Why networks and why now?&lt;br /&gt;&lt;br /&gt;I would like to close the loop. By the "loop" I mean have some game play experience. At the moment, a user can drive around and shoot stuff, but there is no one and nothing to play with. AI code is far from ready, but the networks are close, and can be accomplished in, what I hope, next month. This will allow two player to play against each other. Thus the loop will be closed, and from proof of concept, the project will enter the stage of a playable demo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114746176051674618?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114746176051674618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114746176051674618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114746176051674618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114746176051674618'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/05/passed-physics-starting-network-again.html' title='Passed Physics, starting Network again'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114641089184543946</id><published>2006-04-30T11:23:00.000-04:00</published><updated>2006-11-19T11:14:01.639-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='xvidcap'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Movie on Video Google</title><content type='html'>I have created a &lt;a href="http://video.google.com/videosearch?q=ukrainian+rumble"&gt;movie&lt;/a&gt; of the recent development code running on some really high-end machine, and uploaded it to the Video Google program. I highly recommend both the Video Google and the movie.&lt;br /&gt;&lt;br /&gt;The movie was recorded on Linux using &lt;a href="http://xvidcap.sourceforge.net/"&gt;xvidcap&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114641089184543946?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114641089184543946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114641089184543946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114641089184543946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114641089184543946'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/04/movie-on-video-google.html' title='Movie on Video Google'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114641059593833109</id><published>2006-04-30T11:16:00.000-04:00</published><updated>2006-11-19T11:16:38.961-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darkoverlords'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Music from "Dark Overlords of the Universe"</title><content type='html'>A fellow from my university has gracefully agreed to provide me with his band's music. For now, I have picked one song for the introduction GUI. It's the song "Going Agro!" ('agro' means getting angry).&lt;br /&gt;&lt;br /&gt;Here is the band's site: &lt;a href="http://www.darkoverlordsoftheuniverse.com/"&gt;http://www.darkoverlordsoftheuniverse.com/&lt;/a&gt;&lt;br /&gt;And their logo: &lt;img src="http://www.darkoverlordsoftheuniverse.com/cover.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Big thanks, guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114641059593833109?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114641059593833109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114641059593833109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114641059593833109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114641059593833109'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/04/music-from-dark-overlords-of-universe.html' title='Music from &quot;Dark Overlords of the Universe&quot;'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114641020819861243</id><published>2006-04-30T10:48:00.000-04:00</published><updated>2006-11-19T11:19:51.122-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='fmod'/><title type='text'>Pulling GUI and Sounds</title><content type='html'>Another developer on the team has created GUI component of the project along with a new project states management - &lt;a href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE"&gt;GameStates&lt;/a&gt;. This makes for a better approach then old way of simply following OGRE demos code. Now, GUI and the rest of the code are tied up. And more importantly the code feels a lot better, that is cleaner and easier to maintain.&lt;br /&gt;&lt;br /&gt;Another big component that made its way is Sound. For this, I rewrote my old code for OpenAL to work with Fmod. I had some problems with OpenAL running on my Windows, so I decided to ditch it. When comparing Fmod with OpenAL, Fmod has a slightly better interface since it uses a bit of C++ as opposed C-interface of OpenAL (I prefer OOP when dealing with large project such as Ukrainian Rumble). The problem however is that Fmod still feels like a C-library. Even though it offers "Objects", they are very rudimental. For example, error handling is done by each function  returning a FMOD_RESULT objects which is a enum (yes, every function does that with a few exceptions). So after each Fmod call, you need to call some method to check for errors. This is rather annoying. Exception handling would be much better, but those guys have &lt;a href="http://www.fmod.org/forum/viewtopic.php?t=5248"&gt;their reasons&lt;/a&gt;. Nice C++ interface is not on top of their list. One way or another I made a wrapper around Fmod to give myself something I can live with. Other than the interface, Fmod seems to be a powerful system that supports all major platforms, including upcoming next-gen consoles.&lt;br /&gt;&lt;br /&gt;Now, writing a wrapper for Fmod is a simple task compared with making sounds feel right for the game which heavily relies on physics. This means that I am dealing with a "messy" system (physics engine) that does not provide exact same results for every run. Furthermore, physics give you a range of results. For example, let's say you want to play a sound for each collision. OK. I create and assign the right classes, etc. Run the application. Here is what I get: a sound for each collision, no matter how small or big it was. Alright, a threshhold is put in place, and now collisions are filtered out. Now, I notice that those collisions don't reflect real life, for example I might get 5 collision for an object simply sliding. Another thing is that collisions vary in magnitude (big and minor ones). So, now I need to add a filter to set a correct volume of the sound. After this, we get into situation where different collisions should sound different. Think of sliding motion or simply different surfaces. Mmm...&lt;br /&gt;&lt;br /&gt;One note about sound. Once you add one, you need all of them. This is because with no sound you don't notice that everything is silent, but once you have a single sound effect, your mind expects to hear other sounds as well.&lt;br /&gt;&lt;br /&gt;All in all, GUI and sounds add a lot to the project. It feels more complete now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114641020819861243?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114641020819861243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114641020819861243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114641020819861243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114641020819861243'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/04/pulling-gui-and-sounds.html' title='Pulling GUI and Sounds'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114451866040573349</id><published>2006-04-08T13:37:00.000-04:00</published><updated>2006-11-19T11:23:12.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='missile'/><title type='text'>Missile Controllers are done.</title><content type='html'>After "some" work, missiles actually fly, and home in to their targets. It turned out to be much harder than I thought they'd be. Most problems came from improper math calculations. Especially hard to track were bugs that were related to local coordinate system of the objects, which caused problems for missile rotations, spin, and control thrust. This in turn caused confusion in the controllers that did not receive correct missile status, and made wrong decision how to correct them.&lt;br /&gt;&lt;br /&gt;What this means for bug fixing, is that there were multiple layers of interactions, so a digging was necessary to identify actual problems and not their results.&lt;br /&gt;&lt;br /&gt;Man, I imagine how much work it took to implement control for real-life air missiles.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ox.slug.louisville.edu/%7Eo0lozi01/wiki/index.php/Image:New_missiles.jpg"&gt;Here&lt;/a&gt; are missile trying to hit each other. Yeah, missiles at the moment are trying to hit anything you click on.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ox.slug.louisville.edu/%7Eo0lozi01/wiki/images/thumb/180px-New_missiles.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114451866040573349?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114451866040573349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114451866040573349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114451866040573349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114451866040573349'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/04/missile-controllers-are-done.html' title='Missile Controllers are done.'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114341582886095285</id><published>2006-03-26T18:28:00.000-05:00</published><updated>2006-11-19T11:38:27.284-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='missile'/><title type='text'>Missile updates</title><content type='html'>Missile controllers have been implemented to a certain degree. However, there is a bug, which causes them to improperly spin in the flight. It seems that spin is always around side axis (perpendicular to the target and lying in the plane parallel to the ground).&lt;br /&gt;&lt;br /&gt;There is a bug where deletion of a target is not handled properly. I think I'm closed to nailing that one, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114341582886095285?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114341582886095285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114341582886095285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114341582886095285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114341582886095285'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/03/missile-updates.html' title='Missile updates'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114341569965237148</id><published>2006-03-26T18:21:00.000-05:00</published><updated>2006-11-19T11:38:41.413-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='migrate'/><title type='text'>Migrated to OGRE 1.2RC1</title><content type='html'>A week ago, I've migrated code to &lt;a href="http://www.ogre3d.org/"&gt;OGRE&lt;/a&gt; 1.2RC1 from 1.0.x Overall, it came through without blocks, but with a few rough spots here and there.&lt;br /&gt;&lt;br /&gt;First of all, crosshair does not appear anymore in Linux, but it appears in Windows builds. This remain untackled for now.&lt;br /&gt;&lt;br /&gt;Second, mouse control is wacky on Linux. For some reason Ogre::InputManager::getMouseRelativeX() returns large numbers from time to time. Maybe something changed. I'll take a look at OGRE demos to see if anything different has appeared in them with mouse control.&lt;br /&gt;&lt;br /&gt;Big thanks to OGRE team for awesome open-source 3D engine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114341569965237148?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114341569965237148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114341569965237148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114341569965237148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114341569965237148'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/03/migrated-to-ogre-12rc1.html' title='Migrated to OGRE 1.2RC1'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114193660225778832</id><published>2006-03-09T15:28:00.000-05:00</published><updated>2006-11-19T11:42:42.910-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='missile'/><category scheme='http://www.blogger.com/atom/ns#' term='crosshair'/><title type='text'>Missile Controllers and CrossHair</title><content type='html'>The framework for new missiles and their controllers have been finished. Crosshair have been added as well, which is the first time it's been added to the project. I wasn't planning to have them actually, but here is why I've added crosshair. The idea is that manual firing of missile is hard. To simplify aiming, I've decided to implement homing missiles. The crosshair will be used to point at the object you want to shoot, and the missile will follow the missile even if the object will be moving. Of course, homing missiles won't be perfect, and I expect plenty of cases when they will miss or hit an obstacle before reaching the target. This should make for some fine strategy and tactics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114193660225778832?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114193660225778832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114193660225778832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114193660225778832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114193660225778832'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/03/missile-controllers-and-crosshair.html' title='Missile Controllers and CrossHair'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114161740950493744</id><published>2006-03-05T22:54:00.000-05:00</published><updated>2006-11-19T11:46:17.401-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='missile'/><title type='text'>Watch Out For Parasites!</title><content type='html'>Here is a funny bug, I've uncovered from working with latest missile framework. (It's a rewrite of old clunky system.) Those look like really nasty parasites, don't they? Got some spray to ward them off? :D Or maybe it is a new weapon? :DDD&lt;br /&gt;&lt;br /&gt;Full size screenshot is &lt;a href="http://ox.slug.louisville.edu/%7Eo0lozi01/wiki/index.php/Image:Parasite_attack.png"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ox.slug.louisville.edu/%7Eo0lozi01/wiki/images/thumb/180px-Parasite_attack.png" alt="parasite attack screenshot" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114161740950493744?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114161740950493744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114161740950493744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114161740950493744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114161740950493744'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/03/watch-out-for-parasites.html' title='Watch Out For Parasites!'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-114126614804897871</id><published>2006-03-01T21:16:00.000-05:00</published><updated>2006-11-19T11:51:47.365-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='missile'/><category scheme='http://www.blogger.com/atom/ns#' term='thruster'/><category scheme='http://www.blogger.com/atom/ns#' term='jettank'/><category scheme='http://www.blogger.com/atom/ns#' term='crosshair'/><title type='text'>Jet Thruster laid off. Game logic continued.</title><content type='html'>Recently, I took a long and hard look at the jet tank. What I saw was that flying controls and mechanics have taken a lot time, but have not progressed to a usable state. So, I decided to leave it for now, and move on to everything else. I will come back to flying tank later after the core of the game play is done.&lt;br /&gt;&lt;br /&gt;Game logic. The first thing to tackle is a better missile - homing missile. You don't need to guess the arc of its motion anymore. You just point at the object you want it to go, and press/click fire. The missile homes in to the target, though it may miss if the object does something tricky, such as hiding behind an obstacle, or maybe shoot the missile down.&lt;br /&gt;&lt;br /&gt;Once the homing missile is implemented, I will work on creating a crosshair for aiming, add ray casting according to the position and orientation of your camera. Then the whole missile feature will be done. You will able to aim and send homing missile anywhere you want them to go.&lt;br /&gt;&lt;br /&gt;Though, I will have to add an option to a homing missile to simply go in some direction, if you missed everything on the map, such as clicked on the sky or something. I'll think about that. 8)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-114126614804897871?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/114126614804897871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=114126614804897871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114126614804897871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/114126614804897871'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/03/jet-thruster-laid-off-game-logic.html' title='Jet Thruster laid off. Game logic continued.'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113996204496368135</id><published>2006-02-14T18:59:00.000-05:00</published><updated>2006-11-19T12:01:46.804-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jettank'/><title type='text'>Jet Tank Turning</title><content type='html'>Recently I have been battling the complexity of the jet tank control. My estimations came true, as I struggled to counter-balance the tank's rotation, balance, and movement features. Balancing was an easy part with barely any problems at all. Movement seems to be OK, although I've not dealt into it deeply enough yet to really assess the situation. The turning has been the feature that has been boggling my mind for the past couple weeks.&lt;br /&gt;&lt;br /&gt;It is coming along with a glacial speed. Learning from my College class, Software Engineering, I've been busy performing root-cause analysis. For us, simple folks, it stands for debugging and tracking down improper behavior of your code.&lt;br /&gt;&lt;br /&gt;Recently, I have gotten some "fresh air" and tackling the implementation with new vigor.&lt;br /&gt;&lt;br /&gt;P.S. Another thing, that is getting in the way, is that I would like to show off this jet tank on the upcoming internal College competition among Engineering departments. Only 2.5 weeks left.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113996204496368135?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113996204496368135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113996204496368135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113996204496368135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113996204496368135'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/02/jet-tank-turning.html' title='Jet Tank Turning'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113738843108694960</id><published>2006-01-16T00:03:00.000-05:00</published><updated>2006-11-19T12:02:16.865-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='space'/><category scheme='http://www.blogger.com/atom/ns#' term='NASA'/><category scheme='http://www.blogger.com/atom/ns#' term='jettank'/><title type='text'>Jet Powered Tanks</title><content type='html'>I have recently read the book titled "New Space Era and the Fall of NASA." It opened my eyes on many things and had altered my game idea. Ground vehicles are not the hype anymore. Flying ones are the way to go. Imagine an ion-thruster tank that can hover/fly low above the ground, and quickly decent on the enemy's location.&lt;br /&gt;&lt;br /&gt;Imagination is a nice thing to have, but the implementation and control schema are challenging. The results have been cool so far, so I will stick to the idea and get it done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113738843108694960?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113738843108694960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113738843108694960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113738843108694960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113738843108694960'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/01/jet-powered-tanks.html' title='Jet Powered Tanks'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113641890750467134</id><published>2006-01-04T18:09:00.000-05:00</published><updated>2006-11-19T12:07:34.475-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='msvc'/><category scheme='http://www.blogger.com/atom/ns#' term='kdevelop'/><title type='text'>Praise for KDevelop</title><content type='html'>Most of my development is done in &lt;a href="http://www.kdevelop.org/"&gt;KDevelop&lt;/a&gt; under &lt;a href="http://gentoo.org/"&gt;Gentoo Linux&lt;/a&gt;. On the other hand, I still compile the code for Windows platform via &lt;a href="http://msdn.microsoft.com/vstudio/"&gt;MSVC .NET&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In my opinion, KDevelop is much better overall, while not in all aspects.&lt;br /&gt;&lt;br /&gt;I have stumbled upon &lt;a href="http://programming.newsforge.com/article.pl?sid=05/04/12/1357202&amp;tid=48&amp;amp;tid=140"&gt;a good article&lt;/a&gt; about KDevelop vs. MSVC .NET.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113641890750467134?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113641890750467134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113641890750467134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113641890750467134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113641890750467134'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2006/01/praise-for-kdevelop.html' title='Praise for KDevelop'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113399030061559304</id><published>2005-12-07T15:50:00.000-05:00</published><updated>2006-11-19T12:07:59.751-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gameplay'/><category scheme='http://www.blogger.com/atom/ns#' term='unittest'/><title type='text'>Past unit testing to game play</title><content type='html'>I've been playing a game of catching up with unit testing and features. But after having written unit tests for XML, geometry optimizer, particle manager, and various minor tools, I feel much more confident about the code base as a whole. There are more components to be tested, such as Physics and Scene tools. They are still need to be refactored a bit to remove inter-dependencies. Mm... still need to think about this.&lt;br /&gt;&lt;br /&gt;However, I'm not writing only unit tests at this point, I'll still pushing forward with getting second demo done. Nothing major needs to be implemented at this point. There are a few minor and annoying things to be dealt with. Things like incorrect aiming when the tank tower is not horizontal, or hitting your own tank when launching a missile from the gun.&lt;br /&gt;&lt;br /&gt;A few mode models, a little bit more exciting level design, and second demo will be rolled out. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113399030061559304?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113399030061559304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113399030061559304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113399030061559304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113399030061559304'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/12/past-unit-testing-to-game-play.html' title='Past unit testing to game play'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113289278236200716</id><published>2005-11-24T23:01:00.000-05:00</published><updated>2006-10-28T12:26:58.335-04:00</updated><title type='text'>Migration to Xerces from TinyXML</title><content type='html'>I have recently migrated from MSVC 2003 to 2005, because I saw it fix and improve lots of things that I could barely stand in 2003. There was a drawback of course. My xml wrapper refused to work in release but worked well in debug mode. The implementation sat on top of &lt;a href="http://www.grinninglizard.com/tinyxml/"&gt;tinyXML&lt;/a&gt;, which seemed to have problem with using latest MS SDK. So I figured it was the right time to move away from &lt;a href="http://www.grinninglizard.com/tinyxml/"&gt;tinyXML&lt;/a&gt; to &lt;a href="http://xml.apache.org/xerces-c/"&gt;Xerces-c&lt;/a&gt;. Now I do not recommend choosing Xerces-c as an easy to start with xml library, but it certainly is powerful nonetheless. It took a bit to understand that it had some rather weird approaches to handling strings. Now I can understand having to encode strings into a format that support various encoding and such, but the usage of those character arrays is simply bad. A user must be constanly on look out for cleaning up decoded and encoded character arrays. I did a few things to make my life easier with it, but still it did not feel right.&lt;br /&gt;&lt;br /&gt;The good thing is that unit tests helped me out to ensure that the wrapper works, so that now I can forget about Xerces-c lame duck interface, and hide behind &lt;a href="http://ox.slug.louisville.edu/~o0lozi01/wiki/index.php/Rumble_Game_Framework:_Minor_Tools#XML_Tools"&gt;XML tools&lt;/a&gt; that I have written on top of it.&lt;br /&gt;&lt;br /&gt;Overall, it took only about day and a half to complete migration which is pretty good considering that I have not worked with Xerces-c beforehand. Xerces-c is not bad, though, don't get me wrong, there are plenty of good things like easy DOM parsing and XML tree browsing, but you need to watch your step, because there are plenty of hidden traps in its workings. But the main problem was almost complete luck of decent documentation. Website did not have any examples, instead sending you to download the examples that come with the source. Those examples weren't bad, but almost none of them were simply. It took some critical thinking to figure out what I need and what I don't.&lt;br /&gt;&lt;br /&gt;I tried to find some tutorials for Xerces-c but could not find any. Very dissapointing. Xerces is one of the Apache components, and yet lucks useful documentation. And worse, it seems that there isn't any community around it to help out newcomers.&lt;br /&gt;&lt;br /&gt;In conclusion, Xerces-c is good enough to be used after climbing its high wall, but it does not provide nice interface ( complete C++ and STL would be really nice ) and lucks documentation and community support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113289278236200716?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113289278236200716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113289278236200716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113289278236200716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113289278236200716'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/11/migration-to-xerces-from-tinyxml.html' title='Migration to Xerces from TinyXML'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113163995943724980</id><published>2005-11-10T11:21:00.000-05:00</published><updated>2006-10-28T12:26:58.276-04:00</updated><title type='text'>Unit Testing</title><content type='html'>Unit testing is an old concept that has been around long before computers came to life. You test what you make to ensure its quality. I have been putting off serious unit testing in this project for a while now. But lately I decided it was time to start writing complete unit tests to ensure quality of the project.&lt;br /&gt;&lt;br /&gt;One of the last drops was a recent performance bug, that I have not nailed, so unit tests are coming to aid.&lt;br /&gt;&lt;br /&gt;I started from simple components: math and XML tools. Next turn will be graphics and physics components.&lt;br /&gt;&lt;br /&gt;I am using a very simple and handy &lt;a href="http://quicktest.sourceforge.net/"&gt;QuickTest&lt;/a&gt; written by Tyler Streeter. Many thanks goes to him.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113163995943724980?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113163995943724980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113163995943724980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113163995943724980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113163995943724980'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/11/unit-testing.html' title='Unit Testing'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-113019104210592141</id><published>2005-10-24T17:26:00.000-04:00</published><updated>2006-10-28T12:26:58.221-04:00</updated><title type='text'>Physics Optimizations</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ox.slug.louisville.edu/~o0lozi01/uploads/2000boxes.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px;" src="http://ox.slug.louisville.edu/~o0lozi01/uploads/2000boxes.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;OPAL sure provides a lot of features, but I had to utilize it to the outmost to get the size of the simulation that I wanted.&lt;br /&gt;&lt;br /&gt;First of all, grouping objects was essential for performance. So, for example a building would be made out of various blocks, which usually stay close to each spatially, so they can be grouped and their collision be optimized, because instead of checking for every block, collision can check their bounding box for the entire group. This is how &lt;a href="http://www.ode.org"&gt;ODE&lt;/a&gt;, physics engine, optimizes collision checks.&lt;br /&gt;&lt;br /&gt;Second, &lt;a href="http://opal.sf.net"&gt;OPAL&lt;/a&gt; is awesome that it can rebuild objects on the fly from static to non-static type. I used this feature to make sleeping objects static. And static object take the minimum processing power during collision.&lt;br /&gt;&lt;br /&gt;With the above optimizations I was able to easily handle scene made out of 2000+ boxes. On the screenshot, you can see the system in action. Note that this is running on NVidia 5200 Go on a laptop, so performace is decent.&lt;br /&gt;&lt;br /&gt;The third point is not implemented yet. Its goal is to stabilize some shakiness of the vehicle caused by a dozen of joints, which ODE does handle well at certain configurations. It will dampen small linear and angular acceleration at small values.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113019104210592141?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113019104210592141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113019104210592141' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113019104210592141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113019104210592141'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/10/physics-optimizations.html' title='Physics Optimizations'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14442680.post-113018303754134077</id><published>2005-10-24T15:41:00.000-04:00</published><updated>2006-10-28T12:26:58.167-04:00</updated><title type='text'>Simple XML tool in C++</title><content type='html'>XML is really a great format. It gives a lot of freedom. I can define any structure with it.&lt;br /&gt;&lt;br /&gt;And this is really useful for game development. Especially in C++. Its build times are rather long, so storing and modifying parameters inside the code is not very useful. Testing and experimenting takes a long time in this case. If, however, the data is moved out of the code, as it should be done, the problem of performance is gone. Just go to your favorite XML editor, edit the data, save, then and simply restart the application without any recompilation.&lt;br /&gt;&lt;br /&gt;So, I have tried to move as much as I could to XML files, so long as it did not take away a lot of time to do so. One of the things that I had stumbled upon was uneasy reading of XML files in C++ libraries what were available to me. In particular, I used &lt;a href="http://www.grinninglizard.com/tinyxml/"&gt;tinyXML&lt;/a&gt;. However, reading many small and simple files across the entire framework took just too much effort for its price. So I figured it was time to create a simple wrapper around tinyXML. This way I could expose just enough features that I need, and thus keeping it very simple.&lt;br /&gt;&lt;br /&gt;The product is the following: &lt;a href="http://ox.slug.louisville.edu/~o0lozi01/wiki/index.php/Rumble_Game_Framework:_Minor_Tools#XML_Tools"&gt;XML tools&lt;/a&gt;: a simple reader and looper of simple XML files. See their examples for yourself.&lt;br /&gt;&lt;br /&gt;Boy, that really made it very easy to use XML anywhere. One line of code for one value from XML file. Quiet perfect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-113018303754134077?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/113018303754134077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=113018303754134077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113018303754134077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/113018303754134077'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/10/simple-xml-tool-in-c.html' title='Simple XML tool in C++'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-112689469524552360</id><published>2005-09-16T13:48:00.000-04:00</published><updated>2006-10-28T12:26:58.103-04:00</updated><title type='text'>Switching to Artificial Intelligence</title><content type='html'>I have switched from working on &lt;a href="http://www.trueaxis.com"&gt;TrueAxis&lt;/a&gt; plugin for &lt;a href="http://opal.sf.net"&gt;OPAL&lt;/a&gt; to designing some basic AI, because it was taking a bit too much time. And I feel that it is more important and productive to construct some basic scene and start working on the game play.&lt;br /&gt;&lt;br /&gt;The thing about game play is that it is really hard to develop it unless there is an enemy to fight with. Here, I had two choices, either implement networking or develop some AI. Network is kind of ready for further developing, but I decided to go with AI. I had a few ideas ready to go.&lt;br /&gt;&lt;br /&gt;At the moment I am working on navigation for AI. The current implementation does not require static environment, which is perfect for destructible physics of Ukrainian Rumble 2. It also does not require precomputation. The drawback is the luck of scalability, since at the large number of objects, navigation may become CPU-intensive. This however should only appear at a really large scale environments. It could be resolved though via use of octrees.&lt;br /&gt;&lt;br /&gt;The navigation is near its finish. Vehicle control from the navigation recommendation is still being tested and fixed, but it is operational nonetheless. Once it is done, the easy step will be control of a tank tower to aim at the target and fire. This will be much simplier than navigation, though. &lt;br /&gt;&lt;br /&gt;Soon, the scene creation will begin: the campus of the University of Louisville, KY.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-112689469524552360?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/112689469524552360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=112689469524552360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112689469524552360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112689469524552360'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/09/switching-to-artificial-intelligence.html' title='Switching to Artificial Intelligence'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-112541572766700438</id><published>2005-08-30T10:52:00.000-04:00</published><updated>2006-10-28T12:26:58.045-04:00</updated><title type='text'>TrueAxis as a new physics engine</title><content type='html'>Lately, I have been working on &lt;a href="http://www.trueaxis.com"&gt;new physics engine&lt;/a&gt; to replace a rather outdated &lt;a href="http://www.ode.org"&gt;ODE&lt;/a&gt; physics engine. ODE did a good job of starting the project, but its limitations have started to bog down the performance of the game. &lt;br /&gt;&lt;br /&gt;What are those limitations? The main ones are inability to handle a lot of sleeping objects. That is, let's say we have 1000 boxes laying around the scene, while we control a tank moving around. A decent engine will be able to quickly parse out which objects need to be tested against, but in ODE collision detection is not optimized, so the product is poor performance. This is important, since I do expect all scenes to be like that: lots of sleeping objects. The second reason is instability:  sometime ago I had to tweak things nicely to have more or less stable environment. But still I am running the simulation at 100 times per second, just to keep things from bouncing too  much, yet it is still visible in demos. This is not only annoying but also eats up CPU.&lt;br /&gt;&lt;br /&gt;Why TrueAxis? I had several requirements when choosing an engine. First of all, it has to be stable and perform well. Most engines other than ODE already do that (although not always for free). Second, it must support Linux. It is really hard to give up ability to develop under Linux. ;-) This cuts options down to two engines: &lt;a href="http://newtondynamics.com/"&gt;Newton&lt;/a&gt; and TrueAxis. Now, this choice was easy since two engines seem to have gained a certain personality: Newton with correct physics (but slower?) and TrueAxis with handling of fast moving objects (but less correct?). My choice was a better performance for a price of less precise simulation and with an option of using super fast objects for missiles.&lt;br /&gt;&lt;br /&gt;Any programmer out where will think: "Gee, moving to a different API, good luck on migrating your project." Luckily, I have foreseen this, and so used an abstract physics layer: &lt;a href="http://opal.sf.net"&gt;OPAL&lt;/a&gt;. This way all I need to do is write a plugin for OPAL, without changing a single line of code in Ukrainian Rumble. Well, maybe some parameters would need to be changed around but that is handled in XML configuration files.&lt;br /&gt;&lt;br /&gt;So, for the past 3 weeks I have been working on this plugin. It is not really hard but is time consuming. OPAL provides a lot of features, and I do use a lot of those features, so even though I implementing only stuff that I need, it will still take a bit. But I am getting close to a certain milestone: just a few things left to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-112541572766700438?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/112541572766700438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=112541572766700438' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112541572766700438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112541572766700438'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/08/trueaxis-as-new-physics-engine.html' title='TrueAxis as a new physics engine'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-112378835452109277</id><published>2005-08-11T15:02:00.000-04:00</published><updated>2006-10-28T12:26:57.977-04:00</updated><title type='text'>Clean up stage.</title><content type='html'>After having added particle effects for any broken joint, and thus any destructive event, I have distributed the link to the latest demo around Internet to get some feedback. Maybe people are just nice, but the comments were generally positive. What is more important is that I have received a number of suggestions about the direction of the effects and features that I should push in. Many thanks to those folks.&lt;br /&gt;&lt;br /&gt;One of those ideas have led to think of a way to overcome GPU bus bottleneck. Here is what it was: GPUs have been developed and optimized to handle large chunks of mesh, however, it does hot handle well, large number of meshes. 10000 triangle in one mesh is MUCH better than 10000 meshes with one triangle. Here's a &lt;a href="http://www.ogre3d.org/docs/api/html/classOgre_1_1StaticGeometry.html#_details"&gt;link&lt;/a&gt;  that describe this in more depth.&lt;br /&gt;&lt;br /&gt;Why is this important to URumble? Because the physical simulation is bound to have many independent objects, thus meshes. So, this is has to be dealt with somehow. Luckily, the framework allowed an easy implementation of the idea. Tanks in the recent demo are represented as a complex object consisting out of a dozen independent objects. Here is what happens now: once a tank goes to sleep (all its bodies stop moving around) its meshes are build into static mesh, and this new mesh replaces old separated meshes. The only downside is extra memory usage, and slow downs when builds large meshes.&lt;br /&gt;&lt;br /&gt;Overall, the approach brought a huge performance boost, sometimes it doubles the frame rate! At the moment I am considering bringing this method to a large scale, when the entire parts of the scene will be built into static meshes. This will require some special division of the environment, possibly via use of &lt;a href="http://en.wikipedia.org/wiki/Octree"&gt;octrees&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other than that, a lot of time has been spent into cleaning up the framework and its interfaces, which led to creation of a few &lt;a href="http://ox.slug.louisville.edu/~o0lozi01/wiki/index.php/Rumble_Game_Framework:_Minor_Tools"&gt;minor tools&lt;/a&gt;. More are scheduled to come as they approach a certain level of usability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-112378835452109277?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/112378835452109277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=112378835452109277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112378835452109277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112378835452109277'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/08/clean-up-stage.html' title='Clean up stage.'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-112275412351889569</id><published>2005-07-30T15:41:00.000-04:00</published><updated>2006-10-28T12:26:57.918-04:00</updated><title type='text'>After CGAIMS</title><content type='html'>The conference was actually quite a lot of fun. If nothing else, it is nice to meet people who speak and think on about the same wave lentgh as you. There was one physics related paper and a few on computer graphics, but most of them were on AI in games and just in general. So, I got a few ideas to look for when I get to coding in AI into Ukrainian Rumble.&lt;br /&gt;&lt;br /&gt;Unfortunately, network did not make it to the conference. We had only an off-line (singleplayer) version to show.&lt;br /&gt;&lt;br /&gt;Couples of demos were created: a hammer and a line scene. For more info about them, check &lt;a href="http://ox.slug.louisville.edu/%7Eo0lozi01/wiki/index.php/Ukrainian_Rumble_2:_Proof_of_Concept_1"&gt;this page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At the moment, I plan to release this version onto &lt;a href="http://www.ogre3d.org/phpBB2"&gt;Ogre forums&lt;/a&gt;, but before I do that, however, I would like to make a few graphical improvements to localize it for the Ogre community (my guess is that guys and gals there like graphics ;-) after all it is a forum for a graphics engine). The new feature that I want to add is actually quite simple, which is why I am willing to do it right now: add a particle effect for any joint break not just ones caused by a missile collision. This should greatly improve visual look of the hammer falling down on top of vehicles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-112275412351889569?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/112275412351889569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=112275412351889569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112275412351889569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112275412351889569'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/07/after-cgaims.html' title='After CGAIMS'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-112147133596123787</id><published>2005-07-15T19:38:00.000-04:00</published><updated>2006-10-28T12:26:57.852-04:00</updated><title type='text'>CGAIMS</title><content type='html'>The paper work has been completed. The Ukrainian Rumble is coming to CGAIMS 2005 at Louisville, KY, USA. The conference's website is right &lt;a href="http://www.scit.wlv.ac.uk/~cm1822/cgaims05.htm"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Long story short, I have two weeks before the conference. There is plenty of stuff I want to show on the conference. Most main features have already been implemented, but there are a few rough corners that stick out, mainly vey poor ground - nothing but bunch of plains stuck together in order to form a ground.&lt;br /&gt;&lt;br /&gt;The reason this sticks out is because the robots have decent models with couple of different particles to represent smoke and small explosions.&lt;br /&gt;&lt;br /&gt;Of course, network are still coming, the client side is mostly done. It still needs to be connected to the server, though. At the moment the server does not anything other than ignoring all incoming packets but the ones that are send during the connection and disconnection of a client.&lt;br /&gt;&lt;br /&gt;Summer semester is almost over, and the free time is here to help me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-112147133596123787?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/112147133596123787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=112147133596123787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112147133596123787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112147133596123787'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/07/cgaims.html' title='CGAIMS'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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-14442680.post-112123359656028482</id><published>2005-07-13T04:44:00.000-04:00</published><updated>2006-11-19T11:56:41.351-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introduction'/><title type='text'>Blog has been created.</title><content type='html'>This blog will be a journal of my development of Ukrainian Rumble 2: "Heritage", a Multiplayer Mechanical Shooter.&lt;br /&gt;&lt;br /&gt;For details, visit the &lt;a href="http://ox.slug.louisville.edu/%7Eo0lozi01/wiki/index.php/Ukrainian_Rumble_2:_Heritage"&gt;homepage&lt;/a&gt; of the project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14442680-112123359656028482?l=urumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urumble.blogspot.com/feeds/112123359656028482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14442680&amp;postID=112123359656028482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112123359656028482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14442680/posts/default/112123359656028482'/><link rel='alternate' type='text/html' href='http://urumble.blogspot.com/2005/07/blog-has-been-created.html' title='Blog has been created.'/><author><name>Oleksandr</name><uri>http://www.blogger.com/profile/17704077406288008969</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>
