ModelHandle/source/parameters/paramutils.js
2021-04-02 10:38:53 +02:00

135 lines
3.6 KiB
JavaScript

OV.UrlParamConverter =
{
CameraToUrlParameter : function (camera)
{
if (camera === null) {
return null;
}
let precision = 5;
let cameraParameters = [
camera.eye.x.toPrecision (precision), camera.eye.y.toPrecision (precision), camera.eye.z.toPrecision (precision),
camera.center.x.toPrecision (precision), camera.center.y.toPrecision (precision), camera.center.z.toPrecision (precision),
camera.up.x.toPrecision (precision), camera.up.y.toPrecision (precision), camera.up.z.toPrecision (precision)
].join (',');
return cameraParameters;
},
UrlParameterToCamera : function (urlParam)
{
if (urlParam === null || urlParam.length === 0) {
return null;
}
let paramParts = urlParam.split (',');
if (paramParts.length !== 9) {
return null;
}
let camera = new OV.Camera (
new OV.Coord3D (parseFloat (paramParts[0]), parseFloat (paramParts[1]), parseFloat (paramParts[2])),
new OV.Coord3D (parseFloat (paramParts[3]), parseFloat (paramParts[4]), parseFloat (paramParts[5])),
new OV.Coord3D (parseFloat (paramParts[6]), parseFloat (paramParts[7]), parseFloat (paramParts[8]))
);
return camera;
},
ModelUrlsToUrlParameter : function (urls)
{
if (urls === null) {
return null;
}
return urls.join (',');
},
UrlParameterToModelUrls : function (urlParam)
{
if (urlParam === null || urlParam.length === 0) {
return null;
}
return urlParam.split (',');
}
};
OV.UrlParamBuilder = class
{
constructor ()
{
this.urlParams = '';
}
AddModelUrls (urls)
{
this.AddUrlPart ('model', OV.UrlParamConverter.ModelUrlsToUrlParameter (urls));
return this;
}
AddCamera (camera)
{
this.AddUrlPart ('camera', OV.UrlParamConverter.CameraToUrlParameter (camera));
return this;
}
AddUrlPart (keyword, urlPart)
{
if (keyword === null || urlPart === null) {
return;
}
if (this.urlParams.length > 0) {
this.urlParams += '$';
}
this.urlParams += keyword + '=' + urlPart;
}
GetUrlParams ()
{
return this.urlParams;
}
};
OV.UrlParamParser = class
{
constructor (urlParams)
{
this.urlParams = urlParams;
}
GetModelUrls ()
{
// detect legacy links
if (this.urlParams.indexOf ('=') === -1) {
return this.urlParams.split (',');
}
let keywordParams = this.GetKeywordParams ('model');
return OV.UrlParamConverter.UrlParameterToModelUrls (keywordParams);
}
GetCamera ()
{
let keywordParams = this.GetKeywordParams ('camera');
return OV.UrlParamConverter.UrlParameterToCamera (keywordParams);
}
GetKeywordParams (keyword)
{
if (this.urlParams === null || this.urlParams.length === 0) {
return null;
}
let keywordToken = keyword + '=';
let urlParts = this.urlParams.split ('$');
for (let i = 0; i < urlParts.length; i++) {
let urlPart = urlParts[i];
if (urlPart.startsWith (keywordToken)) {
return urlPart.substr (keywordToken.length);
}
}
return null;
}
};
OV.CreateUrlParameters = function (urls, camera)
{
let builder = new OV.UrlParamBuilder ();
builder.AddModelUrls (urls);
builder.AddCamera (camera);
return builder.GetUrlParams ();
};