Exemple #1
0
        /// <inheritdoc />
        public virtual void ApplyMaterialPatch(Material material, MWMaterial patch)
        {
            if (patch.Color != null)
            {
                _materialColor.FromUnityColor(material.color);
                _materialColor.ApplyPatch(patch.Color);
                material.color = _materialColor.ToColor();
            }

            if (patch.MainTextureOffset != null)
            {
                _textureOffset.FromUnityVector2(material.mainTextureOffset);
                _textureOffset.ApplyPatch(patch.MainTextureOffset);
                material.mainTextureOffset = _textureOffset.ToVector2();
            }

            if (patch.MainTextureScale != null)
            {
                _textureScale.FromUnityVector2(material.mainTextureScale);
                _textureScale.ApplyPatch(patch.MainTextureScale);
                material.mainTextureScale = _textureScale.ToVector2();
            }

            if (patch.MainTextureId != null)
            {
                var textureId = patch.MainTextureId.Value;
                textureAssignments[material.GetInstanceID()] = textureId;
                if (patch.MainTextureId == Guid.Empty)
                {
                    material.mainTexture = null;
                }
                else
                {
                    MREAPI.AppsAPI.AssetCache.OnCached(textureId, tex =>
                    {
                        if (!material || textureAssignments[material.GetInstanceID()] != textureId)
                        {
                            return;
                        }
                        material.mainTexture = (Texture)tex;
                    });
                }
            }
        }
        /// <inheritdoc />
        public virtual void ApplyMaterialPatch(IMixedRealityExtensionApp app, Material material, MWMaterial patch)
        {
            if (patch.Color != null)
            {
                _materialColor.FromUnityColor(material.color);
                _materialColor.ApplyPatch(patch.Color);
                material.color = _materialColor.ToColor();
            }

            if (patch.MainTextureOffset != null)
            {
                _textureOffset.FromUnityVector2(material.mainTextureOffset);
                _textureOffset.ApplyPatch(patch.MainTextureOffset);
                material.mainTextureOffset = _textureOffset.ToVector2();
            }

            if (patch.MainTextureScale != null)
            {
                _textureScale.FromUnityVector2(material.mainTextureScale);
                _textureScale.ApplyPatch(patch.MainTextureScale);
                material.mainTextureScale = _textureScale.ToVector2();
            }

            if (patch.MainTextureId != null)
            {
                var textureId = patch.MainTextureId.Value;
                mainTextureAssignments[material.GetInstanceID()] = textureId;
                if (patch.MainTextureId == Guid.Empty)
                {
                    material.mainTexture = null;
                }
                else
                {
                    app.AssetManager.OnSet(textureId, tex =>
                    {
                        if (!material || mainTextureAssignments[material.GetInstanceID()] != textureId)
                        {
                            return;
                        }
                        material.mainTexture = (Texture)tex.Asset;
                    });
                }
            }
        }
Exemple #3
0
        /// <inheritdoc />
        public virtual void ApplyMaterialPatch(IMixedRealityExtensionApp app, Material material, MWMaterial patch)
        {
            if (patch.Color != null)
            {
                _materialColor.FromGodotColor(material.AlbedoColor);
                _materialColor.ApplyPatch(patch.Color);
                material.AlbedoColor = _materialColor.ToColor();
            }

            if (patch.MainTextureOffset != null)
            {
                _textureOffset.FromGodotVector3(material.Uv1Offset);
                _textureOffset.ApplyPatch(patch.MainTextureOffset);
                _textureOffset.Y  *= -1;
                material.Uv1Offset = _textureOffset.ToVector3();
            }

            if (patch.MainTextureScale != null)
            {
                _textureScale.FromGodotVector3(material.Uv1Scale);
                _textureScale.ApplyPatch(patch.MainTextureScale);
                material.Uv1Scale = _textureScale.ToVector3();
            }

            if (patch.MainTextureId != null)
            {
                var textureId = patch.MainTextureId.Value;
                mainTextureAssignments[material.GetInstanceId()] = textureId;
                if (patch.MainTextureId == Guid.Empty)
                {
                    material.AlbedoTexture = null;
                }
                else
                {
                    app.AssetManager.OnSet(textureId, tex =>
                    {
                        if (material == null || mainTextureAssignments[material.GetInstanceId()] != textureId)
                        {
                            return;
                        }
                        material.AlbedoTexture = (Texture)tex.Asset;
                    });
                }
            }

            if (patch.EmissiveColor != null)
            {
                material.EmissionEnabled = true;
                var color = material.Emission;
                color.r           = patch.EmissiveColor.R ?? color.r;
                color.g           = patch.EmissiveColor.G ?? color.g;
                color.b           = patch.EmissiveColor.B ?? color.b;
                color.a           = patch.EmissiveColor.A ?? color.a;
                material.Emission = color;
            }

            if (patch.EmissiveTextureOffset != null)
            {
                material.EmissionEnabled = true;
                var offset = material.Uv2Offset;
                offset.x           = patch.EmissiveTextureOffset.X ?? offset.x;
                offset.y           = patch.EmissiveTextureOffset.Y ?? offset.y;
                material.Uv2Offset = offset;
            }

            if (patch.EmissiveTextureScale != null)
            {
                material.EmissionEnabled = true;
                var scale = material.Uv2Scale;
                scale.x           = patch.EmissiveTextureScale.X ?? scale.x;
                scale.y           = patch.EmissiveTextureScale.Y ?? scale.y;
                material.Uv2Scale = scale;
            }

            if (patch.EmissiveTextureId != null)
            {
                material.EmissionEnabled = true;
                var textureId = patch.EmissiveTextureId.Value;
                emissiveTextureAssignments[material.GetInstanceId()] = textureId;
                if (textureId == Guid.Empty)
                {
                    material.EmissionTexture = null;
                }
                else
                {
                    app.AssetManager.OnSet(textureId, tex =>
                    {
                        if (material == null || emissiveTextureAssignments[material.GetInstanceId()] != textureId)
                        {
                            return;
                        }
                        material.EmissionTexture = (Texture)tex.Asset;
                    });
                }
            }

            if (patch.AlphaCutoff != null)
            {
                material.ParamsUseAlphaScissor       = true;
                material.ParamsAlphaScissorThreshold = patch.AlphaCutoff.Value;
            }

            switch (patch.AlphaMode)
            {
            case MWAssets.AlphaMode.Opaque:
                material.FlagsTransparent = false;
                break;

            case MWAssets.AlphaMode.Mask:
                material.ParamsUseAlphaScissor       = true;
                material.ParamsAlphaScissorThreshold = 1.0f;
                break;

            case MWAssets.AlphaMode.Blend:
                material.FlagsTransparent      = true;
                material.ParamsUseAlphaScissor = false;
                break;
                // ignore default case, i.e. null
            }
        }