Beispiel #1
0
        void ReadTextures(Reader reader)
        {
            int texCount = reader.ReadInt32();

            textures = new Texture2D[texCount];
            for (int i = 0; i < texCount; i++)
            {
                string    texture = reader.readString();
                Texture2D tex     = ResourcesManager.LoadAsset <Texture2D>(dir + texture);

                if (texture.Contains("toon"))
                {
                    tex.ChangeType(TextureType.Toon);
                }
                else
                {
                    tex.ChangeType(TextureType.Diffuse);
                    tex.WrapMode = TextureWrapMode.Repeat;
                }

                textures[i] = tex;
            }
        }
Beispiel #2
0
        void ReadMaterial(Reader reader)
        {
            int materiaCount = reader.ReadInt32();
            int offset       = 0;

            mats = new Material[materiaCount];

            for (int i = 0; i < materiaCount; i++)
            {
                ShaderSettings   shdrs = new ShaderSettings();
                RenderDirectives rndr  = new RenderDirectives();

                shdrs.HasSkeleton      = true;
                shdrs.DiscardInvisible = true;
                shdrs.AffectedByLight  = true;
                shdrs.DifuseColor      = true;
                shdrs.Ambient          = true;
                shdrs.SpecularColor    = true;

                shdrs.TextureDiffuse = true;
                string name = reader.readString();
                reader.readString();                 //eng name

                Vector4 difColor = reader.readVector4();
                //if (difColor.W == 0)//diffuse color
                //	rndr.render = false;

                Vector3 specularColour = reader.readVector3();             //specular color
                float   specularPower  = reader.ReadSingle();              //specular
                //fix zero power bug
                if (specularPower == 0)
                {
                    specularPower = 0.000001f;
                }
                Vector3 ambientColour = reader.readVector3(); //ambient color
                //setting values from flags
                var flags = new MaterialFlags(reader.ReadByte());
                shdrs.RecieveShadow   = flags.ReceiveShadow;
                shdrs.AffectedByLight = flags.ReceiveShadow;
                rndr.CastShadow       = flags.CastShadow;
                rndr.HasEdges         = flags.HasEdge;
                rndr.NoCull           = flags.NoCull;

                var outln = new Outline();
                outln.EdgeColour = reader.readVector4();
                outln.EdgeScaler = reader.ReadSingle() * 0.03f;

                int difTexIndex = reader.readVal(header.GetTextureIndexSize);

                //sphericar texture for false light sources effect
                int envTexIndex = reader.readVal(header.GetTextureIndexSize);
                int envBlend    = reader.ReadByte();
                shdrs.EnvType = (EnvironmentMode)envBlend;
                Texture2D envTex = empty;
                if (envTexIndex != 255 && envBlend > 0)
                {
                    if (textures[envTexIndex].Name != "def")
                    {
                        envTex = textures[envTexIndex];
                    }
                    else
                    {
                        shdrs.EnvType = 0;
                    }
                }
                else
                {
                    shdrs.EnvType = 0;
                }



                byte toonType = reader.ReadByte();

                Texture2D toon = empty;
                if (toonType == 0)
                {
                    int text = reader.readVal(header.GetTextureIndexSize);
                    if (text != 255)
                    {
                        shdrs.ToonShadow        = true;
                        textures[text].WrapMode = TextureWrapMode.ClampToEdge;
                        toon = textures[text];
                        //toon.GetTextureType = TextureType.toon;
                    }
                    else
                    {
                        //disable shadowing if no toon texture
                        shdrs.AffectedByLight = false;
                        shdrs.RecieveShadow   = false;
                    }
                }
                else
                {
                    byte toontex = reader.ReadByte();
                    toontex++;
                    string    texturePath = String.Format("Toys.Resourses.textures.PMX.toon{0}.bmp", toontex.ToString().PadLeft(2, '0'));
                    Texture2D toonTex     = ResourcesManager.GetResourse <Texture2D>(texturePath);
                    if (toonTex == null)
                    {
                        var assembly = System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(Texture2D)).Assembly;
                        using (Bitmap pic = new Bitmap(assembly.GetManifestResourceStream(texturePath)))
                        {
                            toonTex = new Texture2D(pic, TextureType.Toon, texturePath);
                        }
                    }

                    toon             = toonTex;
                    shdrs.ToonShadow = true;
                }
                reader.readString();
                int       count = reader.ReadInt32();
                Texture2D tex   = empty;
                if (difTexIndex != 255)
                {
                    tex = textures[difTexIndex];
                }
                var mat = new MaterialPMX(shdrs, rndr);
                mat.Name    = name;
                mat.Outline = outln;
                mat.SetTexture(tex, TextureType.Diffuse);
                mat.SetTexture(toon, TextureType.Toon);
                mat.SetTexture(envTex, TextureType.Sphere);
                mat.SpecularColour = specularColour;
                mat.Specular       = specularPower;
                mat.DiffuseColor   = difColor;
                mat.AmbientColour  = ambientColour;
                mat.UniformManager.Set("specular_color", specularColour);
                mat.UniformManager.Set("ambient_color", ambientColour);
                mat.UniformManager.Set("specular_power", specularPower);
                mat.UniformManager.Set("diffuse_color", difColor);

                if (mat.DiffuseColor.W < 0.001f)
                {
                    mat.RenderDirrectives.IsRendered = false;
                }

                //skip empty materials
                if (count == 0)
                {
                    mat.RenderDirrectives.IsRendered = false;
                }
                mat.Offset = offset;
                mat.Count  = count;
                mats[i]    = mat;
                offset    += count;
            }
        }
Beispiel #3
0
        void ReadPanel(Reader reader)
        {
            var expressionCount = reader.ReadByte();

            for (int i = 0; i < expressionCount; i++)
            {
                reader.ReadUInt16();
            }

            var nodeCount = reader.ReadByte();

            for (int i = 0; i < nodeCount; i++)
            {
                //node names
                reader.readStringLength(50);
            }

            var boneNodesCount = reader.ReadUInt16();

            reader.ReadUInt16();
            for (int i = 0; i < boneNodesCount; i++)
            {
                //bone id
                reader.ReadUInt16();
                //node id
                reader.ReadByte();
            }

            //english names
            bool eng = reader.ReadByte() != 0;

            if (eng)
            {
                header.NameEng    = reader.readStringLength(20);
                header.CommentEng = reader.readStringLength(256);
                //fill english bones names
                for (int i = 0; i < bones.Length; i++)
                {
                    bones[i].NameEng = reader.readStringLength(20);
                }
                //fill english morphs names
                for (int i = 0; i < morphs.Length - 1; i++)
                {
                    morphs[i].NameEng = reader.readStringLength(20);
                }
                //fill english nodes names
                for (int i = 0; i < nodeCount; i++)
                {
                    reader.readStringLength(50);
                }
            }

            //load toon textures
            var toonData = new Texture2D[10];

            for (int i = 0; i < 10; i++)
            {
                var toonName = reader.readStringLength(100);
                //detect internal texture
                if (toonName.StartsWith("toon"))
                {
                    var assembly = System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(Texture2D)).Assembly;
                    using (var pic = new System.Drawing.Bitmap(assembly.GetManifestResourceStream("Toys.Resourses.textures.PMX." + toonName)))
                    {
                        toonData[i] = new Texture2D(pic, TextureType.Toon, toonName);
                    }
                }
                else
                {
                    toonData[i] = ResourcesManager.LoadAsset <Texture2D>(toonName);
                }
            }

            //assign toon textures to materials
            for (int i = 0; i < mats.Length; i++)
            {
                mats[i].SetTexture(toonData[materialToonTable[i]], TextureType.Toon);
            }
        }