129fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 229fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// 329fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 429fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// you may not use this file except in compliance with the License. 529fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// You may obtain a copy of the License at 629fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// 729fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 829fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// 929fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// Unless required by applicable law or agreed to in writing, software 1029fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 1129fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1229fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// See the License for the specific language governing permissions and 1329fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens// limitations under the License. 1429fa07fddcd1a3da060d04651e28dccc42b53904Nicolas Capens 15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef sw_MatrixStack_hpp 16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define sw_MatrixStack_hpp 17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Renderer/Matrix.hpp" 19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace sw 21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens class MatrixStack 23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens public: 25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens MatrixStack(int size = 2); 26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ~MatrixStack(); 28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void identity(); 30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void load(const Matrix &M); 31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void load(const float *M); 32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void load(const double *M); 33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void translate(float x, float y, float z); 35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void translate(double x, double y, double z); 36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void rotate(float angle, float x, float y, float z); 37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void rotate(double angle, double x, double y, double z); 38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void scale(float x, float y, float z); 39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void scale(double x, double y, double z); 40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void multiply(const float *M); 41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void multiply(const double *M); 42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void frustum(float left, float right, float bottom, float top, float zNear, float zFar); 44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void ortho(double left, double right, double bottom, double top, double zNear, double zFar); 45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool push(); // False on overflow 47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool pop(); // False on underflow 48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens const Matrix ¤t(); 50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isIdentity() const; 51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens private: 53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens int top; 54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens int size; 55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Matrix *stack; 56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens }; 57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens} 58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif // sw_MatrixStack_hpp 60