Colobot
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
engine.h
Go to the documentation of this file.
1 // * This file is part of the COLOBOT source code
2 // * Copyright (C) 2001-2008, Daniel ROUX& EPSITEC SA, www.epsitec.ch
3 // * Copyright (C) 2012, Polish Portal of Colobot (PPC)
4 // *
5 // * This program is free software: you can redistribute it and/or modify
6 // * it under the terms of the GNU General Public License as published by
7 // * the Free Software Foundation, either version 3 of the License, or
8 // * (at your option) any later version.
9 // *
10 // * This program is distributed in the hope that it will be useful,
11 // * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // * GNU General Public License for more details.
14 // *
15 // * You should have received a copy of the GNU General Public License
16 // * along with this program. If not, see http://www.gnu.org/licenses/.
17 
23 #pragma once
24 
25 
26 #include "app/system.h"
27 #include "app/pausemanager.h"
28 
29 #include "common/event.h"
30 #include "common/singleton.h"
31 
32 #include "graphics/core/color.h"
33 #include "graphics/core/material.h"
34 #include "graphics/core/texture.h"
35 #include "graphics/core/vertex.h"
36 
38 
39 #include "math/intpoint.h"
40 #include "math/matrix.h"
41 #include "math/point.h"
42 #include "math/vector.h"
43 
44 
45 #include <string>
46 #include <vector>
47 #include <map>
48 #include <set>
49 
50 
51 class CApplication;
52 class CObject;
53 class CSoundInterface;
54 class CImage;
55 
56 
57 // Graphics module namespace
58 namespace Gfx {
59 
60 
61 class CDevice;
62 class CLightManager;
63 class CText;
64 class CParticle;
65 class CWater;
66 class CCloud;
67 class CLightning;
68 class CPlanet;
69 class CTerrain;
70 
71 
80 {
90  ENG_RSTATE_WRAP = (1<<3),
92  ENG_RSTATE_CLAMP = (1<<4),
94  ENG_RSTATE_LIGHT = (1<<5),
104  ENG_RSTATE_PART3 = (1<<10),
106  ENG_RSTATE_PART4 = (1<<11),
108  ENG_RSTATE_2FACE = (1<<12),
110  ENG_RSTATE_ALPHA = (1<<13),
112  ENG_RSTATE_SECOND = (1<<14),
114  ENG_RSTATE_FOG = (1<<15),
120  ENG_RSTATE_TEXT = (1<<18),
125 };
126 
127 
133 {
138 };
139 
145 {
151  int state;
153  std::string tex1Name;
155  std::string tex2Name;
156 
157  inline EngineTriangle()
158  {
160  }
161 };
162 
167 {
182 };
183 
184 
190 {
191  EngineTriangleType type;
192  Material material;
193  int state;
194  std::vector<VertexTex2> vertices;
195  unsigned int staticBufferId;
196  bool updateStaticBuffer;
197 
199  const Material& _material = Material(),
200  int _state = ENG_RSTATE_NORMAL)
201  : type(_type)
202  , material(_material)
203  , state(_state)
204  , staticBufferId(0)
205  , updateStaticBuffer(false)
206  {}
207 };
208 
214 {
215  LODLevel lodLevel;
216  std::vector<EngineBaseObjDataTier> next;
217 
218  inline EngineBaseObjLODTier(LODLevel _lodLevel = LOD_Constant)
219  : lodLevel(_lodLevel)
220  {}
221 };
222 
228 {
229  std::string tex1Name;
230  Texture tex1;
231  std::string tex2Name;
232  Texture tex2;
233  std::vector<EngineBaseObjLODTier> next;
234 
235  inline EngineBaseObjTexTier(const std::string& _tex1Name = "", const std::string& _tex2Name = "")
236  : tex1Name(_tex1Name)
237  , tex2Name(_tex2Name)
238  {}
239 };
240 
248 {
250  bool used;
258  float radius;
260  std::vector<EngineBaseObjTexTier> next;
261 
262  inline EngineBaseObject()
263  {
264  LoadDefault();
265  }
266 
267  inline void LoadDefault()
268  {
269  used = false;
270  totalTriangles = 0;
271  bboxMax.LoadZero();
272  bboxMin.LoadZero();
273  radius = 0.0f;
274  }
275 };
276 
282 {
284  bool used;
288  bool visible;
290  bool drawWorld;
292  bool drawFront;
298  float distance;
303 
305  inline EngineObject()
306  {
307  LoadDefault();
308  }
309 
311  inline void LoadDefault()
312  {
313  used = false;
314  baseObjRank = -1;
315  visible = false;
316  drawWorld = false;
317  drawFront = false;
320  distance = 0.0f;
321  shadowRank = -1;
322  transparency = 0.0f;
323  }
324 };
325 
331 {
336 };
337 
343 {
345  bool used;
347  bool hide;
349  int objRank;
357  float angle;
359  float radius;
361  float intensity;
363  float height;
364 
365  inline EngineShadow()
366  {
367  LoadDefault();
368  }
369 
370  inline void LoadDefault()
371  {
372  used = false;
373  hide = false;
374  objRank = 0;
376  pos.LoadZero();
377  normal.LoadZero();
378  angle = radius = intensity = height = 0.0f;
379  }
380 };
381 
387 {
389  bool used;
393  float min;
395  float max;
397  float smooth;
401  float radius;
405  float drawRadius;
406 
407  inline EngineGroundSpot()
408  {
409  LoadDefault();
410  }
411 
412  inline void LoadDefault()
413  {
414  used = false;
415  color = Color();
416  pos.LoadZero();
417  drawPos.LoadZero();
418  min = max = smooth = radius = drawRadius = 0.0f;
419  }
420 };
421 
427 {
436 };
437 
443 {
445  bool draw;
449  float delay[3];
451  float fix;
455  float radius;
457  float intensity;
461  float drawRadius;
465  int dx;
467  int dy;
469  char* table;
470 
471  inline EngineGroundMark()
472  {
473  LoadDefault();
474  }
475 
476  inline void LoadDefault()
477  {
478  draw = false;
480  pos = Math::Vector();
481  drawPos = Math::Vector();
482  delay[0] = delay[1] = delay[2] = 0.0f;
484  dx = dy = 0;
485  table = nullptr;
486  }
487 };
488 
494 {
495  ENG_TEX_MAPPING_X = 1,
496  ENG_TEX_MAPPING_Y = 2,
497  ENG_TEX_MAPPING_Z = 3,
498  ENG_TEX_MAPPING_1X = 4,
499  ENG_TEX_MAPPING_1Y = 5,
500  ENG_TEX_MAPPING_1Z = 6
501 };
502 
503 
509 {
544 
547 };
548 
554 {
556  int icon1;
558  int icon2;
567 
568  inline EngineMouse(int _icon1 = -1, int _icon2 = -1, int _iconShadow = -1,
571  Math::Point _hotPoint = Math::Point())
572  : icon1(_icon1)
573  , icon2(_icon2)
574  , iconShadow(_iconShadow)
575  , mode1(_mode1)
576  , mode2(_mode2)
577  , hotPoint(_hotPoint)
578  {}
579 };
580 
581 
682 class CEngine : public CSingleton<CEngine>
683 {
684 public:
685  CEngine(CApplication* app);
686  ~CEngine();
687 
689  void SetDevice(CDevice* device);
691  CDevice* GetDevice();
692 
694  CText* GetText();
700  CTerrain* GetTerrain();
702  CWater* GetWater();
706  CPlanet* GetPlanet();
708  CCloud* GetCloud();
709 
711  void SetTerrain(CTerrain* terrain);
712 
713 
715  bool Create();
717  void Destroy();
718 
721 
722 
724  void Render();
725 
726 
728  bool ProcessEvent(const Event& event);
729 
731  void FrameUpdate();
732 
733 
735  bool WriteScreenShot(const std::string& fileName, int width, int height);
736 
737 
739  TEST_VIRTUAL bool GetPause();
740 
742 
743  void SetMovieLock(bool lock);
744  bool GetMovieLock();
746 
748 
749  void SetShowStats(bool show);
750  bool GetShowStats();
752 
754  void SetRenderEnable(bool enable);
755 
758 
760 
761 
764  Math::IntPoint InterfaceToWindowCoords(Math::Point pos);
766 
768 
769 
771  Math::IntPoint InterfaceToWindowSize(Math::Point size);
773 
775  void AddStatisticTriangle(int nb);
777  int GetStatisticTriangle();
778 
779 
780  /* *************** Object management *************** */
781 
782  // Base objects
783 
785  int CreateBaseObject();
787  void DeleteBaseObject(int baseObjRank);
789  void DeleteAllBaseObjects();
790 
792  void CopyBaseObject(int sourceBaseObjRank, int destBaseObjRank);
793 
795  void AddBaseObjTriangles(int baseObjRank, const std::vector<VertexTex2>& vertices,
796  EngineTriangleType triangleType,
797  const Material& material, int state,
798  std::string tex1Name, std::string tex2Name,
799  LODLevel lodLevel, bool globalUpdate);
800 
802  void AddBaseObjQuick(int baseObjRank, const EngineBaseObjDataTier& buffer,
803  std::string tex1Name, std::string tex2Name,
804  LODLevel lodLevel, bool globalUpdate);
805 
806  // Objects
807 
809  void DebugObject(int rank);
810 
812  int CreateObject();
814  void DeleteAllObjects();
816  void DeleteObject(int objRank);
817 
819 
820  void SetObjectBaseRank(int objRank, int baseObjRank);
821  int GetObjectBaseRank(int objRank);
823 
825 
826  void SetObjectType(int objRank, EngineObjectType type);
827  EngineObjectType GetObjectType(int objRank);
829 
831 
832  void SetObjectTransform(int objRank, const Math::Matrix& transform);
833  void GetObjectTransform(int objRank, Math::Matrix& transform);
835 
837  void SetObjectDrawWorld(int objRank, bool draw);
839  void SetObjectDrawFront(int objRank, bool draw);
840 
842  void SetObjectTransparency(int objRank, float value);
843 
845  void GetObjectBBox(int objRank, Math::Vector& min, Math::Vector& max);
846 
848  int GetObjectTotalTriangles(int objRank);
849 
851  EngineBaseObjDataTier* FindTriangles(int objRank, const Material& material,
852  int state, std::string tex1Name, std::string tex2Name,
853  int lodLevelMask);
854 
856  int GetPartialTriangles(int objRank, int lodLevelMask, float percent, int maxCount,
857  std::vector<EngineTriangle>& triangles);
858 
860  void ChangeSecondTexture(int objRank, const std::string& tex2Name);
861 
863  void ChangeTextureMapping(int objRank, const Material& mat, int state,
864  const std::string& tex1Name, const std::string& tex2Name,
865  int lodLevelMask, EngineTextureMapping mode,
866  float au, float bu, float av, float bv);
867 
869  void TrackTextureMapping(int objRank, const Material& mat, int state,
870  const std::string& tex1Name, const std::string& tex2Name,
871  int lodLevelMask, EngineTextureMapping mode,
872  float pos, float factor, float tl, float ts, float tt);
873 
875 
876  int DetectObject(Math::Point mouse);
877 
879  void CreateShadow(int objRank);
881  void DeleteShadow(int objRank);
882 
884 
885  void SetObjectShadowHide(int objRank, bool hide);
886  void SetObjectShadowType(int objRank, EngineShadowType type);
887  void SetObjectShadowPos(int objRank, const Math::Vector& pos);
888  void SetObjectShadowNormal(int objRank, const Math::Vector& normal);
889  void SetObjectShadowAngle(int objRank, float angle);
890  void SetObjectShadowRadius(int objRank, float radius);
891  void SetObjectShadowIntensity(int objRank, float intensity);
892  void SetObjectShadowHeight(int objRank, float height);
893  float GetObjectShadowRadius(int objRank);
895 
897  void SetHighlightRank(int* rankList);
899  bool GetHighlight(Math::Point& p1, Math::Point& p2);
900 
902  void DeleteAllGroundSpots();
904  int CreateGroundSpot();
906  void DeleteGroundSpot(int rank);
907 
909 
910  void SetObjectGroundSpotPos(int rank, const Math::Vector& pos);
911  void SetObjectGroundSpotRadius(int rank, float radius);
912  void SetObjectGroundSpotColor(int rank, const Color& color);
913  void SetObjectGroundSpotMinMax(int rank, float min, float max);
914  void SetObjectGroundSpotSmooth(int rank, float smooth);
916 
918  void CreateGroundMark(Math::Vector pos, float radius,
919  float delay1, float delay2, float delay3,
920  int dx, int dy, char* table);
922  void DeleteGroundMark(int rank);
923 
925  void Update();
926 
927 
928  /* *************** Mode setting *************** */
929 
931  void SetState(int state, const Color& color = Color(1.0f, 1.0f, 1.0f, 1.0f));
932 
934  void SetMaterial(const Material& mat);
935 
937  void SetViewParams(const Math::Vector& eyePt, const Math::Vector& lookatPt,
938  const Math::Vector& upVec, float eyeDistance);
939 
941  Texture LoadTexture(const std::string& name);
943  Texture LoadTexture(const std::string& name, CImage* image);
945  Texture LoadTexture(const std::string& name, const TextureCreateParams& params);
947  bool LoadAllTextures();
948 
950  bool ChangeTextureColor(const std::string& texName,
951  Color colorRef1, Color colorNew1,
952  Color colorRef2, Color colorNew2,
953  float tolerance1, float tolerance2,
954  Math::Point ts, Math::Point ti,
955  Math::Point *exclude = nullptr,
956  float shift = 0.0f, bool hsv = false);
957 
959 
960  bool SetTexture(const std::string& name, int stage = 0);
962  void SetTexture(const Texture& tex, int stage = 0);
963 
965  void DeleteTexture(const std::string& name);
967  void DeleteTexture(const Texture& tex);
968 
970  void FlushTextureCache();
971 
973  void SetTerrainVision(float vision);
974 
976 
977 
980  void SetFocus(float focus);
981  float GetFocus();
983 
985 
986  void SetGroundSpot(bool mode);
987  bool GetGroundSpot();
989 
991 
992  void SetShadow(bool mode);
993  bool GetShadow();
995 
997 
998  void SetDirty(bool mode);
999  bool GetDirty();
1001 
1003 
1004  void SetFog(bool mode);
1005  bool GetFog();
1007 
1009 
1010  void SetSecondTexture(int texNum);
1011  int GetSecondTexture();
1013 
1015 
1016  void SetRankView(int rank);
1017  int GetRankView();
1019 
1021  void SetDrawWorld(bool draw);
1022 
1024  void SetDrawFront(bool draw);
1025 
1027 
1028  void SetAmbientColor(const Color& color, int rank = 0);
1029  Color GetAmbientColor(int rank = 0);
1031 
1033 
1034  void SetWaterAddColor(const Color& color);
1035  Color GetWaterAddColor();
1037 
1039 
1040  void SetFogColor(const Color& color, int rank = 0);
1041  Color GetFogColor(int rank = 0);
1043 
1045 
1046 
1048  void SetDeepView(float length, int rank = 0, bool ref=false);
1049  float GetDeepView(int rank = 0);
1051 
1052 
1054 
1055 
1057  void SetFogStart(float start, int rank = 0);
1058  float GetFogStart(int rank = 0);
1060 
1062 
1063  void SetBackground(const std::string& name, Color up = Color(), Color down = Color(),
1064  Color cloudUp = Color(), Color cloudDown = Color(),
1065  bool full = false);
1066  void GetBackground(std::string& name, Color& up, Color& down,
1067  Color& cloudUp, Color& cloudDown,
1068  bool& full);
1070 
1072  void SetForegroundName(const std::string& name);
1074  void SetOverFront(bool front);
1076  void SetOverColor(const Color& color = Color(), int mode = ENG_RSTATE_TCOLOR_BLACK);
1077 
1079 
1080  void SetParticleDensity(float value);
1081  float GetParticleDensity();
1083 
1085  float ParticleAdapt(float factor);
1086 
1088 
1089  void SetClippingDistance(float value);
1090  float GetClippingDistance();
1092 
1094 
1095  void SetObjectDetail(float value);
1096  float GetObjectDetail();
1098 
1100 
1101  void SetGadgetQuantity(float value);
1102  float GetGadgetQuantity();
1104 
1106 
1107  void SetTextureQuality(int value);
1108  int GetTextureQuality();
1110 
1112 
1113  void SetTotoMode(bool present);
1114  bool GetTotoMode();
1116 
1118 
1119  void SetLensMode(bool present);
1120  bool GetLensMode();
1122 
1124 
1125  void SetWaterMode(bool present);
1126  bool GetWaterMode();
1128 
1129  void SetLightingMode(bool present);
1130  bool GetLightingMode();
1131 
1133 
1134  void SetSkyMode(bool present);
1135  bool GetSkyMode();
1137 
1139 
1140  void SetBackForce(bool present);
1141  bool GetBackForce();
1143 
1145 
1146  void SetPlanetMode(bool present);
1147  bool GetPlanetMode();
1149 
1151 
1152  void SetLightMode(bool present);
1153  bool GetLightMode();
1155 
1157  // TODO: move to more appropriate class ?
1159  void SetEditIndentMode(bool autoIndent);
1160  bool GetEditIndentMode();
1162 
1164  // TODO: move to more appropriate class ?
1166  void SetEditIndentValue(int value);
1167  int GetEditIndentValue();
1169 
1171 
1172  void SetTracePrecision(float factor);
1173  float GetTracePrecision();
1175 
1177 
1178  void SetMouseType(EngineMouseType type);
1179  EngineMouseType GetMouseType();
1181 
1183  const Math::Matrix& GetMatView();
1185  TEST_VIRTUAL Math::Vector GetEyePt();
1187  TEST_VIRTUAL Math::Vector GetLookatPt();
1189  float GetEyeDirH();
1191  float GetEyeDirV();
1193  bool IsVisiblePoint(const Math::Vector& pos);
1194 
1196  void UpdateMatProj();
1197 
1199  void ApplyChange();
1200 
1201 protected:
1203  void Draw3DScene();
1205  void DrawObject(const EngineBaseObjDataTier& p4);
1207  void DrawInterface();
1208 
1210  void UpdateGroundSpotTextures();
1211 
1213  void DrawShadow();
1215  void DrawBackground();
1217  void DrawBackgroundGradient(const Color& up, const Color& down);
1219  void DrawBackgroundImage();
1221  void DrawPlanet();
1223  void DrawForegroundImage();
1225  void DrawOverColor();
1227  void DrawHighlight();
1229  void DrawMouse();
1231  void DrawMouseSprite(Math::Point pos, Math::Point dim, int icon);
1233  void DrawStats();
1234 
1236  EngineBaseObjTexTier& AddLevel2(EngineBaseObject& p1, const std::string& tex1Name, const std::string& tex2Name);
1241  const Material& mat, int state);
1242 
1244  Texture CreateTexture(const std::string &texName, const TextureCreateParams &params, CImage* image = nullptr);
1245 
1247  bool IsVisible(int objRank);
1248 
1250  bool IsWithinLODLimit(float distance, LODLevel lodLevel);
1251 
1253  bool DetectBBox(int objRank, Math::Point mouse);
1254 
1256  bool GetBBox2D(int objRank, Math::Point& min, Math::Point& max);
1257 
1259  bool DetectTriangle(Math::Point mouse, VertexTex2* triangle, int objRank, float& dist);
1260 
1262 
1263  bool TransformPoint(Math::Vector& p2D, int objRank, Math::Vector p3D);
1264 
1266  void ComputeDistance();
1267 
1269  void UpdateGeometry();
1270 
1273 
1275  void UpdateStaticBuffers();
1276 
1277 protected:
1278  CApplication* m_app;
1279  CSoundInterface* m_sound;
1280  CDevice* m_device;
1281  CText* m_text;
1282  CLightManager* m_lightMan;
1283  CParticle* m_particle;
1284  CWater* m_water;
1285  CCloud* m_cloud;
1286  CLightning* m_lightning;
1287  CPlanet* m_planet;
1288  CTerrain* m_terrain;
1289  CPauseManager* m_pause;
1290 
1292  std::string m_error;
1293 
1294  SystemTimeStamp* m_lastFrameTime;
1295  SystemTimeStamp* m_currentFrameTime;
1296  int m_fpsCounter;
1297  float m_fps;
1298 
1301  std::string m_fpsText;
1303  bool m_render;
1306 
1312  float m_focus;
1313 
1320 
1323 
1325  std::vector<EngineBaseObject> m_baseObjects;
1327  std::vector<EngineObject> m_objects;
1329  std::vector<EngineShadow> m_shadows;
1331  std::vector<EngineGroundSpot> m_groundSpots;
1334 
1339  float m_eyeDirH;
1340  float m_eyeDirV;
1341  int m_rankView;
1342  Color m_ambientColor[2];
1343  Color m_backColor[2];
1344  Color m_fogColor[2];
1345  float m_deepView[2];
1346  float m_fogStart[2];
1347  Color m_waterAddColor;
1348  int m_statisticTriangle;
1349  bool m_updateGeometry;
1350  bool m_updateStaticBuffers;
1351  int m_alphaMode;
1352  bool m_groundSpotVisible;
1353  bool m_shadowVisible;
1354  bool m_dirty;
1355  bool m_fog;
1356  bool m_firstGroundSpot;
1357  int m_secondTexNum;
1358  bool m_backgroundFull;
1359  std::string m_backgroundName;
1360  Texture m_backgroundTex;
1361  Color m_backgroundColorUp;
1362  Color m_backgroundColorDown;
1363  Color m_backgroundCloudUp;
1364  Color m_backgroundCloudDown;
1365  bool m_overFront;
1366  Color m_overColor;
1367  int m_overMode;
1368  std::string m_foregroundName;
1369  Texture m_foregroundTex;
1370  bool m_drawWorld;
1371  bool m_drawFront;
1372  float m_particleDensity;
1373  float m_clippingDistance;
1374  float m_lastClippingDistance;
1375  float m_objectDetail;
1376  float m_terrainVision;
1377  float m_gadgetQuantity;
1378  int m_textureQuality;
1379  bool m_totoMode;
1380  bool m_lensMode;
1381  bool m_waterMode;
1382  bool m_skyMode;
1383  bool m_backForce;
1384  bool m_planetMode;
1385  bool m_lightMode;
1386  bool m_editIndentMode;
1387  int m_editIndentValue;
1388  float m_tracePrecision;
1389 
1397 
1399  Math::Point m_highlightP2;
1401 
1406 
1408  std::map<std::string, Texture> m_texNameMap;
1410  std::map<Texture, std::string> m_revTexNameMap;
1412 
1414  std::set<std::string> m_texBlacklist;
1415 
1424 
1430  std::string m_lastTexture[2];
1433 
1436 
1437  bool m_debugLights;
1438  bool m_debugDumpLights;
1439 };
1440 
1441 
1442 } // namespace Gfx
1443