content/hifi-content/james/studioProducer/studioProducer.js
2022-02-13 23:57:50 +01:00

306 lines
No EOL
8 KiB
JavaScript

//by james b. pollack @imgntn 7/14/2016
//this script creates three cameras and three targets.
//the cameras look at the targets.
//to use:
//move cameras and targets to desired locations.
//press 1,2,3 to switch cameras
//press 4 to hide cameras+targets
//press 5 to show cameras+targets
//press 6 to exit producer mode
var CAMERA_MODEL = 'http://hifi-content.s3.amazonaws.com/james/studioProducer/ProfessionalCamera_05.fbx';
var CAMERA_COUNT = 3;
var TARGET_COUNT = 3;
var ROW_SPACER = 1.2;
var COLUMN_SPACER = 1.2;
var basePosition = MyAvatar.position;
var startRotation = Quat.angleAxis(0, {
x: 1,
y: 0,
z: 0
})
var producer, oldCameraMode;
var cameraConnected = false;
function Producer() {
this.activeCamera = 0;
var positions = distributePointsOnGrid(basePosition, startRotation);
var cameraPositions = positions.slice(0, CAMERA_COUNT)
var targetPositions = positions.slice(CAMERA_COUNT, CAMERA_COUNT + TARGET_COUNT);
this.cameras = createStartCameras(cameraPositions);
this.targets = createStartTargets(targetPositions);
};
function jCamera(position) {
var properties = {
type: 'Model',
modelURL: CAMERA_MODEL,
dimensions: {
x: 0.2192,
y: 0.3463,
z: 0.1662
},
// color: {
// red: 0,
// green: 255,
// blue: 0
// },
dynamic: true,
position: position,
userData: JSON.stringify({
grabbableKey: {
grabbable: true
},
producerKey: {
isCamera: true,
}
})
}
this.item = Entities.addEntity(properties);
}
function jTarget(position) {
var properties = {
type: 'Box',
dimensions: {
x: 0.5,
y: 0.5,
z: 0.5
},
color: {
red: 0,
green: 0,
blue: 255
},
collisionless: true,
collidesWith: '',
position: position,
dynamic: true,
userData: JSON.stringify({
grabbableKey: {
grabbable: true
},
producerKey: {
isTarget: true,
}
})
}
this.item = Entities.addEntity(properties);
};
function enterSetupMode() {
print('ENTERING SETUP MODE')
makeProducerEntitiesVisible();
};
function enterLiveMode() {
print('ENTERING LIVE MODE')
// makeProducerEntitiesInvisible();
};
function createStartCameras(positions) {
var cameras = [];
var i;
for (i = 0; i < CAMERA_COUNT; i++) {
cameras.push(new jCamera(positions[i]).item);
}
return cameras;
};
function createStartTargets(positions) {
var targets = [];
var i;
for (i = 0; i < TARGET_COUNT; i++) {
targets.push(new jTarget(positions[i]).item);
}
return targets;
};
function cleanupCameras(cameras) {
cameras.forEach(function(camera) {
Entities.deleteEntity(camera);
})
};
function cleanupTargets(targets) {
targets.forEach(function(target) {
Entities.deleteEntity(target);
})
};
function updateCurrentCamera() {
var cameraProperties = Entities.getEntityProperties(Camera.cameraEntity);
var targetProperties = Entities.getEntityProperties(producer.targets[producer.activeCamera]);
var rotation = Quat.lookAt(cameraProperties.position, targetProperties.position, Vec3.UP)
var camEntity = Camera.cameraEntity;
Entities.editEntity(camEntity, {
rotation: rotation
})
};
function switchCameraToEntity(entityID) {
Camera.mode = "entity";
Camera.cameraEntity = entityID;
};
function findAllProducerEntities() {
var producers = [];
var results = Entities.findEntities(basePosition, 1000);
results.forEach(function(result) {
var properties = Entities.getEntityProperties(result);
if (properties.hasOwnProperty('userData')) {
try {
var data = JSON.parse(properties.userData);
if (data.hasOwnProperty('producerKey')) {
print('found a producer entity')
producers.push(result);
}
} catch (e) {
print('error parsing userdata');
}
}
});
return producers;
}
function switchToOriginalMode() {
Camera.mode = oldCameraMode;
Camera.cameraEntity = null;
cleanupTargets(producer.targets);
cleanupCameras(producer.cameras);
producer.activeCamera = 0;
}
function makeProducerEntitiesVisible() {
findAllProducerEntities().forEach(function(result) {
Entities.editEntity(result, {
visible: true
});
});
};
function makeProducerEntitiesInvisible() {
findAllProducerEntities().forEach(function(result) {
Entities.editEntity(result, {
visible: false
});
});
}
function distributePointsOnGrid(basePosition, rotation) {
var positions = [];
var arrangement = [
[1, 1, 1],
[1, 1, 1]
];
arrangement.forEach(function(row, rowIndex) {
row.forEach(function(column, colIndex) {
var horizontalOffset = colIndex * COLUMN_SPACER;
var verticalOffset = rowIndex * ROW_SPACER
var rightVector = Quat.getRight(rotation);
var frontVector = Quat.getFront(rotation);
var rightDisplacement = Vec3.multiply(rightVector, horizontalOffset);
var frontDisplacement = Vec3.multiply(frontVector, verticalOffset);
var finalPosition = Vec3.sum(basePosition, rightDisplacement);
finalPosition = Vec3.sum(finalPosition, frontDisplacement);
positions.push(finalPosition)
})
});
return positions;
};
function handleKeyPresses(event) {
if (event.text === '6') {
print('PRODUCER: back to basics')
disconnectCameraUpdate();
Camera.mode = oldCameraMode;
Camera.cameraEntity = null;
enterSetupMode();
return;
}
if (event.text === '1') {
print('PRODUCER: go to camera 1')
producer.activeCamera = 0;
switchCameraToEntity(producer.cameras[0])
enterLiveMode();
connectCameraUpdate();;
}
if (event.text === '2') {
print('PRODUCER: go to camera 2')
producer.activeCamera = 1;
switchCameraToEntity(producer.cameras[1])
enterLiveMode();
connectCameraUpdate();
}
if (event.text === '3') {
print('PRODUCER: go to camera 3')
producer.activeCamera = 2;
switchCameraToEntity(producer.cameras[2])
enterLiveMode();
connectCameraUpdate();
}
if (event.text === '4') {
print('PRODUCER: make entities invisible')
makeProducerEntitiesInvisible();
}
if (event.text === '5') {
print('PRODUCER: make entities visible')
makeProducerEntitiesVisible();
}
return;
};
function disconnectCameraUpdate() {
if (cameraConnected === true) {
Script.update.disconnect(updateCurrentCamera);
}
cameraConnected = false;
}
function connectCameraUpdate() {
cameraConnected = true;
Script.update.connect(updateCurrentCamera);
}
function cleanup() {
switchToOriginalMode();
Controller.keyPressEvent.disconnect(handleKeyPresses);
var junk = findAllProducerEntities();
junk.forEach(function(piece) {
Entities.deleteEntity(piece);
})
}
function initialize() {
//start it up
oldCameraMode = Camera.mode;
oldCameraMode = 'first person';
print('oldCameraMode:' + JSON.stringify(Camera))
producer = new Producer();
enterSetupMode();
}
initialize();
Controller.keyPressEvent.connect(handleKeyPresses);
Script.scriptEnding.connect(cleanup);