Archive for the 'hydra' Category

Semantic Highlightning For PBDT

Semantic highlightningPBDT has now support for semantic highlightning. Thanks to the FDT guys again for answering a lot of Eclipse releated questions. Semantic highlightning works currently with parameters, input and output declarations and for defined preprocessor directives. Just have a look at the screenshot. I have also integrated complete color preferences support. If you go to Preferences > PBDT > Colors you can change everything the way you like.

PBDT with basic refactoring

PBDT RefactoringPBDT has a new feature which is basic refactoring. Simply select the variable you want to rename and press Alt+Shift+R or select “Rename” from the context menu. There are currently two issues with refactoring. If the refactoring entry in the context menu is disabled please select the variable and try again. The same for the shortcut. If you want to refactor something, just select it first in the text. Once I figure out how Eclipse handles changes of the caret position I will fix that.

The second is about scopes. If you redefine a variable in a different scope the refactoring is not correct. But I guess 99% of the developers will not get in touch with this issue.
In this example i would be refactored in the outer and inner scope which is not correct.

void evaluatePixel()
{
        int i;

        {
        	int i;
        	i;
        }

        i;

        out = sampleNearest(src,outCoord());
}

PixelBender on Linux

Here is a nice tutorial that explains how to get PixelBender to work on Linux systems. Adobe offers just a Mac and Windows version of the toolkit. But using PBDT in combination with Wine allows PixelBender to work on Linux systems. How cool is that?

I also updated the PBDT plug-in to get rid of some errors. I did not include all feature requests yet because the FFK in Cologne is currently eating up all my time.

PBDT Release

I just released my PixelBender plug-in for Eclipse. It integrates for us very charming into the workflow and is a good help when developing PixelBender kernels. I have put up a tutorial and instructions at this page.

Features of the PBDT plug-in include code completion, syntax highlightning and some other nifty features. It can be integrated into existing projects in FDT or FlexBuilder. Let me know what you think and please report any bugs or issues back to me.

A special thanks goes to Arne Deutsch from the FDT team for helping me a lot and answering all my annoying questions.

Flash And Image Processing

During the last weeks I have thought about a completly new version of the image processing library. I have done lots of scribbling about what kind of features I want to have and which would be really cool.

But there is still a big problem when it comes to dealing with image data in Flash. I have currently different strategies with their pro’s and con’s but I can not decide for myself which one makes the most sense.

  1. BitmapData

    When you are using only one BitmapData to represent an image you have of course access to all the native methods. Life will be a lot easier. But there are certain key issues with the BitmapData. The precision for each channel is limited to 8bit and the main problem is that you will always have to deal with pre-multiplied alpha. If I want to have a high-quality image processing library this is unacceptable.

  2. Vector.<uint>

    A vector filled with unsigned integers makes sense because this is what you get from a BitmapData and what you can use to set the contents of a BitmapData but working all the times with one integer value and having to do the bit-hassle is really annoying.
    The main problem with a Vector of unsigned integers is simply that PixelBender does only accept a Vector of Number values with the length of width * height * 4. So everytime you want to use PixelBender you would have to convert your vector. And also remember that you have only a precision of 8bit per channel. Instead of using a Vector.<uint> I could also use a BitmapData — the only thing I gain from the vector is that I do not have to deal with pre-multiplied alpha.

  3. Vector.<Number>

    A vector of normalized Number values makes a lot of sense. You are able to use PixelBender with this kind of Vector without having to convert anything. The only problem occurrs when you want to convert your vector into a BitmapData — but this problem can be solved pretty easy with a PixelBender identity shader. This is also what I used to convert a BitmapData into a vector of Number values since BitmapData.getVector returns only a vector of unsigned integers.

    Now all of this does not sound that bad. But there are a lot of problems actually. First of all every time you want to get/set a pixel you have to access four fields of a vector which is way slower than accessing only one field. And the main problem I have is the poor PixelBender support. First of all every time I start a ShaderJob with a vector of fixed length as the target I get an exception that the ShaderJob.start() wants to change the length of my vector. What the fuck? If my Vector has a fixed length of width * height * 4 I do not see why the ShaderJob should change this at all.

    Another problem is PixelBender itself. In order to rebuild a method like BitmapData.fillRect() you have to visit every channel for every pixel if the rectangle is the full image size. Using ActionScript for this task is out of the question because it will be way to slow. So I thought I write a fillRect-Shader. No problem. The shader works very well in the PixelBender Toolkit but I get only garbage in the Flash Player. Now I am really uncertain if I should continue with this approach since even simple tasks fail. If my target is a BitmapData it works very well by the way. So if I want to fill a rectangle with PixelBender and I have only a Vector.<Number> I have to create a BitmapData with equal size to use it as the target with the ShaderJob and then use an identity shader to convert the BitmapData back into a Vector.<Number>. And once we are using a BitmapData we have again lost the precision and we have pre-multiplied alpha. This would not be a problem if PixelBender would work with Vector.<Number> as good as with a BitmapData.

  4. Vector.<RGBA> and single-linked list

    Having a Vector.<RGBA> in combination with a single linked list is by far the best what you can get in terms of speed. We use this in our audio engine as well. You need to access every field only once and you can iterate over the single-linked list very fast. There are only two major issues. In order to use PixelBender you have to convert this structure which has the length width * height into a Vector.<Number> of the length width * height * 4 and you will have the same problems as described above. If you want to have a BitmapData representation you will have to convert the Vector manually to a BitmapData which will also cost you a lot.

My main problem is that I do not like any of those possible approaches. In the old ImageProcessing library I used a BitmapData for each channel but I would not do that again. The main problem is that Adobe has released a very buggy version of the PixelBender run-time in Flash. I would criticize also that we have so many different formats for pixel data which do not fit together. Sometimes you need a Vector.<uint>, sometimes you need a Vector.<Number> — sometimes the endian is flipped (Adobe Alchemy) and working with the BitmapData only — which sounds reasonable — is a pain because you will never get around pre-multiplied alpha. I would love to have a primitive RGBA data type for image processing which I could feed into PixelBender (color4) and which I could get and set to a BitmapData as a Vector.<RGBA>. If those RGBA elements would be also a single-linked list — even better.

PixelBender Outline View

PixelBender OutlinePixelBender Outline is a simple view for Eclipse. It allows you to browse through compiled PixelBender kernel files (pbj). Usually it is quite annoying when working with PixelBender. You always have to debug the shader if you did not write it yourself to know about parameters and stuff. The PixelBender Outline view allows you to navigate through that information in a comfortable way.

PixelBender Outline is working with FDT only. Just grab the JAR file and place it into your Eclipse plugins folder (…/Eclipse/plugins/) to install it. After restarting Eclipse you can open the view using Window->Show View->Other->PixelBender->PixelBender Outline.

The outline is updated everytime you select a *.pbj file in the Flash Explorer.

Water with Pixel Bender

Another simple example here. I think it was a little bit hard for me to understand first how to do animations with Pixel Bender based on user input.

The user input is currently only a Math.random() but I think you will get the idea. I always put the output of the shader back into it and get a nice wave effect.

FITC Toronto

FITC is approaching and I am glad to announce that I will do more than just the one session about inlining bytecode. I will also talk about Hydra again — it will be the “Chop the Hydra!” session from FITC Amsterdam. I think it is a great opportunity to share the Hydra-love on the other side of the hemisphere.

Another interesting part will be the open discussion “3D in Flash: Now and the Future” which Ralph Hauwert will moderate.

I think it will be an awesome event — hope to see you soon!

Flashforum Conference 2008

Flashforum Konferenz 2008

A new year, a new Flashforum Conference. The organizers Sascha and Marc invite you from 2nd to the 5th of June to Cologne. It is my third time at the Flashforum Conference and I think it will be a great event just like the last two years. This time the conference will be also a little bit more workshop-based with two extra days (pre and post conference) full of workshops. I will have one session about Hydra like in Amsterdam and another one about my inline bytecode compiler and optimizer. Be prepared — it will definitly rock.

FITC Amsterdam

FITC Amsterdam
I am happy to announce that I will speak at the FITC in Amsterdam. My session is titled “Chop the Hydra!” and guess what it is about?

Probably you noticed that I was working with Hydra a lot in the past. Everyone who worked with BitmapData will love Hydra and I have the honor to introduce you into the world of shaders. And even better: It is not only about Flash since Hydra filters work with AfterEffects too.