blob: 3b9943d17baf219c0de12cc068e658743578dcac [file] [log] [blame]
/*
* (c) Copyright 1993, Silicon Graphics, Inc.
* Copyright © 2012 Linaro Limited
*
* This file is part of the glmark2 OpenGL (ES) 2.0 benchmark.
*
* glmark2 is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* glmark2 is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* glmark2. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Jesse Barker
*/
#include "splines.h"
using LibMatrix::vec3;
void
Spline::calcParams()
{
unsigned int numParams(controlData_.size() - 3);
paramData_ = new param[numParams];
for (unsigned int i = 0; i < numParams; i++)
{
float x3(controlData_[i + 1].x());
float x2(controlData_[i + 2].x() - controlData_[i].x());
float x1(2.0 * controlData_[i].x() +
-2.0 * controlData_[i+1].x() +
1.0 * controlData_[i+2].x() +
-1.0 * controlData_[i+3].x());
float x0(-1.0 * controlData_[i].x() +
1.0 * controlData_[i+1].x() +
-1.0 * controlData_[i+2].x() +
1.0 * controlData_[i+3].x());
float y3(controlData_[i + 1].y());
float y2(controlData_[i + 2].y() - controlData_[i].y());
float y1(2.0 * controlData_[i].y() +
-2.0 * controlData_[i+1].y() +
1.0 * controlData_[i+2].y() +
-1.0 * controlData_[i+3].y());
float y0(-1.0 * controlData_[i].y() +
1.0 * controlData_[i+1].y() +
-1.0 * controlData_[i+2].y() +
1.0 * controlData_[i+3].y());
float z3(controlData_[i + 1].z());
float z2(controlData_[i + 2].z() - controlData_[i].z());
float z1(2.0 * controlData_[i].z() +
-2.0 * controlData_[i+1].z() +
1.0 * controlData_[i+2].z() +
-1.0 * controlData_[i+3].z());
float z0(-1.0 * controlData_[i].z() +
1.0 * controlData_[i+1].z() +
-1.0 * controlData_[i+2].z() +
1.0 * controlData_[i+3].z());
paramData_[i][3].x(x3);
paramData_[i][2].x(x2);
paramData_[i][1].x(x1);
paramData_[i][0].x(x0);
paramData_[i][3].y(y3);
paramData_[i][2].y(y2);
paramData_[i][1].y(y1);
paramData_[i][0].y(y0);
paramData_[i][3].z(z3);
paramData_[i][2].z(z2);
paramData_[i][1].z(z1);
paramData_[i][0].z(z0);
}
}
void
Spline::getCurrentVec(float currentTime, vec3& v) const
{
unsigned int integerTime(static_cast<unsigned int>(currentTime));
float t(currentTime - static_cast<float>(integerTime));
v.x(paramData_[integerTime][3].x() +
paramData_[integerTime][2].x() * t +
paramData_[integerTime][1].x() * t * t +
paramData_[integerTime][0].x() * t * t * t);
v.y(paramData_[integerTime][3].y() +
paramData_[integerTime][2].y() * t +
paramData_[integerTime][1].y() * t * t +
paramData_[integerTime][0].y() * t * t * t);
v.z(paramData_[integerTime][3].z() +
paramData_[integerTime][2].z() * t +
paramData_[integerTime][1].z() * t * t +
paramData_[integerTime][0].z() * t * t * t);
}
ViewFromSpline::ViewFromSpline()
{
addControlPoint(vec3(-1.0, 1.0, -4.0));
addControlPoint(vec3(-1.0, -3.0, -4.0));
addControlPoint(vec3(-3.0, 1.0, -3.0));
addControlPoint(vec3(-1.8, 2.0, 5.4));
addControlPoint(vec3(-0.4, 2.0, 1.2));
addControlPoint(vec3(-0.2, 1.5, 0.6));
addControlPoint(vec3(-0.2, 1.2, 0.6));
addControlPoint(vec3(-0.8, 1.0, 2.4));
addControlPoint(vec3(-1.0, 2.0, 3.0));
addControlPoint(vec3(0.0, 4.0, 3.6));
addControlPoint(vec3(-0.8, 4.0, 1.2));
addControlPoint(vec3(-0.2, 3.0, 0.6));
addControlPoint(vec3(-0.1, 2.0, 0.3));
addControlPoint(vec3(-0.1, 2.0, 0.3));
addControlPoint(vec3(-0.1, 2.0, 0.3));
addControlPoint(vec3(-0.1, 2.0, 0.3));
calcParams();
}
ViewToSpline::ViewToSpline()
{
addControlPoint(vec3(-1.0, 1.0, 0.0));
addControlPoint(vec3(-1.0, -3.0, 0.0));
addControlPoint(vec3(-1.0, 1.0, 0.0));
addControlPoint(vec3(0.1, 0.0, -0.3));
addControlPoint(vec3(0.1, 0.0, -0.3));
addControlPoint(vec3(0.1, 0.0, -0.3));
addControlPoint(vec3(0.0, 0.2, 0.0));
addControlPoint(vec3(0.0, 0.6, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
calcParams();
}
LightPositionSpline::LightPositionSpline()
{
addControlPoint(vec3(0.0, 1.8, 0.0));
addControlPoint(vec3(0.0, 1.8, 0.0));
addControlPoint(vec3(0.0, 1.6, 0.0));
addControlPoint(vec3(0.0, 1.6, 0.0));
addControlPoint(vec3(0.0, 1.6, 0.0));
addControlPoint(vec3(0.0, 1.6, 0.0));
addControlPoint(vec3(0.0, 1.4, 0.0));
addControlPoint(vec3(0.0, 1.3, 0.0));
addControlPoint(vec3(-0.2, 1.5, 2.0));
addControlPoint(vec3(0.8, 1.5, -0.4));
addControlPoint(vec3(-0.8, 1.5, -0.4));
addControlPoint(vec3(0.8, 2.0, 1.0));
addControlPoint(vec3(1.8, 5.0, -1.8));
addControlPoint(vec3(8.0, 10.0, -4.0));
addControlPoint(vec3(8.0, 10.0, -4.0));
addControlPoint(vec3(8.0, 10.0, -4.0));
calcParams();
}
LogoPositionSpline::LogoPositionSpline()
{
addControlPoint(vec3(0.0, -0.5, 0.0));
addControlPoint(vec3(0.0, -0.5, 0.0));
addControlPoint(vec3(0.0, -0.5, 0.0));
addControlPoint(vec3(0.0, -0.5, 0.0));
addControlPoint(vec3(0.0, -0.5, 0.0));
addControlPoint(vec3(0.0, -0.5, 0.0));
addControlPoint(vec3(0.0, 0.0, 0.0));
addControlPoint(vec3(0.0, 0.6, 0.0));
addControlPoint(vec3(0.0, 0.75, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.8, 0.0));
addControlPoint(vec3(0.0, 0.5, 0.0));
addControlPoint(vec3(0.0, 0.5, 0.0));
addControlPoint(vec3(0.0, 0.5, 0.0));
addControlPoint(vec3(0.0, 0.5, 0.0));
addControlPoint(vec3(0.0, 0.5, 0.0));
calcParams();
}
LogoRotationSpline::LogoRotationSpline()
{
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(0.0, 0.0, -18.4));
addControlPoint(vec3(240.0, 360.0, 180.0));
addControlPoint(vec3(90.0, 180.0, 90.0));
addControlPoint(vec3(11.9, 0.0, -18.4));
addControlPoint(vec3(11.9, 0.0, -18.4));
addControlPoint(vec3(11.9, 0.0, -18.4));
addControlPoint(vec3(11.9, 0.0, -18.4));
addControlPoint(vec3(11.9, 0.0, -18.4));
calcParams();
}