mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
201 lines
No EOL
3.9 KiB
JavaScript
201 lines
No EOL
3.9 KiB
JavaScript
//
|
|
// paint.js
|
|
// examples
|
|
//
|
|
// Created by Eric Levin on 6/4/15.
|
|
// Copyright 2014 High Fidelity, Inc.
|
|
//
|
|
// This script allows you to paint with the hydra or mouse!
|
|
//
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
var LINE_DIMENSIONS = 5;
|
|
var LIFETIME = 6000;
|
|
|
|
var colorPalette = [{
|
|
red: 236,
|
|
green: 208,
|
|
blue: 120
|
|
}, {
|
|
red: 214,
|
|
green: 91,
|
|
blue: 67
|
|
}, {
|
|
red: 192,
|
|
green: 41,
|
|
blue: 66
|
|
}, {
|
|
red: 84,
|
|
green: 36,
|
|
blue: 55
|
|
}, {
|
|
red: 83,
|
|
green: 119,
|
|
blue: 122
|
|
}];
|
|
|
|
var currentColorIndex = 0;
|
|
var currentColor = colorPalette[currentColorIndex];
|
|
|
|
function cycleColor() {
|
|
currentColor = colorPalette[++currentColorIndex];
|
|
if (currentColorIndex === colorPalette.length - 1) {
|
|
currentColorIndex = -1;
|
|
}
|
|
|
|
}
|
|
|
|
MousePaint();
|
|
|
|
function MousePaint() {
|
|
var DRAWING_DISTANCE = 5;
|
|
var lines = [];
|
|
var isDrawing = false;
|
|
|
|
var LINE_WIDTH = 7;
|
|
var line, linePosition;
|
|
|
|
var BRUSH_SIZE = .05;
|
|
|
|
var brush = Entities.addEntity({
|
|
type: 'Sphere',
|
|
position: {
|
|
x: 0,
|
|
y: 0,
|
|
z: 0
|
|
},
|
|
color: currentColor,
|
|
dimensions: {
|
|
x: BRUSH_SIZE,
|
|
y: BRUSH_SIZE,
|
|
z: BRUSH_SIZE
|
|
}
|
|
});
|
|
|
|
|
|
function newLine(position) {
|
|
linePosition = position;
|
|
line = Entities.addEntity({
|
|
position: position,
|
|
type: "Line",
|
|
color: currentColor,
|
|
dimensions: {
|
|
x: LINE_DIMENSIONS,
|
|
y: LINE_DIMENSIONS,
|
|
z: LINE_DIMENSIONS
|
|
},
|
|
linePoints: [],
|
|
lineWidth: LINE_WIDTH,
|
|
lifetime: LIFETIME
|
|
});
|
|
lines.push(line);
|
|
}
|
|
|
|
|
|
function mouseMoveEvent(event) {
|
|
|
|
var worldPoint = computeWorldPoint(event);
|
|
Entities.editEntity(brush, {
|
|
position: worldPoint
|
|
});
|
|
|
|
if (!isDrawing) {
|
|
return;
|
|
}
|
|
|
|
var localPoint = computeLocalPoint(event)
|
|
var success = Entities.appendPoint(line, localPoint);
|
|
|
|
if (!success) {
|
|
newLine(worldPoint);
|
|
Entities.appendPoint(line, computeLocalPoint(event));
|
|
}
|
|
}
|
|
|
|
function undoStroke() {
|
|
var deletedLine = lines.pop();
|
|
var deletedLineProps = Entities.getEntityProperties(deletedLine);
|
|
deletedLines.push(deletedLineProps);
|
|
Entities.deleteEntity(deletedLine);
|
|
}
|
|
|
|
function redoStroke() {
|
|
var restoredLine = Entities.addEntity(deletedLines.pop());
|
|
Entities.addEntity(restoredLine);
|
|
lines.push(restoredLine);
|
|
}
|
|
|
|
function computeWorldPoint(event) {
|
|
var pickRay = Camera.computePickRay(event.x, event.y);
|
|
var addVector = Vec3.multiply(Vec3.normalize(pickRay.direction), DRAWING_DISTANCE);
|
|
return Vec3.sum(Camera.getPosition(), addVector);
|
|
}
|
|
|
|
function computeLocalPoint(event) {
|
|
|
|
var localPoint = Vec3.subtract(computeWorldPoint(event), linePosition);
|
|
return localPoint;
|
|
}
|
|
|
|
function mousePressEvent(event) {
|
|
if (!event.isLeftButton) {
|
|
isDrawing = false;
|
|
return;
|
|
}
|
|
newLine(computeWorldPoint(event));
|
|
isDrawing = true;
|
|
|
|
}
|
|
|
|
function mouseReleaseEvent() {
|
|
isDrawing = false;
|
|
}
|
|
|
|
function keyPressEvent(event) {
|
|
if (event.text === "SPACE") {
|
|
cycleColor();
|
|
Entities.editEntity(brush, {
|
|
color: currentColor
|
|
});
|
|
}
|
|
if (event.text === "z") {
|
|
undoStroke();
|
|
}
|
|
if (event.text === "x") {
|
|
redoStroke();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function cleanup() {
|
|
lines.forEach(function(line) {
|
|
// Entities.deleteEntity(line);
|
|
});
|
|
Entities.deleteEntity(brush);
|
|
|
|
}
|
|
|
|
Controller.mousePressEvent.connect(mousePressEvent);
|
|
Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
|
|
Controller.mouseMoveEvent.connect(mouseMoveEvent);
|
|
Script.scriptEnding.connect(cleanup);
|
|
|
|
Controller.keyPressEvent.connect(keyPressEvent);
|
|
}
|
|
|
|
|
|
function randFloat(low, high) {
|
|
return low + Math.random() * (high - low);
|
|
}
|
|
|
|
|
|
function randInt(low, high) {
|
|
return Math.floor(randFloat(low, high));
|
|
}
|
|
|
|
function map(value, min1, max1, min2, max2) {
|
|
return min2 + (max2 - min2) * ((value - min1) / (max1 - min1));
|
|
} |