root/news/Archive 2009
Microbrush 2.1.1 Released!
Version 2.1.1 of Microbrush brings a lot of changes and additions, among them: A hierarchy system, almost complete VMF conversion and manipulation (Yes! Entities, displacements, all that stuff!), more visual aids, properties associated with primitives, and a lot more.

With this release also comes a new source code release of the API to manipulate Microbrush 2 scenes and VMF worlds. Try it and manipulate or generate scenes or VMFs! The API is written in C# and it's really easy to use! Don't you want to be the first one to make an awesome maze generator for Half-Life 2? :D

For a complete changelog, more images, and downloads, head to the project page.
image image image image
New Microbrush 2 Videos!
Video Tutorials by Scott 'Sythen' Baker!
Microbrush 2 (2.1.0) Modelling 1 (1/2) - Building
Microbrush 2 (2.1.0) Modelling 1 (2/2) - Road
Microbrush 2 Steam User Group
It's here!
Join it to get updates directly and stuff :)
This is just in!
Replying to private messages which are many years old, especially those full of flames :-D
Source Engine Entities
I want to represent and preserve point and brush entities from VMF files in MB2 scenes. Apparently, surface-based properties don't cut it, so I'm working on properties that are associated with brushes AND also a brush hierarchy. When things work according to plan, I can map point entities to simple cubes placed in 3D space (in accordance with their origins) and just dump all their properties as key-value pairs in a string property. Brush-based entities will consist of a dedicated brush with the original entity attributes, and a few normal brushes attached to it in the hierarchy, which should be enough to allow for brush entities made of multiple brushes. Displacements, map settings, etc.? For now, I'll probably just store them all in plaintext format in brush faces and special entities. If this works out, MB2 could retain ALL information from a VMF during conversion. But here I have to keep some things in mind, like not losing the faces associated with a cubemap entity... hrm.
When I drove to the university this morning, there was a big Bundeswehr vehicle/tank thing driving in front of me. From the back it looked like some kind of generator, made of four modules which had the same camouflage... When the vehicle took a curve to the right, leaving my lane, in the direction of the military airport Rostock Laage, I got to see the side of it, and it looked very familiar from CnC: Generals... After a confirmation of reference pictures online, I can say: OMG, it was a mobile anti-air Patriot missile launch system :-D
Microbrush 2.0.1
Here's a new version of Microbrush 2.
Various users reported that their config file was busted after drag and dropping a scene file onto the exe file, which is, btw, not the intended way to do it. MB2 tried loading its resources, like the font, from the directory it was started in, but erroneously loaded the config from where its exe was placed, not the target directory. When you drag a file onto any executable in Windows, then that executable is executed in your user's documents directory. Normally, you need some kind of batch file which passes the first argument as ("%~dp1") after changing the current directory to its own directory via (cd /d %~dp0).
You can exploit this resource-finding behavior of MB2 to use the same executable with different configs: Just create multiple links and set different starting directories for them.

Anyway, in reaction to popular demand, this new version also contains a cylinder tool now. And for the sake of completeness, I added an arbitrary scaling tool too. To the people with feature requests I reacted positively to: No, I have not forgotten them, they are just resting on my todo list for now :P
Welcome to the new mirror!
Thanks for hosting me, Scott!
Thank you, InterComm!
Thank you for the many years of hosting my website and those of a few friends, it was greatly appreciated.
Study Thesis
At the beginning of this week, I finally got my study thesis topic. It's all about persisting, manipulating, and rendering multi-layered terrains in realtime. I was given this whitepaper as an entry to the topic, it's an interesting read: Arches: a Framework for Modeling Complex Terrains
Microbrush 2 Customized Package
My fellow Sythen is now maintaining a customized release of MB2. It comes with an installer (the original is portable) and maybe soon with custom scenes and color schemes and graphics.
Check it out here.
After more than half a year of work, I can finally present you the first public release of Microbrush 2.
Imperator has undergone an update too.
Left 4 Dead 2
So, when the game is released and I buy it, I only get a censored version which has reduced blood levels and the removed ability to blow the heads off zombies, right? DO NOT WANT.
How to get Valve Hammer working with Half-Life 1: Source
Okay, here I tell you now step by step what I did to get Hammer to work with HLS and also get shot by a big turret.
1. Download the official Half-Life: Source fgd here: http://developer.valvesoftware.com/wiki/Half-Life_Source.fgd
2. Edit that fgd, search for monster_miniturret, copy that part and make a monster_turret (by simply removing mini in the entity class, model, and so on) -- I don't know why Valve left that out...
3. Start Hammer with any game... maybe it's best to do that with "EP1/Half-Life 2" in your SDK target platform selection.
4. In Hammer, go to Tools/Options/Configuration, Edit the configurations and add a new one, name it HLS or something along those lines.
5. Make sure the paths in that configuration match those where your HLS is installed, and add the modified .fgd-File you have.
6. Close Hammer and Steam altogether and find the GameInfo.txt in your HLS\hl1 directory.
7. In that text file, set the application ID at the top to 360 (HL1SDM) or 280 (HL1S), I can confirm that 360 works well. If you omit this step, all Hammer viewports will be all black.
8. Start Hammer with your new config selected in the SDK platform selection dropdown, make a room and add a monster_turret, set its autostart flag to true. Note that you can use the HL1 textures by entering "halflife" in the texture window.
9. Compile the map from the Hammer dialog, but do not run the game from there. Instead, load the map from the game's console.
Stargate Universe
SGU is the best Sci-Fi series I have seen since Battlestar Galactica: The Re-Imagined Series. I can only recommend it.
The Construct
void test1(int x)

(function<void(int)> func, int context) test2(int context)
return (test1<int>, context);
(function<void(int)> func, int context) test3()
return test2(5);
void main()
test1 is called with x = 5.

Favorite scripting language feature checklist:
The Construct
(int x, int y) z;
z.x = 5;
It looks so simple...
Thank you for paternalism.
I just installed Half-Life 1: Source and... it is censored. Fuck. This stupid censoring is already going as far as the weight put on gamers by too heavy DRM. When will games become playable again after install?
New Microbrush 2 Video
YouTube - Microbrush 2 2009/Q4 - Newbie Menu
Microbrush 2 Project Page
Stay Connected With Telekom!
The Telekom is doing a really good job messing with my internet connection. When we extended the contract, internet broke. When we do nothing, internet breaks. When they send a technician, the line is broken. When they send another technician to check where the fault might be, the line is not broken, but it is a problem in their office. I got a call a few days ago from an employee that the internet has been fixed again. Thank god, ISDN works again!!! But what about DSL now? Nowadays I am spending more time offline than online because they are messing up so often, and in every single instance so far it has been their fault, theirs alone... bah.
I finished our first run of Resident Evil 5 this evening with my brother. While playing, we already heard the fire siren going and emergency vehicles driving around. When I headed home, there were fire trucks obstructing my normal route, as there had been a small fire where they dispose of the flowers at our graveyard, at our church. I asked around to get some info on the case, and it turns out that the locals noticed the smoke and called the firefighters. There was also a man standing by who turned out to be one of our direct neighbors. A part of his hedge had been set on fire too, in very close proximity to our property. I saw a hole of approx. 4x4 ft. in his hedge. Then I went home and woke my mother, who was sleeping in the winter garden, and showed her the hole outside. There, our neighbor was already coming with a few policemen, and I gave them a heads up on a metal fence segment that was knocked down and bent over at a building standing next to our property. My mother went for the owner of that building and brought him to the scene, the police recorded everything and took some photos, and they noted down details from my ID card too, because I gave them the heads up on the fence. Exciting, or rather, that was pretty fucking close. I just hope the arsonist will stay away from our property. Update: Later we found another hole in his hedge, which was a bit smaller. There was a car parking behind the main hole, so it was close for them to not get their car set on fire too. I also heard today that they also set a part of the new bell tower of our church on fire. Everyone seems to know who is responsible for all the mess, it's the 2-3 kids who burned down an old abandoned restaurant here too.
The Days After
It is amazing how much my father changed to the better, on the surface at least. My mother is confusing me more and more every day. Now to make Sythen produce a few MB2 tutorials...
Evening Modelling
Now I am one of the few who read that novel too. I can only recommend it, it is doubleplusgood, disagreement is crimethink. Last oral exam for now on friday.
I just finished reading it, and I liked it very much from beginning to end. It has a very consistent story, with a very good sci-fi foundation. And, omg, I just found out that it is just the first part of a trilogy! :D
A, yeah
"Well, there is not much to discuss. We're giving you an A."
Okay, I wasn't so good with the proofs, since it already took me a long time to understand them in the first place, but it still was enough.

Yesterday we had quite a severe power outage at work (actually, the whole town had no power). I walked around the different sections and floors, to see how the outage impacted them. The magnetic door locks failed so those doors shut, the security alert rang, the battery back-ups were beeping from every other office, the fountain outside stopped working, and even the toilets were too dark to use! The main server room was the busiest place, of course! There was a stream of warm air coming from it, and technicians ran around and fiddled with those monstrous, beeping machines.

After the exam today, I went to have lunch at our diner (tasty!) and then went to the customs office to pick up a package. It's been quite a long time since my last time there. At home, I decided to relax outside with a book ("Spin" by Robert Charles Wilson) until I ended up falling asleep in my chair. Then, and that was sooo cute, my dog woke me up, by simply resting her head on my side. A few minutes later, the sound of two Bundeswehr jets broke the silence. They caught my attention, and I saw them maneuvering in circles in opposite directions. Once it almost looked as if they were about to crash frontally... they were very close. That must have been some kind of air combat training.
Oh my, oral exam tomorrow. Artificial intelligence, 2 semesters, 30 mins. Cross fingers.
Windows 7 Sins
Dear FSF, why are you coming up with such a ridiculous campaign now? Do school children really need to be able to browse all the OS boilerplate code that runs their computers? I think not. There is neither enough time nor enough knowledge at that level of education. Free software is nice, yeah, but... but this is so ridiculous I can only ridiculously repeat myself! Maybe your Windows bashing would have worked better when Vista and all the new technology was just being introduced... :P
Dear Microsoft, thank you for your continued effort in making my work easier, thank you even more for Visual Studio, and for C#, and for making everyone who doesn't have the patience for installing a free operating system capable of computing and programming quickly, and I say that without irony. :D
Microbrush 2 Features
Here, another YouTube video! :-D
Scott Baker
Ladies and gentleman,


I now have a stalker! :-D

Our last conversation began like this: "Hey!" "Heya Shrinker, how is Microbrush 2 today?" When I claimed that that program doesn't exist, he immediately sent me photographic evidence, and it was clear from the pictures that instead of having a porn collection like any normal person, he hoarded footage of that imaginary program! Unbelieveable! Anyway, such a an obtrusive stalker really deserves to be linked to from my links section.
Microbrush 2 Video
Here, I posted something on YouTube again :D
It's a little shorter this time, ... and it's very depressing how little of the actual programming effort is visible in new features :P Damn work under the hood...
My mother is just ruining my grandpa. He is now spending sleepless nights over the whole situation, and visited us this evening to talk with her, even though we told him that that's a stupid idea. Expectedly, she was drunk, and now that she found out that my father played a part in the new car I buy too, she is totally exploding on me. Duh, it's not my fault that I have two parents, and that he has proven sane, and she ... blah. I just wish she'd move out and give way for him moving in with his girlfriend, even if he kept all of his odd behavior before the splitting (of which many things were due to the stress in their relationship), it'd still be much better than with her now. ... walking a difficult path here. Moving out is too expensive.
The hate is in my mother. It knows no boundaries. My father approached us with the willingness to make clear decisions about the future of the family, decisions such as 'who gets what' and what kind of support to expect in the future. He even came up with concessions he'd be ready for in case my mother manages to talk normally with him. But she just couldn't concentrate on the now, started yelling at each of us, about things of the past, and is now making short-sighted plans again. Our support for her is fading. I am at a point now where none of that shocks me anymore. All these announcements of moving out and stuff, it is boring now. She acts like there is an audience clapping their hands every time she makes a remark about her former husband, but there is none but me, and I rarely pay attention anymore. She said my father envies how well we managed to live here without him so far, said that he certainly hoped for something else. I couldn't resist laughing about her, as "managing it" doesn't quite describe the shit that's been going on for the past months. Once again she says she'll move out... well? It doesn't make a difference for me anymore. Maybe my father moves in with his girlfriend... so be it. Next year I want to have my diploma thesis at hand, the key to standing on my own feet!
The Exam
Well, it sucked. There was a sketch and there were measurements. When I was done constructing the rough things, suddenly there was a change request by the people looking over, telling us to swap two measurements and reconstruct that thing. Then I spent too much time deriving the construction of a simple ellipse again, and in the end it didn't look like one. I added a lot of annotations on my sheet, and I forgot noting down the scale I drew with. All in all, I probably passed that exam with a bad mark, which I don't want, so I'll have to see whether I can repeat it soon. And I forgot a pencil there, fuck.

A Windows SDK note: Always remember! Use CreateDialog for creating a modeless dialog, and DialogBox for creating a modal one!
A Stop
All my hobby work stopped for a week... birthday this week, and my last written exam at the university ever a day later :D It's about geometrical construction. *practises*
I have posted some random Microbrush 2 info here: Interlopers
Kriegtek Unveiled
Dear readers, I have good news for you. Last week, the SVOC network was compromised by a group of now well-known to us Kriegtek hackers. They left their traces in our big virtual honey pot, so we used a feedback loop to counter-spy on them. Among incredible loads of porn on KT workstations, we discovered one thing that might indicate what they are planning next. It turns out they made a model of a voxelized pool with swastikas all over its side walls. We have several theories on its future use: We'll let you know as soon as our intensive analysis of the case provides a definite answer to this mystery.
New Laptop
I bought a new laptop yesterday, it's a Packard Bell EasyNote LJ65, with an ATi Mobility Radeon HD 4570, 4 gigs for am, 500 gigs of HDD, LED backlight, 17.3 inch screen, fancy touch-sensitive icons, Intel Core 2 Duo T6400 (45nm), very good webcam and microphone... And man, this thing rocks! I can run Saints Row 2 at playable framerates with this one, it's very silent, remains very cold, eats much less energy than the Acer laptop, the colors are much better to see, the viewing angle is much better, the screen is much brigther *slobs* Oooh, and the backup maintenance DVDs really did a job this time: From one of them, I installed all necessary drivers and OEM programs that shipped with it, after putting a proper version of Vista on it and repartitioning the HDD :D Also, a battery life of 4 hours (under no heavy load) is quite awesome to me :D
Break It Down
Two days ago, my laptop broke down. All symptoms indicate a mainboard failure, the HDD was alright and all data could be retrieved. That damn laptop didn't even last for 3 years... bah. It was an Acer Aspire 5112 WLMi 2GB. So, time for a new laptop!
Microbrush 2 Video
Here, I posted something on YouTube :D
I am NOT a child abuser.
Our government has recently introduced a law on DSN-banning websites with child pornography. People browsing to such a link will now see a stop site which claims that this is the way child abuse is stopped. The first draft, which would have been accepted unchanged if our one big Europe election losing party didn't oppose it in the last second in order to get some young voters, said that the IPs of people browsing to that stop page were to be recorded, their identities determined, and then those people prosecuted (as child pornography consumers). Of course, that'd mean if you wanted to get rid of your neighbor, you'd just hide a link to that stop page in random chatter.

Just today, a conservative (read: idiotic) politician of the CDU (a Christian party) started making an effort on expanding those DNS bands to all pages about violent games. So... now they not only brand all German gamers as natural predetermined spree killers (by coining all violent games as "Killer Games"), they also lump us together with child abusers.

Dear fucking politicians, I am not a fucking child abuser. Neither can you stop child porn on the internet that way, nor is this exaggerated paternalism helping reduce violence in any way. Violent games are already VERBOTEN for youngsters, we already have the strictest laws regarding violence in media in the whole world, so strict that in fact this can be considered mass censoring, so strict that all major movies on TV are suddenly suitable for youngsters (at noticeable loss of consistency in story), there IS NO MORE ACTION REQUIRED. I am sick of being branded as a criminal for playing games where, omg, where there is shooting!
In our society, the image of all gamers is slowly being cemented by populist politicians and the rainbow press. How come that when there are not enough catastrophes at hand, politicians tend to gradually take away more and more rights from adults and criminalize more and more things nobody cares about in any other country? Seems that heading into a totalitarian style of leadership is the default movement in politics. What are we supposed to do in our free time once everything is forbidden, huh? Fuck them.
Voxelstein 3D Continued
A squad of fellow SVOC employees has broken into the Kriegtek headquarters last night. Not only did they set the development office on fire, they also secured evidence of continued Voxelstein 3D development. According to insider news (read: a captured and interrogated Kriegtek employee), the new engine will, just like that which Ken Silverman wrote, not harness GPU acceleration in any way. Interrogation revealed that the new engine has been written from scratch, maybe that's the reason why Voxelstein 3D development is taking so long. The evidence contained a technology demo in an engine version named "Kriegcast 010", a few screenshots follow:
That scene is 1024 voxels in width, length and height, which seems like much. Shortly before death, the interrogated employee also revealed that advanced realtime shading technologies will make it into the final game. Regarding that, see what the head of Kriegtek posted some time ago. Confidential Kriegtek documents have revealed the following feature list for the new engine: I personally think that this sounds like crap - once again, Kriegtek is screwing up. If you scroll down this news site a little, you might also notice that Kriegtek actually STOLE our latest building! We are still investigating how that was even possible, with ceiling-mounted sentry guns in each of our corridors. To give you an impression of our tight security measures, I should mention that our active security measures, such as the sentry guns, are all configured to activate when "in doubt", meaning that from time to time we lose valuable workers, but they gave their lives only for the improved security of everyone else. We will continue our efforts to beat this competitor out of existence.
The Last Straw
Today I ingested my last Isotretinoin capsule. At the end of this acne treatment, I feel like almost dead in some aspects. I haven't eaten properly (= without pain) for more than five months now, just to give an example. Also, can you imagine how sad it is when you feel pain, and making a sad face actually makes the pain even worse (not mentally, but physically)? Gah, health-wise, these have been the worst six months of my entire life.
Saints Row 2 Attack Chopper
So, how do you obtain the attack helicopter, the Tornado? It's been discussed in so many forums... people have learned to jump on SWAT helicopters from above in order to capture them in the air, others are trying to exploit bugs in the missions... but there is actually a fairly easy way to do it... Go to the Stilwater Police Department, where there's also the wiretapping mission and stuff, and just go into the wiretapping room, and stay there for a few seconds. Then, go to the helipad, and back to that room, wait for a few secs, and back to the helipad, until finally a Tornado appears. It took me only 2-3 visits to the Helipad, so the chance for that proximity vehicle spawn point to trigger seems to be relatively high, and the wiretapping room seems to have just the right distance from it. You don't even need to have any police stars for that to work. I have also noticed with my brother, in Coop, that if one player picked up the Tornado (and is awarded 5 police stars for it), that one player can flee upwards while the other one gets himself killed a couple times -- this way the stars vanish, and the helicopter can safely be landed on a player-owned helipad without any fighting.
Microbrush 2
... let's add something to the previous list:
Microbrush 2
... will have these features at least:
ATI Display Driver
Sooo, after discovering memory leak behavior I decided that it's time to update the driver for my ATI Mobility Radeon card in my Acer laptop. The most recent Catalyst installer, carrying the driver version 8.600, told me that my 8.362 driver is alright and up to date. Of course it was lying. After uninstalling the old driver, it didn't present me with a new driver to install, but luckily that could be fixed with the Mobility Modder!

Update 1: Well, installing a new driver didn't work nevertheless. Setup worked, driver wasn't used by Windows. On the Acer support pages, I am presented with an even older driver than I have gotten from there ealier, it all just makes no sense. Seemingly I am left helpless with this X1600 mobility card now, as I can't update it with a generic driver even.

Update 2: With nothing to lose, I installed what Windows Update had to offer, and poof, here comes a version 8.531 of the driver, specially for my card! Omg, Microsoft did a better job than AMD and Acer together! :-D The ATI support hub on AMD.com seems to be broken, it takes ages to load, regardless of the browser. And OH MY GOD, 3D stuff now runs notably more smooth on my laptop, smoother than ever before, only thanks to this driver :D:D Actually, seemingly the driver I now have is not from ATI alone, but also from Microsoft (WDDM stuff) o_O. It does feel a little bad that the best driver existing for my notebook is only available through Windows Update, and I don't have an offline backup version, but well, maybe things get better in future (maybe I get a new laptop sometime).

Update 3: All OpenGL-related (glFinish, glDeleteBuffers) memory leaks are gone since the install of this driver through Windows Update. Mission accomplished.
Hmmm, so how do we set or get an item from an array (list) in LSL?
C-like languages:
v = arr[i];
arr[i] = v;

arr = llListReplaceList(arr, [v], i, i);
officially better: arr = llListReplaceList((arr = []) + arr, [v], i, i);
v = llList2Integer(arr, i);

I really wonder...
A Forward Move
After ongoing troubles at home with my mother because of the mutual inability of my parents to talk to each other, I have re-established contact with my father, and was happy to see that he has changed to the better in the time we had no contact. If all goes as planned, I'll move to an own apartment this year. This will be a difficult situation for me, considering the constantly high university workload, and for my mother, who maybe has no other option but to move out too, but on the long term this will be much better than the current situation continued.
Tricks And Traps
Sooo, I observed the odd effect that in a for loop with crystal clear semantics, the second argument of a min function was evaluated one time too often. ... Long story short: windows.h defines two macros, min and max, with the ?: operator (and redundant evaluation), that supersede the template min and max functions from the C++ standard library if you use it, but that behavior can be turned off via "#define NOMINMAX". That was very annoying, unnecessary, unconventional, not expected, and can cause unintended side-effects and slowdowns.

Have you ever faced the problem that you have classes with a lot of get methods, some of them lightweight, some of them with a lot of computation backing them, and then losing overview which values you need to buffer? A friend got a nice idea to solve that problem today: instead of naming a function getStuff() and hiding all the complex things it does, name it computeStuff(), so the end-user programmer knows that calling this is more expensive than calling a lightweight getter :D
Last night they showed Demolition Man and Wind Talkers on public TV, all uncut.
Life is good.
A Little Modelling
The office building took me one full evening to make, phew.
image image image image image image image image image image
Our Arch Enemy
Oh man, this is already the third news article today!

I just wanted to announce that the S.V.O. Committee (which I am the key representative of) has observed a group of terrorists forming a new group against us, the Krieg Technological Research And Development Advancement Group (KTRADAG).
We'll be keeping you up to date about their efforts to undermine our organization and the society as a whole.
By all means necessary, we hereby already declare war on them.
A Complex Joke?
In the morning, I had a Python question. Because I was too lazy to log in, I asked my friend Paul to poke Thomas online. Thomas wasn't online and only read the message later. In the evening, I sat waiting for the next lecture with Paul, and Thomas was still at home. He came online and asked me what Paul wanted.

I pretended that Paul had a problem with his dual-boot system, which he countered by telling Thomas that I had a problem with my freshly installed Ubuntu. Well, I never used Ubuntu, so I googled for error messages and started a console window with a custom title. (see start /?, color /? and prompt /?). He asked for some cat system diagnostic output, so I googled for some and we figured that there was a problem with my (not really existing) floppy drive, and that my hard drive stopped existing. Then he said good bye, signed off and headed for us, to join us in the lecture shortly after.

He told me he'd take a look at it personally, and I told him before that I downloaded an odd addon that might have caused the problem. So we had to come up with a website, and we had to do it fast.
JavaCC Pitfalls
What The Frak?
Editing shipment addresses for PayPal transactions is a pain in the ass. Why? Who designed that shit?
Did you know that an Axon, the electronic signal-emitting part of a nerve cell (like those found in your brain), can be up to three feet in length? OMG I say :D University really is keeping me busy now: I stopped playing games and started studying and doing homework during lectures.

Oh hey, yesterday, an abandoned two-story hotel/restaurant in our town burned down and collapsed. Since it was the only abandoned building left to see for people passing through the town, it just looks like a necessary and dirty deconstruction to me. Let's see what they'll build there next.

Have you ever sat there with a text editor, search/replace dialog open, regular expressions active, trying to prove hypotheses about a set of textual data that is 100MB in size? You know, sometimes it really pays off to write a small C# or Java program to do the job for you. I mean time-wise, and since time is money, you should really think twice before hitting that "replace all" button.

Seemingly there is a Left 4 Dead expansion that was patched into everyone's retail version. If only I had the time to play it at the moment. The lighthouse in the new intro video looked nice though!
Imperator Update
There was quite some stuff on my TODO list for this project, and soon I might need a fresh parser implemented in C++ again... so I have cleaned up a bit!
You can find the newest version of my parser generator, Imperator, here.
This is the list of changes in the 2009-04-14 release:
The Clusters
Here is a view on the aforementioned cluster structure in action. All boxes are brushes, making them special. The black frames denote inner clusters, the dark red outlines represent the boundaries of leaf clusters. Each leaf cluster has a displayed model associated, where the child brushes are rendered into.
image image image image
Saints Row 2
My brother borrowed some games to try out in cooperative mode, and Saints Row 2 has proven to be a big positive surprise to both of us. It's like GTA, but it's much less hassle to get around in the world, the shooting simply is better (hey, you can aim properly :D), and the story is quite nice too! In one side-mission, we were to protect a VIP from fans that turn crazy, and we did so by grabbing them and throwing them into predefined areas... ... where, depending on the stage, they were shot by military vehicles, squashed by bulldozers, or soaked into a helicopter rotor. Those pesky fans! This is definitely the best GTA-style game I have seen so far. It's really worth a look, so go check it out! :D

Oh yeah, seems like the version of JavaCC I have been using didn't quite count line ends in comments, causing bad offsets in syntax error messages, nor did JJTree guarantee that line numbes from the .jjt file remained consistent... Tsk tsk, this was one of the most obvious problems I tackled properly in Imperator. In fact, Imperator's parsers are so accurate in error position reporting that I was first irritated... because I was so used to bad error report positioning from JavaCC.

Right now I'm investing some time in hierarchial clustering of the 3D space... to put a lot of brushes into it. Adding and picking work with practically no computation time, which is especially useful for editing. But now that the system is so specialized on adding stuff, removing stuff has proven to be a hard riddle to solve, but I'm on it! Oh yeah, regarding "paint-select" in brush-based editors: It works fine with this structure I have now, but I figured paint-selecting brush faces poses a problem on its own... If you just stroke along different brushes, you are in danger of selecting faces that are not visible, but participate in an edge you stroke along. What's the solution? Simply sample with more than just one point of selection around the mouse cursor, e.g. have 4 points representing a little square around the cursor. When you now stroke along your brushes, only those faces get selected that are hit by all points at once, so there are no more accidental selections. I hope this will prove useful in rough texturing of Microbrush 2 architecture.
Final Destination 3
Or Crank. Or Die Hard. It is absolutely pointless to watch any such movie on German TV, for they censor out as much violence as they can.
The Next Generation
Accuracy 2 was nice while it lasted, but development is already stagnating, I just lost interest in it with potentially better technology at hand.
Microbrush started as a small dirty experiment to writing a brush manipulator, and it was successful beyond all my expectations.
It even inspired a friend to start working on a game again, but many reviewers complained about the total lack of a GUI. Seemingly this isn't a tool for the masses as it is, and needs to be redone completely. For instance, there is absolutely no optimization in regards to hiding brushes out of the view, or only redrawing a part of them, and hence selecting brushes slows down quickly (after 1k brushes).

Bork3D, the 3D engine that powered my projects for years, grew old and rusty just like an old Battlestar. I have learned since the inception that scene graphs are better, and that many other details I did could have been done better too. The time for refactoring by redesign has begun, the lifespan of that old engine is over, and so there shall be a whole new generation of projects, and an awesome-ized version of Microbrush, Microbrush 2.

And happy first of April, whoever reads this.
I will be away from 2009-03-20 to 2009-03-31. See you.
Microbrush update
An updated version of Microbrush is available.
This one brings you better (and less tiring) visuals and a crash fix for an issue related to degenerated brushes that disappeared from facedrag, making it an overall safer experience.
Here is some architecture in the making:
image image
Multiline comments
I've recently had the problem of Imperator not interpreting multiline comments with forward shlashes in them right. I tried various regular expressions to describe how they are built, but that naive approach failed. So I took a pen and paper (!) and drew a deterministic automaton, and with some trial and error and actually an hour of sleep too, I've derived this regular expression from it:
"/*" (~['*'])* ('*')+ (~['*', '/'] (~['*'])* ('*')+)* '/'
I wrote that into the grammar of Imperator itself, and it performed good enough (as in: I couldn't find any problem cases anymore). That expression can be described as "the multiline comment starts with '/*', ends with '*/', and there may be no '*/' anywhere between the start end the end".
I encountered a rather interesting problem today with a foreign project. JavaCC is a parser generator for Java which can take a JJT grammar as input which is annotated with some hints that have influence on how the parse tree is generated from it. From the JJT file, JavaCC generates a JJ file, which contains the matching logic and the logic to construct the tree. One can supply only a JJ file too, at the expense of losing the tree output functionality. Anyway, there was a project with a JavaCC grammar which I needed to update, and regenerate a parser for with JavaCC. I prepared everything according to standard ways of the environment the project is part of and then stumbled over a weird error: JavaCC refused to compile the JJ file!

Why oh why, I wondered. JavaCC reported an invalid Unicode character inside. I checked the JJT source, but there was nothing that could cause problems. When I looked into the JJ file, however, I was shocked. JavaCC (invoked from Maven, at least) adds the path of the generated file in the very first line of the generated code, as a platform-dependent string. Just take a little bit of Windows here, and have a package name containing ".utils" there which you must not change, and you have a nice recipe for problems! \uXXXX is the Java way of escaping Unicode characters, and such an escape sequence must be correct both in normal source code and in comments (you could write a whole file like that, it's some kind of pre-processing step).

\util was of course not a correct Unicode character. When I fixed the bug by hand and compiled the thing with JavaCC, to get my Java classes, it appeared that in some of them, their own path is also dumped into a comment! I couldn't automate those replacements by hand very well, so I had to document them instead, for now. That's 1. JJT -> JJ, 2. editing JJ by hand, 3. JJ -> .java files, 4. editing two of those output files by hand. And a problem is that even if I renamed the parser's package to something without a U, then the whole Eclipse workspace could be located in a directory that starts with a U... The JavaCC team should really fix this seemingly unimportant issue, by replacing the platform-dependent path with a URI. Or maybe they have already? - I couldn't find information on such a bug reported in their ticket system. The project I edited uses JavaCC 4.0. Or is it that the majority of JavaCC users works on a Linux platform? :-D

In other news, it is now mandatory in my local version of Imperator that an inline rule (one which doesn't generate an output node on its own) must be preceded with a hash symbol (#) wherever it is used. Previously, the # would only be found at the definition of the rule, but it figures that when working with the output of a grammar, with the actual output node structure, it is much better if you see this definite warning sign within a rule, and wouldn't have to look up every used rule for whether it is inlined.
Updated Maps And New Maps
Check out our all-new Half-Life 2 Deathmatch maps page here! :-D
"Meet a Zombie", "Miqrobrush" and "Snow Mountain" we released just today.
Big thanks to Mevious/SG2/seriousgamer200/Ben for putting so much efforts into mapping this!

Have fun playing!

image image image image image image image image image image image image image image image image
An updated version of Microbrush is available.
This one contains a few more models, like the school displayed, and other chunks which we want to use in a Left 4 Dead campaign. The only notable change to the program itself is the following: Sometimes, when accidently changing grid size, the cursor behaved in an unexpected way, and was annoying when dragging faces. Now the grid size can only be changed when you are not just in the middle of an operation, and when it changes, the cursor is positioned under or near your mouse cursor properly, as if you moved the mouse (previously it was set back to the grid origin).
This time it's a school.
A little modelling:
My physical condition got worse because of the medicine, 110 days left. I should really upload new HL2DM map versions. Sorry Mevious/SG2/seriousgamer200/Ben, I am so lazy.
Imperator Bugfix
A fixed version of Imperator is available.
There was a mistake in generated C# code where a sequence in a regular expression wouldn't preserve the index in the source string as intended, corrupting the following matches. So, well, nothing spectacular.
Nothing Good
When I walked to my car in the morning, my father stood nearby in our front yard, greeting me good morning. I didn't respond because he only does this if (a) he wants something or (b) he wants to be victimized in a way. I got into my car, he came there quickly and opened my door, and held it open. I repeated "leave me alone" and he started putting words in my mouth again. And I resisted. Leave me alone, leave me alone. When I returned home today, he parked the rolling trashcan in my carport again, blocking it from proper use again. Apparently I was right to tell him to leave me alone, again! :-)
This person apparently doesn't want anything good for the family anymore, we must concentrate on not playing anything into his hands.
Imperator Parser Generator - First Release
Here it is.
The first release of Imperator Parser Generator offers a very straightforward way for generating LL(*) context free grammar parsers for C#. You just write your grammar, start the program with it, and voila, your parser is done. There is not much checking on the rule topology yet, so you better know what you are doing. Grammars for Imperator itself (which defines its own grammar), for VMF files and for the face descriptions in VMF files are included.
More to follow.
Language Constructs Of The Future
I think that modern computer languages should allow for working with tuples much better. The following constructs should be quite doable in (addable to) modern languages of the C family already:
(int, int) myPair = (x, y);
int (a, b) = myPair;
myPair = (y, x); //alters contents of mypair
(x, y) = (y, x); //alters contents of variables
(int, int) add_mul(int x, int y) {return (x+y, x*y);}
And for something more complicated, how about function concatenation based on input and output?
(int, int) foo(int x) {...}
float blah(int x, int y) {...}
void test() {float f = foo(2).blah;} //the output of foo is the input of blah
Microbrush Update
There is a new version of Microbrush available.
Since a friend at the university kept using it with keyboard only, I had to remove the dependency for computer mice: the grid can now be pulled and pushed with the keyboard too. Sometime later, I plan to make the whole configuration ... well, configurable, and not hard-coded anymore. It now saves faster in its native format because that process is now buffered. The most notable change is that if you like using the cut tool to shape your brushes, it is now much less probable that you end up with faces which are only displayed half. Microbrush now recognizes such faces and removes them. When I imported geometry from Hammer I noticed that Hammer probably doesn't do the same, so occasionally a few imported brushes disappear. I exported from MB to Hammer and back, and that seems to work well.
VMF: Converted.
VMFToMicrobrush is ready for use. It converts Valve's VMF files (Source Engine map source files) to the Microbrush binary format, so already existing architecture can finally be used with Microbrush.
You can find it here.
VMF: Parsed.
I managed to regenerate the parser of the parser generator, the parser which parses the input grammars, with the parser generator itself, finally. And a VMF grammar is complete too already, and very soon I should have a VMF to Microbrush converter done. And lips are bleeding much again :/
I Should Be Sleeping
My nose is bleeding less frequent now, and I can actually feel the original shape of my lips again -- my body is getting used to the Isotretinoin! :-D

Also, I figured today when working with JavaCC that it does not support syntactic lookahead within a lookahead, but my parser generator does :-D
Yes, development on it is progressing well :-)
If you wonder about the smileys, I am not drunk or something :-S -- just very tired :-E
Mysterious Night
While watching TV, the visible outside suddenly got my attention. Behind the silhouette of an old gymansium which I can see through my window, there was bright blue light flashing, like in a thunderstorm, but without the lightning lines. And there was no sound from that either. That came a few minutes later, and I clearly heard it: A distand explosion. That was when I called the police for the first time in my life, and apparently I wasn't the first one to report that phenomenon: They said that they were still trying to figure out what happened. It seems like firefighters were dispatched for a village just at the other side of Rostock, but there was nothing there. Our coal power plant is in the very direction I saw the light flashes coming from, but after hearing reports from people in a distant village, and even people from Hamburg seeing it too, this news report from a Swedish site makes more sense: It was a small meteor impact!!
Farewell, POV-Ray
For our Computer Graphics base lecture at the university, we are given two optional tasks: programming an OpenGL animation and making a POV-Ray scene. I decided for the POV-Ray scene because I wanted to check out how that language looks like and feels like when working with it. For each ot those two optional tasks done, the student may talk about those specifically in the exam for five minutes. In the last lecture, I checked with my professor (Ms. Schumann) whether my scene is already full enough of CSG modeling for being taken into account, and it was.

I just finished the last few things (adding a reflective thing, removing commented out sections, etc.) and will shortly submit my scene. After working so much with POV-Ray, I must say now that this language is dirty beyond imagination. It lacks a proper structure, is too forgiving when making mistakes (like omitting a comma here and there) and very inconsistent when it comes to "here you need this, there you can't use it". Also, I'd have specified a few things differently, e.g. the default coordinate system, or the way planes are specified (why the heck don't they input n and d from p0*n = d, but instead n and d*norm(n)?!). Or how about name scopes and such stuff? There seems to be only a global namespace which you can easily pollute. :(

Anyway, here's my crappy scene, assembled with lots of macros (think of them as POV-Ray geometry functions) and a lot of swearing. All measurements are parametrized, so are all textures. (At the beginning I thought I'd find the motivation to texturize and light it all properly! Lol!)
Regarding the second picture... we had another OpenSceneGraph exercise today in another CG-related lecture. Because OSG turned out to be a bitch to work with in our environment (for instance, it'd always eat 100% of one CPU core, and the documentation is full of errors and things forgotten), I decided to mess around with shaders (our task) in my own program (not our task, but it was approved). A funny thing I tried was using a black and white checkerboard pattern on everything. And when a brush was selected, the checkerboard would invert. What is the opposite of eye candy? Well, that was it! The pic there shows a little combination of trigonomety on the texture coordinate information (which is just based on vertex positions), and those separating lines you see everywhere are there because at every xth distance from the camera, I inverted the pattern.

Parser generator work is progressing slowly, but that is only becaue of university tasks. My confidence in it is still high.
I've always had acne, always visible and occasionally very bad. Especially my back was full of dark blue and black spots that'd cause pain and not go away. I've grown up with the jokes about it as a child, and ran around in circles as an adult pinpointing the reason. Coult it be allergies, or habits, or the milieu? No matter what I tried, the disease progressed completely at random.

A few weeks ago, though, it suddenly got a little worse than ever before, with a new painful and unremovable spot appearing every day, bad enough for me to consider seeing a doctor about it. And I did, and she was all "OMG, worst kind, here, take the strongest medicine!"

So for a few weeks already, I am on Isotretinoin. It basically works by making the skin completely dry so the acne bacteria in the pores lose their fuel of life and vanish. Unfortunately, there are some side effects that come with it which currently make my life a lot less enjoyable. Right after the first time I took my pills, I lost the ability to distinguish the silhouettes of the trees against the nightly sky -- night blindess. That was all for like two weeks, after which the medicine started taking the intended effect. Not only did my skin dry out, my lips also broke and remain broken despite all countermeasures. I admit, it was interesting at first to see skin peeling off from the lips, but apparently a limit was reached soon. They tore open in the middle and started bleeding.

Right now, I can't even blow a dust flake off my glasses without causing great pain to myself. I'm also having a hard time eating, since everything that requires these dry lips to deform simply hurts. When I dry my face with a towel, the lips always leave a blood stain now. At some point, I started having what I call "surprise nosebleed". Surprise nosebleed means that you sneeze and figure a few minutes later that your shirt is full of little blood spots. And last, but not least, maybe because of my completely dried out mucosa in the nose, I am having a hard time sleeping through the night. I wake up and am confronted with the feeling of suffocation, after a long period of coughing. For some reason, getting out of bed and doing things (like writing this) stops it. I hope I have soon passed the point where no new side effects begin and the old side effects don't get worse. A few days ago, the backs of my hands became dry and skin started to peel off from those too, and my left hand got some interesting red spots on it, but I can do something about it with a cream.
The Process
Work on the parser generator is going on well.
I finally received an updated batch of levels from Mevious (formerly known as SG), am going to put them up soon.
My local version of Microbrush already got slight improvements, most notably detection and removal of undisplayed faces which used to cause rendering flaws.
For an OpenGL assignment of a friend at the university, I built this (in one long university lecture):
Soo... my parser generator's parser just matched its own grammar's grammar!
Now there are no more obstacles in the way for me for really implementing a parser generator :-D

I must say, the most interesting problems so far arose around looking ahead when matching rules. For regular expressions for the tokens, I'm using back tracking, because it's merely saving and restoring an index into the source string. Each token is only matched once, fetched tokens for looking ahead are kept on a stack for later retrieval. After I realized that within a custom lookahead, I still have to look ahead at choice points, I managed to stackifize that stuff too. I pursuited a few dead ends on the go, but finally reached a clean set of transformation rules which I can put to use in the generation process soon. Let's see how this turns out!
Design by Shrinker.