blockbench/js/util.js

509 lines
11 KiB
JavaScript
Raw Normal View History

2018-10-17 19:50:25 +02:00
//Blockbench
function compareVersions(string1/*new*/, string2/*old*/) {
// Is string1 newer than string2 ?
var arr1 = string1.split('.')
var arr2 = string2.split('.')
var i = 0;
var num1 = 0;
var num2 = 0;
while (i < arr1.length) {
num1 = parseInt(arr1[i])
num2 = parseInt(arr2[i])
if (num1 > num2) {
return true;
} else if (num1 < num2) {
return false
}
i++;
}
return false;
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
function useBedrockFlipFix(axis) {
2019-07-17 18:02:07 +02:00
if (Format.bone_rig === false) return false;
2018-10-17 19:50:25 +02:00
if (typeof axis === 'string') {
axis = getAxisNumber(axis)
}
var group;
2019-07-17 18:02:07 +02:00
if (Group.selected) {
var group = Group.selected
2018-10-17 19:50:25 +02:00
} else {
var i = 0;
while (i < selected.length) {
if (typeof selected[i].parent === 'object' &&
selected[i].parent.type === 'group'
) {
var group = selected[i].parent
}
i++;
}
}
if (group) {
var rotations = group.rotation.slice()
rotations.splice(axis, 1)
rotations.forEach(function(r, i) {
rotations[i] = (r >= -90 && r <= 90)
})
return rotations[0] !== rotations[1]
} else {
return false
}
2018-03-28 20:48:11 +02:00
}
2018-12-27 14:03:04 +01:00
const Condition = function(condition, context) {
if (condition !== undefined && condition !== null && condition.condition !== undefined) {
condition = condition.condition
}
if (condition === undefined) {
return true;
} else if (typeof condition === 'function') {
return condition(context)
} else {
return !!condition
}
}
2019-02-03 21:09:35 +01:00
class oneLiner {
constructor(data) {
if (data !== undefined) {
for (var key in data) {
if (data.hasOwnProperty(key)) {
this[key] = data[key]
}
}
}
}
}
2018-10-17 19:50:25 +02:00
var cl = console.log
var asyncLoop = function(o){
var i=-1;
var async_loop = function(){
i++;
if(i==o.length){o.callback(); return;}
o.functionToLoop(async_loop, i);
}
async_loop();//init
2018-04-05 17:11:29 +02:00
}
2019-04-12 18:44:18 +02:00
Date.prototype.getTimestamp = function() {
var l2 = i => (i.toString().length === 1 ? '0'+i : i);
return l2(this.getHours()) + ':' + l2(this.getMinutes());
}
2019-03-09 22:06:35 +01:00
//Jquery
$.fn.deepest = function() {
if (!this.length) return this;
var opts = []
this.each((i, node) => {
var i = 0;
var obj = $(node)
while (obj.parent().get(0) instanceof HTMLBodyElement === false) {
obj = obj.parent()
i++;
}
opts.push({depth: i, o: node})
})
opts.sort((a, b) => (a.depth < b.depth));
return $(opts[0].o)
}
2017-10-26 19:00:52 +02:00
2018-10-17 19:50:25 +02:00
//Math
2017-10-26 19:00:52 +02:00
function guid() {
2018-10-17 19:50:25 +02:00
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
2017-10-26 19:00:52 +02:00
}
2019-03-09 22:06:35 +01:00
function isUUID(s) {
return (s.length === 36 && s.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/))
}
2019-02-03 21:09:35 +01:00
function bbuid(l) {
l = l || 1
let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
var s = '';
while (l > 0) {
var n = Math.floor(Math.random()*62)
if (n > 9) {
n = chars[n-10]
}
s += n
l--;
}
return s;
}
2018-04-15 16:06:43 +02:00
Math.radToDeg = function(rad) {
2018-12-02 19:37:06 +01:00
return rad / Math.PI * 180
2018-04-15 16:06:43 +02:00
}
Math.degToRad = function(deg) {
2018-10-17 19:50:25 +02:00
return Math.PI / (180 /deg)
2018-04-15 16:06:43 +02:00
}
2018-04-28 00:11:32 +02:00
Math.roundTo = function(num, digits) {
2018-10-17 19:50:25 +02:00
var d = Math.pow(10,digits)
return Math.round(num * d) / d
2018-04-28 00:11:32 +02:00
}
2018-10-23 21:49:04 +02:00
Math.lerp = function(a,b,m) {
return (m-a) / (b-a)
}
2018-11-11 21:19:08 +01:00
Math.isBetween = function(n, a, b) {
return (n - a) * (n - b) <= 0
}
2018-12-27 14:03:04 +01:00
Math.trimDeg = function(a) {
return (a+180*15)%360-180
}
2019-07-17 18:02:07 +02:00
Math.isPowerOfTwo = function(x) {
return (x > 1) && ((x & (x - 1)) == 0);
}
Math.randomab = function(a, b) {
return a + Math.random()*(b-a);
}
2018-10-17 19:50:25 +02:00
function trimFloatNumber(val) {
if (val == '') return val;
var string = val.toFixed(4)
string = string.replace(/0+$/g, '').replace(/\.$/g, '')
return string;
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
function getAxisLetter(number) {
switch (number) {
case 0: return 'x'; break;
case 1: return 'y'; break;
case 2: return 'z'; break;
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
function getAxisNumber(letter) {
switch (letter.toLowerCase()) {
case 'x': return 0; break;
case 'y': return 1; break;
case 'z': return 2; break;
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
function limitNumber(number, min, max) {
if (number > max) number = max;
2018-12-02 19:37:06 +01:00
if (number < min || isNaN(number)) number = min;
2018-10-17 19:50:25 +02:00
return number;
2017-10-26 19:00:52 +02:00
}
2019-02-03 21:09:35 +01:00
Math.clamp = limitNumber;
2018-10-17 19:50:25 +02:00
function getRectangle(a, b, c, d) {
var rect = {};
if (!b && typeof a === 'object') {
rect = a
} else if (typeof a === 'object' && a.x) {
rect.ax = a.x
rect.ay = a.y
2017-10-26 19:00:52 +02:00
2018-10-17 19:50:25 +02:00
rect.bx = b.x
rect.by = b.y
} else {
rect.ax = a
rect.ay = b
if (typeof c === 'number' && typeof d === 'number') {
rect.bx = c
rect.by = d
} else {
rect.bx = a
rect.by = b
}
}
if (rect.ax > rect.bx) {
[rect.ax, rect.bx] = [rect.bx, rect.ax]
}
if (rect.ay > rect.by) {
[rect.ay, rect.by] = [rect.by, rect.ay]
}
rect.x = rect.bx - rect.ax
rect.y = rect.by - rect.ay
return rect;
}
function doRectanglesOverlap(rect1, rect2) {
if (rect1.ax > rect2.bx || rect2.ax > rect1.bx) {
return false
}
if (rect1.ay > rect2.by || rect2.ay > rect1.by) {
return false
}
return true;
}
2017-10-26 19:00:52 +02:00
2019-07-17 18:02:07 +02:00
//Date
Number.prototype.toDigitString = function(digits) {
if (!digits) digits = 1;
var s = this.toString();
var l = s.length
for (var i = 0; i < (digits-l); i++) {
s = '0'+s;
}
return s;
}
Date.prototype.getDateArray = function() {
return [
this.getDate(),
this.getMonth()+1,
this.getYear()+1900
];
}
Date.prototype.getDateString = function() {
var a = this.getDateArray();
return `${a[0].toDigitString(2)}.${a[1].toDigitString(2)}.${a[2]}`;
}
Date.prototype.dayOfYear = function() {
var start = new Date(this.getFullYear(), 0, 0);
var diff = this - start;
var oneDay = 1000 * 60 * 60 * 24;
return Math.floor(diff / oneDay);
}
2018-10-17 19:50:25 +02:00
//Array
2018-12-02 19:37:06 +01:00
Array.prototype.safePush = function(item) {
if (!this.includes(item)) {
2018-12-27 14:03:04 +01:00
this.push(item);
return true;
2018-12-02 19:37:06 +01:00
}
2018-12-27 14:03:04 +01:00
return false;
2018-12-02 19:37:06 +01:00
}
2018-10-17 19:50:25 +02:00
Array.prototype.equals = function (array) {
2019-07-17 18:02:07 +02:00
if (!array)
return false;
2017-10-26 19:00:52 +02:00
2019-07-17 18:02:07 +02:00
if (this.length != array.length)
return false;
2017-10-26 19:00:52 +02:00
2019-07-17 18:02:07 +02:00
for (var i = 0, l=this.length; i < l; i++) {
if (this[i] instanceof Array && array[i] instanceof Array) {
if (!this[i].equals(array[i]))
return false;
}
else if (this[i] != array[i]) {
return false;
}
}
return true;
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
Array.prototype.remove = function (item) { {
var index = this.indexOf(item)
if (index > -1) {
this.splice(index, 1)
return index;
}
return false;
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
Array.prototype.empty = function() {
this.length = 0;
2019-02-03 21:09:35 +01:00
return this;
2017-10-26 19:00:52 +02:00
}
2019-04-12 18:44:18 +02:00
Array.prototype.purge = function() {
this.length = Math.clamp(this.length, 0, 1);
this.splice(0, 1)
return this;
}
2017-10-26 19:00:52 +02:00
Array.prototype.findInArray = function(key, value) {
2019-01-09 15:54:35 +01:00
for (var i = 0; i < this.length; i++) {
2018-10-17 19:50:25 +02:00
if (this[i][key] === value) return this[i]
}
2019-01-09 15:54:35 +01:00
return false;
2017-10-26 19:00:52 +02:00
}
2019-07-17 18:02:07 +02:00
Array.prototype.last = function() {
return this[this.length-1];
}
2018-10-17 19:50:25 +02:00
Array.prototype.positiveItems = function() {
var x = 0, i = 0;
while (i < this.length) {
if (this[i]) x++;
i++;
}
return x;
}
2018-12-02 19:37:06 +01:00
Array.prototype.allEqual = function(s) {
var i = 0;
while (i < this.length) {
if (this[i] !== s) {
return false;
}
i++;
}
return true;
}
2019-04-07 18:53:33 +02:00
Array.prototype.random = function() {
return this[Math.floor(Math.random()*this.length)]
}
2019-07-17 18:02:07 +02:00
Array.prototype.forEachReverse = function(cb) {
var i = this.length;
for (var i = this.length-1; i >= 0; i--) {
cb(this[i], i);
}
}
2018-10-17 19:50:25 +02:00
//Object
Object.defineProperty(Array.prototype, "equals", {enumerable: false});
2017-10-26 19:00:52 +02:00
2018-10-17 19:50:25 +02:00
function omitKeys(obj, keys, dual_level) {
var dup = {};
for (key in obj) {
if (keys.indexOf(key) == -1) {
if (dual_level === true && typeof obj[key] === 'object') {
dup[key] = {}
for (key2 in obj[key]) {
if (keys.indexOf(key2) == -1) {
dup[key][key2] = obj[key][key2];
}
}
} else {
dup[key] = obj[key];
}
}
}
return dup;
}
2017-10-26 19:00:52 +02:00
function get (options, name, defaultValue) {
2018-10-17 19:50:25 +02:00
return (name in options ? options[name] : defaultValue)
2017-10-26 19:00:52 +02:00
}
function getKeyByValue(object, value) {
2018-10-17 19:50:25 +02:00
return Object.keys(object).find(key => object[key] === value);
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
var Objector = {
equalKeys: function(obj, ref) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (!ref.hasOwnProperty(key)) {
return false;
}
}
}
for (var key in ref) {
if (ref.hasOwnProperty(key)) {
if (!obj.hasOwnProperty(key)) {
return false;
}
}
}
return true;
},
keyLength: function(obj) {
var l = 0;
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
l++;
}
}
return l;
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
var Merge = {
number: function(obj, source, index) {
if (source[index] !== undefined) {
var val = source[index]
if (typeof val === 'number' && !isNaN(val)) {
obj[index] = val
} else {
val = parseFloat(val)
if (typeof val === 'number' && !isNaN(val)) {
obj[index] = val
}
}
}
},
string: function(obj, source, index) {
if (source[index] !== undefined) {
var val = source[index]
if (typeof val === 'string') {
obj[index] = val
} else {
obj[index] = val+''
}
}
},
boolean: function(obj, source, index) {
if (source[index] !== undefined) {
obj[index] = source[index]
}
2019-07-17 18:02:07 +02:00
},
function: function(obj, source, index) {
if (typeof source[index] === 'function') {
obj[index] = source[index]
}
2018-10-17 19:50:25 +02:00
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
//String
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function autoStringify(object) {
return compileJSON(object, {small: settings.minifiedout.value})
}
2017-10-26 19:00:52 +02:00
function pluralS(arr) {
2018-10-17 19:50:25 +02:00
if (arr.length === 1 || arr === 1) {
return '';
} else {
return 's';
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
function pathToName(path, extension) {
var path_array = path.split('/').join('\\').split('\\')
if (extension === true) {
return path_array[path_array.length-1]
} else {
2018-10-23 21:49:04 +02:00
return path_array[path_array.length-1].replace(/\.\w+$/, '')
2018-10-17 19:50:25 +02:00
}
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
function pathToExtension(path) {
var matches = path.match(/\.\w{2,24}$/)
if (!matches || !matches.length) return '';
return matches[0].replace('.', '').toLowerCase()
2017-10-26 19:00:52 +02:00
}
2018-10-17 19:50:25 +02:00
//Color
tinycolor.prototype.toInt = function() {
var rgba = this.toRgb()
return Jimp.rgbaToInt(rgba.r, rgba.g, rgba.b, rgba.a)
2017-10-26 19:00:52 +02:00
}
2018-12-27 14:03:04 +01:00
function getAverageRGB(imgEl, blockSize) {
2018-10-17 19:50:25 +02:00
2018-12-27 14:03:04 +01:00
var defaultRGB = {r:0,g:0,b:0}, // for non-supporting envs
canvas = document.createElement('canvas'),
context = canvas.getContext && canvas.getContext('2d'),
data, width, height,
i = -4,
length,
rgb = {r:0,g:0,b:0},
count = 0;
if (!context) {
return defaultRGB;
}
height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;
width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;
context.drawImage(imgEl, 0, 0);
try {
data = context.getImageData(0, 0, width, height);
} catch(e) {
/* security error, img on diff domain */alert('x');
return defaultRGB;
}
length = data.data.length;
if (!blockSize) blockSize = Math.ceil(length/64)
while ( (i += blockSize * 4) < length ) {
if (data.data[i+3] > 0) {
++count;
rgb.r += data.data[i];
rgb.g += data.data[i+1];
rgb.b += data.data[i+2];
2018-10-17 19:50:25 +02:00
}
2018-12-27 14:03:04 +01:00
}
// ~~ used to floor values
rgb.r = ~~(rgb.r/count);
rgb.g = ~~(rgb.g/count);
rgb.b = ~~(rgb.b/count);
return rgb;
2017-11-16 22:23:41 +01:00
}
2018-10-17 19:50:25 +02:00