예제 #1
0
        public object Desirialize(int offset, DynamicBuffer buffer, Dictionary <int, object> referenceMaping)
        {
            short position = (short)offset == 0 ?
                             (short)0 : BitConverter.ToInt16(buffer.CurrentBuffer, offset);

            if (position == -1)
            {
                return(null);
            }
            object entity;

            if (referenceMaping.TryGetValue(position, out entity))
            {
                return(entity);
            }
            else
            {
                entity = FormatterServices.GetSafeUninitializedObject(typeInfo.Type);
            }
            referenceMaping.Add(position, entity);

            ObjectFlag flag = (ObjectFlag)buffer.CurrentBuffer[offset];

            position++;

            foreach (var member in typeInfo.Fields)
            {
                var    memberTypeInfo = TypeInfo.instanse(member.FieldType);
                object innerObject    = memberTypeInfo.Resolver.Desirialize(position, buffer, referenceMaping);
                entity    = typeInfo.SetValue(entity, innerObject, member);
                position += (short)memberTypeInfo.SizeInBuffer;
            }
            return(entity);
        }
        private static void RemoveOldest(Dictionary <string, CacheMemento> cache, ObjectFlag flag)
        {
            DateTime oldestEntry = cache.Values.Select(t => t.Added).Min();
            string   oldestId    = cache.Where(kvp => kvp.Value.Added == oldestEntry).Select(kvp => kvp.Key).First();

            cache.Remove(oldestId);
        }
예제 #3
0
 private static void ClearPreviousTransients(this HttpSessionStateBase session, INakedObject nakedObject, ObjectFlag flag) {
     if (nakedObject.Oid.HasPrevious) {
         if (nakedObject.Oid.Previous.IsTransient) {
             session.GetCache(flag).Remove(FrameworkHelper.GetObjectId(nakedObject.Oid.Previous));
         }
     }
 }
        public static void ClearCachedObjects(this HttpSessionStateBase session, ObjectFlag flag = ObjectFlag.None)
        {
            Dictionary <string, CacheMemento> cache = session.GetCache(flag);
            List <string> toRemove = cache.Select(kvp => kvp.Key).ToList();

            toRemove.ForEach(k => cache.Remove(k));
        }
예제 #5
0
        public static void AddOrUpdateInCache(this HttpSessionStateBase session, INakedObject nakedObject, string url, ObjectFlag flag = ObjectFlag.None) {
            // only add transients if we are storing transients in the session 

            if ((!nakedObject.ResolveState.IsTransient() || MvcIdentityAdapterHashMap.StoringTransientsInSession) || nakedObject.Specification.IsCollection) {
                session.ClearPreviousTransients(nakedObject, flag);
                session.GetCache(flag).AddOrUpdateInCache(nakedObject, url, flag);
            }
        }
예제 #6
0
 public ObjectDef(string line) : base(line)
 {
     Id                    = GetInt(0);
     ModelName             = GetString(1);
     TextureDictionaryName = GetString(2);
     DrawDist              = GetSingle(3);
     Flags                 = (ObjectFlag)GetInt(4);
 }
예제 #7
0
 public ObjectDef(string line)
     : base(line)
 {
     Id = GetInt(0);
     ModelName = GetString(1);
     TextureDictionaryName = GetString(2);
     DrawDist = GetSingle(3);
     Flags = (ObjectFlag) GetInt(4);
 }
예제 #8
0
        public ObjectDefinition(String model, String txd, float drawDist, ObjectFlag flags)
        {
            ModelName       = model;
            TextureDictName = txd;
            DrawDist        = drawDist;
            DrawDist2       = DrawDist * DrawDist;
            Flags           = flags;

            ModelRequested = false;
        }
예제 #9
0
        public ObjectDefinition( String model, String txd, float drawDist, ObjectFlag flags )
        {
            ModelName = model;
            TextureDictName = txd;
            DrawDist = drawDist;
            DrawDist2 = DrawDist * DrawDist;
            Flags = flags;

            ModelRequested = false;
        }
예제 #10
0
 /// <summary>
 /// Set or clear <paramref name="flag"/> in <see cref="ObjectFlags"/>.
 /// </summary>
 /// <param name="flag">The flag to set or clear.</param>
 /// <param name="set">True to set, false to clear.</param>
 public void SetFlag(ObjectFlag flag, bool set)
 {
     if (set)
     {
         AddFlag(flag);
     }
     else
     {
         ClearFlag(flag);
     }
 }
        public new object Desirialize(int offset, DynamicBuffer buffer, Dictionary <int, object> referenceMaping)
        {
            short position = (short)offset == 0 ?
                             (short)0 : BitConverter.ToInt16(buffer.CurrentBuffer, offset);

            int positionInBuffer = 0;

            ObjectFlag flag = (ObjectFlag)buffer.CurrentBuffer[offset];

            positionInBuffer++;

            bool isHasValue = BitConverter.ToBoolean(buffer.CurrentBuffer, position + positionInBuffer);

            positionInBuffer++;

            if (isHasValue)
            {
                return(memberTypeInfo.Resolver.Desirialize(position + positionInBuffer, buffer, referenceMaping));
            }
            return(null);
        }
예제 #12
0
 public static void ClearDestroyedObjectsOfType(this HttpSessionStateBase session, INakedObjectSpecification spec, ObjectFlag flag = ObjectFlag.None) {
     Dictionary<string, CacheMemento> cache = session.GetCache(flag);
     List<string> toRemove = cache.Where(cm => cm.Value.Spec.IsOfType(spec)).Select(kvp => new { kvp.Key, no = SafeGetNakedObjectFromId(kvp.Key) }).Where(ao => ao.no.ResolveState.IsDestroyed()).Select(ao => ao.Key).ToList();
     toRemove.ForEach(k => cache.Remove(k));
 }
예제 #13
0
 private static Dictionary<string, CacheMemento> GetCache(this HttpSessionStateBase session, ObjectFlag flag) {
     var objs = (Dictionary<string, CacheMemento>)session[Bucket[(int)flag]];
     if (objs == null) {
         objs = new Dictionary<string, CacheMemento>();
         session.Add(Bucket[(int) flag], objs);
     }
     return objs;
 }
예제 #14
0
 public static IEnumerable<string> AllCachedUrls(this HttpSessionStateBase session, ObjectFlag flag = ObjectFlag.None) {
     return session.GetCache(flag).OrderBy(kvp => kvp.Value.Added).Where(kvp => kvp.Value.Url != null).Select(kvp => kvp.Value.Url);
 }
예제 #15
0
 private static IEnumerable<INakedObject> GetAndTidyCachedNakedObjectsOfType(this HttpSessionStateBase session, INakedObjectSpecification spec, ObjectFlag flag) {
     session.ClearDestroyedObjectsOfType(spec, flag);
     return session.GetCache(flag).Where(cm => cm.Value.Spec.IsOfType(spec)).OrderBy(kvp => kvp.Value.Added).Select(kvp => FrameworkHelper.GetNakedObjectFromId(kvp.Key));
 }
예제 #16
0
 public bool HasFlags( ObjectFlag flag )
 {
     return ( Flags & flag ) == flag;
 }
예제 #17
0
        public static object LastObject(this HttpSessionStateBase session, ObjectFlag flag = ObjectFlag.None) {
            KeyValuePair<string, CacheMemento> lastEntry = session.GetCache(flag).OrderBy(kvp => kvp.Value.Added).LastOrDefault();

            if (lastEntry.Equals(default(KeyValuePair<string, CacheMemento>))) {
                return null;
            }

            INakedObject lastObject = SafeGetNakedObjectFromId(lastEntry.Key);

            if (lastObject.ResolveState.IsDestroyed()) {
                session.GetCache(flag).Remove(lastEntry.Key);
                return session.LastObject(flag);
            }

            return lastObject.Object;
        }
 public static void AddToCache(this HttpSessionStateBase session, IFrameworkFacade facade, IObjectFacade nakedObject, ObjectFlag flag = ObjectFlag.None)
 {
     session.AddToCache(facade, nakedObject, null, flag);
 }
예제 #19
0
 public static void RemoveOthersFromCache(this HttpSessionStateBase session, object domainObject, ObjectFlag flag = ObjectFlag.None) {
     INakedObject nakedObject = FrameworkHelper.GetNakedObject(domainObject);
     session.RemoveOthersFromCache(nakedObject, flag);
 }
 internal static IEnumerable <object> AllCachedObjects(this HttpSessionStateBase session, IFrameworkFacade facade, ObjectFlag flag = ObjectFlag.None)
 {
     return(session.GetAndTidyCachedNakedObjects(facade, flag).Where(no => !no.IsDestroyed).Select(no => no.GetDomainObject()));
 }
        public static void AddToCache(this HttpSessionStateBase session, IFrameworkFacade facade, object domainObject, ObjectFlag flag = ObjectFlag.None)
        {
            var nakedObject = facade.GetObject(domainObject);

            session.AddToCache(facade, nakedObject, flag);
        }
        private static void AddToCache(this Dictionary <string, CacheMemento> cache, IFrameworkFacade facade, IObjectFacade nakedObject, string url, ObjectFlag flag)
        {
            var loid = facade.OidTranslator.GetOidTranslation(nakedObject);

            string objectId = loid == null ? "" : loid.Encode();

            cache[objectId] = new CacheMemento {
                Added = DateTime.Now, Spec = nakedObject.Specification.FullName, Url = url
            };
            while (cache.Count > CacheSize)
            {
                RemoveOldest(cache, flag);
            }
        }
        private static void AddOrUpdateInCache(this Dictionary <string, CacheMemento> cache, IFrameworkFacade facade, IObjectFacade nakedObject, string url, ObjectFlag flag)
        {
            string objectId = facade.OidTranslator.GetOidTranslation(nakedObject).Encode();

            if (cache.ContainsKey(objectId))
            {
                cache[objectId].Spec = nakedObject.Specification.FullName;
                cache[objectId].Url  = url;
            }
            else
            {
                cache[objectId] = new CacheMemento {
                    Added = DateTime.Now, Spec = nakedObject.Specification.FullName, Url = url
                };
                while (cache.Count > CacheSize)
                {
                    RemoveOldest(cache, flag);
                }
            }
        }
        private static Dictionary <string, CacheMemento> GetCache(this HttpSessionStateBase session, ObjectFlag flag)
        {
            var objs = (Dictionary <string, CacheMemento>)session[Bucket[(int)flag]];

            if (objs == null)
            {
                objs = new Dictionary <string, CacheMemento>();
                session.Add(Bucket[(int)flag], objs);
            }
            return(objs);
        }
 public static IEnumerable <string> AllCachedUrls(this HttpSessionStateBase session, ObjectFlag flag = ObjectFlag.None)
 {
     return(session.GetCache(flag).OrderBy(kvp => kvp.Value.Added).Where(kvp => kvp.Value.Url != null).Select(kvp => kvp.Value.Url));
 }
        public static void AddOrUpdateInCache(this HttpSessionStateBase session, IFrameworkFacade facade, IObjectFacade nakedObject, string url, ObjectFlag flag = ObjectFlag.None)
        {
            // only add transients if we are storing transients in the session

            if (!nakedObject.IsTransient || nakedObject.Specification.IsCollection)
            {
                //session.ClearPreviousTransients(nakedObject, flag);
                session.GetCache(flag).AddOrUpdateInCache(facade, nakedObject, url, flag);
            }
        }
 public static IEnumerable <object> CachedObjectsOfType(this HttpSessionStateBase session, IFrameworkFacade facade, ITypeFacade spec, ObjectFlag flag = ObjectFlag.None)
 {
     return(session.GetAndTidyCachedNakedObjectsOfType(facade, spec, flag).Select(no => no.GetDomainObject()));
 }
        public static void RemoveOthersFromCache(this HttpSessionStateBase session, IFrameworkFacade facade, object domainObject, ObjectFlag flag = ObjectFlag.None)
        {
            var nakedObject = GetNakedObject(facade, domainObject);

            session.RemoveOthersFromCache(facade, nakedObject, flag);
        }
 private static IEnumerable <IObjectFacade> GetAndTidyCachedNakedObjectsOfType(this HttpSessionStateBase session, IFrameworkFacade facade, ITypeFacade spec, ObjectFlag flag)
 {
     session.ClearDestroyedObjectsOfType(facade, spec, flag);
     return(session.GetCache(flag).Where(cm => SameSpec(cm.Value.Spec, spec, facade)).OrderBy(kvp => kvp.Value.Added).Select(kvp => GetNakedObjectFromId(facade, kvp.Key)));
 }
예제 #30
0
    public void RenderOccludedObject(IGameViewport viewport, GameObject obj)
    {
        mTotalLastFrame++;

        var type  = obj.type;
        var flags = obj.GetFlags();

        // Dont render destroyed or disabled objects
        const ObjectFlag dontDrawFlags = ObjectFlag.OFF | ObjectFlag.DESTROYED | ObjectFlag.DONTDRAW;

        if ((flags & dontDrawFlags) != 0)
        {
            return;
        }

        if (flags.HasFlag(ObjectFlag.INVISIBLE) || flags.HasFlag(ObjectFlag.INVENTORY))
        {
            return;
        }

        switch (type)
        {
        case ObjectType.scenery:
        case ObjectType.trap:
            return;

        case ObjectType.pc:
        case ObjectType.npc:
            if (GameSystems.Critter.IsConcealed(obj))
            {
                return;
            }

            break;

        default:
            break;
        }

        // Dont draw secret doors that haven't been found yet
        var secretDoorFlags = obj.GetSecretDoorFlags();

        if (secretDoorFlags.HasFlag(SecretDoorFlag.SECRET_DOOR))
        {
            var found = ((secretDoorFlags & SecretDoorFlag.SECRET_DOOR_FOUND) != 0);
            if (!found && type != ObjectType.portal)
            {
                return;
            }
        }

        var animatedModel = obj.GetOrCreateAnimHandle();

        var animParams = obj.GetAnimParams();

        locXY worldLoc;

        GameObject parent = null;

        if (type.IsEquipment())
        {
            parent = GameSystems.Item.GetParent(obj);
        }

        var alpha = GetAlpha(obj);

        if (parent != null)
        {
            var parentAlpha = GetAlpha(parent);
            alpha = (alpha + parentAlpha) / 2;

            worldLoc = parent.GetLocation();
        }
        else
        {
            worldLoc = obj.GetLocation();
        }

        if (alpha == 0)
        {
            return;
        }

        // Handle fog occlusion of the world position, but handle it differently for portals
        if (type != ObjectType.portal)
        {
            var fogStatus = GameSystems.MapFogging.GetFogStatus(worldLoc, animParams.offsetX, animParams.offsetY);
            if ((fogStatus & 0xB0) == 0 || (fogStatus & 1) == 0)
            {
                return;
            }
        }
        else
        {
            LocAndOffsets loc;
            loc.location = worldLoc;
            loc.off_x    = animParams.offsetX - locXY.INCH_PER_SUBTILE;
            loc.off_y    = animParams.offsetY - locXY.INCH_PER_SUBTILE;
            loc.Normalize();

            var fogStatus = GameSystems.MapFogging.GetFogStatus(loc.location, loc.off_x, loc.off_y);
            if ((fogStatus & 0xB0) == 0 || (fogStatus & 1) == 0)
            {
                return;
            }
        }

        LocAndOffsets worldPosFull;

        worldPosFull.off_x    = animParams.offsetX;
        worldPosFull.off_y    = animParams.offsetY;
        worldPosFull.location = worldLoc;

        var radius       = obj.GetRadius();
        var renderHeight = obj.GetRenderHeight(true);

        if (!IsObjectOnScreen(viewport.Camera, worldPosFull, animParams.offsetZ, radius, renderHeight))
        {
            return;
        }

        var lightSearchRadius = 0.0f;

        if (!flags.HasFlag(ObjectFlag.DONTLIGHT))
        {
            lightSearchRadius = radius;
        }

        LocAndOffsets locAndOffsets;

        locAndOffsets.location = worldLoc;
        locAndOffsets.off_x    = animParams.offsetX;
        locAndOffsets.off_y    = animParams.offsetY;
        var lights = FindLights(locAndOffsets, lightSearchRadius);

        mRenderedLastFrame++;
        MdfRenderOverrides overrides = new MdfRenderOverrides();

        overrides.alpha = alpha / 255.0f;

        if (type != ObjectType.portal)
        {
            mOccludedMaterial.Resource.Bind(viewport, mDevice, lights, overrides);
            mAasRenderer.RenderWithoutMaterial(animatedModel, animParams);

            if (type.IsCritter())
            {
                /*
                 * This renders the equipment in a critter's hand separately, but
                 * I am not certain *why* exactly. I thought this would have been
                 * handled by addmeshes, but it might be that there's a distinct
                 * difference between addmeshes that are skinned onto the mobile's
                 * skeleton and equipment that is unskinned and just positioned
                 * in the player's hands.
                 */
                var weaponPrim = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponPrimary);
                if (weaponPrim != null)
                {
                    RenderOccludedObject(viewport, weaponPrim);
                }

                var weaponSec = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponSecondary);
                if (weaponSec != null)
                {
                    RenderOccludedObject(viewport, weaponSec);
                }

                var shield = GameSystems.Critter.GetWornItem(obj, EquipSlot.Shield);
                if (shield != null)
                {
                    RenderOccludedObject(viewport, shield);
                }
            }
        }
        else
        {
            if (GameSystems.ItemHighlight.ShowHighlights)
            {
                overrides.ignoreLighting = true;
            }

            mAasRenderer.Render(viewport, animatedModel, animParams, lights, overrides);
        }
    }
예제 #31
0
 public static void RemoveOthersFromCache(this HttpSessionStateBase session, INakedObject nakedObject, ObjectFlag flag = ObjectFlag.None) {
     session.GetCache(flag).RemoveOthersFromCache(nakedObject);
 }
예제 #32
0
    public void RenderObjectHighlight(IGameViewport viewport, GameObject obj,
                                      ResourceRef <IMdfRenderMaterial> material)
    {
        mTotalLastFrame++;

        var type  = obj.type;
        var flags = obj.GetFlags();

        // Dont render destroyed or disabled objects
        const ObjectFlag dontDrawFlags = ObjectFlag.OFF | ObjectFlag.DESTROYED | ObjectFlag.DONTDRAW;

        if ((flags & dontDrawFlags) != 0)
        {
            return;
        }

        // Hide invisible objects we're supposed to show them
        if (flags.HasFlag(ObjectFlag.INVISIBLE))
        {
            return;
        }

        // Dont draw secret doors that haven't been found yet
        var secretDoorFlags = obj.GetSecretDoorFlags();

        if (secretDoorFlags.HasFlag(SecretDoorFlag.SECRET_DOOR))
        {
            var found = secretDoorFlags.HasFlag(SecretDoorFlag.SECRET_DOOR_FOUND);
            if (!found && type != ObjectType.portal)
            {
                return;
            }
        }

        var animatedModel = obj.GetOrCreateAnimHandle();
        var animParams    = obj.GetAnimParams();

        locXY worldLoc;

        GameObject parent = null;

        if (type.IsEquipment())
        {
            parent = GameSystems.Item.GetParent(obj);
        }

        var alpha = GetAlpha(obj);

        if (parent != null)
        {
            var parentAlpha = GetAlpha(parent);
            alpha = (alpha + parentAlpha) / 2;

            worldLoc = parent.GetLocation();
        }
        else
        {
            worldLoc = obj.GetLocation();
        }

        if (alpha == 0)
        {
            return;
        }

        // Handle fog occlusion of the world position
        if (type != ObjectType.container &&
            (type == ObjectType.projectile ||
             type.IsCritter() ||
             type.IsEquipment()) &&
            (GameSystems.MapFogging.GetFogStatus(worldLoc, animParams.offsetX, animParams.offsetY) & 1) == 0)
        {
            return;
        }

        LocAndOffsets worldPosFull;

        worldPosFull.off_x    = animParams.offsetX;
        worldPosFull.off_y    = animParams.offsetY;
        worldPosFull.location = worldLoc;

        var radius       = obj.GetRadius();
        var renderHeight = obj.GetRenderHeight(true);

        if (!IsObjectOnScreen(viewport.Camera, worldPosFull, animParams.offsetZ, radius, renderHeight))
        {
            return;
        }

        var lightSearchRadius = 0.0f;

        if (!flags.HasFlag(ObjectFlag.DONTLIGHT))
        {
            lightSearchRadius = radius;
        }

        LocAndOffsets locAndOffsets;

        locAndOffsets.location = worldLoc;
        locAndOffsets.off_x    = animParams.offsetX;
        locAndOffsets.off_y    = animParams.offsetY;
        var lights = FindLights(locAndOffsets, lightSearchRadius);

        mRenderedLastFrame++;

        MdfRenderOverrides overrides = new MdfRenderOverrides();

        overrides.alpha = alpha / 255.0f;
        material.Resource.Bind(viewport, mDevice, lights, overrides);
        mAasRenderer.RenderWithoutMaterial(animatedModel, animParams);
    }
예제 #33
0
 // This is dangerous - retrieves all cached objects from the database - use with care !
 internal static IEnumerable<object> AllCachedObjects(this HttpSessionStateBase session, ObjectFlag flag = ObjectFlag.None) {
     return session.GetAndTidyCachedNakedObjects(flag).Where(no => !no.ResolveState.IsDestroyed()).Select(no => no.Object);
 }
예제 #34
0
    public void RenderObject(IGameViewport viewport, GameObject obj, bool showInvisible)
    {
        mTotalLastFrame++;

        var type  = obj.type;
        var flags = obj.GetFlags();

        // Dont render destroyed or disabled objects
        const ObjectFlag dontDrawFlags = ObjectFlag.OFF | ObjectFlag.DESTROYED | ObjectFlag.DONTDRAW;

        if ((flags & dontDrawFlags) != 0)
        {
            return;
        }

        // Hide invisible objects we're supposed to show them
        if ((flags & ObjectFlag.INVISIBLE) != 0 && !showInvisible)
        {
            return;
        }

        // Dont draw secret doors that haven't been found yet
        var secretDoorFlags = obj.GetSecretDoorFlags();

        if (secretDoorFlags.HasFlag(SecretDoorFlag.SECRET_DOOR))
        {
            var found = secretDoorFlags.HasFlag(SecretDoorFlag.SECRET_DOOR_FOUND);
            if (!found && type != ObjectType.portal)
            {
                return;
            }
        }

        var animatedModel = obj.GetOrCreateAnimHandle();

        var animParams = obj.GetAnimParams();

        locXY worldLoc;

        GameObject parent = null;

        if (type.IsEquipment())
        {
            parent = GameSystems.Item.GetParent(obj);
        }

        var alpha = GetAlpha(obj);

        if (parent != null)
        {
            var parentAlpha = GetAlpha(parent);
            alpha = (alpha + parentAlpha) / 2;

            worldLoc = parent.GetLocation();
        }
        else
        {
            worldLoc = obj.GetLocation();
        }

        if (alpha == 0)
        {
            return;
        }

        // Handle fog occlusion of the world position
        if (type != ObjectType.container &&
            (type == ObjectType.projectile ||
             type.IsCritter() ||
             type.IsEquipment()) &&
            (GameSystems.MapFogging.GetFogStatus(worldLoc, animParams.offsetX, animParams.offsetY) & 1) == 0)
        {
            return;
        }

        LocAndOffsets worldPosFull;

        worldPosFull.off_x    = animParams.offsetX;
        worldPosFull.off_y    = animParams.offsetY;
        worldPosFull.location = worldLoc;

        var radius       = obj.GetRadius();
        var renderHeight = obj.GetRenderHeight(true);

        if (!IsObjectOnScreen(viewport.Camera, worldPosFull, animParams.offsetZ, radius, renderHeight))
        {
            return;
        }

        if (Globals.Config.drawObjCylinders)
        {
            Tig.ShapeRenderer3d.DrawCylinder(
                viewport,
                worldPosFull.ToInches3D(animParams.offsetZ),
                radius,
                renderHeight
                );
        }

        var lightSearchRadius = 0.0f;

        if (!flags.HasFlag(ObjectFlag.DONTLIGHT))
        {
            lightSearchRadius = radius;
        }

        LocAndOffsets locAndOffsets;

        locAndOffsets.location = worldLoc;
        locAndOffsets.off_x    = animParams.offsetX;
        locAndOffsets.off_y    = animParams.offsetY;
        var lights = FindLights(locAndOffsets, lightSearchRadius);

        if (type == ObjectType.weapon)
        {
            int glowType;
            if (flags.HasFlag(ObjectFlag.INVENTORY) && parent != null)
            {
                glowType = GameSystems.D20.GetWeaponGlowType(parent, obj);
            }
            else
            {
                glowType = GameSystems.D20.GetWeaponGlowType(null, obj);
            }

            if (glowType != 0 && glowType <= mGlowMaterials.Length)
            {
                var glowMaterial = mGlowMaterials[glowType - 1];
                if (glowMaterial.IsValid)
                {
                    RenderObjectHighlight(viewport, obj, glowMaterial);
                }
            }
        }

        if (GameSystems.ItemHighlight.ShowHighlights &&
            (type.IsEquipment() &&
             !(flags.HasFlag(ObjectFlag.INVENTORY) || flags.HasFlag(ObjectFlag.CLICK_THROUGH)) ||
             GameSystems.Critter.IsLootableCorpse(obj) ||
             type == ObjectType.portal))
        {
            RenderObjectHighlight(viewport, obj, mHighlightMaterial);

            // Add a single light with full ambient color to make the object appear fully lit
            lights.Clear();
            Light3d fullBrightLight = new Light3d();
            fullBrightLight.ambient = LinearColor.White;
            fullBrightLight.color   = new LinearColor(0, 0, 0);
            fullBrightLight.dir     = Vector4.UnitZ;
            fullBrightLight.type    = Light3dType.Directional;
            lights.Add(fullBrightLight);
        }

        mRenderedLastFrame++;
        MdfRenderOverrides overrides = new MdfRenderOverrides();

        overrides.alpha = alpha / 255.0f;
        mAasRenderer.Render(viewport, animatedModel, animParams, lights, overrides);

        Light3d globalLight = new Light3d();

        if (lights.Count > 0)
        {
            globalLight = lights[0];
        }

        if (type.IsCritter())
        {
            if (alpha > 16)
            {
                if (mShadowType == ShadowType.ShadowMap)
                {
                    RenderShadowMapShadow(viewport, obj, animParams, animatedModel, globalLight, alpha);
                }
                else if (mShadowType == ShadowType.Geometry)
                {
                    mAasRenderer.RenderGeometryShadow(
                        viewport.Camera,
                        animatedModel,
                        animParams,
                        globalLight,
                        alpha / 255.0f);
                }
                else if (mShadowType == ShadowType.Blob)
                {
                    RenderBlobShadow(viewport, obj, animatedModel, ref animParams, alpha);
                }
            }

            /*
             * This renders the equipment in a critter's hand separately, but
             * I am not certain *why* exactly. I thought this would have been
             * handled by addmeshes, but it might be that there's a distinct
             * difference between addmeshes that are skinned onto the mobile's
             * skeleton and equipment that is unskinned and just positioned
             * in the player's hands.
             */
            var weaponPrim = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponPrimary);
            if (weaponPrim != null)
            {
                RenderObject(viewport, weaponPrim, showInvisible);
            }

            var weaponSec = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponSecondary);
            if (weaponSec != null)
            {
                RenderObject(viewport, weaponSec, showInvisible);
            }

            var shield = GameSystems.Critter.GetWornItem(obj, EquipSlot.Shield);
            if (shield != null)
            {
                RenderObject(viewport, shield, showInvisible);
            }
        }
        else if (type.IsEquipment() && mShadowType == ShadowType.Geometry)
        {
            mAasRenderer.RenderGeometryShadow(
                viewport.Camera,
                animatedModel,
                animParams,
                globalLight,
                alpha / 255.0f);
        }

        RenderMirrorImages(
            viewport,
            obj,
            animParams,
            animatedModel,
            lights);

        if (mGrappleController.IsGiantFrog(obj))
        {
            mGrappleController.AdvanceAndRender(
                viewport,
                obj,
                animParams,
                animatedModel,
                lights,
                alpha / 255.0f);
        }
    }
예제 #35
0
 // This is dangerous - retrieves all cached objects from the database - use with care !
 private static IEnumerable<INakedObject> GetAndTidyCachedNakedObjects(this HttpSessionStateBase session, ObjectFlag flag) {
     session.ClearDestroyedObjects(flag);
     return session.GetCache(flag).OrderBy(kvp => kvp.Value.Added).Select(kvp => FrameworkHelper.GetNakedObjectFromId(kvp.Key));
 }
        public static object LastObject(this HttpSessionStateBase session, IFrameworkFacade facade, ObjectFlag flag = ObjectFlag.None)
        {
            KeyValuePair <string, CacheMemento> lastEntry = session.GetCache(flag).OrderBy(kvp => kvp.Value.Added).LastOrDefault();

            if (lastEntry.Equals(default(KeyValuePair <string, CacheMemento>)))
            {
                return(null);
            }

            var lastObject = SafeGetNakedObjectFromId(lastEntry.Key, facade);

            if (lastObject == null)
            {
                session.GetCache(flag).Remove(lastEntry.Key);
                return(session.LastObject(facade, flag));
            }

            return(lastObject.GetDomainObject());
        }
예제 #37
0
 public static IEnumerable<object> CachedObjectsOfType(this HttpSessionStateBase session, INakedObjectSpecification spec, ObjectFlag flag = ObjectFlag.None) {
     return session.GetAndTidyCachedNakedObjectsOfType(spec, flag).Select(no => no.Object);
 }
예제 #38
0
 private static void RemoveOldest(Dictionary<string, CacheMemento> cache, ObjectFlag flag) {
     DateTime oldestEntry = cache.Values.Select(t => t.Added).Min();
     string oldestId = cache.Where(kvp => kvp.Value.Added == oldestEntry).Select(kvp => kvp.Key).First();
     cache.Remove(oldestId);
 }
예제 #39
0
 public static void ClearCachedObjects(this HttpSessionStateBase session, ObjectFlag flag = ObjectFlag.None) {
     Dictionary<string, CacheMemento> cache = session.GetCache(flag);
     List<string> toRemove = cache.Select(kvp => kvp.Key).ToList();
     toRemove.ForEach(k => cache.Remove(k));
 }
예제 #40
0
 public static void AddToCache(this HttpSessionStateBase session, INakedObject nakedObject, ObjectFlag flag = ObjectFlag.None) {
     session.AddToCache(nakedObject, null, flag);
 }
예제 #41
0
 private static void AddToCache(this Dictionary<string, CacheMemento> cache, INakedObject nakedObject, string url, ObjectFlag flag) {
     string objectId = FrameworkHelper.GetObjectId(nakedObject);
     cache[objectId] = new CacheMemento {Added = DateTime.Now, Spec = nakedObject.Specification, Url = url};
     while (cache.Count > CacheSize) {
         RemoveOldest(cache, flag);
     }
 }
        public static void ClearDestroyedObjectsOfType(this HttpSessionStateBase session, IFrameworkFacade facade, ITypeFacade spec, ObjectFlag flag = ObjectFlag.None)
        {
            Dictionary <string, CacheMemento> cache = session.GetCache(flag);
            List <string> toRemove = cache.Where(cm => SameSpec(cm.Value.Spec, spec, facade)).Select(kvp => new { kvp.Key, no = SafeGetNakedObjectFromId(kvp.Key, facade) }).Where(ao => ao.no == null).Select(ao => ao.Key).ToList();

            toRemove.ForEach(k => cache.Remove(k));
        }
예제 #43
0
 public static void AddOrUpdateInCache(this HttpSessionStateBase session, object domainObject, string url, ObjectFlag flag = ObjectFlag.None) {
     INakedObject nakedObject = FrameworkHelper.GetNakedObject(domainObject);
     session.AddOrUpdateInCache(nakedObject, url, flag);
 }
 public static void RemoveOthersFromCache(this HttpSessionStateBase session, IFrameworkFacade facade, IObjectFacade nakedObject, ObjectFlag flag = ObjectFlag.None)
 {
     session.GetCache(flag).RemoveOthersFromCache(facade, nakedObject);
 }
 public static void RemoveFromCache(this HttpSessionStateBase session, string objectId, ObjectFlag flag = ObjectFlag.None)
 {
     session.GetCache(flag).RemoveFromCache(objectId);
 }
예제 #46
0
 public UnityEngine.Material[] GetMaterials(ObjectFlag flags)
 {
     return GetMaterials(flags, x => {});
 }
예제 #47
0
 internal static void TestAddToCache(this HttpSessionStateBase session, INakedObject nakedObject, ObjectFlag flag = ObjectFlag.None) {
     session.GetCache(flag).AddToCache(nakedObject, null, flag);
 }
예제 #48
0
        public UnityEngine.Material[] GetMaterials(ObjectFlag flags,
            Action<UnityEngine.Material> setupMaterial)
        {
            var matFlags = MaterialFlags.Default | MaterialFlags.OverrideAlpha;

            if ((flags & ObjectFlag.NoBackCull) == ObjectFlag.NoBackCull) {
                matFlags |= MaterialFlags.NoBackCull;
            }

            if ((flags & (ObjectFlag.Alpha1 | ObjectFlag.Alpha2)) != 0
                && (flags & ObjectFlag.DisableShadowMesh) == ObjectFlag.DisableShadowMesh) {
                matFlags |= MaterialFlags.Alpha;
            }

            return GetMaterials(matFlags, setupMaterial);
        }
예제 #49
0
 public static void RemoveOthersFromCache(this HttpSessionStateBase session, string objectId, ObjectFlag flag = ObjectFlag.None) {
     session.GetCache(flag).RemoveOthersFromCache(objectId);
 }
        // This is dangerous - retrieves all cached objects from the database - use with care !

        private static IEnumerable <IObjectFacade> GetAndTidyCachedNakedObjects(this HttpSessionStateBase session, IFrameworkFacade facade, ObjectFlag flag)
        {
            session.ClearDestroyedObjects(facade, flag);
            return(session.GetCache(flag).OrderBy(kvp => kvp.Value.Added).Select(kvp => GetNakedObjectFromId(facade, kvp.Key)));
        }