diff --git a/game/spritesheet_generator/SSGenv2.tscn b/game/spritesheet_generator/SSGenv2.tscn new file mode 100644 index 0000000..5fc364b --- /dev/null +++ b/game/spritesheet_generator/SSGenv2.tscn @@ -0,0 +1,137 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://characters/CharacterFrontModel.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/CharacterSideModel.tscn" type="PackedScene" id=2] +[ext_resource path="res://spritesheet_generator/SheetGenv2.gd" type="Script" id=3] +[ext_resource path="res://testsave.png" type="Texture" id=4] +[ext_resource path="res://spritesheet_generator/SpriteMover.gd" type="Script" id=5] +[ext_resource path="res://characters/naturalist_characteratlas.tres" type="CharacterAtlas" id=6] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature2d/NatureCast.tscn" type="PackedScene" id=7] + +[sub_resource type="Environment" id=1] +ssao_enabled = true + +[sub_resource type="World" id=2] +environment = SubResource( 1 ) + +[sub_resource type="Environment" id=3] + +[sub_resource type="World" id=4] +environment = SubResource( 3 ) + +[node name="TextureAtlasGenerator" type="Node2D"] +script = ExtResource( 3 ) +_sprite_size = 40 +_sprite_num = 16 +_show_atlas = true +save_texture = true +animations = [ "run", "idle", "casting", "rest" ] +z_index_paths = [ NodePath("Viewport/Node2D/CharacterFrontModel/Hip/Torso/remote_arm_r/remote_hand_r"), NodePath("Viewport/Node2D/CharacterFrontModel/Hip/Torso/arm_l/hand_l") ] +wp2_sprite3d_path = NodePath("Viewport2/Sprite3D") +instant_preview_path = NodePath("InstantPreview") +sprite_preview_path = NodePath("SpritePreview") +viewport_path = NodePath("Viewport") +viewport2_path = NodePath("Viewport2") +atlas_preview_path = NodePath("AtlasPreview") +model_front_path = NodePath("Viewport/Node2D/CharacterFrontModel") +model_front_animation_player_path = NodePath("Viewport/Node2D/CharacterFrontModel/AnimationPlayer") +model_front_animation_tree_player_path = NodePath("Viewport/Node2D/CharacterFrontModel/AnimationTree") +model_side_path = NodePath("Viewport/Node2D/CharacterSideModel") +model_side_animation_player_path = NodePath("Viewport/Node2D/CharacterSideModel/AnimationPlayer") +model_side_animation_tree_player_path = NodePath("Viewport/Node2D/CharacterSideModel/AnimationTree") +cast_animation_index = 2 +cast_animation_scene = ExtResource( 7 ) +cast_animation_paths = [ NodePath("Viewport/Node2D/CharacterFrontModel/Hip/Torso/remote_arm_r/remote_hand_r/Position2D"), NodePath("Viewport/Node2D/CharacterFrontModel/Hip/Torso/arm_l/hand_l/end"), NodePath("Viewport/Node2D/CharacterSideModel/Hip/Torso/remote_arm_r/remote_hand_r/Position2D"), NodePath("Viewport/Node2D/CharacterSideModel/Hip/Torso/arm_l/hand_l/end") ] + +[node name="Viewport" type="Viewport" parent="."] +size = Vector2( 64, 64 ) +own_world = true +world = SubResource( 2 ) +transparent_bg = true +handle_input_locally = false +hdr = false +usage = 0 +render_target_v_flip = true +render_target_update_mode = 3 + +[node name="Camera" type="Camera2D" parent="Viewport"] +position = Vector2( 0, -15.726 ) +z_index = 2 +current = true + +[node name="Node2D" type="Node2D" parent="Viewport"] + +[node name="CharacterFrontModel" parent="Viewport/Node2D" instance=ExtResource( 1 )] +_atlas = ExtResource( 6 ) + +[node name="Torso" parent="Viewport/Node2D/CharacterFrontModel/Hip" index="1"] +position = Vector2( 0, -2.289 ) + +[node name="hand_l" parent="Viewport/Node2D/CharacterFrontModel/Hip/Torso/arm_l" index="0"] +z_index = 1 + +[node name="AnimationTree" parent="Viewport/Node2D/CharacterFrontModel" index="2"] +active = false + +[node name="CharacterSideModel" parent="Viewport/Node2D" instance=ExtResource( 2 )] +visible = false +rotation = 3.14147 +scale = Vector2( 1, -1 ) +_atlas = ExtResource( 6 ) + +[node name="arm_r" parent="Viewport/Node2D/CharacterSideModel" index="0"] +position = Vector2( -3.50004, -24.6155 ) + +[node name="hand_r" parent="Viewport/Node2D/CharacterSideModel" index="1"] +position = Vector2( -3.50004, -19.1155 ) +z_index = 1 + +[node name="Torso" parent="Viewport/Node2D/CharacterSideModel/Hip" index="3"] +position = Vector2( 0, -2 ) + +[node name="AnimationTree" parent="Viewport/Node2D/CharacterSideModel" index="4"] +active = false + +[node name="Viewport2" type="Viewport" parent="."] +size = Vector2( 64, 64 ) +own_world = true +world = SubResource( 4 ) +transparent_bg = true +handle_input_locally = false +keep_3d_linear = true +render_target_v_flip = true +render_target_update_mode = 3 + +[node name="Camera" type="Camera" parent="Viewport2"] +transform = Transform( 1, 0, 0, 0, 0.889783, 0.456384, 0, -0.456384, 0.889783, 0, 0.154229, 0.172536 ) +projection = 1 +current = true + +[node name="Sprite3D" type="Sprite3D" parent="Viewport2"] + +[node name="InstantPreview" type="Sprite" parent="."] + +[node name="SpritePreview" type="Sprite" parent="."] + +[node name="AtlasPreview" type="Sprite" parent="."] +position = Vector2( 603.531, 254.594 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 101.579, 162.161 ) +texture = ExtResource( 4 ) +hframes = 16 +vframes = 16 +frame = 9 +script = ExtResource( 5 ) + +[node name="Test" type="Sprite" parent="."] +position = Vector2( -91.0568, 21.4517 ) +texture = ExtResource( 4 ) +hframes = 16 +vframes = 16 + +[node name="Camera2D" type="Camera2D" parent="."] +current = true + +[editable path="Viewport/Node2D/CharacterFrontModel"] +[editable path="Viewport/Node2D/CharacterSideModel"] diff --git a/game/spritesheet_generator/SheetGenv2.gd b/game/spritesheet_generator/SheetGenv2.gd new file mode 100644 index 0000000..94fecf4 --- /dev/null +++ b/game/spritesheet_generator/SheetGenv2.gd @@ -0,0 +1,292 @@ +extends Node + +export (int) var _sprite_size +export (int) var _sprite_num +var _directions : int = 4 + +export (bool) var _show_atlas = false + +export (bool) var save_texture = false + +export (bool) var generate : bool = false setget set_generate, get_generate + +export (String) var output_file_name : String = "res://testsave.png" + +export (Array, String) var animations : Array +export (Array, NodePath) var z_index_paths : Array + +export (NodePath) var wp2_sprite3d_path + +export (NodePath) var instant_preview_path +export (NodePath) var sprite_preview_path +export (NodePath) var viewport_path +export (NodePath) var viewport2_path +export (NodePath) var atlas_preview_path + +export (NodePath) var model_front_path +export (NodePath) var model_front_animation_player_path +export (NodePath) var model_front_animation_tree_player_path +export (NodePath) var model_side_path +export (NodePath) var model_side_animation_player_path +export (NodePath) var model_side_animation_tree_player_path + +export(int) var cast_animation_index : int = 0 +export(PackedScene) var cast_animation_scene : PackedScene = null +export (Array, NodePath) var cast_animation_paths : Array +var cast_animations : Array + +var _wp2_sprite3d + +var _viewport +var _viewport_texture +var _viewport2 +var _viewport2_texture +var _atlas +var _image_texture +var _atlas_texture + +var _instant_preview +var _sprite_preview +var _atlas_preview + +var _time = 0 +var _frame = 0 +var _index = 0 +var _direction = 0 +var _current_animation_index = 0 +var _current_animation_player = null + +var _running = false + +var _model_front +var _model_front_animation_player +var _model_front_animation_tree_player +var _model_side +var _model_side_animation_player +var _model_side_animation_tree_player + +var _texture +var _texture2 + +var _first = true +var _first_frame = true + +func _ready(): + _viewport = get_node(viewport_path) + _viewport2 = get_node(viewport2_path) + _wp2_sprite3d = get_node(wp2_sprite3d_path) + + _instant_preview = get_node(instant_preview_path) + _sprite_preview = get_node(sprite_preview_path) + _atlas_preview = get_node(atlas_preview_path) + + var img = ImageTexture.new() + img.flags = 0 + img.create(_sprite_size, _sprite_size, 5, 0) + _sprite_preview.texture = img + + var img2 = ImageTexture.new() + img2.flags = 0 + img2.create(64, 64, 5, 0) + _wp2_sprite3d.texture = img2 + + _model_front = get_node(model_front_path) + _model_front_animation_player = get_node(model_front_animation_player_path) + _model_front_animation_tree_player = get_node(model_front_animation_tree_player_path) + + if _model_side_animation_tree_player: + _model_front_animation_tree_player.active = false + + _model_side = get_node(model_side_path) + _model_side_animation_player = get_node(model_side_animation_player_path) + _model_side_animation_tree_player = get_node(model_side_animation_tree_player_path) + + if _model_side_animation_tree_player: + _model_side_animation_tree_player.active = false + + _model_front.hide() + _model_side.show() + + _viewport_texture = _viewport.get_texture() + + _texture = Image.new() + var frame = _viewport.get_texture().get_data() + _texture.create(512, 512, false, frame.get_format()) + + _texture2 = Image.new() + var frame2 = _viewport2.get_texture().get_data() + _texture2.create(_sprite_size * _sprite_num, _sprite_size * _directions * animations.size(), false, frame2.get_format()) + + + _running = true + set_process(true) + +func _process(delta): + if not _running: + return + + #todo remove, only to make development easier + if !_viewport || !_viewport2: + _ready() + + if _first: + _first = false + + setup_direction() + + setup_animation() + + return + + var frame = _viewport.get_texture().get_data() + + _wp2_sprite3d.get_texture().set_data(frame) + + if _first_frame: + _first_frame = false + #we need to let the second step render the first image from the prev step + return + + var frame2 = _viewport2.get_texture().get_data() + + var ur = frame2.get_used_rect() + var xx : float = 0 + xx = (_sprite_size - ur.size.x) / 2 + _texture2.blend_rect(frame2, ur, Vector2((_frame * _sprite_size) + xx, (_index * _sprite_size))) + _current_animation_player.seek(_frame * (_current_animation_player.current_animation_length / (_sprite_num)), true) + + + if (_index >= _directions * animations.size()): + _running = false + create_atlas() + return + + _sprite_preview.get_texture().set_data(frame2) + + if _frame >= _sprite_num: + _frame = 0 + _index += 1 + _direction += 1 + + if _direction >= _directions: + _direction = 0 + + _current_animation_index += 1 + + setup_direction() + + if (_index >= _directions * animations.size()): +# _running = false +# create_atlas() + return + + setup_animation() + + return + + _frame += 1 + +func setup_animation(): + _current_animation_player.play(animations[_current_animation_index]) + _current_animation_player.seek(0, true) + + if !cast_animation_scene: + return + + if _current_animation_index == cast_animation_index: + for cap in cast_animation_paths: + var n = get_node(cap) + + if !n: + continue + + var pa = cast_animation_scene.instance() + + cast_animations.push_back(pa) + + n.add_child(pa) + else: + for n in cast_animations: + n.queue_free() + + cast_animations.clear() + +#enum CharacterFacing +# FACING_FRONT = 0, +# FACING_BACK = 1, +# FACING_RIGHT = 2, +# FACING_LEFT = 3, + +func setup_direction(): + for a in cast_animations: + if a.has_method("get_z_index"): + a.z_index = 0 + + if _direction == 0: + _current_animation_player = _model_side_animation_player + _model_side.set_facing(2) + _model_side.transform.x.x = -1 + + _model_side.show() + _model_front.hide() + + for np in z_index_paths: + get_node(np).z_index = 0 + if _direction == 1: + _current_animation_player = _model_side_animation_player + _model_side.set_facing(3) + _model_side.transform.x.x = 1 + + _model_side.show() + _model_front.hide() + + for np in z_index_paths: + get_node(np).z_index = 0 + if _direction == 2: + _current_animation_player = _model_front_animation_player + _model_front.set_facing(0) + + _model_side.hide() + _model_front.show() + + for np in z_index_paths: + get_node(np).z_index = 0 + if _direction == 3: + _current_animation_player = _model_front_animation_player + _model_front.set_facing(1) + + _model_side.hide() + _model_front.show() + + for np in z_index_paths: + get_node(np).z_index = -1 + + for a in cast_animations: + if a.has_method("get_z_index"): + a.z_index = -1 + + +func create_atlas(): + _image_texture = ImageTexture.new() + _image_texture.create_from_image(_texture2, 0) + + _image_texture.get_data().save_png(output_file_name) + + if save_texture: + _sprite_preview.set_texture(_image_texture) + + if _show_atlas: + _atlas_preview.set_texture(_image_texture) + + +func set_generate(v : bool) -> void: + if !v: + return + + #for easier development + _ready() + _running = true + #set_process(true) + +func get_generate() -> bool: + return false