Пример #1
0
 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;
     }
 }
Пример #2
0
        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);
        }