Revision 62c869ad
Added by Leszek Koltunski over 4 years ago
src/main/java/org/distorted/library/effect/MatrixEffect.java | ||
---|---|---|
37 | 37 |
* |
38 | 38 |
* @y.exclude |
39 | 39 |
*/ |
40 |
public abstract void apply(float[] matrix, float[] uniforms, int index); |
|
40 |
public abstract void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index);
|
|
41 | 41 |
|
42 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
43 | 43 |
// empty function for completeness |
src/main/java/org/distorted/library/effect/MatrixEffectMove.java | ||
---|---|---|
48 | 48 |
* |
49 | 49 |
* @y.exclude |
50 | 50 |
*/ |
51 |
public void apply(float[] matrix, float[] uniforms, int index) |
|
51 |
public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
|
|
52 | 52 |
{ |
53 | 53 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
54 | 54 |
float sy = uniforms[NUM_UNIFORMS*index+1]; |
55 | 55 |
float sz = uniforms[NUM_UNIFORMS*index+2]; |
56 | 56 |
|
57 |
Matrix.translateM(matrix, 0, sx, sy, sz); |
|
57 |
Matrix.translateM(matrixP, 0, sx, sy, sz); |
|
58 |
Matrix.translateM(matrixV, 0, sx, sy, sz); |
|
58 | 59 |
} |
59 | 60 |
|
60 | 61 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java | ||
---|---|---|
54 | 54 |
* |
55 | 55 |
* @y.exclude |
56 | 56 |
*/ |
57 |
public void apply(float[] matrix, float[] uniforms, int index) |
|
57 |
public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
|
|
58 | 58 |
{ |
59 | 59 |
float qX = uniforms[NUM_UNIFORMS*index ]; |
60 | 60 |
float qY = uniforms[NUM_UNIFORMS*index+1]; |
... | ... | |
65 | 65 |
float y = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1]; |
66 | 66 |
float z = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2]; |
67 | 67 |
|
68 |
Matrix.translateM(matrix, 0, x, y, z); |
|
69 |
multiplyByQuat( matrix, qX, qY, qZ, qW); |
|
70 |
Matrix.translateM(matrix, 0,-x,-y,-z); |
|
68 |
Matrix.translateM(matrixP, 0, x, y, z); |
|
69 |
multiplyByQuat (matrixP, qX, qY, qZ, qW); |
|
70 |
Matrix.translateM(matrixP, 0,-x,-y,-z); |
|
71 |
|
|
72 |
Matrix.translateM(matrixV, 0, x, y, z); |
|
73 |
multiplyByQuat (matrixV, qX, qY, qZ, qW); |
|
74 |
Matrix.translateM(matrixV, 0,-x,-y,-z); |
|
71 | 75 |
} |
72 | 76 |
|
73 | 77 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effect/MatrixEffectRotate.java | ||
---|---|---|
52 | 52 |
* |
53 | 53 |
* @y.exclude |
54 | 54 |
*/ |
55 |
public void apply(float[] matrix, float[] uniforms, int index) |
|
55 |
public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
|
|
56 | 56 |
{ |
57 | 57 |
float angle = uniforms[NUM_UNIFORMS*index ]; |
58 | 58 |
float axisX = uniforms[NUM_UNIFORMS*index+1]; |
... | ... | |
63 | 63 |
float y = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1]; |
64 | 64 |
float z = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2]; |
65 | 65 |
|
66 |
Matrix.translateM(matrix, 0, x, y, z); |
|
67 |
Matrix.rotateM( matrix, 0, angle, axisX, axisY, axisZ); |
|
68 |
Matrix.translateM(matrix, 0,-x,-y,-z); |
|
66 |
Matrix.translateM(matrixP, 0, x, y, z); |
|
67 |
Matrix.rotateM (matrixP, 0, angle, axisX, axisY, axisZ); |
|
68 |
Matrix.translateM(matrixP, 0,-x,-y,-z); |
|
69 |
|
|
70 |
Matrix.translateM(matrixV, 0, x, y, z); |
|
71 |
Matrix.rotateM (matrixV, 0, angle, axisX, axisY, axisZ); |
|
72 |
Matrix.translateM(matrixV, 0,-x,-y,-z); |
|
69 | 73 |
} |
70 | 74 |
|
71 | 75 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effect/MatrixEffectScale.java | ||
---|---|---|
46 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
47 | 47 |
/** |
48 | 48 |
* Only for use by the library itself. |
49 |
* <p> |
|
50 |
* Here and in Shear we have the whole reason why there are two separate 'P' and 'V' (Point and |
|
51 |
* Vector) matrices - Scale and Shear have to manipulate Points and Normal Vectors differently. |
|
52 |
* |
|
53 |
* Points get multiplied by (sx,sy,sz) - and vectors by (1/sx,1/sy,1/sz) (think about it!) - or |
|
54 |
* better by sx*sy*sz*(1/sx,1/sy,1/sz) to avoid dividing my zero (vectors are normalized after) |
|
49 | 55 |
* |
50 | 56 |
* @y.exclude |
51 | 57 |
*/ |
52 |
public void apply(float[] matrix, float[] uniforms, int index) |
|
58 |
public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
|
|
53 | 59 |
{ |
54 | 60 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
55 | 61 |
float sy = uniforms[NUM_UNIFORMS*index+1]; |
56 | 62 |
float sz = uniforms[NUM_UNIFORMS*index+2]; |
57 | 63 |
|
58 |
Matrix.scaleM(matrix, 0, sx, sy, sz); |
|
64 |
Matrix.scaleM(matrixP, 0, sx, sy, sz); |
|
65 |
Matrix.scaleM(matrixV, 0, sy*sz, sx*sz, sx*sy); |
|
59 | 66 |
} |
60 | 67 |
|
61 | 68 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effect/MatrixEffectShear.java | ||
---|---|---|
46 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
47 | 47 |
/** |
48 | 48 |
* Only for use by the library itself. |
49 |
* <p> |
|
50 |
* Here and in Shear we have the whole reason why there are two separate 'P' and 'V' (Point and |
|
51 |
* Vector) matrices - Scale and Shear have to manipulate Points and Normal Vectors differently. |
|
49 | 52 |
* |
50 | 53 |
* @y.exclude |
51 | 54 |
*/ |
52 |
public void apply(float[] matrix, float[] uniforms, int index) |
|
55 |
public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
|
|
53 | 56 |
{ |
54 | 57 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
55 | 58 |
float sy = uniforms[NUM_UNIFORMS*index+1]; |
... | ... | |
59 | 62 |
float y = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1]; |
60 | 63 |
float z = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2]; |
61 | 64 |
|
62 |
Matrix.translateM(matrix, 0, x, y, z); |
|
65 |
Matrix.translateM(matrixP, 0, x, y, z);
|
|
63 | 66 |
|
64 |
matrix[4] += sx*matrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
|
|
65 |
matrix[5] += sx*matrix[1]; // 0 1 0 0
|
|
66 |
matrix[6] += sx*matrix[2]; // 0 0 1 0
|
|
67 |
matrix[7] += sx*matrix[3]; // 0 0 0 1
|
|
67 |
matrixP[4] += sx*matrixP[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
|
|
68 |
matrixP[5] += sx*matrixP[1]; // 0 1 0 0
|
|
69 |
matrixP[6] += sx*matrixP[2]; // 0 0 1 0
|
|
70 |
matrixP[7] += sx*matrixP[3]; // 0 0 0 1
|
|
68 | 71 |
|
69 |
matrix[0] += sy*matrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
|
|
70 |
matrix[1] += sy*matrix[5]; // y 1 0 0
|
|
71 |
matrix[2] += sy*matrix[6]; // 0 0 1 0
|
|
72 |
matrix[3] += sy*matrix[7]; // 0 0 0 1
|
|
72 |
matrixP[0] += sy*matrixP[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
|
|
73 |
matrixP[1] += sy*matrixP[5]; // y 1 0 0
|
|
74 |
matrixP[2] += sy*matrixP[6]; // 0 0 1 0
|
|
75 |
matrixP[3] += sy*matrixP[7]; // 0 0 0 1
|
|
73 | 76 |
|
74 |
matrix[4] += sz*matrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
|
|
75 |
matrix[5] += sz*matrix[9]; // 0 1 0 0
|
|
76 |
matrix[6] += sz*matrix[10];// 0 z 1 0
|
|
77 |
matrix[7] += sz*matrix[11];// 0 0 0 1
|
|
77 |
matrixP[4] += sz*matrixP[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
|
|
78 |
matrixP[5] += sz*matrixP[9]; // 0 1 0 0
|
|
79 |
matrixP[6] += sz*matrixP[10];// 0 z 1 0
|
|
80 |
matrixP[7] += sz*matrixP[11];// 0 0 0 1
|
|
78 | 81 |
|
79 |
Matrix.translateM(matrix, 0,-x,-y,-z); |
|
82 |
Matrix.translateM(matrixP, 0,-x,-y,-z); |
|
83 |
|
|
84 |
Matrix.translateM(matrixV, 0, x, y, z); |
|
85 |
|
|
86 |
matrixV[0] -= sx*matrixV[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. vector X-shear. |
|
87 |
matrixV[1] -= sx*matrixV[5]; // -x 1 0 0 |
|
88 |
matrixV[2] -= sx*matrixV[6]; // 0 0 1 0 |
|
89 |
matrixV[3] -= sx*matrixV[7]; // 0 0 0 1 |
|
90 |
|
|
91 |
matrixV[4] -= sy*matrixV[0]; // Multiply viewMatrix by 1-y 0 0 , i.e. vector Y-shear. |
|
92 |
matrixV[5] -= sy*matrixV[1]; // 0 1 0 0 |
|
93 |
matrixV[6] -= sy*matrixV[2]; // 0 0 1 0 |
|
94 |
matrixV[7] -= sy*matrixV[3]; // 0 0 0 1 |
|
95 |
|
|
96 |
matrixV[8] -= sz*matrixV[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. vector Z-shear. |
|
97 |
matrixV[9] -= sz*matrixV[5]; // 0 1-z 0 |
|
98 |
matrixV[10]-= sz*matrixV[6]; // 0 0 1 0 |
|
99 |
matrixV[11]-= sz*matrixV[7]; // 0 0 0 1 |
|
100 |
|
|
101 |
Matrix.translateM(matrixV, 0,-x,-y,-z); |
|
80 | 102 |
} |
81 | 103 |
|
82 | 104 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effectqueue/EffectQueue.java | ||
---|---|---|
179 | 179 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
180 | 180 |
|
181 | 181 |
public static void send(EffectQueue[] queues, float distance, float mipmap, |
182 |
float[] projection, float inflate, MeshBase mesh, int variant )
|
|
182 |
float[] projection, float inflate, int variant ) |
|
183 | 183 |
{ |
184 |
((EffectQueueMatrix )queues[0]).send(distance, mipmap, projection, mesh, variant);
|
|
184 |
((EffectQueueMatrix )queues[0]).send(distance, mipmap, projection, variant); |
|
185 | 185 |
((EffectQueueVertex )queues[1]).send(inflate, variant); |
186 | 186 |
((EffectQueueFragment)queues[2]).send(variant); |
187 | 187 |
} |
188 | 188 |
|
189 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
190 |
|
|
191 |
public static float[] getMVP(EffectQueue[] queues) |
|
192 |
{ |
|
193 |
return ((EffectQueueMatrix)queues[0]).getMVP(); |
|
194 |
} |
|
195 |
|
|
196 | 189 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
197 | 190 |
// variant: 0 --> MAIN 1 --> OIT 2 --> prePOST 3 --> FULL |
198 | 191 |
|
src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java | ||
---|---|---|
24 | 24 |
|
25 | 25 |
import org.distorted.library.effect.EffectType; |
26 | 26 |
import org.distorted.library.effect.MatrixEffect; |
27 |
import org.distorted.library.mesh.MeshBase; |
|
28 | 27 |
import org.distorted.library.message.EffectMessageSender; |
29 | 28 |
|
30 | 29 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
35 | 34 |
private static final int INDEX = EffectType.MATRIX.ordinal(); |
36 | 35 |
|
37 | 36 |
private static float[] mMVPMatrix = new float[16]; |
38 |
private static float[] mModelViewMatrix = new float[16]; |
|
37 |
private static float[] mModelViewMatrixP= new float[16]; |
|
38 |
private static float[] mModelViewMatrixV= new float[16]; |
|
39 | 39 |
|
40 | 40 |
private static int[] mMVPMatrixH = new int[MAIN_VARIANTS]; |
41 |
private static int[] mMVMatrixH = new int[MAIN_VARIANTS]; |
|
41 |
private static int[] mMVMatrixPH = new int[MAIN_VARIANTS]; |
|
42 |
private static int[] mMVMatrixVH = new int[MAIN_VARIANTS]; |
|
42 | 43 |
|
43 | 44 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
44 | 45 |
|
... | ... | |
59 | 60 |
static void uniforms(int mProgramH, int variant) |
60 | 61 |
{ |
61 | 62 |
mMVPMatrixH[variant]= GLES30.glGetUniformLocation(mProgramH, "u_MVPMatrix"); |
62 |
mMVMatrixH[variant] = GLES30.glGetUniformLocation(mProgramH, "u_MVMatrix"); |
|
63 |
mMVMatrixPH[variant]= GLES30.glGetUniformLocation(mProgramH, "u_MVMatrixP"); |
|
64 |
mMVMatrixVH[variant]= GLES30.glGetUniformLocation(mProgramH, "u_MVMatrixV"); |
|
63 | 65 |
} |
64 | 66 |
|
65 | 67 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
83 | 85 |
|
84 | 86 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
85 | 87 |
|
86 |
float[] getMVP()
|
|
88 |
void send(float distance, float mipmap, float[] projection, int variant)
|
|
87 | 89 |
{ |
88 |
return mMVPMatrix; |
|
89 |
} |
|
90 |
|
|
91 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
90 |
Matrix.setIdentityM(mModelViewMatrixP, 0); |
|
91 |
Matrix.translateM(mModelViewMatrixP, 0, 0,0, -distance); |
|
92 | 92 |
|
93 |
void send(float distance, float mipmap, float[] projection, MeshBase mesh, int variant) |
|
94 |
{ |
|
95 |
Matrix.setIdentityM(mModelViewMatrix, 0); |
|
93 |
if( mipmap!=1 ) |
|
94 |
{ |
|
95 |
Matrix.scaleM(mModelViewMatrixP, 0, mipmap, mipmap, mipmap); |
|
96 |
} |
|
96 | 97 |
|
97 |
// The 'View' part of the MV matrix |
|
98 |
Matrix.translateM(mModelViewMatrix, 0, 0,0, -distance); |
|
99 |
if( mipmap!=1 ) Matrix.scaleM(mModelViewMatrix, 0, mipmap, mipmap, mipmap); |
|
98 |
mModelViewMatrixV[ 0] = mModelViewMatrixP[ 0]; |
|
99 |
mModelViewMatrixV[ 1] = mModelViewMatrixP[ 1]; |
|
100 |
mModelViewMatrixV[ 2] = mModelViewMatrixP[ 2]; |
|
101 |
mModelViewMatrixV[ 3] = mModelViewMatrixP[ 3]; |
|
102 |
mModelViewMatrixV[ 4] = mModelViewMatrixP[ 4]; |
|
103 |
mModelViewMatrixV[ 5] = mModelViewMatrixP[ 5]; |
|
104 |
mModelViewMatrixV[ 6] = mModelViewMatrixP[ 6]; |
|
105 |
mModelViewMatrixV[ 7] = mModelViewMatrixP[ 7]; |
|
106 |
mModelViewMatrixV[ 8] = mModelViewMatrixP[ 8]; |
|
107 |
mModelViewMatrixV[ 9] = mModelViewMatrixP[ 9]; |
|
108 |
mModelViewMatrixV[10] = mModelViewMatrixP[10]; |
|
109 |
mModelViewMatrixV[11] = mModelViewMatrixP[11]; |
|
110 |
mModelViewMatrixV[12] = mModelViewMatrixP[12]; |
|
111 |
mModelViewMatrixV[13] = mModelViewMatrixP[13]; |
|
112 |
mModelViewMatrixV[14] = mModelViewMatrixP[14]; |
|
113 |
mModelViewMatrixV[15] = mModelViewMatrixP[15]; |
|
100 | 114 |
|
101 | 115 |
// the 'Model' part of the MV matrix |
102 |
for(int i=mNumEffects-1; i>=0; i--) ((MatrixEffect)mEffects[i]).apply(mModelViewMatrix,mUniforms,i); |
|
116 |
for(int i=mNumEffects-1; i>=0; i--) |
|
117 |
{ |
|
118 |
((MatrixEffect)mEffects[i]).apply(mModelViewMatrixP,mModelViewMatrixV,mUniforms,i); |
|
119 |
} |
|
103 | 120 |
|
104 | 121 |
// combined Model-View-Projection matrix |
105 |
Matrix.multiplyMM(mMVPMatrix, 0, projection, 0, mModelViewMatrix, 0); |
|
122 |
Matrix.multiplyMM(mMVPMatrix, 0, projection, 0, mModelViewMatrixP, 0);
|
|
106 | 123 |
|
107 |
GLES30.glUniformMatrix4fv(mMVMatrixH[variant] , 1, false, mModelViewMatrix, 0); |
|
108 |
GLES30.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0); |
|
124 |
GLES30.glUniformMatrix4fv(mMVMatrixVH[variant], 1, false, mModelViewMatrixV, 0); |
|
125 |
GLES30.glUniformMatrix4fv(mMVMatrixPH[variant], 1, false, mModelViewMatrixP, 0); |
|
126 |
GLES30.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0); |
|
109 | 127 |
} |
110 | 128 |
} |
src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java | ||
---|---|---|
187 | 187 |
EffectQueueMatrix matrix = (EffectQueueMatrix)queues[0]; |
188 | 188 |
EffectQueueVertex vertex = (EffectQueueVertex)queues[1]; |
189 | 189 |
|
190 |
matrix.send(distance, mipmap, projection, mesh, 2);
|
|
190 |
matrix.send(distance, mipmap, projection, 2); |
|
191 | 191 |
vertex.send(mHalo*0.01f,2); |
192 | 192 |
|
193 | 193 |
if( mA!=0.0f ) |
src/main/java/org/distorted/library/main/DistortedLibrary.java | ||
---|---|---|
123 | 123 |
/// MAIN PROGRAM /// |
124 | 124 |
private static DistortedProgram mMainProgram; |
125 | 125 |
private static int mMainTextureH; |
126 |
private static int mTransformFeedbackH; |
|
126 | 127 |
|
127 | 128 |
/// NORMAL PROGRAM ///// |
128 | 129 |
private static DistortedProgram mNormalProgram; |
129 |
private static int mNormalMVPMatrixH;
|
|
130 |
private static int mNormalProjectionH;
|
|
130 | 131 |
|
131 | 132 |
/// MAIN OIT PROGRAM /// |
132 | 133 |
private static DistortedProgram mMainOITProgram; |
... | ... | |
262 | 263 |
EffectQueue.getUniforms(mainProgramH,0); |
263 | 264 |
MeshBase.getUniforms(mainProgramH,0); |
264 | 265 |
mMainTextureH= GLES30.glGetUniformLocation( mainProgramH, "u_Texture"); |
266 |
mTransformFeedbackH= GLES30.glGetUniformLocation( mainProgramH, "u_TransformFeedback"); |
|
265 | 267 |
|
266 | 268 |
// BLIT PROGRAM //////////////////////////////////// |
267 | 269 |
final InputStream blitVertStream = mResources.openRawResource(R.raw.blit_vertex_shader); |
... | ... | |
321 | 323 |
} |
322 | 324 |
|
323 | 325 |
int normalProgramH = mNormalProgram.getProgramHandle(); |
324 |
mNormalMVPMatrixH = GLES30.glGetUniformLocation( normalProgramH, "u_MVPMatrix");
|
|
326 |
mNormalProjectionH = GLES30.glGetUniformLocation( normalProgramH, "u_Projection");
|
|
325 | 327 |
} |
326 | 328 |
|
327 | 329 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
481 | 483 |
|
482 | 484 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
483 | 485 |
|
484 |
private static void displayNormals(EffectQueue[] queues, MeshBase mesh)
|
|
486 |
private static void displayNormals(float[] projection, MeshBase mesh)
|
|
485 | 487 |
{ |
486 | 488 |
if( mNormalProgram==null ) |
487 | 489 |
{ |
... | ... | |
499 | 501 |
int num = mesh.getNumVertices(); |
500 | 502 |
int tfo = mesh.getTFO(); |
501 | 503 |
|
504 |
GLES30.glUniform1i(DistortedLibrary.mTransformFeedbackH, 1); |
|
502 | 505 |
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo ); |
503 | 506 |
GLES30.glBeginTransformFeedback( GLES30.GL_POINTS); |
504 | 507 |
InternalRenderState.switchOffDrawing(); |
... | ... | |
508 | 511 |
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0); |
509 | 512 |
|
510 | 513 |
mNormalProgram.useProgram(); |
511 |
GLES30.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, EffectQueue.getMVP(queues) , 0);
|
|
514 |
GLES30.glUniformMatrix4fv(mNormalProjectionH, 1, false, projection, 0);
|
|
512 | 515 |
mesh.bindTransformAttribs(mNormalProgram); |
513 | 516 |
GLES30.glLineWidth(8.0f); |
514 | 517 |
GLES30.glDrawArrays(GLES30.GL_LINES, 0, 2*num); |
... | ... | |
574 | 577 |
float mipmap = surface.mMipmap; |
575 | 578 |
float[] projection= surface.mProjectionMatrix; |
576 | 579 |
|
577 |
EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 1 );
|
|
580 |
EffectQueue.send(queues, distance, mipmap, projection, inflate, 1 ); |
|
578 | 581 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() ); |
579 | 582 |
|
580 | 583 |
if( mesh.getShowNormals() ) |
581 | 584 |
{ |
582 | 585 |
mMainProgram.useProgram(); |
583 | 586 |
mesh.send(0); |
584 |
EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 0 );
|
|
585 |
displayNormals(queues,mesh);
|
|
587 |
EffectQueue.send(queues, distance, mipmap, projection, inflate, 0 ); |
|
588 |
displayNormals(projection,mesh);
|
|
586 | 589 |
} |
587 | 590 |
} |
588 | 591 |
} |
... | ... | |
608 | 611 |
float mipmap = surface.mMipmap; |
609 | 612 |
float[] projection= surface.mProjectionMatrix; |
610 | 613 |
|
611 |
EffectQueue.send(queues, distance, mipmap, projection, inflate, mesh, 0 );
|
|
614 |
EffectQueue.send(queues, distance, mipmap, projection, inflate, 0 ); |
|
612 | 615 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() ); |
613 | 616 |
|
614 |
if( mesh.getShowNormals() ) displayNormals(queues,mesh);
|
|
617 |
if( mesh.getShowNormals() ) displayNormals(projection,mesh);
|
|
615 | 618 |
} |
616 | 619 |
} |
617 | 620 |
|
src/main/java/org/distorted/library/mesh/MeshBase.java | ||
---|---|---|
255 | 255 |
|
256 | 256 |
void applyMatrix(MatrixEffect effect, int andAssoc, int equAssoc) |
257 | 257 |
{ |
258 |
float[] matrix = new float[16]; |
|
258 |
float[] matrixP = new float[16]; |
|
259 |
float[] matrixV = new float[16]; |
|
259 | 260 |
float[] uniforms = new float[7]; |
260 | 261 |
int start, end=-1, numComp = mEffComponent.size(); |
261 | 262 |
|
262 |
Matrix.setIdentityM(matrix,0); |
|
263 |
Matrix.setIdentityM(matrixP,0); |
|
264 |
Matrix.setIdentityM(matrixV,0); |
|
263 | 265 |
effect.compute(uniforms,0,0,0); |
264 |
effect.apply(matrix, uniforms, 0); |
|
266 |
effect.apply(matrixP, matrixV, uniforms, 0);
|
|
265 | 267 |
|
266 | 268 |
for(int i=0; i<numComp; i++) |
267 | 269 |
{ |
... | ... | |
270 | 272 |
|
271 | 273 |
if( (andAssoc & mAndAssociation[i]) != 0 || (equAssoc == mEquAssociation[i]) ) |
272 | 274 |
{ |
273 |
applyMatrixToComponent(matrix,start,end);
|
|
275 |
applyMatrixToComponent(matrixP, matrixV, start, end);
|
|
274 | 276 |
} |
275 | 277 |
} |
276 | 278 |
|
... | ... | |
279 | 281 |
|
280 | 282 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
281 | 283 |
|
282 |
private void applyMatrixToComponent(float[] matrix, int start, int end) |
|
284 |
private void applyMatrixToComponent(float[] matrixP, float[] matrixV, int start, int end)
|
|
283 | 285 |
{ |
284 | 286 |
float x,y,z; |
285 | 287 |
|
... | ... | |
289 | 291 |
y = mVertAttribs1[index+POS_ATTRIB+1]; |
290 | 292 |
z = mVertAttribs1[index+POS_ATTRIB+2]; |
291 | 293 |
|
292 |
mVertAttribs1[index+POS_ATTRIB ] = matrix[0]*x + matrix[4]*y + matrix[ 8]*z + matrix[12];
|
|
293 |
mVertAttribs1[index+POS_ATTRIB+1] = matrix[1]*x + matrix[5]*y + matrix[ 9]*z + matrix[13];
|
|
294 |
mVertAttribs1[index+POS_ATTRIB+2] = matrix[2]*x + matrix[6]*y + matrix[10]*z + matrix[14];
|
|
294 |
mVertAttribs1[index+POS_ATTRIB ] = matrixP[0]*x + matrixP[4]*y + matrixP[ 8]*z + matrixP[12];
|
|
295 |
mVertAttribs1[index+POS_ATTRIB+1] = matrixP[1]*x + matrixP[5]*y + matrixP[ 9]*z + matrixP[13];
|
|
296 |
mVertAttribs1[index+POS_ATTRIB+2] = matrixP[2]*x + matrixP[6]*y + matrixP[10]*z + matrixP[14];
|
|
295 | 297 |
|
296 | 298 |
x = mVertAttribs1[index+NOR_ATTRIB ]; |
297 | 299 |
y = mVertAttribs1[index+NOR_ATTRIB+1]; |
298 | 300 |
z = mVertAttribs1[index+NOR_ATTRIB+2]; |
299 | 301 |
|
300 |
mVertAttribs1[index+NOR_ATTRIB ] = matrix[0]*x + matrix[4]*y + matrix[ 8]*z; |
|
301 |
mVertAttribs1[index+NOR_ATTRIB+1] = matrix[1]*x + matrix[5]*y + matrix[ 9]*z; |
|
302 |
mVertAttribs1[index+NOR_ATTRIB+2] = matrix[2]*x + matrix[6]*y + matrix[10]*z; |
|
302 |
mVertAttribs1[index+NOR_ATTRIB ] = matrixV[0]*x + matrixV[4]*y + matrixV[ 8]*z; |
|
303 |
mVertAttribs1[index+NOR_ATTRIB+1] = matrixV[1]*x + matrixV[5]*y + matrixV[ 9]*z; |
|
304 |
mVertAttribs1[index+NOR_ATTRIB+2] = matrixV[2]*x + matrixV[6]*y + matrixV[10]*z; |
|
305 |
|
|
306 |
x = mVertAttribs1[index+NOR_ATTRIB ]; |
|
307 |
y = mVertAttribs1[index+NOR_ATTRIB+1]; |
|
308 |
z = mVertAttribs1[index+NOR_ATTRIB+2]; |
|
309 |
|
|
310 |
float len1 = (float)Math.sqrt(x*x + y*y + z*z); |
|
311 |
|
|
312 |
if( len1>0.0f ) |
|
313 |
{ |
|
314 |
mVertAttribs1[index+NOR_ATTRIB ] /= len1; |
|
315 |
mVertAttribs1[index+NOR_ATTRIB+1] /= len1; |
|
316 |
mVertAttribs1[index+NOR_ATTRIB+2] /= len1; |
|
317 |
} |
|
303 | 318 |
|
304 | 319 |
x = mVertAttribs1[index+INF_ATTRIB ]; |
305 | 320 |
y = mVertAttribs1[index+INF_ATTRIB+1]; |
306 | 321 |
z = mVertAttribs1[index+INF_ATTRIB+2]; |
307 | 322 |
|
308 |
mVertAttribs1[index+INF_ATTRIB ] = matrix[0]*x + matrix[4]*y + matrix[ 8]*z; |
|
309 |
mVertAttribs1[index+INF_ATTRIB+1] = matrix[1]*x + matrix[5]*y + matrix[ 9]*z; |
|
310 |
mVertAttribs1[index+INF_ATTRIB+2] = matrix[2]*x + matrix[6]*y + matrix[10]*z; |
|
323 |
mVertAttribs1[index+INF_ATTRIB ] = matrixV[0]*x + matrixV[4]*y + matrixV[ 8]*z; |
|
324 |
mVertAttribs1[index+INF_ATTRIB+1] = matrixV[1]*x + matrixV[5]*y + matrixV[ 9]*z; |
|
325 |
mVertAttribs1[index+INF_ATTRIB+2] = matrixV[2]*x + matrixV[6]*y + matrixV[10]*z; |
|
326 |
|
|
327 |
x = mVertAttribs1[index+INF_ATTRIB ]; |
|
328 |
y = mVertAttribs1[index+INF_ATTRIB+1]; |
|
329 |
z = mVertAttribs1[index+INF_ATTRIB+2]; |
|
330 |
|
|
331 |
float len2 = (float)Math.sqrt(x*x + y*y + z*z); |
|
332 |
|
|
333 |
if( len2>0.0f ) |
|
334 |
{ |
|
335 |
mVertAttribs1[index+INF_ATTRIB ] /= len2; |
|
336 |
mVertAttribs1[index+INF_ATTRIB+1] /= len2; |
|
337 |
mVertAttribs1[index+INF_ATTRIB+2] /= len2; |
|
338 |
} |
|
311 | 339 |
} |
312 | 340 |
} |
313 | 341 |
|
src/main/res/raw/main_vertex_shader.glsl | ||
---|---|---|
40 | 40 |
out vec2 v_TexCoordinate; // |
41 | 41 |
|
42 | 42 |
uniform mat4 u_MVPMatrix; // the combined model/view/projection matrix. |
43 |
uniform mat4 u_MVMatrix; // the combined model/view matrix. |
|
43 |
uniform mat4 u_MVMatrixP; // the combined model/view matrix. (for points) |
|
44 |
uniform mat4 u_MVMatrixV; // the combined model/view matrix. (for vectors) |
|
45 |
// which need to work differently on points and vectors |
|
44 | 46 |
uniform float u_Inflate; // how much should we inflate (>0.0) or deflate (<0.0) the mesh. |
47 |
uniform int u_TransformFeedback; // are we doing the transform feedback now? |
|
45 | 48 |
|
46 | 49 |
#if NUM_VERTEX>0 |
47 | 50 |
uniform int vNumEffects; // total number of vertex effects |
... | ... | |
119 | 122 |
effect+=3; |
120 | 123 |
} |
121 | 124 |
#endif |
122 |
|
|
123 |
v_Position = v; |
|
124 | 125 |
|
125 | 126 |
#ifdef PREAPPLY |
126 |
v_endPosition = n; |
|
127 |
v_Inflate = inf; |
|
127 |
v_Position = v; |
|
128 |
v_endPosition= n; |
|
129 |
v_Inflate = inf; |
|
128 | 130 |
#else |
129 |
v_endPosition = v + 0.5*n; |
|
131 |
if( u_TransformFeedback == 1 ) |
|
132 |
{ |
|
133 |
vec4 tmp1 = u_MVMatrixP * vec4(v,1.0); |
|
134 |
vec4 tmp2 = normalize(u_MVMatrixV * vec4(n,0.0)); |
|
135 |
|
|
136 |
v_Position = vec3(tmp1); |
|
137 |
v_endPosition = vec3(tmp1+100.0*tmp2); |
|
138 |
} |
|
130 | 139 |
#endif |
131 | 140 |
|
132 | 141 |
v_TexCoordinate = a_TexCoordinate; |
133 |
v_Normal = normalize(vec3(u_MVMatrix*vec4(n,0.0))); |
|
142 |
v_Normal = normalize(vec3(u_MVMatrixV*vec4(n,0.0)));
|
|
134 | 143 |
gl_Position = u_MVPMatrix*vec4(v,1.0); |
135 | 144 |
} |
src/main/res/raw/normal_vertex_shader.glsl | ||
---|---|---|
20 | 20 |
precision lowp float; |
21 | 21 |
|
22 | 22 |
in vec3 a_Position; |
23 |
uniform mat4 u_MVPMatrix;
|
|
23 |
uniform mat4 u_Projection;
|
|
24 | 24 |
|
25 | 25 |
////////////////////////////////////////////////////////////////////////////////////////////// |
26 | 26 |
|
27 | 27 |
void main() |
28 | 28 |
{ |
29 |
gl_Position = u_MVPMatrix * vec4(a_Position, 1.0);
|
|
29 |
gl_Position = u_Projection * vec4(a_Position, 1.0);
|
|
30 | 30 |
} |
Also available in: Unified diff
Fix normals in case of MatrixEffectScale / Shear.
Fix displaying the normal vector.