/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
#include "TransformationNode.h"

TransformationNode::TransformationNode(Matrix* matrix) :
        mMatrix(matrix) {
}

TransformationNode::~TransformationNode() {
    delete mMatrix;
}

void TransformationNode::before(Program& program, Matrix& model, Matrix& view,
        Matrix& projection) {
    // Save the current Matrix.
    mSavedModelMatrix.loadWith(model);
    // Apply transformation.
    model.multiply(*mMatrix, mSavedModelMatrix);
}

void TransformationNode::after(Program& program, Matrix& model, Matrix& view,
        Matrix& projection) {
    // Restore original Matrix.
    model.loadWith(mSavedModelMatrix);
}
