本文整理汇总了C++中PortalLayout类的典型用法代码示例。如果您正苦于以下问题:C++ PortalLayout类的具体用法?C++ PortalLayout怎么用?C++ PortalLayout使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了PortalLayout类的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _locker
PortalLayout* TemplateManager::getPortalLayout(const String& fileName) {
Locker _locker(&appearanceMapLock);
PortalLayout* portalLayout = portalLayoutMap->get(fileName);
if (portalLayout == NULL) {
IffStream* iffStream = openIffFile(fileName);
if (iffStream != NULL) {
try {
portalLayout = new PortalLayout();
portalLayout->readObject(iffStream);
info("parsed " + fileName);
} catch (Exception& e) {
info("could not parse " + fileName);
delete portalLayout;
portalLayout = NULL;
}
delete iffStream;
iffStream = NULL;
portalLayoutMap->put(fileName, portalLayout);
}
}
return portalLayout;
//return NULL;
}
示例2: getAABBTree
AABBTree* CollisionManager::getAABBTree(SceneObject* scno, int collisionBlockFlags) {
SharedObjectTemplate* templateObject = scno->getObjectTemplate();
if (templateObject == NULL)
return NULL;
if (!(templateObject->getCollisionActionBlockFlags() & collisionBlockFlags))
return NULL;
PortalLayout* portalLayout = templateObject->getPortalLayout();
MeshAppearanceTemplate* mesh = NULL;
if (portalLayout != NULL) {
mesh = portalLayout->getMeshAppearanceTemplate(0);
} else {
AppearanceTemplate* appTemplate = templateObject->getAppearanceTemplate();
if (appTemplate == NULL)
return NULL;
mesh = dynamic_cast<MeshAppearanceTemplate*>(appTemplate->getFirstMesh());
}
if (mesh == NULL)
return NULL;
return mesh->getAABBTree();
}
示例3: checkLineOfSightWorldToCell
bool CollisionManager::checkLineOfSightWorldToCell(const Vector3& rayOrigin, const Vector3& rayEnd, float distance, CellObject* cellObject) {
ManagedReference<SceneObject*> building = cellObject->getParent();
if (building == NULL)
return true;
SharedObjectTemplate* objectTemplate = building->getObjectTemplate();
PortalLayout* portalLayout = objectTemplate->getPortalLayout();
if (portalLayout == NULL)
return true;
Ray ray = convertToModelSpace(rayOrigin, rayEnd, building);
if (cellObject->getCellNumber() >= portalLayout->getAppearanceTemplatesSize())
return true;
MeshAppearanceTemplate* app = portalLayout->getMeshAppearanceTemplate(cellObject->getCellNumber());
AABBTree* aabbTree = app->getAABBTree();
if (aabbTree == NULL)
return true;
float intersectionDistance;
Triangle* triangle = NULL;
if (aabbTree->intersects(ray, distance, intersectionDistance, triangle, true))
return false;
return true;
}
示例4: findPathFromCellToDifferentCell
Vector<WorldCoordinates>* PathFinderManager::findPathFromCellToCell(const WorldCoordinates& pointA, const WorldCoordinates& pointB) {
CellObject* ourCell = pointA.getCell();
CellObject* targetCell = pointB.getCell();
if (ourCell != targetCell)
return findPathFromCellToDifferentCell(pointA, pointB);
int ourCellID = ourCell->getCellNumber();
ManagedReference<BuildingObject*> building = cast<BuildingObject*>( ourCell->getParent().get().get());
SharedObjectTemplate* templateObject = building->getObjectTemplate();
if (templateObject == NULL)
return NULL;
PortalLayout* portalLayout = templateObject->getPortalLayout();
if (portalLayout == NULL)
return NULL;
FloorMesh* floorMesh1 = portalLayout->getFloorMesh(ourCellID);
PathGraph* pathGraph1 = floorMesh1->getPathGraph();
Vector<WorldCoordinates>* path = new Vector<WorldCoordinates>(5, 1);
path->add(pointA); // adding source
//info("same cell... trying to calculate triangle path", true);
Vector<Triangle*>* trianglePath = NULL;
//info("searching floorMesh for cellID " + String::valueOf(ourCellID), true);
int res = getFloorPath(pointA.getPoint(), pointB.getPoint(), floorMesh1, trianglePath);
if (res == -1) { //points in the same triangle
path->add(pointB);
return path;
}
if (trianglePath == NULL) { // returning NULL, no path found
//error("path NULL");
delete path;
return findPathFromCellToDifferentCell(pointA, pointB);
} else {
//info("path found", true);
addTriangleNodeEdges(pointA.getPoint(), pointB.getPoint(), trianglePath, path, ourCell);
delete trianglePath;
path->add(pointB); //adding destination
return path;
}
return path;
}
示例5: checkLineOfSightInParentCell
bool CollisionManager::checkLineOfSightInParentCell(SceneObject* object, Vector3& endPoint) {
ManagedReference<SceneObject*> parent = object->getParent();
if (parent == NULL || !parent->isCellObject())
return true;
CellObject* cell = cast<CellObject*>( parent.get());
SharedObjectTemplate* objectTemplate = parent->getRootParent().get()->getObjectTemplate();
PortalLayout* portalLayout = objectTemplate->getPortalLayout();
MeshAppearanceTemplate* appearanceMesh = NULL;
if (portalLayout == NULL)
return true;
try {
appearanceMesh = portalLayout->getMeshAppearanceTemplate(cell->getCellNumber());
} catch (Exception& e) {
return true;
}
if (appearanceMesh == NULL) {
//info("null appearance mesh ");
return true;
}
AABBTree* aabbTree = appearanceMesh->getAABBTree();
if (aabbTree == NULL)
return true;
//switching Y<->Z, adding 0.1 to account floor
Vector3 startPoint = object->getPosition();
startPoint.set(startPoint.getX(), startPoint.getY(), startPoint.getZ() + 0.1f);
endPoint.set(endPoint.getX(), endPoint.getY(), endPoint.getZ() + 0.1f);
Vector3 dir = endPoint - startPoint;
dir.normalize();
float distance = endPoint.distanceTo(startPoint);
float intersectionDistance;
Ray ray(startPoint, dir);
Triangle* triangle = NULL;
//nothing in the middle
if (aabbTree->intersects(ray, distance, intersectionDistance, triangle, true))
return false;
Ray ray2(endPoint, Vector3(0, -1, 0));
//check if we are in the cell with dir (0, -1, 0)
if (!aabbTree->intersects(ray2, 64000.f, intersectionDistance, triangle, true))
return false;
return true;
}
示例6: rayStart
Vector<float>* CollisionManager::getCellFloorCollision(float x, float y, CellObject* cellObject) {
Vector<float>* collisions = NULL;
ManagedReference<SceneObject*> rootObject = cellObject->getRootParent();
if (rootObject == NULL)
return NULL;
SharedObjectTemplate* templateObject = rootObject->getObjectTemplate();
if (templateObject == NULL)
return NULL;
PortalLayout* portalLayout = templateObject->getPortalLayout();
if (portalLayout == NULL)
return NULL;
FloorMesh* mesh = portalLayout->getFloorMesh(cellObject->getCellNumber());
if (mesh == NULL)
return NULL;
AABBTree* tree = mesh->getAABBTree();
if (tree == NULL)
return NULL;
Vector3 rayStart(x, 16384.f, y);
Vector3 rayEnd(x, -16384.f, y);
Vector3 norm = rayEnd - rayStart;
norm.normalize();
Ray ray(rayStart, norm);
SortedVector<IntersectionResult> results(3, 2);
tree->intersects(ray, 16384 * 2, results);
if (results.size() == 0)
return NULL;
collisions = new Vector<float>(results.size(), 1);
for (int i = 0; i < results.size(); ++i) {
float floorHeight = 16384 - results.get(i).getIntersectionDistance();
collisions->add(floorHeight);
}
return collisions;
}
示例7: getFloorMesh
FloorMesh* PathFinderManager::getFloorMesh(CellObject* cell) {
ManagedReference<BuildingObject*> building1 = (cell->getParent().get().castTo<BuildingObject*>());
SharedObjectTemplate* templateObject = building1->getObjectTemplate();
if (templateObject == NULL) {
return NULL;
}
PortalLayout* portalLayout = templateObject->getPortalLayout();
if (portalLayout == NULL) {
return NULL;
}
FloorMesh* floorMesh1 = portalLayout->getFloorMesh(cell->getCellNumber());
return floorMesh1;
}
示例8: checkLineOfSightInBuilding
bool CollisionManager::checkLineOfSightInBuilding(SceneObject* object1, SceneObject* object2, SceneObject* building) {
SharedObjectTemplate* objectTemplate = building->getObjectTemplate();
PortalLayout* portalLayout = objectTemplate->getPortalLayout();
if (portalLayout == NULL)
return true;
//we are in model space... in cells
Vector3 rayOrigin = object1->getPosition();
rayOrigin.set(rayOrigin.getX(), rayOrigin.getY(), rayOrigin.getZ() + 1.f);
Vector3 rayEnd = object2->getPosition();
rayEnd.set(rayEnd.getX(), rayEnd.getY(), rayEnd.getZ() + 1.f);
Vector3 direction(Vector3(rayEnd - rayOrigin));
direction.normalize();
float distance = rayEnd.distanceTo(rayOrigin);
float intersectionDistance;
Ray ray(rayOrigin, direction);
Triangle* triangle = NULL;
// we check interior cells
for (int i = 1; i < portalLayout->getAppearanceTemplatesSize(); ++i) {
MeshAppearanceTemplate* app = portalLayout->getMeshAppearanceTemplate(i);
AABBTree* aabbTree = app->getAABBTree();
if (aabbTree == NULL)
continue;
if (aabbTree->intersects(ray, distance, intersectionDistance, triangle, true))
return false;
}
return true;
}
示例9: coord
Vector<WorldCoordinates>* PathFinderManager::findPathFromCellToDifferentCell(const WorldCoordinates& pointA, const WorldCoordinates& pointB) {
//info ("findPathFromCellToDifferentCell", true);
CellObject* ourCell = pointA.getCell();
CellObject* targetCell = pointB.getCell();
int ourCellID = ourCell->getCellNumber();
int targetCellID = targetCell->getCellNumber();
ManagedReference<BuildingObject*> building1 = cast<BuildingObject*>( ourCell->getParent().get().get());
ManagedReference<BuildingObject*> building2 = cast<BuildingObject*>( targetCell->getParent().get().get());
if (building1 != building2) // TODO: implement path finding between 2 buildings
return NULL;
SharedObjectTemplate* templateObject = building1->getObjectTemplate();
if (templateObject == NULL)
return NULL;
PortalLayout* portalLayout = templateObject->getPortalLayout();
if (portalLayout == NULL)
return NULL;
FloorMesh* floorMesh1 = portalLayout->getFloorMesh(ourCellID);
FloorMesh* floorMesh2 = portalLayout->getFloorMesh(targetCellID);
if (floorMesh2->getCellID() != targetCellID)
error("floorMes2 cellID != targetCellID");
//info("targetCellID:" + String::valueOf(targetCellID), true);
PathGraph* pathGraph1 = floorMesh1->getPathGraph();
PathGraph* pathGraph2 = floorMesh2->getPathGraph();
Vector<WorldCoordinates>* path = new Vector<WorldCoordinates>(5, 1);
path->add(pointA); // adding source
//PathNode* source = pathGraph1->findNearestNode(pointA.getPoint());
TriangleNode* nearestSourceNodeTriangle = CollisionManager::getTriangle(pointA.getPoint(), floorMesh1);
if (nearestSourceNodeTriangle == NULL) {
delete path;
return NULL;
}
PathNode* source = CollisionManager::findNearestPathNode(nearestSourceNodeTriangle, floorMesh1, pointB.getPoint());//targetPathGraph->findNearestNode(pointB.getPoint());
if (source == NULL) {
delete path;
return NULL;
}
//PathNode* target = pathGraph2->findNearestNode(pointB.getPoint());
TriangleNode* nearestTargetNodeTriangle = CollisionManager::getTriangle(pointB.getPoint(), floorMesh2);
if (nearestTargetNodeTriangle == NULL) {
delete path;
return NULL;
}
PathNode* target = CollisionManager::findNearestPathNode(nearestTargetNodeTriangle, floorMesh2, pointB.getPoint());//targetPathGraph->findNearestNode(pointB.getPoint());
if (target == NULL) {
delete path;
return NULL;
}
Vector<PathNode*>* nodes = portalLayout->getPath(source, target);
if (nodes == NULL) {
StringBuffer str;
str << "Could not find path from node: " << source->getID()
<< " to node: " << target->getID() << " in building: "
<< templateObject->getFullTemplateString();
log(str.toString());
delete path;
return NULL;
}
// FIXME (dannuic): Sometimes nodes only have one entry.... why?
if (nodes->size() == 1) {
error("Only one node");
delete path;
return NULL;
}
// path from our position to path node
Vector<Triangle*>* trianglePath = NULL;
int res = getFloorPath(pointA.getPoint(), nodes->get(1)->getPosition(), floorMesh1, trianglePath);
if (res != -1 && trianglePath != NULL)
addTriangleNodeEdges(pointA.getPoint(), nodes->get(1)->getPosition(), trianglePath, path, ourCell);
if (trianglePath != NULL) {
//.........这里部分代码省略.........
示例10: error
Vector<WorldCoordinates>* PathFinderManager::findPathFromWorldToCell(const WorldCoordinates& pointA, const WorldCoordinates& pointB, Zone *zone) {
CellObject* targetCell = pointB.getCell();
if (targetCell == NULL)
return NULL;
ManagedReference<BuildingObject*> building = dynamic_cast<BuildingObject*>(targetCell->getParent().get().get());
if (building == NULL) {
error("building == NULL in PathFinderManager::findPathFromWorldToCell");
return NULL;
}
SharedObjectTemplate* templateObject = building->getObjectTemplate();
if (templateObject == NULL)
return NULL;
PortalLayout* portalLayout = templateObject->getPortalLayout();
if (portalLayout == NULL)
return NULL;
//find nearest entrance
FloorMesh* exteriorFloorMesh = portalLayout->getFloorMesh(0); // get outside layout
if (exteriorFloorMesh == NULL)
return NULL;
PathGraph* exteriorPathGraph = exteriorFloorMesh->getPathGraph();
FloorMesh* targetFloorMesh = portalLayout->getFloorMesh(targetCell->getCellNumber());
PathGraph* targetPathGraph = targetFloorMesh->getPathGraph();
Vector<WorldCoordinates>* path = new Vector<WorldCoordinates>(5, 1);
path->add(pointA);
Vector3 transformedPosition = transformToModelSpace(pointA.getPoint(), building);
PathNode* nearestEntranceNode = exteriorPathGraph->findNearestNode(transformedPosition);
if (nearestEntranceNode == NULL) {
error("NULL entrance node for building " + templateObject->getFullTemplateString());
delete path;
return NULL;
}
//PathNode* nearestTargetNode = targetPathGraph->findNearestNode(pointB.getPoint());
TriangleNode* nearestTargetNodeTriangle = CollisionManager::getTriangle(pointB.getPoint(), targetFloorMesh);
if (nearestTargetNodeTriangle == NULL) {
delete path;
return NULL;
}
PathNode* nearestTargetNode = CollisionManager::findNearestPathNode(nearestTargetNodeTriangle, targetFloorMesh, pointB.getPoint());//targetPathGraph->findNearestNode(pointB.getPoint());
if (nearestTargetNode == NULL) {
delete path;
return NULL;
}
/*if (nearestEntranceNode == nearestTargetNode)
info("nearestEntranceNode == nearestTargetNode", true);*/
//find graph from outside to appropriate cell
Vector<PathNode*>* pathToCell = portalLayout->getPath(nearestEntranceNode, nearestTargetNode);
if (pathToCell == NULL) {
error("pathToCell = portalLayout->getPath(nearestEntranceNode, nearestTargetNode); == NULL");
delete path;
return NULL;
}
for (int i = 0; i < pathToCell->size(); ++i) {
PathNode* pathNode = pathToCell->get(i);
PathGraph* pathGraph = pathNode->getPathGraph();
FloorMesh* floorMesh = pathGraph->getFloorMesh();
int cellID = floorMesh->getCellID();
//info("cellID:" + String::valueOf(cellID), true);
if (cellID == 0) { // we are still outside
WorldCoordinates coord(pathNode->getPosition(), targetCell);
path->add(WorldCoordinates(coord.getWorldPosition(), NULL));
} else { // we are inside the building
CellObject* pathCell = building->getCell(cellID);
path->add(WorldCoordinates(pathNode->getPosition(), pathCell));
if (i == pathToCell->size() - 1)
if (pathCell != targetCell) {
error("final cell not target cell");
}
}
}
delete pathToCell;
//.........这里部分代码省略.........