Browse Source

Moving to OpenGL 3.3 core. Depending on GLM. Removed old level reader, old math lib.

Thomas Buck 10 years ago
parent
commit
c2db7bcfbd
77 changed files with 1206 additions and 12457 deletions
  1. 11
    0
      ChangeLog.md
  2. 6
    2
      README.md
  3. 63
    0
      cmake/FindGLM.cmake
  4. 1
    1
      cmake/travis_install_linux.sh
  5. 1
    1
      cmake/travis_install_mac.sh
  6. 16
    71
      include/Camera.h
  7. 0
    5
      include/Entity.h
  8. 0
    3
      include/Game.h
  9. 10
    9
      include/Mesh.h
  10. 17
    161
      include/Render.h
  11. 0
    5
      include/Room.h
  12. 3
    12
      include/RoomData.h
  13. 0
    12
      include/SkeletalModel.h
  14. 0
    16
      include/Sprite.h
  15. 0
    3
      include/StaticMesh.h
  16. 16
    13
      include/TextureManager.h
  17. 0
    728
      include/TombRaider.h
  18. 0
    1139
      include/TombRaiderData.h
  19. 0
    152
      include/ViewVolume.h
  20. 0
    22
      include/commands/CommandAnimate.h
  21. 0
    11
      include/commands/CommandRender.h
  22. 2
    23
      include/global.h
  23. 0
    202
      include/math/Matrix.h
  24. 0
    202
      include/math/Quaternion.h
  25. 0
    46
      include/math/Vec3.h
  26. 0
    65
      include/math/math.h
  27. 5
    2
      include/system/FontTRLE.h
  28. 48
    23
      include/system/Window.h
  29. 4
    1
      include/utils/pcx.h
  30. 6
    2
      include/utils/png.h
  31. 1
    1
      include/utils/tga.h
  32. 8
    6
      src/CMakeLists.txt
  33. 46
    79
      src/Camera.cpp
  34. 1
    1
      src/Console.cpp
  35. 7
    46
      src/Entity.cpp
  36. 13
    294
      src/Game.cpp
  37. 2
    0
      src/Menu.cpp
  38. 7
    9
      src/MenuFolder.cpp
  39. 94
    54
      src/Mesh.cpp
  40. 63
    511
      src/Render.cpp
  41. 25
    388
      src/Room.cpp
  42. 7
    66
      src/RoomData.cpp
  43. 2
    254
      src/SkeletalModel.cpp
  44. 14
    47
      src/Sprite.cpp
  45. 14
    141
      src/StaticMesh.cpp
  46. 45
    81
      src/TextureManager.cpp
  47. 0
    5631
      src/TombRaider.cpp
  48. 116
    74
      src/UI.cpp
  49. 0
    254
      src/ViewVolume.cpp
  50. 0
    1
      src/commands/CMakeLists.txt
  51. 0
    3
      src/commands/Command.cpp
  52. 0
    82
      src/commands/CommandAnimate.cpp
  53. 1
    1
      src/commands/CommandEngine.cpp
  54. 13
    80
      src/commands/CommandRender.cpp
  55. 6
    4
      src/commands/CommandSet.cpp
  56. 1
    1
      src/loader/Loader.cpp
  57. 38
    27
      src/loader/LoaderTR2.cpp
  58. 11
    23
      src/main.cpp
  59. 0
    9
      src/math/CMakeLists.txt
  60. 0
    515
      src/math/Matrix.cpp
  61. 0
    290
      src/math/Quaternion.cpp
  62. 0
    118
      src/math/Vec3.cpp
  63. 0
    94
      src/math/math.cpp
  64. 18
    11
      src/system/FontImGui.cpp
  65. 59
    53
      src/system/FontSDL.cpp
  66. 40
    34
      src/system/FontTRLE.cpp
  67. 2
    2
      src/system/SoundAL.cpp
  68. 264
    127
      src/system/Window.cpp
  69. 4
    2
      src/system/WindowGLUT.cpp
  70. 17
    10
      src/system/WindowSDL.cpp
  71. 1
    1
      src/utils/filesystem.cpp
  72. 14
    13
      src/utils/pcx.cpp
  73. 3
    3
      src/utils/pixel.cpp
  74. 30
    31
      src/utils/png.cpp
  75. 10
    10
      src/utils/tga.cpp
  76. 0
    9
      test/CMakeLists.txt
  77. 0
    34
      test/math.cpp

+ 11
- 0
ChangeLog.md View File

@@ -2,6 +2,17 @@
2 2
 
3 3
 ## OpenRaider (0.1.3) xythobuz <xythobuz@xythobuz.de>
4 4
 
5
+    [ 20141215 ]
6
+    * Rewrote GL code for the Font implementations, ImGUI and the Main Menu
7
+
8
+    [ 20141214 ]
9
+    * Removed math, Matrix, Quaternion, Vec3, ViewVolume
10
+
11
+    [ 20141213 ]
12
+    * Completely removed old TombRaider level reader (so only unfinished TR2 compatibility now)
13
+    * Now creating OpenGL 3.3 Core Profile Context, so absolutely _nothing_ works right now!
14
+    * Now depending on GLM lib
15
+
5 16
     [ 20141207 ]
6 17
     * LoaderTR2 now also loads all important parts of the Room structures
7 18
     * Started work on new Mesh implementation used with LoaderTR2

+ 6
- 2
README.md View File

@@ -1,6 +1,8 @@
1 1
 # OpenRaider
2 2
 
3
-[![Build Status](https://travis-ci.org/xythobuz/OpenRaider.svg?branch=master)](https://travis-ci.org/xythobuz/OpenRaider)
3
+[![Build Status](https://travis-ci.org/xythobuz/OpenRaider.svg?branch=loader)](https://travis-ci.org/xythobuz/OpenRaider)
4
+
5
+__This is the development branch of OpenRaider! Currently in the process of moving to OpenGL 3.3...__
4 6
 
5 7
 This is a fork of the [OpenRaider](http://openraider.sourceforge.net) Open Source implementation of the classic Tomb Raider Game Engine. The original project was abandoned in 2003.
6 8
 
@@ -39,6 +41,7 @@ Basically, OpenRaider depends on the following:
39 41
 * C++11 compiler
40 42
 * cmake
41 43
 * OpenGL
44
+* GLM
42 45
 * zlib
43 46
 * SDL2
44 47
 * SDL2-TTF (optional, needed if you want to use TTF fonts)
@@ -47,7 +50,7 @@ Basically, OpenRaider depends on the following:
47 50
 
48 51
 On Mac OS X 10.9 with [XCode](https://developer.apple.com/xcode/) and [MacPorts](http://www.macports.org) installed, the following should be enough to get all dependencies that are available as port:
49 52
 
50
-    sudo port install cmake zlib libsdl2 libsdl2_ttf
53
+    sudo port install cmake zlib glm libsdl2 libsdl2_ttf
51 54
 
52 55
 A similar command for the package manager of your favorite Linux Distribution should do the trick.
53 56
 
@@ -178,6 +181,7 @@ There are some included cmake scripts:
178 181
 * [GetGitRevisionDescription.cmake](https://github.com/rpavlik/cmake-modules/blob/master/GetGitRevisionDescription.cmake)
179 182
 * [GetGitRevisionDescription.cmake.in](https://github.com/rpavlik/cmake-modules/blob/master/GetGitRevisionDescription.cmake.in)
180 183
 * [FindFreeGLUT](https://github.com/PDAL/PDAL/blob/master/cmake/modules/FindFreeGLUT.cmake)
184
+* [FindGLM] (https://github.com/g-truc/glm/blob/master/util/FindGLM.cmake)
181 185
 
182 186
 See the respective files in `cmake` for their licensing.
183 187
 

+ 63
- 0
cmake/FindGLM.cmake View File

@@ -0,0 +1,63 @@
1
+# FindGLM - attempts to locate the glm matrix/vector library.
2
+#
3
+# This module defines the following variables (on success):
4
+#   GLM_INCLUDE_DIRS  - where to find glm/glm.hpp
5
+#   GLM_FOUND         - if the library was successfully located
6
+#
7
+# It is trying a few standard installation locations, but can be customized
8
+# with the following variables:
9
+#   GLM_ROOT_DIR      - root directory of a glm installation
10
+#                       Headers are expected to be found in either:
11
+#                       <GLM_ROOT_DIR>/glm/glm.hpp           OR
12
+#                       <GLM_ROOT_DIR>/include/glm/glm.hpp
13
+#                       This variable can either be a cmake or environment
14
+#                       variable. Note however that changing the value
15
+#                       of the environment varible will NOT result in
16
+#                       re-running the header search and therefore NOT
17
+#                       adjust the variables set by this module.
18
+
19
+#=============================================================================
20
+# Copyright 2012 Carsten Neumann
21
+#
22
+# Distributed under the OSI-approved BSD License (the "License");
23
+# see accompanying file Copyright.txt for details.
24
+#
25
+# This software is distributed WITHOUT ANY WARRANTY; without even the
26
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27
+# See the License for more information.
28
+#=============================================================================
29
+# (To distribute this file outside of CMake, substitute the full
30
+#  License text for the above reference.)
31
+
32
+# default search dirs
33
+SET(_glm_HEADER_SEARCH_DIRS
34
+    "/usr/include"
35
+    "/usr/local/include")
36
+
37
+# check environment variable
38
+SET(_glm_ENV_ROOT_DIR "$ENV{GLM_ROOT_DIR}")
39
+
40
+IF(NOT GLM_ROOT_DIR AND _glm_ENV_ROOT_DIR)
41
+    SET(GLM_ROOT_DIR "${_glm_ENV_ROOT_DIR}")
42
+ENDIF(NOT GLM_ROOT_DIR AND _glm_ENV_ROOT_DIR)
43
+
44
+# put user specified location at beginning of search
45
+IF(GLM_ROOT_DIR)
46
+    SET(_glm_HEADER_SEARCH_DIRS "${GLM_ROOT_DIR}"
47
+                                "${GLM_ROOT_DIR}/include"
48
+                                 ${_glm_HEADER_SEARCH_DIRS})
49
+ENDIF(GLM_ROOT_DIR)
50
+
51
+# locate header
52
+FIND_PATH(GLM_INCLUDE_DIR "glm/glm.hpp"
53
+    PATHS ${_glm_HEADER_SEARCH_DIRS})
54
+
55
+INCLUDE(FindPackageHandleStandardArgs)
56
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLM DEFAULT_MSG
57
+    GLM_INCLUDE_DIR)
58
+
59
+IF(GLM_FOUND)
60
+    SET(GLM_INCLUDE_DIRS "${GLM_INCLUDE_DIR}")
61
+
62
+    MESSAGE(STATUS "GLM_INCLUDE_DIR = ${GLM_INCLUDE_DIR}")
63
+ENDIF(GLM_FOUND)

+ 1
- 1
cmake/travis_install_linux.sh View File

@@ -1,6 +1,6 @@
1 1
 #!/bin/bash
2 2
 
3
-sudo apt-get -qq -y install libsdl2-dev libsdl2-ttf-dev libalut-dev libpng12-dev zlib1g-dev cmake
3
+sudo apt-get -qq -y install libsdl2-dev libsdl2-ttf-dev libalut-dev libpng12-dev zlib1g-dev cmake glm
4 4
 
5 5
 if [ "$CC" = "gcc" ]; then sudo apt-get install gcc-4.8; fi
6 6
 if [ "$CXX" = "g++" ]; then sudo apt-get install g++-4.8; fi

+ 1
- 1
cmake/travis_install_mac.sh View File

@@ -1,4 +1,4 @@
1 1
 #!/bin/bash
2 2
 
3
-brew install sdl2 sdl2_ttf freealut
3
+brew install sdl2 sdl2_ttf freealut glm
4 4
 

+ 16
- 71
include/Camera.h View File

@@ -2,92 +2,37 @@
2 2
  * \file include/Camera.h
3 3
  * \brief Camera class
4 4
  *
5
- * \author Mongoose
6 5
  * \author xythobuz
7 6
  */
8 7
 
9 8
 #ifndef _CAMERA_H_
10 9
 #define _CAMERA_H_
11 10
 
12
-#include "math/Quaternion.h"
11
+#include "glm/vec3.hpp"
12
+#include "glm/mat4x4.hpp"
13 13
 
14
-/*!
15
- * \brief Commands for interactive camera control
16
- */
17
-enum camera_command {
18
-    CAMERA_ROTATE_RIGHT,
19
-    CAMERA_ROTATE_LEFT,
20
-    CAMERA_ROTATE_UP,
21
-    CAMERA_ROTATE_DOWN
22
-};
23
-
24
-/*!
25
- * \brief Camera class
26
- */
27 14
 class Camera {
28 15
   public:
29
-    /*!
30
-     * \brief Constructs an object of Camera
31
-     */
32
-    Camera();
33
-
34
-    /*!
35
-     * \brief Get the target currently looked at
36
-     * \param target where the target will be stored
37
-     */
38
-    void getTarget(float target[3]);
39
-
40
-    /*!
41
-     * \brief Get angle/yaw of camera
42
-     * \returns theta angle/yaw of camera
43
-     */
44
-    float getRadianYaw() { return mTheta; }
16
+    static void handleMouseMotion(int x, int y);
17
+    static glm::mat4 getViewMatrix();
45 18
 
46
-    /*!
47
-     * \brief Get angle/pitch of camera
48
-     * \returns phi angle/pitch of camera
49
-     */
50
-    float getRadianPitch() { return mTheta2; }
19
+    static float getRadianPitch() { return thetaX; }
20
+    static float getRadianYaw() { return thetaY; }
51 21
 
52
-    /*!
53
-     * \brief Set current position
54
-     * \param pos new position
55
-     */
56
-    void setPosition(float pos[3]);
22
+    static void setPosition(glm::vec3 p) { pos = p; }
23
+    static glm::vec3 getPosition() { return pos; }
57 24
 
58
-    void setSensitivityX(float sens) { mRotationDeltaX = sens; }
25
+    static void setSensitivityX(float sens) { rotationDeltaX = sens; }
26
+    static float getSensitivityX() { return rotationDeltaX; }
59 27
 
60
-    float getSensitivityX() { return mRotationDeltaX; }
61
-
62
-    void setSensitivityY(float sens) { mRotationDeltaY = sens; }
63
-
64
-    float getSensitivityY() { return mRotationDeltaY; }
65
-
66
-    /*!
67
-     * \brief Updates view target
68
-     */
69
-    void update();
70
-
71
-    /*!
72
-     * \brief Sends interactive command to camera
73
-     * \param cmd valid camera command
74
-     */
75
-    void command(enum camera_command cmd);
28
+    static void setSensitivityY(float sens) { rotationDeltaY = sens; }
29
+    static float getSensitivityY() { return rotationDeltaY; }
76 30
 
77 31
   private:
78
-
79
-    void rotate(float angle, float x, float y, float z);
80
-
81
-    Quaternion mQ;         //!< Quaternion for rotation
82
-    float mPos[4];         //!< Location in 3 space (aka eye)
83
-    float mTarget[4];      //!< Postition we're looking at
84
-    float mViewDistance;   //!< Distance from target
85
-    float mTheta;          //!< View angle Y
86
-    float mTheta2;         //!< View angle Z
87
-    float mRotationDeltaX; //!< Horizontal mouse sensitivity
88
-    float mRotationDeltaY; //!< Vertical mouse sensitivity
32
+    static glm::vec3 pos;
33
+    static float thetaX, thetaY;
34
+    static float rotationDeltaX, rotationDeltaY;
89 35
 };
90 36
 
91
-Camera& getCamera();
92
-
93 37
 #endif
38
+

+ 0
- 5
include/Entity.h View File

@@ -9,7 +9,6 @@
9 9
 #define _ENTITY_H_
10 10
 
11 11
 #include "SkeletalModel.h"
12
-#include "TombRaider.h"
13 12
 
14 13
 class Entity {
15 14
   public:
@@ -23,10 +22,6 @@ class Entity {
23 22
 
24 23
     Entity(float p[3], float a[3], int id, long r, unsigned int model);
25 24
 
26
-    Entity(TombRaider& tr, unsigned int index, unsigned int i, unsigned int model);
27
-
28
-    bool operator<(Entity& o);
29
-    static bool compare(Entity* a, Entity* b);
30 25
     void display();
31 26
     void move(char movement);
32 27
     void print();

+ 0
- 3
include/Game.h View File

@@ -12,7 +12,6 @@
12 12
 #include <vector>
13 13
 
14 14
 #include "Entity.h"
15
-#include "TombRaider.h"
16 15
 
17 16
 class Game {
18 17
   public:
@@ -48,8 +47,6 @@ class Game {
48 47
     std::string levelName;
49 48
     bool mLoaded;
50 49
 
51
-    TombRaider mTombRaider;
52
-
53 50
     long mLara;
54 51
 };
55 52
 

+ 10
- 9
include/Mesh.h View File

@@ -10,7 +10,7 @@
10 10
 #ifndef _MESH_H_
11 11
 #define _MESH_H_
12 12
 
13
-#include "math/Vec3.h"
13
+#include "glm/vec3.hpp"
14 14
 
15 15
 /*!
16 16
  * \brief OpenGL Mesh
@@ -19,11 +19,11 @@ class Mesh {
19 19
   public:
20 20
 
21 21
     struct rectangle_t {
22
-        Vec3 a, b, c, d;
22
+        glm::vec3 a, b, c, d;
23 23
         uint16_t texture;
24 24
         float red, green, blue;
25 25
 
26
-        rectangle_t(Vec3 _a, Vec3 _b, Vec3 _c, Vec3 _d, uint16_t t,
26
+        rectangle_t(glm::vec3 _a, glm::vec3 _b, glm::vec3 _c, glm::vec3 _d, uint16_t t,
27 27
                     float re = 0.0f, float gr = 0.0f, float bl = 0.0f)
28 28
             : a(_a), b(_b), c(_c), d(_d), texture(t), red(re), green(gr), blue(bl) { }
29 29
     };
@@ -34,19 +34,20 @@ class Mesh {
34 34
     void drawAlpha();
35 35
     void drawSolid();
36 36
 
37
-    void addTexturedRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d, uint16_t textile);
38
-    void addTexturedTriangle(Vec3 a, Vec3 b, Vec3 c, uint16_t textile);
37
+    void addTexturedRectangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 d, uint16_t textile);
38
+    void addTexturedTriangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, uint16_t textile);
39 39
 
40
-    void addColoredRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d, float re, float gr, float bl);
41
-    void addColoredTriangle(Vec3 a, Vec3 b, Vec3 c, float re, float gr, float bl);
40
+    void addColoredRectangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 d, float re, float gr,
41
+                             float bl);
42
+    void addColoredTriangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, float re, float gr, float bl);
42 43
 
43
-    void addNormal(Vec3 n);
44
+    void addNormal(glm::vec3 n);
44 45
 
45 46
     std::vector<rectangle_t> texturedRectangles;
46 47
     std::vector<rectangle_t> coloredRectangles;
47 48
     std::vector<rectangle_t> texturedTriangles;
48 49
     std::vector<rectangle_t> coloredTriangles;
49
-    std::vector<Vec3> normals;
50
+    std::vector<glm::vec3> normals;
50 51
 
51 52
 
52 53
     // Old API

+ 17
- 161
include/Render.h View File

@@ -9,177 +9,33 @@
9 9
 #ifndef _RENDER_H_
10 10
 #define _RENDER_H_
11 11
 
12
-#include <vector>
12
+#include "glm/vec4.hpp"
13 13
 
14
-#include "Room.h"
15 14
 #include "TextureManager.h"
16
-#include "ViewVolume.h"
17 15
 
18
-/*!
19
- * \brief OpenRaider Renderer class
20
- */
16
+enum class RenderMode {
17
+    Disabled,
18
+    LoadScreen,
19
+    Solid,
20
+    Wireframe,
21
+    Texture
22
+};
23
+
21 24
 class Render {
22 25
   public:
26
+    static RenderMode getMode();
27
+    static void setMode(RenderMode m);
23 28
 
24
-    typedef enum {
25
-        modeDisabled,
26
-        modeLoadScreen,
27
-        modeVertexLight,
28
-        modeSolid,
29
-        modeWireframe,
30
-        modeTexture
31
-    } RenderMode;
32
-
33
-    typedef enum {
34
-        fRoomAlpha              = (1 << 0),
35
-        fEntityModels           = (1 << 1),
36
-        fFog                    = (1 << 2),
37
-        fGL_Lights              = (1 << 3),
38
-        fRenderPonytail         = (1 << 4),
39
-        fAnimateAllModels       = (1 << 5),
40
-        // fMultiTexture           = (1 << 6), //! \todo Whats up with Multitexture stuff? Where is it needed?
41
-    } RenderFlags;
42
-
43
-    /*!
44
-     * \brief Constructs an object of Render
45
-     */
46
-    Render();
47
-
48
-    /*!
49
-     * \brief Deconstructs an object of Render
50
-     */
51
-    ~Render();
52
-
53
-    /*!
54
-     * \brief Makes a screenshot, writes to disk
55
-     * \param filenameBase basename of file to be written
56
-     */
57
-    void screenShot(const char* filenameBase);
58
-
59
-    /*!
60
-     * \brief Gets current rendering mode
61
-     * \returns current RenderMode
62
-     * \fixme Don't return enum as int?!
63
-     */
64
-    int getMode();
65
-
66
-    /*!
67
-     * Removes current world/entity/etc geometry
68
-     */
69
-    void ClearWorld();
70
-
71
-    /*!
72
-     * \brief Clears bitflags, changes state of renderer in some way
73
-     * \param flags RenderFlags to clear (ORed)
74
-     * \fixme use enum not integer as parameter?!
75
-     */
76
-    void clearFlags(unsigned int flags);
77
-
78
-    /*!
79
-     * \brief Sets bitflags, changes state of renderer in some way
80
-     * \param flags RenderFlags to set (ORed)
81
-     * \fixme use enum not integer as parameter?!
82
-     */
83
-    void setFlags(unsigned int flags);
84
-
85
-    void setMode(int n);
86
-
87
-    /*!
88
-     * \brief Renders a single game frame
89
-     */
90
-    void display();
91
-
92
-    void setSkyMesh(int index, bool rot);
93
-
94
-    unsigned int getFlags();
95
-
96
-    /*!
97
-     * \brief Check if a point is in the View Volume
98
-     * \param x X coordinate
99
-     * \param y Y coordinate
100
-     * \param z Z coordinate
101
-     * \returns true if point is visible
102
-     */
103
-    bool isVisible(float x, float y, float z);
104
-
105
-    /*!
106
-     * \brief Check if a sphere is in the View Volume
107
-     * \param x X coordinate of center of sphere
108
-     * \param y Y coordinate of center of sphere
109
-     * \param z Z coordinate of center of sphere
110
-     * \param radius radius of sphere
111
-     * \returns true if sphere is visible
112
-     */
113
-    bool isVisible(float x, float y, float z, float radius);
29
+    static void display();
114 30
 
115
-    bool isVisible(BoundingBox& box);
31
+    static void screenShot(const char* filenameBase);
116 32
 
117
-    float getDistToSphereFromNear(float x, float y, float z, float radius);
118
-
119
-    void debugDisplayTexture(int texture = -1,
120
-                             TextureManager::TextureStorage s = TextureManager::TextureStorage::GAME,
121
-                             float x = 0.0f, float y = 0.0f, float w = 256.0f, float h = 256.0f);
122
-
123
-    void debugDisplayTextile(int texture = -1,
124
-                             float x = 0.0f, float y = 0.0f, float w = 64.0f, float h = 64.0f);
125
-
126
-    void debugDisplaySprite(int sprite = -1, int offset = 0,
127
-                            float x = 0.0f, float y = 0.0f, float w = 128.0f, float h = 128.0f);
33
+    static void drawTexture(float x, float y, float w, float h, glm::vec4 color,
34
+                            unsigned int texture, TextureManager::TextureStorage s);
128 35
 
129 36
   private:
130
-
131
-    void drawTexture(float x, float y, float w, float h,
132
-                     unsigned int texture, TextureManager::TextureStorage s);
133
-
134
-    void drawTextile(float x, float y, float w, float h, unsigned int textile);
135
-
136
-    void drawSprite(float x, float y, float w, float h, unsigned int sprite, unsigned int offset);
137
-
138
-    static void lightRoom(Room& room);
139
-
140
-    void drawLoadScreen();
141
-
142
-    /*!
143
-     * \brief Build a visible room list starting at index
144
-     * \param index valid room index where to start the list
145
-     */
146
-    void newRoomRenderList(int index);
147
-
148
-    /*!
149
-     * \brief Build a visible room list starting from room and
150
-     * only considers its linked rooms and their linked rooms.
151
-     * \param room First room in list
152
-     */
153
-    void buildRoomRenderList(Room& room);
154
-
155
-    /*!
156
-     * \brief Renders Sky domes/boxes/etc by scaling factor.
157
-     *
158
-     * Texture must be initialized.
159
-     * \param scale correct scale for map size
160
-     */
161
-    void drawSkyMesh(float scale);
162
-
163
-    /*!
164
-     * \brief Updates View Volume. Call once per render frame.
165
-     */
166
-    void updateViewVolume();
167
-
168
-    std::vector<Room*> mRoomRenderList;
169
-
170
-    ViewVolume mViewVolume; //!< View Volume for frustum culling
171
-
172
-    unsigned int mFlags;                  //!< Rendering flags
173
-    unsigned int mMode;                   //!< Rendering mode
174
-    int mLock;
175
-    int mSkyMesh;                         //!< Skymesh model id
176
-    bool mSkyMeshRotation;                //!< Should Skymesh be rotated?
177
-
178
-    int debugTexture, debugTextile, debugSprite, debugSpriteOffset;
179
-    TextureManager::TextureStorage debugTextureStorage;
180
-    float debugX, debugY, debugW, debugH;
37
+    static RenderMode mode;
181 38
 };
182 39
 
183
-Render& getRender();
184
-
185 40
 #endif
41
+

+ 0
- 5
include/Room.h View File

@@ -11,7 +11,6 @@
11 11
 #include <vector>
12 12
 #include "Mesh.h"
13 13
 #include "Sprite.h"
14
-#include "TombRaider.h"
15 14
 #include "RoomData.h"
16 15
 
17 16
 typedef enum {
@@ -20,8 +19,6 @@ typedef enum {
20 19
 
21 20
 class Room {
22 21
   public:
23
-    Room(TombRaider& tr, unsigned int index);
24
-
25 22
     Room(float p[3] = nullptr, unsigned int f = 0, unsigned int x = 0, unsigned int z = 0);
26 23
     ~Room();
27 24
 
@@ -73,8 +70,6 @@ class Room {
73 70
     void addSprite(Sprite* s);
74 71
 
75 72
   private:
76
-    void sortModels();
77
-
78 73
     unsigned int flags;
79 74
     unsigned int numXSectors;
80 75
     unsigned int numZSectors;

+ 3
- 12
include/RoomData.h View File

@@ -8,10 +8,10 @@
8 8
 #ifndef _ROOM_DATA_H_
9 9
 #define _ROOM_DATA_H_
10 10
 
11
+#include "glm/vec3.hpp"
12
+
11 13
 #include <vector>
12 14
 #include <memory>
13
-#include "math/Matrix.h"
14
-#include "TombRaider.h"
15 15
 
16 16
 class BoundingBox {
17 17
   public:
@@ -37,8 +37,6 @@ class Light {
37 37
         typeDirectional = 3  //!< Directional light
38 38
     } LightType;
39 39
 
40
-    Light(TombRaider& tr, unsigned int room, unsigned int index);
41
-
42 40
     void getPos(float p[4]);
43 41
     void getDir(float d[3]);
44 42
     float getAtt();
@@ -57,13 +55,8 @@ class Light {
57 55
 
58 56
 class StaticModel {
59 57
   public:
60
-    StaticModel(TombRaider& tr, unsigned int room, unsigned int i);
61 58
     void display();
62 59
 
63
-    // Compares distance to ViewVolume for depth sorting
64
-    bool operator<(const StaticModel& other);
65
-    static bool compare(StaticModel* a, StaticModel* b);
66
-
67 60
   private:
68 61
     int index;
69 62
     float yaw;
@@ -75,8 +68,7 @@ class StaticModel {
75 68
 
76 69
 class Portal {
77 70
   public:
78
-    Portal(float vert[4][3], float norm[3], int adj);
79
-    Portal(TombRaider& tr, unsigned int room, unsigned int index, Matrix& transform);
71
+    Portal(glm::vec3 vert[4], float norm[3], int adj);
80 72
 
81 73
     void getVertices(float vert[4][3]);
82 74
     int getAdjoiningRoom();
@@ -90,7 +82,6 @@ class Portal {
90 82
 class Sector {
91 83
   public:
92 84
     Sector(float f, float c, bool w) : floor(f), ceiling(c), wall(w) { }
93
-    Sector(TombRaider& tr, unsigned int room, unsigned int index);
94 85
     float getFloor();
95 86
     float getCeiling();
96 87
     bool isWall();

+ 0
- 12
include/SkeletalModel.h View File

@@ -11,14 +11,9 @@
11 11
 
12 12
 #include <vector>
13 13
 
14
-#include "TombRaider.h"
15
-
16 14
 class BoneTag {
17 15
   public:
18 16
     BoneTag(int m, float o[3], float r[3], char f);
19
-
20
-    BoneTag(TombRaider& tr, unsigned int index, unsigned int j, unsigned int* l,
21
-            unsigned int frame_offset);
22 17
     void display();
23 18
 
24 19
     void getOffset(float o[3]);
@@ -35,8 +30,6 @@ class BoneTag {
35 30
 class BoneFrame {
36 31
   public:
37 32
     BoneFrame(float p[3]);
38
-
39
-    BoneFrame(TombRaider& tr, unsigned int index, unsigned int frame_offset);
40 33
     ~BoneFrame();
41 34
 
42 35
     void getPosition(float p[3]);
@@ -53,9 +46,6 @@ class BoneFrame {
53 46
 class AnimationFrame {
54 47
   public:
55 48
     AnimationFrame(char r);
56
-
57
-    AnimationFrame(TombRaider& tr, unsigned int index, int a, unsigned int* frame_offset,
58
-                   int frame_step);
59 49
     ~AnimationFrame();
60 50
 
61 51
     unsigned long size();
@@ -70,8 +60,6 @@ class AnimationFrame {
70 60
 class SkeletalModel {
71 61
   public:
72 62
     SkeletalModel(int i);
73
-
74
-    SkeletalModel(TombRaider& tr, unsigned int index, int objectId);
75 63
     ~SkeletalModel();
76 64
     void display(unsigned long aframe, unsigned long bframe);
77 65
 

+ 0
- 16
include/Sprite.h View File

@@ -11,21 +11,10 @@
11 11
 #include <cstdint>
12 12
 
13 13
 #include "loader/Loader.h"
14
-#include "TombRaider.h"
15 14
 
16 15
 class Sprite {
17 16
   public:
18 17
     Sprite(uint16_t tile, uint8_t x, uint8_t y, uint16_t width, uint16_t height);
19
-
20
-    Sprite(TombRaider& tr, unsigned int room, unsigned int index);
21
-
22
-    Sprite(TombRaider& tr, unsigned int item, unsigned int sequence, unsigned int index) :
23
-        Sprite((tr.Sprite() + ((tr.SpriteSequence() + sequence)->offset) + index)->tile,
24
-               (tr.Sprite() + ((tr.SpriteSequence() + sequence)->offset) + index)->x,
25
-               (tr.Sprite() + ((tr.SpriteSequence() + sequence)->offset) + index)->y,
26
-               (tr.Sprite() + ((tr.SpriteSequence() + sequence)->offset) + index)->width,
27
-               (tr.Sprite() + ((tr.SpriteSequence() + sequence)->offset) + index)->height) { }
28
-
29 18
     void display();
30 19
     void display(float x, float y, float w, float h);
31 20
 
@@ -42,17 +31,12 @@ class SpriteSequence {
42 31
     SpriteSequence(int32_t objectID);
43 32
     void add(Sprite s);
44 33
 
45
-    SpriteSequence(TombRaider& tr, unsigned int item, unsigned int sequence);
46
-    ~SpriteSequence();
47
-
48 34
     unsigned long size();
49 35
     Sprite& get(unsigned long index);
50 36
 
51 37
   private:
52 38
     int32_t id;
53 39
     std::vector<Sprite> sprites;
54
-
55
-    std::vector<Sprite*> oldsprites;
56 40
 };
57 41
 
58 42
 #endif

+ 0
- 3
include/StaticMesh.h View File

@@ -9,7 +9,6 @@
9 9
 #define _STATIC_MODEL_H_
10 10
 
11 11
 #include <vector>
12
-#include "TombRaider.h"
13 12
 
14 13
 class TexturedTriangle {
15 14
   public:
@@ -26,8 +25,6 @@ class TexturedTriangle {
26 25
 class StaticMesh {
27 26
   public:
28 27
     StaticMesh(int id, int mesh);
29
-
30
-    StaticMesh(TombRaider& tr, unsigned int index);
31 28
     ~StaticMesh();
32 29
     void display();
33 30
     float getRadius();

+ 16
- 13
include/TextureManager.h View File

@@ -12,8 +12,6 @@
12 12
 #include <cstdint>
13 13
 #include <vector>
14 14
 
15
-#include "math/Vec3.h"
16
-
17 15
 // These are loaded into TextureStorage::SYSTEM by initialize()!
18 16
 #define TEXTURE_WHITE 0
19 17
 #define TEXTURE_SPLASH 1
@@ -32,16 +30,11 @@ class TextureTile {
32 30
     ~TextureTile();
33 31
 
34 32
     void add(TextureTileVertex* t);
35
-    bool isTriangle();
36
-    void display(float x, float y, float w, float h, float z);
37 33
 
38
-    void displayTriangle(Vec3 a, Vec3 b, Vec3 c);
39
-    void displayRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d);
34
+    void displayTriangle(float a[3], float b[3], float c[3]);
35
+    void displayRectangle(float a[3], float b[3], float c[3], float d[3]);
40 36
 
41 37
   private:
42
-    void displayTriangle(float x, float y, float w, float h, float z);
43
-    void displayRectangle(float x, float y, float w, float h, float z);
44
-
45 38
     uint16_t attribute;
46 39
     uint16_t texture;
47 40
     std::vector<TextureTileVertex*> vertices;
@@ -53,6 +46,14 @@ class TextureTile {
53 46
 class TextureManager {
54 47
   public:
55 48
 
49
+    enum class ColorMode {
50
+        RGB,
51
+        RGBA,
52
+        ARGB,
53
+        BGR,
54
+        BGRA
55
+    };
56
+
56 57
     enum class TextureStorage {
57 58
         GAME,
58 59
         SYSTEM
@@ -61,6 +62,7 @@ class TextureManager {
61 62
     ~TextureManager();
62 63
 
63 64
     int initialize();
65
+    int initializeSplash();
64 66
 
65 67
     void clear();
66 68
 
@@ -70,8 +72,9 @@ class TextureManager {
70 72
      * \brief Binds the texture for use in GL
71 73
      * \param n valid texture index
72 74
      * \param s Which TextureStorage should be accessed
75
+     * \param unit Which GL texture unit should be used
73 76
      */
74
-    void bindTextureId(unsigned int n, TextureStorage s = TextureStorage::GAME);
77
+    void bindTextureId(unsigned int n, TextureStorage s = TextureStorage::GAME, unsigned int unit = 0);
75 78
 
76 79
     /*!
77 80
      * \brief Loads Buffer as texture
@@ -85,9 +88,9 @@ class TextureManager {
85 88
      * \param filter if the texture should be mipmap filtered
86 89
      * \returns texture ID or < 0 on error
87 90
      */
88
-    int loadBufferSlot(unsigned char* image,
89
-                       unsigned int width, unsigned int height,
90
-                       ColorMode mode, unsigned int bpp,
91
+    int loadBufferSlot(unsigned char* image = nullptr,
92
+                       unsigned int width = 256, unsigned int height = 256,
93
+                       ColorMode mode = ColorMode::RGBA, unsigned int bpp = 32,
91 94
                        TextureStorage s = TextureStorage::GAME,
92 95
                        int slot = -1, bool filter = true);
93 96
 

+ 0
- 728
include/TombRaider.h View File

@@ -1,728 +0,0 @@
1
-/*!
2
- * \file include/TombRaider.h
3
- * \brief Loads maps, meshes, textures...
4
- *
5
- * \todo WARNING: No endian routines as of yet
6
- * \author Mongoose
7
- */
8
-
9
-#ifndef _TOMBRAIDER_H_
10
-#define _TOMBRAIDER_H_
11
-
12
-#include <cstdint>
13
-#include <cstdio>
14
-
15
-#include "TombRaiderData.h"
16
-
17
-/*!
18
- * \brief Loads maps, meshes, textures...
19
- */
20
-class TombRaider {
21
-  public:
22
-
23
-    /*!
24
-     * \brief Constructs an object of TombRaider
25
-     */
26
-    TombRaider();
27
-
28
-    /*!
29
-     * \brief Deconstructs an object of TombRaider
30
-     */
31
-    ~TombRaider();
32
-
33
-    ////////////////////////////////////////
34
-    // Wash me -- not part of cleaned API //
35
-    ////////////////////////////////////////
36
-
37
-    int NumRooms();
38
-
39
-    int NumMoveables();
40
-
41
-    int NumTextures();
42
-
43
-    /*!
44
-     * \brief Get number of _special_ textures/images
45
-     * \returns number of special textures/images
46
-     */
47
-    int NumSpecialTextures();
48
-
49
-    int NumAnimations();
50
-
51
-    unsigned int NumFrames();
52
-
53
-    int NumStaticMeshes();
54
-
55
-    int NumSpriteSequences();
56
-
57
-    int NumItems();
58
-
59
-    tr2_version_type Engine();
60
-
61
-    unsigned short* Frame();
62
-
63
-    tr2_animation_t* Animation();
64
-
65
-    tr2_item_t* Item();
66
-
67
-    tr2_box_t* Box();
68
-
69
-    tr2_mesh_t* Mesh();
70
-
71
-    /*!
72
-     * \brief Get number of animations for a moveable
73
-     * \param moveable_index valid moveable id
74
-     * \returns number of animations for specified moveable
75
-     */
76
-    int getNumAnimsForMoveable(int moveable_index);
77
-
78
-    tr2_staticmesh_t* StaticMesh();
79
-
80
-    tr2_moveable_t* Moveable();
81
-
82
-    tr2_meshtree_t* MeshTree();
83
-
84
-    /*!
85
-     * \brief Get the sprites
86
-     * \returns the sprite array
87
-     */
88
-    tr2_sprite_texture_t* Sprite();
89
-
90
-    tr2_sprite_sequence_t* SpriteSequence();
91
-
92
-    /*!
93
-     * \brief Get copies of texture and it's bumpmap
94
-     * \param texture valid textile index
95
-     * \param image will be set to texture if found, or NULL
96
-     * \param bumpmap will be set to bumpmap if found, or NULL
97
-     */
98
-    void Texture(int texture, unsigned char** image, unsigned char** bumpmap);
99
-
100
-    //unsigned int* Palette16();
101
-    //unsigned char* Palette8();
102
-
103
-    tr2_room_t* Room();
104
-
105
-    /*!
106
-     * \brief Loads TombRaider 1-5 pak into memory
107
-     * and does some processing.
108
-     * \param filename points to valid TombRaider pak
109
-     * \returns 0 on success, < 0 on error
110
-     * \sa TombRaider::loadTR5()
111
-     */
112
-    int Load(const char* filename);
113
-
114
-    /*!
115
-     * \brief Compute rotation angles from moveable animation data
116
-     * \param frame moveable animation data
117
-     * \param frame_offset moveable animation data
118
-     * \param angle_offset moveable animation data
119
-     * \param x will be set to computed angle
120
-     * \param y will be set to computed angle
121
-     * \param z will be set to computed angle
122
-     */
123
-    void computeRotationAngles(unsigned short** frame,
124
-                               unsigned int* frame_offset,
125
-                               unsigned int* angle_offset,
126
-                               float* x, float* y, float* z);
127
-
128
-    /*!
129
-     * \brief Returns computed UV in u and v
130
-     * \param st object texture vert, its coordinates are added to the pixels and divided by 255.0
131
-     * \param u will contain calculated x value
132
-     * \param v will contain calculated y value
133
-     */
134
-    void computeUV(tr2_object_texture_vert_t* st, float* u, float* v);
135
-
136
-    void getColor(int index, float color[4]);
137
-
138
-    tr2_version_type getEngine();
139
-
140
-    /*!
141
-     * \brief Get the collision sphere for a mesh
142
-     * \param meshIndex mesh index
143
-     * \param center will be filled with center coordinates, not NULL
144
-     * \param radius will be filled with radius, not NULL
145
-     */
146
-    void getMeshCollisionInfo(unsigned int meshIndex,
147
-                              float center[3], float* radius);
148
-
149
-    /*!
150
-     * \brief Get SIGNED mesh count (TR encoded < 0 errors)
151
-     * \returns signed mesh count
152
-     */
153
-    int getMeshCount();
154
-
155
-    /*!
156
-     * \brief This method is made to let you fill arrays or
157
-     * create single faces. There may be an allocatin version that
158
-     * passes back arrays later.
159
-     * Returns Quads/Rects as 2 triangles,
160
-     * because returning quads would be too trivial :)
161
-     * \param meshIndex mesh index
162
-     * \param faceIndex face index
163
-     * \param index allocated RGBA
164
-     * \param color allocated RGBA
165
-     * \fixme This method interface may change later
166
-     */
167
-    void getMeshColoredRectangle(unsigned int meshIndex,
168
-                                 unsigned int faceIndex,
169
-                                 int index[6], float color[4]);
170
-
171
-    /*!
172
-     * \brief This method is made to let you fill arrays or
173
-     * create single faces. There may be an allocating version that
174
-     * passes back arrays later.
175
-     * \param meshIndex mesh index
176
-     * \param faceIndex face index
177
-     * \param index allocated RGBA
178
-     * \param color allocated RGBA
179
-     * \fixme This method interface may change later
180
-     */
181
-    void getMeshColoredTriangle(unsigned int meshIndex,
182
-                                unsigned int faceIndex,
183
-                                int index[3], float color[4]);
184
-
185
-    /*!
186
-     * \brief This method is made to let you fill arrays or
187
-     * create single faces. There may be an allocatin version that
188
-     * passes back arrays later.
189
-     * Returns Quads/Rects as 2 triangles,
190
-     * because returning quads would be too trivial :)
191
-     * \param meshIndex mesh index
192
-     * \param faceIndex face index
193
-     * \param index allocated
194
-     * \param st allocated
195
-     * \param texture allocated
196
-     * \param transparency allocated
197
-     * \fixme This method interface may change later
198
-     */
199
-    void getMeshTexturedRectangle(unsigned int meshIndex,
200
-                                  unsigned int faceIndex,
201
-                                  int index[6], float st[12], int* texture,
202
-                                  unsigned short* transparency);
203
-
204
-    /*!
205
-     * \brief This method is made to let you fill arrays or
206
-     * create single faces. There may be an allocatin version that
207
-     * passes back arrays later.
208
-     * \param meshIndex mesh index
209
-     * \param faceIndex face index
210
-     * \param index allocated
211
-     * \param st allocated
212
-     * \param texture allocated
213
-     * \param transparency allocated
214
-     * \fixme This method interface may change later
215
-     */
216
-    void getMeshTexturedTriangle(unsigned int meshIndex,
217
-                                 unsigned int faceIndex,
218
-                                 int index[3], float st[6], int* texture,
219
-                                 unsigned short* transparency);
220
-
221
-    /*!
222
-     * \brief Get face counts for a given mesh.
223
-     *
224
-     * \todo This method interface may change later...
225
-     * \param meshIndex mesh index
226
-     * \returns number of textured triangles in mesh
227
-     */
228
-    int getMeshTexturedTriangleCount(unsigned int meshIndex);
229
-
230
-    /*!
231
-     * \brief Get face counts for a given mesh.
232
-     * \param meshIndex mesh index
233
-     * \returns number of colored triangles in mesh
234
-     */
235
-    int getMeshColoredTriangleCount(unsigned int meshIndex);
236
-
237
-    /*!
238
-     * \brief Get face counts for a given mesh.
239
-     * \param meshIndex mesh index
240
-     * \returns number of textured rectangles in mesh
241
-     */
242
-    int getMeshTexturedRectangleCount(unsigned int meshIndex);
243
-
244
-    /*!
245
-     * \brief Get face counts for a given mesh.
246
-     * \returns number if colored rectangles in mesh
247
-     */
248
-    int getMeshColoredRectangleCount(unsigned int meshIndex);
249
-
250
-    /*!
251
-     * \brief Get vertex, normal and color arrays for a mesh
252
-     * \param meshIndex mesh index
253
-     * \param vertexCount will be set to length of vertex array
254
-     * \param verts will be set to allocated vertex array (XYX)
255
-     * \param normalCount will be set to length of normal array
256
-     * \param norms will be set to allocated normal array (IJK)
257
-     * \param colorCount will be set to length of color array
258
-     * \param colors will be set to allocated color array (I)
259
-     */
260
-    void getMeshVertexArrays(unsigned int meshIndex,
261
-                             unsigned int* vertexCount, float** verts,
262
-                             unsigned int* normalCount, float** norms,
263
-                             unsigned int* colorCount, float** colors);
264
-
265
-    /*!
266
-     * \brief Get a single collision box from room (unified)
267
-     * \param roomIndex room index
268
-     * \param index index of box in room
269
-     * \param xyzA will contain first corner of box
270
-     * \param xyzB will contain second corner of box
271
-     * \param xyzC will contain third corner of box
272
-     * \param xyzD will contain fourth corner of box
273
-     * \returns 0 on success, < 0 on error
274
-     */
275
-    int getRoomBox(unsigned int roomIndex, unsigned int index,
276
-                   float* xyzA, float* xyzB, float* xyzC, float* xyzD);
277
-
278
-    /*!
279
-     * \brief Get number of collision boxes in room (unified)
280
-     * \param roomIndex room index
281
-     * \returns number of collision boxes in room
282
-     */
283
-    unsigned int getRoomBoxCount(unsigned int roomIndex);
284
-
285
-    void getRoomInfo(unsigned int index,
286
-                     unsigned int* flags, float pos[3],
287
-                     float bboxMin[3], float bboxMax[3]);
288
-
289
-    /*!
290
-     * \brief Get a single light from a room (unified)
291
-     * \param roomIndex valid room index
292
-     * \param index valid light index in room
293
-     * \param pos allocated, will contain position
294
-     * \param color allocated, will contain color
295
-     * \param dir allocated, will contain direction
296
-     * \param attenuation will contain attenuation
297
-     * \param cutoffAngle will contain cutoff angle
298
-     * \param type will contain type
299
-     * \param flags will contain flags
300
-     * \returns 0 on success, < 0 on error
301
-     */
302
-    int getRoomLight(unsigned int roomIndex, unsigned int index,
303
-                     float pos[4], float color[4], float dir[3],
304
-                     float* attenuation, float* cutoffAngle,
305
-                     unsigned int* type, unsigned int* flags);
306
-
307
-    /*!
308
-     * \brief Get number of lights in room (unified)
309
-     * \param roomIndex room index
310
-     * \returns number of lights in room
311
-     */
312
-    unsigned int getRoomLightCount(unsigned int roomIndex);
313
-
314
-    /*!
315
-     * \brief Get a single model info from a room
316
-     * \param roomIndex valid room index
317
-     * \param index valid model index in room
318
-     * \param modelIndex will contain starting mesh
319
-     * \param pos will contain pos
320
-     * \param yaw will contain yaw angle
321
-     * \returns 0 on success, < 0 on error
322
-     */
323
-    int getRoomModel(unsigned int roomIndex, unsigned int index,
324
-                     int* modelIndex, float pos[3], float* yaw);
325
-
326
-    /*!
327
-     * \brief Get number of room models in room (unified)
328
-     * \param roomIndex room index
329
-     * \returns number of room models in room
330
-     */
331
-    unsigned int getRoomModelCount(unsigned int roomIndex);
332
-
333
-    /*!
334
-     * \brief Get a single portal from room (unified)
335
-     * \param roomIndex valid room index
336
-     * \param index valid portal index in room
337
-     * \param adjoiningRoom will contain adjoining room index
338
-     * \param normal allocated, will contain normal vector
339
-     * \param vertices allocated, will contain vertices
340
-     * \returns 0 on success, < 0 on error
341
-     */
342
-    int getRoomPortal(unsigned int roomIndex, unsigned int index,
343
-                      int* adjoiningRoom, float normal[3], float vertices[12]);
344
-
345
-    /*!
346
-     * \brief Get number of portals from room (unified)
347
-     * \param roomIndex room index
348
-     * \returns number of portals from room
349
-     */
350
-    unsigned int getRoomPortalCount(unsigned int roomIndex);
351
-
352
-    /*!
353
-     * \brief Get rectangle data with texCoords for non-matching
354
-     * vertex/uv for each vertex in TombRaider room (unified)
355
-     * \param roomIndex valid room index
356
-     * \param rectangleIndex rectangle index in room
357
-     * \param indices will contain indices
358
-     * \param texCoords will contain texCoords
359
-     * \param texture will contain texture
360
-     * \param flags will contain flags
361
-     */
362
-    void getRoomRectangle(unsigned int roomIndex, unsigned int rectangleIndex,
363
-                          unsigned int* indices, float* texCoords, int* texture,
364
-                          unsigned int* flags);
365
-
366
-    /*!
367
-     * \brief Get number of rectangles from room (unified)
368
-     * \param roomIndex room index
369
-     * \returns number of rectangles from room
370
-     */
371
-    unsigned int getRoomRectangleCount(unsigned int roomIndex);
372
-
373
-    /*!
374
-     * \brief Get a single sector from room (unified)
375
-     * \param roomIndex room index
376
-     * \param index sector index
377
-     * \param flags will contain flags
378
-     * \param ceiling will contain ceiling
379
-     * \param floor will contain floor
380
-     * \param floorDataIndex will contain floor data index
381
-     * \param boxIndex will contain boxIndex
382
-     * \param roomBelow will contain roomBelow
383
-     * \param roomAbove will contain roomAbove
384
-     * \return 0 on success, < 0 on error
385
-     */
386
-    int getRoomSector(unsigned int roomIndex, unsigned int index,
387
-                      unsigned int* flags, float* ceiling, float* floor,
388
-                      int* floorDataIndex, int* boxIndex,
389
-                      int* roomBelow, int* roomAbove);
390
-
391
-    /*!
392
-     * \brief Get number of sectors in room (unified)
393
-     * \param roomIndex room index
394
-     * \param zSectorsCount will contain width of sector list
395
-     * \param xSectorsCount will contain height of sector list
396
-     * \returns number of sectors in room
397
-     */
398
-    unsigned int getRoomSectorCount(unsigned int roomIndex,
399
-                                    unsigned int* zSectorsCount,
400
-                                    unsigned int* xSectorsCount);
401
-
402
-    void getRoomSprite(unsigned int roomIndex, unsigned int index,
403
-                       float scale, int* texture,
404
-                       float* pos, float* vertices, float* texcoords);
405
-
406
-    /*!
407
-     * \brief Get number of sprites in room (unified)
408
-     * \param roomIndex room index
409
-     * \returns number of sprites in room
410
-     */
411
-    unsigned int getRoomSpriteCount(unsigned int roomIndex);
412
-
413
-    /*!
414
-     * \brief Gets triangle data with texCoords for non-matching
415
-     * vertex/uv for each vertex in TombRaider room (unified)
416
-     * \param roomIndex room index
417
-     * \param triangleIndex triangle index
418
-     * \param indices will contain indices
419
-     * \param texCoords will contain texCoords
420
-     * \param texture will contain texture
421
-     * \param flags will contain flags
422
-     */
423
-    void getRoomTriangle(unsigned int roomIndex, unsigned int triangleIndex,
424
-                         unsigned int* indices, float* texCoords, int* texture,
425
-                         unsigned int* flags);
426
-
427
-    /*!
428
-     * \brief Gets triangle data with texCoords for non-matching
429
-     * vertex/uv for each vertex in TombRaider room.
430
-     *
431
-     * This is used with vertices, colors, etc. to do partial array
432
-     * rendering, since the texcoords will never match vertives
433
-     * (Tomb Raider is textile based).
434
-     * \param index room index
435
-     * \param textureOffset texture offset
436
-     * \param count will contain count
437
-     * \param indices will contain indices
438
-     * \param texCoords will contain texCoords
439
-     * \param textures will contain textures
440
-     * \param flags will contain flags
441
-     */
442
-    void getRoomTriangles(unsigned int index, int textureOffset,
443
-                          unsigned int* count, unsigned int** indices,
444
-                          float** texCoords, int** textures,
445
-                          unsigned int** flags);
446
-
447
-    /*!
448
-     * \brief Gets triangle data with duplicated vertex/color/normal
449
-     * data for each face vertex to match the textile based texcoords.
450
-     *
451
-     * This uses more memory, but lets you do direct array rendering
452
-     * with OpenGL, D3D, etc.
453
-     * \param roomIndex room index
454
-     * \param textureOffset texture offset
455
-     * \param count will contain count
456
-     * \param indices will contain indices
457
-     * \param vertices will contain vertices
458
-     * \param texCoords will contain texCoords
459
-     * \param colors will contain colors
460
-     * \param textures will contain textures
461
-     * \param flags will contain flags
462
-     */
463
-    void getRoomTriangles(unsigned int roomIndex, int textureOffset,
464
-                          unsigned int* count,
465
-                          unsigned int** indices, float** vertices,
466
-                          float** texCoords, float** colors,
467
-                          int** textures, unsigned int** flags);
468
-
469
-    /*!
470
-     * \brief Get number of triangles from room (unified)
471
-     * \param roomIndex room index
472
-     * \returns number of triangles from room
473
-     */
474
-    unsigned int getRoomTriangleCount(unsigned int roomIndex);
475
-
476
-    /*!
477
-     * \brief Gets vertex position and color
478
-     * \param roomIndex room index
479
-     * \param vertexIndex vertex index
480
-     * \param xyz will contain vertex position, has to be allocated
481
-     * \param rgba will contain vertex color, has to be allocated
482
-     */
483
-    void getRoomVertex(unsigned int roomIndex, unsigned int vertexIndex,
484
-                       float* xyz, float* rgba);
485
-
486
-    /*!
487
-     * \brief Get allocated vertex and color arrays and their element counts (unified)
488
-     * \param roomIndex valid room index
489
-     * \param vertexCount will contain vertex array length
490
-     * \param vertices will contain vertex array
491
-     * \param normalCount will contain normal array length
492
-     * \param normals will contain normal array
493
-     * \param colorCount will contain color array length
494
-     * \param colors will contain color array
495
-     */
496
-    void getRoomVertexArrays(unsigned int roomIndex,
497
-                             unsigned int* vertexCount, float** vertices,
498
-                             unsigned int* normalCount, float** normals,
499
-                             unsigned int* colorCount, float** colors);
500
-
501
-    /*!
502
-     * \brief Get number of lights in room (unified)
503
-     * \param roomIndex room index
504
-     * \returns number of lights in room
505
-     */
506
-    unsigned int getRoomVertexCount(unsigned int roomIndex);
507
-
508
-    /*!
509
-     * \brief Get sky mesh ID
510
-     * \returns moveable id of sky mesh or -1 if none
511
-     */
512
-    int getSkyModelId();
513
-
514
-    /*!
515
-     * \brief Get a copy of a sound sample and its byte size
516
-     * \param index sound sample index
517
-     * \param bytes will contain byte size of sound sample
518
-     * \param data will contain sound sample
519
-     */
520
-    void getSoundSample(unsigned int index,
521
-                        unsigned int* bytes, unsigned char** data);
522
-
523
-    /*!
524
-     * \brief Get number of loaded sound samples
525
-     * \returns number of sound samples loaded
526
-     */
527
-    unsigned int getSoundSamplesCount();
528
-
529
-    /*!
530
-     * \brief Check if a mesh is valid
531
-     * \param index mesh index (?)
532
-     * \returns true if mesh is valid
533
-     */
534
-    bool isMeshValid(int index);
535
-
536
-    /*!
537
-     * \brief Check if a room is valid (TRC support)
538
-     * \param index room index
539
-     * \returns true if room is valid
540
-     */
541
-    bool isRoomValid(int index);
542
-
543
-    /*!
544
-     * \brief Load an external sound pak for TR2 and TR3
545
-     * \param filename pak to load
546
-     * \returns < 0 on error
547
-     */
548
-    int loadSFX(const char* filename);
549
-
550
-    void reset();
551
-
552
-  private:
553
-
554
-    void extractMeshes(unsigned char* mesh_data,
555
-                       unsigned int num_mesh_pointers,
556
-                       unsigned int* mesh_pointers);
557
-
558
-    int Fread(void* buffer, size_t size, size_t count, FILE* f);
559
-
560
-    /*!
561
-     * \brief Get a copy of the sound samples
562
-     * \param bytes will contain size of sound samples
563
-     * \param data will contain sound samples themselves
564
-     */
565
-    void getRiffData(unsigned int* bytes, unsigned char** data);
566
-
567
-    /*!
568
-     * \brief Get a copy of a TR4 sound sample
569
-     * \param index sound sample index
570
-     * \param bytes will contain length of sound sample
571
-     * \param data will contain sound sample itself
572
-     */
573
-    void getRiffDataTR4(unsigned int index,
574
-                        unsigned int* bytes, unsigned char** data);
575
-
576
-    /*!
577
-     * \brief Get an array of offsets for a contiguous RIFF data stream in chunks.
578
-     *
579
-     * Offsets will be allocated with enough space to hold expected
580
-     * number of offsets. (Should be known number, otherwise not all RIFFs
581
-     * will be parsed.)
582
-     * \param riffData riff data
583
-     * \param riffDataBytes length of riff data
584
-     * \param offsets will contain offsets
585
-     * \param numOffsets known number
586
-     * \returns number of RIFFs found
587
-     */
588
-    int getRiffOffsets(unsigned char* riffData, unsigned int riffDataBytes,
589
-                       unsigned int** offsets, unsigned int numOffsets);
590
-
591
-    /*!
592
-     * \brief Makes a 32bit RGBA image from a textile.
593
-     *
594
-     * This handles all selection and conversion, including
595
-     * alpha layering flags, now.
596
-     * \param texture valid index into textile list
597
-     * \returns 32bit RGBA image or NULL on error
598
-     */
599
-    unsigned char* getTexTile(int texture);
600
-
601
-    /*!
602
-     * \brief Loads a TR5 pak into memory.
603
-     * \param f valid FILE
604
-     * \returns 0 on success, < 0 on error
605
-     */
606
-    int loadTR5(FILE* f);
607
-
608
-    static void print(const char* methodName, const char* s, ...) __attribute__((format(printf, 2, 3)));
609
-
610
-    void printDebug(const char* methodName, const char* s, ...) __attribute__((format(printf, 3, 4)));
611
-
612
-    bool mDebug;                           //!< Debug output toggle
613
-    unsigned int mPakVersion;              //!< TombRaider pak file header version
614
-    tr2_version_type mEngineVersion;       //!< TombRaider engine version
615
-    tr2_colour_t _palette8[256];           //!< 8-bit palette
616
-    unsigned int _palette16[256];          //!< 16-bit palette
617
-    unsigned int _num_textiles;            //!< Total number of texture tiles
618
-    unsigned short  _num_room_textures;    //!< Num textures only for room use?
619
-    unsigned short _num_misc_textures;     //!< Num of textures for misc use?
620
-    unsigned short _num_bump_map_textures; //!< Num of textures that are bump map, texture pairs
621
-    tr2_textile8_t* _textile8;             //!< 8-bit (palettised) textiles
622
-    tr2_textile16_t* _textile16;           //!< 16-bit (ARGB) textiles
623
-    tr2_textile32_t* _textile32;           //!< 32-bit (BGRA) textiles
624
-    unsigned int _num_tex_special;         //!< Special textures and bump maps count
625
-    unsigned char* _tex_special;           //!< Special textures and bump maps
626
-    unsigned int _unknown_t;               //!< 32-bit unknown (always 0 in real TR2 levels)
627
-    unsigned short _num_rooms;             //!< Number of rooms in this level
628
-    tr2_room_t* _rooms;                    //!< List of rooms (TR1,TR2,TR3,TR4)
629
-    tr5_room_t* mRoomsTR5;                 //!< Rooms ( TR5 / TRC ) Only
630
-    unsigned int _num_floor_data;          //!< Num of words of floor data this level
631
-    unsigned short* _floor_data;           //!< Floor data
632
-    int mMeshCount;                        //!< Number of meshes this level
633
-    tr2_mesh_t* mMeshes;                   //!< list of meshes
634
-    unsigned int _num_animations;          //!< number of animations this level
635
-    tr2_animation_t* _animations;          //!< list of animations
636
-    unsigned int _num_state_changes;       //!< number of structures(?) this level
637
-    tr2_state_change_t* _state_changes;    //!< list of structures
638
-    unsigned int _num_anim_dispatches;     //!< number of ranges(?) this level
639
-    tr2_anim_dispatch_t* _anim_dispatches; //!< list of ranges
640
-    unsigned int _num_anim_commands;       //!< number of Bone1s this level
641
-    tr2_anim_command_t* _anim_commands;    //!< list of Bone1s
642
-    unsigned int _num_mesh_trees;          //!< number of Bone2s this level
643
-    tr2_meshtree_t* _mesh_trees;           //!< list of Bone2s
644
-    unsigned int _num_frames;              //!< num of words of frame data this level
645
-    unsigned short* _frames;               //!< frame data
646
-    unsigned int _num_moveables;           //!< number of moveables this level
647
-    tr2_moveable_t* _moveables;            //!< list of moveables
648
-
649
-    uint32_t numMoveablesTR5;
650
-    tr5_moveable_t* moveablesTR5;
651
-
652
-    uint32_t numAnimationsTR5;
653
-    tr5_animation_t* animationsTR5;
654
-
655
-    uint32_t numObjectTexturesTR5;
656
-    tr5_object_texture_t* objectTexturesTR5;
657
-
658
-    uint32_t numCinematicFramesTR5;
659
-    tr5_cinematic_frame_t* cinematicFramesTR5;
660
-
661
-    uint32_t numFlyByCamerasTR5;
662
-    tr5_flyby_camera_t* flyByCamerasTR5;
663
-
664
-    unsigned int _num_static_meshes;        //!< number of static meshes this level
665
-    tr2_staticmesh_t* _static_meshes;       //!< static meshes
666
-    unsigned int _num_object_textures;      //!< number of object textures this level
667
-    tr2_object_texture_t* _object_textures; //!< list of object textures
668
-
669
-    unsigned int _num_sprite_textures;        //!< num of sprite textures this level
670
-    tr2_sprite_texture_t* _sprite_textures;   //!< list of sprite textures
671
-    unsigned int _num_sprite_sequences;       //!< num of sprite sequences this level
672
-    tr2_sprite_sequence_t* _sprite_sequences; //!< sprite sequence data
673
-    int  _num_cameras;                        //!< Number of Cameras
674
-    tr2_camera_t*  _cameras;                  //!< cameras
675
-    int  _num_sound_sources;                  //!< Number of Sounds
676
-    tr2_sound_source_t* _sound_sources;       //!< sounds
677
-    int  _num_boxes;                          //!< Number of Boxes
678
-    tr2_box_t* _boxes;                        /*!< boxes - looks like
679
-                                               * struct { unsigned short value[4]; }
680
-                                               * - value[0..2] might be a vector;
681
-                                               * value[3] seems to be index into
682
-                                               * Overlaps[] */
683
-    int  _num_overlaps;                       //!< Number of Overlaps
684
-    short*  _overlaps;                        /*!< Overlaps -
685
-                                               * looks like ushort; 0x8000 is flag
686
-                                               * of some sort appears to be an
687
-                                               * offset into Boxes[] and/or
688
-                                               * Boxes2[] */
689
-    short*  _zones;                           //!< Boxes2
690
-    int  _num_animated_textures;              //!< Number of AnimTextures
691
-    short*  _animated_textures;               //!< Animtextures
692
-    int  _num_items;                          //!< Number of Items
693
-    tr2_item_t* _items;                       //!< Items
694
-    unsigned char*  _light_map;               //!< Colour-light maps
695
-    unsigned int _num_cinematic_frames;       //!< Number of cut-scene frames
696
-    tr2_cinematic_frame_t* _cinematic_frames; //!< Cut-scene frames
697
-    short  _num_demo_data;                    //!< Number of Demo Data
698
-    unsigned char*  _demo_data;               //!< Demo data
699
-    float mRoomVertexLightingFactor;
700
-    float mTexelScale;
701
-
702
-    // Sound data
703
-    short*  mSoundMap;                   //!< Sound map
704
-    int  mNumSoundDetails;               //!< Number of SampleModifiers
705
-    tr2_sound_details_t* mSoundDetails;  //!< Sample modifiers
706
-    int  mNumSampleIndices;              //!< Number of Sample Indices
707
-    int*  mSampleIndices;                //!< Sample indices
708
-    unsigned int* mSampleIndicesTR5;
709
-    bool mRiffAlternateLoaded;           //!< Is a TR2,TR3 SFX loaded?
710
-    unsigned int* mRiffAlternateOffsets; //!< After parsing this will
711
-    //!< hold byte offsets for TR2,TR3
712
-    //!< RIFFs in the buffered SFX
713
-    int mRiffDataSz;                     //!< Byte size of a loaded SFX
714
-    unsigned char* mRiffData;            //!< SFX RIFF data in chunks
715
-    unsigned int mNumTR4Samples;
716
-    unsigned char** mTR4Samples;
717
-    unsigned int* mTR4SamplesSz;
718
-
719
-    // For packed Fread emu/wrapper
720
-    unsigned char*
721
-    mCompressedLevelData;     //!< Buffer used to emulate fread with uncompressed libz data
722
-    unsigned int mCompressedLevelDataOffset; //!< Offset into buffer
723
-    unsigned int mCompressedLevelSize;       //!< Size of buffer
724
-    tr_fread_mode_t mFreadMode;              //!< Fread mode file|buffer
725
-};
726
-
727
-#endif
728
-

+ 0
- 1139
include/TombRaiderData.h
File diff suppressed because it is too large
View File


+ 0
- 152
include/ViewVolume.h View File

@@ -1,152 +0,0 @@
1
-/*!
2
- * \file include/ViewVolume.h
3
- * \brief Viewing Volume for culling use
4
- *
5
- * \author Mongoose
6
- */
7
-
8
-#ifndef _VIEWVOLUME_H_
9
-#define _VIEWVOLUME_H_
10
-
11
-#include "math/Matrix.h"
12
-
13
-/*!
14
- * \brief Viewing Volume for culling use
15
- */
16
-class ViewVolume {
17
-  public:
18
-
19
-    /*!
20
-     * \brief Sides of the view volume
21
-     */
22
-    enum ViewVolumeSide {
23
-        rightSide  = 0, //!< Right
24
-        leftSide   = 1, //!< Left
25
-        bottomSide = 2, //!< Bottom
26
-        topSide    = 3, //!< Top
27
-        farSide    = 4, //!< Back
28
-        nearSide   = 5  //!< Front
29
-    };
30
-
31
-    /*!
32
-     * \brief Planes of the view volume
33
-     */
34
-    enum ViewVolumePlane {
35
-        planeA = 0, //!< X value of normal
36
-        planeB = 1, //!< Y value of normal
37
-        planeC = 2, //!< Z value of normal
38
-        planeD = 3  //!< Distance to origin
39
-    };
40
-
41
-    /*!
42
-     * \brief Constructs an object of ViewVolume
43
-     */
44
-    ViewVolume();
45
-
46
-    /*!
47
-     * \brief Check if point is in view volume
48
-     * \param x X coordinate of point
49
-     * \param y Y coordinate of point
50
-     * \param z Z coordinate of point
51
-     * \returns true if point in view volume
52
-     */
53
-    bool isPointInFrustum(float x, float y, float z);
54
-
55
-    /*!
56
-     * \brief Check if bounding sphere is in view volume
57
-     * \param x X coordinate of a valid abstract sphere
58
-     * \param y Y coordinate of a valid abstract sphere
59
-     * \param z Z coordinate of a valid abstract sphere
60
-     * \param radius radius of a valid abstract sphere
61
-     * \returns true if abstract sphere in view volume
62
-     */
63
-    bool isSphereInFrustum(float x, float y, float z, float radius);
64
-
65
-    /*!
66
-     * \brief Check if bounding box is in view volume
67
-     * \param min minimum point of valid abstract bounding box
68
-     * \param max maximum point of valid abstract bounding box
69
-     * \returns true if abstract bounding box in view volume
70
-     */
71
-    bool isBboxInFrustum(float min[3], float max[3]);
72
-
73
-    /*!
74
-     * \brief Distance to Bounding sphere
75
-     * \param x X coordinate of a valid abstract sphere
76
-     * \param y Y coordinate of a valid abstract sphere
77
-     * \param z Z coordinate of a valid abstract sphere
78
-     * \param radius radius of a valid abstract sphere
79
-     * \returns distance to abstract sphere bounding volume
80
-     */
81
-    float getDistToSphereFromNear(float x, float y, float z, float radius);
82
-
83
-    /*!
84
-     * \brief Distance to Bounding box
85
-     * \param min minimum point of a valid abstract bounding box
86
-     * \param max maximum point of a valid abstract bounding box
87
-     * \returns distance to abstract box bounding volume
88
-     */
89
-    float getDistToBboxFromNear(const float min[3], const float max[3]);
90
-
91
-    /*!
92
-     * \brief Get a copy of the view volume
93
-     * \param frustum where frustum will be stored
94
-     */
95
-    void getFrustum(float frustum[6][4]);
96
-
97
-    /*!
98
-     * \brief Get a copy of a given plane in view volume
99
-     * \param p side
100
-     * \param plane wher plane will be stored
101
-     */
102
-    void getPlane(ViewVolumeSide p, float plane[4]);
103
-
104
-    /*!
105
-     * \brief Updates view volume for this frame.
106
-     * \param proj new projection matrix
107
-     * \param mdl new model matrix
108
-     */
109
-    void updateFrame(float proj[16], float mdl[16]);
110
-
111
-    /*!
112
-     * \brief Updates view volume for this frame.
113
-     *
114
-     * Model & Projection Matrices must be set.
115
-     */
116
-    void updateFrame();
117
-
118
-    /*!
119
-     * \brief Set this class' model matrix
120
-     * \param mdl new model matrix
121
-     */
122
-    void setModel(float mdl[16]);
123
-
124
-    /*!
125
-     * \brief Set this class' projection matrix
126
-     * \param proj new projection matrix
127
-     */
128
-    void setProjection(float proj[16]);
129
-
130
-  private:
131
-
132
-    /*!
133
-     * \brief Computes clipping matrix.
134
-     *
135
-     * Model & Projection matrices must be set!
136
-     */
137
-    void updateClip();
138
-
139
-    /*!
140
-     * \brief Computes planes of frustum.
141
-     *
142
-     * Model, Projection & Clip matrices must be set!
143
-     */
144
-    void updateFrustum();
145
-
146
-    Matrix mProjection;   //!< Projection matrix
147
-    Matrix mModel;        //!< Model matrix
148
-    Matrix mClip;         //!< Clipping matrix
149
-    float mFrustum[6][4]; //!< View volume
150
-};
151
-
152
-#endif

+ 0
- 22
include/commands/CommandAnimate.h View File

@@ -1,22 +0,0 @@
1
-/*!
2
- * \file include/commands/CommandAnimate.h
3
- * \brief Animate Command interface
4
- *
5
- * \author xythobuz
6
- */
7
-
8
-#ifndef _COMMAND_ANIMATE_H_
9
-#define _COMMAND_ANIMATE_H_
10
-
11
-#include "commands/Command.h"
12
-
13
-class CommandAnimate : public Command {
14
-  public:
15
-    virtual std::string name();
16
-    virtual std::string brief();
17
-    virtual void printHelp();
18
-    virtual int execute(std::istream& args);
19
-};
20
-
21
-#endif
22
-

+ 0
- 11
include/commands/CommandRender.h View File

@@ -18,16 +18,5 @@ class CommandMode : public Command {
18 18
     virtual int execute(std::istream& args);
19 19
 };
20 20
 
21
-class CommandRenderflag : public Command {
22
-  public:
23
-    virtual std::string name();
24
-    virtual std::string brief();
25
-    virtual void printHelp();
26
-    virtual int execute(std::istream& args);
27
-
28
-  private:
29
-    int stringToFlag(std::string flag);
30
-};
31
-
32 21
 #endif
33 22
 

+ 2
- 23
include/global.h View File

@@ -11,16 +11,6 @@
11 11
 
12 12
 void renderFrame();
13 13
 
14
-// Supported pixelmap color formats
15
-enum ColorMode {
16
-    GREYSCALE,
17
-    RGB,
18
-    RGBA,
19
-    ARGB,
20
-    BGR,
21
-    BGRA
22
-};
23
-
24 14
 // Colors used where ever needed
25 15
 const unsigned char BLACK[]  = {   0,   0,   0, 255 };
26 16
 const unsigned char GREY[]   = { 128, 128, 128, 255 };
@@ -77,25 +67,14 @@ typedef enum {
77 67
     unknownKey // Should always be at the end
78 68
 } KeyboardButton;
79 69
 
80
-// Visual C++ does not understand __attribute__
81
-#ifdef _MSC_VER
82
-#define __attribute__(x)
83
-#endif
84
-
85
-//! \todo Replace NULL usage with nullptr
86
-#ifndef NULL
87
-#define NULL nullptr
88
-#endif
89
-
90 70
 // Globally include OpenGL header
91 71
 #ifdef __APPLE__
92
-#include <OpenGL/gl.h>
72
+#include <OpenGL/gl3.h>
93 73
 #else
94 74
 #ifdef _WIN32
95 75
 #include <windows.h>
96 76
 #endif
97
-#include <GL/gl.h>
98
-#include <GL/glext.h>
77
+#include <GL/gl3.h>
99 78
 #endif
100 79
 
101 80
 // If available, use our own assert that prints the call stack

+ 0
- 202
include/math/Matrix.h View File

@@ -1,202 +0,0 @@
1
-/*!
2
- * \file include/math/Matrix.h
3
- * \brief 3D Matrix
4
- *
5
- * \author Mongoose
6
- */
7
-
8
-#ifndef _MATH_MATRIX_H_
9
-#define _MATH_MATRIX_H_
10
-
11
-#include "math/math.h"
12
-#include "math/Quaternion.h"
13
-#include "math/Vec3.h"
14
-
15
-
16
-/*!
17
- * \brief 3D Matrix
18
- *
19
- * Multidim map for row order encoding
20
- *
21
- *     ///////////////////////////////////////////////
22
- *     // 0,0 - 0;   0,1 - 1;   0,2 - 2;   0,3 - 3  //
23
- *     // 1,0 - 4;   1,1 - 5;   1,2 - 6;   1,3 - 7  //
24
- *     // 2,0 - 8;   2,1 - 9;   2,2 - 10;  2,3 - 11 //
25
- *     // 3,0 - 12;  3,1 - 13;  3,2 - 14;  3,3 - 15 //
26
- *     ///////////////////////////////////////////////
27
- *
28
- * Multidim map for column order encoding
29
- *
30
- *     ///////////////////////////////////////////////
31
- *     // 0,0 - 0;   0,1 - 4;   0,2 - 8;   0,3 - 12 //
32
- *     // 1,0 - 1;   1,1 - 5;   1,2 - 9;   1,3 - 13 //
33
- *     // 2,0 - 2;   2,1 - 6;   2,2 - 10;  2,3 - 14 //
34
- *     // 3,0 - 3;   3,1 - 7;   3,2 - 11;  3,3 - 15 //
35
- *     ///////////////////////////////////////////////
36
- */
37
-class Matrix {
38
-  public:
39
-
40
-    /*!
41
-     * \brief Constructs an object of Matrix
42
-     */
43
-    Matrix();
44
-
45
-    /*!
46
-     * \brief Constructs an object of Matrix
47
-     * \param mat Matrix as data source
48
-     */
49
-    Matrix(float mat[16]);
50
-
51
-    /*!
52
-     * \brief Constructs an object of Matrix
53
-     * \param q Converts and assigns the Quaternion to the Matrix
54
-     */
55
-    Matrix(Quaternion& q);
56
-
57
-    /*!
58
-     * \brief Returns this matrix copy
59
-     * \param mat target
60
-     */
61
-    void getMatrix(float mat[16]);
62
-
63
-    /*!
64
-     * \brief Returns this matrix transposed
65
-     * \param mat target
66
-     */
67
-    void getTransposeMatrix(float mat[16]);
68
-
69
-    /*!
70
-     * \brief Returns this matrix inverted
71
-     * \param mat target
72
-     */
73
-    bool getInvert(float mat[16]);
74
-
75
-    /*!
76
-     * \brief Multiplies two matrices
77
-     * \param a first matrix
78
-     * \param b second matrix
79
-     * \returns resultant matrix
80
-     */
81
-    static Matrix multiply(const Matrix& a, const Matrix& b);
82
-
83
-    /*!
84
-     * \brief Multiplies v vector and this matrix
85
-     * \param v vector
86
-     * \param result where the result will be stored, may be same as v
87
-     */
88
-    void multiply4v(float v[4], float result[4]);
89
-
90
-    /*!
91
-     * \brief Multiplies v vector and this matrix
92
-     * \param v vector
93
-     * \param result where the result will be stored, may be same as v
94
-     */
95
-    void multiply3v(float v[3], float result[3]);
96
-
97
-    /*!
98
-     * \brief Prints matrix values to stdout
99
-     */
100
-    void print();
101
-
102
-    /*!
103
-     * \brief Is this matrix the identity matrix?
104
-     * \returns true if it is identity, false otherwise
105
-     */
106
-    bool isIdentity();
107
-
108
-    /*!
109
-     * \brief Multiplies a and this matrix
110
-     * \param a matrix to multiply with
111
-     * \returns resultant matrix
112
-     */
113
-    Matrix operator *(const Matrix& a);
114
-
115
-    /*!
116
-     * \brief Multiply vector by this matrix
117
-     * \param v Vector to multiply with
118
-     * \returns resultant vector (mult)
119
-     */
120
-    Vec3 operator *(Vec3 v);
121
-
122
-    /*!
123
-     * \brief Sets to identity matrix
124
-     */
125
-    void setIdentity();
126
-
127
-    /*!
128
-     * \brief S et the matrix
129
-     * \fixme dangerous, scary, boo!
130
-     * \param mat new matrix
131
-     */
132
-    void setMatrix(float mat[16]);
133
-
134
-    /*!
135
-     * \brief Rotate object in 3D space
136
-     * \param x x rotation in radians
137
-     * \param y y rotation in radians
138
-     * \param z z rotation in radians
139
-     */
140
-    void rotate(float x, float y, float z);
141
-
142
-    /*!
143
-     * \brief Rotate object in 3D space
144
-     * \param xyz rotation in radians
145
-     */
146
-    void rotate(const float* xyz);
147
-
148
-    /*!
149
-     * \brief Scale object in 3D space
150
-     * \param x x scaling
151
-     * \param y y scaling
152
-     * \param z z scaling
153
-     */
154
-    void scale(float x, float y, float z);
155
-
156
-    /*!
157
-     * \brief Scale object in 3D space
158
-     * \param xyz scaling factors
159
-     */
160
-    void scale(const float* xyz);
161
-
162
-    /*!
163
-     * \brief Translate (move) object in 3D space
164
-     * \param x x translation
165
-     * \param y y translation
166
-     * \param z z translation
167
-     */
168
-    void translate(float x, float y, float z);
169
-
170
-    /*!
171
-     * \brief Translate (move) object in 3D space
172
-     * \param xyz translations
173
-     */
174
-    void translate(const float* xyz);
175
-
176
-    /*!
177
-     * \brief Transpose this matrix
178
-     */
179
-    void transpose();
180
-
181
-  private:
182
-
183
-    /*!
184
-     * \brief Copys value from source to dest
185
-     * \param source source
186
-     * \param dest destination
187
-     */
188
-    static void copy(float source[16], float dest[16]);
189
-
190
-    /*!
191
-     * \brief Multiplies matrices a and b. Neither a or b is also the result.
192
-     * \param a first matrix
193
-     * \param b second matrix
194
-     * \param result wil be set to resultant matrix value
195
-     */
196
-    static void multiply(const float a[16], const float b[16], float result[16]);
197
-
198
-    float mMatrix[16];
199
-};
200
-
201
-#endif
202
-

+ 0
- 202
include/math/Quaternion.h View File

@@ -1,202 +0,0 @@
1
-/*!
2
- * \file include/math/Quaternion.h
3
- * \brief Quaternion
4
- *
5
- * \author Mongoose
6
- */
7
-
8
-#ifndef _MATH_QUATERNION_H_
9
-#define _MATH_QUATERNION_H_
10
-
11
-#include "math/math.h"
12
-
13
-/*!
14
- * \brief Quaternion
15
- */
16
-class Quaternion {
17
-  public:
18
-
19
-    /*!
20
-     * \brief Constructs an object of Quaternion
21
-     */
22
-    Quaternion();
23
-
24
-    /*!
25
-     * \brief Constructs an object of Quaternion
26
-     * \param w W part of new Quaternion
27
-     * \param x X part of new Quaternion
28
-     * \param y Y part of new Quaternion
29
-     * \param z Z part of new Quaternion
30
-     */
31
-    Quaternion(float w, float x, float y, float z);
32
-
33
-    /*!
34
-     * \brief Constructs an object of Quaternion
35
-     * \param v contents of new Quaternion
36
-     */
37
-    Quaternion(float v[4]);
38
-
39
-    /*!
40
-     * \brief Get column order matrix equivalent of this quaternion
41
-     * \param m where matrix will be stored
42
-     */
43
-    void getMatrix(float m[16]);
44
-
45
-    /*!
46
-     * \brief Multiplies this quaternion.
47
-     *
48
-     * Use normalize() call for unit quaternion.
49
-     *
50
-     * \param q what to multiply this quaternion with
51
-     * \returns resultant quaternion
52
-     * \sa Quaternion::normalize()
53
-     */
54
-    Quaternion operator *(const Quaternion& q);
55
-
56
-    /*!
57
-     * \brief Divide from this quaternion
58
-     * \param q what to divide from this quaternion
59
-     * \returns resultant quaternion
60
-     */
61
-    Quaternion operator /(const Quaternion& q);
62
-
63
-    /*!
64
-     * \brief Add to this quaternion
65
-     * \param q what to add to this quaternion
66
-     * \returns resultant quaternion
67
-     */
68
-    Quaternion operator +(const Quaternion& q);
69
-
70
-    /*!
71
-     * \brief Subtract from this quaternion
72
-     * \param q what to subtract from this quaternion
73
-     * \returns resultant quaternion
74
-     */
75
-    Quaternion operator -(const Quaternion& q);
76
-
77
-    /*!
78
-     * \brief Compares q to this quaternion
79
-     * \param q what to compare this quaternion to
80
-     * \returns true if equal, false otherwise
81
-     */
82
-    bool operator ==(const Quaternion& q);
83
-
84
-    /*!
85
-     * \brief Conjugate this quaternion
86
-     * \returns Conjugate of this quaternion
87
-     */
88
-    Quaternion conjugate();
89
-
90
-    /*!
91
-     * \brief Scale this quaternion
92
-     * \param s scaling factor
93
-     * \returns Scaled result of this quaternion
94
-     */
95
-    Quaternion scale(float s);
96
-
97
-    /*!
98
-     * \brief Inverse this quaternion
99
-     * \returns inverse of this quaternion
100
-     */
101
-    Quaternion inverse();
102
-
103
-    /*!
104
-     * \brief Dot Product of quaternions
105
-     * \param a first argument to dot product
106
-     * \param b second argument to dot product
107
-     * \returns dot product between a and b quaternions
108
-     */
109
-    static float dot(Quaternion a, Quaternion b);
110
-
111
-    /*!
112
-     * \brief Magnitude of this quaternion
113
-     * \returns Magnitude of this quaternion
114
-     */
115
-    float magnitude();
116
-
117
-    /*!
118
-     * \brief Interpolates between a and b rotations.
119
-     *
120
-     * Using spherical linear interpolation:
121
-     * `I = (((B . A)^-1)^Time)A`
122
-     *
123
-     * \param a first argument for slerp
124
-     * \param b second argument for slerp
125
-     * \param time time argument for slerp
126
-     * \returns resultant quaternion
127
-     */
128
-    static Quaternion slerp(Quaternion a, Quaternion b, float time);
129
-
130
-    /*!
131
-     * \brief Sets this quaternion to identity
132
-     */
133
-    void setIdentity();
134
-
135
-    /*!
136
-     * \brief Sets this quaternion
137
-     * \param angle new angle
138
-     * \param x new X coordinate
139
-     * \param y new Y coordinate
140
-     * \param z new Z coordinate
141
-     */
142
-    void set(float angle, float x, float y, float z);
143
-
144
-    /*!
145
-     * \brief Normalize this quaternion
146
-     */
147
-    void normalize();
148
-
149
-    /*!
150
-     * \brief Set this quaternion
151
-     * \param q will be copied into this quaternion
152
-     */
153
-    void copy(Quaternion q);
154
-
155
-    /*!
156
-     * \brief Sets matrix equivalent of this quaternion
157
-     * \param m matrix in valid column order
158
-     */
159
-    void setByMatrix(float m[16]);
160
-
161
-  private:
162
-
163
-    /*!
164
-     * \brief Multiplies two quaternions
165
-     * \param a first argument to multiplication
166
-     * \param b second argument to multiplication
167
-     * \returns resultant quaternion
168
-     */
169
-    static Quaternion multiply(Quaternion a, Quaternion b);
170
-
171
-    /*!
172
-     * \brief Divides B from A quaternion
173
-     * \param a first argument to division
174
-     * \param b second argument to division
175
-     * \returns quotient quaternion
176
-     */
177
-    static Quaternion divide(Quaternion a, Quaternion b);
178
-
179
-    /*!
180
-     * \brief Adds A and B quaternions
181
-     * \param a first argument to addition
182
-     * \param b second argument to addition
183
-     * \returns resultant quaternion
184
-     */
185
-    static Quaternion add(Quaternion a, Quaternion b);
186
-
187
-    /*!
188
-     * \brief Subtracts B from A quaternion
189
-     * \param a first argument to subtraction
190
-     * \param b second argument to subtraction
191
-     * \returns resultant quaternion
192
-     */
193
-    static Quaternion subtract(Quaternion a, Quaternion b);
194
-
195
-    float mW; //!< Quaternion, W part
196
-    float mX; //!< Quaternion, X part
197
-    float mY; //!< Quaternion, Y part
198
-    float mZ; //!< Quaternion, Z part
199
-};
200
-
201
-#endif
202
-

+ 0
- 46
include/math/Vec3.h View File

@@ -1,46 +0,0 @@
1
-/*!
2
- * \file include/math/Vec3.h
3
- * \brief 3D Math vector
4
- *
5
- * \author xythobuz
6
- * \author Mongoose
7
- */
8
-
9
-#ifndef _MATH_VEC3_H_
10
-#define _MATH_VEC3_H_
11
-
12
-#include "math/math.h"
13
-
14
-class Vec3 {
15
-  public:
16
-    Vec3(float _x = 0.0f, float _y = 0.0f, float _z = 0.0f);
17
-    Vec3(float v[3]);
18
-
19
-    float magnitude();
20
-    void normalize();
21
-    Vec3 unit();
22
-
23
-    Vec3 operator +(const Vec3& v);
24
-    Vec3 operator -(const Vec3& v);
25
-    Vec3 operator -();
26
-    Vec3 operator *(float s);
27
-    Vec3 operator /(float s);
28
-    float operator *(const Vec3& v);
29
-
30
-    Vec3& operator +=(const Vec3& v);
31
-    Vec3& operator -=(const Vec3& v);
32
-    Vec3& operator *=(float s);
33
-
34
-    bool operator ==(const Vec3& v);
35
-    bool operator !=(const Vec3& v);
36
-
37
-    float x, y, z;
38
-
39
-    // ----------------------------------------------------------
40
-
41
-    static float dot(const Vec3& u, const Vec3& v);
42
-    static Vec3 cross(const Vec3& u, const Vec3& v);
43
-};
44
-
45
-#endif
46
-

+ 0
- 65
include/math/math.h View File

@@ -1,65 +0,0 @@
1
-/*!
2
- *
3
- * \file include/math/math.h
4
- * \brief Vector and Matrix math
5
- *
6
- * \author Mongoose
7
- * \author xythobuz
8
- */
9
-
10
-#ifndef _MATH_MATH_H
11
-#define _MATH_MATH_H
12
-
13
-#ifndef M_PI
14
-#define OR_PI (3.14159265358979323846f) //!< pi
15
-#else
16
-#define OR_PI ((float)M_PI) //!< pi
17
-#endif
18
-
19
-#define OR_RAD_TO_DEG(x) ((x) * (180.0f / OR_PI)) //!< Convert radians to degrees
20
-#define OR_DEG_TO_RAD(x) ((x) * (OR_PI / 180.0f)) //!< Convert degrees to radians
21
-
22
-/*!
23
- * \brief Compare two floats with an Epsilon.
24
- * \param a first float
25
- * \param b second float
26
- * \returns true if a and b are probably the same.
27
- */
28
-bool equalEpsilon(float a, float b);
29
-
30
-/*!
31
- * \brief Calculate Intersection of a line and a polygon
32
- * \param intersect Where the intersection is stored, if it exists
33
- * \param p1 First point of line segment
34
- * \param p2 Second point of line segment
35
- * \param polygon polygon vertex array (0 to 2 are used)
36
- * \returns 0 if there is no intersection
37
- */
38
-int intersectionLinePolygon(float intersect[3], float p1[3], float p2[3], float polygon[3][3]);
39
-
40
-/*!
41
- * \brief Calculate the length of a line segment / the distance between two points
42
- * \param a First point
43
- * \param b Second point
44
- * \returns distance/length
45
- */
46
-float distance(const float a[3], const float b[3]);
47
-
48
-/*!
49
- * \brief Calculates the midpoint between two points / of a line segment
50
- * \param a First point
51
- * \param b Second point
52
- * \param mid Midpoint will be stored here
53
- */
54
-void midpoint(const float a[3], const float b[3], float mid[3]);
55
-
56
-/*!
57
- * \brief Calculates a pseudo-random number
58
- * \param from Lower bound of resulting number
59
- * \param to Upper bound
60
- * \returns random number
61
- */
62
-float randomNum(float from, float to);
63
-
64
-#endif
65
-

+ 5
- 2
include/system/FontTRLE.h View File

@@ -8,6 +8,9 @@
8 8
 #ifndef _FONT_TRLE_H_
9 9
 #define _FONT_TRLE_H_
10 10
 
11
+#include "glm/vec2.hpp"
12
+#include <vector>
13
+
11 14
 /*!
12 15
  * \brief Tomb Raider Level Editor Font loader
13 16
  */
@@ -30,8 +33,8 @@ class FontTRLE {
30 33
   private:
31 34
     static void setDefaultOffsets();
32 35
     static void loadLPS(std::string f);
33
-    static void writeChar(unsigned int index, unsigned int xDraw, unsigned int yDraw,
34
-                          float scale, const unsigned char color[4]);
36
+    static void writeChar(unsigned int index, unsigned int xDraw, unsigned int yDraw, float scale,
37
+                          std::vector<glm::vec2>& vertices, std::vector<glm::vec2>& uvs);
35 38
 
36 39
     static bool mFontInit;
37 40
     static unsigned int mFontTexture;

+ 48
- 23
include/system/Window.h View File

@@ -8,49 +8,61 @@
8 8
 #ifndef _WINDOW_H_
9 9
 #define _WINDOW_H_
10 10
 
11
-/*!
12
- * \brief Windowing interface
13
- */
11
+#include "glm/vec2.hpp"
12
+#include "glm/vec4.hpp"
13
+
14
+#include <vector>
15
+
16
+class Shader {
17
+  public:
18
+    Shader() : programID(-1) { }
19
+    ~Shader();
20
+
21
+    int compile(const char* vertex, const char* fragment);
22
+    void use();
23
+
24
+    int addUniform(const char* name);
25
+    unsigned int getUniform(int n);
26
+
27
+    void addBuffer(int n = 1);
28
+    unsigned int getBuffer(int n);
29
+
30
+  private:
31
+    int programID;
32
+    std::vector<unsigned int> uniforms;
33
+    std::vector<unsigned int> buffers;
34
+};
35
+
14 36
 class Window {
15 37
   public:
16 38
 
17 39
     virtual ~Window() {}
18 40
 
19 41
     virtual void setSize(unsigned int width, unsigned int height) = 0;
42
+    virtual unsigned int getWidth();
43
+    virtual unsigned int getHeight();
20 44
 
21 45
     virtual void setFullscreen(bool fullscreen) = 0;
22
-
23
-    virtual bool getFullscreen() { return mFullscreen; }
46
+    virtual bool getFullscreen();
24 47
 
25 48
     virtual void setMousegrab(bool grab) = 0;
26
-
27
-    virtual bool getMousegrab() { return mMousegrab; }
49
+    virtual bool getMousegrab();
28 50
 
29 51
     virtual int initialize() = 0;
30 52
 
31 53
     virtual void eventHandling() = 0;
32 54
 
33 55
     virtual void setTextInput(bool on) = 0;
34
-
35
-    virtual bool getTextInput() { return mTextInput; }
56
+    virtual bool getTextInput();
36 57
 
37 58
     virtual void swapBuffersGL() = 0;
38 59
 
39
-    virtual unsigned int getWidth() { return mWidth; }
40
-
41
-    virtual unsigned int getHeight() { return mHeight; }
42
-
43
-    virtual int initializeGL();
44
-
45
-    virtual void resizeGL();
60
+    static int initializeGL();
61
+    static void shutdownGL();
62
+    static void resizeGL();
46 63
 
47
-    virtual void glEnter2D();
48
-
49
-    virtual void glExit2D();
50
-
51
-    static void lookAt(float eyeX, float eyeY, float eyeZ,
52
-                       float lookAtX, float lookAtY, float lookAtZ,
53
-                       float upX, float upY, float upZ);
64
+    static void drawTextGL(std::vector<glm::vec2>& vertices, std::vector<glm::vec2>& uvs,
65
+                           glm::vec4 color, unsigned int texture);
54 66
 
55 67
   protected:
56 68
     bool mInit;
@@ -59,6 +71,19 @@ class Window {
59 71
     bool mTextInput;
60 72
     unsigned int mWidth;
61 73
     unsigned int mHeight;
74
+
75
+  private:
76
+    static Shader textShader;
77
+    static const char* textShaderVertex;
78
+    static const char* textShaderFragment;
79
+
80
+    static Shader imguiShader;
81
+    static const char* imguiShaderVertex;
82
+    static const char* imguiShaderFragment;
83
+
84
+    static unsigned int vertexArrayID;
85
+
86
+    friend class UI;
62 87
 };
63 88
 
64 89
 Window& getWindow();

+ 4
- 1
include/utils/pcx.h View File

@@ -11,6 +11,8 @@
11 11
 #ifndef _UTILS_PCX_H_
12 12
 #define _UTILS_PCX_H_
13 13
 
14
+#include "TextureManager.h"
15
+
14 16
 /*!
15 17
  * \brief Check if a file is a valid PCX image
16 18
  * \param filename path of file to read
@@ -29,7 +31,8 @@ int pcxCheck(const char* filename);
29 31
  * \returns 0 on success
30 32
  */
31 33
 int pcxLoad(const char* filename, unsigned char** image,
32
-            unsigned int* width, unsigned int* height, ColorMode* mode, unsigned int* bpp);
34
+            unsigned int* width, unsigned int* height,
35
+            TextureManager::ColorMode* mode, unsigned int* bpp);
33 36
 
34 37
 #endif
35 38
 

+ 6
- 2
include/utils/png.h View File

@@ -8,6 +8,8 @@
8 8
 #ifndef _UTILS_PNG_H_
9 9
 #define _UTILS_PNG_H_
10 10
 
11
+#include "TextureManager.h"
12
+
11 13
 /*!
12 14
  * \brief Check if a file is a valid PNG image
13 15
  * \param filename path of file to read
@@ -26,7 +28,8 @@ int pngCheck(const char* filename);
26 28
  * \returns 0 on success
27 29
  */
28 30
 int pngLoad(const char* filename, unsigned char** image,
29
-            unsigned int* width, unsigned int* height, ColorMode* mode, unsigned int* bpp);
31
+            unsigned int* width, unsigned int* height,
32
+            TextureManager::ColorMode* mode, unsigned int* bpp);
30 33
 
31 34
 /*!
32 35
  * \brief Create a PNG image file from an RGBA buffer
@@ -39,7 +42,8 @@ int pngLoad(const char* filename, unsigned char** image,
39 42
  * \returns 0 on success
40 43
  */
41 44
 int pngSave(const char* filename, unsigned char* image,
42
-            unsigned int width, unsigned int height, ColorMode mode, unsigned int bpp);
45
+            unsigned int width, unsigned int height,
46
+            TextureManager::ColorMode mode, unsigned int bpp);
43 47
 
44 48
 #endif
45 49
 

+ 1
- 1
include/utils/tga.h View File

@@ -18,7 +18,7 @@ int tgaCheck(const char* filename);
18 18
 /*!
19 19
  * \brief Load a TGA image from file
20 20
  * \param filename path to file
21
- * \param image Where the pixmap will be stored (or NULL)
21
+ * \param image Where the pixmap will be stored (or nullptr)
22 22
  * \param width where the width will be stored
23 23
  * \param height where the height will be stored
24 24
  * \param type where the type will be stored (tga_type_t)

+ 8
- 6
src/CMakeLists.txt View File

@@ -55,6 +55,12 @@ if (PNG_FOUND)
55 55
     add_definitions (${PNG_DEFINITIONS})
56 56
 endif (PNG_FOUND)
57 57
 
58
+# Add GLM Library
59
+find_package (GLM REQUIRED)
60
+if (GLM_FOUND)
61
+    include_directories (SYSTEM  ${GLM_INCLUDE_DIRS})
62
+endif (GLM_FOUND)
63
+
58 64
 #################################################################
59 65
 
60 66
 # Set Source files
@@ -78,9 +84,7 @@ set (SRCS ${SRCS} "SoundManager.cpp")
78 84
 set (SRCS ${SRCS} "Sprite.cpp")
79 85
 set (SRCS ${SRCS} "StaticMesh.cpp")
80 86
 set (SRCS ${SRCS} "TextureManager.cpp")
81
-set (SRCS ${SRCS} "TombRaider.cpp")
82 87
 set (SRCS ${SRCS} "UI.cpp")
83
-set (SRCS ${SRCS} "ViewVolume.cpp")
84 88
 set (SRCS ${SRCS} "World.cpp")
85 89
 
86 90
 # Select available Sound library
@@ -219,7 +223,6 @@ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OpenRaider_CXX_FLAGS}
219 223
 add_subdirectory ("commands")
220 224
 add_subdirectory ("deps")
221 225
 add_subdirectory ("loader")
222
-add_subdirectory ("math")
223 226
 add_subdirectory ("system")
224 227
 add_subdirectory ("utils")
225 228
 
@@ -227,9 +230,8 @@ add_subdirectory ("utils")
227 230
 add_library (OpenRaider_all OBJECT ${SRCS})
228 231
 add_executable (OpenRaider MACOSX_BUNDLE ${RESRCS}
229 232
     $<TARGET_OBJECTS:OpenRaider_all> $<TARGET_OBJECTS:OpenRaider_commands>
230
-    $<TARGET_OBJECTS:OpenRaider_deps> $<TARGET_OBJECTS:OpenRaider_math>
231
-    $<TARGET_OBJECTS:OpenRaider_utils> $<TARGET_OBJECTS:OpenRaider_loader>
232
-    $<TARGET_OBJECTS:OpenRaider_system>
233
+    $<TARGET_OBJECTS:OpenRaider_deps> $<TARGET_OBJECTS:OpenRaider_loader>
234
+    $<TARGET_OBJECTS:OpenRaider_utils> $<TARGET_OBJECTS:OpenRaider_system>
233 235
 )
234 236
 
235 237
 #################################################################

+ 46
- 79
src/Camera.cpp View File

@@ -6,89 +6,56 @@
6 6
  * \author xythobuz
7 7
  */
8 8
 
9
+#include "glm/gtc/matrix_transform.hpp"
10
+
9 11
 #include "global.h"
10
-#include <cmath>
11
-#include "math/Matrix.h"
12 12
 #include "Camera.h"
13 13
 
14
-Camera::Camera() {
15
-    mViewDistance = 14.0f;
16
-    mRotationDeltaX = 1.0f;
17
-    mRotationDeltaY = 1.0f;
18
-    mTheta = 0.0f;
19
-    mTheta2 = 0.0f;
20
-
21
-    mPos[0] = 0.0f;
22
-    mPos[1] = 0.0f;
23
-    mPos[2] = 0.0f;
24
-
25
-    mTarget[0] = 0.0f;
26
-    mTarget[1] = 0.0f;
27
-    mTarget[2] = mViewDistance;
28
-
29
-    mQ.setIdentity();
30
-}
31
-
32
-void Camera::getTarget(float target[3]) {
33
-    target[0] = mTarget[0];
34
-    target[1] = mTarget[1];
35
-    target[2] = mTarget[2];
36
-}
37
-
38
-void Camera::setPosition(float pos[3]) {
39
-    mPos[0] = pos[0];
40
-    mPos[1] = pos[1];
41
-    mPos[2] = pos[2];
42
-}
43
-
44
-void Camera::update() {
45
-    mTarget[0] = (mViewDistance * std::sin(mTheta)) + mPos[0];
46
-    mTarget[1] = (mViewDistance * std::sin(mTheta2)) + mPos[1]; // + height_offset;
47
-    mTarget[2] = (mViewDistance * std::cos(mTheta)) + mPos[2];
48
-}
49
-
50
-void Camera::rotate(float angle, float x, float y, float z) {
51
-    Quaternion t, n;
52
-    float look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
53
-
54
-    t.set(angle, x, y, z);
55
-    n = mQ * t;
56
-    n.normalize();
57
-
58
-    Matrix matrix(n);
59
-    matrix.multiply4v(look, mTarget);
60
-
61
-    for (int i = 0; i < 3; ++i)
62
-        mTarget[i] += mPos[i];
63
-
64
-    mQ = n;
14
+glm::vec3 Camera::pos(0.0f, 0.0f, 0.0f);
15
+float Camera::thetaX = glm::pi<float>();
16
+float Camera::thetaY = 0.0f;
17
+float Camera::rotationDeltaX = 0.75f;
18
+float Camera::rotationDeltaY = 0.75f;
19
+
20
+void Camera::handleMouseMotion(int x, int y) {
21
+    while (x > 0) {
22
+        if (thetaX < (glm::pi<float>() / 2.0f)) {
23
+            thetaX += rotationDeltaX;
24
+        }
25
+        x--;
26
+    }
27
+    while (x < 0) {
28
+        if (thetaX > -(glm::pi<float>() / 2.0f)) {
29
+            thetaX -= rotationDeltaX;
30
+        }
31
+        x++;
32
+    }
33
+    while (y > 0) {
34
+        if (thetaY < (glm::pi<float>() / 2.0f)) {
35
+            thetaY += rotationDeltaY;
36
+        }
37
+        y--;
38
+    }
39
+    while (y < 0) {
40
+        if (thetaY > -(glm::pi<float>() / 2.0f)) {
41
+            thetaY -= rotationDeltaY;
42
+        }
43
+        y++;
44
+    }
65 45
 }
66 46
 
67
-void Camera::command(enum camera_command cmd) {
68
-    switch (cmd) {
69
-        case CAMERA_ROTATE_UP:
70
-            if (mTheta2 < (OR_PI / 2)) {
71
-                mTheta2 += mRotationDeltaY;
72
-                rotate(mTheta2, 1.0f, 0.0f, 0.0f);
73
-            }
74
-            break;
75
-
76
-        case CAMERA_ROTATE_DOWN:
77
-            if (mTheta2 > -(OR_PI / 2)) {
78
-                mTheta2 -= mRotationDeltaY;
79
-                rotate(mTheta2, 1.0f, 0.0f, 0.0f);
80
-            }
81
-            break;
82
-
83
-        case CAMERA_ROTATE_RIGHT:
84
-            mTheta += mRotationDeltaX;
85
-            rotate(mTheta, 0.0f, 1.0f, 0.0f);
86
-            break;
87
-
88
-        case CAMERA_ROTATE_LEFT:
89
-            mTheta -= mRotationDeltaX;
90
-            rotate(mTheta, 0.0f, 1.0f, 0.0f);
91
-            break;
92
-    }
47
+glm::mat4 Camera::getViewMatrix() {
48
+    glm::vec3 dir(
49
+        glm::cos(thetaY) * glm::sin(thetaX),
50
+        glm::sin(thetaY),
51
+        glm::cos(thetaY) * glm::cos(thetaX)
52
+    );
53
+    glm::vec3 right(
54
+        glm::sin(thetaX - glm::pi<float>() / 2.0f),
55
+        0.0f,
56
+        glm::cos(thetaX - glm::pi<float>() / 2.0f)
57
+    );
58
+    glm::vec3 up = glm::cross(right, dir);
59
+    return glm::lookAt(pos, pos + dir, up);
93 60
 }
94 61
 

+ 1
- 1
src/Console.cpp View File

@@ -69,7 +69,7 @@ void Console::callback(ImGuiTextEditCallbackData* data) {
69 69
 }
70 70
 
71 71
 void Console::display() {
72
-    if (ImGui::Begin("Console", NULL, ImVec2(600, 400), -1.0f)) {
72
+    if (ImGui::Begin("Console", nullptr, ImVec2(600, 400), -1.0f)) {
73 73
         if (lastLogLength != getLog().size()) {
74 74
             lastLogLength = getLog().size();
75 75
             scrollToBottom = true;

+ 7
- 46
src/Entity.cpp View File

@@ -5,16 +5,13 @@
5 5
  * \author xythobuz
6 6
  */
7 7
 
8
-#include <cmath>
8
+#include "glm/glm.hpp"
9 9
 
10 10
 #include "global.h"
11 11
 #include "Log.h"
12
-#include "Render.h"
13 12
 #include "World.h"
14 13
 #include "Entity.h"
15 14
 
16
-#include "games/TombRaider1.h"
17
-
18 15
 Entity::Entity(float p[3], float a[3], int id, long r, unsigned int model) {
19 16
     for (int i = 0; i < 3; i++) {
20 17
         pos[i] = p[i];
@@ -30,52 +27,16 @@ Entity::Entity(float p[3], float a[3], int id, long r, unsigned int model) {
30 27
     state = 0;
31 28
 }
32 29
 
33
-Entity::Entity(TombRaider& tr, unsigned int index, unsigned int i, unsigned int model) {
34
-    tr2_moveable_t* moveable = tr.Moveable();
35
-    tr2_item_t* item = tr.Item();
36
-
37
-    pos[0] = item[i].x;
38
-    pos[1] = item[i].y;
39
-    pos[2] = item[i].z;
40
-    angles[0] = 0;
41
-    angles[1] = OR_DEG_TO_RAD(((item[i].angle >> 14) & 0x03) * 90.0f);
42
-    angles[2] = 0;
43
-    objectId = moveable[index].object_id;
44
-    moveType = MoveTypeWalk;
45
-    room = getWorld().getRoomByLocation(pos[0], pos[1], pos[2]);
46
-    skeletalModel = model;
47
-    boneFrame = 0;
48
-    animationFrame = 0;
49
-    idleAnimation = 0;
50
-    state = 0;
51
-}
52
-
53
-bool Entity::operator<(Entity& o) {
54
-    float distA = getRender().getDistToSphereFromNear(pos[0], pos[1], pos[2], 1.0f);
55
-    float distB = getRender().getDistToSphereFromNear(o.pos[0], o.pos[1], o.pos[2], 1.0f);
56
-    return (distA < distB);
57
-}
58
-
59
-bool Entity::compare(Entity* a, Entity* b) {
60
-    return (*b) < (*a);
61
-}
62
-
63 30
 void Entity::display() {
31
+    /*
64 32
     glPushMatrix();
65 33
     glTranslatef(pos[0], pos[1], pos[2]);
66
-    glRotatef(OR_RAD_TO_DEG(angles[1]), 0, 1, 0);
67
-    glRotatef(OR_RAD_TO_DEG(angles[0]), 1, 0, 0);
68
-    //glRotatef(OR_RAD_TO_DEG(angles[2]), 0, 0, 1);
34
+    glRotatef(glm::degrees(angles[1]), 0, 1, 0);
35
+    glRotatef(glm::degrees(angles[0]), 1, 0, 0);
36
+    //glRotatef(glm::degrees(angles[2]), 0, 0, 1);
69 37
     getWorld().getSkeletalModel(skeletalModel).display(animationFrame, boneFrame);
70 38
     glPopMatrix();
71
-
72
-    // Cycle frames
73
-    if (getRender().getFlags() & Render::fAnimateAllModels) {
74
-        if (boneFrame < (getModel().get(animationFrame).size() - 1))
75
-            boneFrame++;
76
-        else
77
-            boneFrame = 0;
78
-    }
39
+    */
79 40
 }
80 41
 
81 42
 void Entity::move(char movement) {
@@ -233,7 +194,7 @@ void Entity::print() {
233 194
              << ")" << Log::endl
234 195
              << "  " << pos[0] << "x " << pos[1] << "y " << pos[2] << "z"
235 196
              << Log::endl
236
-             << "  " << OR_RAD_TO_DEG(angles[1]) << " Yaw" << Log::endl;
197
+             << "  " << glm::degrees(angles[1]) << " Yaw" << Log::endl;
237 198
 }
238 199
 
239 200
 SkeletalModel& Entity::getModel() {

+ 13
- 294
src/Game.cpp View File

@@ -24,12 +24,6 @@
24 24
 #include "World.h"
25 25
 #include "utils/strings.h"
26 26
 
27
-#include "games/TombRaider1.h"
28
-
29
-#ifdef MULTITEXTURE
30
-std::map<int, int> gMapTex2Bump;
31
-#endif
32
-
33 27
 Game::Game() {
34 28
     mLoaded = false;
35 29
     mLara = -1;
@@ -40,22 +34,21 @@ Game::~Game() {
40 34
 
41 35
 int Game::initialize() {
42 36
     // Enable Renderer
43
-    getRender().setMode(Render::modeLoadScreen);
37
+    Render::setMode(RenderMode::LoadScreen);
44 38
 
45 39
     return 0;
46 40
 }
47 41
 
48 42
 void Game::display() {
49
-    getRender().display();
43
+    Render::display();
50 44
 }
51 45
 
52 46
 void Game::destroy() {
53 47
     mLoaded = false;
54 48
     mLara = -1;
55
-    getRender().setMode(Render::modeLoadScreen);
49
+    Render::setMode(RenderMode::LoadScreen);
56 50
 
57 51
     getWorld().destroy();
58
-    getRender().ClearWorld();
59 52
     Sound::clear(); // Remove all previously loaded sounds
60 53
     SoundManager::clear();
61 54
     getTextureManager().clear();
@@ -67,20 +60,17 @@ bool Game::isLoaded() {
67 60
 
68 61
 int Game::loadLevel(const char* level) {
69 62
     destroy();
70
-
71 63
     levelName = level;
72
-
73 64
     getLog() << "Loading " << levelName << Log::endl;
74
-
75
-    int error = 0;
76 65
     auto loader = Loader::createLoader(level);
77 66
     if (loader) {
78 67
         // First Loader test
79 68
         getLog() << "Trying to load using new loader..." << Log::endl;
80
-        error = loader->load(level);
69
+        int error = loader->load(level);
81 70
         if (error != 0) {
82 71
             getLog() << "Error while trying new loader (" << error << ")..." << Log::endl;
83 72
             destroy();
73
+            return -2;
84 74
         } else {
85 75
             SoundManager::prepareSources();
86 76
 
@@ -88,54 +78,16 @@ int Game::loadLevel(const char* level) {
88 78
                 getLog() << "Can't find Lara entity in level?!" << Log::endl;
89 79
             } else {
90 80
                 mLoaded = true;
91
-                //getRender().setMode(Render::modeVertexLight);
81
+                //Render::setMode(RenderMode::Texture);
92 82
             }
93 83
 
94 84
             UI::setVisible(true);
85
+            return 0;
95 86
         }
87
+    } else {
88
+        getLog() << "No suitable loader for this level!" << Log::endl;
89
+        return -1;
96 90
     }
97
-
98
-    if ((!loader) || (error != 0)) {
99
-        getLog() << "Falling back to old level loader..." << Log::endl;
100
-        error = mTombRaider.Load(levelName.c_str());
101
-        if (error != 0)
102
-            return error;
103
-
104
-        // If required, load the external sound effect file MAIN.SFX into TombRaider
105
-        if ((mTombRaider.getEngine() == TR_VERSION_2) || (mTombRaider.getEngine() == TR_VERSION_3)) {
106
-            std::string tmp(levelName);
107
-            size_t pos = tmp.rfind('/');
108
-            tmp.erase(pos + 1);
109
-            tmp += "MAIN.SFX";
110
-            error = mTombRaider.loadSFX(tmp.c_str());
111
-            if (error != 0)
112
-                getLog() << "Could not load SFX " << tmp << Log::endl;
113
-            else
114
-                getLog() << "Loaded external SFX file!" << Log::endl;
115
-        }
116
-
117
-        // Process data
118
-        processTextures();
119
-        processRooms();
120
-        processModels();
121
-        processSprites();
122
-        processMoveables();
123
-        processPakSounds();
124
-
125
-        mTombRaider.reset();
126
-
127
-        if (mLara == -1) {
128
-            //! \todo Cutscene support
129
-            getLog() << "Can't find Lara entity in level pak!" << Log::endl;
130
-            //destroy();
131
-            return -1;
132
-        } else {
133
-            mLoaded = true;
134
-            getRender().setMode(Render::modeVertexLight);
135
-        }
136
-    }
137
-
138
-    return 0;
139 91
 }
140 92
 
141 93
 void Game::handleAction(ActionEvents action, bool isFinished) {
@@ -164,25 +116,12 @@ void Game::handleAction(ActionEvents action, bool isFinished) {
164 116
 
165 117
 void Game::handleMouseMotion(int xrel, int yrel, int xabs, int yabs) {
166 118
     if (mLoaded) {
167
-        // Move Camera on X Axis
168
-        if (xrel > 0)
169
-            while (xrel-- > 0)
170
-                getCamera().command(CAMERA_ROTATE_RIGHT);
171
-        else if (xrel < 0)
172
-            while (xrel++ < 0)
173
-                getCamera().command(CAMERA_ROTATE_LEFT);
174
-
175
-        // Move Camera on Y Axis
176
-        if (yrel > 0)
177
-            while (yrel-- > 0)
178
-                getCamera().command(CAMERA_ROTATE_UP);
179
-        else if (yrel < 0)
180
-            while (yrel++ < 0)
181
-                getCamera().command(CAMERA_ROTATE_DOWN);
119
+        Camera::handleMouseMotion(xrel, yrel);
182 120
 
183
-        // Fix Laras rotation
121
+        /*
184 122
         float angles[3] = { 0.0f, getCamera().getRadianYaw(), getCamera().getRadianPitch() };
185 123
         getLara().setAngles(angles);
124
+        */
186 125
     }
187 126
 }
188 127
 
@@ -198,223 +137,3 @@ void Game::setLara(long lara) {
198 137
     mLara = lara;
199 138
 }
200 139
 
201
-void Game::processSprites() {
202
-    for (int i = 0; i < (mTombRaider.NumItems() - 1); i++) {
203
-        if ((mTombRaider.Engine() == TR_VERSION_1) && (mTombRaider.Item()[i].intensity1 == -1))
204
-            continue;
205
-
206
-        for (int j = 0; j < mTombRaider.NumSpriteSequences(); j++) {
207
-            if (mTombRaider.SpriteSequence()[j].object_id == mTombRaider.Item()[i].object_id)
208
-                getWorld().addSprite(new SpriteSequence(mTombRaider, i, j));
209
-        }
210
-    }
211
-
212
-    getLog() << "Found " << mTombRaider.NumSpriteSequences() << " sprites." << Log::endl;
213
-}
214
-
215
-void Game::processRooms() {
216
-    for (int index = 0; index < mTombRaider.NumRooms(); index++)
217
-        getWorld().addRoom(new Room(mTombRaider, index));
218
-
219
-    getLog() << "Found " << mTombRaider.NumRooms() << " rooms." << Log::endl;
220
-}
221
-
222
-void Game::processModels() {
223
-    for (int index = 0; index < mTombRaider.getMeshCount(); index++)
224
-        getWorld().addStaticMesh(new StaticMesh(mTombRaider, index));
225
-
226
-    getLog() << "Found " << mTombRaider.getMeshCount() << " meshes." << Log::endl;
227
-}
228
-
229
-void Game::processPakSounds() {
230
-    unsigned char* riff;
231
-    unsigned int riffSz;
232
-    //tr2_sound_source_t *sound;
233
-    //tr2_sound_details_t *detail;
234
-    //float pos[3];
235
-    unsigned int i;
236
-    unsigned long id;
237
-
238
-    /* detail
239
-       short sample;
240
-       short volume;
241
-       short sound_range;
242
-       short flags;         // bits 8-15: priority?, 2-7: number of sound samples
243
-    // in this group, bits 0-1: channel number
244
-    */
245
-
246
-    for (i = 0; i < mTombRaider.getSoundSamplesCount(); ++i) {
247
-        mTombRaider.getSoundSample(i, &riffSz, &riff);
248
-
249
-        id = Sound::loadBuffer(riff, riffSz);
250
-
251
-        //if (((i + 1) == TR_SOUND_F_PISTOL) && (id > 0))
252
-        //{
253
-        //m_testSFX = id;
254
-        //}
255
-
256
-        delete [] riff;
257
-
258
-        // sound[i].sound_id; // internal sound index
259
-        // sound[i].flags;  // 0x40, 0x80, or 0xc0
260
-        //pos[0] = sound[i].x;
261
-        //pos[1] = sound[i].y;
262
-        //pos[2] = sound[i].z;
263
-        //getSound().SourceAt(id, pos);
264
-    }
265
-
266
-    getLog() << "Found " << mTombRaider.getSoundSamplesCount() << " sound samples." << Log::endl;
267
-}
268
-
269
-void Game::processTextures() {
270
-    unsigned char* image;
271
-    unsigned char* bumpmap;
272
-    int i;
273
-
274
-    //if ( mTombRaider.getNumBumpMaps())
275
-    //  gBumpMapStart = mTombRaider.NumTextures();
276
-
277
-    for (i = 0; i < mTombRaider.NumTextures(); ++i) {
278
-        mTombRaider.Texture(i, &image, &bumpmap);
279
-
280
-        // Overwrite any previous level textures on load
281
-        getTextureManager().loadBufferSlot(image, 256, 256,
282
-                                           RGBA, 32, TextureManager::TextureStorage::GAME, i);
283
-
284
-#ifdef MULTITEXTURE
285
-        gMapTex2Bump[i] = -1;
286
-#endif
287
-
288
-        if (bumpmap) {
289
-#ifdef MULTITEXTURE
290
-            gMapTex2Bump[i] = i + mTombRaider.NumTextures();
291
-#endif
292
-            getTextureManager().loadBufferSlot(bumpmap, 256, 256,
293
-                                               RGBA, 32, TextureManager::TextureStorage::GAME,
294
-                                               i + mTombRaider.NumTextures());
295
-        }
296
-
297
-        if (image)
298
-            delete [] image;
299
-
300
-        if (bumpmap)
301
-            delete [] bumpmap;
302
-    }
303
-
304
-    getLog() << "Found " << mTombRaider.NumTextures() << " textures." << Log::endl;
305
-}
306
-
307
-void Game::processMoveables() {
308
-    unsigned int statCount = 0;
309
-
310
-    tr2_moveable_t* moveable = mTombRaider.Moveable();
311
-    tr2_item_t* item = mTombRaider.Item();
312
-    tr2_sprite_sequence_t* sprite_sequence = mTombRaider.SpriteSequence();
313
-
314
-    for (int i = 0; i < mTombRaider.NumItems(); ++i) {
315
-        int j;
316
-        int object_id = item[i].object_id;
317
-
318
-        // It may not be a moveable, test for sprite
319
-        if (!(mTombRaider.Engine() == TR_VERSION_1 && item[i].intensity1 == -1)) {
320
-            for (j = 0; j < (int)mTombRaider.NumSpriteSequences(); ++j) {
321
-                if (sprite_sequence[j].object_id == object_id)
322
-                    break;
323
-            }
324
-
325
-            // It's not a moveable, skip sprite
326
-            if (j < (int)mTombRaider.NumSpriteSequences())
327
-                continue;
328
-        }
329
-
330
-        for (j = 0; j < (int)mTombRaider.NumMoveables(); ++j) {
331
-            if ((int)moveable[j].object_id == object_id)
332
-                break;
333
-        }
334
-
335
-        // It's not a moveable or even a sprite? Skip unknown
336
-        if (j == (int)mTombRaider.NumMoveables())
337
-            continue;
338
-
339
-        processMoveable(j, i, object_id);
340
-        statCount++;
341
-    }
342
-
343
-    /*
344
-    // Get models that aren't items
345
-    for (int i = 0; i < mTombRaider.NumMoveables(); ++i)
346
-    {
347
-        switch ((int)moveable[i].object_id)
348
-        {
349
-            case 30:
350
-            case 2: // Which tr needs this as model again?
351
-                processMoveable(i, i, (int)moveable[i].object_id);
352
-                break;
353
-            default:
354
-                switch (mTombRaider.Engine())
355
-                {
356
-                    case TR_VERSION_1:
357
-                        switch ((int)moveable[i].object_id)
358
-                        {
359
-                            case TombRaider1::LaraMutant:
360
-                                processMoveable(i, i, (int)moveable[i].object_id);
361
-                                break;
362
-                        }
363
-                        break;
364
-                    case TR_VERSION_4:
365
-                        switch ((int)moveable[i].object_id)
366
-                        {
367
-                            case TR4_PISTOLS_ANIM:
368
-                            case TR4_UZI_ANIM:
369
-                            case TR4_SHOTGUN_ANIM:
370
-                            case TR4_CROSSBOW_ANIM:
371
-                            case TR4_GRENADE_GUN_ANIM:
372
-                            case TR4_SIXSHOOTER_ANIM:
373
-                                processMoveable(i, i, (int)moveable[i].object_id);
374
-                                break;
375
-                        }
376
-                        break;
377
-                    case TR_VERSION_2:
378
-                    case TR_VERSION_3:
379
-                    case TR_VERSION_5:
380
-                    case TR_VERSION_UNKNOWN:
381
-                        break;
382
-                }
383
-        }
384
-    }
385
-    */
386
-
387
-    getLog() << "Found " << mTombRaider.NumMoveables() + statCount << " moveables." << Log::endl;
388
-}
389
-
390
-// index moveable, i item, sometimes both moveable
391
-// object_id of item or moveable
392
-void Game::processMoveable(int index, int i, int object_id) {
393
-    // Check if the SkeletalModel is already cached
394
-    bool cached = false;
395
-    unsigned int model;
396
-    for (model = 0; model < getWorld().sizeSkeletalModel(); model++) {
397
-        if (getWorld().getSkeletalModel(model).getId() == object_id) {
398
-            cached = true;
399
-            break;
400
-        }
401
-    }
402
-
403
-    // Create a new SkeletalModel, if needed
404
-    if (!cached)
405
-        getWorld().addSkeletalModel(new SkeletalModel(mTombRaider, index, object_id));
406
-
407
-    // Create a new Entity, using the cached or the new SkeletalModel
408
-    Entity* entity = new Entity(mTombRaider, index, i, model);
409
-    getWorld().addEntity(entity);
410
-
411
-    // Store reference to Lara
412
-    if (entity->getObjectId() == 0)
413
-        mLara = getWorld().sizeEntity() - 1;
414
-
415
-    // Store reference to the SkyMesh
416
-    if (i == mTombRaider.getSkyModelId())
417
-        getRender().setSkyMesh(i, //moveable[i].starting_mesh,
418
-                               (mTombRaider.Engine() == TR_VERSION_2));
419
-}
420
-

+ 2
- 0
src/Menu.cpp View File

@@ -142,10 +142,12 @@ void Menu::displayDialog() {
142 142
         unsigned int xOverlay = (::getWindow().getWidth() - wOverlay) / 2;
143 143
         unsigned int yOverlay = (::getWindow().getHeight() - hOverlay) / 2;
144 144
 
145
+        /*
145 146
         glColor4f(0.0f, 0.0f, 0.0f, 0.75f);
146 147
         glDisable(GL_TEXTURE_2D);
147 148
         glRecti(xOverlay, yOverlay, xOverlay + wOverlay, yOverlay + hOverlay);
148 149
         glEnable(GL_TEXTURE_2D);
150
+        */
149 151
 
150 152
         Font::drawTextWrapped(xOverlay + 10, yOverlay + 5, 1.0f, BLUE, w0, dialogText);
151 153
         if (dialogButton2.length() > 0) {

+ 7
- 9
src/MenuFolder.cpp View File

@@ -9,6 +9,7 @@
9 9
 #include "Game.h"
10 10
 #include "loader/Loader.h"
11 11
 #include "Log.h"
12
+#include "Render.h"
12 13
 #include "RunTime.h"
13 14
 #include "MenuFolder.h"
14 15
 #include "system/Font.h"
@@ -76,19 +77,18 @@ void MenuFolder::display() {
76 77
     if (!visible)
77 78
         return;
78 79
 
79
-    ::getWindow().glEnter2D();
80
+    Font::drawTextCentered(0, 10, 1.2f, BLUE, ::getWindow().getWidth(), VERSION);
80 81
 
81 82
     // Draw half-transparent overlay
82
-    glColor4f(0.0f, 0.0f, 0.0f, 0.75f);
83
-    glDisable(GL_TEXTURE_2D);
84
-    glRecti(0, 0, (GLint)::getWindow().getWidth(), (GLint)::getWindow().getHeight());
85
-    glEnable(GL_TEXTURE_2D);
83
+    glm::vec4 color(0.0f, 0.0f, 0.0f, 0.75f);
84
+    Render::drawTexture(0.0f, 0.0f, getWindow().getWidth(), getWindow().getHeight(),
85
+                    color, TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
86 86
 
87 87
     // Draw heading
88
-    Font::drawTextCentered(0, 10, 1.2f, BLUE, ::getWindow().getWidth(), VERSION);
88
+    Font::drawTextCentered(0, 10, 1.2f, BLUE, getWindow().getWidth(), VERSION);
89 89
 
90 90
     // Estimate displayable number of items
91
-    int items = (::getWindow().getHeight() - 60) / 25;
91
+    int items = (getWindow().getHeight() - 60) / 25;
92 92
 
93 93
     // Print list of "..", folders, files
94 94
     for (long i = mMin; (i < (mMin + items))
@@ -105,8 +105,6 @@ void MenuFolder::display() {
105 105
     }
106 106
 
107 107
     displayDialog();
108
-
109
-    ::getWindow().glExit2D();
110 108
 }
111 109
 
112 110
 void MenuFolder::loadOrOpen() {

+ 94
- 54
src/Mesh.cpp View File

@@ -11,23 +11,25 @@
11 11
 #include "TextureManager.h"
12 12
 #include "Mesh.h"
13 13
 
14
-void Mesh::addTexturedRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d, uint16_t textile) {
14
+void Mesh::addTexturedRectangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 d,
15
+                                uint16_t textile) {
15 16
     texturedRectangles.emplace_back(a, b, c, d, textile);
16 17
 }
17 18
 
18
-void Mesh::addTexturedTriangle(Vec3 a, Vec3 b, Vec3 c, uint16_t textile) {
19
-    texturedTriangles.emplace_back(a, b, c, Vec3(), textile);
19
+void Mesh::addTexturedTriangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, uint16_t textile) {
20
+    texturedTriangles.emplace_back(a, b, c, glm::vec3(), textile);
20 21
 }
21 22
 
22
-void Mesh::addColoredRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d, float re, float gr, float bl) {
23
+void Mesh::addColoredRectangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 d, float re,
24
+                               float gr, float bl) {
23 25
     coloredRectangles.emplace_back(a, b, c, d, -1, re, gr, bl);
24 26
 }
25 27
 
26
-void Mesh::addColoredTriangle(Vec3 a, Vec3 b, Vec3 c, float re, float gr, float bl) {
27
-    coloredTriangles.emplace_back(a, b, c, Vec3(), -1, re, gr, bl);
28
+void Mesh::addColoredTriangle(glm::vec3 a, glm::vec3 b, glm::vec3 c, float re, float gr, float bl) {
29
+    coloredTriangles.emplace_back(a, b, c, glm::vec3(), -1, re, gr, bl);
28 30
 }
29 31
 
30
-void Mesh::addNormal(Vec3 n) {
32
+void Mesh::addNormal(glm::vec3 n) {
31 33
     normals.emplace_back(n);
32 34
 }
33 35
 
@@ -54,10 +56,10 @@ void Mesh::drawSolid() {
54 56
         return;
55 57
     }
56 58
 
57
-    // Render textured quads
58 59
     for (auto& q : texturedRectangles) {
59 60
         if (mMode == MeshModeWireframe) {
60 61
             getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
62
+            /*
61 63
             glBegin(GL_QUADS);
62 64
             glTexCoord2f(0.0f, 0.0f);
63 65
             glVertex3f(q.a.x, q.a.y, q.a.z);
@@ -68,8 +70,73 @@ void Mesh::drawSolid() {
68 70
             glTexCoord2f(0.0f, 1.0f);
69 71
             glVertex3f(q.d.x, q.d.y, q.d.z);
70 72
             glEnd();
73
+            */
74
+        } else if (mMode == MeshModeSolid) {
75
+            // TODO
71 76
         } else if (mMode == MeshModeTexture) {
72
-            getTextureManager().getTile(q.texture).displayRectangle(q.a, q.b, q.c, q.d);
77
+            //getTextureManager().getTile(q.texture).displayRectangle(q.a, q.b, q.c, q.d);
78
+        }
79
+    }
80
+
81
+    for (auto& t : texturedTriangles) {
82
+        if (mMode == MeshModeWireframe) {
83
+            getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
84
+            /*
85
+            glBegin(GL_TRIANGLES);
86
+            glTexCoord2f(0.0f, 0.0f);
87
+            glVertex3f(t.a.x, t.a.y, t.a.z);
88
+            glTexCoord2f(1.0f, 0.0f);
89
+            glVertex3f(t.b.x, t.b.y, t.b.z);
90
+            glTexCoord2f(1.0f, 1.0f);
91
+            glVertex3f(t.c.x, t.c.y, t.c.z);
92
+            glEnd();
93
+            */
94
+        } else if (mMode == MeshModeSolid) {
95
+            // TODO
96
+        } else if (mMode == MeshModeTexture) {
97
+            //getTextureManager().getTile(t.texture).displayTriangle(t.a, t.b, t.c);
98
+        }
99
+    }
100
+
101
+    for (auto& q : coloredRectangles) {
102
+        if (mMode == MeshModeWireframe) {
103
+            getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
104
+            /*
105
+            glBegin(GL_QUADS);
106
+            glTexCoord2f(0.0f, 0.0f);
107
+            glVertex3f(q.a.x, q.a.y, q.a.z);
108
+            glTexCoord2f(1.0f, 0.0f);
109
+            glVertex3f(q.b.x, q.b.y, q.b.z);
110
+            glTexCoord2f(1.0f, 1.0f);
111
+            glVertex3f(q.c.x, q.c.y, q.c.z);
112
+            glTexCoord2f(0.0f, 1.0f);
113
+            glVertex3f(q.d.x, q.d.y, q.d.z);
114
+            glEnd();
115
+            */
116
+        } else if (mMode == MeshModeSolid) {
117
+            // TODO
118
+        } else if (mMode == MeshModeTexture) {
119
+            // TODO
120
+        }
121
+    }
122
+
123
+    for (auto& t : coloredTriangles) {
124
+        if (mMode == MeshModeWireframe) {
125
+            getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
126
+            /*
127
+            glBegin(GL_TRIANGLES);
128
+            glTexCoord2f(0.0f, 0.0f);
129
+            glVertex3f(t.a.x, t.a.y, t.a.z);
130
+            glTexCoord2f(1.0f, 0.0f);
131
+            glVertex3f(t.b.x, t.b.y, t.b.z);
132
+            glTexCoord2f(1.0f, 1.0f);
133
+            glVertex3f(t.c.x, t.c.y, t.c.z);
134
+            glEnd();
135
+            */
136
+        } else if (mMode == MeshModeSolid) {
137
+            // TODO
138
+        } else if (mMode == MeshModeTexture) {
139
+            // TODO
73 140
         }
74 141
     }
75 142
 }
@@ -114,17 +181,17 @@ Mesh::~Mesh() {
114 181
     for (unsigned int i = 0; i < mNumVertices; i++)
115 182
         delete [] mVertices[i];
116 183
     delete [] mVertices;
117
-    mVertices = NULL;
184
+    mVertices = nullptr;
118 185
 
119 186
     for (unsigned int i = 0; i < mNumNormals; i++)
120 187
         delete [] mNormals[i];
121 188
     delete [] mNormals;
122
-    mNormals = NULL;
189
+    mNormals = nullptr;
123 190
 
124 191
     for (unsigned int i = 0; i < mNumColors; i++)
125 192
         delete [] mColors[i];
126 193
     delete [] mColors;
127
-    mColors = NULL;
194
+    mColors = nullptr;
128 195
 
129 196
     if (mTris) {
130 197
         for (unsigned int i = 0; i < mNumTris; ++i) {
@@ -135,7 +202,7 @@ Mesh::~Mesh() {
135 202
         }
136 203
 
137 204
         delete [] mTris;
138
-        mTris = NULL;
205
+        mTris = nullptr;
139 206
     }
140 207
 
141 208
     if (mQuads) {
@@ -147,29 +214,29 @@ Mesh::~Mesh() {
147 214
         }
148 215
 
149 216
         delete [] mQuads;
150
-        mQuads = NULL;
217
+        mQuads = nullptr;
151 218
     }
152 219
 
153 220
     delete [] mVertexArray;
154
-    mVertexArray = NULL;
221
+    mVertexArray = nullptr;
155 222
 
156 223
     delete [] mNormalArray;
157
-    mNormalArray = NULL;
224
+    mNormalArray = nullptr;
158 225
 
159 226
     delete [] mColorArray;
160
-    mColorArray = NULL;
227
+    mColorArray = nullptr;
161 228
 
162 229
     delete [] mTriangleTextures;
163
-    mTriangleTextures = NULL;
230
+    mTriangleTextures = nullptr;
164 231
 
165 232
     delete [] mTriangleIndices;
166
-    mTriangleIndices = NULL;
233
+    mTriangleIndices = nullptr;
167 234
 
168 235
     delete [] mTriangleFlags;
169
-    mTriangleFlags = NULL;
236
+    mTriangleFlags = nullptr;
170 237
 
171 238
     delete [] mTriangleTexCoordArray;
172
-    mTriangleTexCoordArray = NULL;
239
+    mTriangleTexCoordArray = nullptr;
173 240
 }
174 241
 
175 242
 
@@ -180,6 +247,7 @@ Mesh::~Mesh() {
180 247
 void Mesh::drawAlphaOld() {
181 248
     unsigned int i, j, k, index;
182 249
 
250
+    /*
183 251
 
184 252
     // Render quadralaterals
185 253
     for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i) {
@@ -246,46 +314,16 @@ void Mesh::drawAlphaOld() {
246 314
 
247 315
         glEnd();
248 316
     }
317
+
318
+    */
249 319
 }
250 320
 
251 321
 
252 322
 void Mesh::drawSolidOld() {
253 323
     unsigned int i, j, k, index;
254 324
 
325
+    /*
255 326
 
256
-    if (mFlags & fMesh_UseVertexArray) {
257
-        //glEnableClientState(GL_VERTEX_ARRAY);
258
-        //glVertexPointer(3, GL_FLOAT, 0, mVertexArray);
259
-
260
-        glPointSize(2.0f);
261
-        glColor3f(1.0f, 1.0f, 1.0f);
262
-        glBegin(GL_TRIANGLES);
263
-
264
-        for (i = 0; i < mTriangleCount * 3; ++i) {
265
-            //glArrayElement(mTriangleIndices[i]);
266
-            glVertex3fv(mVertexArray + mTriangleIndices[i]);
267
-        }
268
-
269
-        glEnd();
270
-
271
-        glPointSize(1.0f);
272
-
273
-        //! \fixme
274
-        /*
275
-        for (j = 0; j < mQuads[i].num_quads; ++j)
276
-        {
277
-            for (k = 0; k < 4; ++k)
278
-            {
279
-                index = mQuads[i].quads[j*4+k];
280
-
281
-                glTexCoord2fv(mQuads[i].texcoors[j*4+k]);
282
-                glArrayElement(mQuads[i].quads[j*4+k]);
283
-            }
284
-        }
285
-        */
286
-
287
-        return;
288
-    }
289 327
 
290 328
     // Render quadralaterals
291 329
     for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i) {
@@ -402,6 +440,8 @@ void Mesh::drawSolidOld() {
402 440
         glActiveTextureARB(GL_TEXTURE0_ARB);
403 441
     }
404 442
 #endif
443
+
444
+    */
405 445
 }
406 446
 
407 447
 

+ 63
- 511
src/Render.cpp View File

@@ -22,556 +22,108 @@
22 22
 #include "World.h"
23 23
 #include "system/Window.h"
24 24
 
25
-Render::Render() {
26
-    mSkyMesh = -1;
27
-    mSkyMeshRotation = false;
28
-    mMode = Render::modeDisabled;
29
-    mLock = 0;
30
-    mFlags = (fRoomAlpha | fEntityModels | fRenderPonytail);
25
+RenderMode Render::mode = RenderMode::Disabled;
31 26
 
32
-    debugTexture = -1;
33
-    debugTextile = -1;
34
-    debugSprite = -1;
35
-    debugTextureStorage = TextureManager::TextureStorage::GAME;
36
-    debugSpriteOffset = 0;
37
-    debugX = 0.0f;
38
-    debugY = 0.0f;
39
-    debugW = 256.0f;
40
-    debugH = 256.0f;
27
+RenderMode Render::getMode() {
28
+    return mode;
41 29
 }
42 30
 
43
-Render::~Render() {
44
-    ClearWorld();
45
-}
46
-
47
-void Render::ClearWorld() {
48
-    mRoomRenderList.clear();
49
-}
50
-
51
-void Render::screenShot(const char* filenameBase) {
52
-    int sz = getWindow().getWidth() * getWindow().getHeight();
53
-    unsigned char* image = new unsigned char[sz * 3];
54
-    static int count = 0;
55
-    bool done = false;
56
-
57
-    assert(filenameBase != nullptr);
58
-
59
-    // Don't overwrite files
60
-    std::ostringstream filename;
61
-    while (!done) {
62
-        filename << filenameBase << "-" << count++ << ".tga";
63
-
64
-        FILE* f = fopen(filename.str().c_str(), "rb");
65
-        if (f) {
66
-            fclose(f);
67
-        } else {
68
-            done = true;
69
-        }
70
-    }
71
-
72
-    glReadPixels(0, 0, getWindow().getWidth(), getWindow().getHeight(), GL_BGR_EXT, GL_UNSIGNED_BYTE,
73
-                 image);
74
-    tgaSave(filename.str().c_str(), image, getWindow().getWidth(), getWindow().getHeight(), 0);
75
-    delete [] image;
76
-}
77
-
78
-unsigned int Render::getFlags() {
79
-    return mFlags;
80
-}
81
-
82
-void Render::lightRoom(Room& room) {
83
-    for (unsigned int i = 0; i < room.sizeLights(); ++i) {
84
-        Light& light = room.getLight(i);
85
-        float pos[4], color[4];
86
-        float dir[3];
87
-        light.getPos(pos);
88
-        light.getColor(color);
89
-        light.getDir(dir);
90
-
91
-        glEnable(GL_LIGHT0 + i);
92
-
93
-        switch (light.getType()) {
94
-            case Light::typeSpot:
95
-                glLightf(GL_LIGHT0 + i,  GL_SPOT_CUTOFF,    light.getCutoff());
96
-                glLightfv(GL_LIGHT0 + i, GL_POSITION,       pos);
97
-                glLightfv(GL_LIGHT0 + i, GL_SPOT_DIRECTION, dir);
98
-                glLightfv(GL_LIGHT0 + i, GL_DIFFUSE,        color);
99
-                break;
100
-            case Light::typePoint:
101
-            case Light::typeDirectional:
102
-                glLightf(GL_LIGHT0 + i, GL_CONSTANT_ATTENUATION, 1.0); // 1.0
103
-
104
-                // GL_QUADRATIC_ATTENUATION
105
-                // GL_LINEAR_ATTENUATION
106
-                glLightf(GL_LIGHT0 + i, GL_LINEAR_ATTENUATION, light.getAtt());
107
-
108
-                glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, color); // GL_DIFFUSE
109
-                glLightfv(GL_LIGHT0 + i, GL_POSITION, pos);
110
-                break;
111
-        }
112
-    }
113
-}
114
-
115
-void Render::clearFlags(unsigned int flags) {
116
-    mFlags &= ~flags;
117
-
118
-    if (flags & Render::fFog) {
119
-        if (glIsEnabled(GL_FOG)) {
120
-            glDisable(GL_FOG);
121
-        }
122
-    }
123
-
124
-    if (flags & Render::fGL_Lights) {
125
-        glDisable(GL_LIGHTING);
126
-    }
127
-}
128
-
129
-void Render::setFlags(unsigned int flags) {
130
-    mFlags |= flags;
131
-
132
-    if (flags & Render::fFog) {
133
-        glEnable(GL_FOG);
134
-        glFogf(GL_FOG_MODE, GL_EXP2);
135
-        glFogf(GL_FOG_DENSITY, 0.00008f);
136
-        glFogf(GL_FOG_START, 30000.0f);
137
-        glFogf(GL_FOG_END, 50000.0f);
138
-
139
-        float color[4];
140
-        color[0] = BLACK[0] * 256.0f;
141
-        color[1] = BLACK[1] * 256.0f;
142
-        color[2] = BLACK[2] * 256.0f;
143
-        color[3] = BLACK[3] * 256.0f;
144
-        glFogfv(GL_FOG_COLOR, color);
145
-    }
146
-
147
-    if (flags & Render::fGL_Lights) {
148
-        float color[4];
149
-        color[0] = WHITE[0] * 256.0f;
150
-        color[1] = WHITE[1] * 256.0f;
151
-        color[2] = WHITE[2] * 256.0f;
152
-        color[3] = WHITE[3] * 256.0f;
153
-
154
-        glEnable(GL_LIGHTING);
155
-        glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
156
-        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
157
-        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
158
-
159
-        color[0] = GREY[0] * 256.0f;
160
-        color[1] = GREY[1] * 256.0f;
161
-        color[2] = GREY[2] * 256.0f;
162
-        color[3] = GREY[3] * 256.0f;
163
-        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, color);
164
-    }
165
-}
166
-
167
-int Render::getMode() {
168
-    return mMode;
169
-}
170
-
171
-void Render::setMode(int n) {
172
-    mMode = n;
173
-
174
-    switch (mMode) {
175
-        case Render::modeDisabled:
31
+void Render::setMode(RenderMode m) {
32
+    mode = m;
33
+    switch (mode) {
34
+        case RenderMode::Disabled:
176 35
             break;
177
-        case Render::modeSolid:
178
-        case Render::modeWireframe:
36
+        case RenderMode::Solid:
37
+        case RenderMode::Wireframe:
179 38
             glClearColor(PURPLE[0] / 256.0f, PURPLE[1] / 256.0f,
180 39
                          PURPLE[2] / 256.0f, PURPLE[3] / 256.0f);
181
-            glDisable(GL_TEXTURE_2D);
40
+            //glDisable(GL_TEXTURE_2D);
182 41
             break;
183 42
         default:
184
-            if (mMode == Render::modeLoadScreen) {
185
-                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
186
-            } else {
187
-                glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
188
-            }
189
-
190 43
             glClearColor(BLACK[0] / 256.0f, BLACK[1] / 256.0f,
191 44
                          BLACK[2] / 256.0f, BLACK[3] / 256.0f);
192
-
193
-            glEnable(GL_TEXTURE_2D);
45
+            //glEnable(GL_TEXTURE_2D);
194 46
     }
195 47
 }
196 48
 
197 49
 void Render::display() {
198
-    switch (mMode) {
199
-        case Render::modeDisabled:
200
-            return;
201
-        case Render::modeLoadScreen:
202
-            drawLoadScreen();
203
-            return;
204
-        default:
205
-            break;
206
-    }
207
-
208
-    if (mMode == Render::modeWireframe)
209
-        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
210
-    else
211
-        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
212
-
213
-    float camOffsetH = 0.0f;
214
-
215
-    switch (getGame().getLara().getMoveType()) {
216
-        case Entity::MoveTypeFly:
217
-        case Entity::MoveTypeNoClipping:
218
-        case Entity::MoveTypeSwim:
219
-            //camOffsetH = 64.0f;
220
-            camOffsetH = 512.0f;
221
-            break;
222
-        case Entity::MoveTypeWalk:
223
-        case Entity::MoveTypeWalkNoSwim:
224
-            camOffsetH = 512.0f;
225
-            break;
226
-    }
227
-
228
-    float curPos[3], camPos[3], atPos[3];
229
-
230
-    curPos[0] = getGame().getLara().getPos(0);
231
-    curPos[1] = getGame().getLara().getPos(1);
232
-    curPos[2] = getGame().getLara().getPos(2);
233
-    float yaw = getGame().getLara().getAngle(1);
234
-
235
-    // Mongoose 2002.08.24, New 3rd person camera hack
236
-    camPos[0] = curPos[0] - (1024.0f * sinf(yaw));
237
-    camPos[1] = curPos[1] - camOffsetH; // UP is lower val
238
-    camPos[2] = curPos[2] - (1024.0f * cosf(yaw));
239
-
240
-    long index = getGame().getLara().getRoom();
241
-    long sector = getWorld().getRoom(index).getSector(camPos[0], camPos[2]);
242
-
243
-    // Handle camera out of world
244
-    if ((sector < 0) ||
245
-        ((unsigned int)sector >= getWorld().getRoom(index).sizeSectors()) ||
246
-        getWorld().getRoom(index).isWall(sector)) {
247
-        camPos[0] = curPos[0] + (64.0f * sinf(yaw));
248
-        camPos[1] -= 64.0f;
249
-        camPos[2] = curPos[2] + (64.0f * cosf(yaw));
250
-    }
251
-
252 50
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
253
-    glLoadIdentity();
254
-
255
-    // Setup view in OpenGL with camera
256
-    getCamera().setPosition(camPos);
257
-    getCamera().update();
258
-    getCamera().getTarget(atPos);
259
-    // Mongoose 2002.08.13, Quick fix to render OpenRaider upside down
260
-    Window::lookAt(camPos[0], camPos[1], camPos[2], atPos[0], atPos[1], atPos[2], 0.0f, -1.0f, 0.0f);
261
-
262
-    // Update view volume for vising
263
-    updateViewVolume();
264
-
265
-    // Render world
266
-    glColor3ubv(GREY); // was WHITE
267
-    drawSkyMesh(96.0);
268
-
269
-    // Figure out how much of the map to render
270
-    newRoomRenderList(index);
271
-
272
-    // Room solid pass, need to do depth sorting to avoid 2 pass render
273
-    for (unsigned int i = 0; i < mRoomRenderList.size(); i++) {
274
-        Room& room = *mRoomRenderList[i];
275
-
276
-        if (mFlags & Render::fGL_Lights)
277
-            lightRoom(room);
278
-
279
-        room.display(false);
280
-    }
281
-
282
-    // Draw all visible enities
283
-    if (mFlags & Render::fEntityModels) {
284
-        std::vector<Entity*> entityRenderList;
285
-
286
-        for (unsigned int i = 0; i < getWorld().sizeEntity(); i++) {
287
-            Entity& e = getWorld().getEntity(i);
288
-
289
-            // Don't show Lara to the player
290
-            if (&e == &getGame().getLara())
291
-                continue;
292
-
293
-            // Mongoose 2002.08.15, Nothing to draw, skip
294
-            // Mongoose 2002.12.24, Some entities have no animation =p
295
-            if (e.getModel().size() == 0)
296
-                continue;
297 51
 
298
-            // Is it in view volume? ( Hack to use sphere )
299
-            if (!isVisible(e.getPos(0), e.getPos(1), e.getPos(2), 512.0f))
300
-                continue;
301
-
302
-            //! \fixme Is it in a room we're rendering?
303
-            //if (mRoomRenderList[e->room] == 0x0)
304
-            //{
305
-            //  continue;
306
-            //}
307
-
308
-            entityRenderList.push_back(&e);
309
-        }
310
-
311
-        // Draw objects not tied to rooms
312
-        glPushMatrix();
313
-
314
-        // Draw lara or other player model ( move to entity rendering method )
315
-        getGame().getLara().display();
316
-
317
-        // Draw sprites after player to handle alpha
318
-        for (unsigned int i = 0; i < getWorld().sizeSprite(); i++) {
319
-            SpriteSequence& sprite = getWorld().getSprite(i);
320
-            for (unsigned int j = 0; j < sprite.size(); j++)
321
-                sprite.get(j).display();
322
-        }
323
-
324
-        glPopMatrix();
325
-
326
-        // Depth sort entityRenderList and display each entity
327
-        std::sort(entityRenderList.begin(), entityRenderList.end(), Entity::compare);
328
-        for (unsigned int i = 0; i < entityRenderList.size(); i++) {
329
-            entityRenderList[i]->display();
330
-        }
331
-    }
332
-
333
-    // Room alpha pass
334
-    // Skip room alpha pass for modes w/o texture
335
-    if (!(mMode == Render::modeSolid || mMode == Render::modeWireframe)) {
336
-        for (unsigned int i = 0; i < mRoomRenderList.size(); i++)
337
-            mRoomRenderList[i]->display(true);
338
-
339
-        if (debugTexture >= 0) {
340
-            getWindow().glEnter2D();
341
-            drawTexture(debugX, debugY, debugW, debugH, debugTexture, debugTextureStorage);
342
-            getWindow().glExit2D();
343
-        } else if (debugTextile >= 0) {
344
-            getWindow().glEnter2D();
345
-            drawTextile(debugX, debugY, debugW, debugH, debugTextile);
346
-            getWindow().glExit2D();
347
-        } else if (debugSprite >= 0) {
348
-            getWindow().glEnter2D();
349
-            drawSprite(debugX, debugY, debugW, debugH, debugSprite, debugSpriteOffset);
350
-            getWindow().glExit2D();
351
-        }
52
+    if (mode == RenderMode::LoadScreen) {
53
+        glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f);
54
+        drawTexture(0.0f, 0.0f, getWindow().getWidth(), getWindow().getHeight(),
55
+                    color, TEXTURE_SPLASH, TextureManager::TextureStorage::SYSTEM);
56
+        return;
57
+    } else if (mode == RenderMode::Disabled) {
58
+        return;
352 59
     }
353 60
 
354
-    if (mMode == Render::modeWireframe)
61
+    if (mode == RenderMode::Wireframe) {
62
+        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
63
+    } else {
355 64
         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
356
-
357
-    glFlush();
358
-}
359
-
360
-void Render::drawLoadScreen() {
361
-    getWindow().glEnter2D();
362
-
363
-    drawTexture(0.0f, 0.0f, getWindow().getWidth(), getWindow().getHeight(),
364
-                TEXTURE_SPLASH, TextureManager::TextureStorage::SYSTEM);
365
-
366
-    if (debugTexture >= 0)
367
-        drawTexture(debugX, debugY, debugW, debugH, debugTexture, debugTextureStorage);
368
-    else if (debugTextile >= 0)
369
-        drawTextile(debugX, debugY, debugW, debugH, debugTextile);
370
-    else if (debugSprite >= 0)
371
-        drawSprite(debugX, debugY, debugW, debugH, debugSprite, debugSpriteOffset);
372
-
373
-    getWindow().glExit2D();
374
-
375
-    glFlush();
376
-}
377
-
378
-void Render::newRoomRenderList(int index) {
379
-    assert(index >= 0);
380
-
381
-    static int currentRoomId = -1;
382
-
383
-    // Update room render list if needed
384
-    if (currentRoomId != index) {
385
-        buildRoomRenderList(getWorld().getRoom(index));
386
-    }
387
-
388
-    currentRoomId = index;
389
-}
390
-
391
-void Render::buildRoomRenderList(Room& room) {
392
-
393
-    // Must be visible
394
-    //! \fixme Add depth sorting here - remove multipass
395
-    if (!isVisible(room.getBoundingBox()))
396
-        return;
397
-
398
-    // Must not already be cached
399
-    for (unsigned int i = 0; i < mRoomRenderList.size(); i++) {
400
-        Room* room2 = mRoomRenderList[i];
401
-
402
-        if (room2 == &room)
403
-            return;
404 65
     }
405 66
 
406
-    /* Add current room to list */
407
-    mRoomRenderList.push_back(&room);
67
+    // TODO Setup matrices
408 68
 
409
-    // Try to add adj rooms and their adj rooms, skip this room
410
-    for (unsigned int i = 1; i < room.sizeAdjacentRooms(); i++) {
411
-        if (room.getAdjacentRoom(i) < 0)
412
-            continue;
69
+    // TODO Render world
413 70
 
414
-        Room& room2 = getWorld().getRoom(room.getAdjacentRoom(i));
415
-
416
-        //! \fixme Add portal visibility check here
417
-
418
-        if (&room2 != &room)
419
-            buildRoomRenderList(room2);
71
+    if (mode == RenderMode::Wireframe) {
72
+        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
420 73
     }
421 74
 }
422 75
 
423
-void Render::drawSkyMesh(float scale) {
424
-    //skeletal_model_t *model = getWorld().getModel(mSkyMesh);
425
-    //if (!model)
426
-    //    return;
427
-
428
-    glDisable(GL_DEPTH_TEST);
429
-    glPushMatrix();
430
-
431
-    if (mSkyMeshRotation)
432
-        glRotated(90.0, 1, 0, 0);
433
-
434
-    glTranslated(0.0, 1000.0, 0.0);
435
-    glScaled(scale, scale, scale);
436
-    //drawModel(model);
437
-    //drawModelMesh(getWorld().getMesh(mSkyMesh), );
438
-    glPopMatrix();
439
-    glEnable(GL_DEPTH_TEST);
440
-}
441
-
442
-void Render::setSkyMesh(int index, bool rot) {
443
-    mSkyMesh = index;
444
-    mSkyMeshRotation = rot;
445
-}
446
-
447
-void Render::updateViewVolume() {
448
-    float proj[16], mdl[16];
449
-
450
-    glGetFloatv(GL_PROJECTION_MATRIX, proj);
451
-    glGetFloatv(GL_MODELVIEW_MATRIX, mdl);
452
-    mViewVolume.updateFrame(proj, mdl);
453
-}
454
-
455
-bool Render::isVisible(BoundingBox& box) {
456
-    float bbox[2][3];
457
-    box.getBoundingBox(bbox);
458
-
459
-    // For debugging purposes
460
-    if (mMode == Render::modeWireframe)
461
-        box.display(true, PINK, RED);
462
-
463
-    return mViewVolume.isBboxInFrustum(bbox[0], bbox[1]);
464
-}
76
+void Render::screenShot(const char* filenameBase) {
77
+    int sz = getWindow().getWidth() * getWindow().getHeight();
78
+    unsigned char* image = new unsigned char[sz * 3];
79
+    static int count = 0;
80
+    bool done = false;
465 81
 
466
-bool Render::isVisible(float x, float y, float z) {
467
-    // For debugging purposes
468
-    if (mMode == Render::modeWireframe) {
469
-        glPointSize(5.0);
470
-        glColor3ubv(PINK);
471
-        glBegin(GL_POINTS);
472
-        glVertex3f(x, y, z);
473
-        glEnd();
474
-    }
82
+    assert(filenameBase != nullptr);
475 83
 
476
-    return (mViewVolume.isPointInFrustum(x, y, z));
477
-}
84
+    // Don't overwrite files
85
+    std::ostringstream filename;
86
+    while (!done) {
87
+        filename << filenameBase << "-" << count++ << ".tga";
478 88
 
479
-bool Render::isVisible(float x, float y, float z, float radius) {
480
-    // For debugging purposes
481
-    if (mMode == Render::modeWireframe) {
482
-        glPointSize(5.0);
483
-        glColor3ubv(PINK);
484
-        glBegin(GL_POINTS);
485
-        glVertex3f(x, y, z);
486
-        glEnd();
89
+        FILE* f = fopen(filename.str().c_str(), "rb");
90
+        if (f) {
91
+            fclose(f);
92
+        } else {
93
+            done = true;
94
+        }
487 95
     }
488 96
 
489
-    return (mViewVolume.isSphereInFrustum(x, y, z, radius));
490
-}
491
-
492
-float Render::getDistToSphereFromNear(float x, float y, float z, float radius) {
493
-    return mViewVolume.getDistToSphereFromNear(x, y, z, radius);
494
-}
495
-
496
-void Render::debugDisplayTexture(int texture, TextureManager::TextureStorage s,
497
-                                 float x, float y, float w, float h) {
498
-    debugTexture = texture;
499
-    debugTextureStorage = s;
500
-    debugX = x;
501
-    debugY = y;
502
-    debugW = w;
503
-    debugH = h;
504
-    debugTextile = -1;
97
+    //glReadPixels(0, 0, getWindow().getWidth(), getWindow().getHeight(), GL_BGR_EXT, GL_UNSIGNED_BYTE,
98
+    //             image);
99
+    //tgaSave(filename.str().c_str(), image, getWindow().getWidth(), getWindow().getHeight(), 0);
100
+    delete [] image;
505 101
 }
506 102
 
507
-void Render::drawTexture(float x, float y, float w, float h,
103
+void Render::drawTexture(float x, float y, float w, float h, glm::vec4 color,
508 104
                          unsigned int texture, TextureManager::TextureStorage s) {
509
-    float z = 0.0f;
510
-
511
-    glColor3ubv(WHITE);
512
-
513
-    if (mFlags & Render::fGL_Lights)
514
-        glDisable(GL_LIGHTING);
105
+    std::vector<glm::vec2> vertices;
106
+    std::vector<glm::vec2> uvs;
515 107
 
516
-    getTextureManager().bindTextureId(texture, s);
108
+    vertices.push_back(glm::vec2(x, y + h));
109
+    vertices.push_back(glm::vec2(x, y));
110
+    vertices.push_back(glm::vec2(x + w, y + h));
517 111
 
518
-    glBegin(GL_TRIANGLE_STRIP);
519
-    glTexCoord2f(1.0, 1.0);
520
-    glVertex3f(x + w, y + h, z);
521
-    glTexCoord2f(0.0, 1.0);
522
-    glVertex3f(x, y + h, z);
523
-    glTexCoord2f(1.0, 0.0);
524
-    glVertex3f(x + w, y, z);
525
-    glTexCoord2f(0.0, 0.0);
526
-    glVertex3f(x, y, z);
527
-    glEnd();
528
-
529
-    if (mFlags & Render::fGL_Lights)
530
-        glEnable(GL_LIGHTING);
531
-}
532
-
533
-void Render::debugDisplayTextile(int texture, float x, float y, float w, float h) {
534
-    debugTextile = texture;
535
-    debugX = x;
536
-    debugY = y;
537
-    debugW = w;
538
-    debugH = h;
539
-    debugTexture = -1;
540
-}
541
-
542
-void Render::drawTextile(float x, float y, float w, float h, unsigned int textile) {
543
-    glColor3ubv(WHITE);
544
-
545
-    if (mFlags & Render::fGL_Lights)
546
-        glDisable(GL_LIGHTING);
547
-
548
-    getTextureManager().getTile(textile).display(x, y, w, h, 0.0f);
549
-
550
-    if (mFlags & Render::fGL_Lights)
551
-        glEnable(GL_LIGHTING);
552
-}
553
-
554
-void Render::debugDisplaySprite(int sprite, int offset, float x, float y, float w, float h) {
555
-    debugSprite = sprite;
556
-    debugSpriteOffset = offset;
557
-    debugX = x;
558
-    debugY = y;
559
-    debugW = w;
560
-    debugH = h;
561
-    debugTexture = -1;
562
-    debugTextile = -1;
563
-}
112
+    vertices.push_back(glm::vec2(x + w, y));
113
+    vertices.push_back(glm::vec2(x + w, y + h));
114
+    vertices.push_back(glm::vec2(x, y));
564 115
 
565
-void Render::drawSprite(float x, float y, float w, float h, unsigned int sprite,
566
-                        unsigned int offset) {
567
-    glColor3ubv(WHITE);
116
+    uvs.push_back(glm::vec2(0.0f, 1.0f));
117
+    uvs.push_back(glm::vec2(0.0f, 0.0f));
118
+    uvs.push_back(glm::vec2(1.0f, 1.0f));
568 119
 
569
-    if (mFlags & Render::fGL_Lights)
570
-        glDisable(GL_LIGHTING);
120
+    uvs.push_back(glm::vec2(1.0f, 0.0f));
121
+    uvs.push_back(glm::vec2(1.0f, 1.0f));
122
+    uvs.push_back(glm::vec2(0.0f, 0.0f));
571 123
 
572
-    getWorld().getSprite(sprite).get(offset).display(x, y, w, h);
124
+    //! \fixme drawTextGL only uses SYSTEM textures!
125
+    assert(s == TextureManager::TextureStorage::SYSTEM);
573 126
 
574
-    if (mFlags & Render::fGL_Lights)
575
-        glEnable(GL_LIGHTING);
127
+    Window::drawTextGL(vertices, uvs, color, texture);
576 128
 }
577 129
 

+ 25
- 388
src/Room.cpp View File

@@ -5,6 +5,8 @@
5 5
  * \author xythobuz
6 6
  */
7 7
 
8
+#include "glm/gtx/intersect.hpp"
9
+
8 10
 #include <algorithm>
9 11
 
10 12
 #include "global.h"
@@ -14,11 +16,6 @@
14 16
 #include "Room.h"
15 17
 #include "TextureManager.h"
16 18
 
17
-#ifdef MULTITEXTURE
18
-#include <map>
19
-extern std::map<int, int> gMapTex2Bump;
20
-#endif
21
-
22 19
 Room::Room(float p[3], unsigned int f, unsigned int x, unsigned int z)
23 20
     : flags(f), numXSectors(x), numZSectors(z) {
24 21
     if (p == nullptr) {
@@ -45,369 +42,6 @@ void Room::setPos(float p[3]) {
45 42
         pos[i] = p[i];
46 43
 }
47 44
 
48
-Room::Room(TombRaider& tr, unsigned int index) {
49
-    if (!tr.isRoomValid(index)) {
50
-        getLog() << "WARNING: Handling invalid vertex array in room" << Log::endl;
51
-        return;
52
-    }
53
-
54
-    flags = 0;
55
-    unsigned int trFlags = 0;
56
-    float box[2][3];
57
-    tr.getRoomInfo(index, &trFlags, pos, box[0], box[1]);
58
-
59
-    if (trFlags & tombraiderRoom_underWater)
60
-        flags |= RoomFlagUnderWater;
61
-
62
-    // Adjust positioning for OR world coordinate translation
63
-    box[0][0] += pos[0];
64
-    box[1][0] += pos[0];
65
-    box[0][2] += pos[2];
66
-    box[1][2] += pos[2];
67
-
68
-    bbox.setBoundingBox(box[0], box[1]);
69
-
70
-    // Mongoose 2002.04.03, Setup 3D transform
71
-    Matrix transform;
72
-    transform.setIdentity();
73
-    transform.translate(pos);
74
-
75
-    // Current room is always first
76
-    adjacentRooms.push_back(index);
77
-
78
-    // Setup portals
79
-    unsigned int count = tr.getRoomPortalCount(index);
80
-    for (unsigned int i = 0; i < count; i++) {
81
-        portals.push_back(new Portal(tr, index, i, transform));
82
-        adjacentRooms.push_back(portals.back()->getAdjoiningRoom());
83
-    }
84
-
85
-    // List of sectors in this room
86
-    count = tr.getRoomSectorCount(index, &numZSectors, &numXSectors);
87
-    for (unsigned int i = 0; i < count; i++)
88
-        sectors.push_back(new Sector(tr, index, i));
89
-
90
-    // Setup room lights
91
-    count = tr.getRoomLightCount(index);
92
-    for (unsigned int i = 0; i < count; i++)
93
-        lights.push_back(new Light(tr, index, i));
94
-
95
-    // Room models
96
-    count = tr.getRoomModelCount(index);
97
-    for (unsigned int i = 0; i < count; i++)
98
-        models.push_back(new StaticModel(tr, index, i));
99
-
100
-    // Room sprites
101
-    count = tr.getRoomSpriteCount(index);
102
-    for (unsigned int i = 0; i < count; i++)
103
-        sprites.push_back(new Sprite(tr, index, i));
104
-
105
-//#define EXPERIMENTAL_UNIFIED_ROOM_GEOMETERY
106
-#ifdef EXPERIMENTAL_UNIFIED_ROOM_GEOMETERY
107
-    unsigned int vertexCount, normalCount, colorCount, triCount;
108
-    float* vertexArray;
109
-    float* normalArray;
110
-    float* colorArray;
111
-    unsigned int* indices, *fflags;
112
-    float* texCoords;
113
-    int* textures;
114
-
115
-    tr.getRoomVertexArrays(index,
116
-                           &vertexCount, &vertexArray,
117
-                           &normalCount, &normalArray,
118
-                           &colorCount, &colorArray);
119
-
120
-    mesh.bufferVertexArray(vertexCount, vertexArray);
121
-    mesh.bufferNormalArray(normalCount, normalArray);
122
-    mesh.bufferColorArray(vertexCount, colorArray);
123
-
124
-    tr.getRoomTriangles(index, 0, &triCount, &indices, &texCoords, &textures, &fflags);
125
-
126
-    mesh.bufferTriangles(triCount, indices, texCoords, textures, fflags);
127
-#else
128
-    const unsigned int TextureLimit = 24;
129
-    float rgba[4];
130
-    float xyz[3];
131
-
132
-    count = tr.getRoomVertexCount(index);
133
-    mesh.allocateVertices(count);
134
-    mesh.allocateNormals(0); // count
135
-    mesh.allocateColors(count);
136
-
137
-    for (unsigned int i = 0; i < count; ++i) {
138
-        tr.getRoomVertex(index, i, xyz, rgba);
139
-
140
-        mesh.setVertex(i, xyz[0], xyz[1], xyz[2]);
141
-        mesh.setColor(i, rgba);
142
-    }
143
-
144
-    // Mongoose 2002.06.09, Setup allocation of meshes and polygons
145
-    // Counters ( Textured polygon lists are allocated per texture)
146
-    //          ( Textures are mapped to these meshes )
147
-    int triangle_counter[TextureLimit];
148
-    int triangle_counter_alpha[TextureLimit];
149
-    int rectangle_counter[TextureLimit];
150
-    int rectangle_counter_alpha[TextureLimit];
151
-    int tris_mesh_map[TextureLimit];
152
-    int rect_mesh_map[TextureLimit];
153
-
154
-    for (unsigned int i = 0; i < TextureLimit; ++i) {
155
-        triangle_counter[i]        = 0;
156
-        triangle_counter_alpha[i]  = 0;
157
-        rectangle_counter[i]       = 0;
158
-        rectangle_counter_alpha[i] = 0;
159
-
160
-        tris_mesh_map[i] = -1;
161
-        rect_mesh_map[i] = -1;
162
-    }
163
-
164
-    unsigned int numTris = 0;
165
-    unsigned int numQuads = 0;
166
-
167
-    int texture;
168
-    unsigned int r, t, q, v;
169
-    unsigned int indices[4];
170
-    float texCoords[8];
171
-
172
-    count = tr.getRoomTriangleCount(index);
173
-
174
-    // Mongoose 2002.08.15, Presort by alpha and texture and setup mapping
175
-    for (t = 0; t < count; ++t) {
176
-        tr.getRoomTriangle(index, t,
177
-                           indices, texCoords, &texture, &flags);
178
-
179
-        if (texture > (int)TextureLimit) {
180
-            getLog() << "Handling bad room[" << index << "].tris["
181
-                     << t << "].texture = " << texture << Log::endl;
182
-            texture = TextureLimit - 1;
183
-        }
184
-
185
-        // Counters set up polygon allocation
186
-        if (flags & tombraiderFace_Alpha ||
187
-            flags & tombraiderFace_PartialAlpha) {
188
-            triangle_counter_alpha[texture] += 1;
189
-        } else {
190
-            triangle_counter[texture] += 1;
191
-        }
192
-
193
-        // Counter sets up texture id to mesh id mapping
194
-        if (tris_mesh_map[texture] == -1) {
195
-            tris_mesh_map[texture] = ++numTris;
196
-        }
197
-    }
198
-
199
-    count = tr.getRoomRectangleCount(index);
200
-
201
-    for (r = 0; r < count; ++r) {
202
-        tr.getRoomRectangle(index, r,
203
-                            indices, texCoords, &texture, &flags);
204
-
205
-        if (texture > (int)TextureLimit) {
206
-            getLog() << "Handling bad room[" << index << "].quad["
207
-                     << r << "].texture = " << texture << Log::endl;
208
-            texture = TextureLimit - 1;
209
-        }
210
-
211
-        if (flags & tombraiderFace_Alpha ||
212
-            flags & tombraiderFace_PartialAlpha) {
213
-            rectangle_counter_alpha[texture] += 1;
214
-        } else {
215
-            rectangle_counter[texture] += 1;
216
-        }
217
-
218
-        if (rect_mesh_map[texture] == -1) {
219
-            rect_mesh_map[texture] = ++numQuads;
220
-        }
221
-    }
222
-
223
-    // Allocate indexed polygon meshes
224
-    mesh.allocateTriangles(numTris);
225
-    mesh.allocateRectangles(numQuads);
226
-
227
-    for (unsigned int i = 0, j = 0; i < TextureLimit; ++i) {
228
-        if (tris_mesh_map[i] > 0) {
229
-            j = tris_mesh_map[i] - 1;
230
-
231
-            t = triangle_counter[i];
232
-
233
-            mesh.mTris[j].texture = i;
234
-#ifdef MULTITEXTURE
235
-            mesh.mTris[j].bumpmap = gMapTex2Bump[i];
236
-#endif
237
-            mesh.mTris[j].cnum_triangles = 0;
238
-            mesh.mTris[j].num_triangles = 0;
239
-            mesh.mTris[j].cnum_alpha_triangles = 0;
240
-            mesh.mTris[j].num_alpha_triangles = 0;
241
-            mesh.mTris[j].triangles = 0x0;
242
-            mesh.mTris[j].alpha_triangles = 0x0;
243
-            mesh.mTris[j].texcoors = 0x0;
244
-            mesh.mTris[j].texcoors2 = 0x0;
245
-
246
-            if (t > 0) {
247
-                mesh.mTris[j].num_triangles = t;
248
-                mesh.mTris[j].triangles = new unsigned int[t * 3];
249
-                mesh.mTris[j].num_texcoors = t * 3;
250
-                mesh.mTris[j].texcoors = new float *[t * 3];
251
-                for (unsigned int tmp = 0; tmp < (t * 3); tmp++)
252
-                    mesh.mTris[j].texcoors[tmp] = new float[2];
253
-            }
254
-
255
-            t = triangle_counter_alpha[i];
256
-
257
-            if (t > 0) {
258
-                mesh.mTris[j].num_alpha_triangles = t;
259
-                mesh.mTris[j].alpha_triangles = new unsigned int[t * 3];
260
-                mesh.mTris[j].num_texcoors2 = t * 3;
261
-                mesh.mTris[j].texcoors2 = new float *[t * 3];
262
-                for (unsigned int tmp = 0; tmp < (t * 3); tmp++)
263
-                    mesh.mTris[j].texcoors2[tmp] = new float[2];
264
-            }
265
-        }
266
-
267
-        ///////////////////////////////////////////
268
-
269
-        if (rect_mesh_map[i] > 0) {
270
-            j = rect_mesh_map[i] - 1;
271
-
272
-            r = rectangle_counter[i];
273
-
274
-            mesh.mQuads[j].texture = i;
275
-#ifdef MULTITEXTURE
276
-            mesh.mQuads[j].bumpmap = gMapTex2Bump[i];
277
-#endif
278
-            mesh.mQuads[j].cnum_quads = 0;
279
-            mesh.mQuads[j].num_quads = 0;
280
-            mesh.mQuads[j].cnum_alpha_quads = 0;
281
-            mesh.mQuads[j].num_alpha_quads = 0;
282
-            mesh.mQuads[j].quads = 0x0;
283
-            mesh.mQuads[j].alpha_quads = 0x0;
284
-            mesh.mQuads[j].texcoors = 0x0;
285
-            mesh.mQuads[j].texcoors2 = 0x0;
286
-
287
-            if (r > 0) {
288
-                mesh.mQuads[j].num_quads = r;
289
-                mesh.mQuads[j].quads = new unsigned int[r * 4];
290
-                mesh.mQuads[j].num_texcoors = r * 4;
291
-                mesh.mQuads[j].texcoors = new float *[r * 4];
292
-                for (unsigned int tmp = 0; tmp < (r * 4); tmp++)
293
-                    mesh.mQuads[j].texcoors[tmp] = new float[2];
294
-            }
295
-
296
-            r = rectangle_counter_alpha[i];
297
-
298
-            if (r > 0) {
299
-                mesh.mQuads[j].num_alpha_quads = r;
300
-                mesh.mQuads[j].alpha_quads = new unsigned int[r * 4];
301
-                mesh.mQuads[j].num_texcoors2 = r * 4;
302
-                mesh.mQuads[j].texcoors2 = new float *[r * 4];
303
-                for (unsigned int tmp = 0; tmp < (r * 4); tmp++)
304
-                    mesh.mQuads[j].texcoors2[tmp] = new float[2];
305
-            }
306
-        }
307
-    }
308
-
309
-    // Generate textured triangles
310
-    count = tr.getRoomTriangleCount(index);
311
-
312
-    for (t = 0; t < count; ++t) {
313
-        tr.getRoomTriangle(index, t,
314
-                           indices, texCoords, &texture, &flags);
315
-
316
-        unsigned int j = tris_mesh_map[texture] - 1;
317
-
318
-        // Setup per vertex
319
-        for (unsigned int i = 0; i < 3; ++i) {
320
-            // Get vertex index {(0, a), (1, b), (2, c)}
321
-            v = indices[i];
322
-
323
-            if ((flags & tombraiderFace_Alpha ||
324
-                 flags & tombraiderFace_PartialAlpha) &&
325
-                mesh.mTris[j].num_alpha_triangles > 0) {
326
-                q = mesh.mTris[j].cnum_alpha_triangles * 3 + i;
327
-
328
-                mesh.mTris[j].alpha_triangles[q] = v;
329
-
330
-                mesh.mTris[j].texcoors2[q][0] = texCoords[i * 2];
331
-                mesh.mTris[j].texcoors2[q][1] = texCoords[i * 2 + 1];
332
-            } else if (mesh.mTris[j].num_triangles > 0) {
333
-                q = mesh.mTris[j].cnum_triangles * 3 + i;
334
-
335
-                mesh.mTris[j].triangles[q] = v;
336
-
337
-                mesh.mTris[j].texcoors[q][0] = texCoords[i * 2];
338
-                mesh.mTris[j].texcoors[q][1] = texCoords[i * 2 + 1];
339
-            }
340
-
341
-            // Partial alpha hack
342
-            if (flags & tombraiderFace_PartialAlpha) {
343
-                //mesh.colors[v].rgba[3] = 0.45;
344
-            }
345
-        }
346
-
347
-        if (flags & tombraiderFace_Alpha ||
348
-            flags & tombraiderFace_PartialAlpha) {
349
-            mesh.mTris[j].cnum_alpha_triangles++;
350
-        } else {
351
-            mesh.mTris[j].cnum_triangles++;
352
-        }
353
-    }
354
-
355
-    // Generate textured quads
356
-    count = tr.getRoomRectangleCount(index);
357
-
358
-    for (r = 0; r < count; ++r) {
359
-        tr.getRoomRectangle(index, r,
360
-                            indices, texCoords, &texture, &flags);
361
-
362
-        if (texture > (int)TextureLimit) {
363
-            texture = TextureLimit - 1;
364
-        }
365
-
366
-        unsigned int j = rect_mesh_map[texture] - 1;
367
-
368
-        if (mesh.mQuads[j].num_quads <= 0 &&
369
-            mesh.mQuads[j].num_alpha_quads <= 0)
370
-            continue;
371
-
372
-        // Setup per vertex
373
-        for (unsigned int i = 0; i < 4; ++i) {
374
-            // Get vertex index {(0, a), (1, b), (2, c), (3, d)}
375
-            v = indices[i];
376
-
377
-            if ((flags & tombraiderFace_Alpha ||
378
-                 flags & tombraiderFace_PartialAlpha) &&
379
-                mesh.mQuads[j].num_alpha_quads > 0) {
380
-                q = mesh.mQuads[j].cnum_alpha_quads * 4 + i;
381
-
382
-                mesh.mQuads[j].alpha_quads[q] = v;
383
-
384
-                mesh.mQuads[j].texcoors2[q][0] = texCoords[i * 2];
385
-                mesh.mQuads[j].texcoors2[q][1] = texCoords[i * 2 + 1];
386
-            } else if (mesh.mQuads[j].num_quads > 0) {
387
-                q = mesh.mQuads[j].cnum_quads * 4 + i;
388
-
389
-                mesh.mQuads[j].quads[q] = v;
390
-
391
-                mesh.mQuads[j].texcoors[q][0] = texCoords[i * 2];
392
-                mesh.mQuads[j].texcoors[q][1] = texCoords[i * 2 + 1];
393
-            }
394
-
395
-            // Partial alpha hack
396
-            if (flags & tombraiderFace_PartialAlpha) {
397
-                //rRoom->mesh.colors[v].rgba[3] = 0.45;
398
-            }
399
-        }
400
-
401
-        if (flags & tombraiderFace_Alpha ||
402
-            flags & tombraiderFace_PartialAlpha) {
403
-            mesh.mQuads[j].cnum_alpha_quads++;
404
-        } else {
405
-            mesh.mQuads[j].cnum_quads++;
406
-        }
407
-    }
408
-#endif
409
-}
410
-
411 45
 #define EMPTY_VECTOR(x)     \
412 46
 while (!x.empty()) {        \
413 47
     delete x[x.size() - 1]; \
@@ -423,12 +57,13 @@ Room::~Room() {
423 57
 }
424 58
 
425 59
 void Room::display(bool alpha) {
60
+    /*
426 61
     glPushMatrix();
427 62
     //LightingSetup();
428 63
 
429 64
     getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
430 65
 
431
-    if ((!alpha) && getRender().getMode() == Render::modeWireframe) {
66
+    if ((!alpha) && Render::getMode() == RenderMode::Wireframe) {
432 67
         glLineWidth(2.0);
433 68
         glColor3ubv(RED);
434 69
 
@@ -448,7 +83,7 @@ void Room::display(bool alpha) {
448 83
         glLineWidth(1.0);
449 84
     }
450 85
 
451
-    if (getRender().getMode() == Render::modeWireframe && (!alpha)) {
86
+    if (Render::getMode() == RenderMode::Wireframe && (!alpha)) {
452 87
         bbox.display(true, RED, GREEN);
453 88
     }
454 89
 
@@ -457,11 +92,11 @@ void Room::display(bool alpha) {
457 92
     // Reset since GL_MODULATE used, reset to WHITE
458 93
     glColor3ubv(WHITE);
459 94
 
460
-    switch (getRender().getMode()) {
461
-        case Render::modeWireframe:
95
+    switch (Render::getMode()) {
96
+        case RenderMode::Wireframe:
462 97
             mesh.mMode = Mesh::MeshModeWireframe;
463 98
             break;
464
-        case Render::modeSolid:
99
+        case RenderMode::Solid:
465 100
             mesh.mMode = Mesh::MeshModeSolid;
466 101
             break;
467 102
         default:
@@ -477,15 +112,16 @@ void Room::display(bool alpha) {
477 112
     glPopMatrix();
478 113
 
479 114
     // Draw other room meshes and sprites
480
-    if (alpha || (getRender().getMode() == Render::modeWireframe)
481
-        || (getRender().getMode() == Render::modeSolid)) {
482
-        sortModels();
115
+    if (alpha || (Render::getMode() == RenderMode::Wireframe)
116
+        || (Render::getMode() == RenderMode::Solid)) {
117
+        //sortModels(); // TODO
483 118
         for (unsigned int i = 0; i < sizeModels(); i++)
484 119
             getModel(i).display();
485 120
 
486 121
         for (unsigned int i = 0; i < sizeSprites(); i++)
487 122
             getSprite(i).display();
488 123
     }
124
+    */
489 125
 }
490 126
 
491 127
 bool Room::isWall(unsigned long sector) {
@@ -496,8 +132,8 @@ bool Room::isWall(unsigned long sector) {
496 132
 }
497 133
 
498 134
 long Room::getSector(float x, float z, float* floor, float* ceiling) {
499
-    assert(floor != NULL);
500
-    assert(ceiling != NULL);
135
+    assert(floor != nullptr);
136
+    assert(ceiling != nullptr);
501 137
 
502 138
     long sector = getSector(x, z);
503 139
 
@@ -527,16 +163,21 @@ void Room::getHeightAtPosition(float x, float* y, float z) {
527 163
 
528 164
 int Room::getAdjoiningRoom(float x, float y, float z,
529 165
                            float x2, float y2, float z2) {
530
-    float intersect[3], p1[3], p2[3];
531 166
     float vertices[4][3];
532
-
533
-    p1[0] = x;  p1[1] = y;  p1[2] = z;
534
-    p2[0] = x2; p2[1] = y2; p2[2] = z2;
167
+    glm::vec3 orig(x, y, z);
168
+    glm::vec3 dir(x2 - x, y2 - y, z2 - z);
169
+    glm::vec3 intersect;
170
+    glm::vec3 verts[4];
535 171
 
536 172
     for (unsigned long i = 0; i < portals.size(); i++) {
537 173
         portals.at(i)->getVertices(vertices);
538
-        if (intersectionLinePolygon(intersect, p1, p2, //4,
539
-                                    vertices))
174
+        verts[0] = glm::vec3(vertices[0][0], vertices[0][1], vertices[0][2]);
175
+        verts[1] = glm::vec3(vertices[1][0], vertices[1][1], vertices[1][2]);
176
+        verts[2] = glm::vec3(vertices[2][0], vertices[2][1], vertices[2][2]);
177
+        verts[3] = glm::vec3(vertices[3][0], vertices[3][1], vertices[3][2]);
178
+
179
+        if ((glm::intersectLineTriangle(orig, dir, verts[0], verts[1], verts[2], intersect))
180
+            || (glm::intersectLineTriangle(orig, dir, verts[0], verts[3], verts[1], intersect)))
540 181
             return portals.at(i)->getAdjoiningRoom();
541 182
     }
542 183
 
@@ -616,10 +257,6 @@ void Room::addModel(StaticModel* s) {
616 257
     models.push_back(s);
617 258
 }
618 259
 
619
-void Room::sortModels() {
620
-    std::sort(models.begin(), models.end(), StaticModel::compare);
621
-}
622
-
623 260
 unsigned long Room::sizeLights() {
624 261
     return lights.size();
625 262
 }

+ 7
- 66
src/RoomData.cpp View File

@@ -6,7 +6,6 @@
6 6
  */
7 7
 
8 8
 #include "global.h"
9
-#include "Render.h"
10 9
 #include "SkeletalModel.h"
11 10
 #include "World.h"
12 11
 #include "RoomData.h"
@@ -44,6 +43,7 @@ bool BoundingBox::inBoxPlane(float x, float z) {
44 43
 }
45 44
 
46 45
 void BoundingBox::display(bool points, const unsigned char c1[4], const unsigned char c2[4]) {
46
+    /*
47 47
     // Bind before entering now
48 48
     //glBindTexture(GL_TEXTURE_2D, 1);
49 49
     glPointSize(4.0);
@@ -114,31 +114,11 @@ void BoundingBox::display(bool points, const unsigned char c1[4], const unsigned
114 114
 
115 115
     glPointSize(1.0);
116 116
     //glLineWidth(1.0);
117
+    */
117 118
 }
118 119
 
119 120
 // ----------------------------------------------------------------------------
120 121
 
121
-Light::Light(TombRaider& tr, unsigned int room, unsigned int index) {
122
-    unsigned int lightFlags, lightType;
123
-
124
-    tr.getRoomLight(room, index, pos, color,
125
-                    dir, &att, &cutoff, &lightType, &lightFlags);
126
-
127
-    switch (lightType) {
128
-        case tombraiderLight_typeDirectional:
129
-            type = Light::typeDirectional;
130
-            break;
131
-        case tombraiderLight_typeSpot:
132
-            type = Light::typeSpot;
133
-            break;
134
-        case tombraiderLight_typePoint:
135
-        default:
136
-            type = Light::typePoint;
137
-    }
138
-
139
-    //! \todo Light flags?
140
-}
141
-
142 122
 void Light::getPos(float p[4]) {
143 123
     p[0] = pos[0];
144 124
     p[1] = pos[1];
@@ -173,52 +153,24 @@ Light::LightType Light::getType() {
173 153
 
174 154
 // ----------------------------------------------------------------------------
175 155
 
176
-StaticModel::StaticModel(TombRaider& tr, unsigned int room, unsigned int i) {
177
-    tr.getRoomModel(room, i, &index, pos, &yaw);
178
-}
179
-
180 156
 void StaticModel::display() {
181 157
     StaticMesh& mesh = getWorld().getStaticMesh(index);
182 158
 
183
-    if (!getRender().isVisible(pos[0], pos[1], pos[2], mesh.getRadius()))
184
-        return;
159
+    //if (!getRender().isVisible(pos[0], pos[1], pos[2], mesh.getRadius()))
160
+    //    return;
185 161
 
162
+    /*
186 163
     glPushMatrix();
187 164
     glTranslated(pos[0], pos[1], pos[2]);
188 165
     glRotated(yaw, 0, 1, 0);
189 166
     mesh.display();
190 167
     glPopMatrix();
191
-}
192
-
193
-bool StaticModel::operator<(const StaticModel& other) {
194
-    float distA, distB;
195
-    distA = getRender().getDistToSphereFromNear(pos[0],
196
-            pos[1], pos[2], 128.0f);
197
-    distB = getRender().getDistToSphereFromNear(other.pos[0],
198
-            other.pos[1], other.pos[2], 128.0f);
199
-    return (distA < distB);
200
-}
201
-
202
-bool StaticModel::compare(StaticModel* a, StaticModel* b) {
203
-    return (*b) < (*a);
168
+    */
204 169
 }
205 170
 
206 171
 // ----------------------------------------------------------------------------
207 172
 
208
-Portal::Portal(TombRaider& tr, unsigned int room, unsigned int index, Matrix& transform) {
209
-    float portalVertices[12];
210
-    tr.getRoomPortal(room, index, &adjoiningRoom, normal, portalVertices);
211
-    for (unsigned int j = 0; j < 4; ++j) {
212
-        vertices[j][0] = portalVertices[j * 3];
213
-        vertices[j][1] = portalVertices[j * 3 + 1];
214
-        vertices[j][2] = portalVertices[j * 3 + 2];
215
-
216
-        // Relative coors in vis portals
217
-        transform.multiply3v(vertices[j], vertices[j]);
218
-    }
219
-}
220
-
221
-Portal::Portal(float vert[4][3], float norm[3], int adj) {
173
+Portal::Portal(glm::vec3 vert[4], float norm[3], int adj) {
222 174
     for (unsigned int i = 0; i < 4; i++) {
223 175
         for (unsigned int j = 0; j < 3; j++) {
224 176
             vertices[i][j] = vert[i][j];
@@ -246,17 +198,6 @@ int Portal::getAdjoiningRoom() {
246 198
 
247 199
 // ----------------------------------------------------------------------------
248 200
 
249
-Sector::Sector(TombRaider& tr, unsigned int room, unsigned int index) {
250
-    unsigned int sectorFlags;
251
-    int floorDataIndex, boxIndex, roomBelow, roomAbove;
252
-
253
-    tr.getRoomSector(room, index, &sectorFlags,
254
-                     &ceiling, &floor, &floorDataIndex, &boxIndex,
255
-                     &roomBelow, &roomAbove);
256
-
257
-    wall = (sectorFlags & tombraiderSector_wall);
258
-}
259
-
260 201
 float Sector::getFloor() {
261 202
     return floor;
262 203
 }

+ 2
- 254
src/SkeletalModel.cpp View File

@@ -8,7 +8,6 @@
8 8
 
9 9
 #include "global.h"
10 10
 #include "Log.h"
11
-#include "Render.h"
12 11
 #include "SkeletalModel.h"
13 12
 #include "World.h"
14 13
 
@@ -21,43 +20,6 @@ BoneTag::BoneTag(int m, float o[3], float r[3], char f) {
21 20
     }
22 21
 }
23 22
 
24
-BoneTag::BoneTag(TombRaider& tr, unsigned int index, unsigned int i, unsigned int* l,
25
-                 unsigned int frame_offset) {
26
-    tr2_moveable_t* moveable = tr.Moveable();
27
-    tr2_meshtree_t* meshtree = tr.MeshTree();
28
-    unsigned short* frame = tr.Frame();
29
-
30
-    off[0] = 0.0f;
31
-    off[1] = 0.0f;
32
-    off[2] = 0.0f;
33
-    flag = 0x00;
34
-    rot[0] = 0.0f;
35
-    rot[1] = 0.0f;
36
-    rot[2] = 0.0f;
37
-    mesh = moveable[index].starting_mesh + i;
38
-
39
-    // Setup offsets to produce skeleton
40
-    if (i == 0) {
41
-        // Always push tag[0], this isn't really used either
42
-        flag = 0x02;
43
-    } else { // Nonprimary tag - position relative to first tag
44
-
45
-        // Hack: moveable[index].mesh_tree is a byte offset
46
-        //       into mesh_tree[], so we have to convert to index
47
-        int* tree = (int*)(void*)meshtree;
48
-        tr2_meshtree_t* mesh_tree = (tr2_meshtree_t*)(tree
49
-                                    + moveable[index].mesh_tree + ((i - 1) * 4));
50
-
51
-        off[0] = mesh_tree->x;
52
-        off[1] = mesh_tree->y;
53
-        off[2] = mesh_tree->z;
54
-        flag = (char)mesh_tree->flags;
55
-    }
56
-
57
-    // Setup tag rotations
58
-    tr.computeRotationAngles(&frame, &frame_offset, l, rot, rot + 1, rot + 2);
59
-}
60
-
61 23
 void BoneTag::display() {
62 24
     if (getWorld().sizeMesh() > 0)
63 25
         getWorld().getMesh(mesh).drawSolid(); // TODO ?
@@ -88,20 +50,6 @@ BoneFrame::BoneFrame(float p[3]) {
88 50
         pos[i] = p[i];
89 51
 }
90 52
 
91
-BoneFrame::BoneFrame(TombRaider& tr, unsigned int index, unsigned int frame_offset) {
92
-    tr2_moveable_t* moveable = tr.Moveable();
93
-    unsigned short* frame = tr.Frame();
94
-
95
-    pos[0] = (short)frame[frame_offset + 6];
96
-    pos[1] = (short)frame[frame_offset + 7];
97
-    pos[2] = (short)frame[frame_offset + 8];
98
-
99
-    unsigned int l = 9; // First angle offset in this Frame
100
-
101
-    for (unsigned int i = 0; i < moveable[index].num_meshes; i++)
102
-        tag.push_back(new BoneTag(tr, index, i, &l, frame_offset));
103
-}
104
-
105 53
 BoneFrame::~BoneFrame() {
106 54
     for (unsigned long i = 0; i < tag.size(); i++)
107 55
         delete tag[i];
@@ -132,52 +80,6 @@ AnimationFrame::AnimationFrame(char r) {
132 80
     rate = r;
133 81
 }
134 82
 
135
-AnimationFrame::AnimationFrame(TombRaider& tr, unsigned int index, int a,
136
-                               unsigned int* frame_offset, int frame_step) {
137
-    tr2_moveable_t* moveable = tr.Moveable();
138
-    tr2_animation_t* animation = tr.Animation();
139
-
140
-    unsigned int frame_count = (animation[a].frame_end - animation[a].frame_start) + 1;
141
-    rate = animation[a].frame_rate;
142
-
143
-    for (unsigned int f = 0; f < frame_count; f++, *frame_offset += frame_step) {
144
-        // HACK: Lara's ObjectID is 315, but her meshes start at 0, so make a
145
-        // quick substitution (so she doesn't appear as a bunch of thighs)
146
-        if ((index == 0) && (tr.Engine() == TR_VERSION_3)) {
147
-            for (int j = 0; (j < (int)tr.NumMoveables()) && (index == 0); j++) {
148
-                if (moveable[j].object_id == 315)
149
-                    index = j;
150
-            }
151
-        }
152
-
153
-        // Fix Lara in TR4
154
-        // Body is ItemID 8, joints are ItemID 9
155
-        // (TR4 demo: body is ItemID 10, joints are ItemID 11)
156
-        if ((index == 0) && (tr.Engine() == TR_VERSION_4)) {
157
-            for (int j = 0; (j < (int)tr.NumMoveables()) && (index == 0); j++) {
158
-                if (moveable[j].object_id == 8)
159
-                    index = j;
160
-            }
161
-        } else if ((moveable[index].object_id == 8) && (tr.Engine() == TR_VERSION_4)) {
162
-            // KLUDGE to do "skinning"
163
-            index = 0;
164
-            for (int j = 0; (j < (int)tr.NumMoveables()) && (index == 0); j++) {
165
-                if (moveable[j].object_id == 9)
166
-                    index = j;
167
-            }
168
-        }
169
-
170
-        if (*frame_offset > tr.NumFrames()) {
171
-            getLog() << "WARNING: Bad animation frame " << *frame_offset
172
-                     << " > " << tr.NumFrames() << " (" << index << "." << a << ")"
173
-                     << Log::endl;
174
-            return;
175
-        }
176
-
177
-        frame.push_back(new BoneFrame(tr, index, *frame_offset));
178
-    }
179
-}
180
-
181 83
 AnimationFrame::~AnimationFrame() {
182 84
     for (unsigned long i = 0; i < frame.size(); i++)
183 85
         delete frame[i];
@@ -202,113 +104,13 @@ SkeletalModel::SkeletalModel(int i) {
202 104
     id = i;
203 105
 }
204 106
 
205
-SkeletalModel::SkeletalModel(TombRaider& tr, unsigned int index, int objectId) {
206
-    tr2_moveable_t* moveable = tr.Moveable();
207
-    tr2_animation_t* anim = tr.Animation();
208
-    tr2_mesh_t* mesh = tr.Mesh();
209
-
210
-    id = objectId;
211
-
212
-    // Gather more info if this is lara
213
-    if (id == 0) {
214
-        // Only TR4 lara has 2 layer bone tags/meshes per bone frame
215
-        tr4Overlay = (tr.Engine() == TR_VERSION_4);
216
-        ponytailId = 0;
217
-    } else {
218
-        tr4Overlay = false;
219
-        ponytailId = -1;
220
-    }
221
-
222
-    switch (tr.Engine()) {
223
-        case TR_VERSION_4:
224
-            if (moveable[index].object_id == 30) {
225
-                ponytailId = getWorld().sizeSkeletalModel(); //! \fixme Why is this even needed?
226
-                ponytailMeshId = moveable[index].starting_mesh;
227
-                ponytailNumMeshes = ((moveable[index].num_meshes > 0) ?
228
-                                     moveable[index].num_meshes : 0);
229
-                ponytailAngle = -90.0f;
230
-                ponytail[0] = -3;
231
-                ponytail[1] = -22;
232
-                ponytail[2] = -20;
233
-                ponyOff = 40;
234
-                ponyOff2 = 32;
235
-                pigtails = false;
236
-
237
-                // Try to guess pigtails by looking for certian num verts in head
238
-                if (mesh[moveable[0].starting_mesh].num_vertices > 80) {
239
-                    pigtails = true;
240
-                    ponyOff -= 20;
241
-                    ponytail[1] -= 32;
242
-                }
243
-
244
-                getRender().setFlags(Render::fRenderPonytail);
245
-                getLog() << "Found known ponytail" << Log::endl;
246
-            }
247
-            break;
248
-
249
-        case TR_VERSION_1:
250
-        case TR_VERSION_2:
251
-        case TR_VERSION_3:
252
-        case TR_VERSION_5:
253
-        case TR_VERSION_UNKNOWN:
254
-            if (moveable[index].object_id == 2) {
255
-                ponytailId = getWorld().sizeSkeletalModel(); //! \fixme Why is this even needed?
256
-                ponytailMeshId = moveable[index].starting_mesh;
257
-                ponytailNumMeshes = ((moveable[index].num_meshes > 0) ?
258
-                                     moveable[index].num_meshes : 0);
259
-                ponytailAngle = -90.0f;
260
-                ponytail[0] = 0;
261
-                ponytail[1] = -20;
262
-                ponytail[2] = -20;
263
-                ponyOff = 40;
264
-                ponyOff2 = 0;
265
-
266
-                getRender().setFlags(Render::fRenderPonytail);
267
-                getLog() << "Found ponytail?" << Log::endl;
268
-            }
269
-            break;
270
-    }
271
-
272
-    // Animations
273
-    int a = moveable[index].animation;
274
-    unsigned int frame_offset = anim[a].frame_offset / 2;
275
-    int frame_step = anim[a].frame_size;
276
-
277
-    int frame_cycle = 0;
278
-
279
-    if (a >= (int)tr.NumAnimations())
280
-        a = tr.NumFrames() - frame_offset; //! \fixme Couldn't a be already used out of range?!
281
-    else
282
-        a = (anim[a].frame_offset / 2) - frame_offset; //! \fixme Same as a = 0; ??
283
-
284
-    if (frame_step != 0) // prevent divide-by-zero errors
285
-        a /= frame_step;
286
-
287
-    if (a != 0)
288
-        frame_offset += frame_step * (frame_cycle % a);
289
-
290
-    if (a < 0) {
291
-        getLog() << "Invalid animation data for model " << index << ". Skip!" << Log::endl;
292
-        return;
293
-    } else {
294
-        for (; a < tr.getNumAnimsForMoveable(index); a++) {
295
-            animation.push_back(new AnimationFrame(tr, index, a, &frame_offset, frame_step));
296
-
297
-            if (frame_offset > tr.NumFrames())
298
-                return;
299
-
300
-            frame_offset = anim[a].frame_offset / 2;
301
-            frame_step = anim[a].frame_size;
302
-        }
303
-    }
304
-}
305
-
306 107
 SkeletalModel::~SkeletalModel() {
307 108
     for (unsigned long i = 0; i < animation.size(); i++)
308 109
         delete animation[i];
309 110
 }
310 111
 
311 112
 void SkeletalModel::display(unsigned long aframe, unsigned long bframe) {
113
+    /*
312 114
     assert(aframe < size());
313 115
     assert(bframe < get(aframe).size());
314 116
 
@@ -343,63 +145,9 @@ void SkeletalModel::display(unsigned long aframe, unsigned long bframe) {
343 145
             glRotatef(rot[2], 0, 0, 1);
344 146
         }
345 147
 
346
-        // Draw layered lara in TR4 (2 meshes per tag)
347
-        if (tr4Overlay) {
348
-            BoneFrame& boneframe2 = get(0).get(0); //! \fixme Woot?
349
-            if (a < boneframe2.size())
350
-                boneframe2.get(a).display();
351
-        }
352
-
353
-        if (getRender().getFlags() & Render::fRenderPonytail) {
354
-            if ((ponytailId > 0) && (a == 14)) {
355
-                glPushMatrix();
356
-
357
-                // Mongoose 2002.08.30, TEST to align offset
358
-                glTranslatef(ponytail[0], ponytail[1], ponytail[2]);
359
-                glRotatef(ponytailAngle, 1, 0, 0);
360
-
361
-                // HACK: To fill TR4 void between ponytail/head
362
-                //   since no vertex welds are implemented yet
363
-                if (tr4Overlay)
364
-                    glScalef(1.20f, 1.20f, 1.20f);
365
-
366
-#ifdef EXPERIMENTAL_NON_ITEM_RENDER
367
-                getWorld().getSkeletalModel(ponytail).display(0, 0);
368
-#else
369
-                for (unsigned int i = 0; i < ponytailNumMeshes; i++) {
370
-                    glPushMatrix();
371
-
372
-                    if (i > 0) {
373
-                        glRotatef(randomNum(-8.0f, -10.0f), 1, 0, 0);
374
-                        glRotatef(randomNum(-5.0f, 5.0f), 0, 1, 0);
375
-                        glRotatef(randomNum(-5.0f, 5.0f), 0, 0, 1);
376
-                        glTranslatef(0.0, 0.0, ponyOff);
377
-                    }
378
-
379
-                    if (pigtails) {
380
-                        glPushMatrix();
381
-                        glTranslatef(ponyOff2, 0.0, 0.0);
382
-                        getWorld().getStaticMesh(ponytailMeshId + i).display();
383
-                        glPopMatrix();
384
-
385
-                        glPushMatrix();
386
-                        glTranslatef(-ponyOff2, 0.0, 0.0);
387
-                        getWorld().getStaticMesh(ponytailMeshId + i).display();
388
-                        glPopMatrix();
389
-                    } else {
390
-                        getWorld().getStaticMesh(ponytailMeshId + i).display();
391
-                    }
392
-                }
393
-
394
-                for (unsigned int i = 0; i < ponytailNumMeshes; i++)
395
-                    glPopMatrix();
396
-#endif
397
-                glPopMatrix();
398
-            }
399
-        }
400
-
401 148
         tag.display();
402 149
     }
150
+    */
403 151
 }
404 152
 
405 153
 int SkeletalModel::getId() {

+ 14
- 47
src/Sprite.cpp View File

@@ -5,6 +5,8 @@
5 5
  * \author xythobuz
6 6
  */
7 7
 
8
+#include "glm/glm.hpp"
9
+
8 10
 #include "global.h"
9 11
 #include "Camera.h"
10 12
 #include "Game.h"
@@ -20,33 +22,13 @@ void SpriteSequence::add(Sprite s) {
20 22
     sprites.push_back(s);
21 23
 }
22 24
 
23
-// -----------------------
24
-
25
-SpriteSequence::SpriteSequence(TombRaider& tr, unsigned int item, unsigned int sequence) {
26
-    for (int i = 0; i < (-tr.SpriteSequence()[sequence].negative_length); i++)
27
-        oldsprites.push_back(new Sprite(tr, item, sequence, i));
28
-}
29
-
30
-SpriteSequence::~SpriteSequence() {
31
-    for (unsigned int i = 0; i < oldsprites.size(); i++)
32
-        delete oldsprites.at(i);
33
-}
34
-
35 25
 unsigned long SpriteSequence::size() {
36
-    if (oldsprites.size() > 0)
37
-        return oldsprites.size();
38
-    else
39
-        return sprites.size();
26
+    return sprites.size();
40 27
 }
41 28
 
42 29
 Sprite& SpriteSequence::get(unsigned long index) {
43
-    if (oldsprites.size() > 0) {
44
-        assert(index < oldsprites.size());
45
-        return *oldsprites.at(index);
46
-    } else {
47
-        assert(index < sprites.size());
48
-        return sprites.at(index);
49
-    }
30
+    assert(index < sprites.size());
31
+    return sprites.at(index);
50 32
 }
51 33
 
52 34
 // ----------------------------------------------------------------------------
@@ -98,39 +80,21 @@ Sprite::Sprite(uint16_t tile, uint8_t x, uint8_t y, uint16_t width, uint16_t hei
98 80
     //radius = width2 / 2.0f;
99 81
 }
100 82
 
101
-// -----------------------
102
-
103
-Sprite::Sprite(TombRaider& tr, unsigned int room, unsigned int index) {
104
-    float spriteVertices[12];
105
-    float spriteTexCoords[8];
106
-    float posUnused[3];
107
-
108
-    tr.getRoomSprite(room, index,
109
-                     10.0f, &texture, posUnused, spriteVertices, spriteTexCoords);
110
-
111
-    for (unsigned int j = 0; j < 12; j++)
112
-        vertex[j / 3][j % 3] = spriteVertices[j];
113
-
114
-    for (unsigned int j = 0; j < 8; j++)
115
-        texel[j / 2][j % 2] = spriteTexCoords[j];
116
-
117
-    //radius = 0.0f;
118
-}
119
-
120 83
 void Sprite::display() {
121
-    //if (!getRender().isVisible(pos[0], pos[1], pos[2], radius))
84
+    /*
85
+    //if (!Render::isVisible(pos[0], pos[1], pos[2], radius))
122 86
     //    return;
123 87
 
124 88
     glPushMatrix();
125 89
     //glTranslated(pos[0], pos[1], pos[2]);
126 90
 
127 91
     // Sprites must always face camera, because they have no depth =)
128
-    glRotated(OR_RAD_TO_DEG(getCamera().getRadianYaw()), 0, 1, 0);
92
+    glRotated(glm::degrees(Camera::getRadianYaw()), 0, 1, 0);
129 93
 
130
-    switch (getRender().getMode()) {
94
+    switch (Render::getMode()) {
131 95
         // No vertex lighting on sprites, as far as I see in specs
132 96
         // So just draw normal texture, no case 2
133
-        case Render::modeSolid:
97
+        case RenderMode::Solid:
134 98
             glBegin(GL_TRIANGLE_STRIP);
135 99
             glColor3f(texel[0][0], texel[0][1], 0.5);
136 100
             glVertex3fv(vertex[0]);
@@ -145,7 +109,7 @@ void Sprite::display() {
145 109
             glVertex3fv(vertex[2]);
146 110
             glEnd();
147 111
             break;
148
-        case Render::modeWireframe:
112
+        case RenderMode::Wireframe:
149 113
             glColor3ubv(CYAN);
150 114
             glBegin(GL_LINE_LOOP);
151 115
             glVertex3fv(vertex[0]);
@@ -171,9 +135,11 @@ void Sprite::display() {
171 135
     }
172 136
 
173 137
     glPopMatrix();
138
+    */
174 139
 }
175 140
 
176 141
 void Sprite::display(float x, float y, float w, float h) {
142
+    /*
177 143
     float z = 0.0f;
178 144
 
179 145
     getTextureManager().bindTextureId(texture);
@@ -193,5 +159,6 @@ void Sprite::display(float x, float y, float w, float h) {
193 159
     glVertex3f(x, y + h, z);
194 160
 
195 161
     glEnd();
162
+    */
196 163
 }
197 164
 

+ 14
- 141
src/StaticMesh.cpp View File

@@ -28,19 +28,20 @@ TexturedTriangle::TexturedTriangle(int i[3], float s[6], int tex, unsigned short
28 28
 }
29 29
 
30 30
 void TexturedTriangle::display(float* vertices, float* colors, float* normals) {
31
-    assert(vertices != NULL);
31
+    /*
32
+    assert(vertices != nullptr);
32 33
 
33
-    if ((getRender().getMode() != Render::modeWireframe)
34
-        && (getRender().getMode() != Render::modeSolid)) {
34
+    if ((Render::getMode() != RenderMode::Wireframe)
35
+        && (Render::getMode() != RenderMode::Solid)) {
35 36
         getTextureManager().bindTextureId(texture);
36 37
     }
37 38
 
38 39
     glBegin(GL_TRIANGLES);
39 40
 
40
-    switch (getRender().getMode()) {
41
-        case Render::modeSolid:
42
-        case Render::modeVertexLight:
43
-            if (colors != NULL) {
41
+    switch (Render::getMode()) {
42
+        case RenderMode::Solid:
43
+            //case RenderMode::VertexLight:
44
+            if (colors != nullptr) {
44 45
                 glColor3fv(colors + index[0]);
45 46
                 glTexCoord2fv(st);
46 47
                 glVertex3fv(vertices + (index[0] * 3));
@@ -52,7 +53,7 @@ void TexturedTriangle::display(float* vertices, float* colors, float* normals) {
52 53
                 glColor3fv(colors + index[2]);
53 54
                 glTexCoord2fv(st + 4);
54 55
                 glVertex3fv(vertices + (index[2] * 3));
55
-            } else if (normals != NULL) {
56
+            } else if (normals != nullptr) {
56 57
                 glNormal3fv(normals + (index[0] * 3));
57 58
                 glTexCoord2fv(st);
58 59
                 glVertex3fv(vertices + (index[0] * 3));
@@ -74,7 +75,7 @@ void TexturedTriangle::display(float* vertices, float* colors, float* normals) {
74 75
             }
75 76
             break;
76 77
 
77
-        case Render::modeWireframe:
78
+        case RenderMode::Wireframe:
78 79
             glVertex3fv(vertices + (index[0] * 3));
79 80
             glVertex3fv(vertices + (index[1] * 3));
80 81
             glVertex3fv(vertices + (index[2] * 3));
@@ -90,6 +91,7 @@ void TexturedTriangle::display(float* vertices, float* colors, float* normals) {
90 91
     }
91 92
 
92 93
     glEnd();
94
+    */
93 95
 }
94 96
 
95 97
 // ----------------------------------------------------------------------------
@@ -98,137 +100,6 @@ StaticMesh::StaticMesh(int i, int m) : id(i), mesh(m) {
98 100
     vertices = colors = normals = nullptr;
99 101
 }
100 102
 
101
-#ifdef EXPERIMENTAL
102
-
103
-#include <map>
104
-std::map<unsigned int, unsigned int> gColorTextureHACK;
105
-
106
-int setupTextureColor(float* colorf) {
107
-    unsigned char color[4];
108
-    unsigned int colorI;
109
-    unsigned int texture;
110
-
111
-    color[0] = (unsigned char)(colorf[0] * 255.0f);
112
-    color[1] = (unsigned char)(colorf[1] * 255.0f);
113
-    color[2] = (unsigned char)(colorf[2] * 255.0f);
114
-    color[3] = (unsigned char)(colorf[3] * 255.0f);
115
-
116
-    ((unsigned char*)(&colorI))[3] = color[0];
117
-    ((unsigned char*)(&colorI))[2] = color[1];
118
-    ((unsigned char*)(&colorI))[1] = color[2];
119
-    ((unsigned char*)(&colorI))[0] = color[3];
120
-
121
-    try {
122
-        texture = gColorTextureHACK.at(colorI);
123
-    } catch (...) {
124
-        unsigned char* image = generateColorTexture(color, 32, 32, 32);
125
-        texture = getTextureManager().loadBufferSlot(image, 32, 32, RGBA, 32);
126
-        delete [] image;
127
-    }
128
-
129
-    return texture;
130
-}
131
-
132
-#endif
133
-
134
-StaticMesh::StaticMesh(TombRaider& tr, unsigned int index) {
135
-    int count, texture;
136
-    int vertexIndices[6];
137
-    float st[12];
138
-    float color[4];
139
-    unsigned short transparency;
140
-
141
-    if (!tr.isMeshValid(index)) {
142
-        dontshow = true;
143
-        return;
144
-    } else {
145
-        dontshow = false;
146
-    }
147
-
148
-    // Mongoose 2002.08.30, Testing support for 'shootable' models ( traceable )
149
-    tr.getMeshCollisionInfo(index, center, &radius);
150
-
151
-    //! \fixme Arrays don't work either  =)
152
-    // Mesh geometery, colors, etc
153
-    tr.getMeshVertexArrays(index,
154
-                           &vertexCount, &vertices,
155
-                           &normalCount, &normals,
156
-                           &colorCount,  &colors);
157
-
158
-    // Textured Triangles
159
-    count = tr.getMeshTexturedTriangleCount(index);
160
-    for (int i = 0; i < count; i++) {
161
-        tr.getMeshTexturedTriangle(index, i,
162
-                                   vertexIndices, st,
163
-                                   &texture, &transparency);
164
-        triangles.push_back(
165
-            new TexturedTriangle(vertexIndices, st, texture, transparency));
166
-    }
167
-
168
-    // Coloured Triangles
169
-    count = tr.getMeshColoredTriangleCount(index);
170
-    for (int i = 0; i < count; i++) {
171
-        tr.getMeshColoredTriangle(index, i,
172
-                                  vertexIndices, color);
173
-        st[0] = color[0];
174
-        st[1] = color[1];
175
-        st[2] = color[2];
176
-        st[3] = color[3];
177
-        st[4] = 1.0;
178
-        st[5] = 1.0;
179
-
180
-#ifdef EXPERIMENTAL
181
-        texture = setupTextureColor(color);
182
-#else
183
-        texture = 0; // White texture
184
-#endif
185
-        transparency = 0;
186
-
187
-        triangles.push_back(
188
-            new TexturedTriangle(vertexIndices, st, texture, transparency));
189
-    }
190
-
191
-    // Textured Rectangles
192
-    count = tr.getMeshTexturedRectangleCount(index);
193
-    for (int i = 0; i < count; i++) {
194
-        tr.getMeshTexturedRectangle(index, i,
195
-                                    vertexIndices, st,
196
-                                    &texture, &transparency);
197
-        triangles.push_back(
198
-            new TexturedTriangle(vertexIndices, st, texture, transparency));
199
-        triangles.push_back(
200
-            new TexturedTriangle(vertexIndices + 3, st + 6, texture, transparency));
201
-    }
202
-
203
-    // Coloured Rectangles
204
-    count = tr.getMeshColoredRectangleCount(index);
205
-    for (int i = 0; i < count; i++) {
206
-        tr.getMeshColoredRectangle(index, i,
207
-                                   vertexIndices, color);
208
-
209
-        st[0] = color[0];
210
-        st[1] = color[1];
211
-        st[2] = color[2];
212
-        st[3] = color[3];
213
-        st[4] = 1.0;
214
-        st[5] = 1.0;
215
-
216
-#ifdef EXPERIMENTAL
217
-        texture = setupTextureColor(color);
218
-#else
219
-        texture = 0; // White texture
220
-#endif
221
-        transparency = 0;
222
-
223
-        triangles.push_back(
224
-            new TexturedTriangle(vertexIndices, st, texture, transparency));
225
-        triangles.push_back(
226
-            new TexturedTriangle(vertexIndices + 3, st, texture, transparency));
227
-    }
228
-
229
-    id = mesh = -1;
230
-}
231
-
232 103
 StaticMesh::~StaticMesh() {
233 104
     while (!triangles.empty()) {
234 105
         delete triangles.back();
@@ -241,6 +112,7 @@ StaticMesh::~StaticMesh() {
241 112
 }
242 113
 
243 114
 void StaticMesh::display() {
115
+    /*
244 116
     if ((id != -1) && (mesh != -1)) {
245 117
         getWorld().getMesh(mesh).drawSolid();
246 118
         return;
@@ -254,7 +126,7 @@ void StaticMesh::display() {
254 126
         //! \fixme 'AMBIENT' -- Mongoose 2002.01.08
255 127
         glColor3ubv(WHITE);
256 128
 
257
-        if (getRender().getMode() == Render::modeWireframe)
129
+        if (Render::getMode() == RenderMode::Wireframe)
258 130
             glColor3ubv(WHITE);
259 131
 
260 132
         getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
@@ -262,6 +134,7 @@ void StaticMesh::display() {
262 134
         for (unsigned int i = 0; i < triangles.size(); i++)
263 135
             triangles.at(i)->display(vertices, colors, normals);
264 136
     }
137
+    */
265 138
 }
266 139
 
267 140
 float StaticMesh::getRadius() {

+ 45
- 81
src/TextureManager.cpp View File

@@ -40,21 +40,7 @@ void TextureTile::add(TextureTileVertex* t) {
40 40
     vertices.push_back(t);
41 41
 }
42 42
 
43
-bool TextureTile::isTriangle() {
44
-    assert(vertices.size() >= 3);
45
-
46
-    if (vertices.size() == 3)
47
-        return true;
48
-
49
-    return ((vertices.at(3)->xPixel == 0)
50
-            && (vertices.at(3)->xCoordinate == 0)
51
-            && (vertices.at(3)->yPixel == 0)
52
-            && (vertices.at(3)->yCoordinate == 0));
53
-}
54
-
55
-void TextureTile::display(float x, float y, float w, float h, float z) {
56
-    getTextureManager().bindTextureId(texture);
57
-
43
+void TextureTile::displayRectangle(float a[3], float b[3], float c[3], float d[3]) {
58 44
     //! \fixme TR Rosetta Stone says this, but looks strange?
59 45
     /*
60 46
     if (attribute == 0) {
@@ -63,23 +49,6 @@ void TextureTile::display(float x, float y, float w, float h, float z) {
63 49
     }
64 50
     */
65 51
 
66
-    if (isTriangle())
67
-        displayTriangle(x, y, w, h, z);
68
-    else
69
-        displayRectangle(x, y, w, h, z);
70
-
71
-    /*
72
-    if (attribute == 0) {
73
-        glEnable(GL_BLEND);
74
-    }
75
-    */
76
-}
77
-
78
-void TextureTile::displayRectangle(float x, float y, float w, float h, float z) {
79
-    displayRectangle(Vec3(x, y, z), Vec3(x + w, y, z), Vec3(x + w, y + h, z), Vec3(x, y + h, z));
80
-}
81
-
82
-void TextureTile::displayRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d) {
83 52
     float xmin = 256.0f, xmax = 0.0f;
84 53
     float ymin = 256.0f, ymax = 0.0f;
85 54
     for (int i = 0; i < 4; i++) {
@@ -98,6 +67,7 @@ void TextureTile::displayRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d) {
98 67
         }
99 68
     }
100 69
 
70
+    /*
101 71
     glBegin(GL_QUADS);
102 72
     glTexCoord2f(xmin / 256.0f, ymin / 256.0f);
103 73
     glVertex3f(a.x, a.y, a.z);
@@ -108,24 +78,11 @@ void TextureTile::displayRectangle(Vec3 a, Vec3 b, Vec3 c, Vec3 d) {
108 78
     glTexCoord2f(xmin / 256.0f, ymax / 256.0f);
109 79
     glVertex3f(d.x, d.y, d.z);
110 80
     glEnd();
81
+    */
111 82
 }
112 83
 
113
-void TextureTile::displayTriangle(float x, float y, float w, float h, float z) {
114
-    displayTriangle(Vec3(x, y, z), Vec3(x + w, y, z), Vec3(x + w, y + h, z));
115
-}
84
+void TextureTile::displayTriangle(float a[3], float b[3], float c[3]) {
116 85
 
117
-void TextureTile::displayTriangle(Vec3 a, Vec3 b, Vec3 c) {
118
-    glBegin(GL_TRIANGLE_STRIP);
119
-    glTexCoord2f(vertices.at(0)->xPixel / 256.0f,
120
-                 vertices.at(0)->yPixel / 256.0f);
121
-    glVertex3f(a.x, a.y, a.z);
122
-    glTexCoord2f(vertices.at(1)->xPixel / 256.0f,
123
-                 vertices.at(1)->yPixel / 256.0f);
124
-    glVertex3f(b.x, b.y, b.z);
125
-    glTexCoord2f(vertices.at(2)->xPixel / 256.0f,
126
-                 vertices.at(2)->yPixel / 256.0f);
127
-    glVertex3f(c.x, c.y, c.z);
128
-    glEnd();
129 86
 }
130 87
 
131 88
 // ----------------------------------------------------------------------------
@@ -209,8 +166,21 @@ std::vector<unsigned int>& TextureManager::getIds(TextureStorage s) {
209 166
 }
210 167
 
211 168
 int TextureManager::initialize() {
169
+    assert(mTextureIdsGame.size() == 0);
170
+    assert(mTextureIdsSystem.size() == 0);
171
+
172
+    while (mTextureIdsSystem.size() < 2) {
173
+        unsigned int id;
174
+        glGenTextures(1, &id);
175
+        mTextureIdsSystem.push_back(id);
176
+    }
177
+
178
+    return 0;
179
+}
180
+
181
+int TextureManager::initializeSplash() {
212 182
     unsigned char* image = generateColorTexture(WHITE, 32, 32, 32);
213
-    int res = loadBufferSlot(image, 32, 32, RGBA, 32, TextureStorage::SYSTEM, TEXTURE_WHITE);
183
+    int res = loadBufferSlot(image, 32, 32, ColorMode::RGBA, 32, TextureStorage::SYSTEM, TEXTURE_WHITE, false);
214 184
     delete [] image;
215 185
     if (res < 0) {
216 186
         return -1;
@@ -232,12 +202,13 @@ int TextureManager::loadBufferSlot(unsigned char* image,
232 202
                                    unsigned int width, unsigned int height,
233 203
                                    ColorMode mode, unsigned int bpp,
234 204
                                    TextureStorage s, int slot, bool filter) {
235
-    assert(image != NULL);
236 205
     assert(width > 0);
237 206
     assert(height > 0);
238
-    assert((mode == GREYSCALE) || (mode == RGB)
239
-           || (mode == BGR) || (mode == ARGB)
240
-           || (mode == RGBA) || (mode ==  BGRA));
207
+    assert((mode == ColorMode::RGB)
208
+           || (mode == ColorMode::BGR)
209
+           || (mode == ColorMode::ARGB)
210
+           || (mode == ColorMode::RGBA)
211
+           || (mode ==  ColorMode::BGRA));
241 212
     assert((bpp == 8) || (bpp == 24) || (bpp == 32));
242 213
 
243 214
     if (slot == -1)
@@ -249,55 +220,49 @@ int TextureManager::loadBufferSlot(unsigned char* image,
249 220
         getIds(s).push_back(id);
250 221
     }
251 222
 
223
+    if (image == nullptr)
224
+        return slot;
225
+
252 226
     unsigned int glcMode;
253 227
     switch (mode) {
254
-        case GREYSCALE:
255
-            glcMode = GL_LUMINANCE;
228
+        case ColorMode::BGR:
229
+            glcMode = GL_BGR;
256 230
             break;
257 231
 
258
-        case BGR:
259
-            bgr2rgb24(image, width, height);
232
+        case ColorMode::RGB:
260 233
             glcMode = GL_RGB;
261 234
             break;
262 235
 
263
-        case RGB:
264
-            glcMode = GL_RGB;
265
-            break;
266
-
267
-        case ARGB:
236
+        case ColorMode::ARGB:
268 237
             argb2rgba32(image, width, height);
269 238
             glcMode = GL_RGBA;
270 239
             break;
271 240
 
272
-        case BGRA:
273
-            bgra2rgba32(image, width, height);
274
-            glcMode = GL_RGBA;
241
+        case ColorMode::BGRA:
242
+            glcMode = GL_BGRA;
275 243
             break;
276 244
 
277
-        case RGBA:
245
+        case ColorMode::RGBA:
278 246
             glcMode = GL_RGBA;
279 247
             break;
280 248
     }
281 249
 
282
-    glColor3ubv(WHITE);
283
-    glEnable(GL_DEPTH_TEST);
284
-    glShadeModel(GL_SMOOTH);
285 250
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
286 251
     glBindTexture(GL_TEXTURE_2D, getIds(s).at(slot));
252
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, glcMode, GL_UNSIGNED_BYTE, image);
287 253
 
288 254
     if (filter) {
289
-        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
290
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
291
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
255
+        // Trilinear filtering
292 256
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
293 257
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
258
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
259
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
260
+        glGenerateMipmap(GL_TEXTURE_2D);
294 261
     } else {
295 262
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
296 263
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
297 264
     }
298 265
 
299
-    glTexImage2D(GL_TEXTURE_2D, 0, bpp / 8, width, height, 0, glcMode, GL_UNSIGNED_BYTE, image);
300
-
301 266
     return slot;
302 267
 }
303 268
 
@@ -305,12 +270,11 @@ int TextureManager::numTextures(TextureStorage s) {
305 270
     return getIds(s).size();
306 271
 }
307 272
 
308
-void TextureManager::bindTextureId(unsigned int n, TextureStorage s) {
273
+void TextureManager::bindTextureId(unsigned int n, TextureStorage s, unsigned int unit) {
309 274
     assert(n < getIds(s).size());
275
+    assert(unit < 80); //! \todo Query GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
310 276
 
311
-    glEnable(GL_TEXTURE_2D);
312
-    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
313
-
277
+    glActiveTexture(GL_TEXTURE0 + unit);
314 278
     glBindTexture(GL_TEXTURE_2D, getIds(s).at(n));
315 279
 }
316 280
 
@@ -329,7 +293,7 @@ int TextureManager::loadImage(const char* filename, TextureStorage s, int slot)
329 293
 }
330 294
 
331 295
 int TextureManager::loadPCX(const char* filename, TextureStorage s, int slot) {
332
-    assert(filename != NULL);
296
+    assert(filename != nullptr);
333 297
     assert(filename[0] != '\0');
334 298
 
335 299
     unsigned char* image;
@@ -353,7 +317,7 @@ int TextureManager::loadPCX(const char* filename, TextureStorage s, int slot) {
353 317
 
354 318
 int TextureManager::loadPNG(const char* filename, TextureStorage s, int slot) {
355 319
 #ifdef USING_PNG
356
-    assert(filename != NULL);
320
+    assert(filename != nullptr);
357 321
     assert(filename[0] != '\0');
358 322
 
359 323
     if (pngCheck(filename) != 0) {
@@ -384,7 +348,7 @@ int TextureManager::loadPNG(const char* filename, TextureStorage s, int slot) {
384 348
 }
385 349
 
386 350
 int TextureManager::loadTGA(const char* filename, TextureStorage s, int slot) {
387
-    assert(filename != NULL);
351
+    assert(filename != nullptr);
388 352
     assert(filename[0] != '\0');
389 353
 
390 354
     unsigned char* image;
@@ -402,7 +366,7 @@ int TextureManager::loadTGA(const char* filename, TextureStorage s, int slot) {
402 366
         }
403 367
         if (image) {
404 368
             id = loadBufferSlot(image, w, h,
405
-                                (type == 2) ? RGBA : RGB,
369
+                                (type == 2) ? ColorMode::RGBA : ColorMode::RGB,
406 370
                                 (type == 2) ? 32 : 24,
407 371
                                 s, slot);
408 372
             delete [] image;

+ 0
- 5631
src/TombRaider.cpp
File diff suppressed because it is too large
View File


+ 116
- 74
src/UI.cpp View File

@@ -73,14 +73,14 @@ int UI::initialize() {
73 73
     //! \todo Use our own font subsystem instead of this?
74 74
     const void* png_data;
75 75
     unsigned int png_size;
76
-    ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
76
+    ImGui::GetDefaultFontData(nullptr, nullptr, &png_data, &png_size);
77 77
     int tex_x, tex_y, tex_comp;
78 78
     void* tex_data = stbi_load_from_memory((const unsigned char*)png_data,
79 79
                                            (int)png_size, &tex_x, &tex_y, &tex_comp, 0);
80 80
 
81
-    //! \fixme TODO use proper texture slot
82 81
     fontTex = getTextureManager().loadBufferSlot((unsigned char*)tex_data,
83
-              tex_x, tex_y, RGBA, 32, TextureManager::TextureStorage::SYSTEM, -1, false);
82
+              tex_x, tex_y, TextureManager::ColorMode::RGBA, 32,
83
+              TextureManager::TextureStorage::SYSTEM, -1, false);
84 84
 
85 85
     stbi_image_free(tex_data);
86 86
 
@@ -311,6 +311,43 @@ void UI::display() {
311 311
 
312 312
         ImGui::Separator();
313 313
 
314
+        if (ImGui::CollapsingHeader("Sound Map Player")) {
315
+            if (!Sound::getEnabled()) {
316
+                ImGui::Text("Please enable Sound first!");
317
+                if (ImGui::Button("Enable Sound!")) {
318
+                    Sound::setEnabled(true);
319
+                }
320
+            } else if (Sound::numBuffers() == 0) {
321
+                ImGui::Text("Please load a level!");
322
+            } else {
323
+                static int index = 0;
324
+                ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f);
325
+                ImGui::SliderInt("##soundslide", &index, 0, SoundManager::sizeSoundMap() - 1);
326
+                ImGui::PopItemWidth();
327
+                ImGui::SameLine();
328
+                if (ImGui::Button("+##soundplus", ImVec2(0, 0), true)) {
329
+                    if (index < (SoundManager::sizeSoundMap() - 1))
330
+                        index++;
331
+                    else
332
+                        index = 0;
333
+                }
334
+                ImGui::SameLine();
335
+                if (ImGui::Button("-##soundminus", ImVec2(0, 0), true)) {
336
+                    if (index > 0)
337
+                        index--;
338
+                    else
339
+                        index = SoundManager::sizeSoundMap() - 1;
340
+                }
341
+                ImGui::SameLine();
342
+                if (ImGui::Button("Play##soundplay")) {
343
+                    SoundManager::playSound(index);
344
+                }
345
+
346
+                ImGui::Text("Index: %d", SoundManager::getIndex(index));
347
+            }
348
+        }
349
+
350
+        /*
314 351
         static bool visibleTex = false;
315 352
         static bool visibleTile = false;
316 353
         static bool visibleAnim = false;
@@ -471,42 +508,6 @@ void UI::display() {
471 508
             }
472 509
         }
473 510
 
474
-        if (ImGui::CollapsingHeader("Sound Map Player")) {
475
-            if (!Sound::getEnabled()) {
476
-                ImGui::Text("Please enable Sound first!");
477
-                if (ImGui::Button("Enable Sound!")) {
478
-                    Sound::setEnabled(true);
479
-                }
480
-            } else if (Sound::numBuffers() == 0) {
481
-                ImGui::Text("Please load a level!");
482
-            } else {
483
-                static int index = 0;
484
-                ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f);
485
-                ImGui::SliderInt("##soundslide", &index, 0, SoundManager::sizeSoundMap() - 1);
486
-                ImGui::PopItemWidth();
487
-                ImGui::SameLine();
488
-                if (ImGui::Button("+##soundplus", ImVec2(0, 0), true)) {
489
-                    if (index < (SoundManager::sizeSoundMap() - 1))
490
-                        index++;
491
-                    else
492
-                        index = 0;
493
-                }
494
-                ImGui::SameLine();
495
-                if (ImGui::Button("-##soundminus", ImVec2(0, 0), true)) {
496
-                    if (index > 0)
497
-                        index--;
498
-                    else
499
-                        index = SoundManager::sizeSoundMap() - 1;
500
-                }
501
-                ImGui::SameLine();
502
-                if (ImGui::Button("Play##soundplay")) {
503
-                    SoundManager::playSound(index);
504
-                }
505
-
506
-                ImGui::Text("Index: %d", SoundManager::getIndex(index));
507
-            }
508
-        }
509
-
510 511
         if (ImGui::CollapsingHeader("Sprite Sequence Viewer")) {
511 512
             if (getWorld().sizeSprite() <= 0) {
512 513
                 ImGui::Text("Please load a level containing sprites!");
@@ -566,13 +567,14 @@ void UI::display() {
566 567
                 }
567 568
             }
568 569
         }
570
+        */
569 571
 
570 572
         ImGui::Separator();
571 573
 
572 574
         if (ImGui::CollapsingHeader("ImGui/Debug UI Help")) {
573
-            ImGui::TextWrapped("DebugViewer Textures/Textiles/Sprites will be drawn on"
574
-                               " the left side and scale with the size of this window!");
575
-            ImGui::Separator();
575
+            //ImGui::TextWrapped("DebugViewer Textures/Textiles/Sprites will be drawn on"
576
+            //                   " the left side and scale with the size of this window!");
577
+            //ImGui::Separator();
576 578
             ImGui::ShowUserGuide();
577 579
         }
578 580
     }
@@ -652,44 +654,84 @@ void UI::renderImGui(ImDrawList** const cmd_lists, int cmd_lists_count) {
652 654
     if (cmd_lists_count == 0)
653 655
         return;
654 656
 
655
-    getWindow().glEnter2D();
656
-
657
-    glDisable(GL_DEPTH_TEST);
658 657
     glEnable(GL_SCISSOR_TEST);
658
+    glDisable(GL_DEPTH_TEST);
659
+
660
+    Window::imguiShader.use();
661
+
662
+    glUniform2f(Window::imguiShader.getUniform(0), getWindow().getWidth(), getWindow().getHeight());
663
+
664
+    getTextureManager().bindTextureId(fontTex, TextureManager::TextureStorage::SYSTEM, 0);
665
+    glUniform1i(Window::imguiShader.getUniform(1), 0);
666
+
667
+    glEnableVertexAttribArray(0); // Vertices
668
+    glBindBuffer(GL_ARRAY_BUFFER, Window::imguiShader.getBuffer(0));
669
+    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
670
+
671
+    glEnableVertexAttribArray(1); // UVs
672
+    glBindBuffer(GL_ARRAY_BUFFER, Window::imguiShader.getBuffer(1));
673
+    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
674
+
675
+    glEnableVertexAttribArray(2); // Colors
676
+    glBindBuffer(GL_ARRAY_BUFFER, Window::imguiShader.getBuffer(2));
677
+    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
678
+
679
+    std::vector<glm::vec2> vertices;
680
+    std::vector<glm::vec2> uvs;
681
+    std::vector<glm::vec4> colors;
682
+
683
+    /*! \fixme Don't copy data
684
+     * The GL calls and the shaders can probably be slightly altered
685
+     * to avoid copying all the vertices, uvs and colors again here.
686
+     */
687
+
688
+    for (int i = 0; i < cmd_lists_count; i++) {
689
+        auto& commands = cmd_lists[i]->commands;
690
+        auto& buffer = cmd_lists[i]->vtx_buffer;
659 691
 
660
-    glEnableClientState(GL_VERTEX_ARRAY);
661
-    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
662
-    glEnableClientState(GL_COLOR_ARRAY);
663
-
664
-    // Setup texture
665
-    getTextureManager().bindTextureId(fontTex, TextureManager::TextureStorage::SYSTEM);
666
-
667
-    // Render command lists
668
-    for (int n = 0; n < cmd_lists_count; n++) {
669
-        const ImDrawList* cmd_list = cmd_lists[n];
670
-        const unsigned char* vtx_buffer = (const unsigned char*)cmd_list->vtx_buffer.begin();
671
-        glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer));
672
-        glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + 8));
673
-        glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (void*)(vtx_buffer + 16));
674
-
675
-        int vtx_offset = 0;
676
-        const ImDrawCmd* pcmd_end = cmd_list->commands.end();
677
-        for (const ImDrawCmd* pcmd = cmd_list->commands.begin(); pcmd != pcmd_end; pcmd++) {
678
-            glScissor((int)pcmd->clip_rect.x, (int)(ImGui::GetIO().DisplaySize.y - pcmd->clip_rect.w),
679
-                      (int)(pcmd->clip_rect.z - pcmd->clip_rect.x),
680
-                      (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
681
-            glDrawArrays(GL_TRIANGLES, vtx_offset, pcmd->vtx_count);
682
-            vtx_offset += pcmd->vtx_count;
692
+        int offset = 0;
693
+        for (int n = 0; n < commands.size(); n++) {
694
+            for (int v = 0; v < commands[n].vtx_count; v++) {
695
+                vertices.push_back(glm::vec2(buffer[offset + v].pos.x, buffer[offset + v].pos.y));
696
+                uvs.push_back(glm::vec2(buffer[offset + v].uv.x, buffer[offset + v].uv.y));
697
+
698
+                float r, g, b, a;
699
+                a = ((buffer[offset + v].col & 0xFF000000) >> 24) / 255.0f;
700
+                b = ((buffer[offset + v].col & 0x00FF0000) >> 16) / 255.0f;
701
+                g = ((buffer[offset + v].col & 0x0000FF00) >> 8) / 255.0f;
702
+                r = (buffer[offset + v].col & 0x000000FF) / 255.0f;
703
+                colors.push_back(glm::vec4(r, g, b, a));
704
+            }
705
+
706
+            offset += commands[n].vtx_count;
707
+
708
+            glBindBuffer(GL_ARRAY_BUFFER, Window::imguiShader.getBuffer(0));
709
+            glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec2), &vertices[0], GL_STATIC_DRAW);
710
+
711
+            glBindBuffer(GL_ARRAY_BUFFER, Window::imguiShader.getBuffer(1));
712
+            glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);
713
+
714
+            glBindBuffer(GL_ARRAY_BUFFER, Window::imguiShader.getBuffer(2));
715
+            glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(glm::vec4), &colors[0], GL_STATIC_DRAW);
716
+
717
+            glScissor(commands[n].clip_rect.x,
718
+                      getWindow().getHeight() - commands[n].clip_rect.w,
719
+                      commands[n].clip_rect.z - commands[n].clip_rect.x,
720
+                      commands[n].clip_rect.w - commands[n].clip_rect.y);
721
+
722
+            glDrawArrays(GL_TRIANGLES, 0, vertices.size());
723
+
724
+            vertices.clear();
725
+            uvs.clear();
726
+            colors.clear();
683 727
         }
684 728
     }
685 729
 
730
+    glDisableVertexAttribArray(0);
731
+    glDisableVertexAttribArray(1);
732
+    glDisableVertexAttribArray(2);
733
+
686 734
     glEnable(GL_DEPTH_TEST);
687 735
     glDisable(GL_SCISSOR_TEST);
688
-
689
-    glDisableClientState(GL_VERTEX_ARRAY);
690
-    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
691
-    glDisableClientState(GL_COLOR_ARRAY);
692
-
693
-    getWindow().glExit2D();
694 736
 }
695 737
 

+ 0
- 254
src/ViewVolume.cpp View File

@@ -1,254 +0,0 @@
1
-/*!
2
- * \file include/ViewVolume.h
3
- * \brief Viewing Volume for culling use
4
- *
5
- * Thanks Mark Morley for the article I used to get several algorithms.
6
- *
7
- * \author Mongoose
8
- */
9
-
10
-#include <math.h>
11
-
12
-#include "global.h"
13
-#include "ViewVolume.h"
14
-
15
-ViewVolume::ViewVolume() {
16
-    mFrustum[0][0] = mFrustum[0][1] = mFrustum[0][2] = mFrustum[0][3] = 0.0f;
17
-    mFrustum[1][0] = mFrustum[1][1] = mFrustum[1][2] = mFrustum[1][3] = 0.0f;
18
-    mFrustum[2][0] = mFrustum[2][1] = mFrustum[2][2] = mFrustum[2][3] = 0.0f;
19
-    mFrustum[3][0] = mFrustum[3][1] = mFrustum[3][2] = mFrustum[3][3] = 0.0f;
20
-    mFrustum[4][0] = mFrustum[4][1] = mFrustum[4][2] = mFrustum[4][3] = 0.0f;
21
-    mFrustum[5][0] = mFrustum[5][1] = mFrustum[5][2] = mFrustum[5][3] = 0.0f;
22
-}
23
-
24
-bool ViewVolume::isPointInFrustum(float x, float y, float z) {
25
-    for (unsigned int p = 0; p < 6; ++p) {
26
-        if (mFrustum[p][0] * x + mFrustum[p][1] * y + mFrustum[p][2] * z +
27
-            mFrustum[p][3] <= 0) {
28
-            return false;
29
-        }
30
-    }
31
-    return true;
32
-}
33
-
34
-bool ViewVolume::isSphereInFrustum(float x, float y, float z, float radius) {
35
-    for (unsigned int p = 0; p < 6; ++p) {
36
-        float d = mFrustum[p][0] * x + mFrustum[p][1] * y + mFrustum[p][2] * z + mFrustum[p][3];
37
-        if (d <= -radius)
38
-            return false;
39
-    }
40
-    return true;
41
-}
42
-
43
-bool ViewVolume::isBboxInFrustum(float min[3], float max[3]) {
44
-    for (unsigned int p = 0; p < 6; ++p) {
45
-        if (mFrustum[p][0] * min[0] +
46
-            mFrustum[p][1] * min[1] +
47
-            mFrustum[p][2] * min[2] + mFrustum[p][3] > 0)
48
-            continue;
49
-
50
-        if (mFrustum[p][0] * max[0] +
51
-            mFrustum[p][1] * max[1] +
52
-            mFrustum[p][2] * max[2] + mFrustum[p][3] > 0)
53
-            continue;
54
-
55
-        if (mFrustum[p][0] * min[0] +
56
-            mFrustum[p][1] * max[1] +
57
-            mFrustum[p][2] * max[2] + mFrustum[p][3] > 0)
58
-            continue;
59
-
60
-        if (mFrustum[p][0] * min[0] +
61
-            mFrustum[p][1] * min[1] +
62
-            mFrustum[p][2] * max[2] + mFrustum[p][3] > 0)
63
-            continue;
64
-
65
-        if (mFrustum[p][0] * min[0] +
66
-            mFrustum[p][1] * max[1] +
67
-            mFrustum[p][2] * min[2] + mFrustum[p][3] > 0)
68
-            continue;
69
-
70
-        if (mFrustum[p][0] * max[0] +
71
-            mFrustum[p][1] * min[1] +
72
-            mFrustum[p][2] * min[2] + mFrustum[p][3] > 0)
73
-            continue;
74
-
75
-        if (mFrustum[p][0] * max[0] +
76
-            mFrustum[p][1] * max[1] +
77
-            mFrustum[p][2] * min[2] + mFrustum[p][3] > 0)
78
-            continue;
79
-
80
-        if (mFrustum[p][0] * max[0] +
81
-            mFrustum[p][1] * min[1] +
82
-            mFrustum[p][2] * max[2] + mFrustum[p][3] > 0)
83
-            continue;
84
-
85
-        return false;
86
-    }
87
-    return true;
88
-}
89
-
90
-float ViewVolume::getDistToSphereFromNear(float x, float y, float z, float radius) {
91
-    float d = 0.0;
92
-    for (unsigned int p = 0; p < 6; ++p) {
93
-        d = mFrustum[p][0] * x + mFrustum[p][1] * y + mFrustum[p][2] * z + mFrustum[p][3];
94
-        if (d <= -radius)
95
-            return 0;
96
-    }
97
-    return d + radius;
98
-}
99
-
100
-float ViewVolume::getDistToBboxFromNear(const float min[3], const float max[3]) {
101
-    float center[3];
102
-    float d, radius;
103
-
104
-    midpoint(min, max, center);
105
-
106
-    // 5 should be near plane
107
-    d = (mFrustum[5][0] * center[0] +
108
-         mFrustum[5][1] * center[1] +
109
-         mFrustum[5][2] * center[2] +
110
-         mFrustum[5][3]);
111
-
112
-    radius = distance(max, center);
113
-
114
-    if (d <= -radius)
115
-        return 0;
116
-
117
-    return d + radius;
118
-}
119
-
120
-void ViewVolume::getFrustum(float frustum[6][4]) {
121
-    for (unsigned int p = 0; p < 6; ++p) {
122
-        for (unsigned int i = 0; i < 4; ++i) {
123
-            frustum[p][i] = mFrustum[p][i];
124
-        }
125
-    }
126
-}
127
-
128
-void ViewVolume::getPlane(ViewVolumeSide p, float plane[4]) {
129
-    for (unsigned int i = 0; i < 4; ++i) {
130
-        plane[i] =  mFrustum[p][i];
131
-    }
132
-}
133
-
134
-void ViewVolume::updateFrame(float proj[16], float mdl[16]) {
135
-    setModel(mdl);
136
-    setProjection(proj);
137
-    updateClip();
138
-    updateFrustum();
139
-}
140
-
141
-void ViewVolume::updateFrame() {
142
-    updateClip();
143
-    updateFrustum();
144
-}
145
-
146
-void ViewVolume::setModel(float mdl[16]) {
147
-    mModel.setMatrix(mdl);
148
-}
149
-
150
-void ViewVolume::setProjection(float proj[16]) {
151
-    mProjection.setMatrix(proj);
152
-}
153
-
154
-void ViewVolume::updateClip() {
155
-    mClip = mProjection * mModel;
156
-}
157
-
158
-void ViewVolume::updateFrustum() {
159
-    float clip[16];
160
-    float t;
161
-
162
-    mClip.getMatrix(clip);
163
-
164
-    /* Extract the numbers for the RIGHT plane */
165
-    mFrustum[0][0] = clip[ 3] - clip[ 0];
166
-    mFrustum[0][1] = clip[ 7] - clip[ 4];
167
-    mFrustum[0][2] = clip[11] - clip[ 8];
168
-    mFrustum[0][3] = clip[15] - clip[12];
169
-
170
-    /* Normalize the result */
171
-    t = sqrtf(mFrustum[0][0] * mFrustum[0][0] +
172
-              mFrustum[0][1] * mFrustum[0][1] +
173
-              mFrustum[0][2] * mFrustum[0][2]);
174
-    mFrustum[0][0] /= t;
175
-    mFrustum[0][1] /= t;
176
-    mFrustum[0][2] /= t;
177
-    mFrustum[0][3] /= t;
178
-
179
-    /* Extract the numbers for the LEFT plane */
180
-    mFrustum[1][0] = clip[ 3] + clip[ 0];
181
-    mFrustum[1][1] = clip[ 7] + clip[ 4];
182
-    mFrustum[1][2] = clip[11] + clip[ 8];
183
-    mFrustum[1][3] = clip[15] + clip[12];
184
-
185
-    /* Normalize the result */
186
-    t = sqrtf(mFrustum[1][0] * mFrustum[1][0] +
187
-              mFrustum[1][1] * mFrustum[1][1] +
188
-              mFrustum[1][2] * mFrustum[1][2]);
189
-    mFrustum[1][0] /= t;
190
-    mFrustum[1][1] /= t;
191
-    mFrustum[1][2] /= t;
192
-    mFrustum[1][3] /= t;
193
-
194
-    /* Extract the BOTTOM plane */
195
-    mFrustum[2][0] = clip[ 3] + clip[ 1];
196
-    mFrustum[2][1] = clip[ 7] + clip[ 5];
197
-    mFrustum[2][2] = clip[11] + clip[ 9];
198
-    mFrustum[2][3] = clip[15] + clip[13];
199
-
200
-    /* Normalize the result */
201
-    t = sqrtf(mFrustum[2][0] * mFrustum[2][0] +
202
-              mFrustum[2][1] * mFrustum[2][1] +
203
-              mFrustum[2][2] * mFrustum[2][2]);
204
-    mFrustum[2][0] /= t;
205
-    mFrustum[2][1] /= t;
206
-    mFrustum[2][2] /= t;
207
-    mFrustum[2][3] /= t;
208
-
209
-    /* Extract the TOP plane */
210
-    mFrustum[3][0] = clip[ 3] - clip[ 1];
211
-    mFrustum[3][1] = clip[ 7] - clip[ 5];
212
-    mFrustum[3][2] = clip[11] - clip[ 9];
213
-    mFrustum[3][3] = clip[15] - clip[13];
214
-
215
-    /* Normalize the result */
216
-    t = sqrtf(mFrustum[3][0] * mFrustum[3][0] +
217
-              mFrustum[3][1] * mFrustum[3][1] +
218
-              mFrustum[3][2] * mFrustum[3][2]);
219
-    mFrustum[3][0] /= t;
220
-    mFrustum[3][1] /= t;
221
-    mFrustum[3][2] /= t;
222
-    mFrustum[3][3] /= t;
223
-
224
-    /* Extract the FAR plane */
225
-    mFrustum[4][0] = clip[ 3] - clip[ 2];
226
-    mFrustum[4][1] = clip[ 7] - clip[ 6];
227
-    mFrustum[4][2] = clip[11] - clip[10];
228
-    mFrustum[4][3] = clip[15] - clip[14];
229
-
230
-    /* Normalize the result */
231
-    t = sqrtf(mFrustum[4][0] * mFrustum[4][0] +
232
-              mFrustum[4][1] * mFrustum[4][1] +
233
-              mFrustum[4][2] * mFrustum[4][2]);
234
-    mFrustum[4][0] /= t;
235
-    mFrustum[4][1] /= t;
236
-    mFrustum[4][2] /= t;
237
-    mFrustum[4][3] /= t;
238
-
239
-    /* Extract the NEAR plane */
240
-    mFrustum[5][0] = clip[ 3] + clip[ 2];
241
-    mFrustum[5][1] = clip[ 7] + clip[ 6];
242
-    mFrustum[5][2] = clip[11] + clip[10];
243
-    mFrustum[5][3] = clip[15] + clip[14];
244
-
245
-    /* Normalize the result */
246
-    t = sqrtf(mFrustum[5][0] * mFrustum[5][0] +
247
-              mFrustum[5][1] * mFrustum[5][1] +
248
-              mFrustum[5][2] * mFrustum[5][2]);
249
-    mFrustum[5][0] /= t;
250
-    mFrustum[5][1] /= t;
251
-    mFrustum[5][2] /= t;
252
-    mFrustum[5][3] /= t;
253
-}
254
-

+ 0
- 1
src/commands/CMakeLists.txt View File

@@ -1,6 +1,5 @@
1 1
 # Source files
2 2
 set (CMD_SRCS ${CMD_SRCS} "Command.cpp")
3
-set (CMD_SRCS ${CMD_SRCS} "CommandAnimate.cpp")
4 3
 set (CMD_SRCS ${CMD_SRCS} "CommandBind.cpp")
5 4
 set (CMD_SRCS ${CMD_SRCS} "CommandEngine.cpp")
6 5
 set (CMD_SRCS ${CMD_SRCS} "CommandGame.cpp")

+ 0
- 3
src/commands/Command.cpp View File

@@ -12,7 +12,6 @@
12 12
 #include "Log.h"
13 13
 #include "utils/strings.h"
14 14
 #include "commands/Command.h"
15
-#include "commands/CommandAnimate.h"
16 15
 #include "commands/CommandBind.h"
17 16
 #include "commands/CommandEngine.h"
18 17
 #include "commands/CommandGame.h"
@@ -36,10 +35,8 @@ void Command::fillCommandList() {
36 35
     commands.push_back(std::shared_ptr<Command>(new CommandSet()));
37 36
     commands.push_back(std::shared_ptr<Command>(new CommandGet()));
38 37
     commands.push_back(std::shared_ptr<Command>(new CommandScreenshot()));
39
-    commands.push_back(std::shared_ptr<Command>(new CommandAnimate()));
40 38
     commands.push_back(std::shared_ptr<Command>(new CommandMove()));
41 39
     commands.push_back(std::shared_ptr<Command>(new CommandMode()));
42
-    commands.push_back(std::shared_ptr<Command>(new CommandRenderflag()));
43 40
     commands.push_back(std::shared_ptr<Command>(new CommandPos()));
44 41
     commands.push_back(std::shared_ptr<Command>(new CommandViewmodel()));
45 42
     commands.push_back(std::shared_ptr<Command>(new CommandPigtail()));

+ 0
- 82
src/commands/CommandAnimate.cpp View File

@@ -1,82 +0,0 @@
1
-/*!
2
- * \file src/commands/CommandAnimate.cpp
3
- * \brief Animate command
4
- *
5
- * \author xythobuz
6
- */
7
-
8
-#include "global.h"
9
-#include "Log.h"
10
-#include "Game.h"
11
-#include "Render.h"
12
-#include "World.h"
13
-#include "commands/CommandAnimate.h"
14
-
15
-std::string CommandAnimate::name() {
16
-    return "animate";
17
-}
18
-
19
-std::string CommandAnimate::brief() {
20
-    return "[BOOL|n|p] - Animate models";
21
-}
22
-
23
-void CommandAnimate::printHelp() {
24
-    getLog() << "animate-Command Usage:" << Log::endl;
25
-    getLog() << "  animate [n|p|BOOL]" << Log::endl;
26
-    getLog() << "Where the commands have the following meaning:" << Log::endl;
27
-    getLog() << "  BOOL to (de)activate animating all models" << Log::endl;
28
-    getLog() << "  n to step all models to their next animation" << Log::endl;
29
-    getLog() << "  p to step all models to their previous animation" << Log::endl;
30
-}
31
-
32
-int CommandAnimate::execute(std::istream& args) {
33
-    if (!getGame().isLoaded()) {
34
-        getLog() << "Use animate command interactively!" << Log::endl;
35
-        return -1;
36
-    }
37
-
38
-    if (args.peek() == 'n') {
39
-        // Step all skeletal models to their next animation
40
-        if (getRender().getFlags() & Render::fAnimateAllModels) {
41
-            for (unsigned int i = 0; i < getWorld().sizeEntity(); i++) {
42
-                Entity& e = getWorld().getEntity(i);
43
-                SkeletalModel& m = e.getModel();
44
-                if (e.getAnimation() < (m.size() - 1))
45
-                    e.setAnimation(e.getAnimation() + 1);
46
-                else
47
-                    e.setAnimation(0);
48
-            }
49
-        } else {
50
-            getLog() << "Animations need to be enabled!" << Log::endl;
51
-        }
52
-    } else if (args.peek() == 'p') {
53
-        // Step all skeletal models to their previous animation
54
-        if (getRender().getFlags() & Render::fAnimateAllModels) {
55
-            for (unsigned int i = 0; i < getWorld().sizeEntity(); i++) {
56
-                Entity& e = getWorld().getEntity(i);
57
-                SkeletalModel& m = e.getModel();
58
-                if (e.getAnimation() > 0)
59
-                    e.setAnimation(e.getAnimation() - 1);
60
-                else if (m.size() > 0)
61
-                    e.setAnimation(m.size() - 1);
62
-            }
63
-        } else {
64
-            getLog() << "Animations need to be enabled!" << Log::endl;
65
-        }
66
-    } else {
67
-        // Enable or disable animating all skeletal models
68
-        bool b = false;
69
-        if (!(args >> b)) {
70
-            getLog() << "Pass BOOL to animate command!" << Log::endl;
71
-            return -2;
72
-        }
73
-        if (b)
74
-            getRender().setFlags(Render::fAnimateAllModels);
75
-        else
76
-            getRender().clearFlags(Render::fAnimateAllModels);
77
-        getLog() << (b ? "Animating all models" : "No longer animating all models") << Log::endl;
78
-    }
79
-
80
-    return 0;
81
-}
82
-

+ 1
- 1
src/commands/CommandEngine.cpp View File

@@ -83,7 +83,7 @@ int CommandScreenshot::execute(std::istream& args) {
83 83
 
84 84
     renderFrame();
85 85
     renderFrame(); // Double buffered
86
-    getRender().screenShot(filename.c_str());
86
+    Render::screenShot(filename.c_str());
87 87
 
88 88
     getMenu().setVisible(false);
89 89
     UI::setVisible(true);

+ 13
- 80
src/commands/CommandRender.cpp View File

@@ -8,7 +8,6 @@
8 8
 #include "global.h"
9 9
 #include "Game.h"
10 10
 #include "Log.h"
11
-#include "RunTime.h"
12 11
 #include "Render.h"
13 12
 #include "commands/CommandRender.h"
14 13
 
@@ -27,8 +26,8 @@ void CommandMode::printHelp() {
27 26
     getLog() << "  wireframe" << Log::endl;
28 27
     getLog() << "  solid" << Log::endl;
29 28
     getLog() << "  texture" << Log::endl;
30
-    getLog() << "  vertexlight" << Log::endl;
31 29
     getLog() << "  titlescreen" << Log::endl;
30
+    getLog() << "  disabled" << Log::endl;
32 31
 
33 32
 }
34 33
 
@@ -41,21 +40,21 @@ int CommandMode::execute(std::istream& args) {
41 40
     std::string s;
42 41
     args >> s;
43 42
 
44
-    if (s.compare("wireframe") == 0) {
45
-        getRender().setMode(Render::modeWireframe);
43
+    if (s == "wireframe") {
44
+        Render::setMode(RenderMode::Wireframe);
46 45
         getLog() << "Wireframe mode" << Log::endl;
47
-    } else if (s.compare("solid") == 0) {
48
-        getRender().setMode(Render::modeSolid);
46
+    } else if (s == "solid") {
47
+        Render::setMode(RenderMode::Solid);
49 48
         getLog() << "Solid mode" << Log::endl;
50
-    } else if (s.compare("texture") == 0) {
51
-        getRender().setMode(Render::modeTexture);
52
-        getLog() << "Texture mode" << Log::endl;
53
-    } else if (s.compare("vertexlight") == 0) {
54
-        getRender().setMode(Render::modeVertexLight);
55
-        getLog() << "Vertexlight mode" << Log::endl;
56
-    } else if (s.compare("titlescreen") == 0) {
57
-        getRender().setMode(Render::modeLoadScreen);
49
+    } else if (s == "texture") {
50
+        Render::setMode(RenderMode::Texture);
51
+        getLog() << "Texture Mode" << Log::endl;
52
+    } else if (s == "titlescreen") {
53
+        Render::setMode(RenderMode::LoadScreen);
58 54
         getLog() << "Titlescreen mode" << Log::endl;
55
+    } else if (s == "disabled") {
56
+        Render::setMode(RenderMode::Disabled);
57
+        getLog() << "Disabled mode" << Log::endl;
59 58
     } else {
60 59
         getLog() << "Invalid use of mode command (" << s << ")!" << Log::endl;
61 60
         return -2;
@@ -64,69 +63,3 @@ int CommandMode::execute(std::istream& args) {
64 63
     return 0;
65 64
 }
66 65
 
67
-// --------------------------------------
68
-
69
-std::string CommandRenderflag::name() {
70
-    return "renderflag";
71
-}
72
-
73
-std::string CommandRenderflag::brief() {
74
-    return "STRING BOOL - Toggle Render flag";
75
-}
76
-
77
-void CommandRenderflag::printHelp() {
78
-    getLog() << "renderflag-Command Usage:" << Log::endl;
79
-    getLog() << "  renderflag STRING BOOL" << Log::endl;
80
-    getLog() << "Where STRING is one of the following:" << Log::endl;
81
-    getLog() << "  ralpha" << Log::endl;
82
-    getLog() << "  entmodel" << Log::endl;
83
-    getLog() << "  fog" << Log::endl;
84
-    getLog() << "  light" << Log::endl;
85
-    getLog() << "  ponytail" << Log::endl;
86
-}
87
-
88
-int CommandRenderflag::execute(std::istream& args) {
89
-    if (!getRunTime().isRunning()) {
90
-        getLog() << "Use renderflag-Command interactively!" << Log::endl;
91
-        return -1;
92
-    }
93
-
94
-    std::string flag;
95
-    bool b;
96
-    args >> flag >> b;
97
-    if (!args) {
98
-        getLog() << "Pass STRING and BOOL to renderflag command!" << Log::endl;
99
-        return -2;
100
-    }
101
-
102
-    int f = stringToFlag(flag);
103
-    if (f == -1) {
104
-        getLog() << "Unknown flag \"" << flag << "\"!" << Log::endl;
105
-        return -3;
106
-    }
107
-
108
-    if (b) {
109
-        getRender().setFlags((unsigned int)f);
110
-    } else {
111
-        getRender().clearFlags((unsigned int)f);
112
-    }
113
-
114
-    return 0;
115
-}
116
-
117
-int CommandRenderflag::stringToFlag(std::string flag) {
118
-    if (flag == "ralpha") {
119
-        return Render::fRoomAlpha;
120
-    } else if (flag == "entmodel") {
121
-        return Render::fEntityModels;
122
-    } else if (flag == "fog") {
123
-        return Render::fFog;
124
-    } else if (flag == "light") {
125
-        return Render::fGL_Lights;
126
-    } else if (flag == "ponytail") {
127
-        return Render::fRenderPonytail;
128
-    } else {
129
-        return -1;
130
-    }
131
-}
132
-

+ 6
- 4
src/commands/CommandSet.cpp View File

@@ -5,6 +5,8 @@
5 5
  * \author xythobuz
6 6
  */
7 7
 
8
+#include "glm/glm.hpp"
9
+
8 10
 #include "global.h"
9 11
 #include "Camera.h"
10 12
 #include "Log.h"
@@ -103,14 +105,14 @@ int CommandSet::execute(std::istream& args) {
103 105
             getLog() << "set-mouse_x-Error: Invalid value" << Log::endl;
104 106
             return -6;
105 107
         }
106
-        getCamera().setSensitivityX(OR_DEG_TO_RAD(sense));
108
+        Camera::setSensitivityX(glm::radians(sense));
107 109
     } else if (var.compare("mouse_y") == 0) {
108 110
         float sense = 1.0f;
109 111
         if (!(args >> sense)) {
110 112
             getLog() << "set-mouse_y-Error: Invalid value" << Log::endl;
111 113
             return -7;
112 114
         }
113
-        getCamera().setSensitivityY(OR_DEG_TO_RAD(sense));
115
+        Camera::setSensitivityY(glm::radians(sense));
114 116
     } else if (var.compare("fps") == 0) {
115 117
         bool fps = false;
116 118
         if (!(args >> fps)) {
@@ -187,9 +189,9 @@ int CommandGet::execute(std::istream& args) {
187 189
     } else if (var.compare("volume") == 0) {
188 190
         getLog() << Sound::getVolume() << Log::endl;
189 191
     } else if (var.compare("mouse_x") == 0) {
190
-        getLog() << OR_RAD_TO_DEG(getCamera().getSensitivityX()) << Log::endl;
192
+        getLog() << glm::degrees(Camera::getSensitivityX()) << Log::endl;
191 193
     } else if (var.compare("mouse_y") == 0) {
192
-        getLog() << OR_RAD_TO_DEG(getCamera().getSensitivityY()) << Log::endl;
194
+        getLog() << glm::degrees(Camera::getSensitivityY()) << Log::endl;
193 195
     } else if (var.compare("fps") == 0) {
194 196
         getLog() << getRunTime().getShowFPS() << Log::endl;
195 197
     } else if (var.compare("basedir") == 0) {

+ 1
- 1
src/loader/Loader.cpp View File

@@ -42,7 +42,7 @@ std::unique_ptr<Loader> Loader::createLoader(std::string f) {
42 42
         case TR_4:
43 43
         case TR_5:
44 44
         case TR_UNKNOWN:
45
-            return NULL;
45
+            return nullptr;
46 46
 
47 47
         case TR_2:
48 48
             return std::unique_ptr<Loader>(new LoaderTR2());

+ 38
- 27
src/loader/LoaderTR2.cpp View File

@@ -7,6 +7,9 @@
7 7
 
8 8
 #include <vector>
9 9
 
10
+#include "glm/glm.hpp"
11
+#include "glm/gtc/matrix_transform.hpp"
12
+
10 13
 #include "global.h"
11 14
 #include "Game.h"
12 15
 #include "Log.h"
@@ -15,8 +18,6 @@
15 18
 #include "SoundManager.h"
16 19
 #include "TextureManager.h"
17 20
 #include "World.h"
18
-#include "math/Matrix.h"
19
-#include "math/Vec3.h"
20 21
 #include "system/Sound.h"
21 22
 #include "utils/pixel.h"
22 23
 #include "loader/LoaderTR2.h"
@@ -88,7 +89,8 @@ void LoaderTR2::loadPaletteTextiles() {
88 89
 
89 90
         // Convert 16bit textile to 32bit textile
90 91
         unsigned char* img = argb16to32(&arr[0], 256, 256);
91
-        int r = getTextureManager().loadBufferSlot(img, 256, 256, ARGB, 32,
92
+        int r = getTextureManager().loadBufferSlot(img, 256, 256,
93
+                TextureManager::ColorMode::ARGB, 32,
92 94
                 TextureManager::TextureStorage::GAME, i);
93 95
         assert(r >= 0); //! \fixme properly handle error when texture could not be loaded!
94 96
         delete [] img;
@@ -190,16 +192,16 @@ void LoaderTR2::loadRooms() {
190 192
         uint32_t dataToFollow = file.readU32();
191 193
 
192 194
         uint16_t numVertices = file.readU16();
193
-        std::vector<Vec3> vertices;
195
+        std::vector<glm::vec3> vertices;
194 196
         float bbox[2][3] = {
195 197
             { 0.0f, 0.0f, 0.0f },
196 198
             { 0.0f, 0.0f, 0.0f }
197 199
         };
198 200
         for (unsigned int v = 0; v < numVertices; v++) {
199 201
             // Vertex coordinates, relative to x/zOffset
200
-            int16_t x = file.read16();
202
+            int32_t x = file.read16() + xOffset;
201 203
             int16_t y = file.read16();
202
-            int16_t z = file.read16();
204
+            int32_t z = file.read16() + zOffset;
203 205
 
204 206
             int16_t light1 = file.read16();
205 207
 
@@ -289,9 +291,7 @@ void LoaderTR2::loadRooms() {
289 291
             // TODO store sprites somewhere
290 292
         }
291 293
 
292
-        Matrix transform;
293
-        transform.setIdentity();
294
-        transform.translate(pos);
294
+        glm::mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3(pos[0], pos[1], pos[2]));
295 295
         room->addAdjacentRoom(i); // Always set room itself as first
296 296
 
297 297
         uint16_t numPortals = file.readU16();
@@ -321,31 +321,35 @@ void LoaderTR2::loadRooms() {
321 321
             int16_t yCorner4 = file.read16();
322 322
             int16_t zCorner4 = file.read16();
323 323
 
324
-            float vertices[4][3] = {
325
-                {
324
+            glm::vec4 vertices[4] = {
325
+                glm::vec4(
326 326
                     static_cast<float>(xCorner1),
327 327
                     static_cast<float>(yCorner1),
328
-                    static_cast<float>(zCorner1)
329
-                }, {
328
+                    static_cast<float>(zCorner1),
329
+                    1.0f
330
+                ), glm::vec4(
330 331
                     static_cast<float>(xCorner2),
331 332
                     static_cast<float>(yCorner2),
332
-                    static_cast<float>(zCorner2)
333
-                }, {
333
+                    static_cast<float>(zCorner2),
334
+                    1.0f
335
+                ), glm::vec4(
334 336
                     static_cast<float>(xCorner3),
335 337
                     static_cast<float>(yCorner3),
336
-                    static_cast<float>(zCorner3)
337
-                }, {
338
+                    static_cast<float>(zCorner3),
339
+                    1.0f
340
+                ), glm::vec4(
338 341
                     static_cast<float>(xCorner4),
339 342
                     static_cast<float>(yCorner4),
340
-                    static_cast<float>(zCorner4)
341
-                }
343
+                    static_cast<float>(zCorner4),
344
+                    0.0f
345
+                )
342 346
             };
343 347
 
344 348
             // Portals have relative coordinates
345
-            transform.multiply3v(vertices[0], vertices[0]);
346
-            transform.multiply3v(vertices[1], vertices[1]);
347
-            transform.multiply3v(vertices[2], vertices[2]);
348
-            transform.multiply3v(vertices[3], vertices[3]);
349
+            vertices[0] = transform * vertices[0];
350
+            vertices[1] = transform * vertices[1];
351
+            vertices[2] = transform * vertices[2];
352
+            vertices[3] = transform * vertices[3];
349 353
 
350 354
             float normals[3] = {
351 355
                 static_cast<float>(xNormal),
@@ -353,7 +357,14 @@ void LoaderTR2::loadRooms() {
353 357
                 static_cast<float>(zNormal)
354 358
             };
355 359
 
356
-            room->addPortal(new Portal(vertices, normals, adjoiningRoom));
360
+            glm::vec3 verts[4] = {
361
+                glm::vec3(vertices[0]),
362
+                glm::vec3(vertices[1]),
363
+                glm::vec3(vertices[2]),
364
+                glm::vec3(vertices[3])
365
+            };
366
+
367
+            room->addPortal(new Portal(verts, normals, adjoiningRoom));
357 368
             room->addAdjacentRoom(adjoiningRoom);
358 369
         }
359 370
 
@@ -542,7 +553,7 @@ void LoaderTR2::loadMeshes() {
542 553
         // TODO store mesh collision info somewhere
543 554
 
544 555
         uint16_t numVertices = mem.readU16();
545
-        std::vector<Vec3> vertices;
556
+        std::vector<glm::vec3> vertices;
546 557
         for (int v = 0; v < numVertices; v++) {
547 558
             int16_t x = mem.read16();
548 559
             int16_t y = mem.read16();
@@ -564,7 +575,7 @@ void LoaderTR2::loadMeshes() {
564 575
                 int16_t y = mem.read16();
565 576
                 int16_t z = mem.read16();
566 577
 
567
-                mesh->addNormal(Vec3(x, y, z));
578
+                mesh->addNormal(glm::vec3(x, y, z));
568 579
             }
569 580
         } else if (numNormals < 0) {
570 581
             // Internal vertex lighting is used,
@@ -957,7 +968,7 @@ void LoaderTR2::loadItems() {
957 968
 
958 969
                 float rot[3] = {
959 970
                     0.0f,
960
-                    OR_DEG_TO_RAD(((angle >> 14) & 0x03) * 90.0f),
971
+                    glm::radians(((angle >> 14) & 0x03) * 90.0f),
961 972
                     0.0f
962 973
                 };
963 974
 

+ 11
- 23
src/main.cpp View File

@@ -17,11 +17,9 @@
17 17
 
18 18
 #ifndef UNIT_TEST
19 19
 
20
-#include "Camera.h"
21 20
 #include "Game.h"
22 21
 #include "Log.h"
23 22
 #include "MenuFolder.h"
24
-#include "Render.h"
25 23
 #include "RunTime.h"
26 24
 #include "SoundManager.h"
27 25
 #include "TextureManager.h"
@@ -41,20 +39,14 @@
41 39
 
42 40
 static std::string configFileToUse;
43 41
 
44
-static std::shared_ptr<Camera> gCamera;
45 42
 static std::shared_ptr<Game> gGame;
46 43
 static std::shared_ptr<Log> gLog;
47 44
 static std::shared_ptr<MenuFolder> gMenu;
48
-static std::shared_ptr<Render> gRender;
49 45
 static std::shared_ptr<RunTime> gRunTime;
50 46
 static std::shared_ptr<TextureManager> gTextureManager;
51 47
 static std::shared_ptr<Window> gWindow;
52 48
 static std::shared_ptr<World> gWorld;
53 49
 
54
-Camera& getCamera() {
55
-    return *gCamera;
56
-}
57
-
58 50
 Game& getGame() {
59 51
     return *gGame;
60 52
 }
@@ -67,10 +59,6 @@ Menu& getMenu() {
67 59
     return *gMenu;
68 60
 }
69 61
 
70
-Render& getRender() {
71
-    return *gRender;
72
-}
73
-
74 62
 RunTime& getRunTime() {
75 63
     return *gRunTime;
76 64
 }
@@ -100,11 +88,9 @@ int main(int argc, char* argv[]) {
100 88
     // RunTime is required by other constructors
101 89
     gRunTime.reset(new RunTime());
102 90
 
103
-    gCamera.reset(new Camera());
104 91
     gGame.reset(new Game());
105 92
     gLog.reset(new Log());
106 93
     gMenu.reset(new MenuFolder());
107
-    gRender.reset(new Render());
108 94
     gTextureManager.reset(new TextureManager());
109 95
     gWorld.reset(new World());
110 96
 
@@ -132,10 +118,10 @@ int main(int argc, char* argv[]) {
132 118
         return -2;
133 119
     }
134 120
 
135
-    // Initialize Font
136
-    error = Font::initialize();
121
+    // Initialize Texture Manager
122
+    error = getTextureManager().initialize();
137 123
     if (error != 0) {
138
-        std::cout << "Could not initialize Font (" << error << ")!" << std::endl;
124
+        std::cout << "Could not initialize TextureManager (" << error << ")!" << std::endl;
139 125
         return -3;
140 126
     }
141 127
 
@@ -153,17 +139,16 @@ int main(int argc, char* argv[]) {
153 139
         Command::executeFile(configFileToUse);
154 140
     }
155 141
 
156
-    // Initialize Sound
157
-    error = Sound::initialize();
142
+    error = getTextureManager().initializeSplash();
158 143
     if (error != 0) {
159
-        std::cout << "Could not initialize Sound (" << error << ")!" << std::endl;
144
+        std::cout << "Coult not load Splash Texture (" << error << ")!" << std::endl;
160 145
         return -4;
161 146
     }
162 147
 
163
-    // Initialize Texture Manager
164
-    error = getTextureManager().initialize();
148
+    // Initialize Sound
149
+    error = Sound::initialize();
165 150
     if (error != 0) {
166
-        std::cout << "Could not initialize TextureManager (" << error << ")!" << std::endl;
151
+        std::cout << "Could not initialize Sound (" << error << ")!" << std::endl;
167 152
         return -5;
168 153
     }
169 154
 
@@ -201,6 +186,7 @@ int main(int argc, char* argv[]) {
201 186
     UI::shutdown();
202 187
     Font::shutdown();
203 188
     Sound::shutdown();
189
+    Window::shutdownGL();
204 190
 
205 191
 #ifdef DEBUG
206 192
     std::cout << std::endl;
@@ -219,6 +205,7 @@ void renderFrame() {
219 205
     getMenu().display();
220 206
     UI::display();
221 207
 
208
+    /*
222 209
     if (getRunTime().getShowFPS()) {
223 210
         std::ostringstream s;
224 211
         s << getRunTime().getFPS() << "FPS";
@@ -226,6 +213,7 @@ void renderFrame() {
226 213
         Font::drawText(10, getWindow().getHeight() - 25, 0.6f, BLUE, s.str());
227 214
         getWindow().glExit2D();
228 215
     }
216
+    */
229 217
 
230 218
     getWindow().swapBuffersGL();
231 219
 

+ 0
- 9
src/math/CMakeLists.txt View File

@@ -1,9 +0,0 @@
1
-# Source files
2
-set (MATH_SRCS ${MATH_SRCS} "math.cpp")
3
-set (MATH_SRCS ${MATH_SRCS} "Matrix.cpp")
4
-set (MATH_SRCS ${MATH_SRCS} "Quaternion.cpp")
5
-set (MATH_SRCS ${MATH_SRCS} "Vec3.cpp")
6
-
7
-# Add library
8
-add_library (OpenRaider_math OBJECT ${MATH_SRCS})
9
-

+ 0
- 515
src/math/Matrix.cpp View File

@@ -1,515 +0,0 @@
1
-/*!
2
- * \file src/math/Matrix.cpp
3
- * \brief 3D Matrix
4
- *
5
- * \author Mongoose
6
- */
7
-
8
-#include <stdio.h>
9
-#include <math.h>
10
-
11
-#include "global.h"
12
-#include "math/Matrix.h"
13
-
14
-Matrix::Matrix() {
15
-    setIdentity();
16
-}
17
-
18
-Matrix::Matrix(float m[16]) {
19
-    setMatrix(m);
20
-}
21
-
22
-Matrix::Matrix(Quaternion& q) {
23
-    float m[16];
24
-    q.getMatrix(m);
25
-    setMatrix(m);
26
-}
27
-
28
-bool Matrix::getInvert(float out[16]) {
29
-    float m[16];
30
-
31
-#ifdef COLUMN_ORDER
32
-    getMatrix(m);
33
-#else
34
-    getTransposeMatrix(m);
35
-#endif
36
-
37
-    /*
38
-     * Mongoose: This code was from a Jeff Lander tutorial which was based
39
-     * on MESA GL's InvertMatrix.
40
-     *
41
-     * NB. OpenGL Matrices are COLUMN major
42
-     */
43
-
44
-#define SWAP_ROWS(a, b) { float *_tmp = a; (a)=(b); (b)=_tmp; }
45
-#define MAT(m,r,c) (m)[(c)*4+(r)]
46
-
47
-    float wtmp[4][8];
48
-    float m0, m1, m2, m3, s;
49
-    float* r0, *r1, *r2, *r3;
50
-
51
-    r0 = wtmp[0];
52
-    r1 = wtmp[1];
53
-    r2 = wtmp[2];
54
-    r3 = wtmp[3];
55
-
56
-    r0[0] = MAT(m, 0, 0);
57
-    r0[1] = MAT(m, 0, 1);
58
-    r0[2] = MAT(m, 0, 2);
59
-    r0[3] = MAT(m, 0, 3);
60
-    r0[4] = 1.0f;
61
-    r0[5] = r0[6] = r0[7] = 0.0f;
62
-
63
-    r1[0] = MAT(m, 1, 0);
64
-    r1[1] = MAT(m, 1, 1);
65
-    r1[2] = MAT(m, 1, 2);
66
-    r1[3] = MAT(m, 1, 3);
67
-    r1[5] = 1.0f;
68
-    r1[4] = r1[6] = r1[7] = 0.0f;
69
-
70
-    r2[0] = MAT(m, 2, 0);
71
-    r2[1] = MAT(m, 2, 1);
72
-    r2[2] = MAT(m, 2, 2);
73
-    r2[3] = MAT(m, 2, 3);
74
-    r2[6] = 1.0f;
75
-    r2[4] = r2[5] = r2[7] = 0.0f;
76
-
77
-    r3[0] = MAT(m, 3, 0);
78
-    r3[1] = MAT(m, 3, 1);
79
-    r3[2] = MAT(m, 3, 2);
80
-    r3[3] = MAT(m, 3, 3);
81
-    r3[7] = 1.0f;
82
-    r3[4] = r3[5] = r3[6] = 0.0f;
83
-
84
-    // choose pivot or die
85
-    if (fabs(r3[0]) > fabs(r2[0]))
86
-        SWAP_ROWS(r3, r2);
87
-
88
-    if (fabs(r2[0]) > fabs(r1[0]))
89
-        SWAP_ROWS(r2, r1);
90
-
91
-    if (fabs(r1[0]) > fabs(r0[0]))
92
-        SWAP_ROWS(r1, r0);
93
-
94
-    if (0.0f == r0[0])
95
-        return false;
96
-
97
-    // eliminate first variable
98
-    m1 = r1[0] / r0[0];
99
-    m2 = r2[0] / r0[0];
100
-    m3 = r3[0] / r0[0];
101
-
102
-    s = r0[1];
103
-    r1[1] -= m1 * s;
104
-    r2[1] -= m2 * s;
105
-    r3[1] -= m3 * s;
106
-
107
-    s = r0[2];
108
-    r1[2] -= m1 * s;
109
-    r2[2] -= m2 * s;
110
-    r3[2] -= m3 * s;
111
-
112
-    s = r0[3];
113
-    r1[3] -= m1 * s;
114
-    r2[3] -= m2 * s;
115
-    r3[3] -= m3 * s;
116
-
117
-    s = r0[4];
118
-    if (s != 0.0f) {
119
-        r1[4] -= m1 * s;
120
-        r2[4] -= m2 * s;
121
-        r3[4] -= m3 * s;
122
-    }
123
-
124
-    s = r0[5];
125
-    if (s != 0.0f) {
126
-        r1[5] -= m1 * s;
127
-        r2[5] -= m2 * s;
128
-        r3[5] -= m3 * s;
129
-    }
130
-
131
-    s = r0[6];
132
-    if (s != 0.0f) {
133
-        r1[6] -= m1 * s;
134
-        r2[6] -= m2 * s;
135
-        r3[6] -= m3 * s;
136
-    }
137
-
138
-    s = r0[7];
139
-    if (s != 0.0f) {
140
-        r1[7] -= m1 * s;
141
-        r2[7] -= m2 * s;
142
-        r3[7] -= m3 * s;
143
-    }
144
-
145
-    // choose pivot or die
146
-    if (fabs(r3[1]) > fabs(r2[1]))
147
-        SWAP_ROWS(r3, r2);
148
-
149
-    if (fabs(r2[1]) > fabs(r1[1]))
150
-        SWAP_ROWS(r2, r1);
151
-
152
-    if (0.0f == r1[1])
153
-        return false;
154
-
155
-    // eliminate second variable
156
-    m2 = r2[1] / r1[1];
157
-    m3 = r3[1] / r1[1];
158
-    r2[2] -= m2 * r1[2];
159
-    r3[2] -= m3 * r1[2];
160
-    r2[3] -= m2 * r1[3];
161
-    r3[3] -= m3 * r1[3];
162
-
163
-    s = r1[4];
164
-    if (0.0f != s) {
165
-        r2[4] -= m2 * s;
166
-        r3[4] -= m3 * s;
167
-    }
168
-
169
-    s = r1[5];
170
-    if (0.0f != s) {
171
-        r2[5] -= m2 * s;
172
-        r3[5] -= m3 * s;
173
-    }
174
-
175
-    s = r1[6];
176
-    if (0.0f != s) {
177
-        r2[6] -= m2 * s;
178
-        r3[6] -= m3 * s;
179
-    }
180
-
181
-    s = r1[7];
182
-    if (0.0f != s) {
183
-        r2[7] -= m2 * s;
184
-        r3[7] -= m3 * s;
185
-    }
186
-
187
-    // choose pivot or die
188
-    if (fabs(r3[2]) > fabs(r2[2])) SWAP_ROWS(r3, r2);
189
-    if (0.0f == r2[2])  return false;
190
-
191
-    // eliminate third variable
192
-    m3 = r3[2] / r2[2];
193
-    r3[3] -= m3 * r2[3];
194
-    r3[4] -= m3 * r2[4];
195
-    r3[5] -= m3 * r2[5];
196
-    r3[6] -= m3 * r2[6];
197
-    r3[7] -= m3 * r2[7];
198
-
199
-    // last check
200
-    if (0.0f == r3[3])
201
-        return false;
202
-
203
-    s = 1.0f / r3[3]; // now back substitute row 3
204
-    r3[4] *= s;
205
-    r3[5] *= s;
206
-    r3[6] *= s;
207
-    r3[7] *= s;
208
-
209
-    m2 = r2[3]; // now back substitute row 2
210
-    s = 1.0f / r2[2];
211
-    r2[4] = s * (r2[4] - r3[4] * m2);
212
-    r2[5] = s * (r2[5] - r3[5] * m2);
213
-    r2[6] = s * (r2[6] - r3[6] * m2);
214
-    r2[7] = s * (r2[7] - r3[7] * m2);
215
-
216
-    m1 = r1[3];
217
-    r1[4] -= r3[4] * m1;
218
-    r1[5] -= r3[5] * m1;
219
-    r1[6] -= r3[6] * m1;
220
-    r1[7] -= r3[7] * m1;
221
-
222
-    m0 = r0[3];
223
-    r0[4] -= r3[4] * m0;
224
-    r0[5] -= r3[5] * m0;
225
-    r0[6] -= r3[6] * m0;
226
-    r0[7] -= r3[7] * m0;
227
-
228
-    m1 = r1[2]; // now back substitute row 1
229
-    s = 1.0f / r1[1];
230
-    r1[4] = s * (r1[4] - r2[4] * m1);
231
-    r1[5] = s * (r1[5] - r2[5] * m1);
232
-    r1[6] = s * (r1[6] - r2[6] * m1);
233
-    r1[7] = s * (r1[7] - r2[7] * m1);
234
-
235
-    m0 = r0[2];
236
-    r0[4] -= r2[4] * m0;
237
-    r0[5] -= r2[5] * m0;
238
-    r0[6] -= r2[6] * m0;
239
-    r0[7] -= r2[7] * m0;
240
-
241
-    m0 = r0[1]; // now back substitute row 0
242
-    s = 1.0f / r0[0];
243
-    r0[4] = s * (r0[4] - r1[4] * m0);
244
-    r0[5] = s * (r0[5] - r1[5] * m0);
245
-    r0[6] = s * (r0[6] - r1[6] * m0);
246
-    r0[7] = s * (r0[7] - r1[7] * m0);
247
-
248
-    MAT(out, 0, 0) = r0[4];
249
-    MAT(out, 0, 1) = r0[5];
250
-    MAT(out, 0, 2) = r0[6];
251
-    MAT(out, 0, 3) = r0[7];
252
-    MAT(out, 1, 0) = r1[4];
253
-    MAT(out, 1, 1) = r1[5];
254
-    MAT(out, 1, 2) = r1[6];
255
-    MAT(out, 1, 3) = r1[7];
256
-    MAT(out, 2, 0) = r2[4];
257
-    MAT(out, 2, 1) = r2[5];
258
-    MAT(out, 2, 2) = r2[6];
259
-    MAT(out, 2, 3) = r2[7];
260
-    MAT(out, 3, 0) = r3[4];
261
-    MAT(out, 3, 1) = r3[5];
262
-    MAT(out, 3, 2) = r3[6];
263
-    MAT(out, 3, 3) = r3[7];
264
-
265
-    return true;
266
-}
267
-
268
-void Matrix::getMatrix(float mat[16]) {
269
-    copy(mMatrix, mat);
270
-}
271
-
272
-void Matrix::getTransposeMatrix(float m[16]) {
273
-    m[ 0] = mMatrix[0]; m[ 1] = mMatrix[4]; m[ 2] = mMatrix[ 8]; m[ 3] = mMatrix[12];
274
-    m[ 4] = mMatrix[1]; m[ 5] = mMatrix[5]; m[ 6] = mMatrix[ 9]; m[ 7] = mMatrix[13];
275
-    m[ 8] = mMatrix[2]; m[ 9] = mMatrix[6]; m[10] = mMatrix[10]; m[11] = mMatrix[14];
276
-    m[12] = mMatrix[3]; m[13] = mMatrix[7]; m[14] = mMatrix[11]; m[15] = mMatrix[15];
277
-}
278
-
279
-Matrix Matrix::multiply(const Matrix& a, const Matrix& b) {
280
-    Matrix c;
281
-    multiply(a.mMatrix, b.mMatrix, c.mMatrix);
282
-    return c;
283
-}
284
-
285
-Matrix Matrix::operator *(const Matrix& a) {
286
-    return multiply(a, *this);
287
-}
288
-
289
-Vec3 Matrix::operator *(Vec3 v) {
290
-    float x = v.x, y = v.y, z = v.z;
291
-
292
-#ifdef COLUMN_ORDER
293
-    return Vec3(mMatrix[0] * x + mMatrix[4] * y + mMatrix[ 8] * z + mMatrix[12],
294
-                mMatrix[1] * x + mMatrix[5] * y + mMatrix[ 9] * z + mMatrix[13],
295
-                mMatrix[2] * x + mMatrix[6] * y + mMatrix[10] * z + mMatrix[14]);
296
-#else
297
-    return Vec3(mMatrix[0] * x + mMatrix[1] * y + mMatrix[ 2] * z + mMatrix[ 3],
298
-                mMatrix[4] * x + mMatrix[5] * y + mMatrix[ 6] * z + mMatrix[ 7],
299
-                mMatrix[8] * x + mMatrix[9] * y + mMatrix[10] * z + mMatrix[11]);
300
-#endif
301
-}
302
-
303
-void Matrix::multiply3v(float v[3], float result[3]) {
304
-    float x = v[0], y = v[1], z = v[2];
305
-
306
-    result[0] = mMatrix[0] * x + mMatrix[1] * y + mMatrix[ 2] * z + mMatrix[ 3];
307
-    result[1] = mMatrix[4] * x + mMatrix[5] * y + mMatrix[ 6] * z + mMatrix[ 7];
308
-    result[2] = mMatrix[8] * x + mMatrix[9] * y + mMatrix[10] * z + mMatrix[11];
309
-}
310
-
311
-void Matrix::multiply4v(float v[4], float result[4]) {
312
-    float x = v[0], y = v[1], z = v[2], w = v[3];
313
-
314
-    result[0] = mMatrix[ 0] * x + mMatrix[ 1] * y + mMatrix[ 2] * z + mMatrix[ 3] * w;
315
-    result[1] = mMatrix[ 4] * x + mMatrix[ 5] * y + mMatrix[ 6] * z + mMatrix[ 7] * w;
316
-    result[2] = mMatrix[ 8] * x + mMatrix[ 9] * y + mMatrix[10] * z + mMatrix[11] * w;
317
-    result[3] = mMatrix[12] * x + mMatrix[13] * y + mMatrix[14] * z + mMatrix[15] * w;
318
-}
319
-
320
-void Matrix::print() {
321
-    printf("{\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n}\n",
322
-#ifdef COLUMN_ORDER
323
-           mMatrix[0], mMatrix[4], mMatrix[ 8], mMatrix[12],
324
-           mMatrix[1], mMatrix[5], mMatrix[ 9], mMatrix[13],
325
-           mMatrix[2], mMatrix[6], mMatrix[10], mMatrix[14],
326
-           mMatrix[3], mMatrix[7], mMatrix[11], mMatrix[15]);
327
-#else
328
-           mMatrix[ 0], mMatrix[ 1], mMatrix[ 2], mMatrix[ 3],
329
-           mMatrix[ 4], mMatrix[ 5], mMatrix[ 6], mMatrix[ 7],
330
-           mMatrix[ 8], mMatrix[ 9], mMatrix[10], mMatrix[11],
331
-           mMatrix[12], mMatrix[13], mMatrix[14], mMatrix[15]);
332
-#endif
333
-}
334
-
335
-bool Matrix::isIdentity() {
336
-    if (equalEpsilon(mMatrix[ 0], 1.0) && equalEpsilon(mMatrix[ 1], 0.0)
337
-        && equalEpsilon(mMatrix[ 2], 0.0) &&
338
-        equalEpsilon(mMatrix[ 3], 0.0) && equalEpsilon(mMatrix[ 4], 0.0) && equalEpsilon(mMatrix[ 5], 1.0)
339
-        &&
340
-        equalEpsilon(mMatrix[ 6], 0.0) && equalEpsilon(mMatrix[ 7], 0.0) && equalEpsilon(mMatrix[ 8], 0.0)
341
-        &&
342
-        equalEpsilon(mMatrix[ 9], 0.0) && equalEpsilon(mMatrix[10], 1.0) && equalEpsilon(mMatrix[11], 0.0)
343
-        &&
344
-        equalEpsilon(mMatrix[12], 0.0) && equalEpsilon(mMatrix[13], 0.0) && equalEpsilon(mMatrix[14], 0.0)
345
-        &&
346
-        equalEpsilon(mMatrix[15], 1.0))
347
-        return true;
348
-
349
-    return false;
350
-}
351
-
352
-void Matrix::setMatrix(float mat[16]) {
353
-    copy(mat, mMatrix);
354
-}
355
-
356
-void Matrix::setIdentity() {
357
-    mMatrix[ 0] = 1; mMatrix[ 1] = 0; mMatrix[ 2] = 0; mMatrix[ 3] = 0;
358
-    mMatrix[ 4] = 0; mMatrix[ 5] = 1; mMatrix[ 6] = 0; mMatrix[ 7] = 0;
359
-    mMatrix[ 8] = 0; mMatrix[ 9] = 0; mMatrix[10] = 1; mMatrix[11] = 0;
360
-    mMatrix[12] = 0; mMatrix[13] = 0; mMatrix[14] = 0; mMatrix[15] = 1;
361
-}
362
-
363
-void Matrix::scale(const float* xyz) {
364
-    scale(xyz[0], xyz[1], xyz[2]);
365
-}
366
-
367
-void Matrix::scale(float sx, float sy, float sz) {
368
-    float smatrix[16];
369
-    float tmp[16];
370
-
371
-    smatrix[ 0] = sx; smatrix[ 1] = 0;  smatrix[ 2] = 0;  smatrix[ 3] = 0;
372
-    smatrix[ 4] = 0;  smatrix[ 5] = sy; smatrix[ 6] = 0;  smatrix[ 7] = 0;
373
-    smatrix[ 8] = 0;  smatrix[ 9] = 0;  smatrix[10] = sz; smatrix[11] = 0;
374
-    smatrix[12] = 0;  smatrix[13] = 0;  smatrix[14] = 0;  smatrix[15] = 1;
375
-
376
-    copy(mMatrix, tmp);
377
-    multiply(tmp, smatrix, mMatrix);
378
-}
379
-
380
-void Matrix::rotate(const float* xyz) {
381
-    rotate(xyz[0], xyz[1], xyz[2]);
382
-}
383
-
384
-void Matrix::rotate(float ax, float ay, float az) {
385
-    float xmat[16], ymat[16], zmat[16], tmp[16], tmp2[16];
386
-
387
-    xmat[ 0] = 1;         xmat[ 1] = 0;         xmat[ 2] = 0;         xmat[ 3] = 0;
388
-    xmat[ 4] = 0;         xmat[ 5] = cosf(ax);  xmat[ 6] = sinf(ax);  xmat[ 7] = 0;
389
-    xmat[ 8] = 0;         xmat[ 9] = -sinf(ax); xmat[10] = cosf(ax);  xmat[11] = 0;
390
-    xmat[12] = 0;         xmat[13] = 0;         xmat[14] = 0;         xmat[15] = 1;
391
-
392
-    ymat[ 0] = cosf(ay);  ymat[ 1] = 0;         ymat[ 2] = -sinf(ay); ymat[ 3] = 0;
393
-    ymat[ 4] = 0;         ymat[ 5] = 1;         ymat[ 6] = 0;         ymat[ 7] = 0;
394
-    ymat[ 8] = sinf(ay);  ymat[ 9] = 0;         ymat[10] = cosf(ay);  ymat[11] = 0;
395
-    ymat[12] = 0;         ymat[13] = 0;         ymat[14] = 0;         ymat[15] = 1;
396
-
397
-    zmat[ 0] = cosf(az);  zmat[ 1] = sinf(az);  zmat[ 2] = 0;         zmat[ 3] = 0;
398
-    zmat[ 4] = -sinf(az); zmat[ 5] = cosf(az);  zmat[ 6] = 0;         zmat[ 7] = 0;
399
-    zmat[ 8] = 0;         zmat[ 9] = 0;         zmat[10] = 1;         zmat[11] = 0;
400
-    zmat[12] = 0;         zmat[13] = 0;         zmat[14] = 0;         zmat[15] = 1;
401
-
402
-    multiply(mMatrix, ymat, tmp);
403
-    multiply(tmp, xmat, tmp2);
404
-    multiply(tmp2, zmat, mMatrix);
405
-}
406
-
407
-void Matrix::translate(const float* xyz) {
408
-    translate(xyz[0], xyz[1], xyz[2]);
409
-}
410
-
411
-void Matrix::translate(float tx, float ty, float tz) {
412
-    float tmat[16], tmp[16];
413
-
414
-    tmat[ 0] = 1;  tmat[ 1] = 0;  tmat[ 2] = 0;  tmat[ 3] = 0;
415
-    tmat[ 4] = 0;  tmat[ 5] = 1;  tmat[ 6] = 0;  tmat[ 7] = 0;
416
-    tmat[ 8] = 0;  tmat[ 9] = 0;  tmat[10] = 1;  tmat[11] = 0;
417
-    tmat[12] = tx; tmat[13] = ty; tmat[14] = tz; tmat[15] = 1;
418
-
419
-    copy(mMatrix, tmp);
420
-    multiply(tmp, tmat, mMatrix);
421
-}
422
-
423
-void Matrix::copy(float source[16], float dest[16]) {
424
-    for (int i = 0; i < 16; i++)
425
-        dest[i] = source[i];
426
-}
427
-
428
-void Matrix::multiply(const float a[16], const float b[16], float result[16]) {
429
-    /* Generated code for matrix mult
430
-     * Code used:
431
-
432
-    // char order is argument
433
-    int i, j, k;
434
-    if (order == 'r') {
435
-        printf("// Row order\n");
436
-    } else {
437
-        printf("// Column order\n");
438
-    }
439
-    for (i = 0; i < 4; ++i) {
440
-        for (j = 0; j < 4; ++j) {
441
-            if (order == 'r') {
442
-                printf("result[%2i] = ", j+i*4);
443
-            } else {
444
-                printf("result[%2i] = ", j+i*4);
445
-            }
446
-            for (k = 0; k < 4; ++k) {
447
-                if (order == 'r') {
448
-                    printf("a[%2i] * b[%2i]%s",
449
-                    k+i*4, j+k*4, (k == 3) ? ";\n" : " + ");
450
-                } else {
451
-                    printf("a[%2i] * b[%2i]%s",
452
-                    i+k*4, k+j*4, (k == 3) ? ";\n" : " + ");
453
-                }
454
-                //sum+=(elements[i+k*4]*m.elements[k+j*4]);
455
-            }
456
-            //result.elements[i+j*4]=sum;
457
-        }
458
-        printf("\n");
459
-    }
460
-    printf("\n");
461
-    printf("// Transpose\n");
462
-    for(i = 0; i < 4; ++i) {
463
-        for (j = 0; j < 4; ++j) {
464
-            printf("a[%2i] = b[%2i]%s",
465
-            j+i*4, i+j*4, (j == 3) ? ";\n" : "; ");
466
-        }
467
-    }
468
-
469
-     * was in test/Matrix.cpp
470
-     */
471
-#ifdef COLUMN_ORDER
472
-    /* Column order */
473
-    result[ 0] = a[ 0] * b[ 0] + a[ 4] * b[ 1] + a[ 8] * b[ 2] + a[12] * b[ 3];
474
-    result[ 1] = a[ 0] * b[ 4] + a[ 4] * b[ 5] + a[ 8] * b[ 6] + a[12] * b[ 7];
475
-    result[ 2] = a[ 0] * b[ 8] + a[ 4] * b[ 9] + a[ 8] * b[10] + a[12] * b[11];
476
-    result[ 3] = a[ 0] * b[12] + a[ 4] * b[13] + a[ 8] * b[14] + a[12] * b[15];
477
-
478
-    result[ 4] = a[ 1] * b[ 0] + a[ 5] * b[ 1] + a[ 9] * b[ 2] + a[13] * b[ 3];
479
-    result[ 5] = a[ 1] * b[ 4] + a[ 5] * b[ 5] + a[ 9] * b[ 6] + a[13] * b[ 7];
480
-    result[ 6] = a[ 1] * b[ 8] + a[ 5] * b[ 9] + a[ 9] * b[10] + a[13] * b[11];
481
-    result[ 7] = a[ 1] * b[12] + a[ 5] * b[13] + a[ 9] * b[14] + a[13] * b[15];
482
-
483
-    result[ 8] = a[ 2] * b[ 0] + a[ 6] * b[ 1] + a[10] * b[ 2] + a[14] * b[ 3];
484
-    result[ 9] = a[ 2] * b[ 4] + a[ 6] * b[ 5] + a[10] * b[ 6] + a[14] * b[ 7];
485
-    result[10] = a[ 2] * b[ 8] + a[ 6] * b[ 9] + a[10] * b[10] + a[14] * b[11];
486
-    result[11] = a[ 2] * b[12] + a[ 6] * b[13] + a[10] * b[14] + a[14] * b[15];
487
-
488
-    result[12] = a[ 3] * b[ 0] + a[ 7] * b[ 1] + a[11] * b[ 2] + a[15] * b[ 3];
489
-    result[13] = a[ 3] * b[ 4] + a[ 7] * b[ 5] + a[11] * b[ 6] + a[15] * b[ 7];
490
-    result[14] = a[ 3] * b[ 8] + a[ 7] * b[ 9] + a[11] * b[10] + a[15] * b[11];
491
-    result[15] = a[ 3] * b[12] + a[ 7] * b[13] + a[11] * b[14] + a[15] * b[15];
492
-#else
493
-    /* Row order */
494
-    result[ 0] = a[ 0] * b[ 0] + a[ 1] * b[ 4] + a[ 2] * b[ 8] + a[ 3] * b[12];
495
-    result[ 1] = a[ 0] * b[ 1] + a[ 1] * b[ 5] + a[ 2] * b[ 9] + a[ 3] * b[13];
496
-    result[ 2] = a[ 0] * b[ 2] + a[ 1] * b[ 6] + a[ 2] * b[10] + a[ 3] * b[14];
497
-    result[ 3] = a[ 0] * b[ 3] + a[ 1] * b[ 7] + a[ 2] * b[11] + a[ 3] * b[15];
498
-
499
-    result[ 4] = a[ 4] * b[ 0] + a[ 5] * b[ 4] + a[ 6] * b[ 8] + a[ 7] * b[12];
500
-    result[ 5] = a[ 4] * b[ 1] + a[ 5] * b[ 5] + a[ 6] * b[ 9] + a[ 7] * b[13];
501
-    result[ 6] = a[ 4] * b[ 2] + a[ 5] * b[ 6] + a[ 6] * b[10] + a[ 7] * b[14];
502
-    result[ 7] = a[ 4] * b[ 3] + a[ 5] * b[ 7] + a[ 6] * b[11] + a[ 7] * b[15];
503
-
504
-    result[ 8] = a[ 8] * b[ 0] + a[ 9] * b[ 4] + a[10] * b[ 8] + a[11] * b[12];
505
-    result[ 9] = a[ 8] * b[ 1] + a[ 9] * b[ 5] + a[10] * b[ 9] + a[11] * b[13];
506
-    result[10] = a[ 8] * b[ 2] + a[ 9] * b[ 6] + a[10] * b[10] + a[11] * b[14];
507
-    result[11] = a[ 8] * b[ 3] + a[ 9] * b[ 7] + a[10] * b[11] + a[11] * b[15];
508
-
509
-    result[12] = a[12] * b[ 0] + a[13] * b[ 4] + a[14] * b[ 8] + a[15] * b[12];
510
-    result[13] = a[12] * b[ 1] + a[13] * b[ 5] + a[14] * b[ 9] + a[15] * b[13];
511
-    result[14] = a[12] * b[ 2] + a[13] * b[ 6] + a[14] * b[10] + a[15] * b[14];
512
-    result[15] = a[12] * b[ 3] + a[13] * b[ 7] + a[14] * b[11] + a[15] * b[15];
513
-#endif
514
-}
515
-

+ 0
- 290
src/math/Quaternion.cpp View File

@@ -1,290 +0,0 @@
1
-/*!
2
- * \file src/math/Quaternion.cpp
3
- * \brief Quaternion
4
- *
5
- * \author Mongoose
6
- */
7
-
8
-#include <math.h>
9
-
10
-#include "global.h"
11
-#include "math/Quaternion.h"
12
-
13
-Quaternion::Quaternion() {
14
-    mW = 0;
15
-    mX = 0;
16
-    mY = 0;
17
-    mZ = 0;
18
-}
19
-
20
-Quaternion::Quaternion(float w, float x, float y, float z) {
21
-    mW = w;
22
-    mX = x;
23
-    mY = y;
24
-    mZ = z;
25
-}
26
-
27
-Quaternion::Quaternion(float v[4]) {
28
-    mW = v[0];
29
-    mX = v[1];
30
-    mY = v[2];
31
-    mZ = v[3];
32
-}
33
-
34
-void Quaternion::getMatrix(float m[16]) {
35
-    m[ 0] = 1.0f - 2.0f * (mY * mY + mZ * mZ);
36
-    m[ 1] = 2.0f * (mX * mY - mW * mZ);
37
-    m[ 2] = 2.0f * (mX * mZ + mW * mY);
38
-    m[ 3] = 0.0f;
39
-
40
-    m[ 4] = 2.0f * (mX * mY + mW * mZ);
41
-    m[ 5] = 1.0f - 2.0f * (mX * mX + mZ * mZ);
42
-    m[ 6] = 2.0f * (mY * mZ - mW * mX);
43
-    m[ 7] = 0.0f;
44
-
45
-    m[ 8] = 2.0f * (mX * mZ - mW * mY);
46
-    m[ 9] = 2.0f * (mY * mZ + mW * mX);
47
-    m[10] = 1.0f - 2.0f * (mX * mX + mY * mY);
48
-    m[11] = 0.0f;
49
-
50
-    m[12] = 0.0f;
51
-    m[13] = 0.0f;
52
-    m[14] = 0.0f;
53
-    m[15] = 1.0f;
54
-}
55
-
56
-Quaternion Quaternion::operator *(const Quaternion& q) {
57
-    return multiply(*this, q);
58
-}
59
-
60
-Quaternion Quaternion::operator /(const Quaternion& q) {
61
-    return divide(*this, q);
62
-}
63
-
64
-Quaternion Quaternion::operator +(const Quaternion& q) {
65
-    return add(*this, q);
66
-}
67
-
68
-Quaternion Quaternion::operator -(const Quaternion& q) {
69
-    return subtract(*this, q);
70
-}
71
-
72
-bool Quaternion::operator ==(const Quaternion& q) {
73
-    //return (mX == q.mX && mY == q.mY && mZ == q.mZ && mW == q.mW);
74
-    return (equalEpsilon(mX, q.mX) && equalEpsilon(mY, q.mY) &&
75
-            equalEpsilon(mZ, q.mZ) && equalEpsilon(mW, q.mW));
76
-}
77
-
78
-Quaternion Quaternion::conjugate() {
79
-    return Quaternion(mW, -mX, -mY, -mZ);
80
-}
81
-
82
-Quaternion Quaternion::scale(float s) {
83
-    return Quaternion(mW * s, mX * s, mY * s, mZ * s);
84
-}
85
-
86
-Quaternion Quaternion::inverse() {
87
-    return conjugate().scale(1 / magnitude());
88
-}
89
-
90
-float Quaternion::dot(Quaternion a, Quaternion b) {
91
-    return ((a.mW * b.mW) + (a.mX * b.mX) + (a.mY * b.mY) + (a.mZ * b.mZ));
92
-}
93
-
94
-float Quaternion::magnitude() {
95
-    return sqrtf(dot(*this, *this));
96
-}
97
-
98
-void Quaternion::setIdentity() {
99
-    mW = 1.0;
100
-    mX = 0.0;
101
-    mY = 0.0;
102
-    mZ = 0.0;
103
-}
104
-
105
-void Quaternion::set(float angle, float x, float y, float z) {
106
-    float temp, dist;
107
-
108
-    // Normalize
109
-    temp = x * x + y * y + z * z;
110
-
111
-    dist = 1.0f / sqrtf(temp);
112
-
113
-    x *= dist;
114
-    y *= dist;
115
-    z *= dist;
116
-
117
-    mX = x;
118
-    mY = y;
119
-    mZ = z;
120
-
121
-    mW = cosf(angle / 2.0f);
122
-}
123
-
124
-void Quaternion::normalize() {
125
-    float dist, square;
126
-
127
-    square = mX * mX + mY * mY + mZ * mZ + mW * mW;
128
-
129
-    if (square > 0.0) {
130
-        dist = 1.0f / sqrtf(square);
131
-    } else {
132
-        dist = 1;
133
-    }
134
-
135
-    mX *= dist;
136
-    mY *= dist;
137
-    mZ *= dist;
138
-    mW *= dist;
139
-}
140
-
141
-void Quaternion::copy(Quaternion q) {
142
-    mW = q.mW;
143
-    mX = q.mX;
144
-    mY = q.mY;
145
-    mZ = q.mZ;
146
-}
147
-
148
-Quaternion Quaternion::slerp(Quaternion a, Quaternion b, float time) {
149
-    /*******************************************************************
150
-     * Spherical Linear Interpolation algorthim
151
-     *-----------------------------------------------------------------
152
-     *
153
-     * Interpolate between A and B rotations ( Find qI )
154
-     *
155
-     * qI = (((qB . qA)^ -1)^ Time) qA
156
-     *
157
-     * http://www.magic-software.com/Documentation/quat.pdf
158
-     *
159
-     * Thanks to digiben for algorithms and basis of the notes in
160
-     * this func
161
-     *
162
-     *******************************************************************/
163
-
164
-    float result, scaleA, scaleB;
165
-    Quaternion i;
166
-
167
-
168
-    // Don't bother if it's the same rotation, it's the same as the result
169
-    if (a == b)
170
-        return a;
171
-
172
-    // A . B
173
-    result = dot(a, b);
174
-
175
-    // If the dot product is less than 0, the angle is greater than 90 degrees
176
-    if (result < 0.0f) {
177
-        // Negate quaternion B and the result of the dot product
178
-        b = Quaternion(-b.mW, -b.mX, -b.mY, -b.mZ);
179
-        result = -result;
180
-    }
181
-
182
-    // Set the first and second scale for the interpolation
183
-    scaleA = 1 - time;
184
-    scaleB = time;
185
-
186
-    // Next, we want to actually calculate the spherical interpolation.  Since this
187
-    // calculation is quite computationally expensive, we want to only perform it
188
-    // if the angle between the 2 quaternions is large enough to warrant it.  If the
189
-    // angle is fairly small, we can actually just do a simpler linear interpolation
190
-    // of the 2 quaternions, and skip all the complex math.  We create a "delta" value
191
-    // of 0.1 to say that if the cosine of the angle (result of the dot product) between
192
-    // the 2 quaternions is smaller than 0.1, then we do NOT want to perform the full on
193
-    // interpolation using.  This is because you won't really notice the difference.
194
-
195
-    // Check if the angle between the 2 quaternions was big enough
196
-    // to warrant such calculations
197
-    if (1 - result > 0.1f) {
198
-        // Get the angle between the 2 quaternions, and then
199
-        // store the sin() of that angle
200
-        float theta = (float)acos(result);
201
-        float sinTheta = (float)sin(theta);
202
-
203
-        // Calculate the scale for qA and qB, according to
204
-        // the angle and it's sine value
205
-        scaleA = (float)sin((1 - time) * theta) / sinTheta;
206
-        scaleB = (float)sin((time * theta)) / sinTheta;
207
-    }
208
-
209
-    // Calculate the x, y, z and w values for the quaternion by using a special
210
-    // form of linear interpolation for quaternions.
211
-    return (a.scale(scaleA) + b.scale(scaleB));
212
-}
213
-
214
-void Quaternion::setByMatrix(float matrix[16]) {
215
-    float diagonal = matrix[0] + matrix[5] + matrix[10] + 1.0f;
216
-    float scale = 0.0f;
217
-    float w = 0.0f, x = 0.0f, y = 0.0f, z = 0.0f;
218
-
219
-    if (diagonal > 0.00000001) {
220
-        // Calculate the scale of the diagonal
221
-        scale = (float)(sqrt(diagonal) * 2);
222
-
223
-        w = 0.25f * scale;
224
-        x = (matrix[9] - matrix[6]) / scale;
225
-        y = (matrix[2] - matrix[8]) / scale;
226
-        z = (matrix[4] - matrix[1]) / scale;
227
-    } else {
228
-        // If the first element of the diagonal is the greatest value
229
-        if (matrix[0] > matrix[5] && matrix[0] > matrix[10]) {
230
-            // Find the scale according to the first element, and double it
231
-            scale = (float)sqrt(1.0f + matrix[0] - matrix[5] - matrix[10]) * 2.0f;
232
-
233
-            // Calculate the quaternion
234
-            w = (matrix[9] - matrix[6]) / scale;
235
-            x = 0.25f * scale;
236
-            y = (matrix[4] + matrix[1]) / scale;
237
-            z = (matrix[2] + matrix[8]) / scale;
238
-        } else if (matrix[5] > matrix[10]) {
239
-            // The second element of the diagonal is the greatest value
240
-            // Find the scale according to the second element, and double it
241
-            scale = (float)sqrt(1.0f + matrix[5] - matrix[0] - matrix[10]) * 2.0f;
242
-
243
-            // Calculate the quaternion
244
-            w = (matrix[2] - matrix[8]) / scale;
245
-            x = (matrix[4] + matrix[1]) / scale;
246
-            y = 0.25f * scale;
247
-            z = (matrix[9] + matrix[6]) / scale;
248
-        } else { // The third element of the diagonal is the greatest value
249
-            // Find the scale according to the third element, and double it
250
-            scale = (float)sqrt(1.0f + matrix[10] - matrix[0] - matrix[5]) * 2.0f;
251
-
252
-            // Calculate the quaternion
253
-            w = (matrix[4] - matrix[1]) / scale;
254
-            x = (matrix[2] + matrix[8]) / scale;
255
-            y = (matrix[9] + matrix[6]) / scale;
256
-            z = 0.25f * scale;
257
-        }
258
-    }
259
-
260
-    mW = w;
261
-    mX = x;
262
-    mY = y;
263
-    mZ = z;
264
-}
265
-
266
-Quaternion Quaternion::multiply(Quaternion a, Quaternion b) {
267
-    return Quaternion(a.mW * b.mW - a.mX * b.mX - a.mY * b.mY - a.mZ * b.mZ,
268
-                      a.mW * b.mX + a.mX * b.mW + a.mY * b.mZ - a.mZ * b.mY,
269
-                      a.mW * b.mY + a.mY * b.mW + a.mZ * b.mX - a.mX * b.mZ,
270
-                      a.mW * b.mZ + a.mZ * b.mW + a.mX * b.mY - a.mY * b.mX);
271
-}
272
-
273
-Quaternion Quaternion::divide(Quaternion a, Quaternion b) {
274
-    return (a * (b.inverse()));
275
-}
276
-
277
-Quaternion Quaternion::add(Quaternion a, Quaternion b) {
278
-    return Quaternion(a.mW + b.mW,
279
-                      a.mX + b.mX,
280
-                      a.mY + b.mY,
281
-                      a.mZ + b.mZ);
282
-}
283
-
284
-Quaternion Quaternion::subtract(Quaternion a, Quaternion b) {
285
-    return Quaternion(a.mW - b.mW,
286
-                      a.mX - b.mX,
287
-                      a.mY - b.mY,
288
-                      a.mZ - b.mZ);
289
-}
290
-

+ 0
- 118
src/math/Vec3.cpp View File

@@ -1,118 +0,0 @@
1
-/*!
2
- * \file src/math/Vec3.cpp
3
- * \brief 3D Math vector
4
- *
5
- * \author Mongoose
6
- */
7
-
8
-#include <math.h>
9
-
10
-#include "global.h"
11
-#include "math/Vec3.h"
12
-
13
-Vec3::Vec3(float _x, float _y, float _z) {
14
-    x = _x;
15
-    y = _y;
16
-    z = _z;
17
-}
18
-
19
-Vec3::Vec3(float v[3]) {
20
-    assert(v != nullptr);
21
-    x = v[0];
22
-    y = v[1];
23
-    z = v[2];
24
-}
25
-
26
-float Vec3::magnitude() {
27
-    return sqrtf(x * x + y * y + z * z);
28
-}
29
-
30
-void Vec3::normalize() {
31
-    float norm = magnitude();
32
-    x /= norm;
33
-    y /= norm;
34
-    z /= norm;
35
-}
36
-
37
-Vec3 Vec3::unit() {
38
-    float norm = magnitude();
39
-    return Vec3(x / norm,
40
-                y / norm,
41
-                z / norm);
42
-}
43
-
44
-Vec3 Vec3::operator +(const Vec3& v) {
45
-    return Vec3(x + v.x,
46
-                y + v.y,
47
-                z + v.z);
48
-}
49
-
50
-Vec3 Vec3::operator -(const Vec3& v) {
51
-    return Vec3(x - v.x,
52
-                y - v.y,
53
-                z - v.z);
54
-}
55
-
56
-Vec3 Vec3::operator -() {
57
-    return Vec3(-x,
58
-                -y,
59
-                -z);
60
-}
61
-
62
-Vec3 Vec3::operator *(float s) {
63
-    return Vec3(s * x,
64
-                s * y,
65
-                s * z);
66
-}
67
-
68
-Vec3 Vec3::operator /(float s) {
69
-    return Vec3(x / s,
70
-                y / s,
71
-                z / s);
72
-}
73
-
74
-float Vec3::operator *(const Vec3& v) {
75
-    return dot(*this, v);
76
-}
77
-
78
-Vec3& Vec3::operator +=(const Vec3& v) {
79
-    x += v.x;
80
-    y += v.y;
81
-    z += v.z;
82
-    return *this;
83
-}
84
-
85
-Vec3& Vec3::operator -=(const Vec3& v) {
86
-    x -= v.x;
87
-    y -= v.y;
88
-    z -= v.z;
89
-    return *this;
90
-}
91
-
92
-Vec3& Vec3::operator *=(float s) {
93
-    x *= s;
94
-    y *= s;
95
-    z *= s;
96
-    return *this;
97
-}
98
-
99
-bool Vec3::operator ==(const Vec3& v) {
100
-    return equalEpsilon(x, v.x)
101
-           && equalEpsilon(y, v.y)
102
-           && equalEpsilon(z, v.z);
103
-}
104
-
105
-bool Vec3::operator !=(const Vec3& v) {
106
-    return !((*this) == v);
107
-}
108
-
109
-float Vec3::dot(const Vec3& u, const Vec3& v) {
110
-    return (u.x * v.x + u.y * v.y + u.z * v.z);
111
-}
112
-
113
-Vec3 Vec3::cross(const Vec3& u, const Vec3& v) {
114
-    return Vec3(u.y * v.z - u.z * v.y,
115
-                u.z * v.x - u.x * v.z,
116
-                u.x * v.y - u.y * v.x);
117
-}
118
-

+ 0
- 94
src/math/math.cpp View File

@@ -1,94 +0,0 @@
1
-/*!
2
- *
3
- * \file src/math/math.cpp
4
- * \brief Vector and Matrix math
5
- *
6
- * \author Mongoose
7
- * \author xythobuz
8
- */
9
-
10
-#include <cstdlib>
11
-#include <cmath>
12
-#include <float.h>
13
-#include <algorithm>
14
-
15
-#include "global.h"
16
-#include "math/Vec3.h"
17
-#include "math/Matrix.h"
18
-#include "math/math.h"
19
-
20
-bool equalEpsilon(float a, float b) {
21
-    float epsilon = FLT_EPSILON;
22
-    if (fabs(a - b) <= (std::max(fabs(a), fabs(b)) * epsilon))
23
-        return true;
24
-    return false;
25
-}
26
-
27
-int intersectionLinePolygon(float intersect[3],
28
-                            float p1[3], float p2[3], float polygon[3][3]) {
29
-    assert(polygon != NULL);
30
-
31
-    // float normal[3], a[3], b[3];
32
-    Vec3 a, b, normal, pA, pB;
33
-    float d, denominator, mu;
34
-
35
-
36
-    pA = Vec3(p1);
37
-    pB = Vec3(p2);
38
-
39
-    // Find normal
40
-    a = Vec3(polygon[1]) - Vec3(polygon[0]);
41
-    b = Vec3(polygon[2]) - Vec3(polygon[0]);
42
-    normal = Vec3::cross(a, b);
43
-    normal.normalize();
44
-
45
-    // find D
46
-    d = (normal.x * polygon[0][0] -
47
-         normal.y * polygon[0][1] -
48
-         normal.z * polygon[0][2]);
49
-
50
-    // line segment parallel to plane?
51
-    a = pB - pA;
52
-
53
-    denominator = Vec3::dot(normal, a);
54
-
55
-    if (denominator > 0.0)
56
-        return 0;
57
-
58
-    // Line segment contains intercept point?
59
-    mu = -((d + Vec3::dot(normal, pA)) / denominator);
60
-
61
-    if (mu < 0.0 || mu > 1.0)
62
-        return 0;
63
-
64
-    b = pA + (a * mu);
65
-    intersect[0] = b.x;
66
-    intersect[1] = b.y;
67
-    intersect[2] = b.z;
68
-
69
-    // See if the intercept is bound by polygon by winding number
70
-    // assume convex polygons here for sure
71
-    double theta = Vec3::dot(b - Vec3(polygon[0]), normal); // b = intersect
72
-
73
-    if (theta >= 90.0) // Yeah I know
74
-        return 0;
75
-
76
-    return 1;
77
-}
78
-
79
-float distance(const float a[3], const float b[3]) {
80
-    return sqrtf(((b[0] - a[0]) * (b[0] - a[0])) +
81
-                 ((b[1] - a[1]) * (b[1] - a[1])) +
82
-                 ((b[2] - a[2]) * (b[2] - a[2])));
83
-}
84
-
85
-void midpoint(const float a[3], const float b[3], float mid[3]) {
86
-    mid[0] = (a[0] + b[0]) / 2.0f;
87
-    mid[1] = (a[1] + b[1]) / 2.0f;
88
-    mid[2] = (a[2] + b[2]) / 2.0f;
89
-}
90
-
91
-float randomNum(float from, float to) {
92
-    return from + ((to - from) * rand() / (RAND_MAX + 1.0f));
93
-}
94
-

+ 18
- 11
src/system/FontImGui.cpp View File

@@ -13,11 +13,10 @@
13 13
 #define SCALE_DRAW 20.0f
14 14
 
15 15
 unsigned int FontImGui::widthText(float scale, std::string s) {
16
-    //ImGuiIO& io = ImGui::GetIO();
17
-    //ImVec2 size = io.Font->CalcTextSizeA(scale * SCALE_CALC, io.DisplaySize.y, s.c_str(),
18
-    //                                     s.c_str() + s.length());
19
-    //return size.y;
20
-    return s.length() * 15;
16
+    ImGuiIO& io = ImGui::GetIO();
17
+    ImVec2 size = io.Font->CalcTextSizeA(scale * SCALE_CALC, FLT_MAX, io.DisplaySize.y, s.c_str(),
18
+                                         s.c_str() + s.length());
19
+    return size.y;
21 20
 }
22 21
 
23 22
 void FontImGui::drawText(unsigned int x, unsigned int y, float scale,
@@ -35,15 +34,23 @@ void FontImGui::drawText(unsigned int x, unsigned int y, float scale,
35 34
 }
36 35
 
37 36
 unsigned int FontImGui::heightText(float scale, unsigned int maxWidth, std::string s) {
38
-    //ImGuiIO& io = ImGui::GetIO();
39
-    //ImVec2 size = io.Font->CalcTextSizeA(scale * SCALE_CALC, maxWidth, s.c_str(),
40
-    //                                     s.c_str() + s.length());
41
-    //return size.x;
42
-    return 15;
37
+    ImGuiIO& io = ImGui::GetIO();
38
+    ImVec2 size = io.Font->CalcTextSizeA(scale * SCALE_CALC, FLT_MAX, maxWidth, s.c_str(),
39
+                                         s.c_str() + s.length());
40
+    return size.x;
43 41
 }
44 42
 
45 43
 void FontImGui::drawTextWrapped(unsigned int x, unsigned int y, float scale,
46 44
                                 const unsigned char color[4], unsigned int maxWidth, std::string s) {
47
-    drawText(x, y, scale, color, s);
45
+    ImGuiIO& io = ImGui::GetIO();
46
+    ImVec2 pos = ImVec2(x, y);
47
+    ImU32 col = color[0] | (color[1] << 8) | (color[2] << 16) | (color[3] << 24);
48
+
49
+    ImDrawList dl;
50
+    dl.PushClipRect(ImVec4(0.0f, 0.0f, io.DisplaySize.x, io.DisplaySize.y));
51
+    dl.AddText(io.Font, scale * SCALE_DRAW, pos, col, s.c_str(), s.c_str() + s.length(), maxWidth);
52
+
53
+    ImDrawList* dlp = &dl;
54
+    UI::renderImGui(&dlp, 1);
48 55
 }
49 56
 

+ 59
- 53
src/system/FontSDL.cpp View File

@@ -8,11 +8,13 @@
8 8
 #include <iostream>
9 9
 
10 10
 #include "global.h"
11
+#include "TextureManager.h"
12
+#include "system/Window.h"
11 13
 #include "system/FontSDL.h"
12 14
 
13 15
 bool FontSDL::mFontInit = false;
14 16
 TTF_Font* FontSDL::mFont = nullptr;
15
-unsigned int FontSDL::mFontTexture = 0;
17
+unsigned int FontSDL::mFontTexture = -1;
16 18
 
17 19
 void FontSDL::shutdown() {
18 20
     if (mFont != nullptr)
@@ -21,7 +23,6 @@ void FontSDL::shutdown() {
21 23
 
22 24
     if (mFontInit) {
23 25
         TTF_Quit();
24
-        glDeleteTextures(1, &mFontTexture);
25 26
         mFontInit = false;
26 27
     }
27 28
 }
@@ -33,7 +34,10 @@ int FontSDL::initialize(std::string font) {
33 34
             return -1;
34 35
         }
35 36
 
36
-        glGenTextures(1, &mFontTexture);
37
+        // Reserve slot
38
+        mFontTexture = getTextureManager().loadBufferSlot(nullptr, 256, 256,
39
+                TextureManager::ColorMode::RGBA, 32, TextureManager::TextureStorage::SYSTEM);
40
+
37 41
         mFontInit = true;
38 42
     }
39 43
 
@@ -82,46 +86,47 @@ void FontSDL::drawText(unsigned int x, unsigned int y, float scale,
82 86
     int w = (int)((float)surface->w * scale);
83 87
     int h = (int)((float)surface->h * scale);
84 88
 
85
-    GLenum textureFormat;
89
+    TextureManager::ColorMode textureFormat;
90
+    unsigned int bpp = 0;
86 91
     if (surface->format->BytesPerPixel == 4) {
87 92
         if (surface->format->Rmask == 0x000000FF)
88
-            textureFormat = GL_RGBA;
93
+            textureFormat = TextureManager::ColorMode::RGBA;
89 94
         else
90
-            textureFormat = GL_BGRA_EXT;
95
+            textureFormat = TextureManager::ColorMode::BGRA;
96
+        bpp = 32;
91 97
     } else {
92 98
         if (surface->format->Rmask == 0x000000FF)
93
-            textureFormat = GL_RGB;
99
+            textureFormat = TextureManager::ColorMode::RGB;
94 100
         else
95
-            textureFormat = GL_BGR_EXT;
101
+            textureFormat = TextureManager::ColorMode::BGR;
102
+        bpp = 24;
96 103
     }
97 104
 
98
-    glBindTexture(GL_TEXTURE_2D, mFontTexture);
99
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
100
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
101
-    glTexImage2D(GL_TEXTURE_2D, 0, surface->format->BytesPerPixel, surface->w, surface->h, 0,
102
-                 textureFormat, GL_UNSIGNED_BYTE, surface->pixels);
105
+    getTextureManager().loadBufferSlot(static_cast<unsigned char*>(surface->pixels),
106
+                                       surface->w, surface->h, textureFormat, bpp,
107
+                                       TextureManager::TextureStorage::SYSTEM, mFontTexture);
103 108
     SDL_FreeSurface(surface);
104 109
 
105
-    GLuint xMin = x;
106
-    GLuint yMin = y;
107
-    GLuint xMax = xMin + w;
108
-    GLuint yMax = yMin + h;
110
+    std::vector<glm::vec2> vertices;
111
+    std::vector<glm::vec2> uvs;
109 112
 
110
-    glColor4ubv(color);
113
+    vertices.push_back(glm::vec2(x, y + h));
114
+    vertices.push_back(glm::vec2(x, y));
115
+    vertices.push_back(glm::vec2(x + w, y + h));
111 116
 
112
-    glBegin(GL_QUADS);
113
-    glTexCoord2f(0.0f, 0.0f);
114
-    glVertex2i(xMin, yMin);
117
+    vertices.push_back(glm::vec2(x + w, y));
118
+    vertices.push_back(glm::vec2(x + w, y + h));
119
+    vertices.push_back(glm::vec2(x, y));
115 120
 
116
-    glTexCoord2f(0.0f, 1.0f);
117
-    glVertex2i(xMin, yMax);
121
+    uvs.push_back(glm::vec2(0.0f, 1.0f));
122
+    uvs.push_back(glm::vec2(0.0f, 0.0f));
123
+    uvs.push_back(glm::vec2(1.0f, 1.0f));
118 124
 
119
-    glTexCoord2f(1.0f, 1.0f);
120
-    glVertex2i(xMax, yMax);
125
+    uvs.push_back(glm::vec2(1.0f, 0.0f));
126
+    uvs.push_back(glm::vec2(1.0f, 1.0f));
127
+    uvs.push_back(glm::vec2(0.0f, 0.0f));
121 128
 
122
-    glTexCoord2f(1.0f, 0.0f);
123
-    glVertex2i(xMax, yMin);
124
-    glEnd();
129
+    Window::drawTextGL(vertices, uvs, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f), mFontTexture);
125 130
 }
126 131
 
127 132
 unsigned int FontSDL::heightText(float scale, unsigned int maxWidth, std::string s) {
@@ -163,45 +168,46 @@ void FontSDL::drawTextWrapped(unsigned int x, unsigned int y, float scale,
163 168
     int w = (int)((float)surface->w * scale);
164 169
     int h = (int)((float)surface->h * scale);
165 170
 
166
-    GLenum textureFormat;
171
+    TextureManager::ColorMode textureFormat;
172
+    unsigned int bpp = 0;
167 173
     if (surface->format->BytesPerPixel == 4) {
168 174
         if (surface->format->Rmask == 0x000000FF)
169
-            textureFormat = GL_RGBA;
175
+            textureFormat = TextureManager::ColorMode::RGBA;
170 176
         else
171
-            textureFormat = GL_BGRA_EXT;
177
+            textureFormat = TextureManager::ColorMode::BGRA;
178
+        bpp = 32;
172 179
     } else {
173 180
         if (surface->format->Rmask == 0x000000FF)
174
-            textureFormat = GL_RGB;
181
+            textureFormat = TextureManager::ColorMode::RGB;
175 182
         else
176
-            textureFormat = GL_BGR_EXT;
183
+            textureFormat = TextureManager::ColorMode::BGR;
184
+        bpp = 24;
177 185
     }
178 186
 
179
-    glBindTexture(GL_TEXTURE_2D, mFontTexture);
180
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
181
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
182
-    glTexImage2D(GL_TEXTURE_2D, 0, surface->format->BytesPerPixel, surface->w, surface->h, 0,
183
-                 textureFormat, GL_UNSIGNED_BYTE, surface->pixels);
187
+    getTextureManager().loadBufferSlot(static_cast<unsigned char*>(surface->pixels),
188
+                                       surface->w, surface->h, textureFormat, bpp,
189
+                                       TextureManager::TextureStorage::SYSTEM, mFontTexture);
184 190
     SDL_FreeSurface(surface);
185 191
 
186
-    GLuint xMin = x;
187
-    GLuint yMin = y;
188
-    GLuint xMax = xMin + w;
189
-    GLuint yMax = yMin + h;
192
+    std::vector<glm::vec2> vertices;
193
+    std::vector<glm::vec2> uvs;
190 194
 
191
-    glColor4ubv(color);
195
+    vertices.push_back(glm::vec2(x, y + h));
196
+    vertices.push_back(glm::vec2(x, y));
197
+    vertices.push_back(glm::vec2(x + w, y + h));
192 198
 
193
-    glBegin(GL_QUADS);
194
-    glTexCoord2f(0.0f, 0.0f);
195
-    glVertex2i(xMin, yMin);
199
+    vertices.push_back(glm::vec2(x + w, y));
200
+    vertices.push_back(glm::vec2(x + w, y + h));
201
+    vertices.push_back(glm::vec2(x, y));
196 202
 
197
-    glTexCoord2f(0.0f, 1.0f);
198
-    glVertex2i(xMin, yMax);
203
+    uvs.push_back(glm::vec2(0.0f, 1.0f));
204
+    uvs.push_back(glm::vec2(0.0f, 0.0f));
205
+    uvs.push_back(glm::vec2(1.0f, 1.0f));
199 206
 
200
-    glTexCoord2f(1.0f, 1.0f);
201
-    glVertex2i(xMax, yMax);
207
+    uvs.push_back(glm::vec2(1.0f, 0.0f));
208
+    uvs.push_back(glm::vec2(1.0f, 1.0f));
209
+    uvs.push_back(glm::vec2(0.0f, 0.0f));
202 210
 
203
-    glTexCoord2f(1.0f, 0.0f);
204
-    glVertex2i(xMax, yMin);
205
-    glEnd();
211
+    Window::drawTextGL(vertices, uvs, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f), mFontTexture);
206 212
 }
207 213
 

+ 40
- 34
src/system/FontTRLE.cpp View File

@@ -11,7 +11,9 @@
11 11
 #include <stdexcept>
12 12
 
13 13
 #include "global.h"
14
+#include "TextureManager.h"
14 15
 #include "utils/strings.h"
16
+#include "system/Window.h"
15 17
 #include "system/FontTRLE.h"
16 18
 
17 19
 #define SCALING 2.0f
@@ -21,8 +23,6 @@ unsigned int FontTRLE::mFontTexture = 0;
21 23
 int FontTRLE::offsets[106][5];
22 24
 
23 25
 void FontTRLE::shutdown() {
24
-    if (mFontInit)
25
-        glDeleteTextures(1, &mFontTexture);
26 26
 }
27 27
 
28 28
 int FontTRLE::initialize(std::string font) {
@@ -46,12 +46,8 @@ int FontTRLE::initialize(std::string font) {
46 46
         pixels[i] = pixels[i + 1] = pixels[i + 2] = (unsigned char)y;
47 47
     }
48 48
 
49
-    // ...into GL texture
50
-    glGenTextures(1, &mFontTexture);
51
-    glBindTexture(GL_TEXTURE_2D, mFontTexture);
52
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
53
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
54
-    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
49
+    mFontTexture = getTextureManager().loadBufferSlot(pixels, 256, 256,
50
+            TextureManager::ColorMode::BGRA, 32, TextureManager::TextureStorage::SYSTEM);
55 51
     delete [] pixels;
56 52
 
57 53
     // Try to load .lps file or use default glyph positions
@@ -69,8 +65,6 @@ void FontTRLE::loadLPS(std::string f) {
69 65
         return;
70 66
     }
71 67
 
72
-    //! \todo This is probably the worlds most unreliable parser...
73
-
74 68
     for (std::string line; std::getline(file, line);) {
75 69
         std::istringstream stream(line);
76 70
         int index;
@@ -93,19 +87,19 @@ void FontTRLE::loadLPS(std::string f) {
93 87
     }
94 88
 }
95 89
 
96
-void FontTRLE::writeChar(unsigned int index, unsigned int xDraw, unsigned int yDraw,
97
-                         float scale, const unsigned char color[4]) {
90
+void FontTRLE::writeChar(unsigned int index, unsigned int xDraw, unsigned int yDraw, float scale,
91
+                         std::vector<glm::vec2>& vertices, std::vector<glm::vec2>& uvs) {
98 92
     assert(mFontInit == true);
99 93
 
100
-    int width = (int)(((float)offsets[index][2]) * scale * SCALING);
101
-    int height = (int)(((float)offsets[index][3]) * scale * SCALING);
102
-    int offset = (int)(((float)offsets[index][4]) * scale * SCALING);
94
+    float width = ((float)offsets[index][2]) * scale * SCALING;
95
+    float height = ((float)offsets[index][3]) * scale * SCALING;
96
+    float offset = ((float)offsets[index][4]) * scale * SCALING;
103 97
 
104 98
     // screen coordinates
105
-    int xMin = xDraw;
106
-    int yMin = ((int)yDraw) + offset + (int)(10.0f * scale * SCALING);
107
-    int xMax = xMin + width;
108
-    int yMax = yMin + height;
99
+    float xMin = xDraw;
100
+    float yMin = yDraw + offset + (10.0f * scale * SCALING);
101
+    float xMax = xMin + width;
102
+    float yMax = yMin + height;
109 103
 
110 104
     // texture part
111 105
     float txMin = ((float)offsets[index][0]) / 256.0f;
@@ -113,19 +107,21 @@ void FontTRLE::writeChar(unsigned int index, unsigned int xDraw, unsigned int yD
113 107
     float tyMin = ((float)offsets[index][1]) / 256.0f;
114 108
     float tyMax = ((float)(offsets[index][1] + offsets[index][3])) / 256.0f;
115 109
 
116
-    // draw
117
-    glBindTexture(GL_TEXTURE_2D, mFontTexture);
118
-    glColor4f(color[0] * 256.0f, color[1] * 256.0f, color[2] * 256.0f, color[3] * 256.0f);
119
-    glBegin(GL_QUADS);
120
-    glTexCoord2f(txMin, tyMin);
121
-    glVertex2i(xMin, yMin);
122
-    glTexCoord2f(txMin, tyMax);
123
-    glVertex2i(xMin, yMax);
124
-    glTexCoord2f(txMax, tyMax);
125
-    glVertex2i(xMax, yMax);
126
-    glTexCoord2f(txMax, tyMin);
127
-    glVertex2i(xMax, yMin);
128
-    glEnd();
110
+    vertices.push_back(glm::vec2(xMin, yMax));
111
+    vertices.push_back(glm::vec2(xMin, yMin));
112
+    vertices.push_back(glm::vec2(xMax, yMax));
113
+
114
+    vertices.push_back(glm::vec2(xMax, yMin));
115
+    vertices.push_back(glm::vec2(xMax, yMax));
116
+    vertices.push_back(glm::vec2(xMin, yMin));
117
+
118
+    uvs.push_back(glm::vec2(txMin, tyMax));
119
+    uvs.push_back(glm::vec2(txMin, tyMin));
120
+    uvs.push_back(glm::vec2(txMax, tyMax));
121
+
122
+    uvs.push_back(glm::vec2(txMax, tyMin));
123
+    uvs.push_back(glm::vec2(txMax, tyMax));
124
+    uvs.push_back(glm::vec2(txMin, tyMin));
129 125
 }
130 126
 
131 127
 unsigned int FontTRLE::widthText(float scale, std::string s) {
@@ -154,6 +150,8 @@ void FontTRLE::drawText(unsigned int x, unsigned int y, float scale,
154 150
     assert(mFontInit == true);
155 151
     assert(s.length() > 0);
156 152
 
153
+    std::vector<glm::vec2> vertices;
154
+    std::vector<glm::vec2> uvs;
157 155
     for (unsigned int i = 0; i < s.length(); i++) {
158 156
         // index into offset table
159 157
         int index = s[i] - '!';
@@ -164,9 +162,12 @@ void FontTRLE::drawText(unsigned int x, unsigned int y, float scale,
164 162
         if ((index < 0) || (index > 105))
165 163
             continue; // skip unprintable chars
166 164
 
167
-        writeChar((unsigned int)index, x, y, scale, color);
165
+        writeChar((unsigned int)index, x, y, scale, vertices, uvs);
168 166
         x += (int)((float)(offsets[index][2] + 1) * scale * SCALING); // width
169 167
     }
168
+
169
+    glm::vec4 col(color[0] / 256.0f, color[1] / 256.0f, color[2] / 256.0f, color[3] / 256.0f);
170
+    Window::drawTextGL(vertices, uvs, col, mFontTexture);
170 171
 }
171 172
 
172 173
 unsigned int FontTRLE::heightText(float scale, unsigned int maxWidth, std::string s) {
@@ -210,6 +211,8 @@ void FontTRLE::drawTextWrapped(unsigned int x, unsigned int y, float scale,
210 211
     unsigned int xStart = x;
211 212
     unsigned int yMax = 0;
212 213
 
214
+    std::vector<glm::vec2> vertices;
215
+    std::vector<glm::vec2> uvs;
213 216
     for (unsigned int i = 0; i < s.length(); i++) {
214 217
         // index into offset table
215 218
         int index = s[i] - '!';
@@ -233,9 +236,12 @@ void FontTRLE::drawTextWrapped(unsigned int x, unsigned int y, float scale,
233 236
             x -= (int)((float)(offsets[index][2] + 1) * scale * SCALING);
234 237
         }
235 238
 
236
-        writeChar((unsigned int)index, x, y, scale, color);
239
+        writeChar((unsigned int)index, x, y, scale, vertices, uvs);
237 240
         x += (int)((float)(offsets[index][2] + 1) * scale * SCALING); // width
238 241
     }
242
+
243
+    glm::vec4 col(color[0] / 256.0f, color[1] / 256.0f, color[2] / 256.0f, color[3] / 256.0f);
244
+    Window::drawTextGL(vertices, uvs, col, mFontTexture);
239 245
 }
240 246
 
241 247
 int FontTRLE::defaultOffsets[106][5] = {

+ 2
- 2
src/system/SoundAL.cpp View File

@@ -32,8 +32,8 @@ int SoundAL::initialize() {
32 32
     if (init)
33 33
         return 0;
34 34
 
35
-    ALCdevice* device = alcOpenDevice(NULL);
36
-    ALCcontext* context = alcCreateContext(device, NULL);
35
+    ALCdevice* device = alcOpenDevice(nullptr);
36
+    ALCcontext* context = alcCreateContext(device, nullptr);
37 37
     alcMakeContextCurrent(context);
38 38
 
39 39
     if (alutInitWithoutContext(nullptr, nullptr) == AL_FALSE) {

+ 264
- 127
src/system/Window.cpp View File

@@ -5,181 +5,318 @@
5 5
  * \author xythobuz
6 6
  */
7 7
 
8
-#include <cstdio>
9
-#include <cstring>
10
-#include <cstdarg>
11
-#include <cmath>
12
-
13 8
 #include "global.h"
14
-#include "math/math.h"
9
+#include "Log.h"
10
+#include "TextureManager.h"
15 11
 #include "utils/strings.h"
16 12
 #include "system/Window.h"
17 13
 
14
+unsigned int Window::getWidth() {
15
+    return mWidth;
16
+}
17
+
18
+unsigned int Window::getHeight() {
19
+    return mHeight;
20
+}
21
+
22
+bool Window::getFullscreen() {
23
+    return mFullscreen;
24
+}
25
+
26
+bool Window::getMousegrab() {
27
+    return mMousegrab;
28
+}
29
+
30
+bool Window::getTextInput() {
31
+    return mTextInput;
32
+}
33
+
34
+// ----------------------------------------------------------------------------
35
+
36
+Shader Window::textShader;
37
+Shader Window::imguiShader;
38
+unsigned int Window::vertexArrayID = 0;
39
+
18 40
 int Window::initializeGL() {
19
-    // Print driver support information
20
-    //printf("GL Vendor  : %s\n", glGetString(GL_VENDOR));
21
-    //printf("GL Renderer: %s\n", glGetString(GL_RENDERER));
22
-    //printf("GL Version : %s\n", glGetString(GL_VERSION));
23
-
24
-    // Testing for goodies
25
-    //const char *s = (const char *)glGetString(GL_EXTENSIONS);
26
-    //if ((s != NULL) && (s[0] != '\0')) {
27
-    //! \todo MultiTexture flag
28
-    //if (strstr(s, "GL_ARB_multitexture"))
29
-    //mFlags |= Render::fMultiTexture;
30
-    //}
41
+    getLog() << "GL Ven.: " << glGetString(GL_VENDOR) << Log::endl;
42
+    getLog() << "GL Ren.: " << glGetString(GL_RENDERER) << Log::endl;
43
+    getLog() << "GL Ver.: " << glGetString(GL_VERSION) << Log::endl;
44
+    getLog() << "GLSL V.: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << Log::endl;
45
+
46
+    glGenVertexArrays(1, &vertexArrayID);
47
+	glBindVertexArray(vertexArrayID);
48
+
49
+    // Set background to black
50
+    glClearColor(BLACK[0] / 256.0f, BLACK[1] / 256.0f, BLACK[2] / 256.0f, BLACK[3] / 256.0f);
31 51
 
32 52
     // Set up Z buffer
33 53
     glEnable(GL_DEPTH_TEST);
54
+    // Accept fragment if closer to camera
34 55
     glDepthFunc(GL_LESS);
35 56
 
36 57
     // Set up culling
37
-    glEnable(GL_CULL_FACE);
38
-    glFrontFace(GL_CW);
39
-    //glFrontFace(GL_CCW);
40
-    //glCullFace(GL_FRONT);
58
+    //glEnable(GL_CULL_FACE); //! \todo Transparency?
59
+
60
+    if (textShader.compile(textShaderVertex, textShaderFragment) < 0)
61
+        return -1;
62
+    if (textShader.addUniform("screen") < 0)
63
+        return -2;
64
+    if (textShader.addUniform("textureSampler") < 0)
65
+        return -3;
66
+    if (textShader.addUniform("colorVar") < 0)
67
+        return -4;
68
+    textShader.addBuffer(2);
69
+
70
+    if (imguiShader.compile(imguiShaderVertex, imguiShaderFragment) < 0)
71
+        return -5;
72
+    if (imguiShader.addUniform("screen") < 0)
73
+        return -6;
74
+    if (imguiShader.addUniform("textureSampler") < 0)
75
+        return -7;
76
+    imguiShader.addBuffer(3);
41 77
 
42
-    // Set background to black
43
-    glClearColor(BLACK[0] / 256.0f, BLACK[1] / 256.0f, BLACK[2] / 256.0f, BLACK[3] / 256.0f);
78
+    glEnable(GL_BLEND);
79
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
44 80
 
45
-    // Disable lighting
46
-    glDisable(GL_LIGHTING);
81
+    return 0;
82
+}
47 83
 
48
-    // Set up alpha blending
49
-    glEnable(GL_BLEND);
50
-    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
84
+void Window::shutdownGL() {
85
+    glDeleteVertexArrays(1, &vertexArrayID);
86
+}
51 87
 
52
-    //glEnable(GL_ALPHA_TEST); // Disable per pixel alpha blending
53
-    glAlphaFunc(GL_GREATER, 0);
88
+void Window::resizeGL() {
89
+    // new matrix?
90
+}
54 91
 
55
-    glPointSize(5.0);
92
+void Window::drawTextGL(std::vector<glm::vec2>& vertices, std::vector<glm::vec2>& uvs,
93
+                        glm::vec4 color, unsigned int texture) {
94
+    assert(vertices.size() == uvs.size());
95
+    assert((vertices.size() % 3) == 0);
56 96
 
57
-    // Setup shading
58
-    glShadeModel(GL_SMOOTH);
97
+    glBindBuffer(GL_ARRAY_BUFFER, textShader.getBuffer(0));
98
+    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec2), &vertices[0], GL_STATIC_DRAW);
59 99
 
60
-    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
61
-    glHint(GL_FOG_HINT, GL_NICEST);
62
-    glEnable(GL_COLOR_MATERIAL);
63
-    glEnable(GL_DITHER);
100
+    glBindBuffer(GL_ARRAY_BUFFER, textShader.getBuffer(1));
101
+    glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);
64 102
 
65
-    // AA polygon edges
66
-    glEnable(GL_POLYGON_SMOOTH);
67
-    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
103
+    textShader.use();
68 104
 
69
-    glDisable(GL_LINE_SMOOTH);
70
-    glDisable(GL_POINT_SMOOTH);
71
-    glDisable(GL_AUTO_NORMAL);
72
-    glDisable(GL_LOGIC_OP);
73
-    glDisable(GL_TEXTURE_1D);
74
-    glDisable(GL_STENCIL_TEST);
75
-    glDisable(GL_FOG);
105
+    glUniform2f(textShader.getUniform(0), getWindow().getWidth(), getWindow().getHeight());
76 106
 
77
-    glDisable(GL_NORMALIZE);
107
+    getTextureManager().bindTextureId(texture, TextureManager::TextureStorage::SYSTEM, 0);
108
+    glUniform1i(textShader.getUniform(1), 0);
78 109
 
79
-    //glEnableClientState(GL_VERTEX_ARRAY);
80
-    //glDisableClientState(GL_EDGE_FLAG_ARRAY);
81
-    //glDisableClientState(GL_COLOR_ARRAY);
82
-    //glDisableClientState(GL_NORMAL_ARRAY);
110
+    glUniform4fv(textShader.getUniform(2), 1, &color.r);
83 111
 
84
-    glPolygonMode(GL_FRONT, GL_FILL);
112
+    glEnableVertexAttribArray(0); // Vertices
113
+    glBindBuffer(GL_ARRAY_BUFFER, textShader.getBuffer(0));
114
+    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
85 115
 
86
-    glMatrixMode(GL_MODELVIEW);
116
+    glEnableVertexAttribArray(1); // UVs
117
+    glBindBuffer(GL_ARRAY_BUFFER, textShader.getBuffer(1));
118
+    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
87 119
 
88
-    return 0;
120
+    glDisable(GL_DEPTH_TEST);
121
+    glDrawArrays(GL_TRIANGLES, 0, vertices.size());
122
+    glEnable(GL_DEPTH_TEST);
123
+
124
+    glDisableVertexAttribArray(0);
125
+    glDisableVertexAttribArray(1);
89 126
 }
90 127
 
91
-void Window::resizeGL() {
92
-    float fovY = 40.0f; // 45.0f
93
-    float clipNear = 10.0f; // 4.0f
94
-    float clipFar = 600000.0f; // 4000.0f
128
+// ----------------------------------------------------------------------------
95 129
 
96
-    glViewport(0, 0, mWidth, mHeight);
97
-    glMatrixMode(GL_PROJECTION);
98
-    glLoadIdentity();
130
+Shader::~Shader() {
131
+    if (programID >= 0)
132
+        glDeleteProgram(programID);
99 133
 
100
-    // Adjust clipping
101
-    GLfloat fH = tanf(fovY * OR_PI / 360.0f) * clipNear;
102
-    GLfloat fW = fH * ((GLfloat)mWidth) / ((GLfloat)mHeight);
103
-    glFrustum(-fW, fW, -fH, fH, clipNear, clipFar);
134
+    if (!buffers.empty())
135
+        glDeleteBuffers(buffers.size(), &buffers[0]);
136
+}
104 137
 
105
-    glMatrixMode(GL_MODELVIEW);
106
-    glLoadIdentity();
138
+int Shader::addUniform(const char* name) {
139
+    assert(programID >= 0);
140
+    int r = glGetUniformLocation(programID, name);
141
+    if (r < 0) {
142
+        getLog() << "Can't find GLSL Uniform \"" << name << "\"!" << Log::endl;
143
+        return -1;
144
+    }
145
+    uniforms.push_back(r);
146
+    return uniforms.size() - 1;
107 147
 }
108 148
 
109
-void Window::glEnter2D() {
110
-    glPushAttrib(GL_ENABLE_BIT);
111
-    glDisable(GL_DEPTH_TEST);
112
-    glDisable(GL_CULL_FACE);
113
-    glEnable(GL_TEXTURE_2D);
149
+unsigned int Shader::getUniform(int n) {
150
+    assert(n >= 0);
151
+    assert(n < uniforms.size());
152
+    return uniforms.at(n);
153
+}
114 154
 
115
-    /* This allows alpha blending of 2D textures with the scene */
116
-    glEnable(GL_BLEND);
117
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
155
+void Shader::addBuffer(int n) {
156
+    int s = buffers.size();
157
+    for (int i = 0; i < n; i++)
158
+        buffers.push_back(0);
159
+    glGenBuffers(n, &buffers[s]);
160
+}
161
+
162
+unsigned int Shader::getBuffer(int n) {
163
+    assert(n >= 0);
164
+    assert(n < buffers.size());
165
+    return buffers.at(n);
166
+}
167
+
168
+void Shader::use() {
169
+    assert(programID >= 0);
170
+    glUseProgram(programID);
171
+}
118 172
 
119
-    glViewport(0, 0, mWidth, mHeight);
173
+int Shader::compile(const char* vertex, const char* fragment) {
174
+    assert(vertex != nullptr);
175
+    assert(fragment != nullptr);
176
+
177
+    GLuint vertexID = glCreateShader(GL_VERTEX_SHADER);
178
+    GLuint fragmentID = glCreateShader(GL_FRAGMENT_SHADER);
179
+
180
+    GLint result = GL_FALSE;
181
+    GLint logLength = 0;
182
+
183
+    // Compile vertex shader
184
+    glShaderSource(vertexID, 1, &vertex, nullptr);
185
+    glCompileShader(vertexID);
186
+
187
+    // Check vertex shader
188
+    glGetShaderiv(vertexID, GL_COMPILE_STATUS, &result);
189
+    glGetShaderiv(vertexID, GL_INFO_LOG_LENGTH, &logLength);
190
+    if (logLength > 0) {
191
+        std::vector<char> message(logLength + 1);
192
+        glGetShaderInfoLog(vertexID, logLength, nullptr, &message[0]);
193
+        if (result != GL_TRUE)
194
+            getLog() << "Vertex Shader compilation error:" << Log::endl;
195
+        getLog() << &message[0] << Log::endl;
196
+        glDeleteShader(vertexID);
197
+        glDeleteShader(fragmentID);
198
+        return -1;
199
+    }
200
+
201
+    // Compile fragment shader
202
+    glShaderSource(fragmentID, 1, &fragment, nullptr);
203
+    glCompileShader(fragmentID);
204
+
205
+    // Check fragment shader
206
+    glGetShaderiv(fragmentID, GL_COMPILE_STATUS, &result);
207
+    glGetShaderiv(fragmentID, GL_INFO_LOG_LENGTH, &logLength);
208
+    if (logLength > 0) {
209
+        std::vector<char> message(logLength + 1);
210
+        glGetShaderInfoLog(fragmentID, logLength, nullptr, &message[0]);
211
+        if (result != GL_TRUE)
212
+            getLog() << "Fragment Shader compilation error:" << Log::endl;
213
+        getLog() << &message[0] << Log::endl;
214
+        glDeleteShader(vertexID);
215
+        glDeleteShader(fragmentID);
216
+        return -2;
217
+    }
218
+
219
+    // Link both shaders
220
+    programID = glCreateProgram();
221
+    glAttachShader(programID, vertexID);
222
+    glAttachShader(programID, fragmentID);
223
+    glLinkProgram(programID);
224
+
225
+    // Check resulting program
226
+    glGetProgramiv(programID, GL_LINK_STATUS, &result);
227
+    glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &logLength);
228
+    if (logLength > 0) {
229
+        std::vector<char> message(logLength + 1);
230
+        glGetProgramInfoLog(programID, logLength, nullptr, &message[0]);
231
+        if (result != GL_TRUE)
232
+            getLog() << "Shader link error:" << Log::endl;
233
+        getLog() << &message[0] << Log::endl;
234
+        glDeleteShader(vertexID);
235
+        glDeleteShader(fragmentID);
236
+        glDeleteProgram(programID);
237
+        return -3;
238
+    }
239
+
240
+    glDeleteShader(vertexID);
241
+    glDeleteShader(fragmentID);
242
+    return programID;
243
+}
244
+
245
+// ----------------------------------------------------------------------------
246
+// *INDENT-OFF*
247
+
248
+const char* Window::textShaderVertex = R"!?!(
249
+#version 330 core
250
+
251
+layout(location = 0) in vec2 vertexPosition_screen;
252
+layout(location = 1) in vec2 vertexUV;
253
+
254
+out vec2 UV;
255
+
256
+uniform vec2 screen;
257
+
258
+void main() {
259
+    vec2 halfScreen = screen / 2;
260
+    vec2 vertexPosition_homogenous = (vertexPosition_screen - halfScreen) / halfScreen;
120 261
 
121
-    glMatrixMode(GL_PROJECTION);
122
-    glPushMatrix();
123
-    glLoadIdentity();
262
+    gl_Position = vec4(vertexPosition_homogenous.x, -vertexPosition_homogenous.y, 0, 1);
263
+    UV = vertexUV;
264
+}
265
+)!?!";
266
+
267
+const char* Window::textShaderFragment = R"!?!(
268
+#version 330 core
124 269
 
125
-    glOrtho(0.0, (GLdouble)mWidth, (GLdouble)mHeight, 0.0, 0.0, 1.0);
270
+in vec2 UV;
126 271
 
127
-    glMatrixMode(GL_MODELVIEW);
128
-    glPushMatrix();
129
-    glLoadIdentity();
272
+out vec4 color;
130 273
 
131
-    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
274
+uniform sampler2D textureSampler;
275
+uniform vec4 colorVar;
276
+
277
+void main() {
278
+    color = texture(textureSampler, UV) * colorVar;
132 279
 }
280
+)!?!";
281
+
282
+// --------------------------------------
133 283
 
134
-void Window::glExit2D() {
135
-    glMatrixMode(GL_MODELVIEW);
136
-    glPopMatrix();
284
+const char* Window::imguiShaderVertex = R"!?!(
285
+#version 330 core
137 286
 
138
-    glMatrixMode(GL_PROJECTION);
139
-    glPopMatrix();
287
+layout(location = 0) in vec2 vertexPosition_screen;
288
+layout(location = 1) in vec2 vertexUV;
289
+layout(location = 2) in vec4 vertexColor;
140 290
 
141
-    glPopAttrib();
291
+out vec2 UV;
292
+out vec4 FragColor;
142 293
 
143
-    glMatrixMode(GL_MODELVIEW);
294
+uniform vec2 screen;
295
+
296
+void main() {
297
+    vec2 halfScreen = screen / 2;
298
+    vec2 vertexPosition_homogenous = (vertexPosition_screen - halfScreen) / halfScreen;
299
+
300
+    gl_Position = vec4(vertexPosition_homogenous.x, -vertexPosition_homogenous.y, 0, 1);
301
+    UV = vertexUV;
302
+    FragColor = vertexColor;
144 303
 }
304
+)!?!";
145 305
 
146
-// Replaced the deprecated gluLookAt with slightly modified code from here:
147
-// http://www.khronos.org/message_boards/showthread.php/4991
148
-void Window::lookAt(float eyeX, float eyeY, float eyeZ,
149
-                    float lookAtX, float lookAtY, float lookAtZ,
150
-                    float upX, float upY, float upZ) {
151
-    // calculating the viewing vector
152
-    float f[3] = {
153
-        lookAtX - eyeX,
154
-        lookAtY - eyeY,
155
-        lookAtZ - eyeZ
156
-    };
306
+const char* Window::imguiShaderFragment = R"!?!(
307
+#version 330 core
157 308
 
158
-    // normalizing the viewing vector
159
-    float fMag = sqrtf(f[0] * f[0] + f[1] * f[1] + f[2] * f[2]);
160
-    f[0] /= fMag;
161
-    f[1] /= fMag;
162
-    f[2] /= fMag;
309
+in vec2 UV;
310
+in vec4 FragColor;
163 311
 
164
-    float s[3] = {
165
-        (f[1] * upZ) - (upY* f[2]),
166
-        (upX* f[2]) - (f[0] * upZ),
167
-        (f[0] * upY) - (upX* f[1])
168
-    };
312
+out vec4 color;
169 313
 
170
-    float u[3] = {
171
-        (s[1] * f[2]) - (f[1] * s[2]),
172
-        (f[0] * s[2]) - (s[0] * f[2]),
173
-        (s[0] * f[1]) - (f[0] * s[1])
174
-    };
314
+uniform sampler2D textureSampler;
175 315
 
176
-    float m[16] = {
177
-        s[0], u[0], -f[0], 0,
178
-        s[1], u[1], -f[1], 0,
179
-        s[2], u[2], -f[2], 0,
180
-        0,    0,     0, 1
181
-    };
182
-    glMultMatrixf(m);
183
-    glTranslatef(-eyeX, -eyeY, -eyeZ);
316
+void main() {
317
+    color = texture(textureSampler, UV) * FragColor;
184 318
 }
319
+)!?!";
320
+
321
+// *INDENT-ON*
185 322
 

+ 4
- 2
src/system/WindowGLUT.cpp View File

@@ -69,9 +69,11 @@ int WindowGLUT::initialize() {
69 69
     int argc = 1;
70 70
     char* argv[] = { new char[11], nullptr };
71 71
     strcpy(argv[0], "OpenRaider");
72
-    glutInit(&argc, argv);
73 72
     glutInitWindowSize(mWidth, mHeight);
74
-    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
73
+    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH | GLUT_MULTISAMPLE);
74
+    glutInitContextVersion(3, 3);
75
+    glutInitContextProfile(GLUT_CORE_PROFILE);
76
+    glutInit(&argc, argv);
75 77
     glutCreateWindow(VERSION);
76 78
 
77 79
     glutReshapeFunc(WindowGLUT::reshapeCallback);

+ 17
- 10
src/system/WindowSDL.cpp View File

@@ -22,8 +22,8 @@ WindowSDL::WindowSDL() {
22 22
     mFullscreen = false;
23 23
     mMousegrab = false;
24 24
     mTextInput = false;
25
-    mWindow = NULL;
26
-    mGLContext = NULL;
25
+    mWindow = nullptr;
26
+    mGLContext = nullptr;
27 27
 }
28 28
 
29 29
 WindowSDL::~WindowSDL() {
@@ -82,24 +82,31 @@ int WindowSDL::initialize() {
82 82
     if (mFullscreen)
83 83
         flags |= SDL_WINDOW_FULLSCREEN;
84 84
 
85
-    if ((SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5) != 0)
86
-        || (SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5) != 0)
87
-        || (SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5) != 0)
88
-        || (SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16) != 0)
89
-        || (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) != 0)) {
85
+    if ((SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8) != 0)
86
+        || (SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8) != 0)
87
+        || (SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8) != 0)
88
+        || (SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8) != 0)
89
+        || (SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24) != 0)
90
+        || (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) != 0)
91
+        || (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1) != 0)
92
+        //|| (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2) != 0)
93
+        || (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4) != 0)
94
+        || (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3) != 0)
95
+        || (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3) != 0)
96
+        || (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE))) {
90 97
         std::cout << "SDL_GL_SetAttribute Error: " << SDL_GetError() << std::endl;
91 98
         return -2;
92 99
     }
93 100
 
94 101
     mWindow = SDL_CreateWindow(VERSION, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
95 102
                                mWidth, mHeight, flags);
96
-    if (mWindow == NULL) {
103
+    if (mWindow == nullptr) {
97 104
         std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
98 105
         return -3;
99 106
     }
100 107
 
101 108
     mGLContext = SDL_GL_CreateContext(mWindow);
102
-    if (mGLContext == NULL) {
109
+    if (mGLContext == nullptr) {
103 110
         std::cout << "SDL_GL_CreateContext Error: " << SDL_GetError() << std::endl;
104 111
         return -4;
105 112
     }
@@ -147,7 +154,7 @@ void WindowSDL::eventHandling() {
147 154
 
148 155
             case SDL_TEXTINPUT:
149 156
             case SDL_TEXTEDITING:
150
-                if (event.text.text != NULL)
157
+                if (event.text.text != nullptr)
151 158
                     UI::handleText(event.text.text, (event.type == SDL_TEXTEDITING));
152 159
                 break;
153 160
 

+ 1
- 1
src/utils/filesystem.cpp View File

@@ -46,7 +46,7 @@ std::string getHomeDirectory() {
46 46
 #elif defined(_WIN32)
47 47
 
48 48
     char path[MAX_PATH];
49
-    assertEqual(SHGetFolderPath(NULL, CSIDL_PROFILE, NULL, 0, path), S_OK);
49
+    assertEqual(SHGetFolderPath(nullptr, CSIDL_PROFILE, nullptr, 0, path), S_OK);
50 50
     size_t lenPath = strlen(path);
51 51
     for (unsigned int i = 0; i < lenPath; i++)
52 52
         if (dir[i] == '\\')

+ 14
- 13
src/utils/pcx.cpp View File

@@ -15,7 +15,7 @@
15 15
 #include "utils/pcx.h"
16 16
 
17 17
 int pcxCheck(const char* filename) {
18
-    assert(filename != NULL);
18
+    assert(filename != nullptr);
19 19
     assert(filename[0] != '\0');
20 20
 
21 21
     std::ifstream file(filename, std::ios::in | std::ios::binary);
@@ -66,14 +66,15 @@ int pcxCheck(const char* filename) {
66 66
 }
67 67
 
68 68
 int pcxLoad(const char* filename, unsigned char** image,
69
-            unsigned int* width, unsigned int* height, ColorMode* mode, unsigned int* bpp) {
70
-    assert(filename != NULL);
69
+            unsigned int* width, unsigned int* height,
70
+            TextureManager::ColorMode* mode, unsigned int* bpp) {
71
+    assert(filename != nullptr);
71 72
     assert(filename[0] != '\0');
72
-    assert(image != NULL);
73
-    assert(width != NULL);
74
-    assert(height != NULL);
75
-    assert(mode != NULL);
76
-    assert(bpp != NULL);
73
+    assert(image != nullptr);
74
+    assert(width != nullptr);
75
+    assert(height != nullptr);
76
+    assert(mode != nullptr);
77
+    assert(bpp != nullptr);
77 78
 
78 79
     std::ifstream file(filename, std::ios::in | std::ios::binary);
79 80
 
@@ -177,7 +178,7 @@ int pcxLoad(const char* filename, unsigned char** image,
177 178
     }
178 179
 
179 180
     // Read color palette
180
-    unsigned char* palette = NULL;
181
+    unsigned char* palette = nullptr;
181 182
     if (versionFive) {
182 183
         int c = file.get();
183 184
         if ((c == 12) && file) {
@@ -202,7 +203,7 @@ int pcxLoad(const char* filename, unsigned char** image,
202 203
             unsigned long baseIndex = (x + (y** width)) * 4;
203 204
             unsigned char alpha = 255, red = 0, green = 0, blue = 0;
204 205
 
205
-            if (palette != NULL) {
206
+            if (palette != nullptr) {
206 207
                 if (nPlanes == 1) {
207 208
                     red = palette[buffer[(y * totalBytes) + x] * 3];
208 209
                     green = palette[(buffer[(y * totalBytes) + x] * 3) + 1];
@@ -212,7 +213,7 @@ int pcxLoad(const char* filename, unsigned char** image,
212 213
                     delete [] buffer;
213 214
                     delete [] palette;
214 215
                     delete [] *image;
215
-                    *image = NULL;
216
+                    *image = nullptr;
216 217
                     return -10;
217 218
                 }
218 219
             } else {
@@ -229,7 +230,7 @@ int pcxLoad(const char* filename, unsigned char** image,
229 230
                     delete [] buffer;
230 231
                     delete [] palette;
231 232
                     delete [] *image;
232
-                    *image = NULL;
233
+                    *image = nullptr;
233 234
                     return -11;
234 235
                 }
235 236
             }
@@ -241,7 +242,7 @@ int pcxLoad(const char* filename, unsigned char** image,
241 242
         }
242 243
     }
243 244
 
244
-    *mode = RGBA;
245
+    *mode = TextureManager::ColorMode::RGBA;
245 246
     *bpp = 32;
246 247
 
247 248
     delete [] buffer;

+ 3
- 3
src/utils/pixel.cpp View File

@@ -10,7 +10,7 @@
10 10
 
11 11
 unsigned char* generateColorTexture(const unsigned char* rgba, unsigned int width,
12 12
                                     unsigned int height, unsigned int bpp) {
13
-    assert(rgba != NULL);
13
+    assert(rgba != nullptr);
14 14
     assert(width > 0);
15 15
     assert(height > 0);
16 16
     assert((bpp % 8) == 0);
@@ -97,7 +97,7 @@ unsigned char* scaleBuffer(unsigned char* image, unsigned int* w, unsigned int*
97 97
                            unsigned int bpp) {
98 98
     unsigned int width = *w;
99 99
     unsigned int height = *h;
100
-    assert(image != NULL);
100
+    assert(image != nullptr);
101 101
     assert(width > 0);
102 102
     assert(height > 0);
103 103
     assert((bpp % 8) == 0);
@@ -111,7 +111,7 @@ unsigned char* scaleBuffer(unsigned char* image, unsigned int* w, unsigned int*
111 111
 
112 112
     // Check to see if scaling is needed
113 113
     if (height == original_height && width == original_width)
114
-        return NULL;
114
+        return nullptr;
115 115
 
116 116
     *w = width;
117 117
     *h = height;

+ 30
- 31
src/utils/png.cpp View File

@@ -19,11 +19,11 @@
19 19
 int pngCheck(const char* filename) {
20 20
     png_byte header[8];
21 21
 
22
-    assert(filename != NULL);
22
+    assert(filename != nullptr);
23 23
     assert(filename[0] != '\0');
24 24
 
25 25
     FILE* fp = fopen(filename, "rb");
26
-    if (fp == NULL) {
26
+    if (fp == nullptr) {
27 27
         std::cout << "Could not open " << filename << std::endl;
28 28
         return -1;
29 29
     }
@@ -40,19 +40,20 @@ int pngCheck(const char* filename) {
40 40
 }
41 41
 
42 42
 int pngLoad(const char* filename, unsigned char** image,
43
-            unsigned int* width, unsigned int* height, ColorMode* mode, unsigned int* bpp) {
43
+            unsigned int* width, unsigned int* height,
44
+            TextureManager::ColorMode* mode, unsigned int* bpp) {
44 45
     png_byte header[8];
45 46
 
46
-    assert(filename != NULL);
47
+    assert(filename != nullptr);
47 48
     assert(filename[0] != '\0');
48
-    assert(image != NULL);
49
-    assert(width != NULL);
50
-    assert(height != NULL);
51
-    assert(mode != NULL);
52
-    assert(bpp != NULL);
49
+    assert(image != nullptr);
50
+    assert(width != nullptr);
51
+    assert(height != nullptr);
52
+    assert(mode != nullptr);
53
+    assert(bpp != nullptr);
53 54
 
54 55
     FILE* fp = fopen(filename, "rb");
55
-    if (fp == NULL) {
56
+    if (fp == nullptr) {
56 57
         std::cout << "Could not open " << filename << std::endl;
57 58
         return -1;
58 59
     }
@@ -65,7 +66,7 @@ int pngLoad(const char* filename, unsigned char** image,
65 66
         return -2;
66 67
     }
67 68
 
68
-    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
69
+    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
69 70
     if (!png_ptr) {
70 71
         std::cout << "png_create_read_struct returned 0." << std::endl;
71 72
         fclose(fp);
@@ -75,7 +76,7 @@ int pngLoad(const char* filename, unsigned char** image,
75 76
     png_infop info_ptr = png_create_info_struct(png_ptr);
76 77
     if (!info_ptr) {
77 78
         std::cout << "png_create_info_struct returned 0." << std::endl;
78
-        png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
79
+        png_destroy_read_struct(&png_ptr, (png_infopp)nullptr, (png_infopp)nullptr);
79 80
         fclose(fp);
80 81
         return -4;
81 82
     }
@@ -83,7 +84,7 @@ int pngLoad(const char* filename, unsigned char** image,
83 84
     png_infop end_info = png_create_info_struct(png_ptr);
84 85
     if (!end_info) {
85 86
         std::cout << "png_create_info_struct returned 0." << std::endl;
86
-        png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL);
87
+        png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) nullptr);
87 88
         fclose(fp);
88 89
         return -5;
89 90
     }
@@ -103,7 +104,7 @@ int pngLoad(const char* filename, unsigned char** image,
103 104
     png_uint_32 tmpWidth, tmpHeight;
104 105
 
105 106
     png_get_IHDR(png_ptr, info_ptr, &tmpWidth, &tmpHeight, &bit_depth, &color_type,
106
-                 NULL, NULL, NULL);
107
+                 nullptr, nullptr, nullptr);
107 108
 
108 109
     *width = tmpWidth;
109 110
     *height = tmpHeight;
@@ -129,14 +130,11 @@ int pngLoad(const char* filename, unsigned char** image,
129 130
     delete [] row_pointers;
130 131
     fclose(fp);
131 132
 
132
-    if (color_type == PNG_COLOR_TYPE_GRAY) {
133
-        *mode = GREYSCALE;
134
-        *bpp = 8;
135
-    } else if (color_type == PNG_COLOR_TYPE_RGB) {
136
-        *mode = RGB;
133
+    if (color_type == PNG_COLOR_TYPE_RGB) {
134
+        *mode = TextureManager::ColorMode::RGB;
137 135
         *bpp = 24;
138 136
     } else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
139
-        *mode = RGBA;
137
+        *mode = TextureManager::ColorMode::RGBA;
140 138
         *bpp = 32;
141 139
     } else {
142 140
         std::cout << filename << ": Unknown libpng color type " << color_type << std::endl;
@@ -164,10 +162,11 @@ int pngLoad(const char* filename, unsigned char** image,
164 162
 }
165 163
 
166 164
 int pngSave(const char* filename, unsigned char* image,
167
-            unsigned int width, unsigned int height, ColorMode mode, unsigned int bpp) {
168
-    assert(filename != NULL);
165
+            unsigned int width, unsigned int height,
166
+            TextureManager::ColorMode mode, unsigned int bpp) {
167
+    assert(filename != nullptr);
169 168
     assert(filename[0] != '\0');
170
-    assert(image != NULL);
169
+    assert(image != nullptr);
171 170
     assert(width > 0);
172 171
     assert(height > 0);
173 172
 
@@ -177,7 +176,7 @@ int pngSave(const char* filename, unsigned char* image,
177 176
         return -1;
178 177
     }
179 178
 
180
-    png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
179
+    png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
181 180
 
182 181
     if (!png_ptr) {
183 182
         std::cout << "png_create_write_struct failed" << std::endl;
@@ -207,15 +206,15 @@ int pngSave(const char* filename, unsigned char* image,
207 206
     }
208 207
 
209 208
     int color_type;
210
-    if ((mode == GREYSCALE) && (bpp == 8)) {
211
-        color_type = PNG_COLOR_TYPE_GRAY;
212
-    } else if (((mode == RGB) || (mode == BGR)) && (bpp == 24)) {
213
-        if (mode == BGR) {
209
+    if (((mode == TextureManager::ColorMode::RGB)
210
+                || (mode == TextureManager::ColorMode::BGR)) && (bpp == 24)) {
211
+        if (mode == TextureManager::ColorMode::BGR) {
214 212
             bgr2rgb24(image, width, height);
215 213
         }
216 214
         color_type = PNG_COLOR_TYPE_RGB;
217
-    } else if (((mode == RGBA) || (mode == BGRA)) && (bpp == 32)) {
218
-        if (mode == BGRA) {
215
+    } else if (((mode == TextureManager::ColorMode::RGBA)
216
+                || (mode == TextureManager::ColorMode::BGRA)) && (bpp == 32)) {
217
+        if (mode == TextureManager::ColorMode::BGRA) {
219 218
             bgra2rgba32(image, width, height);
220 219
         }
221 220
         color_type = PNG_COLOR_TYPE_RGB_ALPHA;
@@ -252,7 +251,7 @@ int pngSave(const char* filename, unsigned char* image,
252 251
         return -8;
253 252
     }
254 253
 
255
-    png_write_end(png_ptr, NULL);
254
+    png_write_end(png_ptr, nullptr);
256 255
 
257 256
     delete [] row_pointers;
258 257
     fclose(fp);

+ 10
- 10
src/utils/tga.cpp View File

@@ -42,7 +42,7 @@ typedef struct {
42 42
 int tgaCheck(const char* filename) {
43 43
     char buffer[10];
44 44
 
45
-    assert(filename != NULL);
45
+    assert(filename != nullptr);
46 46
     assert(filename[0] != '\0');
47 47
 
48 48
     FILE* f = fopen(filename, "rb");
@@ -73,18 +73,18 @@ int tgaLoad(const char* filename, unsigned char** image, unsigned int* width, un
73 73
     tga_t header;
74 74
     char comment[256];
75 75
     unsigned char pixel[4];
76
-    unsigned char* swap_row = NULL;
76
+    unsigned char* swap_row = nullptr;
77 77
     unsigned char tmp, packet;
78 78
     bool must_flip = 0;
79 79
     unsigned int size;
80 80
     unsigned int i, j;
81 81
 
82
-    assert(filename != NULL);
82
+    assert(filename != nullptr);
83 83
     assert(filename[0] != '\0');
84
-    assert(image != NULL);
85
-    assert(width != NULL);
86
-    assert(height != NULL);
87
-    assert(type != NULL);
84
+    assert(image != nullptr);
85
+    assert(width != nullptr);
86
+    assert(height != nullptr);
87
+    assert(type != nullptr);
88 88
 
89 89
     FILE* f = fopen(filename, "rb");
90 90
     if (!f) {
@@ -159,7 +159,7 @@ int tgaLoad(const char* filename, unsigned char** image, unsigned int* width, un
159 159
         printf("Comment: '%s'\n", comment);
160 160
     }
161 161
 
162
-    *image = NULL;
162
+    *image = nullptr;
163 163
     size = header.width * header.height;
164 164
 
165 165
     if (!size || (!(header.colormap_type == 0 && (header.image_type == 2
@@ -311,9 +311,9 @@ int tgaSave(const char* filename, unsigned char* image, unsigned int width, unsi
311 311
     //unsigned int i;
312 312
     //unsigned char tmp;
313 313
 
314
-    assert(filename != NULL);
314
+    assert(filename != nullptr);
315 315
     assert(filename[0] != '\0');
316
-    assert(image != NULL);
316
+    assert(image != nullptr);
317 317
     assert(width > 0);
318 318
     assert(height > 0);
319 319
 

+ 0
- 9
test/CMakeLists.txt View File

@@ -25,15 +25,6 @@ add_executable (tester_loader EXCLUDE_FROM_ALL
25 25
 
26 26
 #################################################################
27 27
 
28
-add_executable (tester_math EXCLUDE_FROM_ALL
29
-    "math.cpp" "../src/math/math.cpp"
30
-    "../src/math/Vec3.cpp"
31
-)
32
-add_dependencies (check tester_math)
33
-add_test (NAME test_math COMMAND tester_math)
34
-
35
-#################################################################
36
-
37 28
 add_executable (tester_script EXCLUDE_FROM_ALL
38 29
     "Script.cpp" "../src/Script.cpp" "../src/main.cpp"
39 30
     "../src/utils/binary.cpp" "../src/Exception.cpp"

+ 0
- 34
test/math.cpp View File

@@ -1,34 +0,0 @@
1
-/*!
2
- * \file test/math.cpp
3
- * \brief Math Unit Test
4
- *
5
- * \author xythobuz
6
- */
7
-
8
-#include <iostream>
9
-
10
-#include "global.h"
11
-#include "math/math.h"
12
-#include "math/Vec3.h"
13
-
14
-#define check(x) if (!(x)) { \
15
-    std::cout << "Test failed: " << #x << std::endl; \
16
-    return -1; \
17
-}
18
-
19
-int main() {
20
-    // math.h
21
-    check(equalEpsilon(42.23f, 42.23f));
22
-    check(!equalEpsilon(42.23f, 23.42f));
23
-
24
-    // Vec3.h
25
-    Vec3 a(42.0f, 23.0f, 66.0f);
26
-    Vec3 b(23.0f, 66.0f, 42.0f);
27
-    Vec3 result(-3390.0f, -246.0f, 2243.0f);
28
-    check(Vec3::cross(a, b) == result);
29
-
30
-    check(equalEpsilon(a * b, 5256.0f));
31
-
32
-    return 0;
33
-}
34
-

Loading…
Cancel
Save