3#ifndef GDK_GRAPHICS_MODEL_DATA_H
4#define GDK_GRAPHICS_MODEL_DATA_H
7#include <gdk/graphics/string_keyed.h>
8#include <gdk/graphics/attribute_data.h>
9#include <gdk/graphics/data_types.h>
18#include <unordered_map>
21namespace gdk::graphics {
27 using attribute_collection_type = string_keyed<attribute_data>;
28 using index_value_type =
unsigned short;
30 enum class primitive_mode {
42 const std::vector<index_value_type> &
indexes()
const;
68 void transform(
const std::string &aPositionAttributeName,
69 const vector3_type &aPos,
70 const quaternion_type &aRot = {},
71 const vector3_type &aSca = {1, 1, 1});
73 void transform(
const std::string &aPositionAttributeName,
const matrix4x4_type &aTransform);
77 const vector2_type &aPos,
78 const float aRotation = 0,
79 const vector2_type &aSca = {1, 1});
84 const vector3_type &aObserverWorldPosition,
85 matrix4x4_type aEntityInstanceWorldMatrix,
86 std::string_view aPositionAttributeName =
"a_Position");
91 const vector3_type &aObserverWorldPosition,
92 matrix4x4_type aEntityInstanceWorldMatrix,
93 std::string_view aPositionAttributeName =
"a_Position");
141 std::vector<index_value_type> &&aIndexes);
149 std::size_t m_VertexCount{};
151 std::vector<index_value_type> m_Indexes{};
152 attribute_collection_type m_Attributes{};
153 primitive_mode m_PrimitiveMode = primitive_mode::triangles;
attribute_data represents one of the lists of components that comprise a model_data object
Definition attribute_data.h:18
void overwrite(const std::size_t index, const model_data &other)
overwrite a section of vertex data using another vertex data instance
attribute_data & get_attribute_data(std::string_view aAttributeName)
get attribute data by name, e.g: "a_Position"
void transform(const std::string &aPositionAttributeName, const matrix4x4_type &aTransform)
applies a transformation matrix to a 3 component attribute
model_data & operator=(const model_data &other)=default
support copy semantics
void push_back(const model_data &other)
append a different model_data to this model_data
void clear()
clears all state from this model_data instance
std::size_t vertex_count() const
get number of verticies in the data
model_data(attribute_collection_type &&aAttributeData)
void sort_by_furthest_triangle(const vector3_type &aObserverWorldPosition, matrix4x4_type aEntityInstanceWorldMatrix, std::string_view aPositionAttributeName="a_Position")
void overwrite(std::string_view aAttributeName, const std::size_t vertexOffset, const model_data &other)
overwrite a section of a single attribute in the vertex data
bool indexed() const
does this model name its vertices in an explicit order?
model_data & operator+=(const model_data &other)
model_data()=default
default inited model_data is very useful for procedurally generated data
primitive_mode get_primitive_mode() const
get the primitive mode
void sort_by_nearest_triangle(const vector3_type &aObserverWorldPosition, matrix4x4_type aEntityInstanceWorldMatrix, std::string_view aPositionAttributeName="a_Position")
model_data & operator=(model_data &&other)=default
support move semantics
model_data operator+(const model_data &aData)
create a new instance that is a concatenation of two separate datas
const attribute_data & get_attribute_data(std::string_view aAttributeName) const
get attribute data by name, e.g: "a_Position"
const std::vector< index_value_type > & indexes() const
the order the vertices are drawn in, empty if they are drawn in storage order
void transform(const std::string &aUVAttributeName, const vector2_type &aPos, const float aRotation=0, const vector2_type &aSca={1, 1})
applies a transformation to a 2 component attribute
const attribute_collection_type & attributes() const
get collection of all attribute data
static model_data make_quad()
creates model data for a unit sized quad with position and uv data
void transform(const std::string &aPositionAttributeName, const vector3_type &aPos, const quaternion_type &aRot={}, const vector3_type &aSca={1, 1, 1})
applies a transformation to a 3 component attribute
void set_indexes(std::vector< index_value_type > aIndexes)
draw the vertices in this order rather than in the order they are stored
model_data(const model_data &)=default
support copy semantics
model_data(model_data &&)=default
support move semantics
model_data(attribute_collection_type &&aAttributeData, std::vector< index_value_type > &&aIndexes)