public LoadedMaterial(Material source, string dirName) { shininess = source.Shininess * source.ShininessStrength; colorAmbient = source.HasColorAmbient ? AssimpToOpenTKConverter.Color4DToVector4(source.ColorAmbient) : new Vector4(0.2f, 0.2f, 0.2f, 1f); //diffuse if (source.HasTextureDiffuse) { GL.ActiveTexture(TextureUnit.Texture0); LoadTexture(source.TextureDiffuse, dirName, out textureDiffuseHandler); colorDiffuse = new Vector4(0f, 0f, 0f, 0f); HasTextureDiffuse = true; } else { colorDiffuse = source.HasColorDiffuse ? AssimpToOpenTKConverter.Color4DToVector4(source.ColorDiffuse) : new Vector4(0.8f, 0.8f, 0.8f, 1f); HasTextureDiffuse = false; } //normal/height if (source.HasTextureNormal) { GL.ActiveTexture(TextureUnit.Texture1); LoadTexture(source.TextureNormal, dirName, out textureNormalHandler); HasTextureNormal = true; } else if (source.HasTextureHeight) { //in texture normal... GL.ActiveTexture(TextureUnit.Texture1); LoadTexture(source.TextureHeight, dirName, out textureNormalHandler); HasTextureNormal = true; } else { HasTextureNormal = false; } //specular if (source.HasTextureSpecular) { GL.ActiveTexture(TextureUnit.Texture2); LoadTexture(source.TextureSpecular, dirName, out textureSpecularHandler); colorSpecular = new Vector4(0f, 0f, 0f, 0f); HasTextureSpecular = true; } else { colorSpecular = source.HasColorSpecular ? AssimpToOpenTKConverter.Color4DToVector4(source.ColorSpecular) : new Vector4(0f, 0f, 0f, 1f); HasTextureSpecular = false; } }
public LoadedMesh(Mesh source) { Vector3[] positions; Vector2[] uvCoords; Vector3[] normals; int[] indices; materialIndex = source.MaterialIndex; //positions MinimumPosition = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); MaximumPosition = new Vector3(float.MinValue, float.MinValue, float.MinValue); positions = new Vector3[source.VertexCount]; for (int i = 0; i < source.VertexCount; ++i) { positions[i] = AssimpToOpenTKConverter.Vector3DToVector3(source.Vertices[i]); if (positions[i].X < MinimumPosition.X) { MinimumPosition.X = positions[i].X; } if (positions[i].Y < MinimumPosition.Y) { MinimumPosition.Y = positions[i].Y; } if (positions[i].Z < MinimumPosition.Z) { MinimumPosition.Z = positions[i].Z; } if (positions[i].X > MaximumPosition.X) { MaximumPosition.X = positions[i].X; } if (positions[i].Y > MaximumPosition.Y) { MaximumPosition.Y = positions[i].Y; } if (positions[i].Z > MaximumPosition.Z) { MaximumPosition.Z = positions[i].Z; } } HasPositions = true; //normals if (source.HasNormals) { normals = new Vector3[source.VertexCount]; for (int i = 0; i < source.VertexCount; ++i) { normals[i] = AssimpToOpenTKConverter.Vector3DToVector3(source.Normals[i]); } HasNormals = true; } else { normals = new Vector3[0]; HasNormals = false; } //TO DO multiple textures max 8 //uv if (source.HasTextureCoords(0)) { uvCoords = new Vector2[source.VertexCount]; for (int i = 0; i < source.VertexCount; ++i) { Vector3 uvw = AssimpToOpenTKConverter.Vector3DToVector3(source.TextureCoordinateChannels[0][i]); uvCoords[i] = new Vector2(uvw.X, 1 - uvw.Y); } HasUvCoords = true; } else { uvCoords = new Vector2[0]; HasUvCoords = false; } //collecting indices from all faces - we assume they are all triangles List <int> indexColection = new List <int>(); for (int i = 0; i < source.FaceCount; ++i) { if (source.Faces[i].IndexCount == 3) { indexColection.AddRange(source.Faces[i].Indices); } } indices = indexColection.ToArray(); indicesCount = indices.Length; //create buffers if (HasPositions) { CreateVbo(positions, Vector3.SizeInBytes * positions.Length, out positionVboHandler); } if (HasNormals) { CreateVbo(normals, Vector3.SizeInBytes * normals.Length, out normalVboHandler); } if (HasUvCoords) { CreateVbo(uvCoords, Vector2.SizeInBytes * uvCoords.Length, out uvVboHandler); } CreateEbo(indices, out eboHandler); }