mesh and subclass structures
This commit is contained in:
parent
cb07c61b7f
commit
3be9178126
@ -1,13 +1,15 @@
|
|||||||
cmake_minimum_required (VERSION 3.16)
|
cmake_minimum_required (VERSION 3.16)
|
||||||
|
|
||||||
|
|
||||||
|
include(${CMAKE_SOURCE_DIR}/cmake/glad.cmake)
|
||||||
|
include(${CMAKE_SOURCE_DIR}/cmake/imgui.cmake)
|
||||||
|
|
||||||
project(
|
project(
|
||||||
hyporo
|
hyporo
|
||||||
VERSION 0.20.0
|
VERSION 0.20.0
|
||||||
LANGUAGES CXX
|
LANGUAGES CXX
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
option(WITH_GTESTS "Enable GTest unit testing" ON)
|
option(WITH_GTESTS "Enable GTest unit testing" ON)
|
||||||
|
|
||||||
enable_testing()
|
enable_testing()
|
||||||
@ -18,8 +20,6 @@ if(WITH_GTESTS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/glad.cmake)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/imgui.cmake)
|
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
|
@ -3,4 +3,4 @@ add_subdirectory(gpu)
|
|||||||
add_subdirectory(hmesh)
|
add_subdirectory(hmesh)
|
||||||
add_subdirectory(hyplib)
|
add_subdirectory(hyplib)
|
||||||
add_subdirectory(io)
|
add_subdirectory(io)
|
||||||
add_subdirectory(windowmanager)
|
add_subdirectory(window_system)
|
||||||
|
@ -5,49 +5,36 @@ include_directories(
|
|||||||
|
|
||||||
add_library(hyporo-gpu STATIC
|
add_library(hyporo-gpu STATIC
|
||||||
# Source files
|
# Source files
|
||||||
window_system.cpp
|
|
||||||
monitor.cpp
|
|
||||||
buffer.cpp
|
buffer.cpp
|
||||||
context.cpp
|
context.cpp
|
||||||
shader.cpp
|
device.cpp
|
||||||
window.cpp
|
|
||||||
opengl/buffer.cpp
|
opengl/buffer.cpp
|
||||||
opengl/context.cpp
|
opengl/context.cpp
|
||||||
|
opengl/device.cpp
|
||||||
opengl/shader.cpp
|
opengl/shader.cpp
|
||||||
opengl/texture.cpp
|
|
||||||
#opengl/device.cpp
|
|
||||||
opengl/shader_program.cpp
|
opengl/shader_program.cpp
|
||||||
texture.cpp
|
opengl/texture.cpp
|
||||||
#device.cpp
|
shader.cpp
|
||||||
glfw/window_system.cpp
|
|
||||||
glfw/monitor.cpp
|
|
||||||
glfw/window.cpp
|
|
||||||
shader_program.cpp
|
shader_program.cpp
|
||||||
|
texture.cpp
|
||||||
|
|
||||||
# Header files
|
# Header files
|
||||||
monitor.hpp
|
|
||||||
context.hpp
|
context.hpp
|
||||||
shader.hpp
|
shader.hpp
|
||||||
window_context.hpp
|
|
||||||
shader_program.hpp
|
shader_program.hpp
|
||||||
buffer.hpp
|
buffer.hpp
|
||||||
#device.hpp
|
device.hpp
|
||||||
window.hpp
|
|
||||||
texture.hpp
|
texture.hpp
|
||||||
opengl/context.hpp
|
opengl/context.hpp
|
||||||
opengl/shader.hpp
|
opengl/shader.hpp
|
||||||
opengl/shader_program.hpp
|
opengl/shader_program.hpp
|
||||||
opengl/buffer.hpp
|
opengl/buffer.hpp
|
||||||
#opengl/device.hpp
|
opengl/device.hpp
|
||||||
opengl/texture.hpp
|
opengl/texture.hpp
|
||||||
window_system.hpp
|
|
||||||
glfw/monitor.hpp
|
|
||||||
glfw/window.hpp
|
|
||||||
glfw/window_system.hpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(hyporo-gpu
|
target_link_libraries(hyporo-gpu
|
||||||
glad
|
glad
|
||||||
glfw
|
|
||||||
hyporo-hyplib
|
hyporo-hyplib
|
||||||
)
|
)
|
@ -9,14 +9,10 @@ include_directories(
|
|||||||
add_library(hyporo-hmesh STATIC
|
add_library(hyporo-hmesh STATIC
|
||||||
|
|
||||||
# Header files
|
# Header files
|
||||||
Vertex.hpp
|
mesh.hpp
|
||||||
Edge.hpp
|
|
||||||
Face.hpp
|
|
||||||
Cell.hpp
|
|
||||||
Mesh.hpp
|
|
||||||
|
|
||||||
# Source files
|
# Source files
|
||||||
Mesh.cpp
|
mesh.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(WITH_GTESTS)
|
if(WITH_GTESTS)
|
||||||
|
1
source/hyporo/hmesh/mesh.cpp
Normal file
1
source/hyporo/hmesh/mesh.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "mesh.hpp"
|
330
source/hyporo/hmesh/mesh.hpp
Normal file
330
source/hyporo/hmesh/mesh.hpp
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../hyplib/scalar/scalar.hpp"
|
||||||
|
#include "../hyplib/array/array.hpp"
|
||||||
|
#include "../hyplib/vector/vector.hpp"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
namespace hpr::mesh
|
||||||
|
{
|
||||||
|
class Edge;
|
||||||
|
class Vertex : public vec<scalar, 3>
|
||||||
|
{
|
||||||
|
friend class Mesh;
|
||||||
|
using base = vec<scalar, 3>;
|
||||||
|
protected:
|
||||||
|
darray<Edge*> p_refEdges;
|
||||||
|
public:
|
||||||
|
Vertex() :
|
||||||
|
base {}
|
||||||
|
{}
|
||||||
|
Vertex(const scalar& x, const scalar& y, const scalar& z) :
|
||||||
|
base {x, y, z}
|
||||||
|
{}
|
||||||
|
virtual
|
||||||
|
~Vertex()
|
||||||
|
{
|
||||||
|
for (auto& e : p_refEdges)
|
||||||
|
delete e;
|
||||||
|
}
|
||||||
|
darray<Edge*>& refEdges()
|
||||||
|
{
|
||||||
|
return p_refEdges;
|
||||||
|
}
|
||||||
|
void addRefEdge(Edge* edge)
|
||||||
|
{
|
||||||
|
p_refEdges.push(edge);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class Face;
|
||||||
|
class Edge : public sarray<Vertex*, 2>
|
||||||
|
{
|
||||||
|
friend class Mesh;
|
||||||
|
using vertex_pointer = Vertex*;
|
||||||
|
using base = sarray<vertex_pointer, 2>;
|
||||||
|
protected:
|
||||||
|
darray<Face*> p_refFaces;
|
||||||
|
public:
|
||||||
|
Edge() :
|
||||||
|
base {}
|
||||||
|
{}
|
||||||
|
Edge(vertex_pointer v1, vertex_pointer v2) :
|
||||||
|
base {v1, v2}
|
||||||
|
{}
|
||||||
|
virtual
|
||||||
|
~Edge()
|
||||||
|
{
|
||||||
|
for (auto& f : p_refFaces)
|
||||||
|
delete f;
|
||||||
|
}
|
||||||
|
darray<Face*>& refFaces()
|
||||||
|
{
|
||||||
|
return p_refFaces;
|
||||||
|
}
|
||||||
|
void addRefFace(Face* face)
|
||||||
|
{
|
||||||
|
p_refFaces.push(face);
|
||||||
|
}
|
||||||
|
sarray<vertex_pointer, 2>& vertices()
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
vertex_pointer vertex(size_type n)
|
||||||
|
{
|
||||||
|
return (*this)[n];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class Cell;
|
||||||
|
class Face : public darray<Edge*>
|
||||||
|
{
|
||||||
|
friend class Mesh;
|
||||||
|
using edge_pointer = Edge*;
|
||||||
|
using vertex_pointer = Vertex*;
|
||||||
|
using base = darray<edge_pointer>;
|
||||||
|
protected:
|
||||||
|
darray<Cell*> p_refCells;
|
||||||
|
public:
|
||||||
|
Face() :
|
||||||
|
base {}
|
||||||
|
{}
|
||||||
|
Face(std::initializer_list<edge_pointer> edges) :
|
||||||
|
base {edges}
|
||||||
|
{}
|
||||||
|
virtual
|
||||||
|
~Face()
|
||||||
|
{
|
||||||
|
for (auto& c : p_refCells)
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
darray<Cell*>& refCells()
|
||||||
|
{
|
||||||
|
return p_refCells;
|
||||||
|
}
|
||||||
|
void addRefCell(Cell* cell)
|
||||||
|
{
|
||||||
|
p_refCells.push(cell);
|
||||||
|
}
|
||||||
|
darray<edge_pointer>& edges()
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
edge_pointer edge(size_type n)
|
||||||
|
{
|
||||||
|
return (*this)[n];
|
||||||
|
}
|
||||||
|
darray<vertex_pointer> vertices()
|
||||||
|
{
|
||||||
|
darray<vertex_pointer> vertices_ {size(), nullptr};
|
||||||
|
for (auto n = 0; n < size(); ++n)
|
||||||
|
vertices_[n] = edge(n)->vertex(0);
|
||||||
|
return vertices_;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Cell : public darray<Face*>
|
||||||
|
{
|
||||||
|
using face_pointer = Face*;
|
||||||
|
using base = darray<face_pointer>;
|
||||||
|
public:
|
||||||
|
Cell(std::initializer_list<face_pointer> faces) :
|
||||||
|
base {faces}
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Mesh
|
||||||
|
{
|
||||||
|
#include "vertex.hpp"
|
||||||
|
public:
|
||||||
|
using size_type = std::size_t;
|
||||||
|
using vertex_pointer = Vertex*;
|
||||||
|
using edge_pointer = Edge*;
|
||||||
|
using face_pointer = Face*;
|
||||||
|
using cell_pointer = Cell*;
|
||||||
|
protected:
|
||||||
|
darray<Vertex*> p_vertices;
|
||||||
|
darray<Edge*> p_edges;
|
||||||
|
darray<Face*> p_faces;
|
||||||
|
darray<Cell*> p_cells;
|
||||||
|
public:
|
||||||
|
|
||||||
|
Mesh() = default;
|
||||||
|
Mesh(const Mesh&) = default;
|
||||||
|
~Mesh()
|
||||||
|
{
|
||||||
|
for (auto& v : p_vertices)
|
||||||
|
delete v;
|
||||||
|
for (auto& e : p_edges)
|
||||||
|
delete e;
|
||||||
|
for (auto& f : p_faces)
|
||||||
|
delete f;
|
||||||
|
for (auto& c : p_cells)
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int indexOf(vertex_pointer v)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < vertices().size(); ++n)
|
||||||
|
if (vertex(n) == v)
|
||||||
|
return n;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int indexOf(edge_pointer e)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < edges().size(); ++n)
|
||||||
|
if (edge(n) == e)
|
||||||
|
return n;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int indexOf(face_pointer e)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < faces().size(); ++n)
|
||||||
|
if (face(n) == e)
|
||||||
|
return n;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int indexOf(cell_pointer e)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < cells().size(); ++n)
|
||||||
|
if (cell(n) == e)
|
||||||
|
return n;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
darray<Vertex*>& vertices()
|
||||||
|
{
|
||||||
|
return p_vertices;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
vertex_pointer vertex(size_type n) const
|
||||||
|
{
|
||||||
|
return p_vertices[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
void addVertex(const scalar& x, const scalar& y, const scalar& z)
|
||||||
|
{
|
||||||
|
p_vertices.push(new Vertex(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeNullVertices()
|
||||||
|
{
|
||||||
|
vertices().remove([](vertex_pointer vertex){ return vertex == nullptr; });
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeVertex(size_type n, bool erase = true, bool cascade = true)
|
||||||
|
{
|
||||||
|
if (cascade)
|
||||||
|
{
|
||||||
|
for (auto &refEdge: vertex(n)->refEdges())
|
||||||
|
removeEdge(indexOf(refEdge), false);
|
||||||
|
removeNullEdges();
|
||||||
|
}
|
||||||
|
delete vertex(n);
|
||||||
|
if (erase)
|
||||||
|
vertices().remove(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
darray<Edge*>& edges()
|
||||||
|
{
|
||||||
|
return p_edges;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
edge_pointer edge(size_type n) const
|
||||||
|
{
|
||||||
|
return p_edges[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
void addEdge(vertex_pointer v1, vertex_pointer v2)
|
||||||
|
{
|
||||||
|
edges().push(new Edge {v1, v2});
|
||||||
|
v1->addRefEdge(edges().back());
|
||||||
|
v2->addRefEdge(edges().back());
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeNullEdges()
|
||||||
|
{
|
||||||
|
edges().remove([](edge_pointer edge){ return edge == nullptr; });
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeEdge(size_type n, bool erase = true, bool cascade = true)
|
||||||
|
{
|
||||||
|
if (cascade)
|
||||||
|
{
|
||||||
|
for (auto &refFace: edge(n)->refFaces())
|
||||||
|
removeFace(indexOf(refFace), false);
|
||||||
|
removeNullFaces();
|
||||||
|
}
|
||||||
|
delete edge(n);
|
||||||
|
if (erase)
|
||||||
|
edges().remove(n);
|
||||||
|
}
|
||||||
|
darray<Face*>& faces()
|
||||||
|
{
|
||||||
|
return p_faces;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
face_pointer face(size_type n) const
|
||||||
|
{
|
||||||
|
return p_faces[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <std::convertible_to<edge_pointer>... Edges>
|
||||||
|
void addFace(const Edges& ...edges)
|
||||||
|
{
|
||||||
|
faces().push(new Face {static_cast<edge_pointer>(edges)...});
|
||||||
|
for (auto& edge : *faces().back())
|
||||||
|
edge->addRefFace(faces().back());
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeNullFaces()
|
||||||
|
{
|
||||||
|
faces().remove([](face_pointer face){ return face == nullptr; });
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeFace(size_type n, bool erase = true, bool cascade = true)
|
||||||
|
{
|
||||||
|
if (cascade)
|
||||||
|
{
|
||||||
|
for (auto &refCell: face(n)->refCells())
|
||||||
|
removeCell(indexOf(refCell), false);
|
||||||
|
removeNullFaces();
|
||||||
|
}
|
||||||
|
delete face(n);
|
||||||
|
if (erase)
|
||||||
|
faces().remove(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
darray<Cell*>& cells()
|
||||||
|
{
|
||||||
|
return p_cells;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
cell_pointer cell(size_type n) const
|
||||||
|
{
|
||||||
|
return p_cells[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeNullCells()
|
||||||
|
{
|
||||||
|
cells().remove([](cell_pointer cell){ return cell == nullptr; });
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeCell(size_type n, bool erase = true, bool cascade = true)
|
||||||
|
{
|
||||||
|
static_cast<void>(cascade);
|
||||||
|
delete cell(n);
|
||||||
|
if (erase)
|
||||||
|
cells().remove(n);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,10 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include "Mesh.hpp"
|
#include "../mesh.hpp"
|
||||||
|
|
||||||
TEST(hmeshTest, MeshCreation)
|
TEST(hmeshTest, Mesh)
|
||||||
{
|
{
|
||||||
|
hpr::mesh::Mesh mesh;
|
||||||
|
mesh.addVertex(1, 2, 3);
|
||||||
|
mesh.addVertex(1, 3, 3);
|
||||||
|
mesh.addEdge(mesh.vertex(0), mesh.vertex(1));
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
#include "iterator.hpp"
|
#include "iterator.hpp"
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
|
||||||
namespace hpr
|
namespace hpr
|
||||||
{
|
{
|
||||||
@ -71,6 +74,31 @@ public:
|
|||||||
std::copy(list.begin(), list.end(), p_start);
|
std::copy(list.begin(), list.end(), p_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
DynamicArray(size_type size, value_type value) :
|
||||||
|
p_size {size},
|
||||||
|
p_capacity {size},
|
||||||
|
p_start {new value_type[p_capacity]},
|
||||||
|
p_end {p_start + p_size},
|
||||||
|
p_storage_end {p_start + p_capacity}
|
||||||
|
{
|
||||||
|
for (auto n = 0; n < p_size; ++n)
|
||||||
|
*(p_start + n) = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
DynamicArray& operator=(const DynamicArray& vs) noexcept
|
||||||
|
{
|
||||||
|
delete[] p_start;
|
||||||
|
p_size = vs.p_size;
|
||||||
|
p_capacity = vs.p_size;
|
||||||
|
p_start = new value_type[p_capacity];
|
||||||
|
p_end = p_start + p_size;
|
||||||
|
p_storage_end = p_start + p_capacity;
|
||||||
|
std::copy(vs.begin(), vs.end(), begin());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
DynamicArray& operator=(DynamicArray&& arr) noexcept
|
DynamicArray& operator=(DynamicArray&& arr) noexcept
|
||||||
{
|
{
|
||||||
@ -255,16 +283,19 @@ public:
|
|||||||
++p_end;
|
++p_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual
|
/*virtual
|
||||||
int findByAddress(const value_type& value)
|
int findByAddress(const value_type& value)
|
||||||
{
|
{
|
||||||
// TODO: make better approach
|
// TODO: make better approach
|
||||||
for (int n = 0; n < p_size; ++n) {
|
for (int n = 0; n < p_size; ++n) {
|
||||||
if (*std::addressof(*(p_start + n)) == *std::addressof(value))
|
std::equal_to
|
||||||
|
pointer lhs = (p_start + n); //*std::addressof(*(p_start + n));
|
||||||
|
pointer rhs = *value; //*std::addressof(value);
|
||||||
|
if (lhs == rhs)
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
virtual
|
virtual
|
||||||
void remove(size_type position)
|
void remove(size_type position)
|
||||||
@ -277,6 +308,31 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual
|
virtual
|
||||||
|
void remove(iterator position)
|
||||||
|
{
|
||||||
|
if (position + 1 != end())
|
||||||
|
std::copy(position + 1, end(), position);
|
||||||
|
std::destroy_at(p_end);
|
||||||
|
--p_end;
|
||||||
|
--p_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual
|
||||||
|
void remove(const std::function<bool(value_type)>& condition)
|
||||||
|
{
|
||||||
|
size_type newSize = p_size;
|
||||||
|
for (size_type offset = 0; offset < newSize; ++offset)
|
||||||
|
if (condition(*(p_start + offset))) {
|
||||||
|
for (size_type n = offset; n < newSize; ++n) {
|
||||||
|
*(p_start + n) = std::move(*(p_start + n + 1));
|
||||||
|
}
|
||||||
|
--newSize;
|
||||||
|
--offset;
|
||||||
|
}
|
||||||
|
p_size = newSize;
|
||||||
|
p_end = p_start + p_size;
|
||||||
|
}
|
||||||
|
/*virtual
|
||||||
void remove(const value_type& value)
|
void remove(const value_type& value)
|
||||||
{
|
{
|
||||||
int index = findByAddress(value);
|
int index = findByAddress(value);
|
||||||
@ -284,6 +340,17 @@ public:
|
|||||||
remove(index);
|
remove(index);
|
||||||
else
|
else
|
||||||
throw std::runtime_error("Value is not found to remove it");
|
throw std::runtime_error("Value is not found to remove it");
|
||||||
|
}*/
|
||||||
|
|
||||||
|
virtual
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
delete[] p_start;
|
||||||
|
p_size = 0;
|
||||||
|
p_capacity = 1;
|
||||||
|
p_start = new value_type[p_capacity];
|
||||||
|
p_end = p_start;
|
||||||
|
p_storage_end = p_end + p_capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Friend functions
|
// Friend functions
|
||||||
@ -297,6 +364,15 @@ public:
|
|||||||
std::swap(lhs.p_end, rhs.p_end);
|
std::swap(lhs.p_end, rhs.p_end);
|
||||||
std::swap(lhs.p_storage_end, rhs.p_storage_end);
|
std::swap(lhs.p_storage_end, rhs.p_storage_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
friend
|
||||||
|
bool operator==(const DynamicArray& lhs, const DynamicArray& rhs)
|
||||||
|
{
|
||||||
|
for (auto n = 0; n < lhs.size(); ++n)
|
||||||
|
if (lhs[n] != rhs[n])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
@ -72,12 +72,21 @@ public:
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator==(const iterator& lhs, const iterator& rhs)
|
iterator operator+(int value)
|
||||||
|
{
|
||||||
|
iterator temp {*this};
|
||||||
|
temp.p_ptr += value;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend
|
||||||
|
bool operator==(const iterator& lhs, const iterator& rhs)
|
||||||
{
|
{
|
||||||
return lhs.p_ptr == rhs.p_ptr;
|
return lhs.p_ptr == rhs.p_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator!=(const iterator& lhs, const iterator& rhs)
|
friend
|
||||||
|
bool operator!=(const iterator& lhs, const iterator& rhs)
|
||||||
{
|
{
|
||||||
return lhs.p_ptr != rhs.p_ptr;
|
return lhs.p_ptr != rhs.p_ptr;
|
||||||
}
|
}
|
||||||
|
@ -89,10 +89,20 @@ public:
|
|||||||
StaticArray {list.begin(), list.end()}
|
StaticArray {list.begin(), list.end()}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
template <std::convertible_to<value_type>... Args>
|
||||||
|
inline
|
||||||
|
StaticArray(const value_type& v, const Args& ...args) :
|
||||||
|
StaticArray {std::initializer_list<value_type>({std::forward<value_type>(v),
|
||||||
|
std::forward<value_type>(static_cast<value_type>(args))...})}
|
||||||
|
{
|
||||||
|
static_assert(1 + sizeof...(args) == Size, "Number of arguments must be equal to size of array");
|
||||||
|
}
|
||||||
|
|
||||||
template <std::convertible_to<value_type>... Args>
|
template <std::convertible_to<value_type>... Args>
|
||||||
inline
|
inline
|
||||||
StaticArray(value_type&& v, Args&& ...args) :
|
StaticArray(value_type&& v, Args&& ...args) :
|
||||||
StaticArray {std::initializer_list<value_type>({v, static_cast<value_type>(args)...})}
|
StaticArray {std::initializer_list<value_type>({std::forward<value_type>(v),
|
||||||
|
std::forward<value_type>(static_cast<value_type>(args))...})}
|
||||||
{
|
{
|
||||||
static_assert(1 + sizeof...(args) == Size, "Number of arguments must be equal to size of array");
|
static_assert(1 + sizeof...(args) == Size, "Number of arguments must be equal to size of array");
|
||||||
}
|
}
|
||||||
@ -113,6 +123,13 @@ public:
|
|||||||
(*this)[pos++] = val;
|
(*this)[pos++] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
StaticArray& operator=(const StaticArray& vs) noexcept
|
||||||
|
{
|
||||||
|
std::copy(vs.begin(), vs.end(), begin());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
StaticArray& operator=(StaticArray&& arr) noexcept
|
StaticArray& operator=(StaticArray&& arr) noexcept
|
||||||
{
|
{
|
||||||
|
@ -13,6 +13,24 @@ TEST(hyplib, Array)
|
|||||||
EXPECT_EQ(sarr, sarr2);
|
EXPECT_EQ(sarr, sarr2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(hyplib, DynamicArray)
|
||||||
|
{
|
||||||
|
hpr::DynamicArray<float> arr {1, 3, 2};
|
||||||
|
hpr::DynamicArray<float> arr2 {1, 3, 2};
|
||||||
|
EXPECT_EQ(arr, arr2);
|
||||||
|
arr.remove(1);
|
||||||
|
EXPECT_EQ(arr, hpr::darray<float>({1, 2}));
|
||||||
|
auto iter = arr2.begin();
|
||||||
|
++iter;
|
||||||
|
arr2.remove(iter);
|
||||||
|
EXPECT_EQ(arr2, hpr::darray<float>({1, 2}));
|
||||||
|
|
||||||
|
hpr::DynamicArray<float> arr3 {1, 3, 0, 2, 9, 0, 5};
|
||||||
|
arr3.remove([](float num) { return num == 0; });
|
||||||
|
EXPECT_EQ(arr3, hpr::darray<float>({1, 3, 2, 9, 5}));
|
||||||
|
EXPECT_EQ(arr3.size(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(hyplib, Vector)
|
TEST(hyplib, Vector)
|
||||||
{
|
{
|
||||||
hpr::vec3 v1 {1, 3, 2};
|
hpr::vec3 v1 {1, 3, 2};
|
||||||
|
@ -36,9 +36,22 @@ public:
|
|||||||
|
|
||||||
inline
|
inline
|
||||||
VectorSpace(VectorSpace&& vs) noexcept :
|
VectorSpace(VectorSpace&& vs) noexcept :
|
||||||
base {std::move(static_cast<base>(vs))}
|
base {std::forward<base>(static_cast<base>(vs))}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
inline
|
||||||
|
VectorSpace& operator=(const VectorSpace& vs) noexcept = default;
|
||||||
|
|
||||||
|
inline
|
||||||
|
VectorSpace& operator=(VectorSpace&& vs) noexcept
|
||||||
|
{
|
||||||
|
std::swap(*this, vs);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~VectorSpace() = default;
|
||||||
|
|
||||||
inline
|
inline
|
||||||
VectorSpace(typename base::iterator start, typename base::iterator end) :
|
VectorSpace(typename base::iterator start, typename base::iterator end) :
|
||||||
base {start, end}
|
base {start, end}
|
||||||
@ -75,7 +88,7 @@ public:
|
|||||||
{
|
{
|
||||||
for (auto n = 0; n < subvs.size(); ++n)
|
for (auto n = 0; n < subvs.size(); ++n)
|
||||||
(*this)[n] = subvs[n];
|
(*this)[n] = subvs[n];
|
||||||
(*this)[subvs.size() - 1] = v;
|
(*this)[subvs.size()] = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Member functions
|
// Member functions
|
||||||
@ -123,10 +136,8 @@ public:
|
|||||||
v /= val;
|
v /= val;
|
||||||
}
|
}
|
||||||
|
|
||||||
using type = VectorSpace<Type, Size>;
|
|
||||||
|
|
||||||
friend inline
|
friend inline
|
||||||
type operator+(const VectorSpace& lhs, const value_type& rhs)
|
VectorSpace operator+(const VectorSpace& lhs, const value_type& rhs)
|
||||||
{
|
{
|
||||||
VectorSpace vs {lhs};
|
VectorSpace vs {lhs};
|
||||||
vs += rhs;
|
vs += rhs;
|
||||||
|
28
source/hyporo/window_system/CMakeLists.txt
Normal file
28
source/hyporo/window_system/CMakeLists.txt
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
include_directories(
|
||||||
|
../hyplib
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(hyporo-window-system STATIC
|
||||||
|
# Source files
|
||||||
|
window_system.cpp
|
||||||
|
monitor.cpp
|
||||||
|
window.cpp
|
||||||
|
glfw/window_system.cpp
|
||||||
|
glfw/monitor.cpp
|
||||||
|
glfw/window.cpp
|
||||||
|
|
||||||
|
# Header files
|
||||||
|
monitor.hpp
|
||||||
|
window_context.hpp
|
||||||
|
window.hpp
|
||||||
|
window_system.hpp
|
||||||
|
glfw/monitor.hpp
|
||||||
|
glfw/window.hpp
|
||||||
|
glfw/window_system.hpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(hyporo-window-system
|
||||||
|
glfw
|
||||||
|
hyporo-hyplib
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user