OpenGL experiments
Recently I have been learning basic realtime 3D graphics using OpenGL ES 2.0, GLSL and C++. This is my first time coding anything more serious in 3D and also OpenGL! In theory this could run on any platform that supports OpenGL ES 2.0; ranging from PCs to Smart Phones. All of the content was used purely for learning purposes.
Cross-Platform window management using PowerVR VRShell.
Initialization of projection and view matrices with the help of GLM (OpengGL Mathematics).
Rendering 3x colored cubes using a single Vertex Buffer Object. Simple interpolating-color fragment shader.
Loading of image data using FreeImage. Rendering of three rotating and textured cubes.
Used Libraries: OpenGL ES 2.0, GLM, FreeImage, OOIS, Boost
- World Triangles
- Implemented free-fly quaternion-based camera. Rendering single-textured world.
- Rendering a world with multiple different textures.
- Fighting with invalid Texture UVs
- Still fighting with invalid Texture UVs.
- Rendering Glastheim castle entrance
- Calculating per-triangle normals. Some faces aren’t calculated correctly yet because the order of triangle vertices was output wrong.
- Correct triangle normals mixed with texture color.
- Single-light lightening that uses the previously calculated vertex normals.
- More shading. This time with a slightly red light color.
- Blue light color.
- The previous scene without the shading effect.
- Added Specular Reflections. The bright spots.
- More specular reflections. It makes the image smoother.
- More specular reflections. Smooth!
- Specular Reflections in Glastheim
- Loading and rendering of basic models. Untextured with simple vertex normals.
- Model with Smooth Vertex Normals generated by averaging triangle normals of adjacent vertices.
- Rendering of multiple textured models. The orientation is still awfully wrong.
- A very slightly less strange world.
- Still a Strange World. Now slightly better positioned.
Absurd Haskell code on github
I’ve created a new github repository for some of my Haskell experiments.
Feel free to check out the code: https://github.com/tivtag/Haskell.Absurd.Code
Zelda video’n shots
TLoZ: BC is a free offline hack and slash RPG, best compared to Diablo.
In BC you hunt for the best items, steadily improving your stats and talents!
Here are some new screenshots and a simple gameplay video.
Installer Download
http://tick.federrot.at/zelda/beta/TheLegendOfZelda_BlackCrown.msi
Don’t forget to get latest patch by using the Zelda Updater! Last patch: 22.11.11

C# <3 Ruby
IronRuby allows you to get some of the freedom and expressiveness of Ruby in the .NET biz. world. Recently I’ve been using it as a simple game scripting language.
Warning: This post is a beginner tutorial on how to get started with hosting IronRuby inside your C# application.
.
.

.
Step 1
Download the IronRuby binaries from Codeplex: http://ironruby.codeplex.com/ Warning: As of writing this the IronRuby 1.1.3 installer won’t install the binaries.
Step 2
Add references to IronRuby.dll, Microsoft.Csharp.dll and Microsoft.Scripting.dll to your project.
.
Step 3
ScriptEngine and ScriptScope are the key classes of the Dynamic Language Runtime that allow us to run Ruby code: (Download Tutorial Source Code – Rename to Zip)
// Tutorial 1: // Initiate the main object that drives IronRuby: var engine = IronRuby.Ruby.CreateEngine(); // And here goes the magic: engine.Execute( "puts 'Meow, from Ruby!'" );
// Tutorial 2:
var engine = IronRuby.Ruby.CreateEngine();
// ScriptScopes allow you to capture variables and methods
// within a specific non-global scope.
ScriptScope scope = engine.CreateScope();
// The ScriptScope API allows us to easily set variables
// from .NET:
scope.SetVariable( "score", 10 );
// You can also use Ruby to set variables:
engine.Execute( "max_score = 10", scope );
// Let us access the variables now. Note the usage of "%Q/ /"
// as a replacement of " " in our Ruby code.
engine.Execute( "puts %Q/Your score is #{score} of #{max_score}!/", scope );
.
Step 4 – Domain Specific Languages
We can ‘teach’ our scripts a set of specialized methods that make it easy to interact with the problem domain. With the help of Ruby’s expressiveness our scripts will look more like a custom language that is focused on the target domain. See Teta on github for a text adventure that is build around a Ruby DSL.
# Here's a silly example from my Zelda fangame:
on_time_changed do |time|
if time == 'DayBegan' then
if roll_1_in 100 then
spawn_item 'Ruby1'
after_seconds 2 do
fairy_says "Oh, what's that? Lucky!"
end
end
end
end
// Tutorial 3 - how to get started with a Ruby DSL from C#:
var engine = IronRuby.Ruby.CreateEngine();
var scope = engine.CreateScope();
string domain =
@"
class Universe
attr_accessor :underlying_theory
attr_accessor :groups
def initialize()
@groups = []
end
def to_s
%Q/Universe based on #{underlying_theory} is filled with: #{groups}./
end
end
class Group
attr_accessor :name
attr_accessor :galaxies
def initialize()
@galaxies = []
end
end
class Galaxy
attr_accessor :name
end
";
// Now teach it about our domain. You could use normal C# classes too.
// But those might be at times be more awkward to access from within Ruby.
engine.Execute( domain, scope );
string dsl =
@"
# DSL:
def universe(hash)
u = @@current_u = Universe.new()
u.underlying_theory = hash[:based_on]
yield if block_given?
u
end
def group(named)
g = @@currrent_g = Group.new()
g.name = named
yield if block_given?
@@current_u.groups << g
end
def galaxy(named)
g = Galaxy.new()
g.name = named
@@currrent_g.galaxies << g
end
";
// 'Enable' our tiny DSL:
engine.Execute( dsl, scope );
// And lets use it to create some universes:
string ruby =
@"
mt = universe based_on: 'M-Theory' do
group 'Local group' do
galaxy 'Milky Way'
galaxy 'Andromeda Galaxy'
galaxy 'Triangulum Galaxy'
end
group 'Virgo Cluster'
group 'Centaurus Supercluster'
end
hlt = universe based_on: 'HL-Theory' do
group 'Black Mesa' do
galaxy 'On a Rail '
galaxy 'Questionable Ethics'
galaxy 'Lambda Core'
galaxy 'Nihilanth'
end
end
et = universe based_on: 'Empty-World Theory'
[mt, hlt, et]
";
// ScriptEngine.Execute returns our list of universes as the result of the ruby code:
dynamic universes = engine.Execute( ruby, scope );
foreach( dynamic universe in universes )
{
Console.WriteLine();
Console.WriteLine( universe );
}
.
Step 5 – Miscellaneous Notes
I encourage you to use a Test/Specification Driven Development style when working with your Ruby scripts (It is imho a must with dynamic languages). Personally I can’t yet rate how easy/hard it is to get something like RSpec running with IronRuby and loose scripts.
The outside image of IronRuby looks a bit shady at the moment. The official website doesn’t link to the newest version, and all in all the project is fragmentted over too many different domains. It doesn’t help that the installer and Visual Studio integration (v 1.1.3) is somewhat bugged. From the inside we’ve got a very solid product that can get you some of the Ruby love inside the .NET world. Thanks to the open source community on continuing work on IronRuby and IronPython! <3
.
Step 6 – Additional Resources
IronRuby Tutorial Source Code – Rename to Zip
IronRuby on Codeplex
IronRuby Mailing List
IronRuby Source Code
IronRuby Issue Tracker
2010 in review
.
Welcome, prime year 2011!
2011=157+163+167+173+179+181+191+193+197+199+211
.

.
2010 was a quite exiting year. It was my first year working in the software industry (or even working at all, this is my first job)!.
In my free time I was (am) trying to extend my mind to the non-Microsoft world:
- Ubuntu
- Ruby (blog post -> here)
- Some BDD on the technical side with RSpec and Cucumber
- A bit of MongoDB and Ruby on Rails
- Physics Game Programming using the Farseer Physics Engine 3.x (more about this later this year)
- And I’ve taught my father some Haskell!
At work I was mostly using C# and C:
- Micro-controller programming in C using OpenAT – doing position detection using the GPS (really FUN!)
- I’ve introduced S.O.L.I.D. and similar design practices. More teaching (fun:)! Also the following technologies; including a new shared in-house base framework:
- AutoFac
- Caliburn.Micro
- NHibernate + FluentNHibernate
.
Blog stats
The stats helper monkeys at WordPress.com mulled over how this blog did in 2010, and here’s a high level summary of its overall blog health:

The Blog-Health-o-Meter™ reads This blog is doing awesome!.
.
Crunchy numbers
A Boeing 747-400 passenger jet can hold 416 passengers. This blog was viewed about 3,500 times in 2010. That’s about 8 full 747s.
In 2010, there were 7 new posts, growing the total archive of this blog to 29 posts. There were 10 pictures uploaded, taking up a total of 881kb. That’s about a picture per month.
The busiest day of the year was April 18th with 48 views. The most popular post that day was InvTetris – Inverse-Space Two-Player Tetris.
.
Where did they come from?
The top referring sites in 2010 were en.wordpress.com, bucles.wordpress.com, twitter.com, tick.federrot.at, and zfgc.com.
Some visitors came searching, mostly for mathematical shapes, fractals, fractal, inverse tetris, and particles.
.
Attractions in 2010
These are the posts and pages that got the most views in 2010.
InvTetris – Inverse-Space Two-Player Tetris June 2008
5 comments
The PropertyGrid – a great friend. April 2008
1 comment
Super Shapes – my first WPF application April 2008
6 comments
Fractals on the Gpu August 2008
The Legend of Zelda : Black Crown | First Batch of Images October 2008
2 comments
- And I’ve taught my father some Haskell!
Dark & Light
http://tick.federrot.at/dark/light.html
Dark & Light – a random Java Script arty thing
Introducing a ruby adventure in text or how I learn(ed) Ruby
I am currently studying the Ruby programming language. You know; as a software developer you should learn at-least one new language per year! Ruby is a dynamic multi-paradigm programming language that is really fun to use!
This time around I’ve decided to focus on learning a testing framework for Ruby very early. My choice was the very elegant rspec specification framework. RSpec, as most great Ruby libraries, uses an (internal) Domain Specific Language to describe its application domain; which in RSpecs case is describing the expected behaviour of your application.
At the very beginning of my journey I’ve used the Interactive Ruby (irb) REPL (Read-Eval-Print Loop) to explore the language. REPLs are a great way to explore your language of choice! Soon after I’ve started to write tests (or rather specifications) for features of the Ruby language. Personally this didn’t keep me going for very long; it was quite useful.. but.. I needed an actual project to work on!
Of all the goodies Ruby comes with, its Meta Programming features are the most thrilling for me. I wanted to write my own Domain Specific Language (DSL) inside Ruby. And thus was born Teta, a ruby text adventure!
Take a look at this link for an example of the DSL. (You can find all of the source code of Teta on github.)
When I am working on Teta I use three Terminal sessions (in TABs). The 1st TAB has got VIM loaded to edit the source code (Derek Wyatt has got tons of great tutorial videos about VIM):
.
The 2nd TAB is used to issue various commands; including executing all rspec specifications or pushing changes to the git repository. I also use it to access the great ruby documentation (using the ri command):
.
And finally the 3rd TAB has got an interactive ruby session loaded for exploration and experimentation:
.
But back to learning new languages using Test Driven Learning. It was initially a blog post by @pragmatrix that pushed me into the direction of using a testing framework when first learning Ruby. To say the least; it was really worth it!
In case you are like me and don’t feel like writing tests for language features; then there are some great people who already did this for you. The Ruby Koans walk you along the path to enlightenment:
.
If you also want to get started with Ruby then I suggest that you get the following equipment:
1. Ubuntu (Wubi)
2. VIM
3. Ruby Version Manager to install..
4. Ruby
5. RSpec gem as the testing/specification framework
6. Git to get data to and from github
.
Till then, enjoy the journey \o/
Code: Abstract Unit of Work
Today I’ve been tinkering about how to best implement the
Unit of Work/Repository patterns at the client (service)-side.
Warning! This blog post contains experimental source code!
What I want:
1. Simple to use. Usage is easy to explain.
2. Doesn’t leak the underlying data access framework.
3. Supports transactions.
4. Supports multiple parallel units of work when required.
5. Manages the session/context scope for me.
Not quite sure whether I need nested UoWs.
Here is what I have come up so far. I’ll update this post once I figure out something new about all of this.
// Scoped unit of work:
// 1. Quite simple
// 2. Repositories use the currently active UoW
// 3. Doesn't support multiple UoWs to be active
// 4. Using block scopes the current session/object context
// 5. Repositories are injected using the constructor
using( UnitOfWork.Start() )
{
var user = this.userRepository.GetUserByName( "Paul" );
var skill = this.skillRepository.GetSkillByName( "Ruby" );
user.Award( skill );
}
// Scoped UoW, that also starts a new transaction:
// When the UoW is disposed it will be rolled-back
// unless it has been committed.
using( var uow = UnitOfWork.Start( transaction: true ) )
{
var user = this.userRepository.GetUserByName( "Paul" );
var skill = this.skillRepository.GetSkillByName( "Ruby" );
user.Award( skill );
uow.Commit();
}
Update:
If the current Unit of Work is marked to be unique for each thread (ThreadStaticAttribute) it can safely handle multiple ‘requests’ at the same time. No need for any >special case< handling.
Thanks to @pragmatrix for pointing this out on Twitter. :)
Twivi
Twivi is a simple visualization of the Twitter universe written
using HTML5 and Java Script! Feel free to take a look at the source code.
Twivi has been tested on Google Chrome and Mozilla Firefox 4.
It won’t work on Internet Explorer 8 or lower, sorry folks!

Animated Version:
http://tick.federrot.at/twivi/twivi-a.html
Normal Version – use this if you’ve got a slow computer:
http://tick.federrot.at/twivi/twivi.html




























leave a comment