Ran core generator for new objects/properties for mesh.
diff --git a/dev/defs/shapes/text.json b/dev/defs/shapes/text.json
index b82a17e..8cbadf1 100644
--- a/dev/defs/shapes/text.json
+++ b/dev/defs/shapes/text.json
@@ -1,5 +1,6 @@
{
"name": "Text",
+ "runtime": false,
"key": {
"int": 110,
"string": "text"
diff --git a/dev/defs/shapes/text_run.json b/dev/defs/shapes/text_run.json
index 8e97dad..5fb11de 100644
--- a/dev/defs/shapes/text_run.json
+++ b/dev/defs/shapes/text_run.json
@@ -1,5 +1,6 @@
{
"name": "TextRun",
+ "runtime": false,
"key": {
"int": 113,
"string": "textrun"
diff --git a/include/rive/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp
index 8ea8e18..cef092c 100644
--- a/include/rive/generated/core_registry.hpp
+++ b/include/rive/generated/core_registry.hpp
@@ -75,12 +75,15 @@
#include "rive/nested_artboard.hpp"
#include "rive/node.hpp"
#include "rive/shapes/clipping_shape.hpp"
+#include "rive/shapes/contour_mesh_vertex.hpp"
#include "rive/shapes/cubic_asymmetric_vertex.hpp"
#include "rive/shapes/cubic_detached_vertex.hpp"
#include "rive/shapes/cubic_mirrored_vertex.hpp"
#include "rive/shapes/cubic_vertex.hpp"
#include "rive/shapes/ellipse.hpp"
#include "rive/shapes/image.hpp"
+#include "rive/shapes/mesh.hpp"
+#include "rive/shapes/mesh_vertex.hpp"
#include "rive/shapes/paint/fill.hpp"
#include "rive/shapes/paint/gradient_stop.hpp"
#include "rive/shapes/paint/linear_gradient.hpp"
@@ -99,6 +102,7 @@
#include "rive/shapes/star.hpp"
#include "rive/shapes/straight_vertex.hpp"
#include "rive/shapes/triangle.hpp"
+#include "rive/shapes/vertex.hpp"
#include "rive/transform_component.hpp"
#include "rive/world_transform_component.hpp"
namespace rive {
@@ -198,14 +202,20 @@
return new TrimPath();
case FillBase::typeKey:
return new Fill();
+ case MeshVertexBase::typeKey:
+ return new MeshVertex();
case ShapeBase::typeKey:
return new Shape();
case StraightVertexBase::typeKey:
return new StraightVertex();
case CubicAsymmetricVertexBase::typeKey:
return new CubicAsymmetricVertex();
+ case MeshBase::typeKey:
+ return new Mesh();
case PointsPathBase::typeKey:
return new PointsPath();
+ case ContourMeshVertexBase::typeKey:
+ return new ContourMeshVertex();
case RectangleBase::typeKey:
return new Rectangle();
case CubicMirroredVertexBase::typeKey:
@@ -552,11 +562,17 @@
case TrimPathBase::offsetPropertyKey:
object->as<TrimPathBase>()->offset(value);
break;
- case PathVertexBase::xPropertyKey:
- object->as<PathVertexBase>()->x(value);
+ case VertexBase::xPropertyKey:
+ object->as<VertexBase>()->x(value);
break;
- case PathVertexBase::yPropertyKey:
- object->as<PathVertexBase>()->y(value);
+ case VertexBase::yPropertyKey:
+ object->as<VertexBase>()->y(value);
+ break;
+ case MeshVertexBase::uPropertyKey:
+ object->as<MeshVertexBase>()->u(value);
+ break;
+ case MeshVertexBase::vPropertyKey:
+ object->as<MeshVertexBase>()->v(value);
break;
case StraightVertexBase::radiusPropertyKey:
object->as<StraightVertexBase>()->radius(value);
@@ -768,6 +784,9 @@
static void
setBytes(Core* object, int propertyKey, std::vector<uint8_t> value) {
switch (propertyKey) {
+ case MeshBase::triangleIndexBytesPropertyKey:
+ object->as<MeshBase>()->triangleIndexBytes(value);
+ break;
case FileAssetContentsBase::bytesPropertyKey:
object->as<FileAssetContentsBase>()->bytes(value);
break;
@@ -983,10 +1002,14 @@
return object->as<TrimPathBase>()->end();
case TrimPathBase::offsetPropertyKey:
return object->as<TrimPathBase>()->offset();
- case PathVertexBase::xPropertyKey:
- return object->as<PathVertexBase>()->x();
- case PathVertexBase::yPropertyKey:
- return object->as<PathVertexBase>()->y();
+ case VertexBase::xPropertyKey:
+ return object->as<VertexBase>()->x();
+ case VertexBase::yPropertyKey:
+ return object->as<VertexBase>()->y();
+ case MeshVertexBase::uPropertyKey:
+ return object->as<MeshVertexBase>()->u();
+ case MeshVertexBase::vPropertyKey:
+ return object->as<MeshVertexBase>()->v();
case StraightVertexBase::radiusPropertyKey:
return object->as<StraightVertexBase>()->radius();
case CubicAsymmetricVertexBase::rotationPropertyKey:
@@ -1139,6 +1162,8 @@
}
static std::vector<uint8_t> getBytes(Core* object, int propertyKey) {
switch (propertyKey) {
+ case MeshBase::triangleIndexBytesPropertyKey:
+ return object->as<MeshBase>()->triangleIndexBytes();
case FileAssetContentsBase::bytesPropertyKey:
return object->as<FileAssetContentsBase>()->bytes();
}
@@ -1242,8 +1267,10 @@
case TrimPathBase::startPropertyKey:
case TrimPathBase::endPropertyKey:
case TrimPathBase::offsetPropertyKey:
- case PathVertexBase::xPropertyKey:
- case PathVertexBase::yPropertyKey:
+ case VertexBase::xPropertyKey:
+ case VertexBase::yPropertyKey:
+ case MeshVertexBase::uPropertyKey:
+ case MeshVertexBase::vPropertyKey:
case StraightVertexBase::radiusPropertyKey:
case CubicAsymmetricVertexBase::rotationPropertyKey:
case CubicAsymmetricVertexBase::inDistancePropertyKey:
@@ -1311,6 +1338,7 @@
case SolidColorBase::colorValuePropertyKey:
case GradientStopBase::colorValuePropertyKey:
return CoreColorType::id;
+ case MeshBase::triangleIndexBytesPropertyKey:
case FileAssetContentsBase::bytesPropertyKey:
return CoreBytesType::id;
default:
diff --git a/include/rive/generated/shapes/contour_mesh_vertex_base.hpp b/include/rive/generated/shapes/contour_mesh_vertex_base.hpp
new file mode 100644
index 0000000..2e5b9a5
--- /dev/null
+++ b/include/rive/generated/shapes/contour_mesh_vertex_base.hpp
@@ -0,0 +1,35 @@
+#ifndef _RIVE_CONTOUR_MESH_VERTEX_BASE_HPP_
+#define _RIVE_CONTOUR_MESH_VERTEX_BASE_HPP_
+#include "rive/shapes/mesh_vertex.hpp"
+namespace rive {
+ class ContourMeshVertexBase : public MeshVertex {
+ protected:
+ typedef MeshVertex Super;
+
+ public:
+ static const uint16_t typeKey = 111;
+
+ /// Helper to quickly determine if a core object extends another without
+ /// RTTI at runtime.
+ bool isTypeOf(uint16_t typeKey) const override {
+ switch (typeKey) {
+ case ContourMeshVertexBase::typeKey:
+ case MeshVertexBase::typeKey:
+ case VertexBase::typeKey:
+ case ContainerComponentBase::typeKey:
+ case ComponentBase::typeKey:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ uint16_t coreType() const override { return typeKey; }
+
+ Core* clone() const override;
+
+ protected:
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp b/include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp
index 793a509..041a53b 100644
--- a/include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp
@@ -17,6 +17,7 @@
case CubicAsymmetricVertexBase::typeKey:
case CubicVertexBase::typeKey:
case PathVertexBase::typeKey:
+ case VertexBase::typeKey:
case ContainerComponentBase::typeKey:
case ComponentBase::typeKey:
return true;
diff --git a/include/rive/generated/shapes/cubic_detached_vertex_base.hpp b/include/rive/generated/shapes/cubic_detached_vertex_base.hpp
index 109eae0..43d3df2 100644
--- a/include/rive/generated/shapes/cubic_detached_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_detached_vertex_base.hpp
@@ -17,6 +17,7 @@
case CubicDetachedVertexBase::typeKey:
case CubicVertexBase::typeKey:
case PathVertexBase::typeKey:
+ case VertexBase::typeKey:
case ContainerComponentBase::typeKey:
case ComponentBase::typeKey:
return true;
diff --git a/include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp b/include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp
index 5e614f1..420178a 100644
--- a/include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp
@@ -17,6 +17,7 @@
case CubicMirroredVertexBase::typeKey:
case CubicVertexBase::typeKey:
case PathVertexBase::typeKey:
+ case VertexBase::typeKey:
case ContainerComponentBase::typeKey:
case ComponentBase::typeKey:
return true;
diff --git a/include/rive/generated/shapes/cubic_vertex_base.hpp b/include/rive/generated/shapes/cubic_vertex_base.hpp
index fe02cca..a6a973c 100644
--- a/include/rive/generated/shapes/cubic_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_vertex_base.hpp
@@ -15,6 +15,7 @@
switch (typeKey) {
case CubicVertexBase::typeKey:
case PathVertexBase::typeKey:
+ case VertexBase::typeKey:
case ContainerComponentBase::typeKey:
case ComponentBase::typeKey:
return true;
diff --git a/include/rive/generated/shapes/mesh_base.hpp b/include/rive/generated/shapes/mesh_base.hpp
new file mode 100644
index 0000000..5a2aa1e
--- /dev/null
+++ b/include/rive/generated/shapes/mesh_base.hpp
@@ -0,0 +1,66 @@
+#ifndef _RIVE_MESH_BASE_HPP_
+#define _RIVE_MESH_BASE_HPP_
+#include <vector>
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_bytes_type.hpp"
+namespace rive {
+ class MeshBase : public ContainerComponent {
+ protected:
+ typedef ContainerComponent Super;
+
+ public:
+ static const uint16_t typeKey = 109;
+
+ /// Helper to quickly determine if a core object extends another without
+ /// RTTI at runtime.
+ bool isTypeOf(uint16_t typeKey) const override {
+ switch (typeKey) {
+ case MeshBase::typeKey:
+ case ContainerComponentBase::typeKey:
+ case ComponentBase::typeKey:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ uint16_t coreType() const override { return typeKey; }
+
+ static const uint16_t triangleIndexBytesPropertyKey = 223;
+
+ private:
+ std::vector<uint8_t> m_TriangleIndexBytes;
+
+ public:
+ inline const std::vector<uint8_t>& triangleIndexBytes() const {
+ return m_TriangleIndexBytes;
+ }
+ void triangleIndexBytes(std::vector<uint8_t> value) {
+ if (m_TriangleIndexBytes == value) {
+ return;
+ }
+ m_TriangleIndexBytes = value;
+ triangleIndexBytesChanged();
+ }
+
+ Core* clone() const override;
+ void copy(const MeshBase& object) {
+ m_TriangleIndexBytes = object.m_TriangleIndexBytes;
+ ContainerComponent::copy(object);
+ }
+
+ bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
+ switch (propertyKey) {
+ case triangleIndexBytesPropertyKey:
+ m_TriangleIndexBytes = CoreBytesType::deserialize(reader);
+ return true;
+ }
+ return ContainerComponent::deserialize(propertyKey, reader);
+ }
+
+ protected:
+ virtual void triangleIndexBytesChanged() {}
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/shapes/mesh_vertex_base.hpp b/include/rive/generated/shapes/mesh_vertex_base.hpp
new file mode 100644
index 0000000..8fffc8e
--- /dev/null
+++ b/include/rive/generated/shapes/mesh_vertex_base.hpp
@@ -0,0 +1,80 @@
+#ifndef _RIVE_MESH_VERTEX_BASE_HPP_
+#define _RIVE_MESH_VERTEX_BASE_HPP_
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/vertex.hpp"
+namespace rive {
+ class MeshVertexBase : public Vertex {
+ protected:
+ typedef Vertex Super;
+
+ public:
+ static const uint16_t typeKey = 108;
+
+ /// Helper to quickly determine if a core object extends another without
+ /// RTTI at runtime.
+ bool isTypeOf(uint16_t typeKey) const override {
+ switch (typeKey) {
+ case MeshVertexBase::typeKey:
+ case VertexBase::typeKey:
+ case ContainerComponentBase::typeKey:
+ case ComponentBase::typeKey:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ uint16_t coreType() const override { return typeKey; }
+
+ static const uint16_t uPropertyKey = 215;
+ static const uint16_t vPropertyKey = 216;
+
+ private:
+ float m_U = 0.0f;
+ float m_V = 0.0f;
+
+ public:
+ inline float u() const { return m_U; }
+ void u(float value) {
+ if (m_U == value) {
+ return;
+ }
+ m_U = value;
+ uChanged();
+ }
+
+ inline float v() const { return m_V; }
+ void v(float value) {
+ if (m_V == value) {
+ return;
+ }
+ m_V = value;
+ vChanged();
+ }
+
+ Core* clone() const override;
+ void copy(const MeshVertexBase& object) {
+ m_U = object.m_U;
+ m_V = object.m_V;
+ Vertex::copy(object);
+ }
+
+ bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
+ switch (propertyKey) {
+ case uPropertyKey:
+ m_U = CoreDoubleType::deserialize(reader);
+ return true;
+ case vPropertyKey:
+ m_V = CoreDoubleType::deserialize(reader);
+ return true;
+ }
+ return Vertex::deserialize(propertyKey, reader);
+ }
+
+ protected:
+ virtual void uChanged() {}
+ virtual void vChanged() {}
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/shapes/path_vertex_base.hpp b/include/rive/generated/shapes/path_vertex_base.hpp
index 6b864af..f5a9e08 100644
--- a/include/rive/generated/shapes/path_vertex_base.hpp
+++ b/include/rive/generated/shapes/path_vertex_base.hpp
@@ -1,11 +1,10 @@
#ifndef _RIVE_PATH_VERTEX_BASE_HPP_
#define _RIVE_PATH_VERTEX_BASE_HPP_
-#include "rive/container_component.hpp"
-#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/vertex.hpp"
namespace rive {
- class PathVertexBase : public ContainerComponent {
+ class PathVertexBase : public Vertex {
protected:
- typedef ContainerComponent Super;
+ typedef Vertex Super;
public:
static const uint16_t typeKey = 14;
@@ -15,6 +14,7 @@
bool isTypeOf(uint16_t typeKey) const override {
switch (typeKey) {
case PathVertexBase::typeKey:
+ case VertexBase::typeKey:
case ContainerComponentBase::typeKey:
case ComponentBase::typeKey:
return true;
@@ -25,53 +25,7 @@
uint16_t coreType() const override { return typeKey; }
- static const uint16_t xPropertyKey = 24;
- static const uint16_t yPropertyKey = 25;
-
- private:
- float m_X = 0.0f;
- float m_Y = 0.0f;
-
- public:
- inline float x() const { return m_X; }
- void x(float value) {
- if (m_X == value) {
- return;
- }
- m_X = value;
- xChanged();
- }
-
- inline float y() const { return m_Y; }
- void y(float value) {
- if (m_Y == value) {
- return;
- }
- m_Y = value;
- yChanged();
- }
-
- void copy(const PathVertexBase& object) {
- m_X = object.m_X;
- m_Y = object.m_Y;
- ContainerComponent::copy(object);
- }
-
- bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
- switch (propertyKey) {
- case xPropertyKey:
- m_X = CoreDoubleType::deserialize(reader);
- return true;
- case yPropertyKey:
- m_Y = CoreDoubleType::deserialize(reader);
- return true;
- }
- return ContainerComponent::deserialize(propertyKey, reader);
- }
-
protected:
- virtual void xChanged() {}
- virtual void yChanged() {}
};
} // namespace rive
diff --git a/include/rive/generated/shapes/straight_vertex_base.hpp b/include/rive/generated/shapes/straight_vertex_base.hpp
index ebe1057..3b54c9e 100644
--- a/include/rive/generated/shapes/straight_vertex_base.hpp
+++ b/include/rive/generated/shapes/straight_vertex_base.hpp
@@ -16,6 +16,7 @@
switch (typeKey) {
case StraightVertexBase::typeKey:
case PathVertexBase::typeKey:
+ case VertexBase::typeKey:
case ContainerComponentBase::typeKey:
case ComponentBase::typeKey:
return true;
diff --git a/include/rive/generated/shapes/vertex_base.hpp b/include/rive/generated/shapes/vertex_base.hpp
new file mode 100644
index 0000000..b8beeb6
--- /dev/null
+++ b/include/rive/generated/shapes/vertex_base.hpp
@@ -0,0 +1,78 @@
+#ifndef _RIVE_VERTEX_BASE_HPP_
+#define _RIVE_VERTEX_BASE_HPP_
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+namespace rive {
+ class VertexBase : public ContainerComponent {
+ protected:
+ typedef ContainerComponent Super;
+
+ public:
+ static const uint16_t typeKey = 107;
+
+ /// Helper to quickly determine if a core object extends another without
+ /// RTTI at runtime.
+ bool isTypeOf(uint16_t typeKey) const override {
+ switch (typeKey) {
+ case VertexBase::typeKey:
+ case ContainerComponentBase::typeKey:
+ case ComponentBase::typeKey:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ uint16_t coreType() const override { return typeKey; }
+
+ static const uint16_t xPropertyKey = 24;
+ static const uint16_t yPropertyKey = 25;
+
+ private:
+ float m_X = 0.0f;
+ float m_Y = 0.0f;
+
+ public:
+ inline float x() const { return m_X; }
+ void x(float value) {
+ if (m_X == value) {
+ return;
+ }
+ m_X = value;
+ xChanged();
+ }
+
+ inline float y() const { return m_Y; }
+ void y(float value) {
+ if (m_Y == value) {
+ return;
+ }
+ m_Y = value;
+ yChanged();
+ }
+
+ void copy(const VertexBase& object) {
+ m_X = object.m_X;
+ m_Y = object.m_Y;
+ ContainerComponent::copy(object);
+ }
+
+ bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
+ switch (propertyKey) {
+ case xPropertyKey:
+ m_X = CoreDoubleType::deserialize(reader);
+ return true;
+ case yPropertyKey:
+ m_Y = CoreDoubleType::deserialize(reader);
+ return true;
+ }
+ return ContainerComponent::deserialize(propertyKey, reader);
+ }
+
+ protected:
+ virtual void xChanged() {}
+ virtual void yChanged() {}
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/shapes/contour_mesh_vertex.hpp b/include/rive/shapes/contour_mesh_vertex.hpp
new file mode 100644
index 0000000..51d8873
--- /dev/null
+++ b/include/rive/shapes/contour_mesh_vertex.hpp
@@ -0,0 +1,11 @@
+#ifndef _RIVE_CONTOUR_MESH_VERTEX_HPP_
+#define _RIVE_CONTOUR_MESH_VERTEX_HPP_
+#include "rive/generated/shapes/contour_mesh_vertex_base.hpp"
+#include <stdio.h>
+namespace rive {
+ class ContourMeshVertex : public ContourMeshVertexBase {
+ public:
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/shapes/mesh.hpp b/include/rive/shapes/mesh.hpp
new file mode 100644
index 0000000..7e38f4f
--- /dev/null
+++ b/include/rive/shapes/mesh.hpp
@@ -0,0 +1,11 @@
+#ifndef _RIVE_MESH_HPP_
+#define _RIVE_MESH_HPP_
+#include "rive/generated/shapes/mesh_base.hpp"
+#include <stdio.h>
+namespace rive {
+ class Mesh : public MeshBase {
+ public:
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/shapes/mesh_vertex.hpp b/include/rive/shapes/mesh_vertex.hpp
new file mode 100644
index 0000000..bd58ccd
--- /dev/null
+++ b/include/rive/shapes/mesh_vertex.hpp
@@ -0,0 +1,11 @@
+#ifndef _RIVE_MESH_VERTEX_HPP_
+#define _RIVE_MESH_VERTEX_HPP_
+#include "rive/generated/shapes/mesh_vertex_base.hpp"
+#include <stdio.h>
+namespace rive {
+ class MeshVertex : public MeshVertexBase {
+ public:
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/shapes/vertex.hpp b/include/rive/shapes/vertex.hpp
new file mode 100644
index 0000000..555d170
--- /dev/null
+++ b/include/rive/shapes/vertex.hpp
@@ -0,0 +1,11 @@
+#ifndef _RIVE_VERTEX_HPP_
+#define _RIVE_VERTEX_HPP_
+#include "rive/generated/shapes/vertex_base.hpp"
+#include <stdio.h>
+namespace rive {
+ class Vertex : public VertexBase {
+ public:
+ };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/src/generated/shapes/contour_mesh_vertex_base.cpp b/src/generated/shapes/contour_mesh_vertex_base.cpp
new file mode 100644
index 0000000..a19d016
--- /dev/null
+++ b/src/generated/shapes/contour_mesh_vertex_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/shapes/contour_mesh_vertex_base.hpp"
+#include "rive/shapes/contour_mesh_vertex.hpp"
+
+using namespace rive;
+
+Core* ContourMeshVertexBase::clone() const {
+ auto cloned = new ContourMeshVertex();
+ cloned->copy(*this);
+ return cloned;
+}
diff --git a/src/generated/shapes/mesh_base.cpp b/src/generated/shapes/mesh_base.cpp
new file mode 100644
index 0000000..5cae283
--- /dev/null
+++ b/src/generated/shapes/mesh_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/shapes/mesh_base.hpp"
+#include "rive/shapes/mesh.hpp"
+
+using namespace rive;
+
+Core* MeshBase::clone() const {
+ auto cloned = new Mesh();
+ cloned->copy(*this);
+ return cloned;
+}
diff --git a/src/generated/shapes/mesh_vertex_base.cpp b/src/generated/shapes/mesh_vertex_base.cpp
new file mode 100644
index 0000000..45171ac
--- /dev/null
+++ b/src/generated/shapes/mesh_vertex_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/shapes/mesh_vertex_base.hpp"
+#include "rive/shapes/mesh_vertex.hpp"
+
+using namespace rive;
+
+Core* MeshVertexBase::clone() const {
+ auto cloned = new MeshVertex();
+ cloned->copy(*this);
+ return cloned;
+}