/*
 * 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.
 */
uniform mat4 u_MVPMatrix;
uniform mat4 u_MVMatrix;
attribute vec4 a_Position;
attribute vec3 a_Normal;
attribute vec2 a_TexCoordinate;
varying vec3 v_Position;
varying vec3 v_Normal;
varying vec2 v_TexCoordinate;
void main() {
  // Transform the vertex into eye space.
  v_Position = vec3(u_MVMatrix * a_Position);
  // Pass through the texture coordinate.
  v_TexCoordinate = a_TexCoordinate;
  // Transform the normal\'s orientation into eye space.
  v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));
  // Multiply to get the final point in normalized screen coordinates.
  gl_Position = u_MVPMatrix * a_Position;
}