Browse Source

Merge pull request #18798 from jfaust/bugfix/scene-import-on-server-platform

Fix two issues preventing model import from working properly when platform=server
Rémi Verschelde 7 years ago
parent
commit
0738ba6bc1
2 changed files with 135 additions and 24 deletions
  1. 132 24
      drivers/dummy/rasterizer_dummy.h
  2. 3 0
      editor/doc/doc_data.cpp

+ 132 - 24
drivers/dummy/rasterizer_dummy.h

@@ -127,7 +127,26 @@ public:
 		String path;
 	};
 
+	struct DummySurface {
+		uint32_t format;
+		VS::PrimitiveType primitive;
+		PoolVector<uint8_t> array;
+		int vertex_count;
+		PoolVector<uint8_t> index_array;
+		int index_count;
+		AABB aabb;
+		Vector<PoolVector<uint8_t> > blend_shapes;
+		Vector<AABB> bone_aabbs;
+	};
+
+	struct DummyMesh : public RID_Data {
+		Vector<DummySurface> surfaces;
+		int blend_shape_count;
+		VS::BlendShapeMode blend_shape_mode;
+	};
+
 	mutable RID_Owner<DummyTexture> texture_owner;
+	mutable RID_Owner<DummyMesh> mesh_owner;
 
 	RID texture_create() {
 
@@ -256,46 +275,128 @@ public:
 
 	/* MESH API */
 
-	RID mesh_create() { return RID(); }
-
-	void mesh_add_surface_from_arrays(RID p_mesh, VS::PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), uint32_t p_compress_format = Mesh::ARRAY_COMPRESS_DEFAULT) {}
-	void mesh_add_surface(RID p_mesh, uint32_t p_format, VS::PrimitiveType p_primitive, const PoolVector<uint8_t> &p_array, int p_vertex_count, const PoolVector<uint8_t> &p_index_array, int p_index_count, const AABB &p_aabb, const Vector<PoolVector<uint8_t> > &p_blend_shapes = Vector<PoolVector<uint8_t> >(), const Vector<AABB> &p_bone_aabbs = Vector<AABB>()) {}
+	RID mesh_create() {
+		DummyMesh *mesh = memnew(DummyMesh);
+		ERR_FAIL_COND_V(!mesh, RID());
+		mesh->blend_shape_count = 0;
+		mesh->blend_shape_mode = VS::BLEND_SHAPE_MODE_NORMALIZED;
+		return mesh_owner.make_rid(mesh);
+	}
 
-	void mesh_add_surface_from_mesh_data(RID p_mesh, const Geometry::MeshData &p_mesh_data) {}
-	void mesh_add_surface_from_planes(RID p_mesh, const PoolVector<Plane> &p_planes) {}
+	void mesh_add_surface(RID p_mesh, uint32_t p_format, VS::PrimitiveType p_primitive, const PoolVector<uint8_t> &p_array, int p_vertex_count, const PoolVector<uint8_t> &p_index_array, int p_index_count, const AABB &p_aabb, const Vector<PoolVector<uint8_t> > &p_blend_shapes = Vector<PoolVector<uint8_t> >(), const Vector<AABB> &p_bone_aabbs = Vector<AABB>()) {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND(!m);
+
+		m->surfaces.push_back(DummySurface());
+		DummySurface *s = &m->surfaces[m->surfaces.size() - 1];
+		s->format = p_format;
+		s->primitive = p_primitive;
+		s->array = p_array;
+		s->vertex_count = p_vertex_count;
+		s->index_array = p_index_array;
+		s->index_count = p_index_count;
+		s->aabb = p_aabb;
+		s->blend_shapes = p_blend_shapes;
+		s->bone_aabbs = p_bone_aabbs;
+	}
 
-	void mesh_set_blend_shape_count(RID p_mesh, int p_amount) {}
-	int mesh_get_blend_shape_count(RID p_mesh) const { return 0; }
+	void mesh_set_blend_shape_count(RID p_mesh, int p_amount) {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND(!m);
+		m->blend_shape_count = p_amount;
+	}
+	int mesh_get_blend_shape_count(RID p_mesh) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, 0);
+		return m->blend_shape_count;
+	}
 
-	void mesh_set_blend_shape_mode(RID p_mesh, VS::BlendShapeMode p_mode) {}
-	VS::BlendShapeMode mesh_get_blend_shape_mode(RID p_mesh) const { return VS::BLEND_SHAPE_MODE_NORMALIZED; }
+	void mesh_set_blend_shape_mode(RID p_mesh, VS::BlendShapeMode p_mode) {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND(!m);
+		m->blend_shape_mode = p_mode;
+	}
+	VS::BlendShapeMode mesh_get_blend_shape_mode(RID p_mesh) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, VS::BLEND_SHAPE_MODE_NORMALIZED);
+		return m->blend_shape_mode;
+	}
 
 	void mesh_surface_update_region(RID p_mesh, int p_surface, int p_offset, const PoolVector<uint8_t> &p_data) {}
 
 	void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material) {}
 	RID mesh_surface_get_material(RID p_mesh, int p_surface) const { return RID(); }
 
-	int mesh_surface_get_array_len(RID p_mesh, int p_surface) const { return 0; }
-	int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { return 0; }
+	int mesh_surface_get_array_len(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, 0);
+
+		return m->surfaces[p_surface].vertex_count;
+	}
+	int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, 0);
+
+		return m->surfaces[p_surface].index_count;
+	}
 
 	PoolVector<uint8_t> mesh_surface_get_array(RID p_mesh, int p_surface) const {
-		PoolVector<uint8_t> p;
-		return p;
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, PoolVector<uint8_t>());
+
+		return m->surfaces[p_surface].array;
 	}
 	PoolVector<uint8_t> mesh_surface_get_index_array(RID p_mesh, int p_surface) const {
-		PoolVector<uint8_t> p;
-		return p;
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, PoolVector<uint8_t>());
+
+		return m->surfaces[p_surface].index_array;
+	}
+
+	uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, 0);
+
+		return m->surfaces[p_surface].format;
+	}
+	VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, VS::PRIMITIVE_POINTS);
+
+		return m->surfaces[p_surface].primitive;
+	}
+
+	AABB mesh_surface_get_aabb(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, AABB());
+
+		return m->surfaces[p_surface].aabb;
 	}
+	Vector<PoolVector<uint8_t> > mesh_surface_get_blend_shapes(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, Vector<PoolVector<uint8_t> >());
 
-	uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const { return 0; }
-	VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { return VS::PRIMITIVE_POINTS; }
+		return m->surfaces[p_surface].blend_shapes;
+	}
+	Vector<AABB> mesh_surface_get_skeleton_aabb(RID p_mesh, int p_surface) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, Vector<AABB>());
+
+		return m->surfaces[p_surface].bone_aabbs;
+	}
 
-	AABB mesh_surface_get_aabb(RID p_mesh, int p_surface) const { return AABB(); }
-	Vector<PoolVector<uint8_t> > mesh_surface_get_blend_shapes(RID p_mesh, int p_surface) const { return Vector<PoolVector<uint8_t> >(); }
-	Vector<AABB> mesh_surface_get_skeleton_aabb(RID p_mesh, int p_surface) const { return Vector<AABB>(); }
+	void mesh_remove_surface(RID p_mesh, int p_index) {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND(!m);
+		ERR_FAIL_COND(p_index >= m->surfaces.size());
 
-	void mesh_remove_surface(RID p_mesh, int p_index) {}
-	int mesh_get_surface_count(RID p_mesh) const { return 0; }
+		m->surfaces.remove(p_index);
+	}
+	int mesh_get_surface_count(RID p_mesh) const {
+		DummyMesh *m = mesh_owner.getornull(p_mesh);
+		ERR_FAIL_COND_V(!m, 0);
+		return m->surfaces.size();
+	}
 
 	void mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb) {}
 	AABB mesh_get_custom_aabb(RID p_mesh) const { return AABB(); }
@@ -598,7 +699,14 @@ public:
 	RID canvas_light_occluder_create() { return RID(); }
 	void canvas_light_occluder_set_polylines(RID p_occluder, const PoolVector<Vector2> &p_lines) {}
 
-	VS::InstanceType get_base_type(RID p_rid) const { return VS::INSTANCE_NONE; }
+	VS::InstanceType get_base_type(RID p_rid) const {
+		if (mesh_owner.owns(p_rid)) {
+			return VS::INSTANCE_MESH;
+		}
+
+		return VS::INSTANCE_NONE;
+	}
+
 	bool free(RID p_rid) {
 
 		if (texture_owner.owns(p_rid)) {

+ 3 - 0
editor/doc/doc_data.cpp

@@ -567,6 +567,9 @@ void DocData::generate(bool p_basic_types) {
 
 			PropertyDoc pd;
 			Engine::Singleton &s = E->get();
+			if (!s.ptr) {
+				continue;
+			}
 			pd.name = s.name;
 			pd.type = s.ptr->get_class();
 			while (String(ClassDB::get_parent_class(pd.type)) != "Object")