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