GTween V2: What About TweenLite?

I’m sure many people will be curious what the release of GTween v2 means for my relationship with Jack and TweenLite. The short answer is “nothing”. I am continuing to work with Jack to make TweenLite (and the greensock family) better. In fact, I delayed the release of GTween v2 to ensure TweenLite v11 got all the attention it was due.

Given that, you’re probably wondering why I would release a whole new version of GTween. It all comes down to the core nature of each project.

TweenLite is a stable, well supported library with a dedicated developer and a lot of concern for minimizing painful transitions between versions. This commitment to stability makes it a great choice to use as a developer, but it makes it harder to try out radically new approaches or interfaces.

In stark contrast, GTween is an experimental library built entirely to meet my personal needs and whims at any particular moment. It is completely unsupported, and subject to periods of neglect followed by massive rewrites that involve wide ranging changes to its API. This makes it potentially difficult to work with as a developer, but it means I can use it as a sketch pad to try new ideas out, and gain feedback from the brave souls who use it.

As an example, I never intended to write GTween v2. I had planned one more minor release after beta 5 to address outstanding issues, but certainly not a rewrite. However, I was procrastinating on preparing my code optimization session, and started playing with applying some of those ideas to GTween. This sketch rapidly progressed into a whole new version over the course of a weekend. I don’t believe in letting good code rot (I’ve done enough of that in the past), so after consulting with Jack, I decided I may as well polish it up and release it.

I don’t have any current plans to make further updates to GTween. It’s finally a stable, extensible code base that I feel happy having my name attached to. However, you never know what will happen the next time I find myself procrastinating.

So, moving forwards GTween will remain my occasionally updated experiment tweening library. I invite anyone to use it and extend it, but I won’t be supporting it, and I’m not promising any updates. I will be putting more focused energy into working with Jack to improve TweenLite. Jack and I are both hoping that the things I learn from playing with GTween (and the feedback I get on it) will apply directly to making TweenLite an even better library.

On a related note, I know that Jack’s licensing is a bone of contention for some people, but it’s worth noting that this licensing is the reason he can provide support and continue to churn out awesome updates like v11. Open source projects have a habit of dying from neglect when their original author gets busy or bored (see: most libraries I’ve released over the years). Jack has found what I think is a fair compromise, making his library free for almost everyone, but charging for use when it directly makes money. Yes, this complicates things for some projects, but there are alternatives for when you just can’t make it work.

It’s also worth noting that I do not take any share of the licensing fees Jack receives. I don’t get anything out of helping guide or promote TweenLite, except the satisfaction of contributing to one of the best and most popular tween libraries available, and the enjoyment of working with Jack (who’s an all round good guy).

So please, if you play with GTween, give us some feedback. Are there features or approaches you’d like to see in TweenLite? Things you wouldn’t want? Jack and I are both listening.

GTween V2 Released!

I’m happy to announce the release of GTween v2. This version is a ground up rewrite of the library focusing on size, speed, extensibility, and improving the readability of the code.

The core library is now just 3.5kb, and it’s 2-5X faster than beta 5 was. GTween now has a simple, but reasonably robust plug-in model, and much of the secondary functionality has been moved out into plugins (ex. snapping, smartRotation, filter support). This has simplified the code a great deal, and made it much easier to understand.

This release comes with a bunch of plugins for common tweening tasks like color adjustments (saturation, hue, etc), synching timeline animations, working with color transforms, run-time calculated motion blurs. It’s also the first release to include a set of easing classes that are optimized for use with GTween.

Finally, this version includes an experimental static interface called GTweener (inspired by Joshua Granick), which provides basic override capabilities.

You can get more information, view demos and documentation, or download the latest version at gskinner.com/libraries/gtween.


What about TweenLite? If you’re curious about what this release means for my relationship with Jack Doyle and the TweenLite library, I invite you to read my blog post on that very topic.

The Great Pumpkin Showdown VI: The Squashening!

For the sixth year, the gskinner.com crew broke out the brightly colored, child-safe pumpkin tools and mutilated some innocent pumpkins.

As always, we broke into teams of two, based on seniority, ate a lot of sugar, drank a lot of beer, and tried to carve up some cool jack’o’lanterns.

The bar seems to have been raised this year, and I think we have our best set of entries to date. Likewise, I think the voting app is our best yet. According to tradition, it was built by our newest hire. He even built an AIR configuration app for the whole thing. Good work Shawn!

Continue reading →

How Can Adobe Encourage a Commercial Ecosystem?

I think most people can agree that the Flash platform suffers due to the lack of a healthy commercial component ecosystem. We have a fantastic, innovative, and highly prolific OSS culture, and even have a thriving market for small, inexpensive effects and simple components, but we lack the high-quality, well-supported, production-ready components that a commercial marketplace can provide.

This was the (perhaps poorly surfaced) core of my previous post. Adobe has not done a good job of encouraging a commercial marketplace, even often seeming to work against it.

It’s easy to complain, but a whole lot more valuable to actually contribute to a solution. With that in mind I thought it would make sense to solicit feedback on how to improve the environment for commercial libraries and components. I’ll work to consolidate the feedback, and try to funnel it to appropriate people at Adobe.

Of course, this can go beyond Adobe. Is there something that we can change as a community that would help?

So please, leave comments. This is brainstorming so toss in any ideas, comment or elaborate on other people’s ideas, and vote concepts up. Please just keep it focused, mature and respectful. Hopefully

Thoughts on Adobe Squiggly & Developer Relations

Squiggly is the new spell checking component that Adobe recently released on labs. I haven’t had a chance to test it in depth, so I’m not sure yet how it compares to our Spelling Plus Library, but I have to admit that its release frustrated me a bit.

I’m not at all worried to have competition in the space, we’ve had a good run with SPL so far, and competition is always welcome. Rather, I’m concerned about who I’m competing with.

See, one of the things that the Flash world really lacks is a strong commercial component marketplace. We have a thriving OSS culture, which is awesome, but while it is very prolific it rarely creates highly reliable, documented, and well-supported libraries. It’s a weakness of the platform, especially when you look at the hundreds or thousands of enterprise class commercial components available for languages like Java or C#.

That’s why, when Adobe spends a large amount of resources building a spelling component that directly competes with one of the few successful commercial components in the Flash world, it frustrates me. It’s not the potential impact to our revenue from SPL (which was a largely unexpected bonus of building it), competition is an expectation in this industry, and I wouldn’t be writing this post if it was a third party that built Squiggly. Rather, it’s the message it sends to other potential component developers.

Adobe could have used SPL as a customer success story to entice other developers into offering high-quality components. They could have even helped promote SPL, to actively encourage the growth of a commercial eco-system. Instead, they issued a warning to those same developers that if you build something that generates demand, they will compete with you directly (or worse yet, release a competing component for free).

I understand that there is a lot of value in Adobe providing an official spell checking solution, assuming it remains updated and well supported. However, at a minimum they could have given us advance warning of Squiggly’s release, or even had a discussion early on to see if what we had built would work for what they need. It must be close, as they are already using SPL in a number of their own projects. They need to work with their developers, not against them, if they want a strong platform long term.

[Important note: I was provided 3 weeks notice of the release. I originally thought it was only a couple of days notice, and so didn’t feel it was even worth mentioning in this post. The notice basically just informed me that Adobe might be releasing an OSS spelling library at some point in the future. In fact, I believe part of the reason that I was so far off in remembering the amount of notice I got (beyond being ridiculously busy at the time), was that it really wasn’t actionable in any way, so I basically dismissed it. It was better than nothing though, I appreciated it, and it is remiss not to have mentioned it. Sincere apologies to Christian.]

I’d like to chalk this up to pure ineptitude and cluelessness. It wouldn’t even shock me if the team that built Squiggly was completely unaware of SPL, despite that showing a lack of basic web searching ability. I’m certainly hoping it wasn’t a case of Adobe seeing something that worked, that filled a need, and that demonstrated demand, and saying “hey, we should do that too”. Either way, it demonstrates a lack of understanding of developer relations, and how to foster a healthy component ecosystem. This is also something that Adobe / Macromedia has a history of doing, so its not like this is a first offense.

Note that the above doesn’t apply to all of Adobe. There are people who get it, and I thank them for bringing this issue up internally. Unfortunately, I think Adobe needs to embrace a corporate culture of supporting their developers both technically and from a business perspective, not just among their evangelists, but also with their product and executive teams. If we’re successful, Flash (and by extension Adobe) will be successful.

What do you think?

Do you have an idea for encouraging a healthy ecosystem for commercial components? Share it here.

FitC Edmonton: All-Star Speakers, $99

Just a quick reminder to everyone: FitC is coming to Edmonton in under 3 weeks (Oct 17-18). I think it’s going to be the best Flash / interactive conference Western Canada has ever seen. We have an all-star speaker list, including:

    Lee Brimelow

    Mike Chambers

    Ralph Hauwert

    Mario Klingemann

    Erik Natzke

    Stacey Mulcahy

    James Paterson

    Chuck Freedman

    Grant Skinner (moi)

    Phil Chung

    Randy Troppmann

    Victor Rubba

    Erik Johnson

It should be a fantastic event, and it’s only $49 for students, $129 regular ($99 with discount code “backintime”). Even if you’re flying in, the cost of the flight, hotel and admission is less than the cost of registering for most conferences.

You can get more info, and register at:

http://www.fitc.ca/events/speakers/?event=99

Hope to see you there!

MLB.com onBase Project in Times Square

We recently had the pleasure of building the MLB.com OnBase AIR application, which lets you keep track of everything that’s going on with your favourite MLB teams and players via Twitter, official notifications, and game updates. Working with MLB on the project was very cool by itself, but as a cherry on top it is now being advertised in Times Square. It’s pretty sweet to see your work 50 feet tall in Times Square – it’s a little like being a super nerdy and completely unknown broadway star.

I’m very proud of all the awesome work my team did on this one. Consolidating all of the data feeds necessary to power this app in an effective and efficient manner was quite a challenge, and they did a great job of making it happen.

You can get more info on MLB.com OnBase at mlb.com/onbase.

Here’s a picture of the digital billboard in Times Square:

cacheAsBitmapOptions

I just filed a feature request for Flash player, asking for a cacheAsBitmapOptions property on display objects. The intent behind this is to make the current cacheAsBitmap functionality more useful. Currently, when you use cacheAsBitmap, the cache is redrawn any time you modify the transform the display object in any way other than translation (moving it in x/y). For example, if you rotate, alpha, or scale your display object it forces the cache to redraw.
It’s often useful to maintain a cache through other transformations, such as rotation, changes to alpha, and scaling. I frequently implement this functionality manually by drawing the display object to a BitmapData, and swapping the Bitmap for the original Sprite. This works, but it’s very clumsy, and requires a lot of manual management.
In conjunction with this, it would be useful to specify the resolution that the bitmap cache is created at, as a scale multiplier of the DO on stage.
The cacheAsBitmapOptions feature I am proposing would let you programmatically specify what transformations would result in a cache redraw. For example:

import flash.display.CacheAsBitmapOptions; // name based on NetStreamPlayOptions
var myOpts:CacheAsBitmapOptions = new CacheAsBitmapOptions();
myOpts.updateOnRotation = false;
myOpts.updateOnAlpha = false;
myOpts.updateOnScale = false;
myOpts.cacheScale = 2;
characterSprite.cacheAsBitmapOptions = myOpts; // passing null would revert to defaults.
otherSprite.cacheAsBitmapOptions = new CacheAsBitmapOptions(2, false, false, false);

If you think this functionality would be useful for your projects, feel free to vote it up. The bug is filed in the Flash Player bugbase as bug #FP-2524.
On Monday I will post a blog entry walking through how to implement this type of functionality manually, with a handy helper class.