// CGfxCrowd - [2020-04-13 11:57:46]
#ifndef _CGFXCROWD_H_
#define _CGFXCROWD_H_
#include "TGfxCrowdState.h"
#include "CFTTModel.h"
#include "FTTVector.h"
#include "CStaticAABBTree.h"
#include "FTTUPtr.h"
#include "CrowdTextureCreationData.h"
#include "TDrawCall.h"
#include "CGfxCrowdCardGroup.h"
#include "CGfxCrowdFlagRender.h"
#include "CFTTRenderToTexture.h"
#include "TCrowd.h"
//class TGfxCrowdState;
/*
0019691C CGfxCrowd::CGfxCrowd()
00196A10 CGfxCrowd::~CGfxCrowd()
001968CC CGfxCrowd::Initialise()
001968EC CGfxCrowd::Shutdown()
0019690C CGfxCrowd::Get()
00196AF8 CGfxCrowd::Shut()
00196E72 CGfxCrowd::Init()
00197140 CGfxCrowd::AddStand(CFTTModel *,CFTTMatrix32)
00199D4C CGfxCrowd::GetCapacity(CFTTModel *,CFTTMatrix32)
00199E08 CGfxCrowd::AssessDesirability(TGfxCrowdSeat &)
00199E3C CGfxCrowd::AssessDesirability(TGfxCrowdSeat &,bool)
00199ED0 CGfxCrowd::Distribute(uint)
0019CBA0 CGfxCrowd::UpdateCrowdTextures(uint)
0019F7E4 CGfxCrowd::Render()
0019F85C CGfxCrowd::RenderSteward()
0019F990 CGfxCrowd::RenderStatic()
0019FCC8 CGfxCrowd::RenderDynamic()
001A101C CGfxCrowd::Process()
001A12C8 CGfxCrowd::GetCrowdState(float &,float &,float &)
001A12E6 CGfxCrowd::GetCapacity()
001A12EA CGfxCrowd::GetTextureCreationData()
001A12F0 CGfxCrowd::GetCrowdValue(ECrowdMemberType)
001A12FC CGfxCrowd::SetCrowdValue(ECrowdMemberType,float)

0xCBD4
*/

struct TGfxCrowdSection {
  int un_0;
};

struct TGfxCardSection {
  int un_0;
};

struct TGfxCrowdDynamic {
  int un_0;
};


struct TShot
{
  uchar b_0;
  uchar b_1;
  ushort field_2;
  float f_4;
  float f_8;
  float f_C;
  float f_10;
  float f_14;
  float f_18;
};

struct SortShots
{
  
};
/*
Crowd 相关类, 重点检查 Anderson

CGfxCrowd.cpp
CGfxCrowdCardGroup.cpp
CGfxCrowdFlagPhysics.cpp
CGfxCrowdFlagRender.cpp
CrowdSortB.cpp
CrowdSortD.cpp
CrowdTextureCreationData.cpp
TCrowdMember.cpp
TGfxCrowdState.cpp
*/
class CrowdTextureCreationData;
class CGfxCrowd {
public:
  CGfxCrowd();                                         // 0019691C
  ~CGfxCrowd();                                        // 00196A10
  static void Initialise();                            // 001968CC
  static void Shutdown();                              // 001968EC
  static CGfxCrowd *Get();                             // 0019690C
  static void Shut();                                  // 00196AF8
  void Init();                                         // 00196E72
  void AddStand(CFTTModel *, CFTTMatrix32);            // 00197140
  void GetCapacity(CFTTModel *, CFTTMatrix32);         // 00199D4C
  void AssessDesirability(TGfxCrowdSeat &);            // 00199E08
  void AssessDesirability(TGfxCrowdSeat &, bool);      // 00199E3C
  void Distribute(uint);                               // 00199ED0
  void UpdateCrowdTextures(uint);               // 0019CBA0
  void Render();                                       // 0019F7E4
  void RenderSteward();                                // 0019F85C
  void RenderStatic();                                 // 0019F990
  void RenderDynamic();                                // 0019FCC8
  void Process();                                      // 001A101C
  void GetCrowdState(float &, float &, float &);       // 001A12C8
  int GetCapacity();                                   // 001A12E6
  CrowdTextureCreationData *GetTextureCreationData();  // 001A12EA
  float GetCrowdValue(ECrowdMemberType);               // 001A12F0
  void SetCrowdValue(ECrowdMemberType, float);         // 001A12FC

  FTTVector<TGfxCrowdSeat> vec_0;
  FTTVector<TGfxCrowdSeat> vec_14;
  FTTVector<TGfxCrowdDynamic> vec_28;
  FTTVector<TGfxCardSection> vec_3C;
  FTTVector<FTTUPtr<CGfxCrowdFlagPhysics>> vec_50;
  FTTVector<FTTUPtr<CGfxCrowdFlagRender>> vec_64;
  FTTVector<FTTUPtr<CGfxCrowdCardGroup>> vec_78;
  FTTUPtr<CFTTRenderHelper> aVec_8C[2];
  FTTUPtr<CFTTRenderHelper> tUPtr_94;
  FTTUPtr<CFTTRenderHelper> tUPtr_98;

  CFTTTexture *ptexture_9C;
  CFTTTexture *ptexture_A0;
  CFTTTexture *ptexture_A4;

  FTTVector<uint> vec_A8;
  FTTVector<TDrawCall> vec_BC;

  FTTUPtr<CrowdTextureCreationData> tPtrTextureData_D0;

  int field_D4;

  struct CGfxCrowd_D8
  {
    float f_0;
    float f_4;
    float f_8;
    float f_C;
    float f_10;
    float f_14;
    float f_18;
    float f_1C;
    float f_20;
    int f_24;
    int f_28;
    int f_2C;
  }data_d8[0x20][0x20];
  //int field_D8;

  // uchar field_6D8[0xB9FC];  //????????????????????????????????????????????????????? 未知

  // int field_C0D4;

  FTTVector<TGfxCrowdSection> vec_C0D8;
  
  TGfxCrowdState tCrowd_C0EC[9];
  TGfxCrowdState tCrowd_C1A0[32][4];

  FTTVector<CStaticAABBTree<ushort, 16u>> vec_CBA0;

  bool  b_CBB4;
  bool  b_CBB5;
  bool  b_CBB6;
  bool  b_CBB7;
  float f_CBB8;
  uint dCrowdNewShaderID_CBBC[3];  // 00196A3C 此处可以确定是一个数组
  float f_CBC8[3];                 // 001A12FC

  static CGfxCrowd *ms_pInstance;
};

#endif  //_CGFXCROWD_H_