public CMDLViewer(CGFX Resource, CMDL Model) { this.Resource = Resource; this.Model = Model; InitializeComponent(); simpleOpenGlControl1.MouseWheel += new MouseEventHandler(simpleOpenGlControl1_MouseWheel); }
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; } }
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; } }
public virtual void GetVertexData(Polygon Destination, PrimitiveSet PrimitiveSet, CMDL Model) { }
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; } }
public Polygon GetVertexData(CMDL Model) { Polygon p = new Polygon(); foreach (var v in VertexAttributes) { v.GetVertexData(p, PrimitiveSets[0], Model); } return p; }