1 #pragma once
2 #include "BaseApp.h"
3 #include "../vdrift/mathvector.h"
4 #include "../vdrift/quaternion.h"
5 #include "../vdrift/tracksurface.h"
6 #include "../vdrift/track.h"
7 #include "../ogre/common/data/SceneXml.h"  //Object-
8 #include "../ogre/common/PreviewTex.h"
9 
10 #include <OgreCommon.h>
11 #include <OgreVector3.h>
12 #include <OgreString.h>
13 #include <OgreRenderTargetListener.h>
14 #include <OgreShadowCameraSetup.h>
15 #include <OgreTexture.h>
16 #include "../shiny/Main/Factory.hpp"
17 
18 #define BrushMaxSize  512
19 
20 //  Gui
21 const int ciAngSnapsNum = 7;
22 const Ogre::Real crAngSnaps[ciAngSnapsNum] = {0,5,15,30,45,90,180};
23 
24 namespace Ogre  {  class Rectangle2D;  class SceneNode;  class RenderTexture;  }
25 namespace sh {  class Factory;  }
26 class CScene;  class CGui;  class CGuiCom;
27 
28 enum ED_OBJ {  EO_Move=0, EO_Rotate, EO_Scale  };
29 
30 
31 class App : public BaseApp,
32 			public sh::MaterialListener,
33 			public Ogre::RenderTargetListener
34 {
35 public:
36 	App(class SETTINGS* pSet1);
37 	virtual ~App();
38 
39 	class Instanced* inst;
40 
41 	CScene* scn;
42 
43 	//  materials
44 	sh::Factory* mFactory;
45 	void postInit(), SetFactoryDefaults();
46 	virtual void materialCreated(sh::MaterialInstance* m, const std::string& configuration, unsigned short lodIndex);
47 
48 
49 	///  Gui
50 	CGui* gui;
51 	CGuiCom* gcom;
52 
53 	PreviewTex prvView,prvRoad,prvTer;  // track tab
54 
55 	float mTimer;
56 
57 
58 	///  main
59 	void LoadTrack(), SaveTrack(), UpdateTrack();
60 
61 	void SetEdMode(ED_MODE newMode);
62 	void UpdVisGui(), UpdEditWnds();
63 	void UpdWndTitle(), SaveCam();
64 
65 
66 	bool keyPressed(const SDL_KeyboardEvent &arg);
67 
68 	void LoadTrackEv(), SaveTrackEv(), UpdateTrackEv();
69 	enum TrkEvent {  TE_None=0, TE_Load, TE_Save, TE_Update  } eTrkEvent;
70 
71 	virtual void createScene();
72 	virtual void destroyScene();
73 
74 	virtual bool frameStarted(const Ogre::FrameEvent& evt);
75 	virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
76 	virtual bool frameEnded(const Ogre::FrameEvent& evt);
77 
78 	void processMouse(double dt);
79 	Ogre::Vector3 vNew;	void editMouse();
80 
81 
82 	//  create  . . . . . . . . . . . . . . . . . . . . . . . .
83 	bool bNewHmap, bTrGrUpd;
84 	Ogre::String resTrk;  void NewCommon(bool onlyTerVeget);
85 
86 	void CreateObjects(), DestroyObjects(bool clear), ResetObjects();
87 	void UpdObjPick(), PickObject(), ToggleObjSim();
88 
89 
90 	///  rnd to tex  minimap  * * * * * * * * *
91 	Ogre::SceneNode *ndPos;
92 	Ogre::ManualObject* mpos;
93 	Ogre::ManualObject* Create2D(const Ogre::String& mat, Ogre::Real s, bool dyn=false);
94 	Ogre::Real asp, xm1,ym1,xm2,ym2;
95 
96 	const static int RTs = 4, RTsAdd = 2;
97 	struct SRndTrg
98 	{
99 		Ogre::Camera* cam;  Ogre::RenderTexture* tex;
100 		Ogre::Rectangle2D* mini;	Ogre::SceneNode* ndMini;
SRndTrgSRndTrg101 		SRndTrg() : cam(0),tex(0),mini(0),ndMini(0) {  }
102 	};
103 	SRndTrg rt[RTs+RTsAdd];
104 
105 	void Rnd2TexSetup(), UpdMiniVis();
106 	virtual void preRenderTargetUpdate(const Ogre::RenderTargetEvent &evt);
107 	virtual void postRenderTargetUpdate(const Ogre::RenderTargetEvent &evt);
108 
109 
110 	//  fluids
111 	int iFlCur;  bool bRecreateFluids;
112 	void UpdFluidBox(), UpdMtrWaterDepth();
113 
114 
115 	//  terrain cursor, circle mesh
116 	Ogre::ManualObject* moTerC;
117 	Ogre::SceneNode* ndTerC;
118 	void TerCircleInit(), TerCircleUpd();
119 
120 	//  brush preview tex
121 	void createBrushPrv();
122 	void updateBrushPrv(bool first=false), updateTerPrv(bool first=false);
123 
124 	bool bUpdTerPrv;
125 	Ogre::TexturePtr brushPrvTex, terPrvTex;
126 	const static int BrPrvSize = 128, TerPrvSize = 256;
127 
128 
129 	///<>  terrain edit, brush
130 	enum EBrShape
131 	{   BRS_Triangle=0, BRS_Sinus, BRS_Noise, BRS_Noise2, BRS_Ngon, BRS_ALL  }  mBrShape[ED_ALL];
132 	const static Ogre::String csBrShape[BRS_ALL];
133 
134 	struct BrushSet  // brush preset ----
135 	{
136 		ED_MODE edMode;  int curBr;
137 		float Size,Intens,Pow,Fq,NOf;
138 		int Oct;  EBrShape shape;
139 		float Filter,HSet;
140 		signed char newLine;  Ogre::String name;
141 	};
142 
143 	const static int brSetsNum = 87;
144 	const static BrushSet brSets[brSetsNum];
145 	const static float brClr[4][3];
146 
147 	void SetBrushPreset(int id);
148 	void updBrush();
149 
150 
151 	//  brush vars
152 	int curBr;
153 	bool bTerUpd,bTerUpdBlend;  char sBrushTest[512];
154 	float* pBrFmask, *mBrushData;
155 	bool brLockPos;
156 
157 	//  params
158 	float terSetH, mBrFilt,mBrFiltOld;
159 	float mBrSize[ED_ALL],mBrIntens[ED_ALL], mBrPow[ED_ALL];
160 	float mBrFq[ED_ALL],mBrNOf[ED_ALL];  int mBrOct[ED_ALL];
161 
162 
163 	//  brush deform
164 	bool getEditRect(Ogre::Vector3& pos, Ogre::Rect& brushrect, Ogre::Rect& maprect, int size, int& cx, int& cy);
165 
166 	//  terrain edit
167 	void deform(Ogre::Vector3 &pos, float dtime, float brMul);
168 	void height(Ogre::Vector3 &pos, float dtime, float brMul);
169 
170 	void smooth(Ogre::Vector3 &pos, float dtime);
171 	void smoothTer(Ogre::Vector3 &pos, float avg, float dtime);
172 	void calcSmoothFactor(Ogre::Vector3 &pos, float& avg, int& sample_count);
173 
174 	void filter(Ogre::Vector3 &pos, float dtime, float brMul);
175 
176 
177 	///  bullet world, simulate
178 	class btDiscreteDynamicsWorld* world;
179 	class btDefaultCollisionConfiguration* config;
180 	class btCollisionDispatcher* dispatcher;
181 	class bt32BitAxisSweep3* broadphase;
182 	class btSequentialImpulseConstraintSolver* solver;
183 
184 	void BltWorldInit(), BltWorldDestroy(), BltClear(), BltUpdate(float dt);
185 
186 
187 	//  tools, road  -in base
188 	void SaveGrassDens(), SaveWaterDepth();
189 	void AlignTerToRoad();
190 	int iSnap;  Ogre::Real angSnap;
191 
192 
193 	//  car start
194 	void UpdStartPos();
195 	Ogre::SceneNode* ndCar,*ndStBox,*ndFluidBox,*ndObjBox;
196 	Ogre::Entity*  entCar,*entStBox,*entFluidBox,*entObjBox;
197 	void togPrvCam();
198 
199 
200 	//  [Objects]  ----
201 	ED_OBJ objEd;  // edit mode
202 
203 	int iObjCur;  // picked id
204 	int iObjLast;  // last counter, just for naming
205 
206 	//  new object's type
207 	int iObjTNew;  // id for vObjNames
208 	std::vector<std::string> vObjNames, vBuildings;
209 	void SetObjNewType(int tnew), UpdObjNewNode();
210 
211 	void AddNewObj(bool getName=true);
212 
213 	std::set<int> vObjSel;  // selected ids for sc.objects[]
214 	void UpdObjSel();  // upd selected glow
215 	Ogre::Vector3 GetObjPos0();  // sel center
216 
217 	bool objSim;  // dynamic simulate on
218 	Object objNew;  //Object*..
219 
220 	std::vector<Object> vObjCopy;  // copied objects
221 
222 
223 
224 	//-  vdrift track
225 	TRACK* track;
226 	Ogre::StaticGeometry* mStaticGeom;
227 
228 	class btCollisionObject* trackObject;
229 	class btTriangleIndexVertexArray* trackMesh;
230 
231 	bool IsVdrTrack();
232 	bool LoadTrackVdr(const std::string & trackname);
233 	void CreateVdrTrack(std::string strack, class TRACK* pTrack),
234 		CreateVdrTrackBlt(), DestroyVdrTrackBlt();
235 	static Ogre::ManualObject* CreateModel(Ogre::SceneManager* sceneMgr, const Ogre::String& mat,
236 		class VERTEXARRAY* a, Ogre::Vector3 vPofs, bool flip, bool track=false, const Ogre::String& name="");
237 
238 	//  surfaces
239 	std::vector <TRACKSURFACE> surfaces;  // all
240 	std::map <std::string, int> surf_map;  // name to surface id
241 	bool LoadAllSurfaces();
242 
243 };
244