]> git.jsancho.org Git - lugaru.git/blob - Source/Graphic/Models.hpp
clang-format: Apply to all headers
[lugaru.git] / Source / Graphic / Models.hpp
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file)
4
5 This file is part of Lugaru.
6
7 Lugaru is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 Lugaru is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #ifndef _MODELS_HPP_
22 #define _MODELS_HPP_
23
24 #include "Environment/Terrain.hpp"
25 #include "Graphic/Texture.hpp"
26 #include "Graphic/gamegl.hpp"
27 #include "Math/XYZ.hpp"
28 #include "Utils/binio.h"
29
30 #include <cstdio>
31 #include <cstdlib>
32 #include <cstring>
33 #include <vector>
34
35 //
36 // Textures List
37 //
38 typedef struct
39 {
40     long xsz, ysz;
41     GLubyte* txt;
42 } ModelTexture;
43
44 //
45 // Model Structures
46 //
47
48 class TexturedTriangle
49 {
50 public:
51     short vertex[3];
52     float gx[3], gy[3];
53     XYZ facenormal;
54 };
55
56 #define max_model_decals 300
57
58 enum ModelType
59 {
60     nothing = 0,
61     notextype = 1,
62     rawtype = 2,
63     decalstype = 3,
64     normaltype = 4
65 };
66
67 class Model
68 {
69 public:
70     short vertexNum;
71
72     ModelType type;
73
74     int* owner;
75     XYZ* vertex;
76     XYZ* normals;
77     std::vector<TexturedTriangle> Triangles;
78     GLfloat* vArray;
79
80     /*
81     int owner[max_textured_triangle];
82     XYZ vertex[max_model_vertex];
83     XYZ normals[max_model_vertex];
84     GLfloat vArray[max_textured_triangle*24];*/
85
86     Texture textureptr;
87     ModelTexture modelTexture;
88     bool color;
89
90     XYZ boundingspherecenter;
91     float boundingsphereradius;
92
93     std::vector<Decal> decals;
94
95     bool flat;
96
97     Model();
98     ~Model();
99     void DeleteDecal(int which);
100     void MakeDecal(decal_type atype, XYZ* where, float* size, float* opacity, float* rotation);
101     void MakeDecal(decal_type atype, XYZ where, float size, float opacity, float rotation);
102     const XYZ& getTriangleVertex(unsigned triangleId, unsigned vertexId) const;
103     void drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloodtexture2, Texture breaktexture);
104     int SphereCheck(XYZ* p1, float radius, XYZ* p, XYZ* move, float* rotate);
105     int SphereCheckPossible(XYZ* p1, float radius, XYZ* move, float* rotate);
106     int LineCheck(XYZ* p1, XYZ* p2, XYZ* p, XYZ* move, float* rotate);
107     int LineCheckPossible(XYZ* p1, XYZ* p2, XYZ* p, XYZ* move, float* rotate);
108     int LineCheckSlidePossible(XYZ* p1, XYZ* p2, XYZ* move, float* rotate);
109     void UpdateVertexArray();
110     void UpdateVertexArrayNoTex();
111     void UpdateVertexArrayNoTexNoNorm();
112     bool loadnotex(const std::string& filename);
113     bool loadraw(const std::string& filename);
114     bool load(const std::string& filename);
115     bool loaddecal(const std::string& filename);
116     void Scale(float xscale, float yscale, float zscale);
117     void FlipTexCoords();
118     void UniformTexCoords();
119     void ScaleTexCoords(float howmuch);
120     void ScaleNormals(float xscale, float yscale, float zscale);
121     void Translate(float xtrans, float ytrans, float ztrans);
122     void CalculateNormals(bool facenormalise);
123     void draw();
124     void drawdifftex(Texture texture);
125     void drawimmediate();
126     void Rotate(float xang, float yang, float zang);
127     void deleteDeadDecals();
128
129 private:
130     void deallocate();
131     /* indices of triangles that might collide */
132     std::vector<unsigned int> possible;
133 };
134
135 #endif