BVB Source Codes

CRYENGINE Show AIActor.h Source code

Return Download CRYENGINE: download AIActor.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. /********************************************************************
  4.    -------------------------------------------------------------------------
  5.    File name:   AIActor.h
  6.    $Id$
  7.    Description: Header for the CAIActor class
  8.  
  9.    -------------------------------------------------------------------------
  10.    History:
  11.    14:12:2006 -  Created by Kirill Bulatsev
  12.  
  13.  *********************************************************************/
  14.  
  15. #ifndef AIACTOR_H
  16. #define AIACTOR_H
  17.  
  18. #if _MSC_VER > 1000
  19.         #pragma once
  20. #endif // _MSC_VER > 1000
  21.  
  22. #include <CryAISystem/IAIActor.h>
  23. #include <CryAISystem/IAgent.h>
  24. #include "AIObject.h"
  25. #include "BlackBoard.h"
  26.  
  27. #include "ValueHistory.h"
  28. #include <CryAISystem/INavigationSystem.h>
  29.  
  30. #include "PersonalLog.h"
  31.  
  32. struct IPerceptionHandlerModifier;
  33. struct SShape;
  34.  
  35. class SelectionTree;
  36.  
  37. namespace BehaviorTree
  38. {
  39. struct INode;
  40. class TimestampCollection;
  41. }
  42.  
  43. enum EObjectUpdate
  44. {
  45.         AIUPDATE_FULL,
  46.         AIUPDATE_DRY,
  47. };
  48.  
  49. // Structure reflecting the physical entity parts.
  50. // When choosing the target location to hit, the AI chooses amongst one of these.
  51. struct SAIDamagePart
  52. {
  53.         SAIDamagePart() : pos(ZERO), damageMult(0.f), volume(0.f), surfaceIdx(0) {}
  54.         void GetMemoryUsage(ICrySizer* pSizer) const {}
  55.         Vec3  pos;        // Position of the part.
  56.         float damageMult; // Damage multiplier of the part, can be used to choose the most damage causing part.
  57.         float volume;     // The volume of the part, can be used to choose the largest part to hit.
  58.         int   surfaceIdx; // The index of the surface material.
  59. };
  60.  
  61. typedef std::vector<SAIDamagePart>               DamagePartVector;
  62. typedef std::vector<IPerceptionHandlerModifier*> TPerceptionHandlerModifiersVector;
  63.  
  64. /*! Basic ai object class. Defines a framework that all puppets and points of interest
  65.    later follow.
  66.  */
  67. class CAIActor
  68.         : public CAIObject
  69.           , public IAIActor
  70. {
  71.         friend class CAISystem;
  72.  
  73. public:
  74.         CAIActor();
  75.         virtual ~CAIActor();
  76.  
  77.         virtual const IAIActor*   CastToIAIActor() const override { return this; }
  78.         virtual IAIActor*         CastToIAIActor() override       { return this; }
  79.  
  80.         virtual bool              CanDamageTarget(IAIObject* target = 0) const override;
  81.         virtual bool              CanDamageTargetWithMelee() const override;
  82.  
  83.         virtual IPhysicalEntity*  GetPhysics(bool bWantCharacterPhysics = false) const override;
  84.  
  85.         void                      SetBehaviorVariable(const char* variableName, bool value) override;
  86.         bool                      GetBehaviorVariable(const char* variableName) const;
  87.  
  88.         class SelectionTree*      GetBehaviorSelectionTree() const;
  89.         class SelectionVariables* GetBehaviorSelectionVariables() const;
  90.  
  91.         void                      ResetBehaviorSelectionTree(EObjectResetType type);
  92.         bool                      ProcessBehaviorSelectionTreeSignal(const char* signalName, uint32 signalCRC);
  93.         bool                      UpdateBehaviorSelectionTree();
  94.  
  95.         void                      ResetModularBehaviorTree(EObjectResetType type);
  96.         virtual void              SetModularBehaviorTree(const char* szTreeName) override { m_modularBehaviorTreeName = szTreeName; ResetModularBehaviorTree(AIOBJRESET_INIT); }
  97.  
  98. #if defined(CRYAISYSTEM_DEBUG)
  99.  
  100.         void DebugDrawBehaviorSelectionTree();
  101.  
  102. #endif
  103.  
  104.         const SAIBodyInfo& QueryBodyInfo();
  105.         const SAIBodyInfo& GetBodyInfo() const;
  106.  
  107.         ////////////////////////////////////////////////////////////////////////////////////////
  108.         //IAIPathAgent//////////////////////////////////////////////////////////////////////////
  109.         virtual IEntity*                    GetPathAgentEntity() const override;
  110.         virtual const char*                 GetPathAgentName() const override;
  111.         virtual unsigned short              GetPathAgentType() const override;
  112.         virtual float                       GetPathAgentPassRadius() const override;
  113.         virtual Vec3                        GetPathAgentPos() const override;
  114.         virtual Vec3                        GetPathAgentVelocity() const override;
  115.         virtual void                        GetPathAgentNavigationBlockers(NavigationBlockers& navigationBlockers, const struct PathfindRequest* pRequest) override;
  116.  
  117.         virtual size_t                      GetNavNodeIndex() const override;
  118.  
  119.         virtual const AgentMovementAbility& GetPathAgentMovementAbility() const override;
  120.         virtual IPathFollower*              GetPathFollower() const override;
  121.  
  122.         virtual unsigned int                GetPathAgentLastNavNode() const override;
  123.         virtual void                        SetPathAgentLastNavNode(unsigned int lastNavNode) override;
  124.  
  125.         virtual void                        SetPathToFollow(const char* pathName) override;
  126.         virtual void                        SetPathAttributeToFollow(bool bSpline) override;
  127.  
  128.         //Path finding avoids blocker type by radius.
  129.         virtual void SetPFBlockerRadius(int blockerType, float radius) override;
  130.  
  131.         //Can path be modified to use request.targetPoint?  Results are cacheded in request.
  132.         virtual ETriState CanTargetPointBeReached(CTargetPointRequest& request) override;
  133.  
  134.         //Is request still valid/use able
  135.         virtual bool UseTargetPointRequest(const CTargetPointRequest& request) override;//??
  136.  
  137.         virtual bool GetValidPositionNearby(const Vec3& proposedPosition, Vec3& adjustedPosition) const override;
  138.         virtual bool GetTeleportPosition(Vec3& teleportPos) const override;
  139.  
  140.         virtual bool IsPointValidForAgent(const Vec3& pos, uint32 flags) const override { return true; }
  141.         //IAIPathAgent//////////////////////////////////////////////////////////////////////////
  142.         ////////////////////////////////////////////////////////////////////////////////////////
  143.  
  144.         //===================================================================
  145.         // inherited virtual interface functions
  146.         //===================================================================
  147.         virtual void                SetPos(const Vec3& pos, const Vec3& dirFwrd = Vec3Constants<float>::fVec3_OneX) override;
  148.         virtual void                Reset(EObjectResetType type) override;
  149.         virtual void                OnObjectRemoved(CAIObject* pObject) override;
  150.         virtual SOBJECTSTATE&       GetState(void) override       { return m_State; }
  151.         virtual const SOBJECTSTATE& GetState(void) const override { return m_State; }
  152.         virtual void                SetSignal(int nSignalID, const char* szText, IEntity* pSender = 0, IAISignalExtraData* pData = NULL, uint32 crcCode = 0) override;
  153.         virtual void                OnAIHandlerSentSignal(const char* szText, uint32 crcCode) override;
  154.         virtual void                Serialize(TSerialize ser) override;
  155.         virtual void                Update(EObjectUpdate type);
  156.         virtual void                UpdateProxy(EObjectUpdate type);
  157.         virtual void                UpdateDisabled(EObjectUpdate type); // when AI object is disabled still may need to send some signals
  158.         virtual void                SetProxy(IAIActorProxy* proxy) override;
  159.         virtual IAIActorProxy*      GetProxy() const override;
  160.         virtual bool                CanAcquireTarget(IAIObject* pOther) const override;
  161.         virtual void                ResetPerception() override;
  162.         virtual bool                IsHostile(const IAIObject* pOther, bool bUsingAIIgnorePlayer = true) const override;
  163.         virtual void                ParseParameters(const AIObjectParams& params, bool bParseMovementParams = true);
  164.         virtual void                Event(unsigned short eType, SAIEVENT* pAIEvent) override;
  165.         virtual void                EntityEvent(const SEntityEvent& event) override;
  166.         virtual void                SetGroupId(int id) override;
  167.         virtual void                SetFactionID(uint8 factionID) override;
  168.  
  169.         virtual void                SetObserver(bool observer);
  170.         virtual uint32              GetObserverTypeMask() const;
  171.         virtual uint32              GetObservableTypeMask() const override;
  172.  
  173.         virtual void                ReactionChanged(uint8 factionID, IFactionMap::ReactionType reaction);
  174.         virtual void                VisionChanged(float sightRange, float primaryFOVCos, float secondaryFOVCos);
  175.         virtual bool                IsObserver() const override;
  176.         virtual bool                CanSee(const VisionID& otherVisionID) const override;
  177.  
  178.         virtual void                RegisterBehaviorListener(IActorBehaviorListener* listener) override;
  179.         virtual void                UnregisterBehaviorListener(IActorBehaviorListener* listener) override;
  180.         virtual void                BehaviorEvent(EBehaviorEvent event) override;
  181.         virtual void                BehaviorChanged(const char* current, const char* previous) override;
  182.  
  183.         //===================================================================
  184.         // virtual functions rooted here
  185.         //===================================================================
  186.  
  187.         // Returns a list containing the information about the parts that can be shot at.
  188.         virtual DamagePartVector*           GetDamageParts()                                          { return 0; }
  189.  
  190.         const AgentParameters&              GetParameters() const override                            { return m_Parameters; }
  191.         virtual void                        SetParameters(const AgentParameters& params) override;
  192.         virtual const AgentMovementAbility& GetMovementAbility() const override                       { return m_movementAbility; }
  193.         virtual void                        SetMovementAbility(AgentMovementAbility& params) override { m_movementAbility = params; }
  194.         // (MATT) There is now a method to serialise these {2009/04/23}
  195.  
  196.         virtual bool        IsLowHealthPauseActive() const override      { return false; }
  197.         virtual IEntity*    GetGrabbedEntity() const                     { return 0; } // consider only player grabbing things, don't care about NPC
  198.         virtual bool        IsGrabbedEntityInView(const Vec3& pos) const { return false; }
  199.  
  200.         void                GetLocalBounds(AABB& bbox) const;
  201.  
  202.         virtual bool        IsDevalued(IAIObject* pAIObject) override { return false; }
  203.  
  204.         virtual void        ResetLookAt() override;
  205.         virtual bool        SetLookAtPointPos(const Vec3& vPoint, bool bPriority = false) override;
  206.         virtual bool        SetLookAtDir(const Vec3& vDir, bool bPriority = false) override;
  207.  
  208.         virtual void        ResetBodyTargetDir() override;
  209.         virtual void        SetBodyTargetDir(const Vec3& vDir) override;
  210.         virtual const Vec3& GetBodyTargetDir() const override;
  211.  
  212.         virtual void        SetMoveTarget(const Vec3& vMoveTarget) override;
  213.         virtual void        GoTo(const Vec3& vTargetPos) override;
  214.         virtual void        SetSpeed(float fSpeed) override;
  215.  
  216.         virtual bool        IsInvisibleFrom(const Vec3& pos, bool bCheckCloak = true, bool bCheckCloakDistance = true, const CloakObservability& cloakObservability = CloakObservability()) const override;
  217.  
  218.         //===================================================================
  219.         // non-virtual functions
  220.         //===================================================================
  221.  
  222.         void NotifyDeath();
  223.         // Returns true if the cloak is effective (includes check for cloak and
  224.         bool IsCloakEffective(const Vec3& pos) const;
  225.  
  226.         // Get the sight FOV cosine values for the actor
  227.         void GetSightFOVCos(float& primaryFOVCos, float& secondaryFOVCos) const;
  228.         void CacheFOVCos(float primaryFOV, float secondaryFOV);
  229.  
  230.         // Used to adjust the visibility range for an object checking if they can see me
  231.         virtual float AdjustTargetVisibleRange(const CAIActor& observer, float fVisibleRange) const;
  232.  
  233.         // Returns the maximum visible range to the target
  234.         virtual float GetMaxTargetVisibleRange(const IAIObject* pTarget, bool bCheckCloak = true) const override;
  235.  
  236.         // Gets the light level at actors position.
  237.         inline EAILightLevel GetLightLevel() const     { return m_lightLevel; }
  238.         virtual bool         IsAffectedByLight() const { return m_Parameters.m_PerceptionParams.isAffectedByLight; }
  239.  
  240.         // Populates list of physics entities to skip for raycasting.
  241.         virtual void                  GetPhysicalSkipEntities(PhysSkipList& skipList) const override;
  242.         virtual void                  UpdateObserverSkipList();
  243.  
  244.         virtual NavigationAgentTypeID GetNavigationTypeID() const override
  245.         {
  246.                 return m_navigationTypeID;
  247.         }
  248.  
  249.         // Coordination state change functions
  250.         void CoordinationEntered(const char* signalName);
  251.         void CoordinationExited(const char* signalName);
  252.  
  253.         bool                 m_bCheckedBody;
  254.  
  255.         SOBJECTSTATE         m_State;
  256.         AgentParameters      m_Parameters;
  257.         AgentMovementAbility m_movementAbility;
  258.  
  259. #ifdef CRYAISYSTEM_DEBUG
  260.         CValueHistory<float>* m_healthHistory;
  261. #endif
  262.  
  263.         std::vector<CAIObject*> m_probableTargets;
  264.  
  265.         void                           AddProbableTarget(CAIObject* pTarget);
  266.         void                           ClearProbableTargets();
  267.  
  268.         virtual void                   EnablePerception(bool enable) override;
  269.         virtual bool                   IsPerceptionEnabled() const override;
  270.  
  271.         virtual bool                   IsActive() const override            { return m_bEnabled; }
  272.         virtual bool                   IsAgent() const override             { return true; }
  273.  
  274.         inline bool                    IsUsingCombatLight() const           { return m_usingCombatLight; }
  275.  
  276.         inline float                   GetCachedWaterOcclusionValue() const { return m_cachedWaterOcclusionValue; }
  277.  
  278.         virtual IBlackBoard*           GetBlackBoard() override             { return &m_blackBoard; }
  279.         virtual IBlackBoard*           GetBehaviorBlackBoard() override     { return &m_behaviorBlackBoard; }
  280.  
  281.         virtual IAIObject*             GetAttentionTarget() const override  { return m_refAttentionTarget.GetAIObject(); }
  282.         virtual void                   SetAttentionTarget(CWeakRef<CAIObject> refAttTarget);
  283.  
  284.         inline virtual EAITargetThreat GetAttentionTargetThreat() const override   { return m_State.eTargetThreat; }
  285.         inline virtual EAITargetType   GetAttentionTargetType() const override     { return m_State.eTargetType; }
  286.  
  287.         inline virtual EAITargetThreat GetPeakThreatLevel() const override         { return m_State.ePeakTargetThreat; }
  288.         inline virtual EAITargetType   GetPeakThreatType() const override          { return m_State.ePeakTargetType; }
  289.         inline virtual tAIObjectID     GetPeakTargetID() const override            { return m_State.ePeakTargetID; }
  290.  
  291.         inline virtual EAITargetThreat GetPreviousPeakThreatLevel() const override { return m_State.ePreviousPeakTargetThreat; }
  292.         inline virtual EAITargetType   GetPreviousPeakThreatType() const override  { return m_State.ePreviousPeakTargetType; }
  293.         inline virtual tAIObjectID     GetPreviousPeakTargetID() const override    { return m_State.ePreviousPeakTargetID; }
  294.  
  295.         virtual Vec3                   GetFloorPosition(const Vec3& pos) override;
  296.  
  297.         // check if enemy is close enough and send OnCloseContact if so
  298.         virtual void       CheckCloseContact(IAIObject* pTarget, float distSq);
  299.         inline bool        CloseContactEnabled() { return !m_bCloseContact; }
  300.         void               SetCloseContact(bool bCloseContact);
  301.  
  302.         EFieldOfViewResult IsObjectInFOV(CAIObject* pTarget, float fDistanceScale = 1.f) const;
  303.  
  304.         void               AddPersonallyHostile(tAIObjectID hostileID);
  305.         void               RemovePersonallyHostile(tAIObjectID hostileID);
  306.         void               ResetPersonallyHostiles();
  307.         bool               IsPersonallyHostile(tAIObjectID hostileID) const;
  308.  
  309. #ifdef CRYAISYSTEM_DEBUG
  310.         void UpdateHealthHistory();
  311. #endif
  312.  
  313.         virtual void               SetTerritoryShapeName(const char* szName) override;
  314.         virtual const char*        GetTerritoryShapeName() const override;
  315.         virtual const char*        GetWaveName() const override { return m_Parameters.m_sWaveName.c_str(); }
  316.         virtual bool               IsPointInsideTerritoryShape(const Vec3& vPos, bool bCheckHeight) const override;
  317.         virtual bool               ConstrainInsideTerritoryShape(Vec3& vPos, bool bCheckHeight) const override;
  318.  
  319.         const SShape*              GetTerritoryShape() const { return m_territoryShape; }
  320.         SShape*                    GetTerritoryShape()       { return m_territoryShape; }
  321.  
  322.         void                       GetMovementSpeedRange(float fUrgency, bool bSlowForStrafe, float& normalSpeed, float& minSpeed, float& maxSpeed) const;
  323.  
  324.         virtual EFieldOfViewResult IsPointInFOV(const Vec3& pos, float distanceScale = 1.f) const override;
  325.  
  326.         enum ENavInteraction { NI_IGNORE, NI_STEER, NI_SLOW };
  327.         // indicates the way that two objects should negotiate each other
  328.         static ENavInteraction GetNavInteraction(const CAIObject* navigator, const CAIObject* obstacle);
  329.  
  330.         virtual void           CancelRequestedPath(bool actorRemoved);
  331.  
  332.         enum BehaviorTreeEvaluationMode
  333.         {
  334.                 EvaluateWhenVariablesChange,
  335.                 EvaluationBlockedUntilBehaviorUnlocks,
  336.  
  337.                 BehaviorTreeEvaluationModeCount,
  338.                 FirstBehaviorTreeEvaluationMode = 0
  339.         };
  340.  
  341.         void SetBehaviorTreeEvaluationMode(const BehaviorTreeEvaluationMode mode) { m_behaviorTreeEvaluationMode = mode; }
  342.  
  343. #ifdef AI_COMPILE_WITH_PERSONAL_LOG
  344.         PersonalLog& GetPersonalLog() { return m_personalLog; }
  345. #endif
  346.  
  347.         // - returns the initial position at the time the Puppet was constructed
  348.         // - this is the position of where the level designer placed the Puppet
  349.         // - if false is returned, then the Puppet was probably not created through the level editor
  350.         bool GetInitialPosition(Vec3& initialPosition) const;
  351.  
  352.         // Returns the attention target if it is an agent, or the attention target association, or null if there is no association.
  353.         static CWeakRef<CAIActor> GetLiveTarget(const CWeakRef<CAIObject>& refTarget);
  354.  
  355.         // Returns the attention target if it is an agent, or the attention target association, or null if there is no association.
  356.         static const CAIObject* GetLiveTarget(const CAIObject* pTarget);
  357.  
  358. protected:
  359.  
  360.         uint32 GetFactionVisionMask(uint8 factionID) const;
  361.  
  362.         void   SerializeMovementAbility(TSerialize ser);
  363.  
  364.         //process cloak_scale fading
  365.         void UpdateCloakScale();
  366.  
  367.         // Updates the properties of the damage parts.
  368.         void               UpdateDamageParts(DamagePartVector& parts);
  369.  
  370.         EFieldOfViewResult CheckPointInFOV(const Vec3& vPoint, float fSightRange) const;
  371.  
  372.         virtual void       HandlePathDecision(MNMPathRequestResult& result);
  373.         virtual void       HandleVisualStimulus(SAIEVENT* pAIEvent);
  374.         virtual void       HandleSoundEvent(SAIEVENT* pAIEvent);
  375.         virtual void       HandleBulletRain(SAIEVENT* pAIEvent);
  376.  
  377.         // AIOT_PLAYER is to be treated specially, as it's the player, but otherwise is the same as
  378.         // AIOT_AGENTSMALL
  379.         enum EAIObjectType { AIOT_UNKNOWN, AIOT_PLAYER, AIOT_AGENTSMALL, AIOT_AGENTMED, AIOT_AGENTBIG, AIOT_MAXTYPES };
  380.         // indicates the sort of object the agent is with regard to navigation
  381.         static EAIObjectType GetObjectType(const CAIObject* ai, unsigned short type);
  382.  
  383.         _smart_ptr<IAIActorProxy>         m_proxy;
  384.  
  385.         EAILightLevel                     m_lightLevel;
  386.         bool                              m_usingCombatLight;
  387.         int8                              m_perceptionDisabled;
  388.  
  389.         float                             m_cachedWaterOcclusionValue;
  390.  
  391.         Vec3                              m_vLastFullUpdatePos;
  392.         EStance                           m_lastFullUpdateStance;
  393.  
  394.         CBlackBoard                       m_blackBoard;
  395.         CBlackBoard                       m_behaviorBlackBoard;
  396.  
  397.         TPerceptionHandlerModifiersVector m_perceptionHandlerModifiers;
  398.  
  399.         typedef std::set<IActorBehaviorListener*> BehaviorListeners;
  400.         BehaviorListeners                   m_behaviorListeners;
  401.  
  402.         BehaviorTreeEvaluationMode          m_behaviorTreeEvaluationMode;
  403.         std::unique_ptr<SelectionTree>      m_behaviorSelectionTree;
  404.         std::unique_ptr<SelectionVariables> m_behaviorSelectionVariables;
  405.  
  406.         // (MATT) Note: this is a different attention target to the classic. Nasty OO hack {2009/02/03}
  407.         // [4/20/2010 evgeny] Moved here from CPipeUser and CAIPlayer
  408.         CWeakRef<CAIObject> m_refAttentionTarget;
  409.  
  410.         CTimeValue          m_CloseContactTime; // timeout for close contact
  411.         bool                m_bCloseContact;    // used to prevent the signal OnCloseContact being sent repeatedly to same object
  412.  
  413.         string              m_territoryShapeName;
  414.         SShape*             m_territoryShape;
  415.  
  416.         float               m_bodyTurningSpeed;
  417.         Vec3                m_lastBodyDir;
  418.  
  419.         float               m_stimulusStartTime;
  420.  
  421.         unsigned int        m_activeCoordinationCount;
  422.  
  423.         bool                m_observer;
  424.  
  425.         string              m_modularBehaviorTreeName;
  426.  
  427. private:
  428.         float m_FOVPrimaryCos;
  429.         float m_FOVSecondaryCos;
  430.  
  431.         float m_currentCollisionAvoidanceRadiusIncrement;
  432.  
  433.         typedef VectorSet<tAIObjectID> PersonallyHostiles;
  434.         PersonallyHostiles    m_forcefullyHostiles;
  435.  
  436.         SAIBodyInfo           m_bodyInfo;
  437.  
  438.         NavigationAgentTypeID m_navigationTypeID;
  439.  
  440. #ifdef AI_COMPILE_WITH_PERSONAL_LOG
  441.         PersonalLog m_personalLog;
  442. #endif
  443.  
  444.         // position of the Puppet placed by the level designer
  445.         struct SInitialPosition
  446.         {
  447.                 Vec3 pos;
  448.                 bool isValid;   // becomes valid in Reset()
  449.  
  450.                 SInitialPosition() { isValid = false; }
  451.         };
  452.  
  453.         SInitialPosition m_initialPosition;
  454.  
  455. private:
  456.         void StartBehaviorTree(const char* behaviorName);
  457.         void StopBehaviorTree();
  458.         bool IsRunningBehaviorTree() const;
  459.  
  460.         bool m_runningBehaviorTree;
  461. };
  462.  
  463. ILINE const CAIActor* CastToCAIActorSafe(const IAIObject* pAI) { return pAI ? pAI->CastToCAIActor() : 0; }
  464. ILINE CAIActor*       CastToCAIActorSafe(IAIObject* pAI)       { return pAI ? pAI->CastToCAIActor() : 0; }
  465.  
  466. #endif
  467.  
downloadAIActor.h Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top