Skip to content

Commit

Permalink
Add PlaneMesh2D to primitive meshes
Browse files Browse the repository at this point in the history
Correct tangent and y direction of PlaneMesh2D

Fix PlaneMesh2D registering and variables exporting.

Fix a little miss.

Prepare PlaneMesh2D
  • Loading branch information
Adrenesis committed Aug 24, 2020
1 parent e7cb45f commit 8cd436f
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 0 deletions.
1 change: 1 addition & 0 deletions scene/register_scene_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,7 @@ void register_scene_types() {
ClassDB::register_class<CubeMesh>();
ClassDB::register_class<CylinderMesh>();
ClassDB::register_class<PlaneMesh>();
ClassDB::register_class<PlaneMesh2D>();
ClassDB::register_class<PrismMesh>();
ClassDB::register_class<QuadMesh>();
ClassDB::register_class<SphereMesh>();
Expand Down
113 changes: 113 additions & 0 deletions scene/resources/primitive_meshes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,119 @@ PlaneMesh::PlaneMesh() {
subdivide_d = 0;
}

/**
PlaneMesh2D
*/

void PlaneMesh2D::_create_mesh_array(Array &p_arr) const {
int i, j, prevrow, thisrow, point;
float x, y;

Size2 start_pos = size * -0.5;

PoolVector<Vector3> points;
PoolVector<Vector3> normals;
PoolVector<float> tangents;
PoolVector<Vector2> uvs;
PoolVector<int> indices;
point = 0;

#define ADD_TANGENT(m_x, m_y, m_z, m_d) \
tangents.push_back(m_x); \
tangents.push_back(m_y); \
tangents.push_back(m_z); \
tangents.push_back(m_d);

/* top + bottom */
y = start_pos.y;
thisrow = point;
prevrow = 0;
for (j = 0; j <= (subdivide_h + 1); j++) {
x = start_pos.x;
for (i = 0; i <= (subdivide_w + 1); i++) {
float u = i;
float v = j;
u /= (subdivide_w + 1.0);
v /= (subdivide_h + 1.0);

points.push_back(Vector3(-x, -y, 0.0));
normals.push_back(Vector3(0.0, 0.0, 1.0));
ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(1.0 - u, 1.0 - v)); /* 1.0 - uv to match orientation with Quad */
point++;

if (i > 0 && j > 0) {
indices.push_back(prevrow + i - 1);
indices.push_back(prevrow + i);
indices.push_back(thisrow + i - 1);
indices.push_back(prevrow + i);
indices.push_back(thisrow + i);
indices.push_back(thisrow + i - 1);
};

x += size.x / (subdivide_w + 1.0);
};

y += size.y / (subdivide_h + 1.0);
prevrow = thisrow;
thisrow = point;
};

p_arr[VS::ARRAY_VERTEX] = points;
p_arr[VS::ARRAY_NORMAL] = normals;
p_arr[VS::ARRAY_TANGENT] = tangents;
p_arr[VS::ARRAY_TEX_UV] = uvs;
p_arr[VS::ARRAY_INDEX] = indices;
}

void PlaneMesh2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_size", "size"), &PlaneMesh2D::set_size);
ClassDB::bind_method(D_METHOD("get_size"), &PlaneMesh2D::get_size);

ClassDB::bind_method(D_METHOD("set_subdivide_width", "subdivide"), &PlaneMesh2D::set_subdivide_width);
ClassDB::bind_method(D_METHOD("get_subdivide_width"), &PlaneMesh2D::get_subdivide_width);
ClassDB::bind_method(D_METHOD("set_subdivide_height", "subdivide"), &PlaneMesh2D::set_subdivide_height);
ClassDB::bind_method(D_METHOD("get_subdivide_height"), &PlaneMesh2D::get_subdivide_height);

ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_width", "get_subdivide_width");
ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_height", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_height", "get_subdivide_height");
}

void PlaneMesh2D::set_size(const Size2 &p_size) {
size = p_size;
_request_update();
}

Size2 PlaneMesh2D::get_size() const {
return size;
}

void PlaneMesh2D::set_subdivide_width(const int p_divisions) {
subdivide_w = p_divisions > 0 ? p_divisions : 0;
_request_update();
}

int PlaneMesh2D::get_subdivide_width() const {
return subdivide_w;
}

void PlaneMesh2D::set_subdivide_height(const int p_divisions) {
subdivide_h = p_divisions > 0 ? p_divisions : 0;
_request_update();
}

int PlaneMesh2D::get_subdivide_height() const {
return subdivide_h;
}

PlaneMesh2D::PlaneMesh2D() {
// defaults
size = Size2(2.0, 2.0);
subdivide_w = 0;
subdivide_h = 0;
}

/**
PrismMesh
*/
Expand Down
30 changes: 30 additions & 0 deletions scene/resources/primitive_meshes.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,36 @@ class PlaneMesh : public PrimitiveMesh {
PlaneMesh();
};

/**
Similar to quadmesh but with tessellation support for 2D
*/
class PlaneMesh2D : public PrimitiveMesh {

GDCLASS(PlaneMesh2D, PrimitiveMesh);

private:
Size2 size;
int subdivide_w;
int subdivide_h;

protected:
static void _bind_methods();
virtual void _create_mesh_array(Array &p_arr) const;

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_height(const int p_divisions);
int get_subdivide_height() const;

PlaneMesh2D();
};


/**
A prism shapen, handy for ramps, triangles, etc.
*/
Expand Down

0 comments on commit 8cd436f

Please sign in to comment.