BVB Source Codes

CRYENGINE Show BreezeGenerator.cpp Source code

Return Download CRYENGINE: download BreezeGenerator.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "BreezeGenerator.h"
  5.  
  6. namespace
  7. {
  8. static inline Vec3 RandomPosition(const Vec3& centre, const Vec3& wind_speed, float life_time, float radius, float extents)
  9. {
  10.         Vec3 result;
  11.         result.x = centre.x - (wind_speed.x * life_time * 0.5f) + cry_random(-radius, radius);
  12.         result.y = centre.y - (wind_speed.y * life_time * 0.5f) + cry_random(-radius, radius);
  13.         result.z = centre.z - (wind_speed.z * life_time * 0.5f) + cry_random(-radius, radius);
  14.         return result;
  15. }
  16.  
  17. static inline Vec3 RandomDirection(const Vec3& dir, float spread)
  18. {
  19.         return Matrix33::CreateRotationZ(DEG2RAD(cry_random(-spread, spread))) * dir;
  20. }
  21. }
  22.  
  23. struct SBreeze
  24. {
  25.         IPhysicalEntity* wind_area;
  26.         Vec3             position;
  27.         Vec3             direction;
  28.         float            lifetime;
  29.  
  30.         SBreeze()
  31.                 : wind_area()
  32.                 , position()
  33.                 , direction()
  34.                 , lifetime(-1.f)
  35.         {}
  36. };
  37.  
  38. CBreezeGenerator::CBreezeGenerator()
  39.         : m_breezes(nullptr)
  40.         , m_spawn_radius(0.0f)
  41.         , m_spread(0.0f)
  42.         , m_count(0)
  43.         , m_radius(0.0f)
  44.         , m_lifetime(0.0f)
  45.         , m_variance(0.0f)
  46.         , m_strength(0.0f)
  47.         , m_movement_speed(0.0f)
  48.         , m_wind_speed(ZERO)
  49.         , m_fixed_height(0.0f)
  50.         , m_awake_thresh(0.0f)
  51.         , m_enabled(false)
  52. {
  53.  
  54. }
  55.  
  56. CBreezeGenerator::~CBreezeGenerator()
  57. {
  58.         Shutdown();
  59. }
  60.  
  61. void CBreezeGenerator::Initialize()
  62. {
  63.         if (m_enabled && m_count)
  64.         {
  65.                 m_breezes = new SBreeze[m_count];
  66.                 for (uint32 i = 0; i < m_count; ++i)
  67.                 {
  68.                         primitives::box geomBox;
  69.                         geomBox.Basis.SetIdentity();
  70.                         geomBox.center = Vec3(0, 0, 0);
  71.                         geomBox.size = Vec3(
  72.                           cry_random(m_radius, m_radius + m_variance),
  73.                           cry_random(m_radius, m_radius + m_variance),
  74.                           cry_random(m_radius, m_radius + m_variance));
  75.                         geomBox.bOriented = 0;
  76.                         IGeometry* pGeom = gEnv->pPhysicalWorld->GetGeomManager()->CreatePrimitive(primitives::box::type, &geomBox);
  77.                         m_breezes[i].wind_area = gEnv->pPhysicalWorld->AddArea(pGeom, Vec3(0, 0, 0), Quat::CreateIdentity(), 1.f);
  78.  
  79.                         pe_params_buoyancy buoyancy;
  80.                         buoyancy.waterDensity = 1.f;
  81.                         buoyancy.waterResistance = 1.f;
  82.                         buoyancy.waterFlow = m_wind_speed * cry_random(0.0f, m_strength);
  83.                         buoyancy.iMedium = 1;
  84.                         buoyancy.waterPlane.origin.Set(0, 0, 1e6f);
  85.                         buoyancy.waterPlane.n.Set(0, 0, -1);
  86.                         m_breezes[i].wind_area->SetParams(&buoyancy);
  87.  
  88.                         pe_params_area area;
  89.                         area.bUniform = 1;
  90.                         area.falloff0 = 0.80f;
  91.                         m_breezes[i].wind_area->SetParams(&area);
  92.  
  93.                         pe_params_foreign_data fd;
  94.                         fd.iForeignFlags = PFF_OUTDOOR_AREA;
  95.                         m_breezes[i].wind_area->SetParams(&fd);
  96.                 }
  97.         }
  98. }
  99.  
  100. void CBreezeGenerator::Reset()
  101. {
  102.         Shutdown();
  103.         Initialize();
  104. }
  105.  
  106. void CBreezeGenerator::Shutdown()
  107. {
  108.         if (m_enabled)
  109.                 for (uint32 i = 0; i < m_count; ++i)
  110.                         gEnv->pPhysicalWorld->DestroyPhysicalEntity(m_breezes[i].wind_area);
  111.  
  112.         delete[] m_breezes;
  113.         m_breezes = NULL;
  114.         m_count = 0;
  115. }
  116.  
  117. void CBreezeGenerator::Update()
  118. {
  119.         FUNCTION_PROFILER(gEnv->pSystem, PROFILE_3DENGINE);
  120.         if (!m_enabled)
  121.                 return;
  122.  
  123.         pe_params_buoyancy buoyancy;
  124.         buoyancy.waterDensity = 1.f;
  125.         buoyancy.waterResistance = 1.f;
  126.         buoyancy.iMedium = 1;
  127.  
  128.         pe_params_pos pp;
  129.         const float frame_time = GetTimer()->GetFrameTime();
  130.         const Vec3 centre = Get3DEngine()->GetRenderingCamera().GetPosition();
  131.         for (uint32 i = 0; i < m_count; ++i)
  132.         {
  133.                 SBreeze& breeze = m_breezes[i];
  134.                 breeze.lifetime -= frame_time;
  135.                 if (breeze.lifetime < 0.f)
  136.                 {
  137.                         Vec3 pos = RandomPosition(centre, m_wind_speed, m_lifetime, m_spawn_radius, m_radius);
  138.                         if (m_fixed_height != -1.f)
  139.                                 pos.z = m_fixed_height;
  140.                         else
  141.                                 pos.z = Get3DEngine()->GetTerrainElevation(pos.x, pos.y) - m_radius * 0.5f;
  142.                         breeze.position = pp.pos = pos;
  143.                         buoyancy.waterFlow = breeze.direction = RandomDirection(m_wind_speed, m_spread) * cry_random(0.0f, m_strength);
  144.                         breeze.wind_area->SetParams(&pp);
  145.                         breeze.wind_area->SetParams(&buoyancy);
  146.                         breeze.lifetime = m_lifetime * cry_random(0.5f, 1.0f);
  147.                 }
  148.                 else
  149.                 {
  150.                         pp.pos = (breeze.position += breeze.direction * m_movement_speed * frame_time);
  151.                         if (m_fixed_height != -1.f)
  152.                                 pp.pos.z = m_fixed_height;
  153.                         else
  154.                                 pp.pos.z = Get3DEngine()->GetTerrainElevation(pp.pos.x, pp.pos.y) - m_radius * 0.5f;
  155.                         breeze.wind_area->SetParams(&pp);
  156.  
  157.                         if (m_awake_thresh)
  158.                         {
  159.                                 pe_params_bbox pbb;
  160.                                 breeze.wind_area->GetParams(&pbb);
  161.                                 Vec3 sz = (pbb.BBox[1] - pbb.BBox[0]) * 0.5f;
  162.                                 float kv = m_strength * buoyancy.waterResistance;
  163.                                 IPhysicalEntity* pentBuf[128], ** pents = pentBuf;
  164.                                 pe_params_part ppart;
  165.                                 pe_action_awake aa;
  166.                                 for (int j = gEnv->pPhysicalWorld->GetEntitiesInBox(pp.pos - sz, pp.pos + sz, pents, ent_sleeping_rigid | ent_allocate_list, 128) - 1; j >= 0; j--)
  167.                                         for (ppart.ipart = 0; pents[j]->GetParams(&ppart); ppart.ipart++)
  168.                                                 if (sqr(ppart.pPhysGeom->V * cube(ppart.scale)) * cube(kv) > cube(ppart.mass * m_awake_thresh))
  169.                                                 {
  170.                                                         pents[j]->Action(&aa);
  171.                                                         break;
  172.                                                 }
  173.                                 if (pents != pentBuf)
  174.                                         gEnv->pPhysicalWorld->GetPhysUtils()->DeletePointer(pents);
  175.                         }
  176.                 }
  177.         }
  178. }
  179.  
downloadBreezeGenerator.cpp 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