You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2026-01-05 19:31:35 +00:00
New lightmapper
-Added LocalVector (needed it) -Added stb_rect_pack (It's pretty cool, we could probably use it for other stuff too) -Fixes and changes all around the place -Added library for 128 bits fixed point (required for Delaunay3D)
This commit is contained in:
@@ -28,23 +28,36 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#if 0
|
||||
#include "baked_lightmap_editor_plugin.h"
|
||||
|
||||
void BakedLightmapEditorPlugin::_bake() {
|
||||
void BakedLightmapEditorPlugin::_bake_select_file(const String &p_file) {
|
||||
|
||||
if (lightmap) {
|
||||
BakedLightmap::BakeError err;
|
||||
if (get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root() == lightmap) {
|
||||
err = lightmap->bake(lightmap);
|
||||
err = lightmap->bake(lightmap, p_file, bake_func_step);
|
||||
} else {
|
||||
err = lightmap->bake(lightmap->get_parent());
|
||||
err = lightmap->bake(lightmap->get_parent(), p_file, bake_func_step);
|
||||
}
|
||||
|
||||
bake_func_end();
|
||||
|
||||
switch (err) {
|
||||
case BakedLightmap::BAKE_ERROR_NO_SAVE_PATH:
|
||||
EditorNode::get_singleton()->show_warning(TTR("Can't determine a save path for lightmap images.\nSave your scene (for images to be saved in the same dir), or pick a save path from the BakedLightmap properties."));
|
||||
break;
|
||||
case BakedLightmap::BAKE_ERROR_NO_SAVE_PATH: {
|
||||
String scene_path = lightmap->get_filename();
|
||||
if (scene_path == String()) {
|
||||
scene_path = lightmap->get_owner()->get_filename();
|
||||
}
|
||||
if (scene_path == String()) {
|
||||
EditorNode::get_singleton()->show_warning(TTR("Can't determine a save path for lightmap images.\nSave your scene and try again."));
|
||||
break;
|
||||
}
|
||||
scene_path = scene_path.get_basename() + ".lmbake";
|
||||
|
||||
file_dialog->set_current_path(scene_path);
|
||||
file_dialog->popup_centered_ratio();
|
||||
|
||||
} break;
|
||||
case BakedLightmap::BAKE_ERROR_NO_MESHES:
|
||||
EditorNode::get_singleton()->show_warning(TTR("No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake Light' flag is on."));
|
||||
break;
|
||||
@@ -57,6 +70,11 @@ void BakedLightmapEditorPlugin::_bake() {
|
||||
}
|
||||
}
|
||||
|
||||
void BakedLightmapEditorPlugin::_bake() {
|
||||
|
||||
_bake_select_file("");
|
||||
}
|
||||
|
||||
void BakedLightmapEditorPlugin::edit(Object *p_object) {
|
||||
|
||||
BakedLightmap *s = Object::cast_to<BakedLightmap>(p_object);
|
||||
@@ -83,23 +101,20 @@ void BakedLightmapEditorPlugin::make_visible(bool p_visible) {
|
||||
|
||||
EditorProgress *BakedLightmapEditorPlugin::tmp_progress = nullptr;
|
||||
|
||||
void BakedLightmapEditorPlugin::bake_func_begin(int p_steps) {
|
||||
bool BakedLightmapEditorPlugin::bake_func_step(float p_progress, const String &p_description, void *, bool p_refresh) {
|
||||
|
||||
ERR_FAIL_COND(tmp_progress != nullptr);
|
||||
|
||||
tmp_progress = memnew(EditorProgress("bake_lightmaps", TTR("Bake Lightmaps"), p_steps, true));
|
||||
}
|
||||
|
||||
bool BakedLightmapEditorPlugin::bake_func_step(int p_step, const String &p_description) {
|
||||
|
||||
ERR_FAIL_COND_V(tmp_progress == nullptr, false);
|
||||
return tmp_progress->step(p_description, p_step, false);
|
||||
if (!tmp_progress) {
|
||||
tmp_progress = memnew(EditorProgress("bake_lightmaps", TTR("Bake Lightmaps"), 1000, false));
|
||||
ERR_FAIL_COND_V(tmp_progress == nullptr, false);
|
||||
}
|
||||
return tmp_progress->step(p_description, p_progress * 1000, p_refresh);
|
||||
}
|
||||
|
||||
void BakedLightmapEditorPlugin::bake_func_end() {
|
||||
ERR_FAIL_COND(tmp_progress == nullptr);
|
||||
memdelete(tmp_progress);
|
||||
tmp_progress = nullptr;
|
||||
if (tmp_progress != nullptr) {
|
||||
memdelete(tmp_progress);
|
||||
tmp_progress = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void BakedLightmapEditorPlugin::_bind_methods() {
|
||||
@@ -111,18 +126,20 @@ BakedLightmapEditorPlugin::BakedLightmapEditorPlugin(EditorNode *p_node) {
|
||||
|
||||
editor = p_node;
|
||||
bake = memnew(ToolButton);
|
||||
bake->set_icon(editor->get_gui_base()->get_icon("Bake", "EditorIcons"));
|
||||
bake->set_icon(editor->get_gui_base()->get_theme_icon("Bake", "EditorIcons"));
|
||||
bake->set_text(TTR("Bake Lightmaps"));
|
||||
bake->hide();
|
||||
bake->connect("pressed", this, "_bake");
|
||||
bake->connect("pressed", Callable(this, "_bake"));
|
||||
add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, bake);
|
||||
lightmap = nullptr;
|
||||
|
||||
BakedLightmap::bake_begin_function = bake_func_begin;
|
||||
BakedLightmap::bake_step_function = bake_func_step;
|
||||
BakedLightmap::bake_end_function = bake_func_end;
|
||||
file_dialog = memnew(EditorFileDialog);
|
||||
file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
|
||||
file_dialog->add_filter("*.lmbake ; LightMap Bake");
|
||||
file_dialog->set_title(TTR("Select lightmap bake file:"));
|
||||
file_dialog->connect("file_selected", callable_mp(this, &BakedLightmapEditorPlugin::_bake_select_file));
|
||||
bake->add_child(file_dialog);
|
||||
}
|
||||
|
||||
BakedLightmapEditorPlugin::~BakedLightmapEditorPlugin() {
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#if 0
|
||||
#ifndef BAKED_LIGHTMAP_EDITOR_PLUGIN_H
|
||||
#define BAKED_LIGHTMAP_EDITOR_PLUGIN_H
|
||||
|
||||
@@ -46,11 +45,12 @@ class BakedLightmapEditorPlugin : public EditorPlugin {
|
||||
ToolButton *bake;
|
||||
EditorNode *editor;
|
||||
|
||||
EditorFileDialog *file_dialog;
|
||||
static EditorProgress *tmp_progress;
|
||||
static void bake_func_begin(int p_steps);
|
||||
static bool bake_func_step(int p_step, const String &p_description);
|
||||
static bool bake_func_step(float p_progress, const String &p_description, void *, bool p_refresh);
|
||||
static void bake_func_end();
|
||||
|
||||
void _bake_select_file(const String &p_file);
|
||||
void _bake();
|
||||
|
||||
protected:
|
||||
@@ -67,5 +67,4 @@ public:
|
||||
~BakedLightmapEditorPlugin();
|
||||
};
|
||||
|
||||
#endif // BAKED_LIGHTMAP_EDITOR_PLUGIN_H
|
||||
#endif
|
||||
|
||||
@@ -6161,7 +6161,7 @@ bool CanvasItemEditorViewport::can_drop_data(const Point2 &p_point, const Varian
|
||||
type == "ViewportTexture" ||
|
||||
type == "CurveTexture" ||
|
||||
type == "GradientTexture" ||
|
||||
type == "StreamTexture" ||
|
||||
type == "StreamTexture2D" ||
|
||||
type == "AtlasTexture" ||
|
||||
type == "LargeTexture") {
|
||||
Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res));
|
||||
|
||||
@@ -6008,7 +6008,8 @@ void Node3DEditor::_register_all_gizmos() {
|
||||
add_gizmo_plugin(Ref<ReflectionProbeGizmoPlugin>(memnew(ReflectionProbeGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<DecalGizmoPlugin>(memnew(DecalGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin)));
|
||||
// add_gizmo_plugin(Ref<BakedIndirectLightGizmoPlugin>(memnew(BakedIndirectLightGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<BakedLightmapGizmoPlugin>(memnew(BakedLightmapGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<LightmapProbeGizmoPlugin>(memnew(LightmapProbeGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<CollisionShape3DGizmoPlugin>(memnew(CollisionShape3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<CollisionPolygon3DGizmoPlugin>(memnew(CollisionPolygon3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<NavigationRegion3DGizmoPlugin>(memnew(NavigationRegion3DGizmoPlugin)));
|
||||
|
||||
@@ -84,8 +84,8 @@ void TextureEditor::_notification(int p_what) {
|
||||
String format;
|
||||
if (Object::cast_to<ImageTexture>(*texture)) {
|
||||
format = Image::get_format_name(Object::cast_to<ImageTexture>(*texture)->get_format());
|
||||
} else if (Object::cast_to<StreamTexture>(*texture)) {
|
||||
format = Image::get_format_name(Object::cast_to<StreamTexture>(*texture)->get_format());
|
||||
} else if (Object::cast_to<StreamTexture2D>(*texture)) {
|
||||
format = Image::get_format_name(Object::cast_to<StreamTexture2D>(*texture)->get_format());
|
||||
} else {
|
||||
format = texture->get_class();
|
||||
}
|
||||
@@ -144,7 +144,7 @@ TextureEditor::~TextureEditor() {
|
||||
//
|
||||
bool EditorInspectorPluginTexture::can_handle(Object *p_object) {
|
||||
|
||||
return Object::cast_to<ImageTexture>(p_object) != nullptr || Object::cast_to<AtlasTexture>(p_object) != nullptr || Object::cast_to<StreamTexture>(p_object) != nullptr || Object::cast_to<LargeTexture>(p_object) != nullptr || Object::cast_to<AnimatedTexture>(p_object) != nullptr;
|
||||
return Object::cast_to<ImageTexture>(p_object) != nullptr || Object::cast_to<AtlasTexture>(p_object) != nullptr || Object::cast_to<StreamTexture2D>(p_object) != nullptr || Object::cast_to<LargeTexture>(p_object) != nullptr || Object::cast_to<AnimatedTexture>(p_object) != nullptr;
|
||||
}
|
||||
|
||||
void EditorInspectorPluginTexture::parse_begin(Object *p_object) {
|
||||
|
||||
286
editor/plugins/texture_layered_editor_plugin.cpp
Normal file
286
editor/plugins/texture_layered_editor_plugin.cpp
Normal file
@@ -0,0 +1,286 @@
|
||||
/*************************************************************************/
|
||||
/* texture_editor_plugin.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* 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. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "texture_layered_editor_plugin.h"
|
||||
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/project_settings.h"
|
||||
#include "editor/editor_settings.h"
|
||||
|
||||
void TextureLayeredEditor::_gui_input(Ref<InputEvent> p_event) {
|
||||
Ref<InputEventMouseMotion> mm = p_event;
|
||||
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
|
||||
y_rot += -mm->get_relative().x * 0.01;
|
||||
x_rot += mm->get_relative().y * 0.01;
|
||||
_update_material();
|
||||
}
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_texture_rect_draw() {
|
||||
texture_rect->draw_rect(Rect2(Point2(), texture_rect->get_size()), Color(1, 1, 1, 1));
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_notification(int p_what) {
|
||||
|
||||
if (p_what == NOTIFICATION_READY) {
|
||||
|
||||
//get_scene()->connect("node_removed",this,"_node_removed");
|
||||
}
|
||||
if (p_what == NOTIFICATION_RESIZED) {
|
||||
_texture_rect_update_area();
|
||||
}
|
||||
|
||||
if (p_what == NOTIFICATION_DRAW) {
|
||||
|
||||
Ref<Texture2D> checkerboard = get_theme_icon("Checkerboard", "EditorIcons");
|
||||
Size2 size = get_size();
|
||||
|
||||
draw_texture_rect(checkerboard, Rect2(Point2(), size), true);
|
||||
}
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_changed_callback(Object *p_changed, const char *p_prop) {
|
||||
|
||||
if (!is_visible())
|
||||
return;
|
||||
update();
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_update_material() {
|
||||
|
||||
materials[0]->set_shader_param("layer", layer->get_value());
|
||||
materials[2]->set_shader_param("layer", layer->get_value());
|
||||
materials[texture->get_layered_type()]->set_shader_param("tex", texture->get_rid());
|
||||
|
||||
Vector3 v(1, 1, 1);
|
||||
v.normalize();
|
||||
|
||||
Basis b;
|
||||
b.rotate(Vector3(1, 0, 0), x_rot);
|
||||
b.rotate(Vector3(0, 1, 0), y_rot);
|
||||
|
||||
materials[1]->set_shader_param("normal", v);
|
||||
materials[1]->set_shader_param("rot", b);
|
||||
materials[2]->set_shader_param("normal", v);
|
||||
materials[2]->set_shader_param("rot", b);
|
||||
|
||||
String format = Image::get_format_name(texture->get_format());
|
||||
|
||||
String text;
|
||||
if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_2D_ARRAY) {
|
||||
text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " (x " + itos(texture->get_layers()) + ")" + format;
|
||||
} else if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_CUBEMAP) {
|
||||
text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " " + format;
|
||||
} else if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_CUBEMAP_ARRAY) {
|
||||
text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " (x " + itos(texture->get_layers() / 6) + ")" + format;
|
||||
}
|
||||
|
||||
info->set_text(text);
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_make_shaders() {
|
||||
String shader_2d_array = ""
|
||||
"shader_type canvas_item;\n"
|
||||
"uniform sampler2DArray tex;\n"
|
||||
"uniform float layer;\n"
|
||||
"void fragment() {\n"
|
||||
" COLOR = textureLod(tex,vec3(UV,layer),0.0);\n"
|
||||
"}";
|
||||
|
||||
shaders[0].instance();
|
||||
shaders[0]->set_code(shader_2d_array);
|
||||
|
||||
String shader_cube = ""
|
||||
"shader_type canvas_item;\n"
|
||||
"uniform samplerCube tex;\n"
|
||||
"uniform vec3 normal;\n"
|
||||
"uniform mat3 rot;\n"
|
||||
"void fragment() {\n"
|
||||
" vec3 n = rot * normalize(vec3(normal.xy*(UV * 2.0 - 1.0),normal.z));\n"
|
||||
" COLOR = textureLod(tex,n,0.0);\n"
|
||||
"}";
|
||||
|
||||
shaders[1].instance();
|
||||
shaders[1]->set_code(shader_cube);
|
||||
|
||||
String shader_cube_array = ""
|
||||
"shader_type canvas_item;\n"
|
||||
"uniform samplerCubeArray tex;\n"
|
||||
"uniform vec3 normal;\n"
|
||||
"uniform mat3 rot;\n"
|
||||
"uniform float layer;\n"
|
||||
"void fragment() {\n"
|
||||
" vec3 n = rot * normalize(vec3(normal.xy*(UV * 2.0 - 1.0),normal.z));\n"
|
||||
" COLOR = textureLod(tex,vec4(n,layer),0.0);\n"
|
||||
"}";
|
||||
|
||||
shaders[2].instance();
|
||||
shaders[2]->set_code(shader_cube_array);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
materials[i].instance();
|
||||
materials[i]->set_shader(shaders[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_texture_rect_update_area() {
|
||||
|
||||
Size2 size = get_size();
|
||||
int tex_width = texture->get_width() * size.height / texture->get_height();
|
||||
int tex_height = size.height;
|
||||
|
||||
if (tex_width > size.width) {
|
||||
tex_width = size.width;
|
||||
tex_height = texture->get_height() * tex_width / texture->get_width();
|
||||
}
|
||||
|
||||
// Prevent the texture from being unpreviewable after the rescale, so that we can still see something
|
||||
if (tex_height <= 0)
|
||||
tex_height = 1;
|
||||
if (tex_width <= 0)
|
||||
tex_width = 1;
|
||||
|
||||
int ofs_x = (size.width - tex_width) / 2;
|
||||
int ofs_y = (size.height - tex_height) / 2;
|
||||
|
||||
texture_rect->set_position(Vector2(ofs_x, ofs_y));
|
||||
texture_rect->set_size(Vector2(tex_width, tex_height));
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) {
|
||||
|
||||
if (!texture.is_null())
|
||||
texture->remove_change_receptor(this);
|
||||
|
||||
texture = p_texture;
|
||||
|
||||
if (!texture.is_null()) {
|
||||
|
||||
if (shaders[0].is_null()) {
|
||||
_make_shaders();
|
||||
}
|
||||
|
||||
texture->add_change_receptor(this);
|
||||
update();
|
||||
texture_rect->set_material(materials[texture->get_layered_type()]);
|
||||
setting = true;
|
||||
if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_2D_ARRAY) {
|
||||
layer->set_max(texture->get_layers() - 1);
|
||||
layer->set_value(0);
|
||||
layer->show();
|
||||
} else if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_CUBEMAP_ARRAY) {
|
||||
layer->set_max(texture->get_layers() / 6 - 1);
|
||||
layer->set_value(0);
|
||||
layer->show();
|
||||
} else {
|
||||
layer->hide();
|
||||
}
|
||||
x_rot = 0;
|
||||
y_rot = 0;
|
||||
_update_material();
|
||||
setting = false;
|
||||
_texture_rect_update_area();
|
||||
} else {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
|
||||
void TextureLayeredEditor::_bind_methods() {
|
||||
|
||||
ClassDB::bind_method(D_METHOD("_gui_input"), &TextureLayeredEditor::_gui_input);
|
||||
ClassDB::bind_method(D_METHOD("_layer_changed"), &TextureLayeredEditor::_layer_changed);
|
||||
}
|
||||
|
||||
TextureLayeredEditor::TextureLayeredEditor() {
|
||||
|
||||
set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED);
|
||||
set_custom_minimum_size(Size2(1, 150));
|
||||
texture_rect = memnew(Control);
|
||||
texture_rect->connect("draw", callable_mp(this, &TextureLayeredEditor::_texture_rect_draw));
|
||||
texture_rect->set_mouse_filter(MOUSE_FILTER_IGNORE);
|
||||
add_child(texture_rect);
|
||||
|
||||
layer = memnew(SpinBox);
|
||||
layer->set_step(1);
|
||||
layer->set_max(100);
|
||||
add_child(layer);
|
||||
layer->set_anchor(MARGIN_RIGHT, 1);
|
||||
layer->set_anchor(MARGIN_LEFT, 1);
|
||||
layer->set_h_grow_direction(GROW_DIRECTION_BEGIN);
|
||||
layer->set_modulate(Color(1, 1, 1, 0.8));
|
||||
info = memnew(Label);
|
||||
add_child(info);
|
||||
info->set_anchor(MARGIN_RIGHT, 1);
|
||||
info->set_anchor(MARGIN_LEFT, 1);
|
||||
info->set_anchor(MARGIN_BOTTOM, 1);
|
||||
info->set_anchor(MARGIN_TOP, 1);
|
||||
info->set_h_grow_direction(GROW_DIRECTION_BEGIN);
|
||||
info->set_v_grow_direction(GROW_DIRECTION_BEGIN);
|
||||
info->add_theme_color_override("font_color", Color(1, 1, 1, 1));
|
||||
info->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 0.5));
|
||||
info->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 0.5));
|
||||
info->add_theme_constant_override("shadow_as_outline", 1);
|
||||
info->add_theme_constant_override("shadow_offset_x", 2);
|
||||
info->add_theme_constant_override("shadow_offset_y", 2);
|
||||
|
||||
setting = false;
|
||||
layer->connect("value_changed", Callable(this, "_layer_changed"));
|
||||
}
|
||||
|
||||
TextureLayeredEditor::~TextureLayeredEditor() {
|
||||
if (!texture.is_null()) {
|
||||
texture->remove_change_receptor(this);
|
||||
}
|
||||
}
|
||||
//
|
||||
bool EditorInspectorPluginLayeredTexture::can_handle(Object *p_object) {
|
||||
|
||||
return Object::cast_to<TextureLayered>(p_object) != nullptr;
|
||||
}
|
||||
|
||||
void EditorInspectorPluginLayeredTexture::parse_begin(Object *p_object) {
|
||||
|
||||
TextureLayered *texture = Object::cast_to<TextureLayered>(p_object);
|
||||
if (!texture) {
|
||||
return;
|
||||
}
|
||||
Ref<TextureLayered> m(texture);
|
||||
|
||||
TextureLayeredEditor *editor = memnew(TextureLayeredEditor);
|
||||
editor->edit(m);
|
||||
add_custom_control(editor);
|
||||
}
|
||||
|
||||
TextureLayeredEditorPlugin::TextureLayeredEditorPlugin(EditorNode *p_node) {
|
||||
|
||||
Ref<EditorInspectorPluginLayeredTexture> plugin;
|
||||
plugin.instance();
|
||||
add_inspector_plugin(plugin);
|
||||
}
|
||||
95
editor/plugins/texture_layered_editor_plugin.h
Normal file
95
editor/plugins/texture_layered_editor_plugin.h
Normal file
@@ -0,0 +1,95 @@
|
||||
/*************************************************************************/
|
||||
/* texture_editor_plugin.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* 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 TEXTURE_LAYERED_EDITOR_PLUGIN_H
|
||||
#define TEXTURE_LAYERED_EDITOR_PLUGIN_H
|
||||
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_plugin.h"
|
||||
#include "scene/resources/shader.h"
|
||||
#include "scene/resources/texture.h"
|
||||
class TextureLayeredEditor : public Control {
|
||||
|
||||
GDCLASS(TextureLayeredEditor, Control);
|
||||
|
||||
SpinBox *layer;
|
||||
Label *info;
|
||||
Ref<TextureLayered> texture;
|
||||
|
||||
Ref<Shader> shaders[3];
|
||||
Ref<ShaderMaterial> materials[3];
|
||||
|
||||
float x_rot = 0;
|
||||
float y_rot = 0;
|
||||
Control *texture_rect;
|
||||
|
||||
void _make_shaders();
|
||||
|
||||
void _update_material();
|
||||
bool setting;
|
||||
void _layer_changed(double) {
|
||||
if (!setting)
|
||||
_update_material();
|
||||
}
|
||||
|
||||
void _texture_rect_update_area();
|
||||
void _texture_rect_draw();
|
||||
|
||||
protected:
|
||||
void _notification(int p_what);
|
||||
void _gui_input(Ref<InputEvent> p_event);
|
||||
void _changed_callback(Object *p_changed, const char *p_prop);
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
void edit(Ref<TextureLayered> p_texture);
|
||||
TextureLayeredEditor();
|
||||
~TextureLayeredEditor();
|
||||
};
|
||||
|
||||
class EditorInspectorPluginLayeredTexture : public EditorInspectorPlugin {
|
||||
GDCLASS(EditorInspectorPluginLayeredTexture, EditorInspectorPlugin);
|
||||
|
||||
public:
|
||||
virtual bool can_handle(Object *p_object);
|
||||
virtual void parse_begin(Object *p_object);
|
||||
};
|
||||
|
||||
class TextureLayeredEditorPlugin : public EditorPlugin {
|
||||
|
||||
GDCLASS(TextureLayeredEditorPlugin, EditorPlugin);
|
||||
|
||||
public:
|
||||
virtual String get_name() const { return "TextureLayered"; }
|
||||
|
||||
TextureLayeredEditorPlugin(EditorNode *p_node);
|
||||
};
|
||||
|
||||
#endif // TEXTURE_EDITOR_PLUGIN_H
|
||||
Reference in New Issue
Block a user