コード例 #1
0
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);
	}
}
コード例 #2
0
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;
    }
}