统一缩进为制表符
@ -1,9 +1,2 @@
|
||||
# Editor configuration, see https://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*.gd]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
root = true
|
||||
@ -1,99 +1,109 @@
|
||||
const Faces = preload("./Faces.gd");
|
||||
const vox_to_godot = Basis(Vector3.RIGHT, Vector3.FORWARD, Vector3.UP);
|
||||
|
||||
|
||||
func generate(vox, voxel_data, scale, snaptoground):
|
||||
var generator = VoxelMeshGenerator.new(vox, voxel_data, scale, snaptoground);
|
||||
var generator = VoxelMeshGenerator.new(vox, voxel_data, scale, snaptoground);
|
||||
|
||||
return generator.generate_mesh();
|
||||
|
||||
return generator.generate_mesh();
|
||||
|
||||
class MeshGenerator:
|
||||
var surfaces = {};
|
||||
|
||||
func ensure_surface_exists(surface_index: int, color: Color, material: Material):
|
||||
if (surfaces.has(surface_index)): return;
|
||||
|
||||
var st = SurfaceTool.new();
|
||||
st.begin(Mesh.PRIMITIVE_TRIANGLES);
|
||||
st.set_color(color);
|
||||
st.set_material(material);
|
||||
surfaces[surface_index] = st;
|
||||
|
||||
func add_vertex(surface_index: int, vertex: Vector3):
|
||||
var st = surfaces[surface_index] as SurfaceTool;
|
||||
st.add_vertex(vertex);
|
||||
|
||||
func combine_surfaces():
|
||||
var mesh = null;
|
||||
for surface_index in surfaces:
|
||||
var surface = surfaces[surface_index] as SurfaceTool;
|
||||
surface.index();
|
||||
surface.generate_normals();
|
||||
mesh = surface.commit(mesh);
|
||||
|
||||
var new_surface_index = mesh.get_surface_count() - 1;
|
||||
var name = str(surface_index);
|
||||
mesh.surface_set_name(new_surface_index, name);
|
||||
return mesh;
|
||||
var surfaces = {};
|
||||
|
||||
|
||||
func ensure_surface_exists(surface_index: int, color: Color, material: Material):
|
||||
if (surfaces.has(surface_index)): return;
|
||||
|
||||
var st = SurfaceTool.new();
|
||||
st.begin(Mesh.PRIMITIVE_TRIANGLES);
|
||||
st.set_color(color);
|
||||
st.set_material(material);
|
||||
surfaces[surface_index] = st;
|
||||
|
||||
|
||||
func add_vertex(surface_index: int, vertex: Vector3):
|
||||
var st = surfaces[surface_index] as SurfaceTool;
|
||||
st.add_vertex(vertex);
|
||||
|
||||
|
||||
func combine_surfaces():
|
||||
var mesh = null;
|
||||
for surface_index in surfaces:
|
||||
var surface = surfaces[surface_index] as SurfaceTool;
|
||||
surface.index();
|
||||
surface.generate_normals();
|
||||
mesh = surface.commit(mesh);
|
||||
|
||||
var new_surface_index = mesh.get_surface_count() - 1;
|
||||
var name = str(surface_index);
|
||||
mesh.surface_set_name(new_surface_index, name);
|
||||
return mesh;
|
||||
|
||||
|
||||
class VoxelMeshGenerator:
|
||||
var vox;
|
||||
var voxel_data = {};
|
||||
var scale:float;
|
||||
var snaptoground:bool;
|
||||
|
||||
func _init(vox,voxel_data,scale,snaptoground):
|
||||
self.vox = vox;
|
||||
self.voxel_data = voxel_data;
|
||||
self.scale = scale;
|
||||
self.snaptoground = snaptoground;
|
||||
|
||||
func get_material(voxel):
|
||||
var surface_index = voxel_data[voxel];
|
||||
return vox.materials[surface_index]
|
||||
|
||||
func face_is_visible(voxel, face):
|
||||
if (not voxel_data.has(voxel + face)):
|
||||
return true;
|
||||
var local_material = get_material(voxel);
|
||||
var adj_material = get_material(voxel + face);
|
||||
return adj_material.is_glass() && !local_material.is_glass();
|
||||
|
||||
func generate_mesh():
|
||||
|
||||
# Minimum extends of the volume
|
||||
var mins :Vector3 = Vector3(1000000, 1000000, 1000000)
|
||||
# Maximum extends of the volume
|
||||
var maxs :Vector3 = Vector3(-1000000,-1000000,-1000000)
|
||||
|
||||
# Find bounds
|
||||
for v in voxel_data:
|
||||
mins.x = min(mins.x, v.x)
|
||||
mins.y = min(mins.y, v.y)
|
||||
mins.z = min(mins.z, v.z)
|
||||
maxs.x = max(maxs.x, v.x)
|
||||
maxs.y = max(maxs.y, v.y)
|
||||
maxs.z = max(maxs.z, v.z)
|
||||
|
||||
var vox_to_godot = Basis(Vector3.RIGHT, Vector3.FORWARD, Vector3.UP);
|
||||
var yoffset = Vector3(0,0,0);
|
||||
if snaptoground : yoffset = Vector3(0, -mins.z * scale, 0);
|
||||
var gen = MeshGenerator.new();
|
||||
|
||||
for voxel in voxel_data:
|
||||
var voxelSides = []
|
||||
if face_is_visible(voxel, Vector3.UP): voxelSides += Faces.Top
|
||||
if face_is_visible(voxel, Vector3.DOWN): voxelSides += Faces.Bottom
|
||||
if face_is_visible(voxel, Vector3.LEFT): voxelSides += Faces.Left
|
||||
if face_is_visible(voxel, Vector3.RIGHT): voxelSides += Faces.Right
|
||||
if face_is_visible(voxel, Vector3.BACK): voxelSides += Faces.Front
|
||||
if face_is_visible(voxel, Vector3.FORWARD): voxelSides += Faces.Back
|
||||
|
||||
var surface_index = voxel_data[voxel];
|
||||
var color = vox.colors[surface_index];
|
||||
var material = vox.materials[surface_index].get_material(color);
|
||||
gen.ensure_surface_exists(surface_index, color, material);
|
||||
|
||||
for t in voxelSides:
|
||||
gen.add_vertex(surface_index, yoffset + vox_to_godot * (t + voxel) * scale);
|
||||
|
||||
return gen.combine_surfaces();
|
||||
var vox;
|
||||
var voxel_data = {};
|
||||
var scale: float;
|
||||
var snaptoground: bool;
|
||||
|
||||
|
||||
func _init(vox, voxel_data, scale, snaptoground):
|
||||
self.vox = vox;
|
||||
self.voxel_data = voxel_data;
|
||||
self.scale = scale;
|
||||
self.snaptoground = snaptoground;
|
||||
|
||||
|
||||
func get_material(voxel):
|
||||
var surface_index = voxel_data[voxel];
|
||||
return vox.materials[surface_index]
|
||||
|
||||
|
||||
func face_is_visible(voxel, face):
|
||||
if (not voxel_data.has(voxel + face)):
|
||||
return true;
|
||||
var local_material = get_material(voxel);
|
||||
var adj_material = get_material(voxel + face);
|
||||
return adj_material.is_glass() && !local_material.is_glass();
|
||||
|
||||
|
||||
func generate_mesh():
|
||||
|
||||
# Minimum extends of the volume
|
||||
var mins: Vector3 = Vector3(1000000, 1000000, 1000000)
|
||||
# Maximum extends of the volume
|
||||
var maxs: Vector3 = Vector3(-1000000, -1000000, -1000000)
|
||||
|
||||
# Find bounds
|
||||
for v in voxel_data:
|
||||
mins.x = min(mins.x, v.x)
|
||||
mins.y = min(mins.y, v.y)
|
||||
mins.z = min(mins.z, v.z)
|
||||
maxs.x = max(maxs.x, v.x)
|
||||
maxs.y = max(maxs.y, v.y)
|
||||
maxs.z = max(maxs.z, v.z)
|
||||
|
||||
var vox_to_godot = Basis(Vector3.RIGHT, Vector3.FORWARD, Vector3.UP);
|
||||
var yoffset = Vector3(0, 0, 0);
|
||||
if snaptoground: yoffset = Vector3(0, -mins.z * scale, 0);
|
||||
var gen = MeshGenerator.new();
|
||||
|
||||
for voxel in voxel_data:
|
||||
var voxelSides = []
|
||||
if face_is_visible(voxel, Vector3.UP): voxelSides += Faces.Top
|
||||
if face_is_visible(voxel, Vector3.DOWN): voxelSides += Faces.Bottom
|
||||
if face_is_visible(voxel, Vector3.LEFT): voxelSides += Faces.Left
|
||||
if face_is_visible(voxel, Vector3.RIGHT): voxelSides += Faces.Right
|
||||
if face_is_visible(voxel, Vector3.BACK): voxelSides += Faces.Front
|
||||
if face_is_visible(voxel, Vector3.FORWARD): voxelSides += Faces.Back
|
||||
|
||||
var surface_index = voxel_data[voxel];
|
||||
var color = vox.colors[surface_index];
|
||||
var material = vox.materials[surface_index].get_material(color);
|
||||
gen.ensure_surface_exists(surface_index, color, material);
|
||||
|
||||
for t in voxelSides:
|
||||
gen.add_vertex(surface_index, yoffset + vox_to_godot * (t + voxel) * scale);
|
||||
|
||||
return gen.combine_surfaces();
|
||||
|
||||
@ -1,59 +1,54 @@
|
||||
const Top = [
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
Vector3( 1.0000, 1.0000, 0.0000),
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
];
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
Vector3( 1.0000, 1.0000, 0.0000),
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
];
|
||||
const Bottom = [
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
Vector3( 0.0000, 0.0000, 1.0000),
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
];
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
Vector3( 0.0000, 0.0000, 1.0000),
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
];
|
||||
const Front = [
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
Vector3( 0.0000, 0.0000, 1.0000),
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
];
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
Vector3( 0.0000, 0.0000, 1.0000),
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
];
|
||||
const Back = [
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
Vector3( 1.0000, 1.0000, 0.0000),
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
Vector3( 1.0000, 0.0000, 0.0000)
|
||||
];
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
Vector3( 1.0000, 1.0000, 0.0000),
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
Vector3( 1.0000, 0.0000, 0.0000)
|
||||
];
|
||||
const Left = [
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
Vector3( 0.0000, 0.0000, 1.0000),
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
];
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
Vector3( 0.0000, 0.0000, 1.0000),
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
|
||||
Vector3( 0.0000, 0.0000, 0.0000),
|
||||
Vector3( 0.0000, 1.0000, 0.0000),
|
||||
Vector3( 0.0000, 1.0000, 1.0000),
|
||||
];
|
||||
const Right = [
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
Vector3( 1.0000, 1.0000, 0.0000),
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
];
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
Vector3( 1.0000, 1.0000, 0.0000),
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
|
||||
Vector3( 1.0000, 0.0000, 0.0000),
|
||||
Vector3( 1.0000, 0.0000, 1.0000),
|
||||
Vector3( 1.0000, 1.0000, 1.0000),
|
||||
];
|
||||
|
||||
@ -1,227 +1,222 @@
|
||||
const Faces = preload("./Faces.gd")
|
||||
const VoxData = preload("./VoxFormat/VoxData.gd")
|
||||
const Faces = preload("./Faces.gd")
|
||||
const VoxData = preload("./VoxFormat/VoxData.gd")
|
||||
const vox_to_godot = Basis(Vector3.RIGHT, Vector3.FORWARD, Vector3.UP)
|
||||
|
||||
# Names for the faces by orientation
|
||||
enum FaceOrientation {
|
||||
Top = 0,
|
||||
Bottom = 1,
|
||||
Left = 2,
|
||||
Right = 3,
|
||||
Front = 4,
|
||||
Back = 5,
|
||||
Top = 0,
|
||||
Bottom = 1,
|
||||
Left = 2,
|
||||
Right = 3,
|
||||
Front = 4,
|
||||
Back = 5,
|
||||
}
|
||||
|
||||
# An Array(FaceOrientation) of all possible face orientations
|
||||
const face_orientations :Array = [
|
||||
FaceOrientation.Top,
|
||||
FaceOrientation.Bottom,
|
||||
FaceOrientation.Left,
|
||||
FaceOrientation.Right,
|
||||
FaceOrientation.Front,
|
||||
FaceOrientation.Back
|
||||
]
|
||||
|
||||
const face_orientations: Array = [
|
||||
FaceOrientation.Top,
|
||||
FaceOrientation.Bottom,
|
||||
FaceOrientation.Left,
|
||||
FaceOrientation.Right,
|
||||
FaceOrientation.Front,
|
||||
FaceOrientation.Back
|
||||
]
|
||||
# An Array(int) of the depth axis by orientation
|
||||
const depth_axis :Array = [
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Y,
|
||||
]
|
||||
|
||||
const depth_axis: Array = [
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Y,
|
||||
]
|
||||
# An Array(int) of the width axis by orientation
|
||||
const width_axis :Array = [
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_X,
|
||||
]
|
||||
|
||||
const width_axis: Array = [
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_X,
|
||||
]
|
||||
# An Array(int) of height axis by orientation
|
||||
const height_axis :Array = [
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_Z,
|
||||
]
|
||||
|
||||
const height_axis: Array = [
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_X,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Y,
|
||||
Vector3.AXIS_Z,
|
||||
Vector3.AXIS_Z,
|
||||
]
|
||||
# An Array(Vector3) describing what vectors to use to check for face occlusion
|
||||
# by orientation
|
||||
const face_checks :Array = [
|
||||
Vector3(0, 0, 1),
|
||||
Vector3(0, 0, -1),
|
||||
Vector3(-1, 0, 0),
|
||||
Vector3(1, 0, 0),
|
||||
Vector3(0, -1, 0),
|
||||
Vector3(0, 1, 0),
|
||||
]
|
||||
|
||||
const face_checks: Array = [
|
||||
Vector3(0, 0, 1),
|
||||
Vector3(0, 0, -1),
|
||||
Vector3(-1, 0, 0),
|
||||
Vector3(1, 0, 0),
|
||||
Vector3(0, -1, 0),
|
||||
Vector3(0, 1, 0),
|
||||
]
|
||||
# An array of the face meshes by orientation
|
||||
const face_meshes :Array = [
|
||||
Faces.Front,
|
||||
Faces.Back,
|
||||
Faces.Left,
|
||||
Faces.Right,
|
||||
Faces.Bottom,
|
||||
Faces.Top,
|
||||
]
|
||||
|
||||
const face_meshes: Array = [
|
||||
Faces.Front,
|
||||
Faces.Back,
|
||||
Faces.Left,
|
||||
Faces.Right,
|
||||
Faces.Bottom,
|
||||
Faces.Top,
|
||||
]
|
||||
# An Array(Vector3) describing what normals to use by orientation
|
||||
const normals :Array = [
|
||||
Vector3(0, 1, 0),
|
||||
Vector3(0, -1, 0),
|
||||
Vector3(-1, 0, 0),
|
||||
Vector3(1, 0, 0),
|
||||
Vector3(0, 0, 1),
|
||||
Vector3(0, 0, -1),
|
||||
]
|
||||
|
||||
const normals: Array = [
|
||||
Vector3(0, 1, 0),
|
||||
Vector3(0, -1, 0),
|
||||
Vector3(-1, 0, 0),
|
||||
Vector3(1, 0, 0),
|
||||
Vector3(0, 0, 1),
|
||||
Vector3(0, 0, -1),
|
||||
]
|
||||
# The SurfaceTool the object will use to generate the mesh
|
||||
var st :SurfaceTool = SurfaceTool.new()
|
||||
|
||||
var st: SurfaceTool = SurfaceTool.new()
|
||||
# A Dictonary[Vector3]int of the voxel data for the visible faces of the
|
||||
# current slice
|
||||
var faces :Dictionary
|
||||
|
||||
var faces: Dictionary
|
||||
# Minimum extends of the volume
|
||||
var mins :Vector3 = Vector3(1000000, 1000000, 1000000)
|
||||
|
||||
var mins: Vector3 = Vector3(1000000, 1000000, 1000000)
|
||||
# Maximum extends of the volume
|
||||
var maxs :Vector3 = Vector3(-1000000,-1000000,-1000000)
|
||||
var maxs: Vector3 = Vector3(-1000000, -1000000, -1000000)
|
||||
|
||||
|
||||
# Generate a mesh for the given voxel_data with single-pass greedy face merging
|
||||
# Primary RefCounted: https://0fps.net/2012/06/30/meshing-in-a-minecraft-game/
|
||||
# Secondary RefCounted: https://www.gedge.ca/dev/2014/08/17/greedy-voxel-meshing
|
||||
# voxel_data is a dict[Vector3]int
|
||||
func generate(vox :VoxData, voxel_data :Dictionary, scale :float, snaptoground : bool):
|
||||
# Remeber, MagicaVoxel thinks Y is the depth axis. We convert to the correct
|
||||
# coordinate space when we generate the faces.
|
||||
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
||||
|
||||
# Short-circut empty models
|
||||
if voxel_data.size() == 0:
|
||||
return st.commit()
|
||||
|
||||
# Convert voxel data to raw color values
|
||||
for v in voxel_data:
|
||||
voxel_data[v] = vox.colors[voxel_data[v]]
|
||||
|
||||
# Find bounds
|
||||
for v in voxel_data:
|
||||
mins.x = min(mins.x, v.x)
|
||||
mins.y = min(mins.y, v.y)
|
||||
mins.z = min(mins.z, v.z)
|
||||
maxs.x = max(maxs.x, v.x)
|
||||
maxs.y = max(maxs.y, v.y)
|
||||
maxs.z = max(maxs.z, v.z)
|
||||
|
||||
# Itterate over all face orientations to reduce problem to 3 dimensions
|
||||
for o in face_orientations:
|
||||
generate_geometry_for_orientation(voxel_data, o, scale, snaptoground)
|
||||
|
||||
# Finish the mesh and material and return
|
||||
var material = StandardMaterial3D.new()
|
||||
material.vertex_color_is_srgb = true
|
||||
material.vertex_color_use_as_albedo = true
|
||||
material.roughness = 1
|
||||
st.set_material(material)
|
||||
return st.commit()
|
||||
func generate(vox: VoxData, voxel_data: Dictionary, scale: float, snaptoground: bool):
|
||||
# Remeber, MagicaVoxel thinks Y is the depth axis. We convert to the correct
|
||||
# coordinate space when we generate the faces.
|
||||
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
||||
|
||||
# Short-circut empty models
|
||||
if voxel_data.size() == 0:
|
||||
return st.commit()
|
||||
|
||||
# Convert voxel data to raw color values
|
||||
for v in voxel_data:
|
||||
voxel_data[v] = vox.colors[voxel_data[v]]
|
||||
|
||||
# Find bounds
|
||||
for v in voxel_data:
|
||||
mins.x = min(mins.x, v.x)
|
||||
mins.y = min(mins.y, v.y)
|
||||
mins.z = min(mins.z, v.z)
|
||||
maxs.x = max(maxs.x, v.x)
|
||||
maxs.y = max(maxs.y, v.y)
|
||||
maxs.z = max(maxs.z, v.z)
|
||||
|
||||
# Itterate over all face orientations to reduce problem to 3 dimensions
|
||||
for o in face_orientations:
|
||||
generate_geometry_for_orientation(voxel_data, o, scale, snaptoground)
|
||||
|
||||
# Finish the mesh and material and return
|
||||
var material = StandardMaterial3D.new()
|
||||
material.vertex_color_is_srgb = true
|
||||
material.vertex_color_use_as_albedo = true
|
||||
material.roughness = 1
|
||||
st.set_material(material)
|
||||
return st.commit()
|
||||
|
||||
|
||||
# Generates all of the geometry for a given face orientation
|
||||
func generate_geometry_for_orientation(voxel_data :Dictionary, o :int, scale :float, snaptoground :bool) -> void:
|
||||
# Sweep through the volume along the depth reducing the problem to 2 dimensional
|
||||
var da :int = depth_axis[o]
|
||||
for slice in range(mins[da], maxs[da]+1):
|
||||
var faces :Dictionary = query_slice_faces(voxel_data, o, slice)
|
||||
if faces.size() > 0:
|
||||
generate_geometry(faces, o, slice, scale, snaptoground)
|
||||
func generate_geometry_for_orientation(voxel_data: Dictionary, o: int, scale: float, snaptoground: bool) -> void:
|
||||
# Sweep through the volume along the depth reducing the problem to 2 dimensional
|
||||
var da: int = depth_axis[o]
|
||||
for slice in range(mins[da], maxs[da]+1):
|
||||
var faces: Dictionary = query_slice_faces(voxel_data, o, slice)
|
||||
if faces.size() > 0:
|
||||
generate_geometry(faces, o, slice, scale, snaptoground)
|
||||
|
||||
|
||||
# Returns the voxels in the set voxel_data with a visible face along the slice
|
||||
# for the given orientation
|
||||
func query_slice_faces(voxel_data :Dictionary, o :int, slice :float) -> Dictionary:
|
||||
var ret :Dictionary = Dictionary()
|
||||
var da = depth_axis[o]
|
||||
for v in voxel_data:
|
||||
if v[da] == slice and voxel_data.has(v + face_checks[o]) == false:
|
||||
ret[v] = voxel_data[v]
|
||||
return ret
|
||||
func query_slice_faces(voxel_data: Dictionary, o: int, slice: float) -> Dictionary:
|
||||
var ret: Dictionary = Dictionary()
|
||||
var da = depth_axis[o]
|
||||
for v in voxel_data:
|
||||
if v[da] == slice and voxel_data.has(v + face_checks[o]) == false:
|
||||
ret[v] = voxel_data[v]
|
||||
return ret
|
||||
|
||||
|
||||
# Generates geometry for the given orientation for the set of faces
|
||||
func generate_geometry(faces :Dictionary, o :int, slice :float, scale :float, snaptoground :bool) -> void:
|
||||
var da :int = depth_axis[o]
|
||||
var wa :int = width_axis[o]
|
||||
var ha :int = height_axis[o]
|
||||
var v :Vector3 = Vector3()
|
||||
v[da] = slice
|
||||
|
||||
# Itterate the rows of the sparse volume
|
||||
v[ha] = mins[ha]
|
||||
while v[ha] <= maxs[ha]:
|
||||
# Itterate over the voxels of the row
|
||||
v[wa] = mins[wa]
|
||||
while v[wa] <= maxs[wa]:
|
||||
if faces.has(v):
|
||||
generate_geometry_for_face(faces, v, o, scale, snaptoground)
|
||||
v[wa] += 1.0
|
||||
v[ha] += 1.0
|
||||
func generate_geometry(faces: Dictionary, o: int, slice: float, scale: float, snaptoground: bool) -> void:
|
||||
var da: int = depth_axis[o]
|
||||
var wa: int = width_axis[o]
|
||||
var ha: int = height_axis[o]
|
||||
var v: Vector3 = Vector3()
|
||||
v[da] = slice
|
||||
|
||||
# Itterate the rows of the sparse volume
|
||||
v[ha] = mins[ha]
|
||||
while v[ha] <= maxs[ha]:
|
||||
# Itterate over the voxels of the row
|
||||
v[wa] = mins[wa]
|
||||
while v[wa] <= maxs[wa]:
|
||||
if faces.has(v):
|
||||
generate_geometry_for_face(faces, v, o, scale, snaptoground)
|
||||
v[wa] += 1.0
|
||||
v[ha] += 1.0
|
||||
|
||||
|
||||
# Generates the geometry for the given face and orientation and scale and returns
|
||||
# the set of remaining faces
|
||||
func generate_geometry_for_face(faces :Dictionary, face :Vector3, o :int, scale :float, snaptoground :bool) -> Dictionary:
|
||||
var da :int = depth_axis[o]
|
||||
var wa :int = width_axis[o]
|
||||
var ha :int = height_axis[o]
|
||||
|
||||
# Greedy face merging
|
||||
var width :int = width_query(faces, face, o)
|
||||
var height :int = height_query(faces, face, o, width)
|
||||
var grow :Vector3 = Vector3(1, 1, 1)
|
||||
grow[wa] *= width
|
||||
grow[ha] *= height
|
||||
|
||||
# Generate geometry
|
||||
var yoffset = Vector3(0,0,0);
|
||||
if snaptoground : yoffset = Vector3(0, -mins.z * scale, 0);
|
||||
|
||||
st.set_color(faces[face])
|
||||
st.set_normal(normals[o])
|
||||
for vert in face_meshes[o]:
|
||||
st.add_vertex(yoffset + vox_to_godot * ((vert * grow) + face) * scale)
|
||||
|
||||
# Remove these faces from the pool
|
||||
var v :Vector3 = Vector3()
|
||||
v[da] = face[da]
|
||||
for iy in range(height):
|
||||
v[ha] = face[ha] + float(iy)
|
||||
for ix in range(width):
|
||||
v[wa] = face[wa] + float(ix)
|
||||
faces.erase(v)
|
||||
|
||||
return faces
|
||||
func generate_geometry_for_face(faces: Dictionary, face: Vector3, o: int, scale: float, snaptoground: bool) -> Dictionary:
|
||||
var da: int = depth_axis[o]
|
||||
var wa: int = width_axis[o]
|
||||
var ha: int = height_axis[o]
|
||||
|
||||
# Greedy face merging
|
||||
var width: int = width_query(faces, face, o)
|
||||
var height: int = height_query(faces, face, o, width)
|
||||
var grow: Vector3 = Vector3(1, 1, 1)
|
||||
grow[wa] *= width
|
||||
grow[ha] *= height
|
||||
|
||||
# Generate geometry
|
||||
var yoffset = Vector3(0, 0, 0);
|
||||
if snaptoground: yoffset = Vector3(0, -mins.z * scale, 0);
|
||||
|
||||
st.set_color(faces[face])
|
||||
st.set_normal(normals[o])
|
||||
for vert in face_meshes[o]:
|
||||
st.add_vertex(yoffset + vox_to_godot * ((vert * grow) + face) * scale)
|
||||
|
||||
# Remove these faces from the pool
|
||||
var v: Vector3 = Vector3()
|
||||
v[da] = face[da]
|
||||
for iy in range(height):
|
||||
v[ha] = face[ha] + float(iy)
|
||||
for ix in range(width):
|
||||
v[wa] = face[wa] + float(ix)
|
||||
faces.erase(v)
|
||||
|
||||
return faces
|
||||
|
||||
|
||||
# Returns the number of voxels wide the run starting at face is with respect to
|
||||
# the set of faces and orientation
|
||||
func width_query(faces :Dictionary, face :Vector3, o :int) -> int:
|
||||
var wd :int = width_axis[o]
|
||||
var v :Vector3 = face
|
||||
while faces.has(v) and faces[v] == faces[face]:
|
||||
v[wd] += 1.0
|
||||
return int(v[wd] - face[wd])
|
||||
func width_query(faces: Dictionary, face: Vector3, o: int) -> int:
|
||||
var wd: int = width_axis[o]
|
||||
var v: Vector3 = face
|
||||
while faces.has(v) and faces[v] == faces[face]:
|
||||
v[wd] += 1.0
|
||||
return int(v[wd] - face[wd])
|
||||
|
||||
|
||||
# Returns the number of voxels high the run starting at face is with respect to
|
||||
# the set of faces and orientation, with the given width
|
||||
func height_query(faces :Dictionary, face :Vector3, o :int, width :int) -> int:
|
||||
var hd :int = height_axis[o]
|
||||
var c :Color = faces[face]
|
||||
var v :Vector3 = face
|
||||
v[hd] += 1.0
|
||||
while faces.has(v) and faces[v] == c and width_query(faces, v, o) >= width:
|
||||
v[hd] += 1.0
|
||||
return int(v[hd] - face[hd])
|
||||
func height_query(faces: Dictionary, face: Vector3, o: int, width: int) -> int:
|
||||
var hd: int = height_axis[o]
|
||||
var c: Color = faces[face]
|
||||
var v: Vector3 = face
|
||||
v[hd] += 1.0
|
||||
while faces.has(v) and faces[v] == c and width_query(faces, v, o) >= width:
|
||||
v[hd] += 1.0
|
||||
return int(v[hd] - face[hd])
|
||||
|
||||
@ -1,41 +1,53 @@
|
||||
var file: FileAccess;
|
||||
var chunk_size = 0;
|
||||
|
||||
|
||||
func _init(file: FileAccess):
|
||||
self.file = file;
|
||||
self.chunk_size = 0;
|
||||
self.file = file;
|
||||
self.chunk_size = 0;
|
||||
|
||||
|
||||
func has_data_to_read(): return file.get_position() < file.get_length()
|
||||
|
||||
|
||||
func set_chunk_size(size):
|
||||
chunk_size = size;
|
||||
chunk_size = size;
|
||||
|
||||
|
||||
func get_8():
|
||||
chunk_size -= 1;
|
||||
return file.get_8();
|
||||
func get_32():
|
||||
chunk_size -= 4;
|
||||
return file.get_32();
|
||||
chunk_size -= 1;
|
||||
return file.get_8();
|
||||
|
||||
|
||||
func get_32():
|
||||
chunk_size -= 4;
|
||||
return file.get_32();
|
||||
|
||||
|
||||
func get_buffer(length):
|
||||
chunk_size -= length;
|
||||
return file.get_buffer(length);
|
||||
chunk_size -= length;
|
||||
return file.get_buffer(length);
|
||||
|
||||
|
||||
func read_remaining():
|
||||
get_buffer(chunk_size);
|
||||
chunk_size = 0;
|
||||
get_buffer(chunk_size);
|
||||
chunk_size = 0;
|
||||
|
||||
|
||||
func get_string(length):
|
||||
return get_buffer(length).get_string_from_ascii()
|
||||
return get_buffer(length).get_string_from_ascii()
|
||||
|
||||
|
||||
func get_vox_string():
|
||||
var length = get_32();
|
||||
return get_string(length);
|
||||
var length = get_32();
|
||||
return get_string(length);
|
||||
|
||||
|
||||
func get_vox_dict():
|
||||
var result = {};
|
||||
var pairs = get_32();
|
||||
for _p in range(pairs):
|
||||
var key = get_vox_string();
|
||||
var value = get_vox_string();
|
||||
result[key] = value;
|
||||
return result;
|
||||
var result = {};
|
||||
var pairs = get_32();
|
||||
for _p in range(pairs):
|
||||
var key = get_vox_string();
|
||||
var value = get_vox_string();
|
||||
result[key] = value;
|
||||
return result;
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
var id: int;
|
||||
var isVisible: bool;
|
||||
|
||||
func _init(id,isVisible):
|
||||
self.id = id;
|
||||
self.isVisible = isVisible;
|
||||
|
||||
func _init(id, isVisible):
|
||||
self.id = id;
|
||||
self.isVisible = isVisible;
|
||||
|
||||
@ -1,23 +1,24 @@
|
||||
@tool
|
||||
extends MeshInstance3D
|
||||
|
||||
@export var frames: MeshLibrary = null : set = set_frames
|
||||
|
||||
@export var current_frame: int = 0 : set = set_current_frame
|
||||
@export var frames: MeshLibrary = null: set = set_frames
|
||||
@export var current_frame: int = 0: set = set_current_frame
|
||||
|
||||
var mesh_count = 0;
|
||||
|
||||
|
||||
func set_frames(v):
|
||||
frames = v;
|
||||
current_frame = 0
|
||||
if v == null:
|
||||
mesh_count = 0;
|
||||
self.mesh = null;
|
||||
else:
|
||||
mesh_count = v.get_item_list().size()
|
||||
self.mesh = v.get_item_mesh(0)
|
||||
frames = v;
|
||||
current_frame = 0
|
||||
if v == null:
|
||||
mesh_count = 0;
|
||||
self.mesh = null;
|
||||
else:
|
||||
mesh_count = v.get_item_list().size()
|
||||
self.mesh = v.get_item_mesh(0)
|
||||
|
||||
|
||||
func set_current_frame(v):
|
||||
if v >= 0 and v < mesh_count:
|
||||
current_frame = v
|
||||
self.mesh = frames.get_item_mesh(v)
|
||||
if v >= 0 and v < mesh_count:
|
||||
current_frame = v
|
||||
self.mesh = frames.get_item_mesh(v)
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="MagicaVoxel Importer with Extensions"
|
||||
description="Imports MagicaVoxel .vox files as meshes. Supports most node extensions, allowing multiple models and complex scene graphs."
|
||||
author="Violgamba"
|
||||
version="1.2"
|
||||
script="plugin.gd"
|
||||
name = "MagicaVoxel Importer with Extensions"
|
||||
description = "Imports MagicaVoxel .vox files as meshes. Supports most node extensions, allowing multiple models and complex scene graphs."
|
||||
author = "Violgamba"
|
||||
version = "1.2"
|
||||
script = "plugin.gd"
|
||||
|
||||
@ -1,33 +1,35 @@
|
||||
## The blackboard is an object that can be used to store and access data between
|
||||
## multiple nodes of the behavior tree.
|
||||
@icon("icons/blackboard.svg")
|
||||
class_name Blackboard extends Node
|
||||
class_name Blackboard
|
||||
extends Node
|
||||
|
||||
var blackboard: Dictionary = {}
|
||||
|
||||
|
||||
func keys() -> Array[String]:
|
||||
var keys: Array[String]
|
||||
keys.assign(blackboard.keys().duplicate())
|
||||
return keys
|
||||
var keys: Array[String]
|
||||
keys.assign(blackboard.keys().duplicate())
|
||||
return keys
|
||||
|
||||
|
||||
func set_value(key: Variant, value: Variant, blackboard_name: String = 'default') -> void:
|
||||
if not blackboard.has(blackboard_name):
|
||||
blackboard[blackboard_name] = {}
|
||||
if not blackboard.has(blackboard_name):
|
||||
blackboard[blackboard_name] = {}
|
||||
|
||||
blackboard[blackboard_name][key] = value
|
||||
blackboard[blackboard_name][key] = value
|
||||
|
||||
|
||||
func get_value(key: Variant, default_value: Variant = null, blackboard_name: String = 'default') -> Variant:
|
||||
if has_value(key, blackboard_name):
|
||||
return blackboard[blackboard_name].get(key, default_value)
|
||||
return default_value
|
||||
if has_value(key, blackboard_name):
|
||||
return blackboard[blackboard_name].get(key, default_value)
|
||||
return default_value
|
||||
|
||||
|
||||
func has_value(key: Variant, blackboard_name: String = 'default') -> bool:
|
||||
return blackboard.has(blackboard_name) and blackboard[blackboard_name].has(key) and blackboard[blackboard_name][key] != null
|
||||
return blackboard.has(blackboard_name) and blackboard[blackboard_name].has(key) and blackboard[blackboard_name][key] != null
|
||||
|
||||
|
||||
func erase_value(key: Variant, blackboard_name: String = 'default') -> void:
|
||||
if blackboard.has(blackboard_name):
|
||||
blackboard[blackboard_name][key] = null
|
||||
if blackboard.has(blackboard_name):
|
||||
blackboard[blackboard_name][key] = null
|
||||
|
||||
@ -1,31 +1,30 @@
|
||||
class_name BeehaveDebuggerMessages
|
||||
|
||||
|
||||
static func can_send_message() -> bool:
|
||||
return not Engine.is_editor_hint() and OS.has_feature("editor")
|
||||
return not Engine.is_editor_hint() and OS.has_feature("editor")
|
||||
|
||||
|
||||
static func register_tree(beehave_tree: Dictionary) -> void:
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:register_tree", [beehave_tree])
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:register_tree", [beehave_tree])
|
||||
|
||||
|
||||
static func unregister_tree(instance_id: int) -> void:
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:unregister_tree", [instance_id])
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:unregister_tree", [instance_id])
|
||||
|
||||
|
||||
static func process_tick(instance_id: int, status: int) -> void:
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:process_tick", [instance_id, status])
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:process_tick", [instance_id, status])
|
||||
|
||||
|
||||
static func process_begin(instance_id: int) -> void:
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:process_begin", [instance_id])
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:process_begin", [instance_id])
|
||||
|
||||
|
||||
static func process_end(instance_id: int) -> void:
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:process_end", [instance_id])
|
||||
if can_send_message():
|
||||
EngineDebugger.send_message("beehave:process_end", [instance_id])
|
||||
|
||||
|
||||
@ -1 +1,11 @@
|
||||
<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="matrix(0 -1 1 0 0 16)"><rect height="6" rx="1" stroke-width=".6" width="6" y="10"/><rect height="6" rx="1" stroke-width=".780723" width="6" x="5"/><rect height="6" rx="1" stroke-width=".780723" width="6" x="10" y="10"/><path d="m7 5h2v4h-2z" stroke-width=".768491"/><rect height="4" rx="1" ry="0" stroke-width=".768491" width="2" x="12" y="7"/><rect height="5" rx="1" stroke-width=".859" width="2" x="2" y="7"/><path d="m3 7h10v2h-10z" stroke-width="1.09113"/></g></svg>
|
||||
<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="#e0e0e0" transform="matrix(0 -1 1 0 0 16)">
|
||||
<rect height="6" rx="1" stroke-width=".6" width="6" y="10"/>
|
||||
<rect height="6" rx="1" stroke-width=".780723" width="6" x="5"/>
|
||||
<rect height="6" rx="1" stroke-width=".780723" width="6" x="10" y="10"/>
|
||||
<path d="m7 5h2v4h-2z" stroke-width=".768491"/>
|
||||
<rect height="4" rx="1" ry="0" stroke-width=".768491" width="2" x="12" y="7"/>
|
||||
<rect height="5" rx="1" stroke-width=".859" width="2" x="2" y="7"/>
|
||||
<path d="m3 7h10v2h-10z" stroke-width="1.09113"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 562 B After Width: | Height: | Size: 636 B |
@ -1 +1,4 @@
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m10 4a5 5 0 0 1 -2.5000001 4.3301271 5 5 0 0 1 -5-.0000002 5 5 0 0 1 -2.4999999-4.3301269" fill="#fff" fill-rule="evenodd"/></svg>
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m10 4a5 5 0 0 1 -2.5000001 4.3301271 5 5 0 0 1 -5-.0000002 5 5 0 0 1 -2.4999999-4.3301269" fill="#fff"
|
||||
fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 238 B |
@ -1 +1,4 @@
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m5 0a5 5 0 0 0 -4.33012712 2.5000001 5 5 0 0 0 .0000002 5 5 5 0 0 0 4.33012692 2.4999999" fill="#fff" fill-rule="evenodd"/></svg>
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m5 0a5 5 0 0 0 -4.33012712 2.5000001 5 5 0 0 0 .0000002 5 5 5 0 0 0 4.33012692 2.4999999" fill="#fff"
|
||||
fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 221 B After Width: | Height: | Size: 237 B |
@ -1 +1,4 @@
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m4.5 10a5 5 0 0 0 4.3301271-2.5000002 5 5 0 0 0 -.0000002-4.9999999 5 5 0 0 0 -4.3301269-2.4999999" fill="#fff" fill-rule="evenodd"/></svg>
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m4.5 10a5 5 0 0 0 4.3301271-2.5000002 5 5 0 0 0 -.0000002-4.9999999 5 5 0 0 0 -4.3301269-2.4999999"
|
||||
fill="#fff" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 231 B After Width: | Height: | Size: 247 B |
@ -1 +1,4 @@
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m10-6a5 5 0 0 1 -2.5000001 4.3301271 5 5 0 0 1 -5-.0000002 5 5 0 0 1 -2.4999999-4.3301269" fill="#fff" fill-rule="evenodd" transform="scale(1 -1)"/></svg>
|
||||
<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m10-6a5 5 0 0 1 -2.5000001 4.3301271 5 5 0 0 1 -5-.0000002 5 5 0 0 1 -2.4999999-4.3301269" fill="#fff"
|
||||
fill-rule="evenodd" transform="scale(1 -1)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 262 B |
@ -1 +1,11 @@
|
||||
<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><rect height="6" rx="1" stroke-width=".6" width="6" y="10"/><rect height="6" rx="1" stroke-width=".780723" width="6" x="5"/><rect height="6" rx="1" stroke-width=".780723" width="6" x="10" y="10"/><path d="m7 5h2v4h-2z" stroke-width=".768491"/><rect height="4" rx="1" ry="0" stroke-width=".768491" width="2" x="12" y="7"/><rect height="5" rx="1" stroke-width=".859" width="2" x="2" y="7"/><path d="m3 7h10v2h-10z" stroke-width="1.09113"/></g></svg>
|
||||
<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="#e0e0e0">
|
||||
<rect height="6" rx="1" stroke-width=".6" width="6" y="10"/>
|
||||
<rect height="6" rx="1" stroke-width=".780723" width="6" x="5"/>
|
||||
<rect height="6" rx="1" stroke-width=".780723" width="6" x="10" y="10"/>
|
||||
<path d="m7 5h2v4h-2z" stroke-width=".768491"/>
|
||||
<rect height="4" rx="1" ry="0" stroke-width=".768491" width="2" x="12" y="7"/>
|
||||
<rect height="5" rx="1" stroke-width=".859" width="2" x="2" y="7"/>
|
||||
<path d="m3 7h10v2h-10z" stroke-width="1.09113"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 602 B |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="18.512016"
|
||||
width="14.055721"
|
||||
version="1.1"
|
||||
id="svg8741"
|
||||
sodipodi:docname="action.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8745" />
|
||||
<sodipodi:namedview
|
||||
id="namedview8743"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="-17.284833"
|
||||
inkscape:cy="19.183545"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8741" />
|
||||
<path
|
||||
d="M 10.176432,3.6912688 Q 9.4137999,3.5779847 8.9573199,2.9622304 8.5018279,2.346623 8.6151119,1.5839909 q 0.113137,-0.76164287 0.727903,-1.21827047 0.615754,-0.45648072 1.3783861,-0.34319658 0.762632,0.1132841 1.218124,0.72889148 0.45648,0.61575427 0.343343,1.37739717 -0.113284,0.7626321 -0.729038,1.2191128 -0.614766,0.4566276 -1.377398,0.3433435 z M 8.3557339,18.50048 q -0.412474,-0.06127 -0.675246,-0.415727 -0.263613,-0.355592 -0.2024895,-0.767077 l 0.5938965,-3.998131 -1.1673025,-1.499791 -0.492278,1.19059 Q 6.067908,13.906466 5.2412215,14.299263 4.4143881,14.693049 3.5141916,14.369273 L 0.68012778,13.316428 q -0.3971933,-0.164141 -0.5825748,-0.549563 -0.1843923,-0.385274 -0.0202507,-0.782468 0.1463082,-0.420062 0.5218382,-0.606912 0.3753831,-0.185862 0.79544492,-0.03955 L 4.2327238,12.370146 6.3483399,6.4922013 5.1950516,6.7424632 4.9226408,8.5763411 Q 4.8584317,9.0085983 4.5028393,9.2722113 4.1483829,9.534983 3.7359088,9.473712 3.3234346,9.412442 3.0497828,9.0563693 2.7772671,8.6994546 2.8414761,8.2671975 L 3.0925819,6.5767458 Q 3.1935238,5.897202 3.6684284,5.3884589 4.1443222,4.8798627 4.8023572,4.703636 L 6.9923039,4.1443377 q 0.743073,-0.1838143 1.140791,-0.2409975 0.398708,-0.057036 0.728094,-0.00811 0.515345,0.076551 0.87859,0.3943727 0.3633911,0.3168322 0.5670941,0.7898969 l 0.629089,1.4410733 q 0.295795,0.6970267 0.885176,1.2688312 0.589381,0.5718045 1.447044,0.8892676 0.421051,0.1464552 0.62705,0.4611386 0.205852,0.3156725 0.147667,0.7073745 -0.07347,0.494573 -0.448694,0.754259 -0.376218,0.259539 -0.813966,0.08937 Q 11.753166,10.370427 10.957563,9.778099 10.159981,9.1854775 9.5990659,8.4288493 l -0.661707,1.9024227 0.845301,1.115306 q 0.2835431,0.357542 0.3859911,0.804445 0.102448,0.446903 0.03501,0.900921 l -0.6642771,4.471933 q -0.06112,0.411485 -0.416716,0.675098 -0.355445,0.262624 -0.76693,0.201501 z"
|
||||
id="path8739"
|
||||
style="fill:#ffb649;fill-opacity:1" />
|
||||
height="18.512016"
|
||||
width="14.055721"
|
||||
version="1.1"
|
||||
id="svg8741"
|
||||
sodipodi:docname="action.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8745"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview8743"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="-17.284833"
|
||||
inkscape:cy="19.183545"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8741"/>
|
||||
<path
|
||||
d="M 10.176432,3.6912688 Q 9.4137999,3.5779847 8.9573199,2.9622304 8.5018279,2.346623 8.6151119,1.5839909 q 0.113137,-0.76164287 0.727903,-1.21827047 0.615754,-0.45648072 1.3783861,-0.34319658 0.762632,0.1132841 1.218124,0.72889148 0.45648,0.61575427 0.343343,1.37739717 -0.113284,0.7626321 -0.729038,1.2191128 -0.614766,0.4566276 -1.377398,0.3433435 z M 8.3557339,18.50048 q -0.412474,-0.06127 -0.675246,-0.415727 -0.263613,-0.355592 -0.2024895,-0.767077 l 0.5938965,-3.998131 -1.1673025,-1.499791 -0.492278,1.19059 Q 6.067908,13.906466 5.2412215,14.299263 4.4143881,14.693049 3.5141916,14.369273 L 0.68012778,13.316428 q -0.3971933,-0.164141 -0.5825748,-0.549563 -0.1843923,-0.385274 -0.0202507,-0.782468 0.1463082,-0.420062 0.5218382,-0.606912 0.3753831,-0.185862 0.79544492,-0.03955 L 4.2327238,12.370146 6.3483399,6.4922013 5.1950516,6.7424632 4.9226408,8.5763411 Q 4.8584317,9.0085983 4.5028393,9.2722113 4.1483829,9.534983 3.7359088,9.473712 3.3234346,9.412442 3.0497828,9.0563693 2.7772671,8.6994546 2.8414761,8.2671975 L 3.0925819,6.5767458 Q 3.1935238,5.897202 3.6684284,5.3884589 4.1443222,4.8798627 4.8023572,4.703636 L 6.9923039,4.1443377 q 0.743073,-0.1838143 1.140791,-0.2409975 0.398708,-0.057036 0.728094,-0.00811 0.515345,0.076551 0.87859,0.3943727 0.3633911,0.3168322 0.5670941,0.7898969 l 0.629089,1.4410733 q 0.295795,0.6970267 0.885176,1.2688312 0.589381,0.5718045 1.447044,0.8892676 0.421051,0.1464552 0.62705,0.4611386 0.205852,0.3156725 0.147667,0.7073745 -0.07347,0.494573 -0.448694,0.754259 -0.376218,0.259539 -0.813966,0.08937 Q 11.753166,10.370427 10.957563,9.778099 10.159981,9.1854775 9.5990659,8.4288493 l -0.661707,1.9024227 0.845301,1.115306 q 0.2835431,0.357542 0.3859911,0.804445 0.102448,0.446903 0.03501,0.900921 l -0.6642771,4.471933 q -0.06112,0.411485 -0.416716,0.675098 -0.355445,0.262624 -0.76693,0.201501 z"
|
||||
id="path8739"
|
||||
style="fill:#ffb649;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 3.1 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="14.416"
|
||||
width="15.416"
|
||||
version="1.1"
|
||||
id="svg1061"
|
||||
sodipodi:docname="blackboard.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1065" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1063"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="30.547013"
|
||||
inkscape:cx="-0.42557352"
|
||||
inkscape:cy="10.62297"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1061" />
|
||||
<path
|
||||
d="M 0,4.333 V 1.937 Q 0,1.125 0.573,0.562 1.146,0 1.937,0 h 11.542 q 0.791,0 1.364,0.562 0.573,0.563 0.573,1.375 v 2.396 z m 4.354,1.396 v 8.687 H 1.937 q -0.791,0 -1.364,-0.573 Q 0,13.27 0,12.479 v -6.75 z m 6.708,0 h 4.354 v 6.75 q 0,0.791 -0.573,1.364 -0.573,0.573 -1.364,0.573 h -2.417 z m -1.396,0 v 8.687 H 5.75 V 5.729 Z"
|
||||
id="path1059"
|
||||
style="fill:#c689ff;fill-opacity:1;stroke:none;stroke-opacity:1" />
|
||||
height="14.416"
|
||||
width="15.416"
|
||||
version="1.1"
|
||||
id="svg1061"
|
||||
sodipodi:docname="blackboard.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1065"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview1063"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="30.547013"
|
||||
inkscape:cx="-0.42557352"
|
||||
inkscape:cy="10.62297"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1061"/>
|
||||
<path
|
||||
d="M 0,4.333 V 1.937 Q 0,1.125 0.573,0.562 1.146,0 1.937,0 h 11.542 q 0.791,0 1.364,0.562 0.573,0.563 0.573,1.375 v 2.396 z m 4.354,1.396 v 8.687 H 1.937 q -0.791,0 -1.364,-0.573 Q 0,13.27 0,12.479 v -6.75 z m 6.708,0 h 4.354 v 6.75 q 0,0.791 -0.573,1.364 -0.573,0.573 -1.364,0.573 h -2.417 z m -1.396,0 v 8.687 H 5.75 V 5.729 Z"
|
||||
id="path1059"
|
||||
style="fill:#c689ff;fill-opacity:1;stroke:none;stroke-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.6 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_bt.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#c689ff;fill-opacity:1" />
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_bt.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4"/>
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#c689ff;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.0 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_composite.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#40d29f;fill-opacity:1" />
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_composite.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4"/>
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#40d29f;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.0 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_decorator.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#46c0e1;fill-opacity:1" />
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_decorator.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4"/>
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#46c0e1;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.0 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_leaf.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#ffb649;fill-opacity:1" />
|
||||
height="16.375999"
|
||||
width="14.126321"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="category_leaf.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="7.071068"
|
||||
inkscape:cy="10.377447"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4"/>
|
||||
<path
|
||||
d="m 11.48968,7.688 q -0.354,0 -0.76,-0.219 -0.406,-0.219 -0.552,-0.51 L 9.5736798,6 q -0.167,-0.291 -0.167,-0.729 0,-0.437 0.167,-0.729 L 10.07368,3.667 q 0.146,-0.291 0.552,-0.531 0.406,-0.24 0.76,-0.24 h 0.875 q 0.375,0 0.792,0.219 0.417,0.219 0.562,0.552 l 0.355,0.854 q 0.145,0.334 0.156,0.761 0.01,0.427 -0.136,0.76 l -0.396,0.875 q -0.145,0.333 -0.552,0.552 -0.406,0.219 -0.781,0.219 z m -4.8120002,2.917 q -0.354,0 -0.761,-0.219 -0.406,-0.219 -0.573,-0.531 l -0.374,-0.917 q -0.146,-0.312 -0.146,-0.75 0,-0.438 0.146,-0.75 l 0.374,-0.917 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.917 q 0.146,0.312 0.146,0.75 0,0.438 -0.146,0.75 l -0.396,0.917 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m 0,-5.813 q -0.354,0 -0.761,-0.219 -0.406,-0.218 -0.573,-0.531 l -0.374,-0.875 q -0.146,-0.333 -0.146,-0.771 0,-0.437 0.146,-0.75 l 0.374,-0.896 q 0.167,-0.312 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.219 0.552,0.531 l 0.396,0.896 q 0.146,0.313 0.146,0.75 0,0.438 -0.146,0.771 l -0.396,0.875 q -0.146,0.313 -0.552,0.531 -0.406,0.219 -0.781,0.219 z m -4.813,2.896 q -0.375,0 -0.771,-0.219 Q 0.69867978,7.25 0.53167978,6.917 l -0.375,-0.875 Q -0.01032022,5.709 6.7977528e-4,5.282 0.01067978,4.855 0.17767978,4.521 l 0.333,-0.854 q 0.167,-0.333 0.57300002,-0.552 0.406,-0.219 0.781,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.573,0.552 l 0.334,0.854 q 0.166,0.334 0.177,0.761 0.01,0.427 -0.157,0.76 l -0.374,0.875 q -0.167,0.333 -0.563,0.552 -0.396,0.219 -0.771,0.219 z m 0,5.75 q -0.375,0 -0.781,-0.219 Q 0.67767978,13 0.51067978,12.667 l -0.333,-0.854 Q 0.01067978,11.48 6.7977528e-4,11.053 -0.01032022,10.626 0.15667978,10.292 l 0.375,-0.875 q 0.167,-0.333 0.56200002,-0.552 0.396,-0.219 0.771,-0.219 h 0.771 q 0.375,0 0.771,0.219 0.396,0.219 0.563,0.552 l 0.374,0.875 q 0.167,0.334 0.157,0.761 -0.011,0.427 -0.177,0.76 l -0.334,0.854 q -0.166,0.333 -0.573,0.552 -0.406,0.219 -0.781,0.219 z m 4.855,2.938 q -0.355,0 -0.761,-0.219 -0.406,-0.219 -0.594,-0.531 l -0.375,-0.896 q -0.166,-0.313 -0.166,-0.75 0,-0.438 0.146,-0.771 l 0.374,-0.875 q 0.167,-0.313 0.573,-0.531 0.407,-0.219 0.761,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.406,0.218 0.552,0.531 l 0.396,0.875 q 0.146,0.333 0.146,0.771 0,0.437 -0.146,0.75 l -0.396,0.896 q -0.146,0.312 -0.552,0.531 -0.406,0.219 -0.781,0.219 z M 11.48968,13.438 q -0.354,0 -0.77,-0.219 -0.417,-0.219 -0.563,-0.51 L 9.5936798,11.771 q -0.166,-0.291 -0.177,-0.718 -0.01,-0.427 0.157,-0.719 L 10.17768,9.376 q 0.146,-0.292 0.552,-0.511 0.406,-0.219 0.76,-0.219 h 0.771 q 0.375,0 0.781,0.219 0.407,0.219 0.552,0.552 l 0.396,0.875 q 0.146,0.334 0.136,0.761 -0.011,0.427 -0.156,0.76 l -0.355,0.854 q -0.145,0.333 -0.562,0.552 -0.417,0.219 -0.792,0.219 z"
|
||||
id="path2"
|
||||
style="fill:#ffb649;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.0 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="18.084"
|
||||
width="18.084"
|
||||
version="1.1"
|
||||
id="svg4180"
|
||||
sodipodi:docname="condition.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs4184" />
|
||||
<sodipodi:namedview
|
||||
id="namedview4182"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="-10.737547"
|
||||
inkscape:cy="24.290428"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4180" />
|
||||
<path
|
||||
d="m 8.938,14.063 q 0.542,0 0.927,-0.386 0.385,-0.385 0.385,-0.927 0,-0.541 -0.385,-0.916 -0.385,-0.375 -0.927,-0.375 -0.542,0 -0.927,0.375 -0.386,0.375 -0.386,0.916 0,0.542 0.386,0.927 0.385,0.386 0.927,0.386 z M 9.042,5.938 q 0.396,0 0.646,0.229 0.25,0.229 0.25,0.542 0,0.229 -0.177,0.562 Q 9.584,7.604 9.292,7.834 8.646,8.417 8.323,8.927 8,9.438 8,9.917 q 0,0.375 0.261,0.635 0.26,0.261 0.656,0.261 0.396,0 0.698,-0.24 0.302,-0.239 0.469,-0.698 0.104,-0.25 0.291,-0.51 0.188,-0.261 0.542,-0.615 0.604,-0.562 0.833,-1.073 0.23,-0.51 0.23,-1.135 0,-1.167 -0.761,-1.865 Q 10.459,3.98 9.188,3.98 8.25,3.98 7.552,4.365 6.854,4.75 6.292,5.48 6.084,5.75 6.198,6.125 6.313,6.5 6.584,6.709 6.938,6.98 7.365,6.886 7.792,6.792 8.104,6.417 8.313,6.209 8.563,6.073 8.813,5.938 9.042,5.938 Z m 0,12.146 q -1.875,0 -3.531,-0.709 Q 3.854,16.667 2.636,15.448 1.417,14.23 0.709,12.584 0,10.938 0,9.042 0,7.146 0.709,5.5 1.417,3.854 2.636,2.636 3.854,1.417 5.511,0.709 7.167,0 9.042,0 q 1.896,0 3.542,0.709 1.646,0.708 2.864,1.927 1.219,1.218 1.927,2.864 0.709,1.646 0.709,3.542 0,1.896 -0.709,3.542 -0.708,1.646 -1.927,2.864 -1.218,1.219 -2.864,1.927 -1.646,0.709 -3.542,0.709 z"
|
||||
id="path4178"
|
||||
style="fill:#ffb649;fill-opacity:1" />
|
||||
height="18.084"
|
||||
width="18.084"
|
||||
version="1.1"
|
||||
id="svg4180"
|
||||
sodipodi:docname="condition.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs4184"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview4182"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="-10.737547"
|
||||
inkscape:cy="24.290428"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4180"/>
|
||||
<path
|
||||
d="m 8.938,14.063 q 0.542,0 0.927,-0.386 0.385,-0.385 0.385,-0.927 0,-0.541 -0.385,-0.916 -0.385,-0.375 -0.927,-0.375 -0.542,0 -0.927,0.375 -0.386,0.375 -0.386,0.916 0,0.542 0.386,0.927 0.385,0.386 0.927,0.386 z M 9.042,5.938 q 0.396,0 0.646,0.229 0.25,0.229 0.25,0.542 0,0.229 -0.177,0.562 Q 9.584,7.604 9.292,7.834 8.646,8.417 8.323,8.927 8,9.438 8,9.917 q 0,0.375 0.261,0.635 0.26,0.261 0.656,0.261 0.396,0 0.698,-0.24 0.302,-0.239 0.469,-0.698 0.104,-0.25 0.291,-0.51 0.188,-0.261 0.542,-0.615 0.604,-0.562 0.833,-1.073 0.23,-0.51 0.23,-1.135 0,-1.167 -0.761,-1.865 Q 10.459,3.98 9.188,3.98 8.25,3.98 7.552,4.365 6.854,4.75 6.292,5.48 6.084,5.75 6.198,6.125 6.313,6.5 6.584,6.709 6.938,6.98 7.365,6.886 7.792,6.792 8.104,6.417 8.313,6.209 8.563,6.073 8.813,5.938 9.042,5.938 Z m 0,12.146 q -1.875,0 -3.531,-0.709 Q 3.854,16.667 2.636,15.448 1.417,14.23 0.709,12.584 0,10.938 0,9.042 0,7.146 0.709,5.5 1.417,3.854 2.636,2.636 3.854,1.417 5.511,0.709 7.167,0 9.042,0 q 1.896,0 3.542,0.709 1.646,0.708 2.864,1.927 1.219,1.218 1.927,2.864 0.709,1.646 0.709,3.542 0,1.896 -0.709,3.542 -0.708,1.646 -1.927,2.864 -1.218,1.219 -2.864,1.927 -1.646,0.709 -3.542,0.709 z"
|
||||
id="path4178"
|
||||
style="fill:#ffb649;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.4 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="17.666"
|
||||
width="17.666"
|
||||
version="1.1"
|
||||
id="svg6751"
|
||||
sodipodi:docname="failer.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs6755" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6753"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="30.547013"
|
||||
inkscape:cx="12.308896"
|
||||
inkscape:cy="5.3851419"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6751" />
|
||||
<path
|
||||
d="m 8.854,9.666 q 0.5,0 0.896,-0.395 0.395,-0.396 0.395,-0.917 v -2.75 q 0,-0.5 -0.395,-0.886 Q 9.354,4.333 8.854,4.333 8.333,4.333 7.937,4.729 7.541,5.125 7.541,5.625 v 2.75 q 0,0.52 0.396,0.906 0.396,0.385 0.917,0.385 z m -0.021,3.959 q 0.583,0 1.01,-0.407 0.428,-0.406 0.428,-1.031 0,-0.583 -0.428,-1.021 -0.427,-0.437 -1.01,-0.437 -0.583,0 -1.01,0.437 -0.428,0.438 -0.428,1.021 0,0.625 0.428,1.031 0.427,0.407 1.01,0.407 z m 0,4.041 q -1.854,0 -3.458,-0.687 Q 3.771,16.291 2.573,15.093 1.375,13.895 0.687,12.291 0,10.687 0,8.833 0,6.958 0.687,5.364 1.375,3.771 2.573,2.573 3.771,1.375 5.375,0.687 6.979,0 8.833,0 q 1.875,0 3.469,0.687 1.593,0.688 2.791,1.886 1.198,1.198 1.886,2.791 0.687,1.594 0.687,3.469 0,1.854 -0.687,3.458 -0.688,1.604 -1.886,2.802 -1.198,1.198 -2.791,1.886 -1.594,0.687 -3.469,0.687 z"
|
||||
id="path6749"
|
||||
style="fill:#46c0e1;fill-opacity:1" />
|
||||
height="17.666"
|
||||
width="17.666"
|
||||
version="1.1"
|
||||
id="svg6751"
|
||||
sodipodi:docname="failer.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs6755"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview6753"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="30.547013"
|
||||
inkscape:cx="12.308896"
|
||||
inkscape:cy="5.3851419"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6751"/>
|
||||
<path
|
||||
d="m 8.854,9.666 q 0.5,0 0.896,-0.395 0.395,-0.396 0.395,-0.917 v -2.75 q 0,-0.5 -0.395,-0.886 Q 9.354,4.333 8.854,4.333 8.333,4.333 7.937,4.729 7.541,5.125 7.541,5.625 v 2.75 q 0,0.52 0.396,0.906 0.396,0.385 0.917,0.385 z m -0.021,3.959 q 0.583,0 1.01,-0.407 0.428,-0.406 0.428,-1.031 0,-0.583 -0.428,-1.021 -0.427,-0.437 -1.01,-0.437 -0.583,0 -1.01,0.437 -0.428,0.438 -0.428,1.021 0,0.625 0.428,1.031 0.427,0.407 1.01,0.407 z m 0,4.041 q -1.854,0 -3.458,-0.687 Q 3.771,16.291 2.573,15.093 1.375,13.895 0.687,12.291 0,10.687 0,8.833 0,6.958 0.687,5.364 1.375,3.771 2.573,2.573 3.771,1.375 5.375,0.687 6.979,0 8.833,0 q 1.875,0 3.469,0.687 1.593,0.688 2.791,1.886 1.198,1.198 1.886,2.791 0.687,1.594 0.687,3.469 0,1.854 -0.687,3.458 -0.688,1.604 -1.886,2.802 -1.198,1.198 -2.791,1.886 -1.594,0.687 -3.469,0.687 z"
|
||||
id="path6749"
|
||||
style="fill:#46c0e1;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.1 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="13.907205"
|
||||
width="18.437"
|
||||
version="1.1"
|
||||
id="svg68"
|
||||
sodipodi:docname="inverter.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs72" />
|
||||
<sodipodi:namedview
|
||||
id="namedview70"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="29.521708"
|
||||
inkscape:cx="6.3343218"
|
||||
inkscape:cy="7.8078138"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg68" />
|
||||
<path
|
||||
d="m 12.937,8.48 q -0.458,-0.459 -0.458,-1.032 0,-0.572 0.458,-1.031 L 13.416,5.938 H 9.812 Q 9.229,5.938 8.791,5.5 8.354,5.063 8.354,4.48 8.354,3.876 8.791,3.448 9.229,3.021 9.812,3.021 h 3.604 l -0.5,-0.5 Q 12.458,2.063 12.468,1.49 12.479,0.917 12.937,0.48 13.396,0 13.979,0 14.562,0 15,0.459 l 2.979,2.979 q 0.229,0.229 0.344,0.5 0.114,0.271 0.114,0.521 0,0.271 -0.114,0.541 -0.115,0.271 -0.344,0.5 l -3,3 Q 14.52,8.959 13.958,8.948 13.396,8.938 12.937,8.48 Z M 3.416,13.438 0.437,10.459 Q 0.229,10.25 0.114,9.98 0,9.709 0,9.438 0,9.167 0.114,8.896 0.229,8.626 0.437,8.396 l 3.021,-3 Q 3.916,4.938 4.468,4.948 5.02,4.959 5.479,5.417 5.937,5.876 5.937,6.459 5.937,7.042 5.479,7.48 L 5,7.959 h 3.604 q 0.583,0 1.021,0.437 0.437,0.438 0.437,1.021 0,0.604 -0.437,1.031 -0.438,0.428 -1.021,0.428 H 5 l 0.5,0.52 q 0.458,0.459 0.448,1.021 -0.011,0.563 -0.469,1.021 -0.459,0.458 -1.021,0.469 -0.562,0.01 -1.042,-0.469 z"
|
||||
id="path66"
|
||||
style="fill:#46c0e1;fill-opacity:1" />
|
||||
height="13.907205"
|
||||
width="18.437"
|
||||
version="1.1"
|
||||
id="svg68"
|
||||
sodipodi:docname="inverter.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs72"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview70"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="29.521708"
|
||||
inkscape:cx="6.3343218"
|
||||
inkscape:cy="7.8078138"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg68"/>
|
||||
<path
|
||||
d="m 12.937,8.48 q -0.458,-0.459 -0.458,-1.032 0,-0.572 0.458,-1.031 L 13.416,5.938 H 9.812 Q 9.229,5.938 8.791,5.5 8.354,5.063 8.354,4.48 8.354,3.876 8.791,3.448 9.229,3.021 9.812,3.021 h 3.604 l -0.5,-0.5 Q 12.458,2.063 12.468,1.49 12.479,0.917 12.937,0.48 13.396,0 13.979,0 14.562,0 15,0.459 l 2.979,2.979 q 0.229,0.229 0.344,0.5 0.114,0.271 0.114,0.521 0,0.271 -0.114,0.541 -0.115,0.271 -0.344,0.5 l -3,3 Q 14.52,8.959 13.958,8.948 13.396,8.938 12.937,8.48 Z M 3.416,13.438 0.437,10.459 Q 0.229,10.25 0.114,9.98 0,9.709 0,9.438 0,9.167 0.114,8.896 0.229,8.626 0.437,8.396 l 3.021,-3 Q 3.916,4.938 4.468,4.948 5.02,4.959 5.479,5.417 5.937,5.876 5.937,6.459 5.937,7.042 5.479,7.48 L 5,7.959 h 3.604 q 0.583,0 1.021,0.437 0.437,0.438 0.437,1.021 0,0.604 -0.437,1.031 -0.438,0.428 -1.021,0.428 H 5 l 0.5,0.52 q 0.458,0.459 0.448,1.021 -0.011,0.563 -0.469,1.021 -0.459,0.458 -1.021,0.469 -0.562,0.01 -1.042,-0.469 z"
|
||||
id="path66"
|
||||
style="fill:#46c0e1;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.2 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="14.75"
|
||||
width="14.916"
|
||||
version="1.1"
|
||||
id="svg3323"
|
||||
sodipodi:docname="repeater.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs3327" />
|
||||
<sodipodi:namedview
|
||||
id="namedview3325"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="-37.057633"
|
||||
inkscape:cy="27.56407"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg3323" />
|
||||
<path
|
||||
d="M 7.375,14.75 Q 4.312,14.75 2.156,12.594 0,10.437 0,7.375 0,4.313 2.156,2.156 4.312,0 7.375,0 8.979,0 10.385,0.646 11.791,1.292 12.833,2.5 V 1.042 q 0,-0.417 0.313,-0.729 Q 13.458,0 13.875,0 q 0.416,0 0.729,0.313 0.312,0.312 0.312,0.729 v 4.583 q 0,0.542 -0.406,0.948 -0.406,0.406 -0.948,0.406 H 8.958 Q 8.541,6.979 8.229,6.677 7.916,6.375 7.916,5.958 7.916,5.542 8.229,5.229 8.541,4.917 8.958,4.917 h 2.354 Q 10.646,3.917 9.614,3.313 8.583,2.708 7.375,2.708 q -1.938,0 -3.302,1.365 -1.365,1.364 -1.365,3.302 0,1.938 1.365,3.302 1.364,1.365 3.302,1.365 1.25,0 2.291,-0.615 1.042,-0.614 1.688,-1.677 0.208,-0.313 0.562,-0.521 0.354,-0.208 0.688,-0.208 0.854,0 1.239,0.573 0.386,0.573 0.011,1.26 -0.979,1.771 -2.698,2.833 -1.719,1.063 -3.781,1.063 z"
|
||||
id="path3321"
|
||||
style="fill:#46c0e1;fill-opacity:1" />
|
||||
height="14.75"
|
||||
width="14.916"
|
||||
version="1.1"
|
||||
id="svg3323"
|
||||
sodipodi:docname="repeater.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs3327"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview3325"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="-37.057633"
|
||||
inkscape:cy="27.56407"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg3323"/>
|
||||
<path
|
||||
d="M 7.375,14.75 Q 4.312,14.75 2.156,12.594 0,10.437 0,7.375 0,4.313 2.156,2.156 4.312,0 7.375,0 8.979,0 10.385,0.646 11.791,1.292 12.833,2.5 V 1.042 q 0,-0.417 0.313,-0.729 Q 13.458,0 13.875,0 q 0.416,0 0.729,0.313 0.312,0.312 0.312,0.729 v 4.583 q 0,0.542 -0.406,0.948 -0.406,0.406 -0.948,0.406 H 8.958 Q 8.541,6.979 8.229,6.677 7.916,6.375 7.916,5.958 7.916,5.542 8.229,5.229 8.541,4.917 8.958,4.917 h 2.354 Q 10.646,3.917 9.614,3.313 8.583,2.708 7.375,2.708 q -1.938,0 -3.302,1.365 -1.365,1.364 -1.365,3.302 0,1.938 1.365,3.302 1.364,1.365 3.302,1.365 1.25,0 2.291,-0.615 1.042,-0.614 1.688,-1.677 0.208,-0.313 0.562,-0.521 0.354,-0.208 0.688,-0.208 0.854,0 1.239,0.573 0.386,0.573 0.011,1.26 -0.979,1.771 -2.698,2.833 -1.719,1.063 -3.781,1.063 z"
|
||||
id="path3321"
|
||||
style="fill:#46c0e1;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.0 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="13.906356"
|
||||
width="17.791"
|
||||
version="1.1"
|
||||
id="svg5037"
|
||||
sodipodi:docname="selector.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5041" />
|
||||
<sodipodi:namedview
|
||||
id="namedview5039"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="61.282588"
|
||||
inkscape:cy="33.849463"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5037" />
|
||||
<path
|
||||
d="M 4.52,13.645 Q 4.25,13.374 4.25,13 4.25,12.624 4.5,12.354 L 5.208,11.666 Q 2.979,11.395 1.489,9.802 0,8.208 0,5.895 0,3.437 1.718,1.718 3.437,0 5.895,0 H 7.562 Q 7.916,0 8.187,0.27 8.458,0.541 8.458,0.895 8.458,1.27 8.187,1.541 7.916,1.812 7.562,1.812 H 5.895 Q 4.187,1.812 3,3 1.812,4.187 1.812,5.895 1.812,7.437 2.76,8.52 3.708,9.604 5.187,9.916 L 4.5,9.229 Q 4.229,8.937 4.239,8.583 4.25,8.229 4.52,7.958 4.77,7.687 5.145,7.687 q 0.375,0 0.646,0.271 l 2.167,2.187 q 0.125,0.125 0.208,0.302 0.084,0.177 0.084,0.365 0,0.167 -0.084,0.344 -0.083,0.177 -0.208,0.323 L 5.75,13.645 Q 5.479,13.916 5.124,13.906 4.77,13.895 4.52,13.645 Z M 12.041,5.958 Q 11.25,5.958 10.708,5.416 10.166,4.874 10.166,4.083 V 1.874 q 0,-0.77 0.542,-1.322 Q 11.25,0 12.041,0 h 3.875 q 0.771,0 1.323,0.552 0.552,0.552 0.552,1.322 v 2.209 q 0,0.791 -0.552,1.333 -0.552,0.542 -1.323,0.542 z m 0,-1.875 h 3.875 V 1.874 h -3.875 z m 0,9.541 q -0.791,0 -1.333,-0.552 Q 10.166,12.52 10.166,11.75 V 9.541 q 0,-0.791 0.542,-1.333 0.542,-0.542 1.333,-0.542 h 3.875 q 0.771,0 1.323,0.542 0.552,0.542 0.552,1.333 v 2.209 q 0,0.77 -0.552,1.322 -0.552,0.552 -1.323,0.552 z"
|
||||
id="path5035"
|
||||
style="fill:#40d29f;fill-opacity:1" />
|
||||
height="13.906356"
|
||||
width="17.791"
|
||||
version="1.1"
|
||||
id="svg5037"
|
||||
sodipodi:docname="selector.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5041"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview5039"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.6367532"
|
||||
inkscape:cx="61.282588"
|
||||
inkscape:cy="33.849463"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5037"/>
|
||||
<path
|
||||
d="M 4.52,13.645 Q 4.25,13.374 4.25,13 4.25,12.624 4.5,12.354 L 5.208,11.666 Q 2.979,11.395 1.489,9.802 0,8.208 0,5.895 0,3.437 1.718,1.718 3.437,0 5.895,0 H 7.562 Q 7.916,0 8.187,0.27 8.458,0.541 8.458,0.895 8.458,1.27 8.187,1.541 7.916,1.812 7.562,1.812 H 5.895 Q 4.187,1.812 3,3 1.812,4.187 1.812,5.895 1.812,7.437 2.76,8.52 3.708,9.604 5.187,9.916 L 4.5,9.229 Q 4.229,8.937 4.239,8.583 4.25,8.229 4.52,7.958 4.77,7.687 5.145,7.687 q 0.375,0 0.646,0.271 l 2.167,2.187 q 0.125,0.125 0.208,0.302 0.084,0.177 0.084,0.365 0,0.167 -0.084,0.344 -0.083,0.177 -0.208,0.323 L 5.75,13.645 Q 5.479,13.916 5.124,13.906 4.77,13.895 4.52,13.645 Z M 12.041,5.958 Q 11.25,5.958 10.708,5.416 10.166,4.874 10.166,4.083 V 1.874 q 0,-0.77 0.542,-1.322 Q 11.25,0 12.041,0 h 3.875 q 0.771,0 1.323,0.552 0.552,0.552 0.552,1.322 v 2.209 q 0,0.791 -0.552,1.333 -0.552,0.542 -1.323,0.542 z m 0,-1.875 h 3.875 V 1.874 h -3.875 z m 0,9.541 q -0.791,0 -1.333,-0.552 Q 10.166,12.52 10.166,11.75 V 9.541 q 0,-0.791 0.542,-1.333 0.542,-0.542 1.333,-0.542 h 3.875 q 0.771,0 1.323,0.542 0.552,0.542 0.552,1.333 v 2.209 q 0,0.77 -0.552,1.322 -0.552,0.552 -1.323,0.552 z"
|
||||
id="path5035"
|
||||
style="fill:#40d29f;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.5 KiB |
@ -1,45 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="14.543364"
|
||||
width="17.791"
|
||||
version="1.1"
|
||||
id="svg5037"
|
||||
sodipodi:docname="selector_reactive.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs5041" /><sodipodi:namedview
|
||||
id="namedview5039"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="18.59429"
|
||||
inkscape:cy="12.014268"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5037" /><path
|
||||
style="fill:#40d29f;fill-opacity:1;color:#000000;stroke-width:1.7354;-inkscape-stroke:none;paint-order:markers stroke fill"
|
||||
d="m 15.63424,18.518399 q -0.218955,0 -0.373746,-0.150649 -0.155154,-0.150651 -0.155154,-0.363746 v -1.161448 l -0.860595,0.49993 q -0.196481,0.103026 -0.400572,0.05152 -0.20373,-0.05152 -0.309582,-0.227915 l -0.181253,-0.308712 q -0.105496,-0.183813 -0.05655,-0.385972 0.04894,-0.202159 0.237805,-0.312236 l 0.868569,-0.492527 -0.883432,-0.485112 q -0.188867,-0.110433 -0.241793,-0.312236 -0.05292,-0.202161 0.05292,-0.385974 l 0.196116,-0.301299 q 0.113465,-0.183814 0.321183,-0.238852 0.207716,-0.05539 0.388971,0.05504 l 0.868208,0.492523 v -1.161448 q 0,-0.213096 0.155154,-0.363747 0.154791,-0.150648 0.373746,-0.150648 h 0.347283 q 0.218955,0 0.373747,0.150648 0.155152,0.150651 0.155152,0.363747 v 1.161448 l 0.868209,-0.499931 q 0.188867,-0.103026 0.388973,-0.04763 0.200104,0.05504 0.313568,0.224034 l 0.211343,0.323526 q 0.113466,0.183813 0.05655,0.38562 -0.05655,0.20216 -0.253031,0.312589 l -0.87582,0.477704 0.86857,0.492521 q 0.181255,0.09561 0.245418,0.304826 0.06416,0.209569 -0.0493,0.385974 l -0.196119,0.316117 q -0.113464,0.176404 -0.313569,0.235323 -0.200105,0.05857 -0.388972,-0.05151 l -0.875822,-0.50734 v 1.161449 q 0,0.213096 -0.155152,0.363745 -0.154792,0.15065 -0.373747,0.15065 z"
|
||||
id="path5291"
|
||||
transform="matrix(1.2719165,0,0,1.2110461,-6.1455464,-7.8832739)"
|
||||
inkscape:label="asterisk" /><path
|
||||
style="fill:#40d29f;fill-opacity:1"
|
||||
d="M 12.041,5.958 Q 11.25,5.958 10.708,5.416 10.166,4.874 10.166,4.083 V 1.874 q 0,-0.77 0.542,-1.322 Q 11.25,0 12.041,0 h 3.875 q 0.771,0 1.323,0.552 0.552,0.552 0.552,1.322 v 2.209 q 0,0.791 -0.552,1.333 -0.552,0.542 -1.323,0.542 z m 0,-1.875 h 3.875 V 1.874 h -3.875 z"
|
||||
id="path923"
|
||||
inkscape:label="square" /><path
|
||||
style="fill:#40d29f;fill-opacity:1"
|
||||
d="M 4.52,13.645 Q 4.25,13.374 4.25,13 4.25,12.624 4.5,12.354 L 5.208,11.666 Q 2.979,11.395 1.489,9.802 0,8.208 0,5.895 0,3.437 1.718,1.718 3.437,0 5.895,0 H 7.562 Q 7.916,0 8.187,0.27 8.458,0.541 8.458,0.895 8.458,1.27 8.187,1.541 7.916,1.812 7.562,1.812 H 5.895 Q 4.187,1.812 3,3 1.812,4.187 1.812,5.895 1.812,7.437 2.76,8.52 3.708,9.604 5.187,9.916 L 4.5,9.229 Q 4.229,8.937 4.239,8.583 4.25,8.229 4.52,7.958 4.77,7.687 5.145,7.687 q 0.375,0 0.646,0.271 l 2.167,2.187 q 0.125,0.125 0.208,0.302 0.084,0.177 0.084,0.365 0,0.167 -0.084,0.344 -0.083,0.177 -0.208,0.323 L 5.75,13.645 Q 5.479,13.916 5.124,13.906 4.77,13.895 4.52,13.645 Z"
|
||||
id="path5035"
|
||||
inkscape:label="arrow" /></svg>
|
||||
height="14.543364"
|
||||
width="17.791"
|
||||
version="1.1"
|
||||
id="svg5037"
|
||||
sodipodi:docname="selector_reactive.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs5041" />
|
||||
<sodipodi:namedview
|
||||
id="namedview5039"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.273506"
|
||||
inkscape:cx="18.59429"
|
||||
inkscape:cy="12.014268"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5037"/>
|
||||
<path
|
||||
style="fill:#40d29f;fill-opacity:1;color:#000000;stroke-width:1.7354;-inkscape-stroke:none;paint-order:markers stroke fill"
|
||||
d="m 15.63424,18.518399 q -0.218955,0 -0.373746,-0.150649 -0.155154,-0.150651 -0.155154,-0.363746 v -1.161448 l -0.860595,0.49993 q -0.196481,0.103026 -0.400572,0.05152 -0.20373,-0.05152 -0.309582,-0.227915 l -0.181253,-0.308712 q -0.105496,-0.183813 -0.05655,-0.385972 0.04894,-0.202159 0.237805,-0.312236 l 0.868569,-0.492527 -0.883432,-0.485112 q -0.188867,-0.110433 -0.241793,-0.312236 -0.05292,-0.202161 0.05292,-0.385974 l 0.196116,-0.301299 q 0.113465,-0.183814 0.321183,-0.238852 0.207716,-0.05539 0.388971,0.05504 l 0.868208,0.492523 v -1.161448 q 0,-0.213096 0.155154,-0.363747 0.154791,-0.150648 0.373746,-0.150648 h 0.347283 q 0.218955,0 0.373747,0.150648 0.155152,0.150651 0.155152,0.363747 v 1.161448 l 0.868209,-0.499931 q 0.188867,-0.103026 0.388973,-0.04763 0.200104,0.05504 0.313568,0.224034 l 0.211343,0.323526 q 0.113466,0.183813 0.05655,0.38562 -0.05655,0.20216 -0.253031,0.312589 l -0.87582,0.477704 0.86857,0.492521 q 0.181255,0.09561 0.245418,0.304826 0.06416,0.209569 -0.0493,0.385974 l -0.196119,0.316117 q -0.113464,0.176404 -0.313569,0.235323 -0.200105,0.05857 -0.388972,-0.05151 l -0.875822,-0.50734 v 1.161449 q 0,0.213096 -0.155152,0.363745 -0.154792,0.15065 -0.373747,0.15065 z"
|
||||
id="path5291"
|
||||
transform="matrix(1.2719165,0,0,1.2110461,-6.1455464,-7.8832739)"
|
||||
inkscape:label="asterisk"/>
|
||||
<path
|
||||
style="fill:#40d29f;fill-opacity:1"
|
||||
d="M 12.041,5.958 Q 11.25,5.958 10.708,5.416 10.166,4.874 10.166,4.083 V 1.874 q 0,-0.77 0.542,-1.322 Q 11.25,0 12.041,0 h 3.875 q 0.771,0 1.323,0.552 0.552,0.552 0.552,1.322 v 2.209 q 0,0.791 -0.552,1.333 -0.552,0.542 -1.323,0.542 z m 0,-1.875 h 3.875 V 1.874 h -3.875 z"
|
||||
id="path923"
|
||||
inkscape:label="square"/>
|
||||
<path
|
||||
style="fill:#40d29f;fill-opacity:1"
|
||||
d="M 4.52,13.645 Q 4.25,13.374 4.25,13 4.25,12.624 4.5,12.354 L 5.208,11.666 Q 2.979,11.395 1.489,9.802 0,8.208 0,5.895 0,3.437 1.718,1.718 3.437,0 5.895,0 H 7.562 Q 7.916,0 8.187,0.27 8.458,0.541 8.458,0.895 8.458,1.27 8.187,1.541 7.916,1.812 7.562,1.812 H 5.895 Q 4.187,1.812 3,3 1.812,4.187 1.812,5.895 1.812,7.437 2.76,8.52 3.708,9.604 5.187,9.916 L 4.5,9.229 Q 4.229,8.937 4.239,8.583 4.25,8.229 4.52,7.958 4.77,7.687 5.145,7.687 q 0.375,0 0.646,0.271 l 2.167,2.187 q 0.125,0.125 0.208,0.302 0.084,0.177 0.084,0.365 0,0.167 -0.084,0.344 -0.083,0.177 -0.208,0.323 L 5.75,13.645 Q 5.479,13.916 5.124,13.906 4.77,13.895 4.52,13.645 Z"
|
||||
id="path5035"
|
||||
inkscape:label="arrow"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.8 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="13.187"
|
||||
width="16.583"
|
||||
version="1.1"
|
||||
id="svg5894"
|
||||
sodipodi:docname="sequence.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5898" />
|
||||
<sodipodi:namedview
|
||||
id="namedview5896"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="43.2"
|
||||
inkscape:cx="13.449074"
|
||||
inkscape:cy="7.974537"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5894" />
|
||||
<path
|
||||
d="M 1.709,8.313 Q 1,8.313 0.5,7.823 0,7.333 0,6.604 0,5.896 0.5,5.396 q 0.5,-0.5 1.209,-0.5 0.708,0 1.208,0.5 0.5,0.5 0.5,1.229 0,0.708 -0.5,1.198 -0.5,0.49 -1.208,0.49 z m 0,-4.896 Q 1,3.417 0.5,2.927 0,2.437 0,1.708 0,1 0.5,0.5 1,0 1.709,0 q 0.708,0 1.208,0.5 0.5,0.5 0.5,1.229 0,0.708 -0.5,1.198 -0.5,0.49 -1.208,0.49 z m 0,9.77 Q 1,13.187 0.5,12.698 0,12.208 0,11.479 q 0,-0.708 0.5,-1.208 0.5,-0.5 1.209,-0.5 0.708,0 1.208,0.5 0.5,0.5 0.5,1.229 0,0.708 -0.5,1.198 -0.5,0.489 -1.208,0.489 z m 4.604,-0.395 q -0.5,0 -0.896,-0.396 Q 5.021,12 5.021,11.479 q 0,-0.5 0.396,-0.896 0.396,-0.396 0.896,-0.396 h 8.979 q 0.5,0 0.896,0.396 0.395,0.396 0.395,0.896 0,0.521 -0.395,0.917 -0.396,0.396 -0.896,0.396 z m 0,-4.875 q -0.5,0 -0.896,-0.396 -0.396,-0.396 -0.396,-0.917 0,-0.5 0.396,-0.896 0.396,-0.395 0.896,-0.395 h 8.979 q 0.5,0 0.896,0.395 0.395,0.396 0.395,0.896 0,0.521 -0.395,0.917 -0.396,0.396 -0.896,0.396 z m 0,-4.896 q -0.5,0 -0.896,-0.396 -0.396,-0.396 -0.396,-0.917 0,-0.5 0.396,-0.895 0.396,-0.396 0.896,-0.396 h 8.979 q 0.5,0 0.896,0.396 0.395,0.395 0.395,0.895 0,0.521 -0.395,0.917 -0.396,0.396 -0.896,0.396 z"
|
||||
id="path5892"
|
||||
style="fill:#40d29f;fill-opacity:1" />
|
||||
height="13.187"
|
||||
width="16.583"
|
||||
version="1.1"
|
||||
id="svg5894"
|
||||
sodipodi:docname="sequence.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5898"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview5896"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="43.2"
|
||||
inkscape:cx="13.449074"
|
||||
inkscape:cy="7.974537"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5894"/>
|
||||
<path
|
||||
d="M 1.709,8.313 Q 1,8.313 0.5,7.823 0,7.333 0,6.604 0,5.896 0.5,5.396 q 0.5,-0.5 1.209,-0.5 0.708,0 1.208,0.5 0.5,0.5 0.5,1.229 0,0.708 -0.5,1.198 -0.5,0.49 -1.208,0.49 z m 0,-4.896 Q 1,3.417 0.5,2.927 0,2.437 0,1.708 0,1 0.5,0.5 1,0 1.709,0 q 0.708,0 1.208,0.5 0.5,0.5 0.5,1.229 0,0.708 -0.5,1.198 -0.5,0.49 -1.208,0.49 z m 0,9.77 Q 1,13.187 0.5,12.698 0,12.208 0,11.479 q 0,-0.708 0.5,-1.208 0.5,-0.5 1.209,-0.5 0.708,0 1.208,0.5 0.5,0.5 0.5,1.229 0,0.708 -0.5,1.198 -0.5,0.489 -1.208,0.489 z m 4.604,-0.395 q -0.5,0 -0.896,-0.396 Q 5.021,12 5.021,11.479 q 0,-0.5 0.396,-0.896 0.396,-0.396 0.896,-0.396 h 8.979 q 0.5,0 0.896,0.396 0.395,0.396 0.395,0.896 0,0.521 -0.395,0.917 -0.396,0.396 -0.896,0.396 z m 0,-4.875 q -0.5,0 -0.896,-0.396 -0.396,-0.396 -0.396,-0.917 0,-0.5 0.396,-0.896 0.396,-0.395 0.896,-0.395 h 8.979 q 0.5,0 0.896,0.395 0.395,0.396 0.395,0.896 0,0.521 -0.395,0.917 -0.396,0.396 -0.896,0.396 z m 0,-4.896 q -0.5,0 -0.896,-0.396 -0.396,-0.396 -0.396,-0.917 0,-0.5 0.396,-0.895 0.396,-0.396 0.896,-0.396 h 8.979 q 0.5,0 0.896,0.396 0.395,0.395 0.395,0.895 0,0.521 -0.395,0.917 -0.396,0.396 -0.896,0.396 z"
|
||||
id="path5892"
|
||||
style="fill:#40d29f;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.4 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="12.183594"
|
||||
width="16.582031"
|
||||
version="1.1"
|
||||
id="svg5894"
|
||||
sodipodi:docname="sequence_random.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5898" />
|
||||
<sodipodi:namedview
|
||||
id="namedview5896"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="32"
|
||||
inkscape:cx="-1.59375"
|
||||
inkscape:cy="7.828125"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5894" />
|
||||
<path
|
||||
id="path414"
|
||||
style="color:#000000;fill:#40d29f;stroke-width:0.4;stroke-linecap:round;paint-order:fill markers stroke"
|
||||
d="M 1.7089844,0 C 1.2363186,0 0.83333267,0.16666733 0.5,0.5 0.16666733,0.83333267 0,1.2350322 0,1.7070312 c 0,0.4859992 0.16666733,0.8940371 0.5,1.2207032 0.33333267,0.3266659 0.7363186,0.4902343 1.2089844,0.4902344 0.471999,0 0.8756516,-0.1635685 1.2089844,-0.4902344 0.3333326,-0.3266661 0.4999999,-0.7272196 0.5,-1.1992188 0,-0.485999 -0.1666674,-0.89518293 -0.5,-1.2285156 C 2.5846361,0.16666733 2.1809834,0 1.7089844,0 Z M 6.3125,0.41796875 c -0.3333327,0 -0.6305318,0.13053177 -0.8945312,0.39453125 -0.2639996,0.2633328 -0.3964844,0.5611987 -0.3964844,0.8945312 0,0.3473327 0.1324848,0.6539694 0.3964844,0.9179688 C 5.6819682,2.8889994 5.9791673,3.0214844 6.3125,3.0214844 h 8.980469 C 15.626301,3.0214844 15.9235,2.8889994 16.1875,2.625 16.450833,2.3610006 16.582031,2.0543639 16.582031,1.7070312 16.582031,1.3736987 16.450833,1.0758328 16.1875,0.8125 15.9235,0.54850052 15.626301,0.41796875 15.292969,0.41796875 Z M 9.0878906,4.3007812 c -0.2828275,0 -0.5270087,0.1055895 -0.7324218,0.3164063 -0.2050874,0.2104687 -0.3066407,0.4597345 -0.3066407,0.75 v 5.7480465 c 0,0.290266 0.101563,0.543098 0.3066407,0.753907 0.2054131,0.210442 0.4495943,0.314453 0.7324218,0.314453 h 5.6015624 c 0.282829,0 0.527005,-0.103984 0.732422,-0.314453 0.20504,-0.210809 0.310547,-0.463641 0.310547,-0.753907 V 5.3671875 c 0,-0.2902655 -0.105468,-0.5395313 -0.310547,-0.75 -0.192576,-0.1976408 -0.419166,-0.3040153 -0.679687,-0.3164063 -0.01736,-8.263e-4 -0.03505,0 -0.05274,0 z M 1.9257812,5.3535156 C 1.6720837,5.3535062 1.4450691,5.4533683 1.2441406,5.6542969 1.043212,5.8547182 0.94335938,6.0822399 0.94335938,6.3359375 c 0,0.2643529 0.0998526,0.4982903 0.30078122,0.6992187 0.2009285,0.2009285 0.4279431,0.3007813 0.6816406,0.3007813 H 6.8886719 V 5.7070312 c 0,-0.1182132 0.017785,-0.2363441 0.048828,-0.3515624 z m 11.7246098,0.041016 c 0.275278,0 0.533582,0.1086393 0.724609,0.3046876 0.191017,0.1960469 0.294922,0.4582008 0.294922,0.7363281 0,0.2781252 -0.10358,0.53844 -0.294922,0.734375 -0.191911,0.1969508 -0.45114,0.3027343 -0.724609,0.3027343 -0.273472,0 -0.532817,-0.1054585 -0.72461,-0.3027343 -0.192232,-0.1968435 -0.291015,-0.4579656 -0.291015,-0.734375 0,-0.2764085 0.09911,-0.5393695 0.291015,-0.7363281 0.190906,-0.1963654 0.449327,-0.3046876 0.72461,-0.3046876 z M 11.888672,7.203125 c 0.0068,0 0.0244,-0.00128 0.05273,0 0.256852,0.011652 0.493747,0.1218832 0.671875,0.3046875 0.191019,0.1960465 0.296876,0.4562463 0.296875,0.734375 10e-7,0.2781245 -0.105853,0.5402803 -0.296875,0.7363281 C 12.42137,9.1754773 12.162139,9.28125 11.888672,9.28125 c -0.273461,0 -0.532699,-0.1057738 -0.72461,-0.3027344 -0.191923,-0.1969574 -0.291015,-0.4599183 -0.291015,-0.7363281 0,-0.2764094 0.0991,-0.5374165 0.291015,-0.734375 0.191024,-0.1960448 0.449335,-0.3046875 0.72461,-0.3046875 z m -1.75,1.8066406 c 0.0068,0 0.0244,6.732e-4 0.05273,0.00195 0.256848,0.011652 0.49375,0.1238283 0.671875,0.3066406 0.189491,0.1948428 0.294922,0.4530828 0.294922,0.7304688 0,0.278128 -0.103894,0.538327 -0.294922,0.734375 -0.191019,0.196026 -0.449319,0.306641 -0.724609,0.306641 -0.2750313,0 -0.5324,-0.111387 -0.7226564,-0.306641 C 9.2249894,10.587155 9.1210938,10.326955 9.1210938,10.048828 9.1210937,9.7714422 9.2265406,9.5132022 9.4160156,9.3183594 9.6062729,9.1231217 9.8636398,9.0097656 10.138672,9.0097656 Z m -8.216797,0.1875 c -0.2536975,-9.4e-6 -0.478759,0.0979 -0.6796875,0.2988282 -0.2009286,0.2004212 -0.30273437,0.4279427 -0.30273438,0.6816402 0,0.264353 0.10180578,0.498291 0.30273438,0.699219 0.2009285,0.200929 0.42599,0.300781 0.6796875,0.300781 H 6.8867188 V 9.5488281 c 0,-0.1182133 0.017785,-0.2363441 0.048828,-0.3515625 z" />
|
||||
height="12.183594"
|
||||
width="16.582031"
|
||||
version="1.1"
|
||||
id="svg5894"
|
||||
sodipodi:docname="sequence_random.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5898"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview5896"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="32"
|
||||
inkscape:cx="-1.59375"
|
||||
inkscape:cy="7.828125"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5894"/>
|
||||
<path
|
||||
id="path414"
|
||||
style="color:#000000;fill:#40d29f;stroke-width:0.4;stroke-linecap:round;paint-order:fill markers stroke"
|
||||
d="M 1.7089844,0 C 1.2363186,0 0.83333267,0.16666733 0.5,0.5 0.16666733,0.83333267 0,1.2350322 0,1.7070312 c 0,0.4859992 0.16666733,0.8940371 0.5,1.2207032 0.33333267,0.3266659 0.7363186,0.4902343 1.2089844,0.4902344 0.471999,0 0.8756516,-0.1635685 1.2089844,-0.4902344 0.3333326,-0.3266661 0.4999999,-0.7272196 0.5,-1.1992188 0,-0.485999 -0.1666674,-0.89518293 -0.5,-1.2285156 C 2.5846361,0.16666733 2.1809834,0 1.7089844,0 Z M 6.3125,0.41796875 c -0.3333327,0 -0.6305318,0.13053177 -0.8945312,0.39453125 -0.2639996,0.2633328 -0.3964844,0.5611987 -0.3964844,0.8945312 0,0.3473327 0.1324848,0.6539694 0.3964844,0.9179688 C 5.6819682,2.8889994 5.9791673,3.0214844 6.3125,3.0214844 h 8.980469 C 15.626301,3.0214844 15.9235,2.8889994 16.1875,2.625 16.450833,2.3610006 16.582031,2.0543639 16.582031,1.7070312 16.582031,1.3736987 16.450833,1.0758328 16.1875,0.8125 15.9235,0.54850052 15.626301,0.41796875 15.292969,0.41796875 Z M 9.0878906,4.3007812 c -0.2828275,0 -0.5270087,0.1055895 -0.7324218,0.3164063 -0.2050874,0.2104687 -0.3066407,0.4597345 -0.3066407,0.75 v 5.7480465 c 0,0.290266 0.101563,0.543098 0.3066407,0.753907 0.2054131,0.210442 0.4495943,0.314453 0.7324218,0.314453 h 5.6015624 c 0.282829,0 0.527005,-0.103984 0.732422,-0.314453 0.20504,-0.210809 0.310547,-0.463641 0.310547,-0.753907 V 5.3671875 c 0,-0.2902655 -0.105468,-0.5395313 -0.310547,-0.75 -0.192576,-0.1976408 -0.419166,-0.3040153 -0.679687,-0.3164063 -0.01736,-8.263e-4 -0.03505,0 -0.05274,0 z M 1.9257812,5.3535156 C 1.6720837,5.3535062 1.4450691,5.4533683 1.2441406,5.6542969 1.043212,5.8547182 0.94335938,6.0822399 0.94335938,6.3359375 c 0,0.2643529 0.0998526,0.4982903 0.30078122,0.6992187 0.2009285,0.2009285 0.4279431,0.3007813 0.6816406,0.3007813 H 6.8886719 V 5.7070312 c 0,-0.1182132 0.017785,-0.2363441 0.048828,-0.3515624 z m 11.7246098,0.041016 c 0.275278,0 0.533582,0.1086393 0.724609,0.3046876 0.191017,0.1960469 0.294922,0.4582008 0.294922,0.7363281 0,0.2781252 -0.10358,0.53844 -0.294922,0.734375 -0.191911,0.1969508 -0.45114,0.3027343 -0.724609,0.3027343 -0.273472,0 -0.532817,-0.1054585 -0.72461,-0.3027343 -0.192232,-0.1968435 -0.291015,-0.4579656 -0.291015,-0.734375 0,-0.2764085 0.09911,-0.5393695 0.291015,-0.7363281 0.190906,-0.1963654 0.449327,-0.3046876 0.72461,-0.3046876 z M 11.888672,7.203125 c 0.0068,0 0.0244,-0.00128 0.05273,0 0.256852,0.011652 0.493747,0.1218832 0.671875,0.3046875 0.191019,0.1960465 0.296876,0.4562463 0.296875,0.734375 10e-7,0.2781245 -0.105853,0.5402803 -0.296875,0.7363281 C 12.42137,9.1754773 12.162139,9.28125 11.888672,9.28125 c -0.273461,0 -0.532699,-0.1057738 -0.72461,-0.3027344 -0.191923,-0.1969574 -0.291015,-0.4599183 -0.291015,-0.7363281 0,-0.2764094 0.0991,-0.5374165 0.291015,-0.734375 0.191024,-0.1960448 0.449335,-0.3046875 0.72461,-0.3046875 z m -1.75,1.8066406 c 0.0068,0 0.0244,6.732e-4 0.05273,0.00195 0.256848,0.011652 0.49375,0.1238283 0.671875,0.3066406 0.189491,0.1948428 0.294922,0.4530828 0.294922,0.7304688 0,0.278128 -0.103894,0.538327 -0.294922,0.734375 -0.191019,0.196026 -0.449319,0.306641 -0.724609,0.306641 -0.2750313,0 -0.5324,-0.111387 -0.7226564,-0.306641 C 9.2249894,10.587155 9.1210938,10.326955 9.1210938,10.048828 9.1210937,9.7714422 9.2265406,9.5132022 9.4160156,9.3183594 9.6062729,9.1231217 9.8636398,9.0097656 10.138672,9.0097656 Z m -8.216797,0.1875 c -0.2536975,-9.4e-6 -0.478759,0.0979 -0.6796875,0.2988282 -0.2009286,0.2004212 -0.30273437,0.4279427 -0.30273438,0.6816402 0,0.264353 0.10180578,0.498291 0.30273438,0.699219 0.2009285,0.200929 0.42599,0.300781 0.6796875,0.300781 H 6.8867188 V 9.5488281 c 0,-0.1182133 0.017785,-0.2363441 0.048828,-0.3515625 z"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.9 KiB |
@ -1,60 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="14.874624"
|
||||
width="16.583984"
|
||||
version="1.1"
|
||||
id="svg5894"
|
||||
sodipodi:docname="sequence_reactive.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
height="14.874624"
|
||||
width="16.583984"
|
||||
version="1.1"
|
||||
id="svg5894"
|
||||
sodipodi:docname="sequence_reactive.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs5898"><linearGradient
|
||||
id="linearGradient3589"
|
||||
inkscape:swatch="solid"><stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3587" /></linearGradient><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="originald"
|
||||
linkedpaths="#path5892,0,1|#path3531,0,1"
|
||||
id="path-effect3720"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /></defs><sodipodi:namedview
|
||||
id="namedview5896"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="21.599999"
|
||||
inkscape:cx="16.805556"
|
||||
inkscape:cy="4.3287039"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5894" /><path
|
||||
d="M 0,0"
|
||||
id="path3722"
|
||||
class="UnoptimicedTransforms"
|
||||
inkscape:original-d="M 0,0"
|
||||
inkscape:path-effect="#path-effect3720"
|
||||
transform="translate(-1.7285156,-3.375)" /><path
|
||||
id="path5892"
|
||||
style="fill:#40d29f;fill-opacity:1"
|
||||
class="UnoptimicedTransforms"
|
||||
d="m 3.4375,3.375 c -0.4726662,0 -0.8756514,0.166667 -1.2089844,0.5 -0.333333,0.333333 -0.5,0.7350317 -0.5,1.2070312 0,0.4859996 0.166667,0.8940368 0.5,1.2207032 0.333333,0.3266663 0.7363182,0.4902344 1.2089844,0.4902344 0.4719995,-10e-8 0.8756514,-0.1635681 1.2089844,-0.4902344 0.333333,-0.3266664 0.5,-0.7272192 0.5,-1.1992188 0,-0.4859995 -0.166667,-0.8951826 -0.5,-1.2285156 C 4.3131514,3.541667 3.9094995,3.375 3.4375,3.375 Z M 8.0429688,3.7929688 C 7.7096358,3.7929687 7.4104841,3.9235003 7.1464844,4.1875 6.8824846,4.4508331 6.75,4.7486983 6.75,5.0820312 6.75,5.4293642 6.8824846,5.7360003 7.1464844,6 7.4104841,6.2639997 7.7096358,6.3964844 8.0429688,6.3964844 H 17.021484 C 17.354817,6.3964844 17.653969,6.2639997 17.917969,6 18.181302,5.7360003 18.3125,5.4293642 18.3125,5.0820312 18.3125,4.7486983 18.181302,4.4508331 17.917969,4.1875 17.653969,3.9235003 17.354817,3.7929688 17.021484,3.7929688 Z M 3.4375,8.2714844 c -0.4726662,0 -0.8756514,0.166667 -1.2089844,0.5 -0.333333,0.333333 -0.5,0.7350317 -0.5,1.2070312 0,0.4859994 0.166667,0.8920834 0.5,1.2187504 0.333333,0.326666 0.7363182,0.490234 1.2089844,0.490234 0.4719995,0 0.8756514,-0.163568 1.2089844,-0.490234 0.333333,-0.326667 0.5,-0.725266 0.5,-1.197266 0,-0.4859995 -0.166667,-0.8951826 -0.5,-1.2285156 -0.333333,-0.333333 -0.7369849,-0.5 -1.2089844,-0.5 z M 8.0429688,8.6875 c -0.333333,0 -0.6324847,0.1311982 -0.8964844,0.3945312 C 6.8824846,9.346031 6.75,9.6451826 6.75,9.9785156 c 0,0.3473334 0.1324846,0.6539694 0.3964844,0.9179684 0.2639997,0.264 0.5631514,0.396485 0.8964844,0.396485 H 12.582031 C 12.667811,11.029759 12.810428,10.78417 13,10.615234 c 0.314158,-0.280616 0.764135,-0.439453 1.171875,-0.439453 h 0.46875 c 0.407741,0 0.855765,0.158985 1.169922,0.439453 0.189414,0.168797 0.331535,0.414214 0.416015,0.677735 h 0.794922 c 0.333333,0 0.632485,-0.132485 0.896485,-0.396485 0.263333,-0.263999 0.394531,-0.570635 0.394531,-0.9179684 0,-0.333333 -0.131198,-0.6324846 -0.394531,-0.8964844 C 17.653969,8.8186982 17.354817,8.6875 17.021484,8.6875 Z M 3.4375,13.146484 c -0.4726662,0 -0.8756514,0.166667 -1.2089844,0.5 -0.333333,0.333333 -0.5,0.735032 -0.5,1.207032 0,0.485999 0.166667,0.892083 0.5,1.21875 0.333333,0.325999 0.7363182,0.490234 1.2089844,0.490234 0.4719995,0 0.8756514,-0.164235 1.2089844,-0.490234 0.333333,-0.326667 0.5,-0.725266 0.5,-1.197266 0,-0.486 -0.166667,-0.895183 -0.5,-1.228516 -0.333333,-0.333333 -0.7369849,-0.5 -1.2089844,-0.5 z M 8.0429688,13.5625 c -0.333333,0 -0.6324847,0.130532 -0.8964844,0.394531 C 6.8824846,14.221031 6.75,14.520183 6.75,14.853516 c 0,0.347333 0.1324846,0.653969 0.3964844,0.917968 0.2639997,0.264 0.5631514,0.396485 0.8964844,0.396485 H 10.03125 C 9.985538,15.92966 9.986027,15.678358 10.04492,15.455078 10.12589,15.148084 10.389523,14.941651 10.626951,14.732422 10.380403,14.52554 10.114609,14.310259 10.025389,13.998047 9.986266,13.860916 9.972079,13.712745 9.974607,13.5625 Z m 10.2500002,1.083984 c -0.03323,0.02743 -0.06681,0.05476 -0.09961,0.08203 0.03855,0.03356 0.07792,0.06815 0.117188,0.101562 -0.0012,-0.06277 -0.007,-0.123307 -0.01758,-0.183594 z"
|
||||
transform="translate(-1.7285156,-3.375)" /><path
|
||||
style="color:#000000;fill:#40d29f;stroke-width:2;paint-order:stroke markers fill;fill-opacity:1"
|
||||
d="m 12.442996,14.874619 q -0.295876,0 -0.505045,-0.186837 -0.209662,-0.186838 -0.209662,-0.451125 v -1.440446 l -1.16293,0.620023 q -0.265504,0.127774 -0.541296,0.06389 -0.2753016,-0.06389 -0.4183406,-0.282664 l -0.244932,-0.382867 q -0.142553,-0.227969 -0.07642,-0.47869 0.06613,-0.250722 0.321348,-0.387241 L 10.779424,11.33783 9.5856344,10.736185 q -0.255217,-0.136961 -0.326737,-0.38724 -0.07153,-0.250722 0.07153,-0.478691 l 0.265013,-0.373676 q 0.153328,-0.227967 0.4340186,-0.296228 0.28069,-0.0687 0.52562,0.06827 l 1.173216,0.610833 V 8.439007 q 0,-0.264287 0.209662,-0.451125 0.209169,-0.186837 0.505047,-0.186837 h 0.469287 q 0.295874,0 0.505047,0.186837 0.209659,0.186838 0.209659,0.451125 v 1.440446 l 1.173216,-0.620024 q 0.255218,-0.127774 0.525622,-0.05908 0.270404,0.06827 0.423731,0.277851 l 0.285589,0.401242 q 0.153327,0.227969 0.07642,0.478254 -0.07642,0.25072 -0.341923,0.387677 l -1.183505,0.592455 1.173707,0.610833 q 0.24493,0.118573 0.331635,0.378052 0.08671,0.259911 -0.06662,0.478692 l -0.265012,0.392052 q -0.153326,0.21878 -0.423729,0.291853 -0.270405,0.07263 -0.525621,-0.06389 l -1.183504,-0.629204 v 1.440446 q 0,0.264286 -0.20966,0.451125 -0.209172,0.186837 -0.505048,0.186837 z"
|
||||
id="path6912" /></svg>
|
||||
effect="fill_between_many"
|
||||
method="originald"
|
||||
linkedpaths="#path5892,0,1|#path3531,0,1"
|
||||
id="path-effect3720"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true"/></defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview5896"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="21.599999"
|
||||
inkscape:cx="16.805556"
|
||||
inkscape:cy="4.3287039"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5894"/>
|
||||
<path
|
||||
d="M 0,0"
|
||||
id="path3722"
|
||||
class="UnoptimicedTransforms"
|
||||
inkscape:original-d="M 0,0"
|
||||
inkscape:path-effect="#path-effect3720"
|
||||
transform="translate(-1.7285156,-3.375)"/>
|
||||
<path
|
||||
id="path5892"
|
||||
style="fill:#40d29f;fill-opacity:1"
|
||||
class="UnoptimicedTransforms"
|
||||
d="m 3.4375,3.375 c -0.4726662,0 -0.8756514,0.166667 -1.2089844,0.5 -0.333333,0.333333 -0.5,0.7350317 -0.5,1.2070312 0,0.4859996 0.166667,0.8940368 0.5,1.2207032 0.333333,0.3266663 0.7363182,0.4902344 1.2089844,0.4902344 0.4719995,-10e-8 0.8756514,-0.1635681 1.2089844,-0.4902344 0.333333,-0.3266664 0.5,-0.7272192 0.5,-1.1992188 0,-0.4859995 -0.166667,-0.8951826 -0.5,-1.2285156 C 4.3131514,3.541667 3.9094995,3.375 3.4375,3.375 Z M 8.0429688,3.7929688 C 7.7096358,3.7929687 7.4104841,3.9235003 7.1464844,4.1875 6.8824846,4.4508331 6.75,4.7486983 6.75,5.0820312 6.75,5.4293642 6.8824846,5.7360003 7.1464844,6 7.4104841,6.2639997 7.7096358,6.3964844 8.0429688,6.3964844 H 17.021484 C 17.354817,6.3964844 17.653969,6.2639997 17.917969,6 18.181302,5.7360003 18.3125,5.4293642 18.3125,5.0820312 18.3125,4.7486983 18.181302,4.4508331 17.917969,4.1875 17.653969,3.9235003 17.354817,3.7929688 17.021484,3.7929688 Z M 3.4375,8.2714844 c -0.4726662,0 -0.8756514,0.166667 -1.2089844,0.5 -0.333333,0.333333 -0.5,0.7350317 -0.5,1.2070312 0,0.4859994 0.166667,0.8920834 0.5,1.2187504 0.333333,0.326666 0.7363182,0.490234 1.2089844,0.490234 0.4719995,0 0.8756514,-0.163568 1.2089844,-0.490234 0.333333,-0.326667 0.5,-0.725266 0.5,-1.197266 0,-0.4859995 -0.166667,-0.8951826 -0.5,-1.2285156 -0.333333,-0.333333 -0.7369849,-0.5 -1.2089844,-0.5 z M 8.0429688,8.6875 c -0.333333,0 -0.6324847,0.1311982 -0.8964844,0.3945312 C 6.8824846,9.346031 6.75,9.6451826 6.75,9.9785156 c 0,0.3473334 0.1324846,0.6539694 0.3964844,0.9179684 0.2639997,0.264 0.5631514,0.396485 0.8964844,0.396485 H 12.582031 C 12.667811,11.029759 12.810428,10.78417 13,10.615234 c 0.314158,-0.280616 0.764135,-0.439453 1.171875,-0.439453 h 0.46875 c 0.407741,0 0.855765,0.158985 1.169922,0.439453 0.189414,0.168797 0.331535,0.414214 0.416015,0.677735 h 0.794922 c 0.333333,0 0.632485,-0.132485 0.896485,-0.396485 0.263333,-0.263999 0.394531,-0.570635 0.394531,-0.9179684 0,-0.333333 -0.131198,-0.6324846 -0.394531,-0.8964844 C 17.653969,8.8186982 17.354817,8.6875 17.021484,8.6875 Z M 3.4375,13.146484 c -0.4726662,0 -0.8756514,0.166667 -1.2089844,0.5 -0.333333,0.333333 -0.5,0.735032 -0.5,1.207032 0,0.485999 0.166667,0.892083 0.5,1.21875 0.333333,0.325999 0.7363182,0.490234 1.2089844,0.490234 0.4719995,0 0.8756514,-0.164235 1.2089844,-0.490234 0.333333,-0.326667 0.5,-0.725266 0.5,-1.197266 0,-0.486 -0.166667,-0.895183 -0.5,-1.228516 -0.333333,-0.333333 -0.7369849,-0.5 -1.2089844,-0.5 z M 8.0429688,13.5625 c -0.333333,0 -0.6324847,0.130532 -0.8964844,0.394531 C 6.8824846,14.221031 6.75,14.520183 6.75,14.853516 c 0,0.347333 0.1324846,0.653969 0.3964844,0.917968 0.2639997,0.264 0.5631514,0.396485 0.8964844,0.396485 H 10.03125 C 9.985538,15.92966 9.986027,15.678358 10.04492,15.455078 10.12589,15.148084 10.389523,14.941651 10.626951,14.732422 10.380403,14.52554 10.114609,14.310259 10.025389,13.998047 9.986266,13.860916 9.972079,13.712745 9.974607,13.5625 Z m 10.2500002,1.083984 c -0.03323,0.02743 -0.06681,0.05476 -0.09961,0.08203 0.03855,0.03356 0.07792,0.06815 0.117188,0.101562 -0.0012,-0.06277 -0.007,-0.123307 -0.01758,-0.183594 z"
|
||||
transform="translate(-1.7285156,-3.375)"/>
|
||||
<path
|
||||
style="color:#000000;fill:#40d29f;stroke-width:2;paint-order:stroke markers fill;fill-opacity:1"
|
||||
d="m 12.442996,14.874619 q -0.295876,0 -0.505045,-0.186837 -0.209662,-0.186838 -0.209662,-0.451125 v -1.440446 l -1.16293,0.620023 q -0.265504,0.127774 -0.541296,0.06389 -0.2753016,-0.06389 -0.4183406,-0.282664 l -0.244932,-0.382867 q -0.142553,-0.227969 -0.07642,-0.47869 0.06613,-0.250722 0.321348,-0.387241 L 10.779424,11.33783 9.5856344,10.736185 q -0.255217,-0.136961 -0.326737,-0.38724 -0.07153,-0.250722 0.07153,-0.478691 l 0.265013,-0.373676 q 0.153328,-0.227967 0.4340186,-0.296228 0.28069,-0.0687 0.52562,0.06827 l 1.173216,0.610833 V 8.439007 q 0,-0.264287 0.209662,-0.451125 0.209169,-0.186837 0.505047,-0.186837 h 0.469287 q 0.295874,0 0.505047,0.186837 0.209659,0.186838 0.209659,0.451125 v 1.440446 l 1.173216,-0.620024 q 0.255218,-0.127774 0.525622,-0.05908 0.270404,0.06827 0.423731,0.277851 l 0.285589,0.401242 q 0.153327,0.227969 0.07642,0.478254 -0.07642,0.25072 -0.341923,0.387677 l -1.183505,0.592455 1.173707,0.610833 q 0.24493,0.118573 0.331635,0.378052 0.08671,0.259911 -0.06662,0.478692 l -0.265012,0.392052 q -0.153326,0.21878 -0.423729,0.291853 -0.270405,0.07263 -0.525621,-0.06389 l -1.183504,-0.629204 v 1.440446 q 0,0.264286 -0.20966,0.451125 -0.209172,0.186837 -0.505048,0.186837 z"
|
||||
id="path6912"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.5 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="17.666"
|
||||
width="17.666"
|
||||
version="1.1"
|
||||
id="svg7608"
|
||||
sodipodi:docname="succedeer.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs7612" />
|
||||
<sodipodi:namedview
|
||||
id="namedview7610"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.8"
|
||||
inkscape:cx="-0.092592592"
|
||||
inkscape:cy="15.509259"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7608" />
|
||||
<path
|
||||
d="M 7.666,9.479 6.479,8.271 Q 6.104,7.916 5.604,7.916 q -0.5,0 -0.875,0.375 -0.375,0.375 -0.375,0.865 0,0.489 0.375,0.865 l 2,2.02 q 0.416,0.396 0.927,0.396 0.51,0 0.906,-0.396 L 12.833,7.75 Q 13.166,7.416 13.052,6.958 12.937,6.5 12.833,6.041 12.458,5.666 11.968,5.666 q -0.489,0 -0.864,0.375 z m 1.167,8.187 q -1.854,0 -3.458,-0.687 Q 3.771,16.291 2.573,15.093 1.375,13.895 0.687,12.291 0,10.687 0,8.833 0,6.958 0.687,5.364 1.375,3.771 2.573,2.573 3.771,1.375 5.375,0.687 6.979,0 8.833,0 q 1.875,0 3.469,0.687 1.593,0.688 2.791,1.886 1.198,1.198 1.886,2.791 0.687,1.594 0.687,3.469 0,1.854 -0.687,3.458 -0.688,1.604 -1.886,2.802 -1.198,1.198 -2.791,1.886 -1.594,0.687 -3.469,0.687 z"
|
||||
id="path7606"
|
||||
style="fill:#46c0e1;fill-opacity:1" />
|
||||
height="17.666"
|
||||
width="17.666"
|
||||
version="1.1"
|
||||
id="svg7608"
|
||||
sodipodi:docname="succedeer.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs7612"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview7610"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.8"
|
||||
inkscape:cx="-0.092592592"
|
||||
inkscape:cy="15.509259"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7608"/>
|
||||
<path
|
||||
d="M 7.666,9.479 6.479,8.271 Q 6.104,7.916 5.604,7.916 q -0.5,0 -0.875,0.375 -0.375,0.375 -0.375,0.865 0,0.489 0.375,0.865 l 2,2.02 q 0.416,0.396 0.927,0.396 0.51,0 0.906,-0.396 L 12.833,7.75 Q 13.166,7.416 13.052,6.958 12.937,6.5 12.833,6.041 12.458,5.666 11.968,5.666 q -0.489,0 -0.864,0.375 z m 1.167,8.187 q -1.854,0 -3.458,-0.687 Q 3.771,16.291 2.573,15.093 1.375,13.895 0.687,12.291 0,10.687 0,8.833 0,6.958 0.687,5.364 1.375,3.771 2.573,2.573 3.771,1.375 5.375,0.687 6.979,0 8.833,0 q 1.875,0 3.469,0.687 1.593,0.688 2.791,1.886 1.198,1.198 1.886,2.791 0.687,1.594 0.687,3.469 0,1.854 -0.687,3.458 -0.688,1.604 -1.886,2.802 -1.198,1.198 -2.791,1.886 -1.594,0.687 -3.469,0.687 z"
|
||||
id="path7606"
|
||||
style="fill:#46c0e1;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.0 KiB |
@ -1,38 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="15.063"
|
||||
width="16.875999"
|
||||
version="1.1"
|
||||
id="svg12"
|
||||
sodipodi:docname="tree.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs16" />
|
||||
<sodipodi:namedview
|
||||
id="namedview14"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.8"
|
||||
inkscape:cx="-26.481481"
|
||||
inkscape:cy="9.3981481"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg12" />
|
||||
<path
|
||||
d="m 12.709,15.063 q -0.771,0 -1.313,-0.521 -0.541,-0.521 -0.562,-1.271 V 12.604 H 9.376 q -0.792,0 -1.344,-0.552 Q 7.48,11.5 7.48,10.73 V 4.313 H 6.021 V 4.938 Q 6.021,5.709 5.469,6.23 4.917,6.75 4.146,6.75 H 1.876 Q 1.105,6.75 0.553,6.198 0,5.646 0,4.875 v -3 Q 0,1.104 0.553,0.552 1.105,0 1.876,0 h 2.27 q 0.771,0 1.323,0.521 0.552,0.521 0.552,1.271 v 0.646 h 4.813 V 1.792 q 0,-0.75 0.552,-1.271 Q 11.938,0 12.709,0 H 15 q 0.771,0 1.323,0.552 0.553,0.552 0.553,1.323 v 3 q 0,0.771 -0.553,1.323 Q 15.771,6.75 15,6.75 H 12.709 Q 11.938,6.75 11.386,6.23 10.834,5.709 10.834,4.938 V 4.313 H 9.376 v 6.417 h 1.458 v -0.626 q 0,-0.77 0.552,-1.291 0.552,-0.521 1.323,-0.521 H 15 q 0.771,0 1.323,0.552 0.553,0.552 0.553,1.323 v 3.021 q 0,0.771 -0.553,1.323 -0.552,0.552 -1.323,0.552 z"
|
||||
id="path10"
|
||||
style="fill:#c689ff;fill-opacity:1" />
|
||||
height="15.063"
|
||||
width="16.875999"
|
||||
version="1.1"
|
||||
id="svg12"
|
||||
sodipodi:docname="tree.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs16"/>
|
||||
<sodipodi:namedview
|
||||
id="namedview14"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.8"
|
||||
inkscape:cx="-26.481481"
|
||||
inkscape:cy="9.3981481"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1051"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg12"/>
|
||||
<path
|
||||
d="m 12.709,15.063 q -0.771,0 -1.313,-0.521 -0.541,-0.521 -0.562,-1.271 V 12.604 H 9.376 q -0.792,0 -1.344,-0.552 Q 7.48,11.5 7.48,10.73 V 4.313 H 6.021 V 4.938 Q 6.021,5.709 5.469,6.23 4.917,6.75 4.146,6.75 H 1.876 Q 1.105,6.75 0.553,6.198 0,5.646 0,4.875 v -3 Q 0,1.104 0.553,0.552 1.105,0 1.876,0 h 2.27 q 0.771,0 1.323,0.521 0.552,0.521 0.552,1.271 v 0.646 h 4.813 V 1.792 q 0,-0.75 0.552,-1.271 Q 11.938,0 12.709,0 H 15 q 0.771,0 1.323,0.552 0.553,0.552 0.553,1.323 v 3 q 0,0.771 -0.553,1.323 Q 15.771,6.75 15,6.75 H 12.709 Q 11.938,6.75 11.386,6.23 10.834,5.709 10.834,4.938 V 4.313 H 9.376 v 6.417 h 1.458 v -0.626 q 0,-0.77 0.552,-1.291 0.552,-0.521 1.323,-0.521 H 15 q 0.771,0 1.323,0.552 0.553,0.552 0.553,1.323 v 3.021 q 0,0.771 -0.553,1.323 -0.552,0.552 -1.323,0.552 z"
|
||||
id="path10"
|
||||
style="fill:#c689ff;fill-opacity:1"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.0 KiB |
@ -1,54 +1,54 @@
|
||||
extends Node
|
||||
|
||||
var _tree_count: int = 0
|
||||
var _active_tree_count: int = 0
|
||||
var _tree_count: int = 0
|
||||
var _active_tree_count: int = 0
|
||||
var _registered_trees: Array[BeehaveTree] = []
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
Performance.add_custom_monitor("beehave/total_trees", _get_total_trees)
|
||||
Performance.add_custom_monitor("beehave/total_enabled_trees", _get_total_enabled_trees)
|
||||
Performance.add_custom_monitor("beehave/total_trees", _get_total_trees)
|
||||
Performance.add_custom_monitor("beehave/total_enabled_trees", _get_total_enabled_trees)
|
||||
|
||||
|
||||
func register_tree(tree: BeehaveTree) -> void:
|
||||
if _registered_trees.has(tree):
|
||||
return
|
||||
|
||||
_registered_trees.append(tree)
|
||||
_tree_count += 1
|
||||
|
||||
if tree.enabled:
|
||||
_active_tree_count += 1
|
||||
|
||||
tree.tree_enabled.connect(_on_tree_enabled)
|
||||
tree.tree_disabled.connect(_on_tree_disabled)
|
||||
if _registered_trees.has(tree):
|
||||
return
|
||||
|
||||
_registered_trees.append(tree)
|
||||
_tree_count += 1
|
||||
|
||||
if tree.enabled:
|
||||
_active_tree_count += 1
|
||||
|
||||
tree.tree_enabled.connect(_on_tree_enabled)
|
||||
tree.tree_disabled.connect(_on_tree_disabled)
|
||||
|
||||
|
||||
func unregister_tree(tree: BeehaveTree) -> void:
|
||||
if not _registered_trees.has(tree):
|
||||
return
|
||||
|
||||
_registered_trees.erase(tree)
|
||||
_tree_count -= 1
|
||||
|
||||
if tree.enabled:
|
||||
_active_tree_count -= 1
|
||||
|
||||
tree.tree_enabled.disconnect(_on_tree_enabled)
|
||||
tree.tree_disabled.disconnect(_on_tree_disabled)
|
||||
if not _registered_trees.has(tree):
|
||||
return
|
||||
|
||||
_registered_trees.erase(tree)
|
||||
_tree_count -= 1
|
||||
|
||||
if tree.enabled:
|
||||
_active_tree_count -= 1
|
||||
|
||||
tree.tree_enabled.disconnect(_on_tree_enabled)
|
||||
tree.tree_disabled.disconnect(_on_tree_disabled)
|
||||
|
||||
|
||||
func _get_total_trees() -> int:
|
||||
return _tree_count
|
||||
return _tree_count
|
||||
|
||||
|
||||
|
||||
func _get_total_enabled_trees() -> int:
|
||||
return _active_tree_count
|
||||
return _active_tree_count
|
||||
|
||||
|
||||
func _on_tree_enabled() -> void:
|
||||
_active_tree_count += 1
|
||||
_active_tree_count += 1
|
||||
|
||||
|
||||
func _on_tree_disabled() -> void:
|
||||
_active_tree_count -= 1
|
||||
_active_tree_count -= 1
|
||||
|
||||
@ -1,49 +1,50 @@
|
||||
## A node in the behavior tree. Every node must return `SUCCESS`, `FAILURE` or
|
||||
## `RUNNING` when ticked.
|
||||
@tool
|
||||
class_name BeehaveNode extends Node
|
||||
class_name BeehaveNode
|
||||
extends Node
|
||||
|
||||
enum {
|
||||
SUCCESS,
|
||||
FAILURE,
|
||||
RUNNING
|
||||
SUCCESS,
|
||||
FAILURE,
|
||||
RUNNING
|
||||
}
|
||||
|
||||
|
||||
func _get_configuration_warnings() -> PackedStringArray:
|
||||
var warnings: PackedStringArray = []
|
||||
var warnings: PackedStringArray = []
|
||||
|
||||
if get_children().any(func(x): return not (x is BeehaveNode)):
|
||||
warnings.append("All children of this node should inherit from BeehaveNode class.")
|
||||
if get_children().any(func(x): return not (x is BeehaveNode)):
|
||||
warnings.append("All children of this node should inherit from BeehaveNode class.")
|
||||
|
||||
return warnings
|
||||
return warnings
|
||||
|
||||
|
||||
## Executes this node and returns a status code.
|
||||
## This method must be overwritten.
|
||||
func tick(actor: Node, blackboard: Blackboard) -> int:
|
||||
return SUCCESS
|
||||
return SUCCESS
|
||||
|
||||
|
||||
## Called when this node needs to be interrupted before it can return FAILURE or SUCCESS.
|
||||
func interrupt(actor: Node, blackboard: Blackboard) -> void:
|
||||
pass
|
||||
pass
|
||||
|
||||
|
||||
## Called before the first time it ticks by the parent.
|
||||
func before_run(actor: Node, blackboard: Blackboard) -> void:
|
||||
pass
|
||||
pass
|
||||
|
||||
|
||||
## Called after the last time it ticks and returns
|
||||
## [code]SUCCESS[/code] or [code]FAILURE[/code].
|
||||
func after_run(actor: Node, blackboard: Blackboard) -> void:
|
||||
pass
|
||||
pass
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
return [&"BeehaveNode"]
|
||||
return [&"BeehaveNode"]
|
||||
|
||||
|
||||
func can_send_message(blackboard: Blackboard) -> bool:
|
||||
return blackboard.get_value("can_send_message", false)
|
||||
return blackboard.get_value("can_send_message", false)
|
||||
|
||||
@ -1,224 +1,225 @@
|
||||
## Controls the flow of execution of the entire behavior tree.
|
||||
@tool
|
||||
@icon("../icons/tree.svg")
|
||||
class_name BeehaveTree extends Node
|
||||
class_name BeehaveTree
|
||||
extends Node
|
||||
|
||||
enum {
|
||||
SUCCESS,
|
||||
FAILURE,
|
||||
RUNNING
|
||||
SUCCESS,
|
||||
FAILURE,
|
||||
RUNNING
|
||||
}
|
||||
|
||||
signal tree_enabled
|
||||
signal tree_disabled
|
||||
|
||||
## Wether this behavior tree should be enabled or not.
|
||||
@export var enabled: bool = true:
|
||||
set(value):
|
||||
enabled = value
|
||||
set_physics_process(enabled)
|
||||
set(value):
|
||||
enabled = value
|
||||
set_physics_process(enabled)
|
||||
|
||||
if value:
|
||||
tree_enabled.emit()
|
||||
else:
|
||||
interrupt()
|
||||
tree_disabled.emit()
|
||||
if value:
|
||||
tree_enabled.emit()
|
||||
else:
|
||||
interrupt()
|
||||
tree_disabled.emit()
|
||||
|
||||
get:
|
||||
return enabled
|
||||
get:
|
||||
return enabled
|
||||
|
||||
## An optional node path this behavior tree should apply to.
|
||||
@export_node_path var actor_node_path : NodePath
|
||||
@export_node_path var actor_node_path: NodePath
|
||||
|
||||
## Custom blackboard node. An internal blackboard will be used
|
||||
## if no blackboard is provided explicitly.
|
||||
@export var blackboard:Blackboard:
|
||||
set(b):
|
||||
blackboard = b
|
||||
if blackboard and _internal_blackboard:
|
||||
remove_child(_internal_blackboard)
|
||||
_internal_blackboard.free()
|
||||
_internal_blackboard = null
|
||||
elif not blackboard and not _internal_blackboard:
|
||||
_internal_blackboard = Blackboard.new()
|
||||
add_child(_internal_blackboard, false, Node.INTERNAL_MODE_BACK)
|
||||
get:
|
||||
return blackboard if blackboard else _internal_blackboard
|
||||
@export var blackboard: Blackboard:
|
||||
set(b):
|
||||
blackboard = b
|
||||
if blackboard and _internal_blackboard:
|
||||
remove_child(_internal_blackboard)
|
||||
_internal_blackboard.free()
|
||||
_internal_blackboard = null
|
||||
elif not blackboard and not _internal_blackboard:
|
||||
_internal_blackboard = Blackboard.new()
|
||||
add_child(_internal_blackboard, false, Node.INTERNAL_MODE_BACK)
|
||||
get:
|
||||
return blackboard if blackboard else _internal_blackboard
|
||||
|
||||
## When enabled, this tree is tracked individually
|
||||
## as a custom monitor.
|
||||
@export var custom_monitor = false:
|
||||
set(b):
|
||||
custom_monitor = b
|
||||
if custom_monitor and _process_time_metric_name != '':
|
||||
Performance.add_custom_monitor(_process_time_metric_name, _get_process_time_metric_value)
|
||||
BeehaveGlobalMetrics.register_tree(self)
|
||||
else:
|
||||
if _process_time_metric_name != '':
|
||||
# Remove tree metric from the engine
|
||||
Performance.remove_custom_monitor(_process_time_metric_name)
|
||||
BeehaveGlobalMetrics.unregister_tree(self)
|
||||
|
||||
BeehaveDebuggerMessages.unregister_tree(get_instance_id())
|
||||
|
||||
var actor : Node
|
||||
var status : int = -1
|
||||
|
||||
set(b):
|
||||
custom_monitor = b
|
||||
if custom_monitor and _process_time_metric_name != '':
|
||||
Performance.add_custom_monitor(_process_time_metric_name, _get_process_time_metric_value)
|
||||
BeehaveGlobalMetrics.register_tree(self)
|
||||
else:
|
||||
if _process_time_metric_name != '':
|
||||
# Remove tree metric from the engine
|
||||
Performance.remove_custom_monitor(_process_time_metric_name)
|
||||
BeehaveGlobalMetrics.unregister_tree(self)
|
||||
|
||||
BeehaveDebuggerMessages.unregister_tree(get_instance_id())
|
||||
|
||||
var actor: Node
|
||||
var status: int = -1
|
||||
var _internal_blackboard: Blackboard
|
||||
var _process_time_metric_name : String
|
||||
var _process_time_metric_value : float = 0.0
|
||||
var _can_send_message: bool = false
|
||||
var _process_time_metric_name: String
|
||||
var _process_time_metric_value: float = 0.0
|
||||
var _can_send_message: bool = false
|
||||
|
||||
|
||||
func init() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
|
||||
if self.get_child_count() > 0 and not self.get_child(0) is BeehaveNode:
|
||||
push_warning("Beehave error: Root %s should have only one child of type BeehaveNode (NodePath: %s)" % [self.name, self.get_path()])
|
||||
disable()
|
||||
return
|
||||
if self.get_child_count() > 0 and not self.get_child(0) is BeehaveNode:
|
||||
push_warning("Beehave error: Root %s should have only one child of type BeehaveNode (NodePath: %s)" % [self.name, self.get_path()])
|
||||
disable()
|
||||
return
|
||||
|
||||
if not blackboard:
|
||||
_internal_blackboard = Blackboard.new()
|
||||
add_child(_internal_blackboard, false, Node.INTERNAL_MODE_BACK)
|
||||
if not blackboard:
|
||||
_internal_blackboard = Blackboard.new()
|
||||
add_child(_internal_blackboard, false, Node.INTERNAL_MODE_BACK)
|
||||
|
||||
actor = get_parent()
|
||||
if actor_node_path:
|
||||
actor = get_node(actor_node_path)
|
||||
actor = get_parent()
|
||||
if actor_node_path:
|
||||
actor = get_node(actor_node_path)
|
||||
|
||||
# Get the name of the parent node name for metric
|
||||
var parent_name = actor.name
|
||||
_process_time_metric_name = "beehave [microseconds]/process_time_%s-%s" % [parent_name, get_instance_id()]
|
||||
# Get the name of the parent node name for metric
|
||||
var parent_name = actor.name
|
||||
_process_time_metric_name = "beehave [microseconds]/process_time_%s-%s" % [parent_name, get_instance_id()]
|
||||
|
||||
# Register custom metric to the engine
|
||||
if custom_monitor:
|
||||
Performance.add_custom_monitor(_process_time_metric_name, _get_process_time_metric_value)
|
||||
BeehaveGlobalMetrics.register_tree(self)
|
||||
# Register custom metric to the engine
|
||||
if custom_monitor:
|
||||
Performance.add_custom_monitor(_process_time_metric_name, _get_process_time_metric_value)
|
||||
BeehaveGlobalMetrics.register_tree(self)
|
||||
|
||||
set_physics_process(enabled)
|
||||
BeehaveGlobalDebugger.register_tree(self)
|
||||
BeehaveDebuggerMessages.register_tree(_get_debugger_data(self))
|
||||
set_physics_process(enabled)
|
||||
BeehaveGlobalDebugger.register_tree(self)
|
||||
BeehaveDebuggerMessages.register_tree(_get_debugger_data(self))
|
||||
|
||||
|
||||
func process(delta: float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
|
||||
# Start timing for metric
|
||||
var start_time = Time.get_ticks_usec()
|
||||
# Start timing for metric
|
||||
var start_time = Time.get_ticks_usec()
|
||||
|
||||
blackboard.set_value("can_send_message", _can_send_message)
|
||||
blackboard.set_value("can_send_message", _can_send_message)
|
||||
|
||||
if _can_send_message:
|
||||
BeehaveDebuggerMessages.process_begin(get_instance_id())
|
||||
if _can_send_message:
|
||||
BeehaveDebuggerMessages.process_begin(get_instance_id())
|
||||
|
||||
if self.get_child_count() == 1:
|
||||
tick()
|
||||
if self.get_child_count() == 1:
|
||||
tick()
|
||||
|
||||
if _can_send_message:
|
||||
BeehaveDebuggerMessages.process_end(get_instance_id())
|
||||
if _can_send_message:
|
||||
BeehaveDebuggerMessages.process_end(get_instance_id())
|
||||
|
||||
# Check the cost for this frame and save it for metric report
|
||||
_process_time_metric_value = Time.get_ticks_usec() - start_time
|
||||
# Check the cost for this frame and save it for metric report
|
||||
_process_time_metric_value = Time.get_ticks_usec() - start_time
|
||||
|
||||
|
||||
func tick() -> int:
|
||||
var child := self.get_child(0)
|
||||
if status != RUNNING:
|
||||
child.before_run(actor, blackboard)
|
||||
var child := self.get_child(0)
|
||||
if status != RUNNING:
|
||||
child.before_run(actor, blackboard)
|
||||
|
||||
status = child.tick(actor, blackboard)
|
||||
if _can_send_message:
|
||||
BeehaveDebuggerMessages.process_tick(child.get_instance_id(), status)
|
||||
BeehaveDebuggerMessages.process_tick(get_instance_id(), status)
|
||||
status = child.tick(actor, blackboard)
|
||||
if _can_send_message:
|
||||
BeehaveDebuggerMessages.process_tick(child.get_instance_id(), status)
|
||||
BeehaveDebuggerMessages.process_tick(get_instance_id(), status)
|
||||
|
||||
# Clear running action if nothing is running
|
||||
if status != RUNNING:
|
||||
blackboard.set_value("running_action", null, str(actor.get_instance_id()))
|
||||
child.after_run(actor, blackboard)
|
||||
# Clear running action if nothing is running
|
||||
if status != RUNNING:
|
||||
blackboard.set_value("running_action", null, str(actor.get_instance_id()))
|
||||
child.after_run(actor, blackboard)
|
||||
|
||||
return status
|
||||
return status
|
||||
|
||||
|
||||
func _get_configuration_warnings() -> PackedStringArray:
|
||||
var warnings:PackedStringArray = []
|
||||
var warnings: PackedStringArray = []
|
||||
|
||||
if get_children().any(func(x): return not (x is BeehaveNode)):
|
||||
warnings.append("All children of this node should inherit from BeehaveNode class.")
|
||||
if get_children().any(func(x): return not (x is BeehaveNode)):
|
||||
warnings.append("All children of this node should inherit from BeehaveNode class.")
|
||||
|
||||
if get_child_count() != 1:
|
||||
warnings.append("BeehaveTree should have exactly one child node.")
|
||||
if get_child_count() != 1:
|
||||
warnings.append("BeehaveTree should have exactly one child node.")
|
||||
|
||||
return warnings
|
||||
return warnings
|
||||
|
||||
|
||||
## Returns the currently running action
|
||||
func get_running_action() -> ActionLeaf:
|
||||
return blackboard.get_value("running_action", null, str(actor.get_instance_id()))
|
||||
return blackboard.get_value("running_action", null, str(actor.get_instance_id()))
|
||||
|
||||
|
||||
## Returns the last condition that was executed
|
||||
func get_last_condition() -> ConditionLeaf:
|
||||
return blackboard.get_value("last_condition", null, str(actor.get_instance_id()))
|
||||
return blackboard.get_value("last_condition", null, str(actor.get_instance_id()))
|
||||
|
||||
|
||||
## Returns the status of the last executed condition
|
||||
func get_last_condition_status() -> String:
|
||||
if blackboard.has_value("last_condition_status", str(actor.get_instance_id())):
|
||||
var status = blackboard.get_value("last_condition_status", null, str(actor.get_instance_id()))
|
||||
if status == SUCCESS:
|
||||
return "SUCCESS"
|
||||
elif status == FAILURE:
|
||||
return "FAILURE"
|
||||
else:
|
||||
return "RUNNING"
|
||||
return ""
|
||||
if blackboard.has_value("last_condition_status", str(actor.get_instance_id())):
|
||||
var status = blackboard.get_value("last_condition_status", null, str(actor.get_instance_id()))
|
||||
if status == SUCCESS:
|
||||
return "SUCCESS"
|
||||
elif status == FAILURE:
|
||||
return "FAILURE"
|
||||
else:
|
||||
return "RUNNING"
|
||||
return ""
|
||||
|
||||
|
||||
## interrupts this tree if anything was running
|
||||
func interrupt() -> void:
|
||||
if self.get_child_count() != 0:
|
||||
var first_child = self.get_child(0)
|
||||
if "interrupt" in first_child:
|
||||
first_child.interrupt(actor, blackboard)
|
||||
if self.get_child_count() != 0:
|
||||
var first_child = self.get_child(0)
|
||||
if "interrupt" in first_child:
|
||||
first_child.interrupt(actor, blackboard)
|
||||
|
||||
|
||||
## Enables this tree.
|
||||
func enable() -> void:
|
||||
self.enabled = true
|
||||
self.enabled = true
|
||||
|
||||
|
||||
## Disables this tree.
|
||||
func disable() -> void:
|
||||
self.enabled = false
|
||||
self.enabled = false
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if custom_monitor:
|
||||
if _process_time_metric_name != '':
|
||||
# Remove tree metric from the engine
|
||||
Performance.remove_custom_monitor(_process_time_metric_name)
|
||||
BeehaveGlobalMetrics.unregister_tree(self)
|
||||
if custom_monitor:
|
||||
if _process_time_metric_name != '':
|
||||
# Remove tree metric from the engine
|
||||
Performance.remove_custom_monitor(_process_time_metric_name)
|
||||
BeehaveGlobalMetrics.unregister_tree(self)
|
||||
|
||||
BeehaveDebuggerMessages.unregister_tree(get_instance_id())
|
||||
BeehaveDebuggerMessages.unregister_tree(get_instance_id())
|
||||
|
||||
|
||||
# Called by the engine to profile this tree
|
||||
func _get_process_time_metric_value() -> int:
|
||||
return _process_time_metric_value
|
||||
return _process_time_metric_value
|
||||
|
||||
|
||||
func _get_debugger_data(node: Node) -> Dictionary:
|
||||
if not node is BeehaveTree and not node is BeehaveNode:
|
||||
return {}
|
||||
var data := { path = node.get_path(), name = node.name, type = node.get_class_name(), id = str(node.get_instance_id()) }
|
||||
if node.get_child_count() > 0:
|
||||
data.children = []
|
||||
for child in node.get_children():
|
||||
var child_data := _get_debugger_data(child)
|
||||
if not child_data.is_empty():
|
||||
data.children.push_back(child_data)
|
||||
return data
|
||||
if not node is BeehaveTree and not node is BeehaveNode:
|
||||
return {}
|
||||
var data := { path = node.get_path(), name = node.name, type = node.get_class_name(), id = str(node.get_instance_id()) }
|
||||
if node.get_child_count() > 0:
|
||||
data.children = []
|
||||
for child in node.get_children():
|
||||
var child_data := _get_debugger_data(child)
|
||||
if not child_data.is_empty():
|
||||
data.children.push_back(child_data)
|
||||
return data
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
return [&"BeehaveTree"]
|
||||
return [&"BeehaveTree"]
|
||||
|
||||
@ -1,40 +1,40 @@
|
||||
## A Composite node controls the flow of execution of its children in a specific manner.
|
||||
@tool
|
||||
@icon("../../icons/category_composite.svg")
|
||||
class_name Composite extends BeehaveNode
|
||||
|
||||
class_name Composite
|
||||
extends BeehaveNode
|
||||
|
||||
var running_child: BeehaveNode = null
|
||||
|
||||
|
||||
func _ready():
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
|
||||
if self.get_child_count() < 1:
|
||||
push_warning("BehaviorTree Error: Composite %s should have at least one child (NodePath: %s)" % [self.name, self.get_path()])
|
||||
if self.get_child_count() < 1:
|
||||
push_warning("BehaviorTree Error: Composite %s should have at least one child (NodePath: %s)" % [self.name, self.get_path()])
|
||||
|
||||
|
||||
func _get_configuration_warnings() -> PackedStringArray:
|
||||
var warnings: PackedStringArray = super._get_configuration_warnings()
|
||||
var warnings: PackedStringArray = super._get_configuration_warnings()
|
||||
|
||||
if get_children().filter(func(x): return x is BeehaveNode).size() < 2:
|
||||
warnings.append("Any composite node should have at least two children. Otherwise it is not useful.")
|
||||
if get_children().filter(func(x): return x is BeehaveNode).size() < 2:
|
||||
warnings.append("Any composite node should have at least two children. Otherwise it is not useful.")
|
||||
|
||||
return warnings
|
||||
return warnings
|
||||
|
||||
|
||||
func interrupt(actor: Node, blackboard: Blackboard) -> void:
|
||||
if running_child != null:
|
||||
running_child.interrupt(actor, blackboard)
|
||||
running_child = null
|
||||
if running_child != null:
|
||||
running_child.interrupt(actor, blackboard)
|
||||
running_child = null
|
||||
|
||||
|
||||
func after_run(actor: Node, blackboard: Blackboard) -> void:
|
||||
running_child = null
|
||||
running_child = null
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
var classes := super()
|
||||
classes.push_back(&"Composite")
|
||||
return classes
|
||||
var classes := super()
|
||||
classes.push_back(&"Composite")
|
||||
return classes
|
||||
|
||||
@ -1,152 +1,153 @@
|
||||
@tool
|
||||
class_name RandomizedComposite extends Composite
|
||||
class_name RandomizedComposite
|
||||
extends Composite
|
||||
|
||||
const WEIGHTS_PREFIX = "Weights/"
|
||||
|
||||
## Sets a predicable seed
|
||||
@export var random_seed: int = 0:
|
||||
set(rs):
|
||||
random_seed = rs
|
||||
if random_seed != 0:
|
||||
seed(random_seed)
|
||||
else:
|
||||
randomize()
|
||||
set(rs):
|
||||
random_seed = rs
|
||||
if random_seed != 0:
|
||||
seed(random_seed)
|
||||
else:
|
||||
randomize()
|
||||
|
||||
## Wether to use weights for every child or not.
|
||||
@export var use_weights: bool:
|
||||
set(value):
|
||||
use_weights = value
|
||||
if use_weights:
|
||||
_update_weights(get_children())
|
||||
_connect_children_changing_signals()
|
||||
notify_property_list_changed()
|
||||
set(value):
|
||||
use_weights = value
|
||||
if use_weights:
|
||||
_update_weights(get_children())
|
||||
_connect_children_changing_signals()
|
||||
notify_property_list_changed()
|
||||
|
||||
var _weights: Dictionary
|
||||
|
||||
|
||||
func _ready():
|
||||
_connect_children_changing_signals()
|
||||
_connect_children_changing_signals()
|
||||
|
||||
|
||||
func _connect_children_changing_signals():
|
||||
if not child_entered_tree.is_connected(_on_child_entered_tree):
|
||||
child_entered_tree.connect(_on_child_entered_tree)
|
||||
|
||||
if not child_exiting_tree.is_connected(_on_child_exiting_tree):
|
||||
child_exiting_tree.connect(_on_child_exiting_tree)
|
||||
if not child_entered_tree.is_connected(_on_child_entered_tree):
|
||||
child_entered_tree.connect(_on_child_entered_tree)
|
||||
|
||||
if not child_exiting_tree.is_connected(_on_child_exiting_tree):
|
||||
child_exiting_tree.connect(_on_child_exiting_tree)
|
||||
|
||||
|
||||
func get_shuffled_children() -> Array[Node]:
|
||||
var children_bag: Array[Node] = get_children().duplicate()
|
||||
if use_weights:
|
||||
var weights: Array[int]
|
||||
weights.assign(children_bag.map(func (child): return _weights[child.name]))
|
||||
children_bag.assign(_weighted_shuffle(children_bag, weights))
|
||||
else:
|
||||
children_bag.shuffle()
|
||||
return children_bag
|
||||
var children_bag: Array[Node] = get_children().duplicate()
|
||||
if use_weights:
|
||||
var weights: Array[int]
|
||||
weights.assign(children_bag.map(func (child): return _weights[child.name]))
|
||||
children_bag.assign(_weighted_shuffle(children_bag, weights))
|
||||
else:
|
||||
children_bag.shuffle()
|
||||
return children_bag
|
||||
|
||||
|
||||
## Returns a shuffled version of a given array using the supplied array of weights.
|
||||
## Think of weights as the chance of a given item being the first in the array.
|
||||
func _weighted_shuffle(items: Array, weights: Array[int]) -> Array:
|
||||
if len(items) != len(weights):
|
||||
push_error("items and weights size mismatch: expected %d weights, got %d instead." % [len(items), len(weights)])
|
||||
return items
|
||||
|
||||
# This method is based on the weighted random sampling algorithm
|
||||
# by Efraimidis, Spirakis; 2005. This runs in O(n log(n)).
|
||||
|
||||
# For each index, it will calculate random_value^(1/weight).
|
||||
var chance_calc = func(i): return [i, randf() ** (1.0 / weights[i])]
|
||||
var random_distribuition = range(len(items)).map(chance_calc)
|
||||
|
||||
# Now we just have to order by the calculated value, descending.
|
||||
random_distribuition.sort_custom(func(a, b): return a[1] > b[1])
|
||||
|
||||
return random_distribuition.map(func(dist): return items[dist[0]])
|
||||
if len(items) != len(weights):
|
||||
push_error("items and weights size mismatch: expected %d weights, got %d instead." % [len(items), len(weights)])
|
||||
return items
|
||||
|
||||
# This method is based on the weighted random sampling algorithm
|
||||
# by Efraimidis, Spirakis; 2005. This runs in O(n log(n)).
|
||||
|
||||
# For each index, it will calculate random_value^(1/weight).
|
||||
var chance_calc = func(i): return [i, randf() ** (1.0 / weights[i])]
|
||||
var random_distribuition = range(len(items)).map(chance_calc)
|
||||
|
||||
# Now we just have to order by the calculated value, descending.
|
||||
random_distribuition.sort_custom(func(a, b): return a[1] > b[1])
|
||||
|
||||
return random_distribuition.map(func(dist): return items[dist[0]])
|
||||
|
||||
|
||||
func _get_property_list():
|
||||
var properties = []
|
||||
|
||||
if use_weights:
|
||||
for key in _weights.keys():
|
||||
properties.append({
|
||||
"name": WEIGHTS_PREFIX + key,
|
||||
"type": TYPE_INT,
|
||||
"usage": PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR,
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "1,100"
|
||||
})
|
||||
|
||||
return properties
|
||||
|
||||
|
||||
var properties = []
|
||||
|
||||
if use_weights:
|
||||
for key in _weights.keys():
|
||||
properties.append({
|
||||
"name": WEIGHTS_PREFIX + key,
|
||||
"type": TYPE_INT,
|
||||
"usage": PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR,
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "1,100"
|
||||
})
|
||||
|
||||
return properties
|
||||
|
||||
|
||||
func _set(property: StringName, value: Variant) -> bool:
|
||||
if property.begins_with(WEIGHTS_PREFIX):
|
||||
var weight_name = property.trim_prefix(WEIGHTS_PREFIX)
|
||||
_weights[weight_name] = value
|
||||
return true
|
||||
|
||||
return false
|
||||
if property.begins_with(WEIGHTS_PREFIX):
|
||||
var weight_name = property.trim_prefix(WEIGHTS_PREFIX)
|
||||
_weights[weight_name] = value
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
|
||||
func _get(property: StringName):
|
||||
if property.begins_with(WEIGHTS_PREFIX):
|
||||
var weight_name = property.trim_prefix(WEIGHTS_PREFIX)
|
||||
return _weights[weight_name]
|
||||
|
||||
return null
|
||||
if property.begins_with(WEIGHTS_PREFIX):
|
||||
var weight_name = property.trim_prefix(WEIGHTS_PREFIX)
|
||||
return _weights[weight_name]
|
||||
|
||||
return null
|
||||
|
||||
|
||||
func _update_weights(children: Array[Node]) -> void:
|
||||
var new_weights = {}
|
||||
for c in children:
|
||||
if _weights.has(c.name):
|
||||
new_weights[c.name] = _weights[c.name]
|
||||
else:
|
||||
new_weights[c.name] = 1
|
||||
_weights = new_weights
|
||||
notify_property_list_changed()
|
||||
var new_weights = {}
|
||||
for c in children:
|
||||
if _weights.has(c.name):
|
||||
new_weights[c.name] = _weights[c.name]
|
||||
else:
|
||||
new_weights[c.name] = 1
|
||||
_weights = new_weights
|
||||
notify_property_list_changed()
|
||||
|
||||
|
||||
func _on_child_entered_tree(node: Node):
|
||||
_update_weights(get_children())
|
||||
_update_weights(get_children())
|
||||
|
||||
var renamed_callable = _on_child_renamed.bind(node.name, node)
|
||||
if not node.renamed.is_connected(renamed_callable):
|
||||
node.renamed.connect(renamed_callable)
|
||||
var renamed_callable = _on_child_renamed.bind(node.name, node)
|
||||
if not node.renamed.is_connected(renamed_callable):
|
||||
node.renamed.connect(renamed_callable)
|
||||
|
||||
|
||||
func _on_child_exiting_tree(node: Node):
|
||||
var renamed_callable = _on_child_renamed.bind(node.name, node)
|
||||
if node.renamed.is_connected(renamed_callable):
|
||||
node.renamed.disconnect(renamed_callable)
|
||||
|
||||
var children = get_children()
|
||||
children.erase(node)
|
||||
_update_weights(children)
|
||||
var renamed_callable = _on_child_renamed.bind(node.name, node)
|
||||
if node.renamed.is_connected(renamed_callable):
|
||||
node.renamed.disconnect(renamed_callable)
|
||||
|
||||
var children = get_children()
|
||||
children.erase(node)
|
||||
_update_weights(children)
|
||||
|
||||
|
||||
func _on_child_renamed(old_name: String, renamed_child: Node):
|
||||
if old_name == renamed_child.name:
|
||||
return # No need to update the weights.
|
||||
|
||||
# Disconnect signal with old name...
|
||||
renamed_child.renamed\
|
||||
.disconnect(_on_child_renamed.bind(old_name, renamed_child))
|
||||
# ...and connect with the new name.
|
||||
renamed_child.renamed\
|
||||
.connect(_on_child_renamed.bind(renamed_child.name, renamed_child))
|
||||
|
||||
var original_weight = _weights[old_name]
|
||||
_weights.erase(old_name)
|
||||
_weights[renamed_child.name] = original_weight
|
||||
notify_property_list_changed()
|
||||
if old_name == renamed_child.name:
|
||||
return # No need to update the weights.
|
||||
|
||||
# Disconnect signal with old name...
|
||||
renamed_child.renamed\
|
||||
.disconnect(_on_child_renamed.bind(old_name, renamed_child))
|
||||
# ...and connect with the new name.
|
||||
renamed_child.renamed\
|
||||
.connect(_on_child_renamed.bind(renamed_child.name, renamed_child))
|
||||
|
||||
var original_weight = _weights[old_name]
|
||||
_weights.erase(old_name)
|
||||
_weights[renamed_child.name] = original_weight
|
||||
notify_property_list_changed()
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
var classes := super()
|
||||
classes.push_back(&"RandomizedComposite")
|
||||
return classes
|
||||
var classes := super()
|
||||
classes.push_back(&"RandomizedComposite")
|
||||
return classes
|
||||
|
||||
@ -1,34 +1,34 @@
|
||||
## A Failer node will always return a `FAILURE` status code.
|
||||
@tool
|
||||
@icon("../../icons/failer.svg")
|
||||
class_name AlwaysFailDecorator extends Decorator
|
||||
|
||||
class_name AlwaysFailDecorator
|
||||
extends Decorator
|
||||
|
||||
func tick(actor: Node, blackboard: Blackboard) -> int:
|
||||
var c = get_child(0)
|
||||
var c = get_child(0)
|
||||
|
||||
if c != running_child:
|
||||
c.before_run(actor, blackboard)
|
||||
if c != running_child:
|
||||
c.before_run(actor, blackboard)
|
||||
|
||||
var response = c.tick(actor, blackboard)
|
||||
if can_send_message(blackboard):
|
||||
BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response)
|
||||
var response = c.tick(actor, blackboard)
|
||||
if can_send_message(blackboard):
|
||||
BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response)
|
||||
|
||||
if c is ConditionLeaf:
|
||||
blackboard.set_value("last_condition", c, str(actor.get_instance_id()))
|
||||
blackboard.set_value("last_condition_status", response, str(actor.get_instance_id()))
|
||||
if c is ConditionLeaf:
|
||||
blackboard.set_value("last_condition", c, str(actor.get_instance_id()))
|
||||
blackboard.set_value("last_condition_status", response, str(actor.get_instance_id()))
|
||||
|
||||
if response == RUNNING:
|
||||
running_child = c
|
||||
if c is ActionLeaf:
|
||||
blackboard.set_value("running_action", c, str(actor.get_instance_id()))
|
||||
return RUNNING
|
||||
else:
|
||||
c.after_run(actor, blackboard)
|
||||
return FAILURE
|
||||
if response == RUNNING:
|
||||
running_child = c
|
||||
if c is ActionLeaf:
|
||||
blackboard.set_value("running_action", c, str(actor.get_instance_id()))
|
||||
return RUNNING
|
||||
else:
|
||||
c.after_run(actor, blackboard)
|
||||
return FAILURE
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
var classes := super()
|
||||
classes.push_back(&"AlwaysFailDecorator")
|
||||
return classes
|
||||
var classes := super()
|
||||
classes.push_back(&"AlwaysFailDecorator")
|
||||
return classes
|
||||
|
||||
@ -1,34 +1,34 @@
|
||||
## A succeeder node will always return a `SUCCESS` status code.
|
||||
@tool
|
||||
@icon("../../icons/succeeder.svg")
|
||||
class_name AlwaysSucceedDecorator extends Decorator
|
||||
|
||||
class_name AlwaysSucceedDecorator
|
||||
extends Decorator
|
||||
|
||||
func tick(actor: Node, blackboard: Blackboard) -> int:
|
||||
var c = get_child(0)
|
||||
var c = get_child(0)
|
||||
|
||||
if c != running_child:
|
||||
c.before_run(actor, blackboard)
|
||||
if c != running_child:
|
||||
c.before_run(actor, blackboard)
|
||||
|
||||
var response = c.tick(actor, blackboard)
|
||||
if can_send_message(blackboard):
|
||||
BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response)
|
||||
var response = c.tick(actor, blackboard)
|
||||
if can_send_message(blackboard):
|
||||
BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response)
|
||||
|
||||
if c is ConditionLeaf:
|
||||
blackboard.set_value("last_condition", c, str(actor.get_instance_id()))
|
||||
blackboard.set_value("last_condition_status", response, str(actor.get_instance_id()))
|
||||
if c is ConditionLeaf:
|
||||
blackboard.set_value("last_condition", c, str(actor.get_instance_id()))
|
||||
blackboard.set_value("last_condition_status", response, str(actor.get_instance_id()))
|
||||
|
||||
if response == RUNNING:
|
||||
running_child = c
|
||||
if c is ActionLeaf:
|
||||
blackboard.set_value("running_action", c, str(actor.get_instance_id()))
|
||||
return RUNNING
|
||||
else:
|
||||
c.after_run(actor, blackboard)
|
||||
return SUCCESS
|
||||
if response == RUNNING:
|
||||
running_child = c
|
||||
if c is ActionLeaf:
|
||||
blackboard.set_value("running_action", c, str(actor.get_instance_id()))
|
||||
return RUNNING
|
||||
else:
|
||||
c.after_run(actor, blackboard)
|
||||
return SUCCESS
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
var classes := super()
|
||||
classes.push_back(&"AlwaysSucceedDecorator")
|
||||
return classes
|
||||
var classes := super()
|
||||
classes.push_back(&"AlwaysSucceedDecorator")
|
||||
return classes
|
||||
|
||||
@ -1,34 +1,34 @@
|
||||
## Sets the specified key to the specified value.
|
||||
## Returns [code]FAILURE[/code] if expression execution fails, otherwise [code]SUCCESS[/code].
|
||||
@tool
|
||||
class_name BlackboardSetAction extends ActionLeaf
|
||||
|
||||
class_name BlackboardSetAction
|
||||
extends ActionLeaf
|
||||
|
||||
## Expression representing a blackboard key.
|
||||
@export_placeholder(EXPRESSION_PLACEHOLDER) var key: String = ""
|
||||
|
||||
## Expression representing a blackboard value to assign to the specified key.
|
||||
@export_placeholder(EXPRESSION_PLACEHOLDER) var value: String = ""
|
||||
|
||||
|
||||
@onready var _key_expression: Expression = _parse_expression(key)
|
||||
@onready var _value_expression: Expression = _parse_expression(value)
|
||||
|
||||
|
||||
func tick(actor: Node, blackboard: Blackboard) -> int:
|
||||
var key_value: Variant = _key_expression.execute([], blackboard)
|
||||
|
||||
if _key_expression.has_execute_failed():
|
||||
return FAILURE
|
||||
|
||||
var value_value: Variant = _value_expression.execute([], blackboard)
|
||||
|
||||
if _value_expression.has_execute_failed():
|
||||
return FAILURE
|
||||
|
||||
blackboard.set_value(key_value, value_value)
|
||||
|
||||
return SUCCESS
|
||||
var key_value: Variant = _key_expression.execute([], blackboard)
|
||||
|
||||
if _key_expression.has_execute_failed():
|
||||
return FAILURE
|
||||
|
||||
var value_value: Variant = _value_expression.execute([], blackboard)
|
||||
|
||||
if _value_expression.has_execute_failed():
|
||||
return FAILURE
|
||||
|
||||
blackboard.set_value(key_value, value_value)
|
||||
|
||||
return SUCCESS
|
||||
|
||||
|
||||
func _get_expression_sources() -> Array[String]:
|
||||
return [key, value]
|
||||
return [key, value]
|
||||
|
||||
@ -1,46 +1,46 @@
|
||||
## Base class for all leaf nodes of the tree.
|
||||
@tool
|
||||
@icon("../../icons/category_leaf.svg")
|
||||
class_name Leaf extends BeehaveNode
|
||||
|
||||
class_name Leaf
|
||||
extends BeehaveNode
|
||||
|
||||
const EXPRESSION_PLACEHOLDER: String = "Insert an expression..."
|
||||
|
||||
|
||||
func _get_configuration_warnings() -> PackedStringArray:
|
||||
var warnings: PackedStringArray = []
|
||||
var warnings: PackedStringArray = []
|
||||
|
||||
var children: Array[Node] = get_children()
|
||||
|
||||
if children.any(func(x): return x is BeehaveNode):
|
||||
warnings.append("Leaf nodes should not have any child nodes. They won't be ticked.")
|
||||
|
||||
var children: Array[Node] = get_children()
|
||||
for source in _get_expression_sources():
|
||||
var error_text: String = _parse_expression(source).get_error_text()
|
||||
if not error_text.is_empty():
|
||||
warnings.append("Expression `%s` is invalid! Error text: `%s`" % [source, error_text])
|
||||
|
||||
if children.any(func(x): return x is BeehaveNode):
|
||||
warnings.append("Leaf nodes should not have any child nodes. They won't be ticked.")
|
||||
|
||||
for source in _get_expression_sources():
|
||||
var error_text: String = _parse_expression(source).get_error_text()
|
||||
if not error_text.is_empty():
|
||||
warnings.append("Expression `%s` is invalid! Error text: `%s`" % [source, error_text])
|
||||
|
||||
return warnings
|
||||
return warnings
|
||||
|
||||
|
||||
func _parse_expression(source: String) -> Expression:
|
||||
var result: Expression = Expression.new()
|
||||
var error: int = result.parse(source)
|
||||
|
||||
if not Engine.is_editor_hint() and error != OK:
|
||||
push_error(
|
||||
"[Leaf] Couldn't parse expression with source: `%s` Error text: `%s`" %\
|
||||
[source, result.get_error_text()]
|
||||
)
|
||||
|
||||
return result
|
||||
var result: Expression = Expression.new()
|
||||
var error: int = result.parse(source)
|
||||
|
||||
if not Engine.is_editor_hint() and error != OK:
|
||||
push_error(
|
||||
"[Leaf] Couldn't parse expression with source: `%s` Error text: `%s`" %\
|
||||
[source, result.get_error_text()]
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
func _get_expression_sources() -> Array[String]: # virtual
|
||||
return []
|
||||
return []
|
||||
|
||||
|
||||
func get_class_name() -> Array[StringName]:
|
||||
var classes := super()
|
||||
classes.push_back(&"Leaf")
|
||||
return classes
|
||||
var classes := super()
|
||||
classes.push_back(&"Leaf")
|
||||
return classes
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="Beehave"
|
||||
description="🐝 Behavior Tree addon for Godot Engine"
|
||||
author="bitbrain"
|
||||
version="2.7.6"
|
||||
script="plugin.gd"
|
||||
name = "Beehave"
|
||||
description = "🐝 Behavior Tree addon for Godot Engine"
|
||||
author = "bitbrain"
|
||||
version = "2.7.6"
|
||||
script = "plugin.gd"
|
||||
|
||||
@ -1,22 +1,21 @@
|
||||
@tool
|
||||
class_name BeehaveUtils
|
||||
|
||||
|
||||
static func get_plugin() -> EditorPlugin:
|
||||
var tree: SceneTree = Engine.get_main_loop()
|
||||
return tree.get_root().get_child(0).get_node_or_null("BeehavePlugin")
|
||||
var tree: SceneTree = Engine.get_main_loop()
|
||||
return tree.get_root().get_child(0).get_node_or_null("BeehavePlugin")
|
||||
|
||||
|
||||
static func get_editor_scale() -> float:
|
||||
var plugin := get_plugin()
|
||||
if plugin:
|
||||
return plugin.get_editor_interface().get_editor_scale()
|
||||
return 1.0
|
||||
var plugin := get_plugin()
|
||||
if plugin:
|
||||
return plugin.get_editor_interface().get_editor_scale()
|
||||
return 1.0
|
||||
|
||||
|
||||
static func get_frames() -> RefCounted:
|
||||
var plugin := get_plugin()
|
||||
if plugin:
|
||||
return plugin.frames
|
||||
push_error("Can't find Beehave Plugin")
|
||||
return null
|
||||
var plugin := get_plugin()
|
||||
if plugin:
|
||||
return plugin.frames
|
||||
push_error("Can't find Beehave Plugin")
|
||||
return null
|
||||
|
||||
@ -1,194 +1,190 @@
|
||||
extends Object
|
||||
|
||||
const PLUGIN_BUNDLE_NAME: StringName = "aseprite_importers"
|
||||
const PLUGIN_BUNDLE_NAME: StringName = "aseprite_importers"
|
||||
const ASEPRITE_EXECUTABLE_PATH_SETTING_NAME: StringName = PLUGIN_BUNDLE_NAME + "/aseprite_executable_path"
|
||||
|
||||
enum CompressMode {
|
||||
LOSSLESS = 0,
|
||||
LOSSY = 1,
|
||||
VRAM_COMPRESSED = 2,
|
||||
VRAM_UNCOMPRESSED = 3,
|
||||
BASIS_UNIVERSAL = 4,
|
||||
LOSSLESS = 0,
|
||||
LOSSY = 1,
|
||||
VRAM_COMPRESSED = 2,
|
||||
VRAM_UNCOMPRESSED = 3,
|
||||
BASIS_UNIVERSAL = 4,
|
||||
}
|
||||
const COMPRESS_MODES_NAMES: PackedStringArray = [
|
||||
"Lossless",
|
||||
"Lossy",
|
||||
"VRAM Compressed",
|
||||
"VRAM Uncompressed",
|
||||
"Basis Universal",
|
||||
]
|
||||
|
||||
"Lossless",
|
||||
"Lossy",
|
||||
"VRAM Compressed",
|
||||
"VRAM Uncompressed",
|
||||
"Basis Universal",
|
||||
]
|
||||
# ONLY FOR VRAM_COMPRESSED
|
||||
enum HdrCompression {
|
||||
DISABLED = 0,
|
||||
OPAQUE_ONLY = 1,
|
||||
ALWAYS = 2,
|
||||
DISABLED = 0,
|
||||
OPAQUE_ONLY = 1,
|
||||
ALWAYS = 2,
|
||||
}
|
||||
const HDR_COMPRESSION_NAMES: PackedStringArray = [
|
||||
"Disabled",
|
||||
"Opaque Only",
|
||||
"Always",
|
||||
]
|
||||
|
||||
"Disabled",
|
||||
"Opaque Only",
|
||||
"Always",
|
||||
]
|
||||
# EXCEPT LOSSLESS
|
||||
enum NormalMap {
|
||||
DETECT = 0,
|
||||
ENABLE = 1,
|
||||
DISABLED = 2,
|
||||
DETECT = 0,
|
||||
ENABLE = 1,
|
||||
DISABLED = 2,
|
||||
}
|
||||
const NORMAL_MAP_NAMES: PackedStringArray = [
|
||||
"Detect",
|
||||
"Enable",
|
||||
"Disabled",
|
||||
]
|
||||
|
||||
"Detect",
|
||||
"Enable",
|
||||
"Disabled",
|
||||
]
|
||||
enum ChannelPack {
|
||||
SRGB_FRIENDLY = 0,
|
||||
OPTIMIZED = 1,
|
||||
SRGB_FRIENDLY = 0,
|
||||
OPTIMIZED = 1,
|
||||
}
|
||||
const CHANNEL_PACK_NAMES: PackedStringArray = [
|
||||
"sRGB Friendly",
|
||||
"Optimized",
|
||||
]
|
||||
|
||||
"sRGB Friendly",
|
||||
"Optimized",
|
||||
]
|
||||
enum Roughness {
|
||||
DETECT = 0,
|
||||
DISABLED = 1,
|
||||
RED = 2,
|
||||
GREEN = 3,
|
||||
BLUE = 4,
|
||||
ALPHA = 5,
|
||||
GRAY = 6,
|
||||
DETECT = 0,
|
||||
DISABLED = 1,
|
||||
RED = 2,
|
||||
GREEN = 3,
|
||||
BLUE = 4,
|
||||
ALPHA = 5,
|
||||
GRAY = 6,
|
||||
}
|
||||
const ROUGHNESS_NAMES: PackedStringArray = [
|
||||
"Detect",
|
||||
"Disabled",
|
||||
"Red",
|
||||
"Green",
|
||||
"Blue",
|
||||
"Alpha",
|
||||
"Gray",
|
||||
]
|
||||
|
||||
"Detect",
|
||||
"Disabled",
|
||||
"Red",
|
||||
"Green",
|
||||
"Blue",
|
||||
"Alpha",
|
||||
"Gray",
|
||||
]
|
||||
enum CompressMode3D {
|
||||
DISABLED = 0,
|
||||
VRAM_COMPRESSED = 1,
|
||||
BASIS_UNIVERSAL = 2,
|
||||
DISABLED = 0,
|
||||
VRAM_COMPRESSED = 1,
|
||||
BASIS_UNIVERSAL = 2,
|
||||
}
|
||||
const COMPRESS_MODE_3D_NAMES: PackedStringArray = [
|
||||
"Disabled",
|
||||
"VRAM Compressed",
|
||||
"Basis Universal",
|
||||
]
|
||||
|
||||
"Disabled",
|
||||
"VRAM Compressed",
|
||||
"Basis Universal",
|
||||
]
|
||||
const EMPTY_CALLABLE: Callable = Callable()
|
||||
|
||||
|
||||
static func create_option(
|
||||
name: String,
|
||||
default_value: Variant,
|
||||
property_hint: PropertyHint = PROPERTY_HINT_NONE,
|
||||
hint_string: String = "",
|
||||
usage: PropertyUsageFlags = PROPERTY_USAGE_NONE,
|
||||
get_is_visible: Callable = EMPTY_CALLABLE
|
||||
) -> Dictionary:
|
||||
var option_data: Dictionary = {
|
||||
name = name,
|
||||
default_value = default_value,
|
||||
}
|
||||
if hint_string: option_data["hint_string"] = hint_string
|
||||
if property_hint: option_data["property_hint"] = property_hint
|
||||
if usage: option_data["usage"] = usage
|
||||
if get_is_visible != EMPTY_CALLABLE: option_data["get_is_visible"] = get_is_visible
|
||||
return option_data
|
||||
name: String,
|
||||
default_value: Variant,
|
||||
property_hint: PropertyHint = PROPERTY_HINT_NONE,
|
||||
hint_string: String = "",
|
||||
usage: PropertyUsageFlags = PROPERTY_USAGE_NONE,
|
||||
get_is_visible: Callable = EMPTY_CALLABLE
|
||||
) -> Dictionary:
|
||||
var option_data: Dictionary = {
|
||||
name = name,
|
||||
default_value = default_value,
|
||||
}
|
||||
if hint_string: option_data["hint_string"] = hint_string
|
||||
if property_hint: option_data["property_hint"] = property_hint
|
||||
if usage: option_data["usage"] = usage
|
||||
if get_is_visible != EMPTY_CALLABLE: option_data["get_is_visible"] = get_is_visible
|
||||
return option_data
|
||||
|
||||
enum BorderType {
|
||||
None = 0,
|
||||
Transparent = 1,
|
||||
Extruded = 2,
|
||||
None = 0,
|
||||
Transparent = 1,
|
||||
Extruded = 2,
|
||||
}
|
||||
const SPRITESHEET_BORDER_TYPES: PackedStringArray = [
|
||||
"None",
|
||||
"Transparent",
|
||||
"Extruded",
|
||||
]
|
||||
|
||||
"None",
|
||||
"Transparent",
|
||||
"Extruded",
|
||||
]
|
||||
enum AnimationDirection {
|
||||
FORWARD = 0,
|
||||
REVERSE = 1,
|
||||
PING_PONG = 2,
|
||||
PING_PONG_REVERSE = 3,
|
||||
FORWARD = 0,
|
||||
REVERSE = 1,
|
||||
PING_PONG = 2,
|
||||
PING_PONG_REVERSE = 3,
|
||||
}
|
||||
const ASEPRITE_OUTPUT_ANIMATION_DIRECTIONS: PackedStringArray = [
|
||||
"forward", "reverse", "pingpong", "pingpong_reverse" ]
|
||||
const PRESET_OPTIONS_ANIMATION_DIRECTIONS: PackedStringArray = [
|
||||
"Forward", "Reverse", "Ping-pong", "Ping-pong reverse" ]
|
||||
|
||||
"forward", "reverse", "pingpong", "pingpong_reverse" ]
|
||||
const PRESET_OPTIONS_ANIMATION_DIRECTIONS: PackedStringArray = [
|
||||
"Forward", "Reverse", "Ping-pong", "Ping-pong reverse" ]
|
||||
enum SpritesheetLayout {
|
||||
PACKED = 0,
|
||||
BY_ROWS = 1,
|
||||
BY_COLUMNS = 2,
|
||||
PACKED = 0,
|
||||
BY_ROWS = 1,
|
||||
BY_COLUMNS = 2,
|
||||
}
|
||||
const SPRITESHEET_LAYOUTS: PackedStringArray = ["Packed", "By rows", "By columns"]
|
||||
|
||||
const OPTION_SPRITESHEET_BORDER_TYPE: String = "spritesheet/border_type"
|
||||
const OPTION_SPRITESHEET_TRIM: String = "spritesheet/trim"
|
||||
const OPTION_SPRITESHEET_IGNORE_EMPTY: String = "spritesheet/ignore_empty"
|
||||
const OPTION_SPRITESHEET_MERGE_DUPLICATES: String = "spritesheet/merge_duplicates"
|
||||
const OPTION_SPRITESHEET_LAYOUT: String = "spritesheet/layout"
|
||||
const OPTION_ANIMATION_DEFAULT_NAME: String = "animation/default/name"
|
||||
const OPTION_ANIMATION_DEFAULT_DIRECTION: String = "animation/default/direction"
|
||||
const OPTION_SPRITESHEET_BORDER_TYPE: String = "spritesheet/border_type"
|
||||
const OPTION_SPRITESHEET_TRIM: String = "spritesheet/trim"
|
||||
const OPTION_SPRITESHEET_IGNORE_EMPTY: String = "spritesheet/ignore_empty"
|
||||
const OPTION_SPRITESHEET_MERGE_DUPLICATES: String = "spritesheet/merge_duplicates"
|
||||
const OPTION_SPRITESHEET_LAYOUT: String = "spritesheet/layout"
|
||||
const OPTION_ANIMATION_DEFAULT_NAME: String = "animation/default/name"
|
||||
const OPTION_ANIMATION_DEFAULT_DIRECTION: String = "animation/default/direction"
|
||||
const OPTION_ANIMATION_DEFAULT_REPEAT_COUNT: String = "animation/default/repeat_count"
|
||||
const OPTION_ANIMATION_AUTOPLAY_NAME: String = "animation/autoplay"
|
||||
const OPTION_ANIMATION_STRATEGY: String = "animation/strategy"
|
||||
const OPTION_LAYERS_INCLUDE_REG_EX: String = "layers/include_reg_ex"
|
||||
const OPTION_LAYERS_EXCLUDE_REG_EX: String = "layers/exclude_reg_ex"
|
||||
const OPTION_TAGS_INCLUDE_REG_EX: String = "tags/include_reg_ex"
|
||||
const OPTION_TAGS_EXCLUDE_REG_EX: String = "tags/exclude_reg_ex"
|
||||
const SPRITESHEET_FIXED_ROWS_COUNT: String = "spritesheet/fixed_rows_count"
|
||||
const SPRITESHEET_FIXED_COLUMNS_COUNT: String = "spritesheet/fixed_columns_count"
|
||||
|
||||
const OPTION_ANIMATION_AUTOPLAY_NAME: String = "animation/autoplay"
|
||||
const OPTION_ANIMATION_STRATEGY: String = "animation/strategy"
|
||||
const OPTION_LAYERS_INCLUDE_REG_EX: String = "layers/include_reg_ex"
|
||||
const OPTION_LAYERS_EXCLUDE_REG_EX: String = "layers/exclude_reg_ex"
|
||||
const OPTION_TAGS_INCLUDE_REG_EX: String = "tags/include_reg_ex"
|
||||
const OPTION_TAGS_EXCLUDE_REG_EX: String = "tags/exclude_reg_ex"
|
||||
const SPRITESHEET_FIXED_ROWS_COUNT: String = "spritesheet/fixed_rows_count"
|
||||
const SPRITESHEET_FIXED_COLUMNS_COUNT: String = "spritesheet/fixed_columns_count"
|
||||
|
||||
|
||||
class ParsedAnimationOptions:
|
||||
var border_type: BorderType
|
||||
var trim: bool
|
||||
var ignore_empty: bool
|
||||
var merge_duplicates: bool
|
||||
var spritesheet_layout: SpritesheetLayout
|
||||
var spritesheet_fixed_rows_count: int
|
||||
var spritesheet_fixed_columns_count: int
|
||||
var default_animation_name: String
|
||||
var default_animation_direction: AnimationDirection
|
||||
var default_animation_repeat_count: int
|
||||
var animation_autoplay_name: String
|
||||
func _init(options: Dictionary) -> void:
|
||||
border_type = options[OPTION_SPRITESHEET_BORDER_TYPE]
|
||||
trim = options[OPTION_SPRITESHEET_TRIM]
|
||||
ignore_empty = options[OPTION_SPRITESHEET_IGNORE_EMPTY]
|
||||
merge_duplicates = options[OPTION_SPRITESHEET_MERGE_DUPLICATES]
|
||||
spritesheet_layout = options[OPTION_SPRITESHEET_LAYOUT]
|
||||
spritesheet_fixed_rows_count = options[SPRITESHEET_FIXED_ROWS_COUNT]
|
||||
spritesheet_fixed_columns_count = options[SPRITESHEET_FIXED_COLUMNS_COUNT]
|
||||
default_animation_name = options[OPTION_ANIMATION_DEFAULT_NAME].strip_edges().strip_escapes()
|
||||
if default_animation_name.is_empty(): default_animation_name = "default"
|
||||
default_animation_direction = options[OPTION_ANIMATION_DEFAULT_DIRECTION]
|
||||
default_animation_repeat_count = options[OPTION_ANIMATION_DEFAULT_REPEAT_COUNT]
|
||||
animation_autoplay_name = options[OPTION_ANIMATION_AUTOPLAY_NAME].strip_edges().strip_escapes()
|
||||
var border_type: BorderType
|
||||
var trim: bool
|
||||
var ignore_empty: bool
|
||||
var merge_duplicates: bool
|
||||
var spritesheet_layout: SpritesheetLayout
|
||||
var spritesheet_fixed_rows_count: int
|
||||
var spritesheet_fixed_columns_count: int
|
||||
var default_animation_name: String
|
||||
var default_animation_direction: AnimationDirection
|
||||
var default_animation_repeat_count: int
|
||||
var animation_autoplay_name: String
|
||||
|
||||
|
||||
func _init(options: Dictionary) -> void:
|
||||
border_type = options[OPTION_SPRITESHEET_BORDER_TYPE]
|
||||
trim = options[OPTION_SPRITESHEET_TRIM]
|
||||
ignore_empty = options[OPTION_SPRITESHEET_IGNORE_EMPTY]
|
||||
merge_duplicates = options[OPTION_SPRITESHEET_MERGE_DUPLICATES]
|
||||
spritesheet_layout = options[OPTION_SPRITESHEET_LAYOUT]
|
||||
spritesheet_fixed_rows_count = options[SPRITESHEET_FIXED_ROWS_COUNT]
|
||||
spritesheet_fixed_columns_count = options[SPRITESHEET_FIXED_COLUMNS_COUNT]
|
||||
default_animation_name = options[OPTION_ANIMATION_DEFAULT_NAME].strip_edges().strip_escapes()
|
||||
if default_animation_name.is_empty(): default_animation_name = "default"
|
||||
default_animation_direction = options[OPTION_ANIMATION_DEFAULT_DIRECTION]
|
||||
default_animation_repeat_count = options[OPTION_ANIMATION_DEFAULT_REPEAT_COUNT]
|
||||
animation_autoplay_name = options[OPTION_ANIMATION_AUTOPLAY_NAME].strip_edges().strip_escapes()
|
||||
|
||||
|
||||
static func create_common_animation_options() -> Array[Dictionary]:
|
||||
return [
|
||||
create_option(OPTION_SPRITESHEET_LAYOUT, SpritesheetLayout.PACKED, PROPERTY_HINT_ENUM, ",".join(SPRITESHEET_LAYOUTS), PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ),
|
||||
create_option(SPRITESHEET_FIXED_ROWS_COUNT, 1, PROPERTY_HINT_RANGE, "1,32,1,or_greater", PROPERTY_USAGE_EDITOR,
|
||||
func(options): return options[OPTION_SPRITESHEET_LAYOUT] == SpritesheetLayout.BY_COLUMNS),
|
||||
create_option(SPRITESHEET_FIXED_COLUMNS_COUNT, 1, PROPERTY_HINT_RANGE, "1,32,1,or_greater", PROPERTY_USAGE_EDITOR,
|
||||
func(options): return options[OPTION_SPRITESHEET_LAYOUT] == SpritesheetLayout.BY_ROWS),
|
||||
return [
|
||||
create_option(OPTION_SPRITESHEET_LAYOUT, SpritesheetLayout.PACKED, PROPERTY_HINT_ENUM, ",".join(SPRITESHEET_LAYOUTS), PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ),
|
||||
create_option(SPRITESHEET_FIXED_ROWS_COUNT, 1, PROPERTY_HINT_RANGE, "1,32,1,or_greater", PROPERTY_USAGE_EDITOR,
|
||||
func(options): return options[OPTION_SPRITESHEET_LAYOUT] == SpritesheetLayout.BY_COLUMNS),
|
||||
create_option(SPRITESHEET_FIXED_COLUMNS_COUNT, 1, PROPERTY_HINT_RANGE, "1,32,1,or_greater", PROPERTY_USAGE_EDITOR,
|
||||
func(options): return options[OPTION_SPRITESHEET_LAYOUT] == SpritesheetLayout.BY_ROWS),
|
||||
create_option(OPTION_SPRITESHEET_BORDER_TYPE, BorderType.None, PROPERTY_HINT_ENUM, ",".join(SPRITESHEET_BORDER_TYPES), PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_SPRITESHEET_TRIM, false, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR,
|
||||
func(options): return options[OPTION_SPRITESHEET_LAYOUT] != SpritesheetLayout.PACKED),
|
||||
create_option(OPTION_SPRITESHEET_TRIM, false, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR,
|
||||
|
||||
|
||||
|
||||
func(options): return options[OPTION_SPRITESHEET_LAYOUT] != SpritesheetLayout.PACKED),
|
||||
create_option(OPTION_SPRITESHEET_IGNORE_EMPTY, false, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_SPRITESHEET_MERGE_DUPLICATES, false, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_DEFAULT_NAME, "default", PROPERTY_HINT_PLACEHOLDER_TEXT, "default", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_DEFAULT_DIRECTION, AnimationDirection.FORWARD, PROPERTY_HINT_ENUM, ",".join(PRESET_OPTIONS_ANIMATION_DIRECTIONS), PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_DEFAULT_REPEAT_COUNT, 0, PROPERTY_HINT_RANGE, "0,32,1,or_greater", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_AUTOPLAY_NAME, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR),
|
||||
]
|
||||
create_option(OPTION_SPRITESHEET_MERGE_DUPLICATES, false, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_DEFAULT_NAME, "default", PROPERTY_HINT_PLACEHOLDER_TEXT, "default", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_DEFAULT_DIRECTION, AnimationDirection.FORWARD, PROPERTY_HINT_ENUM, ",".join(PRESET_OPTIONS_ANIMATION_DIRECTIONS), PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_DEFAULT_REPEAT_COUNT, 0, PROPERTY_HINT_RANGE, "0,32,1,or_greater", PROPERTY_USAGE_EDITOR),
|
||||
create_option(OPTION_ANIMATION_AUTOPLAY_NAME, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR),
|
||||
]
|
||||
|
||||
@ -1,75 +1,77 @@
|
||||
extends "_animation_importer_base.gd"
|
||||
|
||||
func _init(parent_plugin: EditorPlugin) -> void:
|
||||
super(parent_plugin)
|
||||
_import_order = 0
|
||||
_importer_name = "Aseprite SpriteFrames Import"
|
||||
_priority = 1
|
||||
_recognized_extensions = ["ase", "aseprite"]
|
||||
_resource_type = "SpriteFrames"
|
||||
_save_extension = "res"
|
||||
_visible_name = "SpriteFrames"
|
||||
super(parent_plugin)
|
||||
_import_order = 0
|
||||
_importer_name = "Aseprite SpriteFrames Import"
|
||||
_priority = 1
|
||||
_recognized_extensions = ["ase", "aseprite"]
|
||||
_resource_type = "SpriteFrames"
|
||||
_save_extension = "res"
|
||||
_visible_name = "SpriteFrames"
|
||||
|
||||
set_preset("Animation", [])
|
||||
|
||||
set_preset("Animation", [])
|
||||
|
||||
func _import(source_file: String, save_path: String, options: Dictionary,
|
||||
platform_variants: Array[String], gen_files: Array[String]) -> Error:
|
||||
print("importing:",source_file)
|
||||
var status: Error = OK
|
||||
var parsed_options = Common.ParsedAnimationOptions.new(options)
|
||||
var export_result: ExportResult = _export_texture(source_file, parsed_options, options, gen_files)
|
||||
if export_result.error:
|
||||
push_error("There was an error during exporting texture: %s with message: %s" %
|
||||
[error_string(export_result.error), export_result.error_message])
|
||||
return export_result.error
|
||||
platform_variants: Array[String], gen_files: Array[String]) -> Error:
|
||||
print("importing:", source_file)
|
||||
var status: Error = OK
|
||||
var parsed_options = Common.ParsedAnimationOptions.new(options)
|
||||
var export_result: ExportResult = _export_texture(source_file, parsed_options, options, gen_files)
|
||||
if export_result.error:
|
||||
push_error("There was an error during exporting texture: %s with message: %s" %
|
||||
[error_string(export_result.error), export_result.error_message])
|
||||
return export_result.error
|
||||
|
||||
var sprite_frames: SpriteFrames
|
||||
if ResourceLoader.exists(source_file):
|
||||
# This is a working way to reuse a previously imported resource. Don't change it!
|
||||
sprite_frames = ResourceLoader.load(source_file, "SpriteFrames", ResourceLoader.CACHE_MODE_REPLACE) as SpriteFrames
|
||||
if not sprite_frames:
|
||||
sprite_frames = SpriteFrames.new()
|
||||
|
||||
var sprite_frames: SpriteFrames
|
||||
if ResourceLoader.exists(source_file):
|
||||
# This is a working way to reuse a previously imported resource. Don't change it!
|
||||
sprite_frames = ResourceLoader.load(source_file, "SpriteFrames", ResourceLoader.CACHE_MODE_REPLACE) as SpriteFrames
|
||||
if not sprite_frames:
|
||||
sprite_frames = SpriteFrames.new()
|
||||
status = update_sprite_frames(export_result, sprite_frames)
|
||||
if status:
|
||||
push_error("Cannot update SpriteFrames", status)
|
||||
return status
|
||||
|
||||
status = update_sprite_frames(export_result, sprite_frames)
|
||||
if status:
|
||||
push_error("Cannot update SpriteFrames", status)
|
||||
return status
|
||||
status = ResourceSaver.save(
|
||||
sprite_frames,
|
||||
save_path + "." + _get_save_extension(),
|
||||
ResourceSaver.FLAG_COMPRESS)
|
||||
if status:
|
||||
push_error("Can't save imported resource.", status)
|
||||
else:
|
||||
var sprite_frames_res = ResourceLoader.load(save_path + "." + _get_save_extension()) as SpriteFrames
|
||||
Util.refresh_all_animation_by_sprite_frames(sprite_frames_res)
|
||||
return status
|
||||
|
||||
status = ResourceSaver.save(
|
||||
sprite_frames,
|
||||
save_path + "." + _get_save_extension(),
|
||||
ResourceSaver.FLAG_COMPRESS)
|
||||
if status:
|
||||
push_error("Can't save imported resource.", status)
|
||||
else:
|
||||
var sprite_frames_res = ResourceLoader.load(save_path + "." + _get_save_extension()) as SpriteFrames
|
||||
Util.refresh_all_animation_by_sprite_frames(sprite_frames_res)
|
||||
return status
|
||||
|
||||
static func update_sprite_frames(export_result: ExportResult, sprite_frames: SpriteFrames, animation_autoplay_name: String = "") -> Error:
|
||||
var spritesheet_metadata: SpritesheetMetadata = export_result.spritesheet_metadata
|
||||
var exported_animation_names: Array = export_result.spritesheet_metadata.animation_tags.map(
|
||||
func (at: AnimationTag) -> String: return at.name)
|
||||
var actual_animation_names: PackedStringArray = sprite_frames.get_animation_names()
|
||||
for name in actual_animation_names:
|
||||
if exported_animation_names.has(name):
|
||||
sprite_frames.clear(name)
|
||||
else:
|
||||
sprite_frames.remove_animation(name)
|
||||
var atlas_textures: Dictionary = {}
|
||||
for animation_tag in spritesheet_metadata.animation_tags:
|
||||
if not sprite_frames.has_animation(animation_tag.name):
|
||||
sprite_frames.add_animation(animation_tag.name)
|
||||
sprite_frames.set_animation_loop(animation_tag.name, animation_tag.looped)
|
||||
sprite_frames.set_animation_speed(animation_tag.name, 1)
|
||||
for frame_data in animation_tag.frames:
|
||||
var atlas_texture = atlas_textures.get(frame_data.region_rect)
|
||||
if atlas_texture == null:
|
||||
atlas_texture = AtlasTexture.new()
|
||||
atlas_texture.atlas = export_result.texture
|
||||
atlas_texture.region = frame_data.region_rect
|
||||
atlas_texture.margin = Rect2(frame_data.region_rect_offset, spritesheet_metadata.source_size - frame_data.region_rect.size)
|
||||
atlas_textures[frame_data.region_rect] = atlas_texture
|
||||
var spritesheet_metadata: SpritesheetMetadata = export_result.spritesheet_metadata
|
||||
var exported_animation_names: Array = export_result.spritesheet_metadata.animation_tags.map(
|
||||
func (at: AnimationTag) -> String: return at.name)
|
||||
var actual_animation_names: PackedStringArray = sprite_frames.get_animation_names()
|
||||
for name in actual_animation_names:
|
||||
if exported_animation_names.has(name):
|
||||
sprite_frames.clear(name)
|
||||
else:
|
||||
sprite_frames.remove_animation(name)
|
||||
var atlas_textures: Dictionary = {}
|
||||
for animation_tag in spritesheet_metadata.animation_tags:
|
||||
if not sprite_frames.has_animation(animation_tag.name):
|
||||
sprite_frames.add_animation(animation_tag.name)
|
||||
sprite_frames.set_animation_loop(animation_tag.name, animation_tag.looped)
|
||||
sprite_frames.set_animation_speed(animation_tag.name, 1)
|
||||
for frame_data in animation_tag.frames:
|
||||
var atlas_texture = atlas_textures.get(frame_data.region_rect)
|
||||
if atlas_texture == null:
|
||||
atlas_texture = AtlasTexture.new()
|
||||
atlas_texture.atlas = export_result.texture
|
||||
atlas_texture.region = frame_data.region_rect
|
||||
atlas_texture.margin = Rect2(frame_data.region_rect_offset, spritesheet_metadata.source_size - frame_data.region_rect.size)
|
||||
atlas_textures[frame_data.region_rect] = atlas_texture
|
||||
|
||||
sprite_frames.add_frame(animation_tag.name, atlas_texture, Setting.animation_frame_rate)
|
||||
return OK
|
||||
sprite_frames.add_frame(animation_tag.name, atlas_texture, Setting.animation_frame_rate)
|
||||
return OK
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="Aseprite Importers"
|
||||
description="A bundle of plug-ins for importing Aesprite files into different types of Godot resources"
|
||||
author="Nikolay Lebedev aka nklbdev"
|
||||
version="1.0.0"
|
||||
script="editor_plugin.gd"
|
||||
name = "Aseprite Importers"
|
||||
description = "A bundle of plug-ins for importing Aesprite files into different types of Godot resources"
|
||||
author = "Nikolay Lebedev aka nklbdev"
|
||||
version = "1.0.0"
|
||||
script = "editor_plugin.gd"
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
@tool
|
||||
extends Control
|
||||
|
||||
|
||||
func _ready():
|
||||
modulate = get_theme_color("accent_color", "Editor")
|
||||
modulate = get_theme_color("accent_color", "Editor")
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
@tool
|
||||
extends Button
|
||||
|
||||
@export var icon_name := "Node" :
|
||||
set(v):
|
||||
icon_name = v
|
||||
if has_theme_icon(v, "EditorIcons"):
|
||||
icon = get_theme_icon(v, "EditorIcons")
|
||||
@export var icon_name := "Node":
|
||||
set(v):
|
||||
icon_name = v
|
||||
if has_theme_icon(v, "EditorIcons"):
|
||||
icon = get_theme_icon(v, "EditorIcons")
|
||||
|
||||
|
||||
func _ready():
|
||||
self.icon_name = (icon_name)
|
||||
self.icon_name = (icon_name)
|
||||
|
||||
@ -1,36 +1,44 @@
|
||||
class_name ResourceTablesEditFormat
|
||||
extends RefCounted
|
||||
|
||||
var editor_view : Control
|
||||
var editor_view: Control
|
||||
|
||||
|
||||
## Override to define reading behaviour.
|
||||
func get_value(entry, key : String):
|
||||
pass
|
||||
func get_value(entry, key: String):
|
||||
pass
|
||||
|
||||
|
||||
## Override to define writing behaviour. This is NOT supposed to save - use `save_entries`.
|
||||
func set_value(entry, key : String, value, index : int):
|
||||
pass
|
||||
func set_value(entry, key: String, value, index: int):
|
||||
pass
|
||||
|
||||
|
||||
## Override to define how the data gets saved.
|
||||
func save_entries(all_entries : Array, indices : Array):
|
||||
pass
|
||||
func save_entries(all_entries: Array, indices: Array):
|
||||
pass
|
||||
|
||||
|
||||
## Override to allow editing rows from the Inspector.
|
||||
func create_resource(entry) -> Resource:
|
||||
return Resource.new()
|
||||
return Resource.new()
|
||||
|
||||
|
||||
## Override to define duplication behaviour. `name_input` should be a suffix if multiple entries, and full name if one.
|
||||
func duplicate_rows(rows : Array, name_input : String):
|
||||
pass
|
||||
func duplicate_rows(rows: Array, name_input: String):
|
||||
pass
|
||||
|
||||
|
||||
## Override to define removal behaviour.
|
||||
func delete_rows(rows : Array):
|
||||
pass
|
||||
func delete_rows(rows: Array):
|
||||
pass
|
||||
|
||||
|
||||
## Override with `return true` if `resource_path` is defined and the Rename butoon should show.
|
||||
func has_row_names():
|
||||
return false
|
||||
return false
|
||||
|
||||
|
||||
## Override to define import behaviour. Must return the `rows` value for the editor view.
|
||||
func import_from_path(folderpath : String, insert_func : Callable, sort_by : String, sort_reverse : bool = false) -> Array:
|
||||
return []
|
||||
func import_from_path(folderpath: String, insert_func: Callable, sort_by: String, sort_reverse: bool = false) -> Array:
|
||||
return []
|
||||
|
||||
@ -1,113 +1,113 @@
|
||||
class_name ResourceTablesEditFormatTres
|
||||
extends ResourceTablesEditFormat
|
||||
|
||||
var timer : SceneTreeTimer
|
||||
var timer: SceneTreeTimer
|
||||
|
||||
|
||||
func get_value(entry, key : String):
|
||||
return entry[key]
|
||||
func get_value(entry, key: String):
|
||||
return entry[key]
|
||||
|
||||
|
||||
func set_value(entry, key : String, value, index : int):
|
||||
entry[key] = value
|
||||
func set_value(entry, key: String, value, index: int):
|
||||
entry[key] = value
|
||||
|
||||
|
||||
func save_entries(all_entries : Array, indices : Array, repeat : bool = true):
|
||||
# No need to save. Resources are saved with Ctrl+S
|
||||
# (likely because plugin.edit_resource is called to show inspector)
|
||||
return
|
||||
func save_entries(all_entries: Array, indices: Array, repeat: bool = true):
|
||||
# No need to save. Resources are saved with Ctrl+S
|
||||
# (likely because plugin.edit_resource is called to show inspector)
|
||||
return
|
||||
|
||||
|
||||
func create_resource(entry) -> Resource:
|
||||
return entry
|
||||
return entry
|
||||
|
||||
|
||||
func duplicate_rows(rows : Array, name_input : String):
|
||||
if rows.size() == 1:
|
||||
var new_row = rows[0].duplicate()
|
||||
new_row.resource_path = rows[0].resource_path.get_base_dir() + "/" + name_input + ".tres"
|
||||
ResourceSaver.save(new_row)
|
||||
return
|
||||
func duplicate_rows(rows: Array, name_input: String):
|
||||
if rows.size() == 1:
|
||||
var new_row = rows[0].duplicate()
|
||||
new_row.resource_path = rows[0].resource_path.get_base_dir() + "/" + name_input + ".tres"
|
||||
ResourceSaver.save(new_row)
|
||||
return
|
||||
|
||||
var new_row
|
||||
for x in rows:
|
||||
new_row = x.duplicate()
|
||||
new_row.resource_path = x.resource_path.get_basename() + name_input + ".tres"
|
||||
ResourceSaver.save(new_row)
|
||||
var new_row
|
||||
for x in rows:
|
||||
new_row = x.duplicate()
|
||||
new_row.resource_path = x.resource_path.get_basename() + name_input + ".tres"
|
||||
ResourceSaver.save(new_row)
|
||||
|
||||
|
||||
func rename_row(row, new_name : String):
|
||||
var new_row = row
|
||||
DirAccess.open("res://").remove(row.resource_path)
|
||||
new_row.resource_path = row.resource_path.get_base_dir() + "/" + new_name + ".tres"
|
||||
ResourceSaver.save(new_row)
|
||||
func rename_row(row, new_name: String):
|
||||
var new_row = row
|
||||
DirAccess.open("res://").remove(row.resource_path)
|
||||
new_row.resource_path = row.resource_path.get_base_dir() + "/" + new_name + ".tres"
|
||||
ResourceSaver.save(new_row)
|
||||
|
||||
|
||||
func delete_rows(rows):
|
||||
for x in rows:
|
||||
DirAccess.open("res://").remove(x.resource_path)
|
||||
for x in rows:
|
||||
DirAccess.open("res://").remove(x.resource_path)
|
||||
|
||||
|
||||
func has_row_names():
|
||||
return true
|
||||
|
||||
|
||||
func import_from_path(folderpath : String, insert_func : Callable, sort_by : String, sort_reverse : bool = false) -> Array:
|
||||
var rows := []
|
||||
var dir := DirAccess.open(folderpath)
|
||||
if dir == null: return []
|
||||
|
||||
var cur_dir_types : Dictionary = {}
|
||||
|
||||
var file_stack : Array[String] = []
|
||||
var folder_stack : Array[String] = [folderpath]
|
||||
|
||||
while folder_stack.size() > 0:
|
||||
folderpath = folder_stack.pop_back()
|
||||
|
||||
for x in DirAccess.get_files_at(folderpath):
|
||||
file_stack.append(folderpath.path_join(x))
|
||||
|
||||
for x in DirAccess.get_directories_at(folderpath):
|
||||
folder_stack.append(folderpath.path_join(x))
|
||||
|
||||
var loaded_res : Array[Resource] = []
|
||||
var res : Resource = null
|
||||
loaded_res.resize(file_stack.size())
|
||||
for i in file_stack.size():
|
||||
res = null
|
||||
if file_stack[i].ends_with(".tres"):
|
||||
res = load(file_stack[i])
|
||||
loaded_res[i] = res
|
||||
cur_dir_types[res.get_class()] = cur_dir_types.get(res.get_class(), 0) + 1
|
||||
var res_script := res.get_script()
|
||||
if res_script != null:
|
||||
cur_dir_types[res_script] = cur_dir_types.get(res_script, 0) + 1
|
||||
|
||||
var most_count_key = null
|
||||
var most_count_count := 0
|
||||
var most_count_is_base_class := false
|
||||
for k in cur_dir_types:
|
||||
var v : int = cur_dir_types[k]
|
||||
if v > most_count_count || (v >= most_count_count && most_count_is_base_class):
|
||||
most_count_key = k
|
||||
most_count_count = v
|
||||
most_count_is_base_class = k is String
|
||||
|
||||
var first_loadable_found := false
|
||||
for x in loaded_res:
|
||||
if x == null: continue
|
||||
if !first_loadable_found:
|
||||
first_loadable_found = true
|
||||
editor_view.fill_property_data(x)
|
||||
if !(sort_by in x):
|
||||
sort_by = "resource_path"
|
||||
|
||||
if most_count_is_base_class:
|
||||
if x.get_class() == most_count_key:
|
||||
insert_func.call(x, rows, sort_by, sort_reverse)
|
||||
|
||||
elif x.get_script() == most_count_key:
|
||||
insert_func.call(x, rows, sort_by, sort_reverse)
|
||||
|
||||
return rows
|
||||
return true
|
||||
|
||||
|
||||
func import_from_path(folderpath: String, insert_func: Callable, sort_by: String, sort_reverse: bool = false) -> Array:
|
||||
var rows := []
|
||||
var dir := DirAccess.open(folderpath)
|
||||
if dir == null: return []
|
||||
|
||||
var cur_dir_types: Dictionary = {}
|
||||
|
||||
var file_stack: Array[String] = []
|
||||
var folder_stack: Array[String] = [folderpath]
|
||||
|
||||
while folder_stack.size() > 0:
|
||||
folderpath = folder_stack.pop_back()
|
||||
|
||||
for x in DirAccess.get_files_at(folderpath):
|
||||
file_stack.append(folderpath.path_join(x))
|
||||
|
||||
for x in DirAccess.get_directories_at(folderpath):
|
||||
folder_stack.append(folderpath.path_join(x))
|
||||
|
||||
var loaded_res: Array[Resource] = []
|
||||
var res: Resource = null
|
||||
loaded_res.resize(file_stack.size())
|
||||
for i in file_stack.size():
|
||||
res = null
|
||||
if file_stack[i].ends_with(".tres"):
|
||||
res = load(file_stack[i])
|
||||
loaded_res[i] = res
|
||||
cur_dir_types[res.get_class()] = cur_dir_types.get(res.get_class(), 0) + 1
|
||||
var res_script := res.get_script()
|
||||
if res_script != null:
|
||||
cur_dir_types[res_script] = cur_dir_types.get(res_script, 0) + 1
|
||||
|
||||
var most_count_key = null
|
||||
var most_count_count := 0
|
||||
var most_count_is_base_class := false
|
||||
for k in cur_dir_types:
|
||||
var v: int = cur_dir_types[k]
|
||||
if v > most_count_count || (v >= most_count_count && most_count_is_base_class):
|
||||
most_count_key = k
|
||||
most_count_count = v
|
||||
most_count_is_base_class = k is String
|
||||
|
||||
var first_loadable_found := false
|
||||
for x in loaded_res:
|
||||
if x == null: continue
|
||||
if !first_loadable_found:
|
||||
first_loadable_found = true
|
||||
editor_view.fill_property_data(x)
|
||||
if !(sort_by in x):
|
||||
sort_by = "resource_path"
|
||||
|
||||
if most_count_is_base_class:
|
||||
if x.get_class() == most_count_key:
|
||||
insert_func.call(x, rows, sort_by, sort_reverse)
|
||||
|
||||
elif x.get_script() == most_count_key:
|
||||
insert_func.call(x, rows, sort_by, sort_reverse)
|
||||
|
||||
return rows
|
||||
|
||||
@ -1,32 +1,31 @@
|
||||
class_name ResourceTablesExportFormatCsv
|
||||
extends RefCounted
|
||||
|
||||
static func can_edit_path(path: String):
|
||||
return path.ends_with(".csv")
|
||||
|
||||
static func can_edit_path(path : String):
|
||||
return path.ends_with(".csv")
|
||||
|
||||
static func export_to_file(entries_array: Array, column_names: Array, into_path: String, import_data):
|
||||
var file = FileAccess.open(into_path, FileAccess.WRITE)
|
||||
|
||||
static func export_to_file(entries_array : Array, column_names : Array, into_path : String, import_data):
|
||||
var file = FileAccess.open(into_path, FileAccess.WRITE)
|
||||
var line = PackedStringArray()
|
||||
var space_after_delimeter = import_data.delimeter.ends_with(" ")
|
||||
import_data.prop_names = column_names
|
||||
import_data.prop_types = import_data.get_resource_property_types(entries_array[0], column_names)
|
||||
import_data.resource_path = ""
|
||||
line.resize(column_names.size())
|
||||
if import_data.remove_first_row:
|
||||
for j in column_names.size():
|
||||
line[j] = column_names[j]
|
||||
if space_after_delimeter and j != 0:
|
||||
line[j] = " " + line[j]
|
||||
|
||||
var line = PackedStringArray()
|
||||
var space_after_delimeter = import_data.delimeter.ends_with(" ")
|
||||
import_data.prop_names = column_names
|
||||
import_data.prop_types = import_data.get_resource_property_types(entries_array[0], column_names)
|
||||
import_data.resource_path = ""
|
||||
line.resize(column_names.size())
|
||||
if import_data.remove_first_row:
|
||||
for j in column_names.size():
|
||||
line[j] = column_names[j]
|
||||
if space_after_delimeter and j != 0:
|
||||
line[j] = " " + line[j]
|
||||
|
||||
file.store_csv_line(line, import_data.delimeter[0])
|
||||
file.store_csv_line(line, import_data.delimeter[0])
|
||||
|
||||
for i in entries_array.size():
|
||||
for j in column_names.size():
|
||||
line[j] = import_data.property_to_string((entries_array[i].get(column_names[j])), j)
|
||||
if space_after_delimeter and j != 0:
|
||||
line[j] = " " + line[j]
|
||||
for i in entries_array.size():
|
||||
for j in column_names.size():
|
||||
line[j] = import_data.property_to_string((entries_array[i].get(column_names[j])), j)
|
||||
if space_after_delimeter and j != 0:
|
||||
line[j] = " " + line[j]
|
||||
|
||||
file.store_csv_line(line, import_data.delimeter[0])
|
||||
file.store_csv_line(line, import_data.delimeter[0])
|
||||
|
||||
@ -1,58 +1,57 @@
|
||||
class_name ResourceTablesImportFormatCsv
|
||||
extends RefCounted
|
||||
|
||||
|
||||
static func can_edit_path(path : String):
|
||||
return path.ends_with(".csv")
|
||||
static func can_edit_path(path: String):
|
||||
return path.ends_with(".csv")
|
||||
|
||||
|
||||
static func get_properties(entries, import_data):
|
||||
return Array(entries[0])
|
||||
return Array(entries[0])
|
||||
|
||||
|
||||
static func import_as_arrays(import_data) -> Array:
|
||||
var file = FileAccess.open(import_data.edited_path, FileAccess.READ)
|
||||
|
||||
import_data.delimeter = ";"
|
||||
var text_lines := [file.get_line().split(import_data.delimeter)]
|
||||
var space_after_delimeter = false
|
||||
var line = text_lines[0]
|
||||
if line.size() == 0:
|
||||
return []
|
||||
|
||||
if line.size() == 1:
|
||||
import_data.delimeter = ","
|
||||
line = line[0].split(import_data.delimeter)
|
||||
text_lines[0] = line
|
||||
if line.size() <= 1:
|
||||
return []
|
||||
|
||||
if line[1].begins_with(" "):
|
||||
for i in line.size():
|
||||
line[i] = line[i].trim_prefix(" ")
|
||||
|
||||
text_lines[0] = line
|
||||
space_after_delimeter = true
|
||||
import_data.delimeter += " "
|
||||
|
||||
while !file.eof_reached():
|
||||
line = file.get_csv_line(import_data.delimeter[0])
|
||||
if space_after_delimeter:
|
||||
for i in line.size():
|
||||
line[i] = line[i].trim_prefix(" ")
|
||||
|
||||
if line.size() == text_lines[0].size():
|
||||
text_lines.append(line)
|
||||
|
||||
elif line.size() != 1:
|
||||
line.resize(text_lines[0].size())
|
||||
text_lines.append(line)
|
||||
|
||||
var entries = []
|
||||
entries.resize(text_lines.size())
|
||||
|
||||
for i in entries.size():
|
||||
entries[i] = text_lines[i]
|
||||
|
||||
import_data.prop_names = entries[0]
|
||||
return entries
|
||||
var file = FileAccess.open(import_data.edited_path, FileAccess.READ)
|
||||
|
||||
import_data.delimeter = ";"
|
||||
var text_lines := [file.get_line().split(import_data.delimeter)]
|
||||
var space_after_delimeter = false
|
||||
var line = text_lines[0]
|
||||
if line.size() == 0:
|
||||
return []
|
||||
|
||||
if line.size() == 1:
|
||||
import_data.delimeter = ","
|
||||
line = line[0].split(import_data.delimeter)
|
||||
text_lines[0] = line
|
||||
if line.size() <= 1:
|
||||
return []
|
||||
|
||||
if line[1].begins_with(" "):
|
||||
for i in line.size():
|
||||
line[i] = line[i].trim_prefix(" ")
|
||||
|
||||
text_lines[0] = line
|
||||
space_after_delimeter = true
|
||||
import_data.delimeter += " "
|
||||
|
||||
while !file.eof_reached():
|
||||
line = file.get_csv_line(import_data.delimeter[0])
|
||||
if space_after_delimeter:
|
||||
for i in line.size():
|
||||
line[i] = line[i].trim_prefix(" ")
|
||||
|
||||
if line.size() == text_lines[0].size():
|
||||
text_lines.append(line)
|
||||
|
||||
elif line.size() != 1:
|
||||
line.resize(text_lines[0].size())
|
||||
text_lines.append(line)
|
||||
|
||||
var entries = []
|
||||
entries.resize(text_lines.size())
|
||||
|
||||
for i in entries.size():
|
||||
entries[i] = text_lines[i]
|
||||
|
||||
import_data.prop_names = entries[0]
|
||||
return entries
|
||||
|
||||
@ -1,12 +1,11 @@
|
||||
@tool
|
||||
extends HBoxContainer
|
||||
|
||||
func display(name: String, type: int):
|
||||
$"LineEdit".text = name
|
||||
$"OptionButton".selected = type
|
||||
|
||||
func display(name : String, type : int):
|
||||
$"LineEdit".text = name
|
||||
$"OptionButton".selected = type
|
||||
|
||||
|
||||
func connect_all_signals(to : Object, index : int, prefix : String = "_on_list_item_"):
|
||||
$"LineEdit".text_changed.connect(Callable(to, prefix + "name_changed").bind(index))
|
||||
$"OptionButton".item_selected.connect(Callable(to, prefix + "type_selected").bind(index))
|
||||
func connect_all_signals(to: Object, index: int, prefix: String = "_on_list_item_"):
|
||||
$"LineEdit".text_changed.connect(Callable(to, prefix + "name_changed").bind(index))
|
||||
$"OptionButton".item_selected.connect(Callable(to, prefix + "type_selected").bind(index))
|
||||
|
||||
@ -1,173 +1,174 @@
|
||||
@tool
|
||||
extends Control
|
||||
|
||||
@export var editor_view_path : NodePath
|
||||
@export var editor_view_path: NodePath
|
||||
|
||||
@export_enum("Filter", "Process", "Sort") var mode := 0
|
||||
@export var title := ""
|
||||
|
||||
@export var default_text := "":
|
||||
set(v):
|
||||
default_text = v
|
||||
if _textfield == null:
|
||||
await ready
|
||||
set(v):
|
||||
default_text = v
|
||||
if _textfield == null:
|
||||
await ready
|
||||
|
||||
_textfield.text = v
|
||||
|
||||
_textfield.text = v
|
||||
@export_multiline var default_text_ml := "":
|
||||
set(v):
|
||||
default_text_ml = v
|
||||
if _textfield_ml == null:
|
||||
await ready
|
||||
set(v):
|
||||
default_text_ml = v
|
||||
if _textfield_ml == null:
|
||||
await ready
|
||||
|
||||
_textfield_ml.text = v
|
||||
@export var function_save_key := ""
|
||||
_textfield_ml.text = v
|
||||
|
||||
var _textfield : LineEdit
|
||||
var _textfield_ml : TextEdit
|
||||
var _togglable_popup : PopupPanel
|
||||
var _saved_function_index_label : Label
|
||||
@export var function_save_key := ""
|
||||
|
||||
var _saved_functions : Array = []
|
||||
var _textfield: LineEdit
|
||||
var _textfield_ml: TextEdit
|
||||
var _togglable_popup: PopupPanel
|
||||
var _saved_function_index_label: Label
|
||||
var _saved_functions: Array = []
|
||||
var _saved_function_selected := -1
|
||||
|
||||
|
||||
func load_saved_functions(func_dict : Dictionary):
|
||||
if !func_dict.has(function_save_key):
|
||||
func_dict[function_save_key] = [default_text_ml]
|
||||
func load_saved_functions(func_dict: Dictionary):
|
||||
if !func_dict.has(function_save_key):
|
||||
func_dict[function_save_key] = [default_text_ml]
|
||||
|
||||
_saved_functions = func_dict[function_save_key]
|
||||
_on_saved_function_selected(0)
|
||||
_saved_functions = func_dict[function_save_key]
|
||||
_on_saved_function_selected(0)
|
||||
|
||||
|
||||
func _ready():
|
||||
var toggle_button := Button.new()
|
||||
var popup_box := VBoxContainer.new()
|
||||
var popup_buttons_box := HBoxContainer.new()
|
||||
var title_label := Label.new()
|
||||
var submit_button := Button.new()
|
||||
var move_label := Label.new()
|
||||
var move_button_l := Button.new()
|
||||
var move_button_r := Button.new()
|
||||
_textfield = LineEdit.new()
|
||||
_togglable_popup = PopupPanel.new()
|
||||
_textfield_ml = TextEdit.new()
|
||||
_saved_function_index_label = Label.new()
|
||||
|
||||
add_child(_textfield)
|
||||
add_child(toggle_button)
|
||||
_textfield.add_child(_togglable_popup)
|
||||
_togglable_popup.add_child(popup_box)
|
||||
popup_box.add_child(title_label)
|
||||
popup_box.add_child(_textfield_ml)
|
||||
popup_box.add_child(popup_buttons_box)
|
||||
popup_buttons_box.add_child(submit_button)
|
||||
popup_buttons_box.add_child(move_label)
|
||||
popup_buttons_box.add_child(move_button_l)
|
||||
popup_buttons_box.add_child(_saved_function_index_label)
|
||||
popup_buttons_box.add_child(move_button_r)
|
||||
|
||||
title_label.text = title
|
||||
|
||||
toggle_button.icon = get_theme_icon("Collapse", "EditorIcons")
|
||||
toggle_button.pressed.connect(_on_expand_pressed)
|
||||
|
||||
_textfield.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
_textfield.text_submitted.connect(_on_text_submitted.unbind(1))
|
||||
|
||||
_textfield_ml.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
_textfield_ml.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
|
||||
submit_button.text = "Run multiline!"
|
||||
submit_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
submit_button.pressed.connect(_on_text_submitted)
|
||||
|
||||
move_label.text = "Choose saved:"
|
||||
move_button_l.icon = get_theme_icon("PagePrevious", "EditorIcons")
|
||||
move_button_l.pressed.connect(_on_saved_function_bumped.bind(-1))
|
||||
_on_saved_function_selected(0)
|
||||
move_button_r.icon = get_theme_icon("PageNext", "EditorIcons")
|
||||
move_button_r.pressed.connect(_on_saved_function_bumped.bind(+1))
|
||||
|
||||
var toggle_button := Button.new()
|
||||
var popup_box := VBoxContainer.new()
|
||||
var popup_buttons_box := HBoxContainer.new()
|
||||
var title_label := Label.new()
|
||||
var submit_button := Button.new()
|
||||
var move_label := Label.new()
|
||||
var move_button_l := Button.new()
|
||||
var move_button_r := Button.new()
|
||||
_textfield = LineEdit.new()
|
||||
_togglable_popup = PopupPanel.new()
|
||||
_textfield_ml = TextEdit.new()
|
||||
_saved_function_index_label = Label.new()
|
||||
|
||||
add_child(_textfield)
|
||||
add_child(toggle_button)
|
||||
_textfield.add_child(_togglable_popup)
|
||||
_togglable_popup.add_child(popup_box)
|
||||
popup_box.add_child(title_label)
|
||||
popup_box.add_child(_textfield_ml)
|
||||
popup_box.add_child(popup_buttons_box)
|
||||
popup_buttons_box.add_child(submit_button)
|
||||
popup_buttons_box.add_child(move_label)
|
||||
popup_buttons_box.add_child(move_button_l)
|
||||
popup_buttons_box.add_child(_saved_function_index_label)
|
||||
popup_buttons_box.add_child(move_button_r)
|
||||
|
||||
title_label.text = title
|
||||
|
||||
toggle_button.icon = get_theme_icon("Collapse", "EditorIcons")
|
||||
toggle_button.pressed.connect(_on_expand_pressed)
|
||||
|
||||
_textfield.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
_textfield.text_submitted.connect(_on_text_submitted.unbind(1))
|
||||
|
||||
_textfield_ml.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
_textfield_ml.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
|
||||
submit_button.text = "Run multiline!"
|
||||
submit_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
submit_button.pressed.connect(_on_text_submitted)
|
||||
|
||||
move_label.text = "Choose saved:"
|
||||
move_button_l.icon = get_theme_icon("PagePrevious", "EditorIcons")
|
||||
move_button_l.pressed.connect(_on_saved_function_bumped.bind(-1))
|
||||
_on_saved_function_selected(0)
|
||||
move_button_r.icon = get_theme_icon("PageNext", "EditorIcons")
|
||||
move_button_r.pressed.connect(_on_saved_function_bumped.bind(+1))
|
||||
|
||||
|
||||
func _on_expand_pressed():
|
||||
_togglable_popup.popup(Rect2i(_textfield.get_screen_position(), Vector2(size.x, 256.0)))
|
||||
_togglable_popup.popup(Rect2i(_textfield.get_screen_position(), Vector2(size.x, 256.0)))
|
||||
|
||||
|
||||
func _on_text_submitted():
|
||||
[_table_filter, _table_process][mode].call()
|
||||
_saved_functions[_saved_function_selected] = _textfield_ml.text
|
||||
get_node(editor_view_path).save_data.call_deferred()
|
||||
[_table_filter, _table_process][mode].call()
|
||||
_saved_functions[_saved_function_selected] = _textfield_ml.text
|
||||
get_node(editor_view_path).save_data.call_deferred()
|
||||
|
||||
|
||||
func _get_script_source_code(first_line : String):
|
||||
var new_text := ""
|
||||
if !_togglable_popup.visible:
|
||||
new_text = _textfield.text
|
||||
if new_text == "":
|
||||
new_text = default_text
|
||||
func _get_script_source_code(first_line: String):
|
||||
var new_text := ""
|
||||
if !_togglable_popup.visible:
|
||||
new_text = _textfield.text
|
||||
if new_text == "":
|
||||
new_text = default_text
|
||||
|
||||
return first_line + "\treturn " + new_text
|
||||
return first_line + "\treturn " + new_text
|
||||
|
||||
else:
|
||||
new_text = _textfield_ml.text
|
||||
if new_text == "":
|
||||
new_text = default_text_ml
|
||||
else:
|
||||
new_text = _textfield_ml.text
|
||||
if new_text == "":
|
||||
new_text = default_text_ml
|
||||
|
||||
var text_split := new_text.split("\n")
|
||||
for i in text_split.size():
|
||||
text_split[i] = "\t" + text_split[i]
|
||||
var text_split := new_text.split("\n")
|
||||
for i in text_split.size():
|
||||
text_split[i] = "\t" + text_split[i]
|
||||
|
||||
return first_line + "\n".join(text_split)
|
||||
return first_line + "\n".join(text_split)
|
||||
|
||||
|
||||
func _table_filter():
|
||||
var new_script := GDScript.new()
|
||||
new_script.source_code = _get_script_source_code("static func can_show(res, index):\n")
|
||||
new_script.reload()
|
||||
var new_script := GDScript.new()
|
||||
new_script.source_code = _get_script_source_code("static func can_show(res, index):\n")
|
||||
new_script.reload()
|
||||
|
||||
var editor_view := get_node(editor_view_path)
|
||||
editor_view.search_cond = new_script
|
||||
editor_view.refresh()
|
||||
var editor_view := get_node(editor_view_path)
|
||||
editor_view.search_cond = new_script
|
||||
editor_view.refresh()
|
||||
|
||||
|
||||
func _table_process():
|
||||
var new_script := GDScript.new()
|
||||
new_script.source_code = _get_script_source_code("static func get_result(value, res, all_res, row_index):\n")
|
||||
new_script.reload()
|
||||
var new_script := GDScript.new()
|
||||
new_script.source_code = _get_script_source_code("static func get_result(value, res, all_res, row_index):\n")
|
||||
new_script.reload()
|
||||
|
||||
var editor_view := get_node(editor_view_path)
|
||||
var new_script_instance = new_script.new()
|
||||
var values = editor_view.get_edited_cells_values()
|
||||
var editor_view := get_node(editor_view_path)
|
||||
var new_script_instance = new_script.new()
|
||||
var values = editor_view.get_edited_cells_values()
|
||||
|
||||
var edited_rows : Array[int] = editor_view._selection.get_edited_rows()
|
||||
var edited_resources := edited_rows.map(func(x): return editor_view.rows[x])
|
||||
for i in values.size():
|
||||
values[i] = new_script_instance.get_result(values[i], editor_view.rows[edited_rows[i]], edited_resources, i)
|
||||
var edited_rows: Array[int] = editor_view._selection.get_edited_rows()
|
||||
var edited_resources := edited_rows.map(func(x): return editor_view.rows[x])
|
||||
for i in values.size():
|
||||
values[i] = new_script_instance.get_result(values[i], editor_view.rows[edited_rows[i]], edited_resources, i)
|
||||
|
||||
editor_view.set_edited_cells_values(values)
|
||||
editor_view.set_edited_cells_values(values)
|
||||
|
||||
|
||||
func _on_saved_function_selected(new_index : int):
|
||||
if new_index < 0:
|
||||
new_index = 0
|
||||
func _on_saved_function_selected(new_index: int):
|
||||
if new_index < 0:
|
||||
new_index = 0
|
||||
|
||||
if _saved_function_selected == _saved_functions.size() - 1 and _textfield_ml.text == default_text_ml:
|
||||
_saved_functions.resize(_saved_functions.size() - 1)
|
||||
if _saved_function_selected == _saved_functions.size() - 1 and _textfield_ml.text == default_text_ml:
|
||||
_saved_functions.resize(_saved_functions.size() - 1)
|
||||
|
||||
elif _saved_function_selected >= 0:
|
||||
_saved_functions[_saved_function_selected] = _textfield_ml.text
|
||||
elif _saved_function_selected >= 0:
|
||||
_saved_functions[_saved_function_selected] = _textfield_ml.text
|
||||
|
||||
_saved_function_selected = new_index
|
||||
if new_index >= _saved_functions.size():
|
||||
_saved_functions.resize(new_index + 1)
|
||||
for i in _saved_functions.size():
|
||||
if _saved_functions[i] == null:
|
||||
_saved_functions[i] = default_text_ml
|
||||
_saved_function_selected = new_index
|
||||
if new_index >= _saved_functions.size():
|
||||
_saved_functions.resize(new_index + 1)
|
||||
for i in _saved_functions.size():
|
||||
if _saved_functions[i] == null:
|
||||
_saved_functions[i] = default_text_ml
|
||||
|
||||
_textfield_ml.text = _saved_functions[new_index]
|
||||
_saved_function_index_label.text = "%d/%d" % [new_index + 1, _saved_functions.size()]
|
||||
get_node(editor_view_path).save_data.call_deferred()
|
||||
_textfield_ml.text = _saved_functions[new_index]
|
||||
_saved_function_index_label.text = "%d/%d" % [new_index + 1, _saved_functions.size()]
|
||||
get_node(editor_view_path).save_data.call_deferred()
|
||||
|
||||
|
||||
func _on_saved_function_bumped(increment : int):
|
||||
_on_saved_function_selected(_saved_function_selected + increment)
|
||||
func _on_saved_function_bumped(increment: int):
|
||||
_on_saved_function_selected(_saved_function_selected + increment)
|
||||
|
||||
@ -1,163 +1,162 @@
|
||||
@tool
|
||||
extends Node
|
||||
|
||||
const TablesPluginEditorViewClass = preload("res://addons/resources_spreadsheet_view/editor_view.gd")
|
||||
const TablesPluginSelectionManagerClass = preload("res://addons/resources_spreadsheet_view/main_screen/selection_manager.gd")
|
||||
const TextEditingUtilsClass := preload("res://addons/resources_spreadsheet_view/text_editing_utils.gd")
|
||||
|
||||
@onready var editor_view : TablesPluginEditorViewClass = get_parent()
|
||||
@onready var selection : TablesPluginSelectionManagerClass = get_node("../SelectionManager")
|
||||
|
||||
|
||||
func _on_cell_gui_input(event : InputEvent, cell : Control):
|
||||
if event is InputEventMouseButton:
|
||||
editor_view.grab_focus()
|
||||
if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
|
||||
if !cell in selection.edited_cells:
|
||||
selection.deselect_all_cells()
|
||||
selection.select_cell(cell)
|
||||
|
||||
selection.rightclick_cells()
|
||||
|
||||
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
|
||||
if Input.is_key_pressed(KEY_CTRL):
|
||||
if cell in selection.edited_cells:
|
||||
selection.deselect_cell(cell)
|
||||
|
||||
else:
|
||||
selection.select_cell(cell)
|
||||
|
||||
elif Input.is_key_pressed(KEY_SHIFT):
|
||||
selection.select_cells_to(cell)
|
||||
|
||||
else:
|
||||
selection.deselect_all_cells()
|
||||
selection.select_cell(cell)
|
||||
|
||||
|
||||
func _gui_input(event : InputEvent):
|
||||
if event is InputEventMouseButton:
|
||||
if event.button_index == MOUSE_BUTTON_RIGHT and event.is_pressed():
|
||||
selection.rightclick_cells()
|
||||
|
||||
if event.button_index == MOUSE_BUTTON_LEFT:
|
||||
editor_view.grab_focus()
|
||||
if !event.pressed:
|
||||
selection.deselect_all_cells()
|
||||
|
||||
|
||||
func _input(event : InputEvent):
|
||||
if !event is InputEventKey or !event.pressed:
|
||||
return
|
||||
|
||||
if !editor_view.has_focus() or selection.edited_cells.size() == 0:
|
||||
return
|
||||
|
||||
if event.keycode == KEY_CTRL or event.keycode == KEY_SHIFT:
|
||||
# Modifier keys do not get processed.
|
||||
return
|
||||
|
||||
# Ctrl + Z (before, and instead of, committing the action!)
|
||||
if Input.is_key_pressed(KEY_CTRL):
|
||||
if event.keycode == KEY_Z or event.keycode == KEY_Y:
|
||||
return
|
||||
|
||||
_key_specific_action(event)
|
||||
editor_view.grab_focus()
|
||||
editor_view.editor_interface.get_resource_filesystem().scan()
|
||||
|
||||
|
||||
func _key_specific_action(event : InputEvent):
|
||||
var column = selection.get_cell_column(selection.edited_cells[0])
|
||||
var ctrl_pressed := Input.is_key_pressed(KEY_CTRL)
|
||||
|
||||
# BETWEEN-CELL NAVIGATION
|
||||
if event.keycode == KEY_UP:
|
||||
_move_selection_on_grid(0, (-1 if !ctrl_pressed else -10))
|
||||
|
||||
elif event.keycode == KEY_DOWN:
|
||||
_move_selection_on_grid(0, (1 if !ctrl_pressed else 10))
|
||||
|
||||
elif Input.is_key_pressed(KEY_SHIFT) and event.keycode == KEY_TAB:
|
||||
_move_selection_on_grid((-1 if !ctrl_pressed else -10), 0)
|
||||
|
||||
elif event.keycode == KEY_TAB:
|
||||
_move_selection_on_grid((1 if !ctrl_pressed else 10), 0)
|
||||
|
||||
# CURSOR MOVEMENT
|
||||
if event.keycode == KEY_LEFT:
|
||||
TextEditingUtilsClass.multi_move_left(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
)
|
||||
|
||||
elif event.keycode == KEY_RIGHT:
|
||||
TextEditingUtilsClass.multi_move_right(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
)
|
||||
|
||||
elif event.keycode == KEY_HOME:
|
||||
for i in selection.edit_cursor_positions.size():
|
||||
selection.edit_cursor_positions[i] = 0
|
||||
|
||||
elif event.keycode == KEY_END:
|
||||
for i in selection.edit_cursor_positions.size():
|
||||
selection.edit_cursor_positions[i] = selection.edited_cells_text[i].length()
|
||||
|
||||
# Ctrl + C (so you can edit in a proper text editor instead of this wacky nonsense)
|
||||
elif ctrl_pressed and event.keycode == KEY_C:
|
||||
TextEditingUtilsClass.multi_copy(selection.edited_cells_text)
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# The following actions do not work on non-editable cells.
|
||||
if !selection.column_editors[column].is_text() or editor_view.columns[column] == "resource_path":
|
||||
return
|
||||
|
||||
# Ctrl + V
|
||||
elif ctrl_pressed and event.keycode == KEY_V:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_paste(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions
|
||||
))
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# ERASING
|
||||
elif event.keycode == KEY_BACKSPACE:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_erase_left(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
))
|
||||
|
||||
elif event.keycode == KEY_DELETE:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_erase_right(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
))
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# And finally, text typing.
|
||||
elif event.keycode == KEY_ENTER:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_input(
|
||||
"\n", selection.edited_cells_text, selection.edit_cursor_positions
|
||||
))
|
||||
|
||||
elif event.unicode != 0 and event.unicode != 127:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_input(
|
||||
char(event.unicode), selection.edited_cells_text, selection.edit_cursor_positions
|
||||
))
|
||||
|
||||
selection.queue_redraw()
|
||||
|
||||
|
||||
func _move_selection_on_grid(move_h : int, move_v : int):
|
||||
var selected_cells := selection.edited_cells.duplicate()
|
||||
var child_count := editor_view.node_table_root.get_child_count()
|
||||
var new_child_index := 0
|
||||
for i in selected_cells.size():
|
||||
new_child_index = (
|
||||
selected_cells[i].get_index()
|
||||
+ move_h
|
||||
+ move_v * editor_view.columns.size()
|
||||
)
|
||||
if child_count < new_child_index: continue
|
||||
selected_cells[i] = editor_view.node_table_root.get_child(new_child_index)
|
||||
|
||||
editor_view.grab_focus()
|
||||
selection.deselect_all_cells()
|
||||
selection.select_cells(selected_cells)
|
||||
const TablesPluginEditorViewClass = preload("res://addons/resources_spreadsheet_view/editor_view.gd")
|
||||
const TablesPluginSelectionManagerClass = preload("res://addons/resources_spreadsheet_view/main_screen/selection_manager.gd")
|
||||
const TextEditingUtilsClass := preload("res://addons/resources_spreadsheet_view/text_editing_utils.gd")
|
||||
@onready var editor_view: TablesPluginEditorViewClass = get_parent()
|
||||
@onready var selection: TablesPluginSelectionManagerClass = get_node("../SelectionManager")
|
||||
|
||||
|
||||
func _on_cell_gui_input(event: InputEvent, cell: Control):
|
||||
if event is InputEventMouseButton:
|
||||
editor_view.grab_focus()
|
||||
if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
|
||||
if !cell in selection.edited_cells:
|
||||
selection.deselect_all_cells()
|
||||
selection.select_cell(cell)
|
||||
|
||||
selection.rightclick_cells()
|
||||
|
||||
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
|
||||
if Input.is_key_pressed(KEY_CTRL):
|
||||
if cell in selection.edited_cells:
|
||||
selection.deselect_cell(cell)
|
||||
|
||||
else:
|
||||
selection.select_cell(cell)
|
||||
|
||||
elif Input.is_key_pressed(KEY_SHIFT):
|
||||
selection.select_cells_to(cell)
|
||||
|
||||
else:
|
||||
selection.deselect_all_cells()
|
||||
selection.select_cell(cell)
|
||||
|
||||
|
||||
func _gui_input(event: InputEvent):
|
||||
if event is InputEventMouseButton:
|
||||
if event.button_index == MOUSE_BUTTON_RIGHT and event.is_pressed():
|
||||
selection.rightclick_cells()
|
||||
|
||||
if event.button_index == MOUSE_BUTTON_LEFT:
|
||||
editor_view.grab_focus()
|
||||
if !event.pressed:
|
||||
selection.deselect_all_cells()
|
||||
|
||||
|
||||
func _input(event: InputEvent):
|
||||
if !event is InputEventKey or !event.pressed:
|
||||
return
|
||||
|
||||
if !editor_view.has_focus() or selection.edited_cells.size() == 0:
|
||||
return
|
||||
|
||||
if event.keycode == KEY_CTRL or event.keycode == KEY_SHIFT:
|
||||
# Modifier keys do not get processed.
|
||||
return
|
||||
|
||||
# Ctrl + Z (before, and instead of, committing the action!)
|
||||
if Input.is_key_pressed(KEY_CTRL):
|
||||
if event.keycode == KEY_Z or event.keycode == KEY_Y:
|
||||
return
|
||||
|
||||
_key_specific_action(event)
|
||||
editor_view.grab_focus()
|
||||
editor_view.editor_interface.get_resource_filesystem().scan()
|
||||
|
||||
|
||||
func _key_specific_action(event: InputEvent):
|
||||
var column = selection.get_cell_column(selection.edited_cells[0])
|
||||
var ctrl_pressed := Input.is_key_pressed(KEY_CTRL)
|
||||
|
||||
# BETWEEN-CELL NAVIGATION
|
||||
if event.keycode == KEY_UP:
|
||||
_move_selection_on_grid(0, (-1 if !ctrl_pressed else -10))
|
||||
|
||||
elif event.keycode == KEY_DOWN:
|
||||
_move_selection_on_grid(0, (1 if !ctrl_pressed else 10))
|
||||
|
||||
elif Input.is_key_pressed(KEY_SHIFT) and event.keycode == KEY_TAB:
|
||||
_move_selection_on_grid((-1 if !ctrl_pressed else -10), 0)
|
||||
|
||||
elif event.keycode == KEY_TAB:
|
||||
_move_selection_on_grid((1 if !ctrl_pressed else 10), 0)
|
||||
|
||||
# CURSOR MOVEMENT
|
||||
if event.keycode == KEY_LEFT:
|
||||
TextEditingUtilsClass.multi_move_left(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
)
|
||||
|
||||
elif event.keycode == KEY_RIGHT:
|
||||
TextEditingUtilsClass.multi_move_right(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
)
|
||||
|
||||
elif event.keycode == KEY_HOME:
|
||||
for i in selection.edit_cursor_positions.size():
|
||||
selection.edit_cursor_positions[i] = 0
|
||||
|
||||
elif event.keycode == KEY_END:
|
||||
for i in selection.edit_cursor_positions.size():
|
||||
selection.edit_cursor_positions[i] = selection.edited_cells_text[i].length()
|
||||
|
||||
# Ctrl + C (so you can edit in a proper text editor instead of this wacky nonsense)
|
||||
elif ctrl_pressed and event.keycode == KEY_C:
|
||||
TextEditingUtilsClass.multi_copy(selection.edited_cells_text)
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# The following actions do not work on non-editable cells.
|
||||
if !selection.column_editors[column].is_text() or editor_view.columns[column] == "resource_path":
|
||||
return
|
||||
|
||||
# Ctrl + V
|
||||
elif ctrl_pressed and event.keycode == KEY_V:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_paste(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions
|
||||
))
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# ERASING
|
||||
elif event.keycode == KEY_BACKSPACE:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_erase_left(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
))
|
||||
|
||||
elif event.keycode == KEY_DELETE:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_erase_right(
|
||||
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
|
||||
))
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# And finally, text typing.
|
||||
elif event.keycode == KEY_ENTER:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_input(
|
||||
"\n", selection.edited_cells_text, selection.edit_cursor_positions
|
||||
))
|
||||
|
||||
elif event.unicode != 0 and event.unicode != 127:
|
||||
editor_view.set_edited_cells_values(TextEditingUtilsClass.multi_input(
|
||||
char(event.unicode), selection.edited_cells_text, selection.edit_cursor_positions
|
||||
))
|
||||
|
||||
selection.queue_redraw()
|
||||
|
||||
|
||||
func _move_selection_on_grid(move_h: int, move_v: int):
|
||||
var selected_cells := selection.edited_cells.duplicate()
|
||||
var child_count := editor_view.node_table_root.get_child_count()
|
||||
var new_child_index := 0
|
||||
for i in selected_cells.size():
|
||||
new_child_index = (
|
||||
selected_cells[i].get_index()
|
||||
+ move_h
|
||||
+ move_v * editor_view.columns.size()
|
||||
)
|
||||
if child_count < new_child_index: continue
|
||||
selected_cells[i] = editor_view.node_table_root.get_child(new_child_index)
|
||||
|
||||
editor_view.grab_focus()
|
||||
selection.deselect_all_cells()
|
||||
selection.select_cells(selected_cells)
|
||||
|
||||