generated from nathanfranke/gdextension
-
Notifications
You must be signed in to change notification settings - Fork 147
/
Copy pathterrain_3d_texture.cpp
122 lines (102 loc) · 4.67 KB
/
terrain_3d_texture.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright © 2023 Roope Palmroos, Cory Petkovsek, and Contributors. All rights reserved. See LICENSE.
#include <godot_cpp/core/class_db.hpp>
#include "terrain_3d_logger.h"
#include "terrain_3d_texture.h"
///////////////////////////
// Private Functions
///////////////////////////
bool Terrain3DTexture::_is_texture_valid(const Ref<Texture2D> &p_texture) const {
if (p_texture.is_null()) {
LOG(DEBUG, "Provided texture is null.");
return true;
}
Ref<Image> img = p_texture->get_image();
Image::Format format = Image::FORMAT_MAX;
if (img.is_valid()) {
format = img->get_format();
}
if (format != Image::FORMAT_DXT5) {
LOG(ERROR, "Invalid format. Expected channel packed DXT5 RGBA8. See documentation for format.");
return false;
}
return true;
}
///////////////////////////
// Public Functions
///////////////////////////
Terrain3DTexture::Terrain3DTexture() {
}
Terrain3DTexture::~Terrain3DTexture() {
}
void Terrain3DTexture::clear() {
_data._name = "New Texture";
_data._texture_id = 0;
_data._albedo_color = Color(1.0, 1.0, 1.0, 1.0);
_data._albedo_texture.unref();
_data._normal_texture.unref();
_data._uv_scale = 0.1f;
_data._uv_rotation = 0.0f;
}
void Terrain3DTexture::set_name(String p_name) {
_data._name = p_name;
emit_signal("setting_changed");
}
void Terrain3DTexture::set_texture_id(int p_new_id) {
int old_id = _data._texture_id;
_data._texture_id = p_new_id;
emit_signal("id_changed", old_id, p_new_id);
}
void Terrain3DTexture::set_albedo_color(Color p_color) {
_data._albedo_color = p_color;
emit_signal("setting_changed");
}
void Terrain3DTexture::set_albedo_texture(const Ref<Texture2D> &p_texture) {
if (_is_texture_valid(p_texture)) {
_data._albedo_texture = p_texture;
emit_signal("texture_changed");
}
}
void Terrain3DTexture::set_normal_texture(const Ref<Texture2D> &p_texture) {
if (_is_texture_valid(p_texture)) {
_data._normal_texture = p_texture;
emit_signal("texture_changed");
}
}
void Terrain3DTexture::set_uv_scale(float p_scale) {
_data._uv_scale = p_scale;
emit_signal("setting_changed");
}
void Terrain3DTexture::set_uv_rotation(float p_rotation) {
_data._uv_rotation = CLAMP(p_rotation, 0.0f, 1.0f);
emit_signal("setting_changed");
}
///////////////////////////
// Protected Functions
///////////////////////////
void Terrain3DTexture::_bind_methods() {
ADD_SIGNAL(MethodInfo("id_changed"));
ADD_SIGNAL(MethodInfo("texture_changed"));
ADD_SIGNAL(MethodInfo("setting_changed"));
ClassDB::bind_method(D_METHOD("clear"), &Terrain3DTexture::clear);
ClassDB::bind_method(D_METHOD("set_name", "name"), &Terrain3DTexture::set_name);
ClassDB::bind_method(D_METHOD("get_name"), &Terrain3DTexture::get_name);
ClassDB::bind_method(D_METHOD("set_texture_id", "id"), &Terrain3DTexture::set_texture_id);
ClassDB::bind_method(D_METHOD("get_texture_id"), &Terrain3DTexture::get_texture_id);
ClassDB::bind_method(D_METHOD("set_albedo_color", "color"), &Terrain3DTexture::set_albedo_color);
ClassDB::bind_method(D_METHOD("get_albedo_color"), &Terrain3DTexture::get_albedo_color);
ClassDB::bind_method(D_METHOD("set_albedo_texture", "texture"), &Terrain3DTexture::set_albedo_texture);
ClassDB::bind_method(D_METHOD("get_albedo_texture"), &Terrain3DTexture::get_albedo_texture);
ClassDB::bind_method(D_METHOD("set_normal_texture", "texture"), &Terrain3DTexture::set_normal_texture);
ClassDB::bind_method(D_METHOD("get_normal_texture"), &Terrain3DTexture::get_normal_texture);
ClassDB::bind_method(D_METHOD("set_uv_scale", "scale"), &Terrain3DTexture::set_uv_scale);
ClassDB::bind_method(D_METHOD("get_uv_scale"), &Terrain3DTexture::get_uv_scale);
ClassDB::bind_method(D_METHOD("set_uv_rotation", "scale"), &Terrain3DTexture::set_uv_rotation);
ClassDB::bind_method(D_METHOD("get_uv_rotation"), &Terrain3DTexture::get_uv_rotation);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE), "set_name", "get_name");
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_id", PROPERTY_HINT_NONE), "set_texture_id", "get_texture_id");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "albedo_color", PROPERTY_HINT_COLOR_NO_ALPHA), "set_albedo_color", "get_albedo_color");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "albedo_texture", PROPERTY_HINT_RESOURCE_TYPE, "ImageTexture,CompressedTexture2D"), "set_albedo_texture", "get_albedo_texture");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "normal_texture", PROPERTY_HINT_RESOURCE_TYPE, "ImageTexture,CompressedTexture2D"), "set_normal_texture", "get_normal_texture");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "uv_scale", PROPERTY_HINT_RANGE, "0.001, 2.0"), "set_uv_scale", "get_uv_scale");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "uv_rotation", PROPERTY_HINT_RANGE, "0.0, 1.0"), "set_uv_rotation", "get_uv_rotation");
}