#pragma once
#include <vector>
#include "body.h"
#include "vector3.h"
#include "matrix4x4.h"
#include "sbre/sbre.h"

class ObjMesh;
class CollMeshSet;

class ModelBody: public Body {
public:
  OBJDEF(ModelBody, Body, MODELBODY);
  ModelBody(void);
  virtual ~ModelBody(void);
  void SetPosition(vector3d p);
  virtual void SetRotMatrix(const matrix4x4d& r);
  /* Not valid to SetVelocity on these. If you want them to move, use a DynamicBody. */
  vector3d GetPosition(void) const;
  virtual double GetRadius(void) const;
  void TransformToModelCoords(const Frame* camFrame);
  void GetRotMatrix(matrix4x4d& m) const;
  virtual void SetFrame(Frame* f);
  void GeomsSetBody(dBodyID body);
  /* To remove from simulation for a period. */
  virtual void Disable(void);
  virtual void Enable(void);
  void GetAabb(Aabb& aabb);

  void TriMeshUpdateLastPos(void);
  void SetModel(int sbreModel);

  void RenderSbreModel(const Frame* camFrame, int model, ObjParams* params);
  
  class Geom : public Object {
  public:
    OBJDEF(Geom, Object, GEOM);
    Body* parent;
    int flags;
  };
protected:
  virtual void Save(void);
  virtual void Load(void);
  std::vector<Geom> geomColl;
private:
  CollMeshSet* m_collMeshSet;
  std::vector<dGeomID> geoms;
  dReal m_triMeshTrans[32];
  int m_triMeshLastMatrixIndex;
};