-Some fixes to code completion.
-Fix getter in code completion being displayed when it shouldn't -Clean up preview generation for editors and exposed it as editor plugin
This commit is contained in:
parent
213887f209
commit
8fce79aaee
6 changed files with 154 additions and 85 deletions
|
@ -864,7 +864,7 @@ void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, cons
|
|||
MethodBind *mb_get = NULL;
|
||||
if (p_getter) {
|
||||
|
||||
MethodBind *mb_get = get_method(p_class, p_getter);
|
||||
mb_get = get_method(p_class, p_getter);
|
||||
#ifdef DEBUG_METHODS_ENABLED
|
||||
|
||||
if (!mb_get) {
|
||||
|
|
|
@ -32,10 +32,121 @@
|
|||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "editor_resource_preview.h"
|
||||
#include "main/main.h"
|
||||
#include "plugins/canvas_item_editor_plugin.h"
|
||||
#include "plugins/spatial_editor_plugin.h"
|
||||
#include "scene/3d/camera.h"
|
||||
#include "scene/gui/popup_menu.h"
|
||||
#include "servers/visual_server.h"
|
||||
Array EditorInterface::_make_mesh_previews(const Array &p_meshes, int p_preview_size) {
|
||||
|
||||
Vector<Ref<Mesh> > meshes;
|
||||
|
||||
for (int i = 0; i < p_meshes.size(); i++) {
|
||||
meshes.push_back(p_meshes[i]);
|
||||
}
|
||||
|
||||
Vector<Ref<Texture> > textures = make_mesh_previews(meshes, p_preview_size);
|
||||
Array ret;
|
||||
for (int i = 0; i < textures.size(); i++) {
|
||||
ret.push_back(textures[i]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Vector<Ref<Texture> > EditorInterface::make_mesh_previews(const Vector<Ref<Mesh> > &p_meshes, int p_preview_size) {
|
||||
|
||||
int size = p_preview_size;
|
||||
|
||||
RID scenario = VS::get_singleton()->scenario_create();
|
||||
|
||||
RID viewport = VS::get_singleton()->viewport_create();
|
||||
VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ALWAYS);
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
VS::get_singleton()->viewport_set_scenario(viewport, scenario);
|
||||
VS::get_singleton()->viewport_set_size(viewport, size, size);
|
||||
VS::get_singleton()->viewport_set_transparent_background(viewport, true);
|
||||
VS::get_singleton()->viewport_set_active(viewport, true);
|
||||
RID viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
|
||||
|
||||
RID camera = VS::get_singleton()->camera_create();
|
||||
VS::get_singleton()->viewport_attach_camera(viewport, camera);
|
||||
VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
|
||||
//VS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
|
||||
VS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0);
|
||||
|
||||
RID light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
|
||||
RID light_instance = VS::get_singleton()->instance_create2(light, scenario);
|
||||
VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
|
||||
|
||||
RID light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
|
||||
VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
|
||||
//VS::get_singleton()->light_set_color(light2, VS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0));
|
||||
RID light_instance2 = VS::get_singleton()->instance_create2(light2, scenario);
|
||||
|
||||
VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
|
||||
|
||||
//sphere = VS::get_singleton()->mesh_create();
|
||||
RID mesh_instance = VS::get_singleton()->instance_create();
|
||||
VS::get_singleton()->instance_set_scenario(mesh_instance, scenario);
|
||||
|
||||
EditorProgress ep("mlib", TTR("Creating Mesh Previews"), p_meshes.size());
|
||||
|
||||
Vector<Ref<Texture> > textures;
|
||||
|
||||
for (int i = 0; i < p_meshes.size(); i++) {
|
||||
|
||||
Ref<Mesh> mesh = p_meshes[i];
|
||||
if (!mesh.is_valid()) {
|
||||
textures.push_back(Ref<Texture>());
|
||||
continue;
|
||||
}
|
||||
Rect3 aabb = mesh->get_aabb();
|
||||
print_line("aabb: " + aabb);
|
||||
Vector3 ofs = aabb.position + aabb.size * 0.5;
|
||||
aabb.position -= ofs;
|
||||
Transform xform;
|
||||
xform.basis = Basis().rotated(Vector3(0, 1, 0), -Math_PI * 0.25);
|
||||
xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI * 0.25) * xform.basis;
|
||||
Rect3 rot_aabb = xform.xform(aabb);
|
||||
print_line("rot_aabb: " + rot_aabb);
|
||||
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
|
||||
if (m == 0)
|
||||
continue;
|
||||
m = 1.0 / m;
|
||||
m *= 0.5;
|
||||
print_line("scale: " + rtos(m));
|
||||
xform.basis.scale(Vector3(m, m, m));
|
||||
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
|
||||
xform.origin.z -= rot_aabb.size.z * 2;
|
||||
RID inst = VS::get_singleton()->instance_create2(mesh->get_rid(), scenario);
|
||||
VS::get_singleton()->instance_set_transform(inst, xform);
|
||||
ep.step(TTR("Thumbnail.."), i);
|
||||
Main::iteration();
|
||||
Main::iteration();
|
||||
Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture);
|
||||
ERR_CONTINUE(!img.is_valid() || img->empty());
|
||||
Ref<ImageTexture> it(memnew(ImageTexture));
|
||||
it->create_from_image(img);
|
||||
|
||||
//print_line("loaded image, size: "+rtos(m)+" dist: "+rtos(dist)+" empty?"+itos(img.empty())+" w: "+itos(it->get_width())+" h: "+itos(it->get_height()));
|
||||
VS::get_singleton()->free(inst);
|
||||
|
||||
textures.push_back(it);
|
||||
}
|
||||
|
||||
VS::get_singleton()->free(mesh_instance);
|
||||
VS::get_singleton()->free(viewport);
|
||||
VS::get_singleton()->free(light);
|
||||
VS::get_singleton()->free(light_instance);
|
||||
VS::get_singleton()->free(light2);
|
||||
VS::get_singleton()->free(light_instance2);
|
||||
VS::get_singleton()->free(camera);
|
||||
VS::get_singleton()->free(scenario);
|
||||
|
||||
return textures;
|
||||
}
|
||||
|
||||
Control *EditorInterface::get_editor_viewport() {
|
||||
|
||||
|
@ -145,6 +256,7 @@ void EditorInterface::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("get_resource_previewer"), &EditorInterface::get_resource_previewer);
|
||||
ClassDB::bind_method(D_METHOD("get_resource_filesystem"), &EditorInterface::get_resource_file_system);
|
||||
ClassDB::bind_method(D_METHOD("get_editor_viewport"), &EditorInterface::get_editor_viewport);
|
||||
ClassDB::bind_method(D_METHOD("make_mesh_previews"), &EditorInterface::_make_mesh_previews);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("save_scene"), &EditorInterface::save_scene);
|
||||
ClassDB::bind_method(D_METHOD("save_scene_as", "path", "with_preview"), &EditorInterface::save_scene_as, DEFVAL(true));
|
||||
|
|
|
@ -61,6 +61,8 @@ protected:
|
|||
static void _bind_methods();
|
||||
static EditorInterface *singleton;
|
||||
|
||||
Array _make_mesh_previews(const Array &p_meshes, int p_preview_size);
|
||||
|
||||
public:
|
||||
static EditorInterface *get_singleton() { return singleton; }
|
||||
|
||||
|
@ -86,6 +88,8 @@ public:
|
|||
Error save_scene();
|
||||
void save_scene_as(const String &p_scene, bool p_with_preview = true);
|
||||
|
||||
Vector<Ref<Texture> > make_mesh_previews(const Vector<Ref<Mesh> > &p_meshes, int p_preview_size);
|
||||
|
||||
EditorInterface();
|
||||
};
|
||||
|
||||
|
|
|
@ -150,91 +150,17 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
|
|||
//generate previews!
|
||||
|
||||
if (1) {
|
||||
|
||||
Vector<Ref<Mesh> > meshes;
|
||||
Vector<int> ids = p_library->get_item_list();
|
||||
RID vp = VS::get_singleton()->viewport_create();
|
||||
int size = EditorSettings::get_singleton()->get("editors/grid_map/preview_size");
|
||||
|
||||
RID scenario = VS::get_singleton()->scenario_create();
|
||||
|
||||
RID viewport = VS::get_singleton()->viewport_create();
|
||||
VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ALWAYS);
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
VS::get_singleton()->viewport_set_scenario(viewport, scenario);
|
||||
VS::get_singleton()->viewport_set_size(viewport, size, size);
|
||||
VS::get_singleton()->viewport_set_transparent_background(viewport, true);
|
||||
VS::get_singleton()->viewport_set_active(viewport, true);
|
||||
RID viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
|
||||
|
||||
RID camera = VS::get_singleton()->camera_create();
|
||||
VS::get_singleton()->viewport_attach_camera(viewport, camera);
|
||||
VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
|
||||
//VS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
|
||||
VS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0);
|
||||
|
||||
RID light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
|
||||
RID light_instance = VS::get_singleton()->instance_create2(light, scenario);
|
||||
VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
|
||||
|
||||
RID light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
|
||||
VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
|
||||
//VS::get_singleton()->light_set_color(light2, VS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0));
|
||||
RID light_instance2 = VS::get_singleton()->instance_create2(light2, scenario);
|
||||
|
||||
VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
|
||||
|
||||
//sphere = VS::get_singleton()->mesh_create();
|
||||
RID mesh_instance = VS::get_singleton()->instance_create();
|
||||
VS::get_singleton()->instance_set_scenario(mesh_instance, scenario);
|
||||
|
||||
EditorProgress ep("mlib", TTR("Creating Mesh Library"), ids.size());
|
||||
|
||||
for (int i = 0; i < ids.size(); i++) {
|
||||
|
||||
int id = ids[i];
|
||||
Ref<Mesh> mesh = p_library->get_item_mesh(id);
|
||||
if (!mesh.is_valid())
|
||||
continue;
|
||||
Rect3 aabb = mesh->get_aabb();
|
||||
print_line("aabb: " + aabb);
|
||||
Vector3 ofs = aabb.position + aabb.size * 0.5;
|
||||
aabb.position -= ofs;
|
||||
Transform xform;
|
||||
xform.basis = Basis().rotated(Vector3(0, 1, 0), -Math_PI * 0.25);
|
||||
xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI * 0.25) * xform.basis;
|
||||
Rect3 rot_aabb = xform.xform(aabb);
|
||||
print_line("rot_aabb: " + rot_aabb);
|
||||
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
|
||||
if (m == 0)
|
||||
continue;
|
||||
m = 1.0 / m;
|
||||
m *= 0.5;
|
||||
print_line("scale: " + rtos(m));
|
||||
xform.basis.scale(Vector3(m, m, m));
|
||||
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
|
||||
xform.origin.z -= rot_aabb.size.z * 2;
|
||||
RID inst = VS::get_singleton()->instance_create2(mesh->get_rid(), scenario);
|
||||
VS::get_singleton()->instance_set_transform(inst, xform);
|
||||
ep.step(TTR("Thumbnail.."), i);
|
||||
Main::iteration();
|
||||
Main::iteration();
|
||||
Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture);
|
||||
ERR_CONTINUE(!img.is_valid() || img->empty());
|
||||
Ref<ImageTexture> it(memnew(ImageTexture));
|
||||
it->create_from_image(img);
|
||||
p_library->set_item_preview(id, it);
|
||||
|
||||
//print_line("loaded image, size: "+rtos(m)+" dist: "+rtos(dist)+" empty?"+itos(img.empty())+" w: "+itos(it->get_width())+" h: "+itos(it->get_height()));
|
||||
VS::get_singleton()->free(inst);
|
||||
meshes.push_back(p_library->get_item_mesh(ids[i]));
|
||||
}
|
||||
|
||||
VS::get_singleton()->free(mesh_instance);
|
||||
VS::get_singleton()->free(viewport);
|
||||
VS::get_singleton()->free(light);
|
||||
VS::get_singleton()->free(light_instance);
|
||||
VS::get_singleton()->free(light2);
|
||||
VS::get_singleton()->free(light_instance2);
|
||||
VS::get_singleton()->free(camera);
|
||||
VS::get_singleton()->free(scenario);
|
||||
Vector<Ref<Texture> > textures = EditorInterface::get_singleton()->make_mesh_previews(meshes, EditorSettings::get_singleton()->get("editors/grid_map/preview_size"));
|
||||
for (int i = 0; i < ids.size(); i++) {
|
||||
p_library->set_item_preview(ids[i], textures[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -577,6 +577,7 @@ static bool _guess_expression_type(GDCompletionContext &context, const GDParser:
|
|||
|
||||
const GDParser::OperatorNode *op = static_cast<const GDParser::OperatorNode *>(p_node);
|
||||
if (op->op == GDParser::OperatorNode::OP_CALL) {
|
||||
|
||||
if (op->arguments[0]->type == GDParser::Node::TYPE_TYPE) {
|
||||
|
||||
const GDParser::TypeNode *tn = static_cast<const GDParser::TypeNode *>(op->arguments[0]);
|
||||
|
@ -589,21 +590,45 @@ static bool _guess_expression_type(GDCompletionContext &context, const GDParser:
|
|||
|
||||
} else if (op->arguments.size() > 1 && op->arguments[1]->type == GDParser::Node::TYPE_IDENTIFIER) {
|
||||
|
||||
StringName id = static_cast<const GDParser::IdentifierNode *>(op->arguments[1])->name;
|
||||
|
||||
if (op->arguments[0]->type == GDParser::Node::TYPE_IDENTIFIER && String(id) == "new") {
|
||||
|
||||
//shortcut
|
||||
StringName identifier = static_cast<const GDParser::IdentifierNode *>(op->arguments[0])->name;
|
||||
|
||||
if (ClassDB::class_exists(identifier)) {
|
||||
r_type.type = Variant::OBJECT;
|
||||
r_type.value = Variant();
|
||||
r_type.obj_type = identifier;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
GDCompletionIdentifier base;
|
||||
if (!_guess_expression_type(context, op->arguments[0], p_line, base))
|
||||
return false;
|
||||
|
||||
StringName id = static_cast<const GDParser::IdentifierNode *>(op->arguments[1])->name;
|
||||
|
||||
if (base.type == Variant::OBJECT) {
|
||||
|
||||
if (id.operator String() == "new" && base.value.get_type() == Variant::OBJECT) {
|
||||
|
||||
Object *obj = base.value;
|
||||
if (GDNativeClass *gdnc = Object::cast_to<GDNativeClass>(obj)) {
|
||||
if (obj && Object::cast_to<GDNativeClass>(obj)) {
|
||||
GDNativeClass *gdnc = Object::cast_to<GDNativeClass>(obj);
|
||||
r_type.type = Variant::OBJECT;
|
||||
r_type.value = Variant();
|
||||
r_type.obj_type = gdnc->get_name();
|
||||
return true;
|
||||
} else {
|
||||
|
||||
if (base.obj_type != StringName()) {
|
||||
|
||||
r_type.type = Variant::OBJECT;
|
||||
r_type.value = Variant();
|
||||
r_type.obj_type = base.obj_type;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -268,10 +268,12 @@ void MeshLibrary::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_item_mesh", "id", "mesh"), &MeshLibrary::set_item_mesh);
|
||||
ClassDB::bind_method(D_METHOD("set_item_navmesh", "id", "navmesh"), &MeshLibrary::set_item_navmesh);
|
||||
ClassDB::bind_method(D_METHOD("set_item_shapes", "id", "shapes"), &MeshLibrary::_set_item_shapes);
|
||||
ClassDB::bind_method(D_METHOD("set_item_preview", "id", "texture"), &MeshLibrary::set_item_preview);
|
||||
ClassDB::bind_method(D_METHOD("get_item_name", "id"), &MeshLibrary::get_item_name);
|
||||
ClassDB::bind_method(D_METHOD("get_item_mesh", "id"), &MeshLibrary::get_item_mesh);
|
||||
ClassDB::bind_method(D_METHOD("get_item_navmesh", "id"), &MeshLibrary::get_item_navmesh);
|
||||
ClassDB::bind_method(D_METHOD("get_item_shapes", "id"), &MeshLibrary::_get_item_shapes);
|
||||
ClassDB::bind_method(D_METHOD("get_item_preview", "id"), &MeshLibrary::get_item_preview);
|
||||
ClassDB::bind_method(D_METHOD("remove_item", "id"), &MeshLibrary::remove_item);
|
||||
ClassDB::bind_method(D_METHOD("clear"), &MeshLibrary::clear);
|
||||
ClassDB::bind_method(D_METHOD("get_item_list"), &MeshLibrary::get_item_list);
|
||||
|
|
Loading…
Reference in a new issue