CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
RepeatMesh.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10
11#include "MeshVertex.hpp"
12#include "Triangle.hpp"
13#include "Utility.hpp"
14
16
18 template<typename Mesh> class RepeatMesh {
19 public:
20 class Triangles {
21 public:
23
25 Triangle temp = mTriangles.generate();
26 temp.vertices += mDelta;
27 return temp;
28 }
29
30 void next() noexcept {
31 mTriangles.next();
32
33 if(mTriangles.done()) {
34 ++mIndex;
36 mTriangles = mRepeatMesh->mMesh.triangles();
37 }
38 }
39
40 private:
42
44
45 int mIndex;
46
47 int mDelta;
48
51 mTriangles{repeatMesh->mMesh.triangles()}, mIndex{repeatMesh->mVertexCount > 0 ? 0 : repeatMesh->mInstances}, mDelta{0} {}
52
54 if(mRepeatMesh->mInstances < 1)
55 return 0;
56
57 return count(mRepeatMesh->mMesh.triangles()) * (mRepeatMesh->mInstances - mIndex - 1) + count(mTriangles);
58 }
59
60 friend int count(const Triangles& generator) noexcept { return generator.countTriangles(); }
61
62 friend class RepeatMesh;
63 };
64
65 class Vertices {
66 public:
68
70 MeshVertex temp = mVertices.generate();
71 temp.position += mDelta;
72 return temp;
73 }
74
75 void next() {
76 mVertices.next();
77
78 if(mVertices.done()) {
79 ++mIndex;
81 mVertices = mRepeatMesh->mMesh.vertices();
82 }
83 }
84
85 private:
89
91
93
94 int mIndex;
95
97
99 if(mRepeatMesh->mInstances < 1)
100 return 0;
101
103 }
104
105 friend int count(const Vertices& generator) noexcept { return generator.countVertices(); }
106
107 friend class RepeatMesh;
108 };
109
113 explicit RepeatMesh(Mesh mesh, const int instances, const Vector3& delta) noexcept
114 : mMesh{std::move(mesh)}, mInstances{instances}, mDelta{delta}, mVertexCount{count(mMesh.vertices())} {}
115
117
119
120 private:
122
124
126
128 };
129
130 template<typename Mesh> RepeatMesh<Mesh> repeatMesh(Mesh mesh, int instances, const Vector3& delta) noexcept {
131 return RepeatMesh<Mesh>{std::move(mesh), instances, delta};
132 }
133
134} // namespace CeresEngine::MeshGenerator
Definition MeshVertex.hpp:14
friend int count(const Triangles &generator) noexcept
Definition RepeatMesh.hpp:60
Triangles(const RepeatMesh *repeatMesh) noexcept
Definition RepeatMesh.hpp:49
Triangle generate() const
Definition RepeatMesh.hpp:24
void next() noexcept
Definition RepeatMesh.hpp:30
int mDelta
Definition RepeatMesh.hpp:47
int mIndex
Definition RepeatMesh.hpp:45
TriangleGeneratorType< Mesh >::Type mTriangles
Definition RepeatMesh.hpp:43
bool done() const noexcept
Definition RepeatMesh.hpp:22
const RepeatMesh * mRepeatMesh
Definition RepeatMesh.hpp:41
int countTriangles() const noexcept
Definition RepeatMesh.hpp:53
const RepeatMesh * mRepeatMesh
Definition RepeatMesh.hpp:90
MeshVertex generate() const
Definition RepeatMesh.hpp:69
void next()
Definition RepeatMesh.hpp:75
int countVertices() const noexcept
Definition RepeatMesh.hpp:98
friend int count(const Vertices &generator) noexcept
Definition RepeatMesh.hpp:105
Vertices(const RepeatMesh *repeatMesh)
Definition RepeatMesh.hpp:86
bool done() const noexcept
Definition RepeatMesh.hpp:67
Vector3 mDelta
Definition RepeatMesh.hpp:96
int mIndex
Definition RepeatMesh.hpp:94
VertexGeneratorType< Mesh >::Type mVertices
Definition RepeatMesh.hpp:92
Repeats the same mesh a given number of time at given intervals.
Definition RepeatMesh.hpp:18
int mInstances
Definition RepeatMesh.hpp:123
int mVertexCount
Definition RepeatMesh.hpp:127
Mesh mMesh
Definition RepeatMesh.hpp:121
Vector3 mDelta
Definition RepeatMesh.hpp:125
RepeatMesh(Mesh mesh, const int instances, const Vector3 &delta) noexcept
Definition RepeatMesh.hpp:113
Triangles triangles() const noexcept
Definition RepeatMesh.hpp:116
Vertices vertices() const noexcept
Definition RepeatMesh.hpp:118
decltype(std::declval< const Primitive * >() ->triangles()) Type
Definition Utility.hpp:32
Definition Triangle.hpp:14
decltype(std::declval< const Primitive * >() ->vertices()) Type
Definition Utility.hpp:39
A base class for all mesh implementations.
Definition Mesh.hpp:112
Definition AnyGenerator.hpp:12
RepeatMesh< Mesh > repeatMesh(Mesh mesh, int instances, const Vector3 &delta) noexcept
Definition RepeatMesh.hpp:130
constexpr CountAlgorithmFunctor count
Returns the number of elements matching an element.
Definition Count.hpp:82
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25