void MainWindow::enterLocation() { auto player = world()->player(); if (!player) { qDebug("No player. Will not enter any location"); return; } auto global_pos = player->scenePos(); qDebug() << "Player global position:" << global_pos.x() << global_pos.y(); auto global_cell = world()->globalField()->cell(global_pos); auto local_pos = global_pos * global_cell->sceneMatrix().inverted(); qDebug() << "Player local position:" << local_pos.x() << local_pos.y(); if (global_cell) { //world()->globalField()->removeItem(player); auto v = global_cell->localField(); connect(v, SIGNAL(toggleInventory(Character*)), ui->m_inventory, SLOT(toggle(Character*))); ui->m_render_view->setScene(v); //auto s = GLOBAL_FIELD_SIZE / (float)GLOBAL_FIELD_CELL_REAL_SIZE; ui->m_render_view->resetTransform(); auto local_cell = v->cell(local_pos); local_pos = global_pos * local_cell->sceneMatrix().inverted(); //local_pos = local_pos * cell->sceneMatrix().inverted(); qDebug() << "Player local local position:" << local_pos.x() << local_pos.y(); world()->player()->setParentItem(local_cell); world()->player()->setPos(local_pos); world()->setLocalField(v); if (player) ui->m_render_view->centerOn(player); } }
void Mesh::constructDirectionFields() { for (FaceIter f = faces.begin(); f != faces.end(); f++) { f->parent = f; } // traverse faces in any order FaceIter root = faces.begin() + (rand() % faces.size()); root->beta = 0; std::queue<FaceIter> queue; queue.push(root); while (!queue.empty()) { FaceIter f1 = queue.front(); queue.pop(); HalfEdgeIter he = f1->he; do { FaceIter f2 = he->flip->face; if (f2 != root && f2->parent == f2) { f2->parent = f1; double phi = he == he->edge->he ? he->edge->phi : -he->edge->phi; f2->beta = connectionAngle(f1->beta, he) - phi; queue.push(f2); } he = he->next; } while (he != f1->he); } for (FaceIter f = faces.begin(); f != faces.end(); f++) { Eigen::Vector3d localField(cos(f->beta), sin(f->beta), 0); Eigen::Vector3d x, y; f->axis(x, y); f->field = localField.x()*x + localField.y()*y; } }