private void UploadTex(Bitmap b, MDL0.Model.MaterialSet.Material m, int Id)
        {
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
            Gl.glColor3f(1, 1, 1);
            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);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
            bool repeatS = (m.texImageParam >> 16 & 0x1) == 1;
            bool repeatT = (m.texImageParam >> 17 & 0x1) == 1;
            bool flipS   = (m.texImageParam >> 18 & 0x1) == 1;
            bool flipT   = (m.texImageParam >> 19 & 0x1) == 1;
            int  S;

            if (repeatS && flipS)
            {
                S = Gl.GL_MIRRORED_REPEAT;
            }
            else if (repeatS)
            {
                S = Gl.GL_REPEAT;
            }
            else
            {
                S = Gl.GL_CLAMP;
            }
            int T;

            if (repeatT && flipT)
            {
                T = Gl.GL_MIRRORED_REPEAT;
            }
            else if (repeatT)
            {
                T = Gl.GL_REPEAT;
            }
            else
            {
                T = Gl.GL_CLAMP;
            }
            Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, S);
            Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, T);
        }
        private void UploadTex(Bitmap b, MDL0.Model.MaterialSet.Material m, int Id)
        {
            GL.BindTexture(TextureTarget.Texture2D, Id);
            GL.Color3(1, 1, 1);
            BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, b.Width, b.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, d.Scan0);
            b.UnlockBits(d);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
            bool repeatS = (m.texImageParam >> 16 & 0x1) == 1;
            bool repeatT = (m.texImageParam >> 17 & 0x1) == 1;
            bool flipS   = (m.texImageParam >> 18 & 0x1) == 1;
            bool flipT   = (m.texImageParam >> 19 & 0x1) == 1;
            int  S;

            if (repeatS && flipS)
            {
                S = (int)TextureWrapMode.MirroredRepeat;
            }
            else if (repeatS)
            {
                S = (int)TextureWrapMode.Repeat;
            }
            else
            {
                S = (int)TextureWrapMode.Clamp;
            }
            int T;

            if (repeatT && flipT)
            {
                T = (int)TextureWrapMode.MirroredRepeat;
            }
            else if (repeatT)
            {
                T = (int)TextureWrapMode.Repeat;
            }
            else
            {
                T = (int)TextureWrapMode.Clamp;
            }
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, S);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, T);
        }
 public MDL0MaterialEditor(MDL0.Model.MaterialSet.Material Material)
 {
     this.Material = Material;
     InitializeComponent();
 }
Exemple #4
0
        public void Execute()
        {
            CommandContext c = new CommandContext();

            c.MatrixMode(CommandContext.NDSMatrixMode.Position_Vector);
            while (Offset < Data.Length)
            {
                byte cmd = Data[Offset++];
                switch (cmd & 0xF)
                {
                case 0:                        //NOP
                    break;

                case 1:                        //RET
                    return;

                case 2:                        //NODE
                {
                    byte nodeid = Data[Offset++];
                    NodeVisible = Data[Offset++] == 1;
                    break;
                }

                case 3:                        //MTX
                    if (!NodeVisible)
                    {
                        Offset++; break;
                    }
                    c.RestoreMatrix(Data[Offset++]);
                    break;

                case 4:                        //MAT
                {
                    if (!NodeVisible)
                    {
                        Offset++; break;
                    }
                    byte matid = Data[Offset++];
                    MDL0.Model.MaterialSet.Material m = Model.materials.materials[matid];
                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, matid + 1);                                     //+ texoffset);
                    Gl.glMatrixMode(Gl.GL_TEXTURE);
                    Gl.glLoadIdentity();
                    Gl.glScalef(1f / m.origWidth, 1f / m.origHeight, 1f);
                    Gl.glMultMatrixf(m.GetMatrix());

                    c.PolygonAttr(m.polyAttr);

                    uint diff = 0;
                    if ((m.flag & MDL0.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_DIFFUSE) != 0)
                    {
                        diff = m.diffAmb & 0x7FFF;
                    }
                    uint amb = 0x5294;
                    if ((m.flag & MDL0.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_AMBIENT) != 0)
                    {
                        amb = (m.diffAmb >> 16) & 0x7FFF;
                    }

                    uint usevtx = 0;
                    if ((m.diffAmb & 0x8000) != 0 && (m.flag & MDL0.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_VTXCOLOR) != 0)
                    {
                        usevtx = 0x8000;
                    }

                    c.MaterialColor0((uint)(amb << 16 | usevtx | diff));

                    uint spec = 0;
                    if ((m.flag & MDL0.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_SPECULAR) != 0)
                    {
                        spec = m.specEmi & 0x7FFF;
                    }
                    uint emiss = 0;
                    if ((m.flag & MDL0.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_EMISSION) != 0)
                    {
                        spec = (m.specEmi >> 16) & 0x7FFF;
                    }

                    c.MaterialColor1((uint)(emiss << 16 | m.specEmi & 0x8000 | spec));

                    Gl.glMatrixMode(Gl.GL_MODELVIEW);
                    Gl.glDisable(Gl.GL_TEXTURE_GEN_S);
                    Gl.glDisable(Gl.GL_TEXTURE_GEN_T);
                    break;
                }

                case 5:                        //SHP
                {
                    if (!NodeVisible)
                    {
                        Offset++; break;
                    }
                    c.RunDL(Model.shapes.shape[Data[Offset++]].DL);
                    c.End();                                    //to prevent errors if the display list is not correctly terminated
                    break;
                }

                case 6:                        //NODEDESC
                {
                    byte nodeid                 = Data[Offset++];
                    byte parentid               = Data[Offset++];
                    byte segmentscale           = Data[Offset++];
                    bool thisnodesegmentscale   = (segmentscale & 1) == 1;
                    bool parentnodesegmentscale = (segmentscale >> 1 & 1) == 1;
                    bool MayaScale              = thisnodesegmentscale;
                    int  StackID                = ((cmd >> 5 & 0x1) == 1) ? Data[Offset++] : -1;
                    int  RestID                 = ((cmd >> 6 & 0x1) == 1) ? Data[Offset++] : -1;
                    if (RestID != -1)
                    {
                        c.RestoreMatrix((uint)RestID);
                    }
                    Model.nodes.data[nodeid].ApplyMatrix(c, MayaScale);
                    //c.MultMatrix44(new Matrix44(Model.nodes.data[nodeid].GetMatrix(MayaScale, 1)));
                    if (StackID != -1)
                    {
                        c.StoreMatrix((uint)StackID);
                    }
                    break;
                }

                case 7:                        //BB
                {
                    byte nodeid  = Data[Offset++];
                    int  StackID = ((cmd >> 5 & 0x1) == 1) ? Data[Offset++] : -1;
                    int  RestID  = ((cmd >> 6 & 0x1) == 1) ? Data[Offset++] : -1;
                    if (RestID != -1)
                    {
                        c.RestoreMatrix((uint)RestID);
                    }
                    float[] proj = new float[16];
                    Gl.glGetFloatv(Gl.GL_MODELVIEW_MATRIX, proj);

                    Matrix44 m = c.GetCurPosMtx();
                    m[3, 0] = m[3, 1] = m[3, 2] = 0;

                    Matrix44 mtx = c.GetCurPosMtx();
                    mtx[0, 0] = proj[0];
                    mtx[1, 0] = proj[1];
                    mtx[2, 0] = proj[2];

                    mtx[0, 1] = proj[4];
                    mtx[1, 1] = proj[5];
                    mtx[2, 1] = proj[6];

                    mtx[0, 2] = proj[8];
                    mtx[1, 2] = proj[9];
                    mtx[2, 2] = proj[10];

                    c.LoadMatrix44(mtx * m);
                    if (StackID != -1)
                    {
                        c.StoreMatrix((uint)StackID);
                    }
                    break;
                }

                case 8:                        //BBY
                {
                    byte nodeid  = Data[Offset++];
                    int  StackID = ((cmd >> 5 & 0x1) == 1) ? Data[Offset++] : -1;
                    int  RestID  = ((cmd >> 6 & 0x1) == 1) ? Data[Offset++] : -1;
                    if (RestID != -1)
                    {
                        c.RestoreMatrix((uint)RestID);
                    }
                    float[] proj = new float[16];
                    Gl.glGetFloatv(Gl.GL_MODELVIEW_MATRIX, proj);

                    /*
                     * Matrix33 mtx = new Matrix33();
                     * mtx[0, 0] = proj[0];
                     * mtx[2, 0] = proj[2];
                     *
                     * mtx[0, 1] = proj[4];
                     * mtx[1, 1] = proj[5];
                     * mtx[2, 1] = proj[6];
                     *
                     * mtx[0, 2] = proj[8];
                     * mtx[2, 2] = proj[10];
                     *
                     * c.MultMatrix33(mtx);//c.LoadMatrix44(mtx);
                     * */

                    Matrix44 m = c.GetCurPosMtx();
                    m[3, 0] = m[3, 1] = m[3, 2] = 0;

                    Matrix44 mtx = c.GetCurPosMtx();
                    mtx[0, 0] = proj[0];
                    mtx[2, 0] = proj[2];

                    mtx[0, 1] = proj[4];
                    mtx[1, 1] = proj[5];
                    mtx[2, 1] = proj[6];

                    mtx[0, 2] = proj[8];
                    mtx[2, 2] = proj[10];

                    c.LoadMatrix44(mtx * m);
                    if (StackID != -1)
                    {
                        c.StoreMatrix((uint)StackID);
                    }
                    break;
                }

                case 9:                        //NODEMIX
                {
                    byte stackid     = Data[Offset++];
                    byte nummatrices = Data[Offset++];
                    for (int i = 0; i < nummatrices; i++)
                    {
                        byte  SrcIdx_N = Data[Offset++];
                        byte  NodeID_N = Data[Offset++];
                        float Ratio_N  = Data[Offset++] / 256f;
                    }
                    break;
                }

                case 10:                        //CALLDL
                {
                    uint RelAddr = IOUtil.ReadU32LE(Data, Offset);
                    Offset += 4;
                    uint Size = IOUtil.ReadU32LE(Data, Offset);
                    Offset += 4;
                    byte[] DL = new byte[Size];
                    Array.Copy(Data, Offset - 9 + RelAddr, DL, 0, Size);
                    c.RunDL(DL);
                    break;
                }

                case 11:                        //POSSCALE
                {
                    if (cmd >> 5 == 0)
                    {
                        c.Scale(new Vector3(Model.info.posScale, Model.info.posScale, Model.info.posScale));
                    }
                    else
                    {
                        c.Scale(new Vector3(Model.info.invPosScale, Model.info.invPosScale, Model.info.invPosScale));
                    }
                    break;
                }

                case 12:                        //ENVMAP
                {
                    byte matid = Data[Offset++];
                    byte flag  = Data[Offset++];
                    if (NodeVisible)
                    {
                        float[] proj = new float[16];
                        Gl.glGetFloatv(Gl.GL_MODELVIEW_MATRIX, proj);

                        Gl.glMatrixMode(Gl.GL_TEXTURE);
                        //Gl.glLoadIdentity();
                        MDL0.Model.MaterialSet.Material m = Model.materials.materials[matid];
                        Gl.glScalef(m.origWidth * 0.5f, m.origHeight * -0.5f, 1);
                        Gl.glTranslatef(m.origWidth * 0.5f, m.origHeight * 0.5f, 0);
                        //Gl.glTexCoord2f(m.origWidth * 0.5f, m.origHeight * 0.5f);
                        //Gl.glScalef(m.origWidth, m.origHeight, 1f);

                        if ((m.flag & MDL0.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_EFFECTMTX) != 0)
                        {
                            Gl.glMultMatrixf(m.effectMtx);
                        }

                        Matrix44 mvm = new Matrix44(proj);
                        mvm[3, 0] = mvm[3, 1] = mvm[3, 2] = 0;

                        Matrix44 curmtx = c.GetCurPosMtx();
                        curmtx[3, 0] = curmtx[3, 1] = curmtx[3, 2] = 0;

                        mvm *= curmtx;

                        mvm[12] = 0;
                        mvm[13] = 0;
                        mvm[14] = 0;

                        Gl.glMultMatrixf((float[])mvm);

                        Gl.glMatrixMode(Gl.GL_MODELVIEW);

                        Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
                        Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
                        Gl.glEnable(Gl.GL_TEXTURE_GEN_S);
                        Gl.glEnable(Gl.GL_TEXTURE_GEN_T);
                    }
                    break;
                }

                case 13:                        //PRJMAP
                {
                    byte matid = Data[Offset++];
                    byte flag  = Data[Offset++];
                    break;
                }
                }
            }
        }