July 2010

Warning! Some information on this page is older than 3 years now. I keep it for reference, but it probably doesn't reflect my current knowledge and beliefs.

22:45
Mon
26
Jul 2010

A Random Thought on Over-Generalizing

I don't post next part of the description of my reflection system yet. Instead I just want to share a small thought that came to my mind today. It's about over-generalizing, over-engineering, writing overly-abstract code or however you call it. Using too much OOP is not only the matter of code perfomance, but something deeper, more ideological. Interesting blog entries about this topic are: 5 Stages of Programmer Incompetence (see "The Abstraction Freak" paragraph) and Criminal Overengineering @ yield thought, Smartness overload and Smartness overload - addendum @ mischief.mayhem.soap. A Counterpoint can be found at cbloom rants. And finally here is my idea:

It is a vicious circle. Here is how it works:

But I believe this is true only to some degree. We obviously need a general, universal code sometimes not to do the same, monotonous or error-prone work over and over again. That's why we create and use libraries. And that's why I've coded my reflection system :)

New: I can see similar vicious cycle in a programming language development, inspired by an article I've read today: Google engineer calls Java and C++ too complicated. For me it looks like this: software engineers, companies and committees develop very sophisticated programming languages because they want them to be as much general and universal as possible so developers don't have to learn and use many specialized languages for different purposes. Developers don't like to learn many new programming languages because they have bad experience from learning and using such universal, spohisticated languages.

Comments (3) | Tags: software engineering philosophy | Author: Adam Sawicki | Share

09:46
Sun
25
Jul 2010

Reflection in RegEngine - Part 2

In the Part 1 I've shown the basics of my reflection system - classes that describe a class, property and enum. Now the question arises about how do I actually create these objects? Where do I get the information about the classes and properties in my code from? There are many possibilities which I considered:

[*] The simplest one would be to explicitly build these data structures by hand - white some initialization code that would do new Class(...);, new FloatProperty(...) and so on. Oviously this is also the most inconvenient way.

[*] Objects describing classes and properties could be automatically generated by code created by some smart usage of C++ macros and templates. I mean declaring classes and their field using something like DECLARE_CLASS(MyClass, ParentClass) and DECLARE_PROPERTY(Prop1, float), either instead or next to the real class and member declarations. This might be a good idea.

[*] Finally, a separate file with either description of classes and properties in some format or a direct C++ code for building it could be generated from some input data. These input data could be extracted from:

I've decided to create class- and property-describing objects by hand in C++ code but on top of that I've coded an optional tool that takes description file in a special language and automtically generates such code. The code written by hand looks like this:

// Header file

class ComplexItemObject : public ItemObject
{
public:
    static void RegisterClass_();
    static Class * GetClass() { return m_Class; }
    virtual Class * Object_GetClass() { return m_Class; }
private:
    static Class *m_Class;
    wstring m_Name;
    bool m_B1;
    common::COLORF m_Colorf;
    ...
};

// CPP file

Class * ComplexItemObject::m_Class;

void ComplexItemObject::RegisterClass_()
{
    m_Class = new Class(L"ComplexItemObject", ItemObject::GetClass(), &CreateFunc, &CloneFunc);
    m_Class->SetLabel(L"Complex Item Object");

    StlStringProperty *prop1 = new StlStringProperty();
    prop1->Init(L"Name", 0);
    m_Class->AddProperty(prop1);

    BoolProperty *prop2 = new BoolProperty();
    prop2->Init(L"B1", 1);
    m_Class->AddProperty(prop2);

    FloatVectorProperty *prop3 = new FloatVectorProperty(3, VectorProperty::SEMANTICS_COLOR);
    prop3->Init(L"Colorf", 2);
    m_Class->AddProperty(prop3);

    g_Reflection->AddClass(m_Class);
}

Similar code can be automatically generated by my console tool called ReflectionAuto from a .reflect file. The file format is a description language based on my Tokenizer. ReflectionAuto takes in as input and outputs a separate C++ file that adds this boring reflection initialization code to the described classes. The description of the class shown above looks like:

class ComplexItemObject {
    extends ItemObject;
    label "Complex Item Object";
    property string Name { access m_Name; };
    property bool B1 { access m_B1; };
    property int4(color) Colori { access m_Colori; };
};

That covers the basics (not everything I actually have) when it comes to building description of the classes and properties from my code to make the reflection system aware of them. In the next part I'll show how do I access real objects from my reflection system, including reading and writing properties, as well as creating and manipulation whole objects.

Comments (4) | Tags: c++ RegEngine engine | Author: Adam Sawicki | Share

12:28
Sat
24
Jul 2010

Reflection in RegEngine - Part 1

Do you remember my old entry about RegEngine? I didn't drop this project. I slowly code it and recently I've finished a reflection system, which I want to show you now.

Generally speaking, reflection is the ability of a code to be aware of itself - especially about its classes and fields. Many high level programming languages and especially sripting languages already have extensive built-in reflection system. In C++ it's not the case because source code is compiled to machine code and all information about classes and fields is lost (except simple RTTI).

Why do we need reflection anyway? When coding a game engine, we deal with many different kinds of objects (like texture, mesh, monster or terrain) and each class have its own set of properties of different types (like int, float, bool, string, vector or color). But we, as game developers, are not willing to code dialog windows for editing these properties or code serialization to/from file for each of these classes. So the idea is to make the code aware of existance of different classes, different property types and on top of that enable automatic exposing all objects to the editor (via so called Property Grid control), as well as serialization to/from a file - all in consistent manner, coded only once.

I've seen many reflection systems and designing my own was a hard process because I had to make some difficult decisions. The way I did it is a matter of some compromise - my solution is not the most general, efficient, powerful and "ultimate" one possible. My reflection system can be seen as consisting of three layers:

1. Bottom layer is the collection of objects describing classes - their names, inheritance and the list of properties, where each property has an identifier, name, type and optionally additional attributes dependand on this type.

2. On top of that there is a code that keeps track of all reflection-compatible objects that currently exist in the system, allows creating, destroying and manipulating them, as we all reading and writing values of class properties in a particular object.

3. Finally, much real functionality can be accomplished using these two previous layers. One of them is serialization - loading and saving single or all objects to/from a file in some file format, either text or binary. Another important thing is exposing all these functions (manipulating objects and their properties) for the user via the editor. There are more possibiblities I could use in the future, like:

When looking for inspiration and exploring possible solutions about how a reflection system can look like, it's worth looking at how it's made in:

Now I want to show some code, at least parts of header files. It all starts in my system from a single global object of type Reflection, which owns the collection of objects describing all classes and enums registered in the system. This collection is built at program startup and the g_Reflection objects allows finding them by name in runtime.

Read full entry > | Comments (1) | Tags: engine RegEngine c++ | Author: Adam Sawicki | Share

20:40
Tue
20
Jul 2010

Zjazd Twórców Gier 2010 - Coverage

The rest of this entry is in Polish. It describes my impression from Zjazd Twórców Gier 2010 - a game developers conference that took place on July 15-19, 2010 in Gdańsk, Poland. Zobacz też: wątek na temat zjazdu na forum.gamedev.pl, moja galeria zdjęć z ZTG 2010.

Zaczynając od podsumowania, zjazd oceniam pozytywnie. Był dla mnie przeżyciem bardzo miłym i inspirującym, po którym miałbym wielką ochotę zająć się pisaniem niezależnej gry albo dema scenowego. Szkoda, że po takich imprezach tym bardziej przykry jest powrót do szarej codzienności...

Środek lata jako czas na zorganizowanie konferencji w mieści nad morzem to wg mnie pomysł nadzwyczaj dobry - mimo doskwierających upałów. My pojechaliśmy już w czwartek w południe, a wracaliśmy dopiero w poniedziałek, więc spędziliśmy w Gdańsku maksymalnie dużo czasu. Zastanawialiśmy się, czy w wolnej chwili wybrać się do centrum Gdańska, czy na plażę. Ostatecznie wybraliśmy plażę. Co robiliśmy wieczorami? Przy takiej liczbie uczestników siłą rzeczy niemożliwe było pomieścić się gdzieś i bawić razem, więc podzieliliśmy się na grupki i każda udała się w inne miejsce, czy to w okolicę w poszukiwanie lokalu z jedzeniem albo sklepu z alkoholami, czy też gdzieś w pokoju w akademiku, pod akademikiem czy w pobliskim klubie.

Na temat samego zjazdu dowiedziałem się, że Fanotherpg, Gnysek i inni organizatorzy - wywodzący się ze środowiska middleware - postanowili - nie bez kłopotów - zorganizować wydarzenie właśnie takie - łączące różne środowiska zainteresowane tworzeniem gier w Polsce. Widać było i sami nieraz to podkreślali, że w trosce mają rozwój polskiego gamedevu - w sensie wszelkich twórców gier. Sama impreza ZTG odbyła się po raz trzeci, ale teraz już wiem, dlaczego dopiero w tym roku dowiedziałem się o jej istnieniu: po raz pierwszy odbyła się właśnie w tej formule. Za duży plus uważam, że organizatorom udało się nagłośnić temat konferencji i zachęcić do przyjazdu tak wielu uczestników z tak różnorodnych środowisk.

Od pewnego czasu zastanawiałem się, czy w Polsce istnieją ludzie, środowiska, portale czy wydarzenia w klimatach "indie games" - tworzenia gier niezależnych. Warsztat nie do końca jest czymś takim. Tym bardziej cieszy mnie, że ZTG okazało się być w dużej mierze zorientowane w swojej wymowie właśnie w tym kierunku. Na prelekcjach niejednokrotnie mowa była o tym, że warto tworzyć gry które będą zarabiały pieniądze, zamiast pozostawać amatorem, ale z drugiej strony pojawiała się niechęć do pracy w przemyśle gier przy tytułach AAA i współpracy z wielkimi korporacjami-wydawcami.

Moim zdaniem największy plus zjazdu to integracja różnych środowisk. To równocześnie największa różnica względem konferencji IGK w Siedlcach, której uczestnikami są głównie programiści z Warsztatu. Tutaj ze względu na tą różnorodność siłą rzeczy nie wszystkie prelekcje były dla każdego interesujące, ale za bardzo wartościowe uważam, że ludzie z różnych społeczności mogli się wzajemnie poznać w kuluarach, jak również przedstawić pewne informacje w ramach wykładów.

Spośród tych, których najlepiej zapamiętałem, byli choćby użytkownicy middleware, którzy z resztą ten zlot zorganizowali. Właśnie tam dowiedziałem się, że to jest przebogate środowisko, które samo w sobie jest podzielone na frakcje skupione wokół ulubionego programu - czy to jest Game Maker, RPG Maker czy Multimedia Fusion. Dowiedziałem się też, że sławne "clicki" to nazwa tylko jednej z tych frakcji, a całe ich środowisko poprawniej jest nazywać użytkownikami "middleware".

W pamięć zapadli mi też przedstawiciele sceny pixel art. Ciekawe było poznać zasady, jakimi rządzi się to środowisko. To jak widzę też jest całe community, które ma swoją stronę WWW i swoje zwyczaje. Na zjeździe nie zabrakło także demosceny. Po zeszłorocznym Riverwash mogliśmy się znów spotkać. Byli tam i razem się bawili miłośnicy różnych retro-platform, jak Amiga czy Atari. Naprzeciwko nas w akademiku zakwaterowali się jacyś nieznani nam osobnicy, którzy już na pierwszy rzut oka wyróżniali się tym, że były pośród nich dziewczyny. Wieczorami grali w sesje RPG. Wreszcie, licznie reprezentowani byliśmy także i my, czyli Warsztat. Dzięki Zielonemu, MrKaktusowi i kilku innym osobom ci spośród nas zainteresowani czystą technologią i programowaniem także znaleźli pasujące do naszych zainteresowań wykłady.

Wydarzenie miało też swoje minusy, za które już zdążyło się wirtualnie oberwać organizatorom. Chyba największym z nich była agenda, a dokładnie nie trzymanie się jej. Rozumiem obsuwę rzędu pół godziny, kiedy ktoś przedłużył swój odczyt, ale im dalej w czasie ZTG, tym mniej wspólnego miała zaplanowana wcześniej agenda (swoją drogą, szkoda że tuż przed samym wydarzeniem) z rzeczywistością. Do tego stopnia, że już drugiego dnia organizatorzy wydrukowali i wywiesili nową agendę z zupełnie poprzestawianymi wykładami. Rozumiem jednak, że tu zawinili przede wszystkim prelegenci (w tym głównie przedstawiciele firm), którzy choć obiecali, to w ostatniej chwili się wycofali i nie przyjechali.

Na minus zaliczam też panel dyskusyjny "Teraz polska". Był wg mnie zdecydowanie nieudany, co z resztą było widać, kiedy wiele osób w jego trakcie nie wytrzymało i sobie poszło. Taka dyskusja na kontrowersyjne tematy, w trakcie której każdy odważny wykrzykuje oklepane hasła do znalezienia na pierwszym lepszym forum w Internecie, moim zdaniem do niczego nie prowadzi. Pokazywanie filmików z YouTube to też kiepski pomysł. Choćby były nie wiem jak śmieszne, to takie oglądanie każdy sobie uprawia w domu przed swoim komputerem, a robienie tego na konferencji niezbyt wypada. Te trailery z "Indie Game: The Movie" również pozostawiły niesmak u wielu osób, o ile mi wiadomo. Zamiast takiego panelu lepiej może byłoby zorganizować na przykład:

Minusem był też brak Internetu w akademiku, w którym nas zakwaterowano. Mnie nie był niezbędny, ale na pewno nieraz by się przydał podczas naszych rozmów i zabaw z włączonymi laptopami. Jeden z nas pilnie musiał coś załatwić i w tym celu wybraliśmy się szukać kawiarni z bezprzewodowym dostępem do Sieci.

Przez cały czas zjazdu odbywały się dwie równoległe sesje. Przed zjazdem podchodziłem do tego pomysłu sceptycznie. Mówiłem że lepiej byłoby zaakceptować mniej prelekcji wybierając tylko te lepsze. Teraz jednak myślę, że taka forma się sprawdziła. Tematyka zjazdu była tak różnorodna, że dzięki temu mogliśmy w każdej chwili wybrać to, co nas bardziej interesuje. Ja na przykład stawiałem na wykłady bardziej techniczne. Pośród tych, na których byłem, warto wspomnieć:

Comments (0) | Tags: events | Author: Adam Sawicki | Share

23:39
Mon
19
Jul 2010

Zjazd Twórców Gier 2010 - Photos

Today I went back from Zjazd Twórców Gier 2010 - a game developers conference that took place in Gdańsk, Poland. Until now I've just managed to review, select and upload my photos from the event:

sawickiap / ZTG 2010 @ Picasa Web

I'll write more about it tomorrow. Here is a forum thread about the conference [PL].

Comments (0) | Tags: events gallery | Author: Adam Sawicki | Share

23:24
Wed
14
Jul 2010

Music Analysis - Spectrogram

I've started learning about sound analysis. I have some deficiencies in education when it comes to digital signal processing (greetings for the professor who taught this subject at our university ;) but Wikipedia comes to the rescue. As a starting point, here is a spectrogram I've made from one of my recent favourite songs: Sarge Devant feat. Emma Hewitt - Take Me With You.

Now I'm going to exaplain in details how I've done this by showing some C++ code. First I had to figure out how to decode an MP3, OGG or other compressed sound format. FMOD is my favourite sound library and I knew it can play many file formats. It took me some time though to find functions for fast decoding uncompressed PCM data from a song without actually playing it for all 3 minutes. I've found on the FMOD forum that Sound::seekData and Sound::readData can do the job. Finally I've finished with this code (all code shown here is stripped from error checking which I actually do everywhere):

Read full entry > | Comments (9) | Tags: math libraries music rendering dsp algorithms | Author: Adam Sawicki | Share

20:59
Mon
05
Jul 2010

Color Names in .NET - CheatSheet

Some color values used in computer science have their names, like "Red" (#FF0000) or "Navy" (#000080). You probably know them if you've written anything in HTML. But there are more of them than just several most popular ones, made of values 0x00, 0x80 and 0xFF. I've prepared (or rather, to be honest, copied from MSDN Library) a table of color names available in .NET standard library, as static variables in System.Drawing.Color, System.Drawing.Pens and System.Drawing.Brushes classes. Here is my "Color Names in .NET" CheatSheet:

Color_Names_in_DotNet.pdf
Color_Names_in_DotNet.odt

Comments (2) | Tags: rendering graphics .net | Author: Adam Sawicki | Share

11:51
Sat
03
Jul 2010

Tiny Planet

Tiny Planet is an interesting effect to be made from a photo or drawing. I saw it for the first time at Wojciech Toman's devlog. Here are some tiny planets made by me recently:

Warsaw - Chomiczówka:

My house:

To make a tiny planet, you have to first take a 360 degrees panorama photo of some landscape. For stiching photos into single panoramic one I recommend free application from Microsoft Research called Microsoft Image Composite Editor (ICE). Of course there are many others availble. Then the process involves some manual graphics work and/or smart usage of some filters, where the crucial one is converting image to polar coordinates. In GIMP you can find the appropriate menu command in Filters / Distorts / Polar Coordinates.

The biggest question when making such images appears to be how to fill the inside and the outside of the circle forming surface of the planet. Do you have any ideas better than the ones I used here?

Comments (6) | Tags: gallery graphics | Author: Adam Sawicki | Share

21:38
Thu
01
Jul 2010

Deeper Look Inside Windows

Typically Linux users spend much time dealing with details of their system while Windows users blame all errors on bad Microsoft and Bill Gates, especially nowadays as for more and more people computer usage shrinks only to a web browser. But sometimes it's nice and useful to look into the system, deeper than to the list of files on disk or installed programs in Control Panel / Add or remove programs. Here are some Windows applications that may help with that (use Google to find them by name):

Starting with tools that ship with Windows itself, we have:

More information about the system can be revealed with free programs, like:

Do you know any other tools like these or other types of system information that are worth seeing?

Comments (1) | Tags: windows | Author: Adam Sawicki | Share

STAT NO AD [Stat] [Admin] [STAT NO AD] [pub] [Mirror] Copyright © 2004-2014 Adam Sawicki
Copyright © 2004-2014 Adam Sawicki