void HandleBaseColor(Rhino.DocObjects.Material rhinoMaterial, glTFLoader.Schema.Material gltfMaterial) { Rhino.DocObjects.Texture baseColorDoc = rhinoMaterial.GetTexture(TextureType.PBR_BaseColor); Rhino.DocObjects.Texture alphaTextureDoc = rhinoMaterial.GetTexture(TextureType.PBR_Alpha); RenderTexture baseColorTexture = rhinoMaterial.RenderMaterial.GetTextureFromUsage(RenderMaterial.StandardChildSlots.PbrBaseColor); RenderTexture alphaTexture = rhinoMaterial.RenderMaterial.GetTextureFromUsage(RenderMaterial.StandardChildSlots.PbrAlpha); bool baseColorLinear = baseColorTexture == null ? false : IsLinear(baseColorTexture); bool hasBaseColorTexture = baseColorDoc == null ? false : baseColorDoc.Enabled; bool hasAlphaTexture = alphaTextureDoc == null ? false : alphaTextureDoc.Enabled; bool baseColorDiffuseAlphaForTransparency = rhinoMaterial.PhysicallyBased.UseBaseColorTextureAlphaForObjectAlphaTransparencyTexture; Color4f baseColor = rhinoMaterial.PhysicallyBased.BaseColor; if (workflow.PreProcessColors) { baseColor = Color4f.ApplyGamma(baseColor, workflow.PreProcessGamma); } if (!hasBaseColorTexture && !hasAlphaTexture) { gltfMaterial.PbrMetallicRoughness.BaseColorFactor = new float[] { baseColor.R, baseColor.G, baseColor.B, (float)rhinoMaterial.PhysicallyBased.Alpha, }; if (rhinoMaterial.PhysicallyBased.Alpha == 1.0) { gltfMaterial.AlphaMode = glTFLoader.Schema.Material.AlphaModeEnum.OPAQUE; } else { gltfMaterial.AlphaMode = glTFLoader.Schema.Material.AlphaModeEnum.BLEND; } } else { gltfMaterial.PbrMetallicRoughness.BaseColorTexture = CombineBaseColorAndAlphaTexture(baseColorTexture, alphaTexture, baseColorDiffuseAlphaForTransparency, baseColor, baseColorLinear, (float)rhinoMaterial.PhysicallyBased.Alpha, out bool hasAlpha); if (hasAlpha) { gltfMaterial.AlphaMode = glTFLoader.Schema.Material.AlphaModeEnum.BLEND; } else { gltfMaterial.AlphaMode = glTFLoader.Schema.Material.AlphaModeEnum.OPAQUE; } } }
public static Color4f ConvertSRGBToLinear(Color4f color) { return(Color4f.ApplyGamma(color, 2.4f)); }
TextureInfo CombineBaseColorAndAlphaTexture(Rhino.Render.RenderTexture baseColorTexture, Rhino.Render.RenderTexture alphaTexture, bool baseColorDiffuseAlphaForTransparency, Color4f baseColor, bool baseColorLinear) { bool hasBaseColorTexture = baseColorTexture != null; int baseColorWidth, baseColorHeight, baseColorDepth; baseColorWidth = baseColorHeight = baseColorDepth = 0; if (hasBaseColorTexture) { baseColorTexture.PixelSize(out baseColorWidth, out baseColorHeight, out baseColorDepth); } alphaTexture.PixelSize(out int alphaWidth, out int alphaHeight, out int alphaDepth); int width = Math.Max(baseColorWidth, alphaWidth); int height = Math.Max(baseColorHeight, alphaHeight); if (width <= 0) { width = 1024; } if (height <= 0) { height = 1024; } TextureEvaluator baseColorTextureEvaluator = baseColorTexture.CreateEvaluator(RenderTexture.TextureEvaluatorFlags.Normal); TextureEvaluator alphaTextureEvaluator = alphaTexture.CreateEvaluator(RenderTexture.TextureEvaluatorFlags.Normal); Bitmap bitmap = new Bitmap(width, height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { double x = (double)i / ((double)(width - 1)); double y = (double)j / ((double)(height - 1)); y = 1.0 - y; Point3d uvw = new Point3d(x, y, 0.0); Color4f baseColorOut = baseColor; if (hasBaseColorTexture) { baseColorOut = baseColorTextureEvaluator.GetColor(uvw, Vector3d.Zero, Vector3d.Zero); if (baseColorLinear) { baseColorOut = Color4f.ApplyGamma(baseColorOut, workflow.PreProcessGamma); } } if (!baseColorDiffuseAlphaForTransparency) { baseColorOut = new Color4f(baseColorOut.R, baseColorOut.G, baseColorOut.B, 1.0f); } Color4f alphaColor = alphaTextureEvaluator.GetColor(uvw, Vector3d.Zero, Vector3d.Zero); float alpha = baseColor.A * alphaColor.L; Color4f colorFinal = new Color4f(baseColorOut.R, baseColorOut.G, baseColorOut.B, alpha); bitmap.SetPixel(i, j, colorFinal.AsSystemColor()); } } bitmap.Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "out.png")); return(GetTextureInfoFromBitmap(bitmap)); }