summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/base/classes.xml34
-rw-r--r--modules/gdscript/gd_editor.cpp23
-rw-r--r--modules/gdscript/gd_script.cpp7
3 files changed, 51 insertions, 13 deletions
diff --git a/doc/base/classes.xml b/doc/base/classes.xml
index e0e88ef348..6f6a094927 100644
--- a/doc/base/classes.xml
+++ b/doc/base/classes.xml
@@ -43086,43 +43086,58 @@
Helper tool to create geometry.
</brief_description>
<description>
- Helper tool to create geometry.
+ The [SurfaceTool] is used to construct a [Mesh] by specifying vertex attributes individually. It can be used to construct a [Mesh] from script. All properties except index need to be added before a call to [method add_vertex]. For example adding vertex colors and UVs looks like
+ [codeblock]
+ var st = SurfaceTool.new()
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+ st.add_color(Color(1, 0, 0))
+ st.add_uv(Vector2(0, 0))
+ st.add_vertex(Vector3(0, 0, 0))
+ [/codeblock]
+ The [SurfaceTool] now contains one vertex of a triangle which has a UV coordinate and a specified [Color]. If another vertex were added without calls to [method add_uv] or [method add_color] then the last values would be used.
+ It is very important that vertex attributes are passed [b]before[/b] the call to [method add_vertex], failure to do this will result in an error when committing the vertex information to a mesh.
</description>
<methods>
<method name="add_bones">
<argument index="0" name="bones" type="PoolIntArray">
</argument>
<description>
+ Add an array of bones for the next Vertex to use.
</description>
</method>
<method name="add_color">
<argument index="0" name="color" type="Color">
</argument>
<description>
+ Specify a [Color] for the next Vertex to use.
</description>
</method>
<method name="add_index">
<argument index="0" name="index" type="int">
</argument>
<description>
+ Adds an index to index array if you are using indexed Vertices. Does not need to be called before adding Vertex.
</description>
</method>
<method name="add_normal">
<argument index="0" name="normal" type="Vector3">
</argument>
<description>
+ Specify a normal for the next Vertex to use.
</description>
</method>
<method name="add_smooth_group">
<argument index="0" name="smooth" type="bool">
</argument>
<description>
+ Specify whether current Vertex (if using only Vertex arrays) or current index (if also using index arrays) should utilize smooth normals for normal calculation.
</description>
</method>
<method name="add_tangent">
<argument index="0" name="tangent" type="Plane">
</argument>
<description>
+ Specify a Tangent for the next Vertex to use.
</description>
</method>
<method name="add_triangle_fan">
@@ -43139,40 +43154,47 @@
<argument index="5" name="tangents" type="Array" default="Array()">
</argument>
<description>
+ Insert a triangle fan made of array data into [Mesh] being constructed.
</description>
</method>
<method name="add_uv">
<argument index="0" name="uv" type="Vector2">
</argument>
<description>
+ Specify UV Coordinate for next Vertex to use.
</description>
</method>
<method name="add_uv2">
<argument index="0" name="uv2" type="Vector2">
</argument>
<description>
+ Specify an optional second set of UV coordinates for next Vertex to use.
</description>
</method>
<method name="add_vertex">
<argument index="0" name="vertex" type="Vector3">
</argument>
<description>
+ Specify position of current Vertex. Should be called after specifying other vertex properties (e.g. Color, UV).
</description>
</method>
<method name="add_weights">
<argument index="0" name="weights" type="PoolRealArray">
</argument>
<description>
+ Specify weight value for next Vertex to use.
</description>
</method>
<method name="begin">
<argument index="0" name="primitive" type="int">
</argument>
<description>
+ Called before adding any Vertices. Takes the primitive type as an argument (e.g. Mesh.PRIMITIVE_TRIANGLES).
</description>
</method>
<method name="clear">
<description>
+ Clear all information passed into the surface tool so far.
</description>
</method>
<method name="commit">
@@ -43181,24 +43203,29 @@
<argument index="0" name="existing" type="Mesh" default="NULL">
</argument>
<description>
+ Returns a constructed [Mesh] from current information passed in. If an existing [Mesh] is passed in as an argument, will add an extra surface to the existing [Mesh].
</description>
</method>
<method name="deindex">
<description>
+ Removes index array by expanding Vertex array.
</description>
</method>
<method name="generate_normals">
<description>
+ Generates normals from Vertices so you do not have to do it manually.
</description>
</method>
<method name="index">
<description>
+ Shrinks Vertex array by creating an index array. Avoids reusing Vertices.
</description>
</method>
<method name="set_material">
<argument index="0" name="material" type="Material">
</argument>
<description>
+ Sets [Material] to be used by the [Mesh] you are constructing.
</description>
</method>
</methods>
@@ -51969,20 +51996,24 @@ do_property].
</class>
<class name="WorldEnvironment" inherits="Spatial" category="Core">
<brief_description>
+ Sets environment properties for the entire scene
</brief_description>
<description>
+ The [WorldEnvironment] node can be added to a scene in order to set default [Environment] variables for the scene. The [WorldEnvironment] can be overridden by an [Environment] node set on the current [Camera]. Additionally, only one [WorldEnvironment] may be instanced in a given scene at a time. The [WorldEnvironment] allows the user to specify default lighting parameters (e.g. ambient lighting), various post-processing effects (e.g. SSAO, DOF, Tonemapping), and how to draw the background (e.g. solid color, skybox).
</description>
<methods>
<method name="get_environment" qualifiers="const">
<return type="Environment">
</return>
<description>
+ Return the [Environment] currently bound.
</description>
</method>
<method name="set_environment">
<argument index="0" name="env" type="Environment">
</argument>
<description>
+ Set the currently bound [Environment] to the one specified.
</description>
</method>
</methods>
@@ -52307,3 +52338,4 @@ do_property].
</constants>
</class>
</doc>
+
diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp
index 2a3015c185..ba8df81c15 100644
--- a/modules/gdscript/gd_editor.cpp
+++ b/modules/gdscript/gd_editor.cpp
@@ -55,11 +55,12 @@ Ref<Script> GDScriptLanguage::get_template(const String &p_class_name, const Str
"# var a = 2\n" +
"# var b = \"textvar\"\n\n" +
"func _ready():\n" +
- "\t# Called every time the node is added to the scene.\n" +
- "\t# Initialization here\n" +
- "\tpass\n";
+ "%TS%# Called every time the node is added to the scene.\n" +
+ "%TS%# Initialization here\n" +
+ "%TS%pass\n";
_template = _template.replace("%BASE%", p_base_class_name);
+ _template = _template.replace("%TS%", _get_indentation());
Ref<GDScript> script;
script.instance();
@@ -2418,16 +2419,18 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base
String GDScriptLanguage::_get_indentation() const {
#ifdef TOOLS_ENABLED
- bool use_space_indentation = EDITOR_DEF("text_editor/indent/type", "Tabs") == "Tabs" ? 0 : 1;
+ if (SceneTree::get_singleton()->is_editor_hint()) {
+ bool use_space_indentation = EDITOR_DEF("text_editor/indent/type", "Tabs") == "Tabs" ? 0 : 1;
- if (use_space_indentation) {
- int indent_size = EDITOR_DEF("text_editor/indent/size", 4);
+ if (use_space_indentation) {
+ int indent_size = EDITOR_DEF("text_editor/indent/size", 4);
- String space_indent = "";
- for (int i = 0; i < indent_size; i++) {
- space_indent += " ";
+ String space_indent = "";
+ for (int i = 0; i < indent_size; i++) {
+ space_indent += " ";
+ }
+ return space_indent;
}
- return space_indent;
}
#endif
return "\t";
diff --git a/modules/gdscript/gd_script.cpp b/modules/gdscript/gd_script.cpp
index fe20a842cf..173014b138 100644
--- a/modules/gdscript/gd_script.cpp
+++ b/modules/gdscript/gd_script.cpp
@@ -1696,9 +1696,9 @@ void GDScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_so
//same thing for placeholders
#ifdef TOOLS_ENABLED
- for (Set<PlaceHolderScriptInstance *>::Element *P = E->get()->placeholders.front(); P; P = P->next()) {
+ while (E->get()->placeholders.size()) {
+ Object *obj = E->get()->placeholders.front()->get()->get_owner();
- Object *obj = P->get()->get_owner();
//save instance info
List<Pair<StringName, Variant> > state;
if (obj->get_script_instance()) {
@@ -1706,6 +1706,9 @@ void GDScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_so
obj->get_script_instance()->get_property_state(state);
map[obj->get_instance_ID()] = state;
obj->set_script(RefPtr());
+ } else {
+ // no instance found. Let's remove it so we don't loop forever
+ E->get()->placeholders.erase(E->get()->placeholders.front()->get());
}
}
#endif