Пример #1
0
        public void RetainRef <TSetter>(AssetBase asset)
        {
            if (null == _typedAssets)
            {
                _typedAssets = DictionaryPool <Type, AssetBase> .Get();
            }

            var type = typeof(TSetter);

            if (_typedAssets.ContainsKey(type))
            {
                Logger.LogVerbose("BundlerMessenger::RetainRef<T>: {0}, Setter exist: {1}, release previous asset: {2}",
                                  this, type.FullName, _typedAssets[type].AssetPath);

                _typedAssets[type].Release();

                Logger.LogVerbose("BundlerMessenger::RetainRef<T>: {0}, Setter exist: {1}, release previous asset: {2}, finished!",
                                  this, type.FullName, _typedAssets[type].AssetPath);
            }

            _typedAssets[type] = asset;

            Logger.LogVerbose("BundlerMessenger::RetainRef<T>: {0}, loader: {1}", this, asset.Loader);

            asset.Retain();

            Logger.LogVerbose("BundlerMessenger::RetainRef<T>: {0}, loader: {1}, finished!", this, asset.Loader);

            Messengers.Add(this);
        }
    public static MeshData GenerateTerrainMesh(MapData mapData, int width, int levelOfDetail)
    {
        var mapInfo = mapData.mapData;

#if UNITY_UV_STARTS_AT_TOP
        int btnLeftX = (width - 1) / -2;
        int btnLeftZ = (width - 1) / -2;
#else
        int topLeftX = (width - 1) / -2;
        int topLeftZ = (width - 1) / 2;
#endif
        int      meshSimplificationIncrement = (levelOfDetail == 0) ? 1 : levelOfDetail * 2;
        int      verticesPerLine             = (width - 1) / meshSimplificationIncrement + 1;
        MeshData meshData = DictionaryPool <MeshData> .Get(verticesPerLine);

        int vertexIndex = 0;

        for (int y = 0; y < width; y += meshSimplificationIncrement)
        {
            for (int x = 0; x < width; x += meshSimplificationIncrement)
            {
                var info = mapInfo[y * width + x];
#if UNITY_UV_STARTS_AT_TOP
                meshData.vertices[vertexIndex] = new Vector3((btnLeftX + x) / TexMapRate, info.r, (btnLeftZ + y) / TexMapRate);
#else
                meshData.vertices[vertexIndex] = new Vector3((topLeftX + x) / TexMapRate, info.r, (topLeftZ - y) / TexMapRate);
#endif
                meshData.uvs[vertexIndex]  = new Vector2(x / (float)width, y / (float)width);
                meshData.nors[vertexIndex] = new Vector3(info.g, info.b, info.a);
                vertexIndex++;
            }
        }

        for (int y = 0; y < verticesPerLine - 1; y++)
        {
            vertexIndex = verticesPerLine * y;
            for (int x = 0; x < verticesPerLine - 1; x++)
            {
                try {
                    int a00 = vertexIndex;
                    int a01 = vertexIndex + 1;
                    int a10 = vertexIndex + verticesPerLine;
                    int a11 = vertexIndex + verticesPerLine + 1;

#if UNITY_UV_STARTS_AT_TOP
                    meshData.AddTriangle(a00, a10, a11);
                    meshData.AddTriangle(a11, a01, a00);
#else
                    meshData.AddTriangle(a00, a11, a10);
                    meshData.AddTriangle(a11, a00, a01);
#endif
                    vertexIndex++;
                } catch (Exception) {
                    Debug.LogError("vertexIndex " + vertexIndex);
                    throw;
                }
            }
        }
        return(meshData);
    }
Пример #3
0
        private void SetSizeRootPoints()
        {
            List <Transform> list = ListPool <Transform> .Get();

            ((Component)this).get_transform().FindMatchLoop("^fish_point_[0-9]+$", ref list);
            if (!((IReadOnlyList <Transform>)list).IsNullOrEmpty <Transform>())
            {
                Dictionary <int, Transform> toRelease = DictionaryPool <int, Transform> .Get();

                int length = 0;
                for (int index = 0; index < list.Count; ++index)
                {
                    Transform transform = list[index];
                    Match     match     = Regex.Match(((Object)transform).get_name(), "[0-9]+");
                    int       result;
                    if (match.Success && int.TryParse(match.Value, out result))
                    {
                        toRelease[result] = transform;
                        length            = Mathf.Max(length, result + 1);
                    }
                }
                this._sizeRootPoints = new Transform[length];
                using (Dictionary <int, Transform> .Enumerator enumerator = toRelease.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        KeyValuePair <int, Transform> current = enumerator.Current;
                        this._sizeRootPoints[current.Key] = current.Value;
                    }
                }
                DictionaryPool <int, Transform> .Release(toRelease);
            }
            ListPool <Transform> .Release(list);
        }
Пример #4
0
    // Token: 0x0600867A RID: 34426 RVA: 0x0034A374 File Offset: 0x00348774
    public void CalculateBlendShape()
    {
        if (FBSTarget.Length == 0)
        {
            return;
        }
        var b   = correctOpenMax >= 0f ? correctOpenMax : OpenMax;
        var num = Mathf.Lerp(OpenMin, b, openRate);

        if (0f <= FixedRate)
        {
            num = FixedRate;
        }
        var num2 = 0f;

        if (blendTimeCtrl != null)
        {
            num2 = blendTimeCtrl.Calculate();
        }
        foreach (var fbstargetInfo in FBSTarget)
        {
            var skinnedMeshRenderer = fbstargetInfo.GetSkinnedMeshRenderer();
            var dictionary          = DictionaryPool <int, float> .Get();

            for (var j = 0; j < fbstargetInfo.PtnSet.Length; j++)
            {
                dictionary[fbstargetInfo.PtnSet[j].Close] = 0f;
                dictionary[fbstargetInfo.PtnSet[j].Open]  = 0f;
            }

            var num3 = (int)Mathf.Clamp(num * 100f, 0f, 100f);
            if (num2 != 1f)
            {
                foreach (var num4 in dictBackFace.Keys)
                {
                    dictionary[fbstargetInfo.PtnSet[num4].Close] = dictionary[fbstargetInfo.PtnSet[num4].Close] + dictBackFace[num4] * (100 - num3) * (1f - num2);
                    dictionary[fbstargetInfo.PtnSet[num4].Open]  = dictionary[fbstargetInfo.PtnSet[num4].Open] + dictBackFace[num4] * num3 * (1f - num2);
                }
            }

            foreach (var num5 in dictNowFace.Keys)
            {
                dictionary[fbstargetInfo.PtnSet[num5].Close] = dictionary[fbstargetInfo.PtnSet[num5].Close] + dictNowFace[num5] * (100 - num3) * num2;
                dictionary[fbstargetInfo.PtnSet[num5].Open]  = dictionary[fbstargetInfo.PtnSet[num5].Open] + dictNowFace[num5] * num3 * num2;
            }

            foreach (var keyValuePair in dictionary)
            {
                if (keyValuePair.Key != -1)
                {
                    skinnedMeshRenderer.SetBlendShapeWeight(keyValuePair.Key, keyValuePair.Value);
                }
            }
            DictionaryPool <int, float> .Release(dictionary);
        }
    }
Пример #5
0
    public void CalculateBlendShape()
    {
        if (this.FBSTarget.Length == 0)
        {
            return;
        }
        float num1 = Mathf.Lerp(this.OpenMin, (double)this.correctOpenMax >= 0.0 ? this.correctOpenMax : this.OpenMax, this.openRate);

        if (0.0 <= (double)this.FixedRate)
        {
            num1 = this.FixedRate;
        }
        float num2 = 0.0f;

        if (this.blendTimeCtrl != null)
        {
            num2 = this.blendTimeCtrl.Calculate();
        }
        foreach (FBSTargetInfo fbsTargetInfo in this.FBSTarget)
        {
            SkinnedMeshRenderer     skinnedMeshRenderer = fbsTargetInfo.GetSkinnedMeshRenderer();
            Dictionary <int, float> toRelease           = DictionaryPool <int, float> .Get();

            for (int index = 0; index < fbsTargetInfo.PtnSet.Length; ++index)
            {
                toRelease[fbsTargetInfo.PtnSet[index].Close] = 0.0f;
                toRelease[fbsTargetInfo.PtnSet[index].Open]  = 0.0f;
            }
            int num3 = (int)Mathf.Clamp(num1 * 100f, 0.0f, 100f);
            if ((double)num2 != 1.0)
            {
                foreach (int key in this.dictBackFace.Keys)
                {
                    toRelease[fbsTargetInfo.PtnSet[key].Close] = toRelease[fbsTargetInfo.PtnSet[key].Close] + (float)((double)this.dictBackFace[key] * (double)(100 - num3) * (1.0 - (double)num2));
                    toRelease[fbsTargetInfo.PtnSet[key].Open]  = toRelease[fbsTargetInfo.PtnSet[key].Open] + (float)((double)this.dictBackFace[key] * (double)num3 * (1.0 - (double)num2));
                }
            }
            foreach (int key in this.dictNowFace.Keys)
            {
                toRelease[fbsTargetInfo.PtnSet[key].Close] = toRelease[fbsTargetInfo.PtnSet[key].Close] + this.dictNowFace[key] * (float)(100 - num3) * num2;
                toRelease[fbsTargetInfo.PtnSet[key].Open]  = toRelease[fbsTargetInfo.PtnSet[key].Open] + this.dictNowFace[key] * (float)num3 * num2;
            }
            foreach (KeyValuePair <int, float> keyValuePair in toRelease)
            {
                if (keyValuePair.Key == -1)
                {
                    Debug.LogError((object)(((Object)skinnedMeshRenderer.get_sharedMesh()).get_name() + ": 多分、名前が間違ったデータがある"));
                }
                else
                {
                    skinnedMeshRenderer.SetBlendShapeWeight(keyValuePair.Key, keyValuePair.Value);
                }
            }
            DictionaryPool <int, float> .Release(toRelease);
        }
    }
Пример #6
0
 Dictionary <T, U> InitCollection <T, U>(Dictionary <T, U> container)
 {
     if (container == null)
     {
         container = DictionaryPool <T, U> .Get();
     }
     else
     {
         container.Clear();
     }
     return(container);
 }
Пример #7
0
        public AssetBundleCache(int capacity)
        {
            _assetBundleInfoDict = DictionaryPool <IgnoreCaseString, AssetBundleInfo> .Get();

            _assetbundleDictionary = DictionaryPool <IgnoreCaseString, GameAssetBundle> .Get();

            _exceptionHashSet = HashSetPool <IgnoreCaseString> .Get();

            _assetbundleincludes = DictionaryPool <string, List <string> > .Get();

            _remoteinfo = null;
        }
Пример #8
0
    // Token: 0x0600867A RID: 34426 RVA: 0x0034A374 File Offset: 0x00348774
    public void CalculateBlendShape()
    {
        if (this.FBSTarget.Length == 0)
        {
            return;
        }
        float b   = (this.correctOpenMax >= 0f) ? this.correctOpenMax : this.OpenMax;
        float num = Mathf.Lerp(this.OpenMin, b, this.openRate);

        if (0f <= this.FixedRate)
        {
            num = this.FixedRate;
        }
        float num2 = 0f;

        if (this.blendTimeCtrl != null)
        {
            num2 = this.blendTimeCtrl.Calculate();
        }
        foreach (FBSTargetInfo fbstargetInfo in this.FBSTarget)
        {
            SkinnedMeshRenderer     skinnedMeshRenderer = fbstargetInfo.GetSkinnedMeshRenderer();
            Dictionary <int, float> dictionary          = DictionaryPool <int, float> .Get();

            for (int j = 0; j < fbstargetInfo.PtnSet.Length; j++)
            {
                dictionary[fbstargetInfo.PtnSet[j].Close] = 0f;
                dictionary[fbstargetInfo.PtnSet[j].Open]  = 0f;
            }
            int num3 = (int)Mathf.Clamp(num * 100f, 0f, 100f);
            if (num2 != 1f)
            {
                foreach (int num4 in this.dictBackFace.Keys)
                {
                    dictionary[fbstargetInfo.PtnSet[num4].Close] = dictionary[fbstargetInfo.PtnSet[num4].Close] + this.dictBackFace[num4] * (float)(100 - num3) * (1f - num2);
                    dictionary[fbstargetInfo.PtnSet[num4].Open]  = dictionary[fbstargetInfo.PtnSet[num4].Open] + this.dictBackFace[num4] * (float)num3 * (1f - num2);
                }
            }
            foreach (int num5 in this.dictNowFace.Keys)
            {
                dictionary[fbstargetInfo.PtnSet[num5].Close] = dictionary[fbstargetInfo.PtnSet[num5].Close] + this.dictNowFace[num5] * (float)(100 - num3) * num2;
                dictionary[fbstargetInfo.PtnSet[num5].Open]  = dictionary[fbstargetInfo.PtnSet[num5].Open] + this.dictNowFace[num5] * (float)num3 * num2;
            }
            foreach (KeyValuePair <int, float> keyValuePair in dictionary)
            {
                if (keyValuePair.Key != -1)
                {
                    skinnedMeshRenderer.SetBlendShapeWeight(keyValuePair.Key, keyValuePair.Value);
                }
            }
            DictionaryPool <int, float> .Release(dictionary);
        }
    }
Пример #9
0
        private bool LoadInstrumentAccountSettingData(Guid accountId, Guid instrumentId, DateTime tradeDay, out Dictionary <Guid, InstrumentTradeDaySetting> accountSetting)
        {
            var reader = DBRepository.Default.GetInstrumentTradeDaySettingData(instrumentId, tradeDay);

            accountSetting = null;
            if (reader == null)
            {
                return(false);
            }
            accountSetting = _pool.Get();
            while (reader.Read())
            {
                Guid eachAccountId = (Guid)reader["AccountID"];
                accountSetting.Add(eachAccountId, new InstrumentTradeDaySetting(new DBReader(reader), instrumentId, tradeDay, Settings.Setting.Default));
            }
            _instrumentSettingsPerTradeDayDict.Add(new InstrumentSettingKey(instrumentId, tradeDay), accountSetting);
            return(true);
        }
Пример #10
0
        protected int AddGroup(string abGrounpName, string abName)
        {
            Dictionary <string, int> abReferCount;

            if (!m_ABGroups.TryGetValue(abGrounpName, out abReferCount))
            {
                abReferCount = DictionaryPool <string, int> .Get();

                m_ABGroups.Add(abGrounpName, abReferCount);
            }

            if (!abReferCount.ContainsKey(abName))
            {
                abReferCount.Add(abName, 1);
                return(1);
            }
            else
            {
                return(abReferCount[abName]++);
            }
        }
Пример #11
0
        /// <summary>
        ///     Generate all shader code from <see cref="GenerateHLSL" /> attribute.
        /// </summary>
        /// <returns>An awaitable task.</returns>
        public static async Task GenerateAll()
        {
            Dictionary <string, List <ShaderTypeGenerator> > sourceGenerators = null;

            try
            {
                // Store per source file path the generator definitions
                sourceGenerators = DictionaryPool <string, List <ShaderTypeGenerator> > .Get();

                // Extract all types with the GenerateHLSL tag
                foreach (var type in TypeCache.GetTypesWithAttribute <GenerateHLSL>())
                {
                    var attr = type.GetCustomAttributes(typeof(GenerateHLSL), false).First() as GenerateHLSL;
                    if (!sourceGenerators.TryGetValue(attr.sourcePath, out var generators))
                    {
                        generators = ListPool <ShaderTypeGenerator> .Get();

                        sourceGenerators.Add(attr.sourcePath, generators);
                    }

                    generators.Add(new ShaderTypeGenerator(type, attr));
                }

                // Generate all files
                await Task.WhenAll(sourceGenerators.Select(async it =>
                                                           await GenerateAsync($"{it.Key}.hlsl", $"{Path.ChangeExtension(it.Key, "custom")}.hlsl", it.Value)));
            }
            finally
            {
                // Make sure we always release pooled resources
                if (sourceGenerators != null)
                {
                    foreach (var pair in sourceGenerators)
                    {
                        ListPool <ShaderTypeGenerator> .Release(pair.Value);
                    }
                    DictionaryPool <string, List <ShaderTypeGenerator> > .Release(sourceGenerators);
                }
            }
        }
Пример #12
0
        /// <summary>
        /// The last step for loading data.
        /// In this step, prototype references are being resolved for this serialized data and their sub data objects.
        /// </summary>
        /// <param name="prototypes">Prototypes to use for remapping</param>
        /// <param name="errors"></param>
        public void ResolveReferenceFields(List <IPrototype> prototypes, List <ParsingError> errors, PrototypeParserState state)
        {
            Dictionary <string, object> updates = DictionaryPool <string, object> .Get();

            try
            {
                foreach (var field in fields)
                {
                    var @ref = field.Value as SerializedPrototypeReference;
                    if (!ReferenceEquals(@ref, null))
                    {
                        updates.Add(field.Key, @ref.Resolve(prototypes));
                    }

                    var sub = field.Value as SerializedData;
                    if (!ReferenceEquals(sub, null))
                    {
                        sub.ResolveReferenceFields(prototypes, errors, state);
                    }

                    var col = field.Value as SerializedCollectionData;
                    if (!ReferenceEquals(col, null))
                    {
                        col.ResolveReferenceFieldsAndSubData(prototypes, errors, state);
                    }
                }

                // Write updates
                foreach (var update in updates)
                {
                    this.fields[update.Key] = update.Value;
                }
            }
            finally
            {
                DictionaryPool <string, object> .Return(updates);
            }
        }
Пример #13
0
        /// <summary>
        /// The last step for loading data.
        /// In this step, root references are being resolved for this serialized data and their sub data objects.
        /// </summary>
        /// <param name="referenceables">Root objects to use for remapping</param>
        /// <param name="filename">Only used for error reporting</param>
        public void ResolveReferenceFields(string filename, List <ISerializableRoot> referenceables, List <SerializerError> errors, XMLSerializerParams parameters)
        {
            Dictionary <string, object> updates = DictionaryPool <string, object> .Get();

            try
            {
                foreach (var field in fields)
                {
                    var @ref = field.Value as SerializedRootObjectReference;
                    if (!ReferenceEquals(@ref, null))
                    {
                        updates.Add(field.Key, @ref.Resolve(referenceables));
                    }

                    var sub = field.Value as SerializedData;
                    if (!ReferenceEquals(sub, null))
                    {
                        sub.ResolveReferenceFields(filename, referenceables, errors, parameters);
                    }

                    var col = field.Value as SerializedCollectionData;
                    if (!ReferenceEquals(col, null))
                    {
                        col.ResolveReferenceFieldsAndSubData(filename, referenceables, errors, parameters);
                    }
                }

                // Write updates
                foreach (var update in updates)
                {
                    this.fields[update.Key] = update.Value;
                }
            }
            finally
            {
                DictionaryPool <string, object> .Return(updates);
            }
        }
Пример #14
0
        private void SaveTrackingFile()
        {
            Logger.DebugLogDebug($"{nameof(SaveTrackingFile)} fired");
            if (!SavePending)
            {
                return;
            }
            if (TrackLastLoadedSceneFile == null)
            {
                throw new NullReferenceException($"{nameof(TrackLastLoadedSceneFile)} should not be null");
            }

            var prefix  = Path.Combine(Paths.CachePath, Path.GetFileName(TrackLastLoadedSceneFile));
            var newFile = string.Concat(prefix, Path.GetRandomFileName());
            var oldFile = string.Concat(prefix, Path.GetRandomFileName());

            var relativeScenes = DictionaryPool <string, string> .Get();

            try
            {
                foreach (var entry in LastLoadedScenes)
                {
                    relativeScenes[SceneRelativePathCache.Get(entry.Key)] =
                        Path.GetFileName(entry.Value);
                }

                lock (SavePendingLock)
                {
                    if (!SavePending)
                    {
                        return;
                    }

                    try
                    {
                        using (var fileStream = new FileStream(newFile, FileMode.Create))
                            using (var streamWriter = new StreamWriter(fileStream, Encoding.UTF8))
                            {
                                streamWriter.Write(GUID);
                                streamWriter.Write(TrackingFileEntrySplit[0]);
                                streamWriter.Write(Version);
                                streamWriter.Write(TrackingFileEntrySplit[0]);
                                streamWriter.Write(relativeScenes.Count);
                                streamWriter.Write(TrackingFileEntrySplit[0]);
                                streamWriter.Write('\n');
                                foreach (var entry in relativeScenes)
                                {
                                    streamWriter.Write(entry.Key);
                                    streamWriter.Write(TrackingFileEntrySplit[0]);
                                    streamWriter.Write(entry.Value);
                                    streamWriter.Write('\n');
                                }
                            }

                        File.Move(TrackLastLoadedSceneFile, oldFile);
                        File.Move(newFile, TrackLastLoadedSceneFile);
                        File.Delete(oldFile);
                        SavePending = false;
                        Logger.DebugLogDebug($"Updated {TrackLastLoadedSceneFile}");
                    }
                    catch (Exception err)
                    {
                        if (!File.Exists(oldFile))
                        {
                            throw;
                        }
                        Logger.LogException(err, this,
                                            $"{nameof(SaveTrackingFile)}: Error encountered, restoring {TrackLastLoadedSceneFile}");

                        File.Copy(oldFile, TrackLastLoadedSceneFile);

                        throw;
                    }
                    finally
                    {
                        if (File.Exists(oldFile))
                        {
                            File.Delete(oldFile);
                        }
                        if (File.Exists(newFile))
                        {
                            File.Delete(newFile);
                        }
                    }
                }
            }
            finally
            {
                DictionaryPool <string, string> .Release(relativeScenes);
            }
        }
Пример #15
0
 internal static PooledDictionary <TKey, TValue> Make()
 {
     return(new PooledDictionary <TKey, TValue>(DictionaryPool.Get()));
 }
Пример #16
0
        protected void OnEnable()
        {
            m_isExpandedById = DictionaryPool <string, bool> .Get();

            OnEnableEntityStoreEditor();
        }
Пример #17
0
        // Internal validation
        // -------------------------------------------------

        public override void EvaluateDynamicMaterialSlots()
        {
            var dynamicInputSlotsToCompare = DictionaryPool <DynamicValueMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicSlots = ListPool <DynamicValueMaterialSlot> .Get();

            // iterate the input slots
            using (var tempSlots = PooledList <MaterialSlot> .Get())
            {
                GetInputSlots(tempSlots);
                foreach (var inputSlot in tempSlots)
                {
                    inputSlot.hasError = false;

                    // if there is a connection
                    var edges = owner.GetEdges(inputSlot.slotReference).ToList();
                    if (!edges.Any())
                    {
                        if (inputSlot is DynamicValueMaterialSlot)
                        {
                            skippedDynamicSlots.Add(inputSlot as DynamicValueMaterialSlot);
                        }
                        continue;
                    }

                    // get the output details
                    var outputSlotRef = edges[0].outputSlot;
                    var outputNode    = owner.GetNodeFromGuid(outputSlotRef.nodeGuid);
                    if (outputNode == null)
                    {
                        continue;
                    }

                    var outputSlot = outputNode.FindOutputSlot <MaterialSlot>(outputSlotRef.slotId);
                    if (outputSlot == null)
                    {
                        continue;
                    }

                    if (outputSlot.hasError)
                    {
                        inputSlot.hasError = true;
                        continue;
                    }

                    var outputConcreteType = outputSlot.concreteValueType;
                    // dynamic input... depends on output from other node.
                    // we need to compare ALL dynamic inputs to make sure they
                    // are compatable.
                    if (inputSlot is DynamicValueMaterialSlot)
                    {
                        dynamicInputSlotsToCompare.Add((DynamicValueMaterialSlot)inputSlot, outputConcreteType);
                        continue;
                    }
                }

                m_MultiplyType = GetMultiplyType(dynamicInputSlotsToCompare.Values);

                // Resolve dynamics depending on matrix/vector configuration
                switch (m_MultiplyType)
                {
                // If all matrix resolve as per dynamic matrix
                case MultiplyType.Matrix:
                    var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                    foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                    {
                        dynamicKvP.Key.SetConcreteType(dynamicMatrixType);
                    }
                    foreach (var skippedSlot in skippedDynamicSlots)
                    {
                        skippedSlot.SetConcreteType(dynamicMatrixType);
                    }
                    break;

                // If mixed handle differently:
                // Iterate all slots and set their concretes based on their edges
                // Find matrix slot and convert its type to a vector type
                // Reiterate all slots and set non matrix slots to the vector type
                case MultiplyType.Mixed:
                    foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                    {
                        SetConcreteValueTypeFromEdge(dynamicKvP.Key);
                    }
                    MaterialSlot          matrixSlot = GetMatrixSlot();
                    ConcreteSlotValueType vectorType = SlotValueHelper.ConvertMatrixToVectorType(matrixSlot.concreteValueType);
                    foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                    {
                        if (dynamicKvP.Key != matrixSlot)
                        {
                            dynamicKvP.Key.SetConcreteType(vectorType);
                        }
                    }
                    foreach (var skippedSlot in skippedDynamicSlots)
                    {
                        skippedSlot.SetConcreteType(vectorType);
                    }
                    break;

                // If all vector resolve as per dynamic vector
                default:
                    var dynamicVectorType = ConvertDynamicVectorInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                    foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                    {
                        dynamicKvP.Key.SetConcreteType(dynamicVectorType);
                    }
                    foreach (var skippedSlot in skippedDynamicSlots)
                    {
                        skippedSlot.SetConcreteType(dynamicVectorType);
                    }
                    break;
                }

                tempSlots.Clear();
                GetInputSlots(tempSlots);
                bool inputError = tempSlots.Any(x => x.hasError);
                if (inputError)
                {
                    owner.AddConcretizationError(guid, string.Format("Node {0} had input error", guid));
                    hasError = true;
                }
                // configure the output slots now
                // their slotType will either be the default output slotType
                // or the above dynanic slotType for dynamic nodes
                // or error if there is an input error
                tempSlots.Clear();
                GetOutputSlots(tempSlots);
                foreach (var outputSlot in tempSlots)
                {
                    outputSlot.hasError = false;

                    if (inputError)
                    {
                        outputSlot.hasError = true;
                        continue;
                    }

                    if (outputSlot is DynamicValueMaterialSlot)
                    {
                        // Apply similar logic to output slot
                        switch (m_MultiplyType)
                        {
                        // As per dynamic matrix
                        case MultiplyType.Matrix:
                            var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                            (outputSlot as DynamicValueMaterialSlot).SetConcreteType(dynamicMatrixType);
                            break;

                        // Mixed configuration
                        // Find matrix slot and convert type to vector
                        // Set output concrete to vector
                        case MultiplyType.Mixed:
                            MaterialSlot          matrixSlot = GetMatrixSlot();
                            ConcreteSlotValueType vectorType = SlotValueHelper.ConvertMatrixToVectorType(matrixSlot.concreteValueType);
                            (outputSlot as DynamicValueMaterialSlot).SetConcreteType(vectorType);
                            break;

                        // As per dynamic vector
                        default:
                            var dynamicVectorType = ConvertDynamicVectorInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                            (outputSlot as DynamicValueMaterialSlot).SetConcreteType(dynamicVectorType);
                            break;
                        }
                        continue;
                    }
                }

                tempSlots.Clear();
                GetOutputSlots(tempSlots);
                if (tempSlots.Any(x => x.hasError))
                {
                    owner.AddConcretizationError(guid, string.Format("Node {0} had output error", guid));
                    hasError = true;
                }
            }

            CalculateNodeHasError();

            ListPool <DynamicValueMaterialSlot> .Release(skippedDynamicSlots);

            DictionaryPool <DynamicValueMaterialSlot, ConcreteSlotValueType> .Release(dynamicInputSlotsToCompare);
        }
Пример #18
0
        internal static void ExportSelected(LocaleIdentifier source, string dir, string name, XliffVersion version, Dictionary <StringTableCollection, HashSet <int> > collectionsWithSelectedIndexes, ITaskReporter reporter = null)
        {
            var documents = DictionaryPool <LocaleIdentifier, IXliffDocument> .Get();

            try
            {
                // Used for reporting
                int   totalTasks = collectionsWithSelectedIndexes.Sum(c => c.Value.Count);
                float taskStep   = 1.0f / (totalTasks * 2.0f);
                float progress   = 0;
                reporter?.Start($"Exporting {totalTasks} String Tables to XLIFF", string.Empty);

                foreach (var kvp in collectionsWithSelectedIndexes)
                {
                    var stringTableCollection = kvp.Key;
                    var sourceTable           = stringTableCollection.GetTable(source) as StringTable;
                    if (sourceTable == null)
                    {
                        var message = $"Collection {stringTableCollection.TableCollectionName} does not contain a table for the source language {source}";
                        reporter?.Fail(message);
                        throw new Exception(message);
                    }

                    foreach (var stringTableIndex in kvp.Value)
                    {
                        var stringTable = stringTableCollection.StringTables[stringTableIndex];

                        reporter?.ReportProgress($"Generating document for {stringTable.name}", progress);
                        progress += taskStep;

                        if (!documents.TryGetValue(stringTable.LocaleIdentifier, out var targetDoc))
                        {
                            targetDoc = CreateDocument(source, stringTable.LocaleIdentifier, version);
                            documents[stringTable.LocaleIdentifier] = targetDoc;
                        }

                        AddTableToDocument(targetDoc, sourceTable, stringTable);
                    }
                }

                // Now write the files
                foreach (var doc in documents)
                {
                    var cleanName = CleanFileName(name);
                    var fileName  = $"{cleanName}_{doc.Key.Code}.xlf";
                    var filePath  = Path.Combine(dir, fileName);

                    reporter?.ReportProgress($"Writing {fileName}", progress);
                    progress += taskStep;
                    using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                    {
                        doc.Value.Serialize(stream);
                    }
                }

                reporter?.Completed($"Finished exporting");
            }
            catch (Exception e)
            {
                reporter?.Fail(e.Message);
                throw;
            }
            finally
            {
                DictionaryPool <LocaleIdentifier, IXliffDocument> .Release(documents);
            }
        }
Пример #19
0
        internal static GenericMenu BuildPopupList(Object target, UnityEventBase dummyEvent, SerializedProperty listener)
        {
            //special case for components... we want all the game objects targets there!
            var targetToUse = target;

            if (targetToUse is Component)
            {
                targetToUse = (target as Component).gameObject;
            }

            // find the current event target...
            var methodName = listener.FindPropertyRelative(kMethodNamePath);

            var menu = new GenericMenu();

            menu.AddItem(new GUIContent(kNoFunctionString),
                         string.IsNullOrEmpty(methodName.stringValue),
                         ClearEventFunction,
                         new UnityEventFunction(listener, null, null, PersistentListenerMode.EventDefined));

            if (targetToUse == null)
            {
                return(menu);
            }

            menu.AddSeparator("");

            // figure out the signature of this delegate...
            // The property at this stage points to the 'container' and has the field name
            Type delegateType = dummyEvent.GetType();

            // check out the signature of invoke as this is the callback!
            MethodInfo delegateMethod         = delegateType.GetMethod("Invoke");
            var        delegateArgumentsTypes = delegateMethod.GetParameters().Select(x => x.ParameterType).ToArray();

            var duplicateNames = DictionaryPool <string, int> .Get();

            var duplicateFullNames = DictionaryPool <string, int> .Get();

            GeneratePopUpForType(menu, targetToUse, targetToUse.GetType().Name, listener, delegateArgumentsTypes);
            duplicateNames[targetToUse.GetType().Name] = 0;
            if (targetToUse is GameObject)
            {
                Component[] comps = (targetToUse as GameObject).GetComponents <Component>();

                // Collect all the names and record how many times the same name is used.
                foreach (Component comp in comps)
                {
                    var duplicateIndex = 0;
                    if (duplicateNames.TryGetValue(comp.GetType().Name, out duplicateIndex))
                    {
                        duplicateIndex++;
                    }
                    duplicateNames[comp.GetType().Name] = duplicateIndex;
                }

                foreach (Component comp in comps)
                {
                    if (comp == null)
                    {
                        continue;
                    }

                    var    compType       = comp.GetType();
                    string targetName     = compType.Name;
                    int    duplicateIndex = 0;

                    // Is this name used multiple times? If so then use the full name plus an index if there are also duplicates of this. (case 1309997)
                    if (duplicateNames[compType.Name] > 0)
                    {
                        if (duplicateFullNames.TryGetValue(compType.FullName, out duplicateIndex))
                        {
                            targetName = $"{compType.FullName} ({duplicateIndex})";
                        }
                        else
                        {
                            targetName = compType.FullName;
                        }
                    }
                    GeneratePopUpForType(menu, comp, targetName, listener, delegateArgumentsTypes);
                    duplicateFullNames[compType.FullName] = duplicateIndex + 1;
                }

                DictionaryPool <string, int> .Release(duplicateNames);

                DictionaryPool <string, int> .Release(duplicateFullNames);
            }
            return(menu);
        }
Пример #20
0
        private static void FreeHUpdateUI()
        {
            // for 3P the character names show in one extra place that the standard check doesn't cover.
            // easiest to just update each time.
            var freeHScene = Object.FindObjectOfType <FreeHScene>();

            if (freeHScene == null)
            {
                return;
            }
            var member = Traverse.Create(freeHScene).Field <FreeHScene.Member>("member")?.Value;

            if (member == null)
            {
                return;
            }

            Action <string> GetUpdateUIField(string fieldName)
            {
                void Callback(string value)
                {
                    if (string.IsNullOrEmpty(value) || freeHScene == null)
                    {
                        return;
                    }
                    var field = Traverse.Create(freeHScene).Field <TextMeshProUGUI>(fieldName)?.Value;

                    if (field == null)
                    {
                        return;
                    }
                    field.text = value;
                }

                return(Callback);
            }

            Action <string> GetUpdateTextCallback(string path)
            {
                void Callback(string value)
                {
                    if (string.IsNullOrEmpty(value))
                    {
                        return;
                    }

                    var obj = GameObject.Find(path);

                    if (obj == null)
                    {
                        return;
                    }
                    var uiText = obj.GetComponent <Text>();

                    if (uiText == null)
                    {
                        return;
                    }
                    uiText.text = value;
                }

                return(Callback);
            }

            var callbackMap = DictionaryPool <SaveData.Heroine, List <Action <string> > > .Get();

            try
            {
                if (member.resultHeroine.HasValue && member.resultHeroine.Value != null)
                {
                    if (!callbackMap.TryGetValue(member.resultHeroine.Value, out var callbacks))
                    {
                        callbackMap[member.resultHeroine.Value] =
                            callbacks = GeBoCommon.Utilities.ListPool <Action <string> > .Get();
                    }

                    callbacks.Add(GetUpdateUIField("textFemaleName1"));
                }

                if (member.resultPartner.HasValue && member.resultPartner.Value != null)
                {
                    if (!callbackMap.TryGetValue(member.resultPartner.Value, out var callbacks))
                    {
                        callbackMap[member.resultPartner.Value] =
                            callbacks = GeBoCommon.Utilities.ListPool <Action <string> > .Get();
                    }

                    callbacks.Add(GetUpdateUIField("textFemaleName2"));
                }

                // leaving traverse to work with earlier versions
                var resultDarkHeroine = Traverse.Create(member)
                                        .Field <ReactiveProperty <SaveData.Heroine> >("resultDarkHeroine")?.Value;
                if (resultDarkHeroine != null && resultDarkHeroine.HasValue && resultDarkHeroine.Value != null)
                {
                    if (!callbackMap.TryGetValue(resultDarkHeroine.Value, out var callbacks))
                    {
                        callbackMap[resultDarkHeroine.Value] =
                            callbacks = GeBoCommon.Utilities.ListPool <Action <string> > .Get();
                    }

                    callbacks.Add(
                        // ReSharper disable once StringLiteralTypo
                        GetUpdateTextCallback("/FreeHScene/Canvas/Panel/Dark/FemaleInfomation/Name/TextMeshPro Text"));
                }

                foreach (var entry in callbackMap)
                {
                    foreach (var heroineChaFile in entry.Key.GetRelatedChaFiles())
                    {
                        heroineChaFile.TranslateFullName(
                            translated =>
                        {
                            foreach (var callback in entry.Value)
                            {
                                try
                                {
                                    callback(translated);
                                }
                                catch (Exception err)
                                {
                                    Logger.LogException(err, freeHScene, nameof(FreeHUpdateUI));
                                }
                            }
                        });
                    }
                }
            }
            finally
            {
                foreach (var entry in callbackMap)
                {
                    GeBoCommon.Utilities.ListPool <Action <string> > .Release(entry.Value);
                }
                DictionaryPool <SaveData.Heroine, List <Action <string> > > .Release(callbackMap);
            }
        }
Пример #21
0
        // Internal validation
        // -------------------------------------------------

        public override void ValidateNode()
        {
            var isInError = false;

            // all children nodes needs to be updated first
            // so do that here
            var slots = ListPool <MaterialSlot> .Get();

            GetInputSlots(slots);
            foreach (var inputSlot in slots)
            {
                inputSlot.hasError = false;

                var edges = owner.GetEdges(inputSlot.slotReference);
                foreach (var edge in edges)
                {
                    var fromSocketRef = edge.outputSlot;
                    var outputNode    = owner.GetNodeFromGuid(fromSocketRef.nodeGuid);
                    if (outputNode == null)
                    {
                        continue;
                    }

                    outputNode.ValidateNode();
                    if (outputNode.hasError)
                    {
                        isInError = true;
                    }
                }
            }
            ListPool <MaterialSlot> .Release(slots);

            var dynamicInputSlotsToCompare = DictionaryPool <DynamicValueMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicSlots = ListPool <DynamicValueMaterialSlot> .Get();

            // iterate the input slots
            s_TempSlots.Clear();
            GetInputSlots(s_TempSlots);
            foreach (var inputSlot in s_TempSlots)
            {
                // if there is a connection
                var edges = owner.GetEdges(inputSlot.slotReference).ToList();
                if (!edges.Any())
                {
                    if (inputSlot is DynamicValueMaterialSlot)
                    {
                        skippedDynamicSlots.Add(inputSlot as DynamicValueMaterialSlot);
                    }
                    continue;
                }

                // get the output details
                var outputSlotRef = edges[0].outputSlot;
                var outputNode    = owner.GetNodeFromGuid(outputSlotRef.nodeGuid);
                if (outputNode == null)
                {
                    continue;
                }

                var outputSlot = outputNode.FindOutputSlot <MaterialSlot>(outputSlotRef.slotId);
                if (outputSlot == null)
                {
                    continue;
                }

                if (outputSlot.hasError)
                {
                    inputSlot.hasError = true;
                    continue;
                }

                var outputConcreteType = outputSlot.concreteValueType;
                // dynamic input... depends on output from other node.
                // we need to compare ALL dynamic inputs to make sure they
                // are compatable.
                if (inputSlot is DynamicValueMaterialSlot)
                {
                    dynamicInputSlotsToCompare.Add((DynamicValueMaterialSlot)inputSlot, outputConcreteType);
                    continue;
                }

                // if we have a standard connection... just check the types work!
                if (!ImplicitConversionExists(outputConcreteType, inputSlot.concreteValueType))
                {
                    inputSlot.hasError = true;
                }
            }

            m_MultiplyType = GetMultiplyType(dynamicInputSlotsToCompare.Values);

            // Resolve dynamics depending on matrix/vector configuration
            switch (m_MultiplyType)
            {
            // If all matrix resolve as per dynamic matrix
            case MultiplyType.Matrix:
                var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                {
                    dynamicKvP.Key.SetConcreteType(dynamicMatrixType);
                }
                foreach (var skippedSlot in skippedDynamicSlots)
                {
                    skippedSlot.SetConcreteType(dynamicMatrixType);
                }
                break;

            // If mixed handle differently:
            // Iterate all slots and set their concretes based on their edges
            // Find matrix slot and convert its type to a vector type
            // Reiterate all slots and set non matrix slots to the vector type
            case MultiplyType.Mixed:
                foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                {
                    SetConcreteValueTypeFromEdge(dynamicKvP.Key);
                }
                MaterialSlot          matrixSlot = GetMatrixSlot();
                ConcreteSlotValueType vectorType = SlotValueHelper.ConvertMatrixToVectorType(matrixSlot.concreteValueType);
                foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                {
                    if (dynamicKvP.Key != matrixSlot)
                    {
                        dynamicKvP.Key.SetConcreteType(vectorType);
                    }
                }
                foreach (var skippedSlot in skippedDynamicSlots)
                {
                    skippedSlot.SetConcreteType(vectorType);
                }
                break;

            // If all vector resolve as per dynamic vector
            default:
                var dynamicVectorType = ConvertDynamicInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                {
                    dynamicKvP.Key.SetConcreteType(dynamicVectorType);
                }
                foreach (var skippedSlot in skippedDynamicSlots)
                {
                    skippedSlot.SetConcreteType(dynamicVectorType);
                }
                break;
            }

            s_TempSlots.Clear();
            GetInputSlots(s_TempSlots);
            var inputError = s_TempSlots.Any(x => x.hasError);

            // configure the output slots now
            // their slotType will either be the default output slotType
            // or the above dynanic slotType for dynamic nodes
            // or error if there is an input error
            s_TempSlots.Clear();
            GetOutputSlots(s_TempSlots);
            foreach (var outputSlot in s_TempSlots)
            {
                outputSlot.hasError = false;

                if (inputError)
                {
                    outputSlot.hasError = true;
                    continue;
                }

                if (outputSlot is DynamicValueMaterialSlot)
                {
                    // Apply similar logic to output slot
                    switch (m_MultiplyType)
                    {
                    // As per dynamic matrix
                    case MultiplyType.Matrix:
                        var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                        (outputSlot as DynamicValueMaterialSlot).SetConcreteType(dynamicMatrixType);
                        break;

                    // Mixed configuration
                    // Find matrix slot and convert type to vector
                    // Set output concrete to vector
                    case MultiplyType.Mixed:
                        MaterialSlot          matrixSlot = GetMatrixSlot();
                        ConcreteSlotValueType vectorType = SlotValueHelper.ConvertMatrixToVectorType(matrixSlot.concreteValueType);
                        (outputSlot as DynamicValueMaterialSlot).SetConcreteType(vectorType);
                        break;

                    // As per dynamic vector
                    default:
                        var dynamicVectorType = ConvertDynamicInputTypeToConcrete(dynamicInputSlotsToCompare.Values);
                        (outputSlot as DynamicValueMaterialSlot).SetConcreteType(dynamicVectorType);
                        break;
                    }
                    continue;
                }
            }

            isInError |= inputError;
            s_TempSlots.Clear();
            GetOutputSlots(s_TempSlots);
            isInError |= s_TempSlots.Any(x => x.hasError);
            isInError |= CalculateNodeHasError();
            hasError   = isInError;

            if (!hasError)
            {
                ++version;
            }

            ListPool <DynamicValueMaterialSlot> .Release(skippedDynamicSlots);

            DictionaryPool <DynamicValueMaterialSlot, ConcreteSlotValueType> .Release(dynamicInputSlotsToCompare);
        }
Пример #22
0
        public override void EvaluateDynamicMaterialSlots(List <MaterialSlot> inputSlots, List <MaterialSlot> outputSlots)
        {
            var dynamicInputSlotsToCompare = DictionaryPool <DynamicVectorMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicSlots = ListPool <DynamicVectorMaterialSlot> .Get();

            var dynamicMatrixInputSlotsToCompare = DictionaryPool <DynamicMatrixMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicMatrixSlots = ListPool <DynamicMatrixMaterialSlot> .Get();

            // iterate the input slots
            {
                foreach (var inputSlot in inputSlots)
                {
                    inputSlot.hasError = false;

                    // if there is a connection
                    var edges = owner.GetEdges(inputSlot.slotReference).ToList();
                    if (!edges.Any())
                    {
                        if (inputSlot is DynamicVectorMaterialSlot)
                        {
                            skippedDynamicSlots.Add(inputSlot as DynamicVectorMaterialSlot);
                        }
                        if (inputSlot is DynamicMatrixMaterialSlot)
                        {
                            skippedDynamicMatrixSlots.Add(inputSlot as DynamicMatrixMaterialSlot);
                        }
                        continue;
                    }

                    // get the output details
                    var outputSlotRef = edges[0].outputSlot;
                    var outputNode    = outputSlotRef.node;
                    if (outputNode == null)
                    {
                        continue;
                    }

                    var outputSlot = outputNode.FindOutputSlot <MaterialSlot>(outputSlotRef.slotId);
                    if (outputSlot == null)
                    {
                        continue;
                    }

                    if (outputSlot.hasError)
                    {
                        inputSlot.hasError = true;
                        continue;
                    }

                    var outputConcreteType = outputSlot.concreteValueType;
                    // dynamic input... depends on output from other node.
                    // we need to compare ALL dynamic inputs to make sure they
                    // are compatable.
                    if (inputSlot is DynamicVectorMaterialSlot)
                    {
                        dynamicInputSlotsToCompare.Add((DynamicVectorMaterialSlot)inputSlot, outputConcreteType);
                        continue;
                    }
                    else if (inputSlot is DynamicMatrixMaterialSlot)
                    {
                        dynamicMatrixInputSlotsToCompare.Add((DynamicMatrixMaterialSlot)inputSlot, outputConcreteType);
                        continue;
                    }
                }

                // and now dynamic matrices
                var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicMatrixInputSlotsToCompare.Values);
                foreach (var dynamicKvP in dynamicMatrixInputSlotsToCompare)
                {
                    dynamicKvP.Key.SetConcreteType(dynamicMatrixType);
                }
                foreach (var skippedSlot in skippedDynamicMatrixSlots)
                {
                    skippedSlot.SetConcreteType(dynamicMatrixType);
                }

                // we can now figure out the dynamic slotType
                // from here set all the
                var dynamicType = SlotValueHelper.ConvertMatrixToVectorType(dynamicMatrixType);
                foreach (var dynamicKvP in dynamicInputSlotsToCompare)
                {
                    dynamicKvP.Key.SetConcreteType(dynamicType);
                }
                foreach (var skippedSlot in skippedDynamicSlots)
                {
                    skippedSlot.SetConcreteType(dynamicType);
                }

                bool inputError = inputSlots.Any(x => x.hasError);
                if (inputError)
                {
                    owner.AddConcretizationError(objectId, string.Format("Node {0} had input error", objectId));
                    hasError = true;
                }
                // configure the output slots now
                // their slotType will either be the default output slotType
                // or the above dynanic slotType for dynamic nodes
                // or error if there is an input error
                foreach (var outputSlot in outputSlots)
                {
                    outputSlot.hasError = false;

                    if (inputError)
                    {
                        outputSlot.hasError = true;
                        continue;
                    }

                    if (outputSlot is DynamicVectorMaterialSlot)
                    {
                        (outputSlot as DynamicVectorMaterialSlot).SetConcreteType(dynamicType);
                        continue;
                    }
                    else if (outputSlot is DynamicMatrixMaterialSlot)
                    {
                        (outputSlot as DynamicMatrixMaterialSlot).SetConcreteType(dynamicMatrixType);
                        continue;
                    }
                }

                if (outputSlots.Any(x => x.hasError))
                {
                    owner.AddConcretizationError(objectId, string.Format("Node {0} had output error", objectId));
                    hasError = true;
                }
            }

            CalculateNodeHasError();

            ListPool <DynamicVectorMaterialSlot> .Release(skippedDynamicSlots);

            DictionaryPool <DynamicVectorMaterialSlot, ConcreteSlotValueType> .Release(dynamicInputSlotsToCompare);

            ListPool <DynamicMatrixMaterialSlot> .Release(skippedDynamicMatrixSlots);

            DictionaryPool <DynamicMatrixMaterialSlot, ConcreteSlotValueType> .Release(dynamicMatrixInputSlotsToCompare);
        }
        public override void ValidateNode()
        {
            var isInError    = false;
            var errorMessage = k_validationErrorMessage;

            var dynamicInputSlotsToCompare = DictionaryPool <DynamicVectorMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicSlots = ListPool <DynamicVectorMaterialSlot> .Get();

            var dynamicMatrixInputSlotsToCompare = DictionaryPool <DynamicMatrixMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicMatrixSlots = ListPool <DynamicMatrixMaterialSlot> .Get();

            // iterate the input slots
            s_TempSlots.Clear();
            GetInputSlots(s_TempSlots);
            foreach (var inputSlot in s_TempSlots)
            {
                inputSlot.hasError = false;

                // if there is a connection
                var edges = owner.GetEdges(inputSlot.slotReference).ToList();
                if (!edges.Any())
                {
                    if (inputSlot is DynamicVectorMaterialSlot)
                    {
                        skippedDynamicSlots.Add(inputSlot as DynamicVectorMaterialSlot);
                    }
                    if (inputSlot is DynamicMatrixMaterialSlot)
                    {
                        skippedDynamicMatrixSlots.Add(inputSlot as DynamicMatrixMaterialSlot);
                    }
                    continue;
                }

                // get the output details
                var outputSlotRef = edges[0].outputSlot;
                var outputNode    = owner.GetNodeFromGuid(outputSlotRef.nodeGuid);
                if (outputNode == null)
                {
                    continue;
                }

                var outputSlot = outputNode.FindOutputSlot <MaterialSlot>(outputSlotRef.slotId);
                if (outputSlot == null)
                {
                    continue;
                }

                if (outputSlot.hasError)
                {
                    inputSlot.hasError = true;
                    continue;
                }

                var outputConcreteType = outputSlot.concreteValueType;
                // dynamic input... depends on output from other node.
                // we need to compare ALL dynamic inputs to make sure they
                // are compatable.
                if (inputSlot is DynamicVectorMaterialSlot)
                {
                    dynamicInputSlotsToCompare.Add((DynamicVectorMaterialSlot)inputSlot, outputConcreteType);
                    continue;
                }
                else if (inputSlot is DynamicMatrixMaterialSlot)
                {
                    dynamicMatrixInputSlotsToCompare.Add((DynamicMatrixMaterialSlot)inputSlot, outputConcreteType);
                    continue;
                }
            }

            // and now dynamic matrices
            var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicMatrixInputSlotsToCompare.Values);

            foreach (var dynamicKvP in dynamicMatrixInputSlotsToCompare)
            {
                dynamicKvP.Key.SetConcreteType(dynamicMatrixType);
            }
            foreach (var skippedSlot in skippedDynamicMatrixSlots)
            {
                skippedSlot.SetConcreteType(dynamicMatrixType);
            }

            // we can now figure out the dynamic slotType
            // from here set all the
            var dynamicType = SlotValueHelper.ConvertMatrixToVectorType(dynamicMatrixType);

            foreach (var dynamicKvP in dynamicInputSlotsToCompare)
            {
                dynamicKvP.Key.SetConcreteType(dynamicType);
            }
            foreach (var skippedSlot in skippedDynamicSlots)
            {
                skippedSlot.SetConcreteType(dynamicType);
            }

            s_TempSlots.Clear();
            GetInputSlots(s_TempSlots);
            var inputError = s_TempSlots.Any(x => x.hasError);

            // configure the output slots now
            // their slotType will either be the default output slotType
            // or the above dynanic slotType for dynamic nodes
            // or error if there is an input error
            s_TempSlots.Clear();
            GetOutputSlots(s_TempSlots);
            foreach (var outputSlot in s_TempSlots)
            {
                outputSlot.hasError = false;

                if (inputError)
                {
                    outputSlot.hasError = true;
                    continue;
                }

                if (outputSlot is DynamicVectorMaterialSlot)
                {
                    (outputSlot as DynamicVectorMaterialSlot).SetConcreteType(dynamicType);
                    continue;
                }
                else if (outputSlot is DynamicMatrixMaterialSlot)
                {
                    (outputSlot as DynamicMatrixMaterialSlot).SetConcreteType(dynamicMatrixType);
                    continue;
                }
            }

            isInError |= inputError;
            s_TempSlots.Clear();
            GetOutputSlots(s_TempSlots);
            isInError |= s_TempSlots.Any(x => x.hasError);
            isInError |= CalculateNodeHasError(ref errorMessage);
            isInError |= ValidateConcretePrecision(ref errorMessage);
            hasError   = isInError;

            if (isInError)
            {
                ((GraphData)owner).AddValidationError(tempId, errorMessage);
            }
            else
            {
                ++version;
            }

            ListPool <DynamicVectorMaterialSlot> .Release(skippedDynamicSlots);

            DictionaryPool <DynamicVectorMaterialSlot, ConcreteSlotValueType> .Release(dynamicInputSlotsToCompare);

            ListPool <DynamicMatrixMaterialSlot> .Release(skippedDynamicMatrixSlots);

            DictionaryPool <DynamicMatrixMaterialSlot, ConcreteSlotValueType> .Release(dynamicMatrixInputSlotsToCompare);
        }
        public List <Callback> GenerateDependencyGraph()
        {
            var callbacks     = GetCallbacks();
            var packageLookup = DictionaryPool <string, List <Callback> > .Get();

            var assemblyLookup = DictionaryPool <string, List <Callback> > .Get();

            var classLookup = DictionaryPool <Type, Callback> .Get();

            // First generate our lookups for class, assembly and package.
            foreach (var cb in callbacks)
            {
                classLookup[cb.classType] = cb;

                var assemblyName = cb.classType.Assembly.GetName().Name;
                if (!assemblyLookup.TryGetValue(assemblyName, out var assemblies))
                {
                    assemblies = new List <Callback>();
                    assemblyLookup[assemblyName] = assemblies;
                }
                assemblies.Add(cb);

                var package = cb.packageName;
                if (package != null)
                {
                    if (!packageLookup.TryGetValue(package, out var packages))
                    {
                        packages = new List <Callback>();
                        packageLookup[package] = packages;
                    }
                    packages.Add(cb);
                }
            }

            // Sort the methods so that the output order is deterministic.
            callbacks.Sort();

            // Now connect the dependency graph nodes
            foreach (var dependency in callbacks)
            {
                // Dependency by class
                foreach (var runAfter in dependency.GetCustomAttributes <RunAfterClassAttribute>())
                {
                    // Ignore classes that may not exist in the project
                    if (runAfter.classType == null)
                    {
                        continue;
                    }

                    if (classLookup.TryGetValue(runAfter.classType, out var runAfterMethodInfo))
                    {
                        dependency.AddIncomingConnection(runAfterMethodInfo);
                    }
                }
                foreach (var runBefore in dependency.GetCustomAttributes <RunBeforeClassAttribute>())
                {
                    // Ignore classes that may not exist in the project
                    if (runBefore.classType == null)
                    {
                        continue;
                    }

                    if (classLookup.TryGetValue(runBefore.classType, out var runBeforeMethodInfo))
                    {
                        dependency.AddOutgoingConnection(runBeforeMethodInfo);
                    }
                }

                // Dependency by package
                foreach (var runAfter in dependency.GetCustomAttributes <RunAfterPackageAttribute>())
                {
                    if (packageLookup.TryGetValue(runAfter.packageName, out var runAfterMethodInfos))
                    {
                        dependency.AddIncomingConnections(runAfterMethodInfos);
                    }
                }
                foreach (var runBefore in dependency.GetCustomAttributes <RunBeforePackageAttribute>())
                {
                    if (packageLookup.TryGetValue(runBefore.packageName, out var runBeforeMethodInfos))
                    {
                        dependency.AddOutgoingConnections(runBeforeMethodInfos);
                    }
                }

                // Dependency by Assembly
                foreach (var runAfter in dependency.GetCustomAttributes <RunAfterAssemblyAttribute>())
                {
                    if (assemblyLookup.TryGetValue(runAfter.assemblyName, out var runAfterMethodInfos))
                    {
                        dependency.AddIncomingConnections(runAfterMethodInfos);
                    }
                }
                foreach (var runBefore in dependency.GetCustomAttributes <RunBeforeAssemblyAttribute>())
                {
                    if (assemblyLookup.TryGetValue(runBefore.assemblyName, out var runBeforeMethodInfos))
                    {
                        dependency.AddOutgoingConnections(runBeforeMethodInfos);
                    }
                }
            }

            DictionaryPool <string, List <Callback> > .Release(packageLookup);

            DictionaryPool <string, List <Callback> > .Release(assemblyLookup);

            DictionaryPool <Type, Callback> .Release(classLookup);

            return(callbacks);
        }
Пример #25
0
        private void SettingInventoryFilter()
        {
            Manager.Resources resources = !Singleton <Manager.Resources> .IsInstance() ? (Manager.Resources)null : Singleton <Manager.Resources> .Instance;

            PlayerActor playerActor = !Singleton <Manager.Map> .IsInstance() ? (PlayerActor)null : Singleton <Manager.Map> .Instance.Player;

            if (Object.op_Equality((Object)resources, (Object)null) || Object.op_Equality((Object)playerActor, (Object)null))
            {
                return;
            }
            PetHomePoint.HomeKind kind = this._currentPetHomePoint.Kind;
            Dictionary <int, List <ValueTuple <ItemIDKeyPair, int> > > petItemInfoTable = resources.AnimalTable.PetItemInfoTable;
            int key = (int)kind;

            InventoryFacadeViewer.ItemFilter[] itemFilter1 = (InventoryFacadeViewer.ItemFilter[])null;
            if (!this._itemFilterTable.TryGetValue(key, out itemFilter1))
            {
                List <ValueTuple <ItemIDKeyPair, int> > valueTupleList;
                petItemInfoTable.TryGetValue(key, out valueTupleList);
                if (!((IReadOnlyList <ValueTuple <ItemIDKeyPair, int> >)valueTupleList).IsNullOrEmpty <ValueTuple <ItemIDKeyPair, int> >())
                {
                    Dictionary <int, List <int> > toRelease = DictionaryPool <int, List <int> > .Get();

                    using (List <ValueTuple <ItemIDKeyPair, int> > .Enumerator enumerator = valueTupleList.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            ItemIDKeyPair itemIdKeyPair = (ItemIDKeyPair)enumerator.Current.Item1;
                            List <int>    intList1;
                            if (!toRelease.TryGetValue(itemIdKeyPair.categoryID, out intList1) || intList1 == null)
                            {
                                List <int> intList2 = ListPool <int> .Get();

                                toRelease[itemIdKeyPair.categoryID] = intList2;
                                intList1 = intList2;
                            }
                            intList1.Add(itemIdKeyPair.itemID);
                        }
                    }
                    InventoryFacadeViewer.ItemFilter[] itemFilter2 = new InventoryFacadeViewer.ItemFilter[toRelease.Count];
                    int index1 = 0;
                    foreach (KeyValuePair <int, List <int> > keyValuePair in toRelease)
                    {
                        int[] IDs = new int[keyValuePair.Value.Count];
                        for (int index2 = 0; index2 < IDs.Length; ++index2)
                        {
                            IDs[index2] = keyValuePair.Value[index2];
                        }
                        itemFilter2[index1] = new InventoryFacadeViewer.ItemFilter(keyValuePair.Key, IDs);
                        ++index1;
                    }
                    List <int> list = toRelease.Keys.ToList <int>();
                    for (int index2 = 0; index2 < list.Count; ++index2)
                    {
                        ListPool <int> .Release(toRelease[list[index2]]);
                    }
                    DictionaryPool <int, List <int> > .Release(toRelease);

                    this._itemFilterTable[key] = itemFilter2;
                    this._inventoryUI.SetItemFilter(itemFilter2);
                }
                else
                {
                    this._itemFilterTable[key] = this._emptyFilter;
                    this._inventoryUI.SetItemFilter(this._emptyFilter);
                }
            }
            else
            {
                this._inventoryUI.SetItemFilter(itemFilter1);
            }
        }
Пример #26
0
        private void HandleDirectionMove(Direction scanDirection, Vector2Int negativeEndPosition, Vector2Int positiveEndPosition, Stack <Command> tickCommands, bool canBounce)
        {
            var scanDisplacement = DirectionUtils.DirectionToDisplacement(scanDirection);

            var impactBlocks = DictionaryPool <Block, int> .Get();

            for (var position = negativeEndPosition + scanDisplacement; position != positiveEndPosition; position += scanDisplacement)
            {
                var blocks = m_logicGameManager.Map[position.x, position.y];
                foreach (var block in blocks)
                {
                    if (!HasAttribute(block, AttributeCategory.Move) || !DirectionUtils.IsParallel(scanDirection, block.direction))
                    {
                        continue;
                    }
                    var impactDirection    = 1;
                    var impactDisplacement = scanDisplacement;
                    if (block.direction != scanDirection)
                    {
                        impactDirection    = 2;
                        impactDisplacement = Vector2Int.zero - scanDisplacement;
                    }
                    impactBlocks[block] = impactBlocks.GetOrDefault(block, 0) | impactDirection;
                    if (HasAttribute(block, AttributeCategory.Push))
                    {
                        for (var pushPosition = position + impactDisplacement; m_logicGameManager.InMap(pushPosition); pushPosition += impactDisplacement)
                        {
                            var pushBlocks = m_logicGameManager.Map[pushPosition.x, pushPosition.y];
                            var hasPush    = false;
                            foreach (var pushBlock in pushBlocks)
                            {
                                if (HasAttribute(pushBlock, AttributeCategory.Push))
                                {
                                    impactBlocks[pushBlock] = impactBlocks.GetOrDefault(pushBlock, 0) | impactDirection;
                                    hasPush = true;
                                }
                            }
                            if (!hasPush)
                            {
                                break;
                            }
                        }
                    }
                    if (HasAttribute(block, AttributeCategory.Pull))
                    {
                        for (var pullPosition = position - impactDisplacement; m_logicGameManager.InMap(pullPosition); pullPosition -= impactDisplacement)
                        {
                            var pullBlocks = m_logicGameManager.Map[pullPosition.x, pullPosition.y];
                            var hasPull    = false;
                            foreach (var pullBlock in pullBlocks)
                            {
                                if (HasAttribute(pullBlock, AttributeCategory.Pull))
                                {
                                    impactBlocks[pullBlock] = impactBlocks.GetOrDefault(pullBlock, 0) | impactDirection;
                                    hasPull = true;
                                }
                            }
                            if (!hasPull)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            for (var position = positiveEndPosition - scanDisplacement; position != negativeEndPosition; position -= scanDisplacement)
            {
                var blocks = m_logicGameManager.Map[position.x, position.y];
                foreach (var block in blocks)
                {
                    if (impactBlocks.GetOrDefault(block, 0) == 3)
                    {
                        impactBlocks[block] = 0;
                    }
                }
            }

            HandlePreMove(impactBlocks, scanDisplacement, tickCommands);

            {
                var stopPosition = positiveEndPosition - scanDisplacement;
                {
                    var blocks = m_logicGameManager.Map[stopPosition.x, stopPosition.y];
                    foreach (var block in blocks)
                    {
                        var impact = 0;
                        if (impactBlocks.TryGetValue(block, out impact))
                        {
                            impactBlocks[block] &= ~1;
                        }
                    }
                }
            }
            {
                var stopPosition = negativeEndPosition + scanDisplacement;
                {
                    var blocks = m_logicGameManager.Map[stopPosition.x, stopPosition.y];
                    foreach (var block in blocks)
                    {
                        var impact = 0;
                        if (impactBlocks.TryGetValue(block, out impact))
                        {
                            impactBlocks[block] &= ~2;
                        }
                    }
                }
            }
            for (var position = positiveEndPosition - scanDisplacement; position != negativeEndPosition + scanDisplacement; position -= scanDisplacement)
            {
                var hasStop = false;
                {
                    var blocks = m_logicGameManager.Map[position.x, position.y];
                    foreach (var block in blocks)
                    {
                        if (HasAttribute(block, AttributeCategory.Stop) || HasAttribute(block, AttributeCategory.Pull) || HasAttribute(block, AttributeCategory.Push))
                        {
                            if (impactBlocks.GetOrDefault(block, 0) != 1)
                            {
                                hasStop = true;
                                break;
                            }
                        }
                    }
                }
                if (hasStop)
                {
                    var stopPosition = position - scanDisplacement;
                    {
                        var blocks = m_logicGameManager.Map[stopPosition.x, stopPosition.y];
                        foreach (var block in blocks)
                        {
                            var impact = 0;
                            if (impactBlocks.TryGetValue(block, out impact))
                            {
                                impactBlocks[block] &= ~1;
                            }
                        }
                    }
                }
            }
            for (var position = negativeEndPosition + scanDisplacement; position != positiveEndPosition - scanDisplacement; position += scanDisplacement)
            {
                var hasStop = false;
                {
                    var blocks = m_logicGameManager.Map[position.x, position.y];
                    foreach (var block in blocks)
                    {
                        if (HasAttribute(block, AttributeCategory.Stop) || HasAttribute(block, AttributeCategory.Pull) || HasAttribute(block, AttributeCategory.Push))
                        {
                            if (impactBlocks.GetOrDefault(block, 0) != 2)
                            {
                                hasStop = true;
                                break;
                            }
                        }
                    }
                }
                if (hasStop)
                {
                    var stopPosition = position + scanDisplacement;
                    {
                        var blocks = m_logicGameManager.Map[stopPosition.x, stopPosition.y];
                        foreach (var block in blocks)
                        {
                            var impact = 0;
                            if (impactBlocks.TryGetValue(block, out impact))
                            {
                                impactBlocks[block] &= ~2;
                            }
                        }
                    }
                }
            }

            foreach (var impactBlockPair in impactBlocks)
            {
                var block  = impactBlockPair.Key;
                var impact = impactBlockPair.Value;

                if (canBounce)
                {
                    if (HasAttribute(block, AttributeCategory.Move) && impact == 0)
                    {
                        block.direction = DirectionUtils.GetOppositeDirection(block.direction);
                    }
                }
                else
                {
                    if (impact == 1)
                    {
                        PerformMoveBlockCommand(block, scanDirection, 1, tickCommands);
                    }
                    else if (impact == 2)
                    {
                        PerformMoveBlockCommand(block, DirectionUtils.GetOppositeDirection(scanDirection), 1, tickCommands);
                    }
                }
            }

            DictionaryPool <Block, int> .Release(impactBlocks);
        }
Пример #27
0
    /// <summary>
    /// Runs distribution algorithm on input.
    /// </summary>
    /// <param name="input"></param>
    /// <param name="output"></param>
    /// <param name="available">The amount you want to distribute</param>
    /// <returns>The overflow</returns>
    public static float ReqDistribute(List <DistributionInput> input, List <DistributionResult> output, float available)
    {
        List <TObject> tmp = ListPool <TObject> .Get();

        List <TObject> objs = ListPool <TObject> .Get();

        Dictionary <TObject, float> distributed = DictionaryPool <TObject, float> .Get();

        Dictionary <TObject, float> requested = DictionaryPool <TObject, float> .Get();

        float availablePrev = -available;

        // Parse
        foreach (var inp in input)
        {
            if (Mathf.Approximately(inp.requestedAmount, 0))
            {
                continue;
            }

            distributed.Add(inp.obj, 0);
            requested.Add(inp.obj, inp.requestedAmount);
            objs.Add(inp.obj);
        }

        int panic = 0;

        while (available > 0 && !Mathf.Approximately(available, availablePrev) && requested.Count > 0)
        {
            availablePrev = available;
            float perInput = available / (float)requested.Count;

            foreach (var obj in objs)
            {
                float alreadyDistributed = distributed[obj];
                float stillRequested     = requested[obj];

                float distributing = Mathf.Min(stillRequested, perInput);
                distributed[obj] += distributing;
                requested[obj]   -= distributing;
                available        -= distributing;

                if (Mathf.Approximately(requested[obj], 0))
                {
                    tmp.Add(obj);
                }
            }

            foreach (var obj in tmp)
            {
                objs.Remove(obj);
                requested.Remove(obj);
            }
            tmp.Clear();

            panic++;
            if (panic > 1000)
            {
                Debug.LogError("Distribution alrogithm triggered panic exit!");
                return(available);
            }
        }

        // Write back
        foreach (var kvp in distributed)
        {
            output.Add(new DistributionResult()
            {
                amount = kvp.Value,
                obj    = kvp.Key
            });
        }

        DictionaryPool <TObject, float> .Return(distributed);

        DictionaryPool <TObject, float> .Return(requested);

        ListPool <TObject> .Return(tmp);

        ListPool <TObject> .Return(objs);

        return(available);
    }
Пример #28
0
        public void RegisterReplacementsForNames(params string[] origNames)
        {
            var needsTranslation = ListPool <string> .Get();

            try
            {
                needsTranslation.Capacity = origNames.Length;

                var fastReplacements = DictionaryPool <string, string> .Get();

                try
                {
                    foreach (var origString in origNames)
                    {
                        if (TranslationHelper.TryTranslateName(NameScope.DefaultNameScope, origString,
                                                               out var translatedString))
                        {
                            //fastReplacements[origString] = origString;
                            fastReplacements[translatedString] = translatedString;
                        }
                        else
                        {
                            needsTranslation.Add(origString);
                        }
                    }

                    if (fastReplacements.Count > 0)
                    {
                        RegisterReplacementStrings(fastReplacements);
                    }
                }
                finally
                {
                    DictionaryPool <string, string> .Release(fastReplacements);
                }

                foreach (var toTranslate in needsTranslation)
                {
                    void ResultHandler(ITranslationResult result)
                    {
                        var replacements = DictionaryPool <string, string> .Get();

                        try
                        {
                            if (!TranslationHelper.NameNeedsTranslation(toTranslate, NameScope.DefaultNameScope))
                            {
                                replacements[toTranslate] = toTranslate;
                            }

                            if (result.Succeeded)
                            {
                                replacements[result.TranslatedText] = result.TranslatedText;
                            }

                            RegisterReplacementStrings(replacements);
                        }
                        finally
                        {
                            DictionaryPool <string, string> .Release(replacements);
                        }
                    }

                    GeBoAPI.Instance.AutoTranslationHelper.TranslateAsync(toTranslate,
                                                                          NameScope.DefaultNameScope.TranslationScope, ResultHandler);
                }
            }
            finally
            {
                ListPool <string> .Release(needsTranslation);
            }
        }
Пример #29
0
        public virtual void ValidateNode()
        {
            var isInError = false;

            // all children nodes needs to be updated first
            // so do that here
            var slots = ListPool <MaterialSlot> .Get();

            GetInputSlots(slots);
            foreach (var inputSlot in slots)
            {
                inputSlot.hasError = false;

                var edges = owner.GetEdges(inputSlot.slotReference);
                foreach (var edge in edges)
                {
                    var fromSocketRef = edge.outputSlot;
                    var outputNode    = owner.GetNodeFromGuid(fromSocketRef.nodeGuid);
                    if (outputNode == null)
                    {
                        continue;
                    }

                    outputNode.ValidateNode();
                    if (outputNode.hasError)
                    {
                        isInError = true;
                    }
                }
            }
            ListPool <MaterialSlot> .Release(slots);

            var dynamicInputSlotsToCompare = DictionaryPool <DynamicVectorMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicSlots = ListPool <DynamicVectorMaterialSlot> .Get();

            var dynamicMatrixInputSlotsToCompare = DictionaryPool <DynamicMatrixMaterialSlot, ConcreteSlotValueType> .Get();

            var skippedDynamicMatrixSlots = ListPool <DynamicMatrixMaterialSlot> .Get();

            // iterate the input slots
            s_TempSlots.Clear();
            GetInputSlots(s_TempSlots);
            foreach (var inputSlot in s_TempSlots)
            {
                // if there is a connection
                var edges = owner.GetEdges(inputSlot.slotReference).ToList();
                if (!edges.Any())
                {
                    if (inputSlot is DynamicVectorMaterialSlot)
                    {
                        skippedDynamicSlots.Add(inputSlot as DynamicVectorMaterialSlot);
                    }
                    if (inputSlot is DynamicMatrixMaterialSlot)
                    {
                        skippedDynamicMatrixSlots.Add(inputSlot as DynamicMatrixMaterialSlot);
                    }
                    continue;
                }

                // get the output details
                var outputSlotRef = edges[0].outputSlot;
                var outputNode    = owner.GetNodeFromGuid(outputSlotRef.nodeGuid);
                if (outputNode == null)
                {
                    continue;
                }

                var outputSlot = outputNode.FindOutputSlot <MaterialSlot>(outputSlotRef.slotId);
                if (outputSlot == null)
                {
                    continue;
                }

                if (outputSlot.hasError)
                {
                    inputSlot.hasError = true;
                    continue;
                }

                var outputConcreteType = outputSlot.concreteValueType;
                // dynamic input... depends on output from other node.
                // we need to compare ALL dynamic inputs to make sure they
                // are compatable.
                if (inputSlot is DynamicVectorMaterialSlot)
                {
                    dynamicInputSlotsToCompare.Add((DynamicVectorMaterialSlot)inputSlot, outputConcreteType);
                    continue;
                }
                else if (inputSlot is DynamicMatrixMaterialSlot)
                {
                    dynamicMatrixInputSlotsToCompare.Add((DynamicMatrixMaterialSlot)inputSlot, outputConcreteType);
                    continue;
                }

                // if we have a standard connection... just check the types work!
                if (!ImplicitConversionExists(outputConcreteType, inputSlot.concreteValueType))
                {
                    inputSlot.hasError = true;
                }
            }

            // we can now figure out the dynamic slotType
            // from here set all the
            var dynamicType = ConvertDynamicInputTypeToConcrete(dynamicInputSlotsToCompare.Values);

            foreach (var dynamicKvP in dynamicInputSlotsToCompare)
            {
                dynamicKvP.Key.SetConcreteType(dynamicType);
            }
            foreach (var skippedSlot in skippedDynamicSlots)
            {
                skippedSlot.SetConcreteType(dynamicType);
            }

            // and now dynamic matrices
            var dynamicMatrixType = ConvertDynamicMatrixInputTypeToConcrete(dynamicMatrixInputSlotsToCompare.Values);

            foreach (var dynamicKvP in dynamicMatrixInputSlotsToCompare)
            {
                dynamicKvP.Key.SetConcreteType(dynamicMatrixType);
            }
            foreach (var skippedSlot in skippedDynamicMatrixSlots)
            {
                skippedSlot.SetConcreteType(dynamicMatrixType);
            }

            s_TempSlots.Clear();
            GetInputSlots(s_TempSlots);
            var inputError = s_TempSlots.Any(x => x.hasError);

            // configure the output slots now
            // their slotType will either be the default output slotType
            // or the above dynanic slotType for dynamic nodes
            // or error if there is an input error
            s_TempSlots.Clear();
            GetOutputSlots(s_TempSlots);
            foreach (var outputSlot in s_TempSlots)
            {
                outputSlot.hasError = false;

                if (inputError)
                {
                    outputSlot.hasError = true;
                    continue;
                }

                if (outputSlot is DynamicVectorMaterialSlot)
                {
                    (outputSlot as DynamicVectorMaterialSlot).SetConcreteType(dynamicType);
                    continue;
                }
                else if (outputSlot is DynamicMatrixMaterialSlot)
                {
                    (outputSlot as DynamicMatrixMaterialSlot).SetConcreteType(dynamicMatrixType);
                    continue;
                }
            }

            isInError |= inputError;
            s_TempSlots.Clear();
            GetOutputSlots(s_TempSlots);
            isInError |= s_TempSlots.Any(x => x.hasError);
            isInError |= CalculateNodeHasError();
            hasError   = isInError;

            if (!hasError)
            {
                ++version;
            }

            ListPool <DynamicVectorMaterialSlot> .Release(skippedDynamicSlots);

            DictionaryPool <DynamicVectorMaterialSlot, ConcreteSlotValueType> .Release(dynamicInputSlotsToCompare);

            ListPool <DynamicMatrixMaterialSlot> .Release(skippedDynamicMatrixSlots);

            DictionaryPool <DynamicMatrixMaterialSlot, ConcreteSlotValueType> .Release(dynamicMatrixInputSlotsToCompare);
        }
Пример #30
0
        private void HandleDirectionYou(Direction moveDirection, Vector2Int negativeEndPosition, Vector2Int positiveEndPosition, Stack <Command> tickCommands)
        {
            var displacement = DirectionUtils.DirectionToDisplacement(moveDirection);

            var impactBlocks = DictionaryPool <Block, int> .Get();

            for (var position = negativeEndPosition + displacement; position != positiveEndPosition; position += displacement)
            {
                var hasYou = false;
                {
                    var blocks = m_logicGameManager.Map[position.x, position.y];
                    foreach (var block in blocks)
                    {
                        if (HasAttribute(block, AttributeCategory.You))
                        {
                            impactBlocks[block] = impactBlocks.GetOrDefault(block, 0) | 1;
                            hasYou = true;
                        }
                    }
                }
                if (hasYou)
                {
                    for (var pullPosition = position - displacement; m_logicGameManager.InMap(pullPosition); pullPosition -= displacement)
                    {
                        var blocks  = m_logicGameManager.Map[pullPosition.x, pullPosition.y];
                        var hasPull = false;
                        foreach (var block in blocks)
                        {
                            if (HasAttribute(block, AttributeCategory.Pull))
                            {
                                impactBlocks[block] = impactBlocks.GetOrDefault(block, 0) | 1;
                                hasPull             = true;
                            }
                        }
                        if (!hasPull)
                        {
                            break;
                        }
                    }
                    for (var pushPosition = position + displacement; m_logicGameManager.InMap(pushPosition); pushPosition += displacement)
                    {
                        var blocks  = m_logicGameManager.Map[pushPosition.x, pushPosition.y];
                        var hasPush = false;
                        foreach (var block in blocks)
                        {
                            if (HasAttribute(block, AttributeCategory.Push))
                            {
                                impactBlocks[block] = impactBlocks.GetOrDefault(block, 0) | 1;
                                hasPush             = true;
                            }
                        }
                        if (!hasPush)
                        {
                            break;
                        }
                    }
                }
            }

            HandlePreMove(impactBlocks, displacement, tickCommands);

            {
                var stopPosition = positiveEndPosition - displacement;
                {
                    var blocks = m_logicGameManager.Map[stopPosition.x, stopPosition.y];
                    foreach (var block in blocks)
                    {
                        var impact = 0;
                        if (impactBlocks.TryGetValue(block, out impact))
                        {
                            impactBlocks[block] = 0;
                        }
                    }
                }
            }
            for (var position = positiveEndPosition - displacement; position != negativeEndPosition + displacement; position -= displacement)
            {
                var hasStop = false;
                {
                    var blocks = m_logicGameManager.Map[position.x, position.y];
                    foreach (var block in blocks)
                    {
                        if (HasAttribute(block, AttributeCategory.Stop) || HasAttribute(block, AttributeCategory.Pull) || HasAttribute(block, AttributeCategory.Push))
                        {
                            if (impactBlocks.GetOrDefault(block, 0) == 0)
                            {
                                hasStop = true;
                                break;
                            }
                        }
                    }
                }
                if (hasStop)
                {
                    var stopPosition = position - displacement;
                    {
                        var blocks = m_logicGameManager.Map[stopPosition.x, stopPosition.y];
                        foreach (var block in blocks)
                        {
                            var impact = 0;
                            if (impactBlocks.TryGetValue(block, out impact))
                            {
                                impactBlocks[block] = 0;
                            }
                        }
                    }
                }
            }

            foreach (var impactBlockPair in impactBlocks)
            {
                var block  = impactBlockPair.Key;
                var impact = impactBlockPair.Value;

                if (impact == 1)
                {
                    PerformMoveBlockCommand(block, moveDirection, 1, tickCommands);
                }
            }

            DictionaryPool <Block, int> .Release(impactBlocks);
        }