|
|
|
@@ -11,6 +11,12 @@ let dragOffsetY = null; |
|
|
|
|
|
|
|
let altHeld = false; |
|
|
|
|
|
|
|
const unitChoices = { |
|
|
|
length: [ |
|
|
|
"meters", |
|
|
|
"kilometers" |
|
|
|
] |
|
|
|
} |
|
|
|
const config = { |
|
|
|
height: math.unit(10, "meters"), |
|
|
|
minLineSize: 50, |
|
|
|
@@ -59,9 +65,11 @@ function updateEntityElement(entity, element) { |
|
|
|
element.style.left = position.x + "px"; |
|
|
|
element.style.top = position.y + "px"; |
|
|
|
const canvasHeight = document.querySelector("#display").clientHeight; |
|
|
|
const pixels = math.divide(entity.views[view].height, config.height) * canvasHeight; |
|
|
|
const pixels = math.divide(entity.views[view].height, config.height) * (canvasHeight - 100); |
|
|
|
element.style.setProperty("--height", pixels + "px"); |
|
|
|
|
|
|
|
element.querySelector(".entity-name").innerText = entity.name; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
function updateSizes() { |
|
|
|
@@ -163,7 +171,8 @@ function makeEntity() { |
|
|
|
height: { |
|
|
|
name: "Height", |
|
|
|
power: 1, |
|
|
|
base: math.unit(Math.random() * 1 + 1, "meter") |
|
|
|
type: "length", |
|
|
|
base: math.unit(1, "meter") |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -181,7 +190,7 @@ function makeEntity() { |
|
|
|
return math.multiply(Math.pow(this.parent.scale, this.attributes[key].power), this.attributes[key].base); |
|
|
|
}, |
|
|
|
set: function(value) { |
|
|
|
const newScale = Math.pow(math.divide(value, this.attributes[key].base), this.attributes[key]/power); |
|
|
|
const newScale = Math.pow(math.divide(value, this.attributes[key].base), this.attributes[key].power); |
|
|
|
this.parent.scale = newScale; |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -274,6 +283,30 @@ function configEntityOptions(entity) { |
|
|
|
scaleRow.appendChild(scaleInput); |
|
|
|
holder.appendChild(scaleLabel); |
|
|
|
holder.appendChild(scaleRow); |
|
|
|
|
|
|
|
const nameLabel = document.createElement("div"); |
|
|
|
nameLabel.classList.add("options-label"); |
|
|
|
nameLabel.innerText = "Name"; |
|
|
|
|
|
|
|
const nameRow = document.createElement("div"); |
|
|
|
nameRow.classList.add("options-row"); |
|
|
|
|
|
|
|
const nameInput = document.createElement("input"); |
|
|
|
nameInput.classList.add("options-field-text"); |
|
|
|
nameInput.value = entity.name; |
|
|
|
|
|
|
|
nameInput.addEventListener("input", e => { |
|
|
|
entity.name = e.target.value; |
|
|
|
updateSizes(); |
|
|
|
}) |
|
|
|
|
|
|
|
nameRow.appendChild(nameInput); |
|
|
|
|
|
|
|
holder.appendChild(nameLabel); |
|
|
|
holder.appendChild(nameRow); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
function clearEntityOptions() { |
|
|
|
@@ -283,11 +316,56 @@ function clearEntityOptions() { |
|
|
|
} |
|
|
|
|
|
|
|
function configViewOptions(entity, view) { |
|
|
|
const holder = document.querySelector("#options-view"); |
|
|
|
|
|
|
|
holder.innerHTML = ""; |
|
|
|
|
|
|
|
Object.entries(entity.views[view].attributes).forEach(([key, val]) => { |
|
|
|
const label = document.createElement("div"); |
|
|
|
label.classList.add("options-label"); |
|
|
|
label.innerText = val.name; |
|
|
|
|
|
|
|
holder.appendChild(label); |
|
|
|
|
|
|
|
const row = document.createElement("div"); |
|
|
|
row.classList.add("options-row"); |
|
|
|
|
|
|
|
holder.appendChild(row); |
|
|
|
|
|
|
|
const input = document.createElement("input"); |
|
|
|
input.classList.add("options-field-numeric"); |
|
|
|
|
|
|
|
input.value = entity.views[view][key].value; |
|
|
|
|
|
|
|
const unit = document.createElement("select"); |
|
|
|
|
|
|
|
unitChoices[val.type].forEach(name => { |
|
|
|
const option = document.createElement("option"); |
|
|
|
option.innerText = name; |
|
|
|
unit.appendChild(option); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
input.addEventListener("input", e => { |
|
|
|
entity.views[view][key] = math.unit(input.value, unit.value); |
|
|
|
updateSizes(); |
|
|
|
}); |
|
|
|
|
|
|
|
unit.addEventListener("input", e => { |
|
|
|
entity.views[view][key] = math.unit(input.value, unit.value); |
|
|
|
updateSizes(); |
|
|
|
}); |
|
|
|
|
|
|
|
row.appendChild(input); |
|
|
|
row.appendChild(unit); |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
function clearViewOptions(entity, view) { |
|
|
|
const holder = document.querySelector("#options-view"); |
|
|
|
|
|
|
|
holder.innerHTML = ""; |
|
|
|
} |
|
|
|
|
|
|
|
// this is a crime against humanity, and also stolen from |
|
|
|
@@ -308,14 +386,11 @@ function testClick(event) { |
|
|
|
h = testCtx.canvas.height = target.height, |
|
|
|
alpha; |
|
|
|
|
|
|
|
console.log(x, y); |
|
|
|
// Draw image to canvas |
|
|
|
// and read Alpha channel value |
|
|
|
testCtx.drawImage(target, 0, 0, w, h); |
|
|
|
alpha = testCtx.getImageData(x, y, 1, 1).data[3]; // [0]R [1]G [2]B [3]A |
|
|
|
|
|
|
|
|
|
|
|
console.log(alpha) |
|
|
|
// If pixel is transparent, |
|
|
|
// retrieve the element underneath and trigger it's click event |
|
|
|
if (alpha === 0) { |
|
|
|
|