示例#1
0
        internal ShaderVariable GetVariable(string name)
        {
            ShaderVariable v = null;

            this._variables.TryGetValue(name, out v);
            return(v);
        }
示例#2
0
        public ShaderVariable GetShaderVar(BinaryReader read)
        {
            object[] objs = GetObjects(read);

            ShaderVariable ret = new ShaderVariable();

            ret.name = name;
            ret.type = VarType.Float;
            if (format.compType == FormatComponentType.UInt)
            {
                ret.type = VarType.UInt;
            }
            if (format.compType == FormatComponentType.SInt)
            {
                ret.type = VarType.Int;
            }
            if (format.compType == FormatComponentType.Double)
            {
                ret.type = VarType.Double;
            }

            ret.columns = Math.Min(format.compCount, 4);
            ret.rows    = Math.Min(matrixdim, 4);

            ret.members = new ShaderVariable[0] {
            };

            ret.value.fv = new float[16];
            ret.value.uv = new uint[16];
            ret.value.iv = new int[16];

            for (uint row = 0; row < ret.rows; row++)
            {
                for (uint col = 0; col < ret.columns; col++)
                {
                    uint dst = row * ret.columns + col;
                    uint src = row * format.compCount + col;

                    object o = objs[src];

                    if (o is float)
                    {
                        ret.value.fv[dst] = (float)o;
                    }
                    else if (o is uint)
                    {
                        ret.value.uv[dst] = (uint)o;
                    }
                    else if (o is int)
                    {
                        ret.value.iv[dst] = (int)o;
                    }
                }
            }

            return(ret);
        }
示例#3
0
        public string StringRep(ShaderVariable var, bool useType)
        {
            if (displayInts.Checked || (useType && var.type == VarType.Int))
            {
                return(var.Row(0, VarType.Int));
            }

            if (useType && var.type == VarType.UInt)
            {
                return(var.Row(0, VarType.UInt));
            }

            return(var.Row(0, VarType.Float).ToString());
        }
示例#4
0
 static IrShaderVariable ParseVariable(ShaderVariable variable)
 {
     return(new IrShaderVariable()
     {
         Member = ParseShaderTypeMember(variable.Member),
         BaseType = variable.BaseType,
         Size = variable.Size,
         Flags = variable.Flags,
         DefaultValue = variable.DefaultValue,
         StartTexture = variable.StartTexture,
         TextureSize = variable.TextureSize,
         StartSampler = variable.StartSampler,
         SamplerSize = variable.SamplerSize
     });
 }
        //internal void OnClear(int tech, int pass)
        //{
        //    if (Clearded != null)
        //        Clearded(tech, pass);
        //    //foreach (var v in variables)
        //    //{
        //    //    v.Variable.Deferred = true;
        //    //}
        //}

        internal void AddVariable(string name, ShaderVariable v)
        {
            VariableBinding binding = new VariableBinding
            {
                Variable = v,
                Setter   = program.CreateUniformSetter(name)
            };

            if (binding.Setter == null)
            {
                throw new NullReferenceException("The IUniformSetter is null");
            }

            _variables.Add(binding);
        }
示例#6
0
        void WriteVariable(ShaderVariable variable, int indentLevel = 1, bool packOffset = true)
        {
            Output.Append($"{GetShaderTypeDeclaration(variable.ShaderType, indentLevel, root:false)} {variable.Name}");
            if (variable.ShaderType.ElementCount > 0)
            {
                Output.AppendFormat("[{0}]", variable.ShaderType.ElementCount);
            }
            if (variable.DefaultValue != null)
            {
                if (variable.DefaultValue.Count > 1)
                {
                    Output.AppendFormat(" = {0}({1})",
                                        GetShaderTypeDeclaration(variable.ShaderType),
                                        string.Join(", ", variable.DefaultValue));
                }
                else
                {
                    Output.AppendFormat(" = {0}", variable.DefaultValue[0]);
                }
            }
            // packoffset needs to be disabled for globals
            if (EmitPackingOffset && packOffset)
            {
                var    componentOffset  = variable.StartOffset % 16 / 4;
                string componentPacking = "";
                switch (componentOffset)
                {
                case 1:
                    componentPacking = ".y";
                    break;

                case 2:
                    componentPacking = ".z";
                    break;

                case 3:
                    componentPacking = ".w";
                    break;
                }
                Output.AppendFormat(" : packoffset(c{0}{1})", variable.StartOffset / 16, componentPacking);
            }
            Output.Append($"; // Offset {variable.StartOffset} Size {variable.Size} CBSize {variable.Member.GetCBVarSize(true)}");
            if (variable.Flags.HasFlag(ShaderVariableFlags.Used))
            {
                Output.Append($" [unused]");
            }
            Output.AppendLine();
        }
        ShaderVariable[] ApplyFormatOverride(byte[] data)
        {
            if (m_FormatOverride == null || m_FormatOverride.Length == 0)
            {
                return(null);
            }

            var stream = new MemoryStream(data);
            var reader = new BinaryReader(stream);

            ShaderVariable[] ret = new ShaderVariable[m_FormatOverride.Length];

            int i = 0;

            try
            {
                for (i = 0; i < m_FormatOverride.Length; i++)
                {
                    stream.Seek(m_FormatOverride[i].offset, SeekOrigin.Begin);
                    ret[i] = m_FormatOverride[i].GetShaderVar(reader);
                }
            }
            catch (System.IO.EndOfStreamException)
            {
                for (; i < m_FormatOverride.Length; i++)
                {
                    ret[i]          = new ShaderVariable();
                    ret[i].name     = "-";
                    ret[i].type     = VarType.Float;
                    ret[i].rows     = ret[i].columns = 1;
                    ret[i].members  = new ShaderVariable[0] {
                    };
                    ret[i].value.fv = new float[16];
                    ret[i].value.uv = new uint[16];
                    ret[i].value.iv = new int[16];
                    ret[i].value.dv = new double[16];
                }
            }

            reader.Dispose();
            stream.Dispose();

            return(ret);
        }
示例#8
0
    public override void OnInspectorGUI()
    {
        ShaderVariable sv = target as ShaderVariable;

        if (GUILayout.Button("Apply color"))
        {
            sv.SetColor();
        }

        EditorGUI.BeginChangeCheck();

        sv.color = EditorGUILayout.ColorField(sv.color);

        if (EditorGUI.EndChangeCheck())
        {
            sv.SetColor();
        }

        base.OnInspectorGUI();
    }
示例#9
0
        private static void CompareConstantBufferVariable(ShaderReflectionVariable expected,
                                                          ShaderVariable actual)
        {
            //Assert.AreEqual(expected.Description.DefaultValue, actual.DefaultValue); // TODO
            Assert.AreEqual((int)expected.Description.Flags, (int)actual.Flags);
            Assert.AreEqual(expected.Description.Name, actual.Name);
            Assert.AreEqual(expected.Description.SamplerSize, actual.SamplerSize);
            Assert.AreEqual(expected.Description.Size, actual.Size);
            Assert.AreEqual((uint)expected.Description.StartOffset, actual.StartOffset);
            if (expected.Description.StartSampler != -1 && actual.StartSampler != 0)
            {
                Assert.AreEqual(expected.Description.StartSampler, actual.StartSampler);
            }
            if (expected.Description.StartTexture != -1 && actual.StartTexture != 0)
            {
                Assert.AreEqual(expected.Description.StartTexture, actual.StartTexture);
            }
            Assert.AreEqual(expected.Description.TextureSize, actual.TextureSize);

            CompareConstantBufferVariableType(expected.GetVariableType(), actual.ShaderType);
        }
示例#10
0
        ShaderVariable[] ApplyFormatOverride(byte[] data)
        {
            if (m_FormatOverride == null || m_FormatOverride.Length == 0)
            {
                return(null);
            }

            var stream = new MemoryStream(data);
            var reader = new BinaryReader(stream);

            ShaderVariable[] ret = new ShaderVariable[m_FormatOverride.Length];

            for (int i = 0; i < m_FormatOverride.Length; i++)
            {
                stream.Seek(m_FormatOverride[i].offset, SeekOrigin.Begin);
                ret[i] = m_FormatOverride[i].GetShaderVar(reader);
            }

            reader.Dispose();
            stream.Dispose();

            return(ret);
        }
示例#11
0
 public Assign(ShaderVariable result, VertexAttribute value) : this(result, () => value.Name)
 {
 }
示例#12
0
 public Assign(ShaderVariable result, ShaderVariable value) : this(result, () => value.Ref.ToString())
 {
 }
示例#13
0
 internal void SetVariable(string name, ShaderVariable v)
 {
     _variables.Add(name, v);
 }
示例#14
0
                private void ReadMaterialData(string relative_path)
                {
                    BinaryReader reader = new BinaryReader(Project.directory_path + "\\" + relative_path);

                    if (!reader.is_ok)
                    {
                        return;
                    }

                    MaterialData material_data = new MaterialData();

                    material_data.Read(reader);

                    AssetDatabase asset_database = (AssetDatabase)App.Current.Resources["asset_database"];

                    AssetCacheData pixel_shader_cache = asset_database.Find(material_data.pixel_shader_id, AssetType.kShader);
                    ShaderData     pixelShader        = ReadShaderData(pixel_shader_cache.path);

                    ub = new UniformBuffer(pixelShader, material_data.uniform_buffers[0].data);

                    inspector_.ClearInspectors();

                    foreach (var pair in ub.name_map_)
                    {
                        ShaderVariable var  = ub.data_map_[pair.Value];
                        InspectorTypes type = InspectorTypes.kNumber;

                        switch (var.type_)
                        {
                        case ShaderVarType.kBool:
                            type = InspectorTypes.kCheckbox;
                            break;

                        case ShaderVarType.kFloat:
                        case ShaderVarType.kDouble:
                            type = InspectorTypes.kSlider;
                            break;

                        case ShaderVarType.kUint:
                        case ShaderVarType.kUint8:
                        case ShaderVarType.kInt:
                            type = InspectorTypes.kNumber;
                            break;

                        case ShaderVarType.kMat3:
                            type = InspectorTypes.kMatrix3x3;
                            break;

                        case ShaderVarType.kMat4:
                            type = InspectorTypes.kMatrix4x4;
                            break;

                        case ShaderVarType.kVec2:
                            type = InspectorTypes.kVector2;
                            break;

                        case ShaderVarType.kVec3:
                            type = InspectorTypes.kVector3;
                            break;

                        case ShaderVarType.kVec4:
                            type = InspectorTypes.kVector4;
                            break;
                        }

                        inspector_.AddInspector(pair.Key, type,
                                                new VarRef(() => ub.data_map_[pair.Value].data_,
                                                           val => {
                            ub.data_map_[pair.Value].Set(val);
                            material_data.uniform_buffers[0].data = ub.ConstructDataBuffer();
                            StoreMaterialData(relative_path, material_data);
                        }));
                    }
                }
示例#15
0
        public override ShaderVariableI Variable(string name)
        {
            // Try to find existing variable
            foreach (var variable in variables)
            {
                if (variable.Name == name) return variable;
            }

            // Otherwise add a variable instance
            #if SILVERLIGHT
            int vsRegisterIndex = -1, psRegisterIndex = -1;
            for (int i = 0; i != vsVariableNames.Count; ++i)
            {
                if (vsVariableNames[i] == name)
                {
                    vsRegisterIndex = vsVariableRegistries[i];
                    break;
                }
            }

            for (int i = 0; i != psVariableNames.Count; ++i)
            {
                if (psVariableNames[i] == name)
                {
                    psRegisterIndex = psVariableRegistries[i];
                    break;
                }
            }

            if (vsRegisterIndex == -1 && psRegisterIndex == -1)
            {
                Debug.ThrowError("Shader", string.Format("Shader variable '{0}' does not exist", name));
            }

            var variableOut = new ShaderVariable(video, vsRegisterIndex, psRegisterIndex, name);
            variables.Add(variableOut);
            return variableOut;
            #else
            var parameter = effect.Parameters[name];
            if (parameter == null)
            {
                Debug.ThrowError("Shader", string.Format("Shader variable '{0}' does not exist", name));
            }

            var variableOut = new ShaderVariable(parameter, name);
            variables.Add(variableOut);
            return variableOut;
            #endif
        }
示例#16
0
 public Assign(ShaderVariable result, VertexAttribute value, string components = null) : this(result, () => value.Name, components)
 {
 }
 public void SetVariable(string name, object value)
 {
     ShaderVariable variable;
     if (!variablemap.TryGetValue(name, out variable))
     {
         variable = new ShaderVariable();
         variable.Variable = Effect.GetVariableByName(name);
         variable.Value = null;
         variablemap.Add(name, variable);
     }
     if (!variable.Variable.IsValid) return;
     if (variable.Value == value) return;
     if (value is float)
         variable.Variable.AsScalar().Set((float)value);
     else if (value is Vector2)
         variable.Variable.AsVector().Set((Vector2)value);
     else if (value is Vector3)
         variable.Variable.AsVector().Set((Vector3)value);
     else if (value is Vector4)
         variable.Variable.AsVector().Set((Vector4)value);
     else if (value is ShaderResourceView)
         variable.Variable.AsResource().SetResource(value as ShaderResourceView);
     else if (value is SamplerState)
         variable.Variable.AsSampler().SetSamplerState(0, value as SamplerState);
     else if (value is Matrix)
         variable.Variable.AsMatrix().SetMatrix((Matrix)value);
 }
示例#18
0
 public Assign(ShaderVariable result, Func <string> expression, string components = null)
 {
     this.result     = result;
     this.expression = expression;
     this.components = components;
 }
示例#19
0
 public Reference(ShaderVariable variable, ShaderType.Field field) : base(variable)
 {
     this.field = field;
 }
示例#20
0
 public ShaderFieldVariable(ShaderContext context, ShaderVariable baseVariable, ShaderType.Field field)
     : base(context, $"{baseVariable.Name}_field_{field.Name}", field.ShaderTypeName, baseVariable.ArrayCount)
 {
     reference = new Reference(baseVariable, field);
 }
示例#21
0
 public TextureSampling(ShaderVariable result, ShaderVariable sampler, ShaderVariable coord) : base(result,
                                                                                                    () => $"texture2D({sampler.Ref}, {coord.Ref})")
 {
 }
示例#22
0
        public void UpdateDebugging()
        {
            if (m_Trace == null || m_Trace.states.Length == 0)
            {
                //curInstruction.Text = "0";

                for (int i = 0; i < m_DisassemblyView.Lines.Count; i++)
                {
                    m_DisassemblyView.Lines[i].DeleteMarkerSet(CurrentLineMarkers);
                    m_DisassemblyView.Lines[i].DeleteMarkerSet(FinishedMarkers);
                }

                return;
            }

            var state = m_Trace.states[CurrentStep];

            //curInstruction.Text = CurrentStep.ToString();

            UInt32 nextInst = state.nextInstruction;
            bool   done     = false;

            if (CurrentStep == m_Trace.states.Length - 1)
            {
                nextInst--;
                done = true;
            }

            // add current instruction marker
            for (int i = 0; i < m_DisassemblyView.Lines.Count; i++)
            {
                m_DisassemblyView.Lines[i].DeleteMarkerSet(CurrentLineMarkers);
                m_DisassemblyView.Lines[i].DeleteMarkerSet(FinishedMarkers);

                if (m_DisassemblyView.Lines[i].Text.Trim().StartsWith(nextInst.ToString() + ":"))
                {
                    m_DisassemblyView.Lines[i].AddMarkerSet(done ? FinishedMarkers : CurrentLineMarkers);
                    m_DisassemblyView.Caret.LineNumber = i;

                    if (!m_DisassemblyView.Lines[i].IsVisible)
                    {
                        m_DisassemblyView.Scrolling.ScrollToCaret();
                    }
                }
            }

            m_DisassemblyView.Invalidate();

            if (constantRegs.Nodes.IsEmpty())
            {
                constantRegs.BeginUpdate();

                for (int i = 0; i < m_Trace.cbuffers.Length; i++)
                {
                    for (int j = 0; j < m_Trace.cbuffers[i].variables.Length; j++)
                    {
                        if (m_Trace.cbuffers[i].variables[j].rows > 0 || m_Trace.cbuffers[i].variables[j].columns > 0)
                        {
                            constantRegs.Nodes.Add(new TreelistView.Node(new object[] {
                                m_Trace.cbuffers[i].variables[j].name,
                                "cbuffer",
                                StringRep(m_Trace.cbuffers[i].variables[j], false)
                            }));
                        }
                    }
                }

                foreach (var input in m_Trace.inputs)
                {
                    constantRegs.Nodes.Add(new TreelistView.Node(new object[] { input.name, input.type.ToString() + " input", StringRep(input, true) }));
                }

                var pipestate = m_Core.CurD3D11PipelineState;

                foreach (var slot in m_ShaderDetails.Resources)
                {
                    if (slot.IsSampler)
                    {
                        continue;
                    }

                    var res = m_Stage.SRVs[slot.bindPoint];

                    if (slot.IsUAV)
                    {
                        if (m_Stage.stage == ShaderStageType.Pixel)
                        {
                            res = pipestate.m_OM.UAVs[slot.bindPoint - pipestate.m_OM.UAVStartSlot];
                        }
                        else
                        {
                            res = m_Stage.UAVs[slot.bindPoint];
                        }
                    }

                    bool found = false;

                    var name = slot.bindPoint + " (" + slot.name + ")";

                    foreach (var tex in m_Core.CurTextures)
                    {
                        if (tex.ID == res.Resource)
                        {
                            constantRegs.Nodes.Add(new TreelistView.Node(new object[] {
                                "t" + name, "Texture",
                                tex.width + "x" + tex.height + "x" + (tex.depth > 1 ? tex.depth : tex.arraysize) +
                                "[" + tex.mips + "] @ " + tex.format + " - " + tex.name
                            }));

                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        foreach (var buf in m_Core.CurBuffers)
                        {
                            if (buf.ID == res.Resource)
                            {
                                string prefix = "u";

                                if (slot.IsSRV)
                                {
                                    prefix = "t";
                                }

                                constantRegs.Nodes.Add(new TreelistView.Node(new object[] {
                                    prefix + name, "Buffer",
                                    buf.length + " - " + buf.name
                                }));

                                found = true;
                                break;
                            }
                        }
                    }

                    if (!found)
                    {
                        string prefix = "u";

                        if (slot.IsSRV)
                        {
                            prefix = "t";
                        }

                        constantRegs.Nodes.Add(new TreelistView.Node(new object[] {
                            prefix + name, "Resource",
                            "unknown"
                        }));
                    }
                }

                constantRegs.EndUpdate();
            }
            else
            {
                constantRegs.BeginUpdate();

                int c = 0;

                for (int i = 0; i < m_Trace.cbuffers.Length; i++)
                {
                    for (int j = 0; j < m_Trace.cbuffers[i].variables.Length; j++)
                    {
                        if (m_Trace.cbuffers[i].variables[j].rows > 0 || m_Trace.cbuffers[i].variables[j].columns > 0)
                        {
                            constantRegs.Nodes[c++].SetData(new object[] {
                                m_Trace.cbuffers[i].variables[j].name,
                                "cbuffer",
                                StringRep(m_Trace.cbuffers[i].variables[j], false)
                            });
                        }
                    }
                }

                constantRegs.EndUpdate();
            }

            if (variableRegs.Nodes.IsEmpty())
            {
                for (int i = 0; i < state.registers.Length; i++)
                {
                    variableRegs.Nodes.Add("a");
                }

                for (int i = 0; i < state.outputs.Length; i++)
                {
                    variableRegs.Nodes.Add("a");
                }
            }

            variableRegs.BeginUpdate();

            int v = 0;

            for (int i = 0; i < state.registers.Length; i++)
            {
                variableRegs.Nodes[v++].SetData(new object[] { state.registers[i].name, "register", StringRep(state.registers[i], false) });
            }

            for (int i = 0; i < state.outputs.Length; i++)
            {
                variableRegs.Nodes[v++].SetData(new object[] { state.outputs[i].name, "register", StringRep(state.outputs[i], false) });
            }

            variableRegs.EndUpdate();

            watchRegs.BeginUpdate();

            for (int i = 0; i < watchRegs.Items.Count - 1; i++)
            {
                ListViewItem item = watchRegs.Items[i];
                item.SubItems[1].Text = "register";

                string reg = item.SubItems[0].Text.Trim();

                var regexp = "^([rvo])([0-9]+)(\\.[xyzwrgba]+)?(,[xfiud])?$";

                var match = Regex.Match(reg, regexp);

                if (match.Success)
                {
                    var regtype = match.Groups[1].Value;
                    var regidx  = match.Groups[2].Value;
                    var swizzle = match.Groups[3].Value.Replace(".", "");
                    var regcast = match.Groups[4].Value.Replace(",", "");

                    if (regcast == "")
                    {
                        if (displayInts.Checked)
                        {
                            regcast = "i";
                        }
                        else
                        {
                            regcast = "f";
                        }
                    }

                    ShaderVariable[] vars = null;

                    if (regtype == "r")
                    {
                        vars = state.registers;
                    }
                    else if (regtype == "v")
                    {
                        vars = m_Trace.inputs;
                    }
                    else if (regtype == "o")
                    {
                        vars = state.outputs;
                    }

                    int regindex = -1;

                    if (int.TryParse(regidx, out regindex))
                    {
                        if (regindex >= 0 && regindex < vars.Length)
                        {
                            ShaderVariable vr = vars[regindex];

                            if (swizzle == "")
                            {
                                swizzle = "xyzw".Substring(0, (int)vr.columns);

                                if (regcast == "d")
                                {
                                    swizzle = "xy";
                                }
                            }

                            string val = "";

                            for (int s = 0; s < swizzle.Length; s++)
                            {
                                char swiz = swizzle[s];

                                int elindex = 0;
                                if (swiz == 'x' || swiz == 'r')
                                {
                                    elindex = 0;
                                }
                                if (swiz == 'y' || swiz == 'g')
                                {
                                    elindex = 1;
                                }
                                if (swiz == 'z' || swiz == 'b')
                                {
                                    elindex = 2;
                                }
                                if (swiz == 'w' || swiz == 'a')
                                {
                                    elindex = 3;
                                }

                                if (regcast == "i")
                                {
                                    val += vr.value.iv[elindex];
                                }
                                else if (regcast == "f")
                                {
                                    val += Formatter.Format(vr.value.fv[elindex]);
                                }
                                else if (regcast == "u")
                                {
                                    val += vr.value.uv[elindex];
                                }
                                else if (regcast == "x")
                                {
                                    val += String.Format("0x{0:X8}", vr.value.uv[elindex]);
                                }
                                else if (regcast == "d")
                                {
                                    if (elindex < 2)
                                    {
                                        val += vr.value.dv[elindex];
                                    }
                                    else
                                    {
                                        val += "-";
                                    }
                                }

                                if (s < swizzle.Length - 1)
                                {
                                    val += ", ";
                                }
                            }

                            item.SubItems[2].Text = val;

                            continue;
                        }
                    }
                }

                item.SubItems[2].Text = "Error evaluating expression";
            }

            watchRegs.EndUpdate();
        }
示例#23
0
 public Assign(ShaderVariable result, Func <string> expression)
 {
     this.result     = result;
     this.expression = expression;
 }
示例#24
0
 public Assign(ShaderVariable result, ShaderVariable value, string components = null) : this(result, () => value.Ref.ToString(), components)
 {
 }
示例#25
0
 Expression CallUniform(Source src, Expression obj, ShaderVariable var, int index)
 {
     return(ILFactory.CallMethod(src, obj, "Uniform", new Constant(src, Essentials.Int, index), var.Value));
 }
示例#26
0
        private object GenType(Type baseType)
        {
            TypeBuilder tb;

            if (baseType != null)
            {
                tb = baseType.IsInterface ?
                     Mb.DefineType(_namespace + "." + "_$" + baseType.Name + Id, TypeAttributes.Class | TypeAttributes.Public, typeof(object), new Type[] { baseType }) :
                     Mb.DefineType(_namespace + "." + "_$" + baseType.Name + Id, TypeAttributes.Class | TypeAttributes.Public, baseType);
            }
            else
            {
                tb = Mb.DefineType(_namespace + "." + "$dI" + Id, TypeAttributes.Class | TypeAttributes.Public);
            }

            Id++;

            var commit = typeof(ShaderVariable).GetMethod("Commit");
            List <KeyValuePair <FieldBuilder, ShaderVariable> > createFields = new List <KeyValuePair <FieldBuilder, ShaderVariable> >();

            foreach (var v in _varlookup)
            {
                if (v.Value.NetType != null)
                {
                    ShaderVariable effectVar = v.Value.Variable;
                    var            tField    = tb.DefineField(v.Key + "bakingField", effectVar.GetType(), FieldAttributes.Static | FieldAttributes.Public | FieldAttributes.SpecialName);

                    createFields.Add(new KeyValuePair <FieldBuilder, ShaderVariable>(tField, effectVar));

                    PropertyBuilder prop = null;
                    PropertyInfo    pi   = null;
                    if (baseType == null)
                    {
                        prop = tb.DefineProperty(v.Key, PropertyAttributes.None, v.Value.NetType, null);
                        pi   = prop;
                    }
                    else
                    {
                        pi = v.Value.NetProp;
                    }

                    //define getter
                    DefineGetter(tb, tField, prop, baseType, pi);

                    //define setter
                    DefineSetter(tb, commit, tField, prop, baseType, pi);
                }
                else if (baseType != null)
                {
                    var prop   = v.Value.NetProp ?? baseType.GetProperty(v.Key);
                    var tField = tb.DefineField(v.Key + "bakingField", prop.PropertyType, FieldAttributes.Static | FieldAttributes.Public | FieldAttributes.SpecialName);

                    #region Getter

                    MethodBuilder getter;
                    var           attr = MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.ReuseSlot;

                    getter = tb.DefineMethod(prop.GetMethod.Name, attr, prop.PropertyType, Type.EmptyTypes);

                    // define getter
                    // return field.Value;
                    var il = getter.GetILGenerator();
                    il.Emit(OpCodes.Ldsfld, tField);
                    il.Emit(OpCodes.Ret);

                    if (!baseType.IsInterface)
                    {
                        tb.DefineMethodOverride(getter, baseType.GetMethod(getter.Name));
                    }

                    #endregion

                    #region Setter

                    MethodBuilder setter = tb.DefineMethod(prop.SetMethod.Name, attr, typeof(void), new Type[] { prop.PropertyType });

                    // field = value
                    il = setter.GetILGenerator();
                    il.Emit(OpCodes.Ldarg_1);
                    il.Emit(OpCodes.Stsfld, tField);
                    il.Emit(OpCodes.Ret);

                    if (!baseType.IsInterface)
                    {
                        tb.DefineMethodOverride(setter, baseType.GetMethod(setter.Name));
                    }

                    #endregion
                }
            }

            Type type = tb.CreateType();
            var  inst = Activator.CreateInstance(type);
            foreach (var f in createFields)
            {
                type.GetField(f.Key.Name).SetValue(null, f.Value);
                //f.Key.SetValue(inst, f.Value);
            }

            return(inst);
        }