From 2873157e9798a57b1a46754ce02933af4ac9fe80 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 4 Dec 2014 22:27:07 -0600 Subject: [PATCH 01/50] Add 3d render support --- .buildpacks | 2 + app.js | 15 +++-- modules/config.example.js | 8 ++- modules/config.js | 21 ++++++ modules/renders.js | 133 ++++++++++++++++++++++++++++++++++++++ package.json | 1 + routes/renders.js | 109 +++++++++++++++++++++++++++++++ 7 files changed, 279 insertions(+), 10 deletions(-) create mode 100644 .buildpacks create mode 100644 modules/config.js create mode 100644 modules/renders.js create mode 100644 routes/renders.js diff --git a/.buildpacks b/.buildpacks new file mode 100644 index 0000000..516e38b --- /dev/null +++ b/.buildpacks @@ -0,0 +1,2 @@ +https://github.com/mojodna/heroku-buildpack-cairo.git +https://github.com/heroku/heroku-buildpack-nodejs.git \ No newline at end of file diff --git a/app.js b/app.js index ad3b38e..7058de0 100644 --- a/app.js +++ b/app.js @@ -4,9 +4,10 @@ var logger = require("morgan"); var cookieParser = require("cookie-parser"); var bodyParser = require("body-parser"); -var routes = require("./routes/index"); -var avatars = require("./routes/avatars"); -var skins = require("./routes/skins") +var routes = require('./routes/index'); +var avatars = require('./routes/avatars'); +var skins = require('./routes/skins'); +var renders = require('./routes/renders'); var app = express(); @@ -20,10 +21,10 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, "public"))); -app.use("/", routes); -app.use("/avatars", avatars); -app.use("/skins", skins) - +app.use('/', routes); +app.use('/avatars', avatars); +app.use('/skins', skins); +app.use('/renders', renders); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/modules/config.example.js b/modules/config.example.js index 3bd43c0..37a8a56 100644 --- a/modules/config.example.js +++ b/modules/config.example.js @@ -8,9 +8,11 @@ var config = { cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning cleaning_amount: 50000, // amount of avatar (and their helm) files to clean http_timeout: 1000, // ms until connection to mojang is dropped - faces_dir: "skins/faces/", // directory where faces are kept. should have trailing "/" - helms_dir: "skins/helms/", // directory where helms are kept. should have trailing "/" - debug_enabled: false // enables logging.debug + faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' + helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + debug_enabled: false, // enables logging.debug + default_scale: 6, // the scale of rendered avatars + maximum_sale: 10 // the maximum scale of rendered avatars }; module.exports = config; \ No newline at end of file diff --git a/modules/config.js b/modules/config.js new file mode 100644 index 0000000..037a01d --- /dev/null +++ b/modules/config.js @@ -0,0 +1,21 @@ +var config = { + min_size: 1, // for avatars + max_size: 512, // for avatars; too big values might lead to slow response time or DoS + default_size: 160, // for avatars; size to be used when no size given + local_cache_time: 1200, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response + browser_cache_time: 3600, // seconds until browser will request image again + cleaning_interval: 3, // seconds interval: deleting images if disk size at limit + cleaning_limit: 900000000000, // minumum required available KB on disk to trigger cleaning + cleaning_amount: 50000, // amount of avatar (and their helm) files to clean + http_timeout: 1000, // ms until connection to mojang is dropped + faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' + helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' + renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' + debug_enabled: true, // enables logging.debug + min_scale: 1, // for renders + max_scale: 100, // for renders; too big values might lead to slow response time or DoS + default_scale: 6, // for renders; scale to be used when no scale given +}; + +module.exports = config; \ No newline at end of file diff --git a/modules/renders.js b/modules/renders.js new file mode 100644 index 0000000..2a54af5 --- /dev/null +++ b/modules/renders.js @@ -0,0 +1,133 @@ +// Skin locations are based on the work of Confuser +// https://github.com/confuser/serverless-mc-skin-viewer +// Permission to use & distribute https://github.com/confuser/serverless-mc-skin-viewer/blob/master/LICENSE + +var helpers = require('./helpers'); + +var exp = {}; + +var Canvas = require('canvas'); +var Image = Canvas.Image; + +exp.draw_helmet = function(skin_canvas, model_ctx, scale) { + //Helmet - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + //Helmet - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + //Helmet - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); +} + +exp.draw_head = function(skin_canvas, model_ctx, scale) { + //Head - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + //Head - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + //Head - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); +} + +exp.draw_body = function(skin_canvas, model_ctx, scale) { + //Left Leg + //Left Leg - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale); + + //Right Leg + //Right Leg - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 0*scale, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale); + //Right Leg - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale); + + //Arm Left + //Arm Left - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); + //Arm Left - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); + + //Body + //Body - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); + + //Arm Right + //Arm Right - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 40*scale, 20*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale); + //Arm Right - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale); + //Arm Right - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); +} + +exp.draw_model = function(uuid, scale, helm, body, callback) { + helpers.get_skin(uuid, function(err, hash, img) { + var image = new Image; + var width = 64 * scale; + var height = 64 * scale; + var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); + var skin_canvas = new Canvas(width, height); + var model_ctx = model_canvas.getContext('2d'); + var skin_ctx = skin_canvas.getContext('2d'); + + image.onerror = function(err) { + console.log("render error: " + err); + callback(err, 2, null, hash); + }; + + image.onload = function() { + skin_ctx.drawImage(image,0,0,64,64,0,0,64,64); + //Scale it + scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); + if (body) { + console.log("drawing body"); + exp.draw_body(skin_canvas, model_ctx, scale); + } + console.log("drawing head"); + exp.draw_head(skin_canvas, model_ctx, scale); + if (helm) { + console.log("drawing helmet"); + exp.draw_helmet(skin_canvas, model_ctx, scale); + } + + model_canvas.toBuffer(function(err, buf){ + callback(err, 2, buf, hash); + }); + }; + + image.src = img; + }); +} + +function scale_image(imageData, context, d_x, d_y, scale) { + var width = imageData.width; + var height = imageData.height; + context.clearRect(0,0,width,height); //Clear the spot where it originated from + for(y=0; y config.maximum_scale) { + // Preventing from OOM crashes. + res.status(422).send("422 Invalid Size"); + } else if (!helpers.uuid_valid(uuid)) { + res.status(422).send("422 Invalid UUID"); + return; + } + + // strip dashes + uuid = uuid.replace(/-/g, ""); + + try { + renders.draw_model(uuid, scale, helm, body, function(err, status, image, hash) { + logging.log(uuid + " - " + human_status[status]); + if (err) { + logging.error(err); + } + etag = hash && hash.substr(0, 32) || "none"; + var matches = req.get("If-None-Match") == '"' + etag + '"'; + if (image) { + var http_status = 200; + if (matches) { + http_status = 304; + } else if (err) { + http_status = 503; + } + logging.log("matches: " + matches); + logging.log("Etag: " + req.get("If-None-Match")); + logging.log("status: " + http_status); + sendimage(http_status, status, image); + } else { + //handle_default(404, status); + } + }); + } catch(e) { + logging.error("Error!"); + logging.error(e); + //handle_default(500, status); + } + + function handle_default(http_status, img_status) { + if (def && def != "steve" && def != "alex") { + res.writeHead(301, { + 'Cache-Control': 'max-age=' + config.browser_cache_time + ', public', + 'Response-Time': new Date() - start, + 'X-Storage-Type': human_status[img_status], + 'Access-Control-Allow-Origin': '*', + 'Location': def + }); + res.end(); + } else { + def = def || skins.default_skin(uuid); + skins.resize_img("public/images/" + def + ".png", size, function(err, image) { + sendimage(http_status, img_status, image); + }); + } + } + + function sendimage(http_status, img_status, image) { + res.writeHead(http_status, { + 'Content-Type': 'image/png', + 'Cache-Control': 'max-age=' + config.browser_cache_time + ', public', + 'Response-Time': new Date() - start, + 'X-Storage-Type': human_status[img_status], + 'Access-Control-Allow-Origin': '*', + 'Etag': '"' + etag + '"' + }); + res.end(http_status == 304 ? null : image); + } +}); + +module.exports = router; \ No newline at end of file From f674775520a9799e105822f3db119834416df5e8 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 5 Dec 2014 20:19:08 -0600 Subject: [PATCH 02/50] Update documentation & README for renders --- README.md | 3 ++- modules/config.js | 32 +++++++++++++++----------------- views/index.jade | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index e51cf86..e290e90 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ https://crafatar.com Crafatar serves Minecraft avatars based on the skin for use in external applications. Inspired by [Gravatar](https://gravatar.com) (hence the name) and [Minotar](https://minotar.net). -Image manipulation is done by [lwip](https://github.com/EyalAr/lwip) +Image manipulation is done by [lwip](https://github.com/EyalAr/lwip). Renders are created with [node-canvas](https://github.com/Automattic/node-canvas), based on math by [confuser](https://github.com/confuser/serverless-mc-skin-viewer). ![redstone_sheep's avatar](https://crafatar.com/avatars/ae795aa86327408e92ab25c8a59f3ba1?size=128) ![Jake0oo0's avatar](https://crafatar.com/avatars/2d5aa9cdaeb049189930461fc9b91cc5?size=128) ![Notch's avatar](https://crafatar.com/avatars/069a79f444e94726a5befca90e38aaf5?size=128) ![sk89q's avatar](https://crafatar.com/avatars/0ea8eca3dbf647cc9d1ac64551ca975c?size=128) ![md_5's avatar](https://crafatar.com/avatars/af74a02d19cb445bb07f6866a861f783?size=128) ## Usage / Documentation @@ -19,6 +19,7 @@ You can [join us](https://webchat.esper.net/?channels=spongy) in #spongy on irc. ## Install * Clone the repository +* Install [node-canvas](https://github.com/Automattic/node-canvas/wiki#desktop) dependencies. * `npm install` * `redis-server` * `cp "modules/config.example.js" "modules/config.js"` diff --git a/modules/config.js b/modules/config.js index 037a01d..e9eb39d 100644 --- a/modules/config.js +++ b/modules/config.js @@ -1,21 +1,19 @@ var config = { - min_size: 1, // for avatars - max_size: 512, // for avatars; too big values might lead to slow response time or DoS - default_size: 160, // for avatars; size to be used when no size given - local_cache_time: 1200, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response - browser_cache_time: 3600, // seconds until browser will request image again - cleaning_interval: 3, // seconds interval: deleting images if disk size at limit - cleaning_limit: 900000000000, // minumum required available KB on disk to trigger cleaning - cleaning_amount: 50000, // amount of avatar (and their helm) files to clean - http_timeout: 1000, // ms until connection to mojang is dropped - faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' - helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' - skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' - renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' - debug_enabled: true, // enables logging.debug - min_scale: 1, // for renders - max_scale: 100, // for renders; too big values might lead to slow response time or DoS - default_scale: 6, // for renders; scale to be used when no scale given + min_size: 1, // < 1 will (obviously) cause crash + max_size: 512, // too big values might lead to slow response time or DoS + default_size: 160, // size to be used when no size given + local_cache_time: 30, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response + browser_cache_time: 30, // seconds until browser will request image again + http_timeout: 3000, // ms until connection to mojang is dropped + cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit + cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning + cleaning_amount: 50000, // amount of avatar (and their helm) files to clean + http_timeout: 1000, // ms until connection to mojang is dropped + faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' + helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + debug_enabled: true, // enables logging.debug + default_scale: 6, // the scale of rendered avatars + maximum_sale: 10 // the maximum scale of rendered avatars }; module.exports = config; \ No newline at end of file diff --git a/views/index.jade b/views/index.jade index fea4cd8..05f00ab 100644 --- a/views/index.jade +++ b/views/index.jade @@ -63,12 +63,42 @@ block content | Replace mark.green id | with a Mojang UUID or username to get the related skin. - | You are redirected to the textures URL, or the default image is served.
+ | The user's skin will be returned, or the default image is served.
| You can use the default parameter here as well. .code | #{domain}/skins/ mark.green id + a(id="renders", class="anchor") + a(href="renders") + h3 3D Renders + p + | Crafatar also provides support for 3D renders of Minecraft skins. + | Replace + mark.green id + | with a Mojang UUID or username to get an render for the skin. + .code + | #{domain}/renders/head/ + mark.green id + .code + | #{domain}/renders/body/ + mark.green id + | The default parameter can also be used here. The scale factor will not be applied. + | Using the helm parameter is also allowed, which will be overlayed onto the head. + | The head render type will return only a render of the skin's head, while the + | body render will return a render of the entire skin. + + a(id="#render-parameters", class="#render-anchor") + a(href="#render-parameters") + h3 Render Parameters + a(id="scale", class="anchor") + a(href="#scale") + h4 scale + p + | The scale factor of the image #{config.min_scale} - #{config.max_scale}.
+ | Default is #{config.default_scale}. The actual size differs between the type of render. + + a(id="http-headers", class="anchor") a(href="#http-headers") h3 HTTP headers @@ -126,7 +156,7 @@ block content .code #{domain}/avatars/853c80ef3c3749fdaa49938b674adae6 p Jeb's avatar, 64 × 64 .code #{domain}/avatars/853c80ef3c3749fdaa49938b674adae6?size=64 - p Jeb's avatar, 64 × 64, with helm + p Jeb's avatar, 64 × 64, with helmet .code #{domain}/avatars/853c80ef3c3749fdaa49938b674adae6?size=64&helm p Jeb's avatar, or fall back to steve .code #{domain}/avatars/853c80ef3c3749fdaa49938b674adae6?default=steve @@ -138,6 +168,10 @@ block content .code #{domain}/skins/853c80ef3c3749fdaa49938b674adae6 p Jeb's skin by username .code #{domain}/skins/jeb_ + p Render of Jeb's Head + .code #{domain}/renders/head/853c80ef3c3749fdaa49938b674adae6 + p Render of Jeb's Body, with helmet, by username + .code #{domain}/renders/body/jeb_?helm .col-md-2.center .sideface.redstone_sheep(title="redstone_sheep") .sideface.Jake0oo0(title="Jake0oo0") From 55f023bfb3294322551fb41fe00838f02915506f Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 5 Dec 2014 20:39:19 -0600 Subject: [PATCH 03/50] Add tests for renders --- modules/renders.js | 9 +++++---- test/test.js | 32 +++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 2a54af5..93f16a7 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -3,6 +3,7 @@ // Permission to use & distribute https://github.com/confuser/serverless-mc-skin-viewer/blob/master/LICENSE var helpers = require('./helpers'); +var logging = require('./logging'); var exp = {}; @@ -88,7 +89,7 @@ exp.draw_model = function(uuid, scale, helm, body, callback) { var skin_ctx = skin_canvas.getContext('2d'); image.onerror = function(err) { - console.log("render error: " + err); + logging.error("render error: " + err); callback(err, 2, null, hash); }; @@ -97,13 +98,13 @@ exp.draw_model = function(uuid, scale, helm, body, callback) { //Scale it scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); if (body) { - console.log("drawing body"); + logging.log("drawing body"); exp.draw_body(skin_canvas, model_ctx, scale); } - console.log("drawing head"); + logging.log("drawing head"); exp.draw_head(skin_canvas, model_ctx, scale); if (helm) { - console.log("drawing helmet"); + logging.log("drawing helmet"); exp.draw_helmet(skin_canvas, model_ctx, scale); } diff --git a/test/test.js b/test/test.js index 3070452..09320be 100644 --- a/test/test.js +++ b/test/test.js @@ -7,6 +7,7 @@ var logging = require("../modules/logging"); var config = require("../modules/config"); var skins = require("../modules/skins"); var cache = require("../modules/cache"); +var renders = require("../modules/renders") // we don't want tests to fail because of slow internet config.http_timeout *= 3; @@ -161,7 +162,36 @@ describe("Crafatar", function() { }); }); }); - + describe("Networking: Renders", function() { + describe("Head", function() { + it("should not fail (username)", function(done) { + renders.draw_model(username, 6, true, false, function(err, status, hash, img) { + assert.strictEqual(err, null); + done(); + }); + }); + it("should not fail (uuid)", function(done) { + renders.draw_model(username, 6, true, false, function(err, status, hash, img) { + assert.strictEqual(err, null); + done(); + }); + }); + }); + describe("Body", function() { + it("should not fail (username)", function(done) { + renders.draw_model(username, 6, true, true, function(err, status, hash, img) { + assert.strictEqual(err, null); + done(); + }); + }); + it("should not fail (uuid)", function(done) { + renders.draw_model(username, 6, true, true, function(err, status, hash, img) { + assert.strictEqual(err, null); + done(); + }); + }); + }) + }); describe("Errors", function() { before(function() { cache.get_redis().flushall(); From 9ba3f5190ad6f6e7f0454eec08c3d11cc5dc3747 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 5 Dec 2014 21:08:33 -0600 Subject: [PATCH 04/50] Create get_render helpers method, move things around --- modules/helpers.js | 18 +++++++++++++ modules/renders.js | 64 ++++++++++++++++++++++------------------------ routes/renders.js | 15 +++++++---- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/modules/helpers.js b/modules/helpers.js index f97f77b..f74c1ae 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -3,6 +3,7 @@ var logging = require("./logging"); var config = require("./config"); var cache = require("./cache"); var skins = require("./skins"); +var renders = require("./renders") var fs = require("fs"); // 0098cb60-fa8e-427c-b299-793cbd302c9a @@ -175,4 +176,21 @@ exp.get_skin = function(uuid, callback) { }); }; +// handles creations of skin renders +// callback contanis error, hash, image buffer +exp.get_render = function(uuid, scale, helm, body, callback) { + logging.log(uuid + " render request"); + exp.get_skin(uuid, function(err, hash, img) { + renders.draw_model(uuid, img, scale, helm, body, function(err, img) { + if (err) { + callback(err, -1, hash, null); + } else if (!img) { + callback(null, 0, hash, null); + } else { + callback(null, 2, hash, img); + } + }); + }); +}; + module.exports = exp; \ No newline at end of file diff --git a/modules/renders.js b/modules/renders.js index 93f16a7..1e11fac 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -78,43 +78,41 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); } -exp.draw_model = function(uuid, scale, helm, body, callback) { - helpers.get_skin(uuid, function(err, hash, img) { - var image = new Image; - var width = 64 * scale; - var height = 64 * scale; - var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); - var skin_canvas = new Canvas(width, height); - var model_ctx = model_canvas.getContext('2d'); - var skin_ctx = skin_canvas.getContext('2d'); +exp.draw_model = function(uuid, img, scale, helm, body, callback) { + var image = new Image; + var width = 64 * scale; + var height = 64 * scale; + var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); + var skin_canvas = new Canvas(width, height); + var model_ctx = model_canvas.getContext('2d'); + var skin_ctx = skin_canvas.getContext('2d'); - image.onerror = function(err) { - logging.error("render error: " + err); - callback(err, 2, null, hash); - }; + image.onerror = function(err) { + logging.error("render error: " + err); + callback(err, null); + }; - image.onload = function() { - skin_ctx.drawImage(image,0,0,64,64,0,0,64,64); - //Scale it - scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); - if (body) { - logging.log("drawing body"); - exp.draw_body(skin_canvas, model_ctx, scale); - } - logging.log("drawing head"); - exp.draw_head(skin_canvas, model_ctx, scale); - if (helm) { - logging.log("drawing helmet"); - exp.draw_helmet(skin_canvas, model_ctx, scale); - } + image.onload = function() { + skin_ctx.drawImage(image,0,0,64,64,0,0,64,64); + //Scale it + scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); + if (body) { + logging.log("drawing body"); + exp.draw_body(skin_canvas, model_ctx, scale); + } + logging.log("drawing head"); + exp.draw_head(skin_canvas, model_ctx, scale); + if (helm) { + logging.log("drawing helmet"); + exp.draw_helmet(skin_canvas, model_ctx, scale); + } - model_canvas.toBuffer(function(err, buf){ - callback(err, 2, buf, hash); - }); - }; + model_canvas.toBuffer(function(err, buf){ + callback(err, buf); + }); + }; - image.src = img; - }); + image.src = img; } function scale_image(imageData, context, d_x, d_y, scale) { diff --git a/routes/renders.js b/routes/renders.js index 7de5088..38ea48d 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -5,6 +5,7 @@ var helpers = require('../modules/helpers'); var config = require('../modules/config'); var skins = require('../modules/skins'); var renders = require('../modules/renders'); +var fs = require('fs'); var human_status = { 0: "none", @@ -47,7 +48,7 @@ router.get('/:type/:uuid.:ext?', function(req, res) { uuid = uuid.replace(/-/g, ""); try { - renders.draw_model(uuid, scale, helm, body, function(err, status, image, hash) { + helpers.get_render(uuid, scale, helm, body, function(err, status, hash, image) { logging.log(uuid + " - " + human_status[status]); if (err) { logging.error(err); @@ -66,13 +67,13 @@ router.get('/:type/:uuid.:ext?', function(req, res) { logging.log("status: " + http_status); sendimage(http_status, status, image); } else { - //handle_default(404, status); + handle_default(404, status); } }); } catch(e) { logging.error("Error!"); logging.error(e); - //handle_default(500, status); + handle_default(500, status); } function handle_default(http_status, img_status) { @@ -87,8 +88,12 @@ router.get('/:type/:uuid.:ext?', function(req, res) { res.end(); } else { def = def || skins.default_skin(uuid); - skins.resize_img("public/images/" + def + ".png", size, function(err, image) { - sendimage(http_status, img_status, image); + fs.readFile("public/images/" + def + ".png", function (err, buf) { + if (err) throw err; + console.log(buf); + renders.draw_model(uuid, buf, scale, helm, body, function(err, status, image) { + sendimage(http_status, img_status, image); + }); }); } } From 5e453ced02ffc3c46f6454ddd70e78a74043495a Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 5 Dec 2014 21:10:01 -0600 Subject: [PATCH 05/50] Use get_render in tests --- test/test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test.js b/test/test.js index 09320be..0148539 100644 --- a/test/test.js +++ b/test/test.js @@ -165,13 +165,13 @@ describe("Crafatar", function() { describe("Networking: Renders", function() { describe("Head", function() { it("should not fail (username)", function(done) { - renders.draw_model(username, 6, true, false, function(err, status, hash, img) { + helpers.get_render(username, 6, true, false, function(err, status, hash, img) { assert.strictEqual(err, null); done(); }); }); it("should not fail (uuid)", function(done) { - renders.draw_model(username, 6, true, false, function(err, status, hash, img) { + helpers.get_render(username, 6, true, false, function(err, status, hash, img) { assert.strictEqual(err, null); done(); }); @@ -179,13 +179,13 @@ describe("Crafatar", function() { }); describe("Body", function() { it("should not fail (username)", function(done) { - renders.draw_model(username, 6, true, true, function(err, status, hash, img) { + helpers.get_render(username, 6, true, true, function(err, status, hash, img) { assert.strictEqual(err, null); done(); }); }); it("should not fail (uuid)", function(done) { - renders.draw_model(username, 6, true, true, function(err, status, hash, img) { + helpers.get_render(username, 6, true, true, function(err, status, hash, img) { assert.strictEqual(err, null); done(); }); From b151e03035bbefd0a3c6938e917d64d5a668ef9e Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 5 Dec 2014 23:16:14 -0600 Subject: [PATCH 06/50] Add default image support. Custom images are not rendered - alex or steve are --- modules/helpers.js | 5 +++++ modules/renders.js | 3 +++ routes/renders.js | 17 +++++++++++------ views/index.jade | 3 ++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/modules/helpers.js b/modules/helpers.js index f74c1ae..c7f6dc9 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -181,7 +181,12 @@ exp.get_skin = function(uuid, callback) { exp.get_render = function(uuid, scale, helm, body, callback) { logging.log(uuid + " render request"); exp.get_skin(uuid, function(err, hash, img) { + if (!img) { + callback(err, 0, hash, null); + return; + } renders.draw_model(uuid, img, scale, helm, body, function(err, img) { + console.log("thing" + img); if (err) { callback(err, -1, hash, null); } else if (!img) { diff --git a/modules/renders.js b/modules/renders.js index 1e11fac..ffa9e35 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -108,6 +108,9 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { } model_canvas.toBuffer(function(err, buf){ + if (err) { + logging.log("error creating buffer: " + err); + } callback(err, buf); }); }; diff --git a/routes/renders.js b/routes/renders.js index 38ea48d..7efdef3 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -30,7 +30,7 @@ router.get('/:type/:uuid.:ext?', function(req, res) { var body = raw_type == "head" ? false : true var uuid = req.params.uuid; - var def = req.params.def; + var def = req.query.default; var scale = parseInt(req.query.scale) || config.default_scale; var helm = req.query.hasOwnProperty('helm'); var start = new Date(); @@ -67,6 +67,7 @@ router.get('/:type/:uuid.:ext?', function(req, res) { logging.log("status: " + http_status); sendimage(http_status, status, image); } else { + logging.log("image not found, using default.") handle_default(404, status); } }); @@ -88,11 +89,15 @@ router.get('/:type/:uuid.:ext?', function(req, res) { res.end(); } else { def = def || skins.default_skin(uuid); - fs.readFile("public/images/" + def + ".png", function (err, buf) { - if (err) throw err; - console.log(buf); - renders.draw_model(uuid, buf, scale, helm, body, function(err, status, image) { - sendimage(http_status, img_status, image); + fs.readFile("public/images/" + def + "_skin.png", function (err, buf) { + if (err) { + logging.error("error rendering default image: " + err); + } + renders.draw_model(uuid, buf, scale, helm, body, function(err, def_img) { + if (err) { + logging.log("error while rendering default image: " + err); + } + sendimage(http_status, img_status, def_img); }); }); } diff --git a/views/index.jade b/views/index.jade index 05f00ab..bf7aa9f 100644 --- a/views/index.jade +++ b/views/index.jade @@ -83,7 +83,8 @@ block content .code | #{domain}/renders/body/ mark.green id - | The default parameter can also be used here. The scale factor will not be applied. + | The default parameter can also be used here. Using alex or steve will create a + | render with the same parameters. A custom image will not be rendered. | Using the helm parameter is also allowed, which will be overlayed onto the head. | The head render type will return only a render of the skin's head, while the | body render will return a render of the entire skin. From 4bcd9e4530289dc273b3a8fd67bb7c0c529467d3 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 5 Dec 2014 23:17:05 -0600 Subject: [PATCH 07/50] Remove debug --- modules/helpers.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/helpers.js b/modules/helpers.js index c7f6dc9..5964cdf 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -186,7 +186,6 @@ exp.get_render = function(uuid, scale, helm, body, callback) { return; } renders.draw_model(uuid, img, scale, helm, body, function(err, img) { - console.log("thing" + img); if (err) { callback(err, -1, hash, null); } else if (!img) { From 1c33119e05fa1880238efb234b33ad12d2a59846 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 6 Dec 2014 00:18:41 -0600 Subject: [PATCH 08/50] Cache caching for skins and renders' --- modules/config.example.js | 2 ++ modules/config.js | 3 +- modules/helpers.js | 60 +++++++++++++++++++++++++-------------- modules/networking.js | 21 ++++++++++++++ modules/renders.js | 11 +++++++ modules/skins.js | 10 +++++++ skins/renders/.gitkeep | 0 skins/skins/.gitkeep | 0 views/index.jade | 3 +- 9 files changed, 86 insertions(+), 24 deletions(-) create mode 100644 skins/renders/.gitkeep create mode 100644 skins/skins/.gitkeep diff --git a/modules/config.example.js b/modules/config.example.js index 37a8a56..ba58ec6 100644 --- a/modules/config.example.js +++ b/modules/config.example.js @@ -10,6 +10,8 @@ var config = { http_timeout: 1000, // ms until connection to mojang is dropped faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' + renders_dir: 'skins/renders', // Directory where rendered skins are kept. should have trailing '/' debug_enabled: false, // enables logging.debug default_scale: 6, // the scale of rendered avatars maximum_sale: 10 // the maximum scale of rendered avatars diff --git a/modules/config.js b/modules/config.js index e9eb39d..6a1aef8 100644 --- a/modules/config.js +++ b/modules/config.js @@ -8,9 +8,10 @@ var config = { cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning cleaning_amount: 50000, // amount of avatar (and their helm) files to clean - http_timeout: 1000, // ms until connection to mojang is dropped faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' + renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' debug_enabled: true, // enables logging.debug default_scale: 6, // the scale of rendered avatars maximum_sale: 10 // the maximum scale of rendered avatars diff --git a/modules/helpers.js b/modules/helpers.js index 5964cdf..bf07cfe 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -160,19 +160,17 @@ exp.get_avatar = function(uuid, helm, size, callback) { exp.get_skin = function(uuid, callback) { logging.log(uuid + " skin request"); exp.get_image_hash(uuid, function(err, status, hash) { - if (hash) { - var skinurl = "http://textures.minecraft.net/texture/" + hash; - networking.get_skin(skinurl, function(err, img) { - if (err) { - logging.error("error while downloading skin"); - callback(err, hash, null); - } else { - callback(null, hash, img); - } + var skinpath = __dirname + "/../" + config.skins_dir + hash + ".png"; + if (fs.existsSync(skinpath)) { + logging.log("skin already exists, not downloading"); + skins.open_skin(hash, function(err, img) { + callback(err, hash, img); }); - } else { - callback(err, null, null); + return; } + networking.save_skin(uuid, hash, skinpath, function(err, img) { + callback(err, hash, img); + }); }); }; @@ -180,19 +178,37 @@ exp.get_skin = function(uuid, callback) { // callback contanis error, hash, image buffer exp.get_render = function(uuid, scale, helm, body, callback) { logging.log(uuid + " render request"); - exp.get_skin(uuid, function(err, hash, img) { - if (!img) { - callback(err, 0, hash, null); - return; - } - renders.draw_model(uuid, img, scale, helm, body, function(err, img) { - if (err) { + exp.get_image_hash(uuid, function(err, status, hash) { + exp.get_skin(uuid, function(err, hash, img) { + if (!hash) { callback(err, -1, hash, null); - } else if (!img) { - callback(null, 0, hash, null); - } else { - callback(null, 2, hash, img); + return; } + var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + ".png"; + if (fs.existsSync(renderpath)) { + renders.open_render(hash, scale, function(err, img) { + callback(err, 1, hash, img); + }); + return; + } + if (!img) { + callback(err, 0, hash, null); + return; + } + renders.draw_model(uuid, img, scale, helm, body, function(err, img) { + if (err) { + callback(err, -1, hash, null); + } else if (!img) { + callback(null, 0, hash, null); + } else { + fs.writeFile(renderpath, img, 'binary', function(err){ + if (err) { + logging.log(err); + } + callback(null, 2, hash, img); + }); + } + }); }); }); }; diff --git a/modules/networking.js b/modules/networking.js index eec75d4..ec6bc75 100644 --- a/modules/networking.js +++ b/modules/networking.js @@ -141,4 +141,25 @@ exp.get_skin = function(url, callback) { }); }; +exp.save_skin = function(uuid, hash, outpath, callback) { + if (hash) { + var skinurl = "http://textures.minecraft.net/texture/" + hash; + exp.get_skin(skinurl, function(err, img) { + if (err) { + logging.error("error while downloading skin"); + callback(err, null); + } else { + fs.writeFile(outpath, img, 'binary', function(err){ + if (err) { + logging.log(err); + } + callback(null, img); + }) + } + }); + } else { + callback(null, null); + } +}; + module.exports = exp; \ No newline at end of file diff --git a/modules/renders.js b/modules/renders.js index ffa9e35..7660901 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -4,6 +4,8 @@ var helpers = require('./helpers'); var logging = require('./logging'); +var config = require('./config'); +var fs = require('fs'); var exp = {}; @@ -118,6 +120,15 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { image.src = img; } +exp.open_render = function(hash, scale, callback) { + fs.readFile(__dirname + "/../" + config.renders_dir + hash + "-" + scale + ".png", function (err, buf) { + if (err) { + logging.error("error while opening skin file: " + err); + } + callback(err, buf); + }); +}; + function scale_image(imageData, context, d_x, d_y, scale) { var width = imageData.width; var height = imageData.height; diff --git a/modules/skins.js b/modules/skins.js index 0add75f..68b705b 100644 --- a/modules/skins.js +++ b/modules/skins.js @@ -1,6 +1,7 @@ var logging = require("./logging"); var lwip = require("lwip"); var fs = require("fs"); +var config = require("./config"); var exp = {}; @@ -93,4 +94,13 @@ exp.default_skin = function(uuid) { } }; +exp.open_skin = function(hash, callback) { + fs.readFile(__dirname + "/../" + config.skins_dir + hash + ".png", function (err, buf) { + if (err) { + logging.error("error while opening skin file: " + err); + } + callback(err, buf); + }); +}; + module.exports = exp; \ No newline at end of file diff --git a/skins/renders/.gitkeep b/skins/renders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/skins/skins/.gitkeep b/skins/skins/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/views/index.jade b/views/index.jade index bf7aa9f..5cf2440 100644 --- a/views/index.jade +++ b/views/index.jade @@ -84,7 +84,8 @@ block content | #{domain}/renders/body/ mark.green id | The default parameter can also be used here. Using alex or steve will create a - | render with the same parameters. A custom image will not be rendered. + | render with the same parameters. A custom image will not be rendered. A UUID or username + | without a skin, will produce a render based on the input id, or the default parameter. | Using the helm parameter is also allowed, which will be overlayed onto the head. | The head render type will return only a render of the skin's head, while the | body render will return a render of the entire skin. From dbd66f88a5c82cf669bad1a40a7d5e34db0f8c37 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 6 Dec 2014 00:27:25 -0600 Subject: [PATCH 09/50] Fix caching issue --- modules/cache.js | 2 +- modules/helpers.js | 10 ++++++++-- modules/renders.js | 5 ++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/cache.js b/modules/cache.js index 39f9aff..c9e4c11 100644 --- a/modules/cache.js +++ b/modules/cache.js @@ -16,7 +16,7 @@ function connect_redis() { } redis.on("ready", function() { logging.log("Redis connection established."); - if(process.env.HEROKU) { + if(process.env.HEROKU || true) { logging.log("Running on heroku, flushing redis"); redis.flushall(); } diff --git a/modules/helpers.js b/modules/helpers.js index bf07cfe..bd80daa 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -174,6 +174,11 @@ exp.get_skin = function(uuid, callback) { }); }; +function get_type(helm, body) { + var text = body ? "body" : "head" + return helm ? text+"helm" : text +} + // handles creations of skin renders // callback contanis error, hash, image buffer exp.get_render = function(uuid, scale, helm, body, callback) { @@ -184,9 +189,10 @@ exp.get_render = function(uuid, scale, helm, body, callback) { callback(err, -1, hash, null); return; } - var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + ".png"; + console.log("TYPE: " + get_type(helm, body)) + var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + "-" + "-" + get_type(helm, body) + ".png"; if (fs.existsSync(renderpath)) { - renders.open_render(hash, scale, function(err, img) { + renders.open_render(renderpath, function(err, img) { callback(err, 1, hash, img); }); return; diff --git a/modules/renders.js b/modules/renders.js index 7660901..c6b241a 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -4,7 +4,6 @@ var helpers = require('./helpers'); var logging = require('./logging'); -var config = require('./config'); var fs = require('fs'); var exp = {}; @@ -120,8 +119,8 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { image.src = img; } -exp.open_render = function(hash, scale, callback) { - fs.readFile(__dirname + "/../" + config.renders_dir + hash + "-" + scale + ".png", function (err, buf) { +exp.open_render = function(renderpath, callback) { + fs.readFile(renderpath, function (err, buf) { if (err) { logging.error("error while opening skin file: " + err); } From bc98c66f82fe1ad090ffa8a4fcfb8bc310382ab2 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 6 Dec 2014 00:29:06 -0600 Subject: [PATCH 10/50] Remove extra module in skins --- modules/helpers.js | 2 +- modules/skins.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/helpers.js b/modules/helpers.js index bd80daa..a5c9056 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -163,7 +163,7 @@ exp.get_skin = function(uuid, callback) { var skinpath = __dirname + "/../" + config.skins_dir + hash + ".png"; if (fs.existsSync(skinpath)) { logging.log("skin already exists, not downloading"); - skins.open_skin(hash, function(err, img) { + skins.open_skin(skinpath, function(err, img) { callback(err, hash, img); }); return; diff --git a/modules/skins.js b/modules/skins.js index 68b705b..f642fb8 100644 --- a/modules/skins.js +++ b/modules/skins.js @@ -1,7 +1,6 @@ var logging = require("./logging"); var lwip = require("lwip"); var fs = require("fs"); -var config = require("./config"); var exp = {}; @@ -94,8 +93,8 @@ exp.default_skin = function(uuid) { } }; -exp.open_skin = function(hash, callback) { - fs.readFile(__dirname + "/../" + config.skins_dir + hash + ".png", function (err, buf) { +exp.open_skin = function(skinpath, callback) { + fs.readFile(skinpath, function (err, buf) { if (err) { logging.error("error while opening skin file: " + err); } From d3566df0caa1416aaa4315fa60a8278e98134839 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 6 Dec 2014 00:30:06 -0600 Subject: [PATCH 11/50] Remove extra module --- routes/renders.js | 1 - 1 file changed, 1 deletion(-) diff --git a/routes/renders.js b/routes/renders.js index 7efdef3..193cbfa 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -1,5 +1,4 @@ var router = require('express').Router(); -var networking = require('../modules/networking'); var logging = require('../modules/logging'); var helpers = require('../modules/helpers'); var config = require('../modules/config'); From 5811f38c957caa30a029bfee2e62168b4fa21852 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 6 Dec 2014 00:43:48 -0600 Subject: [PATCH 12/50] Add temporary cleaning solution to renders --- modules/cache.js | 2 +- modules/clean_images.js | 16 +++++++++++++--- modules/helpers.js | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/modules/cache.js b/modules/cache.js index c9e4c11..39f9aff 100644 --- a/modules/cache.js +++ b/modules/cache.js @@ -16,7 +16,7 @@ function connect_redis() { } redis.on("ready", function() { logging.log("Redis connection established."); - if(process.env.HEROKU || true) { + if(process.env.HEROKU) { logging.log("Running on heroku, flushing redis"); redis.flushall(); } diff --git a/modules/clean_images.js b/modules/clean_images.js index f3e5501..c8386a5 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -33,14 +33,24 @@ exp.run = function() { logging.error(err); } else if (clean) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); - var skindir = __dirname + "/../" + config.faces_dir; + var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; - var files = fs.readdirSync(skindir); + var renderdir = __dirname + "/../" + config.renders_dir; + var skindir = __dirname + "/../" + config.skins_dir; + var files = fs.readdirSync(facesdir); for (var i = 0; i < Math.min(files.length, config.cleaning_amount); i++) { var filename = files[i]; if (filename[0] != ".") { - fs.unlink(skindir + filename, function(){}); + fs.unlink(facesdir + filename, function(){}); fs.unlink(helmdir + filename, function(){}); + fs.unlink(skindir + filename, function(){}); + } + } + files = fs.readdirSync(renderdir); + for (var i = 0; i < Math.min(files.length, config.cleaning_amount); i++) { + var filename = files[i]; + if (filename[0] != ".") { + fs.unlink(renderdir + filename, function(){}); } } } else { diff --git a/modules/helpers.js b/modules/helpers.js index a5c9056..9582164 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -190,7 +190,7 @@ exp.get_render = function(uuid, scale, helm, body, callback) { return; } console.log("TYPE: " + get_type(helm, body)) - var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + "-" + "-" + get_type(helm, body) + ".png"; + var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + "-" + get_type(helm, body) + ".png"; if (fs.existsSync(renderpath)) { renders.open_render(renderpath, function(err, img) { callback(err, 1, hash, img); From 4df237b454037795646212ffb5b07f59f824fd39 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 07:41:08 +0100 Subject: [PATCH 13/50] don't overwrite my config :) --- modules/config.js | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 modules/config.js diff --git a/modules/config.js b/modules/config.js deleted file mode 100644 index 6a1aef8..0000000 --- a/modules/config.js +++ /dev/null @@ -1,20 +0,0 @@ -var config = { - min_size: 1, // < 1 will (obviously) cause crash - max_size: 512, // too big values might lead to slow response time or DoS - default_size: 160, // size to be used when no size given - local_cache_time: 30, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response - browser_cache_time: 30, // seconds until browser will request image again - http_timeout: 3000, // ms until connection to mojang is dropped - cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit - cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning - cleaning_amount: 50000, // amount of avatar (and their helm) files to clean - faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' - helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' - skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' - renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' - debug_enabled: true, // enables logging.debug - default_scale: 6, // the scale of rendered avatars - maximum_sale: 10 // the maximum scale of rendered avatars -}; - -module.exports = config; \ No newline at end of file From 9df986b044fcbe407392c80886c8ee3dbbfb7132 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 07:43:44 +0100 Subject: [PATCH 14/50] there shouldn't be a max sale :moneybag: --- modules/config.example.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config.example.js b/modules/config.example.js index ba58ec6..df49297 100644 --- a/modules/config.example.js +++ b/modules/config.example.js @@ -14,7 +14,7 @@ var config = { renders_dir: 'skins/renders', // Directory where rendered skins are kept. should have trailing '/' debug_enabled: false, // enables logging.debug default_scale: 6, // the scale of rendered avatars - maximum_sale: 10 // the maximum scale of rendered avatars + maximum_scale: 10 // the maximum scale of rendered avatars }; module.exports = config; \ No newline at end of file From dd2ac9ee4e71d8e5fb69a01d5582a45e04966585 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 07:46:56 +0100 Subject: [PATCH 15/50] fix config --- modules/config.example.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config.example.js b/modules/config.example.js index df49297..7ff03ae 100644 --- a/modules/config.example.js +++ b/modules/config.example.js @@ -11,7 +11,7 @@ var config = { faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' - renders_dir: 'skins/renders', // Directory where rendered skins are kept. should have trailing '/' + renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' debug_enabled: false, // enables logging.debug default_scale: 6, // the scale of rendered avatars maximum_scale: 10 // the maximum scale of rendered avatars From 62e199412189c6436e1e564c9566486faad07845 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 15:01:23 +0100 Subject: [PATCH 16/50] fix config, use min_scale + max_scale --- modules/config.example.js | 31 ++++++++++++++++--------------- routes/renders.js | 4 ++-- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/modules/config.example.js b/modules/config.example.js index 7ff03ae..53c1576 100644 --- a/modules/config.example.js +++ b/modules/config.example.js @@ -1,20 +1,21 @@ var config = { - min_size: 1, // < 1 will (obviously) cause crash - max_size: 512, // too big values might lead to slow response time or DoS - default_size: 160, // size to be used when no size given - local_cache_time: 1200, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response - browser_cache_time: 3600, // seconds until browser will request image again - cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit - cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning - cleaning_amount: 50000, // amount of avatar (and their helm) files to clean - http_timeout: 1000, // ms until connection to mojang is dropped - faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' - helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' - skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' + min_size: 1, // for avatars + max_size: 512, // for avatars; too big values might lead to slow response time or DoS + default_size: 160, // for avatars; size to be used when no size given + local_cache_time: 1200, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response + browser_cache_time: 3600, // seconds until browser will request image again + cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit + cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning + cleaning_amount: 50000, // amount of avatar (and their helm) files to clean + http_timeout: 1000, // ms until connection to mojang is dropped + faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' + helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' - debug_enabled: false, // enables logging.debug - default_scale: 6, // the scale of rendered avatars - maximum_scale: 10 // the maximum scale of rendered avatars + debug_enabled: false, // enables logging.debug + min_scale: 1, // for renders + max_scale: 10, // for renders; too big values might lead to slow response time or DoS + default_scale: 6, // for renders; scale to be used when no scale given }; module.exports = config; \ No newline at end of file diff --git a/routes/renders.js b/routes/renders.js index 193cbfa..21219d3 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -16,7 +16,7 @@ var human_status = { // valid types: head, body. helmet is query param -// The Type logic should be two separate GET +// The Type logic should be two separate GET // functions once response methods are extracted router.get('/:type/:uuid.:ext?', function(req, res) { var raw_type = req.params.type; @@ -35,7 +35,7 @@ router.get('/:type/:uuid.:ext?', function(req, res) { var start = new Date(); var etag = null; - if (scale > config.maximum_scale) { + if (scale < config.min_scale || scale > config.max_scale) { // Preventing from OOM crashes. res.status(422).send("422 Invalid Size"); } else if (!helpers.uuid_valid(uuid)) { From 834e7374980f203c373bb0b0b554bd9f07115938 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 15:02:05 +0100 Subject: [PATCH 17/50] if true then false else true --- routes/renders.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/renders.js b/routes/renders.js index 21219d3..52456cd 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -27,7 +27,7 @@ router.get('/:type/:uuid.:ext?', function(req, res) { return; } - var body = raw_type == "head" ? false : true + var body = raw_type == "body"; var uuid = req.params.uuid; var def = req.query.default; var scale = parseInt(req.query.scale) || config.default_scale; @@ -66,7 +66,7 @@ router.get('/:type/:uuid.:ext?', function(req, res) { logging.log("status: " + http_status); sendimage(http_status, status, image); } else { - logging.log("image not found, using default.") + logging.log("image not found, using default."); handle_default(404, status); } }); From a162387f835287bde47de0f921a57e6227b5ac80 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 16:57:17 +0100 Subject: [PATCH 18/50] clean code --- modules/clean_images.js | 4 ++-- modules/helpers.js | 10 +++++----- modules/networking.js | 2 +- modules/renders.js | 38 +++++++++++++++++++------------------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index c8386a5..1c8e3c2 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -47,8 +47,8 @@ exp.run = function() { } } files = fs.readdirSync(renderdir); - for (var i = 0; i < Math.min(files.length, config.cleaning_amount); i++) { - var filename = files[i]; + for (var j = 0; j < Math.min(files.length, config.cleaning_amount); j++) { + var filename = files[j]; if (filename[0] != ".") { fs.unlink(renderdir + filename, function(){}); } diff --git a/modules/helpers.js b/modules/helpers.js index 9582164..de5f163 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -3,7 +3,7 @@ var logging = require("./logging"); var config = require("./config"); var cache = require("./cache"); var skins = require("./skins"); -var renders = require("./renders") +var renders = require("./renders"); var fs = require("fs"); // 0098cb60-fa8e-427c-b299-793cbd302c9a @@ -175,8 +175,8 @@ exp.get_skin = function(uuid, callback) { }; function get_type(helm, body) { - var text = body ? "body" : "head" - return helm ? text+"helm" : text + var text = body ? "body" : "head"; + return helm ? text+"helm" : text; } // handles creations of skin renders @@ -189,8 +189,8 @@ exp.get_render = function(uuid, scale, helm, body, callback) { callback(err, -1, hash, null); return; } - console.log("TYPE: " + get_type(helm, body)) - var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + "-" + get_type(helm, body) + ".png"; + console.log("TYPE: " + get_type(helm, body)); + var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + "-" + get_type(helm, body) + ".png"; if (fs.existsSync(renderpath)) { renders.open_render(renderpath, function(err, img) { callback(err, 1, hash, img); diff --git a/modules/networking.js b/modules/networking.js index ec6bc75..397169b 100644 --- a/modules/networking.js +++ b/modules/networking.js @@ -154,7 +154,7 @@ exp.save_skin = function(uuid, hash, outpath, callback) { logging.log(err); } callback(null, img); - }) + }); } }); } else { diff --git a/modules/renders.js b/modules/renders.js index c6b241a..1559002 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -12,17 +12,17 @@ var Canvas = require('canvas'); var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { - //Helmet - Front - model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); - //Helmet - Right - model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); - //Helmet - Top - model_ctx.setTransform(-1,0.5,1,0.5,0,0); - model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); -} + //Helmet - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + //Helmet - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + //Helmet - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); +}; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front @@ -35,7 +35,7 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); -} +}; exp.draw_body = function(skin_canvas, model_ctx, scale) { //Left Leg @@ -43,7 +43,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { model_ctx.setTransform(1,-0.5,0,1.2,0,0); model_ctx.scale(-1,1); model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale); - + //Right Leg //Right Leg - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); @@ -51,7 +51,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Right Leg - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale); - + //Arm Left //Arm Left - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); @@ -60,12 +60,12 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Arm Left - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); - + //Body //Body - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); - + //Arm Right //Arm Right - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); @@ -77,10 +77,10 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); -} +}; exp.draw_model = function(uuid, img, scale, helm, body, callback) { - var image = new Image; + var image = new Image(); var width = 64 * scale; var height = 64 * scale; var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); @@ -117,7 +117,7 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { }; image.src = img; -} +}; exp.open_render = function(renderpath, callback) { fs.readFile(renderpath, function (err, buf) { From ca67afd9ecb1f41c745eaa24a18638e64b888995 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 18:05:35 +0100 Subject: [PATCH 19/50] more clean code --- test/test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test.js b/test/test.js index 0148539..45f698c 100644 --- a/test/test.js +++ b/test/test.js @@ -7,7 +7,7 @@ var logging = require("../modules/logging"); var config = require("../modules/config"); var skins = require("../modules/skins"); var cache = require("../modules/cache"); -var renders = require("../modules/renders") +var renders = require("../modules/renders"); // we don't want tests to fail because of slow internet config.http_timeout *= 3; @@ -190,7 +190,7 @@ describe("Crafatar", function() { done(); }); }); - }) + }); }); describe("Errors", function() { before(function() { From a6ff10493daec1ed26ac6e9c5db2e6ad5b1e5bdb Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 8 Dec 2014 20:11:05 +0100 Subject: [PATCH 20/50] console.debug --- modules/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/helpers.js b/modules/helpers.js index de5f163..1fc77b3 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -189,7 +189,7 @@ exp.get_render = function(uuid, scale, helm, body, callback) { callback(err, -1, hash, null); return; } - console.log("TYPE: " + get_type(helm, body)); + logging.debug("TYPE: " + get_type(helm, body)); var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + "-" + get_type(helm, body) + ".png"; if (fs.existsSync(renderpath)) { renders.open_render(renderpath, function(err, img) { From 28d2005e3c807fad2f9199c52d1f94c47586a907 Mon Sep 17 00:00:00 2001 From: Jake Date: Mon, 8 Dec 2014 15:36:34 -0600 Subject: [PATCH 21/50] Lower case UUIDs - renders --- routes/renders.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/renders.js b/routes/renders.js index 52456cd..18deaa9 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -43,8 +43,8 @@ router.get('/:type/:uuid.:ext?', function(req, res) { return; } - // strip dashes - uuid = uuid.replace(/-/g, ""); + // strip dashes, to lowercase + uuid = uuid.replace(/-/g, "").toLowerCase(); try { helpers.get_render(uuid, scale, helm, body, function(err, status, hash, image) { From 787dce8ef2a1f3a13fb41de0bd1c2a57375ff91a Mon Sep 17 00:00:00 2001 From: Jake Date: Mon, 8 Dec 2014 15:42:51 -0600 Subject: [PATCH 22/50] Revert "Lower case UUIDs - renders" This reverts commit 9d27b7cb41c5585e9db0be87c975fa32455576eb. --- routes/renders.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/renders.js b/routes/renders.js index 18deaa9..52456cd 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -43,8 +43,8 @@ router.get('/:type/:uuid.:ext?', function(req, res) { return; } - // strip dashes, to lowercase - uuid = uuid.replace(/-/g, "").toLowerCase(); + // strip dashes + uuid = uuid.replace(/-/g, ""); try { helpers.get_render(uuid, scale, helm, body, function(err, status, hash, image) { From 63aa0474269b223c8544553dd29126fc59f4c55e Mon Sep 17 00:00:00 2001 From: jomo Date: Fri, 12 Dec 2014 01:24:33 +0100 Subject: [PATCH 23/50] fix head position --- modules/renders.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 1559002..65d1cc5 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -14,27 +14,27 @@ var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); //Head - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From 59d8a5e12b666c0fd966289540d249be8b25d118 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 15:40:30 -0600 Subject: [PATCH 24/50] Revert "fix head position" This reverts commit cb1a0dd09f4482bc34199a88b48ec603a28c27f7. --- modules/renders.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 65d1cc5..1559002 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -14,27 +14,27 @@ var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Head - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From 95de38e8f0ac052a526777562c3dd0f4f68e8078 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 16:31:19 -0600 Subject: [PATCH 25/50] End request if invalid scale --- routes/renders.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routes/renders.js b/routes/renders.js index 52456cd..2a03dcf 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -37,7 +37,8 @@ router.get('/:type/:uuid.:ext?', function(req, res) { if (scale < config.min_scale || scale > config.max_scale) { // Preventing from OOM crashes. - res.status(422).send("422 Invalid Size"); + res.status(422).send("422 Invalid Scale"); + return; } else if (!helpers.uuid_valid(uuid)) { res.status(422).send("422 Invalid UUID"); return; From 127a923c1e0488df5fc39313b42e2f5fe7000f23 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 16:31:51 -0600 Subject: [PATCH 26/50] Revert "Revert "fix head position"" This reverts commit b58f2faa584f73f5c303a6bf4738d796d4d8fe87. --- modules/renders.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 1559002..65d1cc5 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -14,27 +14,27 @@ var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); //Head - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From 7dfb3dafa6e340d0fc0a5bd3db633efc0cd52f0d Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 20:58:57 -0600 Subject: [PATCH 27/50] Fix head rendering --- modules/clean_images.js | 2 +- modules/renders.js | 12 ++++++------ package.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index 1c8e3c2..cf04a13 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -31,7 +31,7 @@ exp.run = function() { if (err) { logging.error("Failed to run ImageCleaner"); logging.error(err); - } else if (clean) { + } else if (clean || true) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; diff --git a/modules/renders.js b/modules/renders.js index 65d1cc5..7eda6c5 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -14,27 +14,27 @@ var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3.4*scale, 5.14*scale, 8*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Head - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.35*scale, 5.16*scale, 8.3*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { diff --git a/package.json b/package.json index bf6c45b..b23e1c3 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "body-parser": "~1.8.1", - "canvas": "1.0.1", + "canvas": "Jake0oo0/node-canvas", "cookie-parser": "~1.3.3", "coveralls": "^2.11.2", "debug": "~2.0.0", From 10aa91b15b3716ce908d5c9631ef9ab4b3ff629e Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 21:06:00 -0600 Subject: [PATCH 28/50] Fix shoulder rendering --- modules/renders.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 7eda6c5..9c8509d 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -59,7 +59,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); //Arm Left - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); - model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16.4*scale, 4*scale, 4.3*scale); //Body //Body - Front @@ -76,7 +76,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Arm Right - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16.4*scale, 16*scale, 4*scale, 4.3*scale); }; exp.draw_model = function(uuid, img, scale, helm, body, callback) { From 2ed641c88e43be61551fe10dbc1b8d4db29f3e46 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 21:09:31 -0600 Subject: [PATCH 29/50] Fix front body rendering --- modules/renders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/renders.js b/modules/renders.js index 9c8509d..33f85e8 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -64,7 +64,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Body //Body - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); + model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12.15*scale); //Arm Right //Arm Right - Right From bb28785119c13b5c71ae481df874e2e1304588ec Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 21:10:14 -0600 Subject: [PATCH 30/50] Fix helmet rendering --- modules/renders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/renders.js b/modules/renders.js index 33f85e8..86c7899 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -21,7 +21,7 @@ exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3.4*scale, 5.14*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3.35*scale, 5.16*scale, 8.3*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { From d994442d22d73bb9b5055b0a8cd6929b478dfea8 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 21:12:41 -0600 Subject: [PATCH 31/50] Remove force clean --- modules/clean_images.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index cf04a13..1c8e3c2 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -31,7 +31,7 @@ exp.run = function() { if (err) { logging.error("Failed to run ImageCleaner"); logging.error(err); - } else if (clean || true) { + } else if (clean) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; From ce41465502baa717ae9466af7c2822980d562ab6 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 12 Dec 2014 21:14:06 -0600 Subject: [PATCH 32/50] Try to get Travis working again --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 58e6785..33aaa51 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,8 @@ node_js: - "0.10" before_script: - cp "modules/config.example.js" "modules/config.js" +before_install: + - sudo apt-get install libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++ notifications: irc: channels: From 86d38168ae9088c1e63788ea0cfc1d019f6d7830 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 13 Dec 2014 10:55:55 -0600 Subject: [PATCH 33/50] This looks better --- modules/clean_images.js | 2 +- modules/renders.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index 1c8e3c2..cf04a13 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -31,7 +31,7 @@ exp.run = function() { if (err) { logging.error("Failed to run ImageCleaner"); logging.error(err); - } else if (clean) { + } else if (clean || true) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; diff --git a/modules/renders.js b/modules/renders.js index 86c7899..e294da1 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -34,7 +34,7 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.35*scale, 5.16*scale, 8.3*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.24*scale, 5.08*scale, 8.13*scale, 8.14*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From 31ff73e307b739ac278547054dbcd9bcfaa18d07 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 13 Dec 2014 19:49:02 -0600 Subject: [PATCH 34/50] does this look better..? --- modules/clean_images.js | 2 +- modules/renders.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index cf04a13..1c8e3c2 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -31,7 +31,7 @@ exp.run = function() { if (err) { logging.error("Failed to run ImageCleaner"); logging.error(err); - } else if (clean || true) { + } else if (clean) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; diff --git a/modules/renders.js b/modules/renders.js index e294da1..b830916 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -34,7 +34,7 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.24*scale, 5.08*scale, 8.13*scale, 8.14*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.19*scale, 5.04*scale, 8.2*scale, 8.1*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From 0f08bd7edeb48fb6ba4c9dba9de254827ff65315 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 13 Dec 2014 19:59:58 -0600 Subject: [PATCH 35/50] Revert "does this look better..?" This reverts commit 471d0f089d481dba06964a3fe15cc55005446a41. --- modules/clean_images.js | 2 +- modules/renders.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index 1c8e3c2..cf04a13 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -31,7 +31,7 @@ exp.run = function() { if (err) { logging.error("Failed to run ImageCleaner"); logging.error(err); - } else if (clean) { + } else if (clean || true) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; diff --git a/modules/renders.js b/modules/renders.js index b830916..e294da1 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -34,7 +34,7 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.19*scale, 5.04*scale, 8.2*scale, 8.1*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.24*scale, 5.08*scale, 8.13*scale, 8.14*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From e9cc9d18eb318b9f8ffd7851fc7b24465c6a4548 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 13 Dec 2014 20:00:11 -0600 Subject: [PATCH 36/50] Revert "This looks better" This reverts commit 44761248537dd595ed63aff183c71fb300574499. --- modules/clean_images.js | 2 +- modules/renders.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/clean_images.js b/modules/clean_images.js index cf04a13..1c8e3c2 100644 --- a/modules/clean_images.js +++ b/modules/clean_images.js @@ -31,7 +31,7 @@ exp.run = function() { if (err) { logging.error("Failed to run ImageCleaner"); logging.error(err); - } else if (clean || true) { + } else if (clean) { logging.warn("ImageCleaner: Disk limit reached! Cleaning images now"); var facesdir = __dirname + "/../" + config.faces_dir; var helmdir = __dirname + "/../" + config.helms_dir; diff --git a/modules/renders.js b/modules/renders.js index e294da1..86c7899 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -34,7 +34,7 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.24*scale, 5.08*scale, 8.13*scale, 8.14*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.35*scale, 5.16*scale, 8.3*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { From 0bfda3d14a90763127c3faf7e5107f2fcaa68a17 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 13 Dec 2014 20:03:28 -0600 Subject: [PATCH 37/50] Merge --- modules/renders.js | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 86c7899..a50a2ce 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -14,27 +14,27 @@ var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3.35*scale, 5.16*scale, 8.3*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); //Head - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3.35*scale, 5.16*scale, 8.3*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { diff --git a/package.json b/package.json index b23e1c3..bf6c45b 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "body-parser": "~1.8.1", - "canvas": "Jake0oo0/node-canvas", + "canvas": "1.0.1", "cookie-parser": "~1.3.3", "coveralls": "^2.11.2", "debug": "~2.0.0", From a1a6b94a912e6a869e7b3365b42fcdd3bd5ef4d5 Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 16 Dec 2014 20:12:27 -0600 Subject: [PATCH 38/50] original nums: --- modules/renders.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index a50a2ce..a2a1b07 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -14,27 +14,27 @@ var Image = Canvas.Image; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 1/1.2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); }; exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 31/3*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Head - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); //Head - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -2.4*scale, 4.4*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); }; exp.draw_body = function(skin_canvas, model_ctx, scale) { @@ -59,12 +59,12 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); //Arm Left - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); - model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16.4*scale, 4*scale, 4.3*scale); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); //Body //Body - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12.15*scale); + model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); //Arm Right //Arm Right - Right @@ -76,7 +76,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Arm Right - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16.4*scale, 16*scale, 4*scale, 4.3*scale); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); }; exp.draw_model = function(uuid, img, scale, helm, body, callback) { From 0c90f0aff0add8825a9cdfa740d96b9232558eb5 Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 16 Dec 2014 21:29:11 -0600 Subject: [PATCH 39/50] Nearest looks better.. --- modules/renders.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index a2a1b07..0fb9a2a 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -5,12 +5,10 @@ var helpers = require('./helpers'); var logging = require('./logging'); var fs = require('fs'); - -var exp = {}; - var Canvas = require('canvas'); var Image = Canvas.Image; +var exp = {}; exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); @@ -87,6 +85,10 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { var skin_canvas = new Canvas(width, height); var model_ctx = model_canvas.getContext('2d'); var skin_ctx = skin_canvas.getContext('2d'); + model_ctx.patternQuality = "nearest"; + model_ctx.filter = "nearest"; + skin_ctx.patternQuality = "nearest"; + skin_ctx.filter = "nearest"; image.onerror = function(err) { logging.error("render error: " + err); From 4358f9e2cab1febb3ca67993796524494b7fa497 Mon Sep 17 00:00:00 2001 From: Jake Date: Wed, 17 Dec 2014 14:37:39 -0600 Subject: [PATCH 40/50] nearest looks to pixely --- modules/renders.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 0fb9a2a..deb86e6 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -85,10 +85,6 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { var skin_canvas = new Canvas(width, height); var model_ctx = model_canvas.getContext('2d'); var skin_ctx = skin_canvas.getContext('2d'); - model_ctx.patternQuality = "nearest"; - model_ctx.filter = "nearest"; - skin_ctx.patternQuality = "nearest"; - skin_ctx.filter = "nearest"; image.onerror = function(err) { logging.error("render error: " + err); From f2d4d25132e02e97a1f1ccb1de7eb5f6f7165c91 Mon Sep 17 00:00:00 2001 From: Jake Date: Wed, 17 Dec 2014 17:32:19 -0600 Subject: [PATCH 41/50] Fix helm --- modules/renders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/renders.js b/modules/renders.js index deb86e6..c4ce1d7 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -15,7 +15,7 @@ exp.draw_helmet = function(skin_canvas, model_ctx, scale) { model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale); //Helmet - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 1/1.2*scale, 8*scale, 8*scale); + model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale); //Helmet - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); From 1421bad05fb6962b25955c0f99a3b52b07a88ba3 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 18 Dec 2014 15:15:22 -0600 Subject: [PATCH 42/50] add 1.8 leg/arm support --- modules/renders.js | 114 +++++++++++++++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 35 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index c4ce1d7..4286e75 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -36,45 +36,89 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { }; exp.draw_body = function(skin_canvas, model_ctx, scale) { - //Left Leg - //Left Leg - Front - model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale); + if (skin_canvas.height == 32) { + logging.log("old skin"); + //Left Leg + //Left Leg - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale); - //Right Leg - //Right Leg - Right - model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0*scale, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale); - //Right Leg - Front - model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale); + //Right Leg + //Right Leg - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 0*scale, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale); + //Right Leg - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale); - //Arm Left - //Arm Left - Front - model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); - //Arm Left - Top - model_ctx.setTransform(-1,0.5,1,0.5,0,0); - model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); + //Arm Left + //Arm Left - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); + //Arm Left - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); - //Body - //Body - Front - model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); + //Body + //Body - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); - //Arm Right - //Arm Right - Right - model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 40*scale, 20*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale); - //Arm Right - Front - model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale); - //Arm Right - Top - model_ctx.setTransform(-1,0.5,1,0.5,0,0); - model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); + //Arm Right + //Arm Right - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 40*scale, 20*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale); + //Arm Right - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale); + //Arm Right - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); + } else { + logging.log("new skin"); + //Left Leg + //Left Leg - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 20*scale, 52*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale); + + //Right Leg + //Right Leg - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 0*scale, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale); + //Right Leg - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale); + + //Arm Left + //Arm Left - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 36*scale, 52*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); + //Arm Left - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.drawImage(skin_canvas, 36*scale, 48*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); + + //Body + //Body - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale); + + //Arm Right + //Arm Right - Right + model_ctx.setTransform(1,0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 32*scale, 52*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale); + //Arm Right - Front + model_ctx.setTransform(1,-0.5,0,1.2,0,0); + model_ctx.drawImage(skin_canvas, 36*scale, 52*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale); + //Arm Right - Top + model_ctx.setTransform(-1,0.5,1,0.5,0,0); + model_ctx.scale(-1,1); + model_ctx.drawImage(skin_canvas, 36*scale, 48*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); + } }; exp.draw_model = function(uuid, img, scale, helm, body, callback) { From 0d1ff28eca1946cc7ddf850d470a01f9b4998a56 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 18 Dec 2014 15:27:30 -0600 Subject: [PATCH 43/50] Fix skin canvas size, use scaled check against old skins --- modules/renders.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 4286e75..6cbdb77 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -36,7 +36,7 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { }; exp.draw_body = function(skin_canvas, model_ctx, scale) { - if (skin_canvas.height == 32) { + if (skin_canvas.height == 32 * scale) { logging.log("old skin"); //Left Leg //Left Leg - Front @@ -123,12 +123,6 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { exp.draw_model = function(uuid, img, scale, helm, body, callback) { var image = new Image(); - var width = 64 * scale; - var height = 64 * scale; - var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); - var skin_canvas = new Canvas(width, height); - var model_ctx = model_canvas.getContext('2d'); - var skin_ctx = skin_canvas.getContext('2d'); image.onerror = function(err) { logging.error("render error: " + err); @@ -136,6 +130,13 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { }; image.onload = function() { + var width = 64 * scale; + var height = (image.height == 32 ? 32 : 64) * scale; + var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); + var skin_canvas = new Canvas(width, height); + var model_ctx = model_canvas.getContext('2d'); + var skin_ctx = skin_canvas.getContext('2d'); + skin_ctx.drawImage(image,0,0,64,64,0,0,64,64); //Scale it scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); From 81f7288c53536d23732bef0570559908f78a5c40 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 18 Dec 2014 22:09:04 -0600 Subject: [PATCH 44/50] Fix one arm --- modules/renders.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 6cbdb77..a4dc738 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -110,14 +110,14 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Arm Right //Arm Right - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 32*scale, 52*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale); + model_ctx.drawImage(skin_canvas, 40*scale, 20*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale); //Arm Right - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 36*scale, 52*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale); + model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale); //Arm Right - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 36*scale, 48*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); + model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale); } }; From 69117f0263d23e81d23603f855253638a2135189 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 19 Dec 2014 13:44:12 -0600 Subject: [PATCH 45/50] Extra nums --- modules/renders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/renders.js b/modules/renders.js index a4dc738..11ec431 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -137,7 +137,7 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { var model_ctx = model_canvas.getContext('2d'); var skin_ctx = skin_canvas.getContext('2d'); - skin_ctx.drawImage(image,0,0,64,64,0,0,64,64); + skin_ctx.drawImage(image,0,0,64,64); //Scale it scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); if (body) { From 9182164cf7bba3e949dddde11a391940ce02e6ad Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 19 Dec 2014 20:02:10 -0600 Subject: [PATCH 46/50] Fix old skin rendering --- modules/renders.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 11ec431..a227536 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -131,15 +131,16 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { image.onload = function() { var width = 64 * scale; - var height = (image.height == 32 ? 32 : 64) * scale; + var original_height = (image.height == 32 ? 32 : 64); + var height = original_height * scale; var model_canvas = new Canvas(20 * scale, (body ? 44.8 : 17.6) * scale); var skin_canvas = new Canvas(width, height); var model_ctx = model_canvas.getContext('2d'); var skin_ctx = skin_canvas.getContext('2d'); - skin_ctx.drawImage(image,0,0,64,64); + skin_ctx.drawImage(image,0,0,64,original_height); //Scale it - scale_image(skin_ctx.getImageData(0,0,64,64), skin_ctx, 0, 0, scale); + scale_image(skin_ctx.getImageData(0,0,64,original_height), skin_ctx, 0, 0, scale); if (body) { logging.log("drawing body"); exp.draw_body(skin_canvas, model_ctx, scale); From 573278b0354049cbe13d8eb4a59998b8edbc8c51 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 20 Dec 2014 15:32:06 -0600 Subject: [PATCH 47/50] tfw :joy: :boom: :+1: :shipit: --- modules/renders.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index a227536..5393c76 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -7,8 +7,10 @@ var logging = require('./logging'); var fs = require('fs'); var Canvas = require('canvas'); var Image = Canvas.Image; - var exp = {}; + +// draws the helmet on to the +skin_canvas+ +// using the skin from the +model_ctx+ at the +scale+ exp.draw_helmet = function(skin_canvas, model_ctx, scale) { //Helmet - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); @@ -22,6 +24,8 @@ exp.draw_helmet = function(skin_canvas, model_ctx, scale) { model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); }; +// draws the head on to the +skin_canvas+ +// using the skin from the +model_ctx+ at the +scale+ exp.draw_head = function(skin_canvas, model_ctx, scale) { //Head - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); @@ -35,6 +39,9 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) { model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale); }; +// draws the body on to the +skin_canvas+ +// using the skin from the +model_ctx+ at the +scale+ +// parts are labeled as if drawn from the skin's POV exp.draw_body = function(skin_canvas, model_ctx, scale) { if (skin_canvas.height == 32 * scale) { logging.log("old skin"); @@ -82,13 +89,12 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Left Leg //Left Leg - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 20*scale, 52*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale); + model_ctx.drawImage(skin_canvas, 20*scale, 52*scale, 4*scale, 12*scale, 12*scale, 34.4/1.2*scale, 4*scale, 12*scale); //Right Leg //Right Leg - Right model_ctx.setTransform(1,0.5,0,1.2,0,0); - model_ctx.drawImage(skin_canvas, 0*scale, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale); + model_ctx.drawImage(skin_canvas, 0, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale); //Right Leg - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale); @@ -96,8 +102,7 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { //Arm Left //Arm Left - Front model_ctx.setTransform(1,-0.5,0,1.2,0,0); - model_ctx.scale(-1,1); - model_ctx.drawImage(skin_canvas, 36*scale, 52*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale); + model_ctx.drawImage(skin_canvas, 36*scale, 52*scale, 4*scale, 12*scale, 16*scale, 20/1.2*scale, 4*scale, 12*scale); //Arm Left - Top model_ctx.setTransform(-1,0.5,1,0.5,0,0); model_ctx.drawImage(skin_canvas, 36*scale, 48*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale); From a2f40045a9e6b163200eec611f0d7079ff7c013b Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 20 Dec 2014 15:44:38 -0600 Subject: [PATCH 48/50] update code docs --- modules/renders.js | 10 +++++++++- modules/skins.js | 2 ++ routes/renders.js | 7 ++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/renders.js b/modules/renders.js index 5393c76..ebc19cd 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -1,4 +1,4 @@ -// Skin locations are based on the work of Confuser +// Skin locations are based on the work of Confuser, with 1.8 updates by Jake0oo0 // https://github.com/confuser/serverless-mc-skin-viewer // Permission to use & distribute https://github.com/confuser/serverless-mc-skin-viewer/blob/master/LICENSE @@ -126,6 +126,10 @@ exp.draw_body = function(skin_canvas, model_ctx, scale) { } }; +// sets up the necessary components to draw the skin model +// uses the +img+ skin from the +uuid+ with options of drawing +// the +helm+ and the +body+ +// callback contains error, image buffer exp.draw_model = function(uuid, img, scale, helm, body, callback) { var image = new Image(); @@ -168,6 +172,8 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { image.src = img; }; +// helper method to open a render from +renderpath+ +// callback contains error, image buffer exp.open_render = function(renderpath, callback) { fs.readFile(renderpath, function (err, buf) { if (err) { @@ -177,6 +183,8 @@ exp.open_render = function(renderpath, callback) { }); }; +// scales an image from the +imagedata+ onto the +context+ +// scaled by a factor of +scale+ with options +d_x+ and +d_y+ function scale_image(imageData, context, d_x, d_y, scale) { var width = imageData.width; var height = imageData.height; diff --git a/modules/skins.js b/modules/skins.js index f642fb8..0681733 100644 --- a/modules/skins.js +++ b/modules/skins.js @@ -93,6 +93,8 @@ exp.default_skin = function(uuid) { } }; +// helper method for opening a skin file from +skinpath+ +// callback contains error, image buffer exp.open_skin = function(skinpath, callback) { fs.readFile(skinpath, function (err, buf) { if (err) { diff --git a/routes/renders.js b/routes/renders.js index 2a03dcf..05f3896 100644 --- a/routes/renders.js +++ b/routes/renders.js @@ -77,6 +77,9 @@ router.get('/:type/:uuid.:ext?', function(req, res) { handle_default(500, status); } + + // default alex/steve images can be rendered, but + // custom images will not be function handle_default(http_status, img_status) { if (def && def != "steve" && def != "alex") { res.writeHead(301, { @@ -91,8 +94,10 @@ router.get('/:type/:uuid.:ext?', function(req, res) { def = def || skins.default_skin(uuid); fs.readFile("public/images/" + def + "_skin.png", function (err, buf) { if (err) { - logging.error("error rendering default image: " + err); + // errored while loading the default image, continuing with null image + logging.error("error loading default render image: " + err); } + // we render the default skins, but not custom images renders.draw_model(uuid, buf, scale, helm, body, function(err, def_img) { if (err) { logging.log("error while rendering default image: " + err); From 0bd2371fcaa1dc4e134b21f160ec0994f586066e Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 26 Dec 2014 00:06:54 -0600 Subject: [PATCH 49/50] Add render tests in new format --- test/test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/test.js b/test/test.js index 90992bb..2239ce7 100644 --- a/test/test.js +++ b/test/test.js @@ -205,6 +205,15 @@ describe("Crafatar", function() { }); }); + describe("Networking: Render", function() { + it("should not fail (uuid)", function(done) { + helpers.get_render(id, 6, true, true, function(err, hash, img) { + assert.strictEqual(err, null); + done(); + }); + }); + }); + describe("Errors", function() { before(function() { cache.get_redis().flushall(); From a370cf31603cf11f2a49b0dc8445c567ac8861e0 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 26 Dec 2014 00:15:04 -0600 Subject: [PATCH 50/50] Test both types of skins --- test/test.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/test.js b/test/test.js index 2239ce7..605ab7c 100644 --- a/test/test.js +++ b/test/test.js @@ -206,14 +206,24 @@ describe("Crafatar", function() { }); describe("Networking: Render", function() { - it("should not fail (uuid)", function(done) { - helpers.get_render(id, 6, true, true, function(err, hash, img) { + it("should not fail (username, 64x64 skin)", function(done) { + helpers.get_render("Jake0oo0", 6, true, true, function(err, hash, img) { assert.strictEqual(err, null); done(); }); }); }); + describe("Networking: Render", function() { + it("should not fail (username, 32x64 skin)", function(done) { + helpers.get_render("md_5", 6, true, true, function(err, hash, img) { + assert.strictEqual(err, null); + done(); + }); + }); + }); + + describe("Errors", function() { before(function() { cache.get_redis().flushall();