Advertisement
Guest User

Untitled

a guest
Mar 13th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.41 KB | None | 0 0
  1. #include "LyTanks_precompiled.h"
  2.  
  3. #include <AzCore/Serialization/SerializeContext.h>
  4. #include <AzCore/Serialization/EditContext.h>
  5.  
  6. #include "..\..\..\LmbrCentral\Code\Source\Rendering\MeshComponent.h"
  7. #include "AzFramework\Components\TransformComponent.h"
  8.  
  9. #include <AzCore/Asset/AssetManagerBus.h>
  10. #include <AzCore/Slice/SliceComponent.h>
  11. #include <LmbrCentral/Rendering/MeshAsset.h>
  12. #include <LmbrCentral/Rendering/MaterialAsset.h>
  13.  
  14. // EBUS
  15. #include <AzCore/Component/TransformBus.h>
  16. #include <AzCore/Component/ComponentApplicationBus.h>
  17. #include <AzFramework/Entity/EntityContextBus.h>
  18. #include <AzFramework/Entity/GameEntityContextBus.h>
  19. #include <LmbrCentral\Rendering\MeshComponentBus.h>
  20. #include <LmbrCentral\Rendering\MaterialOwnerBus.h>
  21. #include <math.h>
  22.  
  23. #include "MeshComposedComponent.h"
  24.  
  25. using namespace LyTanks;
  26.  
  27. void MeshComposedComponent::Reflect(AZ::ReflectContext * context)
  28. {
  29.     AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context);
  30.  
  31.     if (serialize)
  32.     {
  33.         serialize->Class<MeshComposedComponent, AZ::Component >()
  34.             ->Version(1);
  35.  
  36.         AZ::EditContext* edit = serialize->GetEditContext();
  37.         if (edit)
  38.         {
  39.             edit->Class<MeshComposedComponent>("MeshComposedComponent", "")
  40.                 ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  41.                 ->Attribute(AZ::Edit::Attributes::Category, CATEGORY)
  42.                 ->Attribute("Icon", "Editor/Icons/Components/ComponentPlaceholder.png")
  43.                 ->Attribute("ViewportIcon", "Editor/Icons/Components/Viewport/ComponentPlaceholder.png")
  44.                 ->Attribute("AutoExpand", true)
  45.                 ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c));
  46.         }
  47.     }
  48. }
  49.  
  50. void MeshComposedComponent::Init()
  51. {
  52.  
  53. }
  54.  
  55. void MeshComposedComponent::Activate()
  56. {
  57.     AZ::TickBus::Handler::BusConnect();
  58.     AZ::EntityBus::MultiHandler::BusConnect(GetEntityId());
  59. }
  60.  
  61. void MeshComposedComponent::Deactivate()
  62. {
  63.     AZ::TickBus::Handler::BusDisconnect();
  64.     AZ::EntityBus::MultiHandler::BusDisconnect(GetEntityId());
  65. }
  66.  
  67. void MeshComposedComponent::OnTick(float deltaTime, AZ::ScriptTimePoint time)
  68. {
  69.     for(int i=0; i< m_childs.size(); i++)
  70.     {
  71.         m_childsPhase[i] += deltaTime;
  72.         m_childs[i]->GetTransform()->SetWorldTranslation(m_childsPosition[i] + AZ::Vector3(sin(m_childsPhase[i])* 3.f, 0.f, 0.f));
  73.     }
  74. }
  75.  
  76. void MeshComposedComponent::OnEntityActivated(const AZ::EntityId & entityId)
  77. {
  78.     using namespace LmbrCentral;
  79.     using namespace AzFramework;
  80.  
  81.     if (m_entity->GetId() == entityId) // if this for owner
  82.     {
  83.         LoadMeshAsset();
  84.         InitializeChildEntities();
  85.        
  86.     }
  87.     else // for childs
  88.     {
  89.         AZ::Entity* child = nullptr;
  90.         EBUS_EVENT_RESULT(child, AZ::ComponentApplicationBus, FindEntity, entityId);
  91.  
  92.         if (child)
  93.         {
  94.            
  95.         }
  96.     }
  97. }
  98.  
  99. void MeshComposedComponent::OnEntityDeactivated(const AZ::EntityId & entityId)
  100. {
  101.     for (AZStd::shared_ptr<AZ::Entity> childs : m_childs)
  102.     {
  103.         AZ::EntityBus::MultiHandler::BusDisconnect(childs->GetId());
  104.         childs.reset();
  105.     }
  106. }
  107.  
  108. void MeshComposedComponent::InitializeChildEntities()
  109. {
  110.     using namespace LmbrCentral;
  111.     using namespace AzFramework;
  112.  
  113.     if (m_isInitialized)
  114.     {
  115.         m_childs.clear();
  116.         m_childsPosition.clear();
  117.         m_childsPhase.clear();
  118.     }
  119.  
  120.     m_childs.resize(TypeElement::MAX_ELEMENT);
  121.     m_childsPosition.resize(TypeElement::MAX_ELEMENT);
  122.     m_childsPhase.resize(TypeElement::MAX_ELEMENT);
  123.  
  124.     for (int i = 0; i < m_childs.size(); ++i)
  125.     {
  126.         m_childs[i] = AZStd::make_shared<AZ::Entity>("ChildEntity" + ToString(i));
  127.         if (m_childs[i])
  128.         {
  129.             // Before child entity activation create all necessary components
  130.             AzFramework::TransformComponent* transform = azdynamic_cast<TransformComponent*>(m_childs[i]->CreateComponent(AZ::TransformComponentTypeId));
  131.             if (transform)
  132.             {
  133.                 AZ::Vector3 pos = m_entity->GetTransform()->GetWorldTranslation();
  134.                 AZ::TransformConfig conf;
  135.                 conf.m_isStatic = false;
  136.                 m_childsPosition[i] = pos + AZ::Vector3(0, 0, i * 2.0f);
  137.                 m_childsPhase[i] = i*10.0f;
  138.  
  139.                 conf.m_worldTransform = AZ::Transform::CreateTranslation(m_childsPosition[i]);
  140.                 conf.m_netSyncEnabled = false;
  141.                 conf.m_parentId = m_entity->GetId();
  142.                 conf.m_parentActivationTransformMode = AZ::TransformConfig::ParentActivationTransformMode::MaintainCurrentWorldTransform;
  143.                 conf.m_interpolatePosition = AZ::InterpolationMode::LinearInterpolation;
  144.                 conf.m_interpolatePosition = AZ::InterpolationMode::LinearInterpolation;
  145.  
  146.                 transform->SetConfiguration(conf);
  147.             }
  148.  
  149.             LmbrCentral::MeshComponent* mesh = azdynamic_cast<MeshComponent*>(m_childs[i]->CreateComponent(AZ::AzTypeInfo<LmbrCentral::MeshComponent>::Uuid()));
  150.             if (mesh)
  151.             {
  152.                 if (meshAsset.GetId().IsValid())
  153.                 {
  154.                     mesh->Activate();
  155.                     mesh->SetMeshAsset(meshAsset.GetId());
  156.                     mesh->SetVisibility(true);
  157.                     mesh->SetMaterial(m_materialOverride);
  158.                     //LmbrCentral::MaterialOwnerRequestBus::Event(m_rawCameraRig[i]->GetId(), &LmbrCentral::MaterialOwnerRequestBus::Events::SetMaterial, m_materialOverride); 
  159.                 }
  160.             }
  161.  
  162.             // Can't add component while the entity is active!
  163.             m_childs[i]->Init();
  164.             m_childs[i]->Activate();
  165.  
  166.             // Owner Entity(parent entity) subscribs for the child's EntityBus events (activate/deactivate)
  167.             AZ::EntityBus::MultiHandler::BusConnect(m_childs[i]->GetId());
  168.         }
  169.     }
  170.     m_isInitialized = true;
  171. }
  172.  
  173. void MeshComposedComponent::LoadMeshAsset()
  174. {
  175.     using namespace LmbrCentral;
  176.     // 1. load material
  177.     const AZStd::string& materialOverridePath = "Objects\\default\\box1x1_green.mtl"; //"objects/default/editorprimitive.mtl";
  178.     m_materialOverride = gEnv->p3DEngine->GetMaterialManager()->LoadMaterial(materialOverridePath.c_str(), true, true, 0);
  179.  
  180.     AZ_Warning("LoadMeshAsset", m_materialOverride != gEnv->p3DEngine->GetMaterialManager()->GetDefaultMaterial(),
  181.         "Failed to load override Material \"%s\".",
  182.         materialOverridePath.c_str());
  183.  
  184.     // 2. load mesh
  185.     AZ::Data::AssetId sliceAssetId;
  186.     const AZStd::string fileName = "Objects/default/box1x1.cgf";//"objects/default/primitive_sphere.cgf";
  187.     EBUS_EVENT_RESULT(sliceAssetId, AZ::Data::AssetCatalogRequestBus, GetAssetIdByPath, fileName.c_str(), AZ::AzTypeInfo<AZ::Data::Asset<MeshAsset>>::Uuid(), true);
  188.     //AZ::Data::AssetCatalogRequestBus::BroadcastResult(sliceAssetId, fileName.c_str(), AZ::AzTypeInfo<AZ::Data::Asset<MeshAsset>>::Uuid(), true);
  189.     //AZ::Data::AssetBus::Handler::BusConnect(sliceAssetId);
  190.     if (sliceAssetId.IsValid())
  191.     {
  192.         // Using the valid ID, find the actual slice asset
  193.         meshAsset.Create(sliceAssetId, true);
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement