2017-05-06 02:17:21 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* primitive_meshes.h */
|
|
|
|
/*************************************************************************/
|
|
|
|
/* This file is part of: */
|
|
|
|
/* GODOT ENGINE */
|
2017-08-27 14:16:55 +02:00
|
|
|
/* https://godotengine.org */
|
2017-05-06 02:17:21 +02:00
|
|
|
/*************************************************************************/
|
2021-01-01 20:13:46 +01:00
|
|
|
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
|
|
|
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
2017-05-06 02:17:21 +02:00
|
|
|
/* */
|
|
|
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
|
|
|
/* a copy of this software and associated documentation files (the */
|
|
|
|
/* "Software"), to deal in the Software without restriction, including */
|
|
|
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
|
|
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
|
|
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
|
|
|
/* the following conditions: */
|
|
|
|
/* */
|
|
|
|
/* The above copyright notice and this permission notice shall be */
|
|
|
|
/* included in all copies or substantial portions of the Software. */
|
|
|
|
/* */
|
|
|
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
|
|
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
|
|
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
|
|
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
|
|
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
|
|
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
|
|
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
#ifndef PRIMITIVE_MESHES_H
|
|
|
|
#define PRIMITIVE_MESHES_H
|
|
|
|
|
|
|
|
#include "scene/resources/mesh.h"
|
|
|
|
|
|
|
|
///@TODO probably should change a few integers to unsigned integers...
|
|
|
|
|
|
|
|
/**
|
|
|
|
@author Bastiaan Olij <mux213@gmail.com>
|
|
|
|
|
|
|
|
Base class for all the classes in this file, handles a number of code functions that are shared among all meshes.
|
2018-01-18 21:37:17 +01:00
|
|
|
This class is set apart that it assumes a single surface is always generated for our mesh.
|
2017-05-06 02:17:21 +02:00
|
|
|
*/
|
|
|
|
class PrimitiveMesh : public Mesh {
|
|
|
|
GDCLASS(PrimitiveMesh, Mesh);
|
|
|
|
|
|
|
|
private:
|
|
|
|
RID mesh;
|
2017-11-17 03:09:00 +01:00
|
|
|
mutable AABB aabb;
|
2018-04-28 10:46:00 +02:00
|
|
|
AABB custom_aabb;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
2021-02-09 18:24:36 +01:00
|
|
|
mutable int array_len = 0;
|
|
|
|
mutable int index_array_len = 0;
|
2019-08-19 00:40:52 +02:00
|
|
|
|
2017-05-06 02:17:21 +02:00
|
|
|
Ref<Material> material;
|
2021-02-09 18:24:36 +01:00
|
|
|
bool flip_faces = false;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
2021-02-09 18:24:36 +01:00
|
|
|
// make sure we do an update after we've finished constructing our object
|
|
|
|
mutable bool pending_request = true;
|
2017-07-23 23:48:05 +02:00
|
|
|
void _update() const;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
2021-02-09 18:24:36 +01:00
|
|
|
// assume primitive triangles as the type, correct for all but one and it will change this :)
|
|
|
|
Mesh::PrimitiveType primitive_type = Mesh::PRIMITIVE_TRIANGLES;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
static void _bind_methods();
|
|
|
|
|
2017-07-23 23:48:05 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const = 0;
|
|
|
|
void _request_update();
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual int get_surface_count() const override;
|
|
|
|
virtual int surface_get_array_len(int p_idx) const override;
|
|
|
|
virtual int surface_get_array_index_len(int p_idx) const override;
|
|
|
|
virtual Array surface_get_arrays(int p_surface) const override;
|
|
|
|
virtual Array surface_get_blend_shape_arrays(int p_surface) const override;
|
|
|
|
virtual Dictionary surface_get_lods(int p_surface) const override;
|
|
|
|
virtual uint32_t surface_get_format(int p_idx) const override;
|
|
|
|
virtual Mesh::PrimitiveType surface_get_primitive_type(int p_idx) const override;
|
|
|
|
virtual void surface_set_material(int p_idx, const Ref<Material> &p_material) override;
|
|
|
|
virtual Ref<Material> surface_get_material(int p_idx) const override;
|
|
|
|
virtual int get_blend_shape_count() const override;
|
|
|
|
virtual StringName get_blend_shape_name(int p_index) const override;
|
|
|
|
virtual AABB get_aabb() const override;
|
|
|
|
virtual RID get_rid() const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
void set_material(const Ref<Material> &p_material);
|
|
|
|
Ref<Material> get_material() const;
|
|
|
|
|
2017-09-10 12:10:28 +02:00
|
|
|
Array get_mesh_arrays() const;
|
|
|
|
|
2018-04-28 10:46:00 +02:00
|
|
|
void set_custom_aabb(const AABB &p_custom);
|
|
|
|
AABB get_custom_aabb() const;
|
|
|
|
|
2018-05-07 23:54:17 +02:00
|
|
|
void set_flip_faces(bool p_enable);
|
|
|
|
bool get_flip_faces() const;
|
|
|
|
|
2017-05-06 02:17:21 +02:00
|
|
|
PrimitiveMesh();
|
|
|
|
~PrimitiveMesh();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
Mesh for a simple capsule
|
|
|
|
*/
|
|
|
|
class CapsuleMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(CapsuleMesh, PrimitiveMesh);
|
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
float radius = 1.0;
|
|
|
|
float mid_height = 1.0;
|
|
|
|
int radial_segments = 64;
|
|
|
|
int rings = 8;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void set_radius(const float p_radius);
|
|
|
|
float get_radius() const;
|
|
|
|
|
|
|
|
void set_mid_height(const float p_mid_height);
|
|
|
|
float get_mid_height() const;
|
|
|
|
|
|
|
|
void set_radial_segments(const int p_segments);
|
|
|
|
int get_radial_segments() const;
|
|
|
|
|
|
|
|
void set_rings(const int p_rings);
|
|
|
|
int get_rings() const;
|
|
|
|
|
|
|
|
CapsuleMesh();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2020-12-04 16:39:45 +01:00
|
|
|
A box
|
2017-05-06 02:17:21 +02:00
|
|
|
*/
|
2020-12-04 16:39:45 +01:00
|
|
|
class BoxMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(BoxMesh, PrimitiveMesh);
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
Vector3 size = Vector3(2.0, 2.0, 2.0);
|
|
|
|
int subdivide_w = 0;
|
|
|
|
int subdivide_h = 0;
|
|
|
|
int subdivide_d = 0;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void set_size(const Vector3 &p_size);
|
|
|
|
Vector3 get_size() const;
|
|
|
|
|
|
|
|
void set_subdivide_width(const int p_divisions);
|
|
|
|
int get_subdivide_width() const;
|
|
|
|
|
|
|
|
void set_subdivide_height(const int p_divisions);
|
|
|
|
int get_subdivide_height() const;
|
|
|
|
|
|
|
|
void set_subdivide_depth(const int p_divisions);
|
|
|
|
int get_subdivide_depth() const;
|
|
|
|
|
2020-12-04 16:39:45 +01:00
|
|
|
BoxMesh();
|
2017-05-06 02:17:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
A cylinder
|
|
|
|
*/
|
|
|
|
|
|
|
|
class CylinderMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(CylinderMesh, PrimitiveMesh);
|
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
float top_radius = 1.0;
|
|
|
|
float bottom_radius = 1.0;
|
|
|
|
float height = 2.0;
|
|
|
|
int radial_segments = 64;
|
|
|
|
int rings = 4;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void set_top_radius(const float p_radius);
|
|
|
|
float get_top_radius() const;
|
|
|
|
|
|
|
|
void set_bottom_radius(const float p_radius);
|
|
|
|
float get_bottom_radius() const;
|
|
|
|
|
|
|
|
void set_height(const float p_height);
|
|
|
|
float get_height() const;
|
|
|
|
|
|
|
|
void set_radial_segments(const int p_segments);
|
|
|
|
int get_radial_segments() const;
|
|
|
|
|
|
|
|
void set_rings(const int p_rings);
|
|
|
|
int get_rings() const;
|
|
|
|
|
|
|
|
CylinderMesh();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2018-02-21 17:30:55 +01:00
|
|
|
Similar to quadmesh but with tessellation support
|
2017-05-06 02:17:21 +02:00
|
|
|
*/
|
|
|
|
class PlaneMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(PlaneMesh, PrimitiveMesh);
|
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
Size2 size = Size2(2.0, 2.0);
|
|
|
|
int subdivide_w = 0;
|
|
|
|
int subdivide_d = 0;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void set_size(const Size2 &p_size);
|
|
|
|
Size2 get_size() const;
|
|
|
|
|
|
|
|
void set_subdivide_width(const int p_divisions);
|
|
|
|
int get_subdivide_width() const;
|
|
|
|
|
|
|
|
void set_subdivide_depth(const int p_divisions);
|
|
|
|
int get_subdivide_depth() const;
|
|
|
|
|
|
|
|
PlaneMesh();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
A prism shapen, handy for ramps, triangles, etc.
|
|
|
|
*/
|
|
|
|
class PrismMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(PrismMesh, PrimitiveMesh);
|
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
float left_to_right = 0.5;
|
|
|
|
Vector3 size = Vector3(2.0, 2.0, 2.0);
|
|
|
|
int subdivide_w = 0;
|
|
|
|
int subdivide_h = 0;
|
|
|
|
int subdivide_d = 0;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void set_left_to_right(const float p_left_to_right);
|
|
|
|
float get_left_to_right() const;
|
|
|
|
|
|
|
|
void set_size(const Vector3 &p_size);
|
|
|
|
Vector3 get_size() const;
|
|
|
|
|
|
|
|
void set_subdivide_width(const int p_divisions);
|
|
|
|
int get_subdivide_width() const;
|
|
|
|
|
|
|
|
void set_subdivide_height(const int p_divisions);
|
|
|
|
int get_subdivide_height() const;
|
|
|
|
|
|
|
|
void set_subdivide_depth(const int p_divisions);
|
|
|
|
int get_subdivide_depth() const;
|
|
|
|
|
|
|
|
PrismMesh();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
Our original quadmesh...
|
|
|
|
*/
|
|
|
|
|
|
|
|
class QuadMesh : public PrimitiveMesh {
|
2019-03-19 19:35:57 +01:00
|
|
|
GDCLASS(QuadMesh, PrimitiveMesh);
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
Size2 size = Size2(1.0, 1.0);
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
QuadMesh();
|
2017-11-10 17:00:36 +01:00
|
|
|
|
|
|
|
void set_size(const Size2 &p_size);
|
|
|
|
Size2 get_size() const;
|
2017-05-06 02:17:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
A sphere..
|
|
|
|
*/
|
|
|
|
class SphereMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(SphereMesh, PrimitiveMesh);
|
|
|
|
|
|
|
|
private:
|
2021-02-09 18:24:36 +01:00
|
|
|
float radius = 1.0;
|
|
|
|
float height = 2.0;
|
|
|
|
int radial_segments = 64;
|
|
|
|
int rings = 32;
|
|
|
|
bool is_hemisphere = false;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2017-05-06 02:17:21 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void set_radius(const float p_radius);
|
|
|
|
float get_radius() const;
|
|
|
|
|
|
|
|
void set_height(const float p_height);
|
|
|
|
float get_height() const;
|
|
|
|
|
|
|
|
void set_radial_segments(const int p_radial_segments);
|
|
|
|
int get_radial_segments() const;
|
|
|
|
|
|
|
|
void set_rings(const int p_rings);
|
|
|
|
int get_rings() const;
|
|
|
|
|
|
|
|
void set_is_hemisphere(const bool p_is_hemisphere);
|
|
|
|
bool get_is_hemisphere() const;
|
|
|
|
|
|
|
|
SphereMesh();
|
|
|
|
};
|
|
|
|
|
2018-11-19 06:13:09 +01:00
|
|
|
/**
|
|
|
|
A single point for use in particle systems
|
|
|
|
*/
|
|
|
|
|
|
|
|
class PointMesh : public PrimitiveMesh {
|
|
|
|
GDCLASS(PointMesh, PrimitiveMesh)
|
|
|
|
|
|
|
|
protected:
|
2020-07-10 12:34:39 +02:00
|
|
|
virtual void _create_mesh_array(Array &p_arr) const override;
|
2018-11-19 06:13:09 +01:00
|
|
|
|
|
|
|
public:
|
|
|
|
PointMesh();
|
|
|
|
};
|
|
|
|
|
2017-05-06 02:17:21 +02:00
|
|
|
#endif
|