CSGMesh material and CSGShape inherits from GeometryInstance

I left the material on CSGMesh because GeometryInstance's material override prevents the normal material behaviour of the csg meshes

but the material_override is useful, and now you can control the shadow, lod and other properties you get from GeometryInstance
This commit is contained in:
Leonard Meagher 2019-04-11 13:20:09 -07:00
parent c1dcdf6109
commit 28b902211f
2 changed files with 29 additions and 3 deletions

View file

@ -724,6 +724,7 @@ CSGBrush *CSGMesh::_build_brush() {
PoolVector<bool> smooth;
PoolVector<Ref<Material> > materials;
PoolVector<Vector2> uvs;
Ref<Material> material = get_material();
for (int i = 0; i < mesh->get_surface_count(); i++) {
@ -760,7 +761,12 @@ CSGBrush *CSGMesh::_build_brush() {
uvr_used = true;
}
Ref<Material> mat = mesh->surface_get_material(i);
Ref<Material> mat;
if (material.is_valid()) {
mat = material;
} else {
mat = mesh->surface_get_material(i);
}
PoolVector<int> aindices = arrays[Mesh::ARRAY_INDEX];
if (aindices.size()) {
@ -866,6 +872,18 @@ void CSGMesh::_mesh_changed() {
update_gizmo();
}
void CSGMesh::set_material(const Ref<Material> &p_material) {
if (material == p_material)
return;
material = p_material;
_make_dirty();
}
Ref<Material> CSGMesh::get_material() const {
return material;
}
void CSGMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &CSGMesh::set_mesh);
@ -873,7 +891,11 @@ void CSGMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("_mesh_changed"), &CSGMesh::_mesh_changed);
ClassDB::bind_method(D_METHOD("set_material", "material"), &CSGMesh::set_material);
ClassDB::bind_method(D_METHOD("get_material"), &CSGMesh::get_material);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"), "set_mesh", "get_mesh");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_material", "get_material");
}
void CSGMesh::set_mesh(const Ref<Mesh> &p_mesh) {

View file

@ -38,8 +38,8 @@
#include "scene/resources/concave_polygon_shape.h"
#include "thirdparty/misc/mikktspace.h"
class CSGShape : public VisualInstance {
GDCLASS(CSGShape, VisualInstance);
class CSGShape : public GeometryInstance {
GDCLASS(CSGShape, GeometryInstance);
public:
enum Operation {
@ -187,6 +187,7 @@ class CSGMesh : public CSGPrimitive {
virtual CSGBrush *_build_brush();
Ref<Mesh> mesh;
Ref<Material> material;
void _mesh_changed();
@ -196,6 +197,9 @@ protected:
public:
void set_mesh(const Ref<Mesh> &p_mesh);
Ref<Mesh> get_mesh();
void set_material(const Ref<Material> &p_material);
Ref<Material> get_material() const;
};
class CSGSphere : public CSGPrimitive {