optimizations with converting mesh to GLFloatArray

master
Vectozavr 2021-11-06 03:55:42 +07:00
parent 389936268a
commit 556ca037ec
5 changed files with 45 additions and 38 deletions

View File

@ -61,9 +61,8 @@ void Engine::create(int screenWidth, int screenHeight, const std::string &name,
for (auto &it : *world) { for (auto &it : *world) {
if (it.second->isVisible()) { if (it.second->isVisible()) {
GLfloat *model = it.second->glModel(); GLfloat *model = it.second->glModel();
GLfloat *geometry = Screen::glMeshToGLfloatArray(it.second); GLfloat *geometry = it.second->glFloatArray();
screen->glDrawMesh(geometry, view, model, 3 * it.second->triangles().size()); screen->glDrawMesh(geometry, view, model, 3 * it.second->triangles().size());
delete[] geometry;
delete[] model; delete[] model;
} }
} }

View File

@ -6,6 +6,7 @@
#include "Mesh.h" #include "Mesh.h"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "Screen.h"
using namespace std; using namespace std;
@ -107,4 +108,42 @@ void Mesh::setTriangles(vector<Triangle>&& t) {
Mesh::~Mesh() { Mesh::~Mesh() {
_tris.clear(); _tris.clear();
delete[] _geometry;
}
GLfloat *Mesh::glFloatArray() const {
if(_geometry != nullptr) {
return _geometry;
}
_geometry = new GLfloat[7 * 3 * _tris.size()];
for (size_t i = 0; i < _tris.size(); i++) {
unsigned stride = 21 * i;
Triangle triangle = _tris[i];
Vec3D norm = (model()*triangle.norm()).normalized();
float dot = static_cast<float>(norm.dot(Vec3D(0, 1, 2).normalized()));
for (int k = 0; k < 3; k++) {
sf::Color color = triangle.color();
GLfloat ambientColor[4] = {
static_cast<float>(color.r) * (0.3f * std::fabs(dot) + 0.7f) / 255.0f,
static_cast<float>(color.g) * (0.3f * std::fabs(dot) + 0.7f) / 255.0f,
static_cast<float>(color.b) * (0.3f * std::fabs(dot) + 0.7f) / 255.0f,
static_cast<float>(color.a) / 255.0f
};
_geometry[stride + 7 * k + 0] = static_cast<GLfloat>(triangle[k].x());
_geometry[stride + 7 * k + 1] = static_cast<GLfloat>(triangle[k].y());
_geometry[stride + 7 * k + 2] = static_cast<GLfloat>(triangle[k].z());
_geometry[stride + 7 * k + 3] = ambientColor[0];
_geometry[stride + 7 * k + 4] = ambientColor[1];
_geometry[stride + 7 * k + 5] = ambientColor[2];
_geometry[stride + 7 * k + 6] = ambientColor[3];
}
}
return _geometry;
} }

View File

@ -21,6 +21,8 @@ private:
Mesh &operator*=(const Matrix4x4 &matrix4X4); Mesh &operator*=(const Matrix4x4 &matrix4X4);
// OpenGL
mutable GLfloat* _geometry = nullptr;
public: public:
explicit Mesh(ObjectNameTag nameTag) : Object(std::move(nameTag)) {}; explicit Mesh(ObjectNameTag nameTag) : Object(std::move(nameTag)) {};
@ -56,6 +58,9 @@ public:
Mesh static LineTo(ObjectNameTag nameTag, const Vec3D &from, const Vec3D &to, double line_width = 0.1, Mesh static LineTo(ObjectNameTag nameTag, const Vec3D &from, const Vec3D &to, double line_width = 0.1,
const sf::Color &color = {150, 150, 150, 100}); const sf::Color &color = {150, 150, 150, 100});
// OpenGL functions
GLfloat *glFloatArray() const;
}; };
#endif //INC_3DZAVR_MESH_H #endif //INC_3DZAVR_MESH_H

View File

@ -166,37 +166,3 @@ void Screen::glDrawMesh(GLfloat *geometry, GLfloat *view, GLfloat *model, size_t
sf::Shader::bind(NULL); sf::Shader::bind(NULL);
} }
GLfloat *Screen::glMeshToGLfloatArray(std::shared_ptr<Mesh> mesh) {
std::vector<Triangle> const &triangles = mesh->triangles();
auto *geometry = new GLfloat[7 * 3 * triangles.size()];
for (size_t i = 0; i < triangles.size(); i++) {
int stride = 21 * i;
Triangle triangle = triangles[i];
float dot = static_cast<float>(triangle.norm().dot(Vec3D(0, 0.5, 1)));
for (int k = 0; k < 3; k++) {
sf::Color color = triangle.color();
GLfloat ambientColor[4] = {
color.r * (0.3f * std::fabs(dot) + 0.7f) / 255.0f,
color.g * (0.3f * std::fabs(dot) + 0.7f) / 255.0f,
color.b * (0.3f * std::fabs(dot) + 0.7f) / 255.0f,
color.a / 255.0f
};
geometry[stride + 7 * k + 0] = static_cast<GLfloat>(triangle[k].x());
geometry[stride + 7 * k + 1] = static_cast<GLfloat>(triangle[k].y());
geometry[stride + 7 * k + 2] = static_cast<GLfloat>(triangle[k].z());
geometry[stride + 7 * k + 3] = ambientColor[0];
geometry[stride + 7 * k + 4] = ambientColor[1];
geometry[stride + 7 * k + 5] = ambientColor[2];
geometry[stride + 7 * k + 6] = ambientColor[3];
}
}
return geometry;
}

View File

@ -62,8 +62,6 @@ public:
// OpenGL functions // OpenGL functions
void glDrawMesh(GLfloat *geometry, GLfloat *view, GLfloat *model, size_t count); void glDrawMesh(GLfloat *geometry, GLfloat *view, GLfloat *model, size_t count);
static GLfloat *glMeshToGLfloatArray(std::shared_ptr<Mesh> mesh);
[[nodiscard]] std::shared_ptr<sf::RenderWindow> renderWindow() { return _window; } [[nodiscard]] std::shared_ptr<sf::RenderWindow> renderWindow() { return _window; }
void pushGLStates() { _window->pushGLStates(); }; void pushGLStates() { _window->pushGLStates(); };