mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-18 23:33:48 +00:00
Upgraded func_godot to 2025.8.2
This commit is contained in:
parent
ecfd54f3e8
commit
5f4b8c5b4b
82 changed files with 3227 additions and 1939 deletions
|
|
@ -1,7 +1,14 @@
|
|||
@tool
|
||||
## Special inheritance class for [FuncGodotFGDSolidClass] and [FuncGodotFGDPointClass] entity definitions. Useful for adding shared or common properties and descriptions.
|
||||
class_name FuncGodotFGDBaseClass
|
||||
extends FuncGodotFGDEntityClass
|
||||
@icon("res://addons/func_godot/icons/icon_godot_ranger.svg")
|
||||
class_name FuncGodotFGDBaseClass extends FuncGodotFGDEntityClass
|
||||
## Special inheritance class for [FuncGodotFGDSolidClass] and [FuncGodotFGDPointClass] entity definitions.
|
||||
##
|
||||
## Inheritance class for [FuncGodotFGDSolidClass] and [FuncGodotFGDPointClass] entities,
|
||||
## used to shared or common properties and descriptions across different definitions.
|
||||
##
|
||||
## @tutorial(Quake Wiki Entity Article): https://quakewiki.org/wiki/Entity
|
||||
## @tutorial(Level Design Book: Entity Types and Settings): https://book.leveldesignbook.com/appendix/resources/formats/fgd#entity-types-and-settings-basic
|
||||
## @tutorial(Valve Developer Wiki FGD Article): https://developer.valvesoftware.com/wiki/FGD#Class_Types_and_Properties
|
||||
|
||||
func _init() -> void:
|
||||
prefix = "@BaseClass"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
uid://6o4wbl0iau0v
|
||||
uid://ck575aqs1sbrb
|
||||
|
|
|
|||
|
|
@ -1,13 +1,20 @@
|
|||
@icon("res://addons/func_godot/icons/icon_godot_ranger.svg")
|
||||
## Base entity definition class. Not to be used directly, use [FuncGodotFGDBaseClass], [FuncGodotFGDSolidClass], or [FuncGodotFGDPointClass] instead.
|
||||
class_name FuncGodotFGDEntityClass
|
||||
extends Resource
|
||||
class_name FuncGodotFGDEntityClass extends Resource
|
||||
## Entity definition template. WARNING! Not to be used directly! Use [FuncGodotFGDBaseClass], [FuncGodotFGDSolidClass], or [FuncGodotFGDPointClass] instead.
|
||||
##
|
||||
## Entity definition template. It holds all of the common entity class properties shared between [FuncGodotFGDBaseClass], [FuncGodotFGDSolidClass], or [FuncGodotFGDPointClass].
|
||||
## Not to be used directly, use one of the aforementioned FGD class types instead.
|
||||
##
|
||||
## @tutorial(Quake Wiki Entity Article): https://quakewiki.org/wiki/Entity
|
||||
## @tutorial(Level Design Book: Entity Types and Settings): https://book.leveldesignbook.com/appendix/resources/formats/fgd#entity-types-and-settings-basic
|
||||
## @tutorial(Valve Developer Wiki FGD Article): https://developer.valvesoftware.com/wiki/FGD#Class_Types_and_Properties
|
||||
## @tutorial(Valve Developer Wiki Entity Descriptions): https://developer.valvesoftware.com/wiki/FGD#Entity_Description
|
||||
|
||||
var prefix: String = ""
|
||||
|
||||
@export_group("Entity Definition")
|
||||
|
||||
## Entity classname. This is a required field in all entity types as it is parsed by both the map editor and by FuncGodot on map build.
|
||||
## Entity classname. [b][i]This is a required field in all entity types[/i][/b] as it is parsed by both the map editor and by FuncGodot on map build.
|
||||
@export var classname : String = ""
|
||||
|
||||
## Entity description that appears in the map editor. Not required.
|
||||
|
|
@ -16,19 +23,21 @@ var prefix: String = ""
|
|||
## Entity does not get written to the exported FGD. Entity is only used for [FuncGodotMap] build process.
|
||||
@export var func_godot_internal : bool = false
|
||||
|
||||
## FuncGodotFGDBaseClass resources to inherit [member class_properties] and [member class_descriptions] from.
|
||||
## [FuncGodotFGDBaseClass] resources to inherit [member class_properties] and [member class_descriptions] from.
|
||||
@export var base_classes: Array[Resource] = []
|
||||
|
||||
## Key value pair properties that will appear in the map editor. After building the FuncGodotMap in Godot, these properties will be added to a Dictionary that gets applied to the generated Node, as long as that Node is a tool script with an exported `func_godot_properties` Dictionary.
|
||||
## Key value pair properties that will appear in the map editor. After building the [FuncGodotMap] in Godot, these properties will be added to a [Dictionary]
|
||||
## that gets applied to the generated node, as long as that node is a tool script with an exported `func_godot_properties` Dictionary.
|
||||
@export var class_properties : Dictionary = {}
|
||||
|
||||
## Descriptions for previously defined key value pair properties.
|
||||
## Map editor descriptions for previously defined key value pair properties. Optional but recommended.
|
||||
@export var class_property_descriptions : Dictionary = {}
|
||||
|
||||
## Automatically applies entity class properties to matching properties in the generated node. When using this feature, class properties need to be the correct type or you may run into errors on map build.
|
||||
## Automatically applies entity class properties to matching properties in the generated node.
|
||||
## When using this feature, class properties need to be the correct type or you may run into errors on map build.
|
||||
@export var auto_apply_to_matching_node_properties : bool = false
|
||||
|
||||
## Appearance properties for the map editor. See the [**Valve FGD**](https://developer.valvesoftware.com/wiki/FGD#Entity_Description) and [**TrenchBroom**](https://trenchbroom.github.io/manual/latest/#display-models-for-entities) documentation for more information.
|
||||
## Appearance properties for the map editor. See the Valve Developer Wiki and TrenchBroom documentation for more information.
|
||||
@export var meta_properties : Dictionary = {
|
||||
"size": AABB(Vector3(-8, -8, -8), Vector3(8, 8, 8)),
|
||||
"color": Color(0.8, 0.8, 0.8)
|
||||
|
|
@ -36,14 +45,16 @@ var prefix: String = ""
|
|||
|
||||
@export_group("Node Generation")
|
||||
|
||||
## Node to generate on map build. This can be a built-in Godot class or a GDExtension class. For Point Class entities that use Scene File instantiation leave this blank.
|
||||
## Node to generate on map build. This can be a built-in Godot class, a GDScript class, or a GDExtension class.
|
||||
## For Point Class entities that use Scene File instantiation leave this blank.
|
||||
@export var node_class := ""
|
||||
|
||||
## Class property to use in naming the generated node. Overrides `name_property` in [FuncGodotMapSettings].
|
||||
## Optional class property to use in naming the generated node. Overrides [member FuncGodotMapSettings.name_property].
|
||||
## Naming occurs before adding to the [SceneTree] and applying properties.
|
||||
## Nodes will be named `"entity_" + name_property`. An entity's name should be unique, otherwise you may run into unexpected behavior.
|
||||
@export var name_property := ""
|
||||
|
||||
## Parses the definition and outputs it into the FGD format.
|
||||
func build_def_text(target_editor: FuncGodotFGDFile.FuncGodotTargetMapEditors = FuncGodotFGDFile.FuncGodotTargetMapEditors.TRENCHBROOM) -> String:
|
||||
# Class prefix
|
||||
var res : String = prefix
|
||||
|
|
@ -92,6 +103,8 @@ func build_def_text(target_editor: FuncGodotFGDFile.FuncGodotTargetMapEditors =
|
|||
]
|
||||
elif value is String:
|
||||
res += value
|
||||
elif value is Dictionary and target_editor == FuncGodotFGDFile.FuncGodotTargetMapEditors.TRENCHBROOM:
|
||||
res += JSON.stringify(value)
|
||||
|
||||
res += ")"
|
||||
|
||||
|
|
@ -120,7 +133,8 @@ func build_def_text(target_editor: FuncGodotFGDFile.FuncGodotTargetMapEditors =
|
|||
if value is Dictionary and class_property_descriptions[prop] is Array:
|
||||
var prop_arr: Array = class_property_descriptions[prop]
|
||||
if prop_arr.size() > 1 and (prop_arr[1] is int or prop_arr[1] is String):
|
||||
prop_description = "\"" + prop_arr[0] + "\" : " + str(prop_arr[1])
|
||||
var value_str : String = str(prop_arr[1]) if prop_arr[1] is int else "\"" + prop_arr[1] + "\""
|
||||
prop_description = "\"" + prop_arr[0] + "\" : " + value_str
|
||||
else:
|
||||
prop_description = "\"\" : 0"
|
||||
printerr(str(prop) + " has incorrect description format. Should be [String description, int / String default value].")
|
||||
|
|
@ -204,7 +218,9 @@ func build_def_text(target_editor: FuncGodotFGDFile.FuncGodotTargetMapEditors =
|
|||
res += " : "
|
||||
res += prop_description
|
||||
|
||||
if value is bool or value is Dictionary or value is Array:
|
||||
if value is bool:
|
||||
res += " : 1 = " if value else " : 0 = "
|
||||
elif value is Dictionary or value is Array:
|
||||
res += " = "
|
||||
else:
|
||||
res += " : "
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
uid://blhmvtghs553u
|
||||
uid://cgkrrgcimlr8y
|
||||
|
|
|
|||
|
|
@ -1,8 +1,12 @@
|
|||
@tool
|
||||
@icon("res://addons/func_godot/icons/icon_godot_ranger.svg")
|
||||
## [Resource] file used to express a set of [FuncGodotFGDEntity] definitions. Can be exported as an FGD file for use with a Quake map editor. Used in conjunction with a [FuncGodotMapSetting] resource to generate nodes in a [FuncGodotMap] node.
|
||||
class_name FuncGodotFGDFile
|
||||
extends Resource
|
||||
class_name FuncGodotFGDFile extends Resource
|
||||
## [Resource] file used to express a set of [FuncGodotFGDEntity] definitions.
|
||||
##
|
||||
## Can be exported as an FGD file for use with a Quake or Hammer-based map editor. Used in conjunction with [FuncGodotMapSetting] to generate nodes in a [FuncGodotMap] node.
|
||||
##
|
||||
## @tutorial(Level Design Book FGD Chapter): https://book.leveldesignbook.com/appendix/resources/formats/fgd
|
||||
## @tutorial(Valve Developer Wiki FGD Article): https://developer.valvesoftware.com/wiki/FGD
|
||||
|
||||
## Supported map editors enum, used in conjunction with [member target_map_editor].
|
||||
enum FuncGodotTargetMapEditors {
|
||||
|
|
@ -13,12 +17,10 @@ enum FuncGodotTargetMapEditors {
|
|||
}
|
||||
|
||||
## Builds and exports the FGD file.
|
||||
@export var export_file: bool:
|
||||
get:
|
||||
return export_file # TODO Converter40 Non existent get function
|
||||
set(new_export_file):
|
||||
if new_export_file != export_file:
|
||||
do_export_file(target_map_editor)
|
||||
@export_tool_button("Export FGD") var export_file := export_button
|
||||
|
||||
func export_button() -> void:
|
||||
do_export_file(target_map_editor)
|
||||
|
||||
func do_export_file(target_editor: FuncGodotTargetMapEditors = FuncGodotTargetMapEditors.TRENCHBROOM, fgd_output_folder: String = "") -> void:
|
||||
if not Engine.is_editor_hint():
|
||||
|
|
@ -32,11 +34,20 @@ func do_export_file(target_editor: FuncGodotTargetMapEditors = FuncGodotTargetMa
|
|||
|
||||
if fgd_name == "":
|
||||
print("Skipping export: Empty FGD name")
|
||||
|
||||
if not DirAccess.dir_exists_absolute(fgd_output_folder):
|
||||
if DirAccess.make_dir_recursive_absolute(fgd_output_folder) != OK:
|
||||
print("Skipping export: Failed to create directory")
|
||||
return
|
||||
|
||||
var fgd_file = fgd_output_folder + "/" + fgd_name + ".fgd"
|
||||
|
||||
print("Exporting FGD to ", fgd_file)
|
||||
var fgd_file = fgd_output_folder.path_join(fgd_name + ".fgd")
|
||||
|
||||
var file_obj := FileAccess.open(fgd_file, FileAccess.WRITE)
|
||||
if not file_obj:
|
||||
print("Failed to open file for writing: ", fgd_file)
|
||||
return
|
||||
|
||||
print("Exporting FGD to ", fgd_file)
|
||||
file_obj.store_string(build_class_text(target_editor))
|
||||
file_obj.close()
|
||||
|
||||
|
|
@ -100,8 +111,8 @@ func get_fgd_classes() -> Array:
|
|||
res.append(cur_ent_def)
|
||||
return res
|
||||
|
||||
func get_entity_definitions() -> Dictionary:
|
||||
var res : Dictionary = {}
|
||||
func get_entity_definitions() -> Dictionary[String, FuncGodotFGDEntityClass]:
|
||||
var res: Dictionary[String, FuncGodotFGDEntityClass] = {}
|
||||
|
||||
for base_fgd in base_fgd_files:
|
||||
var fgd_res = base_fgd.get_entity_definitions()
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
uid://cknmd0lgmorx2
|
||||
uid://drlmgulwbjwqu
|
||||
|
|
|
|||
|
|
@ -1,43 +1,49 @@
|
|||
@tool
|
||||
## A special type of [FuncGodotFGDPointClass] entity that can automatically generate a special simplified GLB model file for the map editor display.
|
||||
@icon("res://addons/func_godot/icons/icon_godambler3d.svg")
|
||||
class_name FuncGodotFGDModelPointClass extends FuncGodotFGDPointClass
|
||||
## A special type of [FuncGodotFGDPointClass] entity that automatically generates a special simplified GLB model file for the map editor display.
|
||||
## Only supported in map editors that support GLTF or GLB.
|
||||
class_name FuncGodotFGDModelPointClass
|
||||
extends FuncGodotFGDPointClass
|
||||
##
|
||||
## @tutorial(Quake Wiki Entity Article): https://quakewiki.org/wiki/Entity
|
||||
## @tutorial(Level Design Book: Entity Types and Settings): https://book.leveldesignbook.com/appendix/resources/formats/fgd#entity-types-and-settings-basic
|
||||
## @tutorial(Valve Developer Wiki FGD Article): https://developer.valvesoftware.com/wiki/FGD#Class_Types_and_Properties
|
||||
## @tutorial(dumptruck_ds' Quake Mapping Entities Tutorial): https://www.youtube.com/watch?v=gtL9f6_N2WM
|
||||
## @tutorial(Level Design Book: Display Models for Entities): https://book.leveldesignbook.com/appendix/resources/formats/fgd#display-models-for-entities
|
||||
## @tutorial(Valve Developer Wiki FGD Article: Entity Description Section): https://developer.valvesoftware.com/wiki/FGD#Entity_Description
|
||||
## @tutorial(TrenchBroom Manual: Display Models for Entities): https://trenchbroom.github.io/manual/latest/#display-models-for-entities
|
||||
|
||||
enum TargetMapEditor {
|
||||
GENERIC,
|
||||
TRENCHBROOM
|
||||
GENERIC, ## Entity definition uses the [b]@studio[/b] key word. [member scale_expression] is ignored. Supported by all map editors.
|
||||
TRENCHBROOM ## Entity definition uses the [b]@model[/b] key word. [member scale_expression] is applied if set.
|
||||
}
|
||||
|
||||
## Determines how model interprets [member scale_expression].
|
||||
@export var target_map_editor: TargetMapEditor = TargetMapEditor.GENERIC
|
||||
## Display model export folder relative to the model folder set by [FuncGodotLocalConfig].
|
||||
## Display model export folder relative to [member ProjectSettings.func_godot/model_point_class_save_path].
|
||||
@export var models_sub_folder : String = ""
|
||||
## Scale expression applied to model. See the [TrenchBroom Documentation](https://trenchbroom.github.io/manual/latest/#display-models-for-entities) for more information.
|
||||
## Scale expression applied to model. Only used by TrenchBroom. If left empty, uses [member ProjectSettings.func_godot/default_inverse_scale_factor]. [br][br]Read the TrenchBroom Manual for more information on the "scale expression" feature.
|
||||
@export var scale_expression : String = ""
|
||||
## Model Point Class can override the 'size' meta property by auto-generating a value from the meshes' [AABB]. Proper generation requires 'scale_expression' set to a float or [Vector3]. **WARNING:** Generated size property unlikely to align cleanly to grid!
|
||||
## Model Point Class can override the 'size' meta property by auto-generating a value from the meshes' [AABB]. Proper generation requires [member scale_expression] set to a float or vector. [br][br][color=orange]WARNING:[/color] Generated size property unlikely to align cleanly to grid!
|
||||
@export var generate_size_property : bool = false
|
||||
## Degrees to rotate model prior to export. Different editors may handdle GLTF transformations differently. If your model isn't oriented correctly, try modifying this property.
|
||||
## Degrees to rotate model prior to export. Different editors may handle GLTF transformations differently. If your model isn't oriented correctly, try modifying this property.
|
||||
@export var rotation_offset: Vector3 = Vector3(0.0, 0.0, 0.0)
|
||||
## Creates a .gdignore file in the model export folder to prevent Godot importing the display models. Only needs to be generated once.
|
||||
@export var generate_gd_ignore_file : bool = false :
|
||||
get:
|
||||
return generate_gd_ignore_file
|
||||
set(ignore):
|
||||
if (ignore != generate_gd_ignore_file):
|
||||
if Engine.is_editor_hint():
|
||||
var path: String = _get_game_path().path_join(_get_model_folder())
|
||||
var error: Error = DirAccess.make_dir_recursive_absolute(path)
|
||||
if error != Error.OK:
|
||||
printerr("Failed creating dir for GDIgnore file", error)
|
||||
return
|
||||
path = path.path_join('.gdignore')
|
||||
if FileAccess.file_exists(path):
|
||||
return
|
||||
var file: FileAccess = FileAccess.open(path, FileAccess.WRITE)
|
||||
file.store_string('')
|
||||
file.close()
|
||||
@export_tool_button("Generate GD Ignore File", "FileAccess") var generate_gd_ignore_file : Callable = _generate_gd_ignore_file
|
||||
|
||||
func _generate_gd_ignore_file() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
var path: String = _get_game_path().path_join(_get_model_folder())
|
||||
var error: Error = DirAccess.make_dir_recursive_absolute(path)
|
||||
if error != Error.OK:
|
||||
printerr("Failed creating dir for GDIgnore file", error)
|
||||
return
|
||||
path = path.path_join('.gdignore')
|
||||
if FileAccess.file_exists(path):
|
||||
return
|
||||
var file: FileAccess = FileAccess.open(path, FileAccess.WRITE)
|
||||
file.store_string('')
|
||||
file.close()
|
||||
|
||||
## Builds and saves the display model into the specified destination, then parses the definition and outputs it into the FGD format.
|
||||
func build_def_text(target_editor: FuncGodotFGDFile.FuncGodotTargetMapEditors = FuncGodotFGDFile.FuncGodotTargetMapEditors.TRENCHBROOM) -> String:
|
||||
_generate_model()
|
||||
return super()
|
||||
|
|
@ -47,13 +53,15 @@ func _generate_model() -> void:
|
|||
return
|
||||
|
||||
var gltf_state := GLTFState.new()
|
||||
var path = _get_export_dir()
|
||||
var node = _get_node()
|
||||
if node == null: return
|
||||
var path: String = _get_export_dir()
|
||||
var node: Node3D = _get_node()
|
||||
if not node:
|
||||
return
|
||||
if not _create_gltf_file(gltf_state, path, node):
|
||||
printerr("could not create gltf file")
|
||||
return
|
||||
node.queue_free()
|
||||
|
||||
if target_map_editor == TargetMapEditor.TRENCHBROOM:
|
||||
const model_key: String = "model"
|
||||
if scale_expression.is_empty():
|
||||
|
|
@ -67,7 +75,7 @@ func _generate_model() -> void:
|
|||
meta_properties["studio"] = '"%s"' % _get_local_path()
|
||||
|
||||
if generate_size_property:
|
||||
meta_properties["size"] = _generate_size_from_aabb(gltf_state.meshes)
|
||||
meta_properties["size"] = _generate_size_from_aabb(gltf_state.meshes, gltf_state.get_nodes())
|
||||
|
||||
func _get_node() -> Node3D:
|
||||
var node := scene_file.instantiate()
|
||||
|
|
@ -86,7 +94,7 @@ func _get_local_path() -> String:
|
|||
return _get_model_folder().path_join('%s.glb' % classname)
|
||||
|
||||
func _get_model_folder() -> String:
|
||||
var model_dir: String = FuncGodotLocalConfig.get_setting(FuncGodotLocalConfig.PROPERTY.GAME_PATH_MODELS_FOLDER) as String
|
||||
var model_dir: String = ProjectSettings.get_setting("func_godot/model_point_class_save_path", "") as String
|
||||
if not models_sub_folder.is_empty():
|
||||
model_dir = model_dir.path_join(models_sub_folder)
|
||||
return model_dir
|
||||
|
|
@ -107,7 +115,7 @@ func _create_gltf_file(gltf_state: GLTFState, path: String, node: Node3D) -> boo
|
|||
if target_map_editor != TargetMapEditor.TRENCHBROOM:
|
||||
var scale_factor: Vector3 = Vector3.ONE
|
||||
if scale_expression.is_empty():
|
||||
scale_factor *= FuncGodotLocalConfig.get_setting(FuncGodotLocalConfig.PROPERTY.DEFAULT_INVERSE_SCALE) as float
|
||||
scale_factor *= ProjectSettings.get_setting("func_godot/default_inverse_scale_factor", 32.0) as float
|
||||
else:
|
||||
if scale_expression.begins_with('\''):
|
||||
var scale_arr := scale_expression.split_floats(' ', false)
|
||||
|
|
@ -134,31 +142,43 @@ func _save_to_file_system(gltf_document: GLTFDocument, gltf_state: GLTFState, pa
|
|||
return
|
||||
|
||||
error = gltf_document.write_to_filesystem(gltf_state, path)
|
||||
if error != OK:
|
||||
if error != Error.OK:
|
||||
printerr("Failed writing to file system", error)
|
||||
return
|
||||
print('Exported model to ', path)
|
||||
|
||||
func _generate_size_from_aabb(meshes: Array[GLTFMesh]) -> AABB:
|
||||
func _generate_size_from_aabb(meshes: Array[GLTFMesh], nodes: Array[GLTFNode]) -> AABB:
|
||||
var aabb := AABB()
|
||||
for mesh in meshes:
|
||||
aabb = aabb.merge(mesh.mesh.get_mesh().get_aabb())
|
||||
|
||||
var pos_ofs := Vector3.ZERO
|
||||
if not nodes.is_empty():
|
||||
var ct: int = 0
|
||||
for node in nodes:
|
||||
if node.parent == 0:
|
||||
pos_ofs += node.position
|
||||
ct += 1
|
||||
pos_ofs /= maxi(ct, 1)
|
||||
aabb.position += pos_ofs
|
||||
|
||||
# Reorient the AABB so it matches TrenchBroom's coordinate system
|
||||
var size_prop := AABB()
|
||||
size_prop.position = Vector3(aabb.position.z, aabb.position.x, aabb.position.y)
|
||||
size_prop.size = Vector3(aabb.size.z, aabb.size.x, aabb.size.y)
|
||||
|
||||
|
||||
# Scale the size bounds to our scale factor
|
||||
# Scale factor will need to be set if we decide to auto-generate our bounds
|
||||
var scale_factor: Vector3 = Vector3.ONE
|
||||
if target_map_editor == TargetMapEditor.TRENCHBROOM:
|
||||
if scale_expression.begins_with('\''):
|
||||
var scale_arr := scale_expression.split_floats(' ', false)
|
||||
if scale_arr.size() == 3:
|
||||
scale_factor *= Vector3(scale_arr[0], scale_arr[1], scale_arr[2])
|
||||
elif scale_expression.to_float() > 0:
|
||||
scale_factor *= scale_expression.to_float()
|
||||
if scale_expression.is_empty():
|
||||
scale_factor *= ProjectSettings.get_setting("func_godot/default_inverse_scale_factor", 32.0) as float
|
||||
else:
|
||||
if scale_expression.begins_with('\''):
|
||||
var scale_arr := scale_expression.split_floats(' ', false)
|
||||
if scale_arr.size() == 3:
|
||||
scale_factor *= Vector3(scale_arr[0], scale_arr[1], scale_arr[2])
|
||||
elif scale_expression.to_float() > 0:
|
||||
scale_factor *= scale_expression.to_float()
|
||||
|
||||
size_prop.position *= scale_factor
|
||||
size_prop.size *= scale_factor
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
uid://dkmyelig23ub5
|
||||
uid://ldfqjtq0br35
|
||||
|
|
|
|||
|
|
@ -1,23 +1,35 @@
|
|||
@tool
|
||||
## FGD PointClass entity definition, used to define point entities.
|
||||
## PointClass entities can use either the `node_class` or the `scene_file` property to tell [FuncGodotMap] what to generate on map build.
|
||||
class_name FuncGodotFGDPointClass
|
||||
extends FuncGodotFGDEntityClass
|
||||
@icon("res://addons/func_godot/icons/icon_godambler3d.svg")
|
||||
class_name FuncGodotFGDPointClass extends FuncGodotFGDEntityClass
|
||||
## FGD PointClass entity definition.
|
||||
##
|
||||
## A resource used to define an FGD PointClass entity. PointClass entities can use either the [member FuncGodotFGDEntityClass.node_class]
|
||||
## or the [member scene_file] property to tell [FuncGodotMap] what to generate on map build.
|
||||
##
|
||||
## @tutorial(Quake Wiki Entity Article): https://quakewiki.org/wiki/Entity
|
||||
## @tutorial(Level Design Book: Entity Types and Settings): https://book.leveldesignbook.com/appendix/resources/formats/fgd#entity-types-and-settings-basic
|
||||
## @tutorial(Valve Developer Wiki FGD Article): https://developer.valvesoftware.com/wiki/FGD#Class_Types_and_Properties
|
||||
## @tutorial(dumptruck_ds' Quake Mapping Entities Tutorial): https://www.youtube.com/watch?v=gtL9f6_N2WM
|
||||
## @tutorial(Level Design Book: Display Models for Entities): https://book.leveldesignbook.com/appendix/resources/formats/fgd#display-models-for-entities
|
||||
## @tutorial(Valve Developer Wiki FGD Article: Entity Description Section): https://developer.valvesoftware.com/wiki/FGD#Entity_Description
|
||||
## @tutorial(TrenchBroom Manual: Display Models for Entities): https://trenchbroom.github.io/manual/latest/#display-models-for-entities
|
||||
|
||||
func _init() -> void:
|
||||
prefix = "@PointClass"
|
||||
|
||||
@export_group ("Scene")
|
||||
## An optional scene file to instantiate on map build. Overrides `node_class` and `script_class`.
|
||||
## An optional [PackedScene] file to instantiate on map build. Overrides [member FuncGodotFGDEntityClass.node_class] and [member script_class].
|
||||
@export var scene_file: PackedScene
|
||||
|
||||
## An optional script file to attach to the node generated on map build. Ignored if `scene_file` is specified.
|
||||
@export_group ("Scripting")
|
||||
## An optional [Script] resource to attach to the node generated on map build. Ignored if [member scene_file] is specified.
|
||||
@export var script_class: Script
|
||||
|
||||
@export_group("Build")
|
||||
## Toggles whether entity will use `angles`, `mangle`, or `angle` to determine rotations on [FuncGodotMap] build, prioritizing the key value pairs in that order. Set to `false` if you would like to define how the generated node is rotated yourself.
|
||||
## Toggles whether entity will use `angles`, `mangle`, or `angle` to determine rotations on [FuncGodotMap] build, prioritizing the key value pairs in that order.
|
||||
## Set to [code]false[/code] if you would like to define how the generated node is rotated yourself.
|
||||
@export var apply_rotation_on_map_build : bool = true
|
||||
|
||||
## Toggles whether entity will use `scale` to determine the generated node or scene's scale. This is performed on the top level node. The property can be a [float], [Vector3], or [Vector2].
|
||||
## Toggles whether entity will use `scale` to determine the generated node or scene's scale. This is performed on the top level node.
|
||||
## The property can be a [float], [Vector3], or [Vector2]. Set to [code]false[/code] if you would like to define how the generated node is scaled yourself.
|
||||
@export var apply_scale_on_map_build: bool = true
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
uid://c83r7t467hm4m
|
||||
uid://cxsqwtsqd8w33
|
||||
|
|
|
|||
|
|
@ -1,21 +1,29 @@
|
|||
@tool
|
||||
## FGD SolidClass entity definition, used to define brush entities.
|
||||
## A [MeshInstance3D] will be generated by FuncGodotMap according to this definition's Visual Build settings. If FuncGodotFGDSolidClass [member node_class] inherits [CollisionObject3D] then one or more [CollisionShape3D] nodes will be generated according to Collision Build settings.
|
||||
class_name FuncGodotFGDSolidClass
|
||||
extends FuncGodotFGDEntityClass
|
||||
@icon("res://addons/func_godot/icons/icon_slipgate3d.svg")
|
||||
class_name FuncGodotFGDSolidClass extends FuncGodotFGDEntityClass
|
||||
## FGD SolidClass entity definition that generates a mesh from [FuncGodotData.BrushData].
|
||||
##
|
||||
## A [MeshInstance3D] will be generated by [FuncGodotMap] according to this definition's Visual Build settings.
|
||||
## If [member FuncGodotFGDEntityClass.node_class] inherits [CollisionObject3D]
|
||||
## then one or more [CollisionShape3D] nodes will be generated according to Collision Build settings.
|
||||
##
|
||||
## @tutorial(Quake Wiki Entity Article): https://quakewiki.org/wiki/Entity
|
||||
## @tutorial(Level Design Book: Entity Types and Settings): https://book.leveldesignbook.com/appendix/resources/formats/fgd#entity-types-and-settings-basic
|
||||
## @tutorial(Valve Developer Wiki FGD Article): https://developer.valvesoftware.com/wiki/FGD#Class_Types_and_Properties
|
||||
## @tutorial(dumptruck_ds' Quake Mapping Entities Tutorial): https://www.youtube.com/watch?v=gtL9f6_N2WM
|
||||
|
||||
enum SpawnType {
|
||||
WORLDSPAWN = 0, ## Is worldspawn
|
||||
MERGE_WORLDSPAWN = 1, ## Should be combined with worldspawn
|
||||
ENTITY = 2, ## Is its own separate entity
|
||||
WORLDSPAWN = 0, ## Builds the geometry of this entity relative to the FuncGodotMap position.
|
||||
MERGE_WORLDSPAWN = 1, ## This entity's geometry is merged with the [b]worldspawn[/b] entity and this entity is removed. Behavior mimics [b]func_group[/b] in modern Quake compilers.
|
||||
ENTITY = 2, ## This entity is built as its own object. It finds the origin of the entity based on [member origin_type].
|
||||
}
|
||||
|
||||
enum OriginType {
|
||||
AVERAGED = 0, ## Use averaged brush vertices for center position. This is the old Qodot behavior.
|
||||
ABSOLUTE = 1, ## Use `origin` class property in global coordinates as the center position.
|
||||
RELATIVE = 2, ## Calculate center position using `origin` class property as an offset to the entity's bounding box center.
|
||||
BRUSH = 3, ## Calculate center position based on the bounding box center of all brushes using the 'origin' texture specified in the [FuncGodotMapSettings].
|
||||
BOUNDS_CENTER = 4, ## Use the center of the entity's bounding box for center position. This is the default option and recommended for most entities.
|
||||
ABSOLUTE = 1, ## Use [code]origin[/code] class property in global coordinates as the center position.
|
||||
RELATIVE = 2, ## Calculate center position using [code]origin[/code] class property as an offset to the entity's bounding box center.
|
||||
BRUSH = 3, ## Calculate center position based on the bounding box center of all brushes using the 'origin' texture specified in the [FuncGodotMapSettings]. If no Origin Brush is found, fall back to BOUNDS_CENTER. This is the default option and recommended for most entities.
|
||||
BOUNDS_CENTER = 4, ## Use the center of the entity's bounding box for center position.
|
||||
BOUNDS_MINS = 5, ## Use the lowest bounding box coordinates for center position. This is standard Quake and Half-Life brush entity behavior.
|
||||
BOUNDS_MAXS = 6, ## Use the highest bounding box coordinates for center position.
|
||||
}
|
||||
|
|
@ -29,12 +37,14 @@ enum CollisionShapeType {
|
|||
## Controls whether this Solid Class is the worldspawn, is combined with the worldspawn, or is spawned as its own free-standing entity.
|
||||
@export var spawn_type: SpawnType = SpawnType.ENTITY
|
||||
## Controls how this Solid Class determines its center position. Only valid if [member spawn_type] is set to ENTITY.
|
||||
@export var origin_type: OriginType = OriginType.BOUNDS_CENTER
|
||||
@export var origin_type: OriginType = OriginType.BRUSH
|
||||
|
||||
@export_group("Visual Build")
|
||||
## Controls whether a [MeshInstance3D] is built for this Solid Class.
|
||||
@export var build_visuals : bool = true
|
||||
## Sets generated [MeshInstance3D] to be available for UV2 unwrapping after [FuncGodotMap] build. Utilized in baked lightmapping.
|
||||
## Global illumination mode for the generated [MeshInstance3D]. Setting to [b]GI_MODE_STATIC[/b] will unwrap the mesh's UV2 during build.
|
||||
@export var global_illumination_mode : GeometryInstance3D.GIMode = GeometryInstance3D.GI_MODE_STATIC
|
||||
## @deprecated: Use [member global_illumination_mode] instead. [br]Sets generated [MeshInstance3D] to be available for UV2 unwrapping after [FuncGodotMap] build. Utilized in baked lightmapping.
|
||||
@export var use_in_baked_light : bool = true
|
||||
## Shadow casting setting allows for further lightmapping customization.
|
||||
@export var shadow_casting_setting : GeometryInstance3D.ShadowCastingSetting = GeometryInstance3D.SHADOW_CASTING_SETTING_ON
|
||||
|
|
@ -67,21 +77,29 @@ enum CollisionShapeType {
|
|||
@export var add_vertex_metadata: bool = false
|
||||
## Add a [PackedVector3Array] called [i]"positions"[/i] to the generated node's metadata on build.[br][br]
|
||||
## This is a list of positions for each face, local to the generated node, calculated by averaging the vertices to find the face's center.
|
||||
@export var add_face_position_metadata = false
|
||||
@export var add_face_position_metadata: bool = false
|
||||
## Add a [PackedVector3Array] called [i]"normals"[/i] to the generated node's metadata on build.[br][br]
|
||||
## Contains a list of each face's normal.
|
||||
@export var add_face_normal_metadata = false
|
||||
## Add a [Dictionary] called [i]"collision_shape_to_face_range_map"[/i] in the generated node's metadata on build.[br][br]
|
||||
@export var add_face_normal_metadata: bool = false
|
||||
## Add a [Dictionary] called [i]"collision_shape_to_face_indices_map"[/i] in the generated node's metadata on build.[br][br]
|
||||
## Contains keys of strings, which are the names of child [CollisionShape3D] nodes, and values of
|
||||
## [PackedInt32Array], containing indices of that child's faces.[br][br]
|
||||
## For example, an element of [br][br][code]{ "entity_1_brush_0_collision_shape" : [0, 1, 3] }[/code][br][br]
|
||||
## shows that this solid class has been generated with one child collision shape named
|
||||
## [i]entity_1_brush_0_collision_shape[/i] which handles 3 faces of the mesh with collision, at indices 0, 1, and 3.
|
||||
@export var add_collision_shape_to_face_indices_metadata : bool = false
|
||||
## [s]Add a [Dictionary] called [i]"collision_shape_to_face_range_map"[/i] in the generated node's metadata on build.[br][br]
|
||||
## Contains keys of strings, which are the names of child [CollisionShape3D] nodes, and values of
|
||||
## [Vector2i], where [i]X[/i] represents the starting index of that child's faces and [i]Y[/i] represents the
|
||||
## ending index.[br][br]
|
||||
## For example, an element of [br][br][code]{ "entity_1_brush_0_collision_shape" : Vector2i(0, 15) }[/code][br][br]
|
||||
## shows that this solid class has been generated with one child collision shape named
|
||||
## [i]entity_1_brush_0_collision_shape[/i] which handles the first 15 faces of the parts of the mesh with collision.
|
||||
@export var add_collision_shape_face_range_metadata = false
|
||||
## [i]entity_1_brush_0_collision_shape[/i] which handles the first 15 faces of the parts of the mesh with collision.[/s]
|
||||
## @deprecated: No longer supported or planned as of 2025.7, but retained in case a contributor provides an appropriate solution in the future.
|
||||
@export var add_collision_shape_face_range_metadata: bool = false
|
||||
|
||||
@export_group("Scripting")
|
||||
## An optional script file to attach to the node generated on map build.
|
||||
## An optional [Script] file to attach to the node generated on map build.
|
||||
@export var script_class: Script
|
||||
|
||||
func _init():
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
uid://msq50x6rk4po
|
||||
uid://5cow84q03m6a
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue