예제 #1
0
        public void ChangePins()
        {
            TypesAndFields.Clear();

            string def = "";

            if (FDefinition[0] != null)
            {
                def = FDefinition[0];
            }
            string[] tempfields = def.Trim().Split(',');

            int           order      = 100;
            List <string> fieldnames = new List <string>();

            foreach (string field in tempfields)
            {
                string[] typefieldpair = field.Trim().Split(' ');
                if (typefieldpair.Length == 2)
                {
                    typefieldpair[0] = typefieldpair[0].Trim();
                    typefieldpair[0] = typefieldpair[0].ToLower();
                    typefieldpair[1] = typefieldpair[1].Trim();

                    if (IdentityType.Instance.ContainsKey(typefieldpair[0]) && (!fieldnames.Contains(typefieldpair[1].ToLower())))
                    {
                        fieldnames.Add(typefieldpair[1].ToLower());
                        TypesAndFields.Add(typefieldpair);

                        if (!Spreads.ContainsKey(typefieldpair[1]))
                        {
                            Type         currtype   = IdentityType.Instance[typefieldpair[0]];
                            Type         pinType    = typeof(ISpread <>).MakeGenericType((typeof(ISpread <>)).MakeGenericType(currtype));
                            IIOContainer currpin    = FIOFactory.CreateIOContainer(pinType, PinAttribute(typefieldpair[1], order));
                            NGISpread    currspread = currpin.ToISpread();
                            Spreads.Add(typefieldpair[1], currspread);
                            Pins.Add(typefieldpair[1], currpin);
                        }
                    }
                }
                order++;
            }
            List <string> Removable = new List <string>();

            foreach (string k in Spreads.Keys)
            {
                if (!fieldnames.Contains(k.ToLower()))
                {
                    Removable.Add(k);
                }
            }
            foreach (string k in Removable)
            {
                Spreads.Remove(k);
                Pins[k].Dispose();
                Pins.Remove(k);
            }
        }
예제 #2
0
        public void Destroy(DX11RenderContext context, bool force)
        {
            var pin = FValue.ToISpread() as ISpread <ISpread <DX11Resource <IDX11Resource> > >;

            if (pin == null)
            {
                return;
            }

            for (int i = 0; i < pin.SliceCount; i++)
            {
                for (int j = 0; j < pin[i].SliceCount; j++)
                {
                    pin[i][j].Dispose(context);
                }
            }
        }
예제 #3
0
        public override void Evaluate(int SpreadMax)
        {
            InitDX11Graph();

            #region early break
            if (
                !FInput.IsChanged &&
                !FConfig.IsChanged &&
                !FKey.IsChanged &&
                !FAvoidNil.ToISpread().IsChanged &&
                !FAvoidNilEnable.IsChanged &&
                !FSwapDim.IsChanged
                )
            {
                return;
            }

            SpreadMax = FInput.IsAnyInvalid() ? 0 : FInput.SliceCount;
            if (SpreadMax == 0)
            {
                if (!FAvoidNilEnable.IsAnyInvalid() && FAvoidNilEnable[0])
                {
                    var force = FAvoidNil.ToISpread().IsChanged || FAvoidNilEnable.IsChanged;
                    if (force || FOutput.SliceCount > 0) // zero inputs -> zero outputs.
                    {
                        FOutput.FlushNil();

                        // set a default
                        FBinSize.SliceCount = 1;
                        FBinSize[0]         = 1;
                        FBinSize.Flush();
                        FValue.ToISpread().SliceCount = 1;

                        var output  = (FValue.ToISpread())[0] as ISpread;
                        var dummies = GetDefaults(FAvoidNil.ToISpread(), 0).ToList();
                        output.SliceCount = dummies.Count;
                        for (int j = 0; j < dummies.Count; j++)
                        {
                            output[j] = dummies[j];
                        }

                        FValue.ToISpread().Flush();
                        return;
                    }
                    else
                    {
                        return;  // already defaulted
                    }
                }
                else
                {
                    var force = !FAvoidNilEnable.IsAnyInvalid() && !FAvoidNilEnable[0] && FAvoidNilEnable.IsChanged;
                    if (force || FOutput.SliceCount > 0) // zero inputs -> zero outputs.
                    {
                        FOutput.FlushNil();
                        FBinSize.SliceCount = 1;
                        FBinSize[0]         = 0;
                        FBinSize.Flush();
                        FValue.ToISpread().FlushNil();
                        return;
                    }
                    else
                    {
                        return;  // already zero'ed
                    }
                }
            }
            #endregion early break

            FOutput.FlushResult(FInput);

            var keyCount = FKey.SliceCount;
            FBinSize.SliceCount = SpreadMax;

            var binnedOutput = FValue.ToISpread();
            binnedOutput.SliceCount = SpreadMax * keyCount;

            if (!FSwapDim.IsAnyInvalid() && FSwapDim[0]) // fields first
            {
                for (int i = 0; i < keyCount; i++)
                {
                    var fieldName = FKey[i];
                    var count     = 0;
                    var index     = 0;
                    foreach (var message in FInput)
                    {
                        var output = (binnedOutput[i * keyCount + index] as ISpread);
                        SetData(message, index, fieldName, output);
                        count += output.SliceCount;
                        index++;
                    }
                    FBinSize[i] = count;
                }
            }
            else // messages first
            {
                for (int i = 0; i < SpreadMax; i++)
                {
                    Message message = FInput[i];
                    var     count   = 0;
                    var     index   = 0;
                    foreach (var fieldName in FKey)
                    {
                        var output = (binnedOutput[i * keyCount + index] as ISpread);
                        SetData(message, index, fieldName, output);
                        count += output.SliceCount;
                        index++;
                    }
                    FBinSize[i] = count;
                }
            }

            binnedOutput.Flush();
            FBinSize.Flush();
        }