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