Merged in feature/MAPG-44-possibility-to-add-pov-data-to-locations (pull request #169)
Feature/MAPG-44 possibility to add pov data to locations
This commit is contained in:
commit
43aef22c4e
@ -0,0 +1,8 @@
|
|||||||
|
ALTER TABLE
|
||||||
|
`places`
|
||||||
|
ADD
|
||||||
|
`pov_heading` decimal(6, 3) NOT NULL DEFAULT 0.0,
|
||||||
|
ADD
|
||||||
|
`pov_pitch` decimal(5, 3) NOT NULL DEFAULT 0.0,
|
||||||
|
ADD
|
||||||
|
`pov_zoom` decimal(5, 4) NOT NULL DEFAULT 0.0;
|
@ -8,6 +8,7 @@
|
|||||||
rounds: [],
|
rounds: [],
|
||||||
scoreSum: 0,
|
scoreSum: 0,
|
||||||
panoId: null,
|
panoId: null,
|
||||||
|
pov: null,
|
||||||
panorama: null,
|
panorama: null,
|
||||||
map: null,
|
map: null,
|
||||||
guessMarker: null,
|
guessMarker: null,
|
||||||
@ -35,6 +36,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
Game.panoId = this.response.panoId;
|
Game.panoId = this.response.panoId;
|
||||||
|
Game.pov = this.response.pov;
|
||||||
|
|
||||||
if (this.response.history) {
|
if (this.response.history) {
|
||||||
for (var i = 0; i < this.response.history.length; ++i) {
|
for (var i = 0; i < this.response.history.length; ++i) {
|
||||||
@ -116,7 +118,7 @@
|
|||||||
|
|
||||||
document.getElementById('currentRound').innerHTML = String(Game.rounds.length) + '/' + String(Game.NUMBER_OF_ROUNDS);
|
document.getElementById('currentRound').innerHTML = String(Game.rounds.length) + '/' + String(Game.NUMBER_OF_ROUNDS);
|
||||||
|
|
||||||
Game.loadPano(Game.panoId);
|
Game.loadPano(Game.panoId, Game.pov);
|
||||||
},
|
},
|
||||||
|
|
||||||
handleErrorResponse: function (error) {
|
handleErrorResponse: function (error) {
|
||||||
@ -129,13 +131,13 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
loadPano: function (panoId) {
|
loadPano: function (panoId, pov) {
|
||||||
if (Game.adaptGuess) {
|
if (Game.adaptGuess) {
|
||||||
document.getElementById('guess').classList.add('adapt');
|
document.getElementById('guess').classList.add('adapt');
|
||||||
}
|
}
|
||||||
|
|
||||||
Game.panorama.setPov({ heading: 0, pitch: 0 });
|
Game.panorama.setPov({ heading: pov.heading, pitch: pov.pitch });
|
||||||
Game.panorama.setZoom(0);
|
Game.panorama.setZoom(pov.zoom);
|
||||||
Game.panorama.setPano(panoId);
|
Game.panorama.setPano(panoId);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -199,6 +201,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
Game.panoId = this.response.panoId;
|
Game.panoId = this.response.panoId;
|
||||||
|
Game.pov = this.response.pov;
|
||||||
}, data);
|
}, data);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -41,7 +41,10 @@ class GameFlowController
|
|||||||
|
|
||||||
$session->set('state', $state);
|
$session->set('state', $state);
|
||||||
|
|
||||||
$data = ['panoId' => $place->getPanoIdCached()];
|
$data = [
|
||||||
|
'panoId' => $place->getPanoIdCached(),
|
||||||
|
'pov' => $place->getPov()->toArray()
|
||||||
|
];
|
||||||
} else {
|
} else {
|
||||||
$rounds = count($state['rounds']);
|
$rounds = count($state['rounds']);
|
||||||
$last = $state['rounds'][$rounds - 1];
|
$last = $state['rounds'][$rounds - 1];
|
||||||
@ -59,7 +62,10 @@ class GameFlowController
|
|||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'history' => $history,
|
'history' => $history,
|
||||||
'panoId' => $last['panoId']
|
'panoId' => $last['panoId'],
|
||||||
|
'pov' => isset($last['pov']) ? // should be checked not to break with old sessions
|
||||||
|
$last['pov']->toArray() :
|
||||||
|
['heading' => 0.0, 'pitch' => 0.0, 'zoom' => 0.0],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,10 +109,12 @@ class GameFlowController
|
|||||||
$this->addNewRoundToState($state, $place, $placesWithoutPano);
|
$this->addNewRoundToState($state, $place, $placesWithoutPano);
|
||||||
|
|
||||||
$panoId = $place->getPanoIdCached();
|
$panoId = $place->getPanoIdCached();
|
||||||
|
$pov = $place->getPov()->toArray();
|
||||||
} else {
|
} else {
|
||||||
$state['rounds'] = [];
|
$state['rounds'] = [];
|
||||||
|
|
||||||
$panoId = null;
|
$panoId = null;
|
||||||
|
$pov = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$session->set('state', $state);
|
$session->set('state', $state);
|
||||||
@ -117,7 +125,8 @@ class GameFlowController
|
|||||||
'distance' => $distance,
|
'distance' => $distance,
|
||||||
'score' => $score
|
'score' => $score
|
||||||
],
|
],
|
||||||
'panoId' => $panoId
|
'panoId' => $panoId,
|
||||||
|
'pov' => $pov
|
||||||
];
|
];
|
||||||
return new JsonContent($data);
|
return new JsonContent($data);
|
||||||
}
|
}
|
||||||
@ -128,7 +137,8 @@ class GameFlowController
|
|||||||
'placesWithoutPano' => $placesWithoutPano,
|
'placesWithoutPano' => $placesWithoutPano,
|
||||||
'placeId' => $place->getId(),
|
'placeId' => $place->getId(),
|
||||||
'position' => $place->getPosition(),
|
'position' => $place->getPosition(),
|
||||||
'panoId' => $place->getPanoIdCached()
|
'panoId' => $place->getPanoIdCached(),
|
||||||
|
'pov' => $place->getPov()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ use MapGuesser\Response\HtmlContent;
|
|||||||
use MapGuesser\Response\JsonContent;
|
use MapGuesser\Response\JsonContent;
|
||||||
use MapGuesser\Util\Geo\Bounds;
|
use MapGuesser\Util\Geo\Bounds;
|
||||||
use MapGuesser\Util\Geo\Position;
|
use MapGuesser\Util\Geo\Position;
|
||||||
|
use MapGuesser\Util\Panorama\Pov;
|
||||||
|
|
||||||
class MapAdminController implements ISecured
|
class MapAdminController implements ISecured
|
||||||
{
|
{
|
||||||
@ -94,6 +95,11 @@ class MapAdminController implements ISecured
|
|||||||
$place->setMap($map);
|
$place->setMap($map);
|
||||||
$place->setLat((float) $placeRaw['lat']);
|
$place->setLat((float) $placeRaw['lat']);
|
||||||
$place->setLng((float) $placeRaw['lng']);
|
$place->setLng((float) $placeRaw['lng']);
|
||||||
|
$place->setPov(new Pov(
|
||||||
|
(float) $placeRaw['pov']['heading'],
|
||||||
|
(float) $placeRaw['pov']['pitch'],
|
||||||
|
(float) $placeRaw['pov']['zoom']
|
||||||
|
));
|
||||||
|
|
||||||
if ($placeRaw['panoId'] === -1) {
|
if ($placeRaw['panoId'] === -1) {
|
||||||
$place->setPanoIdCachedTimestampDate(new DateTime('-1 day'));
|
$place->setPanoIdCachedTimestampDate(new DateTime('-1 day'));
|
||||||
@ -114,6 +120,11 @@ class MapAdminController implements ISecured
|
|||||||
$place = $this->placeRepository->getById((int) $placeRaw['id']);
|
$place = $this->placeRepository->getById((int) $placeRaw['id']);
|
||||||
$place->setLat((float) $placeRaw['lat']);
|
$place->setLat((float) $placeRaw['lat']);
|
||||||
$place->setLng((float) $placeRaw['lng']);
|
$place->setLng((float) $placeRaw['lng']);
|
||||||
|
$place->setPov(new Pov(
|
||||||
|
(float) $placeRaw['pov']['heading'],
|
||||||
|
(float) $placeRaw['pov']['pitch'],
|
||||||
|
(float) $placeRaw['pov']['zoom']
|
||||||
|
));
|
||||||
$place->setPanoIdCachedTimestampDate(new DateTime('-1 day'));
|
$place->setPanoIdCachedTimestampDate(new DateTime('-1 day'));
|
||||||
|
|
||||||
$this->pdm->saveToDb($place);
|
$this->pdm->saveToDb($place);
|
||||||
@ -150,7 +161,8 @@ class MapAdminController implements ISecured
|
|||||||
return new JsonContent($data);
|
return new JsonContent($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function deleteMap() {
|
public function deleteMap()
|
||||||
|
{
|
||||||
$mapId = (int) $this->request->query('mapId');
|
$mapId = (int) $this->request->query('mapId');
|
||||||
|
|
||||||
$map = $this->mapRepository->getById($mapId);
|
$map = $this->mapRepository->getById($mapId);
|
||||||
@ -206,7 +218,7 @@ class MapAdminController implements ISecured
|
|||||||
{
|
{
|
||||||
//TODO: from repository or relations
|
//TODO: from repository or relations
|
||||||
$select = new Select(\Container::$dbConnection, 'places');
|
$select = new Select(\Container::$dbConnection, 'places');
|
||||||
$select->columns(['id', 'lat', 'lng', 'pano_id_cached', 'pano_id_cached_timestamp']);
|
$select->columns(['id', 'lat', 'lng', 'pano_id_cached', 'pano_id_cached_timestamp', 'pov_heading', 'pov_pitch', 'pov_zoom']);
|
||||||
$select->where('map_id', '=', $map->getId());
|
$select->where('map_id', '=', $map->getId());
|
||||||
|
|
||||||
$result = $select->execute();
|
$result = $select->execute();
|
||||||
@ -214,8 +226,6 @@ class MapAdminController implements ISecured
|
|||||||
$places = [];
|
$places = [];
|
||||||
|
|
||||||
while ($place = $result->fetch(IResultSet::FETCH_ASSOC)) {
|
while ($place = $result->fetch(IResultSet::FETCH_ASSOC)) {
|
||||||
//$panoId = ???
|
|
||||||
//$pov = ???
|
|
||||||
$noPano = $place['pano_id_cached_timestamp'] && $place['pano_id_cached'] === null;
|
$noPano = $place['pano_id_cached_timestamp'] && $place['pano_id_cached'] === null;
|
||||||
|
|
||||||
$places[$place['id']] = [
|
$places[$place['id']] = [
|
||||||
@ -223,7 +233,11 @@ class MapAdminController implements ISecured
|
|||||||
'lat' => $place['lat'],
|
'lat' => $place['lat'],
|
||||||
'lng' => $place['lng'],
|
'lng' => $place['lng'],
|
||||||
'panoId' => null,
|
'panoId' => null,
|
||||||
'pov' => ['heading' => 0.0, 'pitch' => 0.0, 'zoom' => 0.0],
|
'pov' => [
|
||||||
|
'heading' => (float) $place['pov_heading'],
|
||||||
|
'pitch' => (float) $place['pov_pitch'],
|
||||||
|
'zoom' => (float) $place['pov_zoom']
|
||||||
|
],
|
||||||
'noPano' => $noPano
|
'noPano' => $noPano
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,13 @@ use DateTime;
|
|||||||
use MapGuesser\Http\Request;
|
use MapGuesser\Http\Request;
|
||||||
use MapGuesser\PersistentData\PersistentDataManager;
|
use MapGuesser\PersistentData\PersistentDataManager;
|
||||||
use MapGuesser\Util\Geo\Position;
|
use MapGuesser\Util\Geo\Position;
|
||||||
|
use MapGuesser\Util\Panorama\Pov;
|
||||||
|
|
||||||
class Place extends Model
|
class Place extends Model
|
||||||
{
|
{
|
||||||
protected static string $table = 'places';
|
protected static string $table = 'places';
|
||||||
|
|
||||||
protected static array $fields = ['map_id', 'lat', 'lng', 'pano_id_cached', 'pano_id_cached_timestamp'];
|
protected static array $fields = ['map_id', 'lat', 'lng', 'pano_id_cached', 'pano_id_cached_timestamp', 'pov_heading', 'pov_pitch', 'pov_zoom'];
|
||||||
|
|
||||||
protected static array $relations = ['map' => Map::class];
|
protected static array $relations = ['map' => Map::class];
|
||||||
|
|
||||||
@ -24,9 +25,12 @@ class Place extends Model
|
|||||||
|
|
||||||
private ?DateTime $panoIdCachedTimestamp = null;
|
private ?DateTime $panoIdCachedTimestamp = null;
|
||||||
|
|
||||||
|
private Pov $pov;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->position = new Position(0.0, 0.0);
|
$this->position = new Position(0.0, 0.0);
|
||||||
|
$this->pov = new Pov(0.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setMap(Map $map): void
|
public function setMap(Map $map): void
|
||||||
@ -54,6 +58,26 @@ class Place extends Model
|
|||||||
$this->position->setLng($lng);
|
$this->position->setLng($lng);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setPov(Pov $pov): void
|
||||||
|
{
|
||||||
|
$this->pov = $pov;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPovHeading(float $heading): void
|
||||||
|
{
|
||||||
|
$this->pov->setHeading($heading);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPovPitch(float $pitch): void
|
||||||
|
{
|
||||||
|
$this->pov->setPitch($pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPovZoom(float $zoom): void
|
||||||
|
{
|
||||||
|
$this->pov->setZoom($zoom);
|
||||||
|
}
|
||||||
|
|
||||||
public function setPanoIdCached(?string $panoIdCached): void
|
public function setPanoIdCached(?string $panoIdCached): void
|
||||||
{
|
{
|
||||||
$this->panoIdCached = $panoIdCached;
|
$this->panoIdCached = $panoIdCached;
|
||||||
@ -96,6 +120,26 @@ class Place extends Model
|
|||||||
return $this->position->getLng();
|
return $this->position->getLng();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPov(): Pov
|
||||||
|
{
|
||||||
|
return $this->pov;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPovHeading(): float
|
||||||
|
{
|
||||||
|
return $this->pov->getHeading();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPovPitch(): float
|
||||||
|
{
|
||||||
|
return $this->pov->getPitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPovZoom(): float
|
||||||
|
{
|
||||||
|
return $this->pov->getZoom();
|
||||||
|
}
|
||||||
|
|
||||||
public function getFreshPanoId(bool $canBeIndoor = false): ?string
|
public function getFreshPanoId(bool $canBeIndoor = false): ?string
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
|
56
src/Util/Panorama/Pov.php
Normal file
56
src/Util/Panorama/Pov.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php namespace MapGuesser\Util\Panorama;
|
||||||
|
|
||||||
|
class Pov
|
||||||
|
{
|
||||||
|
private float $heading;
|
||||||
|
|
||||||
|
private float $pitch;
|
||||||
|
|
||||||
|
private float $zoom;
|
||||||
|
|
||||||
|
public function __construct(float $heading, float $pitch, float $zoom)
|
||||||
|
{
|
||||||
|
$this->heading = $heading;
|
||||||
|
$this->pitch = $pitch;
|
||||||
|
$this->zoom = $zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setHeading(float $heading): void
|
||||||
|
{
|
||||||
|
$this->heading = $heading;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPitch(float $pitch): void
|
||||||
|
{
|
||||||
|
$this->pitch = $pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setZoom(float $zoom): void
|
||||||
|
{
|
||||||
|
$this->zoom = $zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHeading(): float
|
||||||
|
{
|
||||||
|
return $this->heading;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPitch(): float
|
||||||
|
{
|
||||||
|
return $this->pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZoom(): float
|
||||||
|
{
|
||||||
|
return $this->zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'heading' => $this->heading,
|
||||||
|
'pitch' => $this->pitch,
|
||||||
|
'zoom' => $this->zoom
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user