package com.glview.graphics.shader;
import android.opengl.Matrix;
//纹理三角形
public class Coordinate
{
//3个元素数组,x,y,z
public void projectToWindow(float vOutput[], float vInput[],float totalM[], int viewport[]){
if(vOutput.length == vInput.length){
int count = vOutput.length/3;
for(int i = 0; i < count; i ++){
gluProjectPoint(vOutput, i*3, vInput, i*3, totalM, viewport);
}
}
}
public void projectToAndroidWindow(float vOutput[], float vInput[],float totalM[], int viewport[], int width, int height){
if(vOutput.length == vInput.length){
int count = vOutput.length/3;
for(int i = 0; i < count; i ++){
gluProjectPoint(vOutput, i*3, vInput, i*3, totalM, viewport);
vOutput[i*3 + 1] = height - vOutput[i*3 + 1];
}
}
}
public boolean gluProjectPoint(float vOutput[], float vInput[],float totalM[], int viewport[]){
/* matrice de transformation */
/* initilise la matrice et le vecteur a transformer */
mOut[0] = vInput[0];
mOut[1] = vInput[1];
mOut[2] = vInput[2];
mOut[3] = 1.0f;
Matrix.multiplyMV(mIn, 0, totalM, 0, mOut, 0);
/* d’ou le resultat normalise entre -1 et 1 */
if (mIn[3] == 0.0){
return false;
}
mIn[0] /= mIn[3];
mIn[1] /= mIn[3];
mIn[2] /= mIn[3];
/* en coordonnees ecran */
vOutput[0] = viewport[0] + (1 + mIn[0]) * viewport[2] / 2;
vOutput[1] = viewport[1] + (1 + mIn[1]) * viewport[3] / 2;
/* entre 0 et 1 suivant z */
vOutput[2] = (1 + mIn[2]) / 2;
return true;
}
public boolean gluProjectPoint(float vOutput[], int outOffset, float vInput[], int inOffset, float totalM[], int viewport[]){
/* matrice de transformation */
/* initilise la matrice et le vecteur a transformer */
mOut[0] = vInput[0 + inOffset];
mOut[1] = vInput[1 + inOffset];
mOut[2] = vInput[2 + inOffset];
mOut[3] = 1.0f;
Matrix.multiplyMV(mIn, 0, totalM, 0, mOut, 0);
/* d’ou le resultat normalise entre -1 et 1 */
if (mIn[3] == 0.0){
return false;
}
mIn[0] /= mIn[3];
mIn[1] /= mIn[3];
mIn[2] /= mIn[3];
/* en coordonnees ecran */
vOutput[0 + outOffset] = viewport[0] + (1 + mIn[0]) * viewport[2] / 2;
vOutput[1 + outOffset] = viewport[1] + (1 + mIn[1]) * viewport[3] / 2;
/* entre 0 et 1 suivant z */
vOutput[2 + outOffset] = (1 + mIn[2]) / 2;
return true;
}
public void projectToWindow(float vOutput[], float vInput[],float model[], float pro[], int viewport[]){
if(vOutput.length == vInput.length){
Matrix.multiplyMM(mMatrix, 0, pro, 0, model, 0);
projectToWindow(vOutput, vInput, mMatrix, viewport);
}
}
float mIn[] = new float[4];
float mOut[] = new float[4];
float mMatrix[] = new float[16];
float mMatrixInv[] = new float[16];
//3,x,y,z
public boolean gluProjectPoint(float vOutput[], float vInput[], float model[], float proj[], int viewport[]){
/* matrice de transformation */
/* initilise la matrice et le vecteur a transformer */
mIn[0] = vInput[0];
mIn[1] = vInput[1];
mIn[2] = vInput[2];
mIn[3] = 1.0f;
Matrix.multiplyMV(mOut, 0, model, 0, mIn, 0);
Matrix.multiplyMV(mIn, 0, proj, 0, mOut, 0);
/* d’ou le resultat normalise entre -1 et 1 */
if (mIn[3] == 0.0){
return false;
}
mIn[0] /= mIn[3];
mIn[1] /= mIn[3];
mIn[2] /= mIn[3];
/* en coordonnees ecran */
vOutput[0] = viewport[0] + (1 + mIn[0]) * viewport[2] / 2;
vOutput[1] = viewport[1] + (1 + mIn[1]) * viewport[3] / 2;
/* entre 0 et 1 suivant z */
vOutput[2] = (1 + mIn[2]) / 2;
return true;
}
//3,x,y,z
public boolean gluProjectPoint(float vOutput[], int outOffset, float vInput[], int inOffset, float model[], float proj[], int viewport[]){
/* matrice de transformation */
/* initilise la matrice et le vecteur a transformer */
mIn[0] = vInput[0 + inOffset];
mIn[1] = vInput[1 + inOffset];
mIn[2] = vInput[2 + inOffset];
mIn[3] = 1.0f;
Matrix.multiplyMV(mOut, 0, model, 0, mIn, 0);
Matrix.multiplyMV(mIn, 0, proj, 0, mOut, 0);
/* d’ou le resultat normalise entre -1 et 1 */
if (mIn[3] == 0.0){
return false;
}
mIn[0] /= mIn[3];
mIn[1] /= mIn[3];
mIn[2] /= mIn[3];
/* en coordonnees ecran */
vOutput[0 + outOffset] = viewport[0] + (1 + mIn[0]) * viewport[2] / 2;
vOutput[1 + outOffset] = viewport[1] + (1 + mIn[1]) * viewport[3] / 2;
/* entre 0 et 1 suivant z */
vOutput[2 + outOffset] = (1 + mIn[2]) / 2;
return true;
}
//winz --- 0 , 1
boolean glhUnProjectf(float winx, float winy, float winz, float modelview[], float projection[], int viewport[], float objectCoordinate[])
{
//Transformation matrices
//Calculation for inverting a matrix, compute projection x modelview
//and store in A[16]
//MultiplyMatrices4by4OpenGL_FLOAT(A, projection, modelview);
Matrix.multiplyMM(mMatrix, 0, projection, 0, modelview, 0);
//Now compute the inverse of matrix A
if(Matrix.invertM(mMatrixInv, 0, mMatrix, 0)){
return false;
}
//Transformation of normalized coordinates between -1 and 1
mIn[0] = (winx - (float)viewport[0])/(float)viewport[2]*2.0f - 1.0f;
mIn[1] = (winy - (float)viewport[1])/(float)viewport[3]*2.0f - 1.0f;
mIn[2] = 2.0f*winz - 1.0f;
mIn[3] = 1.0f;
//Objects coordinates
Matrix.multiplyMV(mOut, 0, mMatrixInv, 0, mIn, 0);
if(mOut[3] == 0.0f){
return false;
}
mOut[3]=1.0f/mOut[3];
objectCoordinate[0] = mOut[0]*mOut[3];
objectCoordinate[1] = mOut[1]*mOut[3];
objectCoordinate[2] = mOut[2]*mOut[3];
return true;
}
}