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; } }
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; } }
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); } }