示例#1
0
        public async Task LoadSocPack(string socPath, string modelPath)
        {
            // given
            using (var assetPack = new SocPakFile(socPath))
            {
                // when
                var exist0 = assetPack.ContainsFile(modelPath);
                var data0  = await assetPack.LoadFileDataAsync(modelPath);

                var file0 = new CryFile(Path.Combine(socPath.Replace(".socpak", ""), modelPath));
                file0.LoadFromFile();
                // then
                Assert.True(exist0);
                Assert.NotNull(data0);
            }
        }
        public void WriteMaterial(CryFile cryEngine)
        {
            if (cryEngine.Materials == null)
            {
                Log("No materials loaded");
                return;
            }

            if (!OutputFile_Material.Directory.Exists)
            {
                OutputFile_Material.Directory.Create();
            }

            using (var file = new StreamWriter(OutputFile_Material.FullName))
            {
                file.WriteLine("# gamer .mtl export version {0}", Assembly.GetExecutingAssembly().GetName().Version.ToString());
                file.WriteLine("#");
                foreach (var material in cryEngine.Materials)
                {
#if DUMP_JSON
                    File.WriteAllText(string.Format("_material-{0}.json", material.Name.Replace(@"/", "").Replace(@"\", "")), material.ToJSON());
#endif
                    file.WriteLine("newmtl {0}", material.Name);
                    if (material.Diffuse != null)
                    {
                        file.WriteLine("Ka {0:F6} {1:F6} {2:F6}", material.Diffuse.Red, material.Diffuse.Green, material.Diffuse.Blue);    // Ambient
                        file.WriteLine("Kd {0:F6} {1:F6} {2:F6}", material.Diffuse.Red, material.Diffuse.Green, material.Diffuse.Blue);    // Diffuse
                    }
                    else
                    {
                        Log($"Skipping Diffuse for {material.Name}");
                    }
                    if (material.Specular != null)
                    {
                        file.WriteLine("Ks {0:F6} {1:F6} {2:F6}", material.Specular.Red, material.Specular.Green, material.Specular.Blue); // Specular
                        file.WriteLine("Ns {0:F6}", material.Shininess / 255D);                                                            // Specular Exponent
                    }
                    else
                    {
                        Log($"Skipping Specular for {material.Name}");
                    }
                    file.WriteLine("d {0:F6}", material.Opacity); // Dissolve

                    file.WriteLine("illum 2");                    // Highlight on. This is a guess.

                    // Phong materials

                    // 0. Color on and Ambient off
                    // 1. Color on and Ambient on
                    // 2. Highlight on
                    // 3. Reflection on and Ray trace on
                    // 4. Transparency: Glass on, Reflection: Ray trace on
                    // 5. Reflection: Fresnel on and Ray trace on
                    // 6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
                    // 7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on
                    // 8. Reflection on and Ray trace off
                    // 9. Transparency: Glass on, Reflection: Ray trace off
                    // 10. Casts shadows onto invisible surfaces
                    foreach (var texture in material.Textures)
                    {
                        var textureFile = texture.File;

                        if (DataDir != null)
                        {
                            textureFile = Path.Combine(DataDir.FullName, textureFile);
                        }

                        // TODO: More filehandling here
                        textureFile = !TiffTextures?textureFile.Replace(".tif", ".dds") : textureFile.Replace(".dds", ".tif");

                        textureFile = textureFile.Replace(@"/", @"\");
                        switch (texture.Map)
                        {
                        case Material.Texture.MapTypeEnum.Diffuse:
                            file.WriteLine("map_Kd {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.Specular:
                            file.WriteLine("map_Ks {0}", textureFile);
                            file.WriteLine("map_Ns {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.Bumpmap:
                        case Material.Texture.MapTypeEnum.Detail:
                            // <Texture Map="Detail" File="textures/unified_detail/metal/metal_scratches_a_detail.tif" />
                            file.WriteLine("map_bump {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.Heightmap:
                            // <Texture Map="Heightmap" File="objects/spaceships/ships/aegs/gladius/textures/aegs_switches_buttons_disp.tif"/>
                            file.WriteLine("disp {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.Decal:
                            // <Texture Map="Decal" File="objects/spaceships/ships/aegs/textures/interior/metal/aegs_int_metal_alum_bare_diff.tif"/>
                            file.WriteLine("decal {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.SubSurface:
                            // <Texture Map="SubSurface" File="objects/spaceships/ships/aegs/textures/interior/atlas/aegs_int_atlas_retaliator_spec.tif"/>
                            file.WriteLine("map_Ns {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.Custom:
                            // <Texture Map="Custom" File="objects/spaceships/ships/aegs/textures/interior/metal/aegs_int_metal_painted_red_ddna.tif"/>
                            // file.WriteLine("decal {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.BlendDetail:
                            // <Texture Map="BlendDetail" File="textures/unified_detail/metal/metal_scratches-01_detail.tif">
                            break;

                        case Material.Texture.MapTypeEnum.Opacity:
                            // <Texture Map="Opacity" File="objects/spaceships/ships/aegs/textures/interior/blend/interior_blnd_a_diff.tif"/>
                            file.WriteLine("map_d {0}", textureFile);
                            break;

                        case Material.Texture.MapTypeEnum.Environment:
                            // <Texture Map="Environment" File="nearest_cubemap" TexType="7"/>
                            break;

                        default: break;
                        }
                    }
                    file.WriteLine();
                }
            }
        }
 public WavefrontObjectWriter(CryFile cryFile) : base(cryFile)
 {
 }