Skip to content

Instantly share code, notes, and snippets.

@junioramilson
Created July 15, 2019 01:20
Show Gist options
  • Save junioramilson/b21718b2d9ee0368e9338e16262bb0f7 to your computer and use it in GitHub Desktop.
Save junioramilson/b21718b2d9ee0368e9338e16262bb0f7 to your computer and use it in GitHub Desktop.

Revisions

  1. junioramilson created this gist Jul 15, 2019.
    128 changes: 128 additions & 0 deletions TriggerBox.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,128 @@
    #include "TriggerBox.h"
    #include <CryEntitySystem/IEntity.h>

    #include <CrySchematyc/Reflection/TypeDesc.h>
    #include <CrySchematyc/Env/IEnvRegistry.h>
    #include <CrySchematyc/Env/IEnvRegistrar.h>
    #include <CrySchematyc/Env/Elements/EnvComponent.h>
    #include <CrySchematyc/Env/Elements/EnvFunction.h>
    #include <CrySchematyc/MathTypes.h>
    #include <CrySchematyc/Env/Elements/EnvSignal.h>
    #include <CrySchematyc/IObject.h>
    #include "Components/Player.h"

    static void RegisterTriggerBox(Schematyc::IEnvRegistrar& registrar)
    {
    Schematyc::CEnvRegistrationScope scope = registrar.Scope(IEntity::GetEntityScopeGUID());
    {
    Schematyc::CEnvRegistrationScope componentScope = scope.Register(SCHEMATYC_MAKE_ENV_COMPONENT(TriggerBox));
    // Functions
    {
    componentScope.Register(SCHEMATYC_MAKE_ENV_SIGNAL(SOnEnteredSignal));
    componentScope.Register(SCHEMATYC_MAKE_ENV_SIGNAL(SOnLeaveSignal));
    }
    }
    }

    CRY_STATIC_AUTO_REGISTER_FUNCTION(&RegisterTriggerBox)

    static void ReflectType(Schematyc::CTypeDesc<SOnEnteredSignal>& desc)
    {
    desc.SetGUID("66E82B5B-7964-4E63-9E0A-7F53148404D4"_cry_guid);
    desc.SetLabel("OnEntered");
    desc.AddMember(&SOnEnteredSignal::value, 'val', "value", "Value", "Signal to enter event", false);
    }

    static void ReflectType(Schematyc::CTypeDesc<SOnLeaveSignal>& desc)
    {
    desc.SetGUID("B454BB79-5E69-46DD-8CFA-FE4A6C7BCE9F"_cry_guid);
    desc.SetLabel("OnLeave");
    desc.AddMember(&SOnLeaveSignal::value, 'val', "value", "Value", "Signal to leave event", false);
    }

    void TriggerBox::Initialize()
    {
    m_pTriggerComponent = m_pEntity->CreateComponent<IEntityTriggerComponent>();

    Setup();
    }

    void TriggerBox::Setup()
    {
    m_boundingBox = AABB(m_pBoxSize * -0.5f, m_pBoxSize * 0.5f);
    m_pTriggerComponent->SetTriggerBounds(m_boundingBox);
    }

    void TriggerBox::ProcessEvent(const SEntityEvent& event)
    {
    Schematyc::IObject* const pSchematycObject = m_pEntity->GetSchematycObject();

    if (event.event == ENTITY_EVENT_ENTERAREA)
    {
    if (pSchematycObject)
    {
    const EntityId enteredEntityId = static_cast<EntityId>(event.nParam[0]);
    if (IEntity* pEntity = gEnv->pEntitySystem->GetEntity(enteredEntityId))
    {
    if (CPlayerComponent* pPlayerComponent = pEntity->GetComponent<CPlayerComponent>())
    {
    pSchematycObject->ProcessSignal(SOnEnteredSignal(true), GetGUID());
    }
    else
    {
    CryLogAlways("TriggerBox: Non-player entity entered");
    }
    }
    }
    }
    else if (event.event == ENTITY_EVENT_LEAVEAREA)
    {
    if (pSchematycObject)
    {
    const EntityId leaveEntityId = static_cast<EntityId>(event.nParam[0]);
    if (IEntity* pEntity = gEnv->pEntitySystem->GetEntity(leaveEntityId))
    {
    if (CPlayerComponent * pPlayerComponent = pEntity->GetComponent<CPlayerComponent>())
    {
    pSchematycObject->ProcessSignal(SOnLeaveSignal(true), GetGUID());
    }
    }
    }
    }
    else if (event.event == ENTITY_EVENT_COMPONENT_PROPERTY_CHANGED)
    {
    Setup();
    }
    }

    EntityEventMask TriggerBox::GetEventMask() const
    {
    return ENTITY_EVENT_BIT(ENTITY_EVENT_ENTERAREA) | ENTITY_EVENT_BIT(ENTITY_EVENT_LEAVEAREA) | ENTITY_EVENT_BIT(ENTITY_EVENT_COMPONENT_PROPERTY_CHANGED);
    }

    IGeometry* TriggerBox::CreateGeometry() const
    {
    primitives::box primitive;
    primitive.size = m_pBoxSize;
    primitive.Basis = IDENTITY;
    primitive.bOriented = 1;
    primitive.center = Vec3(0, 0, m_pBoxSize.z);

    return gEnv->pPhysicalWorld->GetGeomManager()->CreatePrimitive((int)primitive.type, &primitive);
    }

    void TriggerBox::Render(const IEntity& entity, const IEntityComponent& component, SEntityPreviewContext& context) const
    {
    Matrix34 slotTransform = GetWorldTransformMatrix();

    IGeometry* pPrimGeom = CreateGeometry();
    geom_world_data geomWorldData;
    geomWorldData.R = Matrix33(slotTransform);
    geomWorldData.scale = slotTransform.GetUniformScale();
    geomWorldData.offset = slotTransform.GetTranslation();

    gEnv->pSystem->GetIPhysRenderer()->DrawGeometry(pPrimGeom, &geomWorldData, -1, 0, ZERO, context.debugDrawInfo.color);
    pPrimGeom->DrawWireframe(gEnv->pSystem->GetIPhysRenderer(), &geomWorldData,1, -1);

    pPrimGeom->Release();
    }