Sunday, November 22, 2015

Generated code

When two months ago I created generator for RTTI code I didn't realize how this one script will change so much in my programming style.

Right now I have already four of generators in my code base:
  1. RTTI - Generate part of my RTTI code.
  2. SID - Generate CStringID with already calculated hash
  3. Pimpl - Generate interface class.
  4. Enum - Generate toStringID, fromStringID functions.
So what changed for me after writing this one generator that make difference ? I try not to do monkey job. To show you how this improve my workflow let's look on generator I wrote today: Generator of Enumerator functions: toStringID, fromStringID.

This is simple problem where for some enumerators we want to have conversion from value to some verbose type. Some people may claim that this is not issue. You write functions once and they work. Later you just need to modify them when you do some changes in enum. This take like about half minute work 

... if we don't do mistake there. Then this is one extra compilation time. In some code base this can be counted in minutes. I would really love to see how much time of our programmers life we spending of stuff like that :) 

In my case I just have one macro: WR_ENUMGEN(EnumType, InvalidValue). Which look like this:
#   define WR_ENUMGEN(E, D)    \
        const CStringID&        toStringID(E a_value);                   \
        E                       fromStringID(const CStringIDa_value);
And is used like this:
    namespace EConstantsBuffers
    {
        enum Enum
        {
            CBPerFrame,
            CBPerView,
            Count,
        };
 
        typedef Enum Type;
 
        WR_ENUMGEN(TypeCount);
    };
The rest is generated :] So on top of this one line I just need to generate projects and that's all. No extra programmer steps to do. Thanks to that:

  • Adding/modifying of enumerators is simple
  • Generate code is easy to debug (what may be tricky with some macros).
  • Not slowing down my compilation. 
  • There is almost no place for any mistake  (always in sync with enum) .
  • There is unified code convention between enums.
  • Expanding of functionality need only modification of macro and/or generator.
So I don't know about you but personally with time I will probably use more and more generated code. I don't have a lot of spare time for monkey job I prefers to leave it for computers.

Greg

Thursday, November 12, 2015

Tools Design

Variable Set Editor - Main view
Continuation of previous post :] this time with real examples :D

Real tools design 

This may look like joke but this one window took me ~3 days to do. This include all it's features and communication:

Editor <-> Engine.

But this is reality. Creating good tools require time and I wasn't joking in Summary from previous post:
"As you can see creating of good tools is not easy. You often need go back and forth to create something really useful. You don't want to modify everything by scripts in which you can make easily mistake. Good tool will for sure save you a lot of work and return effort that you spend on it." 

Tuesday, November 10, 2015

Few words about tools design

Once again I will return to topic of tools. Mostly because right now this is the part of code I spend most of my time in. 

I will focus in this post on one dialog: Variables Set Editor This one dialog may sound simple but if you start thinking more about it it's really complex tool. 

So let's start with short description what Variables Sets are then lets move what we want achieve and in the end look on real implementation of this problem.

Variables Set

This is really simple system which allow you to specify some kind of properties. Right now I support only values of types: 

  • StringID
  • Float
  • Vec4.
Whole system may be use to store values like: life, attacks parameters, movement speed etc. In my case to this data have also access animation system which may request some kind of information which later may be use to control blends and generally its behavior.


Because this is simple list of variables you want to be able to have some kind of hierarchy. i.e:
NPC object contain [local set] which inherit values from [Clones set] which inherit values from [enemies set]. Change in inherited variables will be apply to all not override values. 

Dialog requirement

Short: You should be edit this stuff in nice UI.

Implementation 

Firs approach
Thanks to Qt designer this was really easy. As you can see on right everything look really nice you have section for name, you see right away type of variable are able to modify value and see what value you inherit :] If you want to add variable you using context menu (under Right Mouse Button). 

Of course this wouldn't be so easy if I ended here:P I forgot my dependencies list so I done small upgrade and finished :] Final result bellow:

Final dialog

Summary

As you can see creating of good tools is not easy. You often need go back and forth to create something really useful. You don't want to modify everything by scripts in which you can make easily mistake. Good tool will for sure save you a lot of work and return effort that you spend on it. And the tool you seen on screenshots are for sure not good one.