Пример #1
0
 public void SetMat(VSceneEntity e, VMaterial m)
 {
     foreach (var mm in e.Meshes)
     {
         mm.Mat = m;
     }
     foreach (var n in e.Sub)
     {
         SetMat(n as VSceneEntity, m);
     }
 }
Пример #2
0
        public override void InitState()
        {
            VAssImpImp.IPath = "c:/med/";
            ER = new VEnvRenderer(512, 512);
            PR = new VPostProcessRenderer(512, 512);
            // PR.Add(new VPPBlur());
            sg       = new VSceneGraph();
            PR.Scene = sg;
            ER.Scene = sg;

            e1            = VImport.ImportNode("c:/Media/dwarf2.b3d"); //file of 3d model to load.
            e1.LocalScale = new Vector3(1, 1, 1);

            var m1 = new VMaterial();

            m1.TCol = new VTex2D("c:/Media/tex1_c.png", LoadMethod.Single); // texture to load
            m1.TEnv = VTextureUtil.LoadCubeMap("c:/Media/cm1.png.cube");    // cubemap to load. use cubeconvert to convert.
            //m2.TEnv = ER.FB.Cube;
            var ee = e1 as VSceneEntity;

            //var ee2 = e2 as VSceneEntity; //building project atm.
            SetMat(ee, m1);

            // SetMat(ee2, m2);
            sg.Add(e1);
            // sg.Add(e2);

            c1 = new VCam();
            sg.Add(c1);
            l1 = new VLight();
            l1.Pos(new Vector3(0, 40, 0), Space.Local);
            c1.Pos(new Vector3(0, 0, 300), Space.Local);
            c1.LookAt(Vector3.Zero, new Vector3(0, 1, 0));
            sg.Add(l1);
            //e1.Pos(new Vector3(0, -30, 0), Space.Local);
            // e2.Pos(new Vector3(0, 20, 0), Space.Local);
        }
        private Material GenerateGLTFMaterialFromRenderMaterial(VMaterial renderMaterial, ModelRoot model, string materialName)
        {
            var material = model
                           .CreateMaterial(materialName)
                           .WithDefault();

            renderMaterial.IntParams.TryGetValue("F_TRANSLUCENT", out var isTranslucent);
            material.Alpha = isTranslucent > 0 ? AlphaMode.BLEND : AlphaMode.OPAQUE;

            float metalValue = 0;

            foreach (var floatParam in renderMaterial.FloatParams)
            {
                if (floatParam.Key == "g_flMetalness")
                {
                    metalValue = floatParam.Value;
                }
            }

            // assume non-metallic unless prompted
            material.WithPBRMetallicRoughness(Vector4.One, null, metallicFactor: metalValue);

            foreach (var renderTexture in renderMaterial.TextureParams)
            {
                var texturePath = renderTexture.Value;

                var fileName = Path.GetFileNameWithoutExtension(texturePath);

                ProgressDialog.SetProgress($"Exporting texture: {texturePath}");

                var textureResource = GuiContext.LoadFileByAnyMeansNecessary(texturePath + "_c");

                if (textureResource == null)
                {
                    continue;
                }

                var bitmap = ((ValveResourceFormat.ResourceTypes.Texture)textureResource.DataBlock).GenerateBitmap();

                if (renderTexture.Key == "g_tColor" && material.Alpha == AlphaMode.OPAQUE)
                {
                    // expensive transparency workaround for color maps
                    for (int row = 0; row < bitmap.Width; row++)
                    {
                        for (int col = 0; col < bitmap.Height; col++)
                        {
                            var pixelAt = bitmap.GetPixel(row, col);
                            bitmap.SetPixel(row, col, new SKColor(pixelAt.Red, pixelAt.Green, pixelAt.Blue, 255));
                        }
                    }
                }

                var textureImage = SKImage.FromBitmap(bitmap);
                using var data = textureImage.Encode(SKEncodedImageFormat.Png, 100);

                var image = model.UseImageWithContent(data.ToArray());
                // TODO find a way to change the image's URI to be the image name, right now it turns into (model)_0, (model)_1....
                image.Name = fileName + $"_{model.LogicalImages.Count - 1}";

                var sampler = model.UseTextureSampler(TextureWrapMode.REPEAT, TextureWrapMode.REPEAT, TextureMipMapFilter.NEAREST, TextureInterpolationFilter.DEFAULT);
                sampler.Name = fileName;

                var tex = model.UseTexture(image);
                tex.Name    = fileName + $"_{model.LogicalTextures.Count - 1}";
                tex.Sampler = sampler;

                switch (renderTexture.Key)
                {
                case "g_tColor":

                    material.FindChannel("BaseColor")?.SetTexture(0, tex);

                    var indexTexture = new JsonDictionary()
                    {
                        ["index"] = image.LogicalIndex
                    };
                    var dict = material.TryUseExtrasAsDictionary(true);
                    dict["baseColorTexture"] = indexTexture;

                    break;

                case "g_tNormal":
                    material.FindChannel("Normal")?.SetTexture(0, tex);
                    break;

                case "g_tAmbientOcclusion":
                    material.FindChannel("Occlusion")?.SetTexture(0, tex);
                    break;

                case "g_tEmissive":
                    material.FindChannel("Emissive")?.SetTexture(0, tex);
                    break;

                case "g_tShadowFalloff":
                // example: tongue_gman, materials/default/default_skin_shadowwarp_tga_f2855b6e.vtex
                case "g_tCombinedMasks":
                // example: models/characters/gman/materials/gman_head_mouth_mask_tga_bb35dc38.vtex
                case "g_tDiffuseFalloff":
                // example: materials/default/default_skin_diffusewarp_tga_e58a9ed.vtex
                case "g_tIris":
                // example:
                case "g_tIrisMask":
                // example: models/characters/gman/materials/gman_eye_iris_mask_tga_a5bb4a1e.vtex
                case "g_tTintColor":
                // example: models/characters/lazlo/eyemeniscus_vmat_g_ttintcolor_a00ef19e.vtex
                case "g_tAnisoGloss":
                // example: gordon_beard, models/characters/gordon/materials/gordon_hair_normal_tga_272a44e9.vtex
                case "g_tBentNormal":
                // example: gman_teeth, materials/default/default_skin_shadowwarp_tga_f2855b6e.vtex
                case "g_tFresnelWarp":
                // example: brewmaster_color, materials/default/default_fresnelwarprim_tga_d9279d65.vtex
                case "g_tMasks1":
                // example: brewmaster_color, materials/models/heroes/brewmaster/brewmaster_base_metalnessmask_psd_58eaa40f.vtex
                case "g_tMasks2":
                // example: brewmaster_color,materials/models/heroes/brewmaster/brewmaster_base_specmask_psd_63e9fb90.vtex
                default:
                    Console.WriteLine($"Warning: Unsupported Texture Type {renderTexture.Key}");
                    break;
                }
            }

            return(material);
        }