Model3D: new static Helpers computeNormals(),v3aToArray()

audio-improve-offer
Harald Christian Joachim Wolff 2017-05-01 11:26:54 +02:00
parent d99356ef00
commit ccf3625302
1 changed files with 31 additions and 34 deletions

View File

@ -112,44 +112,16 @@ namespace org.niclasundharald.engine.graphics {
GL.EnableVertexAttribArray(1);
}
if (normals != null){
float[] fn = new float[ normals.Length * 3];
for (int n=0;n<normals.Length;n++){
fn[(n * 3) ] = normals[n].X;
fn[(n * 3) + 1] = normals[n].Y;
fn[(n * 3) + 2] = normals[n].Z;
}
GL.BindBuffer(BufferTarget.ArrayBuffer, nbo);
GL.BufferData(BufferTarget.ArrayBuffer, 3 * fn.Length, fn, BufferUsageHint.StaticDraw);
GL.EnableVertexAttribArray(2);
} else {
float[] fn = new float[fv.Length];
for (int n=0;n<vertexes.Length;n+=3){
Vector3 normal = Vector3.Cross( vertexes[n+1] - vertexes[n], vertexes[n+2] - vertexes[n] );
normal.Normalize();
fn[(n * 3) ] = normal.X;
fn[(n * 3) + 1] = normal.Y;
fn[(n * 3) + 2] = normal.Z;
fn[(n * 3) + 3] = normal.X;
fn[(n * 3) + 4] = normal.Y;
fn[(n * 3) + 5] = normal.Z;
fn[(n * 3) + 6] = normal.X;
fn[(n * 3) + 7] = normal.Y;
fn[(n * 3) + 8] = normal.Z;
}
GL.BindBuffer(BufferTarget.ArrayBuffer, nbo);
GL.BufferData(BufferTarget.ArrayBuffer, 3 * fn.Length, fn, BufferUsageHint.StaticDraw);
GL.EnableVertexAttribArray(2);
if (normals == null){
normals = computeNormals(vertexes);
}
float[] fn = v3aToArray(normals);
GL.BindBuffer(BufferTarget.ArrayBuffer, nbo);
GL.BufferData(BufferTarget.ArrayBuffer, 3 * fn.Length, fn, BufferUsageHint.StaticDraw);
GL.EnableVertexAttribArray(2);
}
public virtual void draw(){
@ -166,6 +138,31 @@ namespace org.niclasundharald.engine.graphics {
vertexes[(3 * n)+2] = c;
}
public static Vector3[] computeNormals(Vector3[] vertexes){
Vector3[] normals = new Vector3[ vertexes.Length ];
for (int n=0;n<vertexes.Length;n+=3){
Vector3 normal = Vector3.Cross( vertexes[n+1] - vertexes[n], vertexes[n+2] - vertexes[n] );
normal.Normalize();
normals[(n) ] = normal;
normals[(n) + 1] = normal;
normals[(n) + 2] = normal;
}
return normals;
}
public static float[] v3aToArray(Vector3[] v3a){
float[] a = new float[ v3a.Length * 3];
for (int n=0;n<v3a.Length;n++){
a[ (3 * n) ] = v3a[n].X;
a[ (3 * n) + 1] = v3a[n].Y;
a[ (3 * n) + 2] = v3a[n].Z;
}
return a;
}
}
}