1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef _I_TREE_DRAWER_H_
#define _I_TREE_DRAWER_H_
#include <vector>
#include "Rendering/GL/myGL.h"
#include "System/EventClient.h"
#include "System/float3.h"
const int TREE_SQUARE_SIZE = 64;
static const float MID_TREE_DIST_FACTOR = 1.0f;
static const float FADE_TREE_DIST_FACTOR = 1.5f;
static const float FAR_TREE_DIST_FACTOR = 2.0f;
class ITreeDrawer : public CEventClient
{
public:
ITreeDrawer();
virtual ~ITreeDrawer();
static ITreeDrawer* GetTreeDrawer();
void SetupState() const;
void ResetState() const;
void Draw();
virtual void Draw(float treeDistance) = 0;
virtual void DrawShadowPass() {}
virtual void Update() = 0;
virtual void ResetPos(const float3& pos);
virtual void AddTree(int treeID, int treeType, const float3& pos, float size);
virtual void DeleteTree(int treeID, const float3& pos);
virtual void AddFallingTree(int treeID, int treeType, const float3& pos, const float3& dir) {}
bool WantsEvent(const std::string& eventName) {
return
(eventName == "RenderFeatureCreated") ||
(eventName == "FeatureMoved") ||
(eventName == "RenderFeatureDestroyed");
}
float IncrDrawDistance() { return (baseTreeDistance += 0.2f); }
float DecrDrawDistance() { return (baseTreeDistance -= 0.2f); }
int NumTreesX() const { return treesX; }
int NumTreesY() const { return treesY; }
bool& DrawTreesRef() { return drawTrees; }
bool& WireFrameModeRef() { return wireFrameMode; }
void RenderFeatureCreated(const CFeature* feature);
void FeatureMoved(const CFeature* feature, const float3& oldpos);
void RenderFeatureDestroyed(const CFeature* feature);
public:
struct TreeStruct {
public:
bool operator == (const TreeStruct& ts) const { return (id == ts.id); }
public:
int id;
int type;
float3 pos;
};
struct TreeSquareStruct {
TreeSquareStruct()
: dispList(0)
, farDispList(0)
, lastSeen(0)
, lastSeenFar(0)
, viewVector(UpVector)
{}
unsigned int dispList;
unsigned int farDispList;
int lastSeen;
int lastSeenFar;
float3 viewVector;
// all trees within this tree-square
std::vector<TreeStruct> trees;
};
std::vector<TreeSquareStruct> treeSquares;
std::vector<GLuint> delDispLists;
private:
void AddTrees();
protected:
float baseTreeDistance;
int treesX;
int treesY;
int nTrees;
bool drawTrees;
bool wireFrameMode;
};
extern ITreeDrawer* treeDrawer;
#endif // _I_TREE_DRAWER_H_
|