13 : world_transform_ptr(world_transform_ptr)
18 : world_transform_ptr(world_transform_ptr)
19 , lod_params(lod_params)
30 std::ostringstream oss;
31 oss << std::fixed << std::setprecision(3);
32 oss <<
"batch_instance{";
37 oss <<
"transform=[" << transform[0][0] <<
"," << transform[0][1] <<
"," << transform[0][2] <<
"," << transform[0][3] <<
"; ";
38 oss << transform[1][0] <<
"," << transform[1][1] <<
"," << transform[1][2] <<
"," << transform[1][3] <<
"; ";
39 oss << transform[2][0] <<
"," << transform[2][1] <<
"," << transform[2][2] <<
"," << transform[2][3] <<
"; ";
40 oss << transform[3][0] <<
"," << transform[3][1] <<
"," << transform[3][2] <<
"," << transform[3][3] <<
"], ";
44 oss <<
"transform=null, ";
54 : world_matrix(instance.world_transform_ptr ? *instance.world_transform_ptr :
math::mat4(1.0f))
73 for (
int i = 0; i < 4; ++i)
75 for (
int j = 0; j < 4; ++j)
89 std::ostringstream oss;
90 oss << std::fixed << std::setprecision(3);
91 oss <<
"instance_vertex_data{";
93 for (
int i = 0; i < 4; ++i)
109 instances_.reserve(
count);
114 instances_.push_back(instance);
119 instances_.emplace_back(&world_transform);
129 return instances_.size();
134 return instances_.empty();
139 return instances_[index];
144 return instances_[index];
149 return instances_.begin();
154 return instances_.end();
159 return instances_.begin();
164 return instances_.end();
169 std::vector<instance_vertex_data> vertex_data;
170 vertex_data.reserve(instances_.size());
172 for (
const auto& instance : instances_)
174 vertex_data.emplace_back(instance);
193 math::mat4& out_transform,
194 math::vec3& out_lod_params)
201 out_transform[3][3] = 1.0f;
204 out_lod_params.y = -1.0f;
205 out_lod_params.z = 0.0f;
208auto pack_instances_bulk(
const std::vector<batch_instance>& instances) -> std::vector<instance_vertex_data>
210 std::vector<instance_vertex_data> vertex_data;
211 vertex_data.reserve(instances.size());
213 for (
const auto& instance : instances)
215 vertex_data.emplace_back(instance);
225 "instance_vertex_data must be exactly one mat4");
228 "instance_vertex_data must be properly aligned for mat4");
234 return size_check && alignment_check;
container_type::const_iterator const_iterator
auto begin() -> iterator
Get iterator to beginning.
void reserve(size_t count)
Reserve space for instances.
auto size() const -> size_t
Get number of instances.
container_type::iterator iterator
auto empty() const -> bool
Check if collection is empty.
auto operator[](size_t index) -> batch_instance &
Get instance by index.
auto end() -> iterator
Get iterator to end.
auto to_vertex_data() const -> std::vector< instance_vertex_data >
Convert all instances to GPU vertex data.
auto get_gpu_memory_size() const -> size_t
Get memory size required for GPU data.
void add_instance(const batch_instance &instance)
Add an instance to the collection.
void clear()
Clear all instances.
Hash specialization for batch_key to enable use in std::unordered_map.
auto pack_instances_bulk(const std::vector< batch_instance > &instances) -> std::vector< instance_vertex_data >
Pack multiple instances into GPU vertex data.
auto pack_instance_data(const batch_instance &instance) -> instance_vertex_data
Pack batch instance data into GPU vertex format.
void unpack_instance_data(const instance_vertex_data &vertex_data, math::mat4 &out_transform, math::vec3 &out_lod_params)
Unpack GPU vertex data back to transform matrix and LOD params.
auto validate_instance_data_layout() -> bool
Validate that instance data is properly aligned and sized.
Instance data for a single object in a batch.
auto to_string() const -> std::string
Get string representation for debugging.
auto is_valid() const -> bool
Check if this instance has valid data.
const math::mat4 * world_transform_ptr
Pointer to world transformation matrix for this instance (valid only during frame processing)
batch_instance()=default
Default constructor.
math::vec3 lod_params
LOD blending parameters (x = current blend factor, y = target blend, z = transition time)
GPU-friendly vertex data for instancing.
auto is_valid() const -> bool
Check if the vertex data is valid.
auto get_lod_param() const -> float
Get the LOD parameter (from matrix[3][3])
math::mat4 world_matrix
World transformation matrix with LOD parameter packed in [3][3] (i_data0, i_data1,...
instance_vertex_data()=default
Default constructor.
void set_lod_param(float lod_param)
Set the LOD parameter (stored in matrix[3][3])
auto to_string() const -> std::string
Get string representation for debugging.