Browse Source

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

Thomas Buck 9 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
 
2
 
3
 ## OpenRaider (0.1.3) xythobuz <xythobuz@xythobuz.de>
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
     [ 20141207 ]
16
     [ 20141207 ]
6
     * LoaderTR2 now also loads all important parts of the Room structures
17
     * LoaderTR2 now also loads all important parts of the Room structures
7
     * Started work on new Mesh implementation used with LoaderTR2
18
     * Started work on new Mesh implementation used with LoaderTR2

+ 6
- 2
README.md View File

1
 # OpenRaider
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
 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.
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
 * C++11 compiler
41
 * C++11 compiler
40
 * cmake
42
 * cmake
41
 * OpenGL
43
 * OpenGL
44
+* GLM
42
 * zlib
45
 * zlib
43
 * SDL2
46
 * SDL2
44
 * SDL2-TTF (optional, needed if you want to use TTF fonts)
47
 * SDL2-TTF (optional, needed if you want to use TTF fonts)
47
 
50
 
48
 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:
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
 A similar command for the package manager of your favorite Linux Distribution should do the trick.
55
 A similar command for the package manager of your favorite Linux Distribution should do the trick.
53
 
56
 
178
 * [GetGitRevisionDescription.cmake](https://github.com/rpavlik/cmake-modules/blob/master/GetGitRevisionDescription.cmake)
181
 * [GetGitRevisionDescription.cmake](https://github.com/rpavlik/cmake-modules/blob/master/GetGitRevisionDescription.cmake)
179
 * [GetGitRevisionDescription.cmake.in](https://github.com/rpavlik/cmake-modules/blob/master/GetGitRevisionDescription.cmake.in)
182
 * [GetGitRevisionDescription.cmake.in](https://github.com/rpavlik/cmake-modules/blob/master/GetGitRevisionDescription.cmake.in)
180
 * [FindFreeGLUT](https://github.com/PDAL/PDAL/blob/master/cmake/modules/FindFreeGLUT.cmake)
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
 See the respective files in `cmake` for their licensing.
186
 See the respective files in `cmake` for their licensing.
183
 
187
 

+ 63
- 0
cmake/FindGLM.cmake View File

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
 #!/bin/bash
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
 if [ "$CC" = "gcc" ]; then sudo apt-get install gcc-4.8; fi
5
 if [ "$CC" = "gcc" ]; then sudo apt-get install gcc-4.8; fi
6
 if [ "$CXX" = "g++" ]; then sudo apt-get install g++-4.8; fi
6
 if [ "$CXX" = "g++" ]; then sudo apt-get install g++-4.8; fi

+ 1
- 1
cmake/travis_install_mac.sh View File

1
 #!/bin/bash
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
  * \file include/Camera.h
2
  * \file include/Camera.h
3
  * \brief Camera class
3
  * \brief Camera class
4
  *
4
  *
5
- * \author Mongoose
6
  * \author xythobuz
5
  * \author xythobuz
7
  */
6
  */
8
 
7
 
9
 #ifndef _CAMERA_H_
8
 #ifndef _CAMERA_H_
10
 #define _CAMERA_H_
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
 class Camera {
14
 class Camera {
28
   public:
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
   private:
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
 #endif
37
 #endif
38
+

+ 0
- 5
include/Entity.h View File

9
 #define _ENTITY_H_
9
 #define _ENTITY_H_
10
 
10
 
11
 #include "SkeletalModel.h"
11
 #include "SkeletalModel.h"
12
-#include "TombRaider.h"
13
 
12
 
14
 class Entity {
13
 class Entity {
15
   public:
14
   public:
23
 
22
 
24
     Entity(float p[3], float a[3], int id, long r, unsigned int model);
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
     void display();
25
     void display();
31
     void move(char movement);
26
     void move(char movement);
32
     void print();
27
     void print();

+ 0
- 3
include/Game.h View File

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

+ 10
- 9
include/Mesh.h View File

10
 #ifndef _MESH_H_
10
 #ifndef _MESH_H_
11
 #define _MESH_H_
11
 #define _MESH_H_
12
 
12
 
13
-#include "math/Vec3.h"
13
+#include "glm/vec3.hpp"
14
 
14
 
15
 /*!
15
 /*!
16
  * \brief OpenGL Mesh
16
  * \brief OpenGL Mesh
19
   public:
19
   public:
20
 
20
 
21
     struct rectangle_t {
21
     struct rectangle_t {
22
-        Vec3 a, b, c, d;
22
+        glm::vec3 a, b, c, d;
23
         uint16_t texture;
23
         uint16_t texture;
24
         float red, green, blue;
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
                     float re = 0.0f, float gr = 0.0f, float bl = 0.0f)
27
                     float re = 0.0f, float gr = 0.0f, float bl = 0.0f)
28
             : a(_a), b(_b), c(_c), d(_d), texture(t), red(re), green(gr), blue(bl) { }
28
             : a(_a), b(_b), c(_c), d(_d), texture(t), red(re), green(gr), blue(bl) { }
29
     };
29
     };
34
     void drawAlpha();
34
     void drawAlpha();
35
     void drawSolid();
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
     std::vector<rectangle_t> texturedRectangles;
46
     std::vector<rectangle_t> texturedRectangles;
46
     std::vector<rectangle_t> coloredRectangles;
47
     std::vector<rectangle_t> coloredRectangles;
47
     std::vector<rectangle_t> texturedTriangles;
48
     std::vector<rectangle_t> texturedTriangles;
48
     std::vector<rectangle_t> coloredTriangles;
49
     std::vector<rectangle_t> coloredTriangles;
49
-    std::vector<Vec3> normals;
50
+    std::vector<glm::vec3> normals;
50
 
51
 
51
 
52
 
52
     // Old API
53
     // Old API

+ 17
- 161
include/Render.h View File

9
 #ifndef _RENDER_H_
9
 #ifndef _RENDER_H_
10
 #define _RENDER_H_
10
 #define _RENDER_H_
11
 
11
 
12
-#include <vector>
12
+#include "glm/vec4.hpp"
13
 
13
 
14
-#include "Room.h"
15
 #include "TextureManager.h"
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
 class Render {
24
 class Render {
22
   public:
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
   private:
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
 #endif
40
 #endif
41
+

+ 0
- 5
include/Room.h View File

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

+ 3
- 12
include/RoomData.h View File

8
 #ifndef _ROOM_DATA_H_
8
 #ifndef _ROOM_DATA_H_
9
 #define _ROOM_DATA_H_
9
 #define _ROOM_DATA_H_
10
 
10
 
11
+#include "glm/vec3.hpp"
12
+
11
 #include <vector>
13
 #include <vector>
12
 #include <memory>
14
 #include <memory>
13
-#include "math/Matrix.h"
14
-#include "TombRaider.h"
15
 
15
 
16
 class BoundingBox {
16
 class BoundingBox {
17
   public:
17
   public:
37
         typeDirectional = 3  //!< Directional light
37
         typeDirectional = 3  //!< Directional light
38
     } LightType;
38
     } LightType;
39
 
39
 
40
-    Light(TombRaider& tr, unsigned int room, unsigned int index);
41
-
42
     void getPos(float p[4]);
40
     void getPos(float p[4]);
43
     void getDir(float d[3]);
41
     void getDir(float d[3]);
44
     float getAtt();
42
     float getAtt();
57
 
55
 
58
 class StaticModel {
56
 class StaticModel {
59
   public:
57
   public:
60
-    StaticModel(TombRaider& tr, unsigned int room, unsigned int i);
61
     void display();
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
   private:
60
   private:
68
     int index;
61
     int index;
69
     float yaw;
62
     float yaw;
75
 
68
 
76
 class Portal {
69
 class Portal {
77
   public:
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
     void getVertices(float vert[4][3]);
73
     void getVertices(float vert[4][3]);
82
     int getAdjoiningRoom();
74
     int getAdjoiningRoom();
90
 class Sector {
82
 class Sector {
91
   public:
83
   public:
92
     Sector(float f, float c, bool w) : floor(f), ceiling(c), wall(w) { }
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
     float getFloor();
85
     float getFloor();
95
     float getCeiling();
86
     float getCeiling();
96
     bool isWall();
87
     bool isWall();

+ 0
- 12
include/SkeletalModel.h View File

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

+ 0
- 16
include/Sprite.h View File

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

+ 0
- 3
include/StaticMesh.h View File

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

+ 16
- 13
include/TextureManager.h View File

12
 #include <cstdint>
12
 #include <cstdint>
13
 #include <vector>
13
 #include <vector>
14
 
14
 
15
-#include "math/Vec3.h"
16
-
17
 // These are loaded into TextureStorage::SYSTEM by initialize()!
15
 // These are loaded into TextureStorage::SYSTEM by initialize()!
18
 #define TEXTURE_WHITE 0
16
 #define TEXTURE_WHITE 0
19
 #define TEXTURE_SPLASH 1
17
 #define TEXTURE_SPLASH 1
32
     ~TextureTile();
30
     ~TextureTile();
33
 
31
 
34
     void add(TextureTileVertex* t);
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
   private:
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
     uint16_t attribute;
38
     uint16_t attribute;
46
     uint16_t texture;
39
     uint16_t texture;
47
     std::vector<TextureTileVertex*> vertices;
40
     std::vector<TextureTileVertex*> vertices;
53
 class TextureManager {
46
 class TextureManager {
54
   public:
47
   public:
55
 
48
 
49
+    enum class ColorMode {
50
+        RGB,
51
+        RGBA,
52
+        ARGB,
53
+        BGR,
54
+        BGRA
55
+    };
56
+
56
     enum class TextureStorage {
57
     enum class TextureStorage {
57
         GAME,
58
         GAME,
58
         SYSTEM
59
         SYSTEM
61
     ~TextureManager();
62
     ~TextureManager();
62
 
63
 
63
     int initialize();
64
     int initialize();
65
+    int initializeSplash();
64
 
66
 
65
     void clear();
67
     void clear();
66
 
68
 
70
      * \brief Binds the texture for use in GL
72
      * \brief Binds the texture for use in GL
71
      * \param n valid texture index
73
      * \param n valid texture index
72
      * \param s Which TextureStorage should be accessed
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
      * \brief Loads Buffer as texture
80
      * \brief Loads Buffer as texture
85
      * \param filter if the texture should be mipmap filtered
88
      * \param filter if the texture should be mipmap filtered
86
      * \returns texture ID or < 0 on error
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
                        TextureStorage s = TextureStorage::GAME,
94
                        TextureStorage s = TextureStorage::GAME,
92
                        int slot = -1, bool filter = true);
95
                        int slot = -1, bool filter = true);
93
 
96
 

+ 0
- 728
include/TombRaider.h View File

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
-/*!
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
-/*!
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
     virtual int execute(std::istream& args);
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
 #endif
21
 #endif
33
 
22
 

+ 2
- 23
include/global.h View File

11
 
11
 
12
 void renderFrame();
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
 // Colors used where ever needed
14
 // Colors used where ever needed
25
 const unsigned char BLACK[]  = {   0,   0,   0, 255 };
15
 const unsigned char BLACK[]  = {   0,   0,   0, 255 };
26
 const unsigned char GREY[]   = { 128, 128, 128, 255 };
16
 const unsigned char GREY[]   = { 128, 128, 128, 255 };
77
     unknownKey // Should always be at the end
67
     unknownKey // Should always be at the end
78
 } KeyboardButton;
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
 // Globally include OpenGL header
70
 // Globally include OpenGL header
91
 #ifdef __APPLE__
71
 #ifdef __APPLE__
92
-#include <OpenGL/gl.h>
72
+#include <OpenGL/gl3.h>
93
 #else
73
 #else
94
 #ifdef _WIN32
74
 #ifdef _WIN32
95
 #include <windows.h>
75
 #include <windows.h>
96
 #endif
76
 #endif
97
-#include <GL/gl.h>
98
-#include <GL/glext.h>
77
+#include <GL/gl3.h>
99
 #endif
78
 #endif
100
 
79
 
101
 // If available, use our own assert that prints the call stack
80
 // If available, use our own assert that prints the call stack

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

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
-/*!
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
-/*!
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
-/*!
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
 #ifndef _FONT_TRLE_H_
8
 #ifndef _FONT_TRLE_H_
9
 #define _FONT_TRLE_H_
9
 #define _FONT_TRLE_H_
10
 
10
 
11
+#include "glm/vec2.hpp"
12
+#include <vector>
13
+
11
 /*!
14
 /*!
12
  * \brief Tomb Raider Level Editor Font loader
15
  * \brief Tomb Raider Level Editor Font loader
13
  */
16
  */
30
   private:
33
   private:
31
     static void setDefaultOffsets();
34
     static void setDefaultOffsets();
32
     static void loadLPS(std::string f);
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
     static bool mFontInit;
39
     static bool mFontInit;
37
     static unsigned int mFontTexture;
40
     static unsigned int mFontTexture;

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

8
 #ifndef _WINDOW_H_
8
 #ifndef _WINDOW_H_
9
 #define _WINDOW_H_
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
 class Window {
36
 class Window {
15
   public:
37
   public:
16
 
38
 
17
     virtual ~Window() {}
39
     virtual ~Window() {}
18
 
40
 
19
     virtual void setSize(unsigned int width, unsigned int height) = 0;
41
     virtual void setSize(unsigned int width, unsigned int height) = 0;
42
+    virtual unsigned int getWidth();
43
+    virtual unsigned int getHeight();
20
 
44
 
21
     virtual void setFullscreen(bool fullscreen) = 0;
45
     virtual void setFullscreen(bool fullscreen) = 0;
22
-
23
-    virtual bool getFullscreen() { return mFullscreen; }
46
+    virtual bool getFullscreen();
24
 
47
 
25
     virtual void setMousegrab(bool grab) = 0;
48
     virtual void setMousegrab(bool grab) = 0;
26
-
27
-    virtual bool getMousegrab() { return mMousegrab; }
49
+    virtual bool getMousegrab();
28
 
50
 
29
     virtual int initialize() = 0;
51
     virtual int initialize() = 0;
30
 
52
 
31
     virtual void eventHandling() = 0;
53
     virtual void eventHandling() = 0;
32
 
54
 
33
     virtual void setTextInput(bool on) = 0;
55
     virtual void setTextInput(bool on) = 0;
34
-
35
-    virtual bool getTextInput() { return mTextInput; }
56
+    virtual bool getTextInput();
36
 
57
 
37
     virtual void swapBuffersGL() = 0;
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
   protected:
67
   protected:
56
     bool mInit;
68
     bool mInit;
59
     bool mTextInput;
71
     bool mTextInput;
60
     unsigned int mWidth;
72
     unsigned int mWidth;
61
     unsigned int mHeight;
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
 Window& getWindow();
89
 Window& getWindow();

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

11
 #ifndef _UTILS_PCX_H_
11
 #ifndef _UTILS_PCX_H_
12
 #define _UTILS_PCX_H_
12
 #define _UTILS_PCX_H_
13
 
13
 
14
+#include "TextureManager.h"
15
+
14
 /*!
16
 /*!
15
  * \brief Check if a file is a valid PCX image
17
  * \brief Check if a file is a valid PCX image
16
  * \param filename path of file to read
18
  * \param filename path of file to read
29
  * \returns 0 on success
31
  * \returns 0 on success
30
  */
32
  */
31
 int pcxLoad(const char* filename, unsigned char** image,
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
 #endif
37
 #endif
35
 
38
 

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

8
 #ifndef _UTILS_PNG_H_
8
 #ifndef _UTILS_PNG_H_
9
 #define _UTILS_PNG_H_
9
 #define _UTILS_PNG_H_
10
 
10
 
11
+#include "TextureManager.h"
12
+
11
 /*!
13
 /*!
12
  * \brief Check if a file is a valid PNG image
14
  * \brief Check if a file is a valid PNG image
13
  * \param filename path of file to read
15
  * \param filename path of file to read
26
  * \returns 0 on success
28
  * \returns 0 on success
27
  */
29
  */
28
 int pngLoad(const char* filename, unsigned char** image,
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
  * \brief Create a PNG image file from an RGBA buffer
35
  * \brief Create a PNG image file from an RGBA buffer
39
  * \returns 0 on success
42
  * \returns 0 on success
40
  */
43
  */
41
 int pngSave(const char* filename, unsigned char* image,
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
 #endif
48
 #endif
45
 
49
 

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

18
 /*!
18
 /*!
19
  * \brief Load a TGA image from file
19
  * \brief Load a TGA image from file
20
  * \param filename path to file
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
  * \param width where the width will be stored
22
  * \param width where the width will be stored
23
  * \param height where the height will be stored
23
  * \param height where the height will be stored
24
  * \param type where the type will be stored (tga_type_t)
24
  * \param type where the type will be stored (tga_type_t)

+ 8
- 6
src/CMakeLists.txt View File

55
     add_definitions (${PNG_DEFINITIONS})
55
     add_definitions (${PNG_DEFINITIONS})
56
 endif (PNG_FOUND)
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
 # Set Source files
66
 # Set Source files
78
 set (SRCS ${SRCS} "Sprite.cpp")
84
 set (SRCS ${SRCS} "Sprite.cpp")
79
 set (SRCS ${SRCS} "StaticMesh.cpp")
85
 set (SRCS ${SRCS} "StaticMesh.cpp")
80
 set (SRCS ${SRCS} "TextureManager.cpp")
86
 set (SRCS ${SRCS} "TextureManager.cpp")
81
-set (SRCS ${SRCS} "TombRaider.cpp")
82
 set (SRCS ${SRCS} "UI.cpp")
87
 set (SRCS ${SRCS} "UI.cpp")
83
-set (SRCS ${SRCS} "ViewVolume.cpp")
84
 set (SRCS ${SRCS} "World.cpp")
88
 set (SRCS ${SRCS} "World.cpp")
85
 
89
 
86
 # Select available Sound library
90
 # Select available Sound library
219
 add_subdirectory ("commands")
223
 add_subdirectory ("commands")
220
 add_subdirectory ("deps")
224
 add_subdirectory ("deps")
221
 add_subdirectory ("loader")
225
 add_subdirectory ("loader")
222
-add_subdirectory ("math")
223
 add_subdirectory ("system")
226
 add_subdirectory ("system")
224
 add_subdirectory ("utils")
227
 add_subdirectory ("utils")
225
 
228
 
227
 add_library (OpenRaider_all OBJECT ${SRCS})
230
 add_library (OpenRaider_all OBJECT ${SRCS})
228
 add_executable (OpenRaider MACOSX_BUNDLE ${RESRCS}
231
 add_executable (OpenRaider MACOSX_BUNDLE ${RESRCS}
229
     $<TARGET_OBJECTS:OpenRaider_all> $<TARGET_OBJECTS:OpenRaider_commands>
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
  * \author xythobuz
6
  * \author xythobuz
7
  */
7
  */
8
 
8
 
9
+#include "glm/gtc/matrix_transform.hpp"
10
+
9
 #include "global.h"
11
 #include "global.h"
10
-#include <cmath>
11
-#include "math/Matrix.h"
12
 #include "Camera.h"
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
 }
69
 }
70
 
70
 
71
 void Console::display() {
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
         if (lastLogLength != getLog().size()) {
73
         if (lastLogLength != getLog().size()) {
74
             lastLogLength = getLog().size();
74
             lastLogLength = getLog().size();
75
             scrollToBottom = true;
75
             scrollToBottom = true;

+ 7
- 46
src/Entity.cpp View File

5
  * \author xythobuz
5
  * \author xythobuz
6
  */
6
  */
7
 
7
 
8
-#include <cmath>
8
+#include "glm/glm.hpp"
9
 
9
 
10
 #include "global.h"
10
 #include "global.h"
11
 #include "Log.h"
11
 #include "Log.h"
12
-#include "Render.h"
13
 #include "World.h"
12
 #include "World.h"
14
 #include "Entity.h"
13
 #include "Entity.h"
15
 
14
 
16
-#include "games/TombRaider1.h"
17
-
18
 Entity::Entity(float p[3], float a[3], int id, long r, unsigned int model) {
15
 Entity::Entity(float p[3], float a[3], int id, long r, unsigned int model) {
19
     for (int i = 0; i < 3; i++) {
16
     for (int i = 0; i < 3; i++) {
20
         pos[i] = p[i];
17
         pos[i] = p[i];
30
     state = 0;
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
 void Entity::display() {
30
 void Entity::display() {
31
+    /*
64
     glPushMatrix();
32
     glPushMatrix();
65
     glTranslatef(pos[0], pos[1], pos[2]);
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
     getWorld().getSkeletalModel(skeletalModel).display(animationFrame, boneFrame);
37
     getWorld().getSkeletalModel(skeletalModel).display(animationFrame, boneFrame);
70
     glPopMatrix();
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
 void Entity::move(char movement) {
42
 void Entity::move(char movement) {
233
              << ")" << Log::endl
194
              << ")" << Log::endl
234
              << "  " << pos[0] << "x " << pos[1] << "y " << pos[2] << "z"
195
              << "  " << pos[0] << "x " << pos[1] << "y " << pos[2] << "z"
235
              << Log::endl
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
 SkeletalModel& Entity::getModel() {
200
 SkeletalModel& Entity::getModel() {

+ 13
- 294
src/Game.cpp View File

24
 #include "World.h"
24
 #include "World.h"
25
 #include "utils/strings.h"
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
 Game::Game() {
27
 Game::Game() {
34
     mLoaded = false;
28
     mLoaded = false;
35
     mLara = -1;
29
     mLara = -1;
40
 
34
 
41
 int Game::initialize() {
35
 int Game::initialize() {
42
     // Enable Renderer
36
     // Enable Renderer
43
-    getRender().setMode(Render::modeLoadScreen);
37
+    Render::setMode(RenderMode::LoadScreen);
44
 
38
 
45
     return 0;
39
     return 0;
46
 }
40
 }
47
 
41
 
48
 void Game::display() {
42
 void Game::display() {
49
-    getRender().display();
43
+    Render::display();
50
 }
44
 }
51
 
45
 
52
 void Game::destroy() {
46
 void Game::destroy() {
53
     mLoaded = false;
47
     mLoaded = false;
54
     mLara = -1;
48
     mLara = -1;
55
-    getRender().setMode(Render::modeLoadScreen);
49
+    Render::setMode(RenderMode::LoadScreen);
56
 
50
 
57
     getWorld().destroy();
51
     getWorld().destroy();
58
-    getRender().ClearWorld();
59
     Sound::clear(); // Remove all previously loaded sounds
52
     Sound::clear(); // Remove all previously loaded sounds
60
     SoundManager::clear();
53
     SoundManager::clear();
61
     getTextureManager().clear();
54
     getTextureManager().clear();
67
 
60
 
68
 int Game::loadLevel(const char* level) {
61
 int Game::loadLevel(const char* level) {
69
     destroy();
62
     destroy();
70
-
71
     levelName = level;
63
     levelName = level;
72
-
73
     getLog() << "Loading " << levelName << Log::endl;
64
     getLog() << "Loading " << levelName << Log::endl;
74
-
75
-    int error = 0;
76
     auto loader = Loader::createLoader(level);
65
     auto loader = Loader::createLoader(level);
77
     if (loader) {
66
     if (loader) {
78
         // First Loader test
67
         // First Loader test
79
         getLog() << "Trying to load using new loader..." << Log::endl;
68
         getLog() << "Trying to load using new loader..." << Log::endl;
80
-        error = loader->load(level);
69
+        int error = loader->load(level);
81
         if (error != 0) {
70
         if (error != 0) {
82
             getLog() << "Error while trying new loader (" << error << ")..." << Log::endl;
71
             getLog() << "Error while trying new loader (" << error << ")..." << Log::endl;
83
             destroy();
72
             destroy();
73
+            return -2;
84
         } else {
74
         } else {
85
             SoundManager::prepareSources();
75
             SoundManager::prepareSources();
86
 
76
 
88
                 getLog() << "Can't find Lara entity in level?!" << Log::endl;
78
                 getLog() << "Can't find Lara entity in level?!" << Log::endl;
89
             } else {
79
             } else {
90
                 mLoaded = true;
80
                 mLoaded = true;
91
-                //getRender().setMode(Render::modeVertexLight);
81
+                //Render::setMode(RenderMode::Texture);
92
             }
82
             }
93
 
83
 
94
             UI::setVisible(true);
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
 void Game::handleAction(ActionEvents action, bool isFinished) {
93
 void Game::handleAction(ActionEvents action, bool isFinished) {
164
 
116
 
165
 void Game::handleMouseMotion(int xrel, int yrel, int xabs, int yabs) {
117
 void Game::handleMouseMotion(int xrel, int yrel, int xabs, int yabs) {
166
     if (mLoaded) {
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
         float angles[3] = { 0.0f, getCamera().getRadianYaw(), getCamera().getRadianPitch() };
122
         float angles[3] = { 0.0f, getCamera().getRadianYaw(), getCamera().getRadianPitch() };
185
         getLara().setAngles(angles);
123
         getLara().setAngles(angles);
124
+        */
186
     }
125
     }
187
 }
126
 }
188
 
127
 
198
     mLara = lara;
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
         unsigned int xOverlay = (::getWindow().getWidth() - wOverlay) / 2;
142
         unsigned int xOverlay = (::getWindow().getWidth() - wOverlay) / 2;
143
         unsigned int yOverlay = (::getWindow().getHeight() - hOverlay) / 2;
143
         unsigned int yOverlay = (::getWindow().getHeight() - hOverlay) / 2;
144
 
144
 
145
+        /*
145
         glColor4f(0.0f, 0.0f, 0.0f, 0.75f);
146
         glColor4f(0.0f, 0.0f, 0.0f, 0.75f);
146
         glDisable(GL_TEXTURE_2D);
147
         glDisable(GL_TEXTURE_2D);
147
         glRecti(xOverlay, yOverlay, xOverlay + wOverlay, yOverlay + hOverlay);
148
         glRecti(xOverlay, yOverlay, xOverlay + wOverlay, yOverlay + hOverlay);
148
         glEnable(GL_TEXTURE_2D);
149
         glEnable(GL_TEXTURE_2D);
150
+        */
149
 
151
 
150
         Font::drawTextWrapped(xOverlay + 10, yOverlay + 5, 1.0f, BLUE, w0, dialogText);
152
         Font::drawTextWrapped(xOverlay + 10, yOverlay + 5, 1.0f, BLUE, w0, dialogText);
151
         if (dialogButton2.length() > 0) {
153
         if (dialogButton2.length() > 0) {

+ 7
- 9
src/MenuFolder.cpp View File

9
 #include "Game.h"
9
 #include "Game.h"
10
 #include "loader/Loader.h"
10
 #include "loader/Loader.h"
11
 #include "Log.h"
11
 #include "Log.h"
12
+#include "Render.h"
12
 #include "RunTime.h"
13
 #include "RunTime.h"
13
 #include "MenuFolder.h"
14
 #include "MenuFolder.h"
14
 #include "system/Font.h"
15
 #include "system/Font.h"
76
     if (!visible)
77
     if (!visible)
77
         return;
78
         return;
78
 
79
 
79
-    ::getWindow().glEnter2D();
80
+    Font::drawTextCentered(0, 10, 1.2f, BLUE, ::getWindow().getWidth(), VERSION);
80
 
81
 
81
     // Draw half-transparent overlay
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
     // Draw heading
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
     // Estimate displayable number of items
90
     // Estimate displayable number of items
91
-    int items = (::getWindow().getHeight() - 60) / 25;
91
+    int items = (getWindow().getHeight() - 60) / 25;
92
 
92
 
93
     // Print list of "..", folders, files
93
     // Print list of "..", folders, files
94
     for (long i = mMin; (i < (mMin + items))
94
     for (long i = mMin; (i < (mMin + items))
105
     }
105
     }
106
 
106
 
107
     displayDialog();
107
     displayDialog();
108
-
109
-    ::getWindow().glExit2D();
110
 }
108
 }
111
 
109
 
112
 void MenuFolder::loadOrOpen() {
110
 void MenuFolder::loadOrOpen() {

+ 94
- 54
src/Mesh.cpp View File

11
 #include "TextureManager.h"
11
 #include "TextureManager.h"
12
 #include "Mesh.h"
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
     texturedRectangles.emplace_back(a, b, c, d, textile);
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
     coloredRectangles.emplace_back(a, b, c, d, -1, re, gr, bl);
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
     normals.emplace_back(n);
33
     normals.emplace_back(n);
32
 }
34
 }
33
 
35
 
54
         return;
56
         return;
55
     }
57
     }
56
 
58
 
57
-    // Render textured quads
58
     for (auto& q : texturedRectangles) {
59
     for (auto& q : texturedRectangles) {
59
         if (mMode == MeshModeWireframe) {
60
         if (mMode == MeshModeWireframe) {
60
             getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
61
             getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
62
+            /*
61
             glBegin(GL_QUADS);
63
             glBegin(GL_QUADS);
62
             glTexCoord2f(0.0f, 0.0f);
64
             glTexCoord2f(0.0f, 0.0f);
63
             glVertex3f(q.a.x, q.a.y, q.a.z);
65
             glVertex3f(q.a.x, q.a.y, q.a.z);
68
             glTexCoord2f(0.0f, 1.0f);
70
             glTexCoord2f(0.0f, 1.0f);
69
             glVertex3f(q.d.x, q.d.y, q.d.z);
71
             glVertex3f(q.d.x, q.d.y, q.d.z);
70
             glEnd();
72
             glEnd();
73
+            */
74
+        } else if (mMode == MeshModeSolid) {
75
+            // TODO
71
         } else if (mMode == MeshModeTexture) {
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
     for (unsigned int i = 0; i < mNumVertices; i++)
181
     for (unsigned int i = 0; i < mNumVertices; i++)
115
         delete [] mVertices[i];
182
         delete [] mVertices[i];
116
     delete [] mVertices;
183
     delete [] mVertices;
117
-    mVertices = NULL;
184
+    mVertices = nullptr;
118
 
185
 
119
     for (unsigned int i = 0; i < mNumNormals; i++)
186
     for (unsigned int i = 0; i < mNumNormals; i++)
120
         delete [] mNormals[i];
187
         delete [] mNormals[i];
121
     delete [] mNormals;
188
     delete [] mNormals;
122
-    mNormals = NULL;
189
+    mNormals = nullptr;
123
 
190
 
124
     for (unsigned int i = 0; i < mNumColors; i++)
191
     for (unsigned int i = 0; i < mNumColors; i++)
125
         delete [] mColors[i];
192
         delete [] mColors[i];
126
     delete [] mColors;
193
     delete [] mColors;
127
-    mColors = NULL;
194
+    mColors = nullptr;
128
 
195
 
129
     if (mTris) {
196
     if (mTris) {
130
         for (unsigned int i = 0; i < mNumTris; ++i) {
197
         for (unsigned int i = 0; i < mNumTris; ++i) {
135
         }
202
         }
136
 
203
 
137
         delete [] mTris;
204
         delete [] mTris;
138
-        mTris = NULL;
205
+        mTris = nullptr;
139
     }
206
     }
140
 
207
 
141
     if (mQuads) {
208
     if (mQuads) {
147
         }
214
         }
148
 
215
 
149
         delete [] mQuads;
216
         delete [] mQuads;
150
-        mQuads = NULL;
217
+        mQuads = nullptr;
151
     }
218
     }
152
 
219
 
153
     delete [] mVertexArray;
220
     delete [] mVertexArray;
154
-    mVertexArray = NULL;
221
+    mVertexArray = nullptr;
155
 
222
 
156
     delete [] mNormalArray;
223
     delete [] mNormalArray;
157
-    mNormalArray = NULL;
224
+    mNormalArray = nullptr;
158
 
225
 
159
     delete [] mColorArray;
226
     delete [] mColorArray;
160
-    mColorArray = NULL;
227
+    mColorArray = nullptr;
161
 
228
 
162
     delete [] mTriangleTextures;
229
     delete [] mTriangleTextures;
163
-    mTriangleTextures = NULL;
230
+    mTriangleTextures = nullptr;
164
 
231
 
165
     delete [] mTriangleIndices;
232
     delete [] mTriangleIndices;
166
-    mTriangleIndices = NULL;
233
+    mTriangleIndices = nullptr;
167
 
234
 
168
     delete [] mTriangleFlags;
235
     delete [] mTriangleFlags;
169
-    mTriangleFlags = NULL;
236
+    mTriangleFlags = nullptr;
170
 
237
 
171
     delete [] mTriangleTexCoordArray;
238
     delete [] mTriangleTexCoordArray;
172
-    mTriangleTexCoordArray = NULL;
239
+    mTriangleTexCoordArray = nullptr;
173
 }
240
 }
174
 
241
 
175
 
242
 
180
 void Mesh::drawAlphaOld() {
247
 void Mesh::drawAlphaOld() {
181
     unsigned int i, j, k, index;
248
     unsigned int i, j, k, index;
182
 
249
 
250
+    /*
183
 
251
 
184
     // Render quadralaterals
252
     // Render quadralaterals
185
     for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i) {
253
     for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i) {
246
 
314
 
247
         glEnd();
315
         glEnd();
248
     }
316
     }
317
+
318
+    */
249
 }
319
 }
250
 
320
 
251
 
321
 
252
 void Mesh::drawSolidOld() {
322
 void Mesh::drawSolidOld() {
253
     unsigned int i, j, k, index;
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
     // Render quadralaterals
328
     // Render quadralaterals
291
     for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i) {
329
     for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i) {
402
         glActiveTextureARB(GL_TEXTURE0_ARB);
440
         glActiveTextureARB(GL_TEXTURE0_ARB);
403
     }
441
     }
404
 #endif
442
 #endif
443
+
444
+    */
405
 }
445
 }
406
 
446
 
407
 
447
 

+ 63
- 511
src/Render.cpp View File

22
 #include "World.h"
22
 #include "World.h"
23
 #include "system/Window.h"
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
             break;
35
             break;
177
-        case Render::modeSolid:
178
-        case Render::modeWireframe:
36
+        case RenderMode::Solid:
37
+        case RenderMode::Wireframe:
179
             glClearColor(PURPLE[0] / 256.0f, PURPLE[1] / 256.0f,
38
             glClearColor(PURPLE[0] / 256.0f, PURPLE[1] / 256.0f,
180
                          PURPLE[2] / 256.0f, PURPLE[3] / 256.0f);
39
                          PURPLE[2] / 256.0f, PURPLE[3] / 256.0f);
181
-            glDisable(GL_TEXTURE_2D);
40
+            //glDisable(GL_TEXTURE_2D);
182
             break;
41
             break;
183
         default:
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
             glClearColor(BLACK[0] / 256.0f, BLACK[1] / 256.0f,
43
             glClearColor(BLACK[0] / 256.0f, BLACK[1] / 256.0f,
191
                          BLACK[2] / 256.0f, BLACK[3] / 256.0f);
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
 void Render::display() {
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
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
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
         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
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
                          unsigned int texture, TextureManager::TextureStorage s) {
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
  * \author xythobuz
5
  * \author xythobuz
6
  */
6
  */
7
 
7
 
8
+#include "glm/gtx/intersect.hpp"
9
+
8
 #include <algorithm>
10
 #include <algorithm>
9
 
11
 
10
 #include "global.h"
12
 #include "global.h"
14
 #include "Room.h"
16
 #include "Room.h"
15
 #include "TextureManager.h"
17
 #include "TextureManager.h"
16
 
18
 
17
-#ifdef MULTITEXTURE
18
-#include <map>
19
-extern std::map<int, int> gMapTex2Bump;
20
-#endif
21
-
22
 Room::Room(float p[3], unsigned int f, unsigned int x, unsigned int z)
19
 Room::Room(float p[3], unsigned int f, unsigned int x, unsigned int z)
23
     : flags(f), numXSectors(x), numZSectors(z) {
20
     : flags(f), numXSectors(x), numZSectors(z) {
24
     if (p == nullptr) {
21
     if (p == nullptr) {
45
         pos[i] = p[i];
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
 #define EMPTY_VECTOR(x)     \
45
 #define EMPTY_VECTOR(x)     \
412
 while (!x.empty()) {        \
46
 while (!x.empty()) {        \
413
     delete x[x.size() - 1]; \
47
     delete x[x.size() - 1]; \
423
 }
57
 }
424
 
58
 
425
 void Room::display(bool alpha) {
59
 void Room::display(bool alpha) {
60
+    /*
426
     glPushMatrix();
61
     glPushMatrix();
427
     //LightingSetup();
62
     //LightingSetup();
428
 
63
 
429
     getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
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
         glLineWidth(2.0);
67
         glLineWidth(2.0);
433
         glColor3ubv(RED);
68
         glColor3ubv(RED);
434
 
69
 
448
         glLineWidth(1.0);
83
         glLineWidth(1.0);
449
     }
84
     }
450
 
85
 
451
-    if (getRender().getMode() == Render::modeWireframe && (!alpha)) {
86
+    if (Render::getMode() == RenderMode::Wireframe && (!alpha)) {
452
         bbox.display(true, RED, GREEN);
87
         bbox.display(true, RED, GREEN);
453
     }
88
     }
454
 
89
 
457
     // Reset since GL_MODULATE used, reset to WHITE
92
     // Reset since GL_MODULATE used, reset to WHITE
458
     glColor3ubv(WHITE);
93
     glColor3ubv(WHITE);
459
 
94
 
460
-    switch (getRender().getMode()) {
461
-        case Render::modeWireframe:
95
+    switch (Render::getMode()) {
96
+        case RenderMode::Wireframe:
462
             mesh.mMode = Mesh::MeshModeWireframe;
97
             mesh.mMode = Mesh::MeshModeWireframe;
463
             break;
98
             break;
464
-        case Render::modeSolid:
99
+        case RenderMode::Solid:
465
             mesh.mMode = Mesh::MeshModeSolid;
100
             mesh.mMode = Mesh::MeshModeSolid;
466
             break;
101
             break;
467
         default:
102
         default:
477
     glPopMatrix();
112
     glPopMatrix();
478
 
113
 
479
     // Draw other room meshes and sprites
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
         for (unsigned int i = 0; i < sizeModels(); i++)
118
         for (unsigned int i = 0; i < sizeModels(); i++)
484
             getModel(i).display();
119
             getModel(i).display();
485
 
120
 
486
         for (unsigned int i = 0; i < sizeSprites(); i++)
121
         for (unsigned int i = 0; i < sizeSprites(); i++)
487
             getSprite(i).display();
122
             getSprite(i).display();
488
     }
123
     }
124
+    */
489
 }
125
 }
490
 
126
 
491
 bool Room::isWall(unsigned long sector) {
127
 bool Room::isWall(unsigned long sector) {
496
 }
132
 }
497
 
133
 
498
 long Room::getSector(float x, float z, float* floor, float* ceiling) {
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
     long sector = getSector(x, z);
138
     long sector = getSector(x, z);
503
 
139
 
527
 
163
 
528
 int Room::getAdjoiningRoom(float x, float y, float z,
164
 int Room::getAdjoiningRoom(float x, float y, float z,
529
                            float x2, float y2, float z2) {
165
                            float x2, float y2, float z2) {
530
-    float intersect[3], p1[3], p2[3];
531
     float vertices[4][3];
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
     for (unsigned long i = 0; i < portals.size(); i++) {
172
     for (unsigned long i = 0; i < portals.size(); i++) {
537
         portals.at(i)->getVertices(vertices);
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
             return portals.at(i)->getAdjoiningRoom();
181
             return portals.at(i)->getAdjoiningRoom();
541
     }
182
     }
542
 
183
 
616
     models.push_back(s);
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
 unsigned long Room::sizeLights() {
260
 unsigned long Room::sizeLights() {
624
     return lights.size();
261
     return lights.size();
625
 }
262
 }

+ 7
- 66
src/RoomData.cpp View File

6
  */
6
  */
7
 
7
 
8
 #include "global.h"
8
 #include "global.h"
9
-#include "Render.h"
10
 #include "SkeletalModel.h"
9
 #include "SkeletalModel.h"
11
 #include "World.h"
10
 #include "World.h"
12
 #include "RoomData.h"
11
 #include "RoomData.h"
44
 }
43
 }
45
 
44
 
46
 void BoundingBox::display(bool points, const unsigned char c1[4], const unsigned char c2[4]) {
45
 void BoundingBox::display(bool points, const unsigned char c1[4], const unsigned char c2[4]) {
46
+    /*
47
     // Bind before entering now
47
     // Bind before entering now
48
     //glBindTexture(GL_TEXTURE_2D, 1);
48
     //glBindTexture(GL_TEXTURE_2D, 1);
49
     glPointSize(4.0);
49
     glPointSize(4.0);
114
 
114
 
115
     glPointSize(1.0);
115
     glPointSize(1.0);
116
     //glLineWidth(1.0);
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
 void Light::getPos(float p[4]) {
122
 void Light::getPos(float p[4]) {
143
     p[0] = pos[0];
123
     p[0] = pos[0];
144
     p[1] = pos[1];
124
     p[1] = pos[1];
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
 void StaticModel::display() {
156
 void StaticModel::display() {
181
     StaticMesh& mesh = getWorld().getStaticMesh(index);
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
     glPushMatrix();
163
     glPushMatrix();
187
     glTranslated(pos[0], pos[1], pos[2]);
164
     glTranslated(pos[0], pos[1], pos[2]);
188
     glRotated(yaw, 0, 1, 0);
165
     glRotated(yaw, 0, 1, 0);
189
     mesh.display();
166
     mesh.display();
190
     glPopMatrix();
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
     for (unsigned int i = 0; i < 4; i++) {
174
     for (unsigned int i = 0; i < 4; i++) {
223
         for (unsigned int j = 0; j < 3; j++) {
175
         for (unsigned int j = 0; j < 3; j++) {
224
             vertices[i][j] = vert[i][j];
176
             vertices[i][j] = vert[i][j];
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
 float Sector::getFloor() {
201
 float Sector::getFloor() {
261
     return floor;
202
     return floor;
262
 }
203
 }

+ 2
- 254
src/SkeletalModel.cpp View File

8
 
8
 
9
 #include "global.h"
9
 #include "global.h"
10
 #include "Log.h"
10
 #include "Log.h"
11
-#include "Render.h"
12
 #include "SkeletalModel.h"
11
 #include "SkeletalModel.h"
13
 #include "World.h"
12
 #include "World.h"
14
 
13
 
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
 void BoneTag::display() {
23
 void BoneTag::display() {
62
     if (getWorld().sizeMesh() > 0)
24
     if (getWorld().sizeMesh() > 0)
63
         getWorld().getMesh(mesh).drawSolid(); // TODO ?
25
         getWorld().getMesh(mesh).drawSolid(); // TODO ?
88
         pos[i] = p[i];
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
 BoneFrame::~BoneFrame() {
53
 BoneFrame::~BoneFrame() {
106
     for (unsigned long i = 0; i < tag.size(); i++)
54
     for (unsigned long i = 0; i < tag.size(); i++)
107
         delete tag[i];
55
         delete tag[i];
132
     rate = r;
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
 AnimationFrame::~AnimationFrame() {
83
 AnimationFrame::~AnimationFrame() {
182
     for (unsigned long i = 0; i < frame.size(); i++)
84
     for (unsigned long i = 0; i < frame.size(); i++)
183
         delete frame[i];
85
         delete frame[i];
202
     id = i;
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
 SkeletalModel::~SkeletalModel() {
107
 SkeletalModel::~SkeletalModel() {
307
     for (unsigned long i = 0; i < animation.size(); i++)
108
     for (unsigned long i = 0; i < animation.size(); i++)
308
         delete animation[i];
109
         delete animation[i];
309
 }
110
 }
310
 
111
 
311
 void SkeletalModel::display(unsigned long aframe, unsigned long bframe) {
112
 void SkeletalModel::display(unsigned long aframe, unsigned long bframe) {
113
+    /*
312
     assert(aframe < size());
114
     assert(aframe < size());
313
     assert(bframe < get(aframe).size());
115
     assert(bframe < get(aframe).size());
314
 
116
 
343
             glRotatef(rot[2], 0, 0, 1);
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
         tag.display();
148
         tag.display();
402
     }
149
     }
150
+    */
403
 }
151
 }
404
 
152
 
405
 int SkeletalModel::getId() {
153
 int SkeletalModel::getId() {

+ 14
- 47
src/Sprite.cpp View File

5
  * \author xythobuz
5
  * \author xythobuz
6
  */
6
  */
7
 
7
 
8
+#include "glm/glm.hpp"
9
+
8
 #include "global.h"
10
 #include "global.h"
9
 #include "Camera.h"
11
 #include "Camera.h"
10
 #include "Game.h"
12
 #include "Game.h"
20
     sprites.push_back(s);
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
 unsigned long SpriteSequence::size() {
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
 Sprite& SpriteSequence::get(unsigned long index) {
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
     //radius = width2 / 2.0f;
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
 void Sprite::display() {
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
     //    return;
86
     //    return;
123
 
87
 
124
     glPushMatrix();
88
     glPushMatrix();
125
     //glTranslated(pos[0], pos[1], pos[2]);
89
     //glTranslated(pos[0], pos[1], pos[2]);
126
 
90
 
127
     // Sprites must always face camera, because they have no depth =)
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
         // No vertex lighting on sprites, as far as I see in specs
95
         // No vertex lighting on sprites, as far as I see in specs
132
         // So just draw normal texture, no case 2
96
         // So just draw normal texture, no case 2
133
-        case Render::modeSolid:
97
+        case RenderMode::Solid:
134
             glBegin(GL_TRIANGLE_STRIP);
98
             glBegin(GL_TRIANGLE_STRIP);
135
             glColor3f(texel[0][0], texel[0][1], 0.5);
99
             glColor3f(texel[0][0], texel[0][1], 0.5);
136
             glVertex3fv(vertex[0]);
100
             glVertex3fv(vertex[0]);
145
             glVertex3fv(vertex[2]);
109
             glVertex3fv(vertex[2]);
146
             glEnd();
110
             glEnd();
147
             break;
111
             break;
148
-        case Render::modeWireframe:
112
+        case RenderMode::Wireframe:
149
             glColor3ubv(CYAN);
113
             glColor3ubv(CYAN);
150
             glBegin(GL_LINE_LOOP);
114
             glBegin(GL_LINE_LOOP);
151
             glVertex3fv(vertex[0]);
115
             glVertex3fv(vertex[0]);
171
     }
135
     }
172
 
136
 
173
     glPopMatrix();
137
     glPopMatrix();
138
+    */
174
 }
139
 }
175
 
140
 
176
 void Sprite::display(float x, float y, float w, float h) {
141
 void Sprite::display(float x, float y, float w, float h) {
142
+    /*
177
     float z = 0.0f;
143
     float z = 0.0f;
178
 
144
 
179
     getTextureManager().bindTextureId(texture);
145
     getTextureManager().bindTextureId(texture);
193
     glVertex3f(x, y + h, z);
159
     glVertex3f(x, y + h, z);
194
 
160
 
195
     glEnd();
161
     glEnd();
162
+    */
196
 }
163
 }
197
 
164
 

+ 14
- 141
src/StaticMesh.cpp View File

28
 }
28
 }
29
 
29
 
30
 void TexturedTriangle::display(float* vertices, float* colors, float* normals) {
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
         getTextureManager().bindTextureId(texture);
36
         getTextureManager().bindTextureId(texture);
36
     }
37
     }
37
 
38
 
38
     glBegin(GL_TRIANGLES);
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
                 glColor3fv(colors + index[0]);
45
                 glColor3fv(colors + index[0]);
45
                 glTexCoord2fv(st);
46
                 glTexCoord2fv(st);
46
                 glVertex3fv(vertices + (index[0] * 3));
47
                 glVertex3fv(vertices + (index[0] * 3));
52
                 glColor3fv(colors + index[2]);
53
                 glColor3fv(colors + index[2]);
53
                 glTexCoord2fv(st + 4);
54
                 glTexCoord2fv(st + 4);
54
                 glVertex3fv(vertices + (index[2] * 3));
55
                 glVertex3fv(vertices + (index[2] * 3));
55
-            } else if (normals != NULL) {
56
+            } else if (normals != nullptr) {
56
                 glNormal3fv(normals + (index[0] * 3));
57
                 glNormal3fv(normals + (index[0] * 3));
57
                 glTexCoord2fv(st);
58
                 glTexCoord2fv(st);
58
                 glVertex3fv(vertices + (index[0] * 3));
59
                 glVertex3fv(vertices + (index[0] * 3));
74
             }
75
             }
75
             break;
76
             break;
76
 
77
 
77
-        case Render::modeWireframe:
78
+        case RenderMode::Wireframe:
78
             glVertex3fv(vertices + (index[0] * 3));
79
             glVertex3fv(vertices + (index[0] * 3));
79
             glVertex3fv(vertices + (index[1] * 3));
80
             glVertex3fv(vertices + (index[1] * 3));
80
             glVertex3fv(vertices + (index[2] * 3));
81
             glVertex3fv(vertices + (index[2] * 3));
90
     }
91
     }
91
 
92
 
92
     glEnd();
93
     glEnd();
94
+    */
93
 }
95
 }
94
 
96
 
95
 // ----------------------------------------------------------------------------
97
 // ----------------------------------------------------------------------------
98
     vertices = colors = normals = nullptr;
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
 StaticMesh::~StaticMesh() {
103
 StaticMesh::~StaticMesh() {
233
     while (!triangles.empty()) {
104
     while (!triangles.empty()) {
234
         delete triangles.back();
105
         delete triangles.back();
241
 }
112
 }
242
 
113
 
243
 void StaticMesh::display() {
114
 void StaticMesh::display() {
115
+    /*
244
     if ((id != -1) && (mesh != -1)) {
116
     if ((id != -1) && (mesh != -1)) {
245
         getWorld().getMesh(mesh).drawSolid();
117
         getWorld().getMesh(mesh).drawSolid();
246
         return;
118
         return;
254
         //! \fixme 'AMBIENT' -- Mongoose 2002.01.08
126
         //! \fixme 'AMBIENT' -- Mongoose 2002.01.08
255
         glColor3ubv(WHITE);
127
         glColor3ubv(WHITE);
256
 
128
 
257
-        if (getRender().getMode() == Render::modeWireframe)
129
+        if (Render::getMode() == RenderMode::Wireframe)
258
             glColor3ubv(WHITE);
130
             glColor3ubv(WHITE);
259
 
131
 
260
         getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
132
         getTextureManager().bindTextureId(TEXTURE_WHITE, TextureManager::TextureStorage::SYSTEM);
262
         for (unsigned int i = 0; i < triangles.size(); i++)
134
         for (unsigned int i = 0; i < triangles.size(); i++)
263
             triangles.at(i)->display(vertices, colors, normals);
135
             triangles.at(i)->display(vertices, colors, normals);
264
     }
136
     }
137
+    */
265
 }
138
 }
266
 
139
 
267
 float StaticMesh::getRadius() {
140
 float StaticMesh::getRadius() {

+ 45
- 81
src/TextureManager.cpp View File

40
     vertices.push_back(t);
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
     //! \fixme TR Rosetta Stone says this, but looks strange?
44
     //! \fixme TR Rosetta Stone says this, but looks strange?
59
     /*
45
     /*
60
     if (attribute == 0) {
46
     if (attribute == 0) {
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
     float xmin = 256.0f, xmax = 0.0f;
52
     float xmin = 256.0f, xmax = 0.0f;
84
     float ymin = 256.0f, ymax = 0.0f;
53
     float ymin = 256.0f, ymax = 0.0f;
85
     for (int i = 0; i < 4; i++) {
54
     for (int i = 0; i < 4; i++) {
98
         }
67
         }
99
     }
68
     }
100
 
69
 
70
+    /*
101
     glBegin(GL_QUADS);
71
     glBegin(GL_QUADS);
102
     glTexCoord2f(xmin / 256.0f, ymin / 256.0f);
72
     glTexCoord2f(xmin / 256.0f, ymin / 256.0f);
103
     glVertex3f(a.x, a.y, a.z);
73
     glVertex3f(a.x, a.y, a.z);
108
     glTexCoord2f(xmin / 256.0f, ymax / 256.0f);
78
     glTexCoord2f(xmin / 256.0f, ymax / 256.0f);
109
     glVertex3f(d.x, d.y, d.z);
79
     glVertex3f(d.x, d.y, d.z);
110
     glEnd();
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
 }
166
 }
210
 
167
 
211
 int TextureManager::initialize() {
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
     unsigned char* image = generateColorTexture(WHITE, 32, 32, 32);
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
     delete [] image;
184
     delete [] image;
215
     if (res < 0) {
185
     if (res < 0) {
216
         return -1;
186
         return -1;
232
                                    unsigned int width, unsigned int height,
202
                                    unsigned int width, unsigned int height,
233
                                    ColorMode mode, unsigned int bpp,
203
                                    ColorMode mode, unsigned int bpp,
234
                                    TextureStorage s, int slot, bool filter) {
204
                                    TextureStorage s, int slot, bool filter) {
235
-    assert(image != NULL);
236
     assert(width > 0);
205
     assert(width > 0);
237
     assert(height > 0);
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
     assert((bpp == 8) || (bpp == 24) || (bpp == 32));
212
     assert((bpp == 8) || (bpp == 24) || (bpp == 32));
242
 
213
 
243
     if (slot == -1)
214
     if (slot == -1)
249
         getIds(s).push_back(id);
220
         getIds(s).push_back(id);
250
     }
221
     }
251
 
222
 
223
+    if (image == nullptr)
224
+        return slot;
225
+
252
     unsigned int glcMode;
226
     unsigned int glcMode;
253
     switch (mode) {
227
     switch (mode) {
254
-        case GREYSCALE:
255
-            glcMode = GL_LUMINANCE;
228
+        case ColorMode::BGR:
229
+            glcMode = GL_BGR;
256
             break;
230
             break;
257
 
231
 
258
-        case BGR:
259
-            bgr2rgb24(image, width, height);
232
+        case ColorMode::RGB:
260
             glcMode = GL_RGB;
233
             glcMode = GL_RGB;
261
             break;
234
             break;
262
 
235
 
263
-        case RGB:
264
-            glcMode = GL_RGB;
265
-            break;
266
-
267
-        case ARGB:
236
+        case ColorMode::ARGB:
268
             argb2rgba32(image, width, height);
237
             argb2rgba32(image, width, height);
269
             glcMode = GL_RGBA;
238
             glcMode = GL_RGBA;
270
             break;
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
             break;
243
             break;
276
 
244
 
277
-        case RGBA:
245
+        case ColorMode::RGBA:
278
             glcMode = GL_RGBA;
246
             glcMode = GL_RGBA;
279
             break;
247
             break;
280
     }
248
     }
281
 
249
 
282
-    glColor3ubv(WHITE);
283
-    glEnable(GL_DEPTH_TEST);
284
-    glShadeModel(GL_SMOOTH);
285
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
250
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
286
     glBindTexture(GL_TEXTURE_2D, getIds(s).at(slot));
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
     if (filter) {
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
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
256
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
293
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
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
     } else {
261
     } else {
295
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
262
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
296
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
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
     return slot;
266
     return slot;
302
 }
267
 }
303
 
268
 
305
     return getIds(s).size();
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
     assert(n < getIds(s).size());
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
     glBindTexture(GL_TEXTURE_2D, getIds(s).at(n));
278
     glBindTexture(GL_TEXTURE_2D, getIds(s).at(n));
315
 }
279
 }
316
 
280
 
329
 }
293
 }
330
 
294
 
331
 int TextureManager::loadPCX(const char* filename, TextureStorage s, int slot) {
295
 int TextureManager::loadPCX(const char* filename, TextureStorage s, int slot) {
332
-    assert(filename != NULL);
296
+    assert(filename != nullptr);
333
     assert(filename[0] != '\0');
297
     assert(filename[0] != '\0');
334
 
298
 
335
     unsigned char* image;
299
     unsigned char* image;
353
 
317
 
354
 int TextureManager::loadPNG(const char* filename, TextureStorage s, int slot) {
318
 int TextureManager::loadPNG(const char* filename, TextureStorage s, int slot) {
355
 #ifdef USING_PNG
319
 #ifdef USING_PNG
356
-    assert(filename != NULL);
320
+    assert(filename != nullptr);
357
     assert(filename[0] != '\0');
321
     assert(filename[0] != '\0');
358
 
322
 
359
     if (pngCheck(filename) != 0) {
323
     if (pngCheck(filename) != 0) {
384
 }
348
 }
385
 
349
 
386
 int TextureManager::loadTGA(const char* filename, TextureStorage s, int slot) {
350
 int TextureManager::loadTGA(const char* filename, TextureStorage s, int slot) {
387
-    assert(filename != NULL);
351
+    assert(filename != nullptr);
388
     assert(filename[0] != '\0');
352
     assert(filename[0] != '\0');
389
 
353
 
390
     unsigned char* image;
354
     unsigned char* image;
402
         }
366
         }
403
         if (image) {
367
         if (image) {
404
             id = loadBufferSlot(image, w, h,
368
             id = loadBufferSlot(image, w, h,
405
-                                (type == 2) ? RGBA : RGB,
369
+                                (type == 2) ? ColorMode::RGBA : ColorMode::RGB,
406
                                 (type == 2) ? 32 : 24,
370
                                 (type == 2) ? 32 : 24,
407
                                 s, slot);
371
                                 s, slot);
408
             delete [] image;
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
     //! \todo Use our own font subsystem instead of this?
73
     //! \todo Use our own font subsystem instead of this?
74
     const void* png_data;
74
     const void* png_data;
75
     unsigned int png_size;
75
     unsigned int png_size;
76
-    ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
76
+    ImGui::GetDefaultFontData(nullptr, nullptr, &png_data, &png_size);
77
     int tex_x, tex_y, tex_comp;
77
     int tex_x, tex_y, tex_comp;
78
     void* tex_data = stbi_load_from_memory((const unsigned char*)png_data,
78
     void* tex_data = stbi_load_from_memory((const unsigned char*)png_data,
79
                                            (int)png_size, &tex_x, &tex_y, &tex_comp, 0);
79
                                            (int)png_size, &tex_x, &tex_y, &tex_comp, 0);
80
 
80
 
81
-    //! \fixme TODO use proper texture slot
82
     fontTex = getTextureManager().loadBufferSlot((unsigned char*)tex_data,
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
     stbi_image_free(tex_data);
85
     stbi_image_free(tex_data);
86
 
86
 
311
 
311
 
312
         ImGui::Separator();
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
         static bool visibleTex = false;
351
         static bool visibleTex = false;
315
         static bool visibleTile = false;
352
         static bool visibleTile = false;
316
         static bool visibleAnim = false;
353
         static bool visibleAnim = false;
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
         if (ImGui::CollapsingHeader("Sprite Sequence Viewer")) {
511
         if (ImGui::CollapsingHeader("Sprite Sequence Viewer")) {
511
             if (getWorld().sizeSprite() <= 0) {
512
             if (getWorld().sizeSprite() <= 0) {
512
                 ImGui::Text("Please load a level containing sprites!");
513
                 ImGui::Text("Please load a level containing sprites!");
566
                 }
567
                 }
567
             }
568
             }
568
         }
569
         }
570
+        */
569
 
571
 
570
         ImGui::Separator();
572
         ImGui::Separator();
571
 
573
 
572
         if (ImGui::CollapsingHeader("ImGui/Debug UI Help")) {
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
             ImGui::ShowUserGuide();
578
             ImGui::ShowUserGuide();
577
         }
579
         }
578
     }
580
     }
652
     if (cmd_lists_count == 0)
654
     if (cmd_lists_count == 0)
653
         return;
655
         return;
654
 
656
 
655
-    getWindow().glEnter2D();
656
-
657
-    glDisable(GL_DEPTH_TEST);
658
     glEnable(GL_SCISSOR_TEST);
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
     glEnable(GL_DEPTH_TEST);
734
     glEnable(GL_DEPTH_TEST);
687
     glDisable(GL_SCISSOR_TEST);
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
-/*!
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
 # Source files
1
 # Source files
2
 set (CMD_SRCS ${CMD_SRCS} "Command.cpp")
2
 set (CMD_SRCS ${CMD_SRCS} "Command.cpp")
3
-set (CMD_SRCS ${CMD_SRCS} "CommandAnimate.cpp")
4
 set (CMD_SRCS ${CMD_SRCS} "CommandBind.cpp")
3
 set (CMD_SRCS ${CMD_SRCS} "CommandBind.cpp")
5
 set (CMD_SRCS ${CMD_SRCS} "CommandEngine.cpp")
4
 set (CMD_SRCS ${CMD_SRCS} "CommandEngine.cpp")
6
 set (CMD_SRCS ${CMD_SRCS} "CommandGame.cpp")
5
 set (CMD_SRCS ${CMD_SRCS} "CommandGame.cpp")

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

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

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

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
 
83
 
84
     renderFrame();
84
     renderFrame();
85
     renderFrame(); // Double buffered
85
     renderFrame(); // Double buffered
86
-    getRender().screenShot(filename.c_str());
86
+    Render::screenShot(filename.c_str());
87
 
87
 
88
     getMenu().setVisible(false);
88
     getMenu().setVisible(false);
89
     UI::setVisible(true);
89
     UI::setVisible(true);

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

8
 #include "global.h"
8
 #include "global.h"
9
 #include "Game.h"
9
 #include "Game.h"
10
 #include "Log.h"
10
 #include "Log.h"
11
-#include "RunTime.h"
12
 #include "Render.h"
11
 #include "Render.h"
13
 #include "commands/CommandRender.h"
12
 #include "commands/CommandRender.h"
14
 
13
 
27
     getLog() << "  wireframe" << Log::endl;
26
     getLog() << "  wireframe" << Log::endl;
28
     getLog() << "  solid" << Log::endl;
27
     getLog() << "  solid" << Log::endl;
29
     getLog() << "  texture" << Log::endl;
28
     getLog() << "  texture" << Log::endl;
30
-    getLog() << "  vertexlight" << Log::endl;
31
     getLog() << "  titlescreen" << Log::endl;
29
     getLog() << "  titlescreen" << Log::endl;
30
+    getLog() << "  disabled" << Log::endl;
32
 
31
 
33
 }
32
 }
34
 
33
 
41
     std::string s;
40
     std::string s;
42
     args >> s;
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
         getLog() << "Wireframe mode" << Log::endl;
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
         getLog() << "Solid mode" << Log::endl;
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
         getLog() << "Titlescreen mode" << Log::endl;
54
         getLog() << "Titlescreen mode" << Log::endl;
55
+    } else if (s == "disabled") {
56
+        Render::setMode(RenderMode::Disabled);
57
+        getLog() << "Disabled mode" << Log::endl;
59
     } else {
58
     } else {
60
         getLog() << "Invalid use of mode command (" << s << ")!" << Log::endl;
59
         getLog() << "Invalid use of mode command (" << s << ")!" << Log::endl;
61
         return -2;
60
         return -2;
64
     return 0;
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
  * \author xythobuz
5
  * \author xythobuz
6
  */
6
  */
7
 
7
 
8
+#include "glm/glm.hpp"
9
+
8
 #include "global.h"
10
 #include "global.h"
9
 #include "Camera.h"
11
 #include "Camera.h"
10
 #include "Log.h"
12
 #include "Log.h"
103
             getLog() << "set-mouse_x-Error: Invalid value" << Log::endl;
105
             getLog() << "set-mouse_x-Error: Invalid value" << Log::endl;
104
             return -6;
106
             return -6;
105
         }
107
         }
106
-        getCamera().setSensitivityX(OR_DEG_TO_RAD(sense));
108
+        Camera::setSensitivityX(glm::radians(sense));
107
     } else if (var.compare("mouse_y") == 0) {
109
     } else if (var.compare("mouse_y") == 0) {
108
         float sense = 1.0f;
110
         float sense = 1.0f;
109
         if (!(args >> sense)) {
111
         if (!(args >> sense)) {
110
             getLog() << "set-mouse_y-Error: Invalid value" << Log::endl;
112
             getLog() << "set-mouse_y-Error: Invalid value" << Log::endl;
111
             return -7;
113
             return -7;
112
         }
114
         }
113
-        getCamera().setSensitivityY(OR_DEG_TO_RAD(sense));
115
+        Camera::setSensitivityY(glm::radians(sense));
114
     } else if (var.compare("fps") == 0) {
116
     } else if (var.compare("fps") == 0) {
115
         bool fps = false;
117
         bool fps = false;
116
         if (!(args >> fps)) {
118
         if (!(args >> fps)) {
187
     } else if (var.compare("volume") == 0) {
189
     } else if (var.compare("volume") == 0) {
188
         getLog() << Sound::getVolume() << Log::endl;
190
         getLog() << Sound::getVolume() << Log::endl;
189
     } else if (var.compare("mouse_x") == 0) {
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
     } else if (var.compare("mouse_y") == 0) {
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
     } else if (var.compare("fps") == 0) {
195
     } else if (var.compare("fps") == 0) {
194
         getLog() << getRunTime().getShowFPS() << Log::endl;
196
         getLog() << getRunTime().getShowFPS() << Log::endl;
195
     } else if (var.compare("basedir") == 0) {
197
     } else if (var.compare("basedir") == 0) {

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

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

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

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

+ 11
- 23
src/main.cpp View File

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

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

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
-/*!
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
-/*!
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
-/*!
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
-/*!
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
 #define SCALE_DRAW 20.0f
13
 #define SCALE_DRAW 20.0f
14
 
14
 
15
 unsigned int FontImGui::widthText(float scale, std::string s) {
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
 void FontImGui::drawText(unsigned int x, unsigned int y, float scale,
22
 void FontImGui::drawText(unsigned int x, unsigned int y, float scale,
35
 }
34
 }
36
 
35
 
37
 unsigned int FontImGui::heightText(float scale, unsigned int maxWidth, std::string s) {
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
 void FontImGui::drawTextWrapped(unsigned int x, unsigned int y, float scale,
43
 void FontImGui::drawTextWrapped(unsigned int x, unsigned int y, float scale,
46
                                 const unsigned char color[4], unsigned int maxWidth, std::string s) {
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
 #include <iostream>
8
 #include <iostream>
9
 
9
 
10
 #include "global.h"
10
 #include "global.h"
11
+#include "TextureManager.h"
12
+#include "system/Window.h"
11
 #include "system/FontSDL.h"
13
 #include "system/FontSDL.h"
12
 
14
 
13
 bool FontSDL::mFontInit = false;
15
 bool FontSDL::mFontInit = false;
14
 TTF_Font* FontSDL::mFont = nullptr;
16
 TTF_Font* FontSDL::mFont = nullptr;
15
-unsigned int FontSDL::mFontTexture = 0;
17
+unsigned int FontSDL::mFontTexture = -1;
16
 
18
 
17
 void FontSDL::shutdown() {
19
 void FontSDL::shutdown() {
18
     if (mFont != nullptr)
20
     if (mFont != nullptr)
21
 
23
 
22
     if (mFontInit) {
24
     if (mFontInit) {
23
         TTF_Quit();
25
         TTF_Quit();
24
-        glDeleteTextures(1, &mFontTexture);
25
         mFontInit = false;
26
         mFontInit = false;
26
     }
27
     }
27
 }
28
 }
33
             return -1;
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
         mFontInit = true;
41
         mFontInit = true;
38
     }
42
     }
39
 
43
 
82
     int w = (int)((float)surface->w * scale);
86
     int w = (int)((float)surface->w * scale);
83
     int h = (int)((float)surface->h * scale);
87
     int h = (int)((float)surface->h * scale);
84
 
88
 
85
-    GLenum textureFormat;
89
+    TextureManager::ColorMode textureFormat;
90
+    unsigned int bpp = 0;
86
     if (surface->format->BytesPerPixel == 4) {
91
     if (surface->format->BytesPerPixel == 4) {
87
         if (surface->format->Rmask == 0x000000FF)
92
         if (surface->format->Rmask == 0x000000FF)
88
-            textureFormat = GL_RGBA;
93
+            textureFormat = TextureManager::ColorMode::RGBA;
89
         else
94
         else
90
-            textureFormat = GL_BGRA_EXT;
95
+            textureFormat = TextureManager::ColorMode::BGRA;
96
+        bpp = 32;
91
     } else {
97
     } else {
92
         if (surface->format->Rmask == 0x000000FF)
98
         if (surface->format->Rmask == 0x000000FF)
93
-            textureFormat = GL_RGB;
99
+            textureFormat = TextureManager::ColorMode::RGB;
94
         else
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
     SDL_FreeSurface(surface);
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
 unsigned int FontSDL::heightText(float scale, unsigned int maxWidth, std::string s) {
132
 unsigned int FontSDL::heightText(float scale, unsigned int maxWidth, std::string s) {
163
     int w = (int)((float)surface->w * scale);
168
     int w = (int)((float)surface->w * scale);
164
     int h = (int)((float)surface->h * scale);
169
     int h = (int)((float)surface->h * scale);
165
 
170
 
166
-    GLenum textureFormat;
171
+    TextureManager::ColorMode textureFormat;
172
+    unsigned int bpp = 0;
167
     if (surface->format->BytesPerPixel == 4) {
173
     if (surface->format->BytesPerPixel == 4) {
168
         if (surface->format->Rmask == 0x000000FF)
174
         if (surface->format->Rmask == 0x000000FF)
169
-            textureFormat = GL_RGBA;
175
+            textureFormat = TextureManager::ColorMode::RGBA;
170
         else
176
         else
171
-            textureFormat = GL_BGRA_EXT;
177
+            textureFormat = TextureManager::ColorMode::BGRA;
178
+        bpp = 32;
172
     } else {
179
     } else {
173
         if (surface->format->Rmask == 0x000000FF)
180
         if (surface->format->Rmask == 0x000000FF)
174
-            textureFormat = GL_RGB;
181
+            textureFormat = TextureManager::ColorMode::RGB;
175
         else
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
     SDL_FreeSurface(surface);
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
 #include <stdexcept>
11
 #include <stdexcept>
12
 
12
 
13
 #include "global.h"
13
 #include "global.h"
14
+#include "TextureManager.h"
14
 #include "utils/strings.h"
15
 #include "utils/strings.h"
16
+#include "system/Window.h"
15
 #include "system/FontTRLE.h"
17
 #include "system/FontTRLE.h"
16
 
18
 
17
 #define SCALING 2.0f
19
 #define SCALING 2.0f
21
 int FontTRLE::offsets[106][5];
23
 int FontTRLE::offsets[106][5];
22
 
24
 
23
 void FontTRLE::shutdown() {
25
 void FontTRLE::shutdown() {
24
-    if (mFontInit)
25
-        glDeleteTextures(1, &mFontTexture);
26
 }
26
 }
27
 
27
 
28
 int FontTRLE::initialize(std::string font) {
28
 int FontTRLE::initialize(std::string font) {
46
         pixels[i] = pixels[i + 1] = pixels[i + 2] = (unsigned char)y;
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
     delete [] pixels;
51
     delete [] pixels;
56
 
52
 
57
     // Try to load .lps file or use default glyph positions
53
     // Try to load .lps file or use default glyph positions
69
         return;
65
         return;
70
     }
66
     }
71
 
67
 
72
-    //! \todo This is probably the worlds most unreliable parser...
73
-
74
     for (std::string line; std::getline(file, line);) {
68
     for (std::string line; std::getline(file, line);) {
75
         std::istringstream stream(line);
69
         std::istringstream stream(line);
76
         int index;
70
         int index;
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
     assert(mFontInit == true);
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
     // screen coordinates
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
     // texture part
104
     // texture part
111
     float txMin = ((float)offsets[index][0]) / 256.0f;
105
     float txMin = ((float)offsets[index][0]) / 256.0f;
113
     float tyMin = ((float)offsets[index][1]) / 256.0f;
107
     float tyMin = ((float)offsets[index][1]) / 256.0f;
114
     float tyMax = ((float)(offsets[index][1] + offsets[index][3])) / 256.0f;
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
 unsigned int FontTRLE::widthText(float scale, std::string s) {
127
 unsigned int FontTRLE::widthText(float scale, std::string s) {
154
     assert(mFontInit == true);
150
     assert(mFontInit == true);
155
     assert(s.length() > 0);
151
     assert(s.length() > 0);
156
 
152
 
153
+    std::vector<glm::vec2> vertices;
154
+    std::vector<glm::vec2> uvs;
157
     for (unsigned int i = 0; i < s.length(); i++) {
155
     for (unsigned int i = 0; i < s.length(); i++) {
158
         // index into offset table
156
         // index into offset table
159
         int index = s[i] - '!';
157
         int index = s[i] - '!';
164
         if ((index < 0) || (index > 105))
162
         if ((index < 0) || (index > 105))
165
             continue; // skip unprintable chars
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
         x += (int)((float)(offsets[index][2] + 1) * scale * SCALING); // width
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
 unsigned int FontTRLE::heightText(float scale, unsigned int maxWidth, std::string s) {
173
 unsigned int FontTRLE::heightText(float scale, unsigned int maxWidth, std::string s) {
210
     unsigned int xStart = x;
211
     unsigned int xStart = x;
211
     unsigned int yMax = 0;
212
     unsigned int yMax = 0;
212
 
213
 
214
+    std::vector<glm::vec2> vertices;
215
+    std::vector<glm::vec2> uvs;
213
     for (unsigned int i = 0; i < s.length(); i++) {
216
     for (unsigned int i = 0; i < s.length(); i++) {
214
         // index into offset table
217
         // index into offset table
215
         int index = s[i] - '!';
218
         int index = s[i] - '!';
233
             x -= (int)((float)(offsets[index][2] + 1) * scale * SCALING);
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
         x += (int)((float)(offsets[index][2] + 1) * scale * SCALING); // width
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
 int FontTRLE::defaultOffsets[106][5] = {
247
 int FontTRLE::defaultOffsets[106][5] = {

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

32
     if (init)
32
     if (init)
33
         return 0;
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
     alcMakeContextCurrent(context);
37
     alcMakeContextCurrent(context);
38
 
38
 
39
     if (alutInitWithoutContext(nullptr, nullptr) == AL_FALSE) {
39
     if (alutInitWithoutContext(nullptr, nullptr) == AL_FALSE) {

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

5
  * \author xythobuz
5
  * \author xythobuz
6
  */
6
  */
7
 
7
 
8
-#include <cstdio>
9
-#include <cstring>
10
-#include <cstdarg>
11
-#include <cmath>
12
-
13
 #include "global.h"
8
 #include "global.h"
14
-#include "math/math.h"
9
+#include "Log.h"
10
+#include "TextureManager.h"
15
 #include "utils/strings.h"
11
 #include "utils/strings.h"
16
 #include "system/Window.h"
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
 int Window::initializeGL() {
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
     // Set up Z buffer
52
     // Set up Z buffer
33
     glEnable(GL_DEPTH_TEST);
53
     glEnable(GL_DEPTH_TEST);
54
+    // Accept fragment if closer to camera
34
     glDepthFunc(GL_LESS);
55
     glDepthFunc(GL_LESS);
35
 
56
 
36
     // Set up culling
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
     int argc = 1;
69
     int argc = 1;
70
     char* argv[] = { new char[11], nullptr };
70
     char* argv[] = { new char[11], nullptr };
71
     strcpy(argv[0], "OpenRaider");
71
     strcpy(argv[0], "OpenRaider");
72
-    glutInit(&argc, argv);
73
     glutInitWindowSize(mWidth, mHeight);
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
     glutCreateWindow(VERSION);
77
     glutCreateWindow(VERSION);
76
 
78
 
77
     glutReshapeFunc(WindowGLUT::reshapeCallback);
79
     glutReshapeFunc(WindowGLUT::reshapeCallback);

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

22
     mFullscreen = false;
22
     mFullscreen = false;
23
     mMousegrab = false;
23
     mMousegrab = false;
24
     mTextInput = false;
24
     mTextInput = false;
25
-    mWindow = NULL;
26
-    mGLContext = NULL;
25
+    mWindow = nullptr;
26
+    mGLContext = nullptr;
27
 }
27
 }
28
 
28
 
29
 WindowSDL::~WindowSDL() {
29
 WindowSDL::~WindowSDL() {
82
     if (mFullscreen)
82
     if (mFullscreen)
83
         flags |= SDL_WINDOW_FULLSCREEN;
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
         std::cout << "SDL_GL_SetAttribute Error: " << SDL_GetError() << std::endl;
97
         std::cout << "SDL_GL_SetAttribute Error: " << SDL_GetError() << std::endl;
91
         return -2;
98
         return -2;
92
     }
99
     }
93
 
100
 
94
     mWindow = SDL_CreateWindow(VERSION, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
101
     mWindow = SDL_CreateWindow(VERSION, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
95
                                mWidth, mHeight, flags);
102
                                mWidth, mHeight, flags);
96
-    if (mWindow == NULL) {
103
+    if (mWindow == nullptr) {
97
         std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
104
         std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
98
         return -3;
105
         return -3;
99
     }
106
     }
100
 
107
 
101
     mGLContext = SDL_GL_CreateContext(mWindow);
108
     mGLContext = SDL_GL_CreateContext(mWindow);
102
-    if (mGLContext == NULL) {
109
+    if (mGLContext == nullptr) {
103
         std::cout << "SDL_GL_CreateContext Error: " << SDL_GetError() << std::endl;
110
         std::cout << "SDL_GL_CreateContext Error: " << SDL_GetError() << std::endl;
104
         return -4;
111
         return -4;
105
     }
112
     }
147
 
154
 
148
             case SDL_TEXTINPUT:
155
             case SDL_TEXTINPUT:
149
             case SDL_TEXTEDITING:
156
             case SDL_TEXTEDITING:
150
-                if (event.text.text != NULL)
157
+                if (event.text.text != nullptr)
151
                     UI::handleText(event.text.text, (event.type == SDL_TEXTEDITING));
158
                     UI::handleText(event.text.text, (event.type == SDL_TEXTEDITING));
152
                 break;
159
                 break;
153
 
160
 

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

46
 #elif defined(_WIN32)
46
 #elif defined(_WIN32)
47
 
47
 
48
     char path[MAX_PATH];
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
     size_t lenPath = strlen(path);
50
     size_t lenPath = strlen(path);
51
     for (unsigned int i = 0; i < lenPath; i++)
51
     for (unsigned int i = 0; i < lenPath; i++)
52
         if (dir[i] == '\\')
52
         if (dir[i] == '\\')

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

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

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

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

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

19
 int pngCheck(const char* filename) {
19
 int pngCheck(const char* filename) {
20
     png_byte header[8];
20
     png_byte header[8];
21
 
21
 
22
-    assert(filename != NULL);
22
+    assert(filename != nullptr);
23
     assert(filename[0] != '\0');
23
     assert(filename[0] != '\0');
24
 
24
 
25
     FILE* fp = fopen(filename, "rb");
25
     FILE* fp = fopen(filename, "rb");
26
-    if (fp == NULL) {
26
+    if (fp == nullptr) {
27
         std::cout << "Could not open " << filename << std::endl;
27
         std::cout << "Could not open " << filename << std::endl;
28
         return -1;
28
         return -1;
29
     }
29
     }
40
 }
40
 }
41
 
41
 
42
 int pngLoad(const char* filename, unsigned char** image,
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
     png_byte header[8];
45
     png_byte header[8];
45
 
46
 
46
-    assert(filename != NULL);
47
+    assert(filename != nullptr);
47
     assert(filename[0] != '\0');
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
     FILE* fp = fopen(filename, "rb");
55
     FILE* fp = fopen(filename, "rb");
55
-    if (fp == NULL) {
56
+    if (fp == nullptr) {
56
         std::cout << "Could not open " << filename << std::endl;
57
         std::cout << "Could not open " << filename << std::endl;
57
         return -1;
58
         return -1;
58
     }
59
     }
65
         return -2;
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
     if (!png_ptr) {
70
     if (!png_ptr) {
70
         std::cout << "png_create_read_struct returned 0." << std::endl;
71
         std::cout << "png_create_read_struct returned 0." << std::endl;
71
         fclose(fp);
72
         fclose(fp);
75
     png_infop info_ptr = png_create_info_struct(png_ptr);
76
     png_infop info_ptr = png_create_info_struct(png_ptr);
76
     if (!info_ptr) {
77
     if (!info_ptr) {
77
         std::cout << "png_create_info_struct returned 0." << std::endl;
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
         fclose(fp);
80
         fclose(fp);
80
         return -4;
81
         return -4;
81
     }
82
     }
83
     png_infop end_info = png_create_info_struct(png_ptr);
84
     png_infop end_info = png_create_info_struct(png_ptr);
84
     if (!end_info) {
85
     if (!end_info) {
85
         std::cout << "png_create_info_struct returned 0." << std::endl;
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
         fclose(fp);
88
         fclose(fp);
88
         return -5;
89
         return -5;
89
     }
90
     }
103
     png_uint_32 tmpWidth, tmpHeight;
104
     png_uint_32 tmpWidth, tmpHeight;
104
 
105
 
105
     png_get_IHDR(png_ptr, info_ptr, &tmpWidth, &tmpHeight, &bit_depth, &color_type,
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
     *width = tmpWidth;
109
     *width = tmpWidth;
109
     *height = tmpHeight;
110
     *height = tmpHeight;
129
     delete [] row_pointers;
130
     delete [] row_pointers;
130
     fclose(fp);
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
         *bpp = 24;
135
         *bpp = 24;
138
     } else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
136
     } else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
139
-        *mode = RGBA;
137
+        *mode = TextureManager::ColorMode::RGBA;
140
         *bpp = 32;
138
         *bpp = 32;
141
     } else {
139
     } else {
142
         std::cout << filename << ": Unknown libpng color type " << color_type << std::endl;
140
         std::cout << filename << ": Unknown libpng color type " << color_type << std::endl;
164
 }
162
 }
165
 
163
 
166
 int pngSave(const char* filename, unsigned char* image,
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
     assert(filename[0] != '\0');
168
     assert(filename[0] != '\0');
170
-    assert(image != NULL);
169
+    assert(image != nullptr);
171
     assert(width > 0);
170
     assert(width > 0);
172
     assert(height > 0);
171
     assert(height > 0);
173
 
172
 
177
         return -1;
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
     if (!png_ptr) {
181
     if (!png_ptr) {
183
         std::cout << "png_create_write_struct failed" << std::endl;
182
         std::cout << "png_create_write_struct failed" << std::endl;
207
     }
206
     }
208
 
207
 
209
     int color_type;
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
             bgr2rgb24(image, width, height);
212
             bgr2rgb24(image, width, height);
215
         }
213
         }
216
         color_type = PNG_COLOR_TYPE_RGB;
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
             bgra2rgba32(image, width, height);
218
             bgra2rgba32(image, width, height);
220
         }
219
         }
221
         color_type = PNG_COLOR_TYPE_RGB_ALPHA;
220
         color_type = PNG_COLOR_TYPE_RGB_ALPHA;
252
         return -8;
251
         return -8;
253
     }
252
     }
254
 
253
 
255
-    png_write_end(png_ptr, NULL);
254
+    png_write_end(png_ptr, nullptr);
256
 
255
 
257
     delete [] row_pointers;
256
     delete [] row_pointers;
258
     fclose(fp);
257
     fclose(fp);

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

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

+ 0
- 9
test/CMakeLists.txt View File

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
 add_executable (tester_script EXCLUDE_FROM_ALL
28
 add_executable (tester_script EXCLUDE_FROM_ALL
38
     "Script.cpp" "../src/Script.cpp" "../src/main.cpp"
29
     "Script.cpp" "../src/Script.cpp" "../src/main.cpp"
39
     "../src/utils/binary.cpp" "../src/Exception.cpp"
30
     "../src/utils/binary.cpp" "../src/Exception.cpp"

+ 0
- 34
test/math.cpp View File

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