public override object GetValue(object arg)
                {
                    var    elem   = arg as Element;
                    var    mtlins = elem.VarObject.SceneMesh.MtlMeshArray[elem.VarObject.MtlIndex].MtlInst;
                    object obj;

                    if (elem.VarObject.Host.VarRNameValues.TryGetValue(elem.VarObject.Index, out obj))
                    {
                        return(obj);
                    }

                    if (elem.Type == typeof(float))
                    {
                        float value = 0.0f;

                        mtlins.GetVarValue((uint)elem.VarObject.Index, 0, ref value);
                        return(value);
                    }
                    else if (elem.Type == typeof(Vector2))
                    {
                        var value = new Vector2();
                        mtlins.GetVarValue((uint)elem.VarObject.Index, 0, ref value);
                        return(value);
                    }
                    else if (elem.Type == typeof(Vector3))
                    {
                        var value = new Vector3();
                        mtlins.GetVarValue((uint)elem.VarObject.Index, 0, ref value);
                        return(value);
                    }
                    else if (elem.Type == typeof(Vector4))
                    {
                        var value = new Vector4();
                        mtlins.GetVarValue((uint)elem.VarObject.Index, 0, ref value);
                        return(value);
                    }
                    else if (elem.Type == typeof(EngineNS.Color))
                    {
                        var value = new Vector4();
                        mtlins.GetVarValue((uint)elem.VarObject.Index, 0, ref value);
                        var retVal = new EngineNS.Color();
                        retVal.R = (byte)(value.X * 255);
                        retVal.G = (byte)(value.Y * 255);
                        retVal.B = (byte)(value.Z * 255);
                        retVal.A = (byte)(value.W * 255);
                        return(retVal);
                    }
                    return(null);
                }
                    public override object GetValue(object arg)
                    {
                        var elem = arg as Element;

                        if (elem.Type == typeof(float))
                        {
                            float value = 0.0f;
                            elem.VarObject.mMaterialInstance.GetVarValue(elem.VarObject.Index, 0, ref value);
                            return(value);
                        }
                        else if (elem.Type == typeof(Vector2))
                        {
                            var value = new Vector2();
                            elem.VarObject.mMaterialInstance.GetVarValue(elem.VarObject.Index, 0, ref value);
                            return(value);
                        }
                        else if (elem.Type == typeof(Vector3))
                        {
                            var value = new Vector3();
                            elem.VarObject.mMaterialInstance.GetVarValue(elem.VarObject.Index, 0, ref value);
                            return(value);
                        }
                        else if (elem.Type == typeof(Vector4))
                        {
                            var value = new Vector4();
                            elem.VarObject.mMaterialInstance.GetVarValue(elem.VarObject.Index, 0, ref value);
                            return(value);
                        }
                        else if (elem.Type == typeof(EngineNS.Color))
                        {
                            var value = new Vector4();
                            elem.VarObject.mMaterialInstance.GetVarValue(elem.VarObject.Index, 0, ref value);
                            var retVal = new EngineNS.Color();
                            retVal.R = (byte)(value.X * 255);
                            retVal.G = (byte)(value.Y * 255);
                            retVal.B = (byte)(value.Z * 255);
                            retVal.A = (byte)(value.W * 255);
                            return(retVal);
                        }
                        return(null);
                    }
        public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, LinkPinControl element, GenerateCodeContext_Method context)
        {
            var SetMaterialInstanceValue = new CodeGenerateSystem.CodeDom.CodeMemberMethod();

            SetMaterialInstanceValue.Name       = "SetMaterialInstanceValue";
            SetMaterialInstanceValue.ReturnType = new CodeTypeReference(typeof(void));
            SetMaterialInstanceValue.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            codeClass.Members.Add(SetMaterialInstanceValue);

            var param = new CodeParameterDeclarationExpression(typeof(EngineNS.Graphics.Mesh.CGfxMesh), "mesh");

            SetMaterialInstanceValue.Parameters.Add(param);

            SetMaterialInstanceValue.Statements.Add(new CodeVariableDeclarationStatement(typeof(int), "keyindex"));
            SetMaterialInstanceValue.Statements.Add(new CodeVariableDeclarationStatement(typeof(string), "varname"));
            var varmesh = new CodeVariableReferenceExpression("mesh");

            for (int i = 0; i < ShowValues.Count; i++)
            {
                var showvalue = ShowValues[i];

                foreach (var varvalue in showvalue.VarRNameValues)
                {
                    var varmeshMtlInst = new CodeVariableReferenceExpression("mesh.MtlMeshArray[" + i + "].MtlInst");
                    SetMaterialInstanceValue.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("varname"), new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmeshMtlInst, "GetVarName", new CodeExpression[] { new CodePrimitiveExpression(varvalue.Key), new CodePrimitiveExpression(true) })));

                    SetMaterialInstanceValue.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("keyindex"), new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McFindVar", new CodeExpression[] { new CodePrimitiveExpression(i), new CodeVariableReferenceExpression("varname") })));
                    if (varvalue.Value.GetType().Equals(typeof(float)))
                    {
                        SetMaterialInstanceValue.Statements.Add(new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McSetVarFloat", new CodeExpression[] { new CodePrimitiveExpression(i), new CodeVariableReferenceExpression("keyindex"), new CodePrimitiveExpression((float)varvalue.Value), new CodePrimitiveExpression(0) }));
                    }
                    else if (varvalue.Value.GetType().Equals(typeof(Vector2)))
                    {
                        Vector2 value = (Vector2)varvalue.Value;
                        SetMaterialInstanceValue.Statements.Add(new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McSetVarVector2", new CodeExpression[] { new CodePrimitiveExpression(i), new CodeVariableReferenceExpression("keyindex"), new CodeObjectCreateExpression(typeof(Vector2), new CodeExpression[] { new CodePrimitiveExpression(value.X), new CodePrimitiveExpression(value.Y) }), new CodePrimitiveExpression(0) }));
                    }
                    else if (varvalue.Value.GetType().Equals(typeof(Vector3)))
                    {
                        Vector3 value = (Vector3)varvalue.Value;
                        SetMaterialInstanceValue.Statements.Add(new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McSetVarVector3", new CodeExpression[] { new CodePrimitiveExpression(i), new CodeVariableReferenceExpression("keyindex"), new CodeObjectCreateExpression(typeof(Vector3), new CodeExpression[] { new CodePrimitiveExpression(value.X), new CodePrimitiveExpression(value.Y), new CodePrimitiveExpression(value.Z) }), new CodePrimitiveExpression(0) }));
                    }
                    else if (varvalue.Value.GetType().Equals(typeof(Vector4)))
                    {
                        Vector4 value = (Vector4)varvalue.Value;
                        SetMaterialInstanceValue.Statements.Add(new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McSetVarColor4", new CodeExpression[] { new CodePrimitiveExpression(i), new CodeVariableReferenceExpression("keyindex"), new CodeObjectCreateExpression(typeof(Vector4), new CodeExpression[] { new CodePrimitiveExpression(value.X), new CodePrimitiveExpression(value.Y), new CodePrimitiveExpression(value.Z), new CodePrimitiveExpression(value.W) }), new CodePrimitiveExpression(0) }));
                    }
                    else if (varvalue.Value.GetType().Equals(typeof(EngineNS.Color)))
                    {
                        EngineNS.Color value = (EngineNS.Color)varvalue.Value;
                        SetMaterialInstanceValue.Statements.Add(new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McSetVarColor4", new CodeExpression[] { new CodePrimitiveExpression(i), new CodeVariableReferenceExpression("keyindex"), new CodeObjectCreateExpression(typeof(Vector4), new CodeExpression[] { new CodePrimitiveExpression(value.R), new CodePrimitiveExpression(value.G), new CodePrimitiveExpression(value.B), new CodePrimitiveExpression(value.A) }), new CodePrimitiveExpression(0) }));
                    }
                }

                foreach (var srvvalue in showvalue.SRVRNameValues)
                {
                    //var texture = CEngine.Instance.TextureManager.GetShaderRView(CEngine.Instance.RenderContext, value);
                    ////elem.VarObject.SceneMesh.MtlMeshArray[elem.VarObject.MtlIndex].MtlInst.GetSRVName((uint)elem.VarObject.Index, true);
                    //elem.VarObject.SceneMesh.McSetTexture(elem.VarObject.MtlIndex, key, value);

                    //elem.VarObject.Host.AddSRVValue(elem.VarObject.Index, value);
                    SetMaterialInstanceValue.Statements.Add(new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(varmesh, "McSetTexture", new CodeExpression[] { new CodePrimitiveExpression(i), new CodePrimitiveExpression(srvvalue.Key), new CodeSnippetExpression("EngineNS.CEngine.Instance.FileManager.GetRName(\"" + srvvalue.Value + "\")") }));
                }
            }
        }