#include #include #include #include "flow.h" CFlow::CFlow() { m_pCells = 0; m_Height = 0; m_Width = 0; m_Spacing = 16; } void CFlow::DbgRender() { if(!m_pCells) return; IGraphics::CLineItem Array[1024]; int NumItems = 0; Graphics()->TextureSet(-1); Graphics()->LinesBegin(); for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) { vec2 Pos(x*m_Spacing, y*m_Spacing); vec2 Vel = m_pCells[y*m_Width+x].m_Vel * 0.01f; Array[NumItems++] = IGraphics::CLineItem(Pos.x, Pos.y, Pos.x+Vel.x, Pos.y+Vel.y); if(NumItems == 1024) { Graphics()->LinesDraw(Array, 1024); NumItems = 0; } } if(NumItems) Graphics()->LinesDraw(Array, NumItems); Graphics()->LinesEnd(); } void CFlow::Init() { if(m_pCells) { mem_free(m_pCells); m_pCells = 0; } CMapItemLayerTilemap *pTilemap = Layers()->GameLayer(); m_Width = pTilemap->m_Width*32/m_Spacing; m_Height = pTilemap->m_Height*32/m_Spacing; // allocate and clear m_pCells = (CCell *)mem_alloc(sizeof(CCell)*m_Width*m_Height, 1); for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pCells[y*m_Width+x].m_Vel = vec2(0.0f, 0.0f); } void CFlow::Update() { if(!m_pCells) return; for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pCells[y*m_Width+x].m_Vel *= 0.85f; } vec2 CFlow::Get(vec2 Pos) { if(!m_pCells) return vec2(0,0); int x = (int)(Pos.x / m_Spacing); int y = (int)(Pos.y / m_Spacing); if(x < 0 || y < 0 || x >= m_Width || y >= m_Height) return vec2(0,0); return m_pCells[y*m_Width+x].m_Vel; } void CFlow::Add(vec2 Pos, vec2 Vel, float Size) { if(!m_pCells) return; int x = (int)(Pos.x / m_Spacing); int y = (int)(Pos.y / m_Spacing); if(x < 0 || y < 0 || x >= m_Width || y >= m_Height) return; m_pCells[y*m_Width+x].m_Vel += Vel; }