overte/unpublishedScripts/marketplace/gameTable/createGameTable.js
2017-04-17 13:16:10 +02:00

252 lines
6.7 KiB
JavaScript

//
// Created by Thijs Wenker on 3/31/2017
// Copyright 2017 High Fidelity, Inc.
//
// Revision of James B. Pollack's work on GamesTable in 2016
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
var TABLE_MODEL_URL = Script.resolvePath('assets/table/gameTable.fbx');
var MODEL_URL = Script.resolvePath('assets/table/finalFrame.fbx');
var TABLE_SCRIPT_URL = Script.resolvePath('table.js');
var ENTITY_SPAWNER_SCRIPT_URL = Script.resolvePath('entitySpawner.js');
var NEXT_GAME_BUTTON_SCRIPT_URL = Script.resolvePath('nextGameButton.js');
var RESET_BUTTON_SCRIPT_URL = Script.resolvePath('resetGameButton.js');
var TABLE_PICTURE_URL = Script.resolvePath('assets/mats/Table-default.jpg');
var NEXT_BUTTON_MODEL_URL = Script.resolvePath('assets/buttons/button-next.fbx');
var RESET_BUTTON_MODEL_URL = Script.resolvePath('assets/buttons/button-reset.fbx');
// FIXME: CHANGE TO Quat.getForward when supported
var front = Quat.getFront(MyAvatar.orientation);
var avatarHalfDown = MyAvatar.position;
var TABLE_START_POSITION = Vec3.sum(avatarHalfDown, Vec3.multiply(2, front));
var table, entitySpawner, mat;
var nextGameButton, resetGameButton;
var entitySpawnerOffset = {
forward: 0,
vertical: 1,
right: 0
};
var matOffset = {
forward: 0,
vertical: 0.545,
right: 0
};
var nextGameButtonOffset = {
forward: -0.2,
vertical: 0.45,
right: -0.65
};
var resetGameButtonOffset = {
forward: 0.2,
vertical: 0.45,
right: -0.65
};
function getOffsetFromTable(forward, vertical, right) {
var properties = Entities.getEntityProperties(table, ['position', 'rotation']);
var position = properties.position;
var frontVector = Quat.getFront(properties.rotation);
var upVector = Quat.getUp(properties.rotation);
var rightVector = Quat.getRight(properties.rotation);
if (forward !== undefined) {
position = Vec3.sum(position, Vec3.multiply(frontVector, forward));
}
if (vertical !== undefined) {
position = Vec3.sum(position, Vec3.multiply(upVector, vertical));
}
if (right !== undefined) {
position = Vec3.sum(position, Vec3.multiply(rightVector, right));
}
return position;
}
function createTable() {
table = Entities.addEntity({
type: 'Model',
name: 'GameTable Table 1',
description: 'hifi:gameTable:table',
modelURL: TABLE_MODEL_URL,
shapeType: 'box',
dynamic: true,
gravity: {
x: 0,
y: -3.0,
z: 0
},
density: 8000,
restitution: 0,
damping: 0.9,
angularDamping: 0.8,
friction: 1,
dimensions: {
x: 1.355,
y: 1.1121,
z: 1.355
},
velocity: {
x: 0.0,
y: -0.1,
z: 0.0
},
script: TABLE_SCRIPT_URL,
position: TABLE_START_POSITION,
userData: JSON.stringify({
grabbableKey: {
grabbable: true
}
})
});
}
function createEntitySpawner() {
entitySpawner = Entities.addEntity({
type: 'Zone',
visible: false,
name: 'GameTable Entity Spawner',
collisionless: true,
description: 'hifi:gameTable:entitySpawner',
color: {
red: 0,
green: 255,
blue: 0
},
dimensions: {
x: 0.25,
y: 0.25,
z: 0.25
},
script: ENTITY_SPAWNER_SCRIPT_URL,
parentID: table,
position: getOffsetFromTable(entitySpawnerOffset.forward, entitySpawnerOffset.vertical, entitySpawnerOffset.right)
});
}
function createMat() {
return Entities.addEntity({
type: 'Model',
modelURL: MODEL_URL,
name: 'GameTable Mat',
description: 'hifi:gameTable:mat',
collisionless: true,
color: {
red: 0,
green: 0,
blue: 255
},
restitution: 0,
friction: 1,
dimensions: {
x: 1.045,
y: 1.045,
z: 0.025
},
rotation: Quat.fromPitchYawRollDegrees(90, 0, 0),
textures: JSON.stringify({
Picture: TABLE_PICTURE_URL
}),
parentID: table,
position: getOffsetFromTable(matOffset.forward, matOffset.vertical, matOffset.right),
userData: JSON.stringify({
grabbableKey: {
grabbable: false
}
})
});
}
function createNextGameButton() {
nextGameButton = Entities.addEntity({
type: 'Model',
modelURL: NEXT_BUTTON_MODEL_URL,
name: 'GameTable Next Button',
description: 'hifi:gameTable:nextGameButton',
collisionless: true,
color: {
red: 0,
green: 0,
blue: 255
},
dimensions: {
x: 0.0625,
y: 0.1250,
z: 0.1250
},
rotation: Quat.angleAxis(180, {
x: 0,
y: 1,
z: 0
}),
parentID: table,
script: NEXT_GAME_BUTTON_SCRIPT_URL,
position: getOffsetFromTable(nextGameButtonOffset.forward, nextGameButtonOffset.vertical,
nextGameButtonOffset.right),
userData: JSON.stringify({
grabbableKey: {
wantsTrigger: true
}
})
});
}
function createResetGameButton() {
resetGameButton = Entities.addEntity({
type: 'Model',
modelURL: RESET_BUTTON_MODEL_URL,
name: 'GameTable Reset Button',
description: 'hifi:gameTable:resetGameButton',
collisionless: true,
color: {
red: 255,
green: 0,
blue: 0
},
dimensions: {
x: 0.0628,
y: 0.1248,
z: 0.1317
},
rotation: Quat.angleAxis(180, {
x: 0,
y: 1,
z: 0
}),
parentID: table,
script: RESET_BUTTON_SCRIPT_URL,
position: getOffsetFromTable(resetGameButtonOffset.forward, resetGameButtonOffset.vertical,
resetGameButtonOffset.right),
userData: JSON.stringify({
grabbableKey: {
wantsTrigger: true
}
})
});
}
function makeTable() {
createTable();
createMat();
createEntitySpawner();
createResetGameButton();
createNextGameButton();
}
function cleanup() {
Entities.deleteEntity(table);
Entities.deleteEntity(mat);
Entities.deleteEntity(entitySpawner);
Entities.deleteEntity(nextGameButton);
Entities.deleteEntity(resetGameButton);
}
Script.scriptEnding.connect(cleanup);
makeTable();