Why doesn’t Imprudence have multilayers, inventory links, or mesh rendering?
Other viewers have them, so why don’t we? Why would a developer purposefully avoid such useful features–ones that users clearly want?
The answer is something of a mixed bag, and to get into it I’ll first have to explain a little bit about licensing and how licensing works. If you already know this stuff, please bear with me as I’ll get to my point soon.
As many of you know, Imprudence is licensed under the GPLv2+FLOSS Exceptions. The GPL is basically a software license that allows for free and open code. It’s because of this that we can easily share our code and incorporate others’ code in turn. Even so, the GPL doesn’t allow us to do whatever we want. There are certain restrictions, such as:
- You cannot change the license of any line of code unless you are the original author, you hold copyright on that code, or the license permits it. When we get a patch submission, the author must license their code in a compatible fashion.
- You may not distribute works based on GPL code that violate any part of the GPL itself. Doing so leaves you open to legal action.
So, how does that impact us, exactly? Imprudence is opensource. Second Life is opensource. Why can’t they work together? Here’s where the restrictions of the GPL come in: a bit over a year ago, Linden Lab decided to change the license for the Second Life viewer from GPL+Exceptions to LGPL–a similar-sounding but ultimately different license. While the LGPL is compatible with the old license, there’s no way to go from LGPL to GPL+Exceptions. This put a massive hurdle in our way as far as porting features from the Second Life.
For example, say someone submits a viewer 2/3-based patch to Imprudence.
While the GPL and LGPL are considered compatible licenses, we don’t own the copyright on the LGPL code submitted to us. Thus, we cannot change the license of that source to include exceptions. Whatever code was licensed as LGPL must stay LGPL (or equivalent) and that distinction must always be made clear wherever that code is used.
This might not sound like much of a hurdle (and at times it isn’t–we switched over to the LGPL version of our Quicktime plugin ages ago) but consider the Inventory Links patch that’s currently in most other viewers. It contains ~43K lines of code, and is made up of an unknown mix of GPL+Exceptions viewer 1 code and LGPL viewer 2 code. The two licenses are not made distinct, so the patch is clearly a violation. There’s no way we could legally use it as is.
However, if we could figure out which lines are compatible with Viewer 1 and which ones are compatible with Viewer 2, we could add the appropriate licensing and include the patch. Needless to say, this has felt like a daunting task to us, especially when we’ve been more focused on bug fixes and finalizing 1.4.0 (if you’re using 1.4 and aren’t on beta 2, I strongly recommend upgrading) as far as Imprudence goes. But, these are features you guys need. We want to include them.
My plan is to start looking at these patches one by one and sorting out which lines we can use and which lines need refactoring. As I mentioned in a comment on the beta 2 post, any volunteers who can help us with this process are welcome. Codie and I will be starting on this later tonight, and we’ll see how far we get. If you’d like to join us, please email me at mccabe@kokuaviewer.org and I’ll tell you what you can do.
You might find yourself asking, why go through so much effort for something like a little licensing issue? Why be so concerned when the author of the patch didn’t seem to be?
Our answer has always been–almost from the project’s inception–that while sometimes doing things the right way isn’t easy, these concerns are important to us. It’s thanks to licenses like the GPL, as well as the rules that accompany them, that opensource software has matured to the level it has today. Free and open software gave us the ability to start Imprudence (and later Kokua). We feel an obligation to respect that.
Anyway, I hope this clarifies for people where we’re coming from, and why we’ve done some of the things we have.
EDIT: I’ve updated this post a bit to try to make things clearer.