Example #1
0
 public CMDLViewer(CGFX Resource, CMDL Model)
 {
     this.Resource = Resource;
     this.Model = Model;
     InitializeComponent();
     simpleOpenGlControl1.MouseWheel += new MouseEventHandler(simpleOpenGlControl1_MouseWheel);
 }
Example #2
0
 public CGFXShader(CMDL.MTOB Material, int[] Textures)
 {
     this.Textures = Textures;
     this.Material = Material;
 }
        private void UploadTex(CMDL.MTOB.TexInfo TextureMapper, int Id)
        {
            if (!(TextureMapper.TextureObject is ReferenceTexture))
                return;
            var tex = cgfx.Data.Textures[cgfx.Data.Dictionaries[1].IndexOf(((ReferenceTexture)TextureMapper.TextureObject).LinkedTextureName)] as ImageTextureCtr;
            if (tex == null)
                return;
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
            Gl.glColor3f(1, 1, 1);
            Bitmap b = tex.GetBitmap();
            b.RotateFlip(RotateFlipType.RotateNoneFlipY);
            BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, b.Width, b.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, d.Scan0);
            b.UnlockBits(d);

            if (((TextureMapper.Unknown12 >> 1) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
            else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
            //if (((TextureMapper.Unknown12 >> 2) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
            //else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
            //A bit confusing, so using this for now:
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);

            switch ((TextureMapper.Unknown12 >> 12) & 0xF)
            {
                case 0:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
                    break;
                case 1:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_BORDER);
                    break;
                case 2:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
                    break;
                case 3:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT);
                    break;
                default:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
                    break;
            }

            switch ((TextureMapper.Unknown12 >> 8) & 0xF)
            {
                case 0:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
                    break;
                case 1:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_BORDER);
                    break;
                case 2:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
                    break;
                case 3:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT);
                    break;
                default:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
                    break;
            }
        }
Example #4
0
 public override void GetVertexData(Polygon Destination, PrimitiveSet PrimitiveSet, CMDL Model)
 {
     int count = Destination.Vertex.Length;
     switch (Usage)
     {
         //case VertexAttributeUsage.Position: Destination.Vertex = new Vector3[Vertices]; break;
         case VertexAttributeUsage.Tangent:
             break;
         case VertexAttributeUsage.Normal:
             Destination.Normals = new Vector3[count];
             for (int i = 0; i < count; i++)
             {
                 Destination.Normals[i] = new Vector3(Attributes[0], Attributes[1], Attributes[2]);
             }
             break;
         //case VertexAttributeUsage.Tangent: break;
         case VertexAttributeUsage.Color:
             Destination.Colors = new Color[count];
             for (int i = 0; i < count; i++)
             {
                 if (NrAttributes > 3) Destination.Colors[i] = Color.FromArgb((int)(Attributes[3] * 255), (int)(Attributes[0] * 255), (int)(Attributes[1] * 255), (int)(Attributes[2] * 255));
                 else Destination.Colors[i] = Color.FromArgb(255, (int)(Attributes[0] * 255), (int)(Attributes[1] * 255), (int)(Attributes[2] * 255));
             }
             break;
         case VertexAttributeUsage.TextureCoordinate0:
             Destination.TexCoords = new Vector2[count];
             for (int i = 0; i < count; i++)
             {
                 Destination.TexCoords[i] = new Vector2(Attributes[0], Attributes[1]);
             }
             break;
         case VertexAttributeUsage.TextureCoordinate1:
             Destination.TexCoords2 = new Vector2[count];
             for (int i = 0; i < count; i++)
             {
                 Destination.TexCoords2[i] = new Vector2(Attributes[0], Attributes[1]);
             }
             break;
         case VertexAttributeUsage.TextureCoordinate2:
             Destination.TexCoords3 = new Vector2[count];
             for (int i = 0; i < count; i++)
             {
                 Destination.TexCoords3[i] = new Vector2(Attributes[0], Attributes[1]);
             }
             break;
         case VertexAttributeUsage.BoneIndex:
             Matrix34 mtx = Model.Skeleton.GetMatrix((int)Attributes[0]);
             for (int i = 0; i < count; i++)
             {
                 Destination.Vertex[i] *= mtx;
             }
             break;
         case VertexAttributeUsage.BoneWeight: break;//tmp
         default:
             break;
     }
 }
Example #5
0
 public virtual void GetVertexData(Polygon Destination, PrimitiveSet PrimitiveSet, CMDL Model)
 {
 }
Example #6
0
                public override void GetVertexData(Polygon Destination, PrimitiveSet PrimitiveSet, CMDL Model)
                {
                    var p = Destination;
                    int Vertices = (int)(VertexStreamLength / VertexDataEntrySize);
                    int Offset = 0;
                    byte[] VertexData = VertexStream;
                    foreach (var v in VertexStreams)
                    {
                        switch (v.Usage)
                        {
                            case VertexAttributeUsage.Position: p.Vertex = new Vector3[Vertices]; break;
                            case VertexAttributeUsage.Normal: p.Normals = new Vector3[Vertices]; break;
                            //case VertexAttributeUsage.Tangent: break;
                            case VertexAttributeUsage.Color: p.Colors = new Color[Vertices]; break;
                            case VertexAttributeUsage.TextureCoordinate0: p.TexCoords = new Vector2[Vertices]; break;
                            case VertexAttributeUsage.TextureCoordinate1: p.TexCoords2 = new Vector2[Vertices]; break;
                            case VertexAttributeUsage.TextureCoordinate2: p.TexCoords3 = new Vector2[Vertices]; break;
                            case VertexAttributeUsage.BoneIndex: break;
                            case VertexAttributeUsage.BoneWeight: break;
                            default:
                                break;
                        }
                    }
                    for (int i = 0; i < Vertices; i++)
                    {
                        byte[] bones = new byte[0];
                        foreach (var v in VertexStreams)
                        {
                            float[] Vars = new float[v.NrComponents];
                            int offs_ = 0;
                            for (int q = 0; q < v.NrComponents; q++)
                            {
                                switch (v.FormatType)
                                {
                                    case DataType.GL_BYTE:
                                        Vars[q] = (sbyte)VertexData[Offset + (int)v.Offset + offs_] * v.Scale;
                                        offs_++;
                                        break;
                                    case DataType.GL_UNSIGNED_BYTE:
                                        Vars[q] = VertexData[Offset + (int)v.Offset + offs_] * v.Scale;
                                        offs_++;
                                        break;
                                    case DataType.GL_SHORT:
                                        Vars[q] = IOUtil.ReadS16LE(VertexData, Offset + (int)v.Offset + offs_) * v.Scale;
                                        offs_ += 2;
                                        break;
                                    case DataType.GL_FLOAT:
                                        Vars[q] = BitConverter.ToSingle(VertexData, Offset + (int)v.Offset + offs_);
                                        offs_ += 4;
                                        break;
                                }
                            }
                            switch (v.Usage)
                            {
                                case VertexAttributeUsage.Position:
                                    p.Vertex[i] = new Vector3(Vars[0], Vars[1], Vars[2]);
                                    if (PrimitiveSet.RelatedBones != null && PrimitiveSet.RelatedBones.Length == 1) p.Vertex[i] = p.Vertex[i] * Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[0]);//SkeletonCtr.TransformByMtx(p.Vertex[i], Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[0]));
                                    break;
                                case VertexAttributeUsage.Normal:
                                    p.Normals[i] = new Vector3(Vars[0], Vars[1], Vars[2]);
                                    break;
                                case VertexAttributeUsage.Tangent:
                                    {
                                        Vector3 unk = new Vector3(Vars[0], Vars[1], Vars[2]);
                                    }
                                    break;
                                case VertexAttributeUsage.Color:
                                    if (Vars[0] < 0) Vars[0] = 0;
                                    if (Vars[0] > 1) Vars[0] = 1;
                                    if (Vars[1] < 0) Vars[1] = 0;
                                    if (Vars[1] > 1) Vars[1] = 1;
                                    if (Vars[2] < 0) Vars[2] = 0;
                                    if (Vars[2] > 1) Vars[2] = 1;
                                    if (Vars.Length > 3 && Vars[3] < 0) Vars[3] = 0;
                                    if (Vars.Length > 3 && Vars[3] > 1) Vars[3] = 1;
                                    if (v.FormatType == DataType.GL_BYTE || v.FormatType == DataType.GL_UNSIGNED_BYTE)
                                        if (Vars.Length > 3) p.Colors[i] = Color.FromArgb((int)(Vars[3] * 255), (int)(Vars[0] * 255), (int)(Vars[1] * 255), (int)(Vars[2] * 255));
                                        else p.Colors[i] = Color.FromArgb(255, (int)(Vars[0] * 255), (int)(Vars[1] * 255), (int)(Vars[2] * 255));
                                    else p.Colors[i] = Color.White;
                                    break;
                                case VertexAttributeUsage.TextureCoordinate0:
                                    p.TexCoords[i] = new Vector2(Vars[0], Vars[1]);
                                    break;
                                case VertexAttributeUsage.TextureCoordinate1:
                                    p.TexCoords2[i] = new Vector2(Vars[0], Vars[1]);
                                    break;
                                case VertexAttributeUsage.TextureCoordinate2:
                                    p.TexCoords3[i] = new Vector2(Vars[0], Vars[1]);
                                    break;
                                case VertexAttributeUsage.BoneIndex:
                                    {
                                        if (v.NrComponents == 1)
                                        {
                                            byte boneidx = VertexData[Offset + v.Offset];
                                            p.Vertex[i] = p.Vertex[i] * Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[boneidx]); //SkeletonCtr.TransformByMtx(p.Vertex[i], Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[boneidx]));//Vector3.Transform(p.Vertex[i], Model.Skeleton.GetMatrix((int)PrimitiveSets[0].RelatedBones[boneidx]));
                                        }
                                        else
                                        {
                                            bones = new byte[v.NrComponents];
                                            for (int q = 0; q < v.NrComponents; q++)
                                            {
                                                bones[q] = VertexData[Offset + v.Offset + q];
                                            }
                                        }
                                    }
                                    break;
                                case VertexAttributeUsage.BoneWeight:
                                    {
                                        if (bones.Length != 0)
                                        {
                                            //this doesn't work correct!
                                            //Vector3 dst = new Vector3(0, 0, 0);
                                            //for (int j = 0; j < v.NrComponents; j++)
                                            //{
                                            //	dst += p.Vertex[i] * Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[bones[j]]) * Vars[j];// SkeletonCtr.TransformByMtx(p.Vertex[i], Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[bones[j]])) * Vars[j];//Add4(dst, Mult4(Model.Skeleton.GetMatrix((int)PrimitiveSet.RelatedBones[bones[j]]), ((float)weights[j] * v.Scale)));
                                            //}
                                            //no transformations when no animation is used!
                                            //p.Vertex[i] = dst;
                                        }
                                        else
                                        {

                                        }
                                    }
                                    break;
                                default:
                                    break;
                            }
                        }
                        Offset += (int)VertexDataEntrySize;
                    }
                }
Example #7
0
 public Polygon GetVertexData(CMDL Model)
 {
     Polygon p = new Polygon();
     foreach (var v in VertexAttributes)
     {
         v.GetVertexData(p, PrimitiveSets[0], Model);
     }
     return p;
 }