Beispiel #1
0
        public override IResource create(ResourceManager mgr)
        {
            ObjModelDescriptor desc = new ObjModelDescriptor(Path.Combine(path, (string)descriptor["mesh"]));
            Model dome = Renderer.resourceManager.getResource(desc) as Model;

            dome.myMeshes[0].material             = new Material(name);
            dome.myMeshes[0].material.myFeatures |= Material.Feature.Skydome;

            TextureDescriptor td = new TextureDescriptor(Path.Combine(path, (string)descriptor["sun"]), true);
            Texture           t  = Renderer.resourceManager.getResource(td) as Texture;

            dome.myMeshes[0].material.addAttribute(new TextureAttribute("sun", t));

            td = new TextureDescriptor(Path.Combine(path, (string)descriptor["tint1"]), true);
            t  = Renderer.resourceManager.getResource(td) as Texture;
            dome.myMeshes[0].material.addAttribute(new TextureAttribute("tint1", t));

            td = new TextureDescriptor(Path.Combine(path, (string)descriptor["tint2"]), true);
            t  = Renderer.resourceManager.getResource(td) as Texture;
            dome.myMeshes[0].material.addAttribute(new TextureAttribute("tint2", t));

            td = new TextureDescriptor(Path.Combine(path, (string)descriptor["clouds1"]), true);
            t  = Renderer.resourceManager.getResource(td) as Texture;
            dome.myMeshes[0].material.addAttribute(new TextureAttribute("clouds1", t));

            td = new TextureDescriptor(Path.Combine(path, (string)descriptor["clouds2"]), true);
            t  = Renderer.resourceManager.getResource(td) as Texture;
            dome.myMeshes[0].material.addAttribute(new TextureAttribute("clouds2", t));

            td = new TextureDescriptor(Path.Combine(path, (string)descriptor["moon"]), true);
            t  = Renderer.resourceManager.getResource(td) as Texture;
            dome.myMeshes[0].material.addAttribute(new TextureAttribute("moon", t));

            return(dome);
        }
Beispiel #2
0
        public static ParticleSystem createSystem(JsonObject initData)
        {
            ParticleSystem ps = new ParticleSystem();

            ps.continuous   = (bool)initData["continuous"];
            ps.lifetime     = (float)initData["lifetime"];
            ps.maxParticles = (int)initData["maxParticles"];
            String            textureName = (string)initData["material"];
            TextureDescriptor td          = new TextureDescriptor(textureName);

            ps.material = Renderer.resourceManager.getResource(td) as Texture;

            JsonObject features = initData["features"];

            foreach (String key in features.keys)
            {
                ParticleFeatureCreator creator = null;
                if (featureFactory.TryGetValue(key, out creator) == true)
                {
                    JsonObject      featureData = features[key];
                    ParticleFeature f           = creator.create(featureData);
                    ps.addFeature(f);
                }
                else
                {
                    //don't get here
                    throw new Exception(String.Format("Unable to find creator for {0}", key));
                }
            }

            addParticleSystem(ps);
            return(ps);
        }
Beispiel #3
0
        Texture findTexture(String textureName)
        {
            //get the texture for this group
            String texFilename = Path.GetFileName(textureName);
            String modelPath   = Path.GetDirectoryName(myFilename);

            textureName = Path.Combine(modelPath, texFilename);
            TextureDescriptor td = new TextureDescriptor(textureName);
            Texture           t  = myResourceManager.getResource(td) as Texture;

            return(t);
        }
Beispiel #4
0
        Texture getTexture(string filepath)
        {
            Texture t = null;

            TextureDescriptor td = new TextureDescriptor(Path.Combine(myRootPath, filepath), true);

            t = myResourceManager.getResource(td) as Texture;

            if (t == null)
            {
                Warn.print("Failed to load texture {0}", filepath);
            }

            return(t);
        }
Beispiel #5
0
        public TextureFont(String name, String textureName, int size)
            : base(name, size)
        {
            TextureDescriptor td = new TextureDescriptor(textureName, true);

            texture = Renderer.resourceManager.getResource(td) as Texture;
            buildFont();

            //set shader
            List <ShaderDescriptor> desc = new List <ShaderDescriptor>();

            desc.Add(new ShaderDescriptor(ShaderType.VertexShader, "..\\src\\Graphics\\shaders\\font-vs.glsl", ShaderDescriptor.Source.File));
            desc.Add(new ShaderDescriptor(ShaderType.FragmentShader, "..\\src\\Graphics\\shaders\\font-ps.glsl", ShaderDescriptor.Source.File));
            ShaderProgramDescriptor shDesc = new ShaderProgramDescriptor(desc);

            myShader = Renderer.resourceManager.getResource(shDesc) as ShaderProgram;
            myVao.bindVertexFormat <V3T2>(myShader);
        }
Beispiel #6
0
        protected Texture getTexture(string filepath)
        {
            Texture t = null;

            if (filepath[0] == '*') //this is an embedded texture
            {
                string textureIndexStr = filepath.TrimStart('*');
                int    index           = Convert.ToInt32(textureIndexStr);
                if (index >= myScene.TextureCount)
                {
                    Warn.print("texture index({0}) is out of range({1})", index, myScene.TextureCount);
                    return(null);
                }

                EmbeddedTexture texData = myScene.Textures[index];
                if (texData != null)
                {
                    if (texData.IsCompressed)
                    {
                        byte[] bytes = texData.CompressedData;
                        switch (texData.CompressedFormatHint)
                        {
                        case "png": //fallthrough
                        case "jpg":
                            t = new Texture();
                            Stream stream = new MemoryStream(texData.CompressedData, false);
                            t.loadFromStream(stream);
                            break;

                        case "dds":
                            Warn.print("DDS files not supported yet");
                            break;

                        default:
                            Warn.print("Unkown compressed file format {0}", texData.CompressedFormatHint);
                            break;
                        }
                    }
                    else
                    {
                        byte[] bytes = new byte[texData.Width * texData.Height * 4];
                        for (int i = 0; i < texData.Height; i++)
                        {
                            for (int j = 0; i < texData.Width; i++)
                            {
                                bytes[j + (i * texData.Width) + 0] = texData.NonCompressedData[j + (i * texData.Width)].R;
                                bytes[j + (i * texData.Width) + 1] = texData.NonCompressedData[j + (i * texData.Width)].G;
                                bytes[j + (i * texData.Width) + 2] = texData.NonCompressedData[j + (i * texData.Width)].B;
                                bytes[j + (i * texData.Width) + 3] = texData.NonCompressedData[j + (i * texData.Width)].A;
                            }
                        }

                        Texture.PixelData pData = new Texture.PixelData();
                        pData.data        = bytes;
                        pData.dataType    = PixelType.Byte;
                        pData.pixelFormat = PixelFormat.Rgba;
                        t = new Texture(texData.Width, texData.Height, PixelInternalFormat.Rgba8, pData, true);
                    }
                }
            }
            else //just a path name
            {
                string            textureName = filepath.TrimStart('/');
                TextureDescriptor td          = new TextureDescriptor(Path.Combine(myRootPath, textureName), true);
                t = myResourceManager.getResource(td) as Texture;

                if (t == null)
                {
                    Warn.print("Failed to load texture {0}", filepath);
                }
            }

            return(t);
        }
Beispiel #7
0
        public SkinnedModel loadFromFile(string filename)
        {
            Info.print("Loading IQM model {0}", filename);

            if (File.Exists(filename) == false)
            {
                Warn.print("Cannot find file {0}", filename);
                return(null);
            }

            V3N3T2B4W4[] vertexData;
            ushort[]     triangleIndexes;

            IQMHeader myHeader;

            byte[]        myTexts;
            List <String> myComments = new List <String>();

            iqmvertexarray[] myVertArrays;
            iqmjoint[]       myJoints;
            iqmpose[]        myPoses;
            iqmanim[]        myAnimataions;
            iqmbounds[]      myBounds;
            iqmmesh[]        meshData;
            ushort[]         myFrameData;

            SkinnedModel sm = new SkinnedModel();

            System.IO.FileStream   stream = null;
            System.IO.BinaryReader reader = null;
            try
            {
                // Open the specified file as a stream and create a reader
                stream = new System.IO.FileStream(filename, FileMode.Open, FileAccess.Read);
                reader = new System.IO.BinaryReader(stream);

                myHeader.magic   = reader.ReadChars(16);
                myHeader.version = reader.ReadUInt32();
                if (myHeader.version != 2)
                {
                    return(null);
                }
                myHeader.filesize          = reader.ReadUInt32();
                myHeader.flags             = reader.ReadUInt32();
                myHeader.num_text          = reader.ReadUInt32();
                myHeader.ofs_text          = reader.ReadUInt32();
                myHeader.num_meshes        = reader.ReadUInt32();
                myHeader.ofs_meshes        = reader.ReadUInt32();
                myHeader.num_vertexarrays  = reader.ReadUInt32();
                myHeader.num_vertexes      = reader.ReadUInt32();
                myHeader.ofs_vertexarrays  = reader.ReadUInt32();
                myHeader.num_triangles     = reader.ReadUInt32();
                myHeader.ofs_triangles     = reader.ReadUInt32();
                myHeader.ofs_adjacency     = reader.ReadUInt32();
                myHeader.num_joints        = reader.ReadUInt32();
                myHeader.ofs_joints        = reader.ReadUInt32();
                myHeader.num_poses         = reader.ReadUInt32();
                myHeader.ofs_poses         = reader.ReadUInt32();
                myHeader.num_anims         = reader.ReadUInt32();
                myHeader.ofs_anims         = reader.ReadUInt32();
                myHeader.num_frames        = reader.ReadUInt32();
                myHeader.num_framechannels = reader.ReadUInt32();
                myHeader.ofs_frames        = reader.ReadUInt32();
                myHeader.ofs_bounds        = reader.ReadUInt32();
                myHeader.num_comment       = reader.ReadUInt32();
                myHeader.ofs_comment       = reader.ReadUInt32();
                myHeader.num_extensions    = reader.ReadUInt32();
                myHeader.ofs_extensions    = reader.ReadUInt32();

                boneCount = (int)myHeader.num_joints;

                //read text
                myTexts = new byte[myHeader.num_text];
                stream.Seek(myHeader.ofs_text, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_text; i++)
                {
                    myTexts[i] = reader.ReadByte();
                }

                #region read geometry

                //create geometry fields
                for (int m = 0; m < myHeader.num_meshes; m++)
                {
                    sm.myMeshes.Add(new Mesh());
                }

                //read the mesh data
                meshData = new iqmmesh[myHeader.num_meshes];
                stream.Seek(myHeader.ofs_meshes, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_meshes; i++)
                {
                    iqmmesh temp = new iqmmesh();
                    UInt32  n    = reader.ReadUInt32();
                    temp.name     = readNullTerminated(myTexts, n);
                    n             = reader.ReadUInt32();
                    temp.material = readNullTerminated(myTexts, n);
                    String fn = System.IO.Path.GetFileName(temp.material);
                    fn = System.IO.Path.ChangeExtension(fn, ".png");

                    String dir = System.IO.Path.GetDirectoryName(filename);
                    fn = System.IO.Path.Combine(dir, fn);

                    TextureDescriptor td  = new TextureDescriptor(fn);
                    Texture           tex = myResourceManager.getResource(td) as Texture;
                    Material          m   = new Material(temp.material);
                    m.addAttribute(new TextureAttribute("diffuseMap", tex));
                    m.myFeatures |= Material.Feature.Lighting;
                    m.myFeatures |= Material.Feature.DiffuseMap;

                    sm.myMeshes[i].material = m;

                    temp.first_vertex   = reader.ReadUInt32();
                    temp.num_vertexes   = reader.ReadUInt32();
                    temp.first_triangle = reader.ReadUInt32();
                    temp.num_triangles  = reader.ReadUInt32();
                    meshData[i]         = temp;
                }

                //read vertex arrays
                myVertArrays = new iqmvertexarray[myHeader.num_vertexarrays];
                stream.Seek(myHeader.ofs_vertexarrays, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_vertexarrays; i++)
                {
                    iqmvertexarray temp = new iqmvertexarray();
                    temp.type       = (VertexArrayType)reader.ReadUInt32();
                    temp.flags      = reader.ReadUInt32();
                    temp.format     = (VertexArrayFormat)reader.ReadUInt32();
                    temp.size       = reader.ReadUInt32();
                    temp.offset     = reader.ReadUInt32();
                    myVertArrays[i] = temp;
                }

                //read the vertex data
                vertexData = new V3N3T2B4W4[myHeader.num_vertexes];
                for (int i = 0; i < myHeader.num_vertexarrays; i++)
                {
                    iqmvertexarray va = myVertArrays[i];
                    switch (va.type)
                    {
                    case VertexArrayType.IQM_POSITION:
                    {
                        stream.Seek(va.offset, SeekOrigin.Begin);
                        for (int j = 0; j < myHeader.num_vertexes; j++)
                        {
                            Vector3 temp = new Vector3();
                            temp.X = reader.ReadSingle();
                            temp.Y = reader.ReadSingle();
                            temp.Z = reader.ReadSingle();
                            vertexData[j].Position = temp;
                        }
                        break;
                    }

                    case VertexArrayType.IQM_TEXCOORD:
                    {
                        stream.Seek(va.offset, SeekOrigin.Begin);
                        for (int j = 0; j < myHeader.num_vertexes; j++)
                        {
                            Vector2 temp = new Vector2();
                            temp.X = reader.ReadSingle();
                            temp.Y = reader.ReadSingle();
                            vertexData[j].TexCoord = temp;
                        }
                        break;
                    }

                    case VertexArrayType.IQM_NORMAL:
                    {
                        stream.Seek(va.offset, SeekOrigin.Begin);
                        for (int j = 0; j < myHeader.num_vertexes; j++)
                        {
                            Vector3 temp = new Vector3();
                            temp.X = reader.ReadSingle();
                            temp.Y = reader.ReadSingle();
                            temp.Z = reader.ReadSingle();
                            vertexData[j].Normal = temp;
                        }
                        break;
                    }

                    case VertexArrayType.IQM_BLENDINDEXES:
                    {
                        stream.Seek(va.offset, SeekOrigin.Begin);
                        for (int j = 0; j < myHeader.num_vertexes; j++)
                        {
                            Vector4 temp = new Vector4();
                            temp.X = (float)reader.ReadByte();
                            temp.Y = (float)reader.ReadByte();
                            temp.Z = (float)reader.ReadByte();
                            temp.W = (float)reader.ReadByte();
                            vertexData[j].BoneId = temp;
                        }
                        break;
                    }

                    case VertexArrayType.IQM_BLENDWEIGHTS:
                    {
                        stream.Seek(va.offset, SeekOrigin.Begin);
                        for (int j = 0; j < myHeader.num_vertexes; j++)
                        {
                            Vector4 temp = new Vector4();
                            temp.X = ((float)reader.ReadByte()) / 255.0f;
                            temp.Y = ((float)reader.ReadByte()) / 255.0f;
                            temp.Z = ((float)reader.ReadByte()) / 255.0f;
                            temp.W = ((float)reader.ReadByte()) / 255.0f;
                            vertexData[j].BoneWeight = temp;
                        }
                        break;
                    }
                    }
                }

                //read triangles indexes
                triangleIndexes = new ushort[myHeader.num_triangles * 3];
                stream.Seek(myHeader.ofs_triangles, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_triangles * 3; i++)
                {
                    triangleIndexes[i] = (ushort)reader.ReadUInt32();
                }
                #endregion

                #region read animation data
                //read joints
                myJoints = new iqmjoint[myHeader.num_joints];
                stream.Seek(myHeader.ofs_joints, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_joints; i++)
                {
                    iqmjoint temp = new iqmjoint();
                    UInt32   n    = reader.ReadUInt32();
                    temp.name        = readNullTerminated(myTexts, n);
                    temp.parent      = reader.ReadInt32();
                    temp.translate   = new Vector3();
                    temp.translate.X = reader.ReadSingle();
                    temp.translate.Y = reader.ReadSingle();
                    temp.translate.Z = reader.ReadSingle();
                    temp.rotate      = new Quaternion();
                    temp.rotate.X    = reader.ReadSingle();
                    temp.rotate.Y    = reader.ReadSingle();
                    temp.rotate.Z    = reader.ReadSingle();
                    temp.rotate.W    = reader.ReadSingle();
                    temp.rotate.Normalize();
                    temp.scale   = new Vector3();
                    temp.scale.X = reader.ReadSingle();
                    temp.scale.Y = reader.ReadSingle();
                    temp.scale.Z = reader.ReadSingle();
                    myJoints[i]  = temp;
                }

                //read poses
                myPoses = new iqmpose[myHeader.num_poses];
                stream.Seek(myHeader.ofs_poses, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_poses; i++)
                {
                    iqmpose temp = new iqmpose();
                    temp.parent      = reader.ReadInt32();
                    temp.channelmask = reader.ReadUInt32();

                    temp.channeloffset = new float[10];
                    for (int j = 0; j < 10; j++)
                    {
                        temp.channeloffset[j] = reader.ReadSingle();
                    }

                    temp.channelscale = new float[10];
                    for (int j = 0; j < 10; j++)
                    {
                        temp.channelscale[j] = reader.ReadSingle();
                    }

                    myPoses[i] = temp;
                }

                //read animations
                myAnimataions = new iqmanim[myHeader.num_anims];
                stream.Seek(myHeader.ofs_anims, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_anims; i++)
                {
                    iqmanim temp = new iqmanim();
                    UInt32  n    = reader.ReadUInt32();
                    temp.name        = readNullTerminated(myTexts, n);
                    temp.first_frame = reader.ReadUInt32();
                    temp.num_frames  = reader.ReadUInt32();
                    temp.framerate   = reader.ReadSingle();
                    temp.flags       = reader.ReadUInt32();
                    myAnimataions[i] = temp;


                    Animation a = new Animation();
                    a.name = temp.name;
                    a.fps  = temp.framerate;
                    a.loop = true;
                    sm.animations.Add(a.name, a);
                }

                //read frame data
                myFrameData = new ushort[myHeader.num_frames * myHeader.num_framechannels];
                stream.Seek(myHeader.ofs_frames, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_frames * myHeader.num_framechannels; i++)
                {
                    myFrameData[i] = reader.ReadUInt16();
                }

                #endregion

                //read bounds
                myBounds = new iqmbounds[myHeader.num_frames];
                stream.Seek(myHeader.ofs_bounds, SeekOrigin.Begin);
                for (int i = 0; i < myHeader.num_frames; i++)
                {
                    iqmbounds temp = new iqmbounds();
                    temp.bbmins    = new float[3];
                    temp.bbmaxs    = new float[3];
                    temp.bbmins[0] = reader.ReadSingle();
                    temp.bbmins[1] = reader.ReadSingle();
                    temp.bbmins[2] = reader.ReadSingle();
                    temp.bbmaxs[0] = reader.ReadSingle();
                    temp.bbmaxs[1] = reader.ReadSingle();
                    temp.bbmaxs[2] = reader.ReadSingle();
                    temp.xyradius  = reader.ReadSingle();
                    temp.radius    = reader.ReadSingle();

                    if (i == 0)
                    {
                        sm.size = temp.radius;
                    }
                }

                //read comments
                stream.Seek(myHeader.ofs_comment, SeekOrigin.Begin);
                int charRead = 0;
                while (charRead < myHeader.num_comment)
                {
                    char   c = reader.ReadChar(); charRead++;
                    string s = "";
                    while (c != '\0')
                    {
                        s += c;
                        c  = reader.ReadChar(); charRead++;
                    }

                    myComments.Add(s);
                }

                //read extensions
                //TODO

                //setup the bone data
                Matrix4[] baseframe        = new Matrix4[myHeader.num_joints];
                Matrix4[] inversebaseframe = new Matrix4[myHeader.num_joints];
                for (int i = 0; i < (int)myHeader.num_joints; i++)
                {
                    iqmjoint joint = myJoints[i];
                    Matrix4  r, t, s;
                    r                   = Matrix4.CreateFromQuaternion(joint.rotate);
                    t                   = Matrix4.CreateTranslation(joint.translate);
                    s                   = Matrix4.CreateScale(joint.scale);
                    baseframe[i]        = s * r * t;
                    inversebaseframe[i] = baseframe[i].Inverted();
                    if (joint.parent >= 0)
                    {
                        baseframe[i]        = baseframe[i] * baseframe[joint.parent];
                        inversebaseframe[i] = inversebaseframe[joint.parent] * inversebaseframe[i];
                    }

                    Bone b = new Bone();
                    b.myName            = myJoints[i].name;
                    b.myParent          = myJoints[i].parent;
                    b.myWorldBindMatrix = baseframe[i];
                    sm.skeleton.myBones.Add(b);
                }

                Matrix4[] absMatrix = new Matrix4[myHeader.num_frames * myHeader.num_poses];
                int       count     = 0;
                for (int i = 0; i < myHeader.num_frames; i++)
                {
                    for (int j = 0; j < myHeader.num_poses; j++)
                    {
                        iqmpose    p         = myPoses[j];
                        Quaternion rotate    = new Quaternion();
                        Vector3    translate = new Vector3();
                        Vector3    scale     = new Vector3();
                        translate.X = p.channeloffset[0]; if ((p.channelmask & 0x01) != 0)
                        {
                            translate.X += myFrameData[count++] * p.channelscale[0];
                        }
                        translate.Y = p.channeloffset[1]; if ((p.channelmask & 0x02) != 0)
                        {
                            translate.Y += myFrameData[count++] * p.channelscale[1];
                        }
                        translate.Z = p.channeloffset[2]; if ((p.channelmask & 0x04) != 0)
                        {
                            translate.Z += myFrameData[count++] * p.channelscale[2];
                        }
                        rotate.X = p.channeloffset[3]; if ((p.channelmask & 0x08) != 0)
                        {
                            rotate.X += myFrameData[count++] * p.channelscale[3];
                        }
                        rotate.Y = p.channeloffset[4]; if ((p.channelmask & 0x10) != 0)
                        {
                            rotate.Y += myFrameData[count++] * p.channelscale[4];
                        }
                        rotate.Z = p.channeloffset[5]; if ((p.channelmask & 0x20) != 0)
                        {
                            rotate.Z += myFrameData[count++] * p.channelscale[5];
                        }
                        rotate.W = p.channeloffset[6]; if ((p.channelmask & 0x40) != 0)
                        {
                            rotate.W += myFrameData[count++] * p.channelscale[6];
                        }
                        scale.X = p.channeloffset[7]; if ((p.channelmask & 0x80) != 0)
                        {
                            scale.X += myFrameData[count++] * p.channelscale[7];
                        }
                        scale.Y = p.channeloffset[8]; if ((p.channelmask & 0x100) != 0)
                        {
                            scale.Y += myFrameData[count++] * p.channelscale[8];
                        }
                        scale.Z = p.channeloffset[9]; if ((p.channelmask & 0x200) != 0)
                        {
                            scale.Z += myFrameData[count++] * p.channelscale[9];
                        }
                        // Concatenate each pose with the inverse base pose to avoid doing this at animation time.
                        // If the joint has a parent, then it needs to be pre-concatenated with its parent's base pose.
                        // Thus it all negates at animation time like so:
                        //   (parentPose * parentInverseBasePose) * (parentBasePose * childPose * childInverseBasePose) =>
                        //   parentPose * (parentInverseBasePose * parentBasePose) * childPose * childInverseBasePose =>
                        //   parentPose * childPose * childInverseBasePose
                        rotate.Normalize();
                        Matrix4 r, t, s;
                        r = Matrix4.CreateFromQuaternion(rotate);
                        t = Matrix4.CreateTranslation(translate);
                        s = Matrix4.CreateScale(scale);
                        Matrix4 pose = s * r * t;
                        if (p.parent >= 0)
                        {
                            Matrix4 parent     = baseframe[p.parent];
                            Matrix4 inv        = inversebaseframe[j];
                            Matrix4 parentPose = absMatrix[i * myHeader.num_poses + p.parent];
                            absMatrix[i * myHeader.num_poses + j] = inv * pose * parent * parentPose;
                        }
                        else
                        {
                            Matrix4 inv = inversebaseframe[j];
                            absMatrix[i * myHeader.num_poses + j] = inv * pose;
                        }
                    }
                }

                Vector4[] boneData = new Vector4[myHeader.num_frames * myHeader.num_poses * 4];
                int       next     = 0;
                for (int i = 0; i < myHeader.num_frames * myHeader.num_poses; i++)
                {
                    boneData[next++] = absMatrix[i].Row0;
                    boneData[next++] = absMatrix[i].Row1;
                    boneData[next++] = absMatrix[i].Row2;
                    boneData[next++] = absMatrix[i].Row3;
                }

                //setup the buffers
                sm.myBindings = V3N3T2B4W4.bindings();
                VertexBufferObject vbo = new VertexBufferObject(BufferUsageHint.StaticDraw);
                vbo.setData(vertexData);
                sm.myVbos.Add(vbo);

                List <ushort> indexes    = new List <ushort>();
                int           indexCount = 0;
                for (int m = 0; m < sm.myMeshes.Count; m++)
                {
                    Mesh mesh = sm.myMeshes[m];
                    mesh.primativeType = PrimitiveType.Triangles;
                    mesh.indexBase     = indexCount;

                    for (int t = 0; t < meshData[m].num_triangles; t++)
                    {
                        //swap the order the indicies since we want counter clockwise triangles instead of clockwise
                        indexes.Add(triangleIndexes[meshData[m].first_triangle * 3 + (t * 3) + 0]);
                        indexes.Add(triangleIndexes[meshData[m].first_triangle * 3 + (t * 3) + 2]);
                        indexes.Add(triangleIndexes[meshData[m].first_triangle * 3 + (t * 3) + 1]);
                        indexCount += 3;
                    }

                    mesh.indexCount = indexCount - mesh.indexBase;
                }

                sm.myIbo.setData(indexes);

                //upload the frame data
                sm.myFrames.setData(boneData);

                return(sm);
            }
            catch (Exception ex)
            {
                throw new Exception("Error while loading IQM model from definition file ( " + filename + " ).", ex);
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (stream != null)
                {
                    stream.Close();
                    stream.Dispose();
                }
            }
        }
Beispiel #8
0
        public bool buildFont()
        {
            TextureDescriptor td = new TextureDescriptor(myFilename + ".png", false);

            texture = Renderer.resourceManager.getResource(td) as Texture;

            FileInfo     file   = new FileInfo(myFilename + ".txt");
            StreamReader reader = file.OpenText();
            string       line;

            while ((line = reader.ReadLine()) != null)
            {
                String[] splitters = { " " };
                String[] tokens    = line.Split(splitters, StringSplitOptions.RemoveEmptyEntries);
                if (tokens[0] == "info")
                {
                }
                if (tokens[0] == "chars")
                {
                }
                if (tokens[0] == "char")
                {
                    String[] split;

                    //id
                    split = tokens[1].Split('=');
                    int id = Convert.ToInt32(split[1]);

                    //X and Y are in pixels, so need to be converted to S/T coordinates (normalized)
                    //x
                    split = tokens[2].Split('=');
                    myGlyphs[id].minTexCoord.X = Convert.ToSingle(split[1]) / texture.width;

                    //y
                    split = tokens[3].Split('=');
                    myGlyphs[id].minTexCoord.Y = Convert.ToSingle(split[1]) / texture.height;

                    //width and height are in pixels, need to convert to S/T coordinates
                    //width
                    split = tokens[4].Split('=');
                    myGlyphs[id].maxTexCoord.X  = myGlyphs[id].minTexCoord.X;
                    myGlyphs[id].maxTexCoord.X += Convert.ToSingle(split[1]) / texture.width;
                    myGlyphs[id].size.X         = Convert.ToSingle(split[1]);

                    //height
                    split = tokens[5].Split('=');
                    myGlyphs[id].maxTexCoord.Y  = myGlyphs[id].minTexCoord.Y;
                    myGlyphs[id].maxTexCoord.Y += Convert.ToSingle(split[1]) / texture.height;
                    myGlyphs[id].size.Y         = Convert.ToSingle(split[1]);

                    //xoffset
                    split = tokens[6].Split('=');
                    myGlyphs[id].offset.X = Convert.ToSingle(split[1]);

                    //yoffset
                    split = tokens[7].Split('=');
                    myGlyphs[id].offset.Y = Convert.ToSingle(split[1]);

                    //xadvance
                    split = tokens[8].Split('=');
                    myGlyphs[id].advance.X = Convert.ToSingle(split[1]);
                }
            }
            return(true);
        }
Beispiel #9
0
        public bool loadMaterialFromFile(string path)
        {
            string rootPath = Path.GetDirectoryName(path);
            string filename = Path.GetFileNameWithoutExtension(path);

            filename += ".mtl";
            filename  = Path.Combine(rootPath, filename);
            if (File.Exists(filename) == false)
            {
                Warn.print("Cannot find file {0}", filename);
                return(false);
            }

            StreamReader file = new StreamReader(filename);
            String       line;

            while ((line = file.ReadLine()) != null)
            {
                line = line.Trim();
                line = line.ToLowerInvariant();
                String[] tokens = line.Split(' ');
                switch (tokens[0])
                {
                case "#":
                {
                    continue;
                }

                case "newmtl":
                {
                    Material m = new Material(tokens[1]);
                    m.myFeatures |= Material.Feature.Lighting;
                    while (line != "" && line != null)
                    {
                        line = line.Trim();
                        String[] matTokens = line.Split(' ');
                        matTokens[0] = matTokens[0].ToLowerInvariant();

                        switch (matTokens[0])
                        {
                        case "ka":
                        {
                            Color4 c = new Color4();
                            c.R       = System.Convert.ToSingle(matTokens[1]);
                            c.G       = System.Convert.ToSingle(matTokens[2]);
                            c.B       = System.Convert.ToSingle(matTokens[3]);
                            m.ambient = c;
                            break;
                        }

                        case "kd":
                        {
                            Color4 c = new Color4();
                            c.R       = System.Convert.ToSingle(matTokens[1]);
                            c.G       = System.Convert.ToSingle(matTokens[2]);
                            c.B       = System.Convert.ToSingle(matTokens[3]);
                            m.diffuse = c;
                            break;
                        }

                        case "ks":
                        {
                            Color4 c = new Color4();
                            c.R    = System.Convert.ToSingle(matTokens[1]);
                            c.G    = System.Convert.ToSingle(matTokens[2]);
                            c.B    = System.Convert.ToSingle(matTokens[3]);
                            m.spec = c;
                            break;
                        }

                        case "ns":
                        {
                            float val = System.Convert.ToSingle(matTokens[1]);
                            m.shininess = val;
                            break;
                        }

                        case "d":
                        {
                            float val = System.Convert.ToSingle(matTokens[1]);
                            m.alpha = val;
                            break;
                        }

                        case "map_ka":
                        {
                            string            textureName = matTokens[1];
                            TextureDescriptor td          = new TextureDescriptor(Path.Combine(rootPath, textureName), true);
                            Texture           t           = myResourceManager.getResource(td) as Texture;
                            if (t != null)
                            {
                                m.addAttribute(new TextureAttribute("ambientMap", t));
                            }
                            break;
                        }

                        case "map_kd":
                        {
                            string            textureName = matTokens[1];
                            TextureDescriptor td          = new TextureDescriptor(Path.Combine(rootPath, textureName), true);
                            Texture           t           = myResourceManager.getResource(td) as Texture;
                            if (t != null)
                            {
                                m.addAttribute(new TextureAttribute("diffuseMap", t));
                                m.myFeatures     |= Material.Feature.DiffuseMap;
                                m.hasTransparency = t.hasAlpha;
                            }
                            break;
                        }

                        case "map_ks":
                        {
                            string            textureName = matTokens[1];
                            TextureDescriptor td          = new TextureDescriptor(Path.Combine(rootPath, textureName), true);
                            Texture           t           = myResourceManager.getResource(td) as Texture;
                            if (t != null)
                            {
                                m.addAttribute(new TextureAttribute("specularMap", t));
                                m.myFeatures |= Material.Feature.SpecMap;
                            }
                            break;
                        }

                        case "map_d":
                        {
                            string            textureName = matTokens[1];
                            TextureDescriptor td          = new TextureDescriptor(Path.Combine(rootPath, textureName), true);
                            Texture           t           = myResourceManager.getResource(td) as Texture;
                            if (t != null)
                            {
                                m.addAttribute(new TextureAttribute("alphaMap", t));
                            }
                            break;
                        }

                        case "bump":
                        case "map_bump":
                        {
                            string            textureName = matTokens[1];
                            TextureDescriptor td          = new TextureDescriptor(Path.Combine(rootPath, textureName), true);
                            Texture           t           = myResourceManager.getResource(td) as Texture;
                            if (t != null)
                            {
                                m.addAttribute(new TextureAttribute("normalMap", t));
                                m.myFeatures |= Material.Feature.NormalMap;
                            }
                            break;
                        }

                        case "disp":
                        {
                            string            textureName = matTokens[1];
                            TextureDescriptor td          = new TextureDescriptor(Path.Combine(rootPath, textureName), true);
                            Texture           t           = myResourceManager.getResource(td) as Texture;
                            if (t != null)
                            {
                                m.addAttribute(new TextureAttribute("displaceMap", t));
                                m.myFeatures |= Material.Feature.DisplacementMap;
                            }
                            break;
                        }
                        }

                        line = file.ReadLine();
                    }

                    myMaterials.Add(tokens[1], m);
                }
                break;
                }
            }

            file.Close();
            return(true);
        }