Thank you all, this feedback is really appreciated

We worked quite hard in order to make it possible, and we're really proud of the actual result, even if there is still a dozen of features we'd like to add.
Quickly, about Meia's problem: you probably tried to generate your character when the armory was down. I'll add some code later on in order to square this better and display a nice "armory waiting refresh" message instead of a naked character

So much to do. So little time. In the meantime, you can force the refresh of your signature by hitting the "taint.txt" file as stated above.
About the code itself, the fact that the code isn't really released yet has several reasons. But first, all the code used here is already tagged using various licenses, from GPL to BSD, depending on the module - the code itself is split between several modules, of course

One of our main reason, as you may have already understood, is the wide kind of usages of the engine, even though it looks like the classical wowmodelviewer. You already start to make us donation offers publically, and I can disclose that we also received some other offers privately. So I guess we will probably allow private svn access to our code for a start, so that interested people may contribute. Public access may follow right after. We are not too much suspicious about how our work may be used, but we'd just like to have a solid base before it could be abused.
The second reason is that the code is really, really wicked

Well, that's what you get when you're able to generate OpenGL jpegs on a web application. So it'd be pretty hard to build and to get a "working" version out of it, and I am really not in the mood of doing "technical support" for that part. Yet. Moreover, this is not the kind of webservice that can run on any classical hosting environment. The whole thing is a custom daemon that runs in background, and that is running a custom HTTP server being proxy-forwarded from the main apache server. So it really needs a custom server, not a simple PHP+Apache bundle with FTP access. And a lot of space and power.
Well, in order to show you what I'm talking about, I'll disclose some bits of the code that is running right now, at the end of the post.
So, in all cases, if you're willing to contribute, we may arrange an svn access for you, but be prepared to face heavy C++/Lua code

We will probably try to provide a service (free or not, that's still the question, we'll do some tests, even though we highly want to release it for free) that renders "XML/RPC" calls possible from an external website to a dedicated server. Well at least we're in the process of buying some dedicated hosting for it, then we'll see what happens

The XML format is yet to be fully designed, but I am aiming at something like this. (this is not my top priority though)
<prologue>
<character name="Foobar" realm="Archimonde" region="eu" varname="mychar1" skin="3">
<items>
<item slot="WEAPON" id="19019" sheathed="true" /> <!-- let's override the character with a Thunderfury in main hand, sheathed -->
<item slot="TABARD" sheathed="true" /> <!-- sheathing a non-weapon item will just hide it -->
</items>
</character>
</prologue>
<picture width="450" height="100">
<ortho left="0" right="1" bottom="0" top="1" near="-1" far="1" />
<code>
<!-- fill background with a deep blue gradiant -->
<![CDATA[
gl.Begin "QUADS"
gl.Color(0, 0, 0, 1)
gl.Vertex(0, 0, 0)
gl.Vertex(0, 0, 1)
gl.Color(0, 0, 1, 1)
gl.Vertex(1, 1, 0)
gl.Vertex(0, 1, 0)
gl.End()
]]>
</code>
<setcamera character="mychar1" fov="45" />
<draw character="mychar1" />
</picture>
And for your viewing pleasure, here's the pieces of codes I was talking about:
File blog-html.lua:
print "Loading blog-html.lua..."
local function DumpPage(xm, p, title)
if p.istop then p = { p } end
xm:html {
xmlns = "http://www.w3.org/1999/xhtml",
["xml:lang"] = "en",
lang = "en",
xm:head {
xm:meta {
["http-equiv"] = "Content-Type",
content = "text/html; charset=ISO-8859-1",
},
xm:meta {
name = "MSSmartTagsPreventParsing",
content = "TRUE",
},
--[[ some templates...
xm:link {
rel = "section",
href = "/blog/Section",
title = "Section Title",
},
xm:link {
rel = "archive",
href = "/blog/2000/01",
title = "January 2000",
},
xm:link {
rel = "alternate",
type = "application/rss+xml",
title = "RSS feed",
href = "/blog/rss",
},
]]--
xm:title(title),
xm:link {
rel = "stylesheet",
type = "text/css",
href = "/css/blog-style.css",
media = "screen",
},
},
xm:body {
xm:div {
id = "ppal",
xm:div {
id = "logo",
xm:h1 {
xm:comment "Placeholder for CSS logo.",
},
},
xm:div {
id = "nav",
xm:span {
class = "navelt",
xm:a {
href = "/blog/",
"Blog",
},
},
xm:span {
class = "navelt",
xm:a {
href = "/about",
"About",
},
},
xm:span {
class = "navelt",
xm:comment "Placeholder for the last navigation separator.",
},
},
xm:div {
id = "bas",
xm:div {
id = "main",
unpack(p),
},
xm:div {
id = "col",
-- widgets
xm:div {
class = "colbox",
xm:div {
class = "colboxtitle",
"Some widget",
},
xm:a {
href = "http://www.google.com/",
"Google!",
},
xm:br(),
},
xm:div {
class = "colhr",
xm:empty(),
},
xm:div {
class = "colbox",
xm:div {
class = "colboxtitle",
"Sponsors",
},
xm:a {
href = "http://validator.w3.org/check?uri=referer",
xm:img {
src = "http://www.w3.org/Icons/valid-xhtml10",
alt = "Valid XHTML 1.0 Strict",
height = "31",
width = "88",
},
},
xm:br(),
xm:a {
href = "http://jigsaw.w3.org/css-validator/",
xm:img {
style="border:0;width:88px;height:31px",
src="http://jigsaw.w3.org/css-validator/images/vcss" ,
alt="Valid CSS!",
},
},
xm:br(),
xm:a {
href = "http://www.lua.org",
xm:img {
src = "http://www.lua.org/images/powered-by-64.gif",
alt = "Powered by Lua",
height = "64",
width = "64",
},
},
xm:br(),
},
},
xm:div {
class = "spacer",
xm:raw " ",
},
},
},
},
}
return xm:render()
end
local function show_css(request, result)
result.mime_type = "text/css"
result.contents:copyfrom(Input "data/blog-style.css")
end
dcss_blog = Domain("^/css/blog-style.css$", show_css)
function blog_CreatePage()
local r
r = NewXmlMarkup()
r.doctype = '<?xml version="1.0" encoding="iso-8859-1"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
r.DumpPage = DumpPage
return r
end
print "Loaded blog-html.lua."
File about.lua: (in order to display
http://grumpycoder.net/about )
print "Loading about.lua..."
local function about(req, res)
local xm, p
xm = blog_CreatePage()
res.mime_type = "text/html"
p = xm:div {
"Please look at ",
xm:a {
href = "http://forum.grumpycoder.net/",
"our forums",
},
" for more information :) More to come soon.",
}
res.contents:write(xm:DumpPage(p, "About us"))
end
about_domains = {
Domain("^/about$", about),
}
print "Loaded about.lua."
(yes, you may think of it as "lua-on-rails" ^^)