Blender V4.3
ply_export_data.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "ply_export_data.hh"
10#include "ply_data.hh"
11#include "ply_file_buffer.hh"
12
13#include "BLI_math_vector.hh"
14
15namespace blender::io::ply {
16
17void write_vertices(FileBuffer &buffer, const PlyData &ply_data)
18{
19 for (int i = 0; i < ply_data.vertices.size(); i++) {
20 buffer.write_vertex(ply_data.vertices[i].x, ply_data.vertices[i].y, ply_data.vertices[i].z);
21
22 if (!ply_data.vertex_normals.is_empty()) {
23 buffer.write_vertex_normal(ply_data.vertex_normals[i].x,
24 ply_data.vertex_normals[i].y,
25 ply_data.vertex_normals[i].z);
26 }
27
28 if (!ply_data.vertex_colors.is_empty()) {
29 /* PLY colors currently are exported as bytes, make sure inputs are clamped. */
30 float4 color = math::clamp(ply_data.vertex_colors[i], 0.0f, 1.0f) * 255.0f;
31 buffer.write_vertex_color(uchar(color.x), uchar(color.y), uchar(color.z), uchar(color.w));
32 }
33
34 if (!ply_data.uv_coordinates.is_empty()) {
35 buffer.write_UV(ply_data.uv_coordinates[i].x, ply_data.uv_coordinates[i].y);
36 }
37
38 for (const PlyCustomAttribute &attr : ply_data.vertex_custom_attr) {
39 buffer.write_data(attr.data[i]);
40 }
41
42 buffer.write_vertex_end();
43 }
44 buffer.write_to_file();
45}
46
47void write_faces(FileBuffer &buffer, const PlyData &ply_data)
48{
49 const uint32_t *indices = ply_data.face_vertices.data();
50 for (uint32_t face_size : ply_data.face_sizes) {
51 buffer.write_face(char(face_size), Span<uint32_t>(indices, face_size));
52 indices += face_size;
53 }
54 buffer.write_to_file();
55}
56void write_edges(FileBuffer &buffer, const PlyData &ply_data)
57{
58 for (const std::pair<int, int> &edge : ply_data.edges) {
59 buffer.write_edge(edge.first, edge.second);
60 }
61 buffer.write_to_file();
62}
63} // namespace blender::io::ply
unsigned char uchar
virtual void write_data(float v)=0
virtual void write_vertex_normal(float nx, float ny, float nz)=0
virtual void write_vertex_color(uchar r, uchar g, uchar b, uchar a)=0
virtual void write_vertex(float x, float y, float z)=0
virtual void write_UV(float u, float v)=0
virtual void write_edge(int first, int second)=0
virtual void write_vertex_end()=0
virtual void write_face(char count, Span< uint32_t > const &vertex_indices)=0
void write_vertices(FileBuffer &buffer, const PlyData &ply_data)
void write_faces(FileBuffer &buffer, const PlyData &ply_data)
void write_edges(FileBuffer &buffer, const PlyData &ply_data)
T clamp(const T &a, const T &min, const T &max)
unsigned int uint32_t
Definition stdint.h:80
Vector< float3 > vertices
Definition ply_data.hh:29
Vector< uint32_t > face_vertices
Definition ply_data.hh:34
Vector< float4 > vertex_colors
Definition ply_data.hh:31
Vector< float3 > vertex_normals
Definition ply_data.hh:30
Vector< std::pair< int, int > > edges
Definition ply_data.hh:33
Vector< PlyCustomAttribute > vertex_custom_attr
Definition ply_data.hh:32
Vector< float2 > uv_coordinates
Definition ply_data.hh:36
Vector< uint32_t > face_sizes
Definition ply_data.hh:35