mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 16:38:27 +02:00
cleanup in prep for PR
This commit is contained in:
parent
73d5e8c519
commit
58759d344f
23 changed files with 165 additions and 643 deletions
|
@ -48,8 +48,6 @@ void EntityServer::beforeRun() {
|
||||||
|
|
||||||
void EntityServer::entityCreated(const EntityItem& newEntity, const SharedNodePointer& senderNode) {
|
void EntityServer::entityCreated(const EntityItem& newEntity, const SharedNodePointer& senderNode) {
|
||||||
|
|
||||||
qDebug() << "EntityServer::entityCreated() newEntity.getEntityItemID()=" << newEntity.getEntityItemID();
|
|
||||||
|
|
||||||
unsigned char outputBuffer[MAX_PACKET_SIZE];
|
unsigned char outputBuffer[MAX_PACKET_SIZE];
|
||||||
unsigned char* copyAt = outputBuffer;
|
unsigned char* copyAt = outputBuffer;
|
||||||
|
|
||||||
|
@ -70,8 +68,6 @@ qDebug() << "EntityServer::entityCreated() newEntity.getEntityItemID()=" << newE
|
||||||
copyAt += sizeof(entityID);
|
copyAt += sizeof(entityID);
|
||||||
packetLength += sizeof(entityID);
|
packetLength += sizeof(entityID);
|
||||||
|
|
||||||
qDebug() << "EntityServer::entityCreated() writeDatagram()";
|
|
||||||
|
|
||||||
NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, senderNode);
|
NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, senderNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,8 +106,6 @@ int EntityServer::sendSpecialPacket(const SharedNodePointer& node, OctreeQueryNo
|
||||||
hasMoreToSend = tree->encodeEntitiesDeletedSince(queryNode->getSequenceNumber(), deletedEntitiesSentAt,
|
hasMoreToSend = tree->encodeEntitiesDeletedSince(queryNode->getSequenceNumber(), deletedEntitiesSentAt,
|
||||||
outputBuffer, MAX_PACKET_SIZE, packetLength);
|
outputBuffer, MAX_PACKET_SIZE, packetLength);
|
||||||
|
|
||||||
//qDebug() << "sending PacketType_MODEL_ERASE packetLength:" << packetLength;
|
|
||||||
|
|
||||||
NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node));
|
NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node));
|
||||||
queryNode->packetSent(outputBuffer, packetLength);
|
queryNode->packetSent(outputBuffer, packetLength);
|
||||||
packetsSent++;
|
packetsSent++;
|
||||||
|
@ -128,7 +122,6 @@ void EntityServer::pruneDeletedEntities() {
|
||||||
EntityTree* tree = static_cast<EntityTree*>(_tree);
|
EntityTree* tree = static_cast<EntityTree*>(_tree);
|
||||||
if (tree->hasAnyDeletedEntities()) {
|
if (tree->hasAnyDeletedEntities()) {
|
||||||
|
|
||||||
//qDebug() << "there are some deleted entities to consider...";
|
|
||||||
quint64 earliestLastDeletedEntitiesSent = usecTimestampNow() + 1; // in the future
|
quint64 earliestLastDeletedEntitiesSent = usecTimestampNow() + 1; // in the future
|
||||||
foreach (const SharedNodePointer& otherNode, NodeList::getInstance()->getNodeHash()) {
|
foreach (const SharedNodePointer& otherNode, NodeList::getInstance()->getNodeHash()) {
|
||||||
if (otherNode->getLinkedData()) {
|
if (otherNode->getLinkedData()) {
|
||||||
|
@ -139,7 +132,6 @@ void EntityServer::pruneDeletedEntities() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//qDebug() << "earliestLastDeletedEntitiesSent=" << earliestLastDeletedEntitiesSent;
|
|
||||||
tree->forgetEntitiesDeletedBefore(earliestLastDeletedEntitiesSent);
|
tree->forgetEntitiesDeletedBefore(earliestLastDeletedEntitiesSent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,7 +209,7 @@ var ExportMenu = function(opts) {
|
||||||
self.setScale(self._scale *= 2);
|
self.setScale(self._scale *= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.exportModels = function() {
|
this.exportEntites = function() {
|
||||||
var x = self._position.x;
|
var x = self._position.x;
|
||||||
var y = self._position.y;
|
var y = self._position.y;
|
||||||
var z = self._position.z;
|
var z = self._position.z;
|
||||||
|
@ -217,7 +217,7 @@ var ExportMenu = function(opts) {
|
||||||
var filename = "models__" + Window.location.hostname + "__" + x + "_" + y + "_" + z + "_" + s + "__.svo";
|
var filename = "models__" + Window.location.hostname + "__" + x + "_" + y + "_" + z + "_" + s + "__.svo";
|
||||||
filename = Window.save("Select where to save", filename, "*.svo")
|
filename = Window.save("Select where to save", filename, "*.svo")
|
||||||
if (filename) {
|
if (filename) {
|
||||||
var success = Clipboard.exportModels(filename, x, y, z, s);
|
var success = Clipboard.exportEntites(filename, x, y, z, s);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
Window.alert("Export failed: no models found in selected area.");
|
Window.alert("Export failed: no models found in selected area.");
|
||||||
}
|
}
|
||||||
|
@ -243,7 +243,7 @@ var ExportMenu = function(opts) {
|
||||||
if (clickedOverlay == locationButton) {
|
if (clickedOverlay == locationButton) {
|
||||||
self.showPositionPrompt();
|
self.showPositionPrompt();
|
||||||
} else if (clickedOverlay == exportButton) {
|
} else if (clickedOverlay == exportButton) {
|
||||||
self.exportModels();
|
self.exportEntites();
|
||||||
} else if (clickedOverlay == cancelButton) {
|
} else if (clickedOverlay == cancelButton) {
|
||||||
self.close();
|
self.close();
|
||||||
} else if (clickedOverlay == scaleOverlay) {
|
} else if (clickedOverlay == scaleOverlay) {
|
||||||
|
@ -423,23 +423,23 @@ var ModelImporter = function(opts) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (Window.confirm(("Would you like to import back to the source location?"))) {
|
if (Window.confirm(("Would you like to import back to the source location?"))) {
|
||||||
var success = Clipboard.importModels(filename);
|
var success = Clipboard.importEntities(filename);
|
||||||
if (success) {
|
if (success) {
|
||||||
Clipboard.pasteModels(x, y, z, 1);
|
Clipboard.pasteEntities(x, y, z, 1);
|
||||||
} else {
|
} else {
|
||||||
Window.alert("There was an error importing the model file.");
|
Window.alert("There was an error importing the entity file.");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var success = Clipboard.importModels(filename);
|
var success = Clipboard.importEntities(filename);
|
||||||
if (success) {
|
if (success) {
|
||||||
self._importing = true;
|
self._importing = true;
|
||||||
self.setImportVisible(true);
|
self.setImportVisible(true);
|
||||||
Overlays.editOverlay(importBoundaries, { size: s });
|
Overlays.editOverlay(importBoundaries, { size: s });
|
||||||
} else {
|
} else {
|
||||||
Window.alert("There was an error importing the model file.");
|
Window.alert("There was an error importing the entity file.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -449,7 +449,7 @@ var ModelImporter = function(opts) {
|
||||||
if (self._importing) {
|
if (self._importing) {
|
||||||
// self._importing = false;
|
// self._importing = false;
|
||||||
// self.setImportVisible(false);
|
// self.setImportVisible(false);
|
||||||
Clipboard.pasteModels(importPosition.x, importPosition.y, importPosition.z, 1);
|
Clipboard.pasteEntities(importPosition.x, importPosition.y, importPosition.z, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -912,7 +912,6 @@ function controller(wichSide) {
|
||||||
modelURL: attachments[attachmentIndex].modelURL
|
modelURL: attachments[attachmentIndex].modelURL
|
||||||
};
|
};
|
||||||
|
|
||||||
print(">>>>> CALLING >>>>> newModel = Entities.addEntity(newProperties);");
|
|
||||||
newModel = Entities.addEntity(newProperties);
|
newModel = Entities.addEntity(newProperties);
|
||||||
|
|
||||||
|
|
||||||
|
@ -973,7 +972,7 @@ print(">>>>> CALLING >>>>> newModel = Entities.addEntity(newProperties);");
|
||||||
var leftController = new controller(LEFT);
|
var leftController = new controller(LEFT);
|
||||||
var rightController = new controller(RIGHT);
|
var rightController = new controller(RIGHT);
|
||||||
|
|
||||||
function moveModels() {
|
function moveEntities() {
|
||||||
if (leftController.grabbing && rightController.grabbing && rightController.entityID.id == leftController.entityID.id) {
|
if (leftController.grabbing && rightController.grabbing && rightController.entityID.id == leftController.entityID.id) {
|
||||||
var newPosition = leftController.oldModelPosition;
|
var newPosition = leftController.oldModelPosition;
|
||||||
var rotation = leftController.oldModelRotation;
|
var rotation = leftController.oldModelRotation;
|
||||||
|
@ -1070,7 +1069,7 @@ function checkController(deltaTime) {
|
||||||
|
|
||||||
leftController.update();
|
leftController.update();
|
||||||
rightController.update();
|
rightController.update();
|
||||||
moveModels();
|
moveEntities();
|
||||||
} else {
|
} else {
|
||||||
if (hydraConnected) {
|
if (hydraConnected) {
|
||||||
hydraConnected = false;
|
hydraConnected = false;
|
||||||
|
@ -1113,7 +1112,7 @@ function initToolBar() {
|
||||||
alpha: 0.7
|
alpha: 0.7
|
||||||
});
|
});
|
||||||
newBox = toolBar.addTool({
|
newBox = toolBar.addTool({
|
||||||
imageURL: toolIconUrl + "add-model-tool.svg",
|
imageURL: toolIconUrl + "models-tool.svg",
|
||||||
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
||||||
width: toolWidth, height: toolHeight,
|
width: toolWidth, height: toolHeight,
|
||||||
visible: true,
|
visible: true,
|
||||||
|
@ -1121,7 +1120,7 @@ function initToolBar() {
|
||||||
});
|
});
|
||||||
|
|
||||||
newSphere = toolBar.addTool({
|
newSphere = toolBar.addTool({
|
||||||
imageURL: toolIconUrl + "add-model-tool.svg",
|
imageURL: toolIconUrl + "models-tool.svg",
|
||||||
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT },
|
||||||
width: toolWidth, height: toolHeight,
|
width: toolWidth, height: toolHeight,
|
||||||
visible: true,
|
visible: true,
|
||||||
|
@ -1617,19 +1616,19 @@ function handeMenuEvent(menuItem){
|
||||||
print("menuItemEvent() in JS... menuItem=" + menuItem);
|
print("menuItemEvent() in JS... menuItem=" + menuItem);
|
||||||
if (menuItem == "Delete") {
|
if (menuItem == "Delete") {
|
||||||
if (leftController.grabbing) {
|
if (leftController.grabbing) {
|
||||||
print(" Delete Model.... leftController.entityID="+ leftController.entityID);
|
print(" Delete Entity.... leftController.entityID="+ leftController.entityID);
|
||||||
Entities.deleteEntity(leftController.entityID);
|
Entities.deleteEntity(leftController.entityID);
|
||||||
leftController.grabbing = false;
|
leftController.grabbing = false;
|
||||||
} else if (rightController.grabbing) {
|
} else if (rightController.grabbing) {
|
||||||
print(" Delete Model.... rightController.entityID="+ rightController.entityID);
|
print(" Delete Entity.... rightController.entityID="+ rightController.entityID);
|
||||||
Entities.deleteEntity(rightController.entityID);
|
Entities.deleteEntity(rightController.entityID);
|
||||||
rightController.grabbing = false;
|
rightController.grabbing = false;
|
||||||
} else if (entitySelected) {
|
} else if (entitySelected) {
|
||||||
print(" Delete Model.... selectedEntityID="+ selectedEntityID);
|
print(" Delete Entity.... selectedEntityID="+ selectedEntityID);
|
||||||
Entities.deleteEntity(selectedEntityID);
|
Entities.deleteEntity(selectedEntityID);
|
||||||
entitySelected = false;
|
entitySelected = false;
|
||||||
} else {
|
} else {
|
||||||
print(" Delete Model.... not holding...");
|
print(" Delete Entity.... not holding...");
|
||||||
}
|
}
|
||||||
} else if (menuItem == "Edit Properties...") {
|
} else if (menuItem == "Edit Properties...") {
|
||||||
var editModelID = -1;
|
var editModelID = -1;
|
||||||
|
|
|
@ -1,347 +0,0 @@
|
||||||
//
|
|
||||||
// placeModelsWithHands.js
|
|
||||||
// examples
|
|
||||||
//
|
|
||||||
// Created by Brad Hefta-Gaub on 1/20/14.
|
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
// maybe we should make these constants...
|
|
||||||
var LEFT_PALM = 0;
|
|
||||||
var LEFT_TIP = 1;
|
|
||||||
var LEFT_BUTTON_FWD = 5;
|
|
||||||
var LEFT_BUTTON_3 = 3;
|
|
||||||
|
|
||||||
var RIGHT_PALM = 2;
|
|
||||||
var RIGHT_TIP = 3;
|
|
||||||
var RIGHT_BUTTON_FWD = 11;
|
|
||||||
var RIGHT_BUTTON_3 = 9;
|
|
||||||
|
|
||||||
var leftModelAlreadyInHand = false;
|
|
||||||
var rightModelAlreadyInHand = false;
|
|
||||||
var leftRecentlyDeleted = false;
|
|
||||||
var rightRecentlyDeleted = false;
|
|
||||||
var leftHandModel;
|
|
||||||
var rightHandModel;
|
|
||||||
|
|
||||||
//var throwSound = new Sound("https://dl.dropboxusercontent.com/u/1864924/hifi-sounds/throw.raw");
|
|
||||||
//var catchSound = new Sound("https://dl.dropboxusercontent.com/u/1864924/hifi-sounds/catch.raw");
|
|
||||||
var targetRadius = 0.5;
|
|
||||||
|
|
||||||
var radiusDefault = 0.25;
|
|
||||||
var modelRadius = radiusDefault;
|
|
||||||
var radiusMinimum = 0.05;
|
|
||||||
var radiusMaximum = 0.5;
|
|
||||||
|
|
||||||
var modelURLs = [
|
|
||||||
"http://www.fungibleinsight.com/faces/beta.fst",
|
|
||||||
"https://s3-us-west-1.amazonaws.com/highfidelity-public/models/attachments/topHat.fst",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/Feisar_Ship.FBX",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/birarda/birarda_head.fbx",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/pug.fbx",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/newInvader16x16-large-purple.svo",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/minotaur/mino_full.fbx",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/Combat_tank_V01.FBX",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/orc.fbx",
|
|
||||||
"http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/slimer.fbx",
|
|
||||||
];
|
|
||||||
|
|
||||||
var animationURLs = [
|
|
||||||
"http://www.fungibleinsight.com/faces/gangnam_style_2.fbx",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
];
|
|
||||||
|
|
||||||
var currentModelURL = 1;
|
|
||||||
var numModels = modelURLs.length;
|
|
||||||
|
|
||||||
|
|
||||||
function getNewVoxelPosition() {
|
|
||||||
var camera = Camera.getPosition();
|
|
||||||
var forwardVector = Quat.getFront(MyAvatar.orientation);
|
|
||||||
var newPosition = Vec3.sum(camera, Vec3.multiply(forwardVector, 2.0));
|
|
||||||
return newPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
function keyPressEvent(event) {
|
|
||||||
debugPrint("event.text=" + event.text);
|
|
||||||
if (event.text == "ESC") {
|
|
||||||
if (leftRecentlyDeleted) {
|
|
||||||
leftRecentlyDeleted = false;
|
|
||||||
leftModelAlreadyInHand = false;
|
|
||||||
}
|
|
||||||
if (rightRecentlyDeleted) {
|
|
||||||
rightRecentlyDeleted = false;
|
|
||||||
rightModelAlreadyInHand = false;
|
|
||||||
}
|
|
||||||
} else if (event.text == "m") {
|
|
||||||
var URL = Window.prompt("Model URL", "Enter URL, e.g. http://foo.com/model.fbx");
|
|
||||||
var modelPosition = getNewVoxelPosition();
|
|
||||||
var properties = { position: { x: modelPosition.x,
|
|
||||||
y: modelPosition.y,
|
|
||||||
z: modelPosition.z },
|
|
||||||
radius: modelRadius,
|
|
||||||
modelURL: URL
|
|
||||||
};
|
|
||||||
newModel = Models.addModel(properties);
|
|
||||||
|
|
||||||
} else if (event.text == "DELETE" || event.text == "BACKSPACE") {
|
|
||||||
|
|
||||||
if (leftModelAlreadyInHand) {
|
|
||||||
print("want to delete leftHandModel=" + leftHandModel);
|
|
||||||
Models.deleteModel(leftHandModel);
|
|
||||||
leftHandModel = "";
|
|
||||||
//leftModelAlreadyInHand = false;
|
|
||||||
leftRecentlyDeleted = true;
|
|
||||||
}
|
|
||||||
if (rightModelAlreadyInHand) {
|
|
||||||
print("want to delete rightHandModel=" + rightHandModel);
|
|
||||||
Models.deleteModel(rightHandModel);
|
|
||||||
rightHandModel = "";
|
|
||||||
//rightModelAlreadyInHand = false;
|
|
||||||
rightRecentlyDeleted = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var nVal = parseInt(event.text);
|
|
||||||
if ((nVal >= 0) && (nVal < numModels)) {
|
|
||||||
currentModelURL = nVal;
|
|
||||||
print("Model = " + currentModelURL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var wantDebugging = false;
|
|
||||||
function debugPrint(message) {
|
|
||||||
if (wantDebugging) {
|
|
||||||
print(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getModelHoldPosition(whichSide) {
|
|
||||||
var normal;
|
|
||||||
var tipPosition;
|
|
||||||
if (whichSide == LEFT_PALM) {
|
|
||||||
normal = Controller.getSpatialControlNormal(LEFT_PALM);
|
|
||||||
tipPosition = Controller.getSpatialControlPosition(LEFT_TIP);
|
|
||||||
} else {
|
|
||||||
normal = Controller.getSpatialControlNormal(RIGHT_PALM);
|
|
||||||
tipPosition = Controller.getSpatialControlPosition(RIGHT_TIP);
|
|
||||||
}
|
|
||||||
|
|
||||||
var MODEL_FORWARD_OFFSET = 0.08; // put the model a bit forward of fingers
|
|
||||||
position = { x: MODEL_FORWARD_OFFSET * normal.x,
|
|
||||||
y: MODEL_FORWARD_OFFSET * normal.y,
|
|
||||||
z: MODEL_FORWARD_OFFSET * normal.z };
|
|
||||||
|
|
||||||
position.x += tipPosition.x;
|
|
||||||
position.y += tipPosition.y;
|
|
||||||
position.z += tipPosition.z;
|
|
||||||
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkControllerSide(whichSide) {
|
|
||||||
|
|
||||||
var BUTTON_FWD;
|
|
||||||
var BUTTON_3;
|
|
||||||
var palmPosition;
|
|
||||||
var palmRotation;
|
|
||||||
var modelAlreadyInHand;
|
|
||||||
var handMessage;
|
|
||||||
|
|
||||||
if (whichSide == LEFT_PALM) {
|
|
||||||
BUTTON_FWD = LEFT_BUTTON_FWD;
|
|
||||||
BUTTON_3 = LEFT_BUTTON_3;
|
|
||||||
palmPosition = Controller.getSpatialControlPosition(LEFT_PALM);
|
|
||||||
palmRotation = Controller.getSpatialControlRawRotation(LEFT_PALM);
|
|
||||||
modelAlreadyInHand = leftModelAlreadyInHand;
|
|
||||||
handMessage = "LEFT";
|
|
||||||
} else {
|
|
||||||
BUTTON_FWD = RIGHT_BUTTON_FWD;
|
|
||||||
BUTTON_3 = RIGHT_BUTTON_3;
|
|
||||||
palmPosition = Controller.getSpatialControlPosition(RIGHT_PALM);
|
|
||||||
palmRotation = Controller.getSpatialControlRawRotation(RIGHT_PALM);
|
|
||||||
modelAlreadyInHand = rightModelAlreadyInHand;
|
|
||||||
handMessage = "RIGHT";
|
|
||||||
}
|
|
||||||
|
|
||||||
//print("checkControllerSide..." + handMessage);
|
|
||||||
|
|
||||||
var grabButtonPressed = (Controller.isButtonPressed(BUTTON_FWD) || Controller.isButtonPressed(BUTTON_3));
|
|
||||||
|
|
||||||
// If I don't currently have a model in my hand, then try to grab closest one
|
|
||||||
if (!modelAlreadyInHand && grabButtonPressed) {
|
|
||||||
var closestModel = Models.findClosestModel(palmPosition, targetRadius);
|
|
||||||
|
|
||||||
if (closestModel.isKnownID) {
|
|
||||||
|
|
||||||
debugPrint(handMessage + " HAND- CAUGHT SOMETHING!!");
|
|
||||||
|
|
||||||
if (whichSide == LEFT_PALM) {
|
|
||||||
leftModelAlreadyInHand = true;
|
|
||||||
leftHandModel = closestModel;
|
|
||||||
} else {
|
|
||||||
rightModelAlreadyInHand = true;
|
|
||||||
rightHandModel = closestModel;
|
|
||||||
}
|
|
||||||
var modelPosition = getModelHoldPosition(whichSide);
|
|
||||||
|
|
||||||
var properties = { position: { x: modelPosition.x,
|
|
||||||
y: modelPosition.y,
|
|
||||||
z: modelPosition.z },
|
|
||||||
radius: modelRadius,
|
|
||||||
rotation: palmRotation,
|
|
||||||
};
|
|
||||||
|
|
||||||
debugPrint(">>>>>>>>>>>> EDIT MODEL.... modelRadius=" +modelRadius);
|
|
||||||
|
|
||||||
Models.editModel(closestModel, properties);
|
|
||||||
|
|
||||||
/*
|
|
||||||
var options = new AudioInjectionOptions();
|
|
||||||
options.position = modelPosition;
|
|
||||||
options.volume = 1.0;
|
|
||||||
Audio.playSound(catchSound, options);
|
|
||||||
*/
|
|
||||||
|
|
||||||
return; // exit early
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If '3' is pressed, and not holding a model, make a new one
|
|
||||||
if (Controller.isButtonPressed(BUTTON_3) && !modelAlreadyInHand) {
|
|
||||||
var modelPosition = getModelHoldPosition(whichSide);
|
|
||||||
var properties = { position: { x: modelPosition.x,
|
|
||||||
y: modelPosition.y,
|
|
||||||
z: modelPosition.z },
|
|
||||||
radius: modelRadius,
|
|
||||||
rotation: palmRotation,
|
|
||||||
modelURL: modelURLs[currentModelURL]
|
|
||||||
};
|
|
||||||
|
|
||||||
if (animationURLs[currentModelURL] !== "") {
|
|
||||||
properties.animationURL = animationURLs[currentModelURL];
|
|
||||||
properties.animationIsPlaying = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
debugPrint("modelRadius=" +modelRadius);
|
|
||||||
|
|
||||||
//newModel = Models.addModel(properties);
|
|
||||||
|
|
||||||
print("just added model... newModel=" + newModel.creatorTokenID);
|
|
||||||
print("properties.animationURL=" + properties.animationURL);
|
|
||||||
|
|
||||||
if (whichSide == LEFT_PALM) {
|
|
||||||
leftModelAlreadyInHand = true;
|
|
||||||
leftHandModel = newModel;
|
|
||||||
} else {
|
|
||||||
rightModelAlreadyInHand = true;
|
|
||||||
rightHandModel = newModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Play a new model sound
|
|
||||||
/*
|
|
||||||
var options = new AudioInjectionOptions();
|
|
||||||
options.position = modelPosition;
|
|
||||||
options.volume = 1.0;
|
|
||||||
Audio.playSound(catchSound, options);
|
|
||||||
*/
|
|
||||||
|
|
||||||
return; // exit early
|
|
||||||
}
|
|
||||||
|
|
||||||
if (modelAlreadyInHand) {
|
|
||||||
if (whichSide == LEFT_PALM) {
|
|
||||||
handModel = leftHandModel;
|
|
||||||
whichTip = LEFT_TIP;
|
|
||||||
} else {
|
|
||||||
handModel = rightHandModel;
|
|
||||||
whichTip = RIGHT_TIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If holding the model keep it in the palm
|
|
||||||
if (grabButtonPressed) {
|
|
||||||
debugPrint(">>>>> " + handMessage + "-MODEL IN HAND, grabbing, hold and move");
|
|
||||||
var modelPosition = getModelHoldPosition(whichSide);
|
|
||||||
var properties = { position: { x: modelPosition.x,
|
|
||||||
y: modelPosition.y,
|
|
||||||
z: modelPosition.z },
|
|
||||||
radius: modelRadius,
|
|
||||||
rotation: palmRotation,
|
|
||||||
};
|
|
||||||
|
|
||||||
debugPrint(">>>>>>>>>>>> EDIT MODEL.... modelRadius=" +modelRadius);
|
|
||||||
|
|
||||||
Models.editModel(handModel, properties);
|
|
||||||
} else {
|
|
||||||
debugPrint(">>>>> " + handMessage + "-MODEL IN HAND, not grabbing, RELEASE!!!");
|
|
||||||
if (whichSide == LEFT_PALM) {
|
|
||||||
leftModelAlreadyInHand = false;
|
|
||||||
leftHandModel = false;
|
|
||||||
} else {
|
|
||||||
rightModelAlreadyInHand = false;
|
|
||||||
rightHandModel = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
var options = new AudioInjectionOptions();
|
|
||||||
options.position = modelPosition;
|
|
||||||
options.volume = 1.0;
|
|
||||||
Audio.playSound(throwSound, options);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function checkController(deltaTime) {
|
|
||||||
var numberOfButtons = Controller.getNumberOfButtons();
|
|
||||||
var numberOfTriggers = Controller.getNumberOfTriggers();
|
|
||||||
var numberOfSpatialControls = Controller.getNumberOfSpatialControls();
|
|
||||||
var controllersPerTrigger = numberOfSpatialControls / numberOfTriggers;
|
|
||||||
|
|
||||||
// this is expected for hydras
|
|
||||||
if (!(numberOfButtons==12 && numberOfTriggers == 2 && controllersPerTrigger == 2)) {
|
|
||||||
debugPrint("no hydra connected?");
|
|
||||||
return; // bail if no hydra
|
|
||||||
}
|
|
||||||
|
|
||||||
checkControllerSide(LEFT_PALM);
|
|
||||||
checkControllerSide(RIGHT_PALM);
|
|
||||||
|
|
||||||
if (rightModelAlreadyInHand) {
|
|
||||||
var rightTriggerValue = Controller.getTriggerValue(1);
|
|
||||||
if (rightTriggerValue > 0.0) {
|
|
||||||
var possibleRadius = ((1.0 - rightTriggerValue) * (radiusMaximum - radiusMinimum)) + radiusMinimum;
|
|
||||||
modelRadius = possibleRadius;
|
|
||||||
} else {
|
|
||||||
modelRadius = radiusDefault;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leftModelAlreadyInHand) {
|
|
||||||
var leftTriggerValue = Controller.getTriggerValue(0);
|
|
||||||
if (leftTriggerValue > 0.0) {
|
|
||||||
var possibleRadius = ((1.0 - leftTriggerValue) * (radiusMaximum - radiusMinimum)) + radiusMinimum;
|
|
||||||
modelRadius = possibleRadius;
|
|
||||||
} else {
|
|
||||||
modelRadius = radiusDefault;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// register the call back so it fires before each data send
|
|
||||||
Script.update.connect(checkController);
|
|
||||||
Controller.keyPressEvent.connect(keyPressEvent);
|
|
||||||
|
|
|
@ -1523,8 +1523,7 @@ struct SendVoxelsOperationArgs {
|
||||||
const unsigned char* newBaseOctCode;
|
const unsigned char* newBaseOctCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: change names to entities...
|
bool Application::exportEntities(const QString& filename, float x, float y, float z, float scale) {
|
||||||
bool Application::exportModels(const QString& filename, float x, float y, float z, float scale) {
|
|
||||||
QVector<EntityItem*> entities;
|
QVector<EntityItem*> entities;
|
||||||
_entities.getTree()->findEntities(AACube(glm::vec3(x / (float)TREE_SCALE,
|
_entities.getTree()->findEntities(AACube(glm::vec3(x / (float)TREE_SCALE,
|
||||||
y / (float)TREE_SCALE, z / (float)TREE_SCALE), scale / (float)TREE_SCALE), entities);
|
y / (float)TREE_SCALE, z / (float)TREE_SCALE), scale / (float)TREE_SCALE), entities);
|
||||||
|
@ -1632,7 +1631,7 @@ void Application::importVoxels() {
|
||||||
emit importDone();
|
emit importDone();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::importModels(const QString& filename) {
|
bool Application::importEntities(const QString& filename) {
|
||||||
_entityClipboard.eraseAllOctreeElements();
|
_entityClipboard.eraseAllOctreeElements();
|
||||||
bool success = _entityClipboard.readFromSVOFile(filename.toLocal8Bit().constData());
|
bool success = _entityClipboard.readFromSVOFile(filename.toLocal8Bit().constData());
|
||||||
if (success) {
|
if (success) {
|
||||||
|
@ -1641,7 +1640,7 @@ bool Application::importModels(const QString& filename) {
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::pasteModels(float x, float y, float z) {
|
void Application::pasteEntities(float x, float y, float z) {
|
||||||
_entityClipboard.sendEntities(&_entityEditSender, x, y, z);
|
_entityClipboard.sendEntities(&_entityEditSender, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -321,9 +321,9 @@ public slots:
|
||||||
void nodeKilled(SharedNodePointer node);
|
void nodeKilled(SharedNodePointer node);
|
||||||
void packetSent(quint64 length);
|
void packetSent(quint64 length);
|
||||||
|
|
||||||
void pasteModels(float x, float y, float z);
|
void pasteEntities(float x, float y, float z);
|
||||||
bool exportModels(const QString& filename, float x, float y, float z, float scale);
|
bool exportEntities(const QString& filename, float x, float y, float z, float scale);
|
||||||
bool importModels(const QString& filename);
|
bool importEntities(const QString& filename);
|
||||||
|
|
||||||
void importVoxels(); // doesn't include source voxel because it goes to clipboard
|
void importVoxels(); // doesn't include source voxel because it goes to clipboard
|
||||||
void cutVoxels(const VoxelDetail& sourceVoxel);
|
void cutVoxels(const VoxelDetail& sourceVoxel);
|
||||||
|
|
|
@ -61,7 +61,6 @@ void DatagramProcessor::processDatagrams() {
|
||||||
application->getParticles()->getTree()->handleAddParticleResponse(incomingPacket);
|
application->getParticles()->getTree()->handleAddParticleResponse(incomingPacket);
|
||||||
break;
|
break;
|
||||||
case PacketTypeEntityAddResponse:
|
case PacketTypeEntityAddResponse:
|
||||||
qDebug() << "DatagramProcessor::processDatagrams() PacketTypeEntityAddResponse...";
|
|
||||||
// this will keep creatorTokenIDs to IDs mapped correctly
|
// this will keep creatorTokenIDs to IDs mapped correctly
|
||||||
EntityItemID::handleAddEntityResponse(incomingPacket);
|
EntityItemID::handleAddEntityResponse(incomingPacket);
|
||||||
application->getEntities()->getTree()->handleAddEntityResponse(incomingPacket);
|
application->getEntities()->getTree()->handleAddEntityResponse(incomingPacket);
|
||||||
|
@ -89,7 +88,7 @@ qDebug() << "DatagramProcessor::processDatagrams() PacketTypeEntityAddResponse..
|
||||||
OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow();
|
OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow();
|
||||||
int flightTime = arrivedAt - sentAt;
|
int flightTime = arrivedAt - sentAt;
|
||||||
|
|
||||||
qDebug("got PacketType_VOXEL_DATA, sequence:%d flightTime:%d", sequence, flightTime);
|
qDebug("got an Octree data or erase message, sequence:%d flightTime:%d", sequence, flightTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedNodePointer matchedNode = NodeList::getInstance()->sendingNodeForPacket(incomingPacket);
|
SharedNodePointer matchedNode = NodeList::getInstance()->sendingNodeForPacket(incomingPacket);
|
||||||
|
|
|
@ -36,13 +36,9 @@ QThread* EntityTreeRenderer::getMainThread() {
|
||||||
|
|
||||||
EntityTreeRenderer::EntityTreeRenderer() :
|
EntityTreeRenderer::EntityTreeRenderer() :
|
||||||
OctreeRenderer() {
|
OctreeRenderer() {
|
||||||
|
|
||||||
qDebug() << "--- Overriding Entity Factories NOW ---";
|
|
||||||
REGISTER_ENTITY_TYPE_WITH_FACTORY(Model, RenderableModelEntityItem::factory)
|
REGISTER_ENTITY_TYPE_WITH_FACTORY(Model, RenderableModelEntityItem::factory)
|
||||||
REGISTER_ENTITY_TYPE_WITH_FACTORY(Box, RenderableBoxEntityItem::factory)
|
REGISTER_ENTITY_TYPE_WITH_FACTORY(Box, RenderableBoxEntityItem::factory)
|
||||||
REGISTER_ENTITY_TYPE_WITH_FACTORY(Sphere, RenderableSphereEntityItem::factory)
|
REGISTER_ENTITY_TYPE_WITH_FACTORY(Sphere, RenderableSphereEntityItem::factory)
|
||||||
qDebug() << "--- DONE Overriding Entity Factories ---";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityTreeRenderer::~EntityTreeRenderer() {
|
EntityTreeRenderer::~EntityTreeRenderer() {
|
||||||
|
@ -77,11 +73,7 @@ void EntityTreeRenderer::update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::render(RenderMode renderMode) {
|
void EntityTreeRenderer::render(RenderMode renderMode) {
|
||||||
//qDebug() << "EntityTreeRenderer::render() ************";
|
|
||||||
OctreeRenderer::render(renderMode);
|
OctreeRenderer::render(renderMode);
|
||||||
//qDebug() << "-------------------- EntityTreeRenderer::render() ------------";
|
|
||||||
//static_cast<EntityTree*>(_tree)->debugDumpMap();
|
|
||||||
//qDebug() << "******* DONE ******* EntityTreeRenderer::render() ************";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(const EntityItem* entityItem) {
|
const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(const EntityItem* entityItem) {
|
||||||
|
@ -123,8 +115,6 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args)
|
||||||
|
|
||||||
uint16_t numberOfEntities = entityItems.size();
|
uint16_t numberOfEntities = entityItems.size();
|
||||||
|
|
||||||
//qDebug() << "EntityTreeRenderer::renderElement() element=" << element << "numberOfEntities=" << numberOfEntities;
|
|
||||||
|
|
||||||
bool isShadowMode = args->_renderMode == OctreeRenderer::SHADOW_RENDER_MODE;
|
bool isShadowMode = args->_renderMode == OctreeRenderer::SHADOW_RENDER_MODE;
|
||||||
bool displayElementProxy = Menu::getInstance()->isOptionChecked(MenuOption::DisplayModelElementProxy);
|
bool displayElementProxy = Menu::getInstance()->isOptionChecked(MenuOption::DisplayModelElementProxy);
|
||||||
bool displayElementChildProxies = Menu::getInstance()->isOptionChecked(MenuOption::DisplayModelElementChildProxies);
|
bool displayElementChildProxies = Menu::getInstance()->isOptionChecked(MenuOption::DisplayModelElementChildProxies);
|
||||||
|
|
|
@ -66,9 +66,6 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void clearModelsCache();
|
void clearModelsCache();
|
||||||
//QMap<QUuid, Model*> _knownEntityItemModels;
|
|
||||||
//QMap<uint32_t, Model*> _unknownEntityItemModels;
|
|
||||||
//QMap<const ModelEntityItem*, Model*> _entityItemModels;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_EntityTreeRenderer_h
|
#endif // hifi_EntityTreeRenderer_h
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
//
|
//
|
||||||
// EntityTreeRenderer.cpp
|
// RenderableBoxEntityItem.cpp
|
||||||
// interface/src
|
// interface/src
|
||||||
//
|
//
|
||||||
// Created by Brad Hefta-Gaub on 12/6/13.
|
// Created by Brad Hefta-Gaub on 8/6/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
@ -25,45 +25,6 @@
|
||||||
#include "RenderableBoxEntityItem.h"
|
#include "RenderableBoxEntityItem.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// vertex array for glDrawElements() and glDrawRangeElement() =================
|
|
||||||
// Notice that the sizes of these arrays become samller than the arrays for
|
|
||||||
// glDrawArrays() because glDrawElements() uses an additional index array to
|
|
||||||
// choose designated vertices with the indices. The size of vertex array is now
|
|
||||||
// 24 instead of 36, but the index array size is 36, same as the number of
|
|
||||||
// vertices required to draw a cube.
|
|
||||||
GLfloat vertices2[] = { 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0,v1,v2,v3 (front)
|
|
||||||
1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0,v3,v4,v5 (right)
|
|
||||||
1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0,v5,v6,v1 (top)
|
|
||||||
-1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1, // v1,v6,v7,v2 (left)
|
|
||||||
-1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1, // v7,v4,v3,v2 (bottom)
|
|
||||||
1,-1,-1, -1,-1,-1, -1, 1,-1, 1, 1,-1 }; // v4,v7,v6,v5 (back)
|
|
||||||
|
|
||||||
// normal array
|
|
||||||
GLfloat normals2[] = { 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0,v1,v2,v3 (front)
|
|
||||||
1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0,v3,v4,v5 (right)
|
|
||||||
0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0,v5,v6,v1 (top)
|
|
||||||
-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1,v6,v7,v2 (left)
|
|
||||||
0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7,v4,v3,v2 (bottom)
|
|
||||||
0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 }; // v4,v7,v6,v5 (back)
|
|
||||||
|
|
||||||
// color array
|
|
||||||
GLfloat colors2[] = { 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, // v0,v1,v2,v3 (front)
|
|
||||||
1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, // v0,v3,v4,v5 (right)
|
|
||||||
1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, // v0,v5,v6,v1 (top)
|
|
||||||
1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, // v1,v6,v7,v2 (left)
|
|
||||||
0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // v7,v4,v3,v2 (bottom)
|
|
||||||
0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 }; // v4,v7,v6,v5 (back)
|
|
||||||
|
|
||||||
// index array of vertex array for glDrawElements() & glDrawRangeElement()
|
|
||||||
GLubyte indices[] = { 0, 1, 2, 2, 3, 0, // front
|
|
||||||
4, 5, 6, 6, 7, 4, // right
|
|
||||||
8, 9,10, 10,11, 8, // top
|
|
||||||
12,13,14, 14,15,12, // left
|
|
||||||
16,17,18, 18,19,16, // bottom
|
|
||||||
20,21,22, 22,23,20 }; // back
|
|
||||||
|
|
||||||
|
|
||||||
EntityItem* RenderableBoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) {
|
EntityItem* RenderableBoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) {
|
||||||
return new RenderableBoxEntityItem(entityID, properties);
|
return new RenderableBoxEntityItem(entityID, properties);
|
||||||
}
|
}
|
||||||
|
@ -76,24 +37,47 @@ void RenderableBoxEntityItem::render(RenderArgs* args) {
|
||||||
glm::quat rotation = getRotation();
|
glm::quat rotation = getRotation();
|
||||||
|
|
||||||
|
|
||||||
/*
|
const bool useGlutCube = false;
|
||||||
|
|
||||||
|
if (useGlutCube) {
|
||||||
glColor3ub(getColor()[RED_INDEX], getColor()[GREEN_INDEX], getColor()[BLUE_INDEX]);
|
glColor3ub(getColor()[RED_INDEX], getColor()[GREEN_INDEX], getColor()[BLUE_INDEX]);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(position.x, position.y, position.z);
|
glTranslatef(position.x, position.y, position.z);
|
||||||
glm::vec3 axis = glm::axis(rotation);
|
glm::vec3 axis = glm::axis(rotation);
|
||||||
glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z);
|
glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z);
|
||||||
glutSolidCube(size);
|
glutSolidCube(size);
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
*/
|
} else {
|
||||||
|
|
||||||
|
static GLfloat vertices[] = { 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0,v1,v2,v3 (front)
|
||||||
|
1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0,v3,v4,v5 (right)
|
||||||
|
1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0,v5,v6,v1 (top)
|
||||||
|
-1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1, // v1,v6,v7,v2 (left)
|
||||||
|
-1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1, // v7,v4,v3,v2 (bottom)
|
||||||
|
1,-1,-1, -1,-1,-1, -1, 1,-1, 1, 1,-1 }; // v4,v7,v6,v5 (back)
|
||||||
|
|
||||||
|
// normal array
|
||||||
|
static GLfloat normals[] = { 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0,v1,v2,v3 (front)
|
||||||
|
1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0,v3,v4,v5 (right)
|
||||||
|
0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0,v5,v6,v1 (top)
|
||||||
|
-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1,v6,v7,v2 (left)
|
||||||
|
0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7,v4,v3,v2 (bottom)
|
||||||
|
0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 }; // v4,v7,v6,v5 (back)
|
||||||
|
|
||||||
|
// index array of vertex array for glDrawElements() & glDrawRangeElement()
|
||||||
|
static GLubyte indices[] = { 0, 1, 2, 2, 3, 0, // front
|
||||||
|
4, 5, 6, 6, 7, 4, // right
|
||||||
|
8, 9,10, 10,11, 8, // top
|
||||||
|
12,13,14, 14,15,12, // left
|
||||||
|
16,17,18, 18,19,16, // bottom
|
||||||
|
20,21,22, 22,23,20 }; // back
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// enable and specify pointers to vertex arrays
|
|
||||||
glEnableClientState(GL_NORMAL_ARRAY);
|
glEnableClientState(GL_NORMAL_ARRAY);
|
||||||
//glEnableClientState(GL_COLOR_ARRAY);
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
glNormalPointer(GL_FLOAT, 0, normals2);
|
glNormalPointer(GL_FLOAT, 0, normals);
|
||||||
//glColorPointer(3, GL_FLOAT, 0, colors2);
|
glVertexPointer(3, GL_FLOAT, 0, vertices);
|
||||||
glVertexPointer(3, GL_FLOAT, 0, vertices2);
|
|
||||||
|
|
||||||
//glEnable(GL_BLEND);
|
//glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
@ -112,7 +96,6 @@ void RenderableBoxEntityItem::render(RenderArgs* args) {
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
|
glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
|
||||||
//glDisableClientState(GL_COLOR_ARRAY);
|
|
||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// RenderableBoxEntityItem.h
|
// RenderableBoxEntityItem.h
|
||||||
// interface/src/entities
|
// interface/src/entities
|
||||||
//
|
//
|
||||||
// Created by Brad Hefta-Gaub on 12/6/13.
|
// Created by Brad Hefta-Gaub on 8/6/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
//
|
//
|
||||||
// EntityTreeRenderer.cpp
|
// RenderableModelEntityItem.cpp
|
||||||
// interface/src
|
// interface/src
|
||||||
//
|
//
|
||||||
// Created by Brad Hefta-Gaub on 12/6/13.
|
// Created by Brad Hefta-Gaub on 8/6/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
@ -74,15 +74,12 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
|
||||||
if (_model) {
|
if (_model) {
|
||||||
// handle animations..
|
// handle animations..
|
||||||
if (hasAnimation()) {
|
if (hasAnimation()) {
|
||||||
//qDebug() << "hasAnimation()...";
|
|
||||||
if (!jointsMapped()) {
|
if (!jointsMapped()) {
|
||||||
QStringList modelJointNames = _model->getJointNames();
|
QStringList modelJointNames = _model->getJointNames();
|
||||||
mapJoints(modelJointNames);
|
mapJoints(modelJointNames);
|
||||||
//qDebug() << "mapJoints()...";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jointsMapped()) {
|
if (jointsMapped()) {
|
||||||
//qDebug() << "_model->setJointState()...";
|
|
||||||
QVector<glm::quat> frameData = getAnimationFrame();
|
QVector<glm::quat> frameData = getAnimationFrame();
|
||||||
for (int i = 0; i < frameData.size(); i++) {
|
for (int i = 0; i < frameData.size(); i++) {
|
||||||
_model->setJointState(i, true, frameData[i]);
|
_model->setJointState(i, true, frameData[i]);
|
||||||
|
@ -99,9 +96,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
|
||||||
|
|
||||||
// make sure to simulate so everything gets set up correctly for rendering
|
// make sure to simulate so everything gets set up correctly for rendering
|
||||||
{
|
{
|
||||||
// TODO: _model->simulate() appears to be about 28% of model render time.
|
|
||||||
// do we really need to call this every frame? I think not. Look into how to
|
|
||||||
// reduce calls to this.
|
|
||||||
PerformanceTimer perfTimer("_model->simulate");
|
PerformanceTimer perfTimer("_model->simulate");
|
||||||
_model->simulate(0.0f);
|
_model->simulate(0.0f);
|
||||||
}
|
}
|
||||||
|
@ -113,9 +107,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
|
||||||
? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE;
|
? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE;
|
||||||
|
|
||||||
if (_model->isActive()) {
|
if (_model->isActive()) {
|
||||||
// TODO: this appears to be about 62% of model render time. Is there a way to call this that doesn't
|
// TODO: this is the majority of model render time. And rendering of a cube model vs the basic Box render
|
||||||
// cost us as much? For example if the same model is used but rendered multiple places is it less
|
// is significantly more expensive. Is there a way to call this that doesn't cost us as much?
|
||||||
// expensive?
|
|
||||||
PerformanceTimer perfTimer("model->render");
|
PerformanceTimer perfTimer("model->render");
|
||||||
_model->render(alpha, modelRenderMode);
|
_model->render(alpha, modelRenderMode);
|
||||||
} else {
|
} else {
|
||||||
|
@ -212,7 +205,7 @@ Model* RenderableModelEntityItem::getModel() {
|
||||||
// EntityTreeRenderer is a Q_OBJECT it can call invokeMethod()
|
// EntityTreeRenderer is a Q_OBJECT it can call invokeMethod()
|
||||||
|
|
||||||
qDebug() << "can't call getModel() on thread other than rendering thread...";
|
qDebug() << "can't call getModel() on thread other than rendering thread...";
|
||||||
//qDebug() << "about to call QMetaObject::invokeMethod(this, 'getModel', Qt::BlockingQueuedConnection,...";
|
|
||||||
//QMetaObject::invokeMethod(this, "getModel", Qt::BlockingQueuedConnection, Q_RETURN_ARG(Model*, _model));
|
//QMetaObject::invokeMethod(this, "getModel", Qt::BlockingQueuedConnection, Q_RETURN_ARG(Model*, _model));
|
||||||
//qDebug() << "got it... _model=" << _model;
|
//qDebug() << "got it... _model=" << _model;
|
||||||
return _model;
|
return _model;
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// RenderableModelEntityItem.h
|
// RenderableModelEntityItem.h
|
||||||
// interface/src/entities
|
// interface/src/entities
|
||||||
//
|
//
|
||||||
// Created by Brad Hefta-Gaub on 12/6/13.
|
// Created by Brad Hefta-Gaub on 8/6/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// RenderableSphereEntityItem.cpp
|
// RenderableSphereEntityItem.cpp
|
||||||
// interface/src
|
// interface/src
|
||||||
//
|
//
|
||||||
// Created by Brad Hefta-Gaub on 12/6/13.
|
// Created by Brad Hefta-Gaub on 8/6/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
@ -33,17 +33,10 @@ void RenderableSphereEntityItem::render(RenderArgs* args) {
|
||||||
assert(getType() == EntityTypes::Sphere);
|
assert(getType() == EntityTypes::Sphere);
|
||||||
glm::vec3 position = getPosition() * (float)TREE_SCALE;
|
glm::vec3 position = getPosition() * (float)TREE_SCALE;
|
||||||
float radius = getRadius() * (float)TREE_SCALE;
|
float radius = getRadius() * (float)TREE_SCALE;
|
||||||
glm::quat rotation = getRotation();
|
|
||||||
|
|
||||||
|
|
||||||
glColor3ub(getColor()[RED_INDEX], getColor()[GREEN_INDEX], getColor()[BLUE_INDEX]);
|
glColor3ub(getColor()[RED_INDEX], getColor()[GREEN_INDEX], getColor()[BLUE_INDEX]);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(position.x, position.y, position.z);
|
glTranslatef(position.x, position.y, position.z);
|
||||||
|
|
||||||
// TODO: we can probably get rid of this rotation until we support different radius dimensions
|
|
||||||
//glm::vec3 axis = glm::axis(rotation);
|
|
||||||
//glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z);
|
|
||||||
glutSolidSphere(radius, 15, 15);
|
glutSolidSphere(radius, 15, 15);
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// RenderableSphereEntityItem.h
|
// RenderableSphereEntityItem.h
|
||||||
// interface/src/entities
|
// interface/src/entities
|
||||||
//
|
//
|
||||||
// Created by Brad Hefta-Gaub on 12/6/13.
|
// Created by Brad Hefta-Gaub on 8/6/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
|
|
@ -133,14 +133,14 @@ void ClipboardScriptingInterface::nudgeVoxel(float x, float y, float z, float s,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ClipboardScriptingInterface::exportModels(const QString& filename, float x, float y, float z, float s) {
|
bool ClipboardScriptingInterface::exportEntities(const QString& filename, float x, float y, float z, float s) {
|
||||||
return Application::getInstance()->exportModels(filename, x, y, z, s);
|
return Application::getInstance()->exportEntities(filename, x, y, z, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClipboardScriptingInterface::importModels(const QString& filename) {
|
bool ClipboardScriptingInterface::importEntities(const QString& filename) {
|
||||||
return Application::getInstance()->importModels(filename);
|
return Application::getInstance()->importEntities(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClipboardScriptingInterface::pasteModels(float x, float y, float z, float s) {
|
void ClipboardScriptingInterface::pasteEntities(float x, float y, float z, float s) {
|
||||||
Application::getInstance()->pasteModels(x, y, z);
|
Application::getInstance()->pasteEntities(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,9 @@ public slots:
|
||||||
void nudgeVoxel(const VoxelDetail& sourceVoxel, const glm::vec3& nudgeVec);
|
void nudgeVoxel(const VoxelDetail& sourceVoxel, const glm::vec3& nudgeVec);
|
||||||
void nudgeVoxel(float x, float y, float z, float s, const glm::vec3& nudgeVec);
|
void nudgeVoxel(float x, float y, float z, float s, const glm::vec3& nudgeVec);
|
||||||
|
|
||||||
bool importModels(const QString& filename);
|
bool importEntities(const QString& filename);
|
||||||
bool exportModels(const QString& filename, float x, float y, float z, float s);
|
bool exportEntities(const QString& filename, float x, float y, float z, float s);
|
||||||
void pasteModels(float x, float y, float z, float s);
|
void pasteEntities(float x, float y, float z, float s);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_ClipboardScriptingInterface_h
|
#endif // hifi_ClipboardScriptingInterface_h
|
||||||
|
|
|
@ -23,14 +23,11 @@ EntityItem* BoxEntityItem::factory(const EntityItemID& entityID, const EntityIte
|
||||||
return new BoxEntityItem(entityID, properties);
|
return new BoxEntityItem(entityID, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
// our non-pure virtual subclass for now...
|
|
||||||
BoxEntityItem::BoxEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) :
|
BoxEntityItem::BoxEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) :
|
||||||
EntityItem(entityItemID, properties)
|
EntityItem(entityItemID, properties)
|
||||||
{
|
{
|
||||||
_type = EntityTypes::Box;
|
_type = EntityTypes::Box;
|
||||||
setProperties(properties);
|
setProperties(properties);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityItemProperties BoxEntityItem::getProperties() const {
|
EntityItemProperties BoxEntityItem::getProperties() const {
|
||||||
|
|
|
@ -19,13 +19,6 @@
|
||||||
#include <VoxelsScriptingInterface.h>
|
#include <VoxelsScriptingInterface.h>
|
||||||
#include <VoxelDetail.h>
|
#include <VoxelDetail.h>
|
||||||
|
|
||||||
|
|
||||||
// This is not ideal, but adding script-engine as a linked library, will cause a circular reference
|
|
||||||
// I'm open to other potential solutions. Could we change cmake to allow libraries to reference each others
|
|
||||||
// headers, but not link to each other, this is essentially what this construct is doing, but would be
|
|
||||||
// better to add includes to the include path, but not link
|
|
||||||
//#include "../../script-engine/src/ScriptEngine.h"
|
|
||||||
|
|
||||||
#include "EntityScriptingInterface.h"
|
#include "EntityScriptingInterface.h"
|
||||||
#include "EntityItem.h"
|
#include "EntityItem.h"
|
||||||
#include "EntityTree.h"
|
#include "EntityTree.h"
|
||||||
|
@ -370,18 +363,20 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet
|
||||||
return appendState;
|
return appendState;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: correct this to reflect changes...
|
// TODO: My goal is to get rid of this concept completely. The old code (and some of the current code) used this
|
||||||
|
// result to calculate if a packet being sent to it was potentially bad or corrupt. I've adjusted this to now
|
||||||
|
// only consider the minimum header bytes as being required. But it would be preferable to completely eliminate
|
||||||
|
// this logic from the callers.
|
||||||
int EntityItem::expectedBytes() {
|
int EntityItem::expectedBytes() {
|
||||||
|
// Header bytes
|
||||||
int expectedBytes = sizeof(uint32_t) // id
|
// object ID [16 bytes]
|
||||||
+ sizeof(float) // age
|
// ByteCountCoded(type code) [~1 byte]
|
||||||
+ sizeof(quint64) // last updated
|
// last edited [8 bytes]
|
||||||
+ sizeof(quint64) // lasted edited
|
// ByteCountCoded(last_edited to last_updated delta) [~1-8 bytes]
|
||||||
+ sizeof(float) // radius
|
// PropertyFlags<>( everything ) [1-2 bytes]
|
||||||
+ sizeof(glm::vec3) // position
|
// ~27-35 bytes...
|
||||||
+ sizeof(rgbColor); // color
|
const int MINIMUM_HEADER_BYTES = 27;
|
||||||
// potentially more...
|
return MINIMUM_HEADER_BYTES;
|
||||||
return expectedBytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -404,7 +399,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
||||||
// ByteCountCoded(last_edited to last_updated delta) [~1-8 bytes]
|
// ByteCountCoded(last_edited to last_updated delta) [~1-8 bytes]
|
||||||
// PropertyFlags<>( everything ) [1-2 bytes]
|
// PropertyFlags<>( everything ) [1-2 bytes]
|
||||||
// ~27-35 bytes...
|
// ~27-35 bytes...
|
||||||
const int MINIMUM_HEADER_BYTES = 27; // TODO: this is not correct, we don't yet have 16 byte IDs
|
const int MINIMUM_HEADER_BYTES = 27;
|
||||||
|
|
||||||
int bytesRead = 0;
|
int bytesRead = 0;
|
||||||
if (bytesLeftToRead >= MINIMUM_HEADER_BYTES) {
|
if (bytesLeftToRead >= MINIMUM_HEADER_BYTES) {
|
||||||
|
|
|
@ -16,20 +16,15 @@
|
||||||
|
|
||||||
#include "EntityItemID.h"
|
#include "EntityItemID.h"
|
||||||
|
|
||||||
//uint32_t EntityItemID::_nextID = 0; // TODO: should be changed to UUID
|
|
||||||
|
|
||||||
// for locally created models
|
// for locally created models
|
||||||
QHash<uint32_t, QUuid> EntityItemID::_tokenIDsToIDs;
|
QHash<uint32_t, QUuid> EntityItemID::_tokenIDsToIDs;
|
||||||
uint32_t EntityItemID::_nextCreatorTokenID = 0;
|
uint32_t EntityItemID::_nextCreatorTokenID = 0;
|
||||||
|
|
||||||
|
|
||||||
EntityItemID::EntityItemID() :
|
EntityItemID::EntityItemID() :
|
||||||
id(NEW_ENTITY),
|
id(NEW_ENTITY),
|
||||||
creatorTokenID(UNKNOWN_ENTITY_TOKEN),
|
creatorTokenID(UNKNOWN_ENTITY_TOKEN),
|
||||||
isKnownID(false)
|
isKnownID(false)
|
||||||
{
|
{
|
||||||
//qDebug() << "EntityItemID::EntityItemID()... isKnownID="
|
|
||||||
// << isKnownID << "id=" << id << "creatorTokenID=" << creatorTokenID;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
EntityItemID::EntityItemID(const EntityItemID& other) :
|
EntityItemID::EntityItemID(const EntityItemID& other) :
|
||||||
|
@ -37,8 +32,6 @@ EntityItemID::EntityItemID(const EntityItemID& other) :
|
||||||
creatorTokenID(other.creatorTokenID),
|
creatorTokenID(other.creatorTokenID),
|
||||||
isKnownID(other.isKnownID)
|
isKnownID(other.isKnownID)
|
||||||
{
|
{
|
||||||
//qDebug() << "EntityItemID::EntityItemID(const EntityItemID& other)... isKnownID="
|
|
||||||
// << isKnownID << "id=" << id << "creatorTokenID=" << creatorTokenID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,8 +40,6 @@ EntityItemID::EntityItemID(const QUuid& id, uint32_t creatorTokenID, bool isKnow
|
||||||
creatorTokenID(creatorTokenID),
|
creatorTokenID(creatorTokenID),
|
||||||
isKnownID(isKnownID)
|
isKnownID(isKnownID)
|
||||||
{
|
{
|
||||||
//qDebug() << "EntityItemID::EntityItemID(uint32_t id, uint32_t creatorTokenID, bool isKnownID)... isKnownID="
|
|
||||||
// << isKnownID << "id=" << id << "creatorTokenID=" << creatorTokenID;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
EntityItemID::EntityItemID(const QUuid& id) :
|
EntityItemID::EntityItemID(const QUuid& id) :
|
||||||
|
@ -56,8 +47,6 @@ EntityItemID::EntityItemID(const QUuid& id) :
|
||||||
creatorTokenID(UNKNOWN_ENTITY_TOKEN),
|
creatorTokenID(UNKNOWN_ENTITY_TOKEN),
|
||||||
isKnownID(true)
|
isKnownID(true)
|
||||||
{
|
{
|
||||||
//qDebug() << "EntityItemID::EntityItemID(uint32_t id)... isKnownID="
|
|
||||||
// << isKnownID << "id=" << id << "creatorTokenID=" << creatorTokenID;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
EntityItemID EntityItemID::getIDfromCreatorTokenID(uint32_t creatorTokenID) {
|
EntityItemID EntityItemID::getIDfromCreatorTokenID(uint32_t creatorTokenID) {
|
||||||
|
@ -79,7 +68,6 @@ EntityItemID EntityItemID::assignActualIDForToken() const {
|
||||||
newlyAssignedEntityID.creatorTokenID = creatorTokenID;
|
newlyAssignedEntityID.creatorTokenID = creatorTokenID;
|
||||||
newlyAssignedEntityID.isKnownID = true;
|
newlyAssignedEntityID.isKnownID = true;
|
||||||
newlyAssignedEntityID.id = QUuid::createUuid();
|
newlyAssignedEntityID.id = QUuid::createUuid();
|
||||||
//_nextID++;
|
|
||||||
|
|
||||||
return newlyAssignedEntityID;
|
return newlyAssignedEntityID;
|
||||||
}
|
}
|
||||||
|
@ -119,9 +107,6 @@ EntityItemID EntityItemID::readEntityItemIDFromBuffer(const unsigned char* data,
|
||||||
|
|
||||||
|
|
||||||
void EntityItemID::handleAddEntityResponse(const QByteArray& packet) {
|
void EntityItemID::handleAddEntityResponse(const QByteArray& packet) {
|
||||||
|
|
||||||
qDebug() << "EntityItemID::handleAddEntityResponse()...";
|
|
||||||
|
|
||||||
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(packet.data());
|
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(packet.data());
|
||||||
int numBytesPacketHeader = numBytesForPacketHeader(packet);
|
int numBytesPacketHeader = numBytesForPacketHeader(packet);
|
||||||
int bytesRead = numBytesPacketHeader;
|
int bytesRead = numBytesPacketHeader;
|
||||||
|
@ -135,8 +120,6 @@ qDebug() << "EntityItemID::handleAddEntityResponse()...";
|
||||||
QUuid entityID = QUuid::fromRfc4122(packet.mid(bytesRead, NUM_BYTES_RFC4122_UUID));
|
QUuid entityID = QUuid::fromRfc4122(packet.mid(bytesRead, NUM_BYTES_RFC4122_UUID));
|
||||||
dataAt += NUM_BYTES_RFC4122_UUID;
|
dataAt += NUM_BYTES_RFC4122_UUID;
|
||||||
|
|
||||||
qDebug() << "EntityItemID::handleAddEntityResponse()... entityID=" << entityID << "creatorTokenID=" << creatorTokenID;
|
|
||||||
|
|
||||||
// add our token to id mapping
|
// add our token to id mapping
|
||||||
_tokenIDsToIDs[creatorTokenID] = entityID;
|
_tokenIDsToIDs[creatorTokenID] = entityID;
|
||||||
}
|
}
|
||||||
|
@ -154,8 +137,3 @@ void EntityItemIDfromScriptValue(const QScriptValue &object, EntityItemID& id) {
|
||||||
id.creatorTokenID = object.property("creatorTokenID").toVariant().toUInt();
|
id.creatorTokenID = object.property("creatorTokenID").toVariant().toUInt();
|
||||||
id.isKnownID = object.property("isKnownID").toVariant().toBool();
|
id.isKnownID = object.property("isKnownID").toVariant().toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -408,17 +408,21 @@ void EntityItemPropertiesFromScriptValue(const QScriptValue &object, EntityItemP
|
||||||
properties.copyFromScriptValue(object);
|
properties.copyFromScriptValue(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Implement support for edit packets that can span an MTU sized buffer. We need to implement a mechanism for the
|
||||||
//////////////////////////////////////////////////////
|
// encodeEntityEditPacket() method to communicate the the caller which properties couldn't fit in the buffer. Similar
|
||||||
//////////////////////////////////////////////////////
|
// to how we handle this in the Octree streaming case.
|
||||||
//////////////////////////////////////////////////////
|
//
|
||||||
//Change this to use property flags...
|
// TODO: Right now, all possible properties for all subclasses are handled here. Ideally we'd prefer
|
||||||
//How do we also change this to support spanning multiple MTUs...
|
// to handle this in a more generic way. Allowing subclasses of EntityItem to register their properties
|
||||||
//Need to output the encode structure like handling packets over the wire...
|
//
|
||||||
//////////////////////////////////////////////////////
|
// TODO: There's a lot of repeated patterns in the code below to handle each property. It would be nice if the property
|
||||||
//////////////////////////////////////////////////////
|
// registration mechanism allowed us to collapse these repeated sections of code into a single implementation that
|
||||||
//////////////////////////////////////////////////////
|
// utilized the registration table to shorten up and simplify this code.
|
||||||
|
//
|
||||||
|
// TODO: Implement support for paged properties, spanning MTU, and custom properties
|
||||||
|
//
|
||||||
|
// TODO: Implement support for script and visible properties.
|
||||||
|
//
|
||||||
bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties,
|
bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties,
|
||||||
unsigned char* bufferOut, int sizeIn, int& sizeOut) {
|
unsigned char* bufferOut, int sizeIn, int& sizeOut) {
|
||||||
|
|
||||||
|
@ -482,9 +486,6 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
// requestedProperties = modelTreeElementExtraEncodeData->includedItems.value(getEntityItemID());
|
// requestedProperties = modelTreeElementExtraEncodeData->includedItems.value(getEntityItemID());
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//qDebug() << "requestedProperties=";
|
|
||||||
//requestedProperties.debugDumpBits();
|
|
||||||
|
|
||||||
LevelDetails entityLevel = packetData.startLevel();
|
LevelDetails entityLevel = packetData.startLevel();
|
||||||
|
|
||||||
// Last Edited quint64 always first, before any other details, which allows us easy access to adjusting this
|
// Last Edited quint64 always first, before any other details, which allows us easy access to adjusting this
|
||||||
|
@ -525,7 +526,6 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
|
|
||||||
// PROP_POSITION
|
// PROP_POSITION
|
||||||
if (requestedProperties.getHasProperty(PROP_POSITION)) {
|
if (requestedProperties.getHasProperty(PROP_POSITION)) {
|
||||||
//qDebug() << "PROP_POSITION requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendPosition(properties.getPosition());
|
successPropertyFits = packetData.appendPosition(properties.getPosition());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -534,18 +534,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_POSITION didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_POSITION NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_POSITION;
|
propertiesDidntFit -= PROP_POSITION;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_RADIUS
|
// PROP_RADIUS
|
||||||
if (requestedProperties.getHasProperty(PROP_RADIUS)) {
|
if (requestedProperties.getHasProperty(PROP_RADIUS)) {
|
||||||
//qDebug() << "PROP_RADIUS requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getRadius());
|
successPropertyFits = packetData.appendValue(properties.getRadius());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -554,18 +551,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_RADIUS didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_RADIUS NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_RADIUS;
|
propertiesDidntFit -= PROP_RADIUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_ROTATION
|
// PROP_ROTATION
|
||||||
if (requestedProperties.getHasProperty(PROP_ROTATION)) {
|
if (requestedProperties.getHasProperty(PROP_ROTATION)) {
|
||||||
//qDebug() << "PROP_ROTATION requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getRotation());
|
successPropertyFits = packetData.appendValue(properties.getRotation());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -574,12 +568,10 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ROTATION didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ROTATION NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_ROTATION;
|
propertiesDidntFit -= PROP_ROTATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -673,12 +665,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
// script would go here...
|
// script would go here...
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// TODO: move these??? how to handle this for subclass properties???
|
|
||||||
|
|
||||||
// PROP_COLOR
|
// PROP_COLOR
|
||||||
if (requestedProperties.getHasProperty(PROP_COLOR)) {
|
if (requestedProperties.getHasProperty(PROP_COLOR)) {
|
||||||
//qDebug() << "PROP_COLOR requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendColor(properties.getColor());
|
successPropertyFits = packetData.appendColor(properties.getColor());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -687,18 +675,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_COLOR didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_COLOR NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_COLOR;
|
propertiesDidntFit -= PROP_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_MODEL_URL
|
// PROP_MODEL_URL
|
||||||
if (requestedProperties.getHasProperty(PROP_MODEL_URL)) {
|
if (requestedProperties.getHasProperty(PROP_MODEL_URL)) {
|
||||||
//qDebug() << "PROP_MODEL_URL requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getModelURL());
|
successPropertyFits = packetData.appendValue(properties.getModelURL());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -707,18 +692,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_MODEL_URL didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_MODEL_URL NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_MODEL_URL;
|
propertiesDidntFit -= PROP_MODEL_URL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_ANIMATION_URL
|
// PROP_ANIMATION_URL
|
||||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_URL)) {
|
if (requestedProperties.getHasProperty(PROP_ANIMATION_URL)) {
|
||||||
//qDebug() << "PROP_ANIMATION_URL requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getAnimationURL());
|
successPropertyFits = packetData.appendValue(properties.getAnimationURL());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -727,18 +709,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_URL didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_URL NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_ANIMATION_URL;
|
propertiesDidntFit -= PROP_ANIMATION_URL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_ANIMATION_FPS
|
// PROP_ANIMATION_FPS
|
||||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_FPS)) {
|
if (requestedProperties.getHasProperty(PROP_ANIMATION_FPS)) {
|
||||||
//qDebug() << "PROP_ANIMATION_FPS requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getAnimationFPS());
|
successPropertyFits = packetData.appendValue(properties.getAnimationFPS());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -747,18 +726,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_FPS didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_FPS NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_ANIMATION_FPS;
|
propertiesDidntFit -= PROP_ANIMATION_FPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_ANIMATION_FRAME_INDEX
|
// PROP_ANIMATION_FRAME_INDEX
|
||||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) {
|
if (requestedProperties.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) {
|
||||||
//qDebug() << "PROP_ANIMATION_FRAME_INDEX requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getAnimationFrameIndex());
|
successPropertyFits = packetData.appendValue(properties.getAnimationFrameIndex());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -767,18 +743,15 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_FRAME_INDEX didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_FRAME_INDEX NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_ANIMATION_FRAME_INDEX;
|
propertiesDidntFit -= PROP_ANIMATION_FRAME_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROP_ANIMATION_PLAYING
|
// PROP_ANIMATION_PLAYING
|
||||||
if (requestedProperties.getHasProperty(PROP_ANIMATION_PLAYING)) {
|
if (requestedProperties.getHasProperty(PROP_ANIMATION_PLAYING)) {
|
||||||
//qDebug() << "PROP_ANIMATION_PLAYING requested...";
|
|
||||||
LevelDetails propertyLevel = packetData.startLevel();
|
LevelDetails propertyLevel = packetData.startLevel();
|
||||||
successPropertyFits = packetData.appendValue(properties.getAnimationIsPlaying());
|
successPropertyFits = packetData.appendValue(properties.getAnimationIsPlaying());
|
||||||
if (successPropertyFits) {
|
if (successPropertyFits) {
|
||||||
|
@ -787,17 +760,12 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
propertyCount++;
|
propertyCount++;
|
||||||
packetData.endLevel(propertyLevel);
|
packetData.endLevel(propertyLevel);
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_PLAYING didn't fit...";
|
|
||||||
packetData.discardLevel(propertyLevel);
|
packetData.discardLevel(propertyLevel);
|
||||||
appendState = OctreeElement::PARTIAL;
|
appendState = OctreeElement::PARTIAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//qDebug() << "PROP_ANIMATION_PLAYING NOT requested...";
|
|
||||||
propertiesDidntFit -= PROP_ANIMATION_PLAYING;
|
propertiesDidntFit -= PROP_ANIMATION_PLAYING;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (propertyCount > 0) {
|
if (propertyCount > 0) {
|
||||||
int endOfEntityItemData = packetData.getUncompressedByteOffset();
|
int endOfEntityItemData = packetData.getUncompressedByteOffset();
|
||||||
|
@ -829,16 +797,9 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
appendState = OctreeElement::NONE; // if we got here, then we didn't include the item
|
appendState = OctreeElement::NONE; // if we got here, then we didn't include the item
|
||||||
}
|
}
|
||||||
|
|
||||||
//qDebug() << "propertyFlags=";
|
|
||||||
//propertyFlags.debugDumpBits();
|
|
||||||
|
|
||||||
//qDebug() << "propertiesDidntFit=";
|
|
||||||
//propertiesDidntFit.debugDumpBits();
|
|
||||||
|
|
||||||
// If any part of the model items didn't fit, then the element is considered partial
|
// If any part of the model items didn't fit, then the element is considered partial
|
||||||
if (appendState != OctreeElement::COMPLETED) {
|
if (appendState != OctreeElement::COMPLETED) {
|
||||||
|
|
||||||
|
|
||||||
// TODO: handle mechanism for handling partial fitting data!
|
// TODO: handle mechanism for handling partial fitting data!
|
||||||
// add this item into our list for the next appendElementData() pass
|
// add this item into our list for the next appendElementData() pass
|
||||||
//modelTreeElementExtraEncodeData->includedItems.insert(getEntityItemID(), propertiesDidntFit);
|
//modelTreeElementExtraEncodeData->includedItems.insert(getEntityItemID(), propertiesDidntFit);
|
||||||
|
@ -872,6 +833,18 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem
|
||||||
// how to handle lastEdited?
|
// how to handle lastEdited?
|
||||||
// how to handle lastUpdated?
|
// how to handle lastUpdated?
|
||||||
// consider handling case where no properties are included... we should just ignore this packet...
|
// consider handling case where no properties are included... we should just ignore this packet...
|
||||||
|
//
|
||||||
|
// TODO: Right now, all possible properties for all subclasses are handled here. Ideally we'd prefer
|
||||||
|
// to handle this in a more generic way. Allowing subclasses of EntityItem to register their properties
|
||||||
|
//
|
||||||
|
// TODO: There's a lot of repeated patterns in the code below to handle each property. It would be nice if the property
|
||||||
|
// registration mechanism allowed us to collapse these repeated sections of code into a single implementation that
|
||||||
|
// utilized the registration table to shorten up and simplify this code.
|
||||||
|
//
|
||||||
|
// TODO: Implement support for paged properties, spanning MTU, and custom properties
|
||||||
|
//
|
||||||
|
// TODO: Implement support for script and visible properties.
|
||||||
|
//
|
||||||
bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes,
|
bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes,
|
||||||
EntityItemID& entityID, EntityItemProperties& properties) {
|
EntityItemID& entityID, EntityItemProperties& properties) {
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
|
@ -904,7 +877,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
|
||||||
memcpy(&lastEdited, dataAt, sizeof(lastEdited));
|
memcpy(&lastEdited, dataAt, sizeof(lastEdited));
|
||||||
dataAt += sizeof(lastEdited);
|
dataAt += sizeof(lastEdited);
|
||||||
processedBytes += sizeof(lastEdited);
|
processedBytes += sizeof(lastEdited);
|
||||||
//qDebug() << "EntityItemProperties::decodeEntityEditPacket() ... lastEdited=" << lastEdited;
|
|
||||||
properties.setLastEdited(lastEdited);
|
properties.setLastEdited(lastEdited);
|
||||||
|
|
||||||
// encoded id
|
// encoded id
|
||||||
|
@ -957,7 +929,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
|
||||||
dataAt += encodedType.size();
|
dataAt += encodedType.size();
|
||||||
processedBytes += encodedType.size();
|
processedBytes += encodedType.size();
|
||||||
|
|
||||||
|
|
||||||
// Update Delta - when was this item updated relative to last edit... this really should be 0
|
// Update Delta - when was this item updated relative to last edit... this really should be 0
|
||||||
// TODO: Should we get rid of this in this in edit packets, since this has to always be 0?
|
// TODO: Should we get rid of this in this in edit packets, since this has to always be 0?
|
||||||
// TODO: do properties need to handle lastupdated???
|
// TODO: do properties need to handle lastupdated???
|
||||||
|
@ -1057,10 +1028,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
|
||||||
// script would go here...
|
// script would go here...
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// TODO: this needs to be reconciled...
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// PROP_COLOR
|
// PROP_COLOR
|
||||||
if (propertyFlags.getHasProperty(PROP_COLOR)) {
|
if (propertyFlags.getHasProperty(PROP_COLOR)) {
|
||||||
xColor color;
|
xColor color;
|
||||||
|
|
|
@ -75,9 +75,10 @@ typedef PropertyFlags<EntityPropertyList> EntityPropertyFlags;
|
||||||
/// set of entity item properties via JavaScript hashes/QScriptValues
|
/// set of entity item properties via JavaScript hashes/QScriptValues
|
||||||
/// all units for position, radius, etc are in meter units
|
/// all units for position, radius, etc are in meter units
|
||||||
class EntityItemProperties {
|
class EntityItemProperties {
|
||||||
friend class EntityItem; // TODO: consider removing this friend relationship and have EntityItem use public methods
|
friend class EntityItem; // TODO: consider removing this friend relationship and use public methods
|
||||||
friend class ModelEntityItem; // TODO: consider removing this friend relationship and have EntityItem use public methods
|
friend class ModelEntityItem; // TODO: consider removing this friend relationship and use public methods
|
||||||
friend class BoxEntityItem; // TODO: consider removing this friend relationship and have EntityItem use public methods
|
friend class BoxEntityItem; // TODO: consider removing this friend relationship and use public methods
|
||||||
|
friend class SphereEntityItem; // TODO: consider removing this friend relationship and use public methods
|
||||||
public:
|
public:
|
||||||
EntityItemProperties();
|
EntityItemProperties();
|
||||||
virtual ~EntityItemProperties() { };
|
virtual ~EntityItemProperties() { };
|
||||||
|
@ -100,19 +101,9 @@ public:
|
||||||
glm::vec3 getMaximumPointTreeUnits() const { return getMaximumPointMeters() / (float)TREE_SCALE; }
|
glm::vec3 getMaximumPointTreeUnits() const { return getMaximumPointMeters() / (float)TREE_SCALE; }
|
||||||
/// AACube in domain scale units (0.0 - 1.0)
|
/// AACube in domain scale units (0.0 - 1.0)
|
||||||
AACube getAACubeTreeUnits() const {
|
AACube getAACubeTreeUnits() const {
|
||||||
glm::vec3 cornerInTreeUnits = getMinimumPointMeters()/(float)TREE_SCALE;
|
return AACube(getMinimumPointMeters() / (float)TREE_SCALE, getMaxDimension() / (float)TREE_SCALE);
|
||||||
float dimensionInTreeUnits = getMaxDimension()/(float)TREE_SCALE;
|
|
||||||
/*
|
|
||||||
qDebug() << " getAACubeTreeUnits()";
|
|
||||||
qDebug() << " corner in meters=" << getMinimumPointMeters().x << "," << getMinimumPointMeters().y << "," << getMinimumPointMeters().z;
|
|
||||||
qDebug() << " dimension in meters=" << getMaxDimension();
|
|
||||||
qDebug() << " corner in tree units=" << cornerInTreeUnits.x << "," << cornerInTreeUnits.y << "," << cornerInTreeUnits.z;
|
|
||||||
qDebug() << " dimension in tree units=" << dimensionInTreeUnits;
|
|
||||||
*/
|
|
||||||
return AACube(cornerInTreeUnits, dimensionInTreeUnits);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void debugDump() const;
|
void debugDump() const;
|
||||||
|
|
||||||
// properties of all entities
|
// properties of all entities
|
||||||
|
@ -132,11 +123,15 @@ public:
|
||||||
float getMass() const { return _mass; }
|
float getMass() const { return _mass; }
|
||||||
void setMass(float value) { _mass = value; _massChanged = true; }
|
void setMass(float value) { _mass = value; _massChanged = true; }
|
||||||
|
|
||||||
const glm::vec3& getVelocity() const { return _velocity; } /// velocity in domain scale units (0.0-1.0) per second
|
/// velocity in domain scale units (0.0-1.0) per second
|
||||||
void setVelocity(const glm::vec3& value) { _velocity = value; _velocityChanged = true; } /// velocity in domain scale units (0.0-1.0) per second
|
const glm::vec3& getVelocity() const { return _velocity; }
|
||||||
|
/// velocity in domain scale units (0.0-1.0) per second
|
||||||
|
void setVelocity(const glm::vec3& value) { _velocity = value; _velocityChanged = true; }
|
||||||
|
|
||||||
const glm::vec3& getGravity() const { return _gravity; } /// gravity in domain scale units (0.0-1.0) per second squared
|
/// gravity in domain scale units (0.0-1.0) per second squared
|
||||||
void setGravity(const glm::vec3& value) { _gravity = value; _gravityChanged = true; } /// gravity in domain scale units (0.0-1.0) per second squared
|
const glm::vec3& getGravity() const { return _gravity; }
|
||||||
|
/// gravity in domain scale units (0.0-1.0) per second squared
|
||||||
|
void setGravity(const glm::vec3& value) { _gravity = value; _gravityChanged = true; }
|
||||||
|
|
||||||
float getDamping() const { return _damping; }
|
float getDamping() const { return _damping; }
|
||||||
void setDamping(float value) { _damping = value; _dampingChanged = true; }
|
void setDamping(float value) { _damping = value; _dampingChanged = true; }
|
||||||
|
|
|
@ -90,8 +90,6 @@ EntityItemProperties EntityScriptingInterface::getEntityProperties(EntityItemID
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EntityItemID EntityScriptingInterface::editEntity(EntityItemID entityID, const EntityItemProperties& properties) {
|
EntityItemID EntityScriptingInterface::editEntity(EntityItemID entityID, const EntityItemProperties& properties) {
|
||||||
EntityItemID actualID = entityID;
|
EntityItemID actualID = entityID;
|
||||||
|
|
||||||
|
@ -104,7 +102,6 @@ EntityItemID EntityScriptingInterface::editEntity(EntityItemID entityID, const E
|
||||||
if (actualID.id != UNKNOWN_ENTITY_ID) {
|
if (actualID.id != UNKNOWN_ENTITY_ID) {
|
||||||
entityID.id = actualID.id;
|
entityID.id = actualID.id;
|
||||||
entityID.isKnownID = true;
|
entityID.isKnownID = true;
|
||||||
//qDebug() << "EntityScriptingInterface::editEntity()... isKnownID=" << entityID.isKnownID << "id=" << entityID.id << "creatorTokenID=" << entityID.creatorTokenID;
|
|
||||||
queueEntityMessage(PacketTypeEntityAddOrEdit, entityID, properties);
|
queueEntityMessage(PacketTypeEntityAddOrEdit, entityID, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,19 +109,12 @@ EntityItemID EntityScriptingInterface::editEntity(EntityItemID entityID, const E
|
||||||
// the actual id, because we can edit out local models just with creatorTokenID
|
// the actual id, because we can edit out local models just with creatorTokenID
|
||||||
if (_entityTree) {
|
if (_entityTree) {
|
||||||
_entityTree->lockForWrite();
|
_entityTree->lockForWrite();
|
||||||
//qDebug() << "EntityScriptingInterface::editEntity() ******* START _entityTree->updateEntity()...";
|
|
||||||
_entityTree->updateEntity(entityID, properties);
|
_entityTree->updateEntity(entityID, properties);
|
||||||
//qDebug() << "EntityScriptingInterface::editEntity() ******* DONE _entityTree->updateEntity()...";
|
|
||||||
_entityTree->unlock();
|
_entityTree->unlock();
|
||||||
}
|
}
|
||||||
return entityID;
|
return entityID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: This deleteEntity() method uses the PacketTypeEntityAddOrEdit message to send
|
|
||||||
// a changed model with a shouldDie() property set to true. This works and is currently the only
|
|
||||||
// way to tell the model server to delete a model. But we should change this to use the PacketTypeEntityErase
|
|
||||||
// message which takes a list of model id's to delete.
|
|
||||||
void EntityScriptingInterface::deleteEntity(EntityItemID entityID) {
|
void EntityScriptingInterface::deleteEntity(EntityItemID entityID) {
|
||||||
|
|
||||||
EntityItemID actualID = entityID;
|
EntityItemID actualID = entityID;
|
||||||
|
@ -220,10 +210,6 @@ RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionWorke
|
||||||
result.intersects = _entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, result.face,
|
result.intersects = _entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, result.face,
|
||||||
(void**)&intersectedEntity, lockType, &result.accurate);
|
(void**)&intersectedEntity, lockType, &result.accurate);
|
||||||
if (result.intersects && intersectedEntity) {
|
if (result.intersects && intersectedEntity) {
|
||||||
|
|
||||||
//qDebug() << "findRayIntersectionWorker().... intersectedEntity=" << intersectedEntity;
|
|
||||||
//intersectedEntity->debugDump();
|
|
||||||
|
|
||||||
result.entityID = intersectedEntity->getEntityItemID();
|
result.entityID = intersectedEntity->getEntityItemID();
|
||||||
result.properties = intersectedEntity->getProperties();
|
result.properties = intersectedEntity->getProperties();
|
||||||
result.intersection = ray.origin + (ray.direction * result.distance);
|
result.intersection = ray.origin + (ray.direction * result.distance);
|
||||||
|
|
|
@ -34,6 +34,7 @@ Model properties:
|
||||||
// REQUIRED TO DO:
|
// REQUIRED TO DO:
|
||||||
|
|
||||||
1) random crashes on moving (I think things going out of bounds???)
|
1) random crashes on moving (I think things going out of bounds???)
|
||||||
|
|
||||||
2) some jutter with moving entities
|
2) some jutter with moving entities
|
||||||
|
|
||||||
3) test animation again...
|
3) test animation again...
|
||||||
|
@ -41,8 +42,13 @@ Model properties:
|
||||||
4) clear all entities when changing domains?
|
4) clear all entities when changing domains?
|
||||||
5) what to do with entities
|
5) what to do with entities
|
||||||
|
|
||||||
|
6) Test file save load for case where two siblings have more than MTU amount of data. I wonder if the fact that file save
|
||||||
|
doesn't include the extra exists bits will break something.
|
||||||
|
|
||||||
|
7) memory leaks???
|
||||||
|
|
||||||
|
8) EntityTreeRenderer::clearModelsCache()
|
||||||
|
|
||||||
4) memory leaks???
|
|
||||||
5) Import/Export Models - verify it works. /copy/paste??
|
5) Import/Export Models - verify it works. /copy/paste??
|
||||||
22a) void ModelItemProperties::copyFromNewModelItem(const ModelItem& modelItem); // XXX ??? Do we need this????
|
22a) void ModelItemProperties::copyFromNewModelItem(const ModelItem& modelItem); // XXX ??? Do we need this????
|
||||||
22b) Local Entities Overlay - from Local Models Overlay
|
22b) Local Entities Overlay - from Local Models Overlay
|
||||||
|
|
Loading…
Reference in a new issue